gpsd-3.15/AUTHORS0000664000175000017500000000053512520742615011624 0ustar esresrRemco Treffkorn Derrick J. Brashear Russ Nelson Eric S. Raymond Gary E. Miller Jeff Francis Amaury Jacquot Chris Kuethe Ville Nuorvala Fulup Ar Foll gpsd-3.15/COPYING0000664000175000017500000000341512506316703011606 0ustar esresr COPYRIGHTS Compilation copyright is held by the GPSD project. All rights reserved. GPSD project copyrights are assigned to the project lead, currently Eric S. Raymond. Other portions of the GPSD code are Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002 by Remco Treffkorn, and others Copyright (c) 2005 by Eric S. Raymond. For other copyrights, see individual files. BSD LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

Neither name of the GPSD project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. gpsd-3.15/HACKING0000664000175000017500000000040412520742615011536 0ustar esresrFor the gpsd project, the information that was traditionally placed in this file is in the repository as: www/hacking.html If you only have www/hacking.html.in, run scons www This builds www/hacking.html with some magic cookies usefully substituted. gpsd-3.15/INSTALL0000600000175000017500000003555012532765777011621 0ustar esresr= GPSD Installation Instructions = :title: GPSD Installation Instructions :description: Here are the steps for installing GPSD and verifying its performance. :keywords: GPSD, GPS, installation :author: Eric S. Raymond :robots:index,follow Here are the steps for installing GPSD and verifying its performance. They assume you have GPSD available as an installable binary package, Instructions for building GPSD from source (including cross-building) are in the file "build.txt" in the source distribution. Most of these installation instructions are generic to Linux (inc There are some special notes on installation for OS X and the Raspberry Pi near the end of this file. == Check that your GPS is live and you can get data from it == Start by making sure you can get data from your GPS, otherwise the later steps will be very frustrating. In this command stty -F /dev/ttyXXX ispeed 4800 && cat =6 | required for various clients and utilities |pgtk-2/cairo bindings | the main test client, xgps, needs this |========================================================================== Some ncurses packages contain the terminfo library; some break it out separately as libtinfo5 or libtinfo. The Python code in GPSD is actually compatible back to Python 2.4 except that you need either the json library module from 2.6 or the functionally equivalent simplejson backport. == Installing gpsd == === Install your distributions package(s) === Up-to-date gpsd packages are generally available for Linux distributions including Debian and derivatives (including Ubuntu and Mint), Fedora and derivatives (including CentOS), openSUSE, PCLinuxOS, Mageia, and Slackware. In the embedded space, CeroWRT carries GPSD. The GPSD package in the FreeBSD ports tree is also reliably up to date. Even if your distribution is not on this list, it is quite likely GPSD has already been packaged for it. Whatever distribution you are running, the name of the core GPSD package containing the service daemon is almost certainly "gpsd". However, many distributions break up GPSD into separate installable packages for the core daemon and clients; you should search your repository index for anything with gpsd as a prefix. === Install from source code === Directions for installing from source are in the file build.txt found in the source distribution. == How to test the software == 1. Start gpsd. You'll need to give it as an argument a path to a serial or USB port with a GPS attached to it. Your test command should look something like this: gpsd -D 5 -N -n /dev/ttyUSB0 2. Once gpsd is running, telnet to port 2947. You should see a greeting line that's a JSON object describing GPSD's version. Now plug in your GPS (or AIS receiver, or RTCM2 receiver). 3. Type '?WATCH={"enable":true,"json":true};' to start raw and watcher modes. You should see lines beginning with '{' that are JSON objects representing reports from your GPS; these are reports in GPSD protocol. 4. Start the xgps or cgps client. Calling it with no arguments should do the right thing. You should see a display panel with position/velocity-time information, and a satellite display. The displays won't look very interesting until the GPS acquires satellite lock. 5. Have patience. If you are cold-starting a new GPS, it may take 15-20 minutes after it gets a skyview for it to download an ephemeris and begin delivering fixes. 6. A FAQ and troubleshooting instructions can be found at the GPSD project site. == Once you have verified correct operation == 1. If you installed from a .deb under Debian or a Debian-derived system, you may need to `dpkg-reconfigure -plow gpsd' to enable the hotplug magic ("Start gpsd automatically"). 2. Check out the list of supported hardware at the Hardware page on the GPSD project's website. If your GPS isn't on the list, please send us information to add a new line to the table. Directions are included on that page. We can also use updates of the latest version number known to work with hardware already supported. 3. GPSD includes a PHP script that you can use to generate a PHP status page for your GPS if you wish. (It may not be in the core package.) It should be manually copied to your HTTP document directory. The first time it's invoked, it will generate a file called 'gpsd_config.inc' in that directory containing configuration information; edit to taste. 4. There are other non-essential scripts that may be useful; these are in the contrib/ directory of the source. They may not be available in the packages available from distributions. For special instructions related to using GPSD for time service, see the GPSD Time Service HOWTO in the distribution or on the web. == Special Notes for OS X Installation == gpsd will build, install and run on OS X. The easiest way to do so is to first install the MacPorts package. Follow their install procedure at: http://www.macports.org/install.php Then use their port command to install scons, and optionally git if you want to access the develpment source. -------------------------------------------------------------- # port install scons # port install git -------------------------------------------------------------- While runnning gpsd, or scons check, you may run out of shared memory segments. If so, you will see this error message: -------------------------------------------------------------- gpsd:ERROR: shmat failed: Too many open files -------------------------------------------------------------- By default OS X allows a very small number of shared segments. You can check your allowed maximum number of shared segments, then increase the maximum number, with these commands: -------------------------------------------------------------- # sysctl kern.sysv.shmseg=8 kern.sysv.shmseg: 32 -> 8 # sysctl -a | fgrep shmseg kern.sysv.shmseg: 8 # sysctl kern.sysv.shmseg=16 kern.sysv.shmseg: 8 -> 16 # sysctl -a | fgrep shmseg kern.sysv.shmseg: 16 -------------------------------------------------------------- If you are using a USB based GPS you will likely need the Prolific PL2303 driver. You can find it here: http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41 == Special Notes for Rasberry Pi Installation == gpsd will build, install and run on the Rasberry Pi (RasPi) and Pi 2 using Debian jessie. Other distributions based on Debian (raspbian, etc) will work fine as well. The gpsd package in Debian Wheezy is known to be flakey, be sure to update to a new version of gpsd from source. === Raspbian === Before compiling gpsd from source, you will need to update your system as root. Switching to the latest raspbian distribution (jessie) is strongly recommended. -------------------------------------------------------------- # apt-get update # apt-get dist-upgrade # rpi-update # reboot -------------------------------------------------------------- -------------------------------------------------------------- # apt-get install scons libncurses5-dev python-dev pps-tools # apt-get install git-core -------------------------------------------------------------- Git-core is only required to build from a git repository. pps-tools is for testing PPS inputs. The rest of the installation is just as for any other source based install, as noted in the file *build.txt* . === Other Debian derivitives (including stock) === ==== Jessie ==== -------------------------------------------------------------- # apt-get install scons libncurses5-dev python-dev pps-tools # apt-get install git-core -------------------------------------------------------------- Git-core is only required to build from a git repository. pps-tools is for testing PPS inputs. The rest of the installation is just as for any other source based install, as noted in the file *build.txt* . ==== Wheezy ==== Wheezy, being older, requires updating the tools for compiling and testing gpsd: You need scons at 2.3.0 or higher to build. If your scons is less than 2.3.0 you will need to get a newer scons from wheezy-backport. Partial instructions are detailed here: http://backports.debian.org/Instructions/ Basically you need to add this line to /etc/apt/sources.list: -------------------------------------------------------------- deb http://http.debian.net/debian wheezy-backports main -------------------------------------------------------------- Then do another update: -------------------------------------------------------------- apt-get update -------------------------------------------------------------- Which may lead you to this error if you lack a full set of debian keys: -------------------------------------------------------------- W: GPG error: http://http.debian.net wheezy-backports Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8B48AD6246925553 -------------------------------------------------------------- Partial but detailed instructions to fix that are here: -------------------------------------------------------------- https://wiki.debian.org/SecureApt -------------------------------------------------------------- Use either of the following code blocks. The first is more robust: -------------------------------------------------------------- apt-get install debian-archive-keyring -------------------------------------------------------------- -------------------------------------------------------------- gpg --keyserver pgpkeys.mit.edu --recv 8B48AD6246925553 gpg -a --export 46925553 | apt-key add - apt-get update -------------------------------------------------------------- You can now install scons from the wheezy-backports repository: -------------------------------------------------------------- apt-get -t wheezy-backports install scons -------------------------------------------------------------- and other tools: -------------------------------------------------------------- # apt-get install scons libncurses5-dev python-dev pps-tools # apt-get install git-core -------------------------------------------------------------- Git-core is only required to build from a git repository. pps-tools is for testing PPS inputs. The rest of the installation is just as for any other source based install, as noted in the file *build.txt* . === Other Raspberry Pi tips === Any USB connected GPS that is known to work with gpsd will work fine on the RasPi. No special instructions apply. A very popular option is to install the AdaFruit Ultimate GPS HAT. With this GPS you also get a good 1PPS signal. This works as any other GPS with gpsd, but there are two things to note. The GPS takes over the serial console: /dev/ttyAMA0. The PPS signal will be on GPIO Pin #4. Only two specific changes need to be made to make the HAT work. First in the file /boot/cmdline.txt, remove this part "console=ttyAMA0,115200 kgdboc=ttyAMA0,115200)". That frees the serial port from console use so the GPS can use it. Second you need to tell the boot process to load the pps_gpio module and attach /dev/pps0 to GPIO ping 4. Do that by adding this line to the bottom of /boot/config.txt: dtoverlay=pps-gpio,gpiopin=4 Reboot and proceed as for any other operating system to use gpsd. Warning, the pps_gpio driver in all linux kernels up to the current 3.19 only reports one edge. Be sure to validate that your PPS signal is not offset by the pulse width. Detailed instructions are available from their web site: https://learn.adafruit.com/adafruit-ultimate-gps-hat-for-raspberry-pi/ You will need to dig deeper to make the PPS work, here is a good reference: http://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html gpsd-3.15/NEWS0000664000175000017500000012406712533605215011260 0ustar esresr GPSD project news 3.15: 2015-06-03 (Eric S. Raymond ) Fix a rare crash bug related to devices becomin inaccessible while timed out. Accept NMEA 4.1 GSV sententences with the trailing signal-ID field. Fixed incorrect decode of south latitudes in AIS Type 17 messages. splint has been retired; this removes almost 2KLOC of annotations. chrpath is no longer a build dependency. Corrected Beidou/QZNSS display in the Python clients so the graphics don't look like SBAS. 3.14: 2015-03-14 (Eric S. Raymond ) The Pi Day release, 3.14 on 3/14 2015 at 9:26. Longer timeouts on test clients. Skyview support for the Beidou and QZSS constellations in the NMEA0183 driver. ntpmon rename to ntpshmmon - it doesn't actually monitor NTP itself. New HOWTO on the website: "Introduction to Time Service". 3.13: 2015-02-26 (Eric S. Raymond ) compiler.h inclusion removed for gps.h so it's standalone for /usr/include. TOFF JSON report gives the offset between GPS top of second and clock time. A new ntpmon tool supports capturing clock samples from NTP SHM segments. 3.12: 2015-02-22 (Eric S. Raymond ) The daemon's power utilization has been reduced by changing from non-blocking to blocking I/O; this may be significant on mobile devices. Better protection against false matches of Inland AIS messages; this required a libgps version bump to 22 (as a side effect, per-device footprint has decreased). PPS feature is no longer marked experimental/unstable. Sentence tag fields have been dropped from the JSON reports. GNSS and GLONASS SKY reports are now merged. Addressed versions of AIS Type 25 and 26 are now handled. The 'nmea' build option is now 'nmea0183'. New 'minimal' option sets all boolean options not explicitly set on the build command line to false. The 'limited_max_devices' option is now 'max_devices'; the 'limited_max_clients' option is now 'max_clients' The previously deprecated 'libQgpsmm' option has been removed; use 'qt'. A bug fix for error modeling when NMEA 0183 reports empty DOP fields. On OS X, the "osx-pl203" driver has been explicitly listed as unsupported. The last remnants of the old pre-JSON query protocol have been removed from the client library. 3.11: 2014-07-23 (Eric S. Raymond ) A bug that prevented track interpolation has been fixed. We now get vertical error position and speed estimates from the u-blox driver rather than having to interpolate them. Some unusual AIS talker IDs (NMEA 4.0 station classes) are supported. chrpath is no longer a dependency for building and testing, and now defaults to 'no'. Full systemd support. Fixes for handling large PPS offsets. Improved recovery from device flakeouts, gpsmon argument parsing. 3.10: 2013-11-22 (Eric S. Raymond ) AIS: Adds gps2udp, an AIS data relay, split24 option supports passing through Type 24 halves; support for Inland AIS; "scaled" no longer controls dumping of controlled-vocabulary fields; instead, the're always dumped numerically and as text, with text in an attribute name generated by appending "_text" to the name of the base attribute. The packetizer's handling of write boundaries not coinciding with packet boundaries is improved. Better support for mode and speed switching in the UBX driver. PPS message now ships nsec. PPS events are visible in gpsmon. Time-reporting fix to TSIP. 3.9: 2013-05-01 (Eric S. Raymond ) Note to packagers: this is an urgent release that fixes a possible DoS or security hole! Armor the AIS driver against an implausible overrun attack. A (different) fix for our first malformed-packet crash since about 2007. Minor improvements to the NMEA2000 driver. New FAQ entry on how to know WAAS/EGNOS is working. New -u and -uu options enable usec timestamps on gpspipe output. 3.8: 2013-02-25 (Eric S. Raymond ) Fix various minor errors in the AIVDM/AIVDO description. Repair the xmlto support in the build system. Add two more regression tests. Significant improvements to NMEA2000 support. Upgrade the PHP client to v3 of the Google Maps API. Support for the Telit SL869 chipset. Added a nautical-style display to xgpsspeed. Minor improvements to leapsecond.py. 3.7: 2012-07-02 (Eric S. Raymond ) Snap release to get the midnight change in the default leap-second constant out the door. Port tests now pass on all Debian supported architectures, including the Sparc and s390 that were giving us trouble before. Pre-2003 Delorme Earthmate works again. 3.6: 2012-05-23 (Eric S. Raymond ) It's the Fernando Poo Day release. Code has zero detectible defects under Coverity scanning and cppcheck 1.52; this is mainly a cleanup release to get those minor fixes into the field. If a leap-second warning is available from GPS subframe information it is passed to ntpd. NMEA2000 is now supported via the Linux kernel CAN interface. There's a chrpath=no config option for distribution makers, so chrpath is no longer a build dependency; see build.txt for explanation. 3.5: 2012-04-14 (Eric S. Raymond ) Use pselect when it's available to cut down on wakeups and improve signal handling. New {PPS} message exporting clock drift. The AIVDM driver now handles up to 16 interleaved 24A and 24B pair-halves. The NMEA driver interprets depth-sounder returns from SDDBT and reports them as negative altitudes. The pps-pin option is gone, the PPS code now just accepts any handshake pin. A bug that sometimes caused RTCM packets to be dropped rather than relayed is fixed. 3.4: 2012-01-12 (Eric S. Raymond ) Don't barf when chrpath is not available, fall back to static linking; helps people not running Linux. 3.3: 2011-10-29 (Eric S. Raymond ) Improvements to build and release-procedure documentation. Make sirf=no build work again. Main reason for this release is to make chrpath a mandatory build dependency and explain why in the build documentation. 3.2: 2011-10-25 (Eric S. Raymond ) In the build recipe, (1) set pkgconfig properly for 64-bit Fedora systems, (2) clean up various derived files including *.pyc on scons -c, (3) add an option to disable stripping of binaries (strip=no), (4) for embedded targets, add an option to disable building Python support (python=no), (5) make the help for gpsd_group and gpsd_user a little clearer, (6) add a force_global option to build gpsd to listen to all addresses (rather than just loopback). The packet sniffer now accepts NMEA packets with the ECDIS packet leader 'EC'. SBAS satellites are now properly use-flagged in SiRF and UBX skyviews. The -G option now works under IPv6. Cross-build is now officially supported and instructions included. gpsprof works again and does whole-cycle profiling. gpsd.php has Open Street Map support. The pp-on-cts option is replaced by a pps_pin option that lets you specify the pin; the default is still DCD. New supported device; the Jackson Labs Fury. The chrpath utility has become a build prerequisite. 3.1: 2011-07-28 (Eric S. Raymond ) The Irene release, rocking you like a hurricane and brought to you from the storm shelter in my basement. This is a snap release mainly to get some scons recipe cleanups out the door. Parallelized builds now work. Small but fatal problems with reconfigure=no, netfeed=no and sock_export=no builds have been fixed. Build recipe ported for Fedora, Darwin, FreeBSD and OpenBSD. libgps now brings -lm with it on systems with implicit linking. One old bug fixed (code was previously present but broken): Under Linux, gpsd will refrain from opening serial or USB devices that another process has open, avoiding potential problems with class 0xFF USB devices opened by other programs. One new bug fix: we now use an atof() implementation that ignores locale, avoiding problems where decimal point is a comma. One new feature: Change -N semantics so it only suppresses backgrounding; privileges are now dropped as in normal background operation. 3.0: 2011-07-19 (Eric S. Raymond ) POLL subobject name changes: fixes -> tpv, skyview -> sky. Fix a timestamp-clobbering bug in the C library revealed by an obscure car-nav device, the MyGuide 3100. The DEVICE 'activated' attribute becomes an ISO8601 string; the client libraries will still backward-compatibly read a float value. gps_unpack() is now a documented part of the library API. There is now a shared-memory export from the daemon that can be accessed through the C and C++ client libraries. xgps and cgps may now display the Maidenhead grid locator for current lat/lon. xgps displays GST noise statistics if they are available. Codebase now has an scons build recipe. Direct support for activation of gpsd from Mac OS/X systemd. gpsdecode can now filter reports by RTCM2, RTCM3, or AIS message type. NMEA HEHDT is implemented. Remote gpsd instances can now be used as data sources via a gpsd:// URL. There is a client for live-feeding GPSD data to Google Earth. The hotplug sequence no longer requires Python. 2.96: 2011-03-21 (Eric S. Raymond ) Bumped maximum channel count to 32 to accommodate GPS+GLONASS devices. API version bumped to 5, redesign finished (changes are documented in the Client HOWTO). cgps now handles resize signals. Code can now link with uClibc for embedded use. Various bugs in the C++ binding have been fixed. gpxlogger can now daemonize and write to a specified log file. A gpsd client can now set any locale it likes, and JSON will still be parsed using the C locale matching the daemon's. Clients are no longer required to define a gpsd_report() hook. gpsd no longer emits probe strings to unidentified USB devices at startup. JSON timestamps in TPV and SKY are now ISO8601 rather than seconds since the Unix epoch; the library handles the older style backward-compatibly. GPGST sentences are now parsed for noise statistics when a device emits them. AIS and RTCM2 JSON dumps have device fields. JSON reports now include 50bps subframe data if the device allows access to it. gpsdecode can now dump NMEA GPS binary, and subframe data to JSON. The RTCM2 code now understands and analyzes RTCM2.3 messages 13, 14, and 31, and has been checked against another analyzer. The ancient Sager dump format for RTCM2 is abolished in favor of a JSON profile. 2.95: 2010-07-13 (Eric S. Raymond ) The autonomous robot submarine total world domination release! Rationalize clearing and generation of DOPs, this makes epx/epy much more generally available. Fixed the test productions for the udev magic and added a troubleshooting note in INSTALL. cgps now displays epx/epy rather than eph. Speed is now always reported if our last two fixes were good, even if the GPS didn't compute it. Reading packets from UDP datagrams by specifying a listening address and port is now supported, and the regression-test driver cam now be told to force this with -u; this enables regression testing in chroot jails where access to ptys is locked out. AIS code now interprets message type 6 and 8 application IDs correctly as a Designated Area Code and Functional ID pair. gpspipe has a new -T option for setting the timestamp format. xgpsspeed is completely rewritten in Python, eliminating some dependencies on ancient X libraries. We now ship a Qt binding for the client library. Note a GCC 4.2.1 optimizer bug. gpsdcode now uses | as a field separator in -c mode, as string fields can contain commas. Corrected error in reporting of AIS rate-of-turn fields. 2.94: 2010-04-20 (Eric S. Raymond ) Error-checking in the 50bps subframe code has been greatly improved. The Garmin GPS driver can now use libusb, if it is present, to do device discovery. The libgps library has been split apart; the service functions used by the daemon now live in libgpsd. This will shave some code volume from GPSD client applications. A packaging error that resulted in xgps not being shipped in 2.93 has been corrected. We now have stronger checking for valid ephemeris before extracting the leap-second offset; they should prevent many cases where gpsd might previously have used an invalid leap-second offset. 2.93: 2010-04-16 (Eric S. Raymond ) Support for JSON dumping and parsing of AIS message types 25 and 26, not yet observed in the wild on AISHub. Fix Debian bug #569703. by removing non-streaming mode from the Python exerciser. Fix Debian bug #572900 by unsetting the appropriate in-use flag in the device array. Change the libgps default from old protocol to JSON. Add a close() method to the C++ binding. Try to recover better from sporadic cases of false matches to Trimble packet format from a SiRF binary datastream. gps_poll() now returns -1 with errno not set when the gpsd socket closes. TPV now refrains from reporting fields the fix quality won't support. gpsmon option for listing device types is 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. 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. 2.92: 2010-03-03 (Eric S. Raymond ) Fix a packaging error. The new Python library module was inadvertently omitted from the 2.91 tarball. Also, improve the json import test slightly. 2.91: 2010-03-01 (Eric S. Raymond ) We have support for NMEA GLONASS sentences, and a regression test. Clients now get a DEVICE notification on every driver switch. It is possible to specify a TCP/IP AIS feed such as AISHub as a data source. Serious bitrot in the NTRIP support has been fixed - it was probably nonfunctional for several releases before this. Fixed buggy display of satellite-used flags in cgps. xgps is replaced by a rewrite in Python that uses pygtk, eliminating a dependency on Motif; also, it now displays AIS information. Uniform treatment of display-unit defaulting and -u in xgps, cgps, and lcdgps. Support for AIS message types 25 and 26. Support for IPv6. A numeric instability in the earth_distance() function affecting track error modeling has been fixed. Old protocol has been removed from the daemon; the library still speaks it. 2.90: 2009-12-04 (Eric S. Raymond ) GPSD-NG, the new JSON-based command protocol, is now deployed; as a consequence, AIS is now fully supported in both daemon and client. Detection of end of a fix-reporting cycle is now reliable; accordingly data is accumulated from cycle start and the "J" (nojitter) option on both server and client side is gone. We have abandoned the gpsflash subproject since it has become apparent that we can't do it without more vendor cooperation than we're likely to get. Increase major version of shared library due to significant API change. Added new driver for Motorola Oncore receivers, with help from Håkan Johansson. gpsfake can now accept multiple logfiles, interleaving test sentences from each. gpsd now accepts error estimates from the NMEA $GPGBS sentence. 2.39: 2009-03-18 (Eric S. Raymond ) Fixed potential core dump in C client handling of "K" responses. Made device hotplugging work again; had been broken by changes in udev. Introduced major and minor API version symbols into the public interfaces. The sirfmon utility is gone, replaced by gpsmon which does the same job for multiple GPS types. Fixed a two-year old error in NMEA parsing that nobody noticed because its only effect was to trash VDOP values from GSA sentences, and gpsd computes those with an internal error model when they look wonky. cgpxlogger has been merged into gpxlogger. Speed-setting commands now allow parity and stop-bit setting if the GPS chipset and adaptor can support it. Specfile and other packaging paraphenalia now live in a packaging subdirectory. rtcmdecode becomes gpsdecode and can now de-armor and dump AIDVM packets. The client library now works correctly in locales where the decimal separator is not a period. 2.38: 2009-02-10 (Eric S. Raymond ) Regression test load for RoyalTek RGM3800 and Blumax GPS-009 added. Scaling on E error-estimate fields fixed to match O. Listen on localhost only by default to avoid security problems; this can be overridden with the -G command-line option. The packet-state machine can now recognize RTCM3 packets, though support is not yet complete. Added support for ublox5 and mtk-3301 devices. Add a wrapper around gpsd_hexdump to save CPU. Lots of little fixes to various packet parsers. Always keep the device open: "-n" is not optional any more. xgpsspeed no longer depends on Motif. gpsctl can now ship arbitrary payloads to a device. It's possible to send binary through the control channel with the new "&" command. Experimental new driver for Novatel SuperStarII. The 'g' mode switch command now requires, and returns, 'rtcm104v2' rather than 'rtcm104'; this is design forward for when RTCM104v3 is fully working. 2.37: 2008-02-17 (Chris Kuethe ) The C++ bindings, Garmin USB support, and multiple instances of ntp pps thread starting were fixed. Handling of odd PPS signals was improved. The eye candy in the PHP visualizers was fixed. 2.36: 2008-01-01 (Eric S. Raymond ) Urgent fix to leap-day calculation affecting dates from today to 28 Feb on generic NMEA GPSes, Zodiacs, and SirFs emitting message 0x62. Integrated Garmin Simple Text Protocol driver from Peter Slansky. Minor fixes in error modeling and a better NaN guard stabilize the Trimble regression tests. Remove the wired-in NTP time offset from the NMEA driver, this could only have worked by accident and should be set in ntpd.conf. Integrated Ashtech driver from Chris Kuethe. 2.35: 2007-12-10 (Eric S. Raymond ) Navcom driver merged. Removed -d -f and -p options of gpsd; these have been undocumented for a while. Make gpsd play well with pkgconfig. Incorrect computation of VDOP when GPSes didn't supply it has been fixed. The xgps code has been revamped and now has a much nicer interface. Add -b (no-configuration) option as a sadly clumsy workaround for some problems with Bluetooth receivers. Added tests for Haicom-305N and Pharos 360; separated out the tests for the unstable Trimble drivers. 32-vs-64-bit problems in the regression tests have been solved. 2.34: 2006-12-14 (Eric S. Raymond ) Fix for byte-swapping of Zodiac control messages on big-endian hardware. Disable iTalk by default and note that it needs to be tested. Command line arguments can now be DGPSIP or NTRIP URLs; -d is deprecated. Added udev rules. Address excessive processor and memory utilization on SBCs; it's now possible to configure compile-time limits on the number of devices and client sessions. Eliminate use of fuser(1) in gpsfake. Get gpsd working with EarthMates again, this had been broken since 2.15. Massive string safety audit and OpenBSD port by Chris Kuethe. J command added. The gpsctl and gpscat tools and the gpsd.phps script were added. Switched to lesstif from openmotif. Better autodetection of DLE-led packet protocols (notably TSIP and Garmin binary) and of SiRFStar I and III devices. Fixed buggy parsing and generation of PGRME. 2.33: 2006-06-09 (Eric S. Raymond ) Fix bad unit conversion in V output. Clean up some man-page messes. Fixed buggy libgps parsing of multiple responses. It's now possible to lock gpsd to a fixed speed at compile time for embedded use. Added NTRIP support, thanks to Ville Nuorvala. O command now ships an explicit mode field. 2.32: 2006-03-12 (Eric S. Raymond ) Cleanup of the xgps layout, and minor memory-leak fixes for xgps. Fix to cope with Antares u-blox by Andreas Stricker. Minor fix to libgps cgpxlogger. Merge cgpxlogger and gpxlogger documentation onto the xgps(1) manual page and rename it gps(1). 2.31: 2006-02-17 (Eric S. Raymond ) Now builds and runs under Cygwin. Correct the speed units in synthetic NMEA. Slightly better time handling under NMEA. Daemon now builds with all but NMEA disabled. Update the leap-second offset. cgpxlogger introduced. Upgrade gpxlogger to DBUS 0.60 conformance. Jason von Nieda's patch may fix the chronic TSIP driver problems. 2.30: 2005-09-14 (Eric S. Raymond ) Prevent core dump on -d option. The .log extension is no longer required for test loads. cgps and xgps now have configurable latitude/longitude formats via the -l option. Introduced new 'g' command that allows clients to specify whether they want GPS or RTCM104 information. 2.29: 2005-07-19 (Eric S. Raymond ) Added Sony CXD2951 support, untested. All error estimates are now nailed to 95% confidence interval. Added rtcmdecode and its documentation; also, gpsd can now monitor serial devices emitting RTCM104 and display differential-GPS data in a readable format. Added dangerous alpha version of gpsflash. Work around a nasty bug in SiRFStar III firmware version < 3.1.1. Added support for True North Technologies Revolution 2X Digital compass. Added the gpxlogger client for systems with DBUS support and the gpspipe and cgps clients for general use. 2.28: 2005-07-06 (Eric S. Raymond ) The 2.27 source tarball somehow got truncated on upload. Due to procedural mechanics at Berlios, shipping a new release seems to be the least painful way to recover. This release is identical to 2.27 except the roadmap stuff has been added to TODO. 2.27: 2005-07-06 (Eric S. Raymond ) Arrange for the daemon to remove its pid file on exit. Fix some buffering problems with the Python side of the hotplug interface. gpsfake can now run sessions under a monitor like Valgrind. Most of the gpsfake logic now lives in a module that can be used to write other test loads; its progress baton is now optional. Fixed some minor bugs found by valgrind audit, including (1) a slow memory leak, (2) a possible but unconfirmed file-descriptor leak, and (3) a subtle error in the channel-assignment logic that only showed up with multiple sessions active. In fact, the daemon code no longer uses dynamic-memory allocation at all. Also, the code no longer relies on FIONREAD working. The track error field in the O response is now computed. The project website has some new eye candy. Client connections now time out when the mode is neither raw nor watcher. Fixed a core-dump that could happen if C, B or I commands were issued at odd times. 2.26: 2005-06-22 (Eric S. Raymond ) Time DOP and total DOP are now passed on from GPSes that report them. Ensure longitude has a leading zero when <100, for compatibility with gpsdrive. Synchronous and thread hooks are now separate in the client library. Packet-sniffing on a new device no longer holds up incoming data on already-connected ones. There is now a super-raw mode (R=2) that dumps a hex-encoding of every binary packet received to the client; sirfmon uses it to operate through the daemon if one is running. Support for Trimble TSIP GPSes merged. gpsfake now works with SiRF and Zodiac logs. Python library supports thread callbacks. New -p option of gpsfake supports regression testing of the daemon, and there is a test suite included with the distribution. PPS support is turned off, as there is some pthreads problem that sometimes kills the daemon on pthreads exit. Correct off-by-one error in GPZDA processing. The code has been audited and cleaned with splint (www.splint.org). 2.25: 2005-05-21 (Eric S. Raymond ) Various signedness and scaling fixes and an OpenBSD port patch for the Zodiac driver. Command-line arguments to gpsd are now treated as a default device list; -f is still supported but deprecated. sirfmon now tries not changing the line speed first, so it syncs up much faster. Prevent a potential buffer overrun in the client library. PPS-thread support is now on by default. Lots of documentation improvements. D-BUS broadcast support by Amaury Jacquot. Added Alfredo Pironti's thread-callback and C++ support. gpsd no longer uses the system clock for anything, so it can be used to set that clock. 2.24: 2005-05-17 (Eric S. Raymond ) Crazy-speed bug is finally fixed. Autobauding now starts with the current speed of the device, not the stored gpsd speed; this means hunting only takes place when device and GPS speed aren't matched. xgpsspeed unit-conversion bug introduced in 2.22 is fixed. Satellite display now really shows 12 channels, not just 11. Major improvements in ntp notifications. 2.23: 2005-05- 4 (Eric S. Raymond ) For better security, the daemon now drops root privileges after startup. gpsd-clients is now a separate RPM; this is helpful on lean systems that don't run X. The O command now reports speeds in meters per second rather than knots, client code has been adjusted so there is no user-visible change. We now compute the missing components of DOP when using SiRF chips. /dev/gps is no longer special; there is no default GPS device unless you specify one. The intermittent processor-hogging problem introduced by the control-channel change in 2.21 has been solved. 2.22: 2005-04-25 (Eric S. Raymond ) SiRF-binary driver can now get leap-second corrections from subframe data. Device add/delete commands now send back OK or ERROR. Error-modeling corrections from the SiRF folks. Higher precision in position reports. 2.21: 2005-04-12 (Eric S. Raymond ) Add tag and timestamp to Y response. Use computed geoid separation as SiRF packet 42 is flaky. Security fix: hotplug scripts now do device add/removes through a separate local control channel. True multi-device support is in place. When in watcher mode, device switches are announced. 2.20: 2005-03-31 (Eric S. Raymond ) Rob Janssen's patches to fix timezone issues and improve cooperation with NTP. License changed to BSD so linking to libgps won't make people nervous. gpsprobe and gpsd.py are obsolete and have been removed, the autoprobe and profiling capabilities in the daemon more than replace them. gpsprof now ships self-contained GNUPLOT scripts to stdout, so they can be saved and redisplayed. Zodiac sort of works again, but occasionally spins madly during autobauding. 2.19: 2005-03-26 (Eric S. Raymond ) Fix brown-paper-bag bug with NMEA parsing. Set SiRF GPSes to use SBAS. sirfmon now displays SBAS parameters, and is included in the installed programs. Add to FAQ a fix for spurious high speeds reported in XTrac mode. We now interpret GPZDA. We no longer fudge a missing ddmmyy in NMEA timestamps from the system clock, so replay will work better. 2.18-1: 2005-03-23 (Eric S. Raymond ) First cut at cooperating with NTP. Major library restructuring; a fix is now a data structure of its own, and per-field timestamps are gone. Use new 'o' command for watcher mode. Compute some estimated error bounds. 2.17: 2005-03-16 (Eric S. Raymond ) Fix packet-engine problem that made disconnect/reconnect unreliable (important!). Fix bonehead error in interpretation of PGRME. We don't use O_SYNC (it turned out not to be reliable) so remove it to make life easier under Mac OS X. Allow gpsfake to accept subsecond cycle times. Add a FAQ to the HTML documentation. gps_poll() now handles multi-line responses. Add N command for switching driver modes. 2.16: 2005-03-11 (Eric S. Raymond ) New F command allows changing the GPS device after startup time. Hotplug scripts to go with it are now installed by the RPM. The Garmin probe is working. The -T and -s options are gone. We have achieved zero configuration! 2.15: 2005-03-02 (Eric S. Raymond ) A new packet engine autobauds much more quickly, and now iterates over both 1 and 2 stopbits. Explicit support for FV18 (the -T f option) is gone; instead, gpsd syncs with any 7N2 device and always ships a suitable init string. New E command, supporting the Garmin position-error sentence or computing these numbers from DOP and an error model. New U command reports climb/sink from GPSes that report vertical velocity. There is a prototype driver for SiRF-binary GPses, invoked automatically when SiRF packets present themselves on the wire after device open. 2.14: 2005-02-25 (Eric S. Raymond ) Pass zero magnetic variation in generated NMEA from binary GPSes correctly. Use O_SYNC rather than timeouts to guarantee that baud-rate change strings get to the GPS before changing the line parameters. Introduced I command. Spatial scattergram plotting moved from gpsprobe to gpsprof. 2.13: 2005-02-21 (Eric S. Raymond ) Correct a bug in binary-protocol dumping (applies to Zodiac and Garmin only). Gary Miller's patch to deal gracefully with GPSes like the Magellan EC10X that send only GPRMC and never GPGGA or GPGSA, and thus never set mode or status fields. Fixed buggy handling of units options in xgps and xgpsspeed. Bumped library major version, since seen_sentences is now exposed and drivers have more capabilities. Stricter NMEA buffer validation. Withdrew the change that always passed up a timestamp; on SiRF receivers, the year part is garbage when the PVT fields are garbage. Can now recognize SiRF GPSes. Experimental baud-switching support for Zodiac. 2.12: 2005-02-15 (Eric S. Raymond ) Fixed core-dump bug in processing of the GLL variant that does not include an FAA Mode Indicator. When using the NMEA driver, gpsd now hunts for a baud rate rather than requiring a fixed one to be set. A new 'B' command returns the RS232 parameters, and a new 'C' command returns the update cycle time. Added gpsfake test harness. Alpha driver for Garmin binary protocol added, requires Linux garmin_usb kernel driver. The daemon now always passes up a timestamp for every sentence that has one, even if the PVT fields aren't valid. 2.11: 2005-02-10 (Eric S. Raymond ) Added gpsprof and the capability to generate GPS latency profiles. gpsprobe now hunts through plausible baud rates when looking for NMEA data from a GPS. The -b (baudrate) option fixes a speed, disabling the baud-matching logic. Also, gpsprobe can now recognize SiRF protocol, though not speak it. Fixed a math domain error in gps.EarthDistance due to numeric blowup on points very close together, and another in gps.MeterOffset() that was screwing up gpsprobe plots. 2.10: 2005-02-01 (Eric S. Raymond ) Add -N option to explicitly foreground the daemon. Fixed a bug that was causing gpsd to keep reopening the GPS device after leaving raw or watcher mode. Fixed Gary Miller's core-dump bug. 2.9: 2005-01-27 (Eric S. Raymond ) Python files restored to RPM. 2.8: 2005-01-27 (Eric S. Raymond ) Embarrassing typo fix in gps.py. Avoid buffer overrun in xgps.c. Plug Debian security bug 292347, CVE number CAN-2004-1388. This version issued on an emergency basis without Python libraries, which have packaging problems due to the 2.3/2.4 transition. 2.7: 2005-01-14 (Eric S. Raymond ) More compiler-warning cleanups. gps client name changed to xgps. Added --speedunits option to xgpsspeed, --speedunits and --altunits options to xgps. Improved GPGSV parsing so it copes gracefully if we start in the middle of a sequence. Merged Petter Reinholdtsen's fix for GPGSA lists with holes. In xgps, satellites used in the last fix are now dotted in the middle. New -P option to create pidfile. Audited for potential buffer overruns, found and fixed two. 2.6: 2005-01-01 (Eric S. Raymond ) Petter Reinholdtsen's fix for gps.py buffering. Fix syntax errors in udev scriptlets. Clean up after GCC warning messages. Drop use of vsprintf, so we get a link-time error on systems that might produce buffer overruns (all modern Unixes support vsnsprintf which is safe). 2.5: 2004-12-23 (Eric S. Raymond ) Use gmtime instead of localtime when guessing the day or year of a date; this avoids jitter in the day after 19:00 GMT. Added -v option to dump version and exit. Commented out a crash-causing debug line in gps.py. 2.4: 2004-12-09 (Eric S. Raymond ) Minor bugs in gpsd.py fixed. M now returns 0 status if GPGSA not yet seen; this change also fixes a bug where gpsd claimed it was confused if GPGSA had not been seen and status was set. RPM will now install a udevd rule if the host system uses it. Don't set the online flag on activate. HP port changes and -Wall cleanup. James Cameron's fixes to clean up gps.c and use X timeouts rather than alarms. 2.3: 2004-10-25 (Eric S. Raymond ) Documentation and comment fixes. Last two globals removed from low-level interface; library should now be fully re-entrant. Mac OS X port fixes. Q command fix from Robin L Darroch . 2.2: 2004-10-18 (Eric S. Raymond ) Documentation improvements. BSD port fixes. Bug fix: speed timestamp wasn't initialized properly in libgps. Device is now an optional command-line argument of gpsprobe, in line with the clients. gpsd.py now should handle fvwm devices correctly. Values in gps data panel are now labeled with units. Attempted fix for 2.1 bug of DTR not being pulled low on exit. 2.1: 2004-09-30 (Eric S. Raymond ) Various internal cleanups, including fossil removal in the configuration machinery. FV-18, Tripmate, Earthmate and are now enabled but can be disable with --disable-$NAME at configure time. When you call configure with --disable-shared, libgps is linked statically to the binaries (native libs are still linked shared). Fixed buggy handling of -p option in gps.c and xgpsspeed.c; it's now an optional command-line argument. 2.0: 2004-09-16 (Eric S. Raymond ) Packaging fixes for 2.0 release. 1.98: 2004-09-08 (Eric S. Raymond ) Only do one getdtablesize() call, otherwise we do several getrlimits() each poll cycle. TripMate is working. gpsprobe now deduces NMEA version. Zodiac Earthmate seems to work. 1.97: 2004-08-08 (Eric S. Raymond ) Removed PRWIZCH support (it still passes through in raw mode). Build Motif-dependent programs conditionally. Added gpsprobe. Fixed a brown-paper-bag-bug in 1.96 RPM packaging. 1.96: 2004-08-31 (Eric S. Raymond ) Implemented non-blocking writes to clients, so a stalled client cannot stall gpsd. Fixed a nasty array-overrun bug. Timestamps are now in ISO8601 format, with sub-second precision if the GPS delivers that. First cuts at Python interfaces included. libgps.a interface now bundles session fd into an allocated session block. Automake-based build machinery from Jens Oberender; RPM now installs shared libraries. FV18 driver added. Offline timer in GPS. 1.95: 2004-08-25 (Eric S. Raymond ) Fixed broken 'make dist', missing display.c and Tachometer.c are in there now. 1.94: 2004-08-24 (Eric S. Raymond ) Fix embarrassing bug -- watcher mode did not work for more than one client at a time. Y command now carries information about which satellites were used in the last fix. New timeout mechanism, no longer dependent on FIONREAD. 1.93: 2004-08-23 (Eric S. Raymond ) Fourth prerelease. Daemon-side timeouts are gone, they complicated the interface without adding anything. Command responses now contain ? to tag invalid data. -D2 feature of 1.92 backed out. 1.92: 2004-08-22 (Eric S. Raymond ) Third prerelease. Clients in watcher mode now get notified when the GPS goes online or offline. Major name changes -- old libgps is new libgpsd and vice-versa (so the high-level interface is more prominent). Specfile now includes code to install gpsd so it will be started at boot time. -D2 now causes command error messages to be echoed to the client. 1.91: 2004-08-21 (Eric S. Raymond ) Second pre-2.0 release. Features a linkable C library that hides the details of communicating with the daemon. The daemon now recovers gracefully from having the GPS unplugged and plugged in at any time; one of the bits of status it can report is whether the GPS is online. The gps and xgpsspeed clients now query the daemon; their code for direct access to the serial port has been deliberately removed. 1.90: 2004-08-15 (Eric S. Raymond ) Creation of specfile. ?: 2004-03-21 (Remco Treffkorn ) Without PRWIZCH sentence: sat. colors in gps according to ss, grey==lt20, yellow==lt40 else green. Added L Q and I to the protocol. Removed G and T. Changed the timeout mechanism. Try to not return Lat/Lon/Alt if validity is in doubt. ?: 2004-01-29 (Remco Treffkorn ) Make applications null-terminate their resource lists. ?: 2003-12-20 (Remco Treffkorn ) Removed from netlib. Not needed, and new gcc does not support it any more. 1.10: 2003-08-20 (Remco Treffkorn ) Add install target. Fix clean target. Make GPS timeout configurable. Make xgpsspeed build with Apple's X11. Make sure that we don't segfault if the NMEA is badly formed. ?: 2003-08-18 (Remco Treffkorn ) Use cfset[io]speed() to set speed in serial.h. Glibc is quite insane and I am tired to chase it, so I give up. Hope this works for BSD. Set status and mode 0 after GPS timeout (5 sec) - Cougar 1.09: 2003-02-16 (Remco Treffkorn ) Include sys/time.h in gpsd.c for struct timeval. ?: 2002-11-03 (Remco Treffkorn ) G or g command returns six-digit Maidenhead grid square (like FN12fx) 1.08: 2002-10-03 (Remco Treffkorn ) Added sockopt SO_REUSEADDR to netlib.c passive_sock. 1.07: 2002-02-05 (Remco Treffkorn ) em.c uses (as it should). Removed some where they were not needed. Russ Nelson: Improved Earthmate support: added state machine for EARTHA recognizer, removed alignment problems seen on ARM architecture. Added setsockopt to add SO_REUSEADDR, so that gpsd can stop and immediately restart. Added support for bitrates higher than 38400, needed for the SIRF chipset. Derrick: my patch causes longitude when under 100 degrees to be printed zero-padded as needed, the latitude same deal under 10, fixes the GGA sentence to not erroneously print fix type (2/3) instead of fix quality, and calculates fix type correctly. 1.06: 2000-08-11 (Remco Treffkorn ) Change from C++ (/) to C comments (/* */)for compatibility. Added -n (need init) flag. Don't init unless lat/lon specified. Remove gps.mayko.com as the default hostname. 1.05: 2000-05-12 (Remco Treffkorn ) (even though version.h says 1.04) Added some includes to xgpsspeed.c for portability. Fix problem with flags being overwritten, and using the wrong port variable also in xgpsspeed.c Add a note about Y2K compatibility fix. Pass latitude and longitude into em_init(). 1.02: 2000-03-17 (Remco Treffkorn ) (even though version.h says 1.01) 1.01: 2000-03-05 (Remco Treffkorn ) Updated to IANA port. Fixes to DGPS support. 1.0: 2000-01-02 (Remco Treffkorn ) Added DGPS fixes from Curt Mills. (See README for contact info.) 0.99dgps: 1999-12-13 (Remco Treffkorn ) Added minimal DGPS support by Derrick J Brashear 0.99: 1999-07-17 (Remco Treffkorn ) Rockwell binary is now translated to NMEA format, so that clients like gps will work with an EarthMate. Added speedometer application. Thanks to Derrick J Brashear for his work (see README for contact info). 0.96: 1999-03-04 (Remco Treffkorn ) Changed EarthMate support. Rockwell binary is now almost properly supported. Only the minimum required information is extracted. 0.95: 1999-02-06 (Remco Treffkorn ) Added support for EarthMate receivers. Since I do not have one, this is untested. If it works, it does the following: You start gpsd with a baudrate of 9600 and give it the -Te option. If gpsd gets the EartMate it will enable the receiver and then attempt to switch it into NMEA mode. If the EarthMate id is not received, but a binary data header is received, then we will try to switch NMEA too. 0.94: 1999-01-24 (Remco Treffkorn ) Y2K compliant ;-) (... is NOT. Look for "FIXME:" in nmea_parse.c) 0.93: 1998-01-27 (Remco Treffkorn ) using GNU autoconf now. combined gpsd + gpsclient. No more init files, command line only. 0.9: 1997-05-13 (Remco Treffkorn ) some cleanups in the ini code. version 0.9 ... 0.8: 1997-04-25 (Remco Treffkorn ) version 0.8, some bug fixes. New MODE member, STATUS member changed. 0.7: 1997-04-21 (Remco Treffkorn ) released version 0.7 gpsd-3.15/Qgpsmm.pc.in0000664000175000017500000000075212520742615012752 0ustar esresrprefix=@prefix@ exec_prefix=${prefix} libdir=${exec_prefix}@libdir@ includedir=${prefix}/include qt_config=lex yacc warn_on uic resources qt release incremental link_prl def_files_disabled exceptions no_mocdepend stl qt_no_framework create_pc create_prl moc thread dll Name: Qgpsmm Description: GPS Daemon communication library - QT binding Version: @VERSION@ Libs: -L${libdir} -lQgpsmm Libs.private: -L/usr/lib -lQtNetwork -lQtCore -lpthread Cflags: -I${includedir} Requires: QtNetwork gpsd-3.15/README0000664000175000017500000001207212520742615011433 0ustar esresrGENERAL ======= gpsd is a userland daemon acting as a translator between GPS and AIS receivers and their clients. gpsd listens on port 2947 for clients requesting position/time/velocity information. The receivers are expected to generate position information in a well-known format -- as NMEA-0183 sentences, SiRF binary, Rockwell binary, Garmin binary format, or other vendor binary protocols. gpsd takes this information from the GPS and translates it into something uniform and easier to understand for clients. The distribution includes sample clients, application interface libraries, and test/profiling tools. There is a website for GPSD where you can find updates, news, and project mailing lists; look for that URL in the scons recipe, the file SConstruct in this top-level directory. See that website for a list of GPS units known to be compatible. See the file INSTALL for installation instructions and some tips on how to troubleshoot your installation. The file build.txt has instructions for building from source. The packaging/ directory contains resources and suggestions for packagers and distribution integrators. LICENSE ======= This software (gpsd) is released under the terms and conditions of the BSD License, a copy of which is included in the file COPYING. 1.X CREDITS =========== Remco Treffkorn designed and originated the code. Russ Nelson maintained gpsd for a couple of years. Carsten Tschach's gpstrans-0.31b code was the original model for nmea_parse.c. Bob Lorenzini provided testing and feedback. Brook Milligan combined gpsd and gpsclient into one package and autoconfiscated it. Derrick J. Brashear (KB3EGH) added code for the EarthMate DeLorme. He also added "incredibly gross code to output NMEA sentences" (his own words :-) He also did the first cut at DGPS support (see http://www.wsrcc.com/wolfgang/gps/dgps-ip.html), for the Earthmate. Curt Mills (WE7U) furthered the dgps support, writing the portion for other GPS receivers. None of these people have been active in 2.X and later versions; gpsd has evolved out of recognition from the 1.X codebase. 2.X CREDITS =========== Eric S. Raymond drastically rewrote this code in late 2004/early 2005 to clean it up and extend it. The 2.X architecture has become significantly different and far more modularized. His new features included: * Documentation (what a concept!) * Cleaned up, simplified command-line options. * Now understands the GLL (Geographic position - Latitude, Longitude) sentence from NMEA 3.0. * Now parses both the NMEA 3.01 and pre-3.01 variants of the VTG sentence correctly. * New commands including 'y', 'w', and 'x', since obsolesced by a JSON-based protocol. * Massive refactoring -- one main loop now calls a self-contained driver object for each type. * The GPS-bashing code the daemon uses can now be directly linked as a library, libgpsd(3). * C and Python libraries are available to encapsulate the client side of querying gpsd, see libgps(3). * Cleaned-up error reporting, we don't use syslog when running in foreground but send all error and status messages to the tty instead. * Added -n option to do batch monitoring of GPSes. * xgpsspeed is working again; xgps has been seriously reworked and improved. * RPMs which include installation of gpsd to start up at boot time are available. * New gpsprobe program probes the capabilities of GPSes and generates error scattergrams from fixes. (Later this moved to gpsprof.) * Autobauding, self-configuration, and hotplugging. gpsd can now get its device from a hotplug script, and figures out itself which baud rate to use and what the GPS's device type is. * Support for SiRF binary mode. * Support for RTCM104 and AIVDM. * Support for multiple devices. * Other test tools -- gpsfake, gpscat, gpsmon. Chris Kuethe maintains the OpenBSD port, shipped the 2.34 release, is our SiRF and low-level protocols expert, and does a lot of general hacking and support. He has release authority. Gary Miller wrote the driver for Garmin binary protocol and most of the support for PPS handling on serial devices. He has release authority. Amaury Jacquot added DBUS support. Ville Nuorvala wrote the NTRIP support. We are delighted to acknowlege the assistance of Carl Carter, a field application engineer at SiRF. He assisted us with the correction and tuning of the SiRF binary-protocol driver, shedding a good deal of light on murky aspects of the chip's behavior. We are also delighted to acknowlege the assistance of Timo Ylhainen, VP of Software Operations at Fastrax. He clarified a number of points about the iTalk protocol, helping to further development of iTalk support. 3.X CREDITS =========== The main feature of the 3.x versions is a stabilized and finalized version of the JSON command/response protocol. This was designed and mainly implemented by ESR. Gary Miller wrote the subframe support. gpsd-3.15/SConstruct0000664000175000017500000022733112533605233012611 0ustar esresr## SCons build recipe for the GPSD project # Important targets: # # build - build the software (default) # dist - make distribution tarball # install - install programs, libraries, and manual pages # uninstall - undo an install # # check - run regression and unit tests. # audit - run code-auditing tools # testbuild - test-build the code from a tarball # website - refresh the website # release - ship a release # # --clean - clean all normal build targets # sconsclean - clean up scons dotfiles (but not the database) # # Setting the DESTDIR environment variable will prefix the install destinations # without changing the --prefix prefix. # Unfinished items: # * Out-of-directory builds: see http://www.scons.org/wiki/UsingBuildDir # * Coveraging mode: gcc "-coverage" flag requires a hack for building the python bindings # Release identification begins here gpsd_version = "3.15" # client library version libgps_version_current = 22 libgps_version_revision = 0 libgps_version_age = 0 # Release identification ends here # Hosting information (mainly used for templating web pages) begins here # Each variable foo has a corresponding @FOO@ expanded in .in files. # There are no project-dependent URLs or references to the hosting site # anywhere else in the distribution; preserve this property! sitename = "Savannah" sitesearch = "catb.org" website = "http://catb.org/gpsd" mainpage = "https://savannah.nongnu.org/projects/gpsd/" webupload = "login.ibiblio.org:/public/html/catb/gpsd" cgiupload = "thyrsus.com:/home/www/thyrsus.com/cgi-bin/" scpupload = "dl.sv.nongnu.org:/releases/gpsd/" mailman = "https://lists.nongnu.org/mailman/listinfo/" admin = "https://savannah.nongnu.org/project/admin/?group=gpsd" download = "http://download-mirror.savannah.gnu.org/releases/gpsd/" bugtracker = "https://savannah.nongnu.org/bugs/?group=gpsd" browserepo = "http://git.savannah.gnu.org/cgit/gpsd.git" clonerepo = "https://savannah.nongnu.org/git/?group=gpsd" gitrepo = "git://git.savannah.nongnu.org/gpsd.git" webform = "http://www.thyrsus.com/cgi-bin/gps_report.cgi" formserver = "www@thyrsus.com" devmail = "gpsd-dev@lists.nongnu.org" usermail = "gpsd-users@lists.nongnu.org" annmail = "gpsd-announce@nongnu.org" ircchan = "irc://chat.freenode.net/#gpsd" tiplink = "leave a tip at Gratipay" tipwidget = "" # Hosting information ends here EnsureSConsVersion(2,3,0) import copy, os, sys, glob, re, platform, time from distutils import sysconfig from distutils.util import get_platform import SCons # replacement for functions from the commands module, which is deprecated. from subprocess import PIPE, STDOUT, Popen def _getstatusoutput(cmd, input=None, cwd=None, env=None): pipe = Popen(cmd, shell=True, cwd=cwd, env=env, stdout=PIPE, stderr=STDOUT) (output, errout) = pipe.communicate(input=input) status = pipe.returncode return (status, output) def _getoutput(cmd, input=None, cwd=None, env=None): return _getstatusoutput(cmd, input, cwd, env)[1] # # Build-control options # # Start by reading configuration variables from the cache opts = Variables('.scons-option-cache') systemd_dir = '/lib/systemd/system' systemd = os.path.exists(systemd_dir) # Set distribution-specific defaults here imloads = True boolopts = ( # GPS protocols ("nmea0183", True, "NMEA0183 support"), ("ashtech", True, "Ashtech support"), ("earthmate", True, "DeLorme EarthMate Zodiac support"), ("evermore", True, "EverMore binary support"), ("fv18", True, "San Jose Navigation FV-18 support"), ("garmin", True, "Garmin kernel driver support"), ("garmintxt", True, "Garmin Simple Text support"), ("geostar", True, "Geostar Protocol support"), ("itrax", True, "iTrax hardware support"), ("mtk3301", True, "MTK-3301 support"), ("navcom", True, "Navcom NCT support"), ("oncore", True, "Motorola OnCore chipset support"), ("sirf", True, "SiRF chipset support"), ("superstar2", True, "Novatel SuperStarII chipset support"), ("tnt", True, "True North Technologies support"), ("tripmate", True, "DeLorme TripMate support"), ("tsip", True, "Trimble TSIP support"), ("ublox", True, "u-blox Protocol support"), ("fury", True, "Jackson Labs Fury and Firefly support"), ("nmea2000", True, "NMEA2000/CAN support"), # Non-GPS protocols ("aivdm", True, "AIVDM support"), ("gpsclock", True, "GPSClock support"), ("ntrip", True, "NTRIP support"), ("oceanserver", True, "OceanServer support"), ("rtcm104v2", True, "rtcm104v2 support"), ("rtcm104v3", True, "rtcm104v3 support"), ("passthrough", True, "build support for passing through JSON"), # Time service ("ntp", True, "NTP time hinting support"), ("ntpshm", True, "NTP time hinting via shared memory"), ("pps", True, "PPS time syncing support"), # Export methods ("socket_export", True, "data export over sockets"), ("dbus_export", True, "enable DBUS export support"), ("shm_export", True, "export via shared memory"), # Communication ('usb', True, "libusb support for USB devices"), ("bluez", True, "BlueZ support for Bluetooth devices"), ("ipv6", True, "build IPv6 support"), ("netfeed", True, "build support for handling TCP/IP data sources"), # Other daemon options ("force_global", False, "force daemon to listen on all addressses"), ("timing", False, "latency timing support"), ("control_socket",True, "control socket for hotplug notifications"), ("systemd", systemd, "systemd socket activation"), # Client-side options ("clientdebug", True, "client debugging support"), ("ncurses", True, "build with ncurses"), ("libgpsmm", True, "build C++ bindings"), ("qt", True, "build QT bindings"), # Daemon options ("reconfigure", True, "allow gpsd to change device settings"), ("controlsend", True, "allow gpsctl/gpsmon to change device settings"), ("nofloats", False, "float ops are expensive, suppress error estimates"), ("squelch", False, "squelch gpsd_log/gpsd_hexdump to save cpu"), # Build control ("shared", True, "build shared libraries, not static"), ("implicit_link", imloads,"implicit linkage is supported in shared libs"), ("python", True, "build Python support and modules."), ("debug", False, "include debug information in build"), ("profiling", False, "build with profiling enabled"), ("coveraging", False, "build with code coveraging enabled"), ("nostrip", False, "don't symbol-strip binaries at link time"), ("manbuild", True, "build help in man and HTML formats"), ("leapfetch", True, "fetch up-to-date data on leap seconds."), ("minimal", False, "turn off every option not set on the command line"), # Test control ("slow", False, "run tests with realistic (slow) delays"), ) for (name, default, help) in boolopts: opts.Add(BoolVariable(name, help, default)) # Gentoo, Fedora, opensuse systems use uucp for ttyS* and ttyUSB* if os.path.exists("/etc/gentoo-release"): def_group = "uucp" else: def_group = "dialout" nonboolopts = ( ("gpsd_user", "nobody", "privilege revocation user",), ("gpsd_group", def_group, "privilege revocation group"), ("prefix", "/usr/local", "installation directory prefix"), ("python_libdir", sysconfig.get_python_lib(plat_specific=1), "Python module directory prefix"), ("max_clients", '64', "maximum allowed clients"), ("max_devices", '4', "maximum allowed devices"), ("fixed_port_speed", 0, "fixed serial port speed"), ("fixed_stop_bits", 0, "fixed serial port stop bits"), ("target", "", "cross-development target"), ("sysroot", "", "cross-development system root"), ) for (name, default, help) in nonboolopts: opts.Add(name, help, default) pathopts = ( ("sysconfdir", "etc", "system configuration directory"), ("bindir", "bin", "application binaries directory"), ("includedir", "include", "header file directory"), ("libdir", "lib", "system libraries"), ("sbindir", "sbin", "system binaries directory"), ("mandir", "share/man", "manual pages directory"), ("docdir", "share/doc", "documents directory"), ("udevdir", "/lib/udev", "udev rules directory"), ("pkgconfig", "$libdir/pkgconfig", "pkgconfig file directory"), ) for (name, default, help) in pathopts: opts.Add(PathVariable(name, help, default, PathVariable.PathAccept)) # # Environment creation # import_env = ( "MACOSX_DEPLOYMENT_TARGET", # Required by MacOSX 10.4 (and probably earlier) "DISPLAY", # Required for dia to run under scons "GROUPS", # Required by gpg "HOME", # Required by gpg "LOGNAME", # LOGNAME is required for the flocktest production. 'PATH', # Required for ccache and Coverity scan-build 'PKG_CONFIG_PATH', # Set .pc file directory in a crossbuild 'PKG_CONFIG_SYSROOT_DIR', # Pass more environment variables to pkg-config (required for crossbuilds) 'PKG_CONFIG_LIBDIR', # Pass more environment variables to pkg-config (required for crossbuilds) 'STAGING_DIR', # Required by the OpenWRT and CeroWrt builds. 'STAGING_PREFIX', # Required by the OpenWRT and CeroWrt builds. 'WRITE_PAD', # So we can test WRITE_PAD values on the fly. ) envs = {} for var in import_env: if var in os.environ: envs[var] = os.environ[var] envs["GPSD_HOME"] = os.getcwd() env = Environment(tools=["default", "tar", "textfile"], options=opts, ENV=envs) opts.Save('.scons-option-cache', env) env.SConsignFile(".sconsign.dblite") # Minimal build turns off every option not set on the command line, if env['minimal']: for (name, default, help) in boolopts: if default == True and not ARGUMENTS.get(name): env[name] = False # NTPSHM requires NTP if env['ntpshm']: env['ntp'] = True for (name, default, help) in pathopts: env[name] = env.subst(env[name]) env['VERSION'] = gpsd_version env['PYTHON'] = sys.executable # Set defaults from environment. Note that scons doesn't cope well # with multi-word CPPFLAGS/LDFLAGS/SHLINKFLAGS values; you'll have to # explicitly quote them or (better yet) use the "=" form of GNU option # settings. env['STRIP'] = "strip" env['PKG_CONFIG'] = "pkg-config" for i in ["AR", "ARFLAGS", "CCFLAGS", "CFLAGS", "CC", "CXX", "CXXFLAGS", "LINKFLAGS", "STRIP", "PKG_CONFIG", "LD", "TAR"]: if os.environ.has_key(i): j = i if i == "LD": i = "SHLINK" if i in ("CFLAGS", "CCFLAGS", "LINKFLAGS"): env.Replace(**{j: Split(os.getenv(i))}) else: env.Replace(**{j: os.getenv(i)}) for flag in ["LDFLAGS", "SHLINKFLAGS", "CPPFLAGS"]: if os.environ.has_key(flag): env.MergeFlags({flag : [os.getenv(flag)]}) # Keep scan-build options in the environment for key, value in os.environ.iteritems(): if key.startswith('CCC_'): env.Append(ENV={key:value}) # Placeholder so we can kluge together something like VPATH builds. # $SRCDIR replaces occurrences for $(srcdir) in the autotools build. env['SRCDIR'] = '.' # We may need to force slow regression tests to get around race # conditions in the pty layer, especially on a loaded machine. if env["slow"]: env['REGRESSOPTS'] = "-S" else: env['REGRESSOPTS'] = "" def announce(msg): if not env.GetOption("silent"): print msg # DESTDIR environment variable means user wants to prefix the installation root. DESTDIR = os.environ.get('DESTDIR', '') def installdir(dir, add_destdir=True): # use os.path.join to handle absolute paths properly. wrapped = os.path.join(env['prefix'], env[dir]) if add_destdir: wrapped = os.path.normpath(DESTDIR + os.path.sep + wrapped) wrapped.replace("/usr/etc", "/etc") wrapped.replace("/usr/lib/systemd", "/lib/systemd") return wrapped # Honor the specified installation prefix in link paths. if env["sysroot"]: env.Prepend(LIBPATH=[env["sysroot"] + installdir('libdir', add_destdir=False)]) # Give deheader a way to set compiler flags if 'MORECFLAGS' in os.environ: env.Append(CFLAGS=Split(os.environ['MORECFLAGS'])) # Don't change CFLAGS if already set by environment. if not 'CFLAGS' in os.environ: if '-Wmissing-prototypes' not in env['CFLAGS']: env.Append(CFLAGS=['-Wmissing-prototypes']) # Don't change CCFLAGS if already set by environment. if not 'CCFLAGS' in os.environ: env.Append(CCFLAGS=['-Wmissing-declarations']) # Should we build with profiling? if env['profiling']: env.Append(CCFLAGS=['-pg']) env.Append(LDFLAGS=['-pg']) # Should we build with coveraging? if env['coveraging']: env.Append(CFLAGS=['-coverage']) env.Append(LDFLAGS=['-coverage']) env.Append(LINKFLAGS=['-coverage']) # Should we build with debug symbols? if env['debug']: env.Append(CCFLAGS=['-g']) # Should we build with optimisation? if env['debug'] or env['coveraging']: env.Append(CCFLAGS=['-O0']) else: env.Append(CCFLAGS=['-O2']) # Get a slight speedup by not doing automatic RCS and SCCS fetches. env.SourceCode('.', None) ## Cross-development devenv = (("ADDR2LINE", "addr2line"), ("AR","ar"), ("AS","as"), ("CXX","c++"), ("CXXFILT","c++filt"), ("CPP","cpp"), ("GXX","g++"), ("CC","gcc"), ("GCCBUG","gccbug"), ("GCOV","gcov"), ("GPROF","gprof"), ("LD", "ld"), ("NM", "nm"), ("OBJCOPY","objcopy"), ("OBJDUMP","objdump"), ("RANLIB", "ranlib"), ("READELF","readelf"), ("SIZE", "size"), ("STRINGS", "strings"), ("STRIP", "strip")) if env['target']: for (name, toolname) in devenv: env[name] = env['target'] + '-' + toolname if env['sysroot']: env.MergeFlags({"CFLAGS": ["--sysroot=%s" % env['sysroot']]}) env.MergeFlags({"LINKFLAGS": ["--sysroot=%s" % env['sysroot']]}) ## Build help Help("""Arguments may be a mixture of switches and targets in any order. Switches apply to the entire build regardless of where they are in the order. Important switches include: prefix=/usr probably what you want for production tools Options are cached in a file named .scons-option-cache and persist to later invocations. The file is editable. Delete it to start fresh. Current option values can be listed with 'scons -h'. """ + opts.GenerateHelpText(env, sort=cmp)) ## Configuration def CheckPKG(context, name): context.Message( 'Checking for %s... ' % name ) ret = context.TryAction('%s --exists \'%s\'' % (env['PKG_CONFIG'], name))[0] context.Result( ret ) return ret # Stylesheet URLs for making HTML and man pages from DocBook XML. docbook_url_stem = 'http://docbook.sourceforge.net/release/xsl/current/' docbook_man_uri = docbook_url_stem + 'manpages/docbook.xsl' docbook_html_uri = docbook_url_stem + 'html/docbook.xsl' def CheckXsltproc(context): context.Message('Checking that xsltproc can make man pages... ') ofp = open("xmltest.xml", "w") ofp.write(''' foo 1 9 Aug 2004 foo check man page generation from docbook source ''') ofp.close() probe = "xsltproc --nonet --noout '%s' xmltest.xml" % (docbook_man_uri,) ret = context.TryAction(probe)[0] os.remove("xmltest.xml") if os.path.exists("foo.1"): os.remove("foo.1") context.Result( ret ) return ret def CheckCompilerOption(context, option): context.Message( 'Checking if compiler accepts %s ...' % (option,) ) old_CFLAGS=context.env['CFLAGS'] context.env.Append(CFLAGS=option) ret = context.TryLink(""" int main(int argc, char **argv) { return 0; } """,'.c') if not ret: context.env.Replace(CFLAGS=old_CFLAGS) context.Result(ret) return ret def CheckHeaderDefines(context, file, define): context.Message( 'Checking if %s supplies %s ...' % (file,define) ) ret = context.TryLink(""" #include <%s> #ifndef %s #error %s is not defined #endif int main(int argc, char **argv) { return 0; } """ % (file, define, define),'.c') context.Result(ret) return ret def CheckCompilerDefines(context, define): context.Message( 'Checking if compiler supplies %s ...' % (define,) ) ret = context.TryLink(""" #ifndef %s #error %s is not defined #endif int main(int argc, char **argv) { return 0; } """ % (define, define),'.c') context.Result(ret) return ret # Check if this compiler is C11 or better def CheckC11(context): context.Message( 'Checking if compiler is C11 ...' ) ret = context.TryLink(""" #if (__STDC_VERSION__ < 201112L) #error Not C11 #endif int main(int argc, char **argv) { return 0; } """,'.c') context.Result(ret) return ret def GetLoadPath(context): context.Message("Getting system load path ...") if env.GetOption("clean") or env.GetOption("help"): dbusflags = [] rtlibs = [] usbflags = [] bluezflags = [] ncurseslibs = [] confdefs = [] manbuilder = False htmlbuilder = False qt_env = None else: config = Configure(env, custom_tests = { 'CheckPKG' : CheckPKG, 'CheckXsltproc' : CheckXsltproc, 'CheckCompilerOption' : CheckCompilerOption, 'CheckCompilerDefines' : CheckCompilerDefines, 'CheckC11' : CheckC11, 'CheckHeaderDefines' : CheckHeaderDefines}) # If supported by the compiler, enable all warnings except uninitialized and # missing-field-initializers, which we can't help triggering because # of the way some of the JSON-parsing code is generated. # Also not including -Wcast-qual and -Wimplicit-function-declaration, # because we can't seem to keep scons from passing these to g++. for option in ('-Wextra','-Wall', '-Wno-uninitialized','-Wno-missing-field-initializers', '-Wcast-align','-Wmissing-declarations', '-Wmissing-prototypes', '-Wstrict-prototypes', '-Wpointer-arith', '-Wreturn-type'): if option not in config.env['CFLAGS']: config.CheckCompilerOption(option) # OS X aliases gcc to clang # clang accepts -pthread, then warns it is unused. if config.CheckCompilerOption("-pthread") and not sys.platform.startswith('darwin'): env.MergeFlags("-pthread") env.Prepend(LIBPATH=[os.path.realpath(os.curdir)]) confdefs = ["/* gpsd_config.h. Generated by scons, do not hand-hack. */\n"] confdefs.append('#ifndef GPSD_CONFIG_H\n') confdefs.append('#define VERSION "%s"\n' % gpsd_version) confdefs.append('#define GPSD_URL "%s"\n' % website) cxx = config.CheckCXX() if not cxx and env["libgpsmm"]: announce("C++ doesn't work, suppressing libgpsmm build.") env["libgpsmm"] = False # define a helper function for pkg-config - we need to pass # --static for static linking, too. if env["shared"]: pkg_config = lambda pkg: ['!%s --cflags --libs %s' %(env['PKG_CONFIG'], pkg, )] else: pkg_config = lambda pkg: ['!%s --cflags --libs --static %s' %(env['PKG_CONFIG'], pkg, )] # The actual distinction here is whether the platform has ncurses in the # base system or not. If it does, pkg-config is not likely to tell us # anything useful. FreeBSD does, Linux doesn't. Most likely other BSDs # are like FreeBSD. ncurseslibs= [] if env['ncurses']: if config.CheckPKG('ncurses'): ncurseslibs = pkg_config('ncurses') elif WhereIs('ncurses5-config'): ncurseslibs = ['!ncurses5-config --libs --cflags'] elif WhereIs('ncursesw5-config'): ncurseslibs = ['!ncursesw5-config --libs --cflags'] elif sys.platform.startswith('freebsd'): ncurseslibs= [ '-lncurses' ] elif sys.platform.startswith('openbsd'): ncurseslibs= [ '-lcurses' ] elif sys.platform.startswith('darwin'): ncurseslibs= [ '-lcurses' ] if env['usb']: # In FreeBSD except version 7, USB libraries are in the base system if config.CheckPKG('libusb-1.0'): confdefs.append("#define HAVE_LIBUSB 1\n") try: usbflags = pkg_config('libusb-1.0') except OSError: announce("pkg_config is confused about the state of libusb-1.0.") usbflags = [] elif sys.platform.startswith("freebsd"): confdefs.append("#define HAVE_LIBUSB 1\n") usbflags = [ "-lusb"] else: confdefs.append("/* #undef HAVE_LIBUSB */\n") usbflags = [] else: confdefs.append("/* #undef HAVE_LIBUSB */\n") usbflags = [] env["usb"] = False if config.CheckLib('librt'): confdefs.append("#define HAVE_LIBRT 1\n") # System library - no special flags rtlibs = ["-lrt"] else: confdefs.append("/* #undef HAVE_LIBRT */\n") rtlibs = [] if env['dbus_export'] and config.CheckPKG('dbus-1'): confdefs.append("#define HAVE_DBUS 1\n") dbusflags = ["-ldbus-1"] env.MergeFlags(pkg_config("dbus-1")) else: confdefs.append("/* #undef HAVE_DBUS */\n") dbusflags = [] if env["dbus_export"]: announce("Turning off dbus-export support, library not found.") env["dbus_export"] = False if env['bluez'] and config.CheckPKG('bluez'): confdefs.append("#define ENABLE_BLUEZ 1\n") bluezflags = pkg_config('bluez') else: confdefs.append("/* #undef ENABLE_BLUEZ */\n") bluezflags = [] if env["bluez"]: announce("Turning off Bluetooth support, library not found.") env["bluez"] = False #in_port_t is not defined on Android if not config.CheckType("in_port_t","#include "): announce("Did not find in_port_t typedef, assuming unsigned short int") confdefs.append("typedef unsigned short int in_port_t;\n") #SUN_LEN is not defined on Android if not config.CheckDeclaration("SUN_LEN", "#include ") and not config.CheckDeclaration("SUN_LEN", "#include "): announce("SUN_LEN is not system-defined, using local definition") confdefs.append("#ifndef SUN_LEN\n") confdefs.append("#define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) + strlen((ptr)->sun_path))\n") confdefs.append("#endif /* SUN_LEN */\n") if config.CheckHeader(["bits/sockaddr.h", "linux/can.h"]): confdefs.append("#define HAVE_LINUX_CAN_H 1\n") announce("You have kernel CANbus available.") else: confdefs.append("/* #undef HAVE_LINUX_CAN_H */\n") announce("You do not have kernel CANbus available.") env["nmea2000"] = False # check for C11 or better, and __STDC__NO_ATOMICS__ is not defined # before looking for stdatomic.h if config.CheckC11() and not config.CheckCompilerDefines("__STDC_NO_ATOMICS__") and config.CheckHeader("stdatomic.h"): confdefs.append("#define HAVE_STDATOMIC_H 1\n") else: confdefs.append("/* #undef HAVE_STDATOMIC_H */\n") if config.CheckHeader("libkern/OSAtomic.h"): confdefs.append("#define HAVE_OSATOMIC_H 1\n") else: confdefs.append("/* #undef HAVE_OSATOMIC_H */\n") announce("No memory barriers - SHM export and time hinting may not be reliable.") # endian.h is required for rtcm104v2 unless the compiler defines # __ORDER_BIG_ENDIAN__, __ORDER_LITTLE_ENDIAN__ and __BYTE_ORDER__ if config.CheckCompilerDefines("__ORDER_BIG_ENDIAN__") \ and config.CheckCompilerDefines("__ORDER_LITTLE_ENDIAN__") \ and config.CheckCompilerDefines("__BYTE_ORDER__"): confdefs.append("#define HAVE_BUILTIN_ENDIANNESS 1\n") confdefs.append("/* #undef HAVE_ENDIAN_H */\n") confdefs.append("/* #undef HAVE_SYS_ENDIAN_H */\n") announce("Your compiler has built-in endianness support.") else: confdefs.append("/* #undef HAVE_BUILTIN_ENDIANNESS\n */") if config.CheckHeader("endian.h"): confdefs.append("#define HAVE_ENDIAN_H 1\n") confdefs.append("/* #undef HAVE_SYS_ENDIAN_H */\n") confdefs.append("/* #undef HAVE_MACHINE_ENDIAN_H */\n") elif config.CheckHeader("sys/endian.h"): confdefs.append("/* #undef HAVE_ENDIAN_H */\n") confdefs.append("#define HAVE_SYS_ENDIAN_H 1\n") confdefs.append("/* #undef HAVE_MACHINE_ENDIAN_H */\n") elif config.CheckHeader("machine/endian.h"): confdefs.append("/* #undef HAVE_ENDIAN_H */\n") confdefs.append("/* #undef HAVE_SYS_ENDIAN_H */\n") confdefs.append("#define HAVE_MACHINE_ENDIAN_H 1\n") else: confdefs.append("/* #undef HAVE_ENDIAN_H */\n") confdefs.append("/* #undef HAVE_SYS_ENDIAN_H */\n") confdefs.append("/* #undef HAVE_MACHINE_ENDIAN_H */\n") announce("You do not have the endian.h header file. RTCM V2 support disabled.") env["rtcm104v2"] = False # check function after libraries, because some function require library # for example clock_gettime() require librt on Linux glibc < 2.17 for f in ("daemon", "strlcpy", "strlcat", "clock_gettime"): if config.CheckFunc(f): confdefs.append("#define HAVE_%s 1\n" % f.upper()) else: confdefs.append("/* #undef HAVE_%s */\n" % f.upper()) # Map options to libraries required to support them that might be absent. optionrequires = { "bluez": ["libbluetooth"], "dbus_export" : ["libdbus-1"], } keys = map(lambda x: (x[0],x[2]), boolopts) + map(lambda x: (x[0],x[2]), nonboolopts) + map(lambda x: (x[0],x[2]), pathopts) keys.sort() for (key,help) in keys: value = env[key] if value and key in optionrequires: for required in optionrequires[key]: if not config.CheckLib(required): announce("%s not found, %s cannot be enabled." % (required,key)) value = False break confdefs.append("/* %s */" % help) if type(value) == type(True): if value: confdefs.append("#define %s_ENABLE 1\n" % key.upper()) else: confdefs.append("/* #undef %s_ENABLE */\n" % key.upper()) elif value in (0, "", "(undefined)"): confdefs.append("/* #undef %s */\n" % key.upper()) else: if value.isdigit(): confdefs.append("#define %s %s\n" % (key.upper(), value)) else: confdefs.append("#define %s \"%s\"\n" % (key.upper(), value)) if config.CheckHeader(["sys/types.h", "sys/time.h", "sys/timepps.h"]): env.MergeFlags("-DHAVE_SYS_TIMEPPS_H=1") kpps = True else: kpps = False tiocmiwait = config.CheckHeaderDefines("sys/ioctl.h", "TIOCMIWAIT") if env["pps"] and not tiocmiwait and not kpps: announce("Forcing pps=no (neither TIOCMIWAIT nor RFC2783 API is available)") env["pps"] = False confdefs.append('''\ /* Some libcs do not have strlcat/strlcpy. Local copies are provided */ #ifndef HAVE_STRLCAT # ifdef __cplusplus extern "C" { # endif #include size_t strlcat(/*@out@*/char *dst, /*@in@*/const char *src, size_t size); # ifdef __cplusplus } # endif #endif #ifndef HAVE_STRLCPY # ifdef __cplusplus extern "C" { # endif #include size_t strlcpy(/*@out@*/char *dst, /*@in@*/const char *src, size_t size); # ifdef __cplusplus } # endif #endif #ifndef HAVE_CLOCK_GETTIME # ifdef __cplusplus extern "C" { # endif #ifndef CLOCKID_T_DEFINED typedef int clockid_t; #define CLOCKID_T_DEFINED # endif /* OS X uses _STRUCT_TIMESPEC, but no clock_gettime */ #ifndef _STRUCT_TIMESPEC struct timespec { time_t tv_sec; long tv_nsec; }; #endif #define CLOCK_REALTIME 0 int clock_gettime(clockid_t, struct timespec *); # ifdef __cplusplus } # endif #endif #define GPSD_CONFIG_H #endif /* GPSD_CONFIG_H */ ''') manbuilder = mangenerator = htmlbuilder = None if env['manbuild']: if config.CheckXsltproc(): mangenerator = 'xsltproc' build = "xsltproc --nonet %s $SOURCE >$TARGET" htmlbuilder = build % docbook_html_uri manbuilder = build % docbook_man_uri elif WhereIs("xmlto"): mangenerator = 'xmlto' xmlto = "xmlto %s $SOURCE || mv `basename $TARGET` `dirname $TARGET`" htmlbuilder = xmlto % "html-nochunks" manbuilder = xmlto % "man" else: announce("Neither xsltproc nor xmlto found, documentation cannot be built.") else: announce("Build of man and HTML documentation is disabled.") if manbuilder: env['BUILDERS']["Man"] = Builder(action=manbuilder) env['BUILDERS']["HTML"] = Builder(action=htmlbuilder, src_suffix=".xml", suffix=".html") # Determine if Qt network libraries are present, and if not, force qt to off qt_network = config.CheckPKG('QtNetwork') if not qt_network: env["qt"] = False env = config.Finish() # Be explicit about what we're doing. changelatch = False for (name, default, help) in boolopts + nonboolopts + pathopts: if env[name] != env.subst(default): if not changelatch: announce("Altered configuration variables:") changelatch = True announce("%s = %s (default %s): %s" % (name, env[name], env.subst(default), help)) if not changelatch: announce("All configuration flags are defaulted.") # Gentoo systems can have a problem with the Python path if os.path.exists("/etc/gentoo-release"): announce("This is a Gentoo system.") announce("Adjust your PYTHONPATH to see library directories under /usr/local/lib") # Should we build the Qt binding? if env["qt"] and env["shared"]: qt_env = env.Clone() qt_env.MergeFlags('-DUSE_QT') qt_env.Append(OBJPREFIX='qt-') try: qt_env.MergeFlags(pkg_config('QtNetwork')) except OSError: announce("pkg_config is confused about the state of QtNetwork.") qt_env = None else: qt_env = None ## Two shared libraries provide most of the code for the C programs libgps_version_soname = libgps_version_current - libgps_version_age libgps_version = "%d.%d.%d" %(libgps_version_soname, libgps_version_age, libgps_version_revision) libgps_sources = [ "ais_json.c", "bits.c", "clock_gettime.c", "daemon.c", "gpsutils.c", "gpsdclient.c", "gps_maskdump.c", "hex.c", "json.c", "libgps_core.c", "libgps_dbus.c", "libgps_json.c", "libgps_shm.c", "libgps_sock.c", "netlib.c", "ntpshmread.c", "ntpshmwrite.c", "rtcm2_json.c", "rtcm3_json.c", "shared_json.c", "strl.c", ] if env['libgpsmm']: libgps_sources.append("libgpsmm.cpp") libgpsd_sources = [ "bsd_base64.c", "crc24q.c", "gpsd_json.c", "geoid.c", "isgps.c", "libgpsd_core.c", "matrix.c", "net_dgpsip.c", "net_gnss_dispatch.c", "net_ntrip.c", "ppsthread.c", "packet.c", "pseudonmea.c", "pseudoais.c", "serial.c", "subframe.c", "timebase.c", "timespec_str.c", "drivers.c", "driver_ais.c", "driver_evermore.c", "driver_garmin.c", "driver_garmin_txt.c", "driver_geostar.c", "driver_italk.c", "driver_navcom.c", "driver_nmea0183.c", "driver_nmea2000.c", "driver_oncore.c", "driver_rtcm2.c", "driver_rtcm3.c", "driver_sirf.c", "driver_superstar2.c", "driver_tsip.c", "driver_ubx.c", "driver_zodiac.c", ] if not env["shared"]: def Library(env, target, sources, version, parse_flags=[]): return env.StaticLibrary(target, [env.StaticObject(s) for s in sources], parse_flags=parse_flags) LibraryInstall = lambda env, libdir, sources, version: env.Install(libdir, sources) else: def Library(env, target, sources, version, parse_flags=[]): # Note: We have a possibility of getting either Object or file # list for sources, so we run through the sources and try to make # them into SharedObject instances. obj_list = [] for s in Flatten(sources): if type(s) is str: obj_list.append(env.SharedObject(s)) else: obj_list.append(s) return env.SharedLibrary(target=target, source=obj_list, parse_flags=parse_flags, SHLIBVERSION=version) LibraryInstall = lambda env, libdir, sources, version: \ env.InstallVersionedLib(libdir, sources, SHLIBVERSION=version) compiled_gpslib = Library(env=env, target="gps", sources=libgps_sources, version=libgps_version, parse_flags=rtlibs) env.Clean(compiled_gpslib, "gps_maskdump.c") static_gpslib = env.StaticLibrary("gps_static", [env.StaticObject(s) for s in libgps_sources], rtlibs) compiled_gpsdlib = env.StaticLibrary(target="gpsd", source=[env.StaticObject(s, parse_flags=usbflags + bluezflags) for s in libgpsd_sources], parse_flags=usbflags + bluezflags) libraries = [compiled_gpslib, compiled_gpsdlib] # Only attempt to create the qt library if we have shared turned on otherwise we have a mismash of objects in library if qt_env: qtobjects = [] qt_flags = qt_env['CFLAGS'] for c_only in ('-Wmissing-prototypes', '-Wstrict-prototypes'): if c_only in qt_flags: qt_flags.remove(c_only) # Qt binding object files have to be renamed as they're built to avoid # name clashes with the plain non-Qt object files. This prevents the # infamous "Two environments with different actions were specified # for the same target" error. for src in libgps_sources: if src not in ('ais_json.c','json.c','libgps_json.c','rtcm2_json.c','rtcm3_json.c','shared_json.c'): compile_with = qt_env['CXX'] compile_flags = qt_flags else: compile_with = qt_env['CC'] compile_flags = qt_env['CFLAGS'] qtobjects.append(qt_env.SharedObject(src, CC=compile_with, CFLAGS=compile_flags)) compiled_qgpsmmlib = Library(qt_env, "Qgpsmm", qtobjects, libgps_version) libraries.append(compiled_qgpsmmlib) # The libraries have dependencies on system libraries # libdbus appears multiple times because the linker only does one pass. gpsflags = ["-lm"] + rtlibs + dbusflags gpsdflags = usbflags + bluezflags + gpsflags # Source groups gpsd_sources = ['gpsd.c','timehint.c', 'shmexport.c','dbusexport.c'] if env['systemd']: gpsd_sources.append("sd_socket.c") gpsmon_sources = [ 'gpsmon.c', 'monitor_italk.c', 'monitor_nmea0183.c', 'monitor_oncore.c', 'monitor_sirf.c', 'monitor_superstar2.c', 'monitor_tnt.c', 'monitor_ubx.c', 'monitor_garmin.c', ] ## Production programs gpsd = env.Program('gpsd', gpsd_sources, LIBS=['gpsd', 'gps_static'], LIBPATH='.', parse_flags=gpsdflags+gpsflags) gpsdecode = env.Program('gpsdecode', ['gpsdecode.c'], LIBS=['gpsd', 'gps_static'], LIBPATH='.', parse_flags=gpsdflags+gpsflags) gpsctl = env.Program('gpsctl', ['gpsctl.c'], LIBS=['gpsd', 'gps_static'], LIBPATH='.', parse_flags=gpsdflags+gpsflags) gpsmon = env.Program('gpsmon', gpsmon_sources, LIBS=['gpsd', 'gps_static'], LIBPATH='.', parse_flags=gpsdflags + gpsflags + ncurseslibs) gpsdctl = env.Program('gpsdctl', ['gpsdctl.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=gpsflags) gpspipe = env.Program('gpspipe', ['gpspipe.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=gpsflags) gps2udp = env.Program('gps2udp', ['gps2udp.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=gpsflags) gpxlogger = env.Program('gpxlogger', ['gpxlogger.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=gpsflags) lcdgps = env.Program('lcdgps', ['lcdgps.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=gpsflags) cgps = env.Program('cgps', ['cgps.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=gpsflags + ncurseslibs) ntpshmmon = env.Program('ntpshmmon', ['ntpshmmon.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=gpsflags) binaries = [gpsd, gpsdecode, gpsctl, gpsdctl, gpspipe, gps2udp, gpxlogger, lcdgps, ntpshmmon] if env["ncurses"]: binaries += [cgps, gpsmon] # Test programs - always link locally and statically test_bits = env.Program('test_bits', ['test_bits.c'], LIBS=['gps_static'], LIBPATH='.') test_float = env.Program('test_float', ['test_float.c']) test_geoid = env.Program('test_geoid', ['test_geoid.c'], LIBS=['gpsd', 'gps_static'], LIBPATH='.', parse_flags=gpsdflags) test_matrix = env.Program('test_matrix', ['test_matrix.c'], LIBS=['gpsd', 'gps_static'], LIBPATH='.', parse_flags=gpsdflags) test_mktime = env.Program('test_mktime', ['test_mktime.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=["-lm"]) test_packet = env.Program('test_packet', ['test_packet.c'], LIBS=['gpsd', 'gps_static'], LIBPATH='.', parse_flags=gpsdflags) test_timespec = env.Program('test_timespec', ['test_timespec.c'], LIBS=['gpsd', 'gps_static'], LIBPATH='.', parse_flags=gpsdflags) test_trig = env.Program('test_trig', ['test_trig.c'], parse_flags=["-lm"]) # test_libgps for glibc older than 2.17 test_libgps = env.Program('test_libgps', ['test_libgps.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=["-lm"] + rtlibs + dbusflags) if not env['socket_export']: announce("test_json not building because socket_export is disabled") test_json = None else: test_json = env.Program( 'test_json', ['test_json.c'], LIBS=['gps_static'], LIBPATH='.', parse_flags=["-lm"] + rtlibs + usbflags + dbusflags) test_gpsmm = env.Program('test_gpsmm', ['test_gpsmm.cpp'], LIBS=['gps_static'], LIBPATH='.', parse_flags=["-lm"]) testprogs = [test_bits, test_float, test_geoid, test_libgps, test_matrix, test_mktime, test_packet, test_timespec, test_trig] if env['socket_export']: testprogs.append(test_json) if env["libgpsmm"]: testprogs.append(test_gpsmm) # Python programs if not env['python']: python_built_extensions = [] python_targets = [] python_progs = [] else: python_progs = ["gpscat", "gpsfake", "gpsprof", "xgps", "xgpsspeed", "gegps"] python_modules = Glob('gps/*.py') # Build Python binding # python_extensions = { "gps" + os.sep + "packet" : ["gpspacket.c", "packet.c", "isgps.c", "driver_rtcm2.c", "strl.c", "hex.c", "crc24q.c"], "gps" + os.sep + "clienthelpers" : ["gpsclient.c", "geoid.c", "gpsdclient.c", "strl.c"] } python_env = env.Clone() vars = sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'BASECFLAGS', 'CCSHARED', 'LDSHARED', 'SO', 'INCLUDEPY', 'LDFLAGS') for i in range(len(vars)): if vars[i] is None: vars[i] = [] (cc, cxx, opt, basecflags, ccshared, ldshared, so_ext, includepy, ldflags) = vars # FIXME: build of python wrappers doesn't pickup flags set for coveraging, manually add them here if env['coveraging']: basecflags += ' -coverage' ldflags += ' -coverage' ldshared += ' -coverage' # in case CC/CXX was set to the scan-build wrapper, # ensure that we build the python modules with scan-build, too if env['CC'] is None or env['CC'].find('scan-build') < 0: python_env['CC'] = cc else: python_env['CC'] = ' '.join([env['CC']] + cc.split()[1:]) if env['CXX'] is None or env['CXX'].find('scan-build') < 0: python_env['CXX'] = cxx else: python_env['CXX'] = ' '.join([env['CXX']] + cxx.split()[1:]) ldshared=ldshared.replace('-fPIE', '') ldshared=ldshared.replace('-pie', '') python_env.Replace(SHLINKFLAGS=[], LDFLAGS=ldflags, LINK = ldshared, SHLIBPREFIX="", SHLIBSUFFIX=so_ext, CPPPATH=[includepy], CPPFLAGS=opt, CFLAGS=basecflags, CXXFLAGS=basecflags) python_objects={} python_compiled_libs = {} for ext, sources in python_extensions.iteritems(): python_objects[ext] = [] for src in sources: python_objects[ext].append( python_env.NoCache( python_env.SharedObject( src.split(".")[0] + '-py_' + '_'.join(['%s' %(x) for x in sys.version_info]) + so_ext, src ) ) ) python_compiled_libs[ext] = python_env.SharedLibrary(ext, python_objects[ext]) python_egg_info_source = """Metadata-Version: 1.0 Name: gps Version: %s Summary: Python libraries for the gpsd service daemon Home-page: %s Author: the GPSD project Author-email: %s License: BSD Description: The gpsd service daemon can monitor one or more GPS devices connected to a host computer, making all data on the location and movements of the sensors available to be queried on TCP port 2947. Platform: UNKNOWN """ %(gpsd_version, website, devmail) python_egg_info = python_env.Textfile(target="gps-%s.egg-info" %(gpsd_version, ), source=python_egg_info_source) python_built_extensions = python_compiled_libs.values() python_targets = python_built_extensions + [python_egg_info] env.Command(target = "packet_names.h", source="packet_states.h", action=""" rm -f $TARGET &&\ sed -e '/^ *\([A-Z][A-Z0-9_]*\),/s// \"\\1\",/' <$SOURCE >$TARGET &&\ chmod a-w $TARGET""") # timebase.h - always built in order to include current GPS week def timebase_h(target, source, env): from leapsecond import make_leapsecond_include f = open(target[0].abspath, 'w') f.write(make_leapsecond_include(source[0].abspath)) f.close() timebase = env.Command(target="timebase.h", source=["leapseconds.cache"], action=timebase_h) env.AlwaysBuild(timebase) env.Textfile(target="gpsd_config.h", source=confdefs) env.Textfile(target="gpsd.h", source=[File("gpsd.h-head"), File("gpsd_config.h"), File("gpsd.h-tail")]) env.Command(target="gps_maskdump.c", source=["maskaudit.py", "gps.h", "gpsd.h"], action=''' rm -f $TARGET &&\ $PYTHON $SOURCE -c $SRCDIR >$TARGET &&\ chmod a-w $TARGET''') env.Command(target="ais_json.i", source="jsongen.py", action='''\ rm -f $TARGET &&\ $PYTHON $SOURCE --ais --target=parser >$TARGET &&\ chmod a-w $TARGET''') # generate revision.h if 'dev' in gpsd_version: (st, rev) = _getstatusoutput('git describe --tags') if st != 0: from datetime import datetime rev = datetime.now().isoformat()[:-4] else: rev = gpsd_version revision='#define REVISION "%s"\n' %(rev.strip(),) env.Textfile(target="revision.h", source=[revision]) generated_sources = ['packet_names.h', 'timebase.h', 'gpsd.h', "ais_json.i", 'gps_maskdump.c', 'revision.h', 'gpsd.php', 'gpsd_config.h'] # leapseconds.cache is a local cache for information on leapseconds issued # by the U.S. Naval observatory. It gets kept in the repository so we can # build without Internet access. from leapsecond import conditional_leapsecond_fetch def leapseconds_cache_rebuild(target, source, env): if not env["leapfetch"]: sys.stdout.write("Leapsecond fetch suppressed by leapfetch=no.\n") elif not conditional_leapsecond_fetch(target[0].abspath, timeout=15): sys.stdout.write("try building with leapfetch=no.\n") if 'dev' in gpsd_version or not os.path.exists('leapseconds.cache'): leapseconds_cache = env.Command(target="leapseconds.cache", source="leapsecond.py", action=leapseconds_cache_rebuild) env.Clean(leapseconds_cache, "leapsecond.pyc") env.NoClean(leapseconds_cache) env.Precious(leapseconds_cache) env.AlwaysBuild(leapseconds_cache) if env['systemd']: udevcommand = 'TAG+="systemd", ENV{SYSTEMD_WANTS}="gpsdctl@%k.service"' else: udevcommand = 'RUN+="%s/gpsd.hotplug"' %(env['udevdir'], ) # Instantiate some file templates. We'd like to use the Substfile builtin # but it doesn't seem to work in scons 1.20 def substituter(target, source, env): substmap = ( ('@VERSION@', gpsd_version), ('@prefix@', env['prefix']), ('@libdir@', env['libdir']), ('@udevcommand@', udevcommand), ('@PYTHON@', sys.executable), ('@DATE@', time.asctime()), ('@MASTER@', 'DO NOT HAND_HACK! THIS FILE IS GENERATED'), ('@SITENAME@', sitename), ('@SITESEARCH@', sitesearch), ('@WEBSITE@', website), ('@MAINPAGE@', mainpage), ('@WEBUPLOAD@', webupload), ('@CGIUPLOAD@', cgiupload), ('@SCPUPLOAD@', scpupload), ('@MAILMAN@', mailman), ('@ADMIN@', admin), ('@DOWNLOAD@', download), ('@BUGTRACKER@', bugtracker), ('@BROWSEREPO@', browserepo), ('@CLONEREPO@', clonerepo), ('@GITREPO@', gitrepo), ('@WEBFORM@', webform), ('@FORMSERVER@', formserver), ('@USERMAIL@', usermail), ('@DEVMAIL@', devmail), ('@ANNOUNCE@', annmail), ('@IRCCHAN@', ircchan), ('@LIBGPSVERSION@', libgps_version), ('@TIPLINK@', tiplink), ('@TIPWIDGET@', tipwidget), ) sfp = open(str(source[0])) content = sfp.read() sfp.close() for (s, t) in substmap: content = content.replace(s, t) m = re.search("@[A-Z]+@", content) if m and m.group(0) not in map(lambda x: x[0], substmap): print >>sys.stderr, "Unknown subst token %s in %s." % (m.group(0), sfp.name) tfp = open(str(target[0]), "w") tfp.write(content) tfp.close() templated = glob.glob("*.in") + glob.glob("*/*.in") + glob.glob("*/*/*.in") # ignore files in subfolder called 'debian' - the Debian packaging # tools will handle them. templated = [ x for x in templated if not x.startswith('debian/') ] for fn in templated: builder = env.Command(source=fn, target=fn[:-3], action=substituter) env.AddPostAction(builder, 'chmod -w $TARGET') if fn.endswith(".py.in"): env.AddPostAction(builder, 'chmod +x $TARGET') # Documentation base_manpages = { "gpsd.8" : "gpsd.xml", "gpsd_json.5" : "gpsd_json.xml", "gps.1" : "gps.xml", "cgps.1" : "gps.xml", "gpsinit.8": "gpsinit.xml", "lcdgps.1" : "gps.xml", "libgps.3" : "libgps.xml", "libgpsmm.3" : "libgpsmm.xml", "libQgpsmm.3" : "libgpsmm.xml", "gpsmon.1": "gpsmon.xml", "gpsctl.1" : "gpsctl.xml", "gpsdctl.8" : "gpsdctl.xml", "gpspipe.1" : "gpspipe.xml", "gps2udp.1" : "gps2udp.xml", "gpsdecode.1" : "gpsdecode.xml", "srec.5" : "srec.xml", "ntpshmmon.1" : "ntpshmmon.xml", } python_manpages = { "gpsprof.1" : "gpsprof.xml", "gpsfake.1" : "gpsfake.xml", "gpscat.1" : "gpscat.xml", "xgpsspeed.1" : "gps.xml", "xgps.1" : "gps.xml", "gegps.1" : "gps.xml", } manpage_targets = [] if manbuilder: for (man, xml) in base_manpages.items() + python_manpages.items(): manpage_targets.append(env.Man(source=xml, target=man)) ## Where it all comes together build = env.Alias('build', [libraries, binaries, python_targets, "gpsd.php", manpage_targets, "libgps.pc", "libgpsd.pc", "gpsd.rules"]) env.Default(*build) if qt_env: build_qt = qt_env.Alias('build', [compiled_qgpsmmlib]) qt_env.Default(*build_qt) if env['python']: build_python = python_env.Alias('build', python_targets) python_env.Default(*build_python) ## Installation and deinstallation # Not here because too distro-specific: udev rules, desktop files, init scripts # It's deliberate that we don't install gpsd.h. It's full of internals that # third-party client programs should not see. headerinstall = [ env.Install(installdir('includedir'), x) for x in ("libgpsmm.h", "gps.h")] binaryinstall = [] binaryinstall.append(env.Install(installdir('sbindir'), [gpsd, gpsdctl])) binaryinstall.append(env.Install(installdir('bindir'), [gpsdecode, gpsctl, gpspipe, gps2udp, gpxlogger, lcdgps, ntpshmmon])) if env["ncurses"]: binaryinstall.append(env.Install(installdir('bindir'), [cgps, gpsmon])) binaryinstall.append(LibraryInstall(env, installdir('libdir'), compiled_gpslib, libgps_version)) # Work arount a minor bug in InstallSharedLib() link handling env.AddPreAction(binaryinstall, 'rm -f %s/libgps.*' % (installdir('libdir'), )) if qt_env: binaryinstall.append(LibraryInstall(qt_env, installdir('libdir'), compiled_qgpsmmlib, libgps_version)) if not env['debug'] and not env['profiling'] and not env['nostrip'] and not sys.platform.startswith('darwin'): env.AddPostAction(binaryinstall, '$STRIP $TARGET') if not env['python']: python_install = [] else: python_lib_dir = env['python_libdir'] python_module_dir = python_lib_dir + os.sep + 'gps' python_extensions_install = python_env.Install( DESTDIR + python_module_dir, python_built_extensions) if not env['debug'] and not env['profiling'] and not env['nostrip'] and not sys.platform.startswith('darwin'): python_env.AddPostAction(python_extensions_install, '$STRIP $TARGET') python_modules_install = python_env.Install( DESTDIR + python_module_dir, python_modules) python_progs_install = python_env.Install(installdir('bindir'), python_progs) python_egg_info_install = python_env.Install(DESTDIR + python_lib_dir, python_egg_info) python_install = [ python_extensions_install, python_modules_install, python_progs_install, python_egg_info_install] pc_install = [ env.Install(installdir('pkgconfig'), x) for x in ("libgps.pc", "libgpsd.pc") ] if qt_env: pc_install.append(qt_env.Install(installdir('pkgconfig'), 'Qgpsmm.pc')) pc_install.append(qt_env.Install(installdir('libdir'), 'libQgpsmm.prl')) maninstall = [] for manpage in base_manpages.keys() + python_manpages.keys(): if not manbuilder and not os.path.exists(manpage): continue section = manpage.split(".")[1] dest = os.path.join(installdir('mandir'), "man"+section, manpage) maninstall.append(env.InstallAs(source=manpage, target=dest)) install = env.Alias('install', binaryinstall + maninstall + python_install + pc_install + headerinstall) def Uninstall(nodes): deletes = [] for node in nodes: if node.__class__ == install[0].__class__: deletes.append(Uninstall(node.sources)) else: deletes.append(Delete(str(node))) return deletes uninstall = env.Command('uninstall', '', Flatten(Uninstall(Alias("install"))) or "") env.AlwaysBuild(uninstall) env.Precious(uninstall) # Target selection for '.' is badly broken. This is a general scons problem, # not a glitch in this particular recipe. Avoid triggering the bug. def error_action(target, source, env): from SCons.Errors import UserError raise UserError, "Target selection for '.' is broken." AlwaysBuild(Alias(".", [], error_action)) # Utility productions def Utility(target, source, action): target = env.Command(target=target, source=source, action=action) env.AlwaysBuild(target) env.Precious(target) return target # Putting in all these -U flags speeds up cppcheck and allows it to look # at configurations we actually care about. Utility("cppcheck", ["gpsd.h", "packet_names.h"], "cppcheck -U__UNUSED__ -UUSE_QT -U__COVERITY__ -U__future__ -ULIMITED_MAX_CLIENTS -ULIMITED_MAX_DEVICES -UAF_UNSPEC -UINADDR_ANY -UFIXED_PORT_SPEED -UFIXED_STOP_BITS -U_WIN32 -U__CYGWIN__ -UPATH_MAX -UHAVE_STRLCAT -UHAVE_STRLCPY -UIPTOS_LOWDELAY -UIPV6_TCLASS -UTCP_NODELAY -UTIOCMIWAIT --template gcc --enable=all --inline-suppr --suppress='*:driver_proto.c' --force $SRCDIR") # Check with clang analyzer Utility("scan-build", ["gpsd.h", "packet_names.h"], "scan-build scons") # Sanity-check Python code. if len(python_progs) > 0: pylint = Utility("pylint", ["jsongen.py", "maskaudit.py", python_built_extensions], ['''pylint --rcfile=/dev/null --dummy-variables-rgx='^_' --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" --reports=n --disable=F0001,C0103,C0111,C1001,C0301,C0302,C0322,C0324,C0323,C0321,C0330,R0201,R0801,R0902,R0903,R0904,R0911,R0912,R0913,R0914,R0915,W0110,W0201,W0121,W0123,W0232,W0234,W0401,W0403,W0141,W0142,W0603,W0614,W0640,W0621,W1504,E1101,E1102,E1103,F0401 gps/*.py *.py ''' + " ".join(python_progs)]) # Additional Python readablity style checks if len(python_progs) > 0: pep8 = Utility("pep8", ["jsongen.py", "maskaudit.py", python_built_extensions], ['''pep8 --ignore=E501,W602,E122,E241,E401 {0} gps/[a-zA-Z]*.py *.py'''.format(" ".join(python_progs))]) # Additional Python readablity style checks if len(python_progs) > 0: flake8 = Utility("flake8", ["jsongen.py", "maskaudit.py", python_built_extensions], ['''flake8 --ignore=E501,W602,E122,E241,E401 {0} gps/[a-zA-Z]*.py *.py'''.format(" ".join(python_progs))]) # Check the documentation for bogons, too Utility("xmllint", glob.glob("*.xml"), "for xml in $SOURCES; do xmllint --nonet --noout --valid $$xml; done") # Use deheader to remove headers not required. If the statistics line # ends with other than '0 removed' there's work to be done. Utility("deheader", generated_sources, [ 'deheader -x cpp -x contrib -x gpspacket.c -x gpsclient.c -x monitor_proto.c -i gpsd_config.h -i gpsd.h -m "MORECFLAGS=\'-Werror -Wfatal-errors -DDEBUG -DPPS_ENABLE\' scons -Q"', ]) # Perform all local code-sanity checks (but not the Coverity scan). audit = env.Alias('audit', ['scan-build', 'cppcheck', 'pylint', 'xmllint', 'valgrind-audit', ]) # # Regression tests begin here # # Note that the *-makeregress targets re-create the *.log.chk source # files from the *.log source files. # Unit-test the bitfield extractor bits_regress = Utility('bits-regress', [test_bits], [ '$SRCDIR/test_bits --quiet' ]) # Unit-test the bitfield extractor matrix_regress = Utility('matrix-regress', [test_matrix], [ '$SRCDIR/test_matrix --quiet' ]) # Check that all Python modules compile properly if env['python']: def check_compile(target, source, env): for pyfile in source: 'cp %s tmp.py'%(pyfile) '%s -tt -m py_compile tmp.py' %(sys.executable, ) 'rm -f tmp.py tmp.pyc' python_compilation_regress = Utility('python-compilation-regress', Glob('*.py') + python_modules + python_progs + ['SConstruct'], check_compile) else: python_compilation_regress = None # using regress-drivers requires socket_export being enabled. if not env['socket_export'] or not env['python']: announce("GPS regression tests suppressed because socket_export or python is off.") gps_regress = None else: # Regression-test the daemon. But first: # (1) Clear GPSD's SHM segment in case a previous abort didn't. This # prevents spurious error messages. # (2) Dump the platform and its delay parameters. # The ":;" in this production and the next one forestalls an attempt by # SCons to install up to date versions of gpsfake and gpsctl if it can # find older versions of them in a directory on your $PATH. gps_regress = Utility("gps-regress", [gpsd, gpsctl, python_built_extensions], ':; $SRCDIR/gpsfake -T; $SRCDIR/regress-driver $REGRESSOPTS test/daemon/*.log') # Build the regression tests for the daemon. # Note: You'll have to do this whenever the default leap second # changes in timebase.h. The problem is in the SiRF tests; # that driver relies on the default until it gets the current # offset from subframe data. Utility('gps-makeregress', [gpsd, gpsctl, python_built_extensions], ':; $SRCDIR/gpsfake -T; $SRCDIR/regress-driver -b $REGRESSOPTS test/daemon/*.log') # To build an individual test for a load named foo.log, put it in # test/daemon and do this: # regress-driver -b test/daemon/foo.log # Regression-test the RTCM decoder. if not env["rtcm104v2"]: announce("RTCM2 regression tests suppressed because rtcm104v2 is off.") rtcm_regress = None else: rtcm_regress = Utility('rtcm-regress', [gpsdecode], [ '@echo "Testing RTCM decoding..."', '@for f in $SRCDIR/test/*.rtcm2; do ' 'echo "Testing $${f}..."; ' 'TMPFILE=`mktemp -t gpsd-test-XXXXXXXXXXXXXX.chk`; ' '$SRCDIR/gpsdecode -u -j <$${f} >$${TMPFILE}; ' 'diff -ub $${f}.chk $${TMPFILE}; ' 'rm -f $${TMPFILE}; ' 'done;', '@echo "Testing idempotency of JSON dump/decode for RTCM2"', '@TMPFILE=`mktemp -t gpsd-test-XXXXXXXXXXXXXX.chk`; ' '$SRCDIR/gpsdecode -u -e -j $${TMPFILE}; ' 'grep -v "^#" test/synthetic-rtcm2.json | diff -ub - $${TMPFILE}; ' 'rm -f $${TMPFILE}; ', ]) # Rebuild the RTCM regression tests. Utility('rtcm-makeregress', [gpsdecode], [ 'for f in $SRCDIR/test/*.rtcm2; do ' '$SRCDIR/gpsdecode -j <$${f} >$${f}.chk; ' 'done' ]) # Regression-test the AIVDM decoder. if not env["aivdm"]: announce("AIVDM regression tests suppressed because aivdm is off.") aivdm_regress = None else: aivdm_regress = Utility('aivdm-regress', [gpsdecode], [ '@echo "Testing AIVDM decoding w/ CSV format..."', '@for f in $SRCDIR/test/*.aivdm; do ' 'echo "Testing $${f}..."; ' 'TMPFILE=`mktemp -t gpsd-test-XXXXXXXXXXXXXX.chk`; ' '$SRCDIR/gpsdecode -u -c <$${f} >$${TMPFILE}; ' 'diff -ub $${f}.chk $${TMPFILE} || echo "Test FAILED!"; ' 'rm -f $${TMPFILE}; ' 'done;', '@echo "Testing AIVDM decoding w/ JSON unscaled format..."', '@for f in $SRCDIR/test/*.aivdm; do ' 'echo " Testing $${f}..."; ' 'TMPFILE=`mktemp -t gpsd-test-XXXXXXXXXXXXXX.chk`; ' '$SRCDIR/gpsdecode -u -j <$${f} >$${TMPFILE}; ' 'diff -ub $${f}.ju.chk $${TMPFILE} || echo "Test FAILED!"; ' 'rm -f $${TMPFILE}; ' 'done;', '@echo "Testing AIVDM decoding w/ JSON scaled format..."', '@for f in $SRCDIR/test/*.aivdm; do ' 'echo " Testing $${f}..."; ' 'TMPFILE=`mktemp -t gpsd-test-XXXXXXXXXXXXXX.chk`; ' '$SRCDIR/gpsdecode -j <$${f} >$${TMPFILE}; ' 'diff -ub $${f}.js.chk $${TMPFILE} || echo "Test FAILED!"; ' 'rm -f $${TMPFILE}; ' 'done;', '@echo "Testing idempotency of unscaled JSON dump/decode for AIS"', '@TMPFILE=`mktemp -t gpsd-test-XXXXXXXXXXXXXX.chk`; ' '$SRCDIR/gpsdecode -u -e -j <$SRCDIR/test/sample.aivdm.ju.chk >$${TMPFILE}; ' 'grep -v "^#" $SRCDIR/test/sample.aivdm.ju.chk | diff -ub - $${TMPFILE}; ' 'rm -f $${TMPFILE}; ', # Parse the unscaled json reference, dump it as scaled json, # and finally compare it with the scaled json reference '@echo "Testing idempotency of scaled JSON dump/decode for AIS"', '@TMPFILE=`mktemp -t gpsd-test-XXXXXXXXXXXXXX.chk`; ' '$SRCDIR/gpsdecode -e -j <$SRCDIR/test/sample.aivdm.ju.chk >$${TMPFILE}; ' 'grep -v "^#" $SRCDIR/test/sample.aivdm.js.chk | diff -ub - $${TMPFILE}; ' 'rm -f $${TMPFILE}; ', ]) # Rebuild the AIVDM regression tests. Utility('aivdm-makeregress', [gpsdecode], [ 'for f in $SRCDIR/test/*.aivdm; do ' '$SRCDIR/gpsdecode -u -c <$${f} > $${f}.chk; ' '$SRCDIR/gpsdecode -u -j <$${f} > $${f}.ju.chk; ' '$SRCDIR/gpsdecode -j <$${f} > $${f}.js.chk; ' 'done', ]) # Regression-test the packet getter. packet_regress = Utility('packet-regress', [test_packet], [ '@echo "Testing detection of invalid packets..."', '$SRCDIR/test_packet | diff -u $SRCDIR/test/packet.test.chk -', ]) # Rebuild the packet-getter regression test Utility('packet-makeregress', [test_packet], [ '$SRCDIR/test_packet >$SRCDIR/test/packet.test.chk', ]) # Rebuild the geoid test Utility('geoid-makeregress', [test_geoid], [ '$SRCDIR/test_geoid 37.371192 122.014965 >$SRCDIR/test/geoid.test.chk']) # Regression-test the geoid tester. geoid_regress = Utility('geoid-regress', [test_geoid], [ '@echo "Testing the geoid model..."', '$SRCDIR/test_geoid 37.371192 122.014965 | diff -u $SRCDIR/test/geoid.test.chk -', ]) # Regression-test the Maidenhead Locator if not env['python']: maidenhead_locator_regress = None else: maidenhead_locator_regress = Utility('maidenhead-locator-regress', [python_built_extensions], [ '@echo "Testing the Maidenhead Locator conversion..."', '$SRCDIR/test_maidenhead.py >/dev/null', ]) # Regression-test the calendar functions time_regress = Utility('time-regress', [test_mktime], [ '$SRCDIR/test_mktime' ]) # Regression test the unpacking code in libgps if not env['python']: unpack_regress = None else: unpack_regress = Utility('unpack-regress', [test_libgps], [ '@echo "Testing the client-library sentence decoder..."', '$SRCDIR/regress-driver -c $SRCDIR/test/clientlib/*.log', ]) # Build the regression test for the sentence unpacker Utility('unpack-makeregress', [test_libgps], [ '@echo "Rebuilding the client sentence-unpacker tests..."', '$SRCDIR/regress-driver -c -b $SRCDIR/test/clientlib/*.log' ]) # Unit-test the JSON parsing if not env['socket_export']: json_regress = None else: json_regress = Utility('json-regress', [test_json], [ '$SRCDIR/test_json' ]) # Unit-test timespec math timespec_regress = Utility('timespec-regress', [test_timespec], [ '$SRCDIR/test_timespec' ]) # consistency-check the driver methods method_regress = Utility('packet-regress', [test_packet], [ '@echo "Consistency-checking driver methods..."', '$SRCDIR/test_packet -c >/dev/null', ]) # Run a valgrind audit on the daemon - not in normal tests valgrind_audit = Utility('valgrind-audit', ['$SRCDIR/valgrind-audit.py', python_built_extensions, gpsd], './valgrind-audit.py' ) # Run test builds on remote machines flocktest = Utility("flocktest", [], "cd devtools; ./flocktest " + gitrepo) # Run all normal regression tests describe = Utility('describe', [], ['@echo "Run normal regression tests for %s..."' %(rev.strip(),)]) testclean = Utility('testclean', [], 'rm -f test_bits test_geoid test_json test_libgps test_matrix test_mktime test_packet') check = env.Alias('check', [ describe, python_compilation_regress, method_regress, bits_regress, matrix_regress, gps_regress, rtcm_regress, aivdm_regress, packet_regress, geoid_regress, maidenhead_locator_regress, time_regress, unpack_regress, json_regress, testclean, test_timespec, timespec_regress, ]) env.Alias('testregress', check) # Remove all shared-memory segments. Normally only needs to be run # when a segment size changes. Utility('shmclean', [], ["ipcrm -M 0x4e545030;" "ipcrm -M 0x4e545031;" "ipcrm -M 0x4e545032;" "ipcrm -M 0x4e545033;" "ipcrm -M 0x4e545034;" "ipcrm -M 0x4e545035;" "ipcrm -M 0x4e545036;" "ipcrm -M 0x47505345;" ]) # The website directory # # None of these productions are fired by default. # The content they handle is the GPSD website, not included in release tarballs. # asciidoc documents if env.WhereIs('asciidoc'): txtfiles = ['AIVDM', 'NMEA', 'protocol-evolution', 'protocol-transition', 'gpsd-time-service-howto', 'time-service-intro', 'client-howto'] asciidocs = ["www/" + stem + ".html" for stem in txtfiles] \ + ["www/installation.html"] for stem in txtfiles: env.Command('www/%s.html' % stem, 'www/%s.txt' % stem, ['asciidoc -b html5 -a toc -o www/%s.html www/%s.txt' % (stem,stem)]) env.Command("www/installation.html", "INSTALL", ["asciidoc -o www/installation.html INSTALL"]) else: announce("Part of the website build requires asciidoc, not installed.") asciidocs = [] htmlpages = Split(''' www/gps2udp.html www/gpscat.html www/gpsctl.html www/gpsdecode.html www/gpsd.html www/gpsd_json.html www/gpsfake.html www/gps.html www/gpsmon.html www/gpspipe.html www/gpsprof.html www/hardware.html www/installation.html www/internals.html www/libgps.html www/libgpsmm.html www/ntpshmmon.html www/performance/performance.html www/replacing-nmea.html www/srec.html www/writing-a-driver.html ''') webpages = htmlpages + asciidocs + map(lambda f: f[:-3], glob.glob("www/*.in")) www = env.Alias('www', webpages) # Paste 'scons --quiet validation-list' to a batch validator such as # http://htmlhelp.com/tools/validator/batch.html.en def validation_list(target, source, env): for page in glob.glob("www/*.html"): if not '-head' in page: fp = open(page) if "Valid HTML" in fp.read(): print os.path.join(website, os.path.basename(page)) fp.close() Utility("validation-list", [www], validation_list) # How to update the website upload_web = Utility("website", [www], ['rsync --exclude="*.in" -avz www/ ' + webupload, 'scp README TODO NEWS ' + webupload, 'chmod ug+w,a+x www/gps_report.cgi', 'scp www/gps_report.cgi ' + cgiupload + "gps_report.cgi"]) # When the URL declarations change, so must the generated web pages for fn in glob.glob("www/*.in"): env.Depends(fn[:-3], "SConstruct") if htmlbuilder: # Manual pages for xml in glob.glob("*.xml"): env.HTML('www/%s.html' % xml[:-4], xml) # DocBook documents for stem in ['writing-a-driver', 'performance/performance','replacing-nmea']: env.HTML('www/%s.html' % stem, 'www/%s.xml' % stem) # The internals manual. # Doesn't capture dependencies on the subpages env.HTML('www/internals.html', '$SRCDIR/doc/internals.xml') # The hardware page env.Command('www/hardware.html', ['gpscap.py', 'www/hardware-head.html', 'gpscap.ini', 'www/hardware-tail.html'], ['(cat www/hardware-head.html; $PYTHON gpscap.py; cat www/hardware-tail.html) >www/hardware.html']) # The diagram editor dia is required in order to edit the diagram masters # Utility("www/cycle.svg", ["www/cycle.dia"], ["dia -e www/cycle.svg www/cycle.dia"]) # Experimenting with pydoc. Not yet fired by any other productions. # scons www/ dies with this ## if env['python']: ## env.Alias('pydoc', "www/pydoc/index.html") ## ## # We need to run epydoc with the Python version we built the modules for. ## # So we define our own epydoc instead of using /usr/bin/epydoc ## EPYDOC = "python -c 'from epydoc.cli import cli; cli()'" ## env.Command('www/pydoc/index.html', python_progs + glob.glob("*.py") + glob.glob("gps/*.py"), [ ## 'mkdir -p www/pydoc', ## EPYDOC + " -v --html --graph all -n GPSD $SOURCES -o www/pydoc", ## ]) # Productions for setting up and performing udev tests. # # Requires root. Do "udev-install", then "tail -f /var/log/syslog" in # another window, then run 'scons udev-test', then plug and unplug the # GPS ad libitum. All is well when you get fix reports each time a GPS # is plugged in. # # In case you are a systemd user you might also need to watch the # journalctl output. Instead of the hotplug script the gpsdctl@.service # unit will handle hotplugging together with the udev rules. # # Note that a udev event can be triggered with an invocation like: # udevadm trigger --sysname-match=ttyUSB0 --action add if env['systemd']: systemdinstall_target = [ env.Install(DESTDIR + systemd_dir, "systemd/%s" %(x,)) for x in ("gpsdctl@.service", "gpsd.service", "gpsd.socket") ] systemd_install = env.Alias('systemd_install', systemdinstall_target) systemd_uninstall = env.Command('systemd_uninstall', '', Flatten(Uninstall(Alias("systemd_install"))) or "") env.AlwaysBuild(systemd_uninstall) env.Precious(systemd_uninstall) if env['systemd']: hotplug_wrapper_install = [] else: hotplug_wrapper_install = [ 'cp $SRCDIR/gpsd.hotplug ' + DESTDIR + env['udevdir'], 'chmod a+x ' + DESTDIR + env['udevdir'] + '/gpsd.hotplug' ] udev_install = Utility('udev-install', 'install', [ 'mkdir -p ' + DESTDIR + env['udevdir'] + '/rules.d', 'cp $SRCDIR/gpsd.rules ' + DESTDIR + env['udevdir'] + '/rules.d/25-gpsd.rules', ] + hotplug_wrapper_install) if env['systemd']: systemctl_daemon_reload = Utility('systemctl-daemon-reload', '', [ 'systemctl daemon-reload || true']) env.AlwaysBuild(systemctl_daemon_reload) env.Precious(systemctl_daemon_reload) env.Requires(udev_install, systemd_install) env.Requires(systemctl_daemon_reload, systemd_install) env.Requires(udev_install, systemctl_daemon_reload) Utility('udev-uninstall', '', [ 'rm -f %s/gpsd.hotplug' % env['udevdir'], 'rm -f %s/rules.d/25-gpsd.rules' % env['udevdir'], ]) Utility('udev-test', '', [ '$SRCDIR/gpsd -N -n -F /var/run/gpsd.sock -D 5', ]) # Cleanup # Ordinary cleanup clean = env.Clean(build, map(glob.glob,("*.[oa]", "*.[1358]", "*.os", "*.os.*", "*.gcno", "*.pyc", "gps/*.pyc", "TAGS", "config.log","lib*.so*","lib*.a","gps-*egg-info","contrib/ppscheck","*.gcda")) + testprogs + \ generated_sources + base_manpages.keys() + webpages + \ map(lambda f: f[:-3], templated)) # Nuke scons state files sconsclean = Utility("sconsclean", '', ["rm -fr .sconf_temp .scons-option-cache config.log"]) # Tags for Emacs and vi misc_sources = ['cgps.c', 'gpsctl.c', 'gpsdctl.c', 'gpspipe.c', 'gps2udp.c', 'gpsdecode.c', 'gpxlogger.c', 'ntpshmmon.c'] sources = libgpsd_sources + libgps_sources \ + gpsd_sources + gpsmon_sources + misc_sources env.Command('TAGS', sources, ['etags ' + " ".join(sources)]) # Release machinery begins here # # We need to be in the actual project repo (i.e. not doing a -Y build) # for these productions to work. if os.path.exists("gpsd.c") and os.path.exists(".gitignore"): distfiles = _getoutput(r"git ls-files | grep -v '^www/'").split() if ".gitignore" in distfiles: distfiles.remove(".gitignore") distfiles += generated_sources distfiles += base_manpages.keys() + python_manpages.keys() distfiles.remove("gpsd.h") if "packaging/rpm/gpsd.spec" not in distfiles: distfiles.append("packaging/rpm/gpsd.spec") # How to build a zip file. zip = env.Command('zip', distfiles, [ '@zip -r gpsd-${VERSION}.zip $SOURCES', '@ls -l gpsd-${VERSION}.zip', ]) env.Clean(zip, ["gpsd-${VERSION}.zip", "packaging/rpm/gpsd.spec"]) # How to build a tarball. tarball = env.Command('tarball', distfiles, [ '@tar --transform "s:^:gpsd-${VERSION}/:" -czf gpsd-${VERSION}.tar.gz $SOURCES', '@ls -l gpsd-${VERSION}.tar.gz', ]) env.Clean(tarball, ["gpsd-${VERSION}.tar.gz", "packaging/rpm/gpsd.spec"]) # Make RPM from the specfile in packaging Utility('dist-rpm', tarball, 'rpmbuild -ta gpsd-${VERSION}.tar.gz') # Make sure build-from-tarball works. testbuild = Utility('testbuild', [tarball], [ 'tar -xzvf gpsd-${VERSION}.tar.gz', 'cd gpsd-${VERSION}; scons', 'rm -fr gpsd-${VERSION}', ]) releasecheck = env.Alias('releasecheck', [ testbuild, check, audit, flocktest, ]) # This is how to ship a release to the hosting site. # The chmod copes with the fact that scp will give a # replacement the permissions of the *original*... upload_release = Utility('upload-release', [tarball], [ 'gpg -b gpsd-${VERSION}.tar.gz', 'chmod ug=rw,o=r gpsd-${VERSION}.tar.gz gpsd-${VERSION}.tar.gz.sig', 'scp gpsd-${VERSION}.tar.gz gpsd-${VERSION}.tar.gz.sig ' + scpupload, ]) # How to tag a release tag_release = Utility('tag-release', [], [ 'git tag -s -m "Tagged for external release ${VERSION}" release-${VERSION}' ]) upload_tags = Utility('upload-tags', [], ['git push --tags']) # Local release preparation. This production will require Internet access, # but it doesn't do any uploads or public repo mods. # # Note that tag_release has to fire early, otherwise the value of REVISION # won't be right when revision.h is generated for the tarball. releaseprep = env.Alias("releaseprep", [Utility("distclean", [], ["rm -f revision.h"]), tag_release, tarball]) # Undo local release preparation Utility("undoprep", [], ['rm -f gpsd-${VERSION}.tar.gz;', 'git tag -d release-${VERSION};']) # All a buildup to this. env.Alias("release", [releaseprep, upload_release, upload_tags, upload_web]) # Experimental release mechanics using shipper # This will ship a freecode metadata update Utility("ship", [tarball, "control"], ['shipper version=%s | sh -e -x' % gpsd_version]) # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: gpsd-3.15/TODO0000664000175000017500000002534212520745634011253 0ustar esresrThis is the gpsd to-do list. If you're viewing it with Emacs, try doing Ctl-C Ctl-t and browsing through the outline headers. Ctl-C Ctl-a will unfold them again. For contribution guidelines and internals documentation, please see the "Hacking Guide" on the project website. The list of bugs exposed by gpsd in other software has moved to the "Upstream Bugs" page on the project website. ** Documentation ** We now have two different calibration procedures in the Time Service HOWTO. One was written by Gary and is based on peerstats; the other by Sanjeev Gupta and is based on loopstats. Can these be merged? How do we know which is appropriate to use when? What could we build in the way of tools and visualization aids to make the calibration process less annoying? ** Things to do when we can break compatibility ** In gps_data_t Make subtype longer. 128 chars long sounds good. In gps_data_t, save PPS precision; this will require creating a pps struct. In gps_fix_t, maybe change time away from float to timespec? Add MMSI sequence number fields to type 7. ** Bugs in gpsd and its clients: *** Tracker bugs See the GPSD bug tracker on the project website, but don't be surprised if it's empty or very sparse. Our rate of new defects per month is quite low. *** RFC2783 bugs **** detangle TIOCMIWAIT and RFC2783 Currently, the code for RFC2783 seems to depend (logically) on TIOCMIWAIT support. However, RFC2783 (and really, no standard) defines TIOCMIWAIT, and NetBSD (and probably FreeBSD) do not implement it. So, there really should be two separate implementations, one that works with TIOCMIWAIT (and thus only on Linux and OpenBSD) and one that assumes only RFC2783 (and thus works on Linux, FreeBSD and NetBSD, as well as any future system that complies with RFC2783 and uses the serial port for time_pps_init). *** Client bugs **** In gpsmon's PPS Offset field Presently PPS Offset is displayed in direct mode for NMEA, SiRF, and UBX devices. Others should probably do likewise, notably the Motorola Oncore and Garmin drivers. *** Dispatcher/network issues **** Reading AISHub data via UDP confuses xgps with short writes To reproduce, "gpsd -D 5 -N -n udp://192.168.1.3:12346" (only works inside thyrsus.com) and run xgps. Probably some kind of packet aggregation issue as it doesn't happen with test logs. *** Driver issues **** RTCM3 analysis is incomplete We can presently decode RTCM3 messages of type 1001-1014, 1029, and 1033. This is not the complete set. We need more test data with different types in them, and a copy of the RTCM3 standard at latest revision (all we have is revision 3). The support for unpacking RTCM3 sentences in the client library is limited to 1001, 1002, 1007, 1008, 1009, 1010, 1014, and 1033. There are some design issues with the baby JSON parser that are going to make extending this set difficult. **** Reporting code for specialized Type 6 and 8 AIS messages is incomplete. This one is mine and Kurt Schwehr's. Support is currently nearly complete; the only missing cases are a handful of IMO 236 and IMO 289 message 6 and 8 subtypes - specifically, 6/23, 8/21, 8/22, 8/24, and 8/26. ** New features ** *** Time tracking Our goal is to be independent of the system clock. **** Maybe apply wraparound compensation **** See *** Optionally use tag blocks in NMEA output Ed W. writes: >Feature request: I would like to see an option to get the NMEA data >out of gpsd, but augmented with a timestamp on each sentence and >details of which input fed in the data. TAG blocks appear to solve >that problem perfectly. So the feature request is simply an option >that inserts a TAG block for each emitted sentence from GPSd with a >timestamp and some handle which references the input method for the >sentence. > >I think all this is effectively emitted with the JSON output (?), so >really this is just adding it to the NMEA sentence output options via >the TAG structure However, Iván Sánchez Ortega notes: >There is one *big* problem with using TAG blocks to timestamp the sentences. >The standards (as far as I/we know) say that the timestamp is **either** the >number of seconds **or** milliseconds since the UNIX epoch, but we do **not** >know if the initial state should be secs, msecs, or nothing. We do not know >how clients reading that TAGblocked NMEA stream should ask GPSD to switch the >timestamp units (or enable/disable them). > >There are a few sentences introduced in NMEA 4.00 that supposedly allow that - >the client sends a sentence to the server, and then the server starts >TAGblocking sentences. But, alas, there are no examples anywhere. > >>From my personal experience, the way to know if a TAGblocked timestamp is in >seconds or milliseconds is ask the people in charge of setting up the >device/service. Perhaps some devices output only secs/msecs, and some other >accept the NMEA 4.00 TAGblock configuration sentences. > >I, for one, would like to see the secs/msecs problem solved before GPSD >embarks on the enterprise of writing TAGblocks. If someone is working on this, please see: http://www.nmea.org/Assets/0183_errata_tag_block_final.pdf **** Speed, mode and rate-changes in client-mode gpsctl. Baud rate and mode changes work in direct mode but are not reliable in client mode. **** Optional dump of GPS configuration using gpsctl. Some setting, like antenna in use, dead-reckoning mode, would be helpful to see. **** Integrate 1PPS into profiling *** We caw now *really* measure latency from GPS top of second when it has 1PPS. Add this capability to gpsprof and revise the "Where's the Latency?" white paper. *** Low-power autoconfiguration in the uBlox driver *** Anthony Stirk writes on Wed May 21 06:09:00 2014: The low power modes are really good on the ublox modules (especially the MAX7's) however a word of warning. We use the 1 sec cyclic mode on our balloon trackers but if the module looses satellites or is jammed out (cheap Chinese cameras do it) the ublox modules seem to hang and become unresponsive. To mitigate against this you need to put the module back in max performance mode as soon as the satellites drops below 4. I'm not sure for most applications the low power mode needs to be used at all on the newer ublox modules. The values for the MAX-7Q are 22mA (6Q 50mA) under acquire, tracking (i.e locked and in max performance) current at is 17mA (39mA 6Q) and power saving reduces this to 5mA or less (15mA on the 6Q). We've observed the issue on the 6 and 7 series. A possibility: drop the chip to low-power mode when it can see > 4 sats, revert to normal otherwise. *** Make subframe reports available in the C API. gpsd now reports subframes when they're available, but the C client library doesn't yet parse them. A sample program to dump the SUBFRAME data would also be useful. Gary Miller has this in his queue. *** 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. *** Enable flocktest on the Debian server farm Debian server farm boxes have a screwy chrooted environment setup. flocktest needs to be modified to deal with it. *** Finish gpssim It's blocked on skyview computation. *** Complete and test the speed/parity/stopbit methods in the drivers These are used for the '?DEVICE' command. All work for 8N1. **** superstar2: not implemented (driver is unfinished) **** italk: not implemented (but could be) **** tsip: speed tested, parity and stop-bit switching not tested **** sirf: speed tested, parity and stop-bit switching not tested **** evermore: speed tested, rejects parity/stopbit setting **** ubx: fully implemented, parity and stop-bit switching not tested **** zodiac: fully implemented, not tested **** navcom.c: speed tested, rejects parity/stopbit setting SiRF, UBX, TSIP, and even Zodiac can support non-8N1 modes; these need to be tested. *** Per-driver restore of changed config settings on exit. This is a solved problem for generic NMEA, EverMore, TripMate, EarthMate, TNT, Zodiac, and RTCM104 drivers (if only because they don't configure any device settings). The SiRF driver now restores NMEA when necessary. It also restores some (but not all) of the things it tweaks in binary mode -- at the moment, just the Navigation Parameters from message 0x13. With more work, we should be able to do a full revert. The TSIP driver changes its per-cycle sentence inventory and thus needs some state-restore logic. This can be done; the same packet 0x35 we use to configure it can be sent in a no-argument mode to query the current sentence mix for later restore. The FV18 changes its per-cycle sentence inventory to include GSAs. It is possible to query that inventory, though we don't have code to do it yet. Garmin devices are a mess. We reconfigure those heavily, and we don't know if there's any way to capture their configuration state before we do it. The iTrax02 driver sets SYNCMODE to start navigation messages without checking to see if it's already on, and stops navigation methods on wrapup. It also forces the set of sentences issued. There doesn't seem to be any way to query these settings. ** Future features (?) *** Industry-standard format dumping of raw satellite data It would be useful to be able to report raw GPS data (pseudoranges, clock, doppler carrier) from any GPS device that can report pseudoranges etc. This belongs in the daemon because the device drivers are already doing the packet-cracking needed to get the data off the chips. Several commodity chipsets (ANTARIS, iTrax3, SiRF and Trimble) readily output enough data to make this a chore, rather than a hard problem. Probably the best way to do this would be to add support for unscaled output of pseudoranges in SKY and add clock and doppler carrier phase. This JSON could then be interpreted by a client program and dumped in various standard formats. Currently the RT-IGS format is looking like the favorite for implementation; it's a fairly lightweight protocol, flexible enough to handle all the quantities required, and it is actually in use in production reference networks. RT-IGS is also a packet-oriented format, rather than a file-oriented format like RINEX. *** Support for more survey / professional / up-scale receivers. Devices such as the Javad JNSCore, Hemisphere Crescent, Septentrio AsteRx and PolaRx, NovAtel Superstar2 and OEMV, Thales (Magellan Professional) AC12 and DG14 would all be welcome. Of course, these are not $50 USB mice... Local variables: mode: outline paragraph-separate: "[ ]*$" end: gpsd-3.15/Tachometer.c0000664000175000017500000004320212520742615013011 0ustar esresr/* * Tachometer Widget Implementation * * Author: Kazuhiko Shutoh, 1989. * Revised by Shinji Sumimoto, 1989/9 (xtachos) * Modifications : ilham@mit.edu (July 10 '90) * Cleaned up and simplified by Eric S. Raymond, December 2004. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include "gpsd_config.h" #include "gps.h" #define D2R 0.0174532925199432957692369076848861271 /* radians = pi/180 */ /**************************************************************** * * Full class record constant * ****************************************************************/ typedef struct { unsigned char digit[7]; } DigitRec; typedef struct { int nofline; XPoint point_list[5]; } StringRec; /* Number character database - like an LED */ static DigitRec num_segment[] = { {{1, 1, 1, 1, 1, 1, 0}}, {{0, 1, 1, 0, 0, 0, 0}}, {{1, 1, 0, 1, 1, 0, 1}}, {{1, 1, 1, 1, 0, 0, 1}}, {{0, 1, 1, 0, 0, 1, 1}}, {{1, 0, 1, 1, 0, 1, 1}}, {{1, 0, 1, 1, 1, 1, 1}}, {{1, 1, 1, 0, 0, 0, 0}}, {{1, 1, 1, 1, 1, 1, 1}}, {{1, 1, 1, 1, 0, 1, 1}} }; static XSegment offset[] = { {-10, -10, 10, -10}, {10, -10, 10, 0}, {10, 0, 10, 10}, {10, 10, -10, 10}, {-10, 10, -10, 0}, {-10, 0, -10, -10}, {-10, 0, 10, 0} }; /* " X 10 %" character database */ static StringRec char_data[] = { {2, /* "X" */ {{-17, -5}, {-7, 5}}}, {2, {{-7, -5}, {-17, 5}}}, {2, /* "1" */ {{-2, -5}, {-2, 5}}}, {5, /* "0" */ {{2, -5}, {12, -5}, {12, 5}, {2, 5}, {2, -5}}} }; #define offst(field) XtOffset(TachometerWidget, field) static XtResource resources[] = { {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), offst(tachometer.scale), XtRString, "XtDefaultForeground"} , {XtNtachometerCircleColor, XtCBorderColor, XtRPixel, sizeof(Pixel), offst(tachometer.circle), XtRString, "XtDefaultForeground"} , {XtNtachometerNeedleColor, XtCBorderColor, XtRPixel, sizeof(Pixel), offst(tachometer.needle), XtRString, "XtDefaultForeground"} , {XtNtachometerNeedleSpeed, XtCtachometerNeedleSpeed, XtRInt, sizeof(int), offst(tachometer.speed), XtRImmediate, (caddr_t) 1}, {XtNvalue, XtCValue, XtRInt, sizeof(int), offst(tachometer.value), XtRImmediate, (caddr_t) 0}, {XtNheight, XtCHeight, XtRDimension, sizeof(Dimension), offst(core.height), XtRImmediate, (caddr_t) 100} , {XtNwidth, XtCWidth, XtRDimension, sizeof(Dimension), offst(core.width), XtRImmediate, (caddr_t) 100} , {XtNborderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension), offst(core.border_width), XtRImmediate, (caddr_t) 0} , {XtNinternalBorderWidth, XtCBorderWidth, XtRDimension, sizeof(Dimension), offst(tachometer.internal_border), XtRImmediate, (caddr_t) 0} , }; static void Initialize(Widget request, Widget new), Realize(Widget w, Mask * valueMask, XSetWindowAttributes * attributes), Resize(Widget w), Redisplay(Widget w, XEvent * event, Region region), Destroy(Widget w); static Boolean SetValues(Widget current, Widget request UNUSED, Widget new); TachometerClassRec tachometerClassRec = { { /* core_class fields */ #define superclass (&simpleClassRec) /* superclass */ (WidgetClass) superclass, /* class_name */ "Tachometer", /* widget_size */ sizeof(TachometerRec), /* class_initialize */ NULL, /* class_part_initialize */ NULL, /* class_inited */ FALSE, /* initialize */ (XtInitProc) Initialize, /* initialize_hook */ NULL, /* realize */ Realize, /* actions */ NULL, /* num_actions */ 0, /* resources */ resources, /* num_resources */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ TRUE, /* visible_interest */ FALSE, /* destroy */ Destroy, /* resize */ Resize, /* expose */ Redisplay, /* set_values */ (XtSetValuesFunc) SetValues, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ NULL, /* query_geometry */ NULL, /* display_accelerator */ XtInheritDisplayAccelerator, /* extension */ NULL } , /* Simple class fields initialization */ { /* change_sensitive */ XtInheritChangeSensitive } }; WidgetClass tachometerWidgetClass = (WidgetClass) & tachometerClassRec; /* Private procedures */ static void FastFillCircle(Display * d, Drawable w, GC gc, Cardinal center_x, Cardinal center_y, Cardinal radius_x, Cardinal radius_y) { XPoint points[360]; Cardinal angle; for (angle = 0; angle < 360; angle++) { points[angle].x = (short)(sin((double)angle * D2R) * (double)radius_x + (double)center_x); points[angle].y = (short)(cos((double)angle * D2R) * (double)radius_y + (double)center_y); } (void)XFillPolygon(d, w, gc, points, 360, Complex, CoordModeOrigin); } static void DrawSingleNumber(TachometerWidget w, int which, Cardinal x, Cardinal y) { XSegment segments[7]; Cardinal nsegments, width, height, count; width = (Cardinal) ((w->core.width / 2) - w->tachometer.internal_border); height = (Cardinal) ((w->core.height / 2) - w->tachometer.internal_border); if ((width == 0) || (height == 0)) return; for (count = 0, nsegments = 0; count < 7; count++) if (num_segment[which].digit[count] == 1) { segments[nsegments].x1 = (short) (x + ((double)offset[count].x1 * ((double)width / 200.0))); segments[nsegments].y1 = (short) (y + ((double)offset[count].y1 * ((double)height / 200.0))); segments[nsegments].x2 = (short) (x + ((double)offset[count].x2 * ((double)width / 200.0))); segments[nsegments].y2 = (short) (y + ((double)offset[count].y2 * ((double)height / 200.0))); nsegments++; } (void)XDrawSegments(XtDisplay(w), XtWindow(w), w->tachometer.scale_GC, segments, (int)nsegments); } static void DrawNumbers(TachometerWidget w, int which, Cardinal x, Cardinal y) { if (which == 10) { DrawSingleNumber(w, 1, (Cardinal) ((double)x * 0.9), y); DrawSingleNumber(w, 0, x, y); } else DrawSingleNumber(w, which, x, y); } static void DrawLabelString(TachometerWidget w) { XPoint points[5]; int char_count, data_count; Cardinal ry, center_x, center_y, radius_x, radius_y; GC gc; center_x = (Cardinal) (w->core.width / 2); center_y = (Cardinal) (w->core.height / 2); radius_x = center_x - w->tachometer.internal_border; radius_y = center_y - w->tachometer.internal_border; if (!(center_x != 0 && center_y != 0 && (radius_x > 0) && (radius_y > 0))) return; ry = (Cardinal) (radius_y * 0.35 + center_y); gc = w->tachometer.scale_GC; for (char_count = 0; char_count < 4; char_count++) { for (data_count = 0; data_count < char_data[char_count].nofline; data_count++) { points[data_count].x = (short) ((char_data[char_count].point_list[data_count].x) * (double)radius_x * 0.01 + center_x); points[data_count].y = (short) ((char_data[char_count].point_list[data_count].y) * (double)radius_y * 0.01 + ry); } (void)XDrawLines(XtDisplay(w), XtWindow(w), gc, points, char_data[char_count].nofline, CoordModeOrigin); } } static void DrawGauge(TachometerWidget w) { XPoint points[4]; Cardinal in_gauge_x, in_gauge_y, out_gauge_x, out_gauge_y; Cardinal number_x, number_y, center_x, center_y, radius_x, radius_y; GC gc; double step, jump = 1.0; center_x = w->core.width / 2; center_y = w->core.height / 2; radius_x = center_x - w->tachometer.internal_border; radius_y = center_y - w->tachometer.internal_border; if ((center_x == 0) || (center_y == 0) || (radius_x <= 0) || (radius_y <= 0)) return; /* Can't draw anything */ gc = w->tachometer.scale_GC; for (step = 330.0; step >= 30.0; step -= jump) { if ((Cardinal) (step) % 30 == 0) { points[0].x = sin((step + 1.0) * D2R) * radius_x * 0.75 + center_x; points[0].y = cos((step + 1.0) * D2R) * radius_y * 0.75 + center_y; points[1].x = sin((step - 1.0) * D2R) * radius_x * 0.75 + center_x; points[1].y = cos((step - 1.0) * D2R) * radius_y * 0.75 + center_y; points[2].x = sin((step - 1.0) * D2R) * radius_x * 0.85 + center_x; points[2].y = cos((step - 1.0) * D2R) * radius_y * 0.85 + center_y; points[3].x = sin((step + 1.0) * D2R) * radius_x * 0.85 + center_x; points[3].y = cos((step + 1.0) * D2R) * radius_y * 0.85 + center_y; (void)XFillPolygon(XtDisplay(w), XtWindow(w), gc, points, 4, Complex, CoordModeOrigin); number_x = sin((step + 1.0) * D2R) * radius_x * 0.65 + center_x; number_y = cos((step + 1.0) * D2R) * radius_y * 0.65 + center_y; if ((int)((330.0 - step) / 30.0) == 1) jump = 3.0; DrawNumbers(w, (unsigned char)((330.0 - step) / 30.0), number_x, number_y); } else { in_gauge_x = sin(step * D2R) * radius_x * 0.8 + center_x; in_gauge_y = cos(step * D2R) * radius_y * 0.8 + center_y; out_gauge_x = sin(step * D2R) * radius_x * 0.85 + center_x; out_gauge_y = cos(step * D2R) * radius_y * 0.85 + center_y; (void)XDrawLine(XtDisplay(w), XtWindow(w), gc, in_gauge_x, in_gauge_y, out_gauge_x, out_gauge_y); } } DrawLabelString(w); } static void DrawNeedle(TachometerWidget w, int load) { XPoint points[6]; double cur_theta1, cur_theta2, cur_theta3, cur_theta4, cur_theta5; Cardinal center_x, center_y, radius_x, radius_y; center_x = w->core.width / 2; center_y = w->core.height / 2; radius_x = center_x - w->tachometer.internal_border; radius_y = center_y - w->tachometer.internal_border; if ((center_x == 0) || (center_y == 0) || (radius_x <= 0) || (radius_y <= 0)) return; /* can't draw anything */ cur_theta1 = (double)(330 - (load * 3)) * D2R; cur_theta2 = (double)(330 - (load * 3) + 1) * D2R; cur_theta3 = (double)(330 - (load * 3) - 1) * D2R; cur_theta4 = (330.0 - ((double)load * 3.0) + 7.0) * D2R; cur_theta5 = (330.0 - ((double)load * 3.0) - 7.0) * D2R; points[0].x = (short)(sin(cur_theta1) * radius_x * 0.75 + center_x); points[0].y = (short)(cos(cur_theta1) * radius_y * 0.75 + center_y); points[1].x = (short)(sin(cur_theta2) * radius_x * 0.7 + center_x); points[1].y = (short)(cos(cur_theta2) * radius_y * 0.7 + center_y); points[2].x = (short)(sin(cur_theta4) * radius_x * 0.1 + center_x); points[2].y = (short)(cos(cur_theta4) * radius_y * 0.1 + center_y); points[3].x = (short)(sin(cur_theta5) * radius_x * 0.1 + center_x); points[3].y = (short)(cos(cur_theta5) * radius_y * 0.1 + center_y); points[4].x = (short)(sin(cur_theta3) * radius_x * 0.7 + center_x); points[4].y = (short)(cos(cur_theta3) * radius_y * 0.7 + center_y); points[5].x = points[0].x; points[5].y = points[0].y; (void)XDrawLines(XtDisplay(w), XtWindow(w), w->tachometer.needle_GC, points, 6, CoordModeOrigin); } static void DrawTachometer(TachometerWidget w) { Cardinal center_x, center_y, radius_x, radius_y; center_x = w->core.width / 2; center_y = w->core.height / 2; radius_x = center_x - w->tachometer.internal_border; radius_y = center_y - w->tachometer.internal_border; if ((center_x == 0) || (center_y == 0) || (radius_x <= 0) || (radius_y <= 0)) return; /* Can't draw anything -- no room */ /* Big circle */ FastFillCircle(XtDisplay(w), XtWindow(w), w->tachometer.circle_GC, center_x, center_y, radius_x, radius_y); /* Inner circle same color as the background */ FastFillCircle(XtDisplay(w), XtWindow(w), w->tachometer.background_GC, center_x, center_y, (Cardinal) (radius_x * 0.95), (Cardinal) (radius_y * 0.95)); /* Small circle */ FastFillCircle(XtDisplay(w), XtWindow(w), w->tachometer.circle_GC, center_x, center_y, (Cardinal) (radius_x * 0.1), (Cardinal) (radius_y * 0.1)); /* Draw the details */ DrawGauge(w); DrawNeedle(w, w->tachometer.value); } static void MoveNeedle(TachometerWidget w, int new) { int step, old, loop; old = w->tachometer.value; if (new > 100) new = 100; if (old == new) return; else if (old < new) step = (w->tachometer.speed ? w->tachometer.speed : new - old); else step = (w->tachometer.speed ? -w->tachometer.speed : new - old); if (old < new) { for (loop = old; loop < new; loop += step) DrawNeedle(w, loop); for (loop = old + step; loop <= new; loop += step) DrawNeedle(w, loop); } else { for (loop = old; loop > new; loop += step) DrawNeedle(w, loop); for (loop = old + step; loop >= new; loop += step) DrawNeedle(w, loop); } if (loop != new + step) /* The final needle wasn't printed */ DrawNeedle(w, new); w->tachometer.value = new; } static void GetneedleGC(TachometerWidget ta) { XGCValues values; values.background = ta->core.background_pixel; values.foreground = ta->tachometer.needle ^ ta->core.background_pixel; values.function = GXxor; ta->tachometer.needle_GC = XtGetGC((Widget) ta, (unsigned)GCFunction | GCBackground | GCForeground, &values); } static void GetscaleGC(TachometerWidget ta) { XGCValues values; values.foreground = ta->tachometer.scale; values.background = ta->core.background_pixel; ta->tachometer.scale_GC = XtGetGC((Widget) ta, (unsigned)GCForeground | GCBackground, &values); } static void GetcircleGC(TachometerWidget ta) { XGCValues values; values.foreground = ta->tachometer.circle; values.background = ta->core.background_pixel; ta->tachometer.circle_GC = XtGetGC((Widget) ta, (unsigned)GCForeground | GCBackground, &values); } static void GetbackgroundGC(TachometerWidget ta) { XGCValues values; values.foreground = ta->core.background_pixel; values.background = ta->core.background_pixel; ta->tachometer.background_GC = XtGetGC((Widget) ta, (unsigned)GCForeground | GCBackground, &values); } static void Initialize(Widget request UNUSED, Widget new) { TachometerWidget ta = (TachometerWidget) new; GetneedleGC(ta); GetcircleGC(ta); GetscaleGC(ta); GetbackgroundGC(ta); ta->tachometer.width = ta->tachometer.height = 0; } /* Initialize */ static void Realize(Widget w, Mask * valueMask, XSetWindowAttributes * attributes) { *valueMask |= CWBitGravity; attributes->bit_gravity = NorthWestGravity; (*superclass->core_class.realize) (w, valueMask, attributes); } /* Realize */ static void Redisplay(Widget w, XEvent * event, Region region UNUSED) { if (event->xexpose.count == 0) DrawTachometer((TachometerWidget) w); } /* Redisplay */ static void Resize(Widget w) { TachometerWidget ta = (TachometerWidget) w; if ((ta->core.width == ta->tachometer.width) && (ta->core.height == ta->tachometer.height)) /* What resize? We don't see a resize! */ return; (void)XClearWindow(XtDisplay(w), XtWindow(w)); if ((ta->core.width <= ta->tachometer.width) && (ta->core.height <= ta->tachometer.height)) /* Only redraw here if no expose events are going to be */ /* generated, i.e. if the window has not grown horizontally */ /* or vertically. */ DrawTachometer(ta); ta->tachometer.width = ta->core.width; ta->tachometer.height = ta->core.height; } /* Resize */ static Boolean SetValues(Widget current, Widget request UNUSED, Widget new) /* Set specified arguments into widget */ { Boolean back, changed = (Boolean) False; TachometerWidget curta = (TachometerWidget) current; TachometerWidget newta = (TachometerWidget) new; back = (curta->core.background_pixel != newta->core.background_pixel); if (back || (curta->tachometer.needle != newta->tachometer.needle)) { (void)XtReleaseGC(new, newta->tachometer.needle_GC); GetneedleGC(newta); changed = True; } if (back || (curta->tachometer.scale != newta->tachometer.scale)) { (void)XtReleaseGC(new, newta->tachometer.scale_GC); GetscaleGC(newta); changed = True; } if (back || (curta->tachometer.circle != newta->tachometer.circle)) { (void)XtReleaseGC(new, newta->tachometer.circle_GC); GetcircleGC(newta); changed = True; } if (back) { (void)XtReleaseGC(new, newta->tachometer.background_GC); GetbackgroundGC(newta); changed = True; } if (curta->tachometer.value != newta->tachometer.value) { MoveNeedle(newta, newta->tachometer.value); changed = True; } return (changed); } static void Destroy(Widget w) { TachometerWidget ta = (TachometerWidget) w; (void)XtReleaseGC(w, ta->tachometer.needle_GC); (void)XtReleaseGC(w, ta->tachometer.circle_GC); (void)XtReleaseGC(w, ta->tachometer.scale_GC); (void)XtReleaseGC(w, ta->tachometer.background_GC); } /* Exported Procedures */ // cppcheck-suppress unusedFunction int TachometerGetValue(Widget w) { return (((TachometerWidget) w)->tachometer.value); } // cppcheck-suppress unusedFunction int TachometerSetValue(Widget w, int i) { int old; TachometerWidget ta = (TachometerWidget) w; old = ta->tachometer.value; MoveNeedle(ta, i); return (old); } gpsd-3.15/Tachometer.h0000664000175000017500000000326112506317045013016 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _GPSD_TACHOMETER_H_ #define _GPSD_TACHOMETER_H_ /* Tachometer.h -- tachometer widget interface */ #include /* Resources: Name Class RepType Default Value ---- ----- ------- ------------- background Background Pixel XtDefaultBackground border BorderColor Pixel XtDefaultForeground circleColor BorderColor Pixel XtDefaultForeground borderWidth BorderWidth Dimension 0 cursor Cursor Cursor None destroyCallback Callback XtCallbackList NULL foreground Foreground Pixel XtDefaultForeground height Height Dimension 100 insensitiveBorder Insensitive Pixmap Gray internalBorderWidth BorderWidth Dimension 0 mappedWhenManaged MappedWhenManaged Boolean True needleColor BorderColor Pixel XtDefaultForeground needleSpeed NeedleSpeed int 1 sensitive Sensitive Boolean True width Width Dimension 100 value Value int 0 x Position Position 0 y Position Position 0 */ #define XtNinternalBorderWidth "internalBorderWidth" #define XtNtachometerNeedleSpeed "needleSpeed" #define XtNtachometerCircleColor "circleColor" #define XtNtachometerNeedleColor "needleColor" #define XtCtachometerNeedleSpeed "NeedleSpeed" extern int TachometerGetValue(Widget); extern int TachometerSetValue(Widget, int); /* Class record constants */ extern WidgetClass tachometerWidgetClass; typedef struct _TachometerClassRec *TachometerWidgetClass; typedef struct _TachometerRec *TachometerWidget; #endif /* _GPSD_TACHOMETER_H_ */ gpsd-3.15/TachometerP.h0000664000175000017500000000245312506317045013140 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _GPSD_TACHOMETERP_H_ #define _GPSD_TACHOMETERP_H_ /* TachometerP.h -- Tachometer widget private data */ #include #include /* New fields for the Tachometer widget class record */ typedef struct {int foo;} TachometerClassPart; /* Full class record declaration */ typedef struct _TachometerClassRec { CoreClassPart core_class; SimpleClassPart simple_class; TachometerClassPart label_class; } TachometerClassRec; extern TachometerClassRec tachometerClassRec; /* New fields for the Tachometer widget record */ typedef struct { /* resources */ Pixel needle, scale, circle; int value, speed; /* private state */ GC needle_GC, scale_GC, circle_GC, background_GC; /* We need to store the width and height separately, because when */ /* we get a resize request, we need to know if the window has */ /* gotten bigger. */ Dimension width, height, internal_border; } TachometerPart; /* Full instance record declaration */ typedef struct _TachometerRec { CorePart core; SimplePart simple; TachometerPart tachometer; } TachometerRec; #endif /* _GPSD_TACHOMETERP_H_ */ gpsd-3.15/ais_json.c0000664000175000017500000004300112506320667012523 0ustar esresr/**************************************************************************** NAME ais_json.c - deserialize AIS JSON DESCRIPTION This module uses the generic JSON parser to get data from AIS representations to libgps structures. ***************************************************************************/ #include #include #include #include #include #include #include "gpsd_config.h" #include "gps.h" #include "json.h" #ifdef SOCKET_EXPORT_ENABLE #include "libgps.h" /* kluge because we don't want to include gpsd.h here */ extern int gpsd_hexpack(const char *, char *, size_t); static void lenhex_unpack(const char *from, size_t * plen, char *to, size_t maxlen) { char *colon = strchr(from, ':'); *plen = (size_t) atoi(from); if (colon != NULL) (void)gpsd_hexpack(colon + 1, to, maxlen); } int json_ais_read(const char *buf, char *path, size_t pathlen, struct ais_t *ais, const char **endptr) { /* collected but not actually used yet */ bool scaled; #define AIS_HEADER \ {"class", t_check, .dflt.check = "AIS"}, \ {"type", t_uinteger, .addr.uinteger = &ais->type}, \ {"device", t_string, .addr.string = path, \ .len = pathlen}, \ {"repeat", t_uinteger, .addr.uinteger = &ais->repeat}, \ {"scaled", t_boolean, .addr.boolean = &scaled, \ .dflt.boolean = false}, \ {"mmsi", t_uinteger, .addr.uinteger = &ais->mmsi}, #define AIS_TYPE6 \ {"seqno", t_uinteger, .addr.uinteger = &ais->type6.seqno,\ .dflt.uinteger = 0},\ {"dest_mmsi", t_uinteger, .addr.uinteger = &ais->type6.dest_mmsi,\ .dflt.uinteger = 0},\ {"retransmit", t_boolean, .addr.boolean = &ais->type6.retransmit,\ .dflt.boolean = false},\ {"dac", t_uinteger, .addr.uinteger = &ais->type6.dac,\ .dflt.uinteger = 0},\ {"fid", t_uinteger, .addr.uinteger = &ais->type6.fid,\ .dflt.uinteger = 0}, #define AIS_TYPE8 \ {"dac", t_uinteger, .addr.uinteger = &ais->type8.dac,\ .dflt.uinteger = 0},\ {"fid", t_uinteger, .addr.uinteger = &ais->type8.fid,\ .dflt.uinteger = 0}, int status; #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) { status = json_read_object(buf, json_ais1, endptr); } 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.minute = AIS_MINUTE_NOT_AVAILABLE; ais->type4.second = AIS_SECOND_NOT_AVAILABLE; // We use %09u for the date to allow for dodgy years (>9999) to go through // cppcheck-suppress uninitvar (void)sscanf(timestamp, "%09u-%02u-%02uT%02u:%02u:%02uZ", &ais->type4.year, &ais->type4.month, &ais->type4.day, &ais->type4.hour, &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.minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(eta, "%02u-%02uT%02u:%02uZ", &ais->type5.month, &ais->type5.day, &ais->type5.hour, &ais->type5.minute); } } else if (strstr(buf, "\"type\":6,") != NULL) { bool structured = false; if (strstr(buf, "\"dac\":1,") != NULL) { if (strstr(buf, "\"fid\":12,") != NULL) { status = json_read_object(buf, json_ais6_fid12, endptr); if (status == 0) { ais->type6.dac1fid12.lmonth = AIS_MONTH_NOT_AVAILABLE; ais->type6.dac1fid12.lday = AIS_DAY_NOT_AVAILABLE; ais->type6.dac1fid12.lhour = AIS_HOUR_NOT_AVAILABLE; ais->type6.dac1fid12.lminute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(departure, "%02u-%02uT%02u:%02uZ", &ais->type6.dac1fid12.lmonth, &ais->type6.dac1fid12.lday, &ais->type6.dac1fid12.lhour, &ais->type6.dac1fid12.lminute); ais->type6.dac1fid12.nmonth = AIS_MONTH_NOT_AVAILABLE; ais->type6.dac1fid12.nday = AIS_DAY_NOT_AVAILABLE; ais->type6.dac1fid12.nhour = AIS_HOUR_NOT_AVAILABLE; ais->type6.dac1fid12.nminute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(eta, "%02u-%02uT%02u:%02uZ", &ais->type6.dac1fid12.nmonth, &ais->type6.dac1fid12.nday, &ais->type6.dac1fid12.nhour, &ais->type6.dac1fid12.nminute); } structured = true; } else if (strstr(buf, "\"fid\":15,") != NULL) { status = json_read_object(buf, json_ais6_fid15, endptr); structured = true; } else if (strstr(buf, "\"fid\":16,") != NULL) { status = json_read_object(buf, json_ais6_fid16, endptr); structured = true; } else if (strstr(buf, "\"fid\":18,") != NULL) { status = json_read_object(buf, json_ais6_fid18, endptr); if (status == 0) { ais->type6.dac1fid18.day = AIS_DAY_NOT_AVAILABLE; ais->type6.dac1fid18.hour = AIS_HOUR_NOT_AVAILABLE; ais->type6.dac1fid18.minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(arrival, "%02u-%02uT%02u:%02uZ", &ais->type6.dac1fid18.month, &ais->type6.dac1fid18.day, &ais->type6.dac1fid18.hour, &ais->type6.dac1fid18.minute); } structured = true; } else if (strstr(buf, "\"fid\":20,") != NULL) { status = json_read_object(buf, json_ais6_fid20, endptr); if (status == 0) { ais->type6.dac1fid20.month = AIS_MONTH_NOT_AVAILABLE; ais->type6.dac1fid20.day = AIS_DAY_NOT_AVAILABLE; ais->type6.dac1fid20.hour = AIS_HOUR_NOT_AVAILABLE; ais->type6.dac1fid20.minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(arrival, "%02u-%02uT%02u:%02uZ", &ais->type6.dac1fid20.month, &ais->type6.dac1fid20.day, &ais->type6.dac1fid20.hour, &ais->type6.dac1fid20.minute); } structured = true; } else if (strstr(buf, "\"fid\":25,") != NULL) { status = json_read_object(buf, json_ais6_fid25, endptr); structured = true; } else if (strstr(buf, "\"fid\":28,") != NULL) { status = json_read_object(buf, json_ais6_fid28, endptr); if (status == 0) { ais->type6.dac1fid28.month = AIS_MONTH_NOT_AVAILABLE; ais->type6.dac1fid28.day = AIS_DAY_NOT_AVAILABLE; ais->type6.dac1fid28.hour = AIS_HOUR_NOT_AVAILABLE; ais->type6.dac1fid28.minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(start, "%02u-%02uT%02u:%02uZ", &ais->type6.dac1fid28.month, &ais->type6.dac1fid28.day, &ais->type6.dac1fid28.hour, &ais->type6.dac1fid28.minute); } structured = true; } else if (strstr(buf, "\"fid\":30,") != NULL) { status = json_read_object(buf, json_ais6_fid30, endptr); structured = true; } else if (strstr(buf, "\"fid\":32,") != NULL || strstr(buf, "\"fid\":14,") != NULL) { status = json_read_object(buf, json_ais6_fid32, endptr); structured = true; } } else if (strstr(buf, "\"dac\":235,") != NULL || strstr(buf, "\"dac\":250,") != NULL) { if (strstr(buf, "\"fid\":10,") != NULL) { status = json_read_object(buf, json_ais6_fid10, endptr); structured = true; } } else if (strstr(buf, "\"dac\":200,") != NULL) { if (strstr(buf, "\"fid\":21,") != NULL) { status = json_read_object(buf, json_ais6_fid21, endptr); structured = true; if (status == 0) { ais->type6.dac200fid21.month = AIS_MONTH_NOT_AVAILABLE; ais->type6.dac200fid21.day = AIS_DAY_NOT_AVAILABLE; ais->type6.dac200fid21.hour = AIS_HOUR_NOT_AVAILABLE; ais->type6.dac200fid21.minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(eta, "%02u-%02uT%02u:%02u", &ais->type6.dac200fid21.month, &ais->type6.dac200fid21.day, &ais->type6.dac200fid21.hour, &ais->type6.dac200fid21.minute); } } else if (strstr(buf, "\"fid\":22,") != NULL) { status = json_read_object(buf, json_ais6_fid22, endptr); structured = true; if (status == 0) { ais->type6.dac200fid22.month = AIS_MONTH_NOT_AVAILABLE; ais->type6.dac200fid22.day = AIS_DAY_NOT_AVAILABLE; ais->type6.dac200fid22.hour = AIS_HOUR_NOT_AVAILABLE; ais->type6.dac200fid22.minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(rta, "%02u-%02uT%02u:%02u", &ais->type6.dac200fid22.month, &ais->type6.dac200fid22.day, &ais->type6.dac200fid22.hour, &ais->type6.dac200fid22.minute); } } else if (strstr(buf, "\"fid\":55,") != NULL) { status = json_read_object(buf, json_ais6_fid55, endptr); structured = true; } } if (!structured) { status = json_read_object(buf, json_ais6, endptr); if (status == 0) lenhex_unpack(data, &ais->type6.bitcount, ais->type6.bitdata, sizeof(ais->type6.bitdata)); } ais->type6.structured = structured; } 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) { bool structured = false; if (strstr(buf, "\"dac\":1,") != NULL) { if (strstr(buf, "\"fid\":11,") != NULL) { status = json_read_object(buf, json_ais8_fid11, endptr); if (status == 0) { ais->type8.dac1fid11.day = AIS_DAY_NOT_AVAILABLE; ais->type8.dac1fid11.hour = AIS_HOUR_NOT_AVAILABLE; ais->type8.dac1fid11.minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(timestamp, "%02uT%02u:%02uZ", &ais->type8.dac1fid11.day, &ais->type8.dac1fid11.hour, &ais->type8.dac1fid11.minute); } structured = true; } else if (strstr(buf, "\"fid\":13,") != NULL) { status = json_read_object(buf, json_ais8_fid13, endptr); if (status == 0) { ais->type8.dac1fid13.fmonth = AIS_MONTH_NOT_AVAILABLE; ais->type8.dac1fid13.fday = AIS_DAY_NOT_AVAILABLE; ais->type8.dac1fid13.fhour = AIS_HOUR_NOT_AVAILABLE; ais->type8.dac1fid13.fminute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(departure, "%02u-%02uT%02u:%02uZ", &ais->type8.dac1fid13.fmonth, &ais->type8.dac1fid13.fday, &ais->type8.dac1fid13.fhour, &ais->type8.dac1fid13.fminute); ais->type8.dac1fid13.tmonth = AIS_MONTH_NOT_AVAILABLE; ais->type8.dac1fid13.tday = AIS_DAY_NOT_AVAILABLE; ais->type8.dac1fid13.thour = AIS_HOUR_NOT_AVAILABLE; ais->type8.dac1fid13.tminute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(eta, "%02u-%02uT%02u:%02uZ", &ais->type8.dac1fid13.tmonth, &ais->type8.dac1fid13.tday, &ais->type8.dac1fid13.thour, &ais->type8.dac1fid13.tminute); } structured = true; } else if (strstr(buf, "\"fid\":15,") != NULL) { status = json_read_object(buf, json_ais8_fid15, endptr); structured = true; } else if (strstr(buf, "\"fid\":16,") != NULL) { status = json_read_object(buf, json_ais8_fid16, endptr); structured = true; } else if (strstr(buf, "\"fid\":17,") != NULL) { status = json_read_object(buf, json_ais8_fid17, endptr); structured = true; } else if (strstr(buf, "\"fid\":19,") != NULL) { status = json_read_object(buf, json_ais8_fid19, endptr); structured = true; } else if (strstr(buf, "\"fid\":23,") != NULL) { status = json_read_object(buf, json_ais8_fid23, endptr); ais->type8.dac200fid23.start_year = AIS_YEAR_NOT_AVAILABLE; ais->type8.dac200fid23.start_month = AIS_MONTH_NOT_AVAILABLE; ais->type8.dac200fid23.start_day = AIS_DAY_NOT_AVAILABLE; ais->type8.dac200fid23.start_hour = AIS_HOUR_NOT_AVAILABLE; ais->type8.dac200fid23.start_minute = AIS_MINUTE_NOT_AVAILABLE; ais->type8.dac200fid23.end_year = AIS_YEAR_NOT_AVAILABLE; ais->type8.dac200fid23.end_month = AIS_MONTH_NOT_AVAILABLE; ais->type8.dac200fid23.end_day = AIS_DAY_NOT_AVAILABLE; ais->type8.dac200fid23.end_hour = AIS_HOUR_NOT_AVAILABLE; ais->type8.dac200fid23.end_minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(start, "%09u-%02u-%02uT%02u:%02u", &ais->type8.dac200fid23.start_year, &ais->type8.dac200fid23.start_month, &ais->type8.dac200fid23.start_day, &ais->type8.dac200fid23.start_hour, &ais->type8.dac200fid23.start_minute); // cppcheck-suppress uninitvar (void)sscanf(end, "%09u-%02u-%02uT%02u:%02u", &ais->type8.dac200fid23.end_year, &ais->type8.dac200fid23.end_month, &ais->type8.dac200fid23.end_day, &ais->type8.dac200fid23.end_hour, &ais->type8.dac200fid23.end_minute); structured = true; } else if (strstr(buf, "\"fid\":24,") != NULL) { status = json_read_object(buf, json_ais8_fid24, endptr); structured = true; } else if (strstr(buf, "\"fid\":27,") != NULL) { status = json_read_object(buf, json_ais8_fid27, endptr); if (status == 0) { ais->type8.dac1fid27.month = AIS_MONTH_NOT_AVAILABLE; ais->type8.dac1fid27.day = AIS_DAY_NOT_AVAILABLE; ais->type8.dac1fid27.hour = AIS_HOUR_NOT_AVAILABLE; ais->type8.dac1fid27.minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(start, "%02u-%02uT%02u:%02uZ", &ais->type8.dac1fid27.month, &ais->type8.dac1fid27.day, &ais->type8.dac1fid27.hour, &ais->type8.dac1fid27.minute); } structured = true; } else if (strstr(buf, "\"fid\":29,") != NULL) { status = json_read_object(buf, json_ais8_fid29, endptr); structured = true; } else if (strstr(buf, "\"fid\":31,") != NULL) { status = json_read_object(buf, json_ais8_fid31, endptr); if (status == 0) { ais->type8.dac1fid31.day = AIS_DAY_NOT_AVAILABLE; ais->type8.dac1fid31.hour = AIS_HOUR_NOT_AVAILABLE; ais->type8.dac1fid31.minute = AIS_MINUTE_NOT_AVAILABLE; // cppcheck-suppress uninitvar (void)sscanf(timestamp, "%02uT%02u:%02uZ", &ais->type8.dac1fid31.day, &ais->type8.dac1fid31.hour, &ais->type8.dac1fid31.minute); } structured = true; } } else if (strstr(buf, "\"dac\":200,") != NULL && strstr(buf,"data")==NULL) { if (strstr(buf, "\"fid\":10,") != NULL) { status = json_read_object(buf, json_ais8_fid10, endptr); structured = true; } if (strstr(buf, "\"fid\":40,") != NULL) { status = json_read_object(buf, json_ais8_fid40, endptr); structured = true; } } if (!structured) { status = json_read_object(buf, json_ais8, endptr); if (status == 0) lenhex_unpack(data, &ais->type8.bitcount, ais->type8.bitdata, sizeof(ais->type8.bitdata)); } ais->type8.structured = structured; } else if (strstr(buf, "\"type\":9,") != NULL) { status = json_read_object(buf, json_ais9, endptr); } else if (strstr(buf, "\"type\":10,") != NULL) { status = json_read_object(buf, json_ais10, endptr); } else if (strstr(buf, "\"type\":12,") != NULL) { status = json_read_object(buf, json_ais12, endptr); } else if (strstr(buf, "\"type\":14,") != NULL) { status = json_read_object(buf, json_ais14, endptr); } else if (strstr(buf, "\"type\":15,") != NULL) { status = json_read_object(buf, json_ais15, endptr); } else if (strstr(buf, "\"type\":16,") != NULL) { status = json_read_object(buf, json_ais16, endptr); } 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)); } else if (strstr(buf, "\"type\":18,") != NULL) { status = json_read_object(buf, json_ais18, endptr); } else if (strstr(buf, "\"type\":19,") != NULL) { status = json_read_object(buf, json_ais19, endptr); } else if (strstr(buf, "\"type\":20,") != NULL) { status = json_read_object(buf, json_ais20, endptr); } else if (strstr(buf, "\"type\":21,") != NULL) { status = json_read_object(buf, json_ais21, endptr); } else if (strstr(buf, "\"type\":22,") != NULL) { status = json_read_object(buf, json_ais22, endptr); } else if (strstr(buf, "\"type\":23,") != NULL) { status = json_read_object(buf, json_ais23, endptr); } else if (strstr(buf, "\"type\":24,") != NULL) { status = json_read_object(buf, json_ais24, endptr); } else if (strstr(buf, "\"type\":25,") != NULL) { status = json_read_object(buf, json_ais25, endptr); if (status == 0) lenhex_unpack(data, &ais->type25.bitcount, ais->type25.bitdata, sizeof(ais->type25.bitdata)); } else if (strstr(buf, "\"type\":26,") != NULL) { status = json_read_object(buf, json_ais26, endptr); if (status == 0) lenhex_unpack(data, &ais->type26.bitcount, ais->type26.bitdata, sizeof(ais->type26.bitdata)); } else if (strstr(buf, "\"type\":27,") != NULL) { status = json_read_object(buf, json_ais27, endptr); } else { if (endptr != NULL) *endptr = NULL; return JSON_ERR_MISC; } return status; } #endif /* SOCKET_EXPORT_ENABLE */ /* ais_json.c ends here */ gpsd-3.15/bits.c0000664000175000017500000001023112506321002011636 0ustar esresr/* bits.c - bitfield extraction code * * This file is Copyright (c)2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * * Bitfield extraction functions. In each, start is a bit index - not * a byte index - and width is a bit width. The width is bounded above by * 64 bits. * * The sbits() function assumes twos-complement arithmetic. ubits() * and sbits() assume no padding in integers. */ #include #include #include #include #include #include "bits.h" uint64_t ubits(unsigned char buf[], unsigned int start, unsigned int width, bool le) /* extract a (zero-origin) bitfield from the buffer as an unsigned big-endian uint64_t */ { uint64_t fld = 0; unsigned int i; unsigned end; assert(width <= sizeof(uint64_t) * CHAR_BIT); for (i = start / CHAR_BIT; i < (start + width + CHAR_BIT - 1) / CHAR_BIT; i++) { fld <<= CHAR_BIT; fld |= (unsigned char)buf[i]; } end = (start + width) % CHAR_BIT; if (end != 0) { fld >>= (CHAR_BIT - end); } fld &= ~(-1LL << width); /* was extraction as a little-endian requested? */ if (le) { uint64_t reversed = 0; for (i = width; i; --i) { reversed <<= 1; if (fld & 1) reversed |= 1; fld >>= 1; } fld = reversed; } return fld; } int64_t sbits(signed char buf[], unsigned int start, unsigned int width, bool le) /* extract a bitfield from the buffer as a signed big-endian long */ { uint64_t fld = ubits((unsigned char *)buf, start, width, le); /* ensure width > 0 as the result of 1LL << (width - 1) is undefined for width <= 0 */ assert(width > 0); if (fld & (1LL << (width - 1))) { fld |= (-1LL << (width - 1)); } return (int64_t)fld; } union int_float { int32_t i; float f; }; union long_double { int64_t l; double d; }; float getlef32(const char *buf, int off) { union int_float i_f; i_f.i = getles32(buf, off); return i_f.f; } double getled64(const char *buf, int off) { union long_double l_d; l_d.l = getles64(buf, off); return l_d.d; } float getbef32(const char *buf, int off) { union int_float i_f; i_f.i = getbes32(buf, off); return i_f.f; } double getbed64(const char *buf, int off) { union long_double l_d; l_d.l = getbes64(buf, off); return l_d.d; } void putbef32(char *buf, int off, float val) { union int_float i_f; i_f.f = val; putbe32(buf, off, i_f.i); } void shiftleft(unsigned char *data, int size, unsigned short left) { unsigned char *byte; if (left >= CHAR_BIT) { size -= left/CHAR_BIT; memmove(data, data + left/CHAR_BIT, (size + CHAR_BIT - 1)/CHAR_BIT); left %= CHAR_BIT; } for (byte = data; size--; ++byte ) { unsigned char bits; if (size) bits = byte[1] >> (CHAR_BIT - left); else bits = 0; *byte <<= left; *byte |= bits; } } #ifdef __UNUSED__ void putbed64(char *buf, int off, double val) { union long_double l_d; l_d.d = val; putbe32(buf, (off), (l_d.l) >> 32); putbe32(buf, (off)+4, (l_d.l)); } u_int16_t swap_u16(u_int16_t i) /* byte-swap a 16-bit unsigned int */ { u_int8_t c1, c2; c1 = i & 255; c2 = (i >> 8) & 255; return (c1 << 8) + c2; } u_int32_t swap_u32(u_int32_t i) /* byte-swap a 32-bit unsigned int */ { u_int8_t c1, c2, c3, c4; c1 = i & 255; c2 = (i >> 8) & 255; c3 = (i >> 16) & 255; c4 = (i >> 24) & 255; return ((u_int32_t)c1 << 24) + ((u_int32_t)c2 << 16) + ((u_int32_t)c3 << 8) + c4; } u_int64_t swap_u64(u_int64_t i) /* byte-swap a 64-bit unsigned int */ { u_int8_t c1, c2, c3, c4, c5, c6, c7, c8; c1 = i & 255; c2 = (i >> 8) & 255; c3 = (i >> 16) & 255; c4 = (i >> 24) & 255; c5 = (i >> 32) & 255; c6 = (i >> 40) & 255; c7 = (i >> 48) & 255; c8 = (i >> 56) & 255; return ((u_int64_t)c1 << 56) + ((u_int64_t)c2 << 48) + ((u_int64_t)c3 << 40) + ((u_int64_t)c4 << 32) + ((u_int64_t)c5 << 24) + ((u_int64_t)c6 << 16) + ((u_int64_t)c7 << 8) + c8; } #endif /* __UNUSED__ */ gpsd-3.15/bits.h0000664000175000017500000000630412506317026011664 0ustar esresr/* * bits.h - extract binary data from message buffer * * These macros extract bytes, words, longwords, floats, doubles, or * bitfields of arbitrary length and size from a message that contains * these items in either MSB-first or LSB-first byte order. * * We enforce data sizes of integral types in the casts on these. * Both 32- and 64-bit systems with gcc are OK with this set. * * This file is Copyright (c)2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _GPSD_BITS_H_ #define _GPSD_BITS_H_ #include #include /* number of bytes requited to contain a bit array of specified length */ #define BITS_TO_BYTES(bitlen) (((bitlen) + CHAR_BIT - 1) / CHAR_BIT) /* these are independent of byte order */ #define getsb(buf, off) ((int8_t)buf[off]) #define getub(buf, off) ((uint8_t)buf[off]) #define putbyte(buf,off,b) do {buf[off] = (unsigned char)(b);} while (0) /* little-endian access */ #define getles16(buf, off) ((int16_t)(((uint16_t)getub((buf), (off)+1) << 8) | (uint16_t)getub((buf), (off)))) #define getleu16(buf, off) ((uint16_t)(((uint16_t)getub((buf), (off)+1) << 8) | (uint16_t)getub((buf), (off)))) #define getles32(buf, off) ((int32_t)(((uint16_t)getleu16((buf), (off)+2) << 16) | (uint16_t)getleu16((buf), (off)))) #define getleu32(buf, off) ((uint32_t)(((uint16_t)getleu16((buf),(off)+2) << 16) | (uint16_t)getleu16((buf), (off)))) #define getles64(buf, off) ((int64_t)(((uint64_t)getleu32(buf, (off)+4) << 32) | getleu32(buf, (off)))) #define getleu64(buf, off) ((uint64_t)(((uint64_t)getleu32(buf, (off)+4) << 32) | getleu32(buf, (off)))) extern float getlef32(const char *, int); extern double getled64(const char *, int); #define putle16(buf, off, w) do {putbyte(buf, (off)+1, (uint)(w) >> 8); putbyte(buf, (off), (w));} while (0) #define putle32(buf, off, l) do {putle16(buf, (off)+2, (uint)(l) >> 16); putle16(buf, (off), (l));} while (0) /* big-endian access */ #define getbes16(buf, off) ((int16_t)(((uint16_t)getub(buf, (off)) << 8) | (uint16_t)getub(buf, (off)+1))) #define getbeu16(buf, off) ((uint16_t)(((uint16_t)getub(buf, (off)) << 8) | (uint16_t)getub(buf, (off)+1))) #define getbes32(buf, off) ((int32_t)(((uint16_t)getbeu16(buf, (off)) << 16) | getbeu16(buf, (off)+2))) #define getbeu32(buf, off) ((uint32_t)(((uint16_t)getbeu16(buf, (off)) << 16) | getbeu16(buf, (off)+2))) #define getbes64(buf, off) ((int64_t)(((uint64_t)getbeu32(buf, (off)) << 32) | getbeu32(buf, (off)+4))) #define getbeu64(buf, off) ((uint64_t)(((uint64_t)getbeu32(buf, (off)) << 32) | getbeu32(buf, (off)+4))) extern float getbef32(const char *, int); extern double getbed64(const char *, int); #define putbe16(buf,off,w) do {putbyte(buf, (off), (w) >> 8); putbyte(buf, (off)+1, (w));} while (0) #define putbe32(buf,off,l) do {putbe16(buf, (off), (l) >> 16); putbe16(buf, (off)+2, (l));} while (0) extern void putbef32(char *, int, float); extern void putbed64(char *, int, double); extern void shiftleft(unsigned char *, int, unsigned short); /* bitfield extraction */ extern uint64_t ubits(unsigned char buf[], unsigned int, unsigned int, bool); extern int64_t sbits(signed char buf[], unsigned int, unsigned int, bool); #endif /* _GPSD_BITS_H_ */ gpsd-3.15/bsd_base64.c0000664000175000017500000001642312506317026012635 0ustar esresr/* $OpenBSD: base64.c,v 1.3 1997/11/08 20:46:55 deraadt Exp $ */ /* * Copyright (c) 1996 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* * Portions Copyright (c) 1995 by International Business Machines, Inc. * * International Business Machines, Inc. (hereinafter called IBM) grants * permission under its copyrights to use, copy, modify, and distribute this * Software with or without fee, provided that the above copyright notice and * all paragraphs of this notice appear in all copies, and that the name of IBM * not be used in connection with the marketing of any product incorporating * the Software or modifications thereof, without specific, written prior * permission. * * To the extent it has a right to do so, IBM grants an immunity from suit * under its patents, if any, for the use, sale or manufacture of products to * the extent that such products are used for performing Domain Name System * dynamic updates in TCP/IP networks by means of the Software. No immunity is * granted for any product per se or for any other function of any product. * * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. */ #include #include #include #include #include #include #include #include "gpsd.h" /* we only need the prototype */ static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) The following encoding technique is taken from RFC 1521 by Borenstein and Freed. It is reproduced here in a slightly edited form for convenience. A 65-character subset of US-ASCII is used, enabling 6 bits to be represented per printable character. (The extra 65th character, "=", is used to signify a special processing function.) The encoding process represents 24-bit groups of input bits as output strings of 4 encoded characters. Proceeding from left to right, a 24-bit input group is formed by concatenating 3 8-bit input groups. These 24 bits are then treated as 4 concatenated 6-bit groups, each of which is translated into a single digit in the base64 alphabet. Each 6-bit group is used as an index into an array of 64 printable characters. The character referenced by the index is placed in the output string. Table 1: The Base64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y Special processing is performed if fewer than 24 bits are available at the end of the data being encoded. A full encoding quantum is always completed at the end of a quantity. When fewer than 24 input bits are available in an input group, zero bits are added (on the right) to form an integral number of 6-bit groups. Padding at the end of the data is performed using the '=' character. Since all base64 input is an integral number of octets, only the ------------------------------------------------- following cases can arise: (1) the final quantum of encoding input is an integral multiple of 24 bits; here, the final unit of encoded output will be an integral multiple of 4 characters with no "=" padding, (2) the final quantum of encoding input is exactly 8 bits; here, the final unit of encoded output will be two characters followed by two "=" padding characters, or (3) the final quantum of encoding input is exactly 16 bits; here, the final unit of encoded output will be three characters followed by one "=" padding character. */ int 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]; 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) { size_t i; /* 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); } /* end */ gpsd-3.15/build.txt0000664000175000017500000005071012520742615012414 0ustar esresr= Building GPSD from source = This is a guide to building GPSD from a bare source tree. It includes guidance on how to cross-build the package. Some hints for people building binary packages are in packaging/readme.txt. (This file is marked up in asciidoc.) == Quick start == Under Linux, assuming you have all your build prerequisites in place, this line will do: scons && scons check && sudo scons udev-install If you get any errors, you need to read the detailed instructions that follow. == Supported platforms == Native-build success should be expected on the following platforms, provided you have the prerequisites listed in the next section installed: * Any desktop or server Linux distribution. * OpenWRT and derivatives such as CeroWRT. * FreeBSD, NetBSD, OpenBSD * Android, using the official Google toolchain from the NDK We consider failure to build and function on any of these platforms a serious bug; if you encounter it, please complain on the development list. Port difficulty to any system conforming to POSIX-2001.1 should be minimal. A Cygwin port is in progress but not complete. Cross-compilation to embedded Linuxes (in addition to the OpenWRT family) is usually fairly straightforward. An illustrative build transcript is included at the end of this file. == Check your build prerequisites == Necessary components for any build: |============================================================================ |C compiler | gpsd and client library are written in C |Python 2.x, x >= 6 | some code is generated from python scripts |scons | for executing the build recipe |============================================================================ Note: There must be a Python 2 interpreter named 'python' in your path, or the regression tests will fail. On some systems you might need to arrange this by putting symlink in a local directory on $PATH. === C compiler === C99 conformance is required in the compiler. The C code depends on one C11 feature (supported by GCC, clang, and pretty much any C compiler that also speaks C++): anonymous unions. We could eliminate these, but the cost would be source-level interface breakage if we have to move structure members in and out of unions. Some portions of the code using shared-memory segments are improved by the C11 stdatomic.h features for lockless concurrency. These are: the SHM export mode in shmexport.c, the code for writing clock corrections to NTP in ntpshmwrite.c, and the code for reading NTP corrections in ntpshmread.c. These features have been supported in GCC since 4.7 and clang since 3.1. GPSD is normally built and tested with GCC. Do not compile with a version older than 4.1.1; there are several known issues with older versions, including (a) non-standards-conformant floating-point generation that messes up regression testing, (b) a compiler bug affecting RTCM2 code generation, (c) the option -Wno-missing-field-initializers is unavailable, leading to a flood of warnings (this is due to generated code and cannot be fixed). clang produces a gpsd that passes all regression tests. === Python === You will need Python 2.5 or later for the build. While Python is required to build GPSD from source (the build uses some code generators in Python), it is not required to run the service daemon. In particular, you can cross-compile onto an embedded system without having to take Python with you. You will need both basic Python and (if your package system makes the distinction) the Python development package used for building C extensions. Usually these are called "python" and "python-dev". You will know you are missing the latter if your compilation fails because of a missing Python.h. The xgps test client requires the following Python extensions: |============================================================================ |gobject | GNOME object introspection library |pygtk | Python bindings for GTK |=========================================================================== === Scons === You will need scons version 2.3.0 (from 2013-03-02) or later to build the code. === Optional build components === Having the following optional components on your system will enable various additional capabilities and extensions: |============================================================================ |C++ compiler | allows building libgpsmm C++ wrapper for client library |Qt 4.53+ | allows building libQgpsmm C++ wrapper for client library |libcap | Capabilities library, allows 1PPS support under Linux |curses | curses screen-painting library, allows building cgps |============================================================================ If you have libusb-1.0.0 or later, the GPSD build will autodetect this and use it to discover Garmin USB GPSes, rather than groveling through /proc/bus/usb/devices (which has been deprecated by the Linux kernel team). You can build libQgpsmm if you have Qt (specifically QtCore and QtNetwork modules) version 4.5.3 or higher. You will also need a C++ compiler supported by Qt (tested on GCC 4.4.0/mingw on Windows and GCC 4.1.2 on linux). Please refer to Qt's documentation at http://qt.nokia.com/doc/4.6/platform-specific.html for platform specific building documentation For working with DBUS, you'll need the DBUS development headers and libraries installed. Under Debian/Ubuntu these are the packages libdbus-1-dev and libdbus-glib-1-dev. Under Ubuntu, the ncurses package you want is libncurses5-dev. Under Fedora, it's ncurses-devel. Depending on how your distribution packages ncurses you may also require libtinfo5, a separate terminfo library. On some older versions of Ubuntu (notably 11.10) there is a packaging defect that may cause your build to blow up in SCons. It's a missing package info file for the tinfo library. To fix this, install the file packaging/tinfo.pc in /usr/lib/pkgconfig/tinfo.pc. 13.10 fixed this. We've seen a report that compiling on the Raspberry Pi fails with a complaint about curses.h not being found. You need to install Raspbian's curses development library if this happens. For building from the source tree, or if you change the man page source, xslt and docbook xsl style files are used to generate nroff -man source from docbook xml. The following packages are used in this process: |============================================================================ |libxslt | xsltproc is used to build man pages from xml |docbook-xsl | style file for xml to man translation |xmlto | DocBook formatter program |asciidoc | DocBook front end with lighter markup |============================================================================ The build degrades gracefully in the absence of any of these. You should be able to tell from scons messages which extensions you will get. Under Ubuntu and most other Debian-derived distributions, an easy way to pick up the prerequisites is: "apt-get build-dep gpsd" If you are custom-building a Linux kernel for embedded deployment, you will need some subset of the following modules: |============================================================================ |pl2303 | Prolific Technology, Inc. PL2303 Serial Port |ftdi_sio | FTDI 8U232AM / FT232 |cypress_m8 | M8/CY7C64013 |cp210x | Cygnal Integrated Products devices |garmin_gps | Garmin USB mice including GPS-18 |cdc_am | USB Communication Device Class Abstract Control Model interface |============================================================================ These are listed in rough order of devices covered as of 2013; the PL23203 by itself accounts for over 70% of deployed USB mice. We recommend building with pl2303, ftdi_sio, cypress_m8, and cp210x. We've receive a bug report that suggests the Python test framework requires legacy PTY support (CONFIG_LEGACY_PTYS) from the Linux kernel. You should make sure you're in the 'dialout' group in order to have permission to use these devices. == How to build the software from source == To build gpsd for your host platform from source, simply call 'scons' in a working-directory copy. (Cross-build is described in a later section.) To clean the built files, call 'scons -c' . To clean scons' cache, call 'scons sconsclean'. Doing both should return your working directory to a near pristine state as far as building is concerned. Some user created files may remain, and source code changes will not have been reverted.. You can specify the installation prefix, as for an autotools build, by running "scons prefix=". The default value is "/usr/local". The environment variable DESTDIR also works in the usual way. If your scons fails with the complaint "No tool named 'textfile'", you need to upgrade it. This feature was introduced during the long interval after the 1.2.0 release; 1.2.1 and later versions will have it. If your linker run fails with missing math symbols, see the FIXME comment relating to implicit_links in the scons recipe; you probably need to build with implicit_link=no. If this happens, please report your platform, ideally along with a way of identifying it from Python, to the GPSD maintainers. If, while building, you see a complaint that looks like this: -------------------------------------------------------------------- I/O error : Attempt to load network entity http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd -------------------------------------------------------------------- it means the xmlto document formatter is failing to fetch a stylesheet it needs over the network. Probably this means you are doing a source build on a machine without live Internet access. The workaround for this is to temporarily remove xmlto from your command path so GPSD won't try building the documentation. The actual fix is to install DocBook on your machine so there will be a local copy of the stylesheet where xmlto can find it. After building, please run 'scons check' to test the correctness of the build. It is not necessary to install first. Python is required for regression tests. If any of the tests fail, you probably have a toolchain issue. The most common such problem is failures of strict C99 conformance in floating-point libraries. Once you have verified that the code is working, "scons install" will install it it in the system directories. "scons uninstall" will undo this. Note: because scons is a single-phase build system, this may recompile everything. If you want feature-configuration options, you need to specify them here. To enable hotplugging of USB GPSes under Linux, you may do 'scons udev-install' to put the appropriate udev rules and wrapper files in place. You will need php and php-gd installed to support the PHP web page. included with the distribution. To install it, copy the file 'gpsd.php' to your HTML document directory. Then see the post-installation instructions in INSTALL for how to configure it. == The leapseconds cache == Early in your build, the recipe will try to go over the Internet to one of several sources of current data on the leap-second offset in order to ensure that the file leapseconds.cache is up to date. This, in turn, is used to build a timebase.h include file. This procedure may fail if you are building in a network that requires an authenticating web proxy. If that occurs, the build will time out with a warning and a suggestion to use the leapfetch=no build option. Building with leapfetch=no may, in unusual circumstances, result in reported GPS time being off by a second or more. The circumstances are: 1. It has been less than 20 minutes since power-up; the GPS has not yet received the current leapsecond offset as part of the periodic ephemeris download. 2. One or more leap-second offset increments have been issued between when your GPSD source tree was cloned from the repository (or leapsecond.cache was later updated) and now. Leap-second increments, compensating for minute and unpredictable changes in the Earth's rotation, are occasionally issued by international time authorities. Note that the same failure can occur with any GPSD installation. But by refreshing leapseconds.cache you reduce the error window for leap-second offset bumps to affect your installation so that it begins as late as possible, at your build time rather than from when the source tree was copied. == Optional features == By giving command-line options to scons you can configure certain rarely-used optional features in, or compile standard features out to reduce gpsd's footprint. "scons --help" will tell the story; look under "Local Options" and consult the source code if in doubt. Here are a few of the more important feature switches. Each description begins with the default for the switch. pps=yes: for small embedded systems and those without threading, it is possible to build gpsd without thread support if you build with pps=no. You'll lose support for updating the clock from PPS pulses. dbus_export=no: for systems using DBUS: gpsd includes support for shipping fixes as DBUS notifications, compiled in by default. This may lead to complaint messages during testing on systems that don't support DBUS. Build with the option "dbus_export=no" to disable it qt=yes: libQgpsmm is a Qt version of the libgps/libgpsmm pair. Thanks to the multi-platform approach of Qt, it allows the gpsd client library to be available on all the Qt supported platforms. Please see http://qt.nokia.com/doc/4.6/supported-platforms.html for a status of Qt supported platforms as of version 4.6. minimal=yes: people building for extremely constrained environments may want to set this. It changes the default for all boolean (feature) options to false; thus, you get *only* the options you specify on the command line. Thus, for example, if you want to turn off all features except socket export and nmea0183, ------------------------------------------------ scons minimal=yes socket_export=yes nmea0183=yes ------------------------------------------------ will do that. == Port and toolchain testing == 'scons check' will run a comprehensive regression-test suite. You should do this, at minimum, every time you build from source on a new machine type. GPSD does enough bit-twiddling and floating point that it is very sensitive to toolchain problems; you'll want to be sure those aren't going to bite you in production. So the tests will run fast and be easy to do often, we make the test framework shove data through the pty and socket layers *way* faster than would ever occur in production. If you get regression-test failures that aren't repeatable and look like the test framework is sporadically failing to feed the last line or two of test loads, try using the slow=yes option with scons check. If that fails, try increasing the delay constants in gps/fake.py. If you have to do this, please report your experience to the GPSD maintainers. For instructions on how to live-test the software, see the file INSTALL. == Reverting to a clean state == The scons equivalent of 'make clean' is 'scons -c' or 'scons --clean'. This will revert your source tree to a clean state nearly as though you had just cloned or downloaded it; some scons housekeeping stuff is left in place. If you interrupted a regression test, 'scons testclean' will remove generated test programs. You can run 'scons sconsclean' to temove most of the configuration state that scons keeps. Be aware, however, thatr doing this can confuse scons; you may need to run 'scons --config=force' afterwards to make your build succeed. == Notes on Android: Samuel Cuella reports: I use the official google toolchain from the Android NDK (Native Development Kit). You can also use the toolchain from code sourcery I guess. I cross-compile from a "regular" (with GNU userland) linux box. People who port software from linux to android tend to use either the NDK or code sourcery's. If you are going to include "official" guidelines, I would go for recommending the official toolchain from the NDK. Here are the scons switches I use: scons wordsize=32 snapshot=off arch=arm sample=shell scons -j3 prefix=/usr libdir=$prefix/lib udevdir=/lib/udev gpsd_user=gpsd gpsd_group=uucp socket_export=1 nmea0183=1 sirf=1 With the following environment variables: TOOL_HOME=/home/samuel/android-official-last/ export TOOL_PREFIX=${TOOL_HOME}/bin/arm-linux-androideabi export CXX=$TOOL_PREFIX-g++ export AR=$TOOL_PREFIX-ar export RANLIB=$TOOL_PREFIX-ranlib export CC=$TOOL_PREFIX-gcc export LD=$TOOL_PREFIX-ld export CCFLAGS="-march=armv7-a -mtune=cortex-a8 -mfpu=vfp" export ARM_TARGET_LIB=${TOOL_HOME}/sysroot scons wordsize=32 snapshot=off arch=arm sample=shell == Cross-building == The scons recipe is intended to support cross-building, in particular for embedded deployment of the software. A session transcript illustrating how to do that, with some routine messages suppressed and replaced with [...], follows. The script assumes you're cloning from the GPSD project site or a mirror. Notes and explanation follow the transcript. ---- $ git clone [...] Cloning into gpsd... [...] $ cd gpsd $ cp ../.scons-option-cache . $ cat .scons-option-cache libgpsmm = False libQgpsmm = False python = False prefix = '/work/buildroot/output/staging/usr/' sysroot = '/work/buildroot/output/staging/' target = 'arm-indigo-linux-gnueabi' $ scons scons: Reading SConscript files ... [...] Altered configuration variables: libgpsmm = False (default True): build C++ bindings libQgpsmm = False (default True): build QT bindings python = False (default True): build Python support and modules. prefix = /work/buildroot/output/staging/usr/ (default /usr/local): installation directory prefix sysroot = /work/buildroot/output/staging (default ): cross-development system root target = arm-indigo-linux-gnueabi (default ): cross-development target scons: done reading SConscript files. scons: Building targets ... substituter(["jsongen.py"], ["jsongen.py.in"]) chmod -w jsongen.py chmod +x jsongen.py rm -f ais_json.i && /usr/bin/python jsongen.py --ais --target=parser > ais_json.i && chmod a-w ais_json.i Creating 'gpsd_config.h' arm-indigo-linux-gnueabi-gcc -o ais_json.os -c --sysroot=/work/buildroot/output/staging/ -Wextra -Wall -Wno-uninitialized -Wno-missing-field-initializers -Wcast-align -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith -Wreturn-type -D_GNU_SOURCE -O2 -fPIC ais_json.c arm-indigo-linux-gnueabi-gcc -o daemon.os -c --sysroot=/work/buildroot/output/staging/ -Wextra -Wall -Wno-uninitialized -Wno-missing-field-initializers -Wcast-align -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith -Wreturn-type -D_GNU_SOURCE -O2 -fPIC daemon.c Creating 'gpsd.h' [...] chmod -w maskaudit.py chmod +x maskaudit.py rm -f gps_maskdump.c && /usr/bin/python maskaudit.py -c . > gps_maskdump.c && chmod a-w gps_maskdump.c arm-indigo-linux-gnueabi-gcc -o gps_maskdump.os -c --sysroot=/work/buildroot/output/staging/ -Wextra -Wall -Wno-uninitialized -Wno-missing-field-initializers -Wcast-align -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith -Wreturn-type -D_GNU_SOURCE -O2 -fPIC gps_maskdump.c [..] scons: done building targets. $ file gpsd gpsd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.36, not stripped ---- The author of this transcript notes: The sysroot option tells the compiler and linker to use libraries and headers from the given path as if they were placed at / prefix. During this build the option allows linking with target ncurses (with the option of having more packages at the --sysroot path) and including correct headers without specifying -I and -L options. In the options cache file gpsd is configured to install to /work/buildroot/output/staging/usr path, so gpsd clients could be compiled against libgps.so using /work/buildroot/output/staging as sysroot option. "arm-indigo-linux-gnueabi" as target means that arm-indigo-linux-gnueabi-gcc and related tools are available in PATH; your cross-compiler is likely to have a different target prefix. You may also find it useful to set manbuild=no. == Autostarting the daemon == The preferred way to start gpsd is on-demand by a hotplug script detecting USB device activations. Look at the gpsd.rules and gpsd.hotplug files to see how this is accomplished. Relevant productions in the build recipe are "udev-install" and "udev-uninstall"; relevant build options include "udevdir". If you for some reason need to start gpsd unconditionally at boot time (in particular, if you need to support RS232 devices) there's a model init.d script under packaging/deb and a systemd setup under systemd/. // end gpsd-3.15/cgps.c0000664000175000017500000006162412520742615011662 0ustar esresr/* * Copyright (c) 2005 Jeff Francis * BSD terms apply: see the filr COPYING in the distribution root for details. */ /* Jeff Francis jeff@gritch.org Kind of a curses version of xgps for use with gpsd. */ /* * The True North compass fails with current gpsd versions for reasons * the dev team has been unable to diagnose due to not having test hardware. * The support for it is conditioned out in order to simplify moving * to the new JSON-based protocol and reduce startup time. */ #undef TRUENORTH /* ================================================================== These #defines should be modified if changing the number of fields to be displayed. ================================================================== */ /* This defines how much overhead is contained in the 'datawin' window (eg, box around the window takes two lines). */ #define DATAWIN_OVERHEAD 2 /* This defines how much overhead is contained in the 'satellites' window (eg, box around the window takes two lines, plus the column headers take another line). */ #define SATWIN_OVERHEAD 3 /* This is how many display fields are output in the 'datawin' window when in GPS mode. Change this value if you add or remove fields from the 'datawin' window for the GPS mode. */ #define DATAWIN_GPS_FIELDS 8 /* Count of optional fields that we'll display if we have the room. */ #define DATAWIN_OPTIONAL_FIELDS 7 /* This is how many display fields are output in the 'datawin' window when in COMPASS mode. Change this value if you add or remove fields from the 'datawin' window for the COMPASS mode. */ #define DATAWIN_COMPASS_FIELDS 6 /* This is how far over in the 'datawin' window to indent the field descriptions. */ #define DATAWIN_DESC_OFFSET 5 /* This is how far over in the 'datawin' window to indent the field values. */ #define DATAWIN_VALUE_OFFSET 17 /* This is the width of the 'datawin' window. It's recommended to keep DATAWIN_WIDTH + SATELLITES_WIDTH <= 80 so it'll fit on a "standard" 80x24 screen. */ #define DATAWIN_WIDTH 45 /* This is the width of the 'satellites' window. It's recommended to keep DATAWIN_WIDTH + SATELLITES_WIDTH <= 80 so it'll fit on a "standard" 80x24 screen. */ #define SATELLITES_WIDTH 35 /* ================================================================ You shouldn't have to modify any #define values below this line. ================================================================ */ /* This is the minimum size we'll accept for the 'datawin' window in GPS mode. */ #define MIN_GPS_DATAWIN_SIZE (DATAWIN_GPS_FIELDS + DATAWIN_OVERHEAD) /* And the maximum size we'll try to use */ #define MAX_GPS_DATAWIN_SIZE (DATAWIN_GPS_FIELDS + DATAWIN_OPTIONAL_FIELDS + DATAWIN_OVERHEAD) /* This is the minimum size we'll accept for the 'datawin' window in COMPASS mode. */ #define MIN_COMPASS_DATAWIN_SIZE (DATAWIN_COMPASS_FIELDS + DATAWIN_OVERHEAD) /* This is the maximum number of satellites gpsd can track. */ #define MAX_POSSIBLE_SATS (MAXCHANNELS - 2) /* This is the maximum size we need for the 'satellites' window. */ #define MAX_SATWIN_SIZE (MAX_POSSIBLE_SATS + SATWIN_OVERHEAD) #include #include #include #include #include #include #include #include #include #include #include #include "gpsd_config.h" #include "gps.h" #include "compiler.h" /* for UNUSED */ #include "gpsdclient.h" #include "revision.h" 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 float altfactor = METERS_TO_FEET; static float speedfactor = MPS_TO_MPH; static char *altunits = "ft"; static char *speedunits = "mph"; static struct fixsource_t source; #ifdef CLIENTDEBUG_ENABLE static int debug; #endif /* CLIENTDEBUG_ENABLE */ static WINDOW *datawin, *satellites, *messages; 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; #endif /* TRUENORTH */ /* pseudo-signals indicating reason for termination */ #define CGPS_QUIT 0 /* voluntary yterminastion */ #define GPS_GONE -1 /* GPS device went away */ #define GPS_ERROR -2 /* low-level failure in GPS read */ #define GPS_TIMEOUT -3 /* low-level failure in GPS waiting */ /* Function to call when we're all done. Does a bit of clean-up. */ static void die(int sig) { if (!isendwin()) { /* Move the cursor to the bottom left corner. */ (void)mvcur(0, COLS - 1, LINES - 1, 0); /* Put input attributes back the way they were. */ (void)echo(); /* Done with curses. */ (void)endwin(); } /* We're done talking to gpsd. */ (void)gps_close(&gpsdata); switch (sig) { case CGPS_QUIT: break; case GPS_GONE: (void)fprintf(stderr, "cgps: GPS hung up.\n"); break; case GPS_ERROR: (void)fprintf(stderr, "cgps: GPS read returned error\n"); break; case GPS_TIMEOUT: (void)fprintf(stderr, "cgps: GPS timeout\n"); break; default: (void)fprintf(stderr, "cgps: caught signal %d\n", sig); break; } /* Bye! */ exit(EXIT_SUCCESS); } static enum deg_str_type deg_type = deg_dd; static void windowsetup(void) /* inotialize curses and set up screen windows */ { /* 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 can be fit in a * window the size of the GPS report window. We have to set * the limit that way because MAXCHANNELS has been made large * in order to prepare for survey-grade receivers.. * * 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; /* Fire up curses. */ (void)initscr(); (void)noecho(); getmaxyx(stdscr, ysize, xsize); #ifdef TRUENORTH 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) { 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)refresh(); (void)sleep(5); die(0); } } else #endif /* TRUENORTH */ { if (ysize > MAX_GPS_DATAWIN_SIZE) { raw_flag = true; window_length = MAX_GPS_DATAWIN_SIZE; } else if (ysize == MAX_GPS_DATAWIN_SIZE) { raw_flag = false; window_length = MAX_GPS_DATAWIN_SIZE; } else if (ysize > MIN_GPS_DATAWIN_SIZE) { raw_flag = true; window_length = MIN_GPS_DATAWIN_SIZE; } else if (ysize == MIN_GPS_DATAWIN_SIZE) { raw_flag = false; window_length = MIN_GPS_DATAWIN_SIZE; } else { (void)mvprintw(0, 0, "Your screen must be at least 80x%d to run cgps.", MIN_GPS_DATAWIN_SIZE); (void)refresh(); (void)sleep(5); die(0); } display_sats = window_length - SATWIN_OVERHEAD - (int)raw_flag; } #ifdef TRUENORTH /* Set up the screen for either a compass or a gps receiver. */ if (compass_flag) { /* We're a compass, set up accordingly. */ datawin = newwin(window_length, DATAWIN_WIDTH, 0, 0); (void)nodelay(datawin, (bool) TRUE); if (raw_flag) { messages = newwin(0, 0, window_length, 0); (void)scrollok(messages, true); (void)wsetscrreg(messages, 0, ysize - (window_length)); } (void)refresh(); /* Do the initial field label setup. */ (void)mvwprintw(datawin, 1, DATAWIN_DESC_OFFSET, "Time:"); (void)mvwprintw(datawin, 2, DATAWIN_DESC_OFFSET, "Heading:"); (void)mvwprintw(datawin, 3, DATAWIN_DESC_OFFSET, "Pitch:"); (void)mvwprintw(datawin, 4, DATAWIN_DESC_OFFSET, "Roll:"); (void)mvwprintw(datawin, 5, DATAWIN_DESC_OFFSET, "Dip:"); (void)mvwprintw(datawin, 6, DATAWIN_DESC_OFFSET, "Rcvr Type:"); (void)wborder(datawin, 0, 0, 0, 0, 0, 0, 0, 0); } else #endif /* TRUENORTH */ { /* We're a GPS, set up accordingly. */ 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); (void)scrollok(messages, true); (void)wsetscrreg(messages, 0, ysize - (window_length)); } (void)refresh(); /* Do the initial field label setup. */ (void)mvwprintw(datawin, 1, DATAWIN_DESC_OFFSET, "Time:"); (void)mvwprintw(datawin, 2, DATAWIN_DESC_OFFSET, "Latitude:"); (void)mvwprintw(datawin, 3, DATAWIN_DESC_OFFSET, "Longitude:"); (void)mvwprintw(datawin, 4, DATAWIN_DESC_OFFSET, "Altitude:"); (void)mvwprintw(datawin, 5, DATAWIN_DESC_OFFSET, "Speed:"); (void)mvwprintw(datawin, 6, DATAWIN_DESC_OFFSET, "Heading:"); (void)mvwprintw(datawin, 7, DATAWIN_DESC_OFFSET, "Climb:"); (void)mvwprintw(datawin, 8, DATAWIN_DESC_OFFSET, "Status:"); /* Note that the following 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 == MAX_GPS_DATAWIN_SIZE) { (void)mvwprintw(datawin, 9, DATAWIN_DESC_OFFSET, "Longitude Err:"); (void)mvwprintw(datawin, 10, DATAWIN_DESC_OFFSET, "Latitude Err:"); (void)mvwprintw(datawin, 11, DATAWIN_DESC_OFFSET, "Altitude Err:"); (void)mvwprintw(datawin, 12, DATAWIN_DESC_OFFSET, "Course Err:"); (void)mvwprintw(datawin, 13, DATAWIN_DESC_OFFSET, "Speed Err:"); /* it's actually esr that thought *these* were interesting */ (void)mvwprintw(datawin, 14, DATAWIN_DESC_OFFSET, "Time offset:"); (void)mvwprintw(datawin, 15, DATAWIN_DESC_OFFSET, "Grid Square:"); } (void)wborder(datawin, 0, 0, 0, 0, 0, 0, 0, 0); (void)mvwprintw(satellites, 1, 1, "PRN: Elev: Azim: SNR: Used:"); (void)wborder(satellites, 0, 0, 0, 0, 0, 0, 0, 0); } } static void resize(int sig UNUSED) /* cope with terminal resize */ { if (!isendwin()) { (void)endwin(); windowsetup(); } } #ifdef TRUENORTH /* This gets called once for each new compass sentence. */ static void update_compass_panel(struct gps_data_t *gpsdata) { char scr[128]; /* Print time/date. */ 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) { (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) { (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); 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) (void)snprintf(scr, sizeof(scr), "%.1f", gpsdata->fix.altitude); else (void)snprintf(scr, sizeof(scr), "n/a"); (void)mvwprintw(datawin, 5, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr); /* When we need to fill in receiver type again, do it here. */ (void)mvwprintw(datawin, 6, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr); /* Be quiet if the user requests silence. */ if (!silent_flag && raw_flag) { (void)waddstr(messages, message); } (void)wrefresh(datawin); if (raw_flag) { (void)wrefresh(messages); } } #endif /* TRUENORTH */ static void update_gps_panel(struct gps_data_t *gpsdata) /* This gets called once for each new GPS sentence. */ { int newstate; char scr[128], *s; /* 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) { int i; if (display_sats >= MAX_POSSIBLE_SATS) { for (i = 0; i < MAX_POSSIBLE_SATS; i++) { if (i < gpsdata->satellites_visible) { (void)snprintf(scr, sizeof(scr), " %3d %02d %03d %02d %c", gpsdata->skyview[i].PRN, gpsdata->skyview[i].elevation, gpsdata->skyview[i].azimuth, (int)gpsdata->skyview[i].ss, gpsdata->skyview[i].used ? 'Y' : 'N'); } else { (void)strlcpy(scr, "", sizeof(scr)); } (void)mvwprintw(satellites, i + 2, 1, "%-*s", SATELLITES_WIDTH - 3, scr); } } else { int n = 0; for (i = 0; i < MAX_POSSIBLE_SATS; i++) { if (n < display_sats) { if ((i < gpsdata->satellites_visible) && (gpsdata->skyview[i].used || (gpsdata->satellites_visible <= display_sats))) { (void)snprintf(scr, sizeof(scr), " %3d %02d %03d %02d %c", gpsdata->skyview[i].PRN, gpsdata->skyview[i].elevation, gpsdata->skyview[i].azimuth, (int)gpsdata->skyview[i].ss, gpsdata->skyview[i].used ? 'Y' : 'N'); (void)mvwprintw(satellites, n + 2, 1, "%-*s", SATELLITES_WIDTH - 3, scr); n++; } } } if (n < display_sats) { for (i = n; i <= display_sats; i++) { (void)mvwprintw(satellites, i + 2, 1, "%-*s", SATELLITES_WIDTH - 3, ""); } } } } /* Print time/date. */ 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 latitude. */ 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)), (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) { (void)snprintf(scr, sizeof(scr), "%s %c", 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); 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); 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) { double magheading = true2magnetic(gpsdata->fix.latitude, gpsdata->fix.longitude, gpsdata->fix.track); if (!magnetic_flag || isnan(magheading) != 0) { (void)snprintf(scr, sizeof(scr), "%.1f deg (true)", gpsdata->fix.track); } else { (void)snprintf(scr, sizeof(scr), "%.1f deg (mag) ", magheading); } } 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) (void)snprintf(scr, sizeof(scr), "%.1f %s/min", gpsdata->fix.climb * altfactor * 60, altunits); else (void)snprintf(scr, sizeof(scr), "n/a"); (void)mvwprintw(datawin, 7, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr); /* Fill in the GPS status and the time since the last state * change. */ if (gpsdata->online == 0) { newstate = 0; (void)snprintf(scr, sizeof(scr), "OFFLINE"); } else { newstate = gpsdata->fix.mode; /* * DGPS */ switch (gpsdata->fix.mode) { case MODE_2D: (void)snprintf(scr, sizeof(scr), "2D FIX (%d secs)", (int)(time(NULL) - status_timer)); break; case MODE_3D: (void)snprintf(scr, sizeof(scr), "3D FIX (%d secs)", (int)(time(NULL) - status_timer)); break; default: (void)snprintf(scr, sizeof(scr), "NO FIX (%d secs)", (int)(time(NULL) - status_timer)); break; } } (void)mvwprintw(datawin, 8, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr); /* Note that the following 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 permanence. They're only * there in the first place because I arbitrarily thought they * sounded interesting. ;^) */ if (window_length >= (MIN_GPS_DATAWIN_SIZE + 5)) { /* Fill in the estimated horizontal position error. */ if (isnan(gpsdata->fix.epx) == 0) (void)snprintf(scr, sizeof(scr), "+/- %d %s", (int)(gpsdata->fix.epx * altfactor), altunits); else (void)snprintf(scr, sizeof(scr), "n/a"); (void)mvwprintw(datawin, 9, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22, scr); if (isnan(gpsdata->fix.epy) == 0) (void)snprintf(scr, sizeof(scr), "+/- %d %s", (int)(gpsdata->fix.epy * altfactor), altunits); else (void)snprintf(scr, sizeof(scr), "n/a"); (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); else (void)snprintf(scr, sizeof(scr), "n/a"); (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)); else (void)snprintf(scr, sizeof(scr), "n/a"); (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); else (void)snprintf(scr, sizeof(scr), "n/a"); (void)mvwprintw(datawin, 13, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22, scr); /* Fill in the time offset. */ if (isnan(gpsdata->fix.time) == 0) (void)snprintf(scr, sizeof(scr), "%.3f", (double)(timestamp()-gpsdata->fix.time)); else (void)snprintf(scr, sizeof(scr), "n/a"); (void)mvwprintw(datawin, 14, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22, scr); /* Fill in the grid square (esr thought *this* one was interesting). */ if (isnan(gpsdata->fix.longitude)==0 && isnan(gpsdata->fix.latitude)==0) s = maidenhead(gpsdata->fix.latitude,gpsdata->fix.longitude); else s = "n/a"; (void)mvwprintw(datawin, 15, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22, s); } /* Be quiet if the user requests silence. */ if (!silent_flag && raw_flag && (s = (char *)gps_data(gpsdata)) != NULL) { char *p; for (p = s + strlen(s); --p > s && isspace((unsigned char) *p); *p = '\0') ; (void)wprintw(messages, "%s\n", s); } /* Reset the status_timer if the state has changed. */ if (newstate != state) { status_timer = time(NULL); state = newstate; } (void)wrefresh(datawin); (void)wrefresh(satellites); if (raw_flag) { (void)wrefresh(messages); } } static void usage(char *prog) { (void)fprintf(stderr, "Usage: %s [-h] [-V] [-l {d|m|s}] [server[:port:[device]]]\n\n" " -h Show this help, then exit\n" " -V Show version, then exit\n" " -s Be silent (don't print raw gpsd data)\n" " -l {d|m|s} Select lat/lon format\n" " d = DD.dddddd\n" " 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); exit(EXIT_FAILURE); } /* * No protocol dependencies above this line */ int main(int argc, char *argv[]) { int option; unsigned int flags = WATCH_ENABLE; int wait_clicks = 0; /* cycles to wait before gpsd timeout */ switch (gpsd_units()) { case imperial: altfactor = METERS_TO_FEET; altunits = "ft"; speedfactor = MPS_TO_MPH; speedunits = "mph"; break; case nautical: altfactor = METERS_TO_FEET; altunits = "ft"; speedfactor = MPS_TO_KNOTS; speedunits = "knots"; break; case metric: altfactor = 1; altunits = "m"; speedfactor = MPS_TO_KPH; speedunits = "kph"; break; default: /* leave the default alone */ break; } /* Process the options. Print help if requested. */ while ((option = getopt(argc, argv, "hVl:smu:D:")) != -1) { switch (option) { #ifdef CLIENTDEBUG_ENABLE case 'D': debug = atoi(optarg); gps_enable_debug(debug, stderr); break; #endif /* CLIENTDEBUG_ENABLE */ case 'm': magnetic_flag = true; break; case 's': silent_flag = true; break; case 'u': switch (optarg[0]) { case 'i': altfactor = METERS_TO_FEET; altunits = "ft"; speedfactor = MPS_TO_MPH; speedunits = "mph"; continue; case 'n': altfactor = METERS_TO_FEET; altunits = "ft"; speedfactor = MPS_TO_KNOTS; speedunits = "knots"; continue; case 'm': altfactor = 1; altunits = "m"; speedfactor = MPS_TO_KPH; speedunits = "kph"; continue; default: (void)fprintf(stderr, "Unknown -u argument: %s\n", optarg); } break; case 'V': (void)fprintf(stderr, "%s: %s (revision %s)\n", argv[0], VERSION, REVISION); exit(EXIT_SUCCESS); case 'l': switch (optarg[0]) { case 'd': deg_type = deg_dd; continue; case 'm': deg_type = deg_ddmm; continue; case 's': deg_type = deg_ddmmss; continue; default: (void)fprintf(stderr, "Unknown -l argument: %s\n", optarg); } break; case 'h': default: usage(argv[0]); break; } } /* Grok the server, port, and device. */ if (optind < argc) { gpsd_source_spec(argv[optind], &source); } else gpsd_source_spec(NULL, &source); /* Open the stream to gpsd. */ if (gps_open(source.server, source.port, &gpsdata) != 0) { (void)fprintf(stderr, "cgps: no gpsd running or network error: %d, %s\n", errno, gps_errstr(errno)); exit(EXIT_FAILURE); } /* note: we're assuming BSD-style reliable signals here */ (void)signal(SIGINT, die); (void)signal(SIGHUP, die); (void)signal(SIGWINCH, resize); windowsetup(); status_timer = time(NULL); if (source.device != NULL) flags |= WATCH_DEVICE; (void)gps_stream(&gpsdata, flags, source.device); /* heart of the client */ for (;;) { int c; /* wait 1/2 second for gpsd */ if (!gps_waiting(&gpsdata, 500000)) { /* 240 tries at .5 Sec a try is a 2 minute timeout */ if ( 240 < wait_clicks++ ) die(GPS_TIMEOUT); } else { wait_clicks = 0; errno = 0; if (gps_read(&gpsdata) == -1) { fprintf(stderr, "cgps: socket error 4\n"); die(errno == 0 ? GPS_GONE : GPS_ERROR); } else { /* Here's where updates go now that things are established. */ #ifdef TRUENORTH if (compass_flag) update_compass_panel(&gpsdata); else #endif /* TRUENORTH */ update_gps_panel(&gpsdata); } } /* Check for user input. */ c = wgetch(datawin); switch (c) { /* Quit */ case 'q': die(CGPS_QUIT); break; /* Toggle spewage of raw gpsd data. */ case 's': silent_flag = !silent_flag; break; /* Clear the spewage area. */ case 'c': (void)werase(messages); break; default: break; } } } gpsd-3.15/clock_gettime.c0000664000175000017500000000225712506317026013532 0ustar esresr/* * Simulate ANSI/POSIX conformance on platforms that don't have it * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include "compiler.h" #ifdef __MACH__ #include #include #endif #ifndef HAVE_CLOCK_GETTIME int clock_gettime(clockid_t clk_id UNUSED, struct timespec *tp) { #ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time clock_serv_t cclock; mach_timespec_t mts; host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); tp->tv_sec = mts.tv_sec; tp->tv_nsec = mts.tv_nsec; #else struct timeval tv; if (gettimeofday(&tv, NULL) < 0) return -1; tp->ts_sec = tv.tv_sec; tp->ts_nsec = tv.tv_usec * 1000; /* paranoid programming */ if (1000000 <= (tv)->tv_usec) { (tv)->tv_usec -= 1000000; (tv)->tv_sec++; } else if (0 > (tv)->tv_usec) { (tv)->tv_usec += 1000000; (tv)->tv_sec--; } #endif /* __MACH__ */ return 0; } #endif /* HAVE_CLOCK_GETTIME */ /* end */ gpsd-3.15/compiler.h0000664000175000017500000000472212532614165012542 0ustar esresr/* * compiler.h - compiler specific macros * * This software is distributed under a BSD-style license. See the * file "COPYING" in the toop-level directory of the distribution for details. */ #ifndef _GPSD_COMPILER_H_ #define _GPSD_COMPILER_H_ /* * Tell GCC that we want thread-safe behavior with _REENTRANT; * in particular, errno must be thread-local. * Tell POSIX-conforming implementations with _POSIX_THREAD_SAFE_FUNCTIONS. * See http://www.unix.org/whitepapers/reentrant.html */ #ifndef _REENTRANT #define _REENTRANT #endif #ifndef _POSIX_THREAD_SAFE_FUNCTIONS #define _POSIX_THREAD_SAFE_FUNCTIONS #endif #include "gpsd_config.h" /* is HAVE_STDATOMIC defined? */ /* Macro for declaring function with printf-like arguments. */ # if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) #define PRINTF_FUNC(format_index, arg_index) \ __attribute__((__format__(__printf__, format_index, arg_index))) # else #define PRINTF_FUNC(format_index, arg_indx) #endif /* Macro for declaring function arguments unused. */ #if defined(__GNUC__) || defined(__clang__) #define UNUSED __attribute__((unused)) #else #define UNUSED #endif /* * Macro for compile-time checking if argument is an array. * It expands to constant expression with int value 0. */ #if defined(__GNUC__) #define COMPILE_CHECK_IS_ARRAY(arr) ( \ 0 * (int) sizeof(({ \ struct { \ int unused_int; \ typeof(arr) unused_arr; \ } zero_init = {0}; \ typeof(arr) arg_is_not_array UNUSED = { \ zero_init.unused_arr[0], \ }; \ 1; \ })) \ ) #else #define COMPILE_CHECK_IS_ARRAY(arr) 0 #endif /* Needed because 4.x versions of GCC are really annoying */ #define ignore_return(funcall) \ do { \ UNUSED ssize_t locresult = (funcall); \ assert(locresult != -23); \ } while (0) #ifdef HAVE_STDATOMIC_H #if !defined(__COVERITY__) && !defined(__cplusplus) #include #endif /* __COVERITY__ || __cplusplus */ #endif /* HAVE_STDATOMIC_H */ #ifdef HAVE_OSATOMIC_H #include #endif /* HAVE_STDATOMIC_H */ static inline void memory_barrier(void) /* prevent instruction reordering across any call to this function */ { #ifdef _STDATOMIC_H #ifndef __COVERITY__ atomic_thread_fence(memory_order_seq_cst); #endif /* __COVERITY__ */ #elif defined(HAVE_OSATOMIC_H) OSMemoryBarrier(); #elif defined(__GNUC__) asm volatile ("" : : : "memory"); #endif /* STD_ATOMIC_H */ } #endif /* _GPSD_COMPILER_H_ */ gpsd-3.15/contrib/.gitignore0000664000175000017500000000005212460513551014174 0ustar esresrashctl binlog binreplay lla2ecef motosend gpsd-3.15/contrib/README0000664000175000017500000000616212506173455013102 0ustar esresrThe following tools are not production-ready. They are included only as conveniences, examples or rudimetary starting points for other development efforts. binlog and binreplay are probably only useful for people developing drivers for new protocols, when gpsfake does not yet know what to do with a log file. These utilities are not particularly clever - they merely slurp a tty's output into a file, or spray the contents of a file out of a tty. ashctl might be used to reset an uncooperative Ashtech receiver to a usable state. For whatever reason sometimes they do not respond to a protocol switch command; this spams the receiver with configuration commands, and hopefully it listens. motosend is like ashctl, but for receivers that use the motorola protocol (like motorola oncore or rockwell jupiter). it's a little buggy with syncing up to the start of a packet, but it'll send control strings OK. lla2ecef transforms latitude/longitude/altitude (aka north-east-up or local tangential plane) coordinates into the earth-centered-earth-fixed frame. If invoked as "ecef2lla" it will transform coordinates in the opposite manner. ------ The files below have been tested to work with gpsd v3.14, as of 2015-03-23 webgps.py draws a sky view of the satellites and their tracks using HTML5. It needs to run continuously in order to build a history and generate the satellite tracks. Your browser must be able to display the element to display the satellite view properly. webgps.py can be called with the argument "c" to run continously, with an integer duration and a unit suffix to run this long (units allowed are "s", "m", "h" and "d", e.g. "4h"), or without argument to create a snapshot of the current sat view. ntpoffset generate an estimate of your GPS's offset from a peerstats file. For instructions on how to use this script, see the GPSD Time Service HOWTO in this distrubution, in the www/ subdirectory. ppscheck watches a specified serial device for changes in handshake lines CD, RI, and CTS by running ioctl(...., TIOCMIWAIT, ...) in a loop. When it sees a state change it emits a timestamped line of output dumping the state of the handshake signals. It's useful for checking whether a device is emitting 1PPS. There is troubleshooting advice in the header comment. skyview.php is used to generate pictures of your skyview, and may be used to help determine if a given antenna placement is appropriate for some purpose. This tool take a count of samples to collect from GPSD, and outputs an image of accumulated SV position and signal strength. It is sometimes entertaining to "see" occulted SVs using multipath. You must have the PHP-GD library installed to use this script. ------ The files below do not work with current versions of gpsd. [The GPSD protocol changed in 2.90, and messages emitted are no longer of the form that this script expects.] maxsats.pl analyzes a collection of "Y" messages and outputs records describing periods of excellent visibility (ie. 10 or more PRNs tracked). With over 30 SVs on orbit, there are periods where 14 PRNs are above the horizon, 13 are tracking, and at least 12 are actually used in a solution. gpsd-3.15/contrib/SConstruct0000664000175000017500000000121412506064430014235 0ustar esresr# This is a skeleton recipe to simplify building some of these little # utilities. They probably won't be useful to many users, and they probably # won't get used on a daily basis, but someone might find them useful for # tinkering with their gear. ashctl = Program("ashctl", ["ashctl.c", "../strl.c"]) binlog = Program("binlog", "binlog.c") binreplay = Program("binreplay", "binreplay.c", parse_flags=['-lutil']) lla2ecef = Program("lla2ecef", "lla2ecef.c", parse_flags=['-lm']) motosend = Program("motosend", ["motosend.c", "../strl.c"]) ppscheck = Program("ppscheck", "ppscheck.c") Default(ashctl, binlog, binreplay, lla2ecef, motosend, ppscheck) gpsd-3.15/contrib/ashctl.c0000664000175000017500000001110512461156335013633 0ustar esresr/* * This file is Copyright (c)2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #define MODE_RAW 0 #define MODE_NORMAL 1 #define ASHSPD_9600 5 #define ASHSPD_57600 8 static int nmea_send(int , const char *, ... ); static void nmea_add_checksum(char *); static void serial_speed(int, int); static void config_raw(int); static void config_normal(int); int main(int argc, char **argv) { int i, speed, op, fd; int rates[] = {57600, 9600, 115200, 4800, 19200, 1200, 0}; /* RTFM */ char buf[BUFSIZ]; /* check number of args */ if (argc != 3){ u: fprintf(stderr, "usage: ashctl [raw|normal]\n" "normal = 9600, GGA+GSA+GSV+RMC+ZDA\n" "raw = 57600, normal+XPG+POS+SAT+MCA+PBN+SNV\n" ); return 1; } /* validate command */ if (strcmp(argv[2], "raw") == 0) op = MODE_RAW; else if (strcmp(argv[2], "normal") == 0) op = MODE_NORMAL; else goto u; if ((fd = open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY, 0644)) == -1) err(1, "open"); i = 0; /* spam receiver w/ config messages */ while((speed = rates[i++])){ fprintf(stderr, "\010\010\010\010\010\010\010\010" "\010\010\010\010\010\010\010\010" "\010\010\010\010\010\010\010\010" "\010\010\010\010\010\010\010\010" "configuring at %d bps... ", speed); serial_speed(fd, speed); if (op == MODE_NORMAL) { config_normal(fd); serial_speed(fd, 9600); } else if (op == MODE_RAW) { config_raw(fd); serial_speed(fd, 57600); } sleep(1); i = read(fd, buf, BUFSIZ-1); buf[i] = '\0'; if (strstr(buf, "$PASH") || strstr(buf, "$GP")) goto done; } done: fprintf(stderr, "\010\010\010\010\010\010\010\010" "\010\010\010\010\010\010\010\010" "\010\010\010\010\010\010\010\010" "\010\010\010\010\010\010\010\010" "receiver configuration done \n"); return 0; } static void serial_speed(int fd, int speed){ struct termios term; tcgetattr(fd, &term); cfmakeraw(&term); cfsetospeed(&term, speed); cfsetispeed(&term, speed); if (tcsetattr(fd, TCSANOW | TCSAFLUSH, &term) == -1) err(1, "tcsetattr"); tcflush(fd, TCIOFLUSH); return; } static void config_normal(int fd){ nmea_send(fd, "$PASHS,NME,ALL,A,OFF"); /* silence outbound chatter */ nmea_send(fd, "$PASHS,NME,ALL,B,OFF"); nmea_send(fd, "$PASHS,NME,GGA,A,ON"); nmea_send(fd, "$PASHS,NME,GSA,A,ON"); nmea_send(fd, "$PASHS,NME,GSV,A,ON"); nmea_send(fd, "$PASHS,NME,RMC,A,ON"); nmea_send(fd, "$PASHS,NME,ZDA,A,ON"); nmea_send(fd, "$PASHS,INI,%d,%d,,,0,",ASHSPD_9600, ASHSPD_9600); sleep(6); /* it takes 4-6 sec for the receiver to reboot */ nmea_send(fd, "$PASHS,WAS,ON"); /* enable WAAS */ } static void config_raw(int fd){ nmea_send(fd, "$PASHS,NME,ALL,A,OFF"); /* silence outbound chatter */ nmea_send(fd, "$PASHS,NME,ALL,B,OFF"); nmea_send(fd, "$PASHS,NME,GGA,A,ON"); nmea_send(fd, "$PASHS,NME,GSA,A,ON"); nmea_send(fd, "$PASHS,NME,GSV,A,ON"); nmea_send(fd, "$PASHS,NME,RMC,A,ON"); nmea_send(fd, "$PASHS,NME,ZDA,A,ON"); nmea_send(fd, "$PASHS,INI,%d,%d,,,0,",ASHSPD_57600, ASHSPD_9600); sleep(6); /* it takes 4-6 sec for the receiver to reboot */ nmea_send(fd, "$PASHS,WAS,ON"); /* enable WAAS */ nmea_send(fd, "$PASHS,NME,POS,A,ON"); /* Ashtech PVT solution */ nmea_send(fd, "$PASHS,NME,SAT,A,ON"); /* Ashtech Satellite status */ nmea_send(fd, "$PASHS,NME,MCA,A,ON"); /* MCA measurements */ nmea_send(fd, "$PASHS,NME,PBN,A,ON"); /* ECEF PVT solution */ nmea_send(fd, "$PASHS,NME,SNV,A,ON,10"); /* Almanac data */ nmea_send(fd, "$PASHS,NME,XMG,A,ON"); /* exception messages */ } static void nmea_add_checksum(char *sentence) /* add NMEA checksum to a possibly *-terminated sentence */ { char *p = sentence; if (*p == '$') { unsigned char sum = '\0'; char c; p++; while ( ((c = *p) != '*') && (c != '\0')) { sum ^= c; p++; } *p++ = '*'; (void)snprintf(p, 5, "%02X\r\n", (unsigned int)sum); } } static int nmea_send(int fd, const char *fmt, ... ) /* ship a command to the GPS, adding * and correct checksum */ { size_t status; char buf[BUFSIZ]; va_list ap; va_start(ap, fmt) ; (void)vsnprintf(buf, sizeof(buf)-5, fmt, ap); va_end(ap); (void)strncat(buf, "*", sizeof(buf)-1); nmea_add_checksum(buf); // (void)fputs(buf, stderr); /* debug output */ tcflush(fd, TCIOFLUSH); status = (size_t)write(fd, buf, strlen(buf)); tcdrain(fd); usleep(100000); if (status == strlen(buf)) { return (int)status; } else { perror("nmea_send"); return -1; } } gpsd-3.15/contrib/binlog.c0000664000175000017500000000312112461156335013626 0ustar esresr/* This file is Copyright (c)2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include void spinner(int ); int main(int argc, char **argv) { int speed, n, ifd, ofd; struct termios term; char buf[BUFSIZ]; if (argc != 4){ fprintf(stderr, "usage: binlog \n"); return 1; } speed = atoi(argv[1]); switch (speed) { case 230400: case 115200: case 57600: case 38400: case 28800: case 19200: case 14400: case 9600: case 4800: break; default: fprintf(stderr, "invalid speed\n"); return 1; } if ((ifd = open(argv[2], O_RDWR | O_NONBLOCK | O_NOCTTY, 0644)) == -1) err(1, "open"); if ((ofd = open(argv[3], O_RDWR | O_CREAT | O_APPEND, 0644)) == -1) err(1, "open"); tcgetattr(ifd, &term); cfmakeraw(&term); cfsetospeed(&term, speed); cfsetispeed(&term, speed); if (tcsetattr(ifd, TCSANOW | TCSAFLUSH, &term) == -1) err(1, "tcsetattr"); tcflush(ifd, TCIOFLUSH); n = 0; while (1){ int l = read(ifd, buf, BUFSIZ); if (l > 0) assert(write(ofd, buf, l) > 0); usleep(1000); bzero(buf, BUFSIZ); spinner( n++ ); } /* NOTREACHED */ close(ifd); close(ofd); return 0; } void spinner(int n){ char *s = "|/-\\"; if (n % 4) return; n /= 4; fprintf(stderr, "\010\010\010\010\010\010\010\010\010\010\010\010\010"); fprintf(stderr, "%c %d", s[n%4], n); fflush(stderr); } gpsd-3.15/contrib/binreplay.c0000664000175000017500000000576112461156335014355 0ustar esresr/* This file is Copyright (c)2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * * Stuff the contents of a specified file into a specified tty. */ #include #include #include #include #include #include #include #include #include #include #ifndef __GLIBC__ #include #else #include #include #endif #define WRLEN 64 void spinner(int); void usage(void); int main( int argc, char **argv){ struct stat sb; struct termios term; char *buf, tn[32]; int ifd, ofd, sfd; int dflag = 0, c, sleeptime, len, speed = 0; while((c = getopt(argc, argv, "d:r:s:")) != -1) { switch(c){ case 'd': dflag = 1; strncpy(tn, optarg, sizeof(tn)-1); break; case 's': speed = atoi(optarg); switch (speed) { case 230400: case 115200: case 57600: case 38400: case 28800: case 19200: case 14400: case 9600: case 4800: break; default: fprintf(stderr, "invalid port speed: %d\n", speed); return 1; } break; default: usage(); } } argc -= optind; argv += optind; if (argc != 1) usage(); if (0 == speed) speed = 4800; printf("opening %s\n", argv[0]); if ((ifd = open(argv[0], O_RDONLY, 0444)) == -1) err(1, "open"); if (fstat(ifd, &sb) == -1) err(1, "fstat"); if ((buf = mmap(0, sb.st_size, PROT_READ, MAP_FILE | MAP_PRIVATE, ifd, 0)) == MAP_FAILED) err(1, "mmap"); if (dflag){ if ((ofd = open(tn, O_RDWR|O_NOCTTY, 0644)) == -1) err(1, "open"); tcgetattr(ofd, &term); cfmakeraw(&term); cfsetispeed(&term, speed); cfsetospeed(&term, speed); #if 0 term.c_cflag &= ~(PARENB | PARODD | CRTSCTS); term.c_cflag |= CREAD | CLOCAL; term.c_iflag = term.c_oflag = term.c_lflag = (tcflag_t) 0; #endif tcflush(ofd, TCIOFLUSH); tcsetattr(ofd, TCSANOW, &term); tcflush(ofd, TCIOFLUSH); } else { cfmakeraw(&term); cfsetospeed(&term, speed); cfsetispeed(&term, speed); if (openpty(&ofd, &sfd, tn, &term, NULL) == -1) err(1, "openpty"); tcsetattr(ofd, TCSANOW, &term); tcsetattr(sfd, TCSANOW, &term); } sleeptime = 1000000 / (speed / (WRLEN * 10)); printf("configured %s for %dbps - write delay %dus\n", tn, speed, sleeptime); for(len = 0; len < sb.st_size; len += WRLEN ){ write(ofd, buf+len, WRLEN ); // tcdrain(ofd); if (0 == dflag){ tcflush(ofd, TCIFLUSH); // tcdrain(sfd); tcflush(sfd, TCIFLUSH); } spinner( len ); usleep(sleeptime); } munmap(buf, sb.st_size); close(ifd); close(ofd); fprintf(stderr, "\010\010\010\010\010\010\010\010\010\010\010\010\n"); return 0; } void spinner(int n){ char *s = "|/-\\"; if (n % (WRLEN * 4)) return; n /= (WRLEN * 4); fprintf(stderr, "\010\010\010\010\010\010\010\010\010\010\010\010\010"); fprintf(stderr, "%c %d", s[n%4], n); fflush(stderr); } void usage(void){ fprintf(stderr, "usage: binreplay [-d ] [-s ] \n"); exit(1); } gpsd-3.15/contrib/lla2ecef.c0000664000175000017500000000413512460513551014033 0ustar esresr/* This file is Copyright (c)2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include extern char *__progname; double A = 6378137.0, B = 6356752.3142; static double rad2deg(double r){ return (180.0 * r / M_PI); } static double deg2rad(double r){ return (M_PI * r / 180.0); } static void lla2ecef(double *lla, double *ecef){ double N; lla[0] = deg2rad(lla[0]); lla[1] = deg2rad(lla[1]); N = pow(A,2) / sqrt( pow(A,2) * pow(cos(lla[0]),2) + pow(B,2) * pow(sin(lla[0]),2) ); ecef[0] = (N + lla[2]) * cos(lla[0]) * cos(lla[1]); ecef[1] = (N + lla[2]) * cos(lla[0]) * sin(lla[1]); ecef[2] = (pow(B,2) / pow(A,2) * N + lla[2]) * sin(lla[0]); return; } static void ecef2lla(double *ecef, double *lla){ double E, F, N, P, T; E = (pow(A,2) - pow(B,2)) / pow(A,2); F = (pow(A,2) - pow(B,2)) / pow(B,2); P = sqrt(pow(ecef[0], 2) + pow(ecef[1],2)); T = atan((ecef[2] * A)/(P * B)); lla[0] = atan( (ecef[2] + F * B * pow(sin(T), 3) ) / (P - E * A * pow(cos(T), 3) ) ); lla[1] = atan( ecef[1] / ecef[0] ); N = pow(A,2) / sqrt( pow(A,2) * pow(cos(lla[0]),2) + pow(B,2) * pow(sin(lla[0]),2) ); lla[2] = P / cos(lla[0]) - N; lla[1] = rad2deg(lla[1])-180; lla[0] = rad2deg(lla[0]); return; } int main(int argc, char **argv){ double ecef[3], lla[3]; if (4 != argc){ printf("usage:\tecef2lla X Y Z\n\tlla2ecef lat lon alt\n"); return 1; } if (0 == strcmp(__progname, "lla2ecef")){ /* Edmonton: lla[0] = 53.52716; lla[1] = -113.53013; lla[2] = 707.0; */ lla[0] = atof(argv[1]); lla[1] = atof(argv[2]); lla[2] = atof(argv[3]); lla2ecef(lla, ecef); printf("%.2lf %.2lf %.2lf\n", ecef[0], ecef[1], ecef[2]); } if (0 == strcmp(__progname, "ecef2lla")){ /* Edmonton: ecef[0] = -1517110.0; ecef[1] = -3484096.0; ecef[2] = 5106188.0; */ ecef[0] = atof(argv[1]); ecef[1] = atof(argv[2]); ecef[2] = atof(argv[3]); ecef2lla(ecef, lla); printf("%.7lf %.7lf %.2lf\n", lla[0], lla[1], lla[2]); } return 0; } gpsd-3.15/contrib/maxsats.pl0000775000175000017500000000236512506173455014243 0ustar esresr#!/usr/bin/perl # Copyright (c) 2008 Chris Kuethe # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use strict; use warnings; my ($tm, $nsr, $nt, $nu, @TL, @UL, $l); while (<>){ next unless (/,Y=\w+ (\d+\.\d+) (\d+):(.+:)/); $tm = $1; $nsr = $2; $l = ":$3:"; $nt = $nu = 0; @TL = @UL = (); while ($l =~ /(\d+) \w+ \w+ (\d+) ([01]):/g){ if ($1 <= 32){ # $1 => prn if ($2){ # $2 => snr push(@TL, $1); $nt++; } if ($3){ # $3 => used push(@UL, $1); $nu++; } } } print "$tm $nsr nu/nt = $nu/$nt T=\[@TL\] U=\[@UL\]\n" if (($nu >= 10)); } gpsd-3.15/contrib/motosend.c0000664000175000017500000001013112506517170014201 0ustar esresr/* * This file is Copyright (c)2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include /* * @@Cj - receiver ID * @@Be 0 - almanac dump */ static int moto_send(int , char *, char *); static char moto_gen_checksum(char *, int); char *gpsd_hexdump(char *, size_t); int gpsd_hexpack(char *, char *, int); int hex2bin(char *s); #define BSIZ 64 int main(int argc, char **argv) { int speed, l, fd, n; struct termios term; char buf[BSIZ]; time_t s, t; if (argc != 5){ fprintf(stderr, "usage: motosend msgtype moto-body-hex\n"); return 1; } if ((l = strlen(argv[4])) > 2*USHRT_MAX){ fprintf(stderr, "oversized message\n"); return 1; } if (l % 2) { fprintf(stderr, "body must have an even number of hex digits\n"); return 1; } speed = atoi(argv[1]); switch (speed) { case 230400: case 115200: case 57600: case 38400: case 28800: case 14400: case 9600: case 4800: break; default: fprintf(stderr, "invalid speed\n"); return 1; } if ((fd = open(argv[2], O_RDWR | O_NONBLOCK | O_NOCTTY, 0644)) == -1) err(1, "open"); tcgetattr(fd, &term); cfmakeraw(&term); cfsetospeed(&term, speed); cfsetispeed(&term, speed); term.c_cc[VMIN] = 8; term.c_cc[VTIME] = 1; term.c_cflag &= ~(PARENB | PARODD | CRTSCTS); term.c_cflag |= CREAD | CLOCAL; term.c_iflag = term.c_oflag = term.c_lflag = (tcflag_t) 0; if (tcsetattr(fd, TCSANOW | TCSAFLUSH, &term) == -1) err(1, "tcsetattr"); tcflush(fd, TCIOFLUSH); t = 0; n = 0; while (1){ usleep(1000); bzero(buf, BSIZ); if ((l = read(fd, buf, BSIZ)) == -1) if (!(EINTR == errno || EAGAIN == errno)) err(1, "read"); if (l > 0){ printf("%s", gpsd_hexdump(buf, l)); fflush(stdout); } /* allow for up to "n" resends, once per second */ if (((s = time(NULL)) > t) && (n < 1)){ t = s; n++; moto_send(fd, argv[3], argv[4]); } } return 0; } char moto_gen_checksum(char *buf, int len){ int n; char ck = '\0'; for (n = 0; n < len; n++) ck ^= buf[n]; return ck; } static int moto_send(int fd, char *type, char *body ) { size_t status; char *buf; unsigned short l; l = strlen(body) / 2; if ((buf = malloc(l+7)) == NULL) return -1; bzero(buf, l+7); buf[0] = '@'; buf[1] = '@'; buf[2] = type[0]; buf[3] = type[1]; if (l) if (gpsd_hexpack(body, buf+4, l) == -1){ free(buf); return -1; } buf[l+4] = moto_gen_checksum(buf+2, l+2); buf[l+5] = '\r'; buf[l+6] = '\n'; status = write(fd, buf, l+7); if (status == -1) perror("moto_send"); return (int)status; } static char last; char *gpsd_hexdump(char *binbuf, size_t binbuflen) { static char hexbuf[USHRT_MAX*2+10+2]; size_t i, j = 0; size_t len = (size_t)binbuflen; const char *ibuf = (const char *)binbuf; const char *hexchar = "0123456789abcdef"; for (i = 0; i < len; i++) { if (ibuf[i] == '@' && (ibuf[i+1] == '@' || last == '@')){ hexbuf[j++] = '\n'; hexbuf[j++] = ibuf[i++]; hexbuf[j++] = ibuf[i++]; hexbuf[j++] = ibuf[i++]; hexbuf[j++] = ibuf[i++]; } else { hexbuf[j++] = hexchar[ (ibuf[i]&0xf0)>>4 ]; hexbuf[j++] = hexchar[ ibuf[i]&0x0f ]; } last = ibuf[i]; } hexbuf[j] ='\0'; return hexbuf; } int gpsd_hexpack(char *src, char *dst, int len) { int i, l; l = (int)(strlen(src) / 2); if ((l < 1) || (l > len)) return -1; bzero(dst, len); for (i = 0; i < l; i++) { int k; if ((k = hex2bin(src+i*2)) != -1) dst[i] = (char)(k & 0xff); else return -1; } return l; } int hex2bin(char *s) { int a, b; a = s[0] & 0xff; b = s[1] & 0xff; if ((a >= 'a') && (a <= 'f')) a = a + 10 - 'a'; else if ((a >= 'A') && (a <= 'F')) a = a + 10 - 'A'; else if ((a >= '0') && (a <= '9')) a -= '0'; else return -1; if ((b >= 'a') && (b <= 'f')) b = b + 10 - 'a'; else if ((b >= 'A') && (b <= 'F')) b = b + 10 - 'A'; else if ((b >= '0') && (b <= '9')) b -= '0'; else return -1; return ((a<<4) + b); } gpsd-3.15/contrib/ntpoffset0000775000175000017500000000045712461156335014157 0ustar esresr#!/bin/sh # # Generate an estimate of your GPS's offset from a peerstats file # For instructions on how to use this script, see the GPSD Time # Service HOWTO in this distrubution. # awk ' /127\.127\.28\.0/ { sum += $5 * 1000; cnt++; } END { print sum / cnt; } ' # # pystripchart can be found at # https://sourceforge.net/projects/jstripchart # # To do: # # 1. Try using an impulse rather than line plot - this is bursty noise, not # really a contour. # import gtk, stripchart, sys # need numpy for float128, normal python floats are too small to hold a timespec import numpy class ntpOffset: def __init__(self, stream): # Initialize the class # create the GUI for the application self.create_GUI() # get the data self.read_data(stream) self.create_StripTableau() self.display_StripTableau() # enter the GTK main loop gtk.main() def create_GUI(self): # Creates the gui for the class # create a standard top-level GTK window self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.set_title("NTP Offset") self.window.connect("destroy", gtk.mainquit) self.window.set_default_size(700, 400) self.window.show() # create a VBox to hold all the top-level GUI items self.vbox = gtk.VBox() self.vbox.show() self.window.add(self.vbox) # create the toolbar self.create_toolbar() def create_StripTableau(self): # create the striptable widget # gtk.Adjustment(value, lower, upper, step_incr, page_incr, page_size) hadj = gtk.Adjustment(0, 0, self.lines, 1, 1, self.lines * 0.5) sel = gtk.Adjustment(0) self.striptableau = stripchart.StripTableau(hadj, sel) self.striptableau.metawidth = 80 self.striptableau.gradewidth = 80 self.vbox.pack_end(self.striptableau.widget, gtk.TRUE, gtk.TRUE) def create_toolbar(self): # Create toolbar for zoom and quit buttons self.toolbar = gtk.Toolbar() self.toolbar.show() # Zoom buttons self.toolbar.insert_stock(gtk.STOCK_ZOOM_IN, "Zoom in", None, lambda b, w: self.striptableau.zoomIn(), self.window, -1) self.toolbar.insert_stock(gtk.STOCK_ZOOM_OUT, "Zoom out", None, lambda b, w: self.striptableau.zoomOut(), self.window, -1) self.toolbar.insert_stock(gtk.STOCK_ZOOM_FIT, "Zoom fit", None, lambda b, w: self.striptableau.zoomSel(), self.window, -1) # Quit button self.toolbar.insert_stock(gtk.STOCK_QUIT, "Quit", None, lambda b, w: gtk.mainquit(), self.window, -1) # Put the toolbar into a HandleBox self.handlebox = gtk.HandleBox() self.handlebox.show() self.handlebox.add(self.toolbar) # Pack the toolbar into the main window self.vbox.pack_start(self.handlebox, gtk.FALSE) def display_StripTableau(self): # display the graph of each ntp_unit for ntp_unit in self.ntp_data: # gtk.Adjustment(value, lower, upper, step_incr, page_incr, # page_size) spread = self.ntp_upper[ntp_unit] - self.ntp_lower[ntp_unit] # prevent divide by zero if spread == 0: spread = 1 vadj_ntp = gtk.Adjustment( self.ntp_lower[ntp_unit], # initial value self.ntp_lower[ntp_unit] - 0.001, # lower extreme self.ntp_upper[ntp_unit] + 0.001, # upper extreme 1 / spread, # step_incr spread, # page_incr spread) # page size ntp_item = self.striptableau.addChannel(self.ntp_data[ntp_unit], vadj_ntp) ntp_item.name = ntp_unit def read_data(self, stream): # Reads data from a ntp log file. Layout is: # # - The keyword "sample" # - The NTP unit from which it was collected. # - Collection time of day, expressed in seconds # - Receiver time of day, expressed in seconds # - Clock time of day, expressed in seconds # - Leep-second notification status # - Source precision (log(2) of source jitter) self.ntp_data = {} # data sets for each ntp unit record = [] # A single record in the file or data stream line_counts = {} # Count of total lines for each ntp unit self.lines = 0 # width of graph self.ntp_upper = {} # Upper limit of the data set self.ntp_lower = {} # Lower limit of the data set offset = 0 # offset value to add to the array self.ntp_vadj = {} # vertical adjustment for each graph for line in stream: if len(line.split(' ')) > 6: if line[:1] != '#': line = line.lstrip() record = line.split(' ') offset = numpy.float128(record[3]) - numpy.float128(record[4]) # If the NTP unit is in the dictionary # append the offset to the list # Otherwise, create a new list in the dictionary # and add the offset. if record[1] not in self.ntp_data: self.ntp_data[record[1]] = [] line_counts[record[1]] = 0 self.ntp_upper[record[1]] = round(offset, 9) self.ntp_lower[record[1]] = round(offset, 9) self.ntp_data[record[1]].append(offset) line_counts[record[1]] += 1 # Update the bounds of the NTP unit if needed if offset > self.ntp_upper[record[1]]: self.ntp_upper[record[1]] = round(offset, 9) if offset < self.ntp_lower[record[1]]: self.ntp_lower[record[1]] = round(offset, 9) # Update the max record count if needed if line_counts[record[1]] > self.lines: self.lines = line_counts[record[1]] stream.close() if __name__ == "__main__": ntpOffset(sys.stdin) sys.exit() gpsd-3.15/contrib/ppscheck.c0000664000175000017500000000564112506517170014163 0ustar esresr/* * Watch a specified serial port for transitions that might be 1PPS. * * Each output line is the second and nanosecond parts of a timestamp * followed by the names of handshake signals then asserted. Off * transitions may generate lines with no signals aserted. * * If you don't see output within a second, use gpsmon or some other * equivalent tool to check that your device has satellite lock and is * getting fixes before giving up on the possibility of 1PPS. * * Also, check your cable. Cheap DB9 to DB9 cables such as those * issued with UPSes often carry TXD/RXD/GND only, omitting handshake * lines such as DCD. Suspect this especially if the cable jacket * looks too skinny to hold more than three leads! * * This code requires only ANSI/POSIX. If it doesn't compile and run * on your Unix there is something very wrong with your Unix. * * This code by ESR, Copyright (C) 2013, under BSD terms. */ #include #include #include #include #include #include /* needed for open() and friends */ #include #include #include struct assoc { int mask; char *string; }; /* * Possible pins for PPS: DCD, CTS, RI, DSR. Pinouts: * * DB9 DB25 Name Full name * --- ---- ---- -------------------- * 3 2 TXD --> Transmit Data * 2 3 RXD <-- Receive Data * 7 4 RTS --> Request To Send * 8 5 CTS <-- Clear To Send * 6 6 DSR <-- Data Set Ready * 4 20 DTR --> Data Terminal Ready * 1 8 DCD <-- Data Carrier Detect * 9 22 RI <-- Ring Indicator * 5 7 GND Signal ground * * Note that it only makes sense to wait on handshake lines * activated from the receive side (DCE->DTE) here; in this * context "DCE" is the GPS. {CD,RI,CTS,DSR} is the * entire set of these. */ const static struct assoc hlines[] = { {TIOCM_CD, "TIOCM_CD"}, {TIOCM_RI, "TIOCM_RI"}, {TIOCM_DSR, "TIOCM_DSR"}, {TIOCM_CTS, "TIOCM_CTS"}, }; int main(int argc, char *argv[]) { struct timespec ts; int fd = open(argv[1], O_RDONLY); if (fd == -1) { (void)fprintf(stderr, "open(%s) failed: %d %.40s\n", argv[1], errno, strerror(errno)); return 1; } for (;;) { if (ioctl(fd, TIOCMIWAIT, TIOCM_CD|TIOCM_DSR|TIOCM_RI|TIOCM_CTS) != 0) { (void)fprintf(stderr, "PPS ioctl(TIOCMIWAIT) failed: %d %.40s\n", errno, strerror(errno)); break; } else { const struct assoc *sp; int handshakes; (void)clock_gettime(CLOCK_REALTIME, &ts); (void)ioctl(fd, TIOCMGET, &handshakes); (void)fprintf(stdout, "%10ld %10ld", ts.tv_sec, ts.tv_nsec); for (sp = hlines; sp < hlines + sizeof(hlines)/sizeof(hlines[0]); sp++) if ((handshakes & sp->mask) != 0) { (void)fputc(' ', stdout); (void)fputs(sp->string, stdout); } (void)fputc('\n', stdout); } } } /* end */ gpsd-3.15/contrib/skyview.php0000775000175000017500000002313012506173455014431 0ustar esresr # Updated 2015 by Sanjeev Gupta # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // This program originally read a logfile of filtered gpsd messages, // type Y. The gpsd protocal changed in 2.90, since when this became // non-functional. // // The program has been updated (the first while loop) to read messages // over tcp; of type SKY. These are unpacked from JSON. No attempt has // been made to touch the actual calculation or plotting routines. // // Because it now reads a live stream, the program must be run with an // option, "count", to specify the number of SKY messages it reads. SKY // messages are usually emitted every 5 secs, so a number close to 700 // will cover an hour's worth. // // Tested to work with php5.6 , although earlier versions may work. $cellmode = 0; if ($argc != 3){ if (($argc != 4) || strcmp("cells", $argv[3])){ die("usage: ${argv[0]} count imagefile.png [cells]\n"); } else { $cellmode = 1; } } // How many samples to read of SKY messages. $count = $argv[1] ; $sz = 640; $cellsize = 5; # degrees $radius = 8; # pixels $filled = 0; $im = imageCreate($sz, $sz); $C = colorsetup($im); skyview($im, $sz, $C); legend($im, $sz, $C); $sky = array(); error_reporting(E_ALL); // Get the port for the GPSD service. $service_port = 2947 ; // Get the IP address for the target host. $address = "127.0.0.1" ; // Create a TCP/IP socket. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; } $result = socket_connect($socket, $address, $service_port); if ($result === false) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; } // Send a WATCH command. $cmd = "?WATCH={\"enable\":true,\"json\":true};" ; socket_write($socket, $cmd, strlen($in)); // Start the loop to start reading from gpsd. $out = ''; $j = 0 ; while (($out = socket_read($socket, 2048)) && ( $j < $count) ) { if (strpos($out, "SKY")) { $j = $j + 1; $PRN = json_decode($out,true); // var_dump($PRN) ; // object(stdClass)#12 (5) // ["PRN"]=> // int(137) // ["el"]=> // int(42) // ["az"]=> // int(91) // ["ss"]=> // int(32) // ["used"]=> // bool(false) $n = count($PRN["satellites"]) ; for($i = 0; $i < $n; $i++) { $sv = $PRN["satellites"][$i]["PRN"] ; $el = $PRN["satellites"][$i]["el"] ; $az = $PRN["satellites"][$i]["az"] ; $snr = $PRN["satellites"][$i]["ss"] ; $u = $PRN["satellites"][$i]["used"] ; // Below this, Chris' original code, more or less. -- Sanjeev 20150326 if ($cellmode){ $az = $cellsize * (int)($az/$cellsize); $el = $cellsize * (int)($el/$cellsize); } if (isset($sky[$az][$el]['avg'])){ $sky[$az][$el]['snr'] += $snr; $sky[$az][$el]['num']++; } else { $sky[$az][$el]['snr'] = $snr; $sky[$az][$el]['num'] = 1; } $sky[$az][$el]['avg'] = $sky[$az][$el]['snr'] / $sky[$az][$el]['num']; } } } foreach($sky as $az => $x){ foreach ($sky[$az] as $el => $y){ $e = array(-1, $el, $az, $sky[$az][$el]['avg'], -1); if ($cellmode) cellplot($im, $sz, $C, $cellsize, $e); else splot($im, $sz, $C, $radius, $filled, $e); } } skygrid($im, $sz, $C); # redraw grid over satellites imagePNG($im, $argv[2]); imageDestroy($im); exit(0); ########################################################################### function colorsetup($im){ $C['white'] = imageColorAllocate($im, 255, 255, 255); $C['ltgray'] = imageColorAllocate($im, 191, 191, 191); $C['mdgray'] = imageColorAllocate($im, 127, 127, 127); $C['dkgray'] = imageColorAllocate($im, 63, 63, 63); $C['black'] = imageColorAllocate($im, 0, 0, 0); $C['red'] = imageColorAllocate($im, 255, 0, 0); $C['brightgreen'] = imageColorAllocate($im, 0, 255, 0); $C['darkgreen'] = imageColorAllocate($im, 0, 192, 0); $C['blue'] = imageColorAllocate($im, 0, 0, 255); $C['cyan'] = imageColorAllocate($im, 0, 255, 255); $C['magenta'] = imageColorAllocate($im, 255, 0, 255); $C['yellow'] = imageColorAllocate($im, 255, 255, 0); $C['orange'] = imageColorAllocate($im, 255, 128, 0); return $C; } function legend($im, $sz, $C){ $r = 30; $fn = 5; $x = $sz - (4*$r+7) - 2; $y = $sz - $r - 3; imageFilledRectangle($im, $x, $y, $x + 4*$r + 7, $y + $r +1, $C['dkgray']); imageRectangle($im, $x+0*$r+1, $y+1, $x + 1*$r + 0, $y + $r, $C['red']); imageRectangle($im, $x+1*$r+2, $y+1, $x + 2*$r + 2, $y + $r, $C['yellow']); imageRectangle($im, $x+2*$r+4, $y+1, $x + 3*$r + 4, $y + $r, $C['darkgreen']); imageRectangle($im, $x+4*$r+6, $y+1, $x + 3*$r + 6, $y + $r, $C['brightgreen']); imageString($im, $fn, $x+3+0*$r, $y+$r/3, "<30", $C['red']); imageString($im, $fn, $x+5+1*$r, $y+$r/3, "30+", $C['yellow']); imageString($im, $fn, $x+7+2*$r, $y+$r/3, "35+", $C['darkgreen']); imageString($im, $fn, $x+9+3*$r, $y+$r/3, "40+", $C['brightgreen']); } function radial($angle, $sz){ #turn into radians $angle = deg2rad($angle); # determine length of radius $r = $sz * 0.5 * 0.95; # and convert length/azimuth to cartesian $x0 = sprintf("%d", (($sz * 0.5) - ($r * cos($angle)))); $y0 = sprintf("%d", (($sz * 0.5) - ($r * sin($angle)))); $x1 = sprintf("%d", (($sz * 0.5) + ($r * cos($angle)))); $y1 = sprintf("%d", (($sz * 0.5) + ($r * sin($angle)))); return array($x0, $y0, $x1, $y1); } function azel2xy($az, $el, $sz){ #rotate coords... 90deg W = 180deg trig $az += 270; #turn into radians $az = deg2rad($az); # determine length of radius $r = $sz * 0.5 * 0.95; $r -= ($r * ($el/90)); # and convert length/azimuth to cartesian $x = sprintf("%d", (($sz * 0.5) + ($r * cos($az)))); $y = sprintf("%d", (($sz * 0.5) + ($r * sin($az)))); $x = $sz - $x; return array($x, $y); } function cellplot($im, $sz, $C, $cellsize, $e){ list($sv, $el, $az, $snr, $u) = $e; if ((0 == $sv) || (0 == $az + $el + $snr) || ($az < 0) || ($el < 0)) return; $color = $C['brightgreen']; if ($snr < 40) $color = $C['darkgreen']; if ($snr < 35) $color = $C['yellow']; if ($snr < 30) $color = $C['red']; if ($snr < 15) $color = $C['dkgray']; #consider an N-degree cell plotted at (0,0). its top left corner #will be (0,0) and its bottom right corner will be at (N,N). The #sides are straight lines from (0,0)-(0,N) and (N,0)-(N,N). The #top and bottom edges will be approximated by segments from #(0,0):(0,1)..(0,N-1):(0,N) and (N,0):(N,1)...(N,N-1):(N,N). #Plotting that unholy mess is the job of # imagefilledpolygon ( $image, array $points, $num_points, $color ) $np = 0; $points = array(); for($x = $az; $x <= $az+$cellsize; $x++){ list($px,$py) = azel2xy($x, $el, $sz); array_push($points, $px, $py); $np++; } for($x = $az+$cellsize; $x >= $az; $x--){ list($px,$py) = azel2xy($x, $el+$cellsize, $sz); array_push($points, $px, $py); $np++; } list($px,$py) = azel2xy($az, $el, $sz); array_push($points, $px, $py); $np++; if ($snr > 0) imageFilledPolygon($im, $points, $np, $color); } function splot($im, $sz, $C, $r, $filled, $e){ list($sv, $az, $el, $snr, $u) = $e; if ((0 == $sv) || (0 == $az + $el + $snr)) return; $color = $C['brightgreen']; if ($snr < 40) $color = $C['darkgreen']; if ($snr < 35) $color = $C['yellow']; if ($snr < 30) $color = $C['red']; if ($snr == 0) $color = $C['black']; list($x, $y) = azel2xy($el, $az, $sz); if ($snr > 0){ if ($filled) imageFilledArc($im, $x, $y, $r, $r, 0, 360, $color, 0); else imageArc($im, $x, $y, $r, $r, 0, 360, $color); } } function elevation($im, $sz, $C, $a){ $b = 90 - $a; $a = $sz * 0.95 * ($a/180); imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['ltgray']); $x = $sz/2 - 16; $y = $sz/2 - $a; imageString($im, 2, $x, $y, $b, $C['ltgray']); } function skyview($im, $sz, $C){ $a = 90; $a = $sz * 0.95 * ($a/180); imageFilledArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['mdgray'], 0); imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['black']); $x = $sz/2 - 16; $y = $sz/2 - $a; imageString($im, 2, $x, $y, "0", $C['ltgray']); $a = 85; $a = $sz * 0.95 * ($a/180); imageFilledArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['white'], 0); imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['ltgray']); imageString($im, 1, $sz/2 - 6, $sz+$a, '5', $C['black']); $x = $sz/2 - 16; $y = $sz/2 - $a; imageString($im, 2, $x, $y, "5", $C['ltgray']); skygrid($im, $sz, $C); $x = $sz/2 - 16; $y = $sz/2 - 8; /* imageString($im, 2, $x, $y, "90", $C['ltgray']); */ imageString($im, 4, $sz/2 + 4, 2 , 'N', $C['black']); imageString($im, 4, $sz/2 + 4, $sz - 16 , 'S', $C['black']); imageString($im, 4, 4 , $sz/2 + 4, 'E', $C['black']); imageString($im, 4, $sz - 10 , $sz/2 + 4, 'W', $C['black']); } function skygrid($im, $sz, $C){ for($i = 0; $i < 180; $i += 15){ list($x0, $y0, $x1, $y1) = radial($i, $sz); imageLine($im, $x0, $y0, $x1, $y1, $C['ltgray']); } for($i = 15; $i < 90; $i += 15) elevation($im, $sz, $C, $i); } ?> gpsd-3.15/contrib/webgps.py0000700000175000017500000002531412517675017014055 0ustar esresr#!/usr/bin/env python # encoding: utf-8 """webgps.py This is a Python port of webgps.c from http://www.wireless.org.au/~jhecker/gpsd/ by Beat Bolli It creates a skyview of the currently visible GPS satellites and their tracks over a time period. Usage: ./webgps.py [duration] duration may be - a number of seconds - a number followed by a time unit ('s' for secinds, 'm' for minutes, 'h' for hours or 'd' for days, e.g. '4h' for a duration of four hours) - the letter 'c' for continuous operation If duration is missing, the current skyview is generated and webgps.py exits immediately. This is the same as giving a duration of 0. If a duration is given, webgps.py runs for this duration and generates the tracks of the GPS satellites in view. If the duration is the letter 'c', the script never exits and continuously updates the skyview. webgps.py generates two files: a HTML5 file that can be browsed, and a JavaScript file that contains the drawing commands for the skyview. The HTML5 file auto-refreshes every five minutes. The generated file names are "gpsd-.html" and "gpsd-.js". If webgps.py is interrupted with Ctrl-C before the duration is over, it saves the current tracks into the file "tracks.p". This is a Python "pickle" file. If this file is present on start of webgps.py, it is loaded. This allows to restart webgps.py without losing accumulated satellite tracks. """ import time, math, sys, os, pickle try: from gps import * except ImportError: sys.path.append('..') from gps import * TRACKMAX = 1024 STALECOUNT = 10 DIAMETER = 200 def polartocart(el, az): radius = DIAMETER * (1 - el / 90.0) # * math.cos(Deg2Rad(float(el))) theta = Deg2Rad(float(az - 90)) return ( -int(radius * math.cos(theta) + 0.5), # switch sides for a skyview! int(radius * math.sin(theta) + 0.5) ) class Track: '''Store the track of one satellite.''' def __init__(self, prn): self.prn = prn self.stale = 0 self.posn = [] # list of (x, y) tuples def add(self, x, y): pos = (x, y) self.stale = STALECOUNT if not self.posn or self.posn[-1] != pos: self.posn.append(pos) if len(self.posn) > TRACKMAX: self.posn = self.posn[-TRACKMAX:] return 1 return 0 def track(self): '''Return the track as canvas drawing operations.''' return 'M(%d,%d); ' % self.posn[0] + ''.join(['L(%d,%d); ' % p for p in self.posn[1:]]) class SatTracks(gps): '''gpsd client writing HTML5 and output.''' def __init__(self): gps.__init__(self) self.sattrack = {} # maps PRNs to Tracks self.state = None self.statetimer = time.time() self.needsupdate = 0 def html(self, fh, jsfile): fh.write(""" \t \t \tGPSD Satellite Positions and Readings \t \t \t \t\t \t\t\t \t\t\t \t\t \t
\t\t\t\t \t\t\t\t\t """ % jsfile) sats = self.satellites[:] sats.sort(lambda a, b: a.PRN - b.PRN) for s in sats: fh.write("\t\t\t\t\t\n" % ( s.PRN, s.elevation, s.azimuth, s.ss, s.used and 'Y' or 'N' )) fh.write("\t\t\t\t
PRN:Elev:Azim:SNR:Used:
%d%d%d%d%s
\n\t\t\t\t\n") def row(l, v): fh.write("\t\t\t\t\t\n" % (l, v)) def deg_to_str(a, hemi): return '%.6f %c' % (abs(a), hemi[a < 0]) row('Time', self.utc or 'N/A') if self.fix.mode >= MODE_2D: row('Latitude', deg_to_str(self.fix.latitude, 'SN')) row('Longitude', deg_to_str(self.fix.longitude, 'WE')) row('Altitude', self.fix.mode == MODE_3D and "%f m" % self.fix.altitude or 'N/A') row('Speed', not isnan(self.fix.speed) and "%f m/s" % self.fix.speed or 'N/A') row('Course', not isnan(self.fix.track) and "%f°" % self.fix.track or 'N/A') else: row('Latitude', 'N/A') row('Longitude', 'N/A') row('Altitude', 'N/A') row('Speed', 'N/A') row('Course', 'N/A') row('EPX', not isnan(self.fix.epx) and "%f m" % self.fix.epx or 'N/A') row('EPY', not isnan(self.fix.epy) and "%f m" % self.fix.epy or 'N/A') row('EPV', not isnan(self.fix.epv) and "%f m" % self.fix.epv or 'N/A') row('Climb', self.fix.mode == MODE_3D and not isnan(self.fix.climb) and "%f m/s" % self.fix.climb or 'N/A' ) if not (self.valid & ONLINE_SET): newstate = 0 state = "OFFLINE" else: newstate = self.fix.mode if newstate == MODE_2D: state = self.status == STATUS_DGPS_FIX and "2D DIFF FIX" or "2D FIX" elif newstate == MODE_3D: state = self.status == STATUS_DGPS_FIX and "3D DIFF FIX" or "3D FIX" else: state = "NO FIX" if newstate != self.state: self.statetimer = time.time() self.state = newstate row('State', state + " (%d secs)" % (time.time() - self.statetimer)) fh.write("""\t\t\t\t
%s:%s
\t\t\t
\t\t\t\t \t\t\t\t\t

Your browser needs HTML5 <canvas> support to display the satellite view correctly.

\t\t\t\t
\t\t\t\t \t\t\t
""") def js(self, fh): fh.write("""// draw the satellite view function draw_satview() { var c = document.getElementById('satview'); if (!c.getContext) return; var ctx = c.getContext('2d'); if (!ctx) return; var circle = Math.PI * 2, M = function (x, y) { ctx.moveTo(x, y); }, L = function (x, y) { ctx.lineTo(x, y); }; ctx.save(); ctx.clearRect(0, 0, c.width, c.height); ctx.translate(210, 210); // grid and labels ctx.strokeStyle = 'black'; ctx.beginPath(); ctx.arc(0, 0, 200, 0, circle, 0); ctx.stroke(); ctx.beginPath(); ctx.strokeText('N', -4, -202); ctx.strokeText('E', -210, 4); ctx.strokeText('W', 202, 4); ctx.strokeText('S', -4, 210); ctx.strokeStyle = 'grey'; ctx.beginPath(); ctx.arc(0, 0, 100, 0, circle, 0); M(2, 0); ctx.arc(0, 0, 2, 0, circle, 0); ctx.stroke(); ctx.strokeStyle = 'lightgrey'; ctx.save(); ctx.beginPath(); M(0, -200); L(0, 200); ctx.rotate(circle / 8); M(0, -200); L(0, 200); ctx.rotate(circle / 8); M(0, -200); L(0, 200); ctx.rotate(circle / 8); M(0, -200); L(0, 200); ctx.stroke(); ctx.restore(); // tracks ctx.lineWidth = 0.6; ctx.strokeStyle = 'red'; """); # Draw the tracks for t in self.sattrack.values(): if t.posn: fh.write(" ctx.globalAlpha = %s; ctx.beginPath(); %sctx.stroke();\n" % ( t.stale == 0 and '0.66' or '1', t.track() )) fh.write(""" // satellites ctx.lineWidth = 1; ctx.strokeStyle = 'black'; """) # Draw the satellites for s in self.satellites: x, y = polartocart(s.elevation, s.azimuth) fill = not s.used and 'lightgrey' or \ s.ss < 30 and 'red' or \ s.ss < 35 and 'yellow' or \ s.ss < 40 and 'green' or 'lime' # Center PRNs in the marker offset = s.PRN < 10 and 3 or s.PRN >= 100 and -3 or 0 fh.write(" ctx.beginPath(); ctx.fillStyle = '%s'; " % fill) if s.PRN > 32: # Draw a square for SBAS satellites fh.write("ctx.rect(%d, %d, 16, 16); " % (x - 8, y - 8)) else: fh.write("ctx.arc(%d, %d, 8, 0, circle, 0); " % (x, y)) fh.write("ctx.fill(); ctx.stroke(); ctx.strokeText('%s', %d, %d);\n" % (s.PRN, x - 6 + offset, y + 4)) fh.write(""" ctx.restore(); } """) def make_stale(self): for t in self.sattrack.values(): if t.stale: t.stale -= 1 def delete_stale(self): for prn in self.sattrack.keys(): if self.sattrack[prn].stale == 0: del self.sattrack[prn] self.needsupdate = 1 def insert_sat(self, prn, x, y): try: t = self.sattrack[prn] except KeyError: self.sattrack[prn] = t = Track(prn) if t.add(x, y): self.needsupdate = 1 def update_tracks(self): self.make_stale() for s in self.satellites: x, y = polartocart(s.elevation, s.azimuth) self.insert_sat(s.PRN, x, y) self.delete_stale() def generate_html(self, htmlfile, jsfile): fh = open(htmlfile, 'w') self.html(fh, jsfile) fh.close() def generate_js(self, jsfile): fh = open(jsfile, 'w') self.js(fh) fh.close() def run(self, suffix, period): jsfile = 'gpsd' + suffix + '.js' htmlfile = 'gpsd' + suffix + '.html' if period is not None: end = time.time() + period self.needsupdate = 1 self.stream(WATCH_ENABLE | WATCH_NEWSTYLE) for report in self: if report['class'] not in ('TPV', 'SKY'): continue self.update_tracks() if self.needsupdate: self.generate_js(jsfile) self.needsupdate = 0 self.generate_html(htmlfile, jsfile) if period is not None and ( period <= 0 and self.fix.mode >= MODE_2D or period > 0 and time.time() > end ): break def main(): argv = sys.argv[1:] factors = { 's': 1, 'm': 60, 'h': 60 * 60, 'd': 24 * 60 * 60 } arg = argv and argv[0] or '0' if arg[-1:] in factors.keys(): period = int(arg[:-1]) * factors[arg[-1]] elif arg == 'c': period = None else: period = int(arg) prefix = '-' + arg sat = SatTracks() # restore the tracks pfile = 'tracks.p' if os.path.isfile(pfile): p = open(pfile) sat.sattrack = pickle.load(p) p.close() try: sat.run(prefix, period) except KeyboardInterrupt: # save the tracks p = open(pfile, 'w') pickle.dump(sat.sattrack, p) p.close() if __name__ == '__main__': main() gpsd-3.15/control.in0000664000175000017500000000205712520742615012565 0ustar esresr# This is not a real Debian control file # It's project metadata for the shipper tool Package: gpsd Description: A monitoring daemon for GPSes, AIS radios, and other nav sensors. gpsd is a userland daemon acting as a translator between GPS and AIS receivers and their clients. gpsd listens on port 2947 for clients requesting position/time/velocity information. The receivers are expected to generate position information in a well-known format -- as NMEA-0183 sentences, SiRF binary, Rockwell binary, Garmin binary format, or other vendor binary protocols. gpsd takes this information from the GPS and translates it into JSON objects in a uniform and well-documented format that easier for clients to understand. The distribution includes sample clients, application interface libraries, and test/profiling tools. XBS-Destinations: savannah, freecode, mailto:@ANNOUNCE@ XBS-Web-Directory: www Homepage: @WEBSITE@ XBS-IRC-Channel: @IRCCHAN@ XBS-Project-Tag-List: Communications, Scientific/Engineering, Geographical XBS-VC-Tag-Template: %(version)s gpsd-3.15/crc24q.c0000664000175000017500000001464012506317026012016 0ustar esresr/* * This is an implementation of the CRC-24Q cyclic redundancy checksum * used by Qualcomm, RTCM104V3, and PGP 6.5.1. According to the RTCM104V3 * standard, it uses the error polynomial * * x^24+ x^23+ x^18+ x^17+ x^14+ x^11+ x^10+ x^7+ x^6+ x^5+ x^4+ x^3+ x+1 * * This corresponds to a mask of 0x1864CFB. For a primer on CRC theory, * including detailed discussion of how and why the error polynomial is * expressed by this mask, see . * * 1) It detects all single bit errors per 24-bit code word. * 2) It detects all double bit error combinations in a code word. * 3) It detects any odd number of errors. * 4) It detects any burst error for which the length of the burst is less than * or equal to 24 bits. * 5) It detects most large error bursts with length greater than 24 bits; * the odds of a false positive are at most 2^-23. * * This hash should not be considered cryptographically secure, but it * is extremely good at detecting noise errors. * * Note that this version has a seed of 0 wired in. The RTCM104V3 standard * requires this. * * This file is Copyright (c) 2008,2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include "crc24q.h" #ifdef REBUILD_CRC_TABLE /* * The crc24q code table below can be regenerated with the following code: */ #include #include #define CRCSEED 0 /* could be NZ to detect leading zeros */ #define CRCPOLY 0x1864CFBu /* encodes all info about the polynomial */ static void crc_init(unsigned int table[256]) { unsigned i, j; unsigned h; table[0] = CRCSEED; table[1] = h = CRCPOLY; for (i = 2; i < 256; i *= 2) { if ((h <<= 1) & 0x1000000) h ^= CRCPOLY; for (j = 0; j < i; j++) table[i + j] = table[j] ^ h; } } int main(int argc, char *argv[]) { int i; crc_init(table); for (i = 0; i < 256; i++) { printf("0x%08X, ", table[i]); if ((i % 4) == 3) putchar('\n'); } exit(EXIT_SUCCESS); } #endif static const int unsigned crc24q[256] = { 0x00000000u, 0x01864CFBu, 0x028AD50Du, 0x030C99F6u, 0x0493E6E1u, 0x0515AA1Au, 0x061933ECu, 0x079F7F17u, 0x08A18139u, 0x0927CDC2u, 0x0A2B5434u, 0x0BAD18CFu, 0x0C3267D8u, 0x0DB42B23u, 0x0EB8B2D5u, 0x0F3EFE2Eu, 0x10C54E89u, 0x11430272u, 0x124F9B84u, 0x13C9D77Fu, 0x1456A868u, 0x15D0E493u, 0x16DC7D65u, 0x175A319Eu, 0x1864CFB0u, 0x19E2834Bu, 0x1AEE1ABDu, 0x1B685646u, 0x1CF72951u, 0x1D7165AAu, 0x1E7DFC5Cu, 0x1FFBB0A7u, 0x200CD1E9u, 0x218A9D12u, 0x228604E4u, 0x2300481Fu, 0x249F3708u, 0x25197BF3u, 0x2615E205u, 0x2793AEFEu, 0x28AD50D0u, 0x292B1C2Bu, 0x2A2785DDu, 0x2BA1C926u, 0x2C3EB631u, 0x2DB8FACAu, 0x2EB4633Cu, 0x2F322FC7u, 0x30C99F60u, 0x314FD39Bu, 0x32434A6Du, 0x33C50696u, 0x345A7981u, 0x35DC357Au, 0x36D0AC8Cu, 0x3756E077u, 0x38681E59u, 0x39EE52A2u, 0x3AE2CB54u, 0x3B6487AFu, 0x3CFBF8B8u, 0x3D7DB443u, 0x3E712DB5u, 0x3FF7614Eu, 0x4019A3D2u, 0x419FEF29u, 0x429376DFu, 0x43153A24u, 0x448A4533u, 0x450C09C8u, 0x4600903Eu, 0x4786DCC5u, 0x48B822EBu, 0x493E6E10u, 0x4A32F7E6u, 0x4BB4BB1Du, 0x4C2BC40Au, 0x4DAD88F1u, 0x4EA11107u, 0x4F275DFCu, 0x50DCED5Bu, 0x515AA1A0u, 0x52563856u, 0x53D074ADu, 0x544F0BBAu, 0x55C94741u, 0x56C5DEB7u, 0x5743924Cu, 0x587D6C62u, 0x59FB2099u, 0x5AF7B96Fu, 0x5B71F594u, 0x5CEE8A83u, 0x5D68C678u, 0x5E645F8Eu, 0x5FE21375u, 0x6015723Bu, 0x61933EC0u, 0x629FA736u, 0x6319EBCDu, 0x648694DAu, 0x6500D821u, 0x660C41D7u, 0x678A0D2Cu, 0x68B4F302u, 0x6932BFF9u, 0x6A3E260Fu, 0x6BB86AF4u, 0x6C2715E3u, 0x6DA15918u, 0x6EADC0EEu, 0x6F2B8C15u, 0x70D03CB2u, 0x71567049u, 0x725AE9BFu, 0x73DCA544u, 0x7443DA53u, 0x75C596A8u, 0x76C90F5Eu, 0x774F43A5u, 0x7871BD8Bu, 0x79F7F170u, 0x7AFB6886u, 0x7B7D247Du, 0x7CE25B6Au, 0x7D641791u, 0x7E688E67u, 0x7FEEC29Cu, 0x803347A4u, 0x81B50B5Fu, 0x82B992A9u, 0x833FDE52u, 0x84A0A145u, 0x8526EDBEu, 0x862A7448u, 0x87AC38B3u, 0x8892C69Du, 0x89148A66u, 0x8A181390u, 0x8B9E5F6Bu, 0x8C01207Cu, 0x8D876C87u, 0x8E8BF571u, 0x8F0DB98Au, 0x90F6092Du, 0x917045D6u, 0x927CDC20u, 0x93FA90DBu, 0x9465EFCCu, 0x95E3A337u, 0x96EF3AC1u, 0x9769763Au, 0x98578814u, 0x99D1C4EFu, 0x9ADD5D19u, 0x9B5B11E2u, 0x9CC46EF5u, 0x9D42220Eu, 0x9E4EBBF8u, 0x9FC8F703u, 0xA03F964Du, 0xA1B9DAB6u, 0xA2B54340u, 0xA3330FBBu, 0xA4AC70ACu, 0xA52A3C57u, 0xA626A5A1u, 0xA7A0E95Au, 0xA89E1774u, 0xA9185B8Fu, 0xAA14C279u, 0xAB928E82u, 0xAC0DF195u, 0xAD8BBD6Eu, 0xAE872498u, 0xAF016863u, 0xB0FAD8C4u, 0xB17C943Fu, 0xB2700DC9u, 0xB3F64132u, 0xB4693E25u, 0xB5EF72DEu, 0xB6E3EB28u, 0xB765A7D3u, 0xB85B59FDu, 0xB9DD1506u, 0xBAD18CF0u, 0xBB57C00Bu, 0xBCC8BF1Cu, 0xBD4EF3E7u, 0xBE426A11u, 0xBFC426EAu, 0xC02AE476u, 0xC1ACA88Du, 0xC2A0317Bu, 0xC3267D80u, 0xC4B90297u, 0xC53F4E6Cu, 0xC633D79Au, 0xC7B59B61u, 0xC88B654Fu, 0xC90D29B4u, 0xCA01B042u, 0xCB87FCB9u, 0xCC1883AEu, 0xCD9ECF55u, 0xCE9256A3u, 0xCF141A58u, 0xD0EFAAFFu, 0xD169E604u, 0xD2657FF2u, 0xD3E33309u, 0xD47C4C1Eu, 0xD5FA00E5u, 0xD6F69913u, 0xD770D5E8u, 0xD84E2BC6u, 0xD9C8673Du, 0xDAC4FECBu, 0xDB42B230u, 0xDCDDCD27u, 0xDD5B81DCu, 0xDE57182Au, 0xDFD154D1u, 0xE026359Fu, 0xE1A07964u, 0xE2ACE092u, 0xE32AAC69u, 0xE4B5D37Eu, 0xE5339F85u, 0xE63F0673u, 0xE7B94A88u, 0xE887B4A6u, 0xE901F85Du, 0xEA0D61ABu, 0xEB8B2D50u, 0xEC145247u, 0xED921EBCu, 0xEE9E874Au, 0xEF18CBB1u, 0xF0E37B16u, 0xF16537EDu, 0xF269AE1Bu, 0xF3EFE2E0u, 0xF4709DF7u, 0xF5F6D10Cu, 0xF6FA48FAu, 0xF77C0401u, 0xF842FA2Fu, 0xF9C4B6D4u, 0xFAC82F22u, 0xFB4E63D9u, 0xFCD11CCEu, 0xFD575035u, 0xFE5BC9C3u, 0xFFDD8538u, }; unsigned crc24q_hash(unsigned char *data, int len) { int i; unsigned crc = 0; for (i = 0; i < len; i++) { crc = (crc << 8) ^ crc24q[data[i] ^ (unsigned char)(crc >> 16)]; } crc = (crc & 0x00ffffff); return crc; } #define LO(x) (unsigned char)((x) & 0xff) #define MID(x) (unsigned char)(((x) >> 8) & 0xff) #define HI(x) (unsigned char)(((x) >> 16) & 0xff) #ifdef __UNUSED__ 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); } #endif /* __UNUSED__ */ bool crc24q_check(unsigned char *data, int len) { unsigned crc = crc24q_hash(data, len - 3); return (((data[len - 3] == HI(crc)) && (data[len - 2] == MID(crc)) && (data[len - 1] == LO(crc)))); } gpsd-3.15/crc24q.h0000664000175000017500000000066312506317026012023 0ustar esresr/* Interface for CRC-24Q cyclic redundancy chercksum code * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _CRC24Q_H_ #define _CRC24Q_H_ extern void crc24q_sign(unsigned char *data, int len); extern bool crc24q_check(unsigned char *data, int len); extern unsigned crc24q_hash(unsigned char *data, int len); #endif /* _CRC24Q_H_ */ gpsd-3.15/daemon.c0000664000175000017500000000167512506326625012174 0ustar esresr#include #include #include #include #include #include "gpsd_config.h" #ifndef HAVE_DAEMON #if defined (HAVE_PATH_H) #include #else #if !defined (_PATH_DEVNULL) #define _PATH_DEVNULL "/dev/null" #endif #endif int daemon(int nochdir, int noclose) /* compatible with the daemon(3) found on Linuxes and BSDs */ { int fd; switch (fork()) { case -1: return -1; case 0: /* child side */ break; default: /* parent side */ exit(EXIT_SUCCESS); } if (setsid() == -1) return -1; if ((nochdir==0) && (chdir("/") == -1)) return -1; if ((noclose==0) && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { (void)dup2(fd, STDIN_FILENO); (void)dup2(fd, STDOUT_FILENO); (void)dup2(fd, STDERR_FILENO); if (fd > 2) (void)close(fd); } /* coverity[leaked_handle] Intentional handle duplication */ return 0; } #endif /* HAVE_DAEMON */ // end gpsd-3.15/dbusexport.c0000664000175000017500000000450512506326670013123 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include "gpsd.h" #if defined(DBUS_EXPORT_ENABLE) #include 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; dbus_error_init(&error); connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); if (connection == NULL) { /* report error */ return 1; } return 0; } 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; /* this packet format was designed before we split eph */ double eph; /* if the connection is non existent, return without doing anything */ if (connection == NULL) return; gpsdata = &(channel->gpsdata); gpsfix = &(gpsdata->fix); /* this packet format was designed before we split eph */ eph = EMIX(gpsfix->epx, gpsfix->epy); gpsd_devname = gpsdata->dev.path; /* Send the named signal. */ 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_set_no_reply(message, TRUE); dbus_connection_send(connection, message, &serial); dbus_message_unref(message); } #endif /* defined(DBUS_EXPORT_ENABLE) */ gpsd-3.15/devtools/README0000664000175000017500000000667012506517170013301 0ustar esresrThis is a list of developer tools included in the source repository but not necessarily shipped in the tarball or binary distributions If you're viewing it with Emacs, you can try doing Ctl-C Ctl-t browse through the outline headers. Ctl-C Ctl-a will unfold them again. == ais.py == AIS packet decoder in Python. Useful as a check on the C code. Also, if you have AISHub privileges (see ), a command like nc data.aishub.net 4006 | devtools/ais.py -c -v -t RANGE >AIS.LOG 2>&1" is a handy way to capture filtered AIS samples; RANGE can be a comma-separated list of AIS types. == aidvmtable == Generate an asciidoc table of the six-bit encoding used in AIVDM packets. == cycle_analyzer == Finds end-of-cycle sentences from GPS output logs. == dchroot-exec == Very simple wrapper around the DSA version of dchroot on the Debian porter boxes. dchroot only accepts one command as argument, nothing else. This wrapper creates a temporary script which will be executed then. == do-build == Very simple wrapper around scons clean, build, and check, saving output in a file named with "git describe". == easyinverse.pl == Generate random pairirs of mutually inverse covariance matrices suitable for testing a matrix-inversion algorithm. == editcomment == Give this a commit-ID specification. It will edit the associated comment. 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 machine and a remote one. Especially useful when remote and local have different word lengths. == flock* == The files prefixed with flock are the scripts, data files, and documentation for the flock-test suite. Read flock-instructions for explanation. == gpsd-debian-regressions.sh == Retrieves the latest build logs from Debian's buildds and extracts a list of failed regression tests, sorted by architecture. == identify_failing_build_options.py == Run from the top level to try to identify any combinations of build options that don't compile. To run cd to the root of the repo and run "devtools/identify_failing_build_options.py" it will generate failed_build_configs.txt for any that failed to compile. == logextract == Extract pure NMEA from an emailed gpsd error log. The output can be fed to gpsfake. == regress-builder == This script runs an exhaustive test on combinations of compilation options, looking for ones that break the build. == regressdiff == Walk through a pair of text files looking for where they begin to differ. May be useful for comparing logs when regression tests break. == reindent == Try to reindent the code in a uniform style. == sizes == Test-build interesting versions of the daemon and display their sizes. == striplog == Strip leading comment lines from NMEA sentence logs. gpsfake can do this itself now, so this script has a lot of dust on it. == tablegen.py == Generate most of the code required to support a message type from AIVDM message layout tables. Also, redo their bit offsets to be conformant with field lengths. == test_json_validity.py == Test a file full of lines containing GPSD-JSON reports to verify that each line is in fact well-formed JSON. gpsd-3.15/devtools/ais.py0000775000175000017500000014310712461156335013551 0ustar esresr#!/usr/bin/env python # # 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, # and a small amount of code for interpreting it. # # Known bugs: # * Doesn't join parts A and B of Type 24 together yet. # * Only handles the broadcast case of type 22. The problem is that the # addressed field is located *after* the variant parts. Grrrr... # * Message type 26 is presently unsupported. It hasn't been observed # in the wild yet as of Jan 2010; not a lot of point in trying util # we have test data. We'd need new machinery to constrain how many # bits the data spec eats in order to recover the radio bits after it. # * No support for IMO236 and IMO289 special messages in types 6 and 8 yet. # # Decoding for 1-15, 18-21, and 24 have been tested against live data. # Decoding for 16-17, 22-23, and 25-27 have not. # Here are the pseudoinstructions in the pseudolanguage. class bitfield: "Object defining the interpretation of an AIS bitfield." # The only un-obvious detail is the use of the oob (out-of-band) # member. This isn't used in data extraction, but rather to cut # down on the number of custom formatting hooks. With this we # handle the case where the field should be reported as an integer # or "n/a". def __init__(self, name, width, dtype, oob, legend, validator=None, formatter=None, conditional=None): self.name = name # Fieldname, for internal use and JSON self.width = width # Bit width self.type = dtype # Data type: signed/unsigned/string/raw self.oob = oob # Out-of-band value to be shown as n/a self.legend = legend # Human-friendly description of field self.validator = validator # Validation checker self.formatter = formatter # Custom reporting hook. self.conditional = conditional # Evaluation guard for this field class spare: "Describes spare bits,, not to be interpreted." def __init__(self, width, conditional=None): self.width = width self.conditional = conditional # Evaluation guard for this field class dispatch: "Describes how to dispatch to a message type variant on a subfield value." def __init__(self, fieldname, subtypes, compute=lambda x: x, conditional=None): self.fieldname = fieldname # Value of view to dispatch on self.subtypes = subtypes # Possible subtypes to dispatch to self.compute = compute # Pass value through this pre-dispatch self.conditional = conditional # Evaluation guard for this field # Message-type-specific information begins here. There are four # different kinds of things in it: (1) string tables for expanding # enumerated-type codes, (2) hook functions, (3) instruction tables, # and (4) field group declarations. This is the part that could, in # theory, be generated from a portable higher-level specification in # XML; only the hook functions are actually language-specific, and # your XML definition could in theory embed several different ones for # code generation in Python, Java, Perl, etc. cnb_status_legends = ( "Under way using engine", "At anchor", "Not under command", "Restricted manoeuverability", "Constrained by her draught", "Moored", "Aground", "Engaged in fishing", "Under way sailing", "Reserved for HSC", "Reserved for WIG", "Reserved", "Reserved", "Reserved", "Reserved", "Not defined", ) def cnb_rot_format(n): if n == -128: return "n/a" elif n == -127: return "fastleft" elif n == 127: return "fastright" else: return str((n / 4.733) ** 2); def cnb_latlon_format(n): return str(n / 600000.0) def cnb_speed_format(n): if n == 1023: return "n/a" elif n == 1022: return "fast" else: return str(n / 10.0); def cnb_course_format(n): return str(n / 10.0); def cnb_second_format(n): if n == 60: return "n/a" elif n == 61: return "manual input" elif n == 62: return "dead reckoning" elif n == 63: return "inoperative" else: return str(n); # Common Navigation Block is the format for AIS types 1, 2, and 3 cnb = ( bitfield("status", 4, 'unsigned', 0, "Navigation Status", formatter=cnb_status_legends), bitfield("turn", 8, 'signed', -128, "Rate of Turn", formatter=cnb_rot_format), bitfield("speed", 10, 'unsigned', 1023, "Speed Over Ground", formatter=cnb_speed_format), bitfield("accuracy", 1, 'unsigned', None, "Position Accuracy"), bitfield("lon", 28, 'signed', 0x6791AC0, "Longitude", formatter=cnb_latlon_format), bitfield("lat", 27, 'signed', 0x3412140, "Latitude", formatter=cnb_latlon_format), bitfield("course", 12, 'unsigned', 0xe10, "Course Over Ground", formatter=cnb_course_format), bitfield("heading", 9, 'unsigned', 511, "True Heading"), bitfield("second", 6, 'unsigned', None, "Time Stamp", formatter=cnb_second_format), bitfield("maneuver", 2, 'unsigned', None, "Maneuver Indicator"), spare(3), bitfield("raim", 1, 'unsigned', None, "RAIM flag"), bitfield("radio", 19, 'unsigned', None, "Radio status"), ) epfd_type_legends = ( "Undefined", "GPS", "GLONASS", "Combined GPS/GLONASS", "Loran-C", "Chayka", "Integrated navigation system", "Surveyed", "Galileo", ) type4 = ( bitfield("year", 14, "unsigned", 0, "Year"), bitfield("month", 4, "unsigned", 0, "Month"), bitfield("day", 5, "unsigned", 0, "Day"), bitfield("hour", 5, "unsigned", 24, "Hour"), bitfield("minute", 6, "unsigned", 60, "Minute"), bitfield("second", 6, "unsigned", 60, "Second"), bitfield("accuracy", 1, "unsigned", None, "Fix quality"), bitfield("lon", 28, "signed", 0x6791AC0, "Longitude", formatter=cnb_latlon_format), bitfield("lat", 27, "signed", 0x3412140, "Latitude", formatter=cnb_latlon_format), bitfield("epfd", 4, "unsigned", None, "Type of EPFD", validator=lambda n: n >= 0 and n <= 8 or n == 15, formatter=epfd_type_legends), spare(10), bitfield("raim", 1, "unsigned", None, "RAIM flag "), bitfield("radio", 19, "unsigned", None, "SOTDMA state"), ) ship_type_legends = ( "Not available", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Wing in ground (WIG) - all ships of this type", "Wing in ground (WIG) - Hazardous category A", "Wing in ground (WIG) - Hazardous category B", "Wing in ground (WIG) - Hazardous category C", "Wing in ground (WIG) - Hazardous category D", "Wing in ground (WIG) - Reserved for future use", "Wing in ground (WIG) - Reserved for future use", "Wing in ground (WIG) - Reserved for future use", "Wing in ground (WIG) - Reserved for future use", "Wing in ground (WIG) - Reserved for future use", "Fishing", "Towing", "Towing: length exceeds 200m or breadth exceeds 25m", "Dredging or underwater ops", "Diving ops", "Military ops", "Sailing", "Pleasure Craft", "Reserved", "Reserved", "High speed craft (HSC) - all ships of this type", "High speed craft (HSC) - Hazardous category A", "High speed craft (HSC) - Hazardous category B", "High speed craft (HSC) - Hazardous category C", "High speed craft (HSC) - Hazardous category D", "High speed craft (HSC) - Reserved for future use", "High speed craft (HSC) - Reserved for future use", "High speed craft (HSC) - Reserved for future use", "High speed craft (HSC) - Reserved for future use", "High speed craft (HSC) - No additional information", "Pilot Vessel", "Search and Rescue vessel", "Tug", "Port Tender", "Anti-pollution equipment", "Law Enforcement", "Spare - Local Vessel", "Spare - Local Vessel", "Medical Transport", "Ship according to RR Resolution No. 18", "Passenger - all ships of this type", "Passenger - Hazardous category A", "Passenger - Hazardous category B", "Passenger - Hazardous category C", "Passenger - Hazardous category D", "Passenger - Reserved for future use", "Passenger - Reserved for future use", "Passenger - Reserved for future use", "Passenger - Reserved for future use", "Passenger - No additional information", "Cargo - all ships of this type", "Cargo - Hazardous category A", "Cargo - Hazardous category B", "Cargo - Hazardous category C", "Cargo - Hazardous category D", "Cargo - Reserved for future use", "Cargo - Reserved for future use", "Cargo - Reserved for future use", "Cargo - Reserved for future use", "Cargo - No additional information", "Tanker - all ships of this type", "Tanker - Hazardous category A", "Tanker - Hazardous category B", "Tanker - Hazardous category C", "Tanker - Hazardous category D", "Tanker - Reserved for future use", "Tanker - Reserved for future use", "Tanker - Reserved for future use", "Tanker - Reserved for future use", "Tanker - No additional information", "Other Type - all ships of this type", "Other Type - Hazardous category A", "Other Type - Hazardous category B", "Other Type - Hazardous category C", "Other Type - Hazardous category D", "Other Type - Reserved for future use", "Other Type - Reserved for future use", "Other Type - Reserved for future use", "Other Type - Reserved for future use", "Other Type - no additional information", ) type5 = ( bitfield("ais_version", 2, 'unsigned', None, "AIS Version"), bitfield("imo_id", 30, 'unsigned', 0, "IMO Identification Number"), bitfield("callsign", 42, 'string', None, "Call Sign"), bitfield("shipname", 120, 'string', None, "Vessel Name"), bitfield("shiptype", 8, 'unsigned', None, "Ship Type", #validator=lambda n: n >= 0 and n <= 99, formatter=ship_type_legends), bitfield("to_bow", 9, 'unsigned', 0, "Dimension to Bow"), bitfield("to_stern", 9, 'unsigned', 0, "Dimension to Stern"), bitfield("to_port", 6, 'unsigned', 0, "Dimension to Port"), bitfield("to_starbord", 6, 'unsigned', 0, "Dimension to Starboard"), bitfield("epfd", 4, 'unsigned', 0, "Position Fix Type", validator=lambda n: n >= 0 and n <= 8 or n == 15, formatter=epfd_type_legends), bitfield("month", 4, 'unsigned', 0, "ETA month"), bitfield("day", 5, 'unsigned', 0, "ETA day"), bitfield("hour", 5, 'unsigned', 24, "ETA hour"), bitfield("minute", 6, 'unsigned', 60, "ETA minute"), bitfield("draught", 8, 'unsigned', 0, "Draught", formatter=lambda n: n/10.0), bitfield("destination", 120, 'string', None, "Destination"), bitfield("dte", 1, 'unsigned', None, "DTE"), spare(1), ) type6_dac_or_fid_unknown = ( bitfield("data", 920, 'raw', None, "Data"), ) type6_dispatch = {} type6_dispatch[0] = type6_dac_or_fid_unknown # DAC 235 and 250 (UK, Rep. of Ireland) type6_dac235_dispatch = {} type6_dac235_dispatch[0] = type6_dac_or_fid_unknown type6_dac235_fid10 = ( bitfield("ana_int", 10, 'unsigned', None, "Supply voltage"), bitfield("ana_ext1", 10, 'unsigned', None, "Analogue (Ext#1)"), bitfield("ana_ext2", 10, 'unsigned', None, "Analogue (Ext#2)"), bitfield("racon", 2, 'unsigned', None, "RACON status"), bitfield("light", 2, 'unsigned', None, "Light status"), bitfield("health", 1, 'unsigned', None, "Health"), bitfield("stat_ext", 8, 'unsigned', None, "Status (ext)"), bitfield("off_pos", 1, 'unsigned', None, "Position status"), ) type6_dac235_dispatch[10] = type6_dac235_fid10 type6_dac235 = ( dispatch("fid", type6_dac235_dispatch, lambda m: m if m in type6_dac235_dispatch else 0), ) type6_dispatch[235] = type6_dac235 type6_dispatch[250] = type6_dac235 type6 = ( bitfield("seqno", 2, 'unsigned', None, "Sequence Number"), bitfield("dest_mmsi", 30, 'unsigned', None, "Destination MMSI"), bitfield("retransmit", 1, 'unsigned', None, "Retransmit flag"), spare(1), bitfield("dac", 10, 'unsigned', 0, "DAC"), bitfield("fid", 6, 'unsigned', 0, "Functional ID"), dispatch("dac", type6_dispatch, lambda m: m if m in type6_dispatch else 0), ) type7 = ( spare(2), bitfield("mmsi1", 30, 'unsigned', 0, "MMSI number 1"), spare(2), bitfield("mmsi2", 30, 'unsigned', 0, "MMSI number 2"), spare(2), bitfield("mmsi3", 30, 'unsigned', 0, "MMSI number 3"), spare(2), bitfield("mmsi1", 30, 'unsigned', 0, "MMSI number 4"), spare(2), ) # # Type 8 have subtypes identified by DAC (Designated Area Code) and FID (Functional ID) # def type8_latlon_format(n): return str(n / 60000.0) type8_dac_or_fid_unknown = ( bitfield("data", 952, 'raw', None, "Data"), ) type8_dispatch = {} type8_dispatch[0] = type8_dac_or_fid_unknown # DAC 1 (international) type8_dac1_dispatch = {} type8_dac1_dispatch[0] = type8_dac_or_fid_unknown # DAC 1, FID 11: IMO236 Met/Hydro message def type8_dac1_fid11_airtemp_format(n): return str(n * 0.1 - 60) def type8_dac1_fid11_dewpoint_format(n): return str(n * 0.1 - 20) def type8_dac1_fid11_pressure_format(n): return str(n + 800) def type8_dac1_fid11_visibility_format(n): return str(n * 0.1) def type8_dac1_fid11_waterlevel_format(n): return str(n * 0.1 - 10) def type8_dac1_fid11_cspeed_format(n): return str(n * 0.1) def type8_dac1_fid11_waveheight_format(n): return str(n * 0.1) type8_dac1_fid11_seastate_legend = ( "Calm", "Light air", "Light breeze" "Gentle breeze", "Moderate breeze", "Fresh breeze", "Strong breeze", "High wind", "Gale", "Strong gale", "Storm", "Violent storm", "Hurricane force", "Reserved", "Reserved", "Reserved" ) def type8_dac1_fid11_watertemp_format(n): return str(n * 0.1 - 10) type8_dac1_fid11_preciptype_legend = ( "Reserved", "Rain", "Thunderstorm", "Freezing rain", "Mixed/ice", "Snow", "Reserved", "Reserved" ) def type8_dac1_fid11_salinity_format(n): return str(n * 0.1) type8_dac1_fid11_ice_legend = ( "Yes", "No" ) type8_dac1_fid11 = ( bitfield("lat", 24, "signed", 2**24-1, "Latitude", formatter=type8_latlon_format), bitfield("lon", 25, "signed", 2**25-1, "Longitude", formatter=type8_latlon_format), bitfield("day", 5, 'unsigned', 0, "ETA day"), bitfield("hour", 5, 'unsigned', 24, "ETA hour"), bitfield("minute", 6, 'unsigned', 60, "ETA minute"), bitfield("wspeed", 7, 'unsigned', 127, "Wind speed"), bitfield("wgust", 7, 'unsigned', 127, "Wind gust"), bitfield("wdir", 9, 'unsigned', 511, "Wind direction"), bitfield("wgustdir", 9, 'unsigned', 511, "Wind gust direction"), bitfield("airtemp", 11, 'unsigned', 2047, "Air temperature", formatter=type8_dac1_fid11_airtemp_format), bitfield("humidity", 7, 'unsigned', 127, "Relative humidity"), bitfield("dewpoint", 10, 'unsigned', 1023, "Dew point", formatter=type8_dac1_fid11_dewpoint_format), bitfield("pressure", 9, 'unsigned', 511, "Atmospheric pressure", formatter=type8_dac1_fid11_pressure_format), bitfield("pressuretend", 2, 'unsigned', 3, "Atmospheric pressure tendency"), bitfield("visibility", 8, 'unsigned', 255, "Horizontal visibility", formatter=type8_dac1_fid11_visibility_format), bitfield("waterlevel", 9, 'unsigned', 511, "Water level", formatter=type8_dac1_fid11_waterlevel_format), bitfield("leveltrend", 2, 'unsigned', 3, "Water level trend"), bitfield("cspeed", 8, 'unsigned', 255, "Surface current speed", formatter=type8_dac1_fid11_cspeed_format), bitfield("cdir", 9, 'unsigned', 511, "Surface current direction"), bitfield("cspeed2", 8, 'unsigned', 255, "Current speed #2", formatter=type8_dac1_fid11_cspeed_format), bitfield("cdir2", 9, 'unsigned', 511, "Current direction #2"), bitfield("cdepth2", 5, 'unsigned', 31, "Current measuring level #2"), bitfield("cspeed3", 8, 'unsigned', 255, "Current speed #3", formatter=type8_dac1_fid11_cspeed_format), bitfield("cdir3", 9, 'unsigned', 511, "Current direction #3"), bitfield("cdepth3", 5, 'unsigned', 31, "Current measuring level #3"), bitfield("waveheight", 8, 'unsigned', 255, "Significant wave height", formatter=type8_dac1_fid11_waveheight_format), bitfield("waveperiod", 6, 'unsigned', 63, "Significant wave period"), bitfield("wavedir", 9, 'unsigned', 511, "Significant wave direction"), bitfield("swellheight", 8, 'unsigned', 255, "Swell height", formatter=type8_dac1_fid11_waveheight_format), bitfield("swellperiod", 6, 'unsigned', 63, "Swell period"), bitfield("swelldir", 9, 'unsigned', 511, "Swell direction"), bitfield("seastate", 4, 'unsigned', 15, "Sea state", formatter=type8_dac1_fid11_seastate_legend), bitfield("watertemp", 10, 'unsigned', 1023, "Water temperature", formatter=type8_dac1_fid11_watertemp_format), bitfield("preciptype", 3, 'unsigned', 7, "Precipitation type", formatter=type8_dac1_fid11_preciptype_legend), bitfield("salinity", 9, 'unsigned', 511, "Salinity", formatter=type8_dac1_fid11_salinity_format), bitfield("ice", 2, 'unsigned', 3, "Ice?", formatter=type8_dac1_fid11_ice_legend), spare(6) ) type8_dac1_dispatch[11] = type8_dac1_fid11 type8_dac1 = ( dispatch("fid", type8_dac1_dispatch, lambda m: m if m in type8_dac1_dispatch else 0), ) type8_dispatch[1] = type8_dac1 type8 = ( spare(2), bitfield("dac", 10, 'unsigned', 0, "DAC"), bitfield("fid", 6, 'unsigned', 0, "Functional ID"), dispatch("dac", type8_dispatch, lambda m: m if m in type8_dispatch else 0), ) def type9_alt_format(n): if n == 4094: return ">=4094" else: return str(n) def type9_speed_format(n): if n == 1023: return "n/a" elif n == 1022: return "fast" else: return str(n); type9 = ( bitfield("alt", 12, 'unsigned', 4095, "Altitude", formatter=type9_alt_format), bitfield("speed", 10, 'unsigned', 1023, "SOG", formatter=type9_speed_format), bitfield("accuracy", 1, 'unsigned', None, "Position Accuracy"), bitfield("lon", 28, 'signed', 0x6791AC0, "Longitude", formatter=cnb_latlon_format), bitfield("lat", 27, 'signed', 0x3412140, "Latitude", formatter=cnb_latlon_format), bitfield("course", 12, 'unsigned', 0xe10, "Course Over Ground", formatter=cnb_course_format), bitfield("second", 6, 'unsigned', 60, "Time Stamp", formatter=cnb_second_format), bitfield("regional", 8, 'unsigned', None, "Regional reserved"), bitfield("dte", 1, 'unsigned', None, "DTE"), spare(3), bitfield("assigned", 1, 'unsigned', None, "Assigned"), bitfield("raim", 1, 'unsigned', None, "RAIM flag"), bitfield("radio", 19, 'unsigned', None, "Radio status"), ) type10 = ( spare(2), bitfield("dest_mmsi", 30, 'unsigned', None, "Destination MMSI"), spare(2), ) type12 = ( bitfield("seqno", 2, 'unsigned', None, "Sequence Number"), bitfield("dest_mmsi", 30, 'unsigned', None, "Destination MMSI"), bitfield("retransmit", 1, 'unsigned', None, "Retransmit flag"), spare(1), bitfield("text", 936, 'string', None, "Text"), ) type14 = ( spare(2), bitfield("text", 968, 'string', None, "Text"), ) type15 = ( spare(2), bitfield("mmsi1", 30, 'unsigned', 0, "First interrogated MMSI"), bitfield("type1_1", 6, 'unsigned', 0, "First message type"), bitfield("offset1_1", 12, 'unsigned', 0, "First slot offset"), spare(2), bitfield("type1_2", 6, 'unsigned', 0, "Second message type"), bitfield("offset1_2", 12, 'unsigned', 0, "Second slot offset"), spare(2), bitfield("mmsi2", 30, 'unsigned', 0, "Second interrogated MMSI"), bitfield("type2_1", 6, 'unsigned', 0, "Message type"), bitfield("offset2_1", 12, 'unsifned', 0, "Slot offset"), spare(2), ) type16 = ( spare(2), bitfield("mmsi1", 30, 'unsigned', 0, "Interrogated MMSI 1"), bitfield("offset1", 12, 'unsigned', 0, "First slot offset"), bitfield("increment1",10, 'unsigned', 0, "First slot increment"), bitfield("mmsi2", 30, 'unsigned', 0, "Interrogated MMSI 2"), bitfield("offset2", 12, 'unsigned', 0, "Second slot offset"), bitfield("increment2",10, 'unsigned', 0, "Second slot increment"), spare(2), ) def short_latlon_format(n): return str(n / 600.0) type17 = ( spare(2), bitfield("lon", 18, 'signed', 0x1a838, "Longitude", formatter=short_latlon_format), bitfield("lat", 17, 'signed', 0xd548, "Latitude", formatter=short_latlon_format), spare(5), bitfield("data", 736, 'raw', None, "DGNSS data"), ) type18 = ( bitfield("reserved", 8, 'unsigned', None, "Regional reserved"), bitfield("speed", 10, 'unsigned', 1023, "Speed Over Ground", formatter=cnb_speed_format), bitfield("accuracy", 1, 'unsigned', None, "Position Accuracy"), bitfield("lon", 28, 'signed', 0x6791AC0, "Longitude", formatter=cnb_latlon_format), bitfield("lat", 27, 'signed', 0x3412140, "Latitude", formatter=cnb_latlon_format), bitfield("course", 12, 'unsigned', 0xE10, "Course Over Ground", formatter=cnb_course_format), bitfield("heading", 9, 'unsigned', 511, "True Heading"), bitfield("second", 6, 'unsigned', None, "Time Stamp", formatter=cnb_second_format), bitfield("regional", 2, 'unsigned', None, "Regional reserved"), bitfield("cs", 1, 'unsigned', None, "CS Unit"), bitfield("display", 1, 'unsigned', None, "Display flag"), bitfield("dsc", 1, 'unsigned', None, "DSC flag"), bitfield("band", 1, 'unsigned', None, "Band flag"), bitfield("msg22", 1, 'unsigned', None, "Message 22 flag"), bitfield("assigned", 1, 'unsigned', None, "Assigned"), bitfield("raim", 1, 'unsigned', None, "RAIM flag"), bitfield("radio", 20, 'unsigned', None, "Radio status"), ) type19 = ( bitfield("reserved", 8, 'unsigned', None, "Regional reserved"), bitfield("speed", 10, 'unsigned', 1023, "Speed Over Ground", formatter=cnb_speed_format), bitfield("accuracy", 1, 'unsigned', None, "Position Accuracy"), bitfield("lon", 28, 'signed', 0x6791AC0, "Longitude", formatter=cnb_latlon_format), bitfield("lat", 27, 'signed', 0x3412140, "Latitude", formatter=cnb_latlon_format), bitfield("course", 12, 'unsigned', 0xE10, "Course Over Ground", formatter=cnb_course_format), bitfield("heading", 9, 'unsigned', 511, "True Heading"), bitfield("second", 6, 'unsigned', None, "Time Stamp", formatter=cnb_second_format), bitfield("regional", 4, 'unsigned', None, "Regional reserved"), bitfield("shipname", 120, 'string', None, "Vessel Name"), bitfield("shiptype", 8, 'unsigned', None, "Ship Type", #validator=lambda n: n >= 0 and n <= 99, formatter=ship_type_legends), bitfield("to_bow", 9, 'unsigned', 0, "Dimension to Bow"), bitfield("to_stern", 9, 'unsigned', 0, "Dimension to Stern"), bitfield("to_port", 6, 'unsigned', 0, "Dimension to Port"), bitfield("to_starbord", 6, 'unsigned', 0, "Dimension to Starboard"), bitfield("epfd", 4, 'unsigned', 0, "Position Fix Type", validator=lambda n: n >= 0 and n <= 8 or n == 15, formatter=epfd_type_legends), bitfield("assigned", 1, 'unsigned', None, "Assigned"), bitfield("raim", 1, 'unsigned', None, "RAIM flag"), bitfield("radio", 20, 'unsigned', None, "Radio status"), ) type20 = ( spare(2), bitfield("offset1", 12, 'unsigned', 0, "Offset number"), bitfield("number1", 4, 'unsigned', 0, "Reserved slots"), bitfield("timeout1", 3, 'unsigned', 0, "Time-out"), bitfield("increment1", 11, 'unsigned', 0, "Increment"), bitfield("offset2", 12, 'unsigned', 0, "Offset number 2"), bitfield("number2", 4, 'unsigned', 0, "Reserved slots"), bitfield("timeout2", 3, 'unsigned', 0, "Time-out"), bitfield("increment2", 11, 'unsigned', 0, "Increment"), bitfield("offset3", 12, 'unsigned', 0, "Offset number 3"), bitfield("number3", 4, 'unsigned', 0, "Reserved slots"), bitfield("timeout3", 3, 'unsigned', 0, "Time-out"), bitfield("increment3", 11, 'unsigned', 0, "Increment"), bitfield("offset4", 12, 'unsigned', 0, "Offset number 4"), bitfield("number4", 4, 'unsigned', 0, "Reserved slots"), bitfield("timeout4", 3, 'unsigned', 0, "Time-out"), bitfield("increment4", 11, 'unsigned', 0, "Increment"), ) aide_type_legends = ( "Unspecified", "Reference point", "RACON", "Fixed offshore structure", "Spare, Reserved for future use.", "Light, without sectors", "Light, with sectors", "Leading Light Front", "Leading Light Rear", "Beacon, Cardinal N", "Beacon, Cardinal E", "Beacon, Cardinal S", "Beacon, Cardinal W", "Beacon, Port hand", "Beacon, Starboard hand", "Beacon, Preferred Channel port hand", "Beacon, Preferred Channel starboard hand", "Beacon, Isolated danger", "Beacon, Safe water", "Beacon, Special mark", "Cardinal Mark N", "Cardinal Mark E", "Cardinal Mark S", "Cardinal Mark W", "Port hand Mark", "Starboard hand Mark", "Preferred Channel Port hand", "Preferred Channel Starboard hand", "Isolated danger", "Safe Water", "Special Mark", "Light Vessel / LANBY / Rigs", ) type21 = ( bitfield("aid_type", 5, 'unsigned', 0, "Aid type", formatter=aide_type_legends), bitfield("name", 120, 'string', None, "Name"), bitfield("accuracy", 1, 'unsigned', 0, "Position Accuracy"), bitfield("lon", 28, 'signed', 0x6791AC0, "Longitude", formatter=cnb_latlon_format), bitfield("lat", 27, 'signed', 0x3412140, "Latitude", formatter=cnb_latlon_format), bitfield("to_bow", 9, 'unsigned', 0, "Dimension to Bow"), bitfield("to_stern", 9, 'unsigned', 0, "Dimension to Stern"), bitfield("to_port", 6, 'unsigned', 0, "Dimension to Port"), bitfield("to_starboard", 6, 'unsigned', 0, "Dimension to Starboard"), bitfield("epfd", 4, 'unsigned', 0, "Position Fix Type", validator=lambda n: n >= 0 and n <= 8 or n == 15, formatter=epfd_type_legends), bitfield("second", 6, 'unsigned', 0, "UTC Second"), bitfield("off_position", 1, 'unsigned', 0, "Off-Position Indicator"), bitfield("regional", 8, 'unsigned', 0, "Regional reserved"), bitfield("raim", 1, 'unsigned', 0, "RAIM flag"), bitfield("virtual_aid", 1, 'unsigned', 0, "Virtual-aid flag"), bitfield("assigned", 1, 'unsigned', 0, "Assigned-mode flag"), spare(1), bitfield("name", 88, 'string', 0, "Name Extension"), ) type22 = ( spare(2), bitfield("channel_a", 12, 'unsigned', 0, "Channel A"), bitfield("channel_b", 12, 'unsigned', 0, "Channel B"), bitfield("txrx", 4, 'unsigned', 0, "Tx/Rx mode"), bitfield("power", 1, 'unsigned', 0, "Power"), bitfield("ne_lon", 18, 'signed', 0x1a838, "NE Longitude", formatter=short_latlon_format), bitfield("ne_lat", 17, 'signed', 0xd548, "NE Latitude", formatter=short_latlon_format), bitfield("sw_lon", 18, 'signed', 0x1a838, "SW Longitude", formatter=short_latlon_format), bitfield("sw_lat", 17, 'signed', 0xd548, "SW Latitude", formatter=short_latlon_format), bitfield("addressed", 1, 'unsigned', 0, "Addressed"), bitfield("band_a", 1, 'unsigned', 0, "Channel A Band"), bitfield("band_a", 1, 'unsigned', 0, "Channel A Band"), bitfield("zonesize", 3, 'unsigned', 0, "Zone size"), spare(23), ) station_type_legends = ( "All types of mobiles", "Reserved for future use", "All types of Class B mobile stations", "SAR airborne mobile station", "Aid to Navigation station", "Class B shipborne mobile station", "Regional use and inland waterways", "Regional use and inland waterways", "Regional use and inland waterways", "Regional use and inland waterways", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", ) type23 = ( spare(2), bitfield("ne_lon", 18, 'signed', 0x1a838, "NE Longitude", formatter=short_latlon_format), bitfield("ne_lat", 17, 'signed', 0xd548, "NE Latitude", formatter=short_latlon_format), bitfield("sw_lon", 18, 'signed', 0x1a838, "SW Longitude", formatter=short_latlon_format), bitfield("sw_lat", 17, 'signed', 0xd548, "SW Latitude", formatter=short_latlon_format), bitfield("stationtype",4, 'unsigned', 0, "Station Type", validator=lambda n: n >= 0 and n <= 31, formatter=station_type_legends), bitfield("shiptype", 8, 'unsigned', 0, "Ship Type", #validator=lambda n: n >= 0 and n <= 99, formatter=ship_type_legends), spare(22), bitfield("txrx", 2, 'unsigned', 0, "Tx/Rx mode"), bitfield("interval", 4, 'unsigned', 0, "Reporting interval"), bitfield("txrx", 4, 'unsigned', 0, "Quiet time"), ) type24a = ( bitfield("shipname", 120, 'string', None, "Vessel Name"), spare(8), ) type24b1 = ( bitfield("callsign", 42, 'string', None, "Call Sign"), bitfield("to_bow", 9, 'unsigned', 0, "Dimension to Bow"), bitfield("to_stern", 9, 'unsigned', 0, "Dimension to Stern"), bitfield("to_port", 6, 'unsigned', 0, "Dimension to Port"), bitfield("to_starbord", 6, 'unsigned', 0, "Dimension to Starboard"), spare(8), ) type24b2 = ( bitfield('mothership_mmsi', 30, 'unsigned', 0, "Mothership MMSI"), spare(8), ) type24b = ( bitfield("shiptype", 8, 'unsigned', None, "Ship Type", validator=lambda n: n >= 0 and n <= 99, formatter=ship_type_legends), bitfield("vendorid", 42, 'string', None, "Vendor ID"), dispatch("mmsi", {0:type24b1, 1:type24b2}, lambda m: 1 if `m`[:2]=='98' else 0), ) type24 = ( bitfield('partno', 2, 'unsigned', None, "Part Number"), dispatch('partno', {0:type24a, 1:type24b}), ) type25 = ( bitfield("addressed", 1, 'unsigned', None, "Addressing flag"), bitfield("structured", 1, 'unsigned', None, "Dimension to Bow"), bitfield("dest_mmsi", 30, 'unsigned', 0, "Destinstion MMSI", conditional=lambda i, v: v["addressed"]), bitfield("app_id", 16, 'unsigned', 0, "Application ID", conditional=lambda i, v: v["structured"]), bitfield("data", 0, 'raw', None, "Data"), ) # No type 26 handling yet, type27 = ( bitfield("accuracy", 1, 'unsigned', None, "Position Accuracy"), bitfield("raim", 1, 'unsigned', None, "RAIM flag"), bitfield("status", 4, 'unsigned', 0, "Navigation Status", formatter=cnb_status_legends), bitfield("lon", 18, 'signed', 0x1a838, "Longitude", formatter=short_latlon_format), bitfield("lat", 17, 'signed', 0xd548, "Latitude", formatter=short_latlon_format), bitfield("speed", 6, 'unsigned', 63, "Speed Over Ground", formatter=cnb_speed_format), bitfield("course", 9, 'unsigned', 511, "Course Over Ground"), bitfield("GNSS", 1, 'unsigned', None, "GNSS flag"), spare(1), ) aivdm_decode = ( bitfield('msgtype', 6, 'unsigned', 0, "Message Type", validator=lambda n: n > 0 and n <= 27), bitfield('repeat', 2, 'unsigned', None, "Repeat Indicator"), bitfield('mmsi', 30, 'unsigned', 0, "MMSI"), # This is the master dispatch on AIS message type dispatch('msgtype', {0:None, 1:cnb, 2:cnb, 3:cnb, 4:type4, 5:type5, 6:type6, 7:type7, 8:type8, 9:type9, 10:type10, 11:type4, 12:type12, 13:type7, 14:type14, 15:type15, 16:type16,17:type17, 18:type18,19:type19, 20:type20, 21:type21,22:type22, 23:type23,24:type24, 25:type25, 26:None, 27:type27}), ) # Length ranges. We use this for integrity checking. # When a range is a tuple, it's (minimum, maximum). lengths = { 1: 168, 2: 168, 3: 168, 4: 168, 5: 424, 6: (88, 1008), 7: (72, 168), 8: (56, 1008), 9: 168, 10: 72, 11: 168, 12: (72, 1008), 13: (72, 168), 14: (40, 1008), 15: (88, 168), 16: (96, 144), 17: (80, 816), 18: 168, 19: 312, 20: (72, 160), 21: (272, 360), 22: 168, 23: 160, 24: (160, 168), 25: 168, 26: (60, 1004), 27: 96, } field_groups = ( # This one occurs in message type 4 (3, ["year", "month", "day", "hour", "minute", "second"], "time", "Timestamp", lambda y, m, d, h, n, s: "%02d-%02d-%02dT%02d:%02d:%02dZ" % (y, m, d, h, n, s)), # This one is in message 5 (13, ["month", "day", "hour", "minute", "second"], "eta", "Estimated Time of Arrival", lambda m, d, h, n, s: "%02d-%02dT%02d:%02d:%02dZ" % (m, d, h, n, s)), ) # Message-type-specific information ends here. # # Next, the execution machinery for the pseudolanguage. There isn't much of # this: the whole point of the design is to embody most of the information # about the AIS format in the pseudoinstruction tables. from array import array BITS_PER_BYTE = 8 class BitVector: "Fast bit-vector class based on Python built-in array type." def __init__(self, data=None, length=None): self.bits = array('B') self.bitlen = 0 if data is not None: self.bits.extend(data) if length is None: self.bitlen = len(data) * 8 else: self.bitlen = length def extend_to(self, length): "Extend vector to given bitlength." if length > self.bitlen: self.bits.extend([0]*((length - self.bitlen +7 )/8)) self.bitlen = length def from_sixbit(self, data, pad=0): "Initialize bit vector from AIVDM-style six-bit armoring." self.bits.extend([0] * len(data)) for ch in data: ch = ord(ch) - 48 if ch > 40: ch -= 8 for i in (5, 4, 3, 2, 1, 0): if (ch >> i) & 0x01: self.bits[self.bitlen/8] |= (1 << (7 - self.bitlen % 8)) self.bitlen += 1 self.bitlen -= pad def ubits(self, start, width): "Extract a (zero-origin) bitfield from the buffer as an unsigned int." fld = 0 for i in range(start/BITS_PER_BYTE, (start + width + BITS_PER_BYTE - 1) / BITS_PER_BYTE): fld <<= BITS_PER_BYTE fld |= self.bits[i] end = (start + width) % BITS_PER_BYTE if end != 0: fld >>= (BITS_PER_BYTE - end) fld &= ~(-1 << width) return fld def sbits(self, start, width): "Extract a (zero-origin) bitfield from the buffer as a signed int." fld = self.ubits(start, width); if fld & (1 << (width-1)): fld = -(2 ** width - fld) return fld def __len__(self): return self.bitlen def __repr__(self): "Used for dumping binary data." return str(self.bitlen) + ":" + "".join(map(lambda d: "%02x" % d, self.bits[:(self.bitlen + 7)/8])) import sys, exceptions, re class AISUnpackingException(exceptions.Exception): def __init__(self, lc, fieldname, value): self.lc = lc self.fieldname = fieldname self.value = value def __repr__(self): return "%d: validation on fieldname %s failed (value %s)" % (self.lc, self.fieldname, self.value) def aivdm_unpack(lc, data, offset, values, instructions): "Unpack fields from data according to instructions." cooked = [] for inst in instructions: if offset >= len(data): break elif inst.conditional is not None and not inst.conditional(inst,values): continue elif isinstance(inst, spare): offset += inst.width elif isinstance(inst, dispatch): i = inst.compute(values[inst.fieldname]) # This is the recursion that lets us handle variant types cooked += aivdm_unpack(lc, data, offset, values, inst.subtypes[i]) elif isinstance(inst, bitfield): if inst.type == 'unsigned': value = data.ubits(offset, inst.width) elif inst.type == 'signed': value = data.sbits(offset, inst.width) elif inst.type == 'string': value = '' # The try/catch error here is in case we run off the end # of a variable-length string field, as in messages 12 and 14 try: for i in range(inst.width/6): newchar = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^- !\"#$%&'()*+,-./0123456789:;<=>?"[data.ubits(offset + 6*i, 6)] if newchar == '@': break else: value += newchar except IndexError: pass value = value.replace("@", " ").rstrip() elif inst.type == 'raw': # Note: Doesn't rely on the length. value = BitVector(data.bits[offset/8:], len(data)-offset) values[inst.name] = value if inst.validator and not inst.validator(value): raise AISUnpackingException(lc, inst.name, value) offset += inst.width # An important thing about the unpacked representation this # generates is that it carries forward the meta-information from # the field type definition. This stuff is then available for # use by report-generating code. cooked.append([inst, value]) return cooked def packet_scanner(source): "Get a span of AIVDM packets with contiguous fragment numbers." payloads = {'A':'', 'B':''} raw = '' well_formed = False lc = 0 while True: lc += 1; line = source.readline() if not line: return raw += line line = line.strip() # Strip off USCG metadata line = re.sub(r"(?<=\*[0-9A-F][0-9A-F]),.*", "", line) # Compute CRC-16 checksum packet = line[1:-3] # Strip leading !, trailing * and CRC csum = 0 for c in packet: csum ^= ord(c) csum = "%02X" % csum # Ignore comments if not line.startswith("!"): continue # Assemble fragments from single- and multi-line payloads fields = line.split(",") try: expect = fields[1] fragment = fields[2] channel = fields[4] if fragment == '1': payloads[channel] = '' well_formed = True payloads[channel] += fields[5] try: # This works because a mangled pad literal means # a malformed packet that will be caught by the CRC check. pad = int(fields[6].split('*')[0]) except ValueError: pad = 0 crc = fields[6].split('*')[1].strip() except IndexError: if skiperr: sys.stderr.write("%d: malformed line: %s\n" % (lc, line.strip())) well_formed = False else: raise AISUnpackingException(lc, "checksum", crc) if csum != crc: if skiperr: sys.stderr.write("%d: bad checksum %s, expecting %s: %s\n" % (lc, `crc`, csum, line.strip())) well_formed = False else: raise AISUnpackingException(lc, "checksum", crc) if fragment < expect or not well_formed: continue # Render assembled payload to packed bytes bits = BitVector() bits.from_sixbit(payloads[channel], pad) yield (lc, raw, bits) raw = '' def postprocess(cooked): "Postprocess cooked fields from a message." # Handle type 21 name extension if cooked[0][1] == 21 and len(cooked) > 19: cooked[4][1] += cooked[19][1] cooked.pop(-1) return cooked def parse_ais_messages(source, scaled=False, skiperr=False, verbose=0): "Generator code - read forever from source stream, parsing AIS messages." values = {} for (lc, raw, bits) in packet_scanner(source): values['length'] = bits.bitlen # Without the following magic, we'd have a subtle problem near # certain variable-length messages: DSV reports would # sometimes have fewer fields than expected, because the # unpacker would never generate cooked tuples for the omitted # part of the message. Presently a known issue for types 15 # and 16 only. (Would never affect variable-length messages in # which the last field type is 'string' or 'raw'). bits.extend_to(168) # Magic recursive unpacking operation try: cooked = aivdm_unpack(lc, bits, 0, values, aivdm_decode) # We now have a list of tuples containing unpacked fields # Collect some field groups into ISO8601 format for (offset, template, label, legend, formatter) in field_groups: segment = cooked[offset:offset+len(template)] if map(lambda x: x[0], segment) == template: group = formatter(*map(lambda x: x[1], segment)) group = (label, group, 'string', legend, None) cooked = cooked[:offset]+[group]+cooked[offset+len(template):] # Apply the postprocessor stage cooked = postprocess(cooked) # Now apply custom formatting hooks. if scaled: for (i, (inst, value)) in enumerate(cooked): if value == inst.oob: cooked[i][1] = "n/a" elif inst.formatter: if type(inst.formatter) == type(()): # Assumes 0 is the legend for the "undefined" value if value >= len(inst.formatter): value = 0 cooked[i][1] = inst.formatter[value] elif type(formatter) == type(lambda x: x): cooked[i][1] = inst.formatter(value) expected = lengths.get(values['msgtype'], None) # Check length; has to be done after so we have the type field bogon = False if expected is not None: if type(expected) == type(0): expected_range = (expected, expected) else: expected_range = expected actual = values['length'] if not (actual >= expected_range[0] and actual <= expected_range[1]): bogon = True if skiperr: sys.stderr.write("%d: type %d expected %s bits but saw %s: %s\n" % (lc, values['msgtype'], expected, actual, raw.strip().split())) else: raise AISUnpackingException(lc, "length", actual) # We're done, hand back a decoding values = {} yield (raw, cooked, bogon) raw = '' except KeyboardInterrupt: raise KeyboardInterrupt except GeneratorExit: raise GeneratorExit except AISUnpackingException, e: if skiperr: sys.stderr.write("%s: %s\n" % (`e`, raw.strip().split())) continue else: raise except: (exc_type, exc_value, exc_traceback) = sys.exc_info() sys.stderr.write("%d: Unknown exception: %s\n" % (lc, raw.strip().split())) if skiperr: continue else: raise exc_type, exc_value, exc_traceback # The rest is just sequencing and report generation. if __name__ == "__main__": import sys, getopt try: (options, arguments) = getopt.getopt(sys.argv[1:], "cdhjmqst:vx") except getopt.GetoptError, msg: print "ais.py: " + str(msg) raise SystemExit, 1 dsv = False dump = False histogram = False json = False malformed = False quiet = False scaled = False types = [] frequencies = {} verbose = 0 skiperr = True for (switch, val) in options: if switch == '-c': # Report in DSV format rather than JSON dsv = True elif switch == '-d': # Dump in a more human-readable format dump = True elif switch == '-h': # Make a histogram of type frequencies histogram = True elif switch == '-j': # Dump JSON json = True elif switch == '-m': # Dump malformed AIVDM/AIVDO packets raw malformed = True elif switch == '-q': # Suppress output quiet = True elif switch == '-s': # Report AIS in scaled form scaled = True elif switch == '-t': # Filter for a comma-separated list of types types = map(int, val.split(",")) elif switch == '-v': # Dump raw packet before JSON or DSV. verbose += 1 elif switch == '-x': # Skip decoding errors skiperr = False if not dsv and not histogram and not json and not malformed and not quiet: dump = True try: for (raw, parsed, bogon) in parse_ais_messages(sys.stdin, scaled, skiperr, verbose): msgtype = parsed[0][1] if types and msgtype not in types: continue if verbose >= 1 or (bogon and malformed): sys.stdout.write(raw) if not bogon: if json: def quotify(x): if type(x) == type(""): return '"' + str(x) + '"' else: return str(x) print "{" + ",".join(map(lambda x: '"' + x[0].name + '":' + quotify(x[1]), parsed)) + "}" elif dsv: print "|".join(map(lambda x: str(x[1]), parsed)) elif histogram: key = "%02d" % msgtype frequencies[key] = frequencies.get(key, 0) + 1 if msgtype == 6 or msgtype == 8: dac = 0; fid = 0 if msgtype == 8: dac = parsed[3][1] fid = parsed[4][1] elif msgtype == 6: dac = parsed[6][1] fid = parsed[7][1] key = "%02d_%04d_%02d" % (msgtype, dac, fid) frequencies[key] = frequencies.get(key, 0) + 1 elif dump: for (inst, value) in parsed: print "%-25s: %s" % (inst.legend, value) print "%%" sys.stdout.flush() if histogram: keys = frequencies.keys() keys.sort() for msgtype in keys: print "%-33s\t%d" % (msgtype, frequencies[msgtype]) except KeyboardInterrupt: pass # End gpsd-3.15/devtools/aivdmtable0000775000175000017500000000245312460513551014450 0ustar esresr#!/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", "000101", "000110", "000111", "001000", "001001", "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", ) def asciiarmor(): print("`--------`-------`---------`-------") print(" Char ASCII Decimal Bits") for ch in range(ord('0'), ord('W')+1) + range(ord('`'), ord('w')+1): n = ch - 48 if n >= 40: n -= 8 print '"%s" %3d %3d %s' % (chr(ch), ch, n, sixbits[n]) print("---------------------------------------") if __name__ == "__main__": asciiarmor() gpsd-3.15/devtools/client-projects0000664000175000017500000000206412460513551015440 0ustar esresrpygps http://www.pygps.org/ nelson@crynwr.com gpsdrive http://www.gpsdrive.de/ gpsdrive@lists.gpsdrivers.org. kismet http://www.kismetwireless.net/ dragorn@kismetwireless.net qpegps http://qpegps.sourceforge.net/ rhaselme@users.sourceforge.net position http://www.gnustep.it/enrico/position/ enrico@imago.ro roadmap http://roadmap.sourceforge.net/ roadmap-general@lists.sourceforge.net roadnav http://roadnav.sourceforge.net/ roadnav-devel@lists.sourceforge.net navit http://www.navit-project.org/ horwitz@users.sourceforge.net viking http://sourceforge.net/apps/mediawiki/viking/index.php?title=Main_Page viking-devel@lists.sourceforge.net opencpn http://sourceforge.net/projects/opencpn/ public@martchukov.com geoclue http://www.freedesktop.org/wiki/Software/GeoClue geoclue@lists.freedesktop.org tangogps http://www.tangogps.org/gps/cat/ tangogps-project@googlegroups.com foxtrot http://www.foxtrotGPS.org/ rozzin@geekspace.com geohist http://www.virtualroadside.com/geoHist/ dustin@virtualroadside.com LiveGPS http://wiki.openstreetmap.org/wiki/JOSM/Plugins/LiveGPS ? gpsd-3.15/devtools/cycle_analyzer0000775000175000017500000002377712460513551015360 0ustar esresr#!/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 This tool analyzes one or more NMEA or JSON files to determine the cycle sequence of sentences. JSON files must be reports from a gpsd driver which is without the CYCLE_END_RELIABLE capability and therefore ships every sentence containing a fix; otherwise the results will be meaningless because only the end-of-cycle sentences will show in the JSON. If a filename argument ends with '.log', and the sentence type in it is not recognizable, this tool adds '.chk' to the name and tries again assuming the latter is a JSON dump. Thus, invoking it again *.log in a directory full of check files will do the right thing. One purpose of this tool is to determine the end-of-cycle sentence that a binary-protocol device emits, so the result can be patched into the driver as a CYCLE_END_RELIABLE capability. To get this, apply the tool to the JSON output from the driver using the -j switch. It will ignore everything but tag and timestamp fields, and will also ignore any NMEA in the file. Another purpose is to sanity-check the assumptions of the NMEA end-of-cycle detector. For this purpose, run without -j; if a device has a regular reporting cycle with a constant end-of-cycle sentence, this tool will confirm that. Otherwise, it will perform various checks attempting to find an end-of-cycle marker and report on what it finds. When cycle_analyzer reports a split- or variable-cycle device, some arguments to the -d switch can dump various analysis stages so you can get a better idea what is going on. These are: sequence - the entire sequence of dump tag/timestamp pairs from the log events - show how those reduce to event sequences bursts - show how sentences are grouped into bursts trim - show the burst list after the end bursts have been removed In an event sequence, a '<' is a nornal start of cycle where the timestamp increments. A '>' is where the timestamp actually *decreases* between a a sentence and the one that follows. The NMEA cycle-end detector will ignore the '>' event; it sometimes occurs when GPZDA starts a cycle, but has no effect on where the actual end of fix reporting is. If you see a message saying 'cycle-enders ... also occur in mid-cycle', the device will confuse the NMEA cycle detector, leading to more reports per cycle than the ideal. """ import sys, os, getopt, json verbose = 0 suppress_regular = False parse_json = False class analyze_error: def __init__(self, filename, msg): self.filename = filename self.msg = msg def __repr__(self): return '%s: %s' % (self.filename, self.msg) class event: def __init__(self, tag, time=0): self.tag = tag self.time = time def __str__(self): if self.time == 0: return self.tag else: return self.tag + ":" + self.time __repr__ = __str__ def tags(lst): return map(lambda x: x.tag, lst) def extract_from_nmea(filename, lineno, line): "Extend sequence of tag/timestamp tuples from an NMEA sentence" hhmmss = { "RMC": 1, "GLL": 5, "GGA": 1, "GBS": 1, "PASHR": 4, } fields = line.split(",") tag = fields[0] if tag.startswith("$GP") or tag.startswith("$IN"): tag = tag[3:] elif tag[0] == "$": tag = tag[1:] if tag in hhmmss: timestamp = fields[hhmmss[tag]] return [event(tag, timestamp)] else: return [] def extract_from_json(filename, lineno, line): "Extend sequence of tag/timestamp tuples from a JSON dump of a sentence" if not line.startswith("{"): return [] try: sentence = json.loads(line) if u"time" not in sentence: return [] return [event(sentence[u"tag"].encode("iso-8859-1"), "%.2f" % sentence[u"time"])] except ValueError, e: print line.rstrip() print e return [] def extract_timestamped_sentences(fp, json_parse=parse_json): "Do the basic work of extracting tags and timestamps" sequence = [] lineno = 0 while True: line = fp.readline() if not line: break lineno += 1 if line.startswith("#"): continue if line[0] not in ("$", "!", "{"): raise analyze_error(fp.name, "unknown sentence type.") if not json_parse and line.startswith("$"): sequence += extract_from_nmea(fp.name, lineno, line) elif json_parse and line.startswith("{"): sequence += extract_from_json(fp.name, lineno, line) return sequence def analyze(sequence, name): "Analyze the cycle sequence of a device from its output logs." # First, extract tags and timestamps regular = False if not sequence: return if "sequence" in stages: print "Raw tag/timestamp sequence" for e in sequence: print e # Then, do cycle detection events = [] out_of_order = False for i in range(len(sequence)): this = sequence[i] if this.time == "" or float(this.time) == 0: continue events.append(this) if i < len(sequence)-1: next = sequence[i+1] if float(this.time) < float(next.time): events.append(event("<")) if float(this.time) > float(next.time): events.append(event(">")) out_of_order = True if out_of_order and verbose: sys.stderr.write("%s: has some timestamps out of order.\n" % name) if "events" in stages: print "Event list:" for e in events: print e # Now group events into bursts bursts = [] current = [] for e in events + [event('<')]: if e.tag == '<': bursts.append(tuple(current)) current = [] else: current.append(e) if "bursts" in stages: print "Burst list:" for burst in bursts: print burst # We need 4 cycles because the first and last might be incomplete. if tags(events).count("<") < 4: sys.stderr.write("%s: has fewer than 4 cycles.\n" % name) return # First try at detecting a regular cycle unequal = False for i in range(len(bursts)-1): if tags(bursts[i]) != tags(bursts[i+1]): unequal = True break if not unequal: # All bursts looked the same regular = True else: # Trim off first and last bursts, which are likely incomplete. bursts = bursts[1:-1] if "trim" in stages: "After trimming:" for burst in bursts: print burst # Now the actual clique analysis unequal = False for i in range(len(bursts)-1): if tags(bursts[i]) != tags(bursts[i+1]): unequal = True break if not unequal: regular = True # Should know now if cycle is regular if regular: if not suppress_regular: print "%s: has a regular cycle %s." % (name, " ".join(tags(bursts[0]))) else: # If it was not the case that all cycles matched, then we need # a minimum of 6 cycles because the first and last might be # incomplete, and we need at least 4 cycles in the middle to # have two full ones on split-cycle devices like old Garmins. if tags(events).count("<") < 6: sys.stderr.write("%s: variable-cycle log has has fewer than 6 cycles.\n" % name) return if verbose > 0: print "%s: has a split or variable cycle." % name cycle_enders = [] for burst in bursts: if burst[-1].tag not in cycle_enders: cycle_enders.append(burst[-1].tag) if len(cycle_enders) == 1: if not suppress_regular: print "%s: has a fixed end-of-cycle sentence %s." % (name, cycle_enders[0]) else: print "%s: has multiple cycle-enders %s." % (name, " ".join(cycle_enders)) # Sanity check pathological = [] for ender in cycle_enders: for burst in bursts: if ender in tags(burst) and not ender == burst[-1].tag and not ender in pathological: pathological.append(ender) if pathological: print "%s: cycle-enders %s also occur in mid-cycle!" % (name, " ".join(pathological)) if __name__ == "__main__": stages = "" try: (options, arguments) = getopt.getopt(sys.argv[1:], "d:jsv") for (switch, val) in options: if (switch == '-d'): # Debug stages = val elif (switch == '-j'): # Interpret JSON, not NMEA parse_json = True elif (switch == '-v'): # Verbose verbose += 1 elif (switch == '-s'): # Suppress logs with no problems suppress_regular = True except getopt.GetoptError, msg: print "cycle_analyzer: " + str(msg) raise SystemExit, 1 try: if arguments: for filename in arguments: fp = open(filename) try: sequence = extract_timestamped_sentences(fp) analyze(sequence, filename) except analyze_error, e: if filename.endswith(".log") and os.path.exists(filename+".chk"): fp2 = open(filename+".chk") try: sequence = extract_timestamped_sentences(fp2, json_parse=True) analyze(sequence, filename+".chk") finally: fp2.close() else: print e fp.close() else: sequence = extract_timestamped_sentences(sys.stdin) analyze(sequence, "standard input") except analyze_error, e: print str(e) raise SystemExit, 1 gpsd-3.15/devtools/dchroot-exec0000775000175000017500000000112412460513551014716 0ustar esresr#!/bin/bash # Very simple wrapper around the DSA version of dchroot # on the Debian porter boxes. dchroot only accepts one command # as argument, nothing else. This wrapper creates a temporary script # which will be executed then. # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. dchroot="$1" shift command="$1" shift arguments="$@" tmpfile=`mktemp $HOME/XXXXXXXXX.tmp` cat > $tmpfile << _EOF_ #!/bin/bash exec $command $arguments _EOF_ chmod 755 $tmpfile /usr/bin/dchroot $dchroot $tmpfile rm -f $tmpfile gpsd-3.15/devtools/do-build0000775000175000017500000000102312467340617014037 0ustar esresr#!/bin/sh # This script does a full build and check. Outputs are saved to files # BUILD. and CHECK. with the git version appended. The point is that # having regression test output from old versions is handy when # trouble arises. # This script should be run from the top-level directory. if [ ! -f gpsd.c ]; then echo "do-build: not at top-level of gpsd" exit 1 fi version=`git describe` scons -c < /dev/null > /dev/null 2>&1 scons $* < /dev/null > BUILD.$version 2>&1 scons check < /dev/null > CHECK.$version 2>&1 gpsd-3.15/devtools/easyinverse.pl0000775000175000017500000000525112467340617015316 0ustar esresr#! /bin/perl # # From: Reuben Settergren # # I wrote a perl script to randomly generate matrices with smallish integers, # and test for a suitable determinant (typically +/-1), and ouput the matrix # and its inverse. # # There are switches to make it -s[ymmetric] and/or -d[iagonally strong], # which are necessary and good properties for covariance matrices. You may # need to grab Math::MatrixReal and Math::Factor::XS from cpan. use Math::MatrixReal; use Math::Factor::XS qw(prime_factors); use Getopt::Std; $opt{n} = 1; getopts('hsdn:', \%opt); $usage .= "easyinverse.pl [-hsd] [-n N]\n"; $usage .= " -h this message\n"; $usage .= " -s symmetric\n"; $usage .= " -d diagonally dominant\n"; $usage .= " -n N number to generate (DEF 1)\n"; if ($opt{h}) { print $usage; exit; } sub randint{ # but not 0 my $min = shift or -5; my $max = shift or +5; my $ansa = 0; while ($ansa == 0) { my $r = rand; $r *= ($max - $min + 1); my $i = int($r); $ansa = $min + $i; } return $ansa; } $size = 4; sub printmateq { my $lbl = shift; my $mat = shift; my $round = shift; if ($round) { for my $r (1..$size) { for my $c (1..$size) { my $elt = $mat->element($r,$c); my $pelt = abs($elt); my $prnd = int($pelt * $round + 0.5) / $round; my $rnd = $prnd * ($elt < 0 ? -1 : 1); $mat->assign($r, $c, $rnd); }} } my @rows; for my $r (1..$size) { my @row = map {$mat->element($r, $_)} (1..$size); my $rowstr = '{' . (join ',', @row) . '}'; push @rows, $rowstr; } my $matstr = '{' . (join ',', @rows) . '}'; $matstr =~ s!\.?000+\d+!!g; print "$lbl = $matstr;\n"; } for (1..$opt{n}) { # requested number of matrices $M = new Math::MatrixReal($size,$size); while (1) { for $r (1..$size) { if ($opt{d}) { $M->assign($r,$r, randint(5,10)) } else { $M->assign($r,$r, randint(-3, 3)) } for $c ($r+1..$size) { $i = randint(-5,5); $M->assign($r, $c, $i); $M->assign($c, $r, ($opt{s} ? $i : randint(-5,5))); } } $det = int($M->det + 0.5); next if $det == 0; @factors = prime_factors(abs($det)); $all_good_factors = 1; # cross your fingers! for $f (@factors) { if ($f != 2 || $f != 5) { $all_good_factors = 0; last; } } next unless $all_good_factors; # test for positive semidefinite ~ all positive eigenvalues $evals = $M->sym_eigenvalues; $all_positive_evals = 1; # keep hope alive! for $r (1..$size) { if ($evals->element($r,1) <= 0) { $all_positive_evals = 0; last; } } last if $all_positive_evals; } printmateq(".mat", $M); printmateq(".inv", $M->inverse, 1000); } gpsd-3.15/devtools/editcomment0000775000175000017500000000302712460513551014646 0ustar esresr#!/bin/sh # Give this a commit-ID specification. It will edit the associated comment. # 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. # # This script by Eric S. Raymond, March 2010, all rites perverted. It's based # on an idea by thiago from #git, but debugged and with a safety check. # It contains porcelain and porcelain byproducts. topdir=`git rev-parse --show-cdup` test -n "$topdir" && cd "$topdir" my_commit=`git rev-parse $1` || exit $? # Run a safety check before edits that could hose remotes. if test -n "`git branch -r --contains $mycommit`" then echo -n "Commit has been pushed. Really edit? " read yn if test "$yn" != 'y' then exit 0 fi fi my_file=COMMIT_EDITMSG test -d .git && myfile=.git/COMMIT_EDITMSG # This effort to invoke the user's normal editor fails. # the problem is that anything the editor writes to stdout on the # controlling terminal becomes part of the commit message. So # the editor needs to actually run inside another window. #test -z "$GIT_EDITOR" && GIT_EDITOR=$EDITOR #test -z "$GIT_EDITOR" && GIT_EDITOR=vi #my_editor=$GIT_EDITOR # xterm -e vi should also work. my_editor=emacsclient export my_file my_commit my_editor exec git filter-branch -f --tag-name-filter cat --msg-filter ' if test "$GIT_COMMIT" = "$my_commit"; then cat > $my_file; $my_editor $my_file >/dev/null; cat $my_file else cat fi' "$1~.." # End gpsd-3.15/devtools/fakecompare0000775000175000017500000000133112460513551014607 0ustar esresr#!/bin/sh # # Compare the results from running gpsfake on a logfile between this # 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 directory=git/gpsd options="-D 4" ./gpsfake $options -s 38400 -1 -p $file >/tmp/fcmp-local-$$ 2>&1 scp -q $file ${remote}:${directory} ssh $remote "cd ${directory}; PATH=$PATH:. ./gpsfake $options -s 38400 -1 -p $file" >/tmp/fcmp-remote-$$ 2>&1 echo "*** Local:" cat /tmp/fcmp-local-$$ echo "*** Diff:" diff -u /tmp/fcmp-local-$$ /tmp/fcmp-remote-$$ rm /tmp/fcmp-local-$$ /tmp/fcmp-remote-$$ gpsd-3.15/devtools/flock-instructions0000664000175000017500000000517212460513551016176 0ustar esresrThe gpsd test flock is intended to make it easy for GPSD devs to verify operation of the software on multiple architectures and operating systems. To add a machine to the flock, do these steps: 1. Create a test-sandbox account. The recommended name is "gpsd". 2. Install git and gpsd's build prerequisites (gcc, Python, autotools, etc.) where the test account can run them. On a Debian/Ubuntu system you may be able to do this all at once with these commands: aptitude install git-core autoconf automake libtool aptitude build-dep gpsd 3. Make sure the account is reachable from the general Internet via ssh. 4. Install the public key of the test-network gatekeeper in .ssh/authorized_keys. Presently the test-network gatekeeper is esr@thyrsus.com; it is expected that this role will be held by the GPSD project lead or some delegate. The key is: ssh-dss AAAAB3NzaC1kc3MAAACBAPcpYG3nTzwrnZ1Nuz4FlODvnDaoHVaDoVg3jiSax/OJLuLmP+B1RMIMzQyQvbpeVHfMvBk1G+lqpysdUGOjM1ohYIXD479oOUg+Iga4SxrAwMwIiOFF5XhLc3hV2Ibd0N6V9ho8Sz8Kgq4CKj7323bLL+YpfldMhIlLXYDwTVo7AAAAFQCpZm4A5EiQar4+WavFBS1Xy3mJ6wAAAIEA2H33z6KpgRPIV/m5tRX4RmPmtunpC8UpBxj/uEadkaKnbDHLSuyUcflXe2A5xTuYIdFglEkt7ebZ1Gil4f7NuiKbukfQ13jMDWyuS9kDw0gr245kInu22dpfU1ZlCoDmNZSSeRJFkmhfvAim6yXoNpcS/PCaICNPJ1Ww9COYkqoAAACAY4g8mk80LXEpumbEonuDbsFobkz3HiooKgZd+xAGlYEDKpdVlh+bAXHW2R8tHnfYzP5Lq9nGan9i8GSAnw4ETwQ/IfIo7uT1OikyuImYqX2WKoUz5/3i9KOEUy4LWbqSHjIxBw3Y9ZlFYzq3gG/EhnmIuKGlN6Ig1P7B7v0GuXg= esr@snark 5. Append an entry to the flocktest.ini file and push to origin with the commit message "Added new flock site" or something similar. If you do not have git commit access, mail the entry to the development mailing list. To gain access to the test network: 1. Email a valid public ssh key to the flock gatekeeper. He will install the key on the test sites. To use the test network: 1. Call the script 'flocktest', optionally with a -d option to set a test subdirectory. (You can also set this in a .flockdriver dot file; do "flocktest -?" to see instructions about how to set this up.) The local flocktest script will upload an agent script to each machine that will do "autogen.sh && make % make check". flocktest will only return after all tests are complete, but they will be run in parallel rather than sequentially. The success/failure notifications will appear as CIA messages on the #gpsd IRC channel at freenode. For each failed test, the log will be dumped to standard output. We have access to some the Debian test machines listed as porterboxes at . Adding these to the flock is a work in progress. gpsd-3.15/devtools/flocktest0000775000175000017500000002531212461156335014341 0ustar esresr#!/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 usage: flocktest [-c] [-q] [-d subdir] [-k key] -v [-x exclude] [-?] The -? makes flocktest prints this help and exits. The -c option dumps flocktest's configuration and exits The -k mode installs a specified file of ssh public keys on all machines Otherwise, the remote flockdriver script is executed on each machine. The -d option passes it a name for the remote test subdirectory If you do not specify a subdirectory name, the value of $LOGNAME will be used. The -q option suppresses CIA notifications The -v option shows all ssh commands issued, runs flockdriver with -x set and causes logs to be echoed even on success. The -x option specifies a comma-separated list of items that are either remote hostnames or architecture tags. Matching sites are excluded. You may wish to use this to avoid doing remote tests that are redundant with your local ones. Known bug: The -k has no atomicity check. Running it from two flocktest instances concurrently could result in a scrambled keyfile. """ import os, sys, ConfigParser, getopt, socket, threading, commands, time flockdriver = ''' #!/bin/sh # # flockdriver - conduct regression tests as an agent for a remote flocktest # # This file was generated at %(date)s. Do not hand-hack. quiet=no while getopts dq opt do case $opt in d) subdir=$2; shift; shift ;; q) quiet=yes; shift ;; esac done # Fully qualified domain name of the repo host. You can hardwire this # to make the script faster. The -f option works under Linux and FreeBSD, # but not OpenBSD and NetBSD. But under OpenBSD and NetBSD, # hostname without options gives the FQDN. if hostname -f >/dev/null 2>&1 then site=`hostname -f` else site=`hostname` fi if [ -f "flockdriver.lock" ] then logmessage="A test was already running when you initiated this one." cd $subdir else echo "Test begins: "`date` echo "Site: $site" echo "Directory: ${PWD}/${subdir}" # Check the origin against the repo origin. If they do not match, # force a re-clone of the repo if [ -d $subdir ] then repo_origin=`(cd $subdir; git config remote.origin.url)` if [ $repo_origin != "%(origin)s" ] then echo "Forced re-clone." rm -fr $subdir fi fi # Set up or update the repo if [ ! -d $subdir ] then git clone %(origin)s $subdir cd $subdir else cd $subdir; git pull fi # Scripts in the test directory need to be able to run binaries in same PATH="$PATH:." # Perform the test if ( %(regression)s ) then logmessage="Regression test succeeded." status=0 else logmessage="Regression test failed." status=1 fi echo "Test ends: "`date` fi # Here is where we abuse CIA to do our notifications for us. # Addresses for the e-mail from="FLOCKDRIVER-NOREPLY@${site}" to="cia@cia.navi.cx" # SMTP client to use sendmail="sendmail -t -f ${from}" # Should include all places sendmail is likely to lurk. PATH="$PATH:/usr/sbin/" # Identify what just succeeded or failed merged=$(git rev-parse HEAD) rev=$(git describe ${merged} 2>/dev/null) [ -z ${rev} ] && rev=${merged} refname=$(git symbolic-ref HEAD 2>/dev/null) refname=${refname##refs/heads/} # And the git version gitver=$(git --version) gitver=${gitver##* } if [ $quiet = no ] then ${sendmail} << EOM Message-ID: <${merged}.${subdir}.blip@%(project)s> From: ${from} To: ${to} Content-type: text/xml Subject: DeliverXML %(project)s Remote Test Flock Driver ${gitver} ${origin}/flockdriver %(project)s ${refname}@${site} `date` ${subdir} ${rev} ${logmessage} EOM fi exit $status # End. ''' class FlockThread(threading.Thread): def __init__(self, site, command): threading.Thread.__init__(self) self.site = site self.command = command def run(self): (self.status, self.output) = commands.getstatusoutput(self.command) class TestSite: "Methods for performing tests on a single remote site." def __init__(self, fqdn, config, execute=True): self.fqdn = fqdn self.config = config self.execute = execute self.me = self.config["login"] + "@" + self.fqdn def error(self, msg): "Report an error while executing a remote command." sys.stderr.write("%s: %s\n" % (self.fqdn, msg)) def do_remote(self, remote): "Execute a command on a specified remote host." command = "ssh " if "port" in self.config: command += "-p %s " % self.config["port"] command += "%s '%s'" % (self.me, remote) if self.verbose: print command self.thread = FlockThread(self, command) self.thread.start() def update_keys(self, filename): "Upload a specified file to replace the remote authorized keys." if 'debian.org' in self.me: self.error("updating keys on debian.org machines makes no sense.") return 1 command = "scp '%s' %s:~/.ssh/.authorized_keys" % (os.path.expanduser(filename), self.me) if self.verbose: print command status = os.system(command) if status: self.error("copy with '%s' failed" % command) return status def do_append(self, filename, string): "Append a line to a specified remote file, in foreground." self.do_remote("echo \"%s\" >>%s" % (string.strip(), filename)) def do_flockdriver(self, agent, invocation): "Copy flockdriver to the remote site and run it." self.starttime = time.time() if self.config.get("quiet", "no") == "yes": invocation += " -q" uploader = "ssh -p %s %s 'cat >%s'" \ % (self.config.get("port", "22"), self.me, agent) if self.verbose: print uploader ofp = os.popen(uploader, "w") self.config['date'] = time.ctime() ofp.write(flockdriver % self.config) if ofp.close(): print >>sys.stderr, "flocktest: agent upload failed" else: self.do_remote(invocation) self.elapsed = time.time() - self.starttime class TestFlock: "Methods for performing parallel tests on a flock of remote sites." ssh_options = "no-port-forwarding,no-X11-forwarding," \ "no-agent-forwarding,no-pty " def __init__(self, sitelist, verbose=False): self.sitelist = sitelist self.verbose = verbose def update_remote(self, filename): "Copy a specified file to the remote home on all machines." for site in self.sitelist: site.update_remote(filename) def do_remotes(self, agent, invocation): "Execute a command on all machines in the flock." slaves = [] print "== testing at: %s ==" % flock.listdump() starttime = time.time() for site in self.sitelist: site.do_flockdriver(agent, invocation) for site in sites: site.thread.join() failed = 0 for site in sites: if site.thread.status: print "== %s test FAILED in %.2f seconds, status %d ==" % (site.fqdn, site.elapsed, site.thread.status) failed += 1 print site.thread.output else: print "== %s test succeeded in %.2f seconds ==" % (site.fqdn, site.elapsed) if self.verbose: print site.thread.output elapsed = time.time() - starttime print "== %d tests completed in %.2f seconds: %d failed ==" % (len(sites), elapsed, failed) def exclude(self, exclusions): "Delete matching sites." self.sitelist = filter(lambda x: x.fqdn not in exclusions and x.config["arch"] not in exclusions, self.sitelist) def update_keys(self, keyfile): "Copy the specified public key file to all sites." for site in self.sitelist: site.update_keys(keyfile) def listdump(self): "Return a dump of the site list." return ", ".join(map(lambda x: x.fqdn, self.sitelist)) if __name__ == '__main__': try: (options, arguments) = getopt.getopt(sys.argv[1:], "cd:kqvx:?") except getopt.GetoptError, msg: print "flocktest: " + str(msg) raise SystemExit, 1 exclusions = [] subdir = None copykeys = None verbose = False dumpconf = False cianotify = True for (switch, val) in options: if switch == '-c': # Dump flocktest configuration dumpconf = True elif switch == '-d': # Set the test subdirectory name subdir = val elif switch == '-k': # Install the access keys copykeys = True elif switch == '-q': # Suppress CIA notifications cianotify = False elif switch == '-v': # Display build log even when no error verbose = True elif switch == '-x': # Exclude specified sites or architectures exclusions = map(lambda x: x.strip(), val.split(",")) else: # switch == '-?': print __doc__ sys.exit(0) config = ConfigParser.RawConfigParser() config.read(["flocktest.ini", ".flocktest.ini"]) if arguments: config.set("DEFAULT", "origin", arguments[0]) if not config.has_option("DEFAULT", "origin"): print >>sys.stderr, "flocktest: repository required." sys.exit(1) sites = [] for site in config.sections(): newsite = TestSite(site, dict(config.items(site))) newsite.verbose = verbose if newsite.config["status"].lower() == "up": sites.append(newsite) flock = TestFlock(sites, verbose) if exclusions: flock.exclude(exclusions) if dumpconf: config.write(sys.stdout) elif copykeys: keyfile = config.get("DEFAULT", "sshkeys") flock.update_keys(keyfile) else: if not subdir: subdir = os.getenv("LOGNAME") if not subdir: print "flocktest: you don't exist, go away!" sys.exit(1) agent = "flockdriver.%s" % subdir invocation = "sh flockdriver.%s -d %s" % (subdir, subdir,) if not cianotify: invocation += " -q" if verbose > 1: invocation = "sh -x " + invocation flock.do_remotes(agent, invocation) # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: gpsd-3.15/devtools/flocktest.ini0000664000175000017500000000345512461156335015120 0ustar esresr# This file describes the network of gpsd test sites # These are accounts in machines made available # for regression-testing by GPSD developers. # # For instructions on joining and using this network, see the file # 'flock-instructions'. # # In the default section of the file, the attributes are: # project - project name at CIA.vc # origin = URL for repo pulls; if absent, flocktest requires argument. # regression = test sequence to run # sshkeys = path to file of user keys # [DEFAULT] project = GPSD regression = scons --config=force -c && scons --config=force && scons check # # In each site section, the section name is the FQDN of the host machine. # The attributes are: # # arch: Architecture tag - i686, x96_64, sparc64, etc. = `uname -m` # os: Operating system = `uname -s` # admin: Email address of machine administrator # login: Login name of test account # devices: Comma-separated list of attached GPS/AIS receivers, or '-' for none. # status = anything other than "up" causes this entry to be skipped. # [grelber.thyrsus.com] os = Linux arch = x86_64 admin = esr@thyrsus.com login = gpsd devices = - status = scons version is too old, must upgrade. [devel.recluse.de] os = Linux arch = amd64 admin = bzed@debian.org login = gpsd devices = - status = running version of vserver with no localhost, port binds fail [nog.yazug.com] os = Linux arch = i686 admin = jon.schlueter@gmail.com login = gpsd status = down devices = TNT Revolution (can be available) on /dev/ttyS0, Garmin GPS-18 x2 on USB (probably USB0 and USB2) [quark.yazug.com] os = Linux arch = i686 admin = jon.schlueter@gmail.com login = gpsd devices = - port = 4670 status = down [mitzi.chem.ualberta.ca] os = FreeBSD arch = sparc64 admin = jpihlaja@cc.helsinki.fi login = gpsd devices = - port = 26090 quiet = yes status = down (missing pkg-config) gpsd-3.15/devtools/gpsd-debian-regressions.sh0000775000175000017500000000114612467336022017470 0ustar esresr#!/bin/bash # This file is Copyright (c)2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. set -e logs='last' if [ -n "$1" ]; then logs=$1 fi if [ ! -x /usr/bin/getbuildlog ]; then echo 'Please install the devscripts package!' exit 1 fi TMPDIR=`mktemp -d` OLDPWD=`pwd` cd ${TMPDIR} getbuildlog gpsd $logs || true grep -c -E -- '--- (./)?test' * | grep -E ':0$' | sed 's,^gpsd_[^_]*_\([^.]*\)\.log:0,\1: no regressions,' grep -E -- '--- (./)?test' * | sed 's,\s2013.*,,;s,^gpsd_[^_]*_\([^.]*\)\.log:--- ,\1 ,' | sort -u cd ${OLDPWD} rm -rf ${TMPDIR} gpsd-3.15/devtools/gpsdfake0000664000175000017500000000323212460513551014115 0ustar esresr# 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: gpsd-3.15/devtools/identify_failing_build_options.py0000775000175000017500000000546712506173455021243 0ustar esresr#!/usr/bin/env python import os always_on = [ 'minimal', ] always_off = [ 'leapfetch', ] other = [ 'debug', 'chrpath', 'ipv6', 'manbuild', 'nostrip', 'slow', 'profiling', 'libQgpsmm', ] knobs = [ 'aivdm', 'ashtech', 'bluez', 'clientdebug', 'control_socket', 'controlsend', 'coveraging', 'dbus_export', 'earthmate', 'evermore', 'force_global', 'fury', 'fv18', 'garmin', 'garmintxt', 'geostar', 'gpsclock', 'itrax', 'libgpsmm', 'mtk3301', 'navcom', 'ncurses', 'netfeed', 'nmea0183', 'nmea2000', 'nofloats', 'ntp', 'ntpshm', 'ntrip', 'oceanserver', 'oncore', 'passthrough', 'pps', 'python', 'qt', 'reconfigure', 'rtcm104v2', 'rtcm104v3', 'shared', 'shm_export', 'sirf', 'socket_export', 'squelch', 'superstar2', 'systemd', 'timing', 'tnt', 'tripmate', 'tsip', 'ublox', 'usb', ] def main(starting_number_of_options=0): import itertools failed_configurations = [] for i in range(starting_number_of_options, len(knobs)): jj = itertools.combinations(knobs, i) print 'Testing at length {}'.format(i) for row in list(jj): print row params = [] for key in always_on: params.append(key + "=on") for key in always_off: params.append(key + "=off") for key in knobs: if key in row: params.append(key + "=on") # print {'on_params': row, 'scons_params': params} dev_null = open('/dev/null', 'w') import subprocess command = ['scons', '-j9'] command.extend(params) if os.path.exists('.scons-option-cache'): os.remove('.scons-option-cache') retval = subprocess.call(['scons', '-c'], stdout=dev_null) retval = subprocess.call(command, stdout=dev_null) if retval != 0: failed_configurations.append(command) print command with open('failed_build_configs.txt', 'a') as failed_configs: failed_configs.write(' '.join(command) + '\n') if retval == 0: command = ['scons', 'check'] command.extend(params) retval = subprocess.call(command, stdout=dev_null) if retval != 0: print command with open('check_build_configs.txt', 'a') as failed_configs: failed_configs.write(str(retval) + ' ' + ' '.join(command) + '\n') return failed_configurations if __name__ == '__main__': failed = main(0) for row in failed: print ' '.join(row) gpsd-3.15/devtools/logextract0000775000175000017500000000044712460513551014515 0ustar esresr#!/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' gpsd-3.15/devtools/regress-builder0000775000175000017500000001412712460513551015437 0ustar esresr#!/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. """ usage: regress-builder [-r limit] [-s seed] Test-compile gpsd with each of every possible combination of device-driver options, excluding stub drivers we don't support yet. This does a good job of catching bugs after driver API changes. The -r option sets Monte Carlo mode (random-walk through configuration space) and limits the number of tests. The -s, if given, sets a seed; the default is to seed from the system time. If no options are given, the script performs a sequential test of all possibilities. This requires time on the order of 2 ** n where n is the count of options. """ import os, sys, random, getopt, time driver_names = ( "aivdm", "ashtech", #"earthmate", "evermore", "fv18", "garmin", "garmintxt", "geostar", "gpsclock", "itrax", "mtk3301", "navcom", "nmea", "ntrip", "oncore", "oceanserver", "rtcm104v2", #"rtcm104v3", "sirf", "superstar2", #"tnt", "tripmate", "tsip", "ubx", "timing", "clientdebug", "oldstyle", "ntpshm", "pps", "reconfigure", "controlsend", ) cyclesize = 2 ** len(driver_names) def Sequential(): "Generate sequential test vectors for exhautive search." for i in xrange(cyclesize): yield i return def MonteCarlo(seed): "Generate a random shuffle of test vectors for Monte Carlo testing." # All the magic here is in the choice of modulus. Any odd number will # be relatively prime to any power of two and thus be sufficient to step # around the cycle hitting each number exactly once. We'd like adjacent # stops to have a large distance from each other. Number theory says the # best way to do this is to choose a modulus close to cyclesize / phi, # where phi is the golden ratio (1 + 5**0.5)/2. modulus = int(cyclesize / 1.618033980) if modulus % 2 == 0: modulus += 1 for i in xrange(cyclesize): yield (seed + i * modulus) % cyclesize return class TestFactory: "Manage compilation tests." Preamble = ''' env X_LIBS="" \\ CPPFLAGS="-I/usr/local/include " \\ LDFLAGS=" -L/usr/local/lib -g" \\ CFLAGS="-g -O2 -W -Wall" \\ ./configure --prefix=/home/gpsd --disable-shared \\ ''' def n2v(self, n): "Number to test-vector" v = [0] * len(driver_names) i = 0 while n > 0: v[i] = n % 2 i += 1 n = n >> 1 return v def test_header(self, vector): hdr = "" for (i, name) in enumerate(driver_names): hdr += "--" + ("disable", "enable")[vector[i]] + "-" + name + " " return hdr[:-1] def make(self, vector): if os.system("make 2>&1 > /dev/null"): print "FAILED: ", self.test_header(vector) else: print "SUCCEEDED:", self.test_header(vector) def configure_build(self, vector): test = TestFactory.Preamble for (i, name) in enumerate(driver_names): test += " --" + ("disable", "enable")[vector[i]] + "-" + name + " \\\n" test += "\n" if os.system("("+ test + ") >/dev/null"): print "configure FAILED:", self.test_header(vector) else: self.make(vector) def filter(self, vector): "Tell us whether this combination needs to be tested." # No drivers at all won't even configure if vector == [0] * len(driver_names): return False compiled_in = map(lambda e: e[1], filter(lambda e: e[0], zip(vector, driver_names))) def on(name): return name in compiled_in def off(name): return name not in compiled_in # START OF FILTERS # # Some types require NMEA support and shouldn't be built without it. if off("nmea") and (on("fv18") or on("earthmate") or on("tripmate")): return False # Earthmate, FV-18 and TripMate code scopes don't overlap. if on("fv18") + on("earthmate") + on("tripmate") not in (0, 3): return False # SiRF has no overlapping code scopes with the DLE-led protocols # (TSIP, Garmin, Evermore) but the DLE-led protocols have # overlaps in the packet sniffer. if on("sirf") != (on("tsip") or on("garmin") or on("evermore")): return False # # END OF FILTERS return True def run(self, generator, limit=cyclesize): expect = 0 for i in range(cyclesize): if self.filter(self.n2v(i)): expect += 1 print "# Expect %d of %d tests." % (expect, cyclesize) starttime = time.time() included = 0 excluded = 0 for n in generator: if limit == 0: return vector = self.n2v(n) if not self.filter(vector): print "EXCLUDED:", self.test_header(vector) excluded += 1 else: self.configure_build(vector) included += 1 limit -= 1 elapsed = int(time.time() - starttime) hours = elapsed/3600 minutes = (elapsed - (hours * 3600)) / 60 seconds = elapsed - (hours * 3600) - (minutes * 60) print "%d tests, %d excluded, in %dh%dm%ds" % (included, excluded, hours, minutes, seconds) if __name__ == '__main__': try: (options, arguments) = getopt.getopt(sys.argv[1:], "n:r:") except getopt.GetoptError, msg: print "regress-builder: " + str(msg) raise SystemExit, 1 montecarlo = False limit = cyclesize seed = int(time.time()) for (switch, val) in options: if switch == '-r': montecarlo = True limit = int(val) elif switch == '-s': montecarlo = True seed = int(val) if montecarlo: print "Monte Carlo test seeded with %d" % seed TestFactory().run(MonteCarlo(seed), limit) else: print "Sequential compilation test" TestFactory().run(Sequential()) gpsd-3.15/devtools/regressdiff0000775000175000017500000000254212460513551014642 0ustar esresr#!/usr/bin/env python # # 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 class BufferedFile(file): def __init__(self, name): file.__init__(self, name) self.linebuffer = [] self.lineno = 0 def readline(self): self.lineno += 1 if self.linebuffer: return self.linebuffer.pop() else: return file.readline(self) def pushback(self, line): self.lineno -= 1 self.linebuffer.append(line) def peek(self): return self.linebuffer[-1] def eatspan(f1, f2): consumed = 0 while True: line1 = f1.readline() line2 = f2.readline() if line1 and line2 and line1 == line2: consumed += 1 continue f1.pushback(line1) f2.pushback(line2) return consumed if __name__ == "__main__": f1 = BufferedFile(sys.argv[1]) f2 = BufferedFile(sys.argv[2]) eaten = eatspan(f1, f2) print "First %d lines match" % eaten print `f1.peek()` print `f2.peek()` gpsd-3.15/devtools/reindent0000775000175000017500000000126312460513551014146 0ustar esresr#!/bin/sh # Re-indent the codebase in a uniform style for readability. # # This is more or less a failed experiment, kept for the record. 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 $(INDENT_OPTIONS) *.c for f in *.c; \ do \ sed <$${f} >/tmp/reindent$$$$ -e 's/@ \*/@*/' ; \ mv /tmp/reindent$$$$ $${f} ; \ done chmod u-w *maskdump.c @echo "Diff lines:" `git diff | wc -l` gpsd-3.15/devtools/sizes0000775000175000017500000000320312467340711013472 0ustar esresr#!/usr/bin/env python # # sizes -- explore the sizes of static gpsd binaries # import os # NMEA variants other than vanilla NMEA nmea_variants = [ "fv18=no", "mtk3301=no", "tnt=no", "oceanserver=no", "gpsclock=no", ] # Binary GPS protocols binary_gps = [ "oncore=no", "sirf=no", "superstar2=no", "tsip=no", "tripmate=no", "earthmate=no", "itrax=no", "ashtech=no", "navcom=no", "garmin=no", "garmintxt=no", "ubx=no", "geostar=no", "evermore=no", ] # Differential correction and AIVDM non_gps = [ "rtcm104v2=no", "rtcm104v3=no", "ntrip=no", "aivdm=no", ] # Time service time_service = ["ntpshm=no", "pps=no"] # Debugging and profiling debugging = [ "timing=no", "clientdebug=no", "oldstyle=no", ] def sizeit(legend, tag, options): print legend + ":" print "Options:", " ".join(options) os.system("scons -c > /dev/null; rm -fr .scons*") os.system("scons shared=no " + " ".join(options) + " gpsd >/dev/null") os.rename("gpsd", "gpsd-" + tag + "-build") os.rename("gpsd_config.h", "gpsd_config.h-" + tag) # Main sequence os.system("uname -a") sizeit("Minimalist build, stripped to NMEA only with shm interface", "minimalist", ["socket_export=no", "control_socket=no", "ipv6=no", "netfeed=no", "passthrough=no", "fixed_port_speed=9600", "max_devices=1", ] + nmea_variants + binary_gps + non_gps + time_service + debugging) sizeit("Normal build, configure options defaulted", "normal", []) os.system("size gpsd-*-build") #os.system("rm gpsd-*-build gpsd.h-*") os.system("scons -c > /dev/null; rm -fr .scons*") #end gpsd-3.15/devtools/striplog0000775000175000017500000000301512461156335014202 0ustar esresr#!/usr/bin/python # # striplog -- strip leading lines from logs # # striplog -j strips JSON leader sentences. # 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 secondline = firstline = stripjson = False stripval = 0 (options, arguments) = getopt.getopt(sys.argv[1:], "12n:j") for (switch, val) in options: if (switch == '-1'): firstline = True if (switch == '-2'): secondline = True if (switch == '-n'): stripval = int(val) if (switch == '-j'): stripjson = True try: if firstline: sys.stdin.readline() elif secondline: sys.stdin.readline() sys.stdin.readline() elif stripval: for _dummy in range(stripval): sys.stdin.readline() elif stripjson: while True: line = sys.stdin.readline() if line.startswith('{"class":"VERSION"') \ or line.startswith('{"class":"DEVICE"') \ or line.startswith('{"class":"DEVICES"') \ or line.startswith('{"class":"WATCH"'): continue else: break sys.stdout.write(line) else: while True: line = sys.stdin.readline() if line[0] != '#': break sys.stdout.write(line) sys.stdout.write(sys.stdin.read()) except KeyboardInterrupt: pass gpsd-3.15/devtools/tablegen.py0000775000175000017500000005741312461156335014562 0ustar esresr#!/usr/bin/env python # # This tool is intended to automate away the drudgery in bring up support # for a new AIS message type. It parses the tabular description of a message # and generates various useful code snippets from that. It can also be used to # correct offsets in the tables themselves. # # Requires the AIVDM.txt file on standard input. Takes a single argument, # which must match a string in a //: Type comment. Things you can generate: # # * -t: A corrected version of the table. It will redo all the offsets to be # in conformance with the bit widths. (The other options rely only on the # bit widths). If the old and new tables are different, an error message # describing the corrections will be emitted to standard error. # # * -s: A structure definition capturing the message info, with member # names extracted from the table and types computed from it. # # * -c: Bit-extraction code for the AIVDM driver. Grind out the right sequence # of UBITS, SBITS, and UCHARS macros, and assignments to structure members, # guaranteed correct if the table offsets and widths are. # # * -d: Code to dump the contents of the unpacked message structure as JSON. If # the structure has float members, you'll get an if/then/else guarded by # the scaled flag. # # * -r: A Python initializer stanza for jsongen.py, which is in turn used to # generate the specification structure for a JSON parse that reads JSON # into an instance of the message structure. # # * -a: Generate all of -s, -d, -c, and -r, and -t, not to stdout but to # files named with 'tablegen' as a distinguishing part of the stem. # The stem name can be overridden with the -o option. # # This generates almost all the code required to support a new message type. # It's not quite "Look, ma, no handhacking!" You'll need to add default # values to the Python stanza. If the structure definition contains character # arrays, you'll have to fill in the dimensions by hand. You'll need to add # a bit of glue to ais_json.c so that json_ais_read() actually calls the parser # handing it the specification structure as a control argument. # # The -a, -c, -s, -d, and -r modes all take an argument, which should be a # structure reference prefix to be prepended (before a dot) to each fieldname. # Usually you'll need this to look something like "ais->typeN", but it could be # "ais->typeN.FOO" if the generated code has to operate on a union member # inside a type 6 or 8, or something similar. # # The -S and -E options allow you to generate code only for a specified span # of fields in the table. This may be useful for dealing with groups of # messages that have a common head section. # # This code interprets magic comments in the input # # //: Type # The token following "Type" is the name of the table # //: xxxx vocabulary # A subtable describing a controlled vocabulary for field xxxx in the # preceding table. # # TO-DO: generate code for ais.py. import sys, getopt def correct_table(wfp): # Writes the corrected table. print >>sys.stderr, "Total bits:", base for (i, t) in enumerate(table): if offsets[i].strip(): print >>wfp, "|" + offsets[i] + t[owidth+1:].rstrip() else: print >>wfp, t.rstrip() def make_driver_code(wfp): # Writes calls to bit-extraction macros. # Requires UBITS, SBITS, UCHARS to act as they do in the AIVDM driver. # Also relies on bitlen to be the message bit length, and i to be # available as abn index variable. record = after is None arrayname = None base = '\t' step = " " * 4 indent = base for (i, t) in enumerate(table): if '|' in t: fields = map(lambda s: s.strip(), t.split('|')) width = fields[2] name = fields[4] ftype = fields[5] if after == name: record = True continue if before == name: record = False continue if not record: continue if ftype == 'x': print >>wfp,"\t/* skip %s bit%s */" % (width, ["", "s"][width>'1']) continue if ftype[0] == 'a': arrayname = name explicit = ftype[1] == '^' print >>wfp, '#define ARRAY_BASE %s' % offsets[i].strip() print >>wfp, '#define ELEMENT_SIZE %s' % trailing if explicit: lengthfield = last print >>wfp, indent + "for (i = 0; i < %s; i++) {" % lengthfield else: lengthfield = "n" + arrayname print >>wfp, indent + "for (i = 0; ARRAY_BASE + (ELEMENT_SIZE*i) < bitlen; i++) {" indent += step print >>wfp, indent + "int a = ARRAY_BASE + (ELEMENT_SIZE*i);" continue offset = offsets[i].split('-')[0] if arrayname: target = "%s.%s[i].%s" % (structnme, arrayname, name) offset = "a + " + offset else: target = "%s.%s" % (structname, name) if ftype[0].lower() in ('u', 'i', 'e'): print >>wfp, indent + "%s\t= %sBITS(%s, %s);" % \ (target, {'u':'U', 'e':'U', 'i':'S'}[ftype[0].lower()], offset, width) elif ftype == 't': print >>wfp, indent + "UCHARS(%s, %s);" % (offset, target) elif ftype == 'b': print >>wfp, indent + "%s\t= (bool)UBITS(%s, 1);" % (target, offset) else: print >>wfp, indent + "/* %s bits of type %s */" % (width,ftype) last = name if arrayname: indent = base print >>wfp, indent + "}" if not explicit: print >>wfp, indent + "%s.%s = ind;" % (structname, lengthfield) print >>wfp, "#undef ARRAY_BASE" print >>wfp, "#undef ELEMENT_SIZE" def make_structure(wfp): # Write a structure definition correponding to the table. global structname record = after is None baseindent = 8 step = 4 inwards = step arrayname = None def tabify(n): return ('\t' * (n / 8)) + (" " * (n % 8)) print >>wfp, tabify(baseindent) + "struct {" for (i, t) in enumerate(table): if '|' in t: fields = map(lambda s: s.strip(), t.split('|')) width = fields[2] description = fields[3].strip() name = fields[4] ftype = fields[5] if after == name: record = True continue if before == name: record = False continue if ftype == 'x' or not record: continue if ftype[0] == 'a': arrayname = name if ftype[1] == '^': lengthfield = last ftype = ftype[1:] else: lengthfield = "n%s" % arrayname print >>wfp, tabify(baseindent + inwards) + "signed int %s;" % lengthfield if arrayname.endswith("s"): typename = arrayname[:-1] else: typename = arrayname print >>wfp, tabify(baseindent + inwards) + "struct %s_t {" % typename inwards += step arraydim = ftype[1:] continue elif ftype == 'u' or ftype == 'e' or ftype[0] == 'U': decl = "unsigned int %s;\t/* %s */" % (name, description) elif ftype == 'i' or ftype[0] == 'I': decl = "signed int %s;\t/* %s */" % (name, description) elif ftype == 'b': decl = "bool %s;\t/* %s */" % (name, description) elif ftype == 't': stl = int(width)/6 decl = "char %s[%d+1];\t/* %s */" % (name, stl, description) else: decl = "/* %s bits of type %s */" % (width, ftype) print >>wfp, tabify(baseindent + inwards) + decl last = name if arrayname: inwards -= step print >>wfp, tabify(baseindent + inwards) + "} %s[%s];" % (arrayname, arraydim) if "->" in structname: typename = structname.split("->")[1] if "." in typename: structname = structname.split(".")[1] print >>wfp, tabify(baseindent) + "} %s;" % typename def make_json_dumper(wfp): # Write the skeleton of a JSON dump corresponding to the table. # Also, if there are subtables, some initializers if subtables: for (name, lines) in subtables: wfp.write(" const char *%s_vocabulary[] = {\n" % name) for line in lines: value = line[1] if value.endswith(" (default)"): value = value[:-10] wfp.write(' "%s",\n' % value) wfp.write(" };\n") wfp.write('#define DISPLAY_%s(n) (((n) < (unsigned int)NITEMS(%s_vocabulary)) ? %s_vocabulary[n] : "INVALID %s")\n' % (name.upper(), name, name, name.upper())) wfp.write("\n") record = after is None # Elements of each tuple type except 'a': # 1. variable name, # 2. unscaled printf format # 3. wrapper for unscaled variable reference # 4. scaled printf format # 5. wrapper for scaled variable reference # Elements of 'a' tuple: # 1. Name of array field # 2. None # 3. None # 4. None # 5. Name of length field tuples = [] vocabularies = [x[0] for x in subtables] for (i, t) in enumerate(table): if '|' in t: fields = map(lambda s: s.strip(), t.split('|')) name = fields[4] ftype = fields[5] if after == name: record = True continue if before == name: record = False continue if ftype == 'x' or not record: continue fmt = r'\"%s\":' % name fmt_text = r'\"%s_text\":' % name if ftype == 'u': tuples.append((name, fmt+"%u", "%s", None, None)) elif ftype == 'e': tuples.append((name, fmt+"%u", "%s", None, None)) if vocabularies: this = vocabularies.pop(0) ref = "DISPLAY_%s(%%s)" % (this.upper()) else: ref = 'FOO[%s]' tuples.append((name, fmt_text+r"\"%s\"", ref, None, None)) elif ftype == 'i': tuples.append((name, fmt+"%d", "%s", None, None)) elif ftype == 't': tuples.append((name, fmt+r'\"%s\"', "%s", None, None)) elif ftype == 'b': tuples.append((name, fmt+r'\"%s\"', "JSON_BOOL(%s)", None, None)) elif ftype[0] == 'd': print >>sys.stderr, "Cannot generate code for data members" sys.exit(1) elif ftype[0] == 'U': tuples.append((name, fmt+"%u", "%s", fmt+"%%.%sf" % ftype[1], '%s / SCALE')) elif ftype[0] == 'I': tuples.append((name, fmt+"%d", "%s", fmt+"%%.%sf" % ftype[1], '%s / SCALE')) elif ftype[0] == 'a': ftype = ftype[1:] if ftype[0] == '^': lengthfield = last else: lengthfield = "n" + name tuples.append((name, None, None, None, lengthfield)) else: print >>sys.stderr, "Unknown type code", ftype sys.exit(1) last = name startspan = 0 def scaled(i): return tuples[i][3] is not None def tslice(e, i): return map(lambda x: x[i], tuples[startspan:e+1]) base = " " * 8 step = " " * 4 inarray = None header = "(void)snprintf(buf + strlen(buf), buflen - strlen(buf)," for (i, (var, uf, uv, sf, sv)) in enumerate(tuples): if uf == None: print >>wfp, base + "for (i = 0; i < %s.%s; i++) {" % (structname, sv) inarray = var base = " " * 12 startspan = i+1 continue # At end of tuples, or if scaled flag changes, or if next op is array, # flush out dump code for a span of fields. if i+1 == len(tuples): endit = '}",' elif tuples[i+1][1] == None: endit = r',\"%s\":[",' % tuples[i+1][0] elif scaled(i) != scaled(i+1): endit = ',",' else: endit = None if endit: if not scaled(i): print >>wfp, base + header if inarray: prefix = '{"' else: prefix = '"' print >>wfp, base + step + prefix +','.join(tslice(i,1)) + endit for (j, t) in enumerate(tuples[startspan:i+1]): if inarray: ref = structname + "." + inarray + "[i]." + t[0] else: ref = structname + "." + t[0] wfp.write(base + step + t[2] % ref) if j == i - startspan: wfp.write(");\n") else: wfp.write(",\n") else: print >>wfp, base + "if (scaled)" print >>wfp, base + step + header print >>wfp, base + step*2 + '"'+','.join(tslice(i,3)) + endit for (j, t) in enumerate(tuples[startspan:i+1]): if inarray: ref = structname + "." + inarray + "[i]." + t[0] else: ref = structname + "." + t[0] wfp.write(base + step*2 + t[4] % ref) if j == i - startspan: wfp.write(");\n") else: wfp.write(",\n") print >>wfp, base + "else" print >>wfp, base + step + header print >>wfp, base + step*2 + '"'+','.join(tslice(i,1)) + endit for (j, t) in enumerate(tuples[startspan:i+1]): if inarray: ref = structname + "." + inarray + "[i]." + t[0] else: ref = structname + "." + t[0] wfp.write(base + step*2 + t[2] % ref) if j == i - startspan: wfp.write(");\n") else: wfp.write(",\n") startspan = i+1 # If we were looking at a trailing array, close scope if inarray: base = " " * 8 print >>wfp, base + "}" print >>wfp, base + "if (buf[strlen(buf)-1] == ',')" print >>wfp, base + step + r"buf[strlen(buf)-1] = '\0';" print >>wfp, base + "(void)strlcat(buf, \"]}\", buflen - strlen(buf));" def make_json_generator(wfp): # Write a stanza for jsongen.py.in describing how to generate a # JSON parser initializer from this table. You need to fill in # __INITIALIZER__ and default values after this is generated. extra = "" arrayname = None record = after is None print >>wfp, '''\ { "initname" : "__INITIALIZER__", "headers": ("AIS_HEADER",), "structname": "%s", "fieldmap":( # fieldname type default''' % (structname,) for (i, t) in enumerate(table): if '|' in t: fields = map(lambda s: s.strip(), t.split('|')) name = fields[4] ftype = fields[5] if after == name: record = True continue if before == name: record = False continue if ftype == 'x' or not record: continue if ftype[0] == 'a': arrayname = name if arrayname.endswith("s"): typename = arrayname[:-1] else: typename = arrayname readtype = 'array' dimension = ftype[1:] if dimension[0] == '^': lengthfield = last dimension = dimension[1:] else: lengthfield = "n" + arrayname extra = " " * 8 print >>wfp, " ('%s',%s 'array', (" % \ (arrayname, " "*(10-len(arrayname))) print >>wfp, " ('%s_t', '%s', (" % (typename, lengthfield) else: # Depends on the assumption that the read code # always sees unscaled JSON. readtype = { 'u': "uinteger", 'U': "uinteger", 'e': "uinteger", 'i': "integer", 'I': "integer", 'b': "boolean", 't': "string", 'd': "string", }[ftype[0]] typedefault = { 'u': "'PUT_DEFAULT_HERE'", 'U': "'PUT_DEFAULT_HERE'", 'e': "'PUT DEFAULT HERE'", 'i': "'PUT_DEFAULT_HERE'", 'I': "'PUT_DEFAULT_HERE'", 'b': "\'false\'", 't': "None", }[ftype[0]] namedefaults = { "month": "'0'", "day": "'0'", "hour": "'24'", "minute": "'60'", "second": "'60'", } default = namedefaults.get(name) or typedefault print >>wfp, extra + " ('%s',%s '%s',%s %s)," % (name, " "*(10-len(name)), readtype, " "*(8-len(readtype)), default) if ftype[0] == 'e': print >>wfp, extra + " ('%s_text',%s'ignore', None)," % \ (name, " "*(6-len(name))) last = name if arrayname: print >>wfp, " ))))," print >>wfp, " )," print >>wfp, " }," if __name__ == '__main__': try: (options, arguments) = getopt.getopt(sys.argv[1:], "a:tc:s:d:S:E:r:o:") except getopt.GetoptError, msg: print "tablecheck.py: " + str(msg) raise SystemExit, 1 generate = maketable = makestruct = makedump = readgen = all = False after = before = None filestem = "tablegen" for (switch, val) in options: if switch == '-a': all = True structname = val elif switch == '-c': generate = True structname = val elif switch == '-s': makestruct = True structname = val elif switch == '-t': maketable = True elif switch == '-d': makedump = True structname = val elif switch == '-r': readgen = True structname = val elif switch == '-S': after = val elif switch == '-E': before = val elif switch == '-o': filestem = val if not generate and not maketable and not makestruct and not makedump and not readgen and not all: print >>sys.stderr, "tablecheck.py: no mode selected" sys.exit(1) # First, read in the table. # Sets the following: # table - the table lines # widths - array of table widths # ranges - array of table offsets # trailing - bit length of the table or trailing array element # subtables - list of following vocabulary tables. tablename = arguments[0] table = [] ranges = [] subtables = [] state = 0 for line in sys.stdin: if state == 0 and line.startswith("//: Type") and tablename in line: state = 1 continue elif state == 1: # Found table tag if line.startswith("|="): state = 2 continue elif state == 2: # Found table header if line.startswith("|="): state = 3 continue elif line[0] == '|': fields = line.split("|") trailing = fields[1] ranges.append(fields[1].strip()) fields[1] = " " * len(fields[1]) line = "|".join(fields) else: ranges.append('') table.append(line) continue elif state == 3: # Found table end state = 4 continue elif state == 4: # Skipping until subsidiary table if line.startswith("//:") and "vocabulary" in line: subtable_name = line.split()[1] subtable_content = [] state = 5 elif state == 5: # Seen subtable header if line.startswith("|="): state = 6 continue elif state == 6: # Parsing subtable content if line.startswith("|="): subtables.append((subtable_name, subtable_content)) state = 4 continue elif line[0] == '|': subtable_content.append([f.strip() for f in line[1:].strip().split("|")]) continue if state == 0: print >>sys.stderr, "Can't find named table." sys.exit(1) elif state < 3: print >>sys.stderr, "Ill-formed table (in state %d)." % state sys.exit(1) table = table[1:] ranges = ranges[1:] widths = [] for line in table: fields = line.split('|') if '|' not in line: # Continuation line widths.append('') elif fields[5][0] == 'a': # Array boundary indicator widths.append(None) else: widths.append(fields[2].strip()) if '-' in trailing: trailing = trailing.split('-')[1] trailing = str(int(trailing)+1) # Compute offsets for an AIVDM message breakdown, given the bit widths. offsets = [] base = 0 corrections = False for w in widths: if w is None: offsets.append(`base`) base = 0 elif w == '': offsets.append('') else: w = int(w) offsets.append("%d-%d" % (base, base + w - 1)) base += w if filter(lambda p: p[0] != p[1], zip(ranges, offsets)): corrections = True print "Offset corrections:" for (old, new) in zip(ranges, offsets): if old != new: print >>sys.stderr, old, "->", new owidth = max(*map(len, offsets)) for (i, off) in enumerate(offsets): offsets[i] += " " * (owidth - len(offsets[i])) # Here's where we generate useful output. if all: if corrections: correct_table(open(filestem + ".txt", "w")) make_driver_code(open(filestem + ".c", "w")) make_structure(open(filestem + ".h", "w")) make_json_dumper(open(filestem + "_json.c", "w")) make_json_generator(open(filestem + ".py", "w")) elif maketable: correct_table(sys.stdout) elif generate: make_driver_code(sys.stdout) elif makestruct: make_structure(sys.stdout) elif makedump: make_json_dumper(sys.stdout) elif readgen: make_json_generator(sys.stdout) # end gpsd-3.15/devtools/test_json_validity.py0000775000175000017500000000114612506517170016704 0ustar esresr#!/usr/bin/env python # # Christian Gagneraud - 2012 # Simple python script that will parse json dictionaries on its input, # If it fails, it will print the offending line and an error message. # The goal is to check that GPSD outputs valid JSON. # import json, sys success = True lc = 0 for line in sys.stdin.readlines(): lc += 1 try: # Load the json dictionary, it should raise an error if it is malformed item = json.loads(line) except ValueError as e: success = False print "%d: %s" % (lc, line.strip()) print "%d: %s" % (lc, e) exit(0 if success else 1) gpsd-3.15/dgpsip-servers0000664000175000017500000000077712460513551013462 0ustar esresr# Publicly available DGPS correction servers # Three fields are: Latitude, longitude, server name[:port] # Degree fractional parts are decimal, not mmss. They can be approximate, # as they are only used to find the closest server. # Some of the data in this file is from the EUREF project page at # http://www.epncb.oma.be/_organisation/projects/euref_IP/ # 37.19 -122.39 dgps.wsrcc.com # Pt. Blunt, CA USA 39.14 8.97 glonass.ca.astro.it # Cagliari, Italy 50.01 19.92 gps1.geod.agh.edu.pl # Krakow, Poland gpsd-3.15/doc/Makefile0000664000175000017500000000011012461156335012750 0ustar esresrexplanation.html: $(shell ls *.xml) xmlto xhtml-nochunks internals.xml gpsd-3.15/doc/README0000664000175000017500000000007012460513551012171 0ustar esresrThis is internals documentation written by Mick Durkin. gpsd-3.15/doc/explan_bits.h.xml0000664000175000017500000000156412460513551014602 0ustar esresr<filename>bits.h</filename> Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. This file only contains macros that convert data variables from the native format of the device output (MSB-first or LSB-first) into a standard form for gpsd use. This makes data parsing consistent regardless of the underlying format. If the device driver file makes no deliberate selection, the default is to assume the device emits data in big-endian (network byte) order. gpsd-3.15/doc/explan_dbusexport.c.xml0000664000175000017500000000162012460513551016024 0ustar esresr<filename>dbusexport.c</filename> Functions:-Handles initialization of and communication with the DBUS. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. int initialize_dbus_connection(void) Initializes the DBUS connection. void send_dbus_fix(struct gps_device_t* channel) Sends the current fix data for this channel via dbus gpsd-3.15/doc/explan_driver_nmea.c.xml0000664000175000017500000002563312460513551016132 0ustar esresr<filename>nmea_parse.c</filename> Functions:-Parser for NMEA strings, generic and proprietary. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. static void do_lat_lon(char *field[], struct gps_fix_t *out) Reads a four element array containing the value and hemisphere of the latitude and longitude of a location as text. It converts them into signed (-ve for S and W) values. The gps_data_t structure is updated with the new value(s). static void merge_ddmmyy(char *ddmmyy, struct gps_device_t *session) If the century has not yet been stored in the nmea driver private data, take the supplied ddmmyy date and generate and store a ddmmyyyy date, using the century value compiled in from timebase.h. static void merge_hhmmss(char *hhmmss, struct gps_device_t *session) Stash the present hour value before updating it from the incoming data. If the new hour is less than the stashed value, we have passed midnight, so update the day value. Finally update the minutes, seconds and fractions of a second from the incoming data. static gps_mask_t processGPRMC(int count, char *field[], struct gps_device_t *session) Handle a $GPRMC sentence stored in an array of strings, one member per field.Check if the message is stamped valid or not.If it is invalid, set the status and fix mode to NO_FIX and save the corresponding flags locally; also save the online flag to indicate we have handled a known sentence.If the fix is autonomous and valid, start to decode the fields.First, test if there are enough fields available; then handle the date and time via merge_ddmmyy() and merge_hhmmss(), storing the TIME_SET flag and storing the fix time as a UNIX-epoch relative value.If the sentence time and this fix time are different, we have started a new cycle of observation, so update the sentence time and the store the CYCLE_START_SET flag.Whatever the number of fields, store the fix co-ordinates via do_lat_lon(), store the speed and the track and save the corresponding flags.Return the local aggregated flags to allow the main copy in the session data to be updated. static gps_mask_t processGPGLL(int count, char *field[], struct gps_device_t *session) Preload the local flag with the ERROR_SET flag.Check that the sentence is usable, exiting with the preset error flag if it is not.If it is usable, clear the local flags and start processing the fields, updating any local flag fields on the way.If the year is already known, update the time and check for the start of cycle (see processGPRMC() above).Handle the fix location and, if the number of received fixes is more than 8 and the status is differential, stash the new status as STATUS_DGPS_FIX; otherwise stash STATUS_FIX.If the present mode is less than 2D_FIX, update it to 2D_FIX.Write the stashed value of newstatus into the session status and return all the locally aggregated flags. static gps_mask_t processGPGGA(int c UNUSED, char *field[], struct gps_device_t *session) Stash the last fix time. Set the status to the value in the message and update the local flag variable.If the status is STATUS_NO_FIX, exit immediately, returning the locally aggregated flags. If there is a fix, process it.Handle the time as in processGPGLL() above. Handle the latitiude and longitude with a call to do_lat_lon() above and set the local flag.Update the satellites_used field and stash the altitude.If the altitude is empty, force the fix mode and status to 2D if it was 3D previously.If it is not empty, stash the old value of altitude and replace it with the new value stashed earlier and set the local flag variable. If the mode is presently less than 3D, update it to 3D and set the local flag.If the stashed old altitude is NaN or the stashed fix time and current fix time are equal, set the climb rate to 0 otherwise calculate it by dividing the altitude difference by the time difference and set the local flag.If the geoid separation is available, store it, otherwise store the value from wgs84_separation() that depends on current location.Finally, return all the locally aggregated flags. static gps_mask_t processGPGSA(int count, char *field[], struct gps_device_t *session) Start with a simple validity check on the number of fields (for i.Trek M3) and bail out with a simple indication of on-line status if it fails.Set the fix mode from the sentence and either clear the local flag variable (if an Antaris chipset says we are in dead-reckoning mode) or set the MODE_SET flag.Update all the DOP fields from the sentence, clear the count of used satellites, then scan all the satellite data.If any satellite is good (prn != 0), store the prn and increment the count of used satellites.Finally, set the local flags to indicate that DOPs are available and return all the locally aggregated flags. static gps_mask_t processGPGSV(int count, char *field[], struct gps_device_t *session) Check if the sentence has too few fields or the wrong number fo fields. In this case, clear the data for all satellites and return with an error indication.Start to parse the sentence. First, note how many sentences are to be expected to complete the data transfer.If the sentence number is invalid, clear the data for all satellites and return with an error indication.If this is the first sentence of the sequence, clear the data for all satellites.Loop through the sentence fields, updating the session's satellite data.If any satellite number is higher than the number of channels, clear all satellite data and break out of the loop.Assuming this is not a buggy chipset (e.g. Motorola Oncore GT+), update the satellite count and loop again.If this was the last sentence of the block and the number of satellites seen is not the same as the number reported, generate an error log.If this is not the last sentence of the block, exit early and return an error flag as a guard.Finally, on the last sentence, carry out a sanity check and either return an error flag or a SATELLITE_SET flag. static gps_mask_t processPGRME(int c UNUSED, char *field[], struct gps_device_t *session) Check that the error estimate data is good. If not, set all error estimate fields to 100m and return an error flag.If they are good, calculate the error value and store it. Return the appropriate flag values. static gps_mask_t processGPZDA(int c UNUSED, char *field[], struct gps_device_t *session) Set the local flag variable to indicate that the time is available.Store the actual time by a call to merge_hhmmss() and fill in the other fields from the sentence data.If the sentence is not timestamped the same as the fixtime, set the CYCLE_START_SET flag.Update the fixtime to the sentence timestamp.Finally, return all the locally aggregated flags. static gps_mask_t processTNTHTM(int c UNUSED, char *field[], struct gps_device_t *session) Set the local variable to indicate the unit is on-line.Fill all appropriate fields from the sentence and set the associated flags in the local flag variable.Set the fix status and return all the locally aggregated flags. static short nmea_checksum(char *sentence, unsigned char *correct_sum) Calculate and return the checksum of an NMEA sentence. gps_mask_t nmea_parse(char *sentence, struct gps_device_t *session) Test that the length of the NMEA sentence is acceptable, simply returning an on-line indication if it is too long to handle.If it is within limits, make a local copy and split it on the commas into an array, one field per element.Use the first element to match the command to the table of decodable commands.Check if it is supported and the number of fields is reasonable, invoke the correct decoder and return the value from that call.If it fails the check, simply return an on-line status.This function is also responsible for performing adaptive end-of-cycle detection. void nmea_add_checksum(char *sentence) Calculate the checksum then append '*' + the checksum + CR/LF to the end of an NMEA sentence, skipping any existing '*'. int nmea_write(struct gps_device_t *session, const char *fmt, ... ) Ship a string to an NMEA device, adding a checksum and CR/LF if needed. A checksum is added only if the sentence begins with '$'. Bytes written are returned. int nmea_send(struct gps_device_t *session, , const char *fmt, ... ) A wrapper around nmea_write() to give it sprintf-like varargs behavior. gpsd-3.15/doc/explan_driver_proto.c.xml0000664000175000017500000000115612460513551016347 0ustar esresr<filename>driver_proto.c</filename> Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. This is a dummy file to use as a skeleton for writing a new driver. The driver is heavily commented, so refer to the source code. gpsd-3.15/doc/explan_driver_rtcm2.c.xml0000664000175000017500000000354512460513551016237 0ustar esresr<filename>rtcm.c</filename> Functions:-This is a decoder for the RTCM-104 serial protocol. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. void rtcm2_unpack(struct rtcm2_t *tp, char *buf) Splits RTCM2 raw data into fields. bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t *buf) Packs RTCM2 fields into a raw data stream. static bool preamble_match(isgps30bits_t *w) Tells if the preamble field in a message is valid or not. static bool length_check(struct gps_packet_t *lexer) Tells if the message length is valid or not. enum isgpsstat_t rtcm2_decode(struct gps_packet_t *lexer, unsigned int c) A simple call to isgps_decode(). void rtcm2_dump(struct rtcm2_t *rtcm2, char buf[], size_t buflen) Dump the contents of a parsed RTCM104v2 message. void rtcm2_output_magnavox(isgps30bits_t *ip, FILE *fp) Ship an RTCM2 message in the format emitted by Magnavox DGPS receivers. gpsd-3.15/doc/explan_drivers.c.xml0000664000175000017500000000606112460513551015307 0ustar esresr<filename>drivers.c</filename> Functions:-This is the main driver for NMEA, both plain vanilla and any manufacturer specific variety of NMEA output. This is NOT where manufacturer specific binary matters are handled. Notes based on cde as of Mon Apr 5 21:38:06 2010 -0400. ssize_t generic_get(struct gps_device_t *session) This is a wrapper to call the real packet getter function, packet_get(). ssize_t pass_rtcm(struct gps_device_t *session, char *buf, size_t rtcmbytes) This writes the rtcm data to the device. gps_mask_t nmea_parse_input(struct gps_device_t *session) If the packet is a comment packet, ignore it and return 0.If it is one of several binary packets, issue a warning to that effect.If the relevant driver exists, switch to that driver and get it to parse the packet. The return value is that of the binary parser.If the driver does not exist, ignore the packet and return 0.If after all this, it is likely to be an NMEA packet, so try to parse it with the NMEA parser. If that returns a 0 (unsuccessful), then check if it is a trigger packet for one of the triggerable drivers.If this succeeds, return 1, otherwise issue an unrecognised packet error.Finally checks are made against openBSD's NMEA Line Discipline to make use of timestamping and if ntpd synchronising is active, the time is passed to the ntp daemon. static void nmea_probe_subtype(struct gps_device_t *session, unsigned int seq) This tries to probe for the NMEA mode of several popular chipsets. Most are detected by a trigger string. Several functions are omitted which are device specific. These are not covered here since they ARE device specific. static gps_mask_t rtcm104_analyze(struct gps_device_t *session) This function calls rtcm_unpack() to unpack rtcm packets into the session buffer. The last important thing in this code is an array of addresses, one for each compiled-in driver. This address gets us to the capabilities table in the bottom of each driver where we find what functions a driver supports and the entry address for each function. gpsd-3.15/doc/explan_geoid.c.xml0000664000175000017500000000415012460513551014715 0ustar esresr<filename>geoid.c</filename> Functions:-Provides conversion between the ECEF and WGS84 co-ordinate reference systems. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. static double bilinear(double x1, double y1, double x2, double y2, double x, double y, double z11, double z12, double z21, double z22) This is a piece of mathematical manipulation only used internally in this code, so wrestle with it if you will! It's used to perform bilinear interpolation on the grid points in the WGS4 geoidal-separation array. double wgs84_separation(double lat, double lon) This is used by drivers to get the separation of MSL from the WGS84 datum at a pair of Latitude/Longitude co-ordinates. The data is in a pre-defined table. void ecef_to_wgs84fix(struct gps_data_t *gpsdata, double x, double y, double z, double vx, double vy, double vz, float *separation) This does exactly what it says! Co-ordinate system conversion from ecef to the wgs84 equivalent. Geodetic separation for the fix is left in *separation static double fix_minuz(double d) This forces a value of -0.0 to be the same as 0.0 so that certain trig functions act in a predictable manner. int main(int argc, char **argv) This is a local test routine which exercises the other code for debugging purposes. It is normally shut off by an #ifdef. gpsd-3.15/doc/explan_gps.h.xml0000664000175000017500000000243112460513551014424 0ustar esresr<filename>gps.h</filename> Structures:-The interface of the libgps library, provides data structures the library needs and that the daemon fills. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400 struct gps_fix_t {} This is the fix related data gathered from the gps device. Each client session has 2, the current fix and the previous fix. struct rtcm2_t {} This holds the data being processed by the rtcm functions. struct gps_data_t {} This contains ALL the data available from the daemon; the actual fix, status flags, headings etc. Basically any good stuff that we might want goes here. gpsd-3.15/doc/explan_gpsd.c.xml0000664000175000017500000004236112476614336014603 0ustar esresr<filename>gpsd.c</filename> Functions:-This is the main body of the daemon. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. static void onsig(int sig) This is a simple catchall routine to trap wanted signal. Simply store the signal number in a variable to advise the main loop which signal to handle. static int daemonize(void) Try to fork() a child process. The parent will get a return value of either -1 (on a failure to fork()) or non-zero (the child's PID). The parent routine will use this information to either return -1 or exit with an exit code of 0 (i.e. the parent terminates, leaving the child running).The child instance gets a return value of 0 (on an unsuccessful fork() there is no child), so this value is used as the trigger to do the following useful stuff.First, the child tries to create a new session, returning -1 if unable to do so. If succesful, it will have inherited the exiting parent's session.Next switch to the root directory and try to open /dev/null. If that succeeds, force stdin, stdout and stderr to duplicate the fd of /dev/null. If the fd being used for the operation is >2, release it.Finally, set the flag which indicates the process is in the background and return a value of 0. static void usage(void) Simply print a big list of the invocation parameters to the default gpsd port (2947, allocated by IANA). static int passivesock_af(char *service, char *tcp_or_udp, int qlen) Initialise an Internet socket address structure and preload the family and address fields to accept Internet Protocol and any address.Test to see if the incoming service and protocol exist in /etc/services. If they do, store the port number in the structure (massaging byte order as needed); if they don't, exit with a -1.Test to see if the protocol is listed in /etc/services, exiting with -1 if it is not.Test if the protocol is udp or not, setting the type accordingly.Try to open a socket with the accumulated settings, exiting with -1 if it fails.Try to set the socket options correctly, again exiting with -1 if it fails.Try to bind to the open socket; if it fails exit with -1 as earlier, but give a special warning if the error indicates that gpsd may already be active on the socket.If we are using a stream type socket and we are unable to listen to the port we exit with -1.The last possibility is a successful set of operations which is signalled by returning the socket fd number. static int passivesocks(char *service, char *tcp_or_udp, int qlen, int socks[]) Open a passive socket for each supported address family; presently the supported families are IPV4 and IPv6. This socket will be used to listen for client command connections. Sockets are left in the final array argument, and the number successfully opened is returned.> static int filesock(char *filename) Try and open a socket for Local (UNIX) communications in streaming mode. If the open fails, return with a -1.If it opens, copy the incoming filename into the socket control structure, bind to the socket and try to listen on it.Signal a failure by returning -1 and success by returning the socket fd number. static void adjust_max_fd(int fd, bool on) If the incoming boolean flag is active, check if the fd number passed is greater than the highest seen so far. If so, save it as the new highest value.If the boolean is passive we can take some further action, depending if we are interested in limiting the maximum number of devices and client fds (set by compile time options).If we are not limiting ourselves, then we check for the case when we are actually at the highest fd seen so far. In that case, scan through all fds available to the system and store the highest active fd number in our allocation set as the new highest value. static struct subscriber_t* allocate_client(void) Scan through all the client file descriptors, looking for one which does not have a device allocated to it.On a match, exit early, returning this fd.If none are available, return a NULL. static void detach_client(struct subscriber_t *sub) Close the given fd and remove it from our allocation set.Make a call to adjust_max_fd() to housekeep the highest fd marker if needed.Set important fields in the client's datablock to safe values for the next re-use, then return. static ssize_t throttled_write(struct subscriber_t *sub, char *buf, ssize_t len) Check if we have a high enough debug level active to warrant printing out the information we are about to send to the client.Make the actual write() call and if that was successful, return the counter value from that operation.If we have suffered some kind of failure, try to analyse it.On a short write, detach the client and return a 0.Trap EAGAIN or EINTR and return a 0.Trap EBADF or a EWOULDBLOCK where the client has not read data for more than a reasonable amount of time and generate a suitable report.For all other errors, generate a general error. In these last several cases, call detach_cient().Finally, return the status (-1 in this case). static void notify_watchers(struct gps_device_t *device, const char *sentence, ...) For every possible subscriber, check if the subscriber is in watcher mode and is interested in the gps device indicated in the calling parameter gps_device_t.If so, send the data via a call to throttled_write(). static struct gps_device_t *find_device(const char *device_name) For every possible channel, check if the channel is allocated and if the device on the channel is the one passed to us.If it is so, exit early and return the channel number.If there is no match, return a NULL. static void deactivate_device(struct gps_device_t *device) Deactivate device, but leave it in the device pool; do not free it. This means it will be available to be watched on subsequent client opens. bool open_device(struct gps_device_t *devp) Try to activate the device via a call to gpsd_activate().If this fails return false.If it succeeds, add the fd to our list of active fds, housekeep the highest fd number and return true. static bool add_device(const char *device_name) Add a device to the pool of those available. If in nowait mode, open it immediately; otherwise initialize it and make it available for future watches, but don't open it yet. static bool awaken(struct subscriber_t *user, struct gps_device_t *device) If the device is not initialized, attempt to open the specified device on behalf of the specified user. If you succeed and the device has an active fd, you're done. If it does not, make a call to gpsd_activate().If this fails, return false, if not, add the fd to our list of active fds and housekeep the highest fd.Check if the user is in watcher mode but not tied to a specific device. static char *snarfline(char *p, char **out) Copy the input line into a new buffer stopping at the first non-printable or whitespace character. static bool privileged_user(struct gps_device_t *device) Scan all subscribers and count all who are connected to the device. If only the one user is connected, return true, otherwise return false. static void handle_request(struct subscriber_t* sub, char *buf, const char **after, char *reply, size_t replylen) Perform a single GPSD JSON command. Accept the command response into a reply buffer, and update the after pointer to point just after the parsed JSON object. static int handle_gpsd_request(struct subscriber_t *sub, const char *buf) Parse multiple GPSD JSON commands out of a buffer and perform each. Ship all responses back to the user via throttled_write(). static void handle_control(int sfd, char *buf) This code is similar in function to handle_gpsd_request() in that it parses user input. It expects the commands to be one per line and despatches them according to the leading character, which is limited to one of '-', '+' or '!'.In the first case, the body of the command is assumed to be a device to remove from the search list. If found, it is removed, any clients are advised and OK is written to the calling socket fd. If the device is not found ERROR is written to the calling socket fd.In the second case, the body of the command is assumed to be a device to be used by the daemon. If the device is already known, or does not respond to open_device(), ERROR is written to the calling socket fd, otherwise OK is written.In the third case, the command is assumed to be a device-specific control string in the form !device_name=control_string. If the string is ill-formed or the device is not found ERROR is written to the calling socket fd. If all is well, the control string is written to the device and OK is written to the calling socket fd. int main(int argc, char *argv[]) If the 1PPS function is compiled in, initialise the local mutex structure for use by the program.A while() loop reads in any command line arguments which are options and handles the options. Most set an internal variable to control action when running, either to a fixed value or to the associated option's parameter.Carry out a series of calls to routines to set things up ready for the main task (e.g. opening a control socket if one is needed). We also take care of tasks such as daemonizing when appropriate. The last piece of preparation is to set the permissions of the default devices correctly if we are daemonizing and are presently running as root.Switch to the compiled in user name (typically nobody) and the group used by the tty devices.Now we clear important data for all the records in the subscriber list.Use setjmp() to prepare things for when the daemon terminates.Clear the semaphore variable which will contain the signal number if one arrives and set some important signals so they are trapped by the stub handler in onsig().Add the command and RTCM sockets (if active) to the list of active fds, housekeeping the highest fd number and pre-clear the list of control fds.Process the remaining parameter on the command line which should be the device name and try to open the specified device.Enter the main execution loop, a while() loop which terminates if a signal sets the semaphore variable. What follows will repeat over and over until an external termination happens.First we make a working copy of the active fds and then we make a time-limited (1 second time limit) call to select() using the working copy of the fds. This means that when the select() returns, we will either have returned on timeout or because some fd became ready to read.First we check if any new clients have come active and (if we have resources) allocate a subscriber slot to it, doing housekeeping such as adding it to the main list of active fds and removing it from the local copy of the list. If RTCM support is compiled in, the last operation is repeated for any new RTCM client. The operation is then repeated for any new control socket clients.If we are expecting DGPS reports, make a call to netgnss_poll() and if there are no ready reports, clear the fd from the main and local active fd lists.Check if any of the active control sockets has sent one or more commands.For every one which has sent commands, make calls to handle_control() to process them and remove the associated fd from the main and control lists of active fds.Poll every active gps device and send RTCM data to it (if needed), followed by reading its output (if any). If the device returns an error, disable the device. If it has gone off-line, disable the device.If we get here, we have something to handle, so we take care of a device which we know about, but do not have a subtype for.We send the available data to all subscribers who are connected to this device. If the data is RTCM information, pass it to all GPS devices that can accept the data.Handle any subscribers who are in watcher mode building up an appropriate set of requests, depending on the available data and passing the requests to handle_gpsd_request().If we care about DBUS, send the fix to the DBUS.Note that this small section of code is presently disabled pending development of the DGNSS function. If DGNSS is available and we have a fix, we poll a DGNSS report via dgnss_autoconnect().Loop round all clients and process active ones. We check for input from them and if the read fails, the client is released with detach_client(). If it succeeds, any data is handled via handle_rtc_request() or handle_gpsd_request().If the transaction fails, the client is released with detach_client().If the client has timed out with no device assigned, it is released with detach_client().If the client has a device, but has timed out on no response (when not in raw or watcher modes) it is released with detach_client().If we are not running in nowait mode, we are supposed to go idle after a timeout when there are no clients.If a device (with a known type) has no active clients, then we can actually make it idle via gpsd_deactivate().If we reach here, we are out of the endless while loop. We check if the signal was SIGHUP and restart the program if it was. If it is any other signal, we deallocate all channels and wrap up any devices. Finally we check for the existence of a control socket or a pid file and delete them. gpsd-3.15/doc/explan_gpsd.h.xml0000664000175000017500000000413412460513551014572 0ustar esresr<filename>gpsd.h</filename> Structures:-Provides fundamental types and structures for the GPS daemon. Only key structures are analysed here. Simple definitions and prototype definitions are ignored. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400 This file is created at configure time by combining gpsd.h-head, certain configuration options from the auto-generated file gpsd_configure.h and gpsd.h-tail. This file (gpsd.h) should not be edited directly, neither should gpsd.h-head. You should only edit gpsd.h-tail as needed. struct gps_packet_t {} Provides the data structure used by packet_getter(). 1 per gpsd session. struct gps_context_t {} Provides context data like number of good fixes seen. 1 per gpsd session. struct gps_type_t {} This is the method table that every driver uses to communicate with the daemon. It is a table of entry points or externally visible data. 1 per driver type. struct gps_device_t {} This is the data belonging to a session (global state) and also private storage for the session's associated device driver (if needed). 1 per gpsd session. gpsd-3.15/doc/explan_gpsd_log.c.xml0000664000175000017500000000214712506064067015434 0ustar esresr<filename>libgpsd_core.c</filename> Functions:-General string output routine for any module to use. Notes based on code as of Sat Mar 7 10:11:55 EST 2015 void gpsd_log(struct gpsd_errout_t, int errlevel, const char *fmt, ... ) Provides the outputting of strings to stderr or through a specified hook function in the errout structure for anyone who needs it. Used extensively by many functions to log errors or progress. Responds according to the errlevel argument, which is filled by the DEBUG command line argument, so that the verbosity of output is conditional on the user's wishes at runtime. gpsd-3.15/doc/explan_gpsdclient.c.xml0000664000175000017500000000235712460513551015771 0ustar esresr<filename>libgps.c</filename> Functions:-The client interface library for the gpsd daemon. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400 char *deg_to_str( enum deg_str_type type, double f) Convert double degrees to a static string and return a pointer to it.Makes a simple check on invalid degree values (less than 0 or more than 360) and returns "nan" if found.For valid values, it generates the appropriate string according to the string type enumeration, defaulting to DD MM SS.sss enum unit gpsd_units(void) Simple check of the environment to determine what units are required. If all else fails, use compiled in units. gpsd-3.15/doc/explan_gpsutils.c.xml0000664000175000017500000000632412460513551015505 0ustar esresr<filename>gpsutils.c</filename> Functions:-Code shared between low-level and high-level interfaces. Most of them do exactly what they say on the tin. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. void gps_clear_fix(struct gps_fix_t *fixp) Stuff a fix structure with recognizable out-of-band values. unsigned int gps_valid_fields(struct gps_fix_t *fixp) Clears certain status flags, depending if the associated fields are invalid. double timestamp(void) Returns the number of seconds and microseconds since the UNIX Epoch (00:00:00 UTC, January 1, 1970); i.e. a unique value which can be used to timestamp any event. time_t mkgmtime(register struct tm *t) Convert a struct tm {} (see time.h) to seconds since UNIX Epoch. double iso8601_to_unix(char *isotime) Convert an ISO8601 UTC string (like 2006-01-25T13:15:22.9) to Unix UTC. char *unix_to_iso8601(double fixtime, char isotime[], int len) Reverse of the above, no timezone adjustment. double gpstime_to_unix(int week, double tow) Convert gps time to UNIX time, allowing for the gps week number rollover. void unix_to_gpstime(double unixtime, int *week, double *tow) Reverse of the above. static double CalcRad(double lat) Return the earth's radius of curvature in meters at specified latitude. double earth_distance(double lat1, double lon1, double lat2, double lon2) Return the distance in meters between two points specified in degrees. static int invert(double mat[4][4], double inverse[4][4]) Try and invert an array. If it is possible, fill the inverted array and return a 1. Return a 0 if it is not possible. gps_mask_t dop(struct gps_data_t *gpsdata) Take a gps data structure and try to calculate the DOP values from the other data in it. Return 0 if it is not possible or update the appropriate DOP fields in the structure and set a mask which tells which fields were updated. gpsd-3.15/doc/explan_isgps.c.xml0000664000175000017500000000547412460513551014765 0ustar esresr<filename>isgps.c</filename> Functions:-This contains low level handling for the data transmission format of the satellite downlink and the RTCM2 radio data stream. ESR comments You are not expected to understand any of this.. Let's try anyhow. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. static unsigned char parity_array[] An array of parity values to allow fast lookup instead of calculation. static unsigned int reverse_bits[] An array of conversion values to allow fast lookup instead of calculation. unsigned int isgps_parity(isgps30bits_t th) Calculate the ISGPS parity for the incoming 30 bit word. This involves lots of masking (with preset values or values searched through parity_array[]) and shifting void isgps_init(struct gps_packet_t *session) Initialise the ISGPS data for the current session. 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) Check the validity of the ISGPS word tag (incoming data unsigned int c) and exit with an error if it is not valid.If the session has not already locked with the datastream, loop through the data and try and sync up. If sync is achieved, exit early with an indication of sync, or fall through still marked unsynced.If the session is already locked to the datastream, read the data into the session buffer. All the while, take care that the datastream is not corrupted. Any error will result in an early return with an appropriate error code. At the end of this section, return the status of the operations.Finally, if the above two sections failed, exit with an error indicating that lock was not achieved. void isgps_output_magnavox(isgps30bits_t *ip, unsigned int len, FILE *fp) Ship an IS-GPS-200 message to standard output in Magnavox format. gpsd-3.15/doc/explan_libgps_core.c.xml0000664000175000017500000001154612460513551016125 0ustar esresr<filename>libgps_core.c</filename> Functions:-The client interface library for the gpsd daemon. Notes based on code of Mon Apr 5 21:38:06 2010 -0400 struct gps_data_t *gps_open(const char *host, const char *port) Open a connection to a gps daemon.Try to get a gps_data_t structure. If it fails, return a NULL.Test for a specified host and/or port number, using defaults if nothing is specified in the command line invocation.Try to connect to the now defined socket; on error, release the resources and return NULL. On success, initialise an internal struct gps_data_t and return the pointer to it. struct gps_data_t *gps_open_r(const char *host, const char *port, struct gps_data_t *gpsdata) Variant of gps_open() for when re-entrancy is required. Initializes storage passed by the caller. int gps_close(struct gps_data_t *gpsdata) Close the fd associated with the gps_data_t structure and stash the result.If there is a device id stored, NULL it and the associated path.If the device list has any data in it, free this and mark the number of available devices as invalid.Free the gps_data_t structure itself and return the stashed close() result. static void gps_unpack(char *buf, struct gps_data_t *gpsdata) Keep looping through the data in buf for JSON objects. Each time one is found, analyze it and unpack it into the struct pointed at by gpsdata, setting the gpsdata->set mask appropriately to indicate which data is validThis function is intended for GPSD internal use only and should not be considered a stable part oof the API. int gps_poll(struct gps_data_t *gpsdata) Poll the daemon and if there is no data or an error, return -1.If there is something to read, clear the buffer, note the time as the received data time and the online time, then unpack the data.If profiling is active, use the received data time, the fix time and the present time to calculate the decode time and the client receipt time. int gps_send(struct gps_data_t *gpsdata, const char *fmt, ... ) Gather up the instructions to a gpsd instance for information to return and write them to the device.If the write fails, return -1. This entry point is deprecated in favor of gps_stream() bool gps_waiting(struct gps_data_t *gpsdata) Return a boolean indicating whether input data is waiting on the daemon socket. Does not block. int gps_stream(struct gps_data_t *gpsdata, unsigned int, void *d) Set watch and policy flags. This evaluates the flag mask passed as the second argument, composes a corresponding command in the GPSD write protocol, and ships it to the daemon. The following three functions are guarded by an #ifdef so they only compile if it is required to be able to test the library and set up a command line exerciser interface. static void data_dump(struct gps_data_t *collect, time_t now) A data dumper used when debugging. It outputs data according to the command line input data. static void dumpline(struct gps_data_t *ud UNUSED, char *buf, size_t ulen UNUSED, int level UNUSED) A simple call to UNIX puts(). int main(int argc, char *argv[]) A simple command line parser and endless loop to exercise the daemon when debugging. gpsd-3.15/doc/explan_libgpsd_core.c.xml0000664000175000017500000001707712476614534016310 0ustar esresr<filename>libgpsd_core.c</filename> Functions:-Direct access to GPSes on serial or USB devices. Notes based mostly on code as of Mon Apr 5 21:38:06 2010 -040. void gpsd_log(const struct errout_t, int errlevel, const char *fmt, ... ) This code is used for error reporting, but is dependant on SQUELCH_DISABLE so that embedded systems (for example) are not burdened with unnecessary noise. The first thing to check is if the error level offered is high enough to be of interest (controlled by the debug level we are running at).If we are interested, the first step is to protect the code with a mutex if we are using the 1PPS input.Now we build a message buffer which has a fixed header (gpsd: ) and the incoming data. The output buffer is prepared (load the start with a NULL) and then the input buffer is scanned, byte-by-byte, up to its terminating NULL. The scanned data is transferred on the fly to the output buffer subject to the following tests:-If the character is printable, it passes through unchanged.If it is a space and either of the next two bytes is NULL it will also pass through unchanged.In any other case, it is copied across as a hexadecimal string like x09.The completed output buffer is then either sent to the system logger if we are in background mode (daemon) or to the stderr file if we are in foreground mode. int gpsd_switch_driver(struct gps_device_t *session, char* typename) Test if the function is called with the same name as the active driver.If it is, test if the driver has a configurator function and is able to be reconfigured. A good result here will call the driver event hook with type 'driver_switch', and return a 0.For an entry with a different driver name, scan all available drivers to see if the wanted one is there. An unmatched name exits, returning 0.If we got a match, get the baudrate for the device with gpsd_assert_sync(), probe for the subtype if we have one.If the device has a configurator and is reconfigurable, trigger the configurator.Return a 1 to indicate a device switch. void gpsd_init(struct gps_device_t *session, struct gps_context_t *context, const char *device) Copy the device name to the session data structure, initialise important data fields and call gpsd_tty_init(), gpsd_zero_satellites() and packet_reset(). void gpsd_deactivate(struct gps_device_t *session) All actions below, except the last one are conditional on the ntpd interface being compiled in.Release the ntpd resources, including the 1PPS resources if they are active.If the device has a revert function, trigger it.If it has an NMEA mode switcher, invoke it.If it has a wrapup routine, invoke it.Finally, close the device. static void *gpsd_ppsmonitor(void *arg) An ioctl() call is made which returns either 0 if the status of the port changed, or an error.If we got a change, we read the modem control bits and extract the 1PPS information.We check the returned value and see if it has changed recently. A counter of 10 unchanged events will disable further testing.If we are still hanging in there, we now see if we already have had more than 4 good fixes, otherwise we can't trust the 1PPS.We then finally test the pulse duration. If it is either a genuine 1PPS or a 2Hz square wave, we call ntpshm_pps().Short or long PPS pulses are dropped with an error report. int gpsd_activate(struct gps_device_t *session, bool reconfigurable) Id tge devicename matches an NTRIP or DGNSS URI, hand off to special code for opening a socket to that source over the network.Try and open the device, returning -1 if we fail.Probe all possible drivers to see if one recognises the device.Set some fundamental data to a clean value.Handle the initialisation of NTP and 1PPS functions if needed.If we did succeed in probing some device type, try and get the subtype.If we need to do so, we now configure the device.Finally, signal success by returning the file descriptor given by the device open call. void gpsd_error_model(struct gps_device_t *session, struct gps_fix_t *fix, struct gps_fix_t *oldfix) Check we have a 2D fix (or better) and if the gps didn't provide an eph value, use the HDOP to calculate one or fail to NAN.Do the same with epv/VDOP if we have a 3D or better fix.Do the same with epe/PDOP.Consider speed error; check if we have two fixes with differing timestamps and use their times and eph values to calculate the speed.If we have two valid 3D fixes, we can calculate the climb/sink rate.Finally, just before exiting, save this fix as the old fix for the next comparison round. gps_mask_t gpsd_poll(struct gps_device_t *session) Make a call to gps_clear_fix() to prepare the newdata structure to receive data from an incoming packet.Check if we know the device type. If we do, stash the count of of characters we are able to get from it.If the read has given a full packet, we can call the subtype probing method, if the device supports it.If we don't know the device type, try and figure out what it is, exiting if we can't.Make some checks if the device is offline or the packet is incomplete, using the stashed count of characters and the full packet indicator.If a full packet is available, we try to get the fix data and update the main data structure. We also compute the DOPs so we can fill them in if they are not included in the gps device output.Mopst of the possible driver events are called from somewhere in here. void gpsd_wrap(struct gps_device_t *session) Simple call to gpsd_deactivate(session). void gpsd_zero_satellites(struct gps_data_t *out) Zero the status data for all satellites. gpsd-3.15/doc/explan_libgpsmm.cpp.xml0000664000175000017500000000105112460513551015775 0ustar esresr<filename>libgpsmm.cpp</filename> Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. C++ class wrapper for the libgps C binding. gpsd-3.15/doc/explan_libgpsmm.h.xml0000664000175000017500000000102312460513551015441 0ustar esresr<filename>libgpsmm.h</filename> Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. Headers for libgpsmm.cpp. gpsd-3.15/doc/explan_net_dgnss_dispatch.c.xml0000664000175000017500000000465512460513551017503 0ustar esresr<filename>dgnss.c</filename> Functions:-This file provides the interface to Differential GNSS (Global Navigation Satellite Systems) services. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. bool netgnss_url(char *name) Check if a URL is valid for GNSS/DGPS service. int netgnss_open(struct gps_context_t *context, char *dgnss_service) Try to open a connection to the nominated service. If the service cannot be opened, the return is -1. The supported services are dgpsip (differential corrections via IP) and ntrip (differential corrections in http form). int netgnss_poll(struct gps_context_t *context) Try to poll the GNSS service for a correction report. If no socket is active, simply return 0. If a socket is active, on successful read it stores the current timestamp and the report in the context buffer then returns 0. If no data is ready or an error (except EAGAIN) occurs, drop the connection and return -1. void netgnss_report(struct gps_device_t *session) Call the dgpsip_report() or ntrip_report() function if either is active. void netgnss_autoconnect(struct gps_context_t *context, double lat, double lon) Call the autoconnect() function in dgpsip.c void rtcm_relay(struct gps_device_t *session) If there is a DGNSS connection report in the context buffer, pass it to the caller. If the transaction fails, generate an error log, otherwise, update the session timestamp. gpsd-3.15/doc/explan_net_dgpsip.c.xml0000664000175000017500000000401312460513551015760 0ustar esresr<filename>dgpsip.c</filename> Functions:-This file provides the actual services for dgpsip corrections to dgnss.c. Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. int dgpsip_open(struct gps_context_t *context, const char *dgpsserver) Tries to open a connection to a dgpsip server. Returns either -1 on failure or the socket number on success. On success, it initializes the connection, sends a HELO to the server and stores the type of dgnss service in the context data. void dgpsip_report(struct gps_device_t *session) If we have not contacted the server and we have at received least 10 fixes, send a report to the server and set the flag, so we don't do it again. static int srvcmp(const void *s, const void *t) Compare the distance of two servers from our location. Return -ve, 0 or +ve depending if server s is nearer, the same distance away or further away than server t. void dgpsip_autoconnect(struct gps_context_t *context, double lat, double lon, const char *serverlist) This function takes a list of servers and tries to get a connection to the closest one relative to our location. If no servers are within 1600 km or none are in the list, the dsock value is set to -2 to lock out the function. gpsd-3.15/doc/explan_net_ntrip.c.xml0000664000175000017500000000617612460513551015642 0ustar esresr<filename>ntrip.c</filename> Functions:-Gather and dispatch DGNSS data from Ntrip broadcasters. Notes based on codec as of Tue Apr 6 10:17:55 2010 -0400. static char *ntrip_field_iterate(char *start, char *prev, const char *eol) Extract individual fields from the STR data block using ';' as the separator but handling string-embedded ';' characters correctly. static void ntrip_str_parse(char *str, size_t len, struct ntrip_stream_t *hold) Break an STR data block down using ntrip_field_iterate() and store the relevant details in an accumulation buffer. static int ntrip_sourcetable_parse(int fd, char *buf, ssize_t blen, const char *stream, struct ntrip_stream_t *keep) Parse a block of ntrip data by passing the STR data to ntrip_str_parse().Return a 0 on success or -1 on any of the many possible failures. static int ntrip_stream_probe(const char *caster, const char *port, const char *stream, struct ntrip_stream_t *keep) Send a request to the broadcaster for a block of correction data.If successful, return the result of parsing the table. On error return -1. static int ntrip_auth_encode(const struct ntrip_stream_t *stream, const char *auth, char buf[], size_t size) Check the authorisation of the stream and return 0 if there is none or it is basic. Return -1 in all other cases. static int ntrip_stream_open(const char *caster, const char *port, const char *auth, struct gps_context_t *context, struct ntrip_stream_t *stream) Check the authorisation of the stream and if successful, try to connect.On connection, try to read data and test for various errors.On success, return the socket number, on error return -1. int ntrip_open(struct gps_context_t *context, char *caster) Try to establish a connection to the ntrip server. On success, return the socket number. Signal error with a return of -1. void ntrip_report(struct gps_device_t *session) If we have not contacted the server already and we have at least 10 fixes, send a report to the server and set the flag, so we don't do it again. gpsd-3.15/doc/explan_netlib.c.xml0000664000175000017500000000237512460513551015112 0ustar esresr<filename>netlib.c</filename> Functions:-This provides socket connectivity. Notes based on the code as of Mon Apr 5 21:38:06 2010 -0400. int netlib_connectsock(const char *host, const char *service, const char *protocol) This attempts to connect the to nominated service on the nominated host using the nominated protocol. On success, the return value is the socket number. On error, an appropriate system defined error code is returned. char *sock2ip(int fd) This makes a call to getpeername using the supplied fd. On success, the returned string is the ip address in dotted notation. On error, "<unknown>" is returned. gpsd-3.15/doc/explan_ntpshm.c.xml0000664000175000017500000000554212477531121015146 0ustar esresr<filename>ntpshmwrite.c</filename> Functions:-This puts time information into a shared memory segment for the ntp daemon to use. Notes based on code as of Tue Apr 6 10:17:55 2010 -0400. static struct shmTime *getShmTime(int unit) This requests a block of shared memory to communicate to the ntp daemon. It returns a pointer to the memory on success or NULL on failure. void ntpshm_init(struct gps_context_t *context, bool enablepps) Attaches all ntp shared memory segments, flagging the availability of the NMEA and 1pps capabilities as appropriate. int ntpshm_alloc(struct gps_context_t *context) This tries to allocate a free ntp shared memory segment.If one is available, initialise it for use and flag it as in use.Returns the segment number on success or -1 on failure. bool ntpshm_free(struct gps_context_t *context, int segment) This tries to release a previously allocated ntp shared memory segment. Indicates the outcome by returning true (success) or false. int ntpshm_put(struct gps_device_t *session, double fixtime) If the shared memory index allocated to the session is valid and the shmTime structure of the session is valid, store the time of the fix.Success is indicated by a return value of 1 and errors are indicated by a return value of 0. int ntpshm_pps(struct gps_device_t *session, struct timeval *tv) This code is only available if the 1PPS function is compiled in.The shared memory structures are checked for validity and if not valid, a 0 is returned.The time received is then checked to be within 100 milliseconds of the PC's internal time and if not, a -1 is returned.The time received is then checked to be within 500 milliseconds of the second boundary and if not, the shared memory structure is advised that lock is lost and a -1 is returned.If good, the time is stored in the shared memory and 1 is returned. gpsd-3.15/doc/explan_packet.c.xml0000664000175000017500000000735512460513551015107 0ustar esresr<filename>packet.c</filename> Functions:-The packet-sniffing engine for reading data packets from GPS devices. Notes based on code as of Tue Apr 6 10:17:55 2010 -0400. static void nextstate(struct gps_packet_t *lexer, unsigned char c) This is the main packet-sniffer loop. It scans the character against the definitions of all the packet structures known to gpsd and, if possible, sets a new packet state.If the state is xxx_RECOGNIZED, the packet_parse routine will despatch the packet to the appropriate driver. static void packet_accept(struct gps_packet_t *lexer, int packet_type) This shifts a packet that has been recognized into the output buffer, provided it is not bigger than the buffer. static void packet_discard(struct gps_packet_t *lexer) This clears a handled packet out of the input buffer. static void character_discard(struct gps_packet_t *lexer) This is called if the nextstate() function returns GROUND_STATE.In this case the character does not match any pattern, so to discard it, the input buffer is shifted back by one character to overwrite the bad character. ssize_t packet_parse(struct gps_packet_t *lexer, size_t fix) Call the nextstate() function to process the available data and set the recognition state correctly.When a packet is matched to a driver, call packet_accept() and packet_discard() to handle the packet. If it is not matched, call packet_discard() and set the state to GROUND_STATEReturn the number of characters handled. ssize_t packet_get(int fd, struct gps_packet_t *lexer) Reads raw data from the input port.Returns the number of characters read (0 or more) or BAD_PACKET if there was an error in reading.Errors EAGAIN and EINTR are not classed as failures and cause a return of 0.In case of a good read of more than 0 characters, the return value is the output from a call to packet_parse(). void packet_reset(struct gps_packet_t *lexer) This simply resets the entire packet state machine to the ground state. void packet_nit(struct gps_packet_t *lexer) Zeros some counters, then resets the entire packet state machine to the ground state. void packet_pushback(struct gps_packet_t *lexer) This pushes back the last packet from the output buffer to the input buffer, provided doing so would not overflow the input buffer. gpsd-3.15/doc/explan_packet_names.h.xml0000664000175000017500000000144712460513551016273 0ustar esresr<filename>packet_names.h</filename> Notes based on code as of Tue Apr 6 10:17:55 2010 -0400. This is a file generated by the make process from packet_states.h. It takes all the state names in that file and surrounds them with speech marks. These values are read into a table of packet names, state_table[], in packet.c. gpsd-3.15/doc/explan_packet_states.h.xml0000664000175000017500000000141112460513551016462 0ustar esresr<filename>packet_states.h</filename> Notes based on code as of .Tue Apr 6 10:17:55 2010 -0400 This is a list of every possible state generated by every driver. The inclusion of each driver's states is controlled by #ifdef blocks, so we only include the states for drivers selected for compilation. These form an enumeration list in packet.c which indexes the state_table[] array mentioned in packet_names.h. gpsd-3.15/doc/explan_pseudonmea.c.xml0000664000175000017500000000524112460513551015770 0ustar esresr<filename>libgpsd_core.c</filename> Functions:-Generate pseudo-NMEA corresponding to binary packet reports Notes based on code as of Mon Apr 5 21:38:06 2010 -0400. static double degtodm(double a) Converts a fractional degree value (like 125.3567) into an NMEA field as dddmm.xxx (like 12521.402). void gpsd_position_fix_dump(struct gps_device_t *session, /char bufp[], size_t len) If possible, create a $GPGGA message (full time, position and fix data) from the fix data, taking care about the validity of subsidiary fields like HDOP and altitude. static void gpsd_transit_fix_dump(struct gps_device_t *session, char bufp[], size_t len) Create a $GPRMC message (minimum navigation data) from the fix data. static void gpsd_binary_fix_dump(struct gps_device_t *session, char bufp[], size_t len) Make a call to gpsd_position_fix_dump() and gpsd_transit_fix_dump(). static void gpsd_binary_satellite_dump(struct gps_device_t *session, char bufp[], size_t len) Create one or more $GPGSV messages from the status data of all satellites we know about. static void gpsd_binary_quality_dump(struct gps_device_t *session, char bufp[], size_t len) Create a $GPGSA message taking care that if any xDOP is not valid, we substitute a 0.0 value.If any of the error estimates is available, generate a $PGRME message again taking care about possibly invalid values. static void gpsd_binary_dump(struct gps_device_t *session, char bufp[], size_t len) Dump such binary data as we have available; a fix, a quality value and a satellite status block. Each is enabled by the appropriate status bits in the session mask variable. gpsd-3.15/doc/explan_serial.c.xml0000664000175000017500000001142312460513551015106 0ustar esresr<filename>serial.c</filename> Functions:-This provides serial port handling services to the daemon. It handles the tricky task of scanning for and changing port parameters, especially baudrate. Notes based on code as of Tue Apr 6 10:17:55 2010 -0400. void gpsd_tty_init(struct gps_device_t *session) To be called on allocating a device. Mark GPS fd closed and its baud rate unknown.If we are supporting ntpd shared memory segments, ensure they are initially unused. void cfmakeraw(struct termios *termios_p) Workaround for Cygwin, which is missing cfmakeraw(). It is pasted from man page and added in serial.c arbitrarily. speed_t gpsd_get_speed(struct termios* ttyctl) Calls cfgetospeed() and returns the baud rate, if known. Default otherwise is 115200. bool gpsd_set_raw(struct gps_device_t *session) Tries to set port to raw mode and returns success or not. void gpsd_set_speed(struct gps_device_t *session, speed_t speed, unsigned char parity, unsigned int stopbits) Sets the speed, parity and stopbits.Lots of black magic fiddling goes on to ensure the port is flushed on the baud rate change and wakeup strings are fired off just in case the device needs prodding into life.READ THE CODE AND COMMENTS!!!Prior to exit, a call is made to packet_reset() to ensure the packet state machine is initialised. int gpsd_open(struct gps_device_t *session) Test the device and flag it as R/W if it is a character device, or R/O if it isn't.Try to open it in non-blocking and no-control mode.If that fails, try again, adding read-only mode. If that also fails, exit with an error.On no error, force the saved baudrate if we have a fixed port speed (typically embedded devices). Check if we have a saved baudrate and if so, activate it.Preset the packet type to BAD_PACKET.Check if the device we have opened is a tty. If it is a tty, read the original terminal parameters.Exit with an error code -1 on failure to do so.Save the old parameters, set important control flags, then set the speed.Finally, return the allocated fd. bool gpsd_write(struct gps_device_t *session, void const *buf, size_t len) If the device is read-only, simply return 0.If not, try to write len characters to the device. Waiting until all data has been sent.Return the number of bytes written. bool gpsd_next_hunt_setting(struct gps_device_t *session) Check if we have had SNIFF_RETRIES attempts at current baudrate. If not, return true.If we have exceeded the limit, reset the counter and see if there are any more rates to try at.If no (fixed baudrate or all attempts exhausted), return false, otherwise, set the next speed and return true. void gpsd_assert_sync(struct gps_device_t *session) To be called when we want to register that we've synced with a device. We've achieved first sync with the device. Remember the baudrate so we can try it first next time this device is opened. void gpsd_close(struct gps_device_t *session) If there is an active fd, check if it is a tty device. If it is, force the baudrate to 0 (should terminate the connection and de-assert control lines). Set the HUPCL flag in the original data, write the old data to the port, close the fd and clear that fd number from the session data. gpsd-3.15/doc/explan_subframe.c.xml0000664000175000017500000000141612460513551015434 0ustar esresr<filename>subframe.c</filename> Functions:-This code interprets satellite RTCM-104 subframe data. Notes based on code as of .Tue Apr 6 10:17:55 2010 -0400. void gpsd_interpret_subframe(struct gps_device_t *session,unsigned int words[]) Extracts leap-second from RTCM-104 subframe data. gpsd-3.15/doc/explan_timebase.h.xml0000664000175000017500000000206612460513551015430 0ustar esresr<filename>timebase.h</filename> Functions:-Contains date and time related constants that will require patching over time. Notes based on Tue Apr 6 10:17:55 2010 -0400 LEAP_SECONDS Offset between GPS and UTC, in seconds. START_SUBFRAME When to start doing subframe queries to get the leap-second offset. Should be set to the next possible time for a leap-second change according to IERS. CENTURY_BASE Currently 2000 gpsd-3.15/doc/explan_wrapup.xml0000664000175000017500000000024112460513551014720 0ustar esresr Signoff Mick Durkin <mick.durkin@saunalahti.fi> Helsinki November 2007 gpsd-3.15/doc/internals.xml0000664000175000017500000001031612506064067014042 0ustar esresr ]>

A Tour of the GPSD Internals Mick Durkin 2.2 25 Jan 2011 esr The raw_hook member is gone. 2.1 6 April 2010 esr Updated to match current reality, as far as it goes. Some newer parts of the codebase, notably the JSON parsing machinery and AIS support, aren't documented. 2.0 14 November 2007 md Updated to version svn revision 4420 These notes are meant as an aid to reading and understanding some of the main code files forming the gpsd daemon and its support libraries. They are not a line-by-line explanation but only pick out the important (or unusual) aspects of the code.They do not address the many programs that are used for test purposes, the individual device driver files or any of the supplied applications that use gpsd. This guide was written before the move to a JSON-based protocol and before AIS support was added. While the information on the rest of the code has been updated, the machinery relating to JSON and AIS is not yet documented here. &bits.h; &dbusexport.c; &driver_nmea.c; &driver_proto.c; &driver_rtcm2.c; &drivers.c; &geoid.c; &gps.h; &gpsd.c; &gpsd.h; &gpsd_log.c; &gpsdclient.c; &gpsutils.c; &isgps.c; &libgps_core.c; &libgpsd_core.c; &libgpsmm.cpp; &libgpsmm.h; &net_dgnss_dispatch.c; &net_dgpsip.c; &net_ntrip.c; &netlib.c; &ntpshm.c; &packet.c; &packet_names.h; &packet_states.h; &pseudonmea.c; &serial.c; &subframe.c; &timebase.h; &wrapup;
gpsd-3.15/driver_ais.c0000664000175000017500000011676012533025540013052 0ustar esresr/* * Driver for AIS messages. * * See the file AIVDM.txt on the GPSD website for documentation and references. * AIVDM de-armoring is handled elsewhere; this is the binary-packet driver. * * Code for message types 1-15, 18-21, and 24 has been tested against * live data with known-good decodings. Code for message types 16-17, * 22-23, and 25-27 has not. * For the special IMO messages (types 6 and 8), only the following have been * tested against known-good decodings: * - IMO236 met/hydro message: Type=8, DAC=1, FI=11 * - IMO289 met/hydro message: Type=8, DAC=1, FI=31 * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include "gpsd.h" #include "bits.h" /* * Parse the data from the device */ static void from_sixbit(unsigned char *bitvec, uint start, int count, char *to) /* beginning at bitvec bit start, unpack count sixbit characters */ { const char sixchr[64] = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ !\"#$%&'()*+,-./0123456789:;<=>?"; int i; /* six-bit to ASCII */ for (i = 0; i < count; i++) { char newchar; newchar = sixchr[ubits(bitvec, start + 6 * i, 6U, false)]; if (newchar == '@') break; else to[i] = newchar; } to[i] = '\0'; /* trim spaces on right end */ for (i = count - 2; i >= 0; i--) if (to[i] == ' ' || to[i] == '@') to[i] = '\0'; else break; } bool ais_binary_decode(const struct gpsd_errout_t *errout, struct ais_t *ais, const unsigned char *bits, size_t bitlen, struct ais_type24_queue_t *type24_queue) /* decode an AIS binary packet */ { unsigned int u; int i; #define UBITS(s, l) ubits((unsigned char *)bits, s, l, false) #define SBITS(s, l) sbits((signed char *)bits, s, l, false) #define UCHARS(s, to) from_sixbit((unsigned char *)bits, s, sizeof(to)-1, to) #define ENDCHARS(s, to) from_sixbit((unsigned char *)bits, s, (bitlen-(s))/6,to) ais->type = UBITS(0, 6); ais->repeat = UBITS(6, 2); ais->mmsi = UBITS(8, 30); gpsd_log(errout, LOG_INF, "AIVDM message type %d, MMSI %09d:\n", ais->type, ais->mmsi); #define PERMISSIVE_LENGTH_CHECK(correct) \ if (bitlen < correct) { \ gpsd_log(errout, LOG_ERROR, \ "AIVDM message type %d size < %d bits (%zd).\n", \ ais->type, correct, bitlen); \ return false; \ } else if (bitlen > correct) { \ gpsd_log(errout, LOG_WARN, \ "AIVDM message type %d size > %d bits (%zd).\n", \ ais->type, correct, bitlen); \ } #define RANGE_CHECK(min, max) \ if (bitlen < min || bitlen > max) { \ gpsd_log(errout, LOG_ERROR, \ "AIVDM message type %d size is out of range (%zd).\n", \ ais->type, bitlen); \ return false; \ } /* * 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: case 3: PERMISSIVE_LENGTH_CHECK(168) ais->type1.status = UBITS(38, 4); ais->type1.turn = SBITS(42, 8); ais->type1.speed = UBITS(50, 10); ais->type1.accuracy = UBITS(60, 1)!=0; ais->type1.lon = SBITS(61, 28); ais->type1.lat = SBITS(89, 27); ais->type1.course = UBITS(116, 12); ais->type1.heading = UBITS(128, 9); ais->type1.second = UBITS(137, 6); ais->type1.maneuver = UBITS(143, 2); //ais->type1.spare = UBITS(145, 3); ais->type1.raim = UBITS(148, 1)!=0; ais->type1.radio = UBITS(149, 19); break; case 4: /* Base Station Report */ case 11: /* UTC/Date Response */ PERMISSIVE_LENGTH_CHECK(168) ais->type4.year = UBITS(38, 14); ais->type4.month = UBITS(52, 4); ais->type4.day = UBITS(56, 5); ais->type4.hour = UBITS(61, 5); ais->type4.minute = UBITS(66, 6); ais->type4.second = UBITS(72, 6); ais->type4.accuracy = UBITS(78, 1)!=0; ais->type4.lon = SBITS(79, 28); ais->type4.lat = SBITS(107, 27); ais->type4.epfd = UBITS(134, 4); //ais->type4.spare = UBITS(138, 10); ais->type4.raim = UBITS(148, 1)!=0; ais->type4.radio = UBITS(149, 19); break; case 5: /* Ship static and voyage related data */ if (bitlen != 424) { gpsd_log(errout, LOG_WARN, "AIVDM message type 5 size not 424 bits (%zd).\n", bitlen); /* * For unknown reasons, a lot of transmitters in the wild ship * with a length of 420 or 422. This is a recoverable error. */ if (bitlen < 420) return false; } ais->type5.ais_version = UBITS(38, 2); ais->type5.imo = UBITS(40, 30); UCHARS(70, ais->type5.callsign); UCHARS(112, ais->type5.shipname); ais->type5.shiptype = UBITS(232, 8); ais->type5.to_bow = UBITS(240, 9); ais->type5.to_stern = UBITS(249, 9); ais->type5.to_port = UBITS(258, 6); ais->type5.to_starboard = UBITS(264, 6); ais->type5.epfd = UBITS(270, 4); ais->type5.month = UBITS(274, 4); ais->type5.day = UBITS(278, 5); ais->type5.hour = UBITS(283, 5); ais->type5.minute = UBITS(288, 6); ais->type5.draught = UBITS(294, 8); UCHARS(302, ais->type5.destination); if (bitlen >= 423) ais->type5.dte = UBITS(422, 1); //ais->type5.spare = UBITS(423, 1); break; case 6: /* Addressed Binary Message */ RANGE_CHECK(88, 1008); ais->type6.seqno = UBITS(38, 2); ais->type6.dest_mmsi = UBITS(40, 30); ais->type6.retransmit = UBITS(70, 1)!=0; //ais->type6.spare = UBITS(71, 1); ais->type6.dac = UBITS(72, 10); ais->type6.fid = UBITS(82, 6); ais->type6.bitcount = bitlen - 88; /* not strictly required - helps stability in testing */ (void)memset(ais->type6.bitdata, '\0', sizeof(ais->type6.bitdata)); ais->type6.structured = false; /* Inland AIS */ if (ais->type6.dac == 200) { switch (ais->type6.fid) { case 21: /* ETA at lock/bridge/terminal */ if (bitlen != 248) break; UCHARS(88, ais->type6.dac200fid21.country); UCHARS(100, ais->type6.dac200fid21.locode); UCHARS(118, ais->type6.dac200fid21.section); UCHARS(148, ais->type6.dac200fid21.terminal); UCHARS(178, ais->type6.dac200fid21.hectometre); ais->type6.dac200fid21.month = UBITS(208, 4); ais->type6.dac200fid21.day = UBITS(212, 5); ais->type6.dac200fid21.hour = UBITS(217, 5); ais->type6.dac200fid21.minute = UBITS(222, 6); ais->type6.dac200fid21.tugs = UBITS(228, 3); ais->type6.dac200fid21.airdraught = UBITS(231, 12); /* skip 5 bits */ ais->type6.structured = true; break; case 22: /* RTA at lock/bridge/terminal */ if (bitlen != 232) break; UCHARS(88, ais->type6.dac200fid22.country); UCHARS(100, ais->type6.dac200fid22.locode); UCHARS(118, ais->type6.dac200fid22.section); UCHARS(148, ais->type6.dac200fid22.terminal); UCHARS(178, ais->type6.dac200fid22.hectometre); ais->type6.dac200fid22.month = UBITS(208, 4); ais->type6.dac200fid22.day = UBITS(212, 5); ais->type6.dac200fid22.hour = UBITS(217, 5); ais->type6.dac200fid22.minute = UBITS(222, 6); ais->type6.dac200fid22.status = UBITS(228, 2); /* skip 2 bits */ ais->type6.structured = true; break; case 55: /* Number of Persons On Board */ if (bitlen != 168) break; ais->type6.dac200fid55.crew = UBITS(88, 8); ais->type6.dac200fid55.passengers = UBITS(96, 13); ais->type6.dac200fid55.personnel = UBITS(109, 8); /* skip 51 bits */ ais->type6.structured = true; break; } break; } /* UK and Republic Of Ireland */ else if (ais->type6.dac == 235 || ais->type6.dac == 250) { switch (ais->type6.fid) { case 10: /* GLA - AtoN monitoring data */ if (bitlen != 136) break; ais->type6.dac235fid10.ana_int = UBITS(88, 10); ais->type6.dac235fid10.ana_ext1 = UBITS(98, 10); ais->type6.dac235fid10.ana_ext2 = UBITS(108, 10); ais->type6.dac235fid10.racon = UBITS(118, 2); ais->type6.dac235fid10.light = UBITS(120, 2); ais->type6.dac235fid10.alarm = UBITS(122, 1); ais->type6.dac235fid10.stat_ext = UBITS(123, 8); ais->type6.dac235fid10.off_pos = UBITS(131, 1); /* skip 4 bits */ ais->type6.structured = true; break; } break; } /* International */ else if (ais->type6.dac == 1) switch (ais->type6.fid) { case 12: /* IMO236 - Dangerous cargo indication */ UCHARS(88, ais->type6.dac1fid12.lastport); ais->type6.dac1fid12.lmonth = UBITS(118, 4); ais->type6.dac1fid12.lday = UBITS(122, 5); ais->type6.dac1fid12.lhour = UBITS(127, 5); ais->type6.dac1fid12.lminute = UBITS(132, 6); UCHARS(138, ais->type6.dac1fid12.nextport); ais->type6.dac1fid12.nmonth = UBITS(168, 4); ais->type6.dac1fid12.nday = UBITS(172, 5); ais->type6.dac1fid12.nhour = UBITS(177, 5); ais->type6.dac1fid12.nminute = UBITS(182, 6); UCHARS(188, ais->type6.dac1fid12.dangerous); UCHARS(308, ais->type6.dac1fid12.imdcat); ais->type6.dac1fid12.unid = UBITS(332, 13); ais->type6.dac1fid12.amount = UBITS(345, 10); ais->type6.dac1fid12.unit = UBITS(355, 2); /* skip 3 bits */ ais->type6.structured = true; break; case 14: /* IMO236 - Tidal Window */ ais->type6.dac1fid32.month = UBITS(88, 4); ais->type6.dac1fid32.day = UBITS(92, 5); #define ARRAY_BASE 97 #define ELEMENT_SIZE 93 for (u = 0; ARRAY_BASE + (ELEMENT_SIZE*u) <= bitlen; u++) { int a = ARRAY_BASE + (ELEMENT_SIZE*u); struct tidal_t *tp = &ais->type6.dac1fid32.tidals[u]; tp->lat = SBITS(a + 0, 27); tp->lon = SBITS(a + 27, 28); tp->from_hour = UBITS(a + 55, 5); tp->from_min = UBITS(a + 60, 6); tp->to_hour = UBITS(a + 66, 5); tp->to_min = UBITS(a + 71, 6); tp->cdir = UBITS(a + 77, 9); tp->cspeed = UBITS(a + 86, 7); } ais->type6.dac1fid32.ntidals = u; #undef ARRAY_BASE #undef ELEMENT_SIZE ais->type6.structured = true; break; case 15: /* IMO236 - Extended Ship Static and Voyage Related Data */ ais->type6.dac1fid15.airdraught = UBITS(56, 11); ais->type6.structured = true; break; case 16: /* IMO236 - Number of persons on board */ if (ais->type6.bitcount == 136) ais->type6.dac1fid16.persons = UBITS(88, 13);/* 289 */ else ais->type6.dac1fid16.persons = UBITS(55, 13);/* 236 */ ais->type6.structured = true; break; case 18: /* IMO289 - Clearance time to enter port */ ais->type6.dac1fid18.linkage = UBITS(88, 10); ais->type6.dac1fid18.month = UBITS(98, 4); ais->type6.dac1fid18.day = UBITS(102, 5); ais->type6.dac1fid18.hour = UBITS(107, 5); ais->type6.dac1fid18.minute = UBITS(112, 6); UCHARS(118, ais->type6.dac1fid18.portname); UCHARS(238, ais->type6.dac1fid18.destination); ais->type6.dac1fid18.lon = SBITS(268, 25); ais->type6.dac1fid18.lat = SBITS(293, 24); /* skip 43 bits */ ais->type6.structured = true; break; case 20: /* IMO289 - Berthing data - addressed */ ais->type6.dac1fid20.linkage = UBITS(88, 10); ais->type6.dac1fid20.berth_length = UBITS(98, 9); ais->type6.dac1fid20.berth_depth = UBITS(107, 8); ais->type6.dac1fid20.position = UBITS(115, 3); ais->type6.dac1fid20.month = UBITS(118, 4); ais->type6.dac1fid20.day = UBITS(122, 5); ais->type6.dac1fid20.hour = UBITS(127, 5); ais->type6.dac1fid20.minute = UBITS(132, 6); ais->type6.dac1fid20.availability = UBITS(138, 1); ais->type6.dac1fid20.agent = UBITS(139, 2); ais->type6.dac1fid20.fuel = UBITS(141, 2); ais->type6.dac1fid20.chandler = UBITS(143, 2); ais->type6.dac1fid20.stevedore = UBITS(145, 2); ais->type6.dac1fid20.electrical = UBITS(147, 2); ais->type6.dac1fid20.water = UBITS(149, 2); ais->type6.dac1fid20.customs = UBITS(151, 2); ais->type6.dac1fid20.cartage = UBITS(153, 2); ais->type6.dac1fid20.crane = UBITS(155, 2); ais->type6.dac1fid20.lift = UBITS(157, 2); ais->type6.dac1fid20.medical = UBITS(159, 2); ais->type6.dac1fid20.navrepair = UBITS(161, 2); ais->type6.dac1fid20.provisions = UBITS(163, 2); ais->type6.dac1fid20.shiprepair = UBITS(165, 2); ais->type6.dac1fid20.surveyor = UBITS(167, 2); ais->type6.dac1fid20.steam = UBITS(169, 2); ais->type6.dac1fid20.tugs = UBITS(171, 2); ais->type6.dac1fid20.solidwaste = UBITS(173, 2); ais->type6.dac1fid20.liquidwaste = UBITS(175, 2); ais->type6.dac1fid20.hazardouswaste = UBITS(177, 2); ais->type6.dac1fid20.ballast = UBITS(179, 2); ais->type6.dac1fid20.additional = UBITS(181, 2); ais->type6.dac1fid20.regional1 = UBITS(183, 2); ais->type6.dac1fid20.regional2 = UBITS(185, 2); ais->type6.dac1fid20.future1 = UBITS(187, 2); ais->type6.dac1fid20.future2 = UBITS(189, 2); UCHARS(191, ais->type6.dac1fid20.berth_name); ais->type6.dac1fid20.berth_lon = SBITS(311, 25); ais->type6.dac1fid20.berth_lat = SBITS(336, 24); ais->type6.structured = true; break; case 23: /* IMO289 - Area notice - addressed */ break; case 25: /* IMO289 - Dangerous cargo indication */ ais->type6.dac1fid25.unit = UBITS(88, 2); ais->type6.dac1fid25.amount = UBITS(90, 10); for (u = 0; 100 + u*17 < bitlen; u++) { ais->type6.dac1fid25.cargos[u].code = UBITS(100+u*17,4); ais->type6.dac1fid25.cargos[u].subtype = UBITS(104+u*17,13); } ais->type6.dac1fid25.ncargos = u; ais->type6.structured = true; break; case 28: /* IMO289 - Route info - addressed */ ais->type6.dac1fid28.linkage = UBITS(88, 10); ais->type6.dac1fid28.sender = UBITS(98, 3); ais->type6.dac1fid28.rtype = UBITS(101, 5); ais->type6.dac1fid28.month = UBITS(106, 4); ais->type6.dac1fid28.day = UBITS(110, 5); ais->type6.dac1fid28.hour = UBITS(115, 5); ais->type6.dac1fid28.minute = UBITS(120, 6); ais->type6.dac1fid28.duration = UBITS(126, 18); ais->type6.dac1fid28.waycount = UBITS(144, 5); #define ARRAY_BASE 149 #define ELEMENT_SIZE 55 for (u = 0; u < (unsigned char)ais->type6.dac1fid28.waycount; u++) { int a = ARRAY_BASE + (ELEMENT_SIZE*u); ais->type6.dac1fid28.waypoints[u].lon = SBITS(a+0, 28); ais->type6.dac1fid28.waypoints[u].lat = SBITS(a+28,27); } #undef ARRAY_BASE #undef ELEMENT_SIZE ais->type6.structured = true; break; case 30: /* IMO289 - Text description - addressed */ ais->type6.dac1fid30.linkage = UBITS(88, 10); ENDCHARS(98, ais->type6.dac1fid30.text); ais->type6.structured = true; break; case 32: /* IMO289 - Tidal Window */ ais->type6.dac1fid32.month = UBITS(88, 4); ais->type6.dac1fid32.day = UBITS(92, 5); #define ARRAY_BASE 97 #define ELEMENT_SIZE 88 for (u = 0; ARRAY_BASE + (ELEMENT_SIZE*u) <= bitlen; u++) { int a = ARRAY_BASE + (ELEMENT_SIZE*u); struct tidal_t *tp = &ais->type6.dac1fid32.tidals[u]; tp->lon = SBITS(a + 0, 25); tp->lat = SBITS(a + 25, 24); tp->from_hour = UBITS(a + 49, 5); tp->from_min = UBITS(a + 54, 6); tp->to_hour = UBITS(a + 60, 5); tp->to_min = UBITS(a + 65, 6); tp->cdir = UBITS(a + 71, 9); tp->cspeed = UBITS(a + 80, 8); } ais->type6.dac1fid32.ntidals = u; #undef ARRAY_BASE #undef ELEMENT_SIZE ais->type6.structured = true; break; } if (!ais->type6.structured) (void)memcpy(ais->type6.bitdata, (char *)bits + (88 / CHAR_BIT), BITS_TO_BYTES(ais->type6.bitcount)); break; case 7: /* Binary acknowledge */ case 13: /* Safety Related Acknowledge */ { unsigned int mmsi[4]; RANGE_CHECK(72, 168); for (u = 0; u < sizeof(mmsi)/sizeof(mmsi[0]); u++) if (bitlen > 40 + 32*u) mmsi[u] = UBITS(40 + 32*u, 30); else mmsi[u] = 0; ais->type7.mmsi1 = mmsi[0]; ais->type7.mmsi2 = mmsi[1]; ais->type7.mmsi3 = mmsi[2]; ais->type7.mmsi4 = mmsi[3]; break; } case 8: /* Binary Broadcast Message */ RANGE_CHECK(56, 1008); //ais->type8.spare = UBITS(38, 2); ais->type8.dac = UBITS(40, 10); ais->type8.fid = UBITS(50, 6); ais->type8.bitcount = bitlen - 56; /* not strictly required - helps stability in testing */ (void)memset(ais->type8.bitdata, '\0', sizeof(ais->type8.bitdata)); ais->type8.structured = false; if (ais->type8.dac == 1) switch (ais->type8.fid) { case 11: /* IMO236 - Meteorological/Hydrological data */ /* layout is almost identical to FID=31 from IMO289 */ ais->type8.dac1fid11.lat = SBITS(56, 24); ais->type8.dac1fid11.lon = SBITS(80, 25); ais->type8.dac1fid11.day = UBITS(105, 5); ais->type8.dac1fid11.hour = UBITS(110, 5); ais->type8.dac1fid11.minute = UBITS(115, 6); ais->type8.dac1fid11.wspeed = UBITS(121, 7); ais->type8.dac1fid11.wgust = UBITS(128, 7); ais->type8.dac1fid11.wdir = UBITS(135, 9); ais->type8.dac1fid11.wgustdir = UBITS(144, 9); ais->type8.dac1fid11.airtemp = UBITS(153, 11); ais->type8.dac1fid11.humidity = UBITS(164, 7); ais->type8.dac1fid11.dewpoint = UBITS(171, 10); ais->type8.dac1fid11.pressure = UBITS(181, 9); ais->type8.dac1fid11.pressuretend = UBITS(190, 2); ais->type8.dac1fid11.visibility = UBITS(192, 8); ais->type8.dac1fid11.waterlevel = UBITS(200, 9); ais->type8.dac1fid11.leveltrend = UBITS(209, 2); ais->type8.dac1fid11.cspeed = UBITS(211, 8); ais->type8.dac1fid11.cdir = UBITS(219, 9); ais->type8.dac1fid11.cspeed2 = UBITS(228, 8); ais->type8.dac1fid11.cdir2 = UBITS(236, 9); ais->type8.dac1fid11.cdepth2 = UBITS(245, 5); ais->type8.dac1fid11.cspeed3 = UBITS(250, 8); ais->type8.dac1fid11.cdir3 = UBITS(258, 9); ais->type8.dac1fid11.cdepth3 = UBITS(267, 5); ais->type8.dac1fid11.waveheight = UBITS(272, 8); ais->type8.dac1fid11.waveperiod = UBITS(280, 6); ais->type8.dac1fid11.wavedir = UBITS(286, 9); ais->type8.dac1fid11.swellheight = UBITS(295, 8); ais->type8.dac1fid11.swellperiod = UBITS(303, 6); ais->type8.dac1fid11.swelldir = UBITS(309, 9); ais->type8.dac1fid11.seastate = UBITS(318, 4); ais->type8.dac1fid11.watertemp = UBITS(322, 10); ais->type8.dac1fid11.preciptype = UBITS(332, 3); ais->type8.dac1fid11.salinity = UBITS(335, 9); ais->type8.dac1fid11.ice = UBITS(344, 2); ais->type8.structured = true; break; case 13: /* IMO236 - Fairway closed */ UCHARS(56, ais->type8.dac1fid13.reason); UCHARS(176, ais->type8.dac1fid13.closefrom); UCHARS(296, ais->type8.dac1fid13.closeto); ais->type8.dac1fid13.radius = UBITS(416, 10); ais->type8.dac1fid13.extunit = UBITS(426, 2); ais->type8.dac1fid13.fday = UBITS(428, 5); ais->type8.dac1fid13.fmonth = UBITS(433, 4); ais->type8.dac1fid13.fhour = UBITS(437, 5); ais->type8.dac1fid13.fminute = UBITS(442, 6); ais->type8.dac1fid13.tday = UBITS(448, 5); ais->type8.dac1fid13.tmonth = UBITS(453, 4); ais->type8.dac1fid13.thour = UBITS(457, 5); ais->type8.dac1fid13.tminute = UBITS(462, 6); /* skip 4 bits */ ais->type8.structured = true; break; case 15: /* IMO236 - Extended ship and voyage */ ais->type8.dac1fid15.airdraught = UBITS(56, 11); /* skip 5 bits */ ais->type8.structured = true; break; case 16: /* Number of Persons On Board */ if (ais->type8.bitcount == 136) ais->type8.dac1fid16.persons = UBITS(88, 13);/* 289 */ else ais->type8.dac1fid16.persons = UBITS(55, 13);/* 236 */ ais->type8.structured = true; break; case 17: /* IMO289 - VTS-generated/synthetic targets */ #define ARRAY_BASE 56 #define ELEMENT_SIZE 122 for (u = 0; ARRAY_BASE + (ELEMENT_SIZE*u) <= bitlen; u++) { struct target_t *tp = &ais->type8.dac1fid17.targets[u]; int a = ARRAY_BASE + (ELEMENT_SIZE*u); tp->idtype = UBITS(a + 0, 2); switch (tp->idtype) { case DAC1FID17_IDTYPE_MMSI: tp->id.mmsi = UBITS(a + 2, 42); break; case DAC1FID17_IDTYPE_IMO: tp->id.imo = UBITS(a + 2, 42); break; case DAC1FID17_IDTYPE_CALLSIGN: UCHARS(a+2, tp->id.callsign); break; default: UCHARS(a+2, tp->id.other); break; } /* skip 4 bits */ tp->lat = SBITS(a + 48, 24); tp->lon = SBITS(a + 72, 25); tp->course = UBITS(a + 97, 9); tp->second = UBITS(a + 106, 6); tp->speed = UBITS(a + 112, 10); } ais->type8.dac1fid17.ntargets = u; #undef ARRAY_BASE #undef ELEMENT_SIZE ais->type8.structured = true; break; case 19: /* IMO289 - Marine Traffic Signal */ ais->type8.dac1fid19.linkage = UBITS(56, 10); UCHARS(66, ais->type8.dac1fid19.station); ais->type8.dac1fid19.lon = SBITS(186, 25); ais->type8.dac1fid19.lat = SBITS(211, 24); ais->type8.dac1fid19.status = UBITS(235, 2); ais->type8.dac1fid19.signal = UBITS(237, 5); ais->type8.dac1fid19.hour = UBITS(242, 5); ais->type8.dac1fid19.minute = UBITS(247, 6); ais->type8.dac1fid19.nextsignal = UBITS(253, 5); /* skip 102 bits */ ais->type8.structured = true; break; case 21: /* IMO289 - Weather obs. report from ship */ break; case 22: /* IMO289 - Area notice - broadcast */ break; case 24: /* IMO289 - Extended ship static & voyage-related data */ break; case 26: /* IMO289 - Environmental */ break; case 27: /* IMO289 - Route information - broadcast */ ais->type8.dac1fid27.linkage = UBITS(56, 10); ais->type8.dac1fid27.sender = UBITS(66, 3); ais->type8.dac1fid27.rtype = UBITS(69, 5); ais->type8.dac1fid27.month = UBITS(74, 4); ais->type8.dac1fid27.day = UBITS(78, 5); ais->type8.dac1fid27.hour = UBITS(83, 5); ais->type8.dac1fid27.minute = UBITS(88, 6); ais->type8.dac1fid27.duration = UBITS(94, 18); ais->type8.dac1fid27.waycount = UBITS(112, 5); #define ARRAY_BASE 117 #define ELEMENT_SIZE 55 for (i = 0; i < ais->type8.dac1fid27.waycount; i++) { int a = ARRAY_BASE + (ELEMENT_SIZE*i); ais->type8.dac1fid27.waypoints[i].lon = SBITS(a + 0, 28); ais->type8.dac1fid27.waypoints[i].lat = SBITS(a + 28, 27); } #undef ARRAY_BASE #undef ELEMENT_SIZE ais->type8.structured = true; break; case 29: /* IMO289 - Text Description - broadcast */ ais->type8.dac1fid29.linkage = UBITS(56, 10); ENDCHARS(66, ais->type8.dac1fid29.text); ais->type8.structured = true; break; case 31: /* IMO289 - Meteorological/Hydrological data */ ais->type8.dac1fid31.lon = SBITS(56, 25); ais->type8.dac1fid31.lat = SBITS(81, 24); ais->type8.dac1fid31.accuracy = (bool)UBITS(105, 1); ais->type8.dac1fid31.day = UBITS(106, 5); ais->type8.dac1fid31.hour = UBITS(111, 5); ais->type8.dac1fid31.minute = UBITS(116, 6); ais->type8.dac1fid31.wspeed = UBITS(122, 7); ais->type8.dac1fid31.wgust = UBITS(129, 7); ais->type8.dac1fid31.wdir = UBITS(136, 9); ais->type8.dac1fid31.wgustdir = UBITS(145, 9); ais->type8.dac1fid31.airtemp = SBITS(154, 11); ais->type8.dac1fid31.humidity = UBITS(165, 7); ais->type8.dac1fid31.dewpoint = SBITS(172, 10); ais->type8.dac1fid31.pressure = UBITS(182, 9); ais->type8.dac1fid31.pressuretend = UBITS(191, 2); ais->type8.dac1fid31.visgreater = UBITS(193, 1); ais->type8.dac1fid31.visibility = UBITS(194, 7); ais->type8.dac1fid31.waterlevel = UBITS(201, 12); ais->type8.dac1fid31.leveltrend = UBITS(213, 2); ais->type8.dac1fid31.cspeed = UBITS(215, 8); ais->type8.dac1fid31.cdir = UBITS(223, 9); ais->type8.dac1fid31.cspeed2 = UBITS(232, 8); ais->type8.dac1fid31.cdir2 = UBITS(240, 9); ais->type8.dac1fid31.cdepth2 = UBITS(249, 5); ais->type8.dac1fid31.cspeed3 = UBITS(254, 8); ais->type8.dac1fid31.cdir3 = UBITS(262, 9); ais->type8.dac1fid31.cdepth3 = UBITS(271, 5); ais->type8.dac1fid31.waveheight = UBITS(276, 8); ais->type8.dac1fid31.waveperiod = UBITS(284, 6); ais->type8.dac1fid31.wavedir = UBITS(290, 9); ais->type8.dac1fid31.swellheight = UBITS(299, 8); ais->type8.dac1fid31.swellperiod = UBITS(307, 6); ais->type8.dac1fid31.swelldir = UBITS(313, 9); ais->type8.dac1fid31.seastate = UBITS(322, 4); ais->type8.dac1fid31.watertemp = SBITS(326, 10); ais->type8.dac1fid31.preciptype = UBITS(336, 3); ais->type8.dac1fid31.salinity = UBITS(339, 9); ais->type8.dac1fid31.ice = UBITS(348, 2); ais->type8.structured = true; break; } else if (ais->type8.dac == 200) { switch (ais->type8.fid) { case 10: /* Inland ship static and voyage related data */ if (bitlen != 168) break; UCHARS(56, ais->type8.dac200fid10.vin); ais->type8.dac200fid10.length = UBITS(104, 13); ais->type8.dac200fid10.beam = UBITS(117, 10); ais->type8.dac200fid10.shiptype = UBITS(127, 14); ais->type8.dac200fid10.hazard = UBITS(141, 3); ais->type8.dac200fid10.draught = UBITS(144, 11); ais->type8.dac200fid10.loaded = UBITS(155, 2); ais->type8.dac200fid10.speed_q = (bool)UBITS(157, 1); ais->type8.dac200fid10.course_q = (bool)UBITS(158, 1); ais->type8.dac200fid10.heading_q = (bool)UBITS(159, 1); /* skip 8 bits */ /* * Attempt to prevent false matches with this message type * by range-checking certain fields. */ if (ais->type8.dac200fid10.hazard > DAC200FID10_HAZARD_MAX || !isascii((int)ais->type8.dac200fid10.vin[0])) ais->type8.structured = false; else ais->type8.structured = true; break; case 23: /* EMMA warning */ if (bitlen != 256) break; ais->type8.dac200fid23.start_year = UBITS(56, 8); ais->type8.dac200fid23.start_month = UBITS(64, 4); ais->type8.dac200fid23.start_day = UBITS(68, 5); ais->type8.dac200fid23.end_year = UBITS(73, 8); ais->type8.dac200fid23.end_month = UBITS(81, 4); ais->type8.dac200fid23.end_day = UBITS(85, 5); ais->type8.dac200fid23.start_hour = UBITS(90, 5); ais->type8.dac200fid23.start_minute = UBITS(95, 6); ais->type8.dac200fid23.end_hour = UBITS(101, 5); ais->type8.dac200fid23.end_minute = UBITS(106, 6); ais->type8.dac200fid23.start_lon = SBITS(112, 28); ais->type8.dac200fid23.start_lat = SBITS(140, 27); ais->type8.dac200fid23.end_lon = SBITS(167, 28); ais->type8.dac200fid23.end_lat = SBITS(195, 27); ais->type8.dac200fid23.type = UBITS(222, 4); ais->type8.dac200fid23.min = SBITS(226, 9); ais->type8.dac200fid23.max = SBITS(235, 9); ais->type8.dac200fid23.intensity = UBITS(244, 2); ais->type8.dac200fid23.wind = UBITS(246, 4); /* skip 6 bits */ ais->type8.structured = true; break; case 24: /* Water level */ if (bitlen != 168) break; UCHARS(56, ais->type8.dac200fid24.country); #define ARRAY_BASE 68 #define ELEMENT_SIZE 25 for (i = 0; ARRAY_BASE + (ELEMENT_SIZE*i) < (int)bitlen; i++) { int a = ARRAY_BASE + (ELEMENT_SIZE*i); ais->type8.dac200fid24.gauges[i].id = UBITS(a+0, 11); ais->type8.dac200fid24.gauges[i].level = SBITS(a+11, 14); } ais->type8.dac200fid24.ngauges = i; #undef ARRAY_BASE #undef ELEMENT_SIZE /* skip 6 bits */ ais->type8.structured = true; break; case 40: /* Signal status */ if (bitlen != 168) break; ais->type8.dac200fid40.lon = SBITS(56, 28); ais->type8.dac200fid40.lat = SBITS(84, 27); ais->type8.dac200fid40.form = UBITS(111, 4); ais->type8.dac200fid40.facing = UBITS(115, 9); ais->type8.dac200fid40.direction = UBITS(124, 3); ais->type8.dac200fid40.status = UBITS(127, 30); /* skip 11 bits */ ais->type8.structured = true; break; } } /* land here if we failed to match a known DAC/FID */ if (!ais->type8.structured) (void)memcpy(ais->type8.bitdata, (char *)bits + (56 / CHAR_BIT), BITS_TO_BYTES(ais->type8.bitcount)); break; case 9: /* Standard SAR Aircraft Position Report */ PERMISSIVE_LENGTH_CHECK(168); ais->type9.alt = UBITS(38, 12); ais->type9.speed = UBITS(50, 10); ais->type9.accuracy = (bool)UBITS(60, 1); ais->type9.lon = SBITS(61, 28); ais->type9.lat = SBITS(89, 27); ais->type9.course = UBITS(116, 12); ais->type9.second = UBITS(128, 6); ais->type9.regional = UBITS(134, 8); ais->type9.dte = UBITS(142, 1); //ais->type9.spare = UBITS(143, 3); ais->type9.assigned = UBITS(146, 1)!=0; ais->type9.raim = UBITS(147, 1)!=0; ais->type9.radio = UBITS(148, 20); break; case 10: /* UTC/Date inquiry */ PERMISSIVE_LENGTH_CHECK(72); //ais->type10.spare = UBITS(38, 2); ais->type10.dest_mmsi = UBITS(40, 30); //ais->type10.spare2 = UBITS(70, 2); break; case 12: /* Safety Related Message */ RANGE_CHECK(72, 1008); ais->type12.seqno = UBITS(38, 2); ais->type12.dest_mmsi = UBITS(40, 30); ais->type12.retransmit = (bool)UBITS(70, 1); //ais->type12.spare = UBITS(71, 1); ENDCHARS(72, ais->type12.text); break; case 14: /* Safety Related Broadcast Message */ RANGE_CHECK(40, 1008); //ais->type14.spare = UBITS(38, 2); ENDCHARS(40, ais->type14.text); break; case 15: /* Interrogation */ RANGE_CHECK(88, 168); (void)memset(&ais->type15, '\0', sizeof(ais->type15)); //ais->type14.spare = UBITS(38, 2); ais->type15.mmsi1 = UBITS(40, 30); ais->type15.type1_1 = UBITS(70, 6); ais->type15.type1_1 = UBITS(70, 6); ais->type15.offset1_1 = UBITS(76, 12); //ais->type14.spare2 = UBITS(88, 2); if (bitlen > 90) { ais->type15.type1_2 = UBITS(90, 6); ais->type15.offset1_2 = UBITS(96, 12); //ais->type14.spare3 = UBITS(108, 2); if (bitlen > 110) { ais->type15.mmsi2 = UBITS(110, 30); ais->type15.type2_1 = UBITS(140, 6); ais->type15.offset2_1 = UBITS(146, 12); //ais->type14.spare4 = UBITS(158, 2); } } break; case 16: /* Assigned Mode Command */ RANGE_CHECK(96, 144); ais->type16.mmsi1 = UBITS(40, 30); ais->type16.offset1 = UBITS(70, 12); ais->type16.increment1 = UBITS(82, 10); if (bitlen < 144) ais->type16.mmsi2=ais->type16.offset2=ais->type16.increment2 = 0; else { ais->type16.mmsi2 = UBITS(92, 30); ais->type16.offset2 = UBITS(122, 12); ais->type16.increment2 = UBITS(134, 10); } break; case 17: /* GNSS Broadcast Binary Message */ RANGE_CHECK(80, 816); //ais->type17.spare = UBITS(38, 2); ais->type17.lon = SBITS(40, 18); ais->type17.lat = SBITS(58, 17); //ais->type17.spare = UBITS(75, 5); ais->type17.bitcount = bitlen - 80; (void)memcpy(ais->type17.bitdata, (char *)bits + (80 / CHAR_BIT), BITS_TO_BYTES(ais->type17.bitcount)); break; case 18: /* Standard Class B CS Position Report */ PERMISSIVE_LENGTH_CHECK(168) ais->type18.reserved = UBITS(38, 8); ais->type18.speed = UBITS(46, 10); ais->type18.accuracy = UBITS(56, 1)!=0; ais->type18.lon = SBITS(57, 28); ais->type18.lat = SBITS(85, 27); ais->type18.course = UBITS(112, 12); ais->type18.heading = UBITS(124, 9); ais->type18.second = UBITS(133, 6); ais->type18.regional = UBITS(139, 2); ais->type18.cs = UBITS(141, 1)!=0; ais->type18.display = UBITS(142, 1)!=0; ais->type18.dsc = UBITS(143, 1)!=0; ais->type18.band = UBITS(144, 1)!=0; ais->type18.msg22 = UBITS(145, 1)!=0; ais->type18.assigned = UBITS(146, 1)!=0; ais->type18.raim = UBITS(147, 1)!=0; ais->type18.radio = UBITS(148, 20); break; case 19: /* Extended Class B CS Position Report */ PERMISSIVE_LENGTH_CHECK(312) ais->type19.reserved = UBITS(38, 8); ais->type19.speed = UBITS(46, 10); ais->type19.accuracy = UBITS(56, 1)!=0; ais->type19.lon = SBITS(57, 28); ais->type19.lat = SBITS(85, 27); ais->type19.course = UBITS(112, 12); ais->type19.heading = UBITS(124, 9); ais->type19.second = UBITS(133, 6); ais->type19.regional = UBITS(139, 4); UCHARS(143, ais->type19.shipname); ais->type19.shiptype = UBITS(263, 8); ais->type19.to_bow = UBITS(271, 9); ais->type19.to_stern = UBITS(280, 9); ais->type19.to_port = UBITS(289, 6); ais->type19.to_starboard = UBITS(295, 6); ais->type19.epfd = UBITS(301, 4); ais->type19.raim = UBITS(305, 1)!=0; ais->type19.dte = UBITS(306, 1)!=0; ais->type19.assigned = UBITS(307, 1)!=0; //ais->type19.spare = UBITS(308, 4); break; case 20: /* Data Link Management Message */ RANGE_CHECK(72, 160); //ais->type20.spare = UBITS(38, 2); ais->type20.offset1 = UBITS(40, 12); ais->type20.number1 = UBITS(52, 4); ais->type20.timeout1 = UBITS(56, 3); ais->type20.increment1 = UBITS(59, 11); ais->type20.offset2 = UBITS(70, 12); ais->type20.number2 = UBITS(82, 4); ais->type20.timeout2 = UBITS(86, 3); ais->type20.increment2 = UBITS(89, 11); ais->type20.offset3 = UBITS(100, 12); ais->type20.number3 = UBITS(112, 4); ais->type20.timeout3 = UBITS(116, 3); ais->type20.increment3 = UBITS(119, 11); ais->type20.offset4 = UBITS(130, 12); ais->type20.number4 = UBITS(142, 4); ais->type20.timeout4 = UBITS(146, 3); ais->type20.increment4 = UBITS(149, 11); break; case 21: /* Aid-to-Navigation Report */ RANGE_CHECK(272, 360); ais->type21.aid_type = UBITS(38, 5); from_sixbit((unsigned char *)bits, 43, 20, ais->type21.name); ais->type21.accuracy = UBITS(163, 1); ais->type21.lon = SBITS(164, 28); ais->type21.lat = SBITS(192, 27); ais->type21.to_bow = UBITS(219, 9); ais->type21.to_stern = UBITS(228, 9); ais->type21.to_port = UBITS(237, 6); ais->type21.to_starboard = UBITS(243, 6); ais->type21.epfd = UBITS(249, 4); ais->type21.second = UBITS(253, 6); ais->type21.off_position = UBITS(259, 1)!=0; ais->type21.regional = UBITS(260, 8); ais->type21.raim = UBITS(268, 1)!=0; ais->type21.virtual_aid = UBITS(269, 1)!=0; ais->type21.assigned = UBITS(270, 1)!=0; //ais->type21.spare = UBITS(271, 1); if (strlen(ais->type21.name) == 20 && bitlen > 272) ENDCHARS(272, ais->type21.name+20); break; case 22: /* Channel Management */ PERMISSIVE_LENGTH_CHECK(168) ais->type22.channel_a = UBITS(40, 12); ais->type22.channel_b = UBITS(52, 12); ais->type22.txrx = UBITS(64, 4); ais->type22.power = UBITS(68, 1); ais->type22.addressed = UBITS(139, 1); if (!ais->type22.addressed) { ais->type22.area.ne_lon = SBITS(69, 18); ais->type22.area.ne_lat = SBITS(87, 17); ais->type22.area.sw_lon = SBITS(104, 18); ais->type22.area.sw_lat = SBITS(122, 17); } else { ais->type22.mmsi.dest1 = UBITS(69, 30); ais->type22.mmsi.dest2 = UBITS(104, 30); } ais->type22.band_a = UBITS(140, 1); ais->type22.band_b = UBITS(141, 1); ais->type22.zonesize = UBITS(142, 3); break; case 23: /* Group Assignment Command */ PERMISSIVE_LENGTH_CHECK(160) ais->type23.ne_lon = SBITS(40, 18); ais->type23.ne_lat = SBITS(58, 17); ais->type23.sw_lon = SBITS(75, 18); ais->type23.sw_lat = SBITS(93, 17); ais->type23.stationtype = UBITS(110, 4); ais->type23.shiptype = UBITS(114, 8); ais->type23.txrx = UBITS(144, 4); ais->type23.interval = UBITS(146, 4); ais->type23.quiet = UBITS(150, 4); break; case 24: /* Class B CS Static Data Report */ switch (UBITS(38, 2)) { case 0: RANGE_CHECK(160, 168); /* save incoming 24A shipname/MMSI pairs in a circular queue */ { struct ais_type24a_t *saveptr = &type24_queue->ships[type24_queue->index]; gpsd_log(errout, LOG_PROG, "AIVDM: 24A from %09u stashed.\n", ais->mmsi); saveptr->mmsi = ais->mmsi; UCHARS(40, saveptr->shipname); ++type24_queue->index; type24_queue->index %= MAX_TYPE24_INTERLEAVE; } //ais->type24.a.spare = UBITS(160, 8); UCHARS(40, ais->type24.shipname); ais->type24.part = part_a; return true; case 1: PERMISSIVE_LENGTH_CHECK(168) ais->type24.shiptype = UBITS(40, 8); /* * In ITU-R 1371-4, there are new model and serial fields * carved out of the right-hand end of vendorid, which is * reduced from 7 chars to 3. To cope with older AIS * implementations conforming to revision 3 and older, * unpack the trailing bits *both* ways; truly * revision-4-conformant implementations will have up to * four characters of trailing garbage on the vendorid, * and older implementations will have garbafe in the * model and serial fields. */ UCHARS(48, ais->type24.vendorid); ais->type24.model = UBITS(66, 4); ais->type24.serial = UBITS(70, 20); UCHARS(90, ais->type24.callsign); if (AIS_AUXILIARY_MMSI(ais->mmsi)) { ais->type24.mothership_mmsi = UBITS(132, 30); } else { ais->type24.dim.to_bow = UBITS(132, 9); ais->type24.dim.to_stern = UBITS(141, 9); ais->type24.dim.to_port = UBITS(150, 6); ais->type24.dim.to_starboard = UBITS(156, 6); } //ais->type24.b.spare = UBITS(162, 8); /* search the 24A queue for a matching MMSI */ for (i = 0; i < MAX_TYPE24_INTERLEAVE; i++) { if (type24_queue->ships[i].mmsi == ais->mmsi) { (void)strlcpy(ais->type24.shipname, type24_queue->ships[i].shipname, sizeof(ais->type24.shipname)); gpsd_log(errout, LOG_PROG, "AIVDM 24B from %09u matches a 24A.\n", ais->mmsi); /* prevent false match if a 24B is repeated */ type24_queue->ships[i].mmsi = 0; ais->type24.part = both; return true; } } /* no match, return Part B */ ais->type24.part = part_b; return true; default: gpsd_log(errout, LOG_WARN, "AIVDM message type 24 of subtype unknown.\n"); return false; } // break; case 25: /* Binary Message, Single Slot */ /* this check and the following one reject line noise */ if (bitlen < 40 || bitlen > 168) { gpsd_log(errout, LOG_WARN, "AIVDM message type 25 size not between 40 to 168 bits (%zd).\n", bitlen); return false; } ais->type25.addressed = (bool)UBITS(38, 1); ais->type25.structured = (bool)UBITS(39, 1); if (bitlen < (unsigned)(40 + (16*ais->type25.structured) + (30*ais->type25.addressed))) { gpsd_log(errout, LOG_WARN, "AIVDM message type 25 too short for mode.\n"); return false; } if (ais->type25.addressed) ais->type25.dest_mmsi = UBITS(40, 30); if (ais->type25.structured) ais->type25.app_id = UBITS(40+ais->type25.addressed*30,16); ais->type25.bitcount = bitlen - 40 - 16*ais->type25.structured; /* bit 40 is exactly 5 bytes in; 2 bytes is 16 bits */ (void)memcpy(ais->type25.bitdata, (char *)bits+5 + 2 * ais->type25.structured, BITS_TO_BYTES(ais->type25.bitcount)); /* discard MMSI if addressed */ if (ais->type25.addressed) { shiftleft((unsigned char *)ais->type25.bitdata, ais->type25.bitcount, 30); ais->type25.bitcount -= 30; } break; case 26: /* Binary Message, Multiple Slot */ RANGE_CHECK(60, 1004); ais->type26.addressed = (bool)UBITS(38, 1); ais->type26.structured = (bool)UBITS(39, 1); if ((signed)bitlen < 40 + 16*ais->type26.structured + 30*ais->type26.addressed + 20) { gpsd_log(errout, LOG_WARN, "AIVDM message type 26 too short for mode.\n"); return false; } if (ais->type26.addressed) 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 = bitlen - 60 - 16*ais->type26.structured; (void)memcpy(ais->type26.bitdata, (unsigned char *)bits+5 + 2 * ais->type26.structured, BITS_TO_BYTES(ais->type26.bitcount)); /* discard MMSI if addressed */ if (ais->type26.addressed) { shiftleft((unsigned char *)ais->type26.bitdata, ais->type26.bitcount, 30); ais->type26.bitcount -= 30; } break; case 27: /* Long Range AIS Broadcast message */ if (bitlen != 96 && bitlen != 168) { gpsd_log(errout, LOG_WARN, "unexpected AIVDM message type 27 (%zd).\n", bitlen); return false; } if (bitlen == 168) { /* * This is an implementation error observed in the wild, * sending a full 168-bit slot rather than just 96 bits. */ gpsd_log(errout, LOG_WARN, "oversized 169=8-bit AIVDM message type 27.\n"); } ais->type27.accuracy = (bool)UBITS(38, 1); ais->type27.raim = UBITS(39, 1)!=0; ais->type27.status = UBITS(40, 4); ais->type27.lon = SBITS(44, 18); ais->type27.lat = SBITS(62, 17); ais->type27.speed = UBITS(79, 6); ais->type27.course = UBITS(85, 9); ais->type27.gnss = (bool)UBITS(94, 1); break; default: gpsd_log(errout, LOG_ERROR, "Unparsed AIVDM message type %d.\n",ais->type); return false; } /* *INDENT-ON* */ #undef UCHARS #undef SBITS #undef UBITS /* data is fully decoded */ return true; } /* driver_ais.c ends here */ gpsd-3.15/driver_evermore.c0000664000175000017500000005376612506321225014127 0ustar esresr/* * * This is the gpsd driver for EverMore GPSes. They have both an NMEA and * a binary reporting mode, with the interesting property that they will * cheerfully accept binary commands (such as speed changes) while in NMEA * mode. * * Binary mode would give us atomic fix reports, but it has one large drawback: * the Navigation Data Out message doesn't report a leap-second offset, so it * is not actually possible to collect a leap-second offset from it. Therefore * we'll normally run the driver in NMEA mode. * * About the only thing binary mode gives that NMEA won't is TDOP and raw * pseudoranges, but gpsd does its own DOPs from skyview. By default we'll * trade away raw data to get accurate time. * * The vendor site is . * * This driver was written by Petr Slansky based on a framework by Eric S. * Raymond. The following remarks are by Petr Slansky. * * Snooping on the serial the communication between a Windows program and * an Evermore chipset reveals some messages not described in the vendor * documentation (Issue C of Aug 2002): * * 10 02 06 84 00 00 00 84 10 03 switch to binary mode (84 00 00 00) * 10 02 06 84 01 00 00 85 10 03 switch to NMEA mode (84 01 00 00) * * 10 02 06 89 01 00 00 8a 10 03 set baud rate 4800 * 10 02 06 89 01 01 00 8b 10 03 set baud rate 9600 * 10 02 06 89 01 02 00 8c 10 03 set baud rate 19200 * 10 02 06 89 01 03 00 8d 10 03 set baud rate 38400 * * 10 02 06 8D 00 01 00 8E 10 03 switch to datum ID 001 (WGS-84) * 10 02 06 8D 00 D8 00 65 10 03 switch to datum ID 217 (WGS-72) * * These don't entail a reset of GPS as the 0x80 message does. * * 10 02 04 38 85 bd 10 03 answer from GPS to 0x85 message; ACK message * 10 02 04 38 8d c5 10 03 answer from GPS to 0x8d message; ACK message * 10 02 04 38 8e c6 10 03 answer from GPS to 0x8e message; ACK message * 10 02 04 38 8f c7 10 03 answer from GPS to 0x8f message; ACK message * * The chip sometimes sends vendor extension messages with the prefix * $PEMT,100. After restart, it sends a $PEMT,100 message describing the * chip's configuration. Here is a sample: * * $PEMT,100,05.42g,100303,180,05,1,20,15,08,0,0,2,1*5A * 100 - message type * 05.42g - firmware version * 100303 - date of firmware release DDMMYY * 180 - datum ID; 001 is WGS-84 * 05 - default elevation mask; see message 0x86 * 1 - default DOP select, 1 is auto DOP mask; see message 0x87 * 20 - default GDOP; see message 0x87 * 15 - default PDOP * 08 - default HDOP * 0 - Normal mode, without 1PPS * 0 - default position pinning control (0 disable, 1 enable) * 2 - altitude hold mode (0 disable, 1 always, 2 auto) * 1 - 2/1 satellite nav mode (0,1,2,3,4) * 0 disable 2/1 sat nav mode * 1 hold direction (2 sat) * 2 clock hold only (2 sat) * 3 direction hold then clock hold (1 sat) * 4 clock hold then direction hold (1 sat) * * Message $PEMT,100 could be forced with message 0x85 (restart): * 10 02 12 85 00 00 00 00 00 01 01 00 00 00 00 00 00 00 00 87 10 03 * 0x85 ID, Restart * 0x00 restart mode (0 default, 1 hot, 2 warm, 3 cold, 4 test) * 0x00 test start search PRN (1-32) * 0x00 UTC second (0-59) * 0x00 UTC Minute (0-59) * 0x00 UTC Hour (0-23) * 0x01 UTC Day (1-31) * 0x01 UTC Month (1-12) * 0x0000 UTC year (1980+x, uint16) * 0x0000 Latitude WGS-84 (+/-900, 1/10 degree, + for N, int16) * 0x0000 Longtitude WGS-84 (+/-1800, 1/10 degree, + for E, int16) * 0x0000 Altitude WGS-84 (-1000..+18000, meters, int16) * 0x87 CRC * * With message 0x8e it is possible to define how often each NMEA * message is sent (0-255 seconds). It is possible with message 0x8e * to activate PEMT,101 messages that have information about time, * position, velocity and HDOP. * * $PEMT,101,1,02,00.0,300906190446,5002.5062,N,01427.6166,E,00259,000,0000*27 * $PEMT,101,2,06,02.1,300906185730,5002.7546,N,01426.9524,E,00323,020,0011*26 * 101 - message type, Compact Navigation Solution * 2 - position status (1,2,3,4,5,6) * (1 invalid, 2 2D fix, 3 3D fix, 4 2D with DIFF, 5 3D with DIFF, * 6 2/1 sat degrade mode) * 06 - number of used satelites * 02.1 - DOP (00.0 no fix, HDOP 2D fix, PDOP 3D fix) * 300906185730 - date and time, UTC ddmmyyHHMMSS (30/09/2006 18:57:30) * 5002.7546,N - Latitude (degree) * 01426.9524,E - Longitude (degree) * 00323 - Altitude (323 metres) * 020 - heading (20 degrees from true north) * 0011 - speed over ground (11 metres per second); documentation says km per h * * This is an exampe of an 0x8e message that activates all NMEA sentences * with 1s period: * 10 02 12 8E 7F 01 01 01 01 01 01 01 01 00 00 00 00 00 00 15 10 03 * * There is a way to probe for this chipset. When binary message 0x81 is sent: * 10 02 04 81 13 94 10 03 * * EverMore will reply with message like this: * *10 *02 *0D *20 E1 00 00 *00 0A 00 1E 00 32 00 5B *10 *03 * bytes marked with * are fixed * Message in reply is information about logging configuration of GPS * * Another way to detect the EverMore chipset is to send one of the messages * 0x85, 0x8d, 0x8e or 0x8f and check for a reply. * The reply message from an EverMore GPS will look like this: * *10 *02 *04 *38 8d c5 *10 *03 * 8d indicates that message 0x8d was sent; * c5 is EverMore checksum, other bytes are fixed * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include "gpsd.h" #if defined(EVERMORE_ENABLE) && defined(BINARY_ENABLE) #include "bits.h" #define EVERMORE_CHANNELS 12 #ifdef __UNUSED__ 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; unsigned int type, used, visible, satcnt, j, k; double version; gps_mask_t mask = 0; /* must have two leader bytes, length, and two trailer bytes minimum */ if (len < 5) return 0; /* time to unstuff it and discard the header and footer */ cp = buf + 2; if (*cp == 0x10) cp++; datalen = (size_t) * cp++; datalen -= 2; /* prevent 'Assigned value is garbage or undefined' from scan-build */ memset(buf2, '\0', sizeof(buf2)); tp = buf2; for (i = 0; i < (size_t) datalen; i++) { *tp = *cp++; if (*tp == 0x10) cp++; tp++; } type = (unsigned char)getub(buf2, 0); gpsd_log(&session->context->errout, LOG_RAW, "EverMore packet type 0x%02x (%zd bytes)\n", type, tp-buf2); session->cycle_end_reliable = true; switch (type) { case 0x02: /* Navigation Data Output */ session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)getleu16(buf2, 3), (double)getleu32(buf2, 5) * 0.01); ecef_to_wgs84fix(&session->newdata, &session->gpsdata.separation, (double)getles32(buf2, 9) * 1.0, (double)getles32(buf2, 13) * 1.0, (double)getles32(buf2, 17) * 1.0, (double)getles16(buf2, 21) / 10.0, (double)getles16(buf2, 23) / 10.0, (double)getles16(buf2, 25) / 10.0); used = (unsigned char)getub(buf2, 27) & 0x0f; //visible = (getub(buf2, 27) & 0xf0) >> 4; version = (uint) getleu16(buf2, 28) / 100.0; /* that's all the information in this packet */ if (used < 3) session->newdata.mode = MODE_NO_FIX; else if (used == 3) session->newdata.mode = MODE_2D; else { session->newdata.mode = MODE_3D; mask |= ALTITUDE_SET | CLIMB_SET; } mask |= TIME_SET | PPSTIME_IS | LATLON_SET | TRACK_SET | SPEED_SET | MODE_SET; if (session->subtype[0] == '\0') { (void)snprintf(session->subtype, sizeof(session->subtype), "%3.2f", version); mask |= DEVICEID_SET; } gpsd_log(&session->context->errout, LOG_DATA, "NDO 0x02: time=%.2f, lat=%.2f lon=%.2f alt=%.2f speed=%.2f track=%.2f climb=%.2f mode=%d subtype='%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); return mask | CLEAR_IS | REPORT_IS; case 0x04: /* DOP Data Output */ session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)getleu16(buf2, 3), (double)getleu32(buf2, 5) * 0.01); /* * We make a deliberate choice not to clear DOPs from the * last skyview here, but rather to treat this as a supplement * to our calculations from the visibility matrix, trusting * the firmware algorithms over ours. */ session->gpsdata.dop.gdop = (double)getub(buf2, 9) * 0.1; session->gpsdata.dop.pdop = (double)getub(buf2, 10) * 0.1; session->gpsdata.dop.hdop = (double)getub(buf2, 11) * 0.1; session->gpsdata.dop.vdop = (double)getub(buf2, 12) * 0.1; session->gpsdata.dop.tdop = (double)getub(buf2, 13) * 0.1; switch (getub(buf2, 14)) { 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 */ session->gpsdata.status = STATUS_FIX; session->newdata.mode = MODE_2D; break; case 3: /* 3D navigation */ session->gpsdata.status = STATUS_FIX; session->newdata.mode = MODE_3D; break; 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 | PPSTIME_IS | DOP_SET | MODE_SET | STATUS_SET; gpsd_log(&session->context->errout, 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 */ session->gpsdata.skyview_time = gpsd_gpstime_resolve(session, (unsigned short)getleu16(buf2, 3), (double)getleu32(buf2, 5) * 0.01); session->gpsdata.satellites_visible = (int)getub(buf2, 9); gpsd_zero_satellites(&session->gpsdata); memset(session->gpsdata.used, 0, sizeof(session->gpsdata.used)); if (session->gpsdata.satellites_visible > 12) { gpsd_log(&session->context->errout, LOG_WARN, "Warning: EverMore packet has information about %d satellites!\n", session->gpsdata.satellites_visible); } 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++) { int prn; // channel = getub(buf2, 7*i+7+3) prn = (int)getub(buf2, 7 * i + 7 + 4); if (prn == 0) continue; /* satellite record is not valid */ session->gpsdata.PRN[satcnt] = prn; session->gpsdata.azimuth[satcnt] = (int)getleu16(buf2, 7 * i + 7 + 5); session->gpsdata.elevation[satcnt] = (int)getub(buf2, 7 * i + 7 + 7); session->gpsdata.ss[satcnt] = (float)getub(buf2, 7 * i + 7 + 8); /* * Status bits at offset 8: * bit0 = 1 satellite acquired * bit1 = 1 code-tracking loop locked * bit2 = 1 carrier-tracking loop locked * bit3 = 1 data-bit synchronization done * bit4 = 1 frame synchronization done * bit5 = 1 ephemeris data collected * bit6 = 1 used for position fix */ if (getub(buf2, 7 * i + 7 + 9) & 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_IS; gpsd_log(&session->context->errout, 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 */ /* clock offset is a manufacturer diagnostic */ /* (int)getleu16(buf2, 9); clock offset, 29000..29850 ?? */ session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)getleu16(buf2, 3), (double)getleu32(buf2, 5) * 0.01); visible = (unsigned char)getub(buf2, 11); /* * Note: This code is untested. It was written from the manual. * The results need to be sanity-checked against a GPS with * known-good raw decoding and the same skyview. * * We can get pseudo range (m), delta-range (m/s), doppler (Hz) * and status for each channel from the chip. We cannot get * codephase or carrierphase. */ #define SBITS(sat, s, l) sbits((signed char *)buf, 10 + (sat*14) + s, l, false) #define UBITS(sat, s, l) ubits((unsigned char *)buf, 10 + (sat*14) + s, l, false) for (k = 0; k < visible; k++) { int prn = (int)UBITS(k, 4, 5); /* this is so we can tell which never got set */ for (j = 0; j < MAXCHANNELS; j++) session->gpsdata.raw.mtime[j] = 0; for (j = 0; j < MAXCHANNELS; j++) { if (session->gpsdata.PRN[j] == prn) { session->gpsdata.raw.codephase[j] = NAN; session->gpsdata.raw.carrierphase[j] = NAN; session->gpsdata.raw.mtime[j] = session->newdata.time; session->gpsdata.raw.satstat[j] = (unsigned)UBITS(k, 24, 8); session->gpsdata.raw.pseudorange[j] = (double)SBITS(k,40,32); session->gpsdata.raw.deltarange[j] = (double)SBITS(k,72,32); session->gpsdata.raw.doppler[j] = (double)SBITS(k, 104, 16); } } } #undef SBITS #undef UBITS gpsd_log(&session->context->errout, LOG_DATA, "MDO 0x04: time=%.2f mask={TIME|RAW}\n", session->newdata.time); return TIME_SET | PPSTIME_IS | RAW_IS; case 0x20: /* LogConfig Info, could be used as a probe for EverMore GPS */ gpsd_log(&session->context->errout, LOG_DATA, "LogConfig EverMore packet, length %zd\n", datalen); return ONLINE_SET; case 0x22: /* LogData */ gpsd_log(&session->context->errout, LOG_DATA, "LogData EverMore packet, length %zd\n", datalen); return ONLINE_SET; case 0x38: /* ACK */ gpsd_log(&session->context->errout, LOG_PROG, "EverMore command %02X ACK\n", getub(buf2, 3)); return ONLINE_SET; default: gpsd_log(&session->context->errout, LOG_WARN, "unknown EverMore packet EID 0x%02x, length %zd\n", buf2[0], datalen); return 0; } } static gps_mask_t evermore_parse_input(struct gps_device_t *session) { gps_mask_t st; if (session->lexer.type == EVERMORE_PACKET) { st = evermore_parse(session, session->lexer.outbuffer, session->lexer.outbuflen); return st; } #ifdef NMEA_ENABLE else if (session->lexer.type == NMEA_PACKET) { st = nmea_parse((char *)session->lexer.outbuffer, session); return st; } #endif /* NMEA_ENABLE */ else return 0; } #endif /* __UNUSED__ */ static ssize_t evermore_control_send(struct gps_device_t *session, char *buf, size_t len) { unsigned int crc; size_t i; char *cp; /* 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); return gpsd_write(session, session->msgbuf, session->msgbuflen); } static bool evermore_protocol(struct gps_device_t *session, int protocol) { 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 */ }; gpsd_log(&session->context->errout, LOG_PROG, "evermore_protocol(%d)\n", protocol); 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); } static bool evermore_nmea_config(struct gps_device_t *session, int mode) /* mode = 0 : EverMore default */ /* mode = 1 : gpsd best */ /* mode = 2 : EverMore search, activate PEMT101 message */ { unsigned char tmp8; 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 */ }; gpsd_log(&session->context->errout, LOG_PROG, "evermore_nmea_config(%d)\n", mode); tmp8 = (mode == 1) ? 5 : 1; /* NMEA GPGSV, gpsd */ evrm_nmeaout_config[6] = tmp8; /* GPGSV, 1s or 5s */ 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_log(&session->context->errout, LOG_PROG, "evermore_mode(%d), %d\n", mode, session->back_to_nmea ? 1 : 0); if (mode == MODE_NMEA) { /* NMEA */ (void)evermore_protocol(session, 1); (void)evermore_nmea_config(session, 1); /* configure NMEA messages for gpsd */ } else { /* binary */ (void)evermore_protocol(session, 0); session->back_to_nmea = false; } } static void evermore_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; /* * FIX-ME: 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) { /* * We used to run this driver in binary mode, but that has the * problem that Evermore binary mode doesn't report a * leap-second correction in the Navigation Data Out sentence. * So, run it in NMEA mode to getbUTC corrected by firmware. * Fortunately the Evermore firmware interprets binary * commands in NMEA mode, so nothing else needs to change. */ (void)evermore_mode(session, 0); /* switch GPS to NMEA mode */ (void)evermore_nmea_config(session, 1); /* configure NMEA messages for gpsd (GPGSV every 5s) */ session->back_to_nmea = false; } else if (event == event_deactivate) { (void)evermore_nmea_config(session, 0); /* configure NMEA messages to default */ } } #ifdef RECONFIGURE_ENABLE static bool evermore_speed(struct gps_device_t *session, speed_t speed, char parity, int stopbits) { gpsd_log(&session->context->errout, LOG_PROG, "evermore_speed(%u%c%d)\n", (unsigned int)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) { return false; } else { unsigned char tmp8; 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; } msg[2] = tmp8; return (evermore_control_send(session, (char *)msg, sizeof(msg)) != -1); } } static bool evermore_rate_switcher(struct gps_device_t *session, double rate) /* change the sample rate of the GPS */ { if (rate < 1 || rate > 10) { gpsd_log(&session->context->errout, LOG_ERROR, "valid rate range is 1-10.\n"); return false; } else { 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 */ }; evrm_rate_config[2] = (unsigned char)trunc(rate); return (evermore_control_send(session, (char *)evrm_rate_config, sizeof(evrm_rate_config)) != -1); } } #endif /* RECONFIGURE_ENABLE */ /* this is everything we export */ /* *INDENT-OFF* */ const struct gps_type_t driver_evermore = { .type_name = "EverMore", /* full name of type */ .packet_type = EVERMORE_PACKET, /* lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* recognize the type */ .channels = EVERMORE_CHANNELS, /* consumer-grade GPS */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* use generic one */ .parse_packet = generic_parse_input, /* parse message packets */ .rtcm_writer = gpsd_write, /* send RTCM data straight */ .init_query = NULL, /* non-perturbing query */ .event_hook = evermore_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = evermore_speed, /* we can change baud rates */ .mode_switcher = evermore_mode, /* there is a mode switcher */ .rate_switcher = evermore_rate_switcher, /* change sample rate */ .min_cycle = 1, /* ignore, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = evermore_control_send, /* how to send a control string */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* defined(EVERMORE_ENABLE) && defined(BINARY_ENABLE) */ gpsd-3.15/driver_garmin.c0000664000175000017500000013270612532614165013557 0ustar esresr/* * This file contains two drivers for Garmin receivers and some code * shared by both drivers. * * One driver "garmin_usb_binary" handles the Garmin binary packet * format supported by the USB Garmins tested with the Garmin 18 and * other models. (There is also "garmin_usb_binary_old".) These are ONLY * for USB devices reporting as: 091e:0003. * * The other driver "garmin_ser_binary" is for Garmin receivers via a * serial port, whether or not one uses a USB/serial adaptor or a real * serial port. These receivers provide adequate NMEA support, so it * often makes sense to just put them into NMEA mode. * * On Linux, USB Garmins (091e:0003) need the Linux garmin_gps driver and * will not function without it. On other operating systems, it is clear * garmin_usb_binary_old does not work since it requires the Linux * garmin_gps module. * * This code has been tested and at least at one time is known to work on * big- and little-endian CPUs and 32 and 64 bit cpu modes. * * * Documentation for the Garmin protocols can be found via * http://www.garmin.com/support/commProtocol.html * The file IOSDK.zip contains IntfSpec.pdf, which describes the * protocol in terms of Application, Link, and Physical. This * identical file is also available at: * http://www.garmin.com/support/pdf/iop_spec.pdf * An older version of iop_spec.pdf that describes only Serial Binary * is available at: * http://vancouver-webpages.com/pub/peter/iop_spec.pdf * Information about the GPS 18 * http://www.garmin.com/manuals/425_TechnicalSpecification.pdf * * There is one physical link protocol for serial which uses DLE/ETX * framing. There is another physical protocol for USB which relies * on the packetization intrinsic to USB bulk pipes. * * There are several link protocols; all devices implement L000. * There are then product-specific protocols; most devices implement * L001. Link protocols are the same and carried over either Physical * protocol. * * Application protocols are named A000 and then with different * 3-digit numbers. They are carried over Link protocols. * * Thus, much of the higher-level code dealing the data formats is * shared between USB Binary and Serial Binary. * * This code is partly from the Garmin IOSDK and partly from the * sample code in the Linux garmin_gps driver. * * bad code by: Gary E. Miller * * -D 3 = packet trace * -D 4 = packet details * -D 5 = more packet details * -D 6 = very excessive details * * limitations: * * do not have from garmin: * pdop * hdop * vdop * magnetic variation * * known bugs: * hangs in the fread loop instead of keeping state and returning. * * TODO: * * ?? Add probe function for Serial Binary to start PVT output. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #define __USE_POSIX199309 1 #include #include #include #include #include #include #include #include "gpsd_config.h" #if defined(HAVE_LIBUSB) #include #endif #include "gpsd.h" #include "bits.h" #define GPSD_LE16TOH(x) getles16((char *)(&(x)), 0) #define GPSD_LE32TOH(x) getles32((char *)(&(x)), 0) #ifdef GARMIN_ENABLE #define USE_RMD 0 /* Used in Serial Physical Layer */ #define ETX 0x03 #define ACK 0x06 #define DLE 0x10 #define NAK 0x15 #define GARMIN_LAYERID_TRANSPORT (uint8_t) 0 #define GARMIN_LAYERID_APPL (uint32_t) 20 // Linux Garmin USB driver layer-id to use for some control mechanisms #define GARMIN_LAYERID_PRIVATE 0x01106E4B // packet ids used in private layer #define PRIV_PKTID_SET_DEBUG 1 #define PRIV_PKTID_SET_MODE 2 #define PRIV_PKTID_INFO_REQ 3 #define PRIV_PKTID_INFO_RESP 4 #define PRIV_PKTID_RESET_REQ 5 #define PRIV_PKTID_SET_DEF_MODE 6 #define MODE_NATIVE 0 #define MODE_GARMIN_SERIAL 1 #define GARMIN_PKTID_TRANSPORT_START_SESSION_REQ 5 #define GARMIN_PKTID_TRANSPORT_START_SESSION_RESP 6 #define GARMIN_PKTID_PROTOCOL_ARRAY 253 #define GARMIN_PKTID_PRODUCT_RQST 254 #define GARMIN_PKTID_PRODUCT_DATA 255 /* 0x29 ')' */ #define GARMIN_PKTID_RMD41_DATA 41 /* 0x33 '3' */ #define GARMIN_PKTID_PVT_DATA 51 /* 0x33 '4' */ #define GARMIN_PKTID_RMD_DATA 52 /* 0x72 'r' */ #define GARMIN_PKTID_SAT_DATA 114 #define GARMIN_PKTID_L001_XFER_CMPLT 12 #define GARMIN_PKTID_L001_COMMAND_DATA 10 #define GARMIN_PKTID_L001_DATE_TIME_DATA 14 #define GARMIN_PKTID_L001_RECORDS 27 #define GARMIN_PKTID_L001_WPT_DATA 35 #define CMND_ABORT 0 #define CMND_START_PVT_DATA 49 #define CMND_STOP_PVT_DATA 50 #define CMND_START_RM_DATA 110 #define MAX_BUFFER_SIZE 4096 #define GARMIN_CHANNELS 12 // something magic about 64, garmin driver will not return more than // 64 at a time. If you read less than 64 bytes the next read will // just get the last of the 64 byte buffer. #define ASYNC_DATA_SIZE 64 #pragma pack(1) // This is the data format of the satellite data from the garmin USB typedef struct __attribute__((__packed__)) { uint8_t svid; uint16_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 __attribute__((__packed__)) { 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 of 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; /* days from UTC December 31st, 1989 to the * beginning of the current week */ } cpo_pvt_data; typedef struct __attribute__((__packed__)) { 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 __attribute__((__packed__)) { 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 __attribute__((__packed__)) { 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; } mData; } Packet_t; // useful funcs to read/write ints // floats and doubles are Intel (little-endian) order only... static inline void set_int16(uint8_t * buf, uint32_t value) { buf[0] = (uint8_t) (0x0FF & value); buf[1] = (uint8_t) (0x0FF & (value >> 8)); } 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)); } static inline uint16_t get_uint16(const uint8_t * buf) { return (uint16_t) (0xFF & buf[0]) | ((uint16_t) (0xFF & buf[1]) << 8); } #if defined(HAVE_LIBUSB) && defined(__linux__) 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); } #endif /* HAVE_LIBUSB */ // convert radians to degrees 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); #if defined(HAVE_LIBUSB) && defined(__linux__) static gps_mask_t PrintUSBPacket(struct gps_device_t *session, Packet_t * pkt); #endif /* HAVE_LIBUSB */ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id, int pkt_len, unsigned char *buf) { gps_mask_t mask = 0; int i = 0, j = 0; uint16_t prod_id = 0; uint16_t ver = 0; int maj_ver; int min_ver; time_t time_l = 0; double track; char msg_buf[512] = ""; char *msg = NULL; cpo_sat_data *sats = NULL; cpo_pvt_data *pvt = NULL; cpo_rcv_data *rmd = NULL; gpsd_log(&session->context->errout, LOG_DATA, "Garmin: PrintSERPacket(, %#02x, %#02x, )\n", pkt_id, pkt_len); session->cycle_end_reliable = true; switch (pkt_id) { case ACK: gpsd_log(&session->context->errout, LOG_PROG, "Garmin: ACK\n"); break; case NAK: gpsd_log(&session->context->errout, LOG_PROG, "Garmin: NAK\n"); break; case GARMIN_PKTID_L001_COMMAND_DATA: prod_id = get_uint16((uint8_t *) buf); switch (prod_id) { case CMND_ABORT: msg = "Abort current xfer"; break; case CMND_START_PVT_DATA: msg = "Start Xmit PVT data"; break; case CMND_STOP_PVT_DATA: msg = "Stop Xmit PVT data"; break; case CMND_START_RM_DATA: msg = "Start RMD data"; break; default: (void)snprintf(msg_buf, sizeof(msg_buf), "Unknown: %u", (unsigned int)prod_id); msg = msg_buf; break; } gpsd_log(&session->context->errout, LOG_PROG, "Garmin: Appl, Command Data: %s\n", msg); break; case GARMIN_PKTID_PRODUCT_RQST: gpsd_log(&session->context->errout, 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]); maj_ver = (int)(ver / 100); min_ver = (int)(ver - (maj_ver * 100)); gpsd_log(&session->context->errout, 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_log(&session->context->errout, LOG_INF, "Garmin: Product ID: %d, SoftVer: %d.%02d\n", prod_id, maj_ver, min_ver); gpsd_log(&session->context->errout, LOG_INF, "Garmin: Product Desc: %s\n", &buf[4]); mask |= DEVICEID_SET; gpsd_log(&session->context->errout, LOG_DATA, "Garmin: PRODUCT_DATA: subtype=%s\n", session->subtype); break; case GARMIN_PKTID_PVT_DATA: gpsd_log(&session->context->errout, LOG_PROG, "Garmin: Appl, PVT Data Sz: %d\n", pkt_len); pvt = (cpo_pvt_data *) buf; // 631065600, unix seconds for 31 Dec 1989 Zulu time_l = (time_t) (631065600 + (GPSD_LE32TOH(pvt->grmn_days) * 86400)); // TODO, convert grmn_days to context->gps_week time_l -= GPSD_LE16TOH(pvt->leap_sec); session->context->leap_seconds = (int)GPSD_LE16TOH(pvt->leap_sec); 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->context->gps_tow = pvt->gps_tow; session->newdata.time = (timestamp_t)time_l; gpsd_log(&session->context->errout, 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_log(&session->context->errout, LOG_INF, "Garmin: ERROR: Latitude overrange\n"); } else if (-90.0 > session->newdata.latitude) { session->newdata.latitude = -90.0; gpsd_log(&session->context->errout, 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_log(&session->context->errout, LOG_INF, "Garmin: ERROR: Longitude overrange\n"); } else if (-180.0 > session->newdata.longitude) { session->newdata.longitude = -180.0; gpsd_log(&session->context->errout, LOG_INF, "Garmin: ERROR: Longitude negative overrange\n"); } // altitude over WGS84 converted to MSL session->newdata.altitude = pvt->alt + pvt->msl_hght; // geoid separation from WGS 84 // gpsd sign is opposite of garmin sign session->gpsdata.separation = -pvt->msl_hght; // Estimated position error in meters. // We follow the advice at . // 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); /* 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); // convert lat/lon to directionless speed session->newdata.speed = hypot(pvt->lon_vel, pvt->lat_vel); // keep climb in meters/sec session->newdata.climb = pvt->alt_vel; track = atan2(pvt->lon_vel, pvt->lat_vel); if (track < 0) { track += 2 * GPS_PI; } session->newdata.track = radtodeg(track); switch (GPSD_LE16TOH(pvt->fix)) { case 0: case 1: default: // no fix session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; break; case 2: // 2D fix session->gpsdata.status = STATUS_FIX; session->newdata.mode = MODE_2D; break; case 3: // 3D fix session->gpsdata.status = STATUS_FIX; session->newdata.mode = MODE_3D; break; case 4: // 2D Differential fix session->gpsdata.status = STATUS_DGPS_FIX; session->newdata.mode = MODE_2D; break; case 5: // 3D differential fix session->gpsdata.status = STATUS_DGPS_FIX; session->newdata.mode = MODE_3D; break; } gpsd_log(&session->context->errout, LOG_PROG, "Garmin: Appl, mode %d, status %d\n", session->newdata.mode, session->gpsdata.status); gpsd_log(&session->context->errout, LOG_INF, "Garmin: UTC Time: %lf\n", session->newdata.time); gpsd_log(&session->context->errout, 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_log(&session->context->errout, 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, GPSD_LE16TOH(pvt->fix), pvt->gps_tow, session->newdata.latitude, session->newdata.longitude, pvt->lon_vel, pvt->lat_vel, pvt->alt_vel, pvt->msl_hght, GPSD_LE16TOH(pvt->leap_sec), GPSD_LE32TOH(pvt->grmn_days)); if (session->newdata.mode > MODE_NO_FIX) { /* data only valid with a fix */ mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | STATUS_SET | MODE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | HERR_SET | VERR_SET | PERR_IS | CLEAR_IS | REPORT_IS; /* * Garmin documentation says we should wait until four good fixes * have been seen before trying to use the device for precision * time service. */ if (session->fixcnt > 3) mask |= PPSTIME_IS; } gpsd_log(&session->context->errout, LOG_DATA, "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\n", session->newdata.time, session->newdata.latitude, session->newdata.longitude, session->newdata.speed, session->newdata.track, session->newdata.climb, session->newdata.epx, session->newdata.epy, session->newdata.epv, session->newdata.mode, session->gpsdata.status); break; case GARMIN_PKTID_RMD_DATA: case GARMIN_PKTID_RMD41_DATA: rmd = (cpo_rcv_data *) buf; gpsd_log(&session->context->errout, LOG_DATA, "Garmin: PVT RMD Data Sz: %d\n", pkt_len); gpsd_log(&session->context->errout, 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++) { gpsd_log(&session->context->errout, LOG_INF, "Garmin: PVT RMD Sat: %3u, cycles: %9u, pr: %16.6f, " "phase: %7.3f, slp_dtct: %3s, snr: %3u, Valid: %3s\n", (int)rmd->sv[i].svid + 1, GPSD_LE32TOH(rmd->sv[i].cycles), rmd->sv[i].pr, (GPSD_LE16TOH(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"); } break; case GARMIN_PKTID_SAT_DATA: gpsd_log(&session->context->errout, LOG_PROG, "Garmin: SAT Data Sz: %d\n", pkt_len); sats = (cpo_sat_data *) buf; session->gpsdata.satellites_visible = 0; session->gpsdata.satellites_used = 0; gpsd_zero_satellites(&session->gpsdata); for (i = 0, j = 0; i < GARMIN_CHANNELS; i++, sats++) { gpsd_log(&session->context->errout, LOG_INF, "Garmin: Sat %3d, snr: %5u, elev: %2d, Azmth: %3d, Stat: %x\n", sats->svid, GPSD_LE16TOH(sats->snr), sats->elev, GPSD_LE16TOH(sats->azmth), sats->status); if (255 == (int)sats->svid) { // Garmin uses 255 for empty // gpsd uses 0 for empty continue; } if ((int)sats->svid <= 32) session->gpsdata.skyview[j].PRN = (short)sats->svid; /* GPS */ else session->gpsdata.skyview[j].PRN = (short)sats->svid + 87; /* SBAS */ session->gpsdata.skyview[j].azimuth = (short)GPSD_LE16TOH(sats->azmth); session->gpsdata.skyview[j].elevation = (short)sats->elev; // Garmin does not document this. snr is in dB*100 // Known, but not seen satellites have a dB value of -1*100 session->gpsdata.skyview[j].ss = (float)(GPSD_LE16TOH(sats->snr) / 100.0); if (session->gpsdata.skyview[j].ss == -1) { continue; } // FIX-ME: Garmin documents this, but Daniel Dorau // says the behavior on his GPSMap60CSX // doesn't match it. if ((uint8_t) 0 != (sats->status & 4)) { // used in solution? session->gpsdata.skyview[j].used = true; session->gpsdata.satellites_used++; } session->gpsdata.satellites_visible++; j++; } session->gpsdata.skyview_time = NAN; if (session->gpsdata.satellites_visible > 0) mask |= SATELLITE_SET; if (session->gpsdata.satellites_used > 0) mask |= USED_IS; gpsd_log(&session->context->errout, LOG_DATA, "Garmin: SAT_DATA: visible=%d used=%d\n", session->gpsdata.satellites_visible, session->gpsdata.satellites_used); break; case GARMIN_PKTID_PROTOCOL_ARRAY: // this packet is never requested, it just comes, in some case // after a GARMIN_PKTID_PRODUCT_RQST gpsd_log(&session->context->errout, LOG_INF, "Garmin: Appl, Product Capability, sz: %d\n", pkt_len); for (i = 0; i < pkt_len; i += 3) { gpsd_log(&session->context->errout, LOG_INF, "Garmin: %c%03d\n", buf[i], get_uint16((uint8_t *) & buf[i + 1])); } break; default: gpsd_log(&session->context->errout, LOG_WARN, "Garmin: Unknown packet id: %#02x, Sz: %#02x\n", pkt_id, pkt_len); break; } gpsd_log(&session->context->errout, LOG_DATA, "Garmin: PrintSERPacket(, %#02x, %#02x, )\n", pkt_id, pkt_len); return mask; } #if defined(HAVE_LIBUSB) && defined(__linux__) // This works around cppcheck not looking into enough config branches // cppcheck-suppress unusedFunction static gps_mask_t PrintUSBPacket(struct gps_device_t *session, Packet_t * pkt) /* For debugging, decodes and prints some known packets */ { gps_mask_t mask = 0; int maj_ver; int min_ver; uint32_t mode = 0; uint16_t prod_id = 0; uint32_t veri = 0; uint32_t serial; uint32_t mDataSize = get_int32((uint8_t *) & pkt->mDataSize); // uint8_t *buffer = (uint8_t *) pkt; gpsd_log(&session->context->errout, LOG_PROG, "Garmin: PrintUSBPacket()\n"); // gem if (DLE == pkt->mPacketType) { gpsd_log(&session->context->errout, 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_log(&session->context->errout, LOG_WARN, "Garmin: bogus packet, size too large=%d\n", mDataSize); return 0; } switch (pkt->mPacketType) { case GARMIN_LAYERID_TRANSPORT: /* Garmin USB layer specific */ switch (pkt->mPacketId) { case GARMIN_PKTID_TRANSPORT_START_SESSION_REQ: gpsd_log(&session->context->errout, LOG_PROG, "Garmin: Transport, Start Session req\n"); break; case GARMIN_PKTID_TRANSPORT_START_SESSION_RESP: mode = get_int32(&pkt->mData.uchars[0]); gpsd_log(&session->context->errout, LOG_PROG, "Garmin: Transport, Start Session resp, unit: 0x%x\n", mode); break; default: gpsd_log(&session->context->errout, 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; case GARMIN_LAYERID_APPL: /* raw data transport, shared with Garmin Serial Driver */ mask = PrintSERPacket(session, (unsigned char)pkt->mPacketId, (int)mDataSize, (unsigned char *)pkt->mData.uchars); break; case 75: // private, garmin USB kernel driver specific switch (pkt->mPacketId) { case PRIV_PKTID_SET_MODE: prod_id = get_uint16(&pkt->mData.uchars[0]); gpsd_log(&session->context->errout, LOG_PROG, "Garmin: Private, Set Mode: %d\n", prod_id); break; case PRIV_PKTID_INFO_REQ: gpsd_log(&session->context->errout, LOG_PROG, "Garmin: Private, ID: Info Req\n"); break; case PRIV_PKTID_INFO_RESP: veri = get_int32(pkt->mData.uchars); maj_ver = (int)(veri >> 16); min_ver = (int)(veri & 0xffff); mode = get_int32(&pkt->mData.uchars[4]); serial = get_int32(&pkt->mData.uchars[8]); gpsd_log(&session->context->errout, LOG_PROG, "Garmin: Private, ID: Info Resp\n"); gpsd_log(&session->context->errout, LOG_INF, "Garmin: USB Driver found, Version %d.%d, Mode: %d, GPS Serial# %u\n", maj_ver, min_ver, mode, serial); break; default: gpsd_log(&session->context->errout, LOG_PROG, "Garmin: Private, Packet: ID: %d, Sz: %d\n", pkt->mPacketId, mDataSize); break; } break; default: gpsd_log(&session->context->errout, 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; } #endif /* HAVE_LIBUSB */ #if defined(HAVE_LIBUSB) && defined(__linux__) /* 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) { 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); } (void)PrintUSBPacket(session, thePacket); theBytesReturned = gpsd_write(session, (const char *)thePacket, (size_t) theBytesToWrite); gpsd_log(&session->context->errout, LOG_PROG, "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 // 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 = ""; (void)gpsd_write(session, n, 0); } } #endif /* HAVE_LIBUSB && __linux__ */ /* build and send a packet in serial protocol */ /* layer_id unused */ // FIX-ME: 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) { 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; /* we used to say n++ here, but scan-build complains */ *buffer = (uint8_t) ETX; (void)PrintSERPacket(session, (unsigned char)buffer0[1], (int)buffer0[2], (unsigned char *)(buffer0 + 3)); theBytesReturned = gpsd_write(session, (const char *)thePacket, (size_t) theBytesToWrite); gpsd_log(&session->context->errout, LOG_PROG, "Garmin: SendPacket(), wrote %zd bytes\n", theBytesReturned); } #if defined(HAVE_LIBUSB) && defined(__linux__) /* * is_usb_device() - is a specified device USB matching given vendor/product? * * BUG: Doesn't actually match against path yet. Must finish this function * by querying /sys/dev/char, either directly or using libudev. Greg KH * assures this is possible, though he is vague about how. * * libudev: http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/ */ // This works around cppcheck not looking into enough config branches // cppcheck-suppress unusedFunction static bool is_usb_device(const char *path UNUSED, int vendor, int product, struct gpsd_errout_t *errout) { // discover devices libusb_device **list; ssize_t cnt; ssize_t i = 0; bool found = false; gpsd_log(errout, LOG_INF, "attempting USB device enumeration.\n"); (void)libusb_init(NULL); if ((cnt = libusb_get_device_list(NULL, &list)) < 0) { gpsd_log(errout, LOG_ERROR, "USB device list call failed.\n"); libusb_exit(NULL); return false; } for (i = 0; i < cnt; i++) { struct libusb_device_descriptor desc; libusb_device *dev = list[i]; int r = libusb_get_device_descriptor(dev, &desc); if (r < 0) { gpsd_log(errout, LOG_ERROR, "USB descriptor fetch failed on device %zd.\n", i); continue; } /* we can extract device descriptor data */ gpsd_log(errout, LOG_INF, "%04x:%04x (bus %d, device %d)\n", desc.idVendor, desc.idProduct, libusb_get_bus_number(dev), libusb_get_device_address(dev)); /* we match if vendor and product ID are right */ if (desc.idVendor == (uint16_t)vendor && desc.idProduct == (uint16_t)product) { found = true; break; } } gpsd_log(errout, LOG_INF, "vendor/product match with %04x:%04x %sfound\n", vendor, product, found ? "" : "not "); libusb_free_device_list(list, 1); libusb_exit(NULL); return found; } #endif /* HAVE_LIBUSB */ /* * garmin_usb_detect() - detect a Garmin USB device connected to session fd. * * This is ONLY for USB devices reporting as: 091e:0003. * * This driver ONLY works in Linux and ONLY when the garmin_gps kernel * module is installed. * * This is only necessary because under Linux Garmin USB devices need a * kernel module rather than being normal USB-serial devices. * * 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 UNUSED) { #if defined(__linux__) /* * 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; else { #ifdef HAVE_LIBUSB if (!is_usb_device(session->gpsdata.dev.path, 0x091e, 0x0003, &session->context->errout)) return false; if (!gpsd_set_raw(session)) { gpsd_log(&session->context->errout, LOG_ERROR, "Garmin: garmin_usb_detect: error changing port attributes: %s\n", strerror(errno)); return false; } if (sizeof(session->driver.garmin.Buffer) < sizeof(Packet_t)) { /* dunno how this happens, but it does on some compilers */ gpsd_log(&session->context->errout, LOG_ERROR, "Garmin: garmin_usb_detect: Compile error, garmin.Buffer too small.\n"); return false; } // FIXME!!! needs to use libusb totally and move garmin_gps aside */ // set Mode 1, mode 0 is broken somewhere past 2.6.14 // but how? gpsd_log(&session->context->errout, 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; #else return false; #endif /* HAVE_LIBUSB */ } #else return false; #endif /* __linux__ */ } static void garmin_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; /* * FIX-ME: 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) { // Tell the device to send product data gpsd_log(&session->context->errout, 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_log(&session->context->errout, 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); #if USE_RMD // turn on RMD data 110 gpsd_log(&session->context->errout, 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) /* FIX-ME: is any action needed, or is closing the port sufficient? */ gpsd_log(&session->context->errout, LOG_PROG, "Garmin: garmin_close()\n"); } #define Send_ACK() Build_Send_SER_Packet(session, 0, ACK, 0, 0) #define Send_NAK() Build_Send_SER_Packet(session, 0, NAK, 0, 0) gps_mask_t garmin_ser_parse(struct gps_device_t *session) { unsigned char *buf = session->lexer.outbuffer; size_t len = session->lexer.outbuflen; unsigned char data_buf[MAX_BUFFER_SIZE]; unsigned char c; int i = 0; size_t n = 0; int data_index = 0; int got_dle = 0; unsigned char pkt_id = 0; unsigned char pkt_len = 0; unsigned char chksum = 0; gps_mask_t mask = 0; gpsd_log(&session->context->errout, LOG_RAW, "Garmin: garmin_ser_parse()\n"); if (6 > len) { /* WTF? */ /* minimum packet; [pkt id] [length=0] [chksum] */ Send_NAK(); gpsd_log(&session->context->errout, LOG_RAW + 1, "Garmin: serial too short: %zd\n", len); return 0; } /* debug */ for (i = 0; i < (int)len; i++) { gpsd_log(&session->context->errout, LOG_RAW + 1, "Garmin: Char: %#02x\n", buf[i]); } if ('\x10' != buf[0]) { Send_NAK(); gpsd_log(&session->context->errout, 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++]) { Send_NAK(); gpsd_log(&session->context->errout, 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_log(&session->context->errout, LOG_RAW + 1, "Garmin: Bad pkt_len %#02x\n", pkt_len); Send_NAK(); return 0; } } data_index = 0; for (i = 0; i < 256; i++) { if ((int)pkt_len == data_index) { // got it all break; } if (len < n + i) { gpsd_log(&session->context->errout, LOG_RAW + 1, "Garmin: Packet too short %zd < %zd\n", len, n + i); Send_NAK(); return 0; } c = buf[n + i]; if (got_dle) { got_dle = 0; if ('\x10' != c) { Send_NAK(); gpsd_log(&session->context->errout, LOG_RAW + 1, "Garmin: Bad DLE %#02x\n", c); return 0; } } else { chksum += c; data_buf[data_index++] = c; if ('\x10' == c) { got_dle = 1; } } } /* get checksum */ if (len < n + i) { Send_NAK(); gpsd_log(&session->context->errout, 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) { Send_NAK(); gpsd_log(&session->context->errout, 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) { Send_NAK(); gpsd_log(&session->context->errout, LOG_RAW + 1, "Garmin: Final DLE not DLE\n"); return 0; } /* get final ETX */ if (len < n + i) { Send_NAK(); gpsd_log(&session->context->errout, LOG_RAW + 1, "Garmin: No final ETX, Packet too short %zd < %zd\n", len, n + i); return 0; } /* we used to say n++ here, but scan-build complains */ c = buf[n + i]; if ('\x03' != c) { Send_NAK(); gpsd_log(&session->context->errout, LOG_RAW + 1, "Garmin: Final ETX not ETX\n"); return 0; } /* debug */ for (i = 0; i < data_index; i++) { gpsd_log(&session->context->errout, LOG_RAW + 1, "Garmin: Char: %#02x\n", data_buf[i]); } gpsd_log(&session->context->errout, LOG_DATA, "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); // sending ACK too soon might hang the session // so send ACK last, after a pause (void)usleep(300); Send_ACK(); gpsd_log(&session->context->errout, LOG_DATA, "Garmin: garmin_ser_parse( )\n"); return mask; } #ifdef RECONFIGURE_ENABLE static void settle(void) { struct timespec delay, rem; memset(&delay, 0, sizeof(delay)); delay.tv_sec = 0; delay.tv_nsec = 333000000L; nanosleep(&delay, &rem); } static void garmin_switcher(struct gps_device_t *session, int mode) { if (mode == MODE_NMEA) { const char switcher[] = { 0x10, 0x0A, 0x02, 0x26, 0x00, 0xCE, 0x10, 0x03 }; // Note hard-coded string length in the next line... ssize_t status = gpsd_write(session, switcher, sizeof(switcher)); if (status == (ssize_t)sizeof(switcher)) { gpsd_log(&session->context->errout, LOG_PROG, "Garmin: => GPS: turn off binary %02x %02x %02x... \n", switcher[0], switcher[1], switcher[2]); } else { gpsd_log(&session->context->errout, LOG_ERROR, "Garmin: => GPS: FAILED\n"); } 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! } else { (void)nmea_send(session, "$PGRMC1,1,2,1,,,,2,W,N"); (void)nmea_send(session, "$PGRMI,,,,,,,R"); settle(); // wait 333mS, essential! } } #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE 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 */ { session->msgbuflen = buflen; (void)memcpy(session->msgbuf, buf, buflen); return gpsd_write(session, session->msgbuf, session->msgbuflen); } #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE static double garmin_time_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 /* TIMEHINT_ENABLE */ /* this is everything we export */ #ifdef __UNUSED__ 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 // at a time, no matter what you ask for. // // is you ask for less than 64 bytes then the next packet will include // just the remaining bytes of the last 64 byte packet. // // Reading a packet of length Zero, or less than 64, signals the end of // the entire packet. // // The Garmin sample WinXX code also assumes the same behavior, so // 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) { 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)); session->driver.garmin.BufferLen = 0; session->lexer.outbuflen = 0; gpsd_log(&session->context->errout, LOG_DATA, "Garmin: GetPacket()\n"); 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 // 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; 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) { // read error... // or EAGAIN, but O_NONBLOCK is never set gpsd_log(&session->context->errout, LOG_ERROR, "Garmin: GetPacket() read error=%d, errno=%d\n", theBytesReturned, errno); continue; } gpsd_log(&session->context->errout, LOG_RAW, "Garmin: got %d bytes\n", theBytesReturned); session->driver.garmin.BufferLen += theBytesReturned; if (256 <= session->driver.garmin.BufferLen) { // really bad read error... gpsd_log(&session->context->errout, 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) { // have enough data to check packet size if (session->driver.garmin.BufferLen > pkt_size) { // wrong amount of data in buffer gpsd_log(&session->context->errout, 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) { // zero length, or short, read is a flag for got the whole packet break; } delay.tv_sec = 0; delay.tv_nsec = 3330000L; while (nanosleep(&delay, &rem) == -1) continue; } // dump the individual bytes, debug only // for ( x = 0; x < session->driver.garmin.BufferLen; x++ ) { // gpsd_log(&session->context->errout, LOG_RAW+1, "Garmin: p[%d] = %x\n", x, session->driver.garmin.Buffer[x]); // } if (10 <= cnt) { gpsd_log(&session->context->errout, LOG_ERROR, "Garmin: GetPacket() packet too long or too slow!\n"); return -1; } gpsd_log(&session->context->errout, LOG_RAW, "Garmin: GotPacket() sz=%d \n", session->driver.garmin.BufferLen); session->lexer.outbuflen = session->driver.garmin.BufferLen; return 0; } static gps_mask_t garmin_usb_parse(struct gps_device_t *session) { gpsd_log(&session->context->errout, 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); } /* *INDENT-OFF* */ const struct gps_type_t driver_garmin_usb_binary_old = { .type_name = "Garmin USB binary", /* full name of type */ .packet_type = GARMIN_PACKET; /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* no trigger, it has a probe */ .channels = GARMIN_CHANNELS, /* consumer-grade GPS */ .probe_detect = garmin_usb_detect,/* how to detect at startup time */ .get_packet = garmin_get_packet,/* how to grab a packet */ .parse_packet = garmin_usb_parse, /* parse message packets */ .rtcm_writer = NULL, /* don't send DGPS corrections */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = garmin_event_hook,/* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = garmin_control_send, /* send raw bytes */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = garmin_time_offset, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* __UNUSED__ */ /* *INDENT-OFF* */ const struct gps_type_t driver_garmin_usb_binary = { .type_name = "Garmin USB binary", /* full name of type */ .packet_type = GARMIN_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* no trigger, it has a probe */ .channels = GARMIN_CHANNELS, /* consumer-grade GPS */ .probe_detect = garmin_usb_detect,/* how to detect at startup time */ .get_packet = generic_get, /* how to grab a packet */ .parse_packet = garmin_ser_parse, /* parse message packets */ .rtcm_writer = NULL, /* don't send DGPS corrections */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = garmin_event_hook,/* lifetime ebent handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .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 /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = garmin_control_send, /* send raw bytes */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = garmin_time_offset, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ /* *INDENT-OFF* */ const struct gps_type_t driver_garmin_ser_binary = { .type_name = "Garmin Serial binary", /* full name of type */ .packet_type = GARMIN_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* no trigger, it has a probe */ .channels = GARMIN_CHANNELS, /* consumer-grade GPS */ .probe_detect = NULL, /* how to detect at startup time */ .get_packet = generic_get, /* how to grab a packet */ .parse_packet = garmin_ser_parse, /* parse message packets */ .rtcm_writer = NULL, /* don't send DGPS corrections */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = garmin_switcher, /* how to change modes */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = garmin_control_send, /* send raw bytes */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = garmin_time_offset, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* GARMIN_ENABLE */ gpsd-3.15/driver_garmin_txt.c0000664000175000017500000003542612520742615014456 0ustar esresr/* * Handle the Garmin simple text format supported by some Garmins. * Tested with the 'Garmin eTrex Legend' device working in 'Text Out' mode. * * Protocol info from: * http://www8.garmin.com/support/text_out.html * http://www.garmin.com/support/commProtocol.html * * Code by: Petr Slansky * all rights abandoned, a thank would be nice if you use this code. * * -D 3 = packet trace * -D 4 = packet details * -D 5 = more packet details * -D 6 = very excessive details * * limitations: * very simple protocol, only very basic information * TODO * do not have from garmin: * pdop * vdop * magnetic variation * satellite information * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ /*************************************************** Garmin Simple Text Output Format: The simple text (ASCII) output contains time, position, and velocity data in the fixed width fields (not delimited) defined in the following table: FIELD DESCRIPTION: WIDTH: NOTES: ----------------------- ------- ------------------------ Sentence start 1 Always '@' ----------------------- ------- ------------------------ /Year 2 Last two digits of UTC year | ----------------------- ------- ------------------------ | Month 2 UTC month, "01".."12" T | ----------------------- ------- ------------------------ i | Day 2 UTC day of month, "01".."31" m | ----------------------- ------- ------------------------ e | Hour 2 UTC hour, "00".."23" | ----------------------- ------- ------------------------ | Minute 2 UTC minute, "00".."59" | ----------------------- ------- ------------------------ \Second 2 UTC second, "00".."59" ----------------------- ------- ------------------------ /Latitude hemisphere 1 'N' or 'S' | ----------------------- ------- ------------------------ | Latitude position 7 WGS84 ddmmmmm, with an implied | decimal after the 4th digit | ----------------------- ------- ------------------------ | Longitude hemishpere 1 'E' or 'W' | ----------------------- ------- ------------------------ | Longitude position 8 WGS84 dddmmmmm with an implied P | decimal after the 5th digit o | ----------------------- ------- ------------------------ s | Position status 1 'd' if current 2D differential GPS position i | 'D' if current 3D differential GPS position t | 'g' if current 2D GPS position i | 'G' if current 3D GPS position o | 'S' if simulated position n | '_' if invalid position | ----------------------- ------- ------------------------ | Horizontal posn error 3 EPH in meters | ----------------------- ------- ------------------------ | Altitude sign 1 '+' or '-' | ----------------------- ------- ------------------------ | Altitude 5 Height above or below mean \ sea level in meters ----------------------- ------- ------------------------ /East/West velocity 1 'E' or 'W' | direction | ----------------------- ------- ------------------------ | East/West velocity 4 Meters per second in tenths, | magnitude ("1234" = 123.4 m/s) V | ----------------------- ------- ------------------------ e | North/South velocity 1 'N' or 'S' l | direction o | ----------------------- ------- ------------------------ c | North/South velocity 4 Meters per second in tenths, i | magnitude ("1234" = 123.4 m/s) t | ----------------------- ------- ------------------------ y | Vertical velocity 1 'U' or 'D' (up/down) | direction | ----------------------- ------- ------------------------ | Vertical velocity 4 Meters per second in hundredths, \ magnitude ("1234" = 12.34 m/s) ----------------------- ------- ------------------------ Sentence end 2 Carriage return, '0x0D', and line feed, '0x0A' ----------------------- ------- ------------------------ If a numeric value does not fill its entire field width, the field is padded with leading '0's (eg. an altitude of 50 meters above MSL will be output as "+00050"). Any or all of the data in the text sentence (except for the sentence start and sentence end fields) may be replaced with underscores to indicate invalid data. ***************************************************/ #include #include #include #include #include #include "gpsd.h" #ifdef GARMINTXT_ENABLE /* Simple text message is fixed length, 55 chars text data + 2 characters EOL */ /* buffer for text processing */ #define TXT_BUFFER_SIZE 13 /************************************************************************** * decode text string to double number, translate prefix to sign * return 0: OK * -1: data error * -2: data not valid * * examples with context->errout.debug == 0: * gar_decode(context, cbuf, 9, "EW", 100000.0, &result); * E01412345 -> +14.12345 * gar_decode(context, cbuf, 9, "EW", 100000.0, &result); * W01412345 -> -14.12345 * gar_decode(context, cbuf, 3, "", 10.0, &result); * 123 -> +12.3 **************************************************************************/ static int gar_decode(const struct gps_context_t *context, const char *data, const size_t length, const char *prefix, const double dividor, 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) */ long int intresult; if (length >= sizeof(buf)) { gpsd_log(&context->errout, LOG_ERROR, "internal buffer too small\n"); return -1; } bzero(buf, (int)sizeof(buf)); (void)strlcpy(buf, data, length); gpsd_log(&context->errout, LOG_RAW + 2, "Decoded string: %s\n", buf); if (strchr(buf, '_') != NULL) { /* 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_log(&context->errout, LOG_WARN, "Unexpected char \"%c\" in data \"%s\"\n", buf[0], buf); return -1; } while (0); if (strspn(buf + offset, "0123456789") != length - offset) { gpsd_log(&context->errout, LOG_WARN, "Invalid value %s\n", buf); return -1; } intresult = atol(buf + offset); if (intresult == 0L) sign = 0.0; /* don't create negative zero */ *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 struct gps_context_t *context, const char *data, const size_t length, const unsigned int min, const unsigned int max, unsigned int *result) { char buf[6]; unsigned int res; if (length >= sizeof(buf)) { gpsd_log(&context->errout, LOG_ERROR, "internal buffer too small\n"); return -1; } bzero(buf, (int)sizeof(buf)); (void)strlcpy(buf, data, length); gpsd_log(&context->errout, LOG_RAW + 2, "Decoded string: %s\n", buf); if (strchr(buf, '_') != NULL) { /* value is not valid, ignore it */ return -2; } if (strspn(buf, "0123456789") != length) { gpsd_log(&context->errout, 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_log(&context->errout, LOG_WARN, "Value %u out of range <%u, %u>\n", res, min, max); return -1; } } /************************************************************************** * * Entry points begin here * **************************************************************************/ 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_log(&session->context->errout, LOG_PROG, "Garmin Simple Text packet, len %zd: %s\n", session->lexer.outbuflen, (char*)session->lexer.outbuffer); if (session->lexer.outbuflen < 54) { /* trailing CR and LF can be ignored; ('@' + 54x 'DATA' + '\r\n') has length 57 */ gpsd_log(&session->context->errout, LOG_WARN, "Message is too short, rejected.\n"); return ONLINE_SET; } session->lexer.type = GARMINTXT_PACKET; /* only one message, set cycle start */ session->cycle_end_reliable = true; do { unsigned int result; char *buf = (char *)session->lexer.outbuffer + 1; gpsd_log(&session->context->errout, LOG_PROG, "Timestamp: %.12s\n", buf); /* year */ if (0 != gar_int_decode(session->context, buf + 0, 2, 0, 99, &result)) break; session->driver.garmintxt.date.tm_year = (session->context->century + (int)result) - 1900; /* month */ if (0 != gar_int_decode(session->context, buf + 2, 2, 1, 12, &result)) break; session->driver.garmintxt.date.tm_mon = (int)result - 1; /* day */ if (0 != gar_int_decode(session->context, buf + 4, 2, 1, 31, &result)) break; session->driver.garmintxt.date.tm_mday = (int)result; /* hour */ if (0 != gar_int_decode(session->context, buf + 6, 2, 0, 23, &result)) break; session->driver.garmintxt.date.tm_hour = (int)result; /* mday update?? */ /* minute */ if (0 != gar_int_decode(session->context, 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(session->context, buf + 10, 2, 0, 60, &result)) break; session->driver.garmintxt.date.tm_sec = (int)result; session->driver.garmintxt.subseconds = 0; session->newdata.time = (timestamp_t)mkgmtime(&session->driver.garmintxt.date) + session->driver.garmintxt.subseconds; mask |= TIME_SET; } 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_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(session->context, (char *)session->lexer.outbuffer + 13, 3, "NS", 1.0, &lat)) break; /* decode minutes of Latitude */ if (0 != gar_int_decode(session->context, (char *)session->lexer.outbuffer + 16, 5, 0, 99999, °frag)) break; lat += degfrag * 100.0 / 60.0 / 100000.0; session->newdata.latitude = lat; /* Longitude, [EW]dddmmmmm */ /* decode degrees of Longitude */ if (0 != gar_decode(session->context, (char *)session->lexer.outbuffer + 21, 4, "EW", 1.0, &lon)) break; /* decode minutes of Longitude */ if (0 != gar_int_decode(session->context, (char *)session->lexer.outbuffer + 25, 5, 0, 99999, °frag)) break; lon += degfrag * 100.0 / 60.0 / 100000.0; session->newdata.longitude = lon; /* fix mode, GPS status, [gGdDS_] */ status = (char)session->lexer.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; } while (0); /* EPH */ do { double eph; if (0 != gar_decode(session->context, (char *)session->lexer.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; } while (0); /* Altitude */ do { double alt; if (0 != gar_decode(session->context, (char *)session->lexer.outbuffer + 34, 6, "+-", 1.0, &alt)) break; session->newdata.altitude = alt; mask |= ALTITUDE_SET; } while (0); /* Velocity */ do { double ewvel, nsvel, speed, track; if (0 != gar_decode(session->context, (char *)session->lexer.outbuffer + 40, 5, "EW", 10.0, &ewvel)) break; if (0 != gar_decode(session->context, (char *)session->lexer.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; } while (0); /* Climb (vertical velocity) */ do { double climb; if (0 != gar_decode(session->context, (char *)session->lexer.outbuffer + 50, 5, "UD", 100.0, &climb)) break; session->newdata.climb = climb; /* climb in mps */ mask |= CLIMB_SET; } while (0); gpsd_log(&session->context->errout, 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\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); return mask; } #endif /* GARMINTXT_ENABLE */ gpsd-3.15/driver_geostar.c0000664000175000017500000004441612506317026013743 0ustar esresr/* * This is the gpsd driver for GeoStar Navigation receivers * operating in binary mode. * * Tested with GeoS-1M GPS/GLONASS receiver. * * By Viktar Palstsiuk, viktar.palstsiuk@promwad.com * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include /* for select() */ #include #include #include #include #include "gpsd.h" #include "bits.h" #include "strfuncs.h" #include #ifdef GEOSTAR_ENABLE #define GEOSTAR_CHANNELS 24 #define JAN_2008 0x47798280 /* 1199145600 = 2008 - 1970 in seconds */ #define OFFSET(n) ((n)*4+4) static int decode_channel_id (uint32_t ch_id) { int num = 0; num = (int)(ch_id & 0x1F); /* SV ID */ if((ch_id & (1<<30)) == 0) num += GLONASS_PRN_OFFSET; /* GLONASS SV */ else if (num == 0 ) num = 32; /* GPS SV */ return num; } static int geostar_write(struct gps_device_t *session, unsigned int id, unsigned char *data, size_t len) { int i; unsigned long cs = 0; putbyte(session->msgbuf, 0, 'P'); putbyte(session->msgbuf, 1, 'S'); putbyte(session->msgbuf, 2, 'G'); putbyte(session->msgbuf, 3, 'G'); putbe16(session->msgbuf, 4, id); putbe16(session->msgbuf, 6, len); /* Copy content */ memcpy(session->msgbuf + 8, data, len * 4); len += 2; /* PSGG + id + len */ /* Calculate checksum */ for (i = 0; (size_t)i < len; i++) { cs ^= getleu32(session->msgbuf, i * 4); } putle32(session->msgbuf, len * 4, cs); len += 1; /* Checksum */ session->msgbuflen = len * 4; gpsd_log(&session->context->errout, LOG_PROG, "Sent GeoStar packet id 0x%x\n", id); if (gpsd_write(session, session->msgbuf, session->msgbuflen) != (ssize_t) session->msgbuflen) return -1; return 0; } /* geostar_detect() * * see if it looks like a GeoStar device is listening and * return 1 if found, 0 if not */ static bool geostar_detect(struct gps_device_t *session) { unsigned char buf[1 * 4]; bool ret = false; int myfd; fd_set fdset; struct timeval to; myfd = session->gpsdata.gps_fd; /* request firmware revision and look for a valid response */ putbe32(buf, 0, 0); if (geostar_write(session, 0xc1, buf, 1) == 0) { unsigned int n; for (n = 0; n < 3; n++) { FD_ZERO(&fdset); FD_SET(myfd, &fdset); to.tv_sec = 1; to.tv_usec = 0; if (select(myfd + 1, &fdset, NULL, NULL, &to) != 1) break; if (generic_get(session) >= 0) { if (session->lexer.type == GEOSTAR_PACKET) { gpsd_log(&session->context->errout, LOG_RAW, "geostar_detect found\n"); ret = true; break; } } } } return ret; } static gps_mask_t geostar_analyze(struct gps_device_t *session) { int i, len; gps_mask_t mask = 0; unsigned int id; uint16_t uw1, uw2; uint32_t ul1, ul2, ul3, ul4, ul5; double d1, d2, d3, d4, d5; char buf[BUFSIZ]; char buf2[BUFSIZ]; if (session->lexer.type != GEOSTAR_PACKET) { gpsd_log(&session->context->errout, LOG_INF, "geostar_analyze packet type %d\n", session->lexer.type); return 0; } if (session->lexer.outbuflen < 12 || session->lexer.outbuffer[0] != 'P') return 0; /* put data part of message in buf */ memset(buf, 0, sizeof(buf)); /* cppcheck-suppress redundantCopy */ memcpy(buf, session->lexer.outbuffer, session->lexer.outbuflen); buf2[len = 0] = '\0'; for (i = 0; i < (int)session->lexer.outbuflen; i++) { str_appendf(buf2, sizeof(buf2), "%02x", buf[len++] = session->lexer.outbuffer[i]); } id = (unsigned int)getleu16(session->lexer.outbuffer, OFFSET(0)); gpsd_log(&session->context->errout, LOG_DATA, "GeoStar packet id 0x%02x length %d: %s\n", id, len, buf2); session->cycle_end_reliable = true; switch (id) { case 0x10: gpsd_log(&session->context->errout, LOG_INF, "Raw measurements\n"); break; case 0x11: gpsd_log(&session->context->errout, LOG_INF, "GPS sub-frame data\n"); break; case 0x12: gpsd_log(&session->context->errout, LOG_INF, "GLONASS sub-frame data\n"); break; case 0x13: d1 = getled64(buf, OFFSET(1)); d2 = getled64(buf, OFFSET(3)); d3 = getled64(buf, OFFSET(5)); d4 = getled64(buf, OFFSET(29)); /* GPS time */ d5 = getled64(buf, OFFSET(31)); /* GLONASS time */ gpsd_log(&session->context->errout, LOG_INF, "ECEF coordinates %g %g %g %f %f\n", d1, d2, d3, d4, d5); break; case 0x20: d1 = getled64(buf, OFFSET(1)); /* time */ session->newdata.time = d1 + JAN_2008; session->newdata.latitude = getled64(buf, OFFSET(3)) * RAD_2_DEG; session->newdata.longitude = getled64(buf, OFFSET(5)) * RAD_2_DEG; session->newdata.altitude = getled64(buf, OFFSET(7)); session->gpsdata.separation = getled64(buf, OFFSET(9)); session->gpsdata.satellites_used = (int)getles32(buf, OFFSET(11)); session->gpsdata.dop.gdop = getled64(buf, OFFSET(13)); session->gpsdata.dop.pdop = getled64(buf, OFFSET(15)); session->gpsdata.dop.tdop = getled64(buf, OFFSET(17)); session->gpsdata.dop.hdop = getled64(buf, OFFSET(19)); session->gpsdata.dop.vdop = getled64(buf, OFFSET(21)); session->newdata.speed = getled64(buf, OFFSET(31)); session->newdata.track = getled64(buf, OFFSET(33)) * RAD_2_DEG; ul1 = getleu32(buf, OFFSET(29)); /* status */ if (ul1 != 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; } } mask |= TIME_SET | PPSTIME_IS | LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | DOP_SET | USED_IS | REPORT_IS; gpsd_log(&session->context->errout, LOG_INF, "Geographic coordinates %f %g %g %g %g %g\n", d1, session->newdata.latitude, session->newdata.longitude, session->newdata.altitude, session->newdata.speed, session->newdata.track); gpsd_log(&session->context->errout, LOG_INF, "Dilution of precision %g %g %g %g %g\n", session->gpsdata.dop.gdop, session->gpsdata.dop.pdop, session->gpsdata.dop.tdop, session->gpsdata.dop.hdop, session->gpsdata.dop.vdop); break; case 0x21: ul1 = getleu32(buf, OFFSET(1)); ul2 = getleu32(buf, OFFSET(2)); uw1 = getleu16(buf, OFFSET(3)); uw2 = getleu16(buf, OFFSET(3) + 2); gpsd_log(&session->context->errout, LOG_INF, "Current receiver telemetry %x %d %d %d\n", ul1, ul2, uw1, uw2); if(ul1 & (1<<3)) { session->newdata.mode = MODE_2D; } else { session->newdata.mode = MODE_3D; } if(ul1 & (1<<2)) { session->gpsdata.status = STATUS_FIX; } else { session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; } mask |= MODE_SET | STATUS_SET; break; case 0x22: ul1 = getleu32(buf, OFFSET(1)); gpsd_log(&session->context->errout, LOG_INF, "SVs in view %d\n", ul1); session->gpsdata.satellites_visible = (int)ul1; if(ul1 > GEOSTAR_CHANNELS) ul1 = GEOSTAR_CHANNELS; for(i = 0; (uint32_t)i < ul1; i++) { int16_t s1, s2, s3; ul2 = getleu32(buf, OFFSET(2) + i * 3 * 4); s1 = getles16(buf, OFFSET(3) + i * 3 * 4); s2 = getles16(buf, OFFSET(3) + 2 + i * 3 * 4); s3 = getles16(buf, OFFSET(4) + 2 + i * 3 * 4); gpsd_log(&session->context->errout, LOG_INF, "ID %d Az %g El %g SNR %g\n", decode_channel_id(ul2), s1*0.001*RAD_2_DEG, s2*0.001*RAD_2_DEG, s3*0.1); session->gpsdata.skyview[i].PRN = (short)decode_channel_id(ul2); session->gpsdata.skyview[i].azimuth = (short)round((double)s1*0.001 * RAD_2_DEG); session->gpsdata.skyview[i].elevation = (short)round((double)s2*0.001 * RAD_2_DEG); session->gpsdata.skyview[i].ss = (double)s3*0.1; session->gpsdata.skyview[i].used = (bool)(ul2 & (1<<27)); } session->gpsdata.skyview_time = NAN; mask |= SATELLITE_SET | USED_IS; break; case 0x3e: ul1 = getleu32(buf, OFFSET(1)); ul2 = getleu32(buf, OFFSET(2)); ul3 = getleu32(buf, OFFSET(3)); gpsd_log(&session->context->errout, LOG_INF, "Receiver power-up message %d %d %d\n", ul1, ul2, ul3); break; case 0x3f: ul1 = getleu32(buf, OFFSET(1)); ul2 = getleu32(buf, OFFSET(2)); gpsd_log(&session->context->errout, LOG_WARN, "Negative acknowledge %x %d\n", ul1, ul2); break; case 0x40: gpsd_log(&session->context->errout, LOG_INF, "Response to Set initial parameters\n"); break; case 0x41: gpsd_log(&session->context->errout, LOG_INF, "Response to Set serial ports parameters\n"); break; case 0x42: ul1 = getleu32(buf, OFFSET(1)); ul2 = getleu32(buf, OFFSET(2)); ul3 = getleu32(buf, OFFSET(3)); gpsd_log(&session->context->errout, LOG_INF, "Response to Set receiver operation mode %d %d %d\n", ul1, ul2, ul3); break; case 0x43: gpsd_log(&session->context->errout, LOG_INF, "Response to Set navigation task solution parameters\n"); break; case 0x44: gpsd_log(&session->context->errout, LOG_INF, "Response to Set output data rate\n"); break; case 0x46: gpsd_log(&session->context->errout, LOG_INF, "Response to Assign data protocol to communication port\n"); break; case 0x48: gpsd_log(&session->context->errout, LOG_INF, "Response to Set GPS almanac\n"); break; case 0x49: gpsd_log(&session->context->errout, LOG_INF, "Response to Set GLONASS almanac\n"); break; case 0x4a: gpsd_log(&session->context->errout, LOG_INF, "Response to Set GPS ephemeris\n"); break; case 0x4b: gpsd_log(&session->context->errout, LOG_INF, "Response to Set GLONASS ephemeris\n"); break; case 0x4c: ul1 = getleu32(buf, OFFSET(1)); ul2 = getleu32(buf, OFFSET(2)); ul3 = getleu32(buf, OFFSET(3)); ul4 = getleu32(buf, OFFSET(4)); ul5 = getleu32(buf, OFFSET(5)); gpsd_log(&session->context->errout, LOG_INF, "Response to Set PPS parameters %d %d %d %d %d\n", ul1, ul2, ul3, ul4, ul5); break; case 0x4d: gpsd_log(&session->context->errout, LOG_INF, "Response to Enable/disable SV in position fix\n"); break; case 0x4e: gpsd_log(&session->context->errout, LOG_INF, "Response to Enable/disable NMEA messages\n"); break; case 0x4f: ul1 = getleu32(buf, OFFSET(1)); ul2 = getleu32(buf, OFFSET(2)); gpsd_log(&session->context->errout, LOG_INF, "Response to Enable/disable binary messages %x %x\n", ul1, ul2); break; case 0x80: gpsd_log(&session->context->errout, LOG_INF, "Response to Query initial parameters\n"); break; case 0x81: gpsd_log(&session->context->errout, LOG_INF, "Response to Query serial ports parameters\n"); break; case 0x82: ul1 = getleu32(buf, OFFSET(1)); ul2 = getleu32(buf, OFFSET(2)); ul3 = getleu32(buf, OFFSET(3)); gpsd_log(&session->context->errout, LOG_INF, "Response to Query receiver operation mode %d %d %d\n", ul1, ul2, ul3); break; case 0x83: gpsd_log(&session->context->errout, LOG_INF, "Response to Query navigation task solution parameters\n"); break; case 0x84: gpsd_log(&session->context->errout, LOG_INF, "Response to Query output data rate\n"); break; case 0x86: session->driver.geostar.physical_port = (unsigned int)getleu32(buf, OFFSET(1)); gpsd_log(&session->context->errout, LOG_INF, "Response to Query data protocol assignment to communication port\n"); gpsd_log(&session->context->errout, LOG_INF, "Connected to physical port %d\n", session->driver.geostar.physical_port); break; case 0x88: gpsd_log(&session->context->errout, LOG_INF, "Response to Query GPS almanac\n"); break; case 0x89: gpsd_log(&session->context->errout, LOG_INF, "Response to Query GLONASS almanac\n"); break; case 0x8a: gpsd_log(&session->context->errout, LOG_INF, "Response to Query GPS ephemerides\n"); break; case 0x8b: d1 = getled64(buf, OFFSET(23)); d2 = getled64(buf, OFFSET(25)); d3 = getled64(buf, OFFSET(27)); gpsd_log(&session->context->errout, LOG_INF, "Response to Query GLONASS ephemerides %g %g %g\n", d1, d2, d3); break; case 0x8c: ul1 = getleu32(buf, OFFSET(1)); ul2 = getleu32(buf, OFFSET(2)); ul3 = getleu32(buf, OFFSET(3)); ul4 = getleu32(buf, OFFSET(4)); ul5 = getleu32(buf, OFFSET(5)); gpsd_log(&session->context->errout, LOG_INF, "Response to Query PPS parameters %d %d %d %d %d\n", ul1, ul2, ul3, ul4, ul5); break; case 0x8d: gpsd_log(&session->context->errout, LOG_INF, "Response to Query enable/disable status of the SV in position fix\n"); break; case 0x8e: gpsd_log(&session->context->errout, LOG_INF, "Response to Query enable NMEA messages\n"); break; case 0x8f: ul1 = getleu32(buf, OFFSET(1)); ul2 = getleu32(buf, OFFSET(2)); gpsd_log(&session->context->errout, LOG_INF, "Response to Query enable binary messages %x %x\n", ul1, ul2); break; case 0xc0: gpsd_log(&session->context->errout, LOG_INF, "Response to Change operation mode command\n"); break; case 0xc1: ul4 = getleu32(buf, OFFSET(1)); ul1 = getleu32(buf, OFFSET(2)); ul2 = getleu32(buf, OFFSET(3)); ul3 = getleu32(buf, OFFSET(4)); (void)snprintf(session->subtype, sizeof(session->subtype), "%d.%d %d.%d.%d %x %c-%d\n", ul4>>16, ul4&0xFFFF, ul1>>9, (ul1>>5)&0xF, ul1&0x1F, ul2, ul3>>24, ul3&0x00FFFFFF); gpsd_log(&session->context->errout, LOG_INF, "Response to Request FW version command: %s\n", session->subtype); mask |= DEVICEID_SET; break; case 0xc2: gpsd_log(&session->context->errout, LOG_INF, "Response to Restart receiver command\n"); break; case 0xc3: gpsd_log(&session->context->errout, LOG_INF, "Response to Store parameters to Flash command\n"); break; case 0xd0: gpsd_log(&session->context->errout, LOG_INF, "Response to Erase Flash sector command\n"); break; case 0xd1: gpsd_log(&session->context->errout, LOG_INF, "Response to Write data to Flash command\n"); break; case 0xd2: gpsd_log(&session->context->errout, LOG_INF, "Response to Store Serial Number command\n"); break; default: gpsd_log(&session->context->errout, LOG_WARN, "Unhandled GeoStar packet type 0x%02x\n", id); break; } return mask; } static gps_mask_t geostar_parse_input(struct gps_device_t *session) { if (session->lexer.type == GEOSTAR_PACKET) { return geostar_analyze(session);; } else return 0; } #ifdef CONTROLSEND_ENABLE static ssize_t geostar_control_send(struct gps_device_t *session, char *buf, size_t buflen) /* not used by the daemon, it's for gpsctl and friends */ { return (ssize_t) geostar_write(session, (unsigned int)buf[0], (unsigned char *)buf + 1, (buflen - 1)/4); } #endif /* CONTROLSEND_ENABLE */ static void geostar_init_query(struct gps_device_t *session) { unsigned char buf[2 * 4]; /* Poll Software Version */ (void)geostar_write(session, 0xc1, buf, 1); } static void geostar_event_hook(struct gps_device_t *session, event_t event) { unsigned char buf[2 * 4]; if (session->context->readonly) return; if (event == event_identified || event == event_reactivate) { /* Select binary packets */ putbe32(buf, 0, 0xffff0000); putbe32(buf, 4, 0); (void)geostar_write(session, 0x4f, buf, 2); /* Poll Ports params */ putbe32(buf, 0, 1); (void)geostar_write(session, 0x81, buf, 1); putbe32(buf, 0, 0); (void)geostar_write(session, 0x81, buf, 1); /* Poll Init params */ (void)geostar_write(session, 0x80, buf, 1); /* Poll Mode */ (void)geostar_write(session, 0x82, buf, 1); /* Poll Solution params */ (void)geostar_write(session, 0x83, buf, 1); /* Poll Output rate */ (void)geostar_write(session, 0x84, buf, 1); /* Poll Protocols assignment */ (void)geostar_write(session, 0x86, buf, 1); /* Poll PPS params */ (void)geostar_write(session, 0x8c, buf, 1); /* Poll NMEA packets selected */ (void)geostar_write(session, 0x8e, buf, 1); /* Poll binary packets selected */ (void)geostar_write(session, 0x8f, buf, 1); } if (event == event_deactivate) { /* Perform cold restart */ putbe32(buf, 0, 3); (void)geostar_write(session, 0xc2, buf, 1); } } #ifdef RECONFIGURE_ENABLE static bool geostar_speed_switch(struct gps_device_t *session, speed_t speed, char parity, int stopbits) { unsigned char buf[4 * 4]; switch (parity) { case 'E': case 2: parity = (char)2; break; case 'O': case 1: parity = (char)1; break; case 'N': case 0: default: parity = (char)0; break; } putbe32(buf, 0, session->driver.geostar.physical_port); putbe32(buf, 4, speed); putbe32(buf, 8, stopbits); putbe32(buf, 12, parity); (void)geostar_write(session, 0x41, buf, 4); return true; /* it would be nice to error-check this */ } static void geostar_mode(struct gps_device_t *session, int mode) { if (mode == MODE_NMEA) { unsigned char buf[1 * 4]; /* Switch to NMEA mode */ putbe32(buf, 0, 1); (void)geostar_write(session, 0x46, buf, 1); } else if (mode == MODE_BINARY) { /* Switch to binary mode */ (void)nmea_send(session, "$GPSGG,SWPROT"); } else { gpsd_log(&session->context->errout, LOG_ERROR, "unknown mode %i requested\n", mode); } } #endif /* RECONFIGURE_ENABLE */ #ifdef TIMEHINT_ENABLE static double geostar_time_offset(struct gps_device_t *session UNUSED) { return 0.31; } #endif /* TIMEHINT_ENABLE */ /* this is everything we export */ /* *INDENT-OFF* */ const struct gps_type_t driver_geostar = { .type_name = "GeoStar", /* full name of type */ .packet_type = GEOSTAR_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* no trigger */ .channels = GEOSTAR_CHANNELS, /* consumer-grade GPS/GLONASS */ .probe_detect = geostar_detect, /* probe for device */ .get_packet = generic_get, /* use the generic packet getter */ .parse_packet = geostar_parse_input, /* parse message packets */ .rtcm_writer = NULL, /* doesn't accept DGPS corrections */ .init_query = geostar_init_query, /* non-perturbing initial query */ .event_hook = geostar_event_hook, /* fire on various lifetime events */ #ifdef RECONFIGURE_ENABLE .speed_switcher = geostar_speed_switch,/* change baud rate */ .mode_switcher = geostar_mode, /* there is a mode switcher */ .rate_switcher = NULL, /* no rate switcher */ .min_cycle = 1, /* not relevant, no rate switcher */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = geostar_control_send,/* how to send commands */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = geostar_time_offset, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* GEOSTAR_ENABLE */ gpsd-3.15/driver_italk.c0000664000175000017500000003425712506327023013403 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * * Driver for the iTalk binary protocol used by FasTrax * * Week counters are not limited to 10 bits. It's unknown what * the firmware is doing to disambiguate them, if anything; it might just * be adding a fixed offset based on a hidden epoch value, in which case * unhappy things will occur on the next rollover. */ #include #include #include #include #include #include "gpsd.h" #if defined(ITRAX_ENABLE) && defined(BINARY_ENABLE) #include "bits.h" #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) { unsigned short flags, pflags; gps_mask_t mask = 0; double epx, epy, epz, evx, evy, evz, eph; if (len != 296) { gpsd_log(&session->context->errout, LOG_PROG, "ITALK: bad NAV_FIX (len %zu, should be 296)\n", len); return -1; } flags = (unsigned short) getleu16(buf, 7 + 4); //cflags = (unsigned short) getleu16(buf, 7 + 6); pflags = (unsigned short) getleu16(buf, 7 + 8); session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; mask = ONLINE_SET | MODE_SET | STATUS_SET | CLEAR_IS; /* just bail out if this fix is not marked valid */ if (0 != (pflags & FIX_FLAG_MASK_INVALID) || 0 == (flags & FIXINFO_FLAG_VALID)) return mask; session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short) getles16(buf, 7 + 82), (unsigned int)getleu32(buf, 7 + 84) / 1000.0); mask |= TIME_SET | PPSTIME_IS; epx = (double)(getles32(buf, 7 + 96) / 100.0); epy = (double)(getles32(buf, 7 + 100) / 100.0); epz = (double)(getles32(buf, 7 + 104) / 100.0); evx = (double)(getles32(buf, 7 + 186) / 1000.0); evy = (double)(getles32(buf, 7 + 190) / 1000.0); evz = (double)(getles32(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)(getles32(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)(getles32(buf, 7 + 254) / 100.0); #define MAX(a,b) (((a) > (b)) ? (a) : (b)) session->gpsdata.satellites_used = (int)MAX(getleu16(buf, 7 + 12), getleu16(buf, 7 + 14)); mask |= USED_IS; if (flags & FIX_CONV_DOP_VALID) { session->gpsdata.dop.hdop = (double)(getleu16(buf, 7 + 56) / 100.0); session->gpsdata.dop.gdop = (double)(getleu16(buf, 7 + 58) / 100.0); session->gpsdata.dop.pdop = (double)(getleu16(buf, 7 + 60) / 100.0); session->gpsdata.dop.vdop = (double)(getleu16(buf, 7 + 62) / 100.0); session->gpsdata.dop.tdop = (double)(getleu16(buf, 7 + 64) / 100.0); mask |= DOP_SET; } if ((pflags & FIX_FLAG_MASK_INVALID) == 0 && (flags & FIXINFO_FLAG_VALID) != 0) { if (pflags & FIX_FLAG_3DFIX) session->newdata.mode = MODE_3D; else session->newdata.mode = MODE_2D; if (pflags & FIX_FLAG_DGPS_CORRECTION) session->gpsdata.status = STATUS_DGPS_FIX; else session->gpsdata.status = STATUS_FIX; } gpsd_log(&session->context->errout, 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\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); return mask; } static gps_mask_t decode_itk_prnstatus(struct gps_device_t *session, unsigned char *buf, size_t len) { gps_mask_t mask; if (len < 62) { gpsd_log(&session->context->errout, LOG_PROG, "ITALK: runt PRN_STATUS (len=%zu)\n", len); mask = 0; } else { unsigned int i, nsv, nchan, st; session->gpsdata.skyview_time = gpsd_gpstime_resolve(session, (unsigned short)getleu16(buf, 7 + 4), (unsigned int)getleu32(buf, 7 + 6) / 1000.0), gpsd_zero_satellites(&session->gpsdata); nchan = (unsigned int)getleu16(buf, 7 + 50); if (nchan > MAX_NR_VISIBLE_PRNS) nchan = MAX_NR_VISIBLE_PRNS; for (i = st = nsv = 0; i < nchan; i++) { unsigned int off = 7 + 52 + 10 * i; unsigned short flags; bool used; flags = (unsigned short) getleu16(buf, off); used = (bool)(flags & PRN_FLAG_USE_IN_NAV); session->gpsdata.skyview[st].ss = (float)(getleu16(buf, off + 2) & 0xff); session->gpsdata.skyview[st].PRN = (short)(getleu16(buf, off + 4) & 0xff); session->gpsdata.skyview[st].elevation = (short)(getles16(buf, off + 6) & 0xff); session->gpsdata.skyview[st].azimuth = (short)(getles16(buf, off + 8) & 0xff); session->gpsdata.skyview[st].used = used; if (session->gpsdata.skyview[st].PRN > 0) { st++; if (used) nsv++; } } session->gpsdata.satellites_visible = (int)st; session->gpsdata.satellites_used = (int)nsv; mask = USED_IS | SATELLITE_SET;; gpsd_log(&session->context->errout, LOG_DATA, "PRN_STATUS: time=%.2f visible=%d used=%d mask={USED|SATELLITE}\n", session->newdata.time, session->gpsdata.satellites_visible, session->gpsdata.satellites_used); } return mask; } static gps_mask_t decode_itk_utcionomodel(struct gps_device_t *session, unsigned char *buf, size_t len) { int leap; unsigned short flags; if (len != 64) { gpsd_log(&session->context->errout, LOG_PROG, "ITALK: bad UTC_IONO_MODEL (len %zu, should be 64)\n", len); return 0; } flags = (unsigned short) getleu16(buf, 7); if (0 == (flags & UTC_IONO_MODEL_UTCVALID)) return 0; leap = (int)getleu16(buf, 7 + 24); if (session->context->leap_seconds < leap) session->context->leap_seconds = leap; session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short) getleu16(buf, 7 + 36), (unsigned int)getleu32(buf, 7 + 38) / 1000.0); gpsd_log(&session->context->errout, LOG_DATA, "UTC_IONO_MODEL: time=%.2f mask={TIME}\n", session->newdata.time); return TIME_SET | PPSTIME_IS; } 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 i; uint32_t words[10]; if (len != 64) { gpsd_log(&session->context->errout, LOG_PROG, "ITALK: bad SUBFRAME (len %zu, should be 64)\n", len); return 0; } flags = (unsigned short) getleu16(buf, 7 + 4); prn = (unsigned short) getleu16(buf, 7 + 6); sf = (unsigned short) getleu16(buf, 7 + 8); gpsd_log(&session->context->errout, LOG_PROG, "iTalk 50B 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 0; // don't try decode an erroneous packet /* * Timo says "SUBRAME message contains decoded navigation message subframe * words with parity checking done but parity bits still present." */ for (i = 0; i < 10; i++) words[i] = (uint32_t)(getleu32(buf, 7 + 14 + 4 * i) >> 6) & 0xffffff; return gpsd_interpret_subframe(session, prn, words); } static gps_mask_t decode_itk_pseudo(struct gps_device_t *session, unsigned char *buf, size_t len) { unsigned short flags, n, i; n = (unsigned short) getleu16(buf, 7 + 4); if ((n < 1) || (n > MAXCHANNELS)){ gpsd_log(&session->context->errout, LOG_INF, "ITALK: bad PSEUDO channel count\n"); return 0; } if (len != (size_t)((n+1)*36)) { gpsd_log(&session->context->errout, LOG_PROG, "ITALK: bad PSEUDO len %zu\n", len); } gpsd_log(&session->context->errout, LOG_PROG, "iTalk PSEUDO [%u]\n", n); flags = (unsigned short)getleu16(buf, 7 + 6); if ((flags & 0x3) != 0x3) return 0; // bail if measurement time not valid. session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short int)getleu16((char *)buf, 7 + 8), (unsigned int)getleu32(buf, 7 + 38) / 1000.0); for (i = 0; i < n; i++){ session->gpsdata.skyview[i].PRN = getleu16(buf, 7 + 26 + (i*36)) & 0xff; session->gpsdata.skyview[i].ss = getleu16(buf, 7 + 26 + (i*36 + 2)) & 0x3f; session->gpsdata.raw.satstat[i] = getleu32(buf, 7 + 26 + (i*36 + 4)); session->gpsdata.raw.pseudorange[i] = getled64((char *)buf, 7 + 26 + (i*36 + 8)); session->gpsdata.raw.doppler[i] = getled64((char *)buf, 7 + 26 + (i*36 + 16)); session->gpsdata.raw.carrierphase[i] = getleu16(buf, 7 + 26 + (i*36 + 28)); session->gpsdata.raw.mtime[i] = session->newdata.time; session->gpsdata.raw.codephase[i] = NAN; session->gpsdata.raw.deltarange[i] = NAN; } return RAW_IS; } 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; if (len == 0) return 0; type = (uint) getub(buf, 4); /* we may need to dump the raw packet */ gpsd_log(&session->context->errout, LOG_RAW, "raw italk packet type 0x%02x\n", type); session->cycle_end_reliable = true; switch (type) { case ITALK_NAV_FIX: gpsd_log(&session->context->errout, LOG_DATA, "iTalk NAV_FIX len %zu\n", len); mask = decode_itk_navfix(session, buf, len) | (CLEAR_IS | REPORT_IS); break; case ITALK_PRN_STATUS: gpsd_log(&session->context->errout, LOG_DATA, "iTalk PRN_STATUS len %zu\n", len); mask = decode_itk_prnstatus(session, buf, len); break; case ITALK_UTC_IONO_MODEL: gpsd_log(&session->context->errout, LOG_DATA, "iTalk UTC_IONO_MODEL len %zu\n", len); mask = decode_itk_utcionomodel(session, buf, len); break; case ITALK_ACQ_DATA: gpsd_log(&session->context->errout, LOG_DATA, "iTalk ACQ_DATA len %zu\n", len); break; case ITALK_TRACK: gpsd_log(&session->context->errout, LOG_DATA, "iTalk TRACK len %zu\n", len); break; case ITALK_PSEUDO: gpsd_log(&session->context->errout, LOG_DATA, "iTalk PSEUDO len %zu\n", len); mask = decode_itk_pseudo(session, buf, len); break; case ITALK_RAW_ALMANAC: gpsd_log(&session->context->errout, LOG_DATA, "iTalk RAW_ALMANAC len %zu\n", len); break; case ITALK_RAW_EPHEMERIS: gpsd_log(&session->context->errout, LOG_DATA, "iTalk RAW_EPHEMERIS len %zu\n", len); break; case ITALK_SUBFRAME: mask = decode_itk_subframe(session, buf, len); break; case ITALK_BIT_STREAM: gpsd_log(&session->context->errout, LOG_DATA, "iTalk BIT_STREAM len %zu\n", len); break; case ITALK_AGC: case ITALK_SV_HEALTH: case ITALK_PRN_PRED: case ITALK_FREQ_PRED: case ITALK_DBGTRACE: case ITALK_START: case ITALK_STOP: case ITALK_SLEEP: case ITALK_STATUS: case ITALK_ITALK_CONF: case ITALK_SYSINFO: case ITALK_ITALK_TASK_ROUTE: case ITALK_PARAM_CTRL: case ITALK_PARAMS_CHANGED: case ITALK_START_COMPLETED: case ITALK_STOP_COMPLETED: case ITALK_LOG_CMD: case ITALK_SYSTEM_START: case ITALK_STOP_SEARCH: case ITALK_SEARCH: case ITALK_PRED_SEARCH: case ITALK_SEARCH_DONE: case ITALK_TRACK_DROP: case ITALK_TRACK_STATUS: case ITALK_HANDOVER_DATA: case ITALK_CORE_SYNC: case ITALK_WAAS_RAWDATA: case ITALK_ASSISTANCE: case ITALK_PULL_FIX: case ITALK_MEMCTRL: case ITALK_STOP_TASK: gpsd_log(&session->context->errout, LOG_DATA, "iTalk not processing packet: id 0x%02x length %zu\n", type, len); break; default: gpsd_log(&session->context->errout, LOG_DATA, "iTalk unknown packet: id 0x%02x length %zu\n", type, len); } return mask | ONLINE_SET; } static gps_mask_t italk_parse_input(struct gps_device_t *session) { if (session->lexer.type == ITALK_PACKET) { return italk_parse(session, session->lexer.outbuffer, session->lexer.outbuflen);; #ifdef NMEA_ENABLE } else if (session->lexer.type == NMEA_PACKET) { return nmea_parse((char *)session->lexer.outbuffer, session); #endif /* NMEA_ENABLE */ } else return 0; } #ifdef __UNUSED__ static void italk_ping(struct gps_device_t *session) /* send a "ping". it may help us detect an itrax more quickly */ { char *ping = ""; (void)gpsd_write(session, ping, 3); } #endif /* __UNUSED__ */ /* *INDENT-OFF* */ const struct gps_type_t driver_italk = { .type_name = "iTalk", /* full name of type */ .packet_type = ITALK_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* no rollover or other flags */ .trigger = NULL, /* recognize the type */ .channels = 12, /* consumer-grade GPS */ .probe_detect = NULL, /* how to detect at startup time */ .get_packet = generic_get, /* use generic packet grabber */ .parse_packet = italk_parse_input,/* parse message packets */ .rtcm_writer = gpsd_write, /* send RTCM data straight */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = NULL, /* no control string sender */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* defined(ITRAX_ENABLE) && defined(BINARY_ENABLE) */ gpsd-3.15/driver_italk.h0000664000175000017500000004263012506317026013404 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _GPSD_ITALK_H_ #define _GPSD_ITALK_H_ /* 0 and 1 are responses to the ping for iTalk and NMEA respectively */ #define PROTO_ITALK 0 #define PROTO_NMEA 1 /* * Assistance from Timo Ylhainen of Fastrax is acknowledged and appreciated. * * iTalk is a messaging system which communicates between tasks, which may * be running on different devices (nodes). For our purposes (receiver * configuration), we will probably be sending to the SYSTEM task. */ #define TASK_MASK 0x1f /* 5 low bits of src/dst fields */ #define NODE_MASK 0xe0 /* 3 high bits of src/dst fields */ #define NODE_UNDEF 0x00 /* Used in message routing */ #define NODE_ITRAX 0x20 /* The receiver */ #define NODE_HOST 0x40 /* Software on your computer */ #define NODE_GPSWB 0x60 /* GPSWorkbench seems to be HOST|ITRAX */ /* FIX-ME: These defines will likely be replaced by an enum * once I map every message to the task that sent it. */ /* System controller on the receiver */ #define TASK_SYSTEM 0 /* Acquisition & Tracking messages (PD) */ #define TASK_TRACK1 2 #define TASK_TRACK2 3 /* Data decoding messages (PD) */ #define TASK_DATA 4 /* Navigation messages are sent by these tasks (PD) */ #define TASK_NAV1 7 #define TASK_NAV2 8 #define TASK_NAV3 9 /* Host controller software (PD) */ #define TASK_HOST 31 #define MAX_NR_VISIBLE_PRNS 16 /* iTalk Message IDs - isuite.fastrax.fi/sdk/331/Protocols/PRO_MsgId.html */ #define ITALK_ACQ_DATA 1 #define ITALK_PRN_STATUS 2 #define ITALK_TRACK 3 #define ITALK_PSEUDO 4 #define ITALK_AGC 6 #define ITALK_NAV_FIX 7 #define ITALK_RAW_ALMANAC 9 #define ITALK_RAW_EPHEMERIS 10 #define ITALK_SV_HEALTH 11 #define ITALK_UTC_IONO_MODEL 12 #define ITALK_PRN_PRED 13 #define ITALK_FREQ_PRED 14 #define ITALK_SUBFRAME 15 #define ITALK_BIT_STREAM 18 #define ITALK_DBGTRACE 19 #define ITALK_START 64 #define ITALK_STOP 65 #define ITALK_SLEEP 66 #define ITALK_STATUS 67 #define ITALK_ITALK_CONF 68 #define ITALK_SYSINFO 69 #define ITALK_ITALK_TASK_ROUTE 70 #define ITALK_PARAM_CTRL 71 #define ITALK_PARAMS_CHANGED 72 #define ITALK_START_COMPLETED 73 #define ITALK_STOP_COMPLETED 74 #define ITALK_LOG_CMD 75 #define ITALK_SYSTEM_START 76 #define ITALK_STOP_SEARCH 79 #define ITALK_SEARCH 80 #define ITALK_PRED_SEARCH 81 #define ITALK_SEARCH_DONE 82 #define ITALK_TRACK_DROP 88 #define ITALK_TRACK_STATUS 90 #define ITALK_HANDOVER_DATA 92 #define ITALK_CORE_SYNC 93 #define ITALK_WAAS_RAWDATA 96 #define ITALK_ASSISTANCE 98 #define ITALK_PULL_FIX 99 #define ITALK_MEMCTRL 112 #define ITALK_STOP_TASK 255 /* NAV_FIX */ #define FIX_CONV_VEL_VALID 0x0002 #define FIX_CONV_ACC_VALID 0x0004 #define FIX_CONV_DOP_VALID 0x0010 #define FIX_CONV_ERR_VALID 0x0020 #define FIX_CONV_UTC_VALID 0x0040 #define FIX_CONV_UND_VALID 0x0080 #define FIX_CONV_MAG_VALID 0x0100 #define FIX_CONV_GRID_VALID 0x0200 #define FIX_CONV_VEL_ESTIMATED 0x0400 #define FIX_FLAG_POS_REJECT_FOM 0x0003 #define FIX_FLAG_POS_REJECT_DOP 0x0004 #define FIX_FLAG_POS_PINNING 0x0020 #define FIX_FLAG_VEL_REJECT_RES 0x0003 #define FIX_FLAG_ACCELERATION 0x4000 #define FIX_FLAG_VEL_RELIABLE 0x0020 #define FIX_FLAG_VEL_RELIABLE_3D 0x0040 #define FIX_FLAG_MASK_INVALID 0x0007 #define FIX_FLAG_REJECT_NUM_SV 0x0001 #define FIX_FLAG_REJECT_POSTRAIM 0x0002 #define FIX_FLAG_REJECT_OTHER 0x0007 #define FIX_FLAG_RELIABLE 0x0008 #define FIX_FLAG_PF_RAIM 0x0010 #define FIX_FLAG_3DFIX 0x0100 #define FIX_FLAG_DGPS_CORRECTION 0x0200 #define FIX_FLAG_TROPO 0x0400 #define FIX_FLAG_IONO 0x0800 #define FIX_FLAG_INS 0x2000 #define FIXINFO_FLAG_VALID 0x0002 #define FIXINFO_FLAG_NEW_FIX 0x0004 #define FIXINFO_FLAG_SKY_FIX 0x0008 #define FIXINFO_FLAG_AID_GPSTIME 0x0010 #define FIXINFO_FLAG_AID_TIMESTAMP 0x0020 #define FIXINFO_FLAG_AID_EPHEMERIS 0x0040 #define FIXINFO_FLAG_AID_ALTITUDE 0x0080 #define FIXINFO_FLAG_KALMAN 0x1000 #define FIXINFO_FLAG_INTERNAL 0x2000 #define FIXINFO_FLAG_FIRSTFIX 0x4000 /* PRN_STATUS */ #define PRN_FLAG_FOUND 0x0001 #define PRN_FLAG_TRACKING 0x0002 #define PRN_FLAG_USE_IN_NAV 0x0004 /* UTC_IONO_MODEL */ #define UTC_IONO_MODEL_UTCVALID 0x0001 #define UTC_IONO_MODEL_IONOVALID 0x0002 /* SUBFRAME */ #define SUBFRAME_WORD_FLAG_MASK 0x03ff #define SUBFRAME_GPS_PREAMBLE_INVERTED 0x0400 /* PSEUDO */ #define PSEUDO_OBS_DOPPLER_OK 0x0001 #define PSEUDO_OBS_PSEUDORANGE_OK 0x0002 #define PSEUDO_OBS_TOW_OK 0x0004 #define PSEUDO_OBS_PRN_OK 0x0008 #define PSEUDO_OBS_ELEV_OK 0x0010 #define PSEUDO_OBS_SNR_OK 0x0020 #define PSEUDO_OBS_SV_HEALTHY 0x0040 #define PSEUDO_OBS_NO_CROSS_CORR 0x0080 #define PSEUDO_OBS_DATA_EXISTS 0x0100 #define PSEUDO_OBS_DATA_GOOD 0x0200 #define PSEUDO_OBS_BIT_LOCK 0x0400 #define PSEUDO_OBS_FIRST_MEAS 0x0800 #define PSEUDO_OBS_RAIM_P_OK 0x1000 #define PSEUDO_OBS_RAIM_V_OK 0x2000 #define PSEUDO_OBS_RAIM_T_OK 0x4000 #define PSEUDO_OBS_PLL 0x8000 #define PSEUDO_OBS_MEAS_OK ( PSEUDO_OBS_ELEV_OK | PSEUDO_OBS_SNR_OK | PSEUDO_OBS_PRN_OK | PSEUDO_OBS_NO_CROSS_CORR | PSEUDO_OBS_SV_HEALTHY | PSEUDO_OBS_DATA_EXISTS | PSEUDO_OBS_DATA_GOOD | PSEUDO_OBS_PSEUDORANGE_OK ) #define PSEUDO_OBS_DOPPLER_MEAS_OK ( PSEUDO_OBS_ELEV_OK | PSEUDO_OBS_SNR_OK | PSEUDO_OBS_PRN_OK | PSEUDO_OBS_NO_CROSS_CORR | PSEUDO_OBS_SV_HEALTHY | PSEUDO_OBS_DATA_EXISTS | PSEUDO_OBS_DATA_GOOD | PSEUDO_OBS_DOPPLER_OK ) #define PSEUDO_TOW_WEEK_OK 0x0001 #define PSEUDO_TOW_OK 0x0002 #define PSEUDO_RESYNCH 0x0004 #define PSEUDO_FIRST_MEAS 0x0008 #define PSEUDO_UNSCHEDULED 0x0010 #define PSEUDO_OBS_CORRECTED_AMBIGUOUS 0x0001 #define PSEUDO_OBS_CORRECTED_BY_SMOOTHING 0x0002 #define PSEUDO_OBS_CORRECTED_BY_IONO 0x0008 #define PSEUDO_OBS_CORRECTED_BY_TROPO 0x0010 #define PSEUDO_OBS_CORRECTED_BY_FAST_CORR 0x0020 #define PSEUDO_OBS_CORRECTED_BY_DGPS 0x0040 #define PSEUDO_OBS_CORRECTED_BY_SLOW_CORR 0x0080 #define PSEUDO_OBS_CORRECTED_BY_WAAS_IONO 0x0100 #define PSEUDO_OBS_CORR_POSSIBLE_XCORR 0x4000 #define PSEUDO_OBS_CORR_FRAME_LOCK 0x8000 #define PSEUDO_OBS_CORRECTED_BY_WAAS ( PSEUDO_OBS_CORRECTED_BY_WAAS_IONO | PSEUDO_OBS_CORRECTED_BY_FAST_CORR) /* MEMCTRL */ #define MEM_WRITE 0x0002 #define MEM_READD 0x0003 #define MEM_BOOT 0x0004 #define MEM_ERASE 0x0006 #define MEM_XTAL_CALIBRATE 0x000a /* BOOT flags based on isuite.fastrax.fi/sdk/331/Protocols/PRO_NMEA.html */ #define MEM_BOOT_NORMAL 0x0000 #define MEM_BOOT_INT_FWLOADER 0x0001 #define MEM_BOOT_DL_FWLOADER 0x0002 #define MEM_BOOT_RELOC_ALTFW 0x0003 /* Config Parameters - isuite.fastrax.fi/sdk/331/System/SYS_Parameters.html */ /* System parameters */ #define SYS_SET_ID 0x0001 #define SYS_FACTORY_SET_ID 0x0002 #define SYS_AUTOSTART 0x0380 #define START_MODE_AUTO 0x0301 #define SYS_LKG_SAVE_TIME_LIMIT 0x0008 #define SYS_LKG_SAVE_DIST_LIMIT 0x0009 #define SYS_LKG_SAVE_STOP_TIME_LIMIT 0x000a #define SYS_WATCHDOG 0x0028 #define SYS_WATCHDOG_TIMEOUT 0x0029 #define SYS_BOOT_ERASE_PARAMS 0x0080 #define SYS_ENABLE_UI_LEDS 0x0081 /* Protocols parameters */ #define SYS_ITALK_PORT 0x0010 #define SYS_ITALK_SPEED 0x0011 #define SYS_ITALK_MASK 0x0012 #define SYS_NMEA_PORT 0x0020 #define SYS_NMEA_SPEED 0x0021 #define SYS_NMEA_MASK 0x0022 #define TRACK_ALT_MSG_ROUTING 0x047f #define OBS_ALT_MSG_ROUTING 0x047e /* Fix Conversion parameters */ #define NAV_DATUM_ID 0x0b08 #define NAV_GRID_ID 0x0b09 #define NAV_GRID_NUMBER 0x0b0a #define NAV_HEAD_VEL_THR 0x0b0b #define NAV_HEAD_VEL_FILTER 0x0b0c #define NAV_HEAD_VEL_THRMAX 0x0b0d #define NAV_HEAD_VEL_THR_PLL 0x0b0e #define NAV_HEAD_VEL_THRMAX_PLL 0x0b0f #define NAV_HOLD_HEADING_IF_NO_FIX 0x0bd0 /* General navigation parameters */ #define NAV_MODE 0x0b01 #define NAV_FIX_INTERVAL 0x0b02 #define NAV_OUTPUT_INTERVAL 0x0b03 #define NAV_FOM_LIMIT 0x0b10 #define NAV_VEL_FOM_LIMIT 0x0b15 #define NAV_HDOP_LIMIT 0x0b11 #define NAV_VDOP_LIMIT 0x0b12 #define NAV_ALT_LIMIT 0x0b13 #define NAV_VEL_LIMIT 0x0b14 #define NAV_EXT_AIDING_ALT 0x0b20 #define NAV_CS_INIT_VAR 0x0b30 #define NAV_CS_PROC_VAR 0x0b31 #define NAV_CS_MEAS_VAR 0x0b32 #define NAV_FILTER_VEL_LOW 0x0b33 #define NAV_FILTER_VEL_HIGH 0x0b34 #define NAV_MAX_LKGAGE 0x0b40 #define NAV_MAX_2D_FIX_SEC 0x0b41 #define NAV_CARRIERSMOOTHING_ENA 0x0b81 #define NAV_OLD_DATA_ENA 0x0b82 #define NAV_SNR_WEIGHTING_ENA 0x0b83 #define NAV_NORMAL_ENV_ENA 0x0b84 #define NAV_IONO_ENA 0x0b85 #define NAV_TROPO_ENA 0x0b87 #define NAV_DGPS_ENA 0x0b88 #define NAV_VEL_FILTER_ENA 0x0b8b #define NAV_ALT_LIMIT_ENA 0x0b8c #define NAV_VEL_LIMIT_ENA 0x0b8d #define NAV_EXT_AIDING_ALT_ENA 0x0b8e #define NAV_FOM_ENA 0x0b8f #define NAV_HDOP_ENA 0x0b90 #define NAV_VDOP_ENA 0x0b91 #define NAV_TENTATIVE_ENA 0x0b96 #define NAV_PULLFIX_ENA 0x0b97 #define NAV_2D_FIX_ENA 0x0ba0 #define NAV_RESERVED_001 0x0ba1 #define NAV_OUTPUT_LAST_POS_IF_NO_FIX 0x0bb0 #define NAV_ESTIMATE_VEL_WITHOUT_PLL 0x0bb1 #define NAV_OUTPUT_LAST_VEL_IF_NO_FIX 0x0bb2 /* Position pinning parameters */ #define NAV_PIN_VEL 0x0b35 #define NAV_PIN_DRIFT_ERR 0x0b36 #define NAV_PIN_XYZ_ERR 0x0b37 #define NAV_PIN_TIMEOUT 0x0b38 #define NAV_PIN_START_DELAY 0x0b39 #define NAV_PINNING_ENA 0x0b8a /* Interval mode parameters */ #define NAV_INTMODE_NBR_FIXES 0x0b22 #define NAV_INTMODE_FIX_INTERVAL 0x0b23 #define NAV_INTMODE_TRY_FIND_SV 0x0b24 #define NAV_INTMODE_TRY_GET_FIX 0x0b25 #define NAV_INTMODE_MAX_STAY_UP 0x0b26 #define NAV_INTMODE_NUM_IGNORED_FIXES 0x0b27 #define NAV_INTERVAL_MODE_ENA 0x0ba2 /* Kalman navigation parameters */ #define KLM_MODE 0x0801 #define KLM_MAX_NUM_STATES 0x0802 #define KLM_START_FLAGS 0x0803 #define KLM_OUTPUT_FLAGS 0x0804 #define KLM_NUM_OBS_LIMIT 0x0805 #define KLM_MEAS_FLAGS 0x0806 #define KLM_COV_LIMIT 0x0807 #define KLM_DOPPLER_NOISE 0x0810 #define KLM_RANGE_NOISE 0x0811 #define KLM_DOPPLER_NOISE_LOW 0x0812 #define KLM_RANGE_NOISE_LOW 0x0813 #define KLM_NOISE_SNR_LOW 0x0814 #define KLM_DOPPLER_NOISE_PLL 0x0815 #define KLM_RANGE_NOISE_PLL 0x0816 #define KLM_CLOCK_OFFSET_NOISE 0x0820 #define KLM_CLOCK_DRIFT_NOISE 0x0821 #define KLM_POS_NOISE 0x0822 #define KLM_POS_NOISE_VERT 0x0823 #define KLM_VEL_NOISE 0x0824 #define KLM_VEL_NOISE_VERT 0x0825 #define KLM_ACC_NOISE 0x0826 #define KLM_ACC_NOISE_VERT 0x0827 #define KLM_ACC_NOISE_PARAM 0x0828 #define KLM_POS_INIT_UNC 0x0830 #define KLM_VEL_INIT_UNC 0x0831 #define KLM_CLOCK_OFFSET_INIT_UNC 0x0832 #define KLM_CLOCK_DRIFT_INIT_UNC 0x0833 #define KLM_RESERVED_001 0x0841 #define KLM_RESERVED_002 0x0842 #define KLM_RESERVED_003 0x0843 #define KLM_RESERVED_004 0x0844 #define KLM_RESERVED_005 0x0845 #define KLM_RESERVED_006 0x0846 #define KLM_RESERVED_007 0x0847 #define KLM_RESERVED_008 0x0848 /* Observation parameters */ #define TRACK_MEAS_INTERVAL 0x0420 #define TRACK_CHANNELS 0x041d #define OBS_ELEV_LIMIT 0x0101 #define OBS_SNR_LIMIT 0x0102 #define OBS_SNR_RAIM_LIMIT 0x0103 #define OBS_CROSS_CORR_SNR_DIFF 0x0120 #define OBS_MAX_SNR 0x0121 #define OBS_PLL_CROSS_CORR_THR 0x0122 #define OBS_FLL_CROSS_CORR_THR 0x0123 #define OBS_FREQ_CROSS_CORR_THR 0x0124 #define OBS_EPOCH_LIMIT 0x0130 #define OBS_ELEV_LIMIT_ENA 0x0181 #define OBS_SNR_LIMIT_ENA 0x0182 #define OBS_SNR_RAIM_ENA 0x0183 #define SAT_ORBIT_FIT_UPDATE 0x0203 #define SAT_FIRST_WEEK 0x0204 #define SAT_NUM_LEAP 0x0205 #define SAT_PRED_MAX_LKGAGE 0x0220 #define SAT_PRED_PHASE_TIMEOUT 0x0221 #define SAT_PRED_LKG_TIMEOUT 0x0222 #define SAT_ORBIT_CHECK 0x0281 /* Unav Tracking parameters */ #define TRACK_DLL_ALPHA 0x0401 #define TRACK_DLL_BETA 0x0402 #define TRACK_DLL_THR_HIGH 0x0403 #define TRACK_DLL_THR_LOW 0x0404 #define TRACK_DLL_POW_NARROW 0x0405 #define TRACK_DLL_POW_WIDE 0x0406 #define TRACK_FLL_RESPONSE_TIME 0x0407 #define TRACK_POW_CALIBRATION 0x0408 #define TRACK_FLL_THR 0x0409 #define TRACK_FLL_POW_NARROW 0x040b #define TRACK_FLL_POW_WIDE 0x040c #define TRACK_PLL_CTH 0x040d #define TRACK_PLL_CDTH 0x040e #define TRACK_PLL_CD2TH 0x040f #define TRACK_RESERVED_000 0x0410 #define TRACK_RESERVED_001 0x0411 #define TRACK_RESERVED_002 0x0412 #define TRACK_RESERVED_003 0x0413 #define TRACK_RESERVED_004 0x0414 #define TRACK_RESERVED_005 0x0415 #define TRACK_RESERVED_006 0x0416 #define TRACK_RESERVED_007 0x0417 #define TRACK_RESERVED_008 0x0418 #define TRACK_RESERVED_009 0x0419 #define TRACK_RESERVED_010 0x0425 #define TRACK_RESERVED_011 0x0426 #define TRACK_RESERVED_012 0x0427 #define TRACK_RESERVED_013 0x0428 #define TRACK_RESERVED_014 0x0429 #define TRACK_RESERVED_016 0x042a #define TRACK_RESERVED_017 0x042b #define TRACK_RESERVED_015 0x0483 #define SUBF_CHECK_FLAGS 0x0432 /* Unav Track task parameters */ #define TRACK_GROUP_1 0x041a #define TRACK_GROUP_2 0x041b #define TRACK_GROUP_2_DELAY 0x041c #define TRACK_CC_DELAY 0x041e #define TRACK_CC_THR 0x041f #define TRACK_PLL_ENA 0x0480 #define TRACK_NAVAID_ENA 0x0482 #define TRACK_SHIFT_REG 0x0421 /* Agc config parameters */ #define TRACK_AGC_LO 0x0422 #define TRACK_AGC_HI 0x0423 #define TRACK_AGC_MAX_HI 0x0424 #define TRACK_AGC_ENA 0x0481 /* PPS parameters */ #define PPS_DUTYCYCLE 0x0440 #define PPS_FREQ 0x0441 #define PPS_DELAY 0x0442 #define PPS_SURVEYLEN 0x0443 #define PPS_MEAS_MS 0x0444 #define PPS_ENA 0x0490 #define PPS_SYNC_TRACK 0x0491 #define PPS_ENA_PRED 0x0492 #define PPS_INVERT 0x0493 /* Frequency plan parameters */ #define FREQ_XTAL 0x0501 #define FREQ_MCLK_NOM 0x0502 #define FREQ_MCLK_DENOM 0x0503 #define FREQ_RF_NOM 0x0504 #define FREQ_RF_DENOM 0x0505 #define FREQ_MIXER_OFFSET 0x0506 #define FREQ_TME2 0x0507 #define FREQ_PARAM_ENA 0x0581 /* Search parameters */ #define SEARCH_XTAL_UNC 0x0701 #define SEARCH_DOPPLER_UNC 0x0702 #define SEARCH_WIN_PRED_EVEN 0x0703 #define SEARCH_WIN_PRED_ODD 0x0704 #define SEARCH_SENS_FULL_R1 0x0705 #define SEARCH_SENS_FULL_R2 0x0706 #define SEARCH_SENS_FULL_R3 0x0707 #define SEARCH_SENS_PRED_EVEN 0x0708 #define SEARCH_SENS_PRED_ODD 0x0709 #define SEARCH_PRED_ROUNDS 0x070a #define SEARCH_BACK_PRNS 0x070b #define SEARCH_GPS_MASK 0x070c #define SEARCH_WAAS_MASK 0x070d #define SEARCH_AUTO_PD_ROUNDS 0x070e #define SEARCH_FLAGS 0x070f #define SEARCH_PREC_PRED_TIMEOUT 0x0710 #define SEARCH_PRED_TIMEOUT 0x0711 #define SEARCH_FERRY_COND 0x0712 #define SEARCH_IFFERRY_PRED_COND 0x0713 #define SEARCH_TUNNEL_IN_SNR 0x0714 #define SEARCH_TUNNEL_OUT_SNR 0x0715 #define SEARCH_PRED_ENA 0x0781 #define SEARCH_BITSYNC_ENA 0x0782 #define SEARCH_AUTO_PRED_ENA 0x0783 #define SEARCH_AUTO_PD_ENA 0x0784 #define SEARCH_SE_PD 0x0785 /* Unav Acquisition parameters */ #define ACQ_SENS_9_COH 0x0901 #define ACQ_SENS_9_NONCOH 0x0902 #define ACQ_SENS_9_THR 0x0903 #define ACQ_SENS_9_BIN 0x0904 #define ACQ_SENS_10_COH 0x0905 #define ACQ_SENS_10_NONCOH 0x0906 #define ACQ_SENS_10_THR 0x0907 #define ACQ_SENS_10_BIN 0x0908 #define ACQ_MSG_ENA 0x0981 #define ACQ_QUICK_SEARCH_ENA 0x0982 #define SE_NONCOH_SHIFT 0x0940 #define SE_IR_SHIFT 0x0941 #define SE_THR 0x0942 #define SE_INT_ENA 0x09a0 /* Logging parameters */ #define LOG_MODE 0x0d01 #define LOG_INTERVAL_MIN 0x0d02 #define LOG_INTERVAL_MAX 0x0d03 #define LOG_MOVE_MIN 0x0d04 #define LOG_MOVE_MAX 0x0d05 #define LOG_VELOCITY_MIN 0x0d06 #define LOG_VELOCITY_MAX 0x0d07 #define LOG_MAXITEMS 0x0d08 #define LOG_STORE_LAT_LONG 0x0d80 #define LOG_STORE_ALT 0x0d81 #define LOG_STORE_ALT_FULL 0x0d82 #define LOG_STORE_GPSTIME 0x0d83 #define LOG_STORE_GPSTIME_MS 0x0d84 #define LOG_STORE_DIRECTION 0x0d85 #define LOG_STORE_VEL 0x0d86 #define LOG_STORE_VEL_VERT 0x0d87 #define LOG_STORE_FIXINFO 0x0d88 /* SBAS parameters */ #define WAAS_TIMEOUT_MODE 0x0b60 #define WAAS_MAX_CHANNELS 0x0b61 #define WAAS_ENA 0x0bc0 #define WAAS_MSG_0_ENA 0x0bc1 #define WAAS_STRICT_ENA 0x0bc2 /* Sony Track parameters */ #define TRACK_DLL_COEFF_GPS 0x0f01 #define TRACK_DLL_COEFF_DISCR 0x0f02 #define TRACK_DLL_LIM_GPS 0x0f03 #define TRACK_DLL4_COEFF_A 0x0f04 #define TRACK_DLL4_COEFF_B 0x0f05 #define TRACK_DLL4_COEFF_C 0x0f06 #define TRACK_DLL4_COEFF_D 0x0f07 #define TRACK_DLL4_FASTADJ_THRES 0x0f08 #define TRACK_ELGATE_NARROW 0x0f09 #define TRACK_COSTASLF_GPS 0x0f0a #define TRACK_COSTASLF_WAAS 0x0f0b #define TRACK_LPF_GPS_ACQ 0x0f0c #define TRACK_LPF_GPS_LOCK 0x0f0d #define TRACK_LPF_WAAS_LOCK 0x0f0e #define TRACK_LPF_NOISE 0x0f0f #define TRACK_SIGDETECT_TH 0x0f10 #define TRACK_SIGDETECT_TH_HS 0x0f11 #define TRACK_TIMEOUT_ACQ 0x0f12 #define TRACK_TIMEOUT_ACQHS 0x0f13 #define TRACK_TIMEOUT_REACQ 0x0f14 #define TRACK_HANDOVER_OFFSET 0x0f15 #define TRACK_CROSSCORR_THRES 0x0f16 #define TRACK_DLLCTRL_INTERVAL 0x0f17 #define TRACK_BITEXTRACT 0x0f18 #define TRACK_RESERVED001 0x0f19 #define TRACK_RESERVED002 0x0f1a #define TRACK_WAAS_PRN_BITSTREAM 0x0f1b #define TRACK_COSTAS_ERROR_TH 0x0f1d #define TRACK_CARRFLT_OUT_TH 0x0f1e #define TRACK_CARRFLT_MIDDLE_TH 0x0f1f #define TRACK_CARRFLT_OUT_DIV 0x0f20 #define TRACK_CARRFLT_MIDDLE_DIV 0x0f21 #define TRACK_CARRFLT_INBAND_DIV 0x0f22 #define TRACK_LATCHTIME_OFFSET 0x0f23 #define TRACK_DIRECTHANDOVER_OFFSET 0x0f24 #define TRACK_EN_HS 0x0f80 #define TRACK_CARR_AID 0x0f81 #define WAAS_EN_DECODE 0x0f82 #define TRACK_CARRCHKATLOCK 0x0f83 #define TRACK_BL_REACQ 0x0f84 /* Sony Test parameters */ #define SONYTEST_DISABLE_PORTS 0x0f85 /* Sony Acq parameters */ #define SACQ_SEARCH_CH_NUM 0x0f30 #define SACQ_NOISE_COUNT_NUM 0x0f31 #define SACQ_NOISE_VALID_TIME 0x0f32 #define SACQ_NOISE_K 0x0f33 #define SACQ_PEAK_FD 0x0f34 #define SACQ_PEAK_NFD 0x0f35 #define SACQ_RESERVE 0x0f36 #define SACQ_SEARCH_CH_NUM_VALID 0x0f96 #endif /* _GPSD_ITALK_H_ */ gpsd-3.15/driver_navcom.c0000664000175000017500000013022312520742615013554 0ustar esresr/* * Driver for Navcom receivers using proprietary NCT messages, a binary protocol. * * Vendor website: http://www.navcomtech.com/ * Technical references: Technical Reference Manual P/N 96-3120001-3001 * * Tested with two SF-2040G models * * At this stage, this driver implements the following commands: * * 0x20: Data Request (tell the unit which responses you want) * 0x3f: LED Configuration (controls the front panel LEDs -- for testing) * 0x1c: Test Support Block (again, blinks the front panel lights) * * and it understands the following responses: * * 0x06: Acknowledgement (without error) * 0x15: Negative Acknowledge * 0x86: Channel Status * 0xae: Identification Block * 0xb0: Raw Meas. Data Block * 0xb1: PVT Block * 0xb5: Pseudorange Noise Statistics * 0xd3: LBM DSP Status Block * 0xef: Clock Drift and Offset * * By Diego Berge. Contact via web form at http://www.navlost.eu/contact * * Week counters are not limited to 10 bits. It's unknown what * the firmware is doing to disambiguate them, if anything; it might just * be adding a fixed offset based on a hidden epoch value, in which case * unhappy things will occur on the next rollover. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include "gpsd.h" #if defined(NAVCOM_ENABLE) #include "bits.h" /* Have data which is 24 bits long */ #define getles3224(buf,off) (int32_t)(((uint32_t)getub((buf), (off)+2)<<24 | (uint32_t)getub((buf), (off)+1)<<16 | (uint32_t)getub((buf), (off))<<8)>>8) #define getleu3224(buf,off) (uint32_t)(((uint32_t)getub((buf), (off)+2)<<24 | (uint32_t)getub((buf), (off)+1)<<16 | (uint32_t)getub((buf), (off))<<8)>>8) /* And just to be difficult, Navcom is little endian but the GPS data stream is big endian. Some messages contain raw GPS data */ #define getles16_be(buf, off) (int16_t)((((uint16_t)getub(buf, (off)) << 8) \ | (uint16_t)getub(buf, (off)+1))) #define getleu16_be(buf, off) (uint16_t)((((uint16_t)getub(buf, (off)) << 8) \ | (uint16_t)getub(buf, (off)+1))) #define getles32_be(buf, off) (int32_t)((((uint16_t)getleu16_be(buf, (off)) << 16) \ | getleu16_be(buf, (off)+2))) #define getleu32_be(buf, off) (uint32_t)((((uint16_t)getleu16_be(buf, (off)) << 16) \ | getleu16_be(buf, (off)+2))) #define getles64_be(buf, off) (int64_t)((((uint64_t)getleu32_be(buf, (off)) << 32) \ | getleu32_be(buf, (off)+4))) #define getleu64_be(buf, off) (uint64_t)((((uint64_t)getleu32_be(buf, (off)) << 32) \ | getleu32_be(buf, (off)+4))) #define getles3224_be(buf,off) (int32_t)(((uint32_t)getub((buf), (off))<<24 \ | (uint32_t)getub((buf), (off)+1)<<16 \ | (uint32_t)getub((buf), (off)+2)<<8)>>8) #define NAVCOM_CHANNELS 12 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]; return csum; } static bool navcom_send_cmd(struct gps_device_t *session, unsigned char *cmd, size_t len) { return (gpsd_write(session, (const char *)cmd, len) == (ssize_t) len); } /* Data Request */ 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); putbyte(msg, 1, 0x99); putbyte(msg, 2, 0x66); putbyte(msg, 3, 0x20); /* Cmd ID */ putle16(msg, 4, 0x000e); /* Length */ putbyte(msg, 6, 0x00); /* Action */ putbyte(msg, 7, 0x01); /* Count of blocks */ putbyte(msg, 8, block_id); /* Data Block ID */ putbyte(msg, 9, 0x02); /* Logical Ports */ putle16(msg, 10, rate); /* Data rate */ putbyte(msg, 12, 0x71); putbyte(msg, 13, 0x00); putle16(msg, 14, 0x0000); putbyte(msg, 16, checksum(msg + 3, 13)); putbyte(msg, 17, 0x03); (void)navcom_send_cmd(session, msg, 18); gpsd_log(&session->context->errout, LOG_PROG, "Navcom: sent command 0x20 (Data Request) " "- data block id = %02x at rate %02x\n", block_id, rate); } // cppcheck-suppress unusedFunction static void UNUSED navcom_cmd_0x3f(struct gps_device_t *session) /* Changes the LED settings in the receiver */ { unsigned char msg[12]; putbyte(msg, 0, 0x02); putbyte(msg, 1, 0x99); putbyte(msg, 2, 0x66); putbyte(msg, 3, 0x3f); /* Cmd ID */ putle16(msg, 4, 0x0008); putbyte(msg, 6, 0x01); /* Action */ 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, 11, 0x03); (void)navcom_send_cmd(session, msg, 12); gpsd_log(&session->context->errout, LOG_PROG, "Navcom: sent command 0x3f (LED Configuration Block)\n"); } /* Test Support Block - Blinks the LEDs */ static void navcom_cmd_0x1c(struct gps_device_t *session, uint8_t mode, uint8_t length) { unsigned char msg[12]; putbyte(msg, 0, 0x02); putbyte(msg, 1, 0x99); putbyte(msg, 2, 0x66); putbyte(msg, 3, 0x1c); /* Cmd ID */ putle16(msg, 4, 0x0008); putbyte(msg, 6, 0x04); /* Use ACK/NAK */ putbyte(msg, 7, mode); /* 0x01 or 0x02 */ putbyte(msg, 8, length); /* Only if mode == 0x01 */ putbyte(msg, 9, 0x00); putbyte(msg, 10, checksum(msg + 3, 7)); putbyte(msg, 11, 0x03); (void)navcom_send_cmd(session, msg, 12); gpsd_log(&session->context->errout, LOG_PROG, "Navcom: sent command 0x1c (Test Support Block)\n"); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: command 0x1c mode = %02x, length = %u\n", mode, length); } #ifdef RECONFIGURE_ENABLE /* Serial Port Configuration */ 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. */ unsigned char msg[12]; putbyte(msg, 0, 0x02); putbyte(msg, 1, 0x99); putbyte(msg, 2, 0x66); putbyte(msg, 3, 0x11); /* Cmd ID */ putle16(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, 11, 0x03); (void)navcom_send_cmd(session, msg, 12); gpsd_log(&session->context->errout, LOG_PROG, "Navcom: sent command 0x11 (Serial Port Configuration)\n"); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: serial port selection: 0x%02x\n", port_selection); } #endif /* RECONFIGURE_ENABLE */ static void navcom_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; /* Request the following messages: */ if (event == event_identified) { /* NOTE - Channel Status 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 */ 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, 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 */ } } /* Ionosphere and UTC Data */ 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_DATA) as a * matter of interest */ /* 2^-30 */ #define SF_A0 (0.000000000931322574615478515625) /* 2^-50 */ #define SF_A1 (0.000000000000000888178419700125) /* 2^12 */ #define SF_TOT (4096) /* 2^-30 */ #define SF_ALPHA0 (0.000000000931322574615478515625) /* 2^-27 */ #define SF_ALPHA1 (0.000000007450580596923828125) /* 2^-24 */ #define SF_ALPHA2 (0.000000059604644775390625) /* 2^-24 */ #define SF_ALPHA3 (0.000000059604644775390625) /* 2^11 */ #define SF_BETA0 (2048) /* 2^14 */ #define SF_BETA1 (16384) /* 2^16 */ #define SF_BETA2 (65536) /* 2^16 */ #define SF_BETA3 (65536) unsigned char *buf = session->lexer.outbuffer + 3; uint16_t week = getleu16(buf, 3); uint32_t tow = getleu32(buf, 5); int8_t alpha0 = getsb(buf, 9); int8_t alpha1 = getsb(buf, 10); int8_t alpha2 = getsb(buf, 11); int8_t alpha3 = getsb(buf, 12); int8_t beta0 = getsb(buf, 13); int8_t beta1 = getsb(buf, 14); int8_t beta2 = getsb(buf, 15); int8_t beta3 = getsb(buf, 16); int32_t a1 = getles32(buf, 17); int32_t a0 = getles32(buf, 21); uint8_t tot = getub(buf, 25); uint8_t wnt = getub(buf, 26); int8_t dtls = getsb(buf, 27); uint8_t wnlsf = getub(buf, 28); uint8_t dn = getub(buf, 29); int8_t dtlsf = getsb(buf, 30); /* Ref.: ICD-GPS-200C 20.3.3.5.2.4 */ 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 { /* Effectivity time is not in the future, use dtlsf */ session->context->leap_seconds = (int)dtlsf; } gpsd_log(&session->context->errout, LOG_PROG, "Navcom: received packet type 0x83 (Ionosphere and UTC Data)\n"); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: Scaled parameters follow:\n"); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: GPS Week: %u, GPS Time of Week: %u (GPS Time: %f)\n", week, tow, week * 604800 + tow / 1000.0); gpsd_log(&session->context->errout, LOG_DATA, "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); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: A0: %19.12E, A1: %19.12E\n", (double)a0 * SF_A0, (double)a1 * SF_A1); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: UTC Ref. Time: %lu, UTC Ref. Week: %u, dTls: %d\n", (unsigned long)tot * SF_TOT, wnt, dtls); gpsd_log(&session->context->errout, LOG_DATA, "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) */ #undef SF_A0 #undef SF_A1 #undef SF_TOT #undef SF_ALPHA0 #undef SF_ALPHA1 #undef SF_ALPHA2 #undef SF_ALPHA3 #undef SF_BETA0 #undef SF_BETA1 #undef SF_BETA2 #undef SF_BETA3 } /* Acknowledgement (without error) */ static gps_mask_t handle_0x06(struct gps_device_t *session) { unsigned char *buf = session->lexer.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 */ gpsd_log(&session->context->errout, LOG_PROG, "Navcom: received packet type 0x06 (Acknowledgement (without error))\n"); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: acknowledged command id 0x%02x on port %c\n", cmd_id, (port == 0 ? 'A' : (port == 1 ? 'B' : '?'))); return 0; /* Nothing updated */ } /* Negative Acknowledge */ static gps_mask_t handle_0x15(struct gps_device_t *session) { size_t n; unsigned char *buf = session->lexer.outbuffer + 3; size_t msg_len = (size_t) getleu16(buf, 1); uint8_t port, cmd_id = getub(buf, 3); gpsd_log(&session->context->errout, LOG_PROG, "Navcom: received packet type 0x15 (Negative Acknowledge)\n"); for (n = 4; n < (msg_len - 2); n += 2) { uint8_t err_id = getub(buf, n); uint8_t err_desc = getub(buf, n + 1); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: error id = 0x%02x, error description = 0x%02x\n", err_id, err_desc); } port = getub(buf, n); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: negative acknowledge was for command id 0x%02x on port %c\n", cmd_id, (port == 0 ? 'A' : (port == 1 ? 'B' : '?'))); return 0; /* Nothing updated */ } /* PVT Block */ static gps_mask_t handle_0xb1(struct gps_device_t *session) { gps_mask_t mask; unsigned char *buf = session->lexer.outbuffer + 3; uint16_t week; uint32_t tow; int32_t lat, lon; /* Resolution of lat/lon values (2^-11) */ #define LL_RES (0.00048828125) uint8_t lat_fraction, lon_fraction; /* Resolution of lat/lon fractions (2^-15) */ #define LL_FRAC_RES (0.000030517578125) uint8_t nav_mode; int32_t ellips_height, altitude; /* Resolution of height and altitude values (2.0^-10) */ #define EL_RES (0.0009765625) double vel_north, vel_east, vel_up; /* Resolution of velocity values (2.0^-10) */ #define VEL_RES (0.0009765625) double track; uint8_t fom, gdop, pdop, hdop, vdop, tdop, tfom; double eph; /* This value means "undefined" */ #define DOP_UNDEFINED (255) int16_t ant_height_adj; int32_t set_delta_up; /* Resolution of delta north, east, and up, * 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 */ uint8_t dgps_conf; uint16_t max_dgps_age; uint8_t ext_nav_mode; int32_t set_delta_north, set_delta_east; uint8_t nav_failure_code; #endif /* __UNUSED__ */ /* Timestamp */ week = (uint16_t) getleu16(buf, 3); tow = (uint32_t) getleu32(buf, 5); session->newdata.time = gpsd_gpstime_resolve(session, week, tow / 1000.0); /* Get latitude, longitude */ lat = getles32(buf, 13); lon = getles32(buf, 17); 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; /* Nav mode */ 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)!=0 ? MODE_3D : MODE_2D); session->gpsdata.status = ((nav_mode & 0x03)!=0 ? STATUS_DGPS_FIX : STATUS_FIX); } /* Height Data */ ellips_height = getles32(buf, 23); altitude = getles32(buf, 27); ant_height_adj = getles16(buf, 51); set_delta_up = getles32(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); /* Speed Data */ vel_north = (double)getles3224(buf, 31); vel_east = (double)getles3224(buf, 34); /* vel_up = getles3224(buf, 37); */ vel_up = (double)getles3224(buf, 37); track = atan2(vel_east, vel_north); if (track < 0) track += 2 * GPS_PI; session->newdata.track = track * RAD_2_DEG; session->newdata.speed = sqrt(pow(vel_east, 2) + pow(vel_north, 2)) * VEL_RES; session->newdata.climb = vel_up * VEL_RES; /* Quality indicators */ fom = getub(buf, 40); gdop = getub(buf, 41); pdop = getub(buf, 42); hdop = getub(buf, 43); vdop = getub(buf, 44); tdop = getub(buf, 45); tfom = getub(buf, 46); /* Get two-sigma horizontal circular error estimate */ eph = fom / 100.0 * 1.96; /* approximate epx and epy errors from it */ session->newdata.epx = session->newdata.epy = eph / sqrt(2); session->newdata.ept = tfom * 1.96 /*Two sigma */ ; if (gdop != DOP_UNDEFINED) session->gpsdata.dop.gdop = gdop / 10.0; if (pdop != DOP_UNDEFINED) session->gpsdata.dop.pdop = pdop / 10.0; if (hdop != DOP_UNDEFINED) session->gpsdata.dop.hdop = hdop / 10.0; if (vdop != DOP_UNDEFINED) session->gpsdata.dop.vdop = vdop / 10.0; if (tdop != DOP_UNDEFINED) session->gpsdata.dop.tdop = tdop / 10.0; gpsd_log(&session->context->errout, LOG_PROG, "Navcom: received packet type 0xb1 (PVT Report)\n"); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: navigation mode %s (0x%02x) - %s - %s\n", ((-nav_mode & 0x80)!='\0' ? "invalid" : "valid"), nav_mode, ((nav_mode & 0x40)!='\0' ? "3D" : "2D"), ((nav_mode & 0x03)!='\0' ? "DGPS" : "GPS")); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: latitude = %f, longitude = %f, altitude = %f, geoid = %f\n", session->newdata.latitude, session->newdata.longitude, session->newdata.altitude, session->gpsdata.separation); gpsd_log(&session->context->errout, LOG_DATA, "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, session->newdata.track, session->newdata.speed); #undef D_RES #undef LL_RES #undef LL_FRAC_RES #undef EL_RES #undef VEL_RES #undef DOP_UNDEFINED mask = LATLON_SET | ALTITUDE_SET | CLIMB_SET | SPEED_SET | TRACK_SET | STATUS_SET | MODE_SET | USED_IS | HERR_SET | VERR_SET | TIMERR_SET | DOP_SET | TIME_SET | PPSTIME_IS; gpsd_log(&session->context->errout, 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 " "gdop=%.2f pdop=%.2f hdop=%.2f vdop=%.2f tdop=%.2f " "mask={LATLON|ALTITUDE|CLIMB|SPEED|TRACK|TIME|STATUS|MODE|" "USED|HERR|VERR|TIMERR|DOP}\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->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); return mask; } /* Packed Ephemeris Data */ static gps_mask_t handle_0x81(struct gps_device_t *session) { /* Scale factors for everything */ /* 2^-31 */ #define SF_TGD (.000000000465661287307739257812) /* 2^4 */ #define SF_TOC (16) /* 2^-55 */ #define SF_AF2 (.000000000000000027755575615628) /* 2^-43 */ #define SF_AF1 (.000000000000113686837721616029) /* 2^-31 */ #define SF_AF0 (.000000000465661287307739257812) /* 2^-5 */ #define SF_CRS (.031250000000000000000000000000) /* 2^-43 */ #define SF_DELTA_N (.000000000000113686837721616029) /* 2^-31 */ #define SF_M0 (.000000000465661287307739257812) /* 2^-29 */ #define SF_CUC (.000000001862645149230957031250) /* 2^-33 */ #define SF_E (.000000000116415321826934814453) /* 2^-29 */ #define SF_CUS (.000000001862645149230957031250) /* 2^-19 */ #define SF_SQRT_A (.000001907348632812500000000000) /* 2^4 */ #define SF_TOE (16) /* 2^-29 */ #define SF_CIC (.000000001862645149230957031250) /* 2^-31 */ #define SF_OMEGA0 (.000000000465661287307739257812) /* 2^-29 */ #define SF_CIS (.000000001862645149230957031250) /* 2^-31 */ #define SF_I0 (.000000000465661287307739257812) /* 2^-5 */ #define SF_CRC (.031250000000000000000000000000) /* 2^-31 */ #define SF_OMEGA (.000000000465661287307739257812) /* 2^-43 */ #define SF_OMEGADOT (.000000000000113686837721616029) /* 2^-43 */ #define SF_IDOT (.000000000000113686837721616029) unsigned char *buf = session->lexer.outbuffer + 3; uint8_t prn = getub(buf, 3); uint16_t week = getleu16(buf, 4); uint32_t tow = getleu32(buf, 6); uint16_t iodc = getleu16(buf, 10); /* And now the fun starts... everything that follows is * raw GPS data minus parity */ /* Subframe 1, words 3 to 10 minus parity */ uint16_t wn = (getleu16_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 */ /* uint16_t iodc = (getub(buf, 14)&0x03)<<8;*/ uint8_t l2pd = (getub(buf, 15) & 0x80) >> 7; int8_t tgd = getsb(buf, 26); /* iodc |= getub(buf, 27);*/ uint16_t toc = getleu16_be(buf, 28); int8_t af2 = getsb(buf, 30); int16_t af1 = getles16_be(buf, 31); int32_t af0 = getles3224_be(buf, 33) >> 2; /* Subframe 2, words 3 to 10 minus parity */ uint8_t iode = getub(buf, 36); int16_t crs = getles16_be(buf, 37); int16_t delta_n = getles16_be(buf, 39); int32_t m0 = getles32_be(buf, 41); int16_t cuc = getles16_be(buf, 45); uint32_t e = getleu32_be(buf, 47); int16_t cus = getles16_be(buf, 51); uint32_t sqrt_a = getleu32_be(buf, 53); uint16_t toe = getleu16_be(buf, 57); /* NOTE - Fit interval & AODO not collected */ /* Subframe 3, words 3 to 10 minus parity */ int16_t cic = getles16_be(buf, 60); int32_t Omega0 = getles32_be(buf, 62); int16_t cis = getles16_be(buf, 66); int32_t i0 = getles32_be(buf, 68); int16_t crc = getles16_be(buf, 72); int32_t omega = getles32_be(buf, 74); int32_t Omegadot = getles3224_be(buf, 78); /* 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) (((getles16_be(buf, 82) & 0xfffc) / 4) | (getub(buf, 82) & 80 ? 0xc000 : 0x0000)); session->context->gps_week = (unsigned short)wn; session->context->gps_tow = (double)(toc * SF_TOC); /* leap second? */ gpsd_log(&session->context->errout, LOG_PROG, "Navcom: received packet type 0x81 (Packed Ephemeris Data)\n"); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: PRN: %u, Week: %u, TOW: %.3f SV clock bias/drift/drift rate: %#19.12E/%#19.12E/%#19.12E\n", prn, session->context->gps_week, session->context->gps_tow, ((double)af0) * SF_AF0, ((double)af1) * SF_AF1, ((double)af2) * SF_AF2); gpsd_log(&session->context->errout, LOG_DATA, "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); gpsd_log(&session->context->errout, LOG_DATA, "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); gpsd_log(&session->context->errout, LOG_DATA, "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); gpsd_log(&session->context->errout, LOG_DATA, "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); gpsd_log(&session->context->errout, LOG_DATA, "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); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: SV accuracy: 0x%x, SV health: 0x%x, TGD: %f, IODC (!AODC): %u\n", ura, svh, (double)tgd * SF_TGD, iodc); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: Transmission time: %u\n", tow); #undef SF_TGD #undef SF_TOC #undef SF_AF2 #undef SF_AF1 #undef SF_AF0 #undef SF_CRS #undef SF_DELTA_N #undef SF_M0 #undef SF_CUC #undef SF_E #undef SF_CUS #undef SF_SQRT_A #undef SF_TOE #undef SF_CIC #undef SF_OMEGA0 #undef SF_CIS #undef SF_I0 #undef SF_CRC #undef SF_OMEGA #undef SF_OMEGADOT #undef SF_IDOT return 0; } /* Channel Status */ static gps_mask_t handle_0x86(struct gps_device_t *session) { size_t n, i, nsu; unsigned char *buf = session->lexer.outbuffer + 3; size_t msg_len = (size_t) getleu16(buf, 1); uint16_t week = getleu16(buf, 3); uint32_t tow = getleu32(buf, 5); uint8_t eng_status = getub(buf, 9); uint16_t sol_status = getleu16(buf, 10); uint8_t sats_visible = getub(buf, 12); //uint8_t sats_tracked = getub(buf, 13); //uint8_t used_sats = getub(buf, 14); //uint8_t pdop = getub(buf, 15); /* Timestamp */ session->gpsdata.skyview_time = gpsd_gpstime_resolve(session, (unsigned short)week, (double)tow / 1000.0f); /* Give this driver a single point of truth about DOPs */ //session->gpsdata.dop.pdop = (int)pdop / 10.0; /* Satellite count */ session->gpsdata.satellites_visible = (int)sats_visible; /* Fix mode */ switch (sol_status & 0x05) { case 0x05: session->gpsdata.status = STATUS_DGPS_FIX; break; case 0x01: session->gpsdata.status = STATUS_FIX; break; default: session->gpsdata.status = STATUS_NO_FIX; } gpsd_log(&session->context->errout, LOG_DATA, "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); /* Satellite details */ i = nsu = 0; for (n = 17; n < msg_len; n += 14) { uint8_t prn, ele, ca_snr, p2_snr, log_channel, hw_channel, s, stat; uint16_t azm, dgps_age; if (i >= MAXCHANNELS) { gpsd_log(&session->context->errout, LOG_ERROR, "Navcom: packet type 0x86: too many satellites!\n"); gpsd_zero_satellites(&session->gpsdata); return 0; } prn = getub(buf, n); /* * This field is described in the Technical Reference as follows: * * Channel Tracking Status: * B0-B1: C/A tracking status * B2-B3: P1 tracking status * B4-B5: P2 tracking status * 00 Acquisition or reacquisition * 01 Code loop locked * 02 Costas loop locked * 11 Full tracking with aiding and active * multipath reduction - all data is valid * B6=1: C/A Bit sync * B7=1: C/A Frame sync * * By observation, the satellite is in use if this status is 0xff. * But errors here are not very serious, all they can affect is * the coverance-matrix calculation for error modeling. */ stat = getub(buf, n + 1); log_channel = getub(buf, n + 2); ele = getub(buf, n + 5); azm = getleu16(buf, n + 6); ca_snr = getub(buf, n + 8); p2_snr = getub(buf, n + 10); dgps_age = getleu16(buf, n + 11); hw_channel = getub(buf, n + 13); s = (unsigned char)0; /* 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 in this satellite */ if (!(ele == 0 && azm == 0 && dgps_age == 0)) { session->gpsdata.skyview[i].PRN = (short)prn; session->gpsdata.skyview[i].elevation = (short)ele; session->gpsdata.skyview[i].azimuth = (short)azm; s = session->gpsdata.skyview[i].ss = (p2_snr ? p2_snr : ca_snr) / 4.0; session->gpsdata.skyview[i++].used = (stat == 0xff); if (stat == 0xff) nsu++; } session->gpsdata.satellites_used = (int)nsu; gpsd_log(&session->context->errout, LOG_DATA, "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); gpsd_log(&session->context->errout, LOG_DATA, "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)); } gpsd_log(&session->context->errout, 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; } /* Raw Meas. Data Block */ static gps_mask_t handle_0xb0(struct gps_device_t *session) { /* L1 wavelength (299792458m/s / 1575420000Hz) */ #define LAMBDA_L1 (.190293672798364880476317426464) size_t n; unsigned char *buf = session->lexer.outbuffer + 3; size_t msg_len = (size_t) getleu16(buf, 1); uint16_t week = getleu16(buf, 3); uint32_t tow = getleu32(buf, 5); uint8_t tm_slew_acc = getub(buf, 9); uint8_t status = getub(buf, 10); session->context->gps_week = (unsigned short)week; session->context->gps_tow = (double)tow / 1000.0; gpsd_log(&session->context->errout, LOG_PROG, "Navcom: received packet type 0xb0 (Raw Meas. Data Block)\n"); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: week = %u, tow = %.3f, time slew accumulator = %u (1/1023mS), status = 0x%02x " "(%sclock %s - %u blocks follow)\n", session->context->gps_week, session->context->gps_tow, tm_slew_acc, status, ((status & 0x80) ? "channel time set - " : ""), ((status & 0x40) ? "stable" : "not stable"), status & 0x0f); 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 = getleu32(buf, n + 2); /* integer division by 16 is a sign-preserving right shift of 4 bits */ int32_t l1_phase = getles3224(buf, n + 6) / 16; uint8_t l1_slips = (uint8_t) (getles3224(buf, n + 6) & 0x0f); int16_t p1_ca_pseudorange = getles16(buf, n + 9); int16_t p2_ca_pseudorange = getles16(buf, n + 11); int32_t l2_phase = getles3224(buf, n + 13) / 16; uint8_t l2_slips = (uint8_t) (getles3224(buf, n + 13) & 0x0f); 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_log(&session->context->errout, LOG_DATA + 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_log(&session->context->errout, LOG_DATA + 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_log(&session->context->errout, LOG_DATA + 1, "Navcom: >>> C1: %14.3f, L1: %14.3f, L2: %14.3f, P1: %14.3f, P2: %14.3f\n", c1, l1, l2, p1, p2); } #undef LAMBDA_L1 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; char *buf = (char *)session->lexer.outbuffer + 3; uint16_t week = getleu16(buf, 3); uint32_t tow = getleu32(buf, 5); double rms = getled64(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 */ //double ellips_maj = getled64(buf, 17); //double ellips_min = getled64(buf, 25); //double ellips_azm = getled64(buf, 33); double lat_sd = getled64(buf, 41); double lon_sd = getled64(buf, 49); double alt_sd = getled64(buf, 57); double hrms = sqrt(pow(lat_sd, 2) + pow(lon_sd, 2)); #endif /* __UNUSED__ */ 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); #endif /* __UNUSED__ */ session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)week, (double)tow / 1000.0f); gpsd_log(&session->context->errout, LOG_PROG, "Navcom: received packet type 0xb5 (Pseudorange Noise Statistics)\n"); gpsd_log(&session->context->errout, LOG_DATA, "Navcom: epe = %f\n", session->gpsdata.epe); return mask; } else { /* Ignore this message block */ if (!session->driver.navcom.warned) { gpsd_log(&session->context->errout, LOG_WARN, "Navcom: received packet type 0xb5 (Pseudorange Noise Statistics) ignored " " - sizeof(double) == 64 bits required\n"); session->driver.navcom.warned = true; } return 0; /* Block ignored - wrong sizeof(double) */ } } /* LBM DSP Status Block */ 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 */ } /* Identification Block */ static gps_mask_t handle_0xae(struct gps_device_t *session) { char *engconfstr, *asicstr; unsigned char *buf = session->lexer.outbuffer + 3; size_t msg_len = (size_t) getleu16(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 = getleu16(buf, 7); uint8_t dcclass = getub(buf, 9); uint16_t rfcser = getleu16(buf, 10); uint8_t rfcclass = getub(buf, 12); 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 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 */ slsbn = getub(buf, 53); } 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); } switch (engconf) { case 0x00: engconfstr = "Unknown/Undefined"; break; case 0x01: engconfstr = "NCT 2000 S"; break; case 0x02: engconfstr = "NCT 2000 D"; break; case 0x03: engconfstr = "Startfire Single"; break; case 0x04: engconfstr = "Starfire Dual"; break; case 0x05: engconfstr = "Pole Mount RTK (Internal Radio)"; break; case 0x06: engconfstr = "Pole Mount GIS (LBM)"; break; case 0x07: engconfstr = "Black Box RTK (Internal Radio)"; break; case 0x08: engconfstr = "Black Box GIS (LBM)"; break; case 0x80: engconfstr = "R100"; break; case 0x81: engconfstr = "R200"; break; case 0x82: engconfstr = "R210"; break; case 0x83: engconfstr = "R300"; break; case 0x84: engconfstr = "R310"; break; default: engconfstr = "?"; } switch (asic) { case 0x01: asicstr = "A-ASIC"; break; case 0x02: asicstr = "B-ASIC"; break; case 0x03: asicstr = "C-ASIC"; break; case 0x04: asicstr = "M-ASIC"; break; default: asicstr = "?"; } gpsd_log(&session->context->errout, LOG_PROG, "Navcom: received packet type 0xae (Identification Block)\n"); if (msg_len == 0x0037) { gpsd_log(&session->context->errout, 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); } else { gpsd_log(&session->context->errout, 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); } (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); return DEVICEID_SET; } /* Clock Drift and Offset */ static gps_mask_t handle_0xef(struct gps_device_t *session) { unsigned char *buf = session->lexer.outbuffer + 3; //uint16_t week = getleu16(buf, 3); //uint32_t tow = getleu32(buf, 5); int8_t osc_temp = getsb(buf, 9); uint8_t nav_status = getub(buf, 10); double nav_clock_offset; float nav_clock_drift; float osc_filter_drift_est; int32_t time_slew = (int32_t) getles32(buf, 27); if (sizeof(double) == 8) { nav_clock_offset = getled64((char *)buf, 11); } else { nav_clock_offset = NAN; } if (sizeof(float) == 4) { nav_clock_drift = getlef32((char *)buf, 19); osc_filter_drift_est = getlef32((char *)buf, 23); } else { nav_clock_drift = NAN; osc_filter_drift_est = NAN; } gpsd_log(&session->context->errout, LOG_DATA, "Navcom: oscillator temp. = %d, nav. status = 0x%02x, " "nav. clock offset = %f, nav. clock drift = %f, " "osc. filter drift est. = %f, acc.time slew value = %d\n", osc_temp, nav_status, nav_clock_offset, nav_clock_drift, osc_filter_drift_est, time_slew); gpsd_log(&session->context->errout, LOG_DATA, "CDO 0xef: time=%.2f mask={TIME}\n", session->newdata.time); return 0; } gps_mask_t navcom_parse(struct gps_device_t * session, unsigned char *buf, size_t len) { unsigned char cmd_id; unsigned int msg_len; if (len == 0) return 0; cmd_id = (unsigned char)getub(buf, 3); //payload = &buf[6]; msg_len = (uint) getleu16(buf, 4); gpsd_log(&session->context->errout, LOG_RAW, "Navcom: packet type 0x%02x\n", cmd_id); session->cycle_end_reliable = true; switch (cmd_id) { case 0x06: return handle_0x06(session); case 0x15: return handle_0x15(session); case 0x81: return handle_0x81(session); case 0x83: return handle_0x83(session); case 0x86: return handle_0x86(session); case 0xae: return handle_0xae(session); case 0xb0: return handle_0xb0(session); case 0xb1: return handle_0xb1(session) | (CLEAR_IS | REPORT_IS); case 0xb5: return handle_0xb5(session); case 0xd3: return handle_0xd3(session); case 0xef: return handle_0xef(session); default: gpsd_log(&session->context->errout, LOG_PROG, "Navcom: received packet type 0x%02x, length %d - unknown or unimplemented\n", cmd_id, msg_len); return 0; } } static gps_mask_t navcom_parse_input(struct gps_device_t *session) { if (session->lexer.type == NAVCOM_PACKET) { return navcom_parse(session, session->lexer.outbuffer, session->lexer.outbuflen); #ifdef NMEA_ENABLE } else if (session->lexer.type == NMEA_PACKET) { return nmea_parse((char *)session->lexer.outbuffer, session);; #endif /* NMEA_ENABLE */ } else return 0; } #ifdef CONTROLSEND_ENABLE static ssize_t navcom_control_send(struct gps_device_t *session, char *buf, size_t len) { putbyte(session->msgbuf, 0, 0x02); putbyte(session->msgbuf, 1, 0x99); putbyte(session->msgbuf, 2, 0x66); putbyte(session->msgbuf, 3, buf[0]); /* Cmd ID */ putle16(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; return gpsd_write(session, session->msgbuf, session->msgbuflen); } #endif /* CONTROLSEND_ENABLE */ #ifdef RECONFIGURE_ENABLE 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) { return false; } else { uint8_t port, port_selection; uint8_t baud; if (session->driver.navcom.physical_port == (uint8_t) 0xFF) { /* We still don't know which port we're connected to */ return false; } 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; } /* Proceed to construct our message */ port = session->driver.navcom.physical_port; 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 */ return true; } } #endif /* RECONFIGURE_ENABLE */ /* this is everything we export */ /* *INDENT-OFF* */ const struct gps_type_t driver_navcom = { .type_name = "Navcom NCT", /* full name of type */ .packet_type = NAVCOM_PACKET, /* lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* none */ .channels = NAVCOM_CHANNELS, /* 12 L1 + 12 L2 + 2 Inmarsat L-Band */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* use generic one */ .parse_packet = navcom_parse_input, /* parse message packets */ .rtcm_writer = gpsd_write, /* send RTCM data straight */ .init_query = NULL, /* non-perturbing query */ .event_hook = navcom_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = navcom_speed, /* we do change baud rates */ .mode_switcher = NULL, /* there is not a mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* ignore, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = navcom_control_send, /* how to send a control string */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* defined(NAVCOM_ENABLE) */ gpsd-3.15/driver_nmea0183.c0000664000175000017500000016014712533603644013537 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include "gpsd.h" #include "strfuncs.h" #ifdef NMEA_ENABLE /************************************************************************** * * Parser helpers begin here * **************************************************************************/ static void do_lat_lon(char *field[], struct gps_fix_t *out) /* process a pair of latitude/longitude fields starting at field index BEGIN */ { double d, m; char str[20], *p; if (*(p = field[0]) != '\0') { double lat; (void)strlcpy(str, p, sizeof(str)); lat = atof(str); m = 100.0 * modf(lat / 100.0, &d); lat = d + m / 60.0; p = field[1]; if (*p == 'S') lat = -lat; out->latitude = lat; } if (*(p = field[2]) != '\0') { double lon; (void)strlcpy(str, p, sizeof(str)); lon = atof(str); m = 100.0 * modf(lon / 100.0, &d); lon = d + m / 60.0; p = field[3]; if (*p == 'W') lon = -lon; out->longitude = lon; } } /************************************************************************** * * Scary timestamp fudging begins here * * Four sentences, GGA and GLL and RMC and ZDA, contain timestamps. * GGA/GLL/RMC timestamps look like hhmmss.ss, with the trailing .ss * part optional. RMC has a date field, in the format ddmmyy. ZDA * has separate fields for day/month/year, with a 4-digit year. This * means that for RMC we must supply a century and for GGA and GLL we * must supply a century, year, and day. We get the missing data from * a previous RMC or ZDA; century in RMC is supplied from the daemon's * context (initialized at startup time) if there has been no previous * ZDA. * **************************************************************************/ #define DD(s) ((int)((s)[0]-'0')*10+(int)((s)[1]-'0')) static void merge_ddmmyy(char *ddmmyy, struct gps_device_t *session) /* sentence supplied ddmmyy, but no century part */ { int yy = DD(ddmmyy + 4); int mon = DD(ddmmyy + 2); int mday = DD(ddmmyy); int year; /* check for century wrap */ if (session->nmea.date.tm_year % 100 == 99 && yy == 0) gpsd_century_update(session, session->context->century + 100); year = (session->context->century + yy); if ( (1 > mon ) || (12 < mon ) ) { gpsd_log(&session->context->errout, LOG_WARN, "merge_ddmmyy(%s), malformed month\n", ddmmyy); } else if ( (1 > mday ) || (31 < mday ) ) { gpsd_log(&session->context->errout, LOG_WARN, "merge_ddmmyy(%s), malformed day\n", ddmmyy); } else { gpsd_log(&session->context->errout, LOG_DATA, "merge_ddmmyy(%s) sets year %d\n", ddmmyy, year); session->nmea.date.tm_year = year - 1900; session->nmea.date.tm_mon = mon - 1; session->nmea.date.tm_mday = mday; } } static void merge_hhmmss(char *hhmmss, struct gps_device_t *session) /* update from a UTC time */ { int old_hour = session->nmea.date.tm_hour; session->nmea.date.tm_hour = DD(hhmmss); if (session->nmea.date.tm_hour < old_hour) /* midnight wrap */ session->nmea.date.tm_mday++; session->nmea.date.tm_min = DD(hhmmss + 2); session->nmea.date.tm_sec = DD(hhmmss + 4); session->nmea.subseconds = safe_atof(hhmmss + 4) - session->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->nmea.last_frac_time = session->nmea.this_frac_time; session->nmea.this_frac_time = safe_atof(fld); session->nmea.latch_frac_time = true; gpsd_log(&session->context->errout, LOG_DATA, "%s: registers fractional time %.2f\n", tag, session->nmea.this_frac_time); } } /************************************************************************** * * Compare GPS timestamps for equality. Depends on the fact that the * timestamp granularity of GPS is 1/100th of a second. Use this to avoid * naive float comparisons. * **************************************************************************/ #define GPS_TIME_EQUAL(a, b) (fabs((a) - (b)) < 0.01) /************************************************************************** * * NMEA sentence handling begins here * **************************************************************************/ static gps_mask_t processRMC(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. */ gps_mask_t mask = 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; } if (session->newdata.mode >= MODE_2D) { session->newdata.mode = MODE_NO_FIX; mask |= MODE_SET; } /* set something nz, so it won't look like an unknown sentence */ mask |= ONLINE_SET; } else if (strcmp(field[2], "A") == 0) { /* * The MTK3301, 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') { merge_hhmmss(field[1], session); merge_ddmmyy(field[9], session); mask |= TIME_SET; register_fractional_time(field[0], field[1], session); } do_lat_lon(&field[3], &session->newdata); mask |= LATLON_SET; session->newdata.speed = safe_atof(field[7]) * KNOTS_TO_MPS; session->newdata.track = safe_atof(field[8]); mask |= (TRACK_SET | SPEED_SET); /* * 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 * code that relies on them won't mistakenly believe it has never * received a fix. */ if (session->gpsdata.status == STATUS_NO_FIX) { session->gpsdata.status = STATUS_FIX; /* could be DGPS_FIX, we can't tell */ mask |= STATUS_SET; } if (session->newdata.mode < MODE_2D) { session->newdata.mode = MODE_2D; mask |= MODE_SET; } } gpsd_log(&session->context->errout, LOG_DATA, "RMC: ddmmyy=%s hhmmss=%s lat=%.2f lon=%.2f " "speed=%.2f track=%.2f mode=%d status=%d\n", field[9], field[1], session->newdata.latitude, session->newdata.longitude, session->newdata.speed, session->newdata.track, session->newdata.mode, session->gpsdata.status); return mask; } static gps_mask_t processGLL(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 * 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 GLL that aren't redundant. */ char *status = field[7]; gps_mask_t mask = 0; if (field[5][0] != '\0') { merge_hhmmss(field[5], session); register_fractional_time(field[0], field[5], session); if (session->nmea.date.tm_year == 0) gpsd_log(&session->context->errout, LOG_WARN, "can't use GLL time until after ZDA or RMC has supplied a year.\n"); else { mask = TIME_SET; } } if (strcmp(field[6], "A") == 0 && (count < 8 || *status != 'N')) { int newstatus; do_lat_lon(&field[1], &session->newdata); mask |= LATLON_SET; if (count >= 8 && *status == 'D') newstatus = STATUS_DGPS_FIX; /* differential */ else newstatus = STATUS_FIX; /* * 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, * some devices like the FV-18 don't send it by default, and * elsewhere in the code we want to be able to test for the * presence of a valid fix with mode > MODE_NO_FIX. */ if (session->newdata.mode < MODE_2D) { session->newdata.mode = MODE_2D; mask |= MODE_SET; } session->gpsdata.status = newstatus; mask |= STATUS_SET; } gpsd_log(&session->context->errout, LOG_DATA, "GLL: hhmmss=%s lat=%.2f lon=%.2f mode=%d status=%d\n", field[5], session->newdata.latitude, session->newdata.longitude, session->newdata.mode, session->gpsdata.status); return mask; } static gps_mask_t processGGA(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) */ gps_mask_t mask; session->gpsdata.status = atoi(field[6]); mask = STATUS_SET; /* * There are some receivers (the Trimble Placer 450 is an example) that * don't ship a GSA with mode 1 when they lose satellite lock. Instead * they just keep reporting GGA and GSA on subsequent cycles with the * timestamp not advancing and a bogus mode. On the assumption that GGA * is only issued once per cycle we can detect this here (it would be * nicer to do it on GSA but GSA has no timestamp). */ session->nmea.latch_mode = strncmp(field[1], session->nmea.last_gga_timestamp, sizeof(session->nmea.last_gga_timestamp))==0; if (session->nmea.latch_mode) { session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; } else (void)strlcpy(session->nmea.last_gga_timestamp, field[1], sizeof(session->nmea.last_gga_timestamp)); /* if we have a fix and the mode latch is off, go... */ if (session->gpsdata.status > STATUS_NO_FIX) { char *altitude; merge_hhmmss(field[1], session); register_fractional_time(field[0], field[1], session); if (session->nmea.date.tm_year == 0) gpsd_log(&session->context->errout, LOG_WARN, "can't use GGA time until after ZDA or RMC has supplied a year.\n"); else { mask |= TIME_SET; } do_lat_lon(&field[2], &session->newdata); mask |= LATLON_SET; session->gpsdata.satellites_used = atoi(field[7]); altitude = field[9]; /* * SiRF chipsets up to version 2.2 report a null altitude field. * See . * If we see this, force mode to 2D at most. */ if (altitude[0] == '\0') { if (session->newdata.mode > MODE_2D) { session->newdata.mode = MODE_2D; mask |= MODE_SET; } } else { session->newdata.altitude = safe_atof(altitude); mask |= ALTITUDE_SET; /* * 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, * some devices like the FV-18 don't send it by default, and * elsewhere in the code we want to be able to test for the * presence of a valid fix with mode > MODE_NO_FIX. */ if (session->newdata.mode < MODE_3D) { session->newdata.mode = MODE_3D; mask |= MODE_SET; } } if (strlen(field[11]) > 0) { session->gpsdata.separation = safe_atof(field[11]); } else { session->gpsdata.separation = wgs84_separation(session->newdata.latitude, session->newdata.longitude); } } gpsd_log(&session->context->errout, LOG_DATA, "GGA: hhmmss=%s lat=%.2f lon=%.2f alt=%.2f mode=%d status=%d\n", field[1], session->newdata.latitude, session->newdata.longitude, session->newdata.altitude, session->newdata.mode, session->gpsdata.status); return mask; } static gps_mask_t processGST(int count, char *field[], struct gps_device_t *session) /* GST - GPS Pseudorange Noise Statistics */ { /* * GST,hhmmss.ss,x,x,x,x,x,x,x,*hh * 1 TC time of associated GGA fix * 2 Total RMS standard deviation of ranges inputs to the navigation solution * 3 Standard deviation (meters) of semi-major axis of error ellipse * 4 Standard deviation (meters) of semi-minor axis of error ellipse * 5 Orientation of semi-major axis of error ellipse (true north degrees) * 6 Standard deviation (meters) of latitude error * 7 Standard deviation (meters) of longitude error * 8 Standard deviation (meters) of altitude error * 9 Checksum */ if (count < 8) { return 0; } #define PARSE_FIELD(n) (*field[n]!='\0' ? safe_atof(field[n]) : NAN) session->gpsdata.gst.utctime = PARSE_FIELD(1); session->gpsdata.gst.rms_deviation = PARSE_FIELD(2); session->gpsdata.gst.smajor_deviation = PARSE_FIELD(3); session->gpsdata.gst.sminor_deviation = PARSE_FIELD(4); session->gpsdata.gst.smajor_orientation = PARSE_FIELD(5); session->gpsdata.gst.lat_err_deviation = PARSE_FIELD(6); session->gpsdata.gst.lon_err_deviation = PARSE_FIELD(7); session->gpsdata.gst.alt_err_deviation = PARSE_FIELD(8); #undef PARSE_FIELD register_fractional_time(field[0], field[1], session); gpsd_log(&session->context->errout, LOG_DATA, "GST: utc = %.2f, rms = %.2f, maj = %.2f, min = %.2f, ori = %.2f, lat = %.2f, lon = %.2f, alt = %.2f\n", session->gpsdata.gst.utctime, session->gpsdata.gst.rms_deviation, session->gpsdata.gst.smajor_deviation, session->gpsdata.gst.sminor_deviation, session->gpsdata.gst.smajor_orientation, session->gpsdata.gst.lat_err_deviation, session->gpsdata.gst.lon_err_deviation, session->gpsdata.gst.alt_err_deviation); return GST_SET | ONLINE_SET; } static int nmeaid_to_prn(char *talker, int satnum) /* deal with range-mapping attempts to to use IDs 1-32 by Beidou, etc. */ { /* * According to https://github.com/mvglasow/satstat/wiki/NMEA-IDs * NMEA IDs can be roughly divided into the following ranges: * * 1..32: GPS * 33..54: Various SBAS systems (EGNOS, WAAS, SDCM, GAGAN, MSAS) * ... some IDs still unused * 55..64: not used (might be assigned to further SBAS systems) * 65..88: GLONASS * 89..96: GLONASS (future extensions?) * 97..192: not used (SBAS PRNs 120-151 fall in here) * 193..195: QZSS * 196..200: QZSS (future extensions?) * 201..235: Beidou * * The issue is what to do when GPSes from these different systems * fight for IDs in the 1-32 range, as in this pair of Beidou sentences * * $BDGSV,2,1,07,01,00,000,45,02,13,089,35,03,00,000,37,04,00,000,42*6E * $BDGSV,2,2,07,05,27,090,,13,19,016,,11,07,147,*5E * * Because the PRNs are only used for generating a satellite * chart, mistakes here aren't dangerous. The code will record * and use multiple sats with the same ID in one skyview; in * effect, they're recorded by the order in which they occur * rather than by PRN. */ // NMEA-ID (33..64) to SBAS PRN 120-151. if (satnum >= 33 && satnum <= 64) satnum += 87; if (satnum < 32) { /* map Beidou IDs */ if (talker[0] == 'B' && talker[1] == 'D') satnum += 200; else if (talker[0] == 'G' && talker[1] == 'B') satnum += 200; /* GLONASS GL doesn't seem to do this, but better safe than sorry */ if (talker[0] == 'G' && (talker[1] == 'L' || talker[1] == 'N')) satnum += 37; /* QZSS */ if (talker[0] == 'Q' && talker[1] == 'Z') satnum += 193; } return satnum; } static gps_mask_t processGSA(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 */ gps_mask_t mask; /* * One chipset called the i.Trek M3 issues GPGSA lines that look like * this: "$GPGSA,A,1,,,,*32" when it has no fix. This is broken * in at least two ways: it's got the wrong number of fields, and * it claims to be a valid sentence (A flag) when it isn't. * Alarmingly, it's possible this error may be generic to SiRFstarIII. */ if (count < 17) { gpsd_log(&session->context->errout, LOG_DATA, "GPGSA: malformed, setting ONLINE_SET only.\n"); mask = ONLINE_SET; } else if (session->nmea.latch_mode) { /* last GGA had a non-advancing timestamp; don't trust this GSA */ mask = ONLINE_SET; } else { int i; session->newdata.mode = atoi(field[2]); /* * The first arm of this conditional ignores dead-reckoning * fixes from an Antaris chipset. which returns E in field 2 * for a dead-reckoning estimate. Fix by Andreas Stricker. */ if (session->newdata.mode == 0 && field[2][0] == 'E') mask = 0; else mask = MODE_SET; gpsd_log(&session->context->errout, LOG_PROG, "GPGSA sets mode %d\n", session->newdata.mode); if (field[15][0] != '\0') session->gpsdata.dop.pdop = safe_atof(field[15]); if (field[16][0] != '\0') session->gpsdata.dop.hdop = safe_atof(field[16]); if (field[17][0] != '\0') session->gpsdata.dop.vdop = safe_atof(field[17]); session->gpsdata.satellites_used = 0; memset(session->nmea.sats_used, 0, sizeof(session->nmea.sats_used)); /* the magic 6 here counts the tag, two mode fields, and the DOP fields */ for (i = 0; i < count - 6; i++) { int prn = nmeaid_to_prn(field[0], atoi(field[i + 3])); if (prn > 0) session->nmea.sats_used[session->gpsdata.satellites_used++] = (unsigned short)prn; } mask |= DOP_SET | USED_IS; gpsd_log(&session->context->errout, LOG_DATA, "GPGSA: mode=%d used=%d pdop=%.2f hdop=%.2f vdop=%.2f\n", session->newdata.mode, session->gpsdata.satellites_used, session->gpsdata.dop.pdop, session->gpsdata.dop.hdop, session->gpsdata.dop.vdop); } return mask; } static gps_mask_t processGSV(int count, char *field[], struct gps_device_t *session) /* GPS Satellites in View */ { #define GSV_TALKER field[0][1] /* * 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 * * There my be up to three GSV sentences in a data packet * * Can occur with talker IDs: * BD (Beidou), * GA (Galileo), * GB (Beidou), * GL (GLONASS), * GN (GLONASS, any combination GNSS), * GP (GPS, SBAS, QZSS), * QZ (QZSS). * * GL may to be used when GSVs are mixed containing GLONASS, GN maybe * used when GSVs contain GLONASS only. Usage is inconsistent. * * In the GLONASS version sat IDs run from 65-96 (NMEA0183 standardizes * this). At least two GPS, the BU-353 GLONASS and the u-blox NEO-M8N, * emit a GPGSV set followed by a GLGSV set. We have also seen a * SiRF-IV variant that emits GPGSV followed by BDGSV. We need to * combine these. * * NMEA 4.1 adds a signal-ID field just before the checksum. First * seen in May 2015 on a u-blox M8, */ int n, fldnum; if (count <= 3) { gpsd_log(&session->context->errout, LOG_WARN, "malformed GPGSV - fieldcount %d <= 3\n", count); gpsd_zero_satellites(&session->gpsdata); session->gpsdata.satellites_visible = 0; return ONLINE_SET; } /* * This check used to be !=0, but we have loosen it a little to let by * NMEA 4.1 GSVs with an extra signal-ID field at the end. */ if (count % 4 > 1) { gpsd_log(&session->context->errout, LOG_WARN, "malformed GPGSV - fieldcount %d %% 4 != 0\n", count); gpsd_zero_satellites(&session->gpsdata); session->gpsdata.satellites_visible = 0; return ONLINE_SET; } session->nmea.await = atoi(field[1]); if ((session->nmea.part = atoi(field[2])) < 1) { gpsd_log(&session->context->errout, LOG_WARN, "malformed GPGSV - bad part\n"); gpsd_zero_satellites(&session->gpsdata); return ONLINE_SET; } else if (session->nmea.part == 1) { /* * might have gone from GPGSV to GLGSV/BDGSV/QZGSV, * in which case accumulate */ if (session->nmea.last_gsv_talker == '\0' || GSV_TALKER == session->nmea.last_gsv_talker) { gpsd_zero_satellites(&session->gpsdata); } session->nmea.last_gsv_talker = GSV_TALKER; if (session->nmea.last_gsv_talker == 'L') session->nmea.seen_glgsv = true; if (session->nmea.last_gsv_talker == 'D') session->nmea.seen_bdgsv = true; if (session->nmea.last_gsv_talker == 'Z') session->nmea.seen_qzss = true; } for (fldnum = 4; fldnum < count;) { struct satellite_t *sp; if (session->gpsdata.satellites_visible >= MAXCHANNELS) { gpsd_log(&session->context->errout, LOG_ERROR, "internal error - too many satellites [%d]!\n", session->gpsdata.satellites_visible); gpsd_zero_satellites(&session->gpsdata); break; } sp = &session->gpsdata.skyview[session->gpsdata.satellites_visible]; sp->PRN = (short)nmeaid_to_prn(field[0], atoi(field[fldnum++])); sp->elevation = (short)atoi(field[fldnum++]); sp->azimuth = (short)atoi(field[fldnum++]); sp->ss = (float)atoi(field[fldnum++]); sp->used = false; if (sp->PRN > 0) for (n = 0; n < MAXCHANNELS; n++) if (session->nmea.sats_used[n] == (unsigned short)sp->PRN) { sp->used = true; break; } /* * Incrementing this unconditionally falls afoul of chipsets like * the Motorola Oncore GT+ that emit empty fields at the end of the * last sentence in a GPGSV set if the number of satellites is not * a multiple of 4. */ if (sp->PRN != 0) session->gpsdata.satellites_visible++; } if (session->nmea.part == session->nmea.await && atoi(field[3]) != session->gpsdata.satellites_visible) gpsd_log(&session->context->errout, 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->nmea.part < session->nmea.await) { gpsd_log(&session->context->errout, LOG_PROG, "Partial satellite data (%d of %d).\n", session->nmea.part, session->nmea.await); return ONLINE_SET; } /* * This sanity check catches an odd behavior of SiRFstarII receivers. * When they can't see any satellites at all (like, inside a * building) they sometimes cough up a hairball in the form of a * GSV packet with all the azimuth entries 0 (but nonzero * elevations). This behavior was observed under SiRF firmware * revision 231.000.000_A2. */ for (n = 0; n < session->gpsdata.satellites_visible; n++) if (session->gpsdata.skyview[n].azimuth != 0) goto sane; gpsd_log(&session->context->errout, LOG_WARN, "Satellite data no good (%d of %d).\n", session->nmea.part, session->nmea.await); gpsd_zero_satellites(&session->gpsdata); return ONLINE_SET; sane: session->gpsdata.skyview_time = NAN; gpsd_log(&session->context->errout, LOG_DATA, "GSV: Satellite data OK (%d of %d).\n", session->nmea.part, session->nmea.await); /* assumes GLGSV or BDGSV group, if present, is emitted after the GPGSV */ if ((session->nmea.seen_glgsv || session->nmea.seen_bdgsv || session->nmea.seen_qzss) && GSV_TALKER == 'P') return ONLINE_SET; return SATELLITE_SET; #undef GSV_TALKER } 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 . * * 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 = session->newdata.epy = session->newdata.epv = session->gpsdata.epe = 100; mask = 0; } else { session->newdata.epx = session->newdata.epy = safe_atof(field[1]) * (1 / sqrt(2)) * (GPSD_CONFIDENCE / CEP50_SIGMA); session->newdata.epv = safe_atof(field[3]) * (GPSD_CONFIDENCE / CEP50_SIGMA); session->gpsdata.epe = safe_atof(field[5]) * (GPSD_CONFIDENCE / CEP50_SIGMA); mask = HERR_SET | VERR_SET | PERR_IS; } gpsd_log(&session->context->errout, LOG_DATA, "PGRME: epx=%.2f epy=%.2f epv=%.2f\n", session->newdata.epx, session->newdata.epy, session->newdata.epv); return mask; } static gps_mask_t processGBS(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 */ /* register fractional time for end-of-cycle detection */ register_fractional_time(field[0], field[1], session); /* check that we're associated with the current fix */ if (session->nmea.date.tm_hour == DD(field[1]) && session->nmea.date.tm_min == DD(field[1] + 2) && session->nmea.date.tm_sec == DD(field[1] + 4)) { session->newdata.epy = safe_atof(field[2]); session->newdata.epx = safe_atof(field[3]); session->newdata.epv = safe_atof(field[4]); gpsd_log(&session->context->errout, LOG_DATA, "GBS: epx=%.2f epy=%.2f epv=%.2f\n", session->newdata.epx, session->newdata.epy, session->newdata.epv); return HERR_SET | VERR_SET; } else { gpsd_log(&session->context->errout, LOG_PROG, "second in $GPGBS error estimates doesn't match.\n"); return 0; } } static gps_mask_t processZDA(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 u-blox 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 = 0; if (field[1][0] == '\0' || field[2][0] == '\0' || field[3][0] == '\0' || field[4][0] == '\0') { gpsd_log(&session->context->errout, LOG_WARN, "ZDA fields are empty\n"); } else { int year, mon, mday, century; merge_hhmmss(field[1], session); /* * We don't register fractional time here because want to leave * ZDA out of end-of-cycle detection. Some devices sensibly emit it only * when they have a fix, so watching for it can make them look * like they have a variable fix reporting cycle. */ year = atoi(field[4]); mon = atoi(field[3]); mday = atoi(field[2]); century = year - year % 100; if ( (1900 > year ) || (2200 < year ) ) { gpsd_log(&session->context->errout, LOG_WARN, "malformed ZDA year: %s\n", field[4]); } else if ( (1 > mon ) || (12 < mon ) ) { gpsd_log(&session->context->errout, LOG_WARN, "malformed ZDA month: %s\n", field[3]); } else if ( (1 > mday ) || (31 < mday ) ) { gpsd_log(&session->context->errout, LOG_WARN, "malformed ZDA day: %s\n", field[2]); } else { gpsd_century_update(session, century); session->nmea.date.tm_year = year - 1900; session->nmea.date.tm_mon = mon - 1; session->nmea.date.tm_mday = mday; mask = TIME_SET; } }; return mask; } static gps_mask_t processHDT(int c UNUSED, char *field[], struct gps_device_t *session) { /* * $HEHDT,341.8,T*21 * * HDT,x.x*hh * * The only data field is true heading in degrees. * The following field is required to be 'T' indicating a true heading. * It is followed by a mandatory nmea_checksum. */ gps_mask_t mask; mask = ONLINE_SET; session->gpsdata.attitude.heading = safe_atof(field[1]); session->gpsdata.attitude.mag_st = '\0'; session->gpsdata.attitude.pitch = NAN; session->gpsdata.attitude.pitch_st = '\0'; session->gpsdata.attitude.roll = NAN; 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.mag_len = NAN; session->gpsdata.attitude.mag_x = NAN; 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; session->gpsdata.attitude.temp = NAN; session->gpsdata.attitude.depth = NAN; mask |= (ATTITUDE_SET); gpsd_log(&session->context->errout, LOG_RAW, "time %.3f, heading %lf.\n", session->newdata.time, session->gpsdata.attitude.heading); return mask; } static gps_mask_t processDBT(int c UNUSED, char *field[], struct gps_device_t *session) { /* * $SDDBT,7.7,f,2.3,M,1.3,F*05 * 1) Depth below sounder in feet * 2) Fixed value 'f' indicating feet * 3) Depth below sounder in meters * 4) Fixed value 'M' indicating meters * 5) Depth below sounder in fathoms * 6) Fixed value 'F' indicating fathoms * 7) Checksum. * * In real-world sensors, sometimes not all three conversions are reported. */ gps_mask_t mask; mask = ONLINE_SET; if (field[3][0] != '\0') { session->newdata.altitude = -safe_atof(field[3]); mask |= (ALTITUDE_SET); } else if (field[1][0] != '\0') { session->newdata.altitude = -safe_atof(field[1]) / METERS_TO_FEET; mask |= (ALTITUDE_SET); } else if (field[5][0] != '\0') { session->newdata.altitude = -safe_atof(field[5]) / METERS_TO_FATHOMS; mask |= (ALTITUDE_SET); } if ((mask & ALTITUDE_SET) != 0) { if (session->newdata.mode < MODE_3D) { session->newdata.mode = MODE_3D; mask |= MODE_SET; } } /* * Hack: We report depth below keep as negative altitude because there's * no better place to put it. Should work in practice as nobody is * likely to be operating a depth sounder at varying altitudes. */ gpsd_log(&session->context->errout, LOG_RAW, "mode %d, depth %lf.\n", session->newdata.mode, session->newdata.altitude); return mask; } static gps_mask_t processTXT(int count, char *field[], struct gps_device_t *session) /* GPS Text message */ { /* * $GNTXT,01,01,01,PGRM inv format*2A * 1 Number of sentences for full data * 1 Sentence 1 of 1 * 01 Message type * 00 - error * 01 - warning * 02 - notice * 07 - user * PGRM inv format ASCII text * * Can occur with talker IDs: * BD (Beidou), * GA (Galileo), * GB (Beidou), * GL (GLONASS), * GN (GLONASS, any combination GNSS), * GP (GPS, SBAS, QZSS), * QZ (QZSS). */ gps_mask_t mask = 0; int msgType = 0; char *msgType_txt = "Unknown"; if ( 5 != count) { return 0; } /* set something, so it won't look like an unknown sentence */ mask |= ONLINE_SET; msgType = atoi(field[3]); switch ( msgType ) { case 0: msgType_txt = "Error"; break; case 1: msgType_txt = "Warning"; break; case 2: msgType_txt = "Notice"; break; case 7: msgType_txt = "User"; break; } /* maximum text lenght unknown, guess 80 */ gpsd_log(&session->context->errout, LOG_WARN, "TXT: %.10s: %.80s\n", msgType_txt, field[4]); return mask; } #ifdef TNT_ENABLE 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. $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 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; session->gpsdata.attitude.heading = safe_atof(field[1]); session->gpsdata.attitude.mag_st = *field[2]; session->gpsdata.attitude.pitch = safe_atof(field[3]); session->gpsdata.attitude.pitch_st = *field[4]; session->gpsdata.attitude.roll = safe_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 = safe_atof(field[7]); session->gpsdata.attitude.mag_len = NAN; session->gpsdata.attitude.mag_x = safe_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; session->gpsdata.attitude.temp = NAN; session->gpsdata.attitude.depth = NAN; mask |= (ATTITUDE_SET); gpsd_log(&session->context->errout, 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) { /* * 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 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; session->gpsdata.attitude.heading = safe_atof(field[1]); session->gpsdata.attitude.mag_st = '\0'; session->gpsdata.attitude.pitch = safe_atof(field[2]); session->gpsdata.attitude.pitch_st = '\0'; session->gpsdata.attitude.roll = safe_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 = safe_atof(field[4]); session->gpsdata.attitude.depth = safe_atof(field[5]) / METERS_TO_FEET; session->gpsdata.attitude.mag_len = safe_atof(field[6]); session->gpsdata.attitude.mag_x = safe_atof(field[7]); session->gpsdata.attitude.mag_y = safe_atof(field[8]); session->gpsdata.attitude.mag_z = safe_atof(field[9]); session->gpsdata.attitude.acc_len = safe_atof(field[10]); session->gpsdata.attitude.acc_x = safe_atof(field[11]); session->gpsdata.attitude.acc_y = safe_atof(field[12]); session->gpsdata.attitude.acc_z = safe_atof(field[13]); session->gpsdata.attitude.gyro_x = safe_atof(field[15]); session->gpsdata.attitude.gyro_y = safe_atof(field[16]); mask |= (ATTITUDE_SET); gpsd_log(&session->context->errout, LOG_RAW, "Heading %lf.\n", session->gpsdata.attitude.heading); return mask; } #endif /* OCEANSERVER_ENABLE */ #ifdef ASHTECH_ENABLE /* Ashtech sentences take this format: * $PASHDR,type[,val[,val]]*CS * type is an alphabetic subsentence type * * Oxford Technical Solutions (OXTS) also uses the $PASHR sentence, * but with a very different sentence contents: * $PASHR,HHMMSS.SSS,HHH.HH,T,RRR.RR,PPP.PP,aaa.aa,r.rrr,p.ppp,h.hhh,Q1,Q2*CS * * so field 1 in ASHTECH is always alphabetic and numeric in OXTS * FIXME: decode OXTS $PASHDR * */ 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, "%s ver %s", field[2], field[3]); gpsd_log(&session->context->errout, 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_IS; if (0 == strlen(field[2])) { /* empty first field means no 3D fix is available */ session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; } else { /* if we make it this far, we at least have a 3D fix */ session->newdata.mode = MODE_3D; if (1 == atoi(field[2])) session->gpsdata.status = STATUS_DGPS_FIX; else session->gpsdata.status = STATUS_FIX; session->gpsdata.satellites_used = atoi(field[3]); merge_hhmmss(field[4], session); register_fractional_time(field[0], field[4], session); do_lat_lon(&field[5], &session->newdata); session->newdata.altitude = safe_atof(field[9]); session->newdata.track = safe_atof(field[11]); session->newdata.speed = safe_atof(field[12]) / MPS_TO_KPH; session->newdata.climb = safe_atof(field[13]); session->gpsdata.dop.pdop = safe_atof(field[14]); session->gpsdata.dop.hdop = safe_atof(field[15]); session->gpsdata.dop.vdop = safe_atof(field[16]); session->gpsdata.dop.tdop = safe_atof(field[17]); mask |= (TIME_SET | LATLON_SET | ALTITUDE_SET); mask |= (SPEED_SET | TRACK_SET | CLIMB_SET); mask |= DOP_SET; gpsd_log(&session->context->errout, 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\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); } } else if (0 == strcmp("SAT", field[1])) { /* Satellite Status */ struct satellite_t *sp; int i, n = session->gpsdata.satellites_visible = atoi(field[2]); session->gpsdata.satellites_used = 0; for (i = 0, sp = session->gpsdata.skyview; sp < session->gpsdata.skyview + n; sp++, i++) { sp->PRN = (short)atoi(field[3 + i * 5 + 0]); sp->azimuth = (short)atoi(field[3 + i * 5 + 1]); sp->elevation = (short)atoi(field[3 + i * 5 + 2]); sp->ss = safe_atof(field[3 + i * 5 + 3]); sp->used = false; if (field[3 + i * 5 + 4][0] == 'U') { sp->used = true; session->gpsdata.satellites_used++; } } gpsd_log(&session->context->errout, LOG_DATA, "PASHR,SAT: used=%d\n", session->gpsdata.satellites_used); session->gpsdata.skyview_time = NAN; mask |= SATELLITE_SET | USED_IS; } return mask; } #endif /* ASHTECH_ENABLE */ #ifdef MTK3301_ENABLE static gps_mask_t processMTK3301(int c UNUSED, char *field[], struct gps_device_t *session) { int msg, reason; msg = atoi(&(session->nmea.field[0])[4]); switch (msg) { case 001: /* ACK / NACK */ reason = atoi(field[2]); if (atoi(field[1]) == -1) gpsd_log(&session->context->errout, LOG_WARN, "MTK NACK: unknown sentence\n"); else if (reason < 3) { const char *mtk_reasons[] = { "Invalid", "Unsupported", "Valid but Failed", "Valid success" }; gpsd_log(&session->context->errout, LOG_WARN, "MTK NACK: %s, reason: %s\n", field[1], mtk_reasons[reason]); } else gpsd_log(&session->context->errout, LOG_DATA, "MTK ACK: %s\n", field[1]); return ONLINE_SET; case 424: /* PPS pulse width response */ /* * Response will look something like: $PMTK424,0,0,1,0,69*12 * The pulse width is in field 5 (69 in this example). This * sentence is poorly documented at: * http://www.trimble.com/embeddedsystems/condor-gps-module.aspx?dtID=documentation * * Packet Type: 324 PMTK_API_SET_OUTPUT_CTL * Packet meaning * Write the TSIP / antenna / PPS configuration data to the Flash memory. * DataField [Data0]:TSIP Packet[on/off] * 0 - Disable TSIP output (Default). * 1 - Enable TSIP output. * [Data1]:Antenna Detect[on/off] * 0 - Disable antenna detect function (Default). * 1 - Enable antenna detect function. * [Data2]:PPS on/off * 0 - Disable PPS function. * 1 - Enable PPS function (Default). * [Data3]:PPS output timing * 0 - Always output PPS (Default). * 1 - Only output PPS when GPS position is fixed. * [Data4]:PPS pulse width * 1~16367999: 61 ns~(61x 16367999) ns (Default = 69) * * The documentation does not give the units of the data field. * Andy Walls says: * * "The best I can figure using an oscilloscope, is that it is * in units of 16.368000 MHz clock cycles. It may be * different for any other unit other than the Trimble * Condor. 69 cycles / 16368000 cycles/sec = 4.216 microseconds * [which is the pulse width I have observed]" * * Support for this theory comes from the fact that crystal * TXCOs with a 16.368MHZ period are commonly available from * multiple vendors. Furthermore, 61*69 = 4209, which is * close to the observed cycle time and suggests that the * documentation is trying to indicate 61ns units. * * He continues: * * "I chose [127875] because to divides 16368000 nicely and the * pulse width is close to 1/100th of a second. Any number * the user wants to use would be fine. 127875 cycles / * 16368000 cycles/second = 1/128 seconds = 7.8125 * milliseconds" */ /* too short? Make it longer */ if (atoi(field[5]) < 127875) (void)nmea_send(session, "$PMTK324,0,0,1,0,127875"); return ONLINE_SET; case 705: /* return device subtype */ (void)strlcat(session->subtype, field[1], sizeof(session->subtype)); (void)strlcat(session->subtype, "-", sizeof(session->subtype)); (void)strlcat(session->subtype, field[2], sizeof(session->subtype)); return ONLINE_SET; default: gpsd_log(&session->context->errout, LOG_PROG, "MTK: unknown msg: %d\n", msg); return ONLINE_SET; /* ignore */ } } #endif /* MTK3301_ENABLE */ /************************************************************************** * * Entry points begin here * **************************************************************************/ 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 { char *name; int nf; /* minimum number of fields required to parse */ bool cycle_continue; /* cycle continuer? */ nmea_decoder decoder; } nmea_phrase[] = { {"PGRMC", 0, false, NULL}, /* ignore Garmin Sensor Config */ {"PGRME", 7, false, processPGRME}, {"PGRMI", 0, false, NULL}, /* ignore Garmin Sensor Init */ {"PGRMO", 0, false, 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. */ {"DBT", 7, true, processDBT}, {"GBS", 7, false, processGBS}, {"GGA", 13, false, processGGA}, {"GLL", 7, false, processGLL}, {"GSA", 17, false, processGSA}, {"GST", 8, false, processGST}, {"GSV", 0, false, processGSV}, {"HDT", 1, false, processHDT}, #ifdef OCEANSERVER_ENABLE {"OHPR", 18, false, processOHPR}, #endif /* OCEANSERVER_ENABLE */ #ifdef ASHTECH_ENABLE {"PASHR", 3, false, processPASHR}, /* general handler for Ashtech */ #endif /* ASHTECH_ENABLE */ #ifdef MTK3301_ENABLE {"PMTK", 3, false, processMTK3301}, /* for some reason thhe parser no longer triggering on leading chars */ {"PMTK001", 3, false, processMTK3301}, {"PMTK424", 3, false, processMTK3301}, {"PMTK705", 3, false, processMTK3301}, #endif /* MTK3301_ENABLE */ #ifdef TNT_ENABLE {"PTNTHTM", 9, false, processTNTHTM}, #endif /* TNT_ENABLE */ {"RMC", 8, false, processRMC}, {"TXT", 5, false, processTXT}, {"ZDA", 4, false, processZDA}, {"VTG", 0, false, NULL}, /* ignore Velocity Track made Good */ }; int count; gps_mask_t retval = 0; unsigned int i, thistag; char *p, *s, *e; volatile char *t; /* * We've had reports that on the Garmin GPS-10 the device sometimes * (1:1000 or so) sends garbage packets that have a valid checksum * but are like 2 successive NMEA packets merged together in one * with some fields lost. Usually these are much longer than the * legal limit for NMEA, so we can cope by just tossing out overlong * packets. This may be a generic bug of all Garmin chipsets. */ if (strlen(sentence) > NMEA_MAX) { gpsd_log(&session->context->errout, LOG_WARN, "Overlong packet of %zd chars rejected.\n", strlen(sentence)); return ONLINE_SET; } /* make an editable copy of the sentence */ (void)strlcpy((char *)session->nmea.fieldcopy, sentence, sizeof(session->nmea.fieldcopy) - 1); /* discard the checksum part */ for (p = (char *)session->nmea.fieldcopy; (*p != '*') && (*p >= ' ');) ++p; if (*p == '*') *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->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->nmea.field[count] = p; /* we have a field. record it */ if ((p = strchr(p, ',')) != NULL) { /* search for the next delimiter */ *p = '\0'; /* replace it with a NUL */ count++; /* bump the counters and continue */ p++; } } /* point remaining fields at empty string, just in case */ for (i = (unsigned int)count; i < (unsigned)(sizeof(session->nmea.field) / sizeof(session->nmea.field[0])); i++) session->nmea.field[i] = e; /* sentences handlers will tell us when they have fractional time */ session->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) { s = session->nmea.field[0]; if (strlen(nmea_phrase[i].name) == 3) 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->nmea.field, session); if (nmea_phrase[i].cycle_continue) session->nmea.cycle_continue = true; /* * Must force this to be nz, as we're going to rely on a zero * value to mean "no previous tag" later. */ thistag = i + 1; } else retval = ONLINE_SET; /* unknown sentence */ break; } } /* prevent overaccumulation of sat reports */ if (!str_starts_with(session->nmea.field[0] + 2, "GSV")) session->nmea.last_gsv_talker = '\0'; /* timestamp recording for fixes happens here */ if ((retval & TIME_SET) != 0) { session->newdata.time = gpsd_utc_resolve(session); /* * WARNING: This assumes time is always field 0, and that field 0 * is a timestamp whenever TIME_SET is set. */ gpsd_log(&session->context->errout, LOG_DATA, "%s time is %2f = %d-%02d-%02dT%02d:%02d:%02.2fZ\n", session->nmea.field[0], session->newdata.time, 1900 + session->nmea.date.tm_year, session->nmea.date.tm_mon + 1, session->nmea.date.tm_mday, session->nmea.date.tm_hour, session->nmea.date.tm_min, session->nmea.date.tm_sec + session->nmea.subseconds); /* * If we have time and PPS is available, assume we have good time. * Because this is a generic driver we don't really have enough * information for a sharper test, so we'll leave it up to the * PPS code to do its own sanity filtering. */ retval |= PPSTIME_IS; } /* * The end-of-cycle detector. This code depends on just one * assumption: if a sentence with a timestamp occurs just before * start of cycle, then it is always good to trigger a report on * that sentence in the future. For devices with a fixed cycle * this should work perfectly, locking in detection after one * cycle. Most split-cycle devices (Garmin 48, for example) will * work fine. Problems will only arise if a a sentence that * occurs just befiore timestamp increments also occurs in * mid-cycle, as in the Garmin eXplorist 210; those might jitter. */ if (session->nmea.latch_frac_time) { gpsd_log(&session->context->errout, LOG_PROG, "%s sentence timestamped %.2f.\n", session->nmea.field[0], session->nmea.this_frac_time); if (!GPS_TIME_EQUAL (session->nmea.this_frac_time, session->nmea.last_frac_time)) { uint lasttag = session->nmea.lasttag; retval |= CLEAR_IS; gpsd_log(&session->context->errout, LOG_PROG, "%s starts a reporting cycle.\n", session->nmea.field[0]); /* * Have we seen a previously timestamped NMEA tag? * If so, designate as end-of-cycle marker. * But not if there are continuation sentences; * those get sorted after the last timestamped sentence */ if (lasttag > 0 && (session->nmea.cycle_enders & (1 << lasttag)) == 0 && !session->nmea.cycle_continue) { session->nmea.cycle_enders |= (1 << lasttag); gpsd_log(&session->context->errout, LOG_PROG, "tagged %s as a cycle ender.\n", nmea_phrase[lasttag - 1].name); } } } else { /* extend the cycle to an un-timestamped sentence? */ if ((session->nmea.lasttag & session->nmea.cycle_enders) != 0) gpsd_log(&session->context->errout, LOG_PROG, "%s is just after a cycle ender.\n", session->nmea.field[0]); if (session->nmea.cycle_continue) { gpsd_log(&session->context->errout, LOG_PROG, "%s extends the reporting cycle.\n", session->nmea.field[0]); session->nmea.cycle_enders &=~ (1 << session->nmea.lasttag); session->nmea.cycle_enders |= (1 << thistag); } } /* here's where we check for end-of-cycle */ if ((session->nmea.latch_frac_time || session->nmea.cycle_continue) && (session->nmea.cycle_enders & (1 << thistag))!=0) { gpsd_log(&session->context->errout, LOG_PROG, "%s ends a reporting cycle.\n", session->nmea.field[0]); retval |= REPORT_IS; } if (session->nmea.latch_frac_time) session->nmea.lasttag = thistag; /* we might have a reliable end-of-cycle */ if (session->nmea.cycle_enders != 0) session->cycle_end_reliable = true; return retval; } #endif /* NMEA_ENABLE */ void nmea_add_checksum(char *sentence) /* add NMEA checksum to a possibly *-terminated sentence */ { unsigned char sum = '\0'; char c, *p = sentence; if (*p == '$' || *p == '!') { p++; } while (((c = *p) != '*') && (c != '\0')) { sum ^= c; p++; } *p++ = '*'; (void)snprintf(p, 5, "%02X\r\n", (unsigned)sum); } ssize_t nmea_write(struct gps_device_t *session, char *buf, size_t len UNUSED) /* ship a command to the GPS, adding * and correct checksum */ { (void)strlcpy(session->msgbuf, buf, sizeof(session->msgbuf)); if (session->msgbuf[0] == '$') { (void)strlcat(session->msgbuf, "*", sizeof(session->msgbuf)); nmea_add_checksum(session->msgbuf); } else (void)strlcat(session->msgbuf, "\r\n", sizeof(session->msgbuf)); session->msgbuflen = strlen(session->msgbuf); return gpsd_write(session, session->msgbuf, session->msgbuflen); } 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_end(ap); return nmea_write(session, buf, strlen(buf)); } gpsd-3.15/driver_nmea2000.c0000664000175000017500000016101212532614165013514 0ustar esresr/* * NMEA2000 over CAN. * * This file is Copyright (c) 2012 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gpsd.h" #if defined(NMEA2000_ENABLE) #include "driver_nmea2000.h" #include "bits.h" #include #include #define LOG_FILE 1 #define NMEA2000_NETS 4 #define NMEA2000_UNITS 256 #define CAN_NAMELEN 32 #define MIN(a,b) ((a < b) ? a : b) #define NMEA2000_DEBUG_AIS 0 #define NMEA2000_FAST_DEBUG 0 static struct gps_device_t *nmea2000_units[NMEA2000_NETS][NMEA2000_UNITS]; static char can_interface_name[NMEA2000_NETS][CAN_NAMELEN]; typedef struct PGN { unsigned int pgn; unsigned int fast; unsigned int type; gps_mask_t (* func)(unsigned char *bu, int len, struct PGN *pgn, struct gps_device_t *session); const char *name; } PGN; #if LOG_FILE FILE *logFile = NULL; #endif /* of if LOG_FILE */ extern bool __attribute__ ((weak)) gpsd_add_device(const char *device_name, bool flag_nowait); #define SHIFT32 0x100000000l static int scale_int(int32_t var, const int64_t factor) { int64_t ret; ret = var; ret *= factor; ret >>= 32; return((int)ret); } static void print_data(struct gps_context_t *context, unsigned char *buffer, int len, PGN *pgn) { #ifdef LIBGPS_DEBUG if ((libgps_debuglevel >= LOG_IO) != 0) { int l1, l2, ptr; char bu[128]; ptr = 0; l2 = sprintf(&bu[ptr], "got data:%6u:%3d: ", pgn->pgn, len); ptr += l2; for (l1=0;l1errout, LOG_IO,"%s\n", bu); ptr = 0; l2 = sprintf(&bu[ptr], " : "); ptr += l2; } l2 = sprintf(&bu[ptr], "%02ux ", (unsigned int)buffer[l1]); ptr += l2; } gpsd_log(&context->errout, LOG_IO,"%s\n", bu); } #else (void)context; (void)buffer; (void)len; (void)pgn; #endif } static gps_mask_t get_mode(struct gps_device_t *session) { if (session->driver.nmea2000.mode_valid & 1) { session->newdata.mode = session->driver.nmea2000.mode; } else { session->newdata.mode = MODE_NOT_SEEN; } if (session->driver.nmea2000.mode_valid & 2) { return MODE_SET | USED_IS; } else { return MODE_SET; } } static int decode_ais_header(struct gps_context_t *context, unsigned char *bu, int len, struct ais_t *ais, unsigned int mask) { if (len > 4) { ais->type = (unsigned int) ( bu[0] & 0x3f); ais->repeat = (unsigned int) ((bu[0] >> 6) & 0x03); ais->mmsi = (unsigned int) getleu32(bu, 1); ais->mmsi &= mask; gpsd_log(&context->errout, LOG_INF, "NMEA2000 AIS message type %u, MMSI %09d:\n", ais->type, ais->mmsi); return(1); } else { ais->type = 0; ais->repeat = 0; ais->mmsi = 0; gpsd_log(&context->errout, LOG_ERROR, "NMEA2000 AIS message type %u, too short message.\n", ais->type); } return(0); } static void decode_ais_channel_info(unsigned char *bu, int len, unsigned int offset, struct gps_device_t *session) { unsigned int pos, bpos; uint16_t x; pos = offset / 8; bpos = offset % 8; if (pos >= (unsigned int)len) { session->driver.aivdm.ais_channel = 'A'; return; } x = getleu16(bu, pos); x = (uint16_t)((x >> bpos) & 0x1f); switch (x) { case 1: case 3: session->driver.aivdm.ais_channel = 'B'; break; default: session->driver.aivdm.ais_channel = 'A'; break; } return; } static int ais_turn_rate(int rate) { if (rate < 0) { return(-ais_turn_rate(-rate)); } return((int)(4.733 * sqrt(rate * RAD_2_DEG * .0001 * 60.0))); } static double ais_direction(unsigned int val, double scale) { if ((val == 0xffff) && (scale == 1.0)) { return(511.0); } return(val * RAD_2_DEG * 0.0001 * scale); } /* * PGN 59392: ISO Acknowledgment */ static gps_mask_t hnd_059392(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 60928: ISO Address Claim */ static gps_mask_t hnd_060928(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 126208: NMEA Command/Request/Acknowledge */ static gps_mask_t hnd_126208(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 126464: ISO Transmit/Receive PGN List */ static gps_mask_t hnd_126464(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 126996: ISO Product Information */ static gps_mask_t hnd_126996(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 127258: GNSS Magnetic Variation */ static gps_mask_t hnd_127258(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 129025: GNSS Position Rapid Update */ static gps_mask_t hnd_129025(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); session->newdata.latitude = getles32(bu, 0) * 1e-7; session->newdata.longitude = getles32(bu, 4) * 1e-7; return LATLON_SET | get_mode(session); } /* * PGN 129026: GNSS COG and SOG Rapid Update */ static gps_mask_t hnd_129026(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); session->driver.nmea2000.sid[0] = bu[0]; session->newdata.track = getleu16(bu, 2) * 1e-4 * RAD_2_DEG; session->newdata.speed = getleu16(bu, 4) * 1e-2; return SPEED_SET | TRACK_SET | get_mode(session); } /* * PGN 126992: GNSS System Time */ static gps_mask_t hnd_126992(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { //uint8_t sid; //uint8_t source; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); //sid = bu[0]; //source = bu[1] & 0x0f; session->newdata.time = getleu16(bu, 2)*24*60*60 + getleu32(bu, 4)/1e4; return TIME_SET | get_mode(session); } static const int mode_tab[] = {MODE_NO_FIX, MODE_2D, MODE_3D, MODE_NO_FIX, MODE_NO_FIX, MODE_NO_FIX, MODE_NO_FIX, MODE_NO_FIX}; /* * PGN 129539: GNSS DOPs */ static gps_mask_t hnd_129539(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { gps_mask_t mask; unsigned int req_mode; unsigned int act_mode; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); mask = 0; session->driver.nmea2000.sid[1] = bu[0]; session->driver.nmea2000.mode_valid |= 1; req_mode = (unsigned int)((bu[1] >> 0) & 0x07); act_mode = (unsigned int)((bu[1] >> 3) & 0x07); /* This is a workaround for some GARMIN plotter, actual mode auto makes no sense for me! */ if ((act_mode == 3) && (req_mode != 3)) { act_mode = req_mode; } session->driver.nmea2000.mode = mode_tab[act_mode]; session->gpsdata.dop.hdop = getleu16(bu, 2) * 1e-2; session->gpsdata.dop.vdop = getleu16(bu, 4) * 1e-2; session->gpsdata.dop.tdop = getleu16(bu, 6) * 1e-2; mask |= DOP_SET; gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d): sid:%02x hdop:%5.2f vdop:%5.2f tdop:%5.2f\n", pgn->pgn, session->driver.nmea2000.unit, session->driver.nmea2000.sid[1], session->gpsdata.dop.hdop, session->gpsdata.dop.vdop, session->gpsdata.dop.tdop); return mask | get_mode(session); } /* * PGN 129540: GNSS Satellites in View */ static gps_mask_t hnd_129540(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { int l1; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); session->driver.nmea2000.sid[2] = bu[0]; session->gpsdata.satellites_visible = (int)bu[2]; memset(session->gpsdata.skyview, '\0', sizeof(session->gpsdata.skyview)); for (l1=0;l1gpsdata.satellites_visible;l1++) { int svt; double azi, elev, snr; elev = getles16(bu, 3+12*l1+1) * 1e-4 * RAD_2_DEG; azi = getleu16(bu, 3+12*l1+3) * 1e-4 * RAD_2_DEG; snr = getles16(bu, 3+12*l1+5) * 1e-2; svt = (int)(bu[3+12*l1+11] & 0x0f); session->gpsdata.skyview[l1].elevation = (short) (round(elev)); session->gpsdata.skyview[l1].azimuth = (short) (round(azi)); session->gpsdata.skyview[l1].ss = snr; session->gpsdata.skyview[l1].PRN = (short)bu[3+12*l1+0]; session->gpsdata.skyview[l1].used = false; if ((svt == 2) || (svt == 5)) { session->gpsdata.skyview[l1].used = true; } } session->driver.nmea2000.mode_valid |= 2; return SATELLITE_SET | USED_IS; } /* * PGN 129029: GNSS Positition Data */ static gps_mask_t hnd_129029(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { gps_mask_t mask; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); mask = 0; session->driver.nmea2000.sid[3] = bu[0]; session->newdata.time = getleu16(bu,1) * 24*60*60 + getleu32(bu, 3)/1e4; mask |= TIME_SET; session->newdata.latitude = getles64(bu, 7) * 1e-16; session->newdata.longitude = getles64(bu, 15) * 1e-16; mask |= LATLON_SET; session->newdata.altitude = getles64(bu, 23) * 1e-6; mask |= ALTITUDE_SET; // printf("mode %x %x\n", (bu[31] >> 4) & 0x0f, bu[31]); switch ((bu[31] >> 4) & 0x0f) { case 0: session->gpsdata.status = STATUS_NO_FIX; break; case 1: session->gpsdata.status = STATUS_FIX; break; case 2: session->gpsdata.status = STATUS_DGPS_FIX; break; case 3: case 4: case 5: session->gpsdata.status = STATUS_FIX; /* Is this correct ? */ break; default: session->gpsdata.status = STATUS_NO_FIX; break; } mask |= STATUS_SET; session->gpsdata.separation = getles32(bu, 38) / 100.0; session->newdata.altitude -= session->gpsdata.separation; session->gpsdata.satellites_used = (int)bu[33]; session->gpsdata.dop.hdop = getleu16(bu, 34) * 0.01; session->gpsdata.dop.pdop = getleu16(bu, 36) * 0.01; mask |= DOP_SET; return mask | get_mode(session); } /* * PGN 129038: AIS Class A Position Report */ static gps_mask_t hnd_129038(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { struct ais_t *ais; ais = &session->gpsdata.ais; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); if (decode_ais_header(session->context, bu, len, ais, 0xffffffffU) != 0) { ais->type1.lon = (int) scale_int(getles32(bu, 5), (int64_t)(SHIFT32 *.06L)); ais->type1.lat = (int) scale_int(getles32(bu, 9), (int64_t)(SHIFT32 *.06L)); ais->type1.accuracy = (bool) ((bu[13] >> 0) & 0x01); ais->type1.raim = (bool) ((bu[13] >> 1) & 0x01); ais->type1.second = (unsigned int) ((bu[13] >> 2) & 0x3f); ais->type1.course = (unsigned int) ais_direction((unsigned int)getleu16(bu, 14), 10.0); ais->type1.speed = (unsigned int) (getleu16(bu, 16) * MPS_TO_KNOTS * 0.01 / 0.1); ais->type1.radio = (unsigned int) (getleu32(bu, 18) & 0x7ffff); ais->type1.heading = (unsigned int) ais_direction((unsigned int)getleu16(bu, 21), 1.0); ais->type1.turn = ais_turn_rate((int)getles16(bu, 23)); ais->type1.status = (unsigned int) ((bu[25] >> 0) & 0x0f); ais->type1.maneuver = 0; /* Not transmitted ???? */ decode_ais_channel_info(bu, len, 163, session); return(ONLINE_SET | AIS_SET); } return(0); } /* * PGN 129039: AIS Class B Position Report */ static gps_mask_t hnd_129039(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { struct ais_t *ais; ais = &session->gpsdata.ais; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); if (decode_ais_header(session->context, bu, len, ais, 0xffffffffU) != 0) { ais->type18.lon = (int) scale_int(getles32(bu, 5), (int64_t)(SHIFT32 *.06L)); ais->type18.lat = (int) scale_int(getles32(bu, 9), (int64_t)(SHIFT32 *.06L)); ais->type18.accuracy = (bool) ((bu[13] >> 0) & 0x01); ais->type18.raim = (bool) ((bu[13] >> 1) & 0x01); ais->type18.second = (unsigned int) ((bu[13] >> 2) & 0x3f); ais->type18.course = (unsigned int) ais_direction((unsigned int) getleu16(bu, 14), 10.0); ais->type18.speed = (unsigned int) (getleu16(bu, 16) * MPS_TO_KNOTS * 0.01 / 0.1); ais->type18.radio = (unsigned int) (getleu32(bu, 18) & 0x7ffff); ais->type18.heading = (unsigned int) ais_direction((unsigned int) getleu16(bu, 21), 1.0); ais->type18.reserved = 0; ais->type18.regional = (unsigned int) ((bu[24] >> 0) & 0x03); ais->type18.cs = (bool) ((bu[24] >> 2) & 0x01); ais->type18.display = (bool) ((bu[24] >> 3) & 0x01); ais->type18.dsc = (bool) ((bu[24] >> 4) & 0x01); ais->type18.band = (bool) ((bu[24] >> 5) & 0x01); ais->type18.msg22 = (bool) ((bu[24] >> 6) & 0x01); ais->type18.assigned = (bool) ((bu[24] >> 7) & 0x01); decode_ais_channel_info(bu, len, 163, session); return(ONLINE_SET | AIS_SET); } return(0); } /* * PGN 129040: AIS Class B Extended Position Report */ /* No test case for this message at the moment */ static gps_mask_t hnd_129040(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { struct ais_t *ais; ais = &session->gpsdata.ais; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); if (decode_ais_header(session->context, bu, len, ais, 0xffffffffU) != 0) { uint16_t length, beam, to_bow, to_starboard; int l; ais->type19.lon = (int) scale_int(getles32(bu, 5), (int64_t)(SHIFT32 *.06L)); ais->type19.lat = (int) scale_int(getles32(bu, 9), (int64_t)(SHIFT32 *.06L)); ais->type19.accuracy = (bool) ((bu[13] >> 0) & 0x01); ais->type19.raim = (bool) ((bu[13] >> 1) & 0x01); ais->type19.second = (unsigned int) ((bu[13] >> 2) & 0x3f); ais->type19.course = (unsigned int) ais_direction((unsigned int) getleu16(bu, 14), 10.0); ais->type19.speed = (unsigned int) (getleu16(bu, 16) * MPS_TO_KNOTS * 0.01 / 0.1); ais->type19.reserved = (unsigned int) ((bu[18] >> 0) & 0xff); ais->type19.regional = (unsigned int) ((bu[19] >> 0) & 0x0f); ais->type19.shiptype = (unsigned int) ((bu[20] >> 0) & 0xff); ais->type19.heading = (unsigned int) ais_direction((unsigned int) getleu16(bu, 21), 1.0); length = getleu16(bu, 24); beam = getleu16(bu, 26); to_starboard = getleu16(bu, 28); to_bow = getleu16(bu, 30); if ((length == 0xffff) || (to_bow == 0xffff)) { length = 0; to_bow = 0; } if ((beam == 0xffff) || (to_starboard == 0xffff)) { beam = 0; to_starboard = 0; } ais->type19.to_bow = (unsigned int) (to_bow/10); ais->type19.to_stern = (unsigned int) ((length-to_bow)/10); ais->type19.to_port = (unsigned int) ((beam-to_starboard)/10); ais->type19.to_starboard = (unsigned int) (to_starboard/10); ais->type19.epfd = (unsigned int) ((bu[23] >> 4) & 0x0f); ais->type19.dte = (unsigned int) ((bu[52] >> 0) & 0x01); ais->type19.assigned = (bool) ((bu[52] >> 1) & 0x01); for (l=0;ltype19.shipname[l] = (char) bu[32+l]; } ais->type19.shipname[AIS_SHIPNAME_MAXLEN] = (char) 0; decode_ais_channel_info(bu, len, 422, session); return(ONLINE_SET | AIS_SET); } return(0); } /* * PGN 129793: AIS UTC and Date Report */ static gps_mask_t hnd_129793(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { struct ais_t *ais; ais = &session->gpsdata.ais; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); if (decode_ais_header(session->context, bu, len, ais, 0xffffffffU) != 0) { uint32_t time; uint32_t date; time_t date1; struct tm date2; ais->type4.lon = (int) scale_int(getles32(bu, 5), (int64_t)(SHIFT32 *.06L)); ais->type4.lat = (int) scale_int(getles32(bu, 9), (int64_t)(SHIFT32 *.06L)); ais->type4.accuracy = (bool) ((bu[13] >> 0) & 0x01); ais->type4.raim = (bool) ((bu[13] >> 1) & 0x01); time = getleu32(bu, 14); if (time != 0xffffffff) { time = time / 10000; ais->type4.second = time % 60; time = time / 60; ais->type4.minute = time % 60; time = time / 60; ais->type4.hour = time % 24; } else { ais->type4.second = AIS_SECOND_NOT_AVAILABLE; ais->type4.minute = AIS_MINUTE_NOT_AVAILABLE; ais->type4.hour = AIS_HOUR_NOT_AVAILABLE; } ais->type4.radio = (unsigned int) (getleu32(bu, 18) & 0x7ffff); date = getleu16(bu, 21); if (date != 0xffff) { date1 = (time_t)date * (24L *60L *60L); (void) gmtime_r(&date1, &date2); ais->type4.year = (unsigned int) (date2.tm_year+1900); ais->type4.month = (unsigned int) (date2.tm_mon+1); ais->type4.day = (unsigned int) (date2.tm_mday); } else { ais->type4.day = AIS_DAY_NOT_AVAILABLE; ais->type4.month = AIS_MONTH_NOT_AVAILABLE; ais->type4.year = AIS_YEAR_NOT_AVAILABLE; } ais->type4.epfd = (unsigned int) ((bu[23] >> 4) & 0x0f); decode_ais_channel_info(bu, len, 163, session); return(ONLINE_SET | AIS_SET); } return(0); } /* * PGN 129794: AIS Class A Static and Voyage Related Data */ static gps_mask_t hnd_129794(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { struct ais_t *ais; ais = &session->gpsdata.ais; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); if (decode_ais_header(session->context, bu, len, ais, 0xffffffffU) != 0) { uint16_t length, beam, to_bow, to_starboard, date; int l; uint32_t time; time_t date1; struct tm date2; int cpy_stop; ais->type5.ais_version = (unsigned int) ((bu[73] >> 0) & 0x03); ais->type5.imo = (unsigned int) getleu32(bu, 5); if (ais->type5.imo == 0xffffffffU) { ais->type5.imo = 0; } ais->type5.shiptype = (unsigned int) ((bu[36] >> 0) & 0xff); length = getleu16(bu, 37); beam = getleu16(bu, 39); to_starboard = getleu16(bu, 41); to_bow = getleu16(bu, 43); if ((length == 0xffff) || (to_bow == 0xffff)) { length = 0; to_bow = 0; } if ((beam == 0xffff) || (to_starboard == 0xffff)) { beam = 0; to_starboard = 0; } ais->type5.to_bow = (unsigned int) (to_bow/10); ais->type5.to_stern = (unsigned int) ((length-to_bow)/10); ais->type5.to_port = (unsigned int) ((beam-to_starboard)/10); ais->type5.to_starboard = (unsigned int) (to_starboard/10); ais->type5.epfd = (unsigned int) ((bu[73] >> 2) & 0x0f); date = getleu16(bu, 45); time = getleu32(bu, 47); date1 = (time_t) (date*24*60*60); (void) gmtime_r(&date1, &date2); ais->type5.month = (unsigned int) (date2.tm_mon+1); ais->type5.day = (unsigned int) (date2.tm_mday); ais->type5.minute = (unsigned int) (time/(10000*60)); ais->type5.hour = (unsigned int) (ais->type5.minute/60); ais->type5.minute = (unsigned int) (ais->type5.minute-(ais->type5.hour*60)); ais->type5.draught = (unsigned int) (getleu16(bu, 51)/10); ais->type5.dte = (unsigned int) ((bu[73] >> 6) & 0x01); for (l=0,cpy_stop=0;l<7;l++) { char next; next = (char) bu[9+l]; if ((next < ' ') || (next > 0x7e)) { cpy_stop = 1; } if (cpy_stop == 0) { ais->type5.callsign[l] = next; } else { ais->type5.callsign[l] = 0; } } ais->type5.callsign[7] = (char) 0; for (l=0,cpy_stop=0;l 0x7e)) { cpy_stop = 1; } if (cpy_stop == 0) { ais->type5.shipname[l] = next; } else { ais->type5.shipname[l] = 0; } } ais->type5.shipname[AIS_SHIPNAME_MAXLEN] = (char) 0; for (l=0,cpy_stop=0;l<20;l++) { char next; next = (char) bu[53+l]; if ((next < ' ') || (next > 0x7e)) { cpy_stop = 1; } if (cpy_stop == 0) { ais->type5.destination[l] = next; } else { ais->type5.destination[l] = 0; } } ais->type5.destination[20] = (char) 0; #if NMEA2000_DEBUG_AIS printf("AIS: MMSI: %09u\n", ais->mmsi); printf("AIS: name: %-20.20s i:%8u c:%-8.8s b:%6u s:%6u p:%6u s:%6u dr:%4.1f\n", ais->type5.shipname, ais->type5.imo, ais->type5.callsign, ais->type5.to_bow, ais->type5.to_stern, ais->type5.to_port, ais->type5.to_starboard, ais->type5.draught/10.0); printf("AIS: arival:%-20.20s at %02u-%02u-%04d %02u:%0u\n", ais->type5.destination, ais->type5.day, ais->type5.month, date2.tm_year+1900, ais->type5.hour, ais->type5.minute); #endif /* of #if NMEA2000_DEBUG_AIS */ decode_ais_channel_info(bu, len, 592, session); return(ONLINE_SET | AIS_SET); } return(0); } /* * PGN 129798: AIS SAR Aircraft Position Report */ /* No test case for this message at the moment */ static gps_mask_t hnd_129798(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { struct ais_t *ais; ais = &session->gpsdata.ais; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); if (decode_ais_header(session->context, bu, len, ais, 0xffffffffU) != 0) { ais->type9.lon = (int) scale_int(getles32(bu, 5), (int64_t)(SHIFT32 *.06L)); ais->type9.lat = (int) scale_int(getles32(bu, 9), (int64_t)(SHIFT32 *.06L)); ais->type9.accuracy = (bool) ((bu[13] >> 0) & 0x01); ais->type9.raim = (bool) ((bu[13] >> 1) & 0x01); ais->type9.second = (unsigned int) ((bu[13] >> 2) & 0x3f); ais->type9.course = (unsigned int) ais_direction((unsigned int) getleu16(bu, 14), 10.0); ais->type9.speed = (unsigned int) (getleu16(bu, 16) * MPS_TO_KNOTS * 0.01 / 0.1); ais->type9.radio = (unsigned int) (getleu32(bu, 18) & 0x7ffff); ais->type9.alt = (unsigned int) (getleu64(bu, 21)/1000000); ais->type9.regional = (unsigned int) ((bu[29] >> 0) & 0xff); ais->type9.dte = (unsigned int) ((bu[30] >> 0) & 0x01); /* ais->type9.spare = (bu[30] >> 1) & 0x7f; */ ais->type9.assigned = 0; /* Not transmitted ???? */ decode_ais_channel_info(bu, len, 163, session); return(ONLINE_SET | AIS_SET); } return(0); } /* * PGN 129802: AIS Safty Related Broadcast Message */ /* No test case for this message at the moment */ static gps_mask_t hnd_129802(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { struct ais_t *ais; ais = &session->gpsdata.ais; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); if (decode_ais_header(session->context, bu, len, ais, 0x3fffffff) != 0) { int l; /* ais->type14.channel = (bu[ 5] >> 0) & 0x1f; */ for (l=0;l<36;l++) { ais->type14.text[l] = (char) bu[6+l]; } ais->type14.text[36] = (char) 0; decode_ais_channel_info(bu, len, 40, session); return(ONLINE_SET | AIS_SET); } return(0); } /* * PGN 129809: AIS Class B CS Static Data Report, Part A */ static gps_mask_t hnd_129809(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { struct ais_t *ais; ais = &session->gpsdata.ais; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); if (decode_ais_header(session->context, bu, len, ais, 0xffffffffU) != 0) { int l; int index = session->driver.aivdm.context[0].type24_queue.index; struct ais_type24a_t *saveptr = &session->driver.aivdm.context[0].type24_queue.ships[index]; gpsd_log(&session->context->errout, LOG_PROG, "NMEA2000: AIS message 24A from %09u stashed.\n", ais->mmsi); for (l=0;ltype24.shipname[l] = (char) bu[ 5+l]; saveptr->shipname[l] = (char) bu[ 5+l]; } ais->type24.shipname[AIS_SHIPNAME_MAXLEN] = (char) 0; saveptr->shipname[AIS_SHIPNAME_MAXLEN] = (char) 0; saveptr->mmsi = ais->mmsi; index += 1; index %= MAX_TYPE24_INTERLEAVE; session->driver.aivdm.context[0].type24_queue.index = index; decode_ais_channel_info(bu, len, 200, session); ais->type24.part = part_a; return(ONLINE_SET | AIS_SET); } return(0); } /* * PGN 129810: AIS Class B CS Static Data Report, Part B */ static gps_mask_t hnd_129810(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { struct ais_t *ais; ais = &session->gpsdata.ais; print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); if (decode_ais_header(session->context, bu, len, ais, 0xffffffffU) != 0) { int l, i; ais->type24.shiptype = (unsigned int) ((bu[ 5] >> 0) & 0xff); for (l=0;l<7;l++) { ais->type24.vendorid[l] = (char) bu[ 6+l]; } ais->type24.vendorid[7] = (char) 0; for (l=0;l<7;l++) { ais->type24.callsign[l] = (char) bu[13+l]; } ais->type24.callsign[7] = (char )0; ais->type24.model = 0; ais->type24.serial = 0; if (AIS_AUXILIARY_MMSI(ais->mmsi)) { ais->type24.mothership_mmsi = (unsigned int) (getleu32(bu, 28)); } else { uint16_t length, beam, to_bow, to_starboard; length = getleu16(bu, 20); beam = getleu16(bu, 22); to_starboard = getleu16(bu, 24); to_bow = getleu16(bu, 26); if ((length == 0xffff) || (to_bow == 0xffff)) { length = 0; to_bow = 0; } if ((beam == 0xffff) || (to_starboard == 0xffff)) { beam = 0; to_starboard = 0; } ais->type24.dim.to_bow = (unsigned int) (to_bow/10); ais->type24.dim.to_stern = (unsigned int) ((length-to_bow)/10); ais->type24.dim.to_port = (unsigned int) ((beam-to_starboard)/10); ais->type24.dim.to_starboard = (unsigned int) (to_starboard/10); } for (i = 0; i < MAX_TYPE24_INTERLEAVE; i++) { if (session->driver.aivdm.context[0].type24_queue.ships[i].mmsi == ais->mmsi) { for (l=0;ltype24.shipname[l] = (char)(session->driver.aivdm.context[0].type24_queue.ships[i].shipname[l]); } ais->type24.shipname[AIS_SHIPNAME_MAXLEN] = (char) 0; gpsd_log(&session->context->errout, LOG_PROG, "NMEA2000: AIS 24B from %09u matches a 24A.\n", ais->mmsi); /* prevent false match if a 24B is repeated */ session->driver.aivdm.context[0].type24_queue.ships[i].mmsi = 0; #if NMEA2000_DEBUG_AIS printf("AIS: MMSI: %09u\n", ais->mmsi); printf("AIS: name: %-20.20s v:%-8.8s c:%-8.8s b:%6u s:%6u p:%6u s:%6u\n", ais->type24.shipname, ais->type24.vendorid, ais->type24.callsign, ais->type24.dim.to_bow, ais->type24.dim.to_stern, ais->type24.dim.to_port, ais->type24.dim.to_starboard); #endif /* of #if NMEA2000_DEBUG_AIS */ decode_ais_channel_info(bu, len, 264, session); ais->type24.part = both; return(ONLINE_SET | AIS_SET); } } #if NMEA2000_DEBUG_AIS printf("AIS: MMSI : %09u\n", ais->mmsi); printf("AIS: vendor: %-8.8s c:%-8.8s b:%6u s:%6u p:%6u s:%6u\n", ais->type24.vendorid, ais->type24.callsign, ais->type24.dim.to_bow, ais->type24.dim.to_stern, ais->type24.dim.to_port, ais->type24.dim.to_starboard); #endif /* of #if NMEA2000_DEBUG_AIS */ decode_ais_channel_info(bu, len, 264, session); ais->type24.part = part_b; return(ONLINE_SET | AIS_SET); } return(0); } /* * PGN 127506: PWR DC Detailed Status */ static gps_mask_t hnd_127506(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 127508: PWR Battery Status */ static gps_mask_t hnd_127508(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 127513: PWR Battery Configuration Status */ static gps_mask_t hnd_127513(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 127245: NAV Rudder */ static gps_mask_t hnd_127245(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 127250: NAV Vessel Heading */ static gps_mask_t hnd_127250(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { int aux; print_data(session->context, bu, len, pgn); session->gpsdata.attitude.heading = getleu16(bu, 1) * RAD_2_DEG * 0.0001; // printf("ATT 0:%8.3f\n",session->gpsdata.attitude.heading); aux = getles16(bu, 3); if (aux != 0x07fff) { session->gpsdata.attitude.heading += aux * RAD_2_DEG * 0.0001; } // printf("ATT 1:%8.3f %6x\n",session->gpsdata.attitude.heading, aux); aux = getles16(bu, 5); if (aux != 0x07fff) { session->gpsdata.attitude.heading += aux * RAD_2_DEG * 0.0001; } // printf("ATT 2:%8.3f %6x\n",session->gpsdata.attitude.heading, aux); session->gpsdata.attitude.mag_st = '\0'; session->gpsdata.attitude.pitch = NAN; session->gpsdata.attitude.pitch_st = '\0'; session->gpsdata.attitude.roll = NAN; 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.mag_len = NAN; session->gpsdata.attitude.mag_x = NAN; 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; session->gpsdata.attitude.temp = NAN; session->gpsdata.attitude.depth = NAN; gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(ONLINE_SET | ATTITUDE_SET); } /* * PGN 128259: NAV Speed */ static gps_mask_t hnd_128259(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 128267: NAV Water Depth */ static gps_mask_t hnd_128267(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); session->gpsdata.attitude.heading = NAN; session->gpsdata.attitude.pitch = NAN; session->gpsdata.attitude.pitch_st = '\0'; session->gpsdata.attitude.roll = NAN; 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.mag_len = NAN; session->gpsdata.attitude.mag_x = NAN; 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; session->gpsdata.attitude.temp = NAN; session->gpsdata.attitude.depth = getleu32(bu, 1) *.01; gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(ONLINE_SET | ATTITUDE_SET); } /* * PGN 128275: NAV Distance Log */ static gps_mask_t hnd_128275(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 129283: NAV Cross Track Error */ static gps_mask_t hnd_129283(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 129284: NAV Navigation Data */ static gps_mask_t hnd_129284(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 129285: NAV Navigation - Route/WP Information */ static gps_mask_t hnd_129285(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 130306: NAV Wind Data */ static gps_mask_t hnd_130306(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 130310: NAV Water Temp., Outside Air Temp., Atmospheric Pressure */ static gps_mask_t hnd_130310(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } /* * PGN 130311: NAV Environmental Parameters */ static gps_mask_t hnd_130311(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session) { print_data(session->context, bu, len, pgn); gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit); return(0); } static const char msg_059392[] = {"ISO Acknowledgment"}; static const char msg_060928[] = {"ISO Address Claim"}; static const char msg_126208[] = {"NMEA Command/Request/Acknowledge"}; static const char msg_126464[] = {"ISO Transmit/Receive PGN List"}; static const char msg_126992[] = {"GNSS System Time"}; static const char msg_126996[] = {"ISO Product Information"}; static const char msg_127506[] = {"PWR DC Detailed Status"}; static const char msg_127508[] = {"PWR Battery Status"}; static const char msg_127513[] = {"PWR Battery Configuration Status"}; static const char msg_127258[] = {"GNSS Magnetic Variation"}; static const char msg_129025[] = {"GNSS Position Rapid Update"}; static const char msg_129026[] = {"GNSS COG and SOG Rapid Update"}; static const char msg_129029[] = {"GNSS Positition Data"}; static const char msg_129539[] = {"GNSS DOPs"}; static const char msg_129540[] = {"GNSS Satellites in View"}; static const char msg_129038[] = {"AIS Class A Position Report"}; static const char msg_129039[] = {"AIS Class B Position Report"}; static const char msg_129040[] = {"AIS Class B Extended Position Report"}; static const char msg_129793[] = {"AIS UTC and Date report"}; static const char msg_129794[] = {"AIS Class A Static and Voyage Related Data"}; static const char msg_129798[] = {"AIS SAR Aircraft Position Report"}; static const char msg_129802[] = {"AIS Safty Related Broadcast Message"}; static const char msg_129809[] = {"AIS Class B CS Static Data Report, Part A"}; static const char msg_129810[] = {"AIS Class B CS Static Data Report, Part B"}; static const char msg_127245[] = {"NAV Rudder"}; static const char msg_127250[] = {"NAV Vessel Heading"}; static const char msg_128259[] = {"NAV Speed"}; static const char msg_128267[] = {"NAV Water Depth"}; static const char msg_128275[] = {"NAV Distance Log"}; static const char msg_129283[] = {"NAV Cross Track Error"}; static const char msg_129284[] = {"NAV Navigation Data"}; static const char msg_129285[] = {"NAV Navigation - Route/WP Information"}; static const char msg_130306[] = {"NAV Wind Data"}; static const char msg_130310[] = {"NAV Water Temp., Outside Air Temp., Atmospheric Pressure"}; static const char msg_130311[] = {"NAV Environmental Parameters"}; static const char msg_error [] = {"**error**"}; static PGN gpspgn[] = {{ 59392, 0, 0, hnd_059392, &msg_059392[0]}, { 60928, 0, 0, hnd_060928, &msg_060928[0]}, {126208, 0, 0, hnd_126208, &msg_126208[0]}, {126464, 1, 0, hnd_126464, &msg_126464[0]}, {126992, 0, 0, hnd_126992, &msg_126992[0]}, {126996, 1, 0, hnd_126996, &msg_126996[0]}, {127258, 0, 0, hnd_127258, &msg_127258[0]}, {129025, 0, 1, hnd_129025, &msg_129025[0]}, {129026, 0, 1, hnd_129026, &msg_129026[0]}, {129029, 1, 1, hnd_129029, &msg_129029[0]}, {129283, 0, 0, hnd_129283, &msg_129283[0]}, {129284, 1, 0, hnd_129284, &msg_129284[0]}, {129285, 1, 0, hnd_129285, &msg_129285[0]}, {129539, 0, 1, hnd_129539, &msg_129539[0]}, {129540, 1, 1, hnd_129540, &msg_129540[0]}, {0 , 0, 0, NULL, &msg_error [0]}}; static PGN aispgn[] = {{ 59392, 0, 0, hnd_059392, &msg_059392[0]}, { 60928, 0, 0, hnd_060928, &msg_060928[0]}, {126208, 0, 0, hnd_126208, &msg_126208[0]}, {126464, 1, 0, hnd_126464, &msg_126464[0]}, {126992, 0, 0, hnd_126992, &msg_126992[0]}, {126996, 1, 0, hnd_126996, &msg_126996[0]}, {129038, 1, 2, hnd_129038, &msg_129038[0]}, {129039, 1, 2, hnd_129039, &msg_129039[0]}, {129040, 1, 2, hnd_129040, &msg_129040[0]}, {129793, 1, 2, hnd_129793, &msg_129793[0]}, {129794, 1, 2, hnd_129794, &msg_129794[0]}, {129798, 1, 2, hnd_129798, &msg_129798[0]}, {129802, 1, 2, hnd_129802, &msg_129802[0]}, {129809, 1, 2, hnd_129809, &msg_129809[0]}, {129810, 1, 2, hnd_129810, &msg_129810[0]}, {0 , 0, 0, NULL, &msg_error [0]}}; static PGN pwrpgn[] = {{ 59392, 0, 0, hnd_059392, &msg_059392[0]}, { 60928, 0, 0, hnd_060928, &msg_060928[0]}, {126208, 0, 0, hnd_126208, &msg_126208[0]}, {126464, 1, 0, hnd_126464, &msg_126464[0]}, {126992, 0, 0, hnd_126992, &msg_126992[0]}, {126996, 1, 0, hnd_126996, &msg_126996[0]}, {127506, 1, 3, hnd_127506, &msg_127506[0]}, {127508, 1, 3, hnd_127508, &msg_127508[0]}, {127513, 1, 3, hnd_127513, &msg_127513[0]}, {0 , 0, 0, NULL, &msg_error [0]}}; static PGN navpgn[] = {{ 59392, 0, 0, hnd_059392, &msg_059392[0]}, { 60928, 0, 0, hnd_060928, &msg_060928[0]}, {126208, 0, 0, hnd_126208, &msg_126208[0]}, {126464, 1, 0, hnd_126464, &msg_126464[0]}, {126992, 0, 0, hnd_126992, &msg_126992[0]}, {126996, 1, 0, hnd_126996, &msg_126996[0]}, {127245, 0, 4, hnd_127245, &msg_127245[0]}, {127250, 0, 4, hnd_127250, &msg_127250[0]}, {127258, 0, 0, hnd_127258, &msg_127258[0]}, {128259, 0, 4, hnd_128259, &msg_128259[0]}, {128267, 0, 4, hnd_128267, &msg_128267[0]}, {128275, 1, 4, hnd_128275, &msg_128275[0]}, {129283, 0, 0, hnd_129283, &msg_129283[0]}, {129284, 1, 0, hnd_129284, &msg_129284[0]}, {129285, 1, 0, hnd_129285, &msg_129285[0]}, {130306, 0, 4, hnd_130306, &msg_130306[0]}, {130310, 0, 4, hnd_130310, &msg_130310[0]}, {130311, 0, 4, hnd_130311, &msg_130311[0]}, {0 , 0, 0, NULL, &msg_error [0]}}; static PGN *search_pgnlist(unsigned int pgn, PGN *pgnlist) { int l1; PGN *work; l1 = 0; work = NULL; while (pgnlist[l1].pgn != 0) { if (pgnlist[l1].pgn == pgn) { work = &pgnlist[l1]; break; } else { l1 = l1 + 1; } } return work; } static void find_pgn(struct can_frame *frame, struct gps_device_t *session) { unsigned int can_net; session->driver.nmea2000.workpgn = NULL; can_net = session->driver.nmea2000.can_net; if (can_net > (NMEA2000_NETS-1)) { gpsd_log(&session->context->errout, LOG_ERROR, "NMEA2000 find_pgn: Invalid can network %d.\n", can_net); return; } if (frame->can_id & 0x80000000) { // cppcheck-suppress unreadVariable #ifdef __UNUSED__ unsigned int source_prio; unsigned int daddr; #endif // cppcheck-suppress unreadVariable unsigned int source_pgn; unsigned int source_unit; #if LOG_FILE if (logFile != NULL) { struct timespec msgTime; clock_gettime(CLOCK_REALTIME, &msgTime); fprintf(logFile, "(%010d.%06d) can0 %08x#", (unsigned int)msgTime.tv_sec, (unsigned int)msgTime.tv_nsec/1000, frame->can_id & 0x1ffffff); if ((frame->can_dlc & 0x0f) > 0) { int l1; for(l1=0;l1<(frame->can_dlc & 0x0f);l1++) { fprintf(logFile, "%02x", frame->data[l1]); } } fprintf(logFile, "\n"); } #endif /* of if LOG_FILE */ session->driver.nmea2000.can_msgcnt += 1; source_pgn = (frame->can_id >> 8) & 0x1ffff; #ifdef __UNUSED__ source_prio = (frame->can_id >> 26) & 0x7; #endif source_unit = frame->can_id & 0x0ff; if (((source_pgn & 0x0ff00) >> 8) < 240) { #ifdef __UNUSED__ daddr = source_pgn & 0x000ff; #endif source_pgn = source_pgn & 0x1ff00; } else { #ifdef __UNUSED__ daddr = 0xff; #endif } if (!session->driver.nmea2000.unit_valid) { unsigned int l1, l2; for (l1=0;l1driver.nmea2000.unit = l2; session->driver.nmea2000.unit_valid = true; session->driver.nmea2000.can_net = l1; can_net = l1; } } } } if (!session->driver.nmea2000.unit_valid) { session->driver.nmea2000.unit = source_unit; session->driver.nmea2000.unit_valid = true; nmea2000_units[can_net][source_unit] = session; } if (source_unit == session->driver.nmea2000.unit) { PGN *work; if (session->driver.nmea2000.pgnlist != NULL) { work = search_pgnlist(source_pgn, session->driver.nmea2000.pgnlist); } else { PGN *pgnlist; pgnlist = &gpspgn[0]; work = search_pgnlist(source_pgn, pgnlist); if (work == NULL) { pgnlist = &aispgn[0]; work = search_pgnlist(source_pgn, pgnlist); } if (work == NULL) { pgnlist = &pwrpgn[0]; work = search_pgnlist(source_pgn, pgnlist); } if (work == NULL) { pgnlist = &navpgn[0]; work = search_pgnlist(source_pgn, pgnlist); } if ((work != NULL) && (work->type > 0)) { session->driver.nmea2000.pgnlist = pgnlist; } } if (work != NULL) { if (work->fast == 0) { size_t l2; gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d:%s \n", work->pgn, work->name); session->driver.nmea2000.workpgn = (void *) work; session->lexer.outbuflen = frame->can_dlc & 0x0f; for (l2=0;l2lexer.outbuflen;l2++) { session->lexer.outbuffer[l2]= frame->data[l2]; } } else if ((frame->data[0] & 0x1f) == 0) { unsigned int l2; session->driver.nmea2000.fast_packet_len = frame->data[1]; session->driver.nmea2000.idx = frame->data[0]; #if NMEA2000_FAST_DEBUG gpsd_log(&session->context->errout, LOG_ERROR, "Set idx %2x %2x %2x %6d\n", frame->data[0], session->driver.nmea2000.unit, frame->data[1], source_pgn); #endif /* of #if NMEA2000_FAST_DEBUG */ session->lexer.inbuflen = 0; session->driver.nmea2000.idx += 1; for (l2=2;l2<8;l2++) { session->lexer.inbuffer[session->lexer.inbuflen++] = frame->data[l2]; } gpsd_log(&session->context->errout, LOG_DATA, "pgn %6d:%s \n", work->pgn, work->name); } else if (frame->data[0] == session->driver.nmea2000.idx) { unsigned int l2; for (l2=1;l2<8;l2++) { if (session->driver.nmea2000.fast_packet_len > session->lexer.inbuflen) { session->lexer.inbuffer[session->lexer.inbuflen++] = frame->data[l2]; } } if (session->lexer.inbuflen == session->driver.nmea2000.fast_packet_len) { #if NMEA2000_FAST_DEBUG gpsd_log(&session->context->errout, LOG_ERROR, "Fast done %2x %2x %2x %2x %6d\n", session->driver.nmea2000.idx, frame->data[0], session->driver.nmea2000.unit, (unsigned int) session->driver.nmea2000.fast_packet_len, source_pgn); #endif /* of #if NMEA2000_FAST_DEBUG */ session->driver.nmea2000.workpgn = (void *) work; session->lexer.outbuflen = session->driver.nmea2000.fast_packet_len; for(l2=0;l2 < (unsigned int)session->lexer.outbuflen; l2++) { session->lexer.outbuffer[l2] = session->lexer.inbuffer[l2]; } session->driver.nmea2000.fast_packet_len = 0; } else { session->driver.nmea2000.idx += 1; } } else { gpsd_log(&session->context->errout, LOG_ERROR, "Fast error %2x %2x %2x %2x %6d\n", session->driver.nmea2000.idx, frame->data[0], session->driver.nmea2000.unit, (unsigned int) session->driver.nmea2000.fast_packet_len, source_pgn); } } else { gpsd_log(&session->context->errout, LOG_WARN, "PGN not found %08d %08x \n", source_pgn, source_pgn); } } else { // we got a unknown unit number if (nmea2000_units[can_net][source_unit] == NULL) { char buffer[32]; (void) snprintf(buffer, sizeof(buffer), "nmea2000://%s:%u", can_interface_name[can_net], source_unit); if (gpsd_add_device != NULL) { (void) gpsd_add_device(buffer, true); } } } } else { // we got RTR or 2.0A CAN frame, not used } } static ssize_t nmea2000_get(struct gps_device_t *session) { struct can_frame frame; ssize_t status; session->lexer.outbuflen = 0; status = read(session->gpsdata.gps_fd, &frame, sizeof(frame)); if (status == (ssize_t)sizeof(frame)) { session->lexer.type = NMEA2000_PACKET; find_pgn(&frame, session); return frame.can_dlc & 0x0f; } return 0; } static gps_mask_t nmea2000_parse_input(struct gps_device_t *session) { gps_mask_t mask; PGN *work; // printf("NMEA2000 parse_input called\n"); mask = 0; work = (PGN *) session->driver.nmea2000.workpgn; if (work != NULL) { mask = (work->func)(&session->lexer.outbuffer[0], (int)session->lexer.outbuflen, work, session); session->driver.nmea2000.workpgn = NULL; } session->lexer.outbuflen = 0; return mask; } int nmea2000_open(struct gps_device_t *session) { char interface_name[strlen(session->gpsdata.dev.path)+1]; socket_t sock; int status; int unit_number; int can_net; unsigned int l; struct ifreq ifr; struct sockaddr_can addr; char *unit_ptr; INVALIDATE_SOCKET(session->gpsdata.gps_fd); session->driver.nmea2000.can_net = 0; can_net = -1; unit_number = -1; (void)strlcpy(interface_name, session->gpsdata.dev.path + 11, sizeof(interface_name)); unit_ptr = NULL; for (l=0;lcontext->errout, LOG_ERROR, "NMEA2000 open: Invalid character in unit number.\n"); return -1; } } } if (unit_ptr != NULL) { unit_number = atoi(unit_ptr); if ((unit_number < 0) || (unit_number > (NMEA2000_UNITS-1))) { gpsd_log(&session->context->errout, LOG_ERROR, "NMEA2000 open: Unit number out of range.\n"); return -1; } for (l = 0; l < NMEA2000_NETS; l++) { if (strncmp(can_interface_name[l], interface_name, MIN(sizeof(interface_name), sizeof(can_interface_name[l]))) == 0) { can_net = l; break; } } if (can_net < 0) { gpsd_log(&session->context->errout, LOG_ERROR, "NMEA2000 open: CAN device not open: %s .\n", interface_name); return -1; } } else { for (l = 0; l < NMEA2000_NETS; l++) { if (strncmp(can_interface_name[l], interface_name, MIN(sizeof(interface_name), sizeof(can_interface_name[l]))) == 0) { gpsd_log(&session->context->errout, LOG_ERROR, "NMEA2000 open: CAN device duplicate open: %s .\n", interface_name); return -1; } } for (l = 0; l < NMEA2000_NETS; l++) { if (can_interface_name[l][0] == 0) { can_net = l; break; } } if (can_net < 0) { gpsd_log(&session->context->errout, LOG_ERROR, "NMEA2000 open: Too many CAN networks open.\n"); return -1; } } /* Create the socket */ sock = socket(PF_CAN, SOCK_RAW, CAN_RAW); if (BAD_SOCKET(sock)) { gpsd_log(&session->context->errout, LOG_ERROR, "NMEA2000 open: can not get socket.\n"); return -1; } status = fcntl(sock, F_SETFL, O_NONBLOCK); if (status != 0) { gpsd_log(&session->context->errout, LOG_ERROR, "NMEA2000 open: can not set socket to O_NONBLOCK.\n"); close(sock); return -1; } /* Locate the interface you wish to use */ strlcpy(ifr.ifr_name, interface_name, sizeof(ifr.ifr_name)); status = ioctl(sock, SIOCGIFINDEX, &ifr); /* ifr.ifr_ifindex gets filled * with that device's index */ if (status != 0) { gpsd_log(&session->context->errout, LOG_ERROR, "NMEA2000 open: can not find CAN device.\n"); close(sock); return -1; } /* Select that CAN interface, and bind the socket to it. */ addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; status = bind(sock, (struct sockaddr*)&addr, sizeof(addr) ); if (status != 0) { gpsd_log(&session->context->errout, LOG_ERROR, "NMEA2000 open: bind failed.\n"); close(sock); return -1; } gpsd_switch_driver(session, "NMEA2000"); session->gpsdata.gps_fd = sock; session->sourcetype = source_can; session->servicetype = service_sensor; session->driver.nmea2000.can_net = can_net; if (unit_ptr != NULL) { nmea2000_units[can_net][unit_number] = session; session->driver.nmea2000.unit = unit_number; session->driver.nmea2000.unit_valid = true; } else { strncpy(can_interface_name[can_net], interface_name, MIN(sizeof(can_interface_name[0]), sizeof(interface_name))); session->driver.nmea2000.unit_valid = false; for (l=0;lgpsdata.dev.parity = 'n'; session->gpsdata.dev.baudrate = 250000; session->gpsdata.dev.stopbits = 0; return session->gpsdata.gps_fd; } void nmea2000_close(struct gps_device_t *session) { if (!BAD_SOCKET(session->gpsdata.gps_fd)) { gpsd_log(&session->context->errout, LOG_SPIN, "close(%d) in nmea2000_close(%s)\n", session->gpsdata.gps_fd, session->gpsdata.dev.path); (void)close(session->gpsdata.gps_fd); INVALIDATE_SOCKET(session->gpsdata.gps_fd); if (session->driver.nmea2000.unit_valid) { unsigned int l1, l2; for (l1=0;l1driver.nmea2000.unit_valid = false; session->driver.nmea2000.unit = 0; session->driver.nmea2000.can_net = 0; nmea2000_units[l1][l2] = NULL; } } } } } } /* *INDENT-OFF* */ const struct gps_type_t driver_nmea2000 = { .type_name = "NMEA2000", /* full name of type */ .packet_type = NMEA2000_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* detect their main sentence */ .channels = 12, /* not an actual GPS at all */ .probe_detect = NULL, .get_packet = nmea2000_get, /* how to get a packet */ .parse_packet = nmea2000_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* Don't send RTCM to this */ .init_query = NULL, /* non-perturbing query */ .event_hook = NULL, #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no rate switcher */ .min_cycle = 1, /* nominal 1-per-second GPS cycle */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = NULL, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ /* end */ #endif /* of defined(NMEA2000_ENABLE) */ gpsd-3.15/driver_nmea2000.h0000664000175000017500000000074412506317026013522 0ustar esresr/* * NMEA2000 over CAN. * * The entry points for driver_nmea2000 * * This file is Copyright (c) 2012 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _DRIVER_NMEA2000_H_ #define _DRIVER_NMEA2000_H_ #if defined(NMEA2000_ENABLE) int nmea2000_open(struct gps_device_t *session); void nmea2000_close(struct gps_device_t *session); #endif /* of defined(NMEA2000_ENABLE) */ #endif /* of ifndef _DRIVER_NMEA2000_H_ */ gpsd-3.15/driver_oncore.c0000664000175000017500000003761112520742615013565 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include "gpsd.h" #if defined(ONCORE_ENABLE) && defined(BINARY_ENABLE) #include "bits.h" 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 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 unsigned char pollBo[] = { 'B', 'o', 0x01 }; static unsigned char pollEn[] = { 'E', 'n', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; /* * 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_offset(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); /* * Decode the navigation solution message */ static gps_mask_t oncore_msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t data_len) { gps_mask_t mask; unsigned char flags; double lat, lon, alt; float speed, track, dop; unsigned int i, j, st, nsv; int Bbused; struct tm unpacked_date; if (data_len != 76) return 0; mask = ONLINE_SET; gpsd_log(&session->context->errout, LOG_DATA, "oncore NAVSOL - navigation data\n"); flags = (unsigned char)getub(buf, 72); if (flags & 0x20) { session->gpsdata.status = STATUS_FIX; session->newdata.mode = MODE_3D; } else if (flags & 0x10) { session->gpsdata.status = STATUS_FIX; session->newdata.mode = MODE_2D; } else { gpsd_log(&session->context->errout, LOG_WARN, "oncore NAVSOL no fix - flags 0x%02x\n", flags); session->newdata.mode = MODE_NO_FIX; session->gpsdata.status = STATUS_NO_FIX; } mask |= MODE_SET; /* 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) { unsigned int nsec; unpacked_date.tm_mon = (int)getub(buf, 4) - 1; unpacked_date.tm_mday = (int)getub(buf, 5); unpacked_date.tm_year = (int)getbeu16(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); unpacked_date.tm_isdst = 0; unpacked_date.tm_wday = unpacked_date.tm_yday = 0; nsec = (uint) getbeu32(buf, 11); session->newdata.time = (timestamp_t)mkgmtime(&unpacked_date) + nsec * 1e-9; mask |= TIME_SET; gpsd_log(&session->context->errout, LOG_DATA, "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); } lat = getbes32(buf, 15) / 3600000.0f; lon = getbes32(buf, 19) / 3600000.0f; alt = getbes32(buf, 23) / 100.0f; speed = getbeu16(buf, 31) / 100.0f; track = getbeu16(buf, 33) / 10.0f; dop = getbeu16(buf, 35) / 10.0f; gpsd_log(&session->context->errout, LOG_DATA, "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; 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; unsigned int off; 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_log(&session->context->errout, LOG_DATA, "%2d %2d %2d %3d %02x\n", i, sv, mode, sn, status); if (sn) { session->gpsdata.skyview[st].PRN = (short)sv; session->gpsdata.skyview[st].ss = (double)sn; for (j = 0; (int)j < session->driver.oncore.visible; j++) if (session->driver.oncore.PRN[j] == sv) { session->gpsdata.skyview[st].elevation = (short)session->driver.oncore.elevation[j]; session->gpsdata.skyview[st].azimuth = (short)session->driver.oncore.azimuth[j]; Bbused |= 1 << j; break; } /* bit 7 of the status word: sat used for position */ session->gpsdata.skyview[st].used = false; if (status & 0x80) { session->gpsdata.skyview[st].used = true; nsv++; } /* bit 2 of the status word: using for time solution */ if (status & 0x02) mask |= PPSTIME_IS; /* * The PPSTIME_IS mask bit exists distinctly from TIME_SET exactly * so an OnCore running in time-service mode (and other GPS clocks) * can signal that it's returning time even though no position fixes * have been available. */ st++; } } for (j = 0; (int)j < session->driver.oncore.visible; j++) if (!(Bbused & (1 << j))) { session->gpsdata.skyview[st].PRN = (short)session->driver.oncore.PRN[j]; session->gpsdata.skyview[st].elevation = (short)session->driver.oncore.elevation[j]; session->gpsdata.skyview[st].azimuth = (short)session->driver.oncore.azimuth[j]; st++; } session->gpsdata.skyview_time = session->newdata.time; session->gpsdata.satellites_used = (int)nsv; session->gpsdata.satellites_visible = (int)st; mask |= SATELLITE_SET | 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, (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, (char *)pollBo, sizeof(pollBo)); (void)oncore_control_send(session, (char *)pollEn, sizeof(pollEn)); gpsd_log(&session->context->errout, LOG_DATA, "NAVSOL: time=%.2f lat=%.2f lon=%.2f alt=%.2f speed=%.2f track=%.2f mode=%d status=%d visible=%d used=%d\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); return mask; } /** * 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) { int utc_offset; if (data_len != 8) return 0; gpsd_log(&session->context->errout, LOG_DATA, "oncore UTCTIME - leap seconds\n"); utc_offset = (int)getub(buf, 4); if (utc_offset == 0) 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 */ } /** * PPS offset */ static gps_mask_t oncore_msg_pps_offset(struct gps_device_t *session, unsigned char *buf, size_t data_len) { int pps_offset_ns; if (data_len != 11) return 0; gpsd_log(&session->context->errout, LOG_DATA, "oncore PPS offset\n"); pps_offset_ns = (int)getbes32(buf, 4); session->driver.oncore.pps_offset_ns = pps_offset_ns; return 0; } /** * GPS Satellite Info */ static gps_mask_t oncore_msg_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data_len) { unsigned int i, nchan; int j; if (data_len != 92) return 0; gpsd_log(&session->context->errout, LOG_DATA, "oncore SVINFO - satellite data\n"); nchan = (unsigned int)getub(buf, 4); gpsd_log(&session->context->errout, LOG_DATA, "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 */ unsigned int off = 5 + 7 * i; int sv = (int)getub(buf, off); int el = (int)getub(buf, off + 3); int az = (int)getbeu16(buf, off + 4); gpsd_log(&session->context->errout, LOG_DATA, "%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; /* If it has an entry in the satellite list, update it! */ for (j = 0; j < session->gpsdata.satellites_visible; j++) if (session->gpsdata.skyview[j].PRN == (short)sv) { session->gpsdata.skyview[j].elevation = (short)el; session->gpsdata.skyview[j].azimuth = (short)az; } } gpsd_log(&session->context->errout, LOG_DATA, "SVINFO: mask={SATELLITE}\n"); return SATELLITE_SET; } /** * 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) { int sawtooth_ns; if (data_len != 69) return 0; sawtooth_ns = (int)getub(buf, 25); gpsd_log(&session->context->errout, LOG_DATA, "oncore PPS sawtooth: %d\n",sawtooth_ns); /* session->driver.oncore.traim_sawtooth_ns = sawtooth_ns; */ return 0; } /** * GPS Firmware */ static gps_mask_t oncore_msg_firmware(struct gps_device_t *session UNUSED, unsigned char *buf UNUSED, size_t data_len UNUSED) { return 0; } #define ONCTYPE(id2,id3) ((((unsigned int)id2)<<8)|(id3)) /** * Parse the data from the device */ 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]); /* we may need to dump the raw packet */ gpsd_log(&session->context->errout, LOG_RAW, "raw Oncore packet type 0x%04x\n", type); session->cycle_end_reliable = true; 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_IS | REPORT_IS); case ONCTYPE('E', 'n'): return oncore_msg_time_raim(session, buf, len); case ONCTYPE('C', 'j'): return oncore_msg_firmware(session, buf, len); 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'): return oncore_msg_pps_offset(session, buf, len); default: /* FIX-ME: This gets noisy in a hurry. Change once your driver works */ gpsd_log(&session->context->errout, LOG_WARN, "unknown packet id @@%c%c length %zd\n", type >> 8, type & 0xff, len); return 0; } } /********************************************************** * * Externally called routines below here * **********************************************************/ /** * Write data to the device, doing any required padding or checksumming */ static ssize_t oncore_control_send(struct gps_device_t *session, char *msg, size_t msglen) { 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]; } session->msgbuf[msglen + 2] = checksum; session->msgbuf[msglen + 3] = '\r'; session->msgbuf[msglen + 4] = '\n'; session->msgbuflen = msglen + 5; gpsd_log(&session->context->errout, LOG_PROG, "writing oncore control type %c%c\n", msg[0], msg[1]); return gpsd_write(session, session->msgbuf, session->msgbuflen); } static void oncore_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; /* * Some oncore VP variants that have not been used after long * power-down will be silent on startup. Provoke * identification by requesting the firmware version. */ if (event == event_wakeup) (void)oncore_control_send(session, getfirmware, sizeof(getfirmware)); /* * FIX-ME: 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, (char*)pollBo, sizeof(pollBo)); } } #ifdef TIMEHINT_ENABLE static double oncore_time_offset(struct gps_device_t *session UNUSED) { /* * 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 /* TIMEHINT_ENABLE */ static gps_mask_t oncore_parse_input(struct gps_device_t *session) { if (session->lexer.type == ONCORE_PACKET) { return oncore_dispatch(session, session->lexer.outbuffer, session->lexer.outbuflen); #ifdef NMEA_ENABLE } else if (session->lexer.type == NMEA_PACKET) { return nmea_parse((char *)session->lexer.outbuffer, session); #endif /* NMEA_ENABLE */ } else return 0; } /* This is everything we export */ /* *INDENT-OFF* */ const struct gps_type_t driver_oncore = { .type_name = "Motorola Oncore", /* Full name of type */ .packet_type = ONCORE_PACKET, /* numeric packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* identifying response */ .channels = 12, /* device channel count */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* packet getter */ .parse_packet = oncore_parse_input, /* packet parser */ .rtcm_writer = gpsd_write, /* device accepts RTCM */ .init_query = NULL, /* non-perturbing query */ .event_hook = oncore_event_hook, /* lifetime event hook */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed setter */ .mode_switcher = NULL, /* no mode setter */ .rate_switcher = NULL, /* no speed setter */ .min_cycle = 1, /* 1Hz */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE /* Control string sender - should provide checksum and headers/trailer */ .control_send = oncore_control_send, /* to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = oncore_time_offset, /* NTP offset array */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* defined(ONCORE_ENABLE) && defined(BINARY_ENABLE) */ gpsd-3.15/driver_proto.c0000664000175000017500000004354212506317026013441 0ustar esresr/* * A prototype driver. Doesn't run, doesn't even compile. * * For new driver authors: replace "_PROTO_" and "_proto_" with the name of * your new driver. That will give you a skeleton with all the required * functions defined. * * Once that is done, you will likely have to define a large number of * flags and masks. From there, you will be able to start extracting * useful quantities. There are roughed-in decoders for the navigation * solution, satellite status and gps-utc offset. These are the 3 key * messages that gpsd needs. Some protocols transmit error estimates * separately from the navigation solution; if developing a driver for * such a protocol you will need to add a decoder function for that * message. Be extra careful when using sizeof() to extract part * of packets (ie. don't do it). This idiom creates portability problems * between 32 and 64 bit systems. * * For anyone hacking this driver skeleton: "_PROTO_" and "_proto_" are now * reserved tokens. We suggest that they only ever be used as prefixes, * but if they are used infix, they must be used in a way that allows a * driver author to find-and-replace to create a unique namespace for * driver functions. * * If using vi, ":%s/_PROTO_/MYDRIVER/g" and ":%s/_proto_/mydriver/g" * should produce a source file that comes very close to being useful. * You will also need to add hooks for your new driver to: * SConstruct * drivers.c * gpsd.h-tail * libgpsd_core.c * packet.c * packet_states.h * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #if defined(_PROTO__ENABLE) && defined(BINARY_ENABLE) #include "bits.h" static gps_mask_t _proto__parse_input(struct gps_device_t *); static gps_mask_t _proto__dispatch(struct gps_device_t *, unsigned char *, size_t ); static gps_mask_t _proto__msg_navsol(struct gps_device_t *, unsigned char *, size_t ); static gps_mask_t _proto__msg_utctime(struct gps_device_t *, unsigned char *, size_t ); static gps_mask_t _proto__msg_svinfo(struct gps_device_t *, unsigned char *, size_t ); static gps_mask_t _proto__msg_raw(struct gps_device_t *, unsigned char *, size_t ); /* * These methods may be called elsewhere in gpsd */ static ssize_t _proto__control_send(struct gps_device_t *, char *, size_t); static bool _proto__probe_detect(struct gps_device_t *); static void _proto__event_hook(struct gps_device_t *, event_t); static bool _proto__set_speed(struct gps_device_t *, speed_t, char, int); static void _proto__set_mode(struct gps_device_t *, int); /* * Decode the navigation solution message */ static gps_mask_t _proto__msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t data_len) { gps_mask_t mask; int flags; double Px, Py, Pz, Vx, Vy, Vz; if (data_len != _PROTO__NAVSOL_MSG_LEN) return 0; gpsd_log(&session->context->errout, LOG_DATA, "_proto_ NAVSOL - navigation data\n"); /* if this protocol has a way to test message validity, use it */ flags = GET_FLAGS(); if ((flags & _PROTO__SOLUTION_VALID) == 0) return 0; mask = ONLINE_SET; /* 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->gpsdata.separation, Px, Py, Pz, Vx, Vy, Vz); mask |= LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET ; session->newdata.epx = GET_LONGITUDE_ERROR(); session->newdata.epy = GET_LATITUDE_ERROR(); session->newdata.eps = GET_SPEED_ERROR(); session->gpsdata.satellites_used = GET_SATELLITES_USED(); /* * Do *not* clear DOPs in a navigation solution message; * instead, opportunistically pick up whatever it gives * us and replace whatever values we computed from the * visibility matrix for he last skyview. The reason to trust * the chip returns over what we compute is that some * chips have internal deweighting albums to throw out sats * that increase DOP. */ session->gpsdata.dop.hdop = GET_HDOP(); session->gpsdata.dop.vdop = GET_VDOP(); /* other DOP if available */ mask |= DOP_SET; session->newdata.mode = GET_FIX_MODE(); session->gpsdata.status = GET_FIX_STATUS(); /* * 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_IS; /* * At the end of each packet-cracking function, report at LOG_DATA level * the fields it potentially set and the transfer mask. Doing this * makes it relatively easy to track down data-management problems. */ gpsd_log(&session->context->errout, LOG_DATA, "NAVSOL: time=%.2f, lat=%.2f lon=%.2f alt=%.2f mode=%d status=%d\n", session->newdata.time, session->newdata.latitude, session->newdata.longitude, session->newdata.altitude, session->newdata.mode, session->gpsdata.status); return mask; } /** * GPS Leap Seconds */ static gps_mask_t _proto__msg_utctime(struct gps_device_t *session, unsigned char *buf, size_t data_len) { double t; if (data_len != UTCTIME_MSG_LEN) return 0; gpsd_log(&session->context->errout, LOG_DATA, "_proto_ UTCTIME - navigation data\n"); /* if this protocol has a way to test message validity, use it */ flags = GET_FLAGS(); if ((flags & _PROTO__TIME_VALID) == 0) return 0; tow = GET_MS_TIMEOFWEEK(); gps_week = GET_WEEKNUMBER(); session->context->leap_seconds = GET_GPS_LEAPSECONDS(); session->newdata.time = gpsd_gpstime_resolve(session, gps_week, tow / 1000.0); return TIME_SET | PPSTIME_IS | ONLINE_SET; } /** * GPS Satellite Info */ static gps_mask_t _proto__msg_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data_len) { unsigned char i, st, nchan, nsv; unsigned int tow; if (data_len != SVINFO_MSG_LEN ) return 0; gpsd_log(&session->context->errout, LOG_DATA, "_proto_ SVINFO - navigation data\n"); /* if this protocol has a way to test message validity, use it */ flags = GET_FLAGS(); if ((flags & _PROTO__SVINFO_VALID) == 0) return 0; /* * some protocols have a variable length message listing only visible * satellites, even if there are less than the number of channels. others * have a fixed length message and send empty records for idle channels * that are not tracking or searching. whatever the case, nchan should * be set to the number of satellites which might be visible. */ nchan = GET_NUMBER_OF_CHANNELS(); if ((nchan < 1) || (nchan > MAXCHANNELS)) { gpsd_log(&session->context->errout, LOG_INF, "too many channels reported\n"); return 0; } gpsd_zero_satellites(&session->gpsdata); nsv = 0; /* number of actually used satellites */ for (i = st = 0; i < nchan; i++) { /* get info for one channel/satellite */ int off = GET_CHANNEL_STATUS(i); session->gpsdata.PRN[i] = PRN_THIS_CHANNEL_IS_TRACKING(i); session->gpsdata.ss[i] = (float)SIGNAL_STRENGTH_FOR_CHANNEL(i); session->gpsdata.elevation[i] = SV_ELEVATION_FOR_CHANNEL(i); session->gpsdata.azimuth[i] = SV_AZIMUTH_FOR_CHANNEL(i); if (CHANNEL_USED_IN_SOLUTION(i)) session->gpsdata.used[nsv++] = session->gpsdata.PRN[i]; if(session->gpsdata.PRN[i]) st++; } /* if the satellite-info setence gives you UTC time, use it */ session->gpsdata.skyview_time = NaN; session->gpsdata.satellites_used = nsv; session->gpsdata.satellites_visible = st; gpsd_log(&session->context->errout, LOG_DATA, "SVINFO: visible=%d used=%d mask={SATELLITE|USED}\n", session->gpsdata.satellites_visible, session->gpsdata.satellites_used); return SATELLITE_SET | USED_IS; } /** * Raw measurements */ static gps_mask_t _proto__msg_raw(struct gps_device_t *session, unsigned char *buf, size_t data_len) { unsigned char i, st, nchan, nsv; unsigned int tow; if (data_len != RAW_MSG_LEN ) return 0; gpsd_log(&session->context->errout, LOG_DATA, "_proto_ RAW - raw measurements\n"); /* if this protocol has a way to test message validity, use it */ flags = GET_FLAGS(); if ((flags & _PROTO__SVINFO_VALID) == 0) return 0; /* * not all chipsets emit the same information. some of these observables * can be easily converted into others. these are suggestions for the * quantities you may wish to try extract. chipset documentation may say * something like "this message contains information required to generate * a RINEX file." assign NAN for unavailable data. */ nchan = GET_NUMBER_OF_CHANNELS(); if ((nchan < 1) || (nchan > MAXCHANNELS)) { gpsd_log(&session->context->errout, LOG_INF, "too many channels reported\n"); return 0; } for (i = 0; i < n; i++){ session->gpsdata.PRN[i] = GET_PRN(); session->gpsdata.ss[i] = GET_SIGNAL() session->gpsdata.raw.satstat[i] = GET_FLAGS(); session->gpsdata.raw.pseudorange[i] = GET_PSEUDORANGE(); session->gpsdata.raw.doppler[i] = GET_DOPPLER(); session->gpsdata.raw.carrierphase[i] = GET_CARRIER_PHASE(); session->gpsdata.raw.mtime[i] = GET_MEASUREMENT_TIME(); session->gpsdata.raw.codephase[i] = GET_CODE_PHASE(); session->gpsdata.raw.deltarange[i] = GET_DELTA_RANGE(); } return RAW_IS; } /** * Parse the data from the device */ gps_mask_t _proto__dispatch(struct gps_device_t *session, unsigned char *buf, size_t len) { size_t i; int type, used, visible, retmask = 0; if (len == 0) return 0; /* * Set this if the driver reliably signals end of cycle. * The core library zeroes it just before it calls each driver's * packet analyzer. */ session->cycle_end_reliable = true; if (msgid == MY_START_OF_CYCLE) retmask |= CLEAR_IS; else if (msgid == MY_END_OF_CYCLE) retmask |= REPORT_IS; type = GET_MESSAGE_TYPE(); /* we may need to dump the raw packet */ gpsd_log(&session->context->errout, LOG_RAW, "raw _proto_ packet type 0x%02x\n", type); switch (type) { /* Deliver message to specific decoder based on message type */ default: gpsd_log(&session->context->errout, LOG_WARN, "unknown packet id %d length %d\n", type, len); return 0; } } /********************************************************** * * Externally called routines below here * **********************************************************/ static bool _proto__probe_detect(struct gps_device_t *session) { /* * This method is used to elicit a positively identifying * response from a candidate device. Some drivers may use * this to test for the presence of a certain kernel module. */ int test, satisfied; /* Your testing code here */ test=satisfied=0; if (test==satisfied) return true; return false; } #ifdef CONTROLSEND_ENABLE /** * Write data to the device, doing any required padding or checksumming */ static ssize_t _proto__control_send(struct gps_device_t *session, char *msg, size_t msglen) { bool ok; /* CONSTRUCT THE MESSAGE */ /* * This copy to a public assembly buffer * enables gpsmon to snoop the control message * after it has been sent. */ session->msgbuflen = msglen; (void)memcpy(session->msgbuf, msg, msglen); /* we may need to dump the message */ return gpsd_write(session, session->msgbuf, session->msgbuflen); gpsd_log(&session->context->errout, LOG_PROG, "writing _proto_ control type %02x\n"); return gpsd_write(session, session->msgbuf, session->msgbuflen); } #endif /* CONTROLSEND_ENABLE */ #ifdef RECONFIGURE_ENABLE static void _proto__event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; if (event == event_wakeup) { /* * Code to make the device ready to communicate. Only needed if the * device is in some kind of sleeping state, and only shipped to * RS232C, so that gpsd won't send strings to unidentified USB devices * that might not be GPSes at all. */ } if (event == event_identified) { /* * Fires when the first full packet is recognized from a * previously unidentified device. The session.lexer counter * is zeroed. If your device has a default cycle time other * than 1 second, set session->device->gpsdata.cycle here. If * possible, get the software version and store it in * session->subtype. */ } if (event == event_configure) { /* * Change sentence mix and set reporting modes as needed. * Called immediately after event_identified fires, then just * after every packet received thereafter, but you probably * only want to take actions on the first few packets after * the session.lexer counter has been zeroed, * * Remember that session->lexer.counter is available when you * write this hook; you can use this fact to interleave configuration * sends with the first few packet reads, which is useful for * devices with small receive buffers. */ } else if (event == event_driver_switch) { /* * Fires when the driver on a device is changed *after* it * has been identified. */ } else if (event == event_deactivate) { /* * Fires when the device is deactivated. Usr this to revert * whatever was done at event_identify and event_configure * time. */ } else if (event == event_reactivate) { /* * Fires when a device is reactivated after having been closed. * Use this hook for re-establishing device settings that * it doesn't hold through closes. */ } } /* * This is the entry point to the driver. When the packet sniffer recognizes * a packet for this driver, it calls this method which passes the packet to * the binary processor or the nmea processor, depending on the session type. */ static gps_mask_t _proto__parse_input(struct gps_device_t *session) { if (session->lexer.type == _PROTO__PACKET) { return _proto__dispatch(session, session->lexer.outbuffer, session->lexer.outbuflen); #ifdef NMEA_ENABLE } else if (session->lexer.type == NMEA_PACKET) { return nmea_parse((char *)session->lexer.outbuffer, session); #endif /* NMEA_ENABLE */ } else return 0; } static bool _proto__set_speed(struct gps_device_t *session, speed_t speed, char parity, int stopbits) { /* * Set port operating mode, speed, parity, stopbits etc. here. * Note: parity is passed as 'N'/'E'/'O', but you should program * defensively and allow 0/1/2 as well. */ } /* * Switch between NMEA and binary mode, if supported */ static void _proto__set_mode(struct gps_device_t *session, int mode) { if (mode == MODE_NMEA) { /* send a mode switch control string */ } else { /* send a mode switch control string */ session->back_to_nmea = false; } } #endif /* RECONFIGURE_ENABLE */ #ifdef TIMEHINT_ENABLE static double _proto_time_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 /* TIMEHINT_ENABLE */ static void _proto__wrapup(struct gps_device_t *session) { } /* The methods in this code take parameters and have */ /* return values that conform to the requirements AT */ /* THE TIME THE CODE WAS WRITTEN. */ /* */ /* These values may well have changed by the time */ /* you read this and methods could have been added */ /* or deleted. Unused methods can be set to NULL. */ /* */ /* The latest version can be found by inspecting */ /* the contents of struct gps_type_t in gpsd.h. */ /* */ /* This always contains the correct definitions that */ /* any driver must use to compile. */ /* This is everything we export */ /* *INDENT-OFF* */ const struct gps_type_t driver__proto__binary = { /* Full name of type */ .type_name = "_proto", /* Associated lexer packet type */ .packet_type = _PROTO__PACKET, /* Driver tyoe flags */ .flags = DRIVER_NOFLAGS, /* Response string that identifies device (not active) */ .trigger = NULL, /* Number of satellite channels supported by the device */ .channels = 12, /* Startup-time device detector */ .probe_detect = _proto__probe_detect, /* Packet getter (using default routine) */ .get_packet = generic_get, /* Parse message packets */ .parse_packet = _proto__parse_input, /* RTCM handler (using default routine) */ .rtcm_writer = pass_rtcm, /* non-perturbing initial query (e.g. for version) */ .init_query = NULL, /* fire on various lifetime events */ .event_hook = _proto__event_hook, #ifdef RECONFIGURE_ENABLE /* Speed (baudrate) switch */ .speed_switcher = _proto__set_speed, /* Switch to NMEA mode */ .mode_switcher = _proto__set_mode, /* Message delivery rate switcher (not active) */ .rate_switcher = NULL, /* Minimum cycle time of the device */ .min_cycle = 1, #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE /* Control string sender - should provide checksum and headers/trailer */ .control_send = _proto__control_send, #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = _proto_time_offset, #endif /* TIMEHINT_ENABLE */ /* *INDENT-ON* */ }; #endif /* defined(_PROTO__ENABLE) && defined(BINARY_ENABLE) */ gpsd-3.15/driver_rtcm2.c0000664000175000017500000006605312506327163013332 0ustar esresr/***************************************************************************** This is a decoder for RTCM-104 2.x, an obscure and complicated serial protocol used for broadcasting pseudorange corrections from differential-GPS reference stations. The applicable standard is RTCM RECOMMENDED STANDARDS FOR DIFFERENTIAL GNSS (GLOBAL NAVIGATION SATELLITE) SERVICE, VERSION 2.3 (RTCM PAPER 136-2001/SC104-STD) Ordering instructions are accessible from under "Publications". This describes version 2.3 of the RTCM specification. RTCM-104 was later completely redesigned as level 3.0. Also applicable is ITU-R M.823: "Technical characteristics of differential transmissions for global navigation satellite systems from maritime radio beacons in the frequency band 283.5 - 315 kHz in region 1 and 285 - 325 kHz in regions 2 & 3." The RTCM 2.x protocol uses as a transport layer the GPS satellite downlink protocol described in IS-GPS-200, the Navstar GPS Interface Specification. This code relies on the lower-level packet-assembly code for that protocol in isgps.c. The lower layer's job is done when it has assembled a message of up to 33 30-bit words of clean parity-checked data. At this point this upper layer takes over. struct rtcm2_msg_t is overlaid on the buffer and the bitfields are used to extract pieces of it. Those pieces are copied and (where necessary) reassembled into a struct rtcm2_t. This code and the contents of isgps.c are evolved from code by Wolfgang Rupprecht. Wolfgang's decoder was loosely based on one written by John Sager in 1999. Here are John Sager's original notes: The RTCM decoder prints a legible representation of the input data. The RTCM SC-104 specification is copyrighted, so I cannot quote it - in fact, I have never read it! Most of the information used to develop the decoder came from publication ITU-R M.823. This is a specification of the data transmitted from LF DGPS beacons in the 300kHz band. M.823 contains most of those parts of RTCM SC-104 directly relevant to the air interface (there are one or two annoying and vital omissions!). Information about the serial interface format was gleaned from studying the output of a beacon receiver test program made available on Starlink's website. This code has been checked against ASCII dumps made by a proprietary decoder running under Windows and is known to be consistent with it with respect to message types 1, 3, 9, 14, 16, and 31. Decoding of message types 4, 5, 6, 7, and 13 has not been checked. Message types 8, 10-12, 15-27, 28-30 (undefined), 31-37, 38-58 (undefined), and 60-63 are not yet supported. This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. *****************************************************************************/ #include #include #include "gpsd.h" /* __BYTE_ORDER__, __ORDER_BIG_ENDIAN__ and __ORDER_LITTLE_ENDIAN__ are defined in some gcc versions only, probably depending on the architecture. Try to use endian.h if the gcc way fails - endian.h also does not seem to be available on all platforms. */ #if HAVE_BUILTIN_ENDIANNESS #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #define WORDS_BIGENDIAN 1 #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #undef WORDS_BIGENDIAN #else #error Unknown endianness! #endif #else /* HAVE_BUILTIN_ENDIANNESS */ #if defined(HAVE_ENDIAN_H) #include #elif defined(HAVE_SYS_ENDIAN_H) #include #elif defined(HAVE_MACHINE_ENDIAN_H) #include #endif /* * BSD uses _BYTE_ORDER, and Linux uses __BYTE_ORDER. */ #if !defined( __BYTE_ORDER) && defined(_BYTE_ORDER) #define __BYTE_ORDER _BYTE_ORDER #endif #if !defined( __BIG_ENDIAN) && defined(_BIG_ENDIAN) #define __BIG_ENDIAN _BIG_ENDIAN #endif #if !defined( __LITTLE_ENDIAN) && defined(_LITTLE_ENDIAN) #define __LITTLE_ENDIAN _LITTLE_ENDIAN #endif /* * Darwin (Mac OS X) uses special defines. */ #if !defined( __BYTE_ORDER) && defined(__DARWIN_BYTE_ORDER) #define __BYTE_ORDER __DARWIN_BYTE_ORDER #endif #if !defined( __BIG_ENDIAN) && defined(__DARWIN_BIG_ENDIAN) #define __BIG_ENDIAN __DARWIN_BIG_ENDIAN #endif #if !defined( __LITTLE_ENDIAN) && defined(__DARWIN_LITTLE_ENDIAN) #define __LITTLE_ENDIAN __DARWIN_LITTLE_ENDIAN #endif #if !defined(__BYTE_ORDER) || !defined(__BIG_ENDIAN) || !defined(__LITTLE_ENDIAN) #error endianness macros are not defined #endif #if __BYTE_ORDER == __BIG_ENDIAN #define WORDS_BIGENDIAN 1 #elif __BYTE_ORDER == __LITTLE_ENDIAN #undef WORDS_BIGENDIAN #else #error Unknown endianness! #endif /* __BYTE_ORDER */ #endif /* HAVE_BUILTIN_ENDIANNESS */ /* * Structures for interpreting words in an RTCM-104 2.x message (after * parity checking and removing inversion). Note, these structures * are overlayed on the raw data in order to decode them into * bitfields; this will fail horribly if your C compiler introduces * padding between or before bit fields, or between 8-bit-aligned * bitfields and character arrays despite #pragma pack(1). The right * things happen under gcc 4.x on amd64, i386, ia64, all arm and mips * variants, m68k, and powerpc) * * (In practice, the only class of machines on which this is likely * to fail are word-aligned architectures without barrel shifters. * Very few of these are left in 2012. By test, we know of s390, s390x, * and sparc.) * * The RTCM 2.1 standard is less explicit than it should be about * signed-integer representations. Two's complement is specified for * some but not all. */ #define ZCOUNT_SCALE 0.6 /* sec */ #define PRCSMALL 0.02 /* meters */ #define PRCLARGE 0.32 /* meters */ #define RRSMALL 0.002 /* meters/sec */ #define RRLARGE 0.032 /* meters/sec */ #define MAXPCSMALL (0x7FFF * PCSMALL) /* 16-bits signed */ #define MAXRRSMALL (0x7F * RRSMALL) /* 8-bits signed */ #define XYZ_SCALE 0.01 /* meters */ #define DXYZ_SCALE 0.1 /* meters */ #define LA_SCALE (90.0/32767.0) /* degrees */ #define LO_SCALE (180.0/32767.0) /* degrees */ #define FREQ_SCALE 0.1 /* kHz */ #define FREQ_OFFSET 190.0 /* kHz */ #define CNR_OFFSET 24 /* dB */ #define TU_SCALE 5 /* minutes */ #define LATLON_SCALE 0.01 /* degrees */ #define RANGE_SCALE 4 /* kilometers */ #pragma pack(1) /* * Reminder: Emacs reverse-region is useful... */ #ifndef WORDS_BIGENDIAN /* little-endian, like x86 */ struct rtcm2_msg_t { struct rtcm2_msghw1 { /* header word 1 */ uint parity:6; uint refstaid:10; /* reference station ID */ uint msgtype:6; /* RTCM message type */ uint preamble:8; /* fixed at 01100110 */ uint _pad:2; } w1; struct rtcm2_msghw2 { /* header word 2 */ uint parity:6; uint stathlth:3; /* station health */ uint frmlen:5; uint sqnum:3; uint zcnt:13; uint _pad:2; } w2; union { /* msg 1 - differential gps corrections */ struct rtcm2_msg1 { struct gps_correction_t { struct { /* msg 1 word 3 */ uint parity:6; int prc1:16; uint satident1:5; /* satellite ID */ uint udre1:2; uint scale1:1; uint _pad:2; } w3; struct { /* msg 1 word 4 */ uint parity:6; uint satident2:5; /* satellite ID */ uint udre2:2; uint scale2:1; uint iod1:8; int rrc1:8; uint _pad:2; } w4; struct { /* msg 1 word 5 */ uint parity:6; int rrc2:8; int prc2:16; uint _pad:2; } w5; struct { /* msg 1 word 6 */ uint parity:6; int prc3_h:8; uint satident3:5; /* satellite ID */ uint udre3:2; uint scale3:1; uint iod2:8; uint _pad:2; } w6; struct { /* msg 1 word 7 */ uint parity:6; uint iod3:8; int rrc3:8; uint prc3_l:8; /* NOTE: uint for low byte */ uint _pad:2; } w7; } corrections[(RTCM2_WORDS_MAX - 2) / 5]; } type1; /* msg 3 - reference station parameters */ struct rtcm2_msg3 { struct { uint parity:6; uint x_h:24; uint _pad:2; } w3; struct { uint parity:6; uint y_h:16; uint x_l:8; uint _pad:2; } w4; struct { uint parity:6; uint z_h:8; uint y_l:16; uint _pad:2; } w5; struct { uint parity:6; uint z_l:24; uint _pad:2; } w6; } type3; /* msg 4 - reference station datum */ struct rtcm2_msg4 { struct { uint parity:6; uint datum_alpha_char2:8; uint datum_alpha_char1:8; uint spare:4; uint dat:1; uint dgnss:3; uint _pad:2; } w3; struct { uint parity:6; uint datum_sub_div_char2:8; uint datum_sub_div_char1:8; uint datum_sub_div_char3:8; uint _pad:2; } w4; struct { uint parity:6; uint dy_h:8; uint dx:16; uint _pad:2; } w5; struct { uint parity:6; uint dz:24; uint dy_l:8; uint _pad:2; } w6; } type4; /* msg 5 - constellation health */ struct rtcm2_msg5 { struct b_health_t { uint parity:6; uint unassigned:2; uint time_unhealthy:4; uint loss_warn:1; uint new_nav_data:1; uint health_enable:1; uint cn0:5; uint data_health:3; uint issue_of_data_link:1; uint sat_id:5; uint reserved:1; uint _pad:2; } health[MAXHEALTH]; } type5; /* msg 6 - null message */ /* msg 7 - beacon almanac */ struct rtcm2_msg7 { struct b_station_t { struct { uint parity:6; int lon_h:8; int lat:16; uint _pad:2; } w3; struct { uint parity:6; uint freq_h:6; uint range:10; uint lon_l:8; uint _pad:2; } w4; struct { uint parity:6; uint encoding:1; uint sync_type:1; uint mod_mode:1; uint bit_rate:3; /* * ITU-R M.823-2 page 9 and RTCM-SC104 v2.1 pages * 4-21 and 4-22 are in conflict over the next two * field sizes. ITU says 9+3, RTCM says 10+2. * The latter correctly decodes the USCG station * id's so I'll use that one here. -wsr */ uint station_id:10; uint health:2; uint freq_l:6; uint _pad:2; } w5; } almanac[(RTCM2_WORDS_MAX - 2)/3]; } type7; /* msg 13 - Ground Transmitter Parameters (RTCM2.3 only) */ struct rtcm2_msg13 { struct { uint parity:6; int lat:16; uint reserved:6; uint rangeflag:1; uint status:1; uint _pad:2; } w1; struct { uint parity:6; uint range:8; int lon:16; uint _pad:2; } w2; } type13; /* msg 14 - GPS Time of Week (RTCM2.3 only) */ struct rtcm2_msg14 { struct { uint parity:6; uint leapsecs:6; uint hour:8; uint week:10; uint _pad:2; } w1; } type14; /* msg 16 - text msg */ struct rtcm2_msg16 { struct { uint parity:6; uint byte3:8; uint byte2:8; uint byte1:8; uint _pad:2; } txt[RTCM2_WORDS_MAX-2]; } type16; /* msg 31 - differential GLONASS corrections */ struct rtcm2_msg31 { struct glonass_correction_t { struct { /* msg 1 word 3 */ uint parity:6; int prc1:16; uint satident1:5; /* satellite ID */ uint udre1:2; uint scale1:1; uint _pad:2; } w3; struct { /* msg 1 word 4 */ uint parity:6; uint satident2:5; /* satellite ID */ uint udre2:2; uint scale2:1; uint tod1:7; uint change1:1; int rrc1:8; uint _pad:2; } w4; struct { /* msg 1 word 5 */ uint parity:6; int rrc2:8; int prc2:16; uint _pad:2; } w5; struct { /* msg 1 word 6 */ uint parity:6; int prc3_h:8; uint satident3:5; /* satellite ID */ uint udre3:2; uint scale3:1; uint tod2:7; uint change2:1; uint _pad:2; } w6; struct { /* msg 1 word 7 */ uint parity:6; uint tod3:7; uint change3:1; int rrc3:8; uint prc3_l:8; /* NOTE: uint for low byte */ uint _pad:2; } w7; } corrections[(RTCM2_WORDS_MAX - 2) / 5]; } type31; /* unknown message */ isgps30bits_t rtcm2_msgunk[RTCM2_WORDS_MAX-2]; } msg_type; } __attribute__((__packed__)); #endif /* LITTLE_ENDIAN */ #ifdef WORDS_BIGENDIAN struct rtcm2_msg_t { struct rtcm2_msghw1 { /* header word 1 */ uint _pad:2; uint preamble:8; /* fixed at 01100110 */ uint msgtype:6; /* RTCM message type */ uint refstaid:10; /* reference station ID */ uint parity:6; } w1; struct rtcm2_msghw2 { /* header word 2 */ uint _pad:2; uint zcnt:13; uint sqnum:3; uint frmlen:5; uint stathlth:3; /* station health */ uint parity:6; } w2; union { /* msg 1 - differential GPS corrections */ struct rtcm2_msg1 { struct gps_correction_t { struct { /* msg 1 word 3 */ uint _pad:2; uint scale1:1; uint udre1:2; uint satident1:5; /* satellite ID */ int prc1:16; uint parity:6; } w3; struct { /* msg 1 word 4 */ uint _pad:2; int rrc1:8; uint iod1:8; uint scale2:1; uint udre2:2; uint satident2:5; /* satellite ID */ uint parity:6; } w4; struct { /* msg 1 word 5 */ uint _pad:2; int prc2:16; int rrc2:8; uint parity:6; } w5; struct { /* msg 1 word 6 */ uint _pad:2; uint iod2:8; uint scale3:1; uint udre3:2; uint satident3:5; /* satellite ID */ int prc3_h:8; uint parity:6; } w6; struct { /* msg 1 word 7 */ uint _pad:2; uint prc3_l:8; /* NOTE: uint for low byte */ int rrc3:8; uint iod3:8; uint parity:6; } w7; } corrections[(RTCM2_WORDS_MAX - 2) / 5]; } type1; /* msg 3 - reference station parameters */ struct rtcm2_msg3 { struct { uint _pad:2; uint x_h:24; uint parity:6; } w3; struct { uint _pad:2; uint x_l:8; uint y_h:16; uint parity:6; } w4; struct { uint _pad:2; uint y_l:16; uint z_h:8; uint parity:6; } w5; struct { uint _pad:2; uint z_l:24; uint parity:6; } w6; } type3; /* msg 4 - reference station datum */ struct rtcm2_msg4 { struct { uint _pad:2; uint dgnss:3; uint dat:1; uint spare:4; uint datum_alpha_char1:8; uint datum_alpha_char2:8; uint parity:6; } w3; struct { uint _pad:2; uint datum_sub_div_char3:8; uint datum_sub_div_char1:8; uint datum_sub_div_char2:8; uint parity:6; } w4; struct { uint _pad:2; uint dx:16; uint dy_h:8; uint parity:6; } w5; struct { uint _pad:2; uint dy_l:8; uint dz:24; uint parity:6; } w6; } type4; /* msg 5 - constellation health */ struct rtcm2_msg5 { struct b_health_t { uint _pad:2; uint reserved:1; uint sat_id:5; uint issue_of_data_link:1; uint data_health:3; uint cn0:5; uint health_enable:1; uint new_nav_data:1; uint loss_warn:1; uint time_unhealthy:4; uint unassigned:2; uint parity:6; } health[MAXHEALTH]; } type5; /* msg 6 - null message */ /* msg 7 - beacon almanac */ struct rtcm2_msg7 { struct b_station_t { struct { uint _pad:2; int lat:16; int lon_h:8; uint parity:6; } w3; struct { uint _pad:2; uint lon_l:8; uint range:10; uint freq_h:6; uint parity:6; } w4; struct { uint _pad:2; uint freq_l:6; uint health:2; uint station_id:10; /* see comments in LE struct above. */ uint bit_rate:3; uint mod_mode:1; uint sync_type:1; uint encoding:1; uint parity:6; } w5; } almanac[(RTCM2_WORDS_MAX - 2)/3]; } type7; /* msg 13 - Ground Transmitter Parameters (RTCM2.3 only) */ struct rtcm2_msg13 { struct { uint _pad:2; uint status:1; uint rangeflag:1; uint reserved:6; int lat:16; uint parity:6; } w1; struct { uint _pad:2; int lon:16; uint range:8; uint parity:6; } w2; } type13; /* msg 14 - GPS Time of Week (RTCM2.3 only) */ struct rtcm2_msg14 { struct { uint _pad:2; uint week:10; uint hour:8; uint leapsecs:6; uint parity:6; } w1; } type14; /* msg 16 - text msg */ struct rtcm2_msg16 { struct { uint _pad:2; uint byte1:8; uint byte2:8; uint byte3:8; uint parity:6; } txt[RTCM2_WORDS_MAX-2]; } type16; /* msg 31 - differential GLONASS corrections */ struct rtcm2_msg31 { struct glonass_correction_t { struct { /* msg 1 word 3 */ uint _pad:2; uint scale1:1; uint udre1:2; uint satident1:5; /* satellite ID */ int prc1:16; uint parity:6; } w3; struct { /* msg 1 word 4 */ uint _pad:2; int rrc1:8; uint change1:1; uint tod1:7; uint scale2:1; uint udre2:2; uint satident2:5; /* satellite ID */ uint parity:6; } w4; struct { /* msg 1 word 5 */ uint _pad:2; int prc2:16; int rrc2:8; uint parity:6; } w5; struct { /* msg 1 word 6 */ uint _pad:2; uint change2:1; uint tod2:7; uint scale3:1; uint udre3:2; uint satident3:5; /* satellite ID */ int prc3_h:8; uint parity:6; } w6; struct { /* msg 1 word 7 */ uint _pad:2; uint prc3_l:8; /* NOTE: uint for low byte */ int rrc3:8; uint change3:1; uint tod3:7; uint parity:6; } w7; } corrections[(RTCM2_WORDS_MAX - 2) / 5]; } type31; /* unknown message */ isgps30bits_t rtcm2_msgunk[RTCM2_WORDS_MAX-2]; } msg_type; } __attribute__((__packed__)); #endif /* BIG ENDIAN */ #ifdef RTCM104V2_ENABLE #define PREAMBLE_PATTERN 0x66 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(struct rtcm2_t *tp, char *buf) /* break out the raw bits into the content fields */ { int len; unsigned int n, w; struct rtcm2_msg_t *msg = (struct rtcm2_msg_t *)buf; tp->type = msg->w1.msgtype; tp->length = msg->w2.frmlen; tp->zcount = msg->w2.zcnt * ZCOUNT_SCALE; tp->refstaid = msg->w1.refstaid; tp->seqnum = msg->w2.sqnum; tp->stathlth = msg->w2.stathlth; len = (int)tp->length; n = 0; switch (tp->type) { case 1: case 9: { struct gps_correction_t *m = &msg->msg_type.type1.corrections[0]; while (len >= 0) { if (len >= 2) { tp->gps_ranges.sat[n].ident = m->w3.satident1; tp->gps_ranges.sat[n].udre = m->w3.udre1; tp->gps_ranges.sat[n].iod = m->w4.iod1; tp->gps_ranges.sat[n].prc = m->w3.prc1 * (m->w3.scale1 ? PRCLARGE : PRCSMALL); tp->gps_ranges.sat[n].rrc = m->w4.rrc1 * (m->w3.scale1 ? RRLARGE : RRSMALL); n++; } if (len >= 4) { tp->gps_ranges.sat[n].ident = m->w4.satident2; tp->gps_ranges.sat[n].udre = m->w4.udre2; tp->gps_ranges.sat[n].iod = m->w6.iod2; tp->gps_ranges.sat[n].prc = m->w5.prc2 * (m->w4.scale2 ? PRCLARGE : PRCSMALL); tp->gps_ranges.sat[n].rrc = m->w5.rrc2 * (m->w4.scale2 ? RRLARGE : RRSMALL); n++; } if (len >= 5) { tp->gps_ranges.sat[n].ident = m->w6.satident3; tp->gps_ranges.sat[n].udre = m->w6.udre3; tp->gps_ranges.sat[n].iod = m->w7.iod3; tp->gps_ranges.sat[n].prc = ((m->w6.prc3_h << 8) | (m->w7.prc3_l)) * (m->w6.scale3 ? PRCLARGE : PRCSMALL); tp->gps_ranges.sat[n].rrc = m->w7.rrc3 * (m->w6.scale3 ? RRLARGE : RRSMALL); n++; } len -= 5; m++; } tp->gps_ranges.nentries = n; } break; case 3: { 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; } } break; case 4: if ((tp->reference.valid = len >= 2)) { 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; if (m->w3.datum_alpha_char1) { tp->reference.datum[n++] = (char)(m->w3.datum_alpha_char1); } if (m->w3.datum_alpha_char2) { tp->reference.datum[n++] = (char)(m->w3.datum_alpha_char2); } if (m->w4.datum_sub_div_char1) { tp->reference.datum[n++] = (char)(m->w4.datum_sub_div_char1); } if (m->w4.datum_sub_div_char2) { tp->reference.datum[n++] = (char)(m->w4.datum_sub_div_char2); } if (m->w4.datum_sub_div_char3) { tp->reference.datum[n++] = (char)(m->w4.datum_sub_div_char3); } /* we used to say n++ here, but scan-build complains */ 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.dz = m->w6.dz * DXYZ_SCALE; } else tp->reference.sense = SENSE_INVALID; } break; case 5: 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]; csp->ident = m->sat_id; csp->iodl = m->issue_of_data_link != 0; csp->health = m->data_health; csp->snr = (int)(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; } tp->conhealth.nentries = n; break; case 7: for (w = 0; w < (unsigned)len; w++) { struct station_t *np = &tp->almanac.station[n]; struct b_station_t *mp = &msg->msg_type.type7.almanac[w]; np->latitude = mp->w3.lat * LA_SCALE; np->longitude = ((mp->w3.lon_h << 8) | mp->w4.lon_l) * LO_SCALE; np->range = mp->w4.range; 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]; n++; } tp->almanac.nentries = (unsigned)(len / 3); break; case 13: tp->xmitter.status = (bool)msg->msg_type.type13.w1.status; tp->xmitter.rangeflag = (bool)msg->msg_type.type13.w1.rangeflag; tp->xmitter.lat = msg->msg_type.type13.w1.lat * LATLON_SCALE; tp->xmitter.lon = msg->msg_type.type13.w2.lon * LATLON_SCALE; tp->xmitter.range = msg->msg_type.type13.w2.range * RANGE_SCALE; if (tp->xmitter.range == 0) tp->xmitter.range = 1024; break; case 14: tp->gpstime.week = msg->msg_type.type14.w1.week; tp->gpstime.hour = msg->msg_type.type14.w1.hour; tp->gpstime.leapsecs = msg->msg_type.type14.w1.leapsecs; break; case 16: for (w = 0; w < (unsigned)len; w++) { if (!msg->msg_type.type16.txt[w].byte1) { break; } tp->message[n++] = (char)(msg->msg_type.type16.txt[w].byte1); if (!msg->msg_type.type16.txt[w].byte2) { break; } tp->message[n++] = (char)(msg->msg_type.type16.txt[w].byte2); if (!msg->msg_type.type16.txt[w].byte3) { break; } tp->message[n++] = (char)(msg->msg_type.type16.txt[w].byte3); } tp->message[n] = '\0'; break; case 31: { struct glonass_correction_t *m = &msg->msg_type.type31.corrections[0]; while (len >= 0) { if (len >= 2) { tp->glonass_ranges.sat[n].ident = m->w3.satident1; tp->glonass_ranges.sat[n].udre = m->w3.udre1; tp->glonass_ranges.sat[n].change = (bool)m->w4.change1; tp->glonass_ranges.sat[n].tod = m->w4.tod1; tp->glonass_ranges.sat[n].prc = m->w3.prc1 * (m->w3.scale1 ? PRCLARGE : PRCSMALL); tp->glonass_ranges.sat[n].rrc = m->w4.rrc1 * (m->w3.scale1 ? RRLARGE : RRSMALL); n++; } if (len >= 4) { tp->glonass_ranges.sat[n].ident = m->w4.satident2; tp->glonass_ranges.sat[n].udre = m->w4.udre2; tp->glonass_ranges.sat[n].change = (bool)m->w6.change2; tp->glonass_ranges.sat[n].tod = m->w6.tod2; tp->glonass_ranges.sat[n].prc = m->w5.prc2 * (m->w4.scale2 ? PRCLARGE : PRCSMALL); tp->glonass_ranges.sat[n].rrc = m->w5.rrc2 * (m->w4.scale2 ? RRLARGE : RRSMALL); n++; } if (len >= 5) { tp->glonass_ranges.sat[n].ident = m->w6.satident3; tp->glonass_ranges.sat[n].udre = m->w6.udre3; tp->glonass_ranges.sat[n].change = (bool)m->w7.change3; tp->glonass_ranges.sat[n].tod = m->w7.tod3; tp->glonass_ranges.sat[n].prc = ((m->w6.prc3_h << 8) | (m->w7.prc3_l)) * (m->w6.scale3 ? PRCLARGE : PRCSMALL); tp->glonass_ranges.sat[n].rrc = m->w7.rrc3 * (m->w6.scale3 ? RRLARGE : RRSMALL); n++; } len -= 5; m++; } tp->glonass_ranges.nentries = n; } break; default: memcpy(tp->words, msg->msg_type.rtcm2_msgunk, (RTCM2_WORDS_MAX - 2) * sizeof(isgps30bits_t)); break; } } static bool preamble_match(isgps30bits_t * w) { return (((struct rtcm2_msghw1 *)w)->preamble == PREAMBLE_PATTERN); } static bool length_check(struct gps_lexer_t *lexer) { 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_lexer_t *lexer, unsigned int c) { return isgps_decode(lexer, preamble_match, length_check, RTCM2_WORDS_MAX, c); } #endif /* RTCM104V2_ENABLE */ gpsd-3.15/driver_rtcm3.c0000664000175000017500000004204112506321665013323 0ustar esresr/***************************************************************************** This is a decoder for RTCM-104 3.x, a serial protocol used for broadcasting pseudorange corrections from differential-GPS reference stations. The applicable specification is RTCM 10403.1: RTCM Paper 177-2006-SC104-STD. This obsolesces the earlier RTCM-104 2.x specifications. The specification document is proprietary; ordering instructions are accessible from under "Publications". Unike the RTCM 2.x protocol, RTCM3.x does not use the strange sliding-bit-window IS-GPS-200 protocol as a transport layer, but is a self-contained byte-oriented packet protocol. Packet recognition is handled in the GPSD packet-getter state machine; this code is concerned with unpacking the packets into well-behaved C structures, coping with odd field lengths and fields that may overlap byte boudaries. These report structures live in gps.h. Note that the unpacking this module does is probably useful only for RTCM reporting and diagnostic tools. It is not necessary when passing RTCM corrections to a GPS, which normally should just be passed an entire correction packet for processing by their internal firmware. Decodes of the following types have been verified: 1004, 1005, 1006, 1008, 1012, 1013, 1029. There is good reason to believe the 1007 code is correct, as it's identical to 1008 up to where it ends. The 1033 decode was arrived at by looking at an rtcminspect dump and noting that it carries an information superset of the 1008. There are additional Receiver and Firmware fields we're not certain to decode without access to an RTCM3 standard at revision 4 or later, but the guess in the code has been observed to correctly analyze a message with a nonempty Receiver field. This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. *****************************************************************************/ #include #include "gpsd.h" #include "bits.h" #ifdef RTCM104V3_ENABLE /* scaling constants for RTCM3 real number types */ #define GPS_PSEUDORANGE_RESOLUTION 0.02 /* DF011 */ #define PSEUDORANGE_DIFF_RESOLUTION 0.0005 /* DF012,DF042 */ #define CARRIER_NOISE_RATIO_UNITS 0.25 /* DF015, DF045, DF50 */ #define ANTENNA_POSITION_RESOLUTION 0.0001 /* DF025-027 */ #define GLONASS_PSEUDORANGE_RESOLUTION 0.02 /* DF041 */ #define ANTENNA_DEGREE_RESOLUTION 25e-6 /* DF062 */ #define GPS_EPOCH_TIME_RESOLUTION 0.1 /* DF065 */ #define PHASE_CORRECTION_RESOLUTION 0.5 /* DF069-070 */ /* Other magic values */ #define GPS_INVALID_PSEUDORANGE 0x80000 /* DF012, DF018 */ #define GLONASS_INVALID_RANGEINCR 0x2000 /* DF047 */ #define GLONASS_CHANNEL_BASE 7 /* DF040 */ /* Large case statements make GNU indent very confused */ /* *INDENT-OFF* */ void rtcm3_unpack(const struct gps_context_t *context, struct rtcm3_t *rtcm, char *buf) /* break out the raw bits into the scaled report-structure fields */ { unsigned int n, n2, n3, n4; int bitcount = 0; unsigned int i; signed long temp; #define ugrab(width) (bitcount += width, ubits((unsigned char *)buf, bitcount-width, width, false)) #define sgrab(width) (bitcount += width, sbits((signed char *)buf, bitcount-width, width, false)) #define GPS_PSEUDORANGE(fld, len) \ {temp = (unsigned long)ugrab(len); \ if (temp == GPS_INVALID_PSEUDORANGE) \ fld.pseudorange = 0; \ else \ fld.pseudorange = temp * GPS_PSEUDORANGE_RESOLUTION;} #define RANGEDIFF(fld, len) \ temp = (long)sgrab(len); \ if (temp == GPS_INVALID_PSEUDORANGE) \ fld.rangediff = 0; \ else \ fld.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION; //assert(ugrab(8) == 0xD3); //assert(ugrab(6) == 0x00); ugrab(14); rtcm->length = (uint)ugrab(10); rtcm->type = (uint)ugrab(12); gpsd_log(&context->errout, LOG_RAW, "RTCM3: type %d payload length %d\n", rtcm->type, rtcm->length); 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 = (unsigned short)ugrab(5); rtcm->rtcmtypes.rtcm3_1001.header.smoothing = (bool)ugrab(1); rtcm->rtcmtypes.rtcm3_1001.header.interval = (unsigned short)ugrab(3); #define R1001 rtcm->rtcmtypes.rtcm3_1001.rtk_data[i] for (i = 0; i < rtcm->rtcmtypes.rtcm3_1001.header.satcount; i++) { R1001.ident = (unsigned short)ugrab(6); R1001.L1.indicator = (unsigned char)ugrab(1); GPS_PSEUDORANGE(R1001.L1, 24); RANGEDIFF(R1001.L1, 20); R1001.L1.locktime = (unsigned char)sgrab(7); } #undef R1001 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 = (unsigned short)ugrab(5); rtcm->rtcmtypes.rtcm3_1002.header.smoothing = (bool)ugrab(1); rtcm->rtcmtypes.rtcm3_1002.header.interval = (unsigned short)ugrab(3); #define R1002 rtcm->rtcmtypes.rtcm3_1002.rtk_data[i] for (i = 0; i < rtcm->rtcmtypes.rtcm3_1002.header.satcount; i++) { R1002.ident = (unsigned short)ugrab(6); R1002.L1.indicator = (unsigned char)ugrab(1); GPS_PSEUDORANGE(R1002.L1, 24); RANGEDIFF(R1002.L1, 20); R1002.L1.locktime = (unsigned char)sgrab(7); R1002.L1.ambiguity = (unsigned char)ugrab(8); R1002.L1.CNR = (ugrab(8)) * CARRIER_NOISE_RATIO_UNITS; } #undef R1002 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 = (unsigned short)ugrab(5); rtcm->rtcmtypes.rtcm3_1003.header.smoothing = (bool)ugrab(1); rtcm->rtcmtypes.rtcm3_1003.header.interval = (unsigned short)ugrab(3); #define R1003 rtcm->rtcmtypes.rtcm3_1003.rtk_data[i] for (i = 0; i < rtcm->rtcmtypes.rtcm3_1003.header.satcount; i++) { R1003.ident = (unsigned short)ugrab(6); R1003.L1.indicator = (unsigned char)ugrab(1); GPS_PSEUDORANGE(R1003.L1, 24); RANGEDIFF(R1003.L1, 20); R1003.L1.locktime = (unsigned char)sgrab(7); R1003.L2.indicator = (unsigned char)ugrab(2); GPS_PSEUDORANGE(R1003.L2, 24); temp = (long)sgrab(20); if (temp == GPS_INVALID_PSEUDORANGE) R1003.L2.rangediff = 0; else R1003.L2.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION; R1003.L2.locktime = (unsigned char)sgrab(7); } #undef R1003 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 = (unsigned short)ugrab(5); rtcm->rtcmtypes.rtcm3_1004.header.smoothing = (bool)ugrab(1); rtcm->rtcmtypes.rtcm3_1004.header.interval = (unsigned short)ugrab(3); #define R1004 rtcm->rtcmtypes.rtcm3_1004.rtk_data[i] for (i = 0; i < rtcm->rtcmtypes.rtcm3_1004.header.satcount; i++) { R1004.ident = (unsigned short)ugrab(6); R1004.L1.indicator = (bool)ugrab(1); GPS_PSEUDORANGE(R1004.L1, 24); RANGEDIFF(R1004.L1, 20); R1004.L1.locktime = (unsigned char)sgrab(7); R1004.L1.ambiguity = (unsigned char)ugrab(8); R1004.L1.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS; R1004.L2.indicator = (unsigned char)ugrab(2); GPS_PSEUDORANGE(R1004.L2, 14); RANGEDIFF(R1004.L2, 20); R1004.L2.locktime = (unsigned char)sgrab(7); R1004.L2.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS; } #undef R1004 break; case 1005: /* Stationary Antenna Reference Point, No Height Information */ #define R1005 rtcm->rtcmtypes.rtcm3_1005 R1005.station_id = (unsigned short)ugrab(12); ugrab(6); /* reserved */ R1005.system = ugrab(3); R1005.reference_station = (bool)ugrab(1); R1005.ecef_x = sgrab(38) * ANTENNA_POSITION_RESOLUTION; R1005.single_receiver = ugrab(1); ugrab(1); R1005.ecef_y = sgrab(38) * ANTENNA_POSITION_RESOLUTION; ugrab(2); R1005.ecef_z = sgrab(38) * ANTENNA_POSITION_RESOLUTION; #undef R1005 break; case 1006: /* Stationary Antenna Reference Point, with Height Information */ #define R1006 rtcm->rtcmtypes.rtcm3_1006 R1006.station_id = (unsigned short)ugrab(12); (void)ugrab(6); /* reserved */ R1006.system = ugrab(3); R1006.reference_station = (bool)ugrab(1); R1006.ecef_x = sgrab(38) * ANTENNA_POSITION_RESOLUTION; R1006.single_receiver = ugrab(1); ugrab(1); R1006.ecef_y = sgrab(38) * ANTENNA_POSITION_RESOLUTION; ugrab(2); R1006.ecef_z = sgrab(38) * ANTENNA_POSITION_RESOLUTION; R1006.height = ugrab(16) * ANTENNA_POSITION_RESOLUTION; #undef R1006 break; 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 + 7, n); rtcm->rtcmtypes.rtcm3_1007.descriptor[n] = '\0'; bitcount += 8 * n; rtcm->rtcmtypes.rtcm3_1007.setup_id = ugrab(8); break; 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 + 7, n); rtcm->rtcmtypes.rtcm3_1008.descriptor[n] = '\0'; bitcount += 8 * n; rtcm->rtcmtypes.rtcm3_1008.setup_id = ugrab(8); n2 = (unsigned long)ugrab(8); (void)memcpy(rtcm->rtcmtypes.rtcm3_1008.serial, buf + 9 + n, n2); rtcm->rtcmtypes.rtcm3_1008.serial[n2] = '\0'; //bitcount += 8 * 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 = (unsigned short)ugrab(5); rtcm->rtcmtypes.rtcm3_1009.header.smoothing = (bool)ugrab(1); rtcm->rtcmtypes.rtcm3_1009.header.interval = (unsigned short)ugrab(3); #define R1009 rtcm->rtcmtypes.rtcm3_1009.rtk_data[i] for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) { R1009.ident = (unsigned short)ugrab(6); R1009.L1.indicator = (bool)ugrab(1); R1009.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1009.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1009.L1, 20); R1009.L1.locktime = (unsigned char)sgrab(7); } #undef R1009 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 = (unsigned short)ugrab(5); rtcm->rtcmtypes.rtcm3_1010.header.smoothing = (bool)ugrab(1); rtcm->rtcmtypes.rtcm3_1010.header.interval = (unsigned short)ugrab(3); #define R1010 rtcm->rtcmtypes.rtcm3_1010.rtk_data[i] for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) { R1010.ident = (unsigned short)ugrab(6); R1010.L1.indicator = (bool)ugrab(1); R1010.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1010.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1010.L1, 20); R1010.L1.locktime = (unsigned char)sgrab(7); R1010.L1.ambiguity = (unsigned char)ugrab(7); R1010.L1.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS; } #undef R1010 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 = (unsigned short)ugrab(5); rtcm->rtcmtypes.rtcm3_1011.header.smoothing = (bool)ugrab(1); rtcm->rtcmtypes.rtcm3_1011.header.interval = (unsigned short)ugrab(3); #define R1011 rtcm->rtcmtypes.rtcm3_1011.rtk_data[i] for (i = 0; i < rtcm->rtcmtypes.rtcm3_1011.header.satcount; i++) { R1011.ident = (unsigned short)ugrab(6); R1011.L1.indicator = (bool)ugrab(1); R1011.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1011.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1011.L1, 20); R1011.L1.locktime = (unsigned char)sgrab(7); R1011.L1.ambiguity = (unsigned char)ugrab(7); R1011.L1.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS; R1011.L2.indicator = (bool)ugrab(1); R1011.L2.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1011.L2.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1011.L2, 20); R1011.L2.locktime = (unsigned char)sgrab(7); R1011.L2.ambiguity = (unsigned char)ugrab(7); R1011.L2.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS; } #undef R1011 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 = (unsigned short)ugrab(5); rtcm->rtcmtypes.rtcm3_1012.header.smoothing = (bool)ugrab(1); rtcm->rtcmtypes.rtcm3_1012.header.interval = (unsigned short)ugrab(3); #define R1012 rtcm->rtcmtypes.rtcm3_1012.rtk_data[i] for (i = 0; i < rtcm->rtcmtypes.rtcm3_1012.header.satcount; i++) { unsigned int rangeincr; R1012.ident = (unsigned short)ugrab(6); R1012.L1.indicator = (bool)ugrab(1); R1012.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1012.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1012.L1, 20); R1012.L1.locktime = (unsigned char)ugrab(7); R1012.L1.ambiguity = (unsigned char)ugrab(7); R1012.L1.CNR = (unsigned char)ugrab(8) * CARRIER_NOISE_RATIO_UNITS; R1012.L2.indicator = (bool)ugrab(2); rangeincr = ugrab(14); if (rangeincr == GLONASS_INVALID_RANGEINCR) R1012.L2.pseudorange = 0; else R1012.L2.pseudorange = (rangeincr * GLONASS_PSEUDORANGE_RESOLUTION); RANGEDIFF(R1012.L2, 20); R1012.L2.locktime = (unsigned char)sgrab(7); R1012.L2.CNR = (unsigned char)ugrab(8) * CARRIER_NOISE_RATIO_UNITS; } #undef R1012 break; 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); #define R1013 rtcm->rtcmtypes.rtcm3_1013.announcements[i] for (i = 0; i < rtcm->rtcmtypes.rtcm3_1013.ncount; i++) { R1013.id = (unsigned short)ugrab(12); R1013.sync = (bool)ugrab(1); R1013.interval = (unsigned short)ugrab(16); } #undef R1013 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; break; case 1029: rtcm->rtcmtypes.rtcm3_1029.station_id = (unsigned short)ugrab(12); 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); rtcm->rtcmtypes.rtcm3_1029.unicode_units = (size_t)ugrab(8); (void)memcpy(rtcm->rtcmtypes.rtcm3_1029.text, buf + 12, rtcm->rtcmtypes.rtcm3_1029.unicode_units); break; case 1033: /* see note in header */ rtcm->rtcmtypes.rtcm3_1033.station_id = (unsigned short)ugrab(12); n = (unsigned long)ugrab(8); (void)memcpy(rtcm->rtcmtypes.rtcm3_1033.descriptor, buf + 7, n); rtcm->rtcmtypes.rtcm3_1033.descriptor[n] = '\0'; bitcount += 8 * n; rtcm->rtcmtypes.rtcm3_1033.setup_id = ugrab(8); n2 = (unsigned long)ugrab(8); (void)memcpy(rtcm->rtcmtypes.rtcm3_1033.serial, buf + 9 + n, n2); rtcm->rtcmtypes.rtcm3_1033.serial[n2] = '\0'; bitcount += 8 * n2; n3 = (unsigned long)ugrab(8); (void)memcpy(rtcm->rtcmtypes.rtcm3_1033.receiver, buf + 10+n+n2, n3); rtcm->rtcmtypes.rtcm3_1033.receiver[n3] = '\0'; bitcount += 8 * n3; n4 = (unsigned long)ugrab(8); (void)memcpy(rtcm->rtcmtypes.rtcm3_1033.firmware, buf + 11+n+n2+n3, n3); rtcm->rtcmtypes.rtcm3_1033.firmware[n4] = '\0'; //bitcount += 8 * n4; break; default: /* * Leader bytes, message length, and checksum won't be copied. * The first 12 bits of the copied payload will be the type field. */ memcpy(rtcm->rtcmtypes.data, buf+3, rtcm->length); break; } #undef RANGEDIFF #undef GPS_PSEUDORANGE #undef sgrab #undef ugrab } /* *INDENT-ON* */ #endif /* RTCM104V3_ENABLE */ gpsd-3.15/driver_sirf.c0000664000175000017500000014470412520742615013245 0ustar esresr/* * This is the gpsd driver for SiRF GPSes operating in binary mode. * It also handles early u-bloxes that were SiRF derivatives. * * The advantages: Reports climb/sink rate (raw-mode clients won't see this). * Also, we can flag DGPS satellites used in the skyview when SBAS is in use. * The disadvantages: Doesn't return PDOP or VDOP, just HDOP. * * Chris Kuethe, our SiRF expert, tells us: * * "I don't see any indication in any of my material that PDOP, GDOP * or VDOP are output. There are quantities called Estimated * {Horizontal Position, Vertical Position, Time, Horizonal Velocity} * Error, but those are apparently only valid when SiRFDRive is * active." * * "(SiRFdrive is their Dead Reckoning augmented firmware. It * allows you to feed odometer ticks, gyro and possibly * accelerometer inputs to the chip to allow it to continue * to navigate in the absence of satellite information, and * to improve fixes when you do have satellites.)" * * "[When we need RINEX data, we can get it from] SiRF Message #5. * If it's no longer implemented on your receiver, messages * 7, 28, 29 and 30 will give you the same information." * * There is a known problem with the SiRF IV: it is prone to freeze * when being switched back to NMEA mode from SiRF binary. The * failure is randomly flaky, you may get away with several mode * flips before triggering it. Powering off the device resets and * unfreezes it. We have tries waiting on command acknowledges as * the manual advises; this does not fix the problem. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include "gpsd.h" #include "bits.h" #include "strfuncs.h" #if defined(SIRF_ENABLE) && defined(BINARY_ENABLE) #define HI(n) ((n) >> 8) #define LO(n) ((n) & 0xff) /* * According to the protocol reference, if you don't get ACK/NACK in response * to a control send withing 6 seconds, you should just retry. */ #define SIRF_RETRY_TIME 6 /* Poll Software Version MID 132 */ static unsigned char versionprobe[] = { 0xa0, 0xa2, 0x00, 0x02, 0x84, /* MID 132 */ 0x00, /* unused */ 0x00, 0x00, 0xb0, 0xb3 }; #ifdef RECONFIGURE_ENABLE /* 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 }; /* 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 }; /* 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 }; /* 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 }; /* 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 }; /* disable MID XX */ static unsigned char unsetmidXX[] = { 0xa0, 0xa2, 0x00, 0x08, 0xa6, /* MID 166 */ 0x00, /* enable 1 */ 0x00, /* MID 0xXX */ 0x00, /* never */ 0x00, 0x00, /* unused */ 0x00, 0x00, /* unused */ 0x00, 0x00, 0xb0, 0xb3 }; /* message to enable: * MID 7 Clock Status * MID 8 50Bps subframe data * MID 17 Differential Corrections * MID 28 Nav Lib Measurement Data * MID 29 Nav Lib DGPS Data * 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 turns on MIDs 7, 8, 17, 28, 29, 30 and 31 */ 0x10, 0x00, 0x00, 0xb0, 0xb3 }; /* disable subframe data */ 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 turns off MIDs 7, 8, 17, 28, 29, 30 and 31 */ 0x00, /* reset bit map */ 0x00, 0x00, 0xb0, 0xb3 }; /* mode control MID */ 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 }; #endif /* RECONFIGURE_ENABLE */ static gps_mask_t sirf_msg_debug(struct gps_device_t *, unsigned char *, size_t); static gps_mask_t sirf_msg_errors(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_nl(struct gps_device_t *, unsigned char *, size_t); static gps_mask_t sirf_msg_ee(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_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_dgpsstatus(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(struct gps_device_t *session, unsigned char *msg) { unsigned int crc; size_t i, len; bool ok; unsigned int type = (unsigned int)msg[4]; /* * Control strings spaced too closely together confuse the SiRF * IV. This wasn't an issue on older SiRFs, but they've gone to a * lower-powered processor that apparently has trouble keeping up. * Now you have to wait for the ACK, otherwise chaos ensues. * Add instrumentation to reveal when this may happen. */ /* can also be false because ACK was received after last send */ if (session->driver.sirf.need_ack > 0) { gpsd_log(&session->context->errout, LOG_WARN, "SiRF: warning, write of control type %02x while awaiting ACK for %02x.\n", type, session->driver.sirf.need_ack); } len = (size_t) ((msg[2] << 8) | msg[3]); /* 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_log(&session->context->errout, LOG_PROG, "SiRF: Writing control type %02x:\n", type); ok = (gpsd_write(session, (const char *)msg, len+8) == (ssize_t) (len+8)); session->driver.sirf.need_ack = type; return (ok); } #ifdef CONTROLSEND_ENABLE static ssize_t sirf_control_send(struct gps_device_t *session, char *msg, size_t len) { 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); session->msgbuf[len + 6] = (char)0xb0; session->msgbuf[len + 7] = (char)0xb3; session->msgbuflen = len + 8; /* *INDENT-OFF* */ return sirf_write(session, (unsigned char *)session->msgbuf) ? (int)session->msgbuflen : -1; /* *INDENT-ON* */ } #endif /* CONTROLSEND_ENABLE */ #ifdef RECONFIGURE_ENABLE static bool sirfbin_speed(struct gps_device_t *session, speed_t speed, char parity, int stopbits) /* change speed in binary mode */ { 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 }; gpsd_log(&session->context->errout, LOG_PROG, "SiRF: sirf_speed(%u,%c,%d)\n", (unsigned int)speed, parity, stopbits); if (9600 >= speed) { gpsd_log(&session->context->errout, LOG_WARN, "SiRF may lag at 9600bps or less.\n"); } switch (parity) { case 'E': case 2: parity = (char)2; break; case 'O': case 1: parity = (char)1; break; case 'N': case 0: default: parity = (char)0; break; } msg[5] = (unsigned char)((speed >> 24) & 0xff); msg[6] = (unsigned char)((speed >> 16) & 0xff); msg[7] = (unsigned char)((speed >> 8) & 0xff); msg[8] = (unsigned char)(speed & 0xff); msg[10] = (unsigned char)stopbits; msg[11] = (unsigned char)parity; return (sirf_write(session, msg)); } static bool sirf_to_nmea(struct gps_device_t *session, speed_t speed) /* switch from binary to NMEA at specified baud */ { 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 }; if (speed >= 0xffff) { gpsd_log(&session->context->errout, LOG_ERROR, "SiRF: can't switch from SiRF to NMEA because current speed %u is big.", (unsigned int)speed); return false; } msg[26] = (unsigned char)HI(speed); msg[27] = (unsigned char)LO(speed); return (sirf_write(session, msg)); } static void sirfbin_mode(struct gps_device_t *session, int mode) { if (mode == MODE_NMEA) { (void)sirf_to_nmea(session, session->gpsdata.dev.baudrate); } else if (mode == MODE_BINARY) { char parity = '0'; switch (session->gpsdata.dev.parity) { default: case 'N': parity = '0'; break; case 'O': parity = '1'; break; case 'E': parity = '2'; break; } // gpsd only supports 8[NO]1 or 7[EO]2 // thus the strange use 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); } session->back_to_nmea = false; } #endif /* RECONFIGURE_ENABLE */ static gps_mask_t sirf_msg_debug(struct gps_device_t *device, unsigned char *buf, size_t len) { char msgbuf[MAX_PACKET_LENGTH * 3 + 2]; int i; bzero(msgbuf, (int)sizeof(msgbuf)); if (0xe1 == buf[0]) { /* Development statistics messages */ for (i = 2; i < (int)len; i++) str_appendf(msgbuf, sizeof(msgbuf), "%c", buf[i] ^ 0xff); gpsd_log(&device->context->errout, LOG_PROG, "SiRF: DEV 0xe1: %s\n", msgbuf); } else if (0xff == (unsigned char)buf[0]) { /* Debug messages */ for (i = 1; i < (int)len; i++) if (isprint(buf[i])) str_appendf(msgbuf, sizeof(msgbuf), "%c", buf[i]); else str_appendf(msgbuf, sizeof(msgbuf), "\\x%02x", (unsigned int)buf[i]); gpsd_log(&device->context->errout, LOG_PROG, "SiRF: DBG 0xff: %s\n", msgbuf); } return 0; } static gps_mask_t sirf_msg_errors(struct gps_device_t *device, unsigned char *buf, size_t len UNUSED) { switch (getbeu16(buf, 1)) { case 2: gpsd_log(&device->context->errout, LOG_PROG, "SiRF: EID 0x0a type 2: Subframe %u error on PRN %u\n", getbeu32(buf, 9), getbeu32(buf, 5)); break; case 4107: gpsd_log(&device->context->errout, LOG_PROG, "SiRF: EID 0x0a type 4107: neither KF nor LSQ fix.\n"); break; default: gpsd_log(&device->context->errout, LOG_PROG, "SiRF: EID 0x0a: Error MID %d\n", getbeu16(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 UNUSED, 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 */ /* FIXME - decode the time, since this is the first MID with a * good time stamp this will be good for ntpshm time */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: MID 0x1c, NLMD, gps_tow: %f\n", (double)gps_tow); return 0; } static gps_mask_t sirf_msg_swversion(struct gps_device_t *session, unsigned char *buf, size_t len) { double fv; unsigned char *cp; if (len < 20) return 0; (void)strlcpy(session->subtype, (char *)buf + 1, sizeof(session->subtype)); for (cp = buf+1; *cp!=(unsigned char)'\0' && isdigit(*cp)==0; cp++) continue; fv = safe_atof((const char *)cp); if (fv < 231) { session->driver.sirf.driverstate |= SIRF_LT_231; #ifdef RECONFIGURE_ENABLE if (fv > 200) sirfbin_mode(session, 0); #endif /* RECONFIGURE_ENABLE */ } else if (fv < 232) { session->driver.sirf.driverstate |= SIRF_EQ_231; } else { session->driver.sirf.driverstate |= SIRF_GE_232; } if (strstr((char *)(buf + 1), "ES")) gpsd_log(&session->context->errout, LOG_INF, "SiRF: Firmware has XTrac capability\n"); gpsd_log(&session->context->errout, LOG_PROG, "SiRF: fv: %0.2f, Driver state flags are: %0x\n", fv, session->driver.sirf.driverstate); #ifdef TIMEHINT_ENABLE session->driver.sirf.time_seen = 0; #endif /* TIMEHINT_ENABLE */ gpsd_log(&session->context->errout, LOG_DATA, "SiRF: FV MID 0x06: subtype='%s' mask={DEVICEID}\n", session->subtype); return DEVICEID_SET; } static gps_mask_t sirf_msg_navdata(struct gps_device_t *session, unsigned char *buf, size_t len) { unsigned int i, chan, svid; uint32_t words[10]; if (len != 43) return 0; chan = (unsigned int)getub(buf, 1); svid = (unsigned int)getub(buf, 2); for (i = 0; i < 10; i++) { words[i] = (uint32_t)getbeu32(buf, 4 * i + 3); } gpsd_log(&session->context->errout, LOG_DATA, "SiRF: NavData chan %u svid %u\n",chan,svid); #ifdef RECONFIGURE_ENABLE /* SiRF recommends at least 57600 for SiRF IV nav data */ if (!session->context->readonly && session->gpsdata.dev.baudrate < 57600) { /* some USB are also too slow, no way to tell which ones */ gpsd_log(&session->context->errout, LOG_WARN, "WARNING: SiRF: link too slow, disabling subframes.\n"); (void)sirf_write(session, disablesubframe); } #endif /* RECONFIGURE_ENABLE */ return gpsd_interpret_subframe_raw(session, svid, words); } #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) { int st, i, j, nsv; if (len != 188) return 0; session->gpsdata.skyview_time = gpsd_gpstime_resolve(session, (unsigned short)getbes16(buf, 1), (unsigned int)getbeu32(buf, 3) * 1e-2); gpsd_zero_satellites(&session->gpsdata); for (i = st = nsv = 0; i < SIRF_CHANNELS; i++) { int cn; int off = 8 + 15 * i; bool good; unsigned short stat = (unsigned short)getbeu16(buf, off + 3); session->gpsdata.skyview[st].PRN = (short)getub(buf, off); session->gpsdata.skyview[st].azimuth = (short)(((unsigned)getub(buf, off + 1) * 3) / 2.0); session->gpsdata.skyview[st].elevation = (short)((unsigned)getub(buf, off + 2) / 2.0); cn = 0; for (j = 0; j < 10; j++) cn += (int)getub(buf, off + 5 + j); session->gpsdata.skyview[st].ss = (float)(cn / 10.0); session->gpsdata.skyview[st].used = (bool)(stat & 0x01); good = session->gpsdata.skyview[st].PRN != 0 && session->gpsdata.skyview[st].azimuth != 0 && session->gpsdata.skyview[st].elevation != 0; #ifdef __UNUSED__ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: PRN=%2d El=%3.2f Az=%3.2f ss=%3d stat=%04x %c\n", prn, getub(buf, off + 2) / 2.0, (getub(buf, off + 1) * 3) / 2.0, cn / 10, stat, good ? '*' : ' '); #endif /* UNUSED */ if (good != 0) { st += 1; if (stat & 0x01) nsv++; } } session->gpsdata.satellites_visible = st; session->gpsdata.satellites_used = nsv; /* mark SBAS sats in use if SBAS was in use as of the last MID 27 */ for (i = 0; i < st; i++) { int prn = session->gpsdata.skyview[i].PRN; if (SBAS_PRN(prn) \ && session->gpsdata.status == STATUS_DGPS_FIX \ && session->driver.sirf.dgps_source == SIRF_DGPS_SOURCE_SBAS) session->gpsdata.skyview[i].used = true; } #ifdef TIMEHINT_ENABLE if (st < 3) { gpsd_log(&session->context->errout, LOG_PROG, "SiRF: NTPD not enough satellites seen: %d\n", st); } else { /* SiRF says if 3 sats in view the time is good */ gpsd_log(&session->context->errout, 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); } #endif /* TIMEHINT_ENABLE */ gpsd_log(&session->context->errout, LOG_DATA, "SiRF: MTD 0x04: visible=%d mask={SATELLITE}\n", session->gpsdata.satellites_visible); return SATELLITE_SET; } #ifdef TIMEHINT_ENABLE static double sirf_time_offset(struct gps_device_t *session) /* return NTP time-offset fudge factor for this device */ { double retval = NAN; /* we need to have seen UTC time with a valid leap-year offset */ if ((session->driver.sirf.time_seen & TIME_SEEN_UTC_2) != 0) { retval = NAN; } /* the PPS time message */ else if (session->driver.sirf.lastid == (unsigned char)52) { retval = 0.3; } /* u-blox EMND message */ else if (session->driver.sirf.lastid == (unsigned char)98) { retval = 0.570; } #ifdef __UNUSED__ /* geodetic-data message */ else if (session->driver.sirf.lastid == (unsigned char)41) { retval = 0.570; } #endif /* __UNUSED__ */ /* the Navigation Solution message */ else if (session->driver.sirf.lastid == (unsigned char)2) { if (session->sourcetype == source_usb) { retval = 0.640; /* USB, expect +/- 50mS jitter */ } else { switch (session->gpsdata.dev.baudrate) { default: retval = 0.704; /* WAG */ break; case 4800: retval = 0.704; /* fudge valid at 4800bps */ break; case 9600: retval = 0.688; break; case 19200: retval = 0.484; break; case 38400: retval = 0.845; /* 0.388; ?? */ break; } } } return retval; } #endif /* TIMEHINT_ENABLE */ static gps_mask_t sirf_msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t len) { unsigned short navtype; gps_mask_t mask = 0; if (len != 41) return 0; /* * A count of satellites used is an unsigned byte at offset 28 * and an array of unsigned bytes listing satellite PRNs used * in this fix begins at offset 29, but we don't use either because * in JSON the used bits are reported in the SKY sentence; * we get that data from the svinfo packet. */ /* position/velocity is bytes 1-18 */ ecef_to_wgs84fix(&session->newdata, &session->gpsdata.separation, (double)getbes32(buf, 1) * 1.0, (double)getbes32(buf, 5) * 1.0, (double)getbes32(buf, 9) * 1.0, (double)getbes16(buf, 13) / 8.0, (double)getbes16(buf, 15) / 8.0, (double)getbes16(buf, 17) / 8.0); /* fix status is byte 19 */ navtype = (unsigned short)getub(buf, 19); session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; if ((navtype & 0x80) != 0) session->gpsdata.status = STATUS_DGPS_FIX; else if ((navtype & 0x07) > 0 && (navtype & 0x07) < 7) session->gpsdata.status = STATUS_FIX; if ((navtype & 0x07) == 4 || (navtype & 0x07) == 6) session->newdata.mode = MODE_3D; else if (session->gpsdata.status != 0) session->newdata.mode = MODE_2D; if (session->newdata.mode == MODE_3D) mask |= ALTITUDE_SET | CLIMB_SET; gpsd_log(&session->context->errout, 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 */ session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)getbes16(buf, 22), (double)getbeu32(buf, 24) * 1e-2); #ifdef TIMEHINT_ENABLE if (session->newdata.mode <= MODE_NO_FIX) { gpsd_log(&session->context->errout, LOG_PROG, "SiRF: NTPD no fix, mode: %d\n", session->newdata.mode); } else { gpsd_log(&session->context->errout, 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); } #endif /* TIMEHINT_ENABLE */ /* fix quality data */ 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_IS; if ( 3 <= session->gpsdata.satellites_visible ) { mask |= PPSTIME_IS; } gpsd_log(&session->context->errout, 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\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); return mask; } #ifdef __UNUSED__ /*************************************************************************** We've stopped interpreting GND (0x29) for the following reasons: 1) Versions of SiRF firmware still in wide circulation (and likely to be so for a while) don't report a valid time field, leading to annoying twice-per-second jitter in client displays. 2) What we wanted out of this that MND didn't give us was horizontal and vertical error estimates. But we have to do our own error estimation by computing DOPs from the skyview covariance matrix anyway, because we want separate epx and epy errors a la NMEA 3.0. 3) The fix-merge logic in gpsd.c is (unavoidably) NMEA-centric and thinks multiple sentences in one cycle should be treated as incremental updates. This leads to various silly results when (as in GND) a subsequent sentence is (a) intended to be a complete fix in itself, and (b) frequently broken. 4) Ignoring this dodgy sentence allows us to go to a nice clean single fix update per cycle. 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) { unsigned short navtype; gps_mask_t mask = 0; double eph; if (len != 91) return 0; session->gpsdata.sentence_length = 91; navtype = (unsigned short)getbeu16(buf, 3); session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; if (navtype & 0x80) session->gpsdata.status = STATUS_DGPS_FIX; else if ((navtype & 0x07) > 0 && (navtype & 0x07) < 7) session->gpsdata.status = STATUS_FIX; session->newdata.mode = MODE_NO_FIX; if ((navtype & 0x07) == 4 || (navtype & 0x07) == 6) session->newdata.mode = MODE_3D; else if (session->gpsdata.status) session->newdata.mode = MODE_2D; gpsd_log(&session->context->errout, 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 = getbes32(buf, 23) * 1e-7; session->newdata.longitude = getbes32(buf, 27) * 1e-7; if (session->newdata.latitude != 0 && session->newdata.latitude != 0) mask |= LATLON_SET; if ((eph = getbes32(buf, 50) * 1e-2) > 0) { session->newdata.epx = session->newdata.epy = eph / sqrt(2); mask |= HERR_SET; } if ((session->newdata.epv = getbes32(buf, 54) * 1e-2) > 0) mask |= VERR_SET; if ((session->newdata.eps = getbes16(buf, 62) * 1e-2) > 0) mask |= SPEEDERR_SET; /* 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)) { struct tm unpacked_date; double subseconds; /* * Early versions of the SiRF protocol manual don't document * this sentence at all. Some that do incorrectly * describe UTC Day, Hour, and Minute as 2-byte quantities, * not 1-byte. Chris Kuethe, our SiRF expert, tells us: * * "The Geodetic Navigation packet (0x29) was not fully * implemented in firmware prior to version 2.3.2. So for * anyone running 231.000.000 or earlier (including ES, * SiRFDRive, XTrac trains) you won't get UTC time. I don't * know what's broken in firmwares before 2.3.1..." * * To work around the incomplete implementation of this * packet in 231, we used to assume that only the altitude field * from this packet is valid. But even this doesn't necessarily * seem to be the case. Instead, we do our own computation * of geoid separation now. * * UTC is left all zeros in 231 and older firmware versions, * and misdocumented in version 1.4 of the Protocol Reference. * Documented: Real: * UTC year 2 2 * UTC month 1 1 * UTC day 2 1 * UTC hour 2 1 * UTC minute 2 1 * UTC second 2 2 * 11 8 * * Documentation of this field was corrected in the 1.6 version * of the protocol manual. */ unpacked_date.tm_year = (int)getbeu16(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; unpacked_date.tm_isdst = 0; unpacked_date.tm_wday = unpacked_date.tm_yday = 0; subseconds = getbeu16(buf, 17) * 1e-3; session->newdata.time = (timestamp_t)mkgmtime(&unpacked_date) + subseconds; gpsd_log(&session->context->errout, LOG_PROG, "SiRF: GND 0x29 UTC: %lf\n", session->newdata.time); #ifdef TIMEHINT_ENABLE if (session->newdata.mode <= MODE_NO_FIX) { gpsd_log(&session->context->errout, LOG_PROG, "SiRF: NTPD no fix, mode: $d\n", session->newdata.mode); } else if (0 == unpacked_date.tm_year) { gpsd_log(&session->context->errout, LOG_PROG, "SiRF: NTPD no year\n", session->newdata.mode); } else { gpsd_log(&session->context->errout, LOG_PROG, "SiRF: NTPD valid time MID 0x29, seen=0x%02x\n", session->driver.sirf.time_seen); } if ( 3 <= session->gpsdata.satellites_visible ) { mask |= PPSTIME_IS; } #endif /* TIMEHINT_ENABLE */ /* skip 4 bytes of satellite map */ session->newdata.altitude = getbes32(buf, 35) * 1e-2; /* skip 1 byte of map datum */ session->newdata.speed = getbeu16(buf, 40) * 1e-2; session->newdata.track = getbeu16(buf, 42) * 1e-2; /* skip 2 bytes of magnetic variation */ session->newdata.climb = getbes16(buf, 46) * 1e-2; mask |= TIME_SET | SPEED_SET | TRACK_SET; if (session->newdata.mode == MODE_3D) mask |= ALTITUDE_SET | CLIMB_SET; } gpsd_log(&session->context->errout, LOG_DATA, "SiRF: GND 0x29: time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f mode=%d status=%d\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); return mask; } #endif /* __UNUSED__ */ static gps_mask_t sirf_msg_sysparam(struct gps_device_t *session, unsigned char *buf, size_t len) { if (len != 65) return 0; /* save these to restore them in the revert method */ session->driver.sirf.nav_parameters_seen = true; session->driver.sirf.altitude_hold_mode = (unsigned char)getub(buf, 5); session->driver.sirf.altitude_hold_source = (unsigned char)getub(buf, 6); session->driver.sirf.altitude_source_input = getbes16(buf, 7); session->driver.sirf.degraded_mode = (unsigned char)getub(buf, 9); session->driver.sirf.degraded_timeout = (unsigned char)getub(buf, 10); session->driver.sirf.dr_timeout = (unsigned char)getub(buf, 11); session->driver.sirf.track_smooth_mode = (unsigned char)getub(buf, 12); return 0; } static gps_mask_t sirf_msg_dgpsstatus(struct gps_device_t *session, unsigned char *buf, size_t len UNUSED) /* only documentented from prorocol version 1.7 (2005) onwards */ { session->driver.sirf.dgps_source = (unsigned int)getub(buf, 1); return 0; } 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; if (len != 39) return 0; /* this packet is only sent by u-blox firmware from version 1.32 */ mask = LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | STATUS_SET | MODE_SET | DOP_SET; session->newdata.latitude = (double)getbes32(buf, 1) * RAD_2_DEG * 1e-8; session->newdata.longitude = (double)getbes32(buf, 5) * RAD_2_DEG * 1e-8; session->gpsdata.separation = wgs84_separation(session->newdata.latitude, session->newdata.longitude); session->newdata.altitude = (double)getbes32(buf, 9) * 1e-3 - session->gpsdata.separation; session->newdata.speed = (double)getbes32(buf, 13) * 1e-3; session->newdata.climb = (double)getbes32(buf, 17) * 1e-3; session->newdata.track = (double)getbes32(buf, 21) * RAD_2_DEG * 1e-8; navtype = (unsigned short)getub(buf, 25); session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; if (navtype & 0x80) session->gpsdata.status = STATUS_DGPS_FIX; else if ((navtype & 0x07) > 0 && (navtype & 0x07) < 7) session->gpsdata.status = STATUS_FIX; if ((navtype & 0x07) == 4 || (navtype & 0x07) == 6) session->newdata.mode = MODE_3D; else if (session->gpsdata.status) session->newdata.mode = MODE_2D; gpsd_log(&session->context->errout, 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? */ struct tm unpacked_date; double subseconds; mask |= TIME_SET; if ( 3 <= session->gpsdata.satellites_visible ) { mask |= PPSTIME_IS; } unpacked_date.tm_year = (int)getbeu16(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; unpacked_date.tm_isdst = 0; unpacked_date.tm_wday = unpacked_date.tm_yday = 0; subseconds = ((unsigned short)getbeu16(buf, 32)) * 1e-3; session->newdata.time = (timestamp_t)mkgmtime(&unpacked_date) + subseconds; #ifdef TIMEHINT_ENABLE if (0 == (session->driver.sirf.time_seen & TIME_SEEN_UTC_2)) { gpsd_log(&session->context->errout, LOG_RAW, "SiRF: NTPD just SEEN_UTC_2\n"); } gpsd_log(&session->context->errout, 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; #endif /* TIMEHINT_ENABLE */ session->context->valid |= LEAP_SECOND_VALID; } session->gpsdata.dop.gdop = (int)getub(buf, 34) / 5.0; session->gpsdata.dop.pdop = (int)getub(buf, 35) / 5.0; session->gpsdata.dop.hdop = (int)getub(buf, 36) / 5.0; 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_log(&session->context->errout, 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\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); return mask; } 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_log(&session->context->errout, 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); unpacked_date.tm_min = (int)getub(buf, 2); unpacked_date.tm_sec = (int)getub(buf, 3); unpacked_date.tm_mday = (int)getub(buf, 4); unpacked_date.tm_mon = (int)getub(buf, 5) - 1; unpacked_date.tm_year = (int)getbeu16(buf, 6) - 1900; unpacked_date.tm_isdst = 0; session->newdata.time = (timestamp_t)mkgmtime(&unpacked_date); session->context->leap_seconds = (int)getbeu16(buf, 8); session->context->valid |= LEAP_SECOND_VALID; #ifdef TIMEHINT_ENABLE if (0 == (session->driver.sirf.time_seen & TIME_SEEN_UTC_2)) { gpsd_log(&session->context->errout, LOG_RAW, "SiRF: NTPD just SEEN_UTC_2\n"); } gpsd_log(&session->context->errout, LOG_PROG, "SiRF: NTPD valid time MID 0x34, seen=0x%02x, leap=%d\n", session->driver.sirf.time_seen, session->context->leap_seconds); session->driver.sirf.time_seen |= TIME_SEEN_UTC_2; #endif /* TIMEHINT_ENABLE */ mask |= TIME_SET; if ( 3 <= session->gpsdata.satellites_visible ) { mask |= PPSTIME_IS; } } return mask; } static gps_mask_t sirf_msg_nl(struct gps_device_t *session, unsigned char *buf, size_t len) { if (len != 67) return 0; switch ( buf[1] ) { case 1: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 1, GPS Data\n"); break; case 2: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 2, EE Integrity\n"); break; case 3: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 3, EE Integrity\n"); break; case 4: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 4, EE Clock Bias\n"); break; case 5: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 4, 50bps\n"); break; case 32: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 4, ECLM ACK/NACK\n"); break; case 33: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 4, ECLM EE Age\n"); break; case 34: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 4, ECLM SGEE Age\n"); break; case 35: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 4, ECLM Download Intiate\n"); break; case 255: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, SubID: 4, EE ACK\n"); break; default: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused EE 0x38, unknown SubID: %d\n", buf[1]); } return 0; } static gps_mask_t sirf_msg_ee(struct gps_device_t *session, unsigned char *buf, size_t len) { if (len != 67) return 0; switch ( buf[1] ) { case 1: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused NL 0x40, SubID: 1\n"); break; case 2: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused NL 0x40, SubID: 2, PRN: %d\n", buf[2]); break; default: gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused NL 0x40, unknown SubID: %d\n", buf[1]); } return 0; } gps_mask_t sirf_parse(struct gps_device_t * session, unsigned char *buf, size_t len) { if (len == 0) return 0; buf += 4; len -= 8; gpsd_log(&session->context->errout, LOG_RAW, "SiRF: Raw packet type 0x%02x\n", buf[0]); session->driver.sirf.lastid = 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_IS | REPORT_IS); else { gpsd_log(&session->context->errout, LOG_PROG, "SiRF: MND 0x02 skipped, u-blox flag is on.\n"); return 0; } case 0x04: /* Measured tracker data out MID 4 */ return sirf_msg_svinfo(session, buf, len); case 0x05: /* Raw Tracker Data Out MID 5 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: unused Raw Tracker Data 0x05\n"); return 0; case 0x06: /* Software Version String MID 6 */ return sirf_msg_swversion(session, buf, len); case 0x07: /* Clock Status Data MID 7 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused CLK 0x07\n"); return 0; 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 * buffered on the chip. So when you enable message 8, you'll * get one subframe every 6 seconds. Of the data received, the * almanac and ephemeris are buffered and stored, so you can * query them at will. Alas, the time parameters are not * stored, which is really lame, as the UTC-GPS correction * changes 1 second every few years. Maybe." */ return sirf_msg_navdata(session, buf, len); case 0x09: /* CPU Throughput MID 9 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: THR 0x09: SegStatMax=%.3f, SegStatLat=%3.f, AveTrkTime=%.3f, Last MS=%u\n", (float)getbeu16(buf, 1) / 186, (float)getbeu16(buf, 3) / 186, (float)getbeu16(buf, 5) / 186, getbeu16(buf, 7)); return 0; case 0x0a: /* Error ID Data MID 10 */ return sirf_msg_errors(session, buf, len); case 0x0b: /* Command Acknowledgement MID 11 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: ACK 0x0b: %02x\n", getub(buf, 1)); session->driver.sirf.need_ack = 0; return 0; case 0x0c: /* Command NAcknowledgement MID 12 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: NAK 0x0c: %02x\n", getub(buf, 1)); /* ugh -- there's no alternative but silent failure here */ session->driver.sirf.need_ack = 0; return 0; case 0x0d: /* Visible List MID 13 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused VIS 0x0d\n"); return 0; case 0x0e: /* Almanac Data MID 14 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused ALM 0x0e\n"); return 0; case 0x0f: /* Ephemeris Data MID 15 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused EPH 0x0f\n"); return 0; case 0x11: /* Differential Corrections MID 17 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused DIFF 0x11\n"); return 0; case 0x12: /* OK To Send MID 18 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: OTS 0x12: send indicator = %d\n", getub(buf, 1)); return 0; case 0x13: /* Navigation Parameters MID 19 */ return sirf_msg_sysparam(session, buf, len); case 0x1b: /* DGPS status MID 27 */ return sirf_msg_dgpsstatus(session, buf, len); case 0x1c: /* Navigation Library Measurement Data MID 28 */ return sirf_msg_nlmd(session, buf, len); case 0x1d: /* Navigation Library DGPS Data MID 29 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused NLDG 0x1d\n"); return 0; case 0x1e: /* Navigation Library SV State Data MID 30 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused NLSV 0x1e\n"); return 0; case 0x1f: /* Navigation Library Initialization Data MID 31 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused NLID 0x1f\n"); return 0; case 0x29: /* Geodetic Navigation Data MID 41 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused GND 0x29\n"); return 0; case 0x32: /* SBAS corrections MID 50 */ gpsd_log(&session->context->errout, LOG_PROG,"SiRF: unused SBAS 0x32\n"); return 0; 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 * measurements in the receiver in time with an internal * counter that is not slaved to GPS time, so the measurements * are made at a time that wanders around the second. Then, * after the measurements are made (all normalized to the same * point in time) we dispatch the navigation software to make * a solution, and that solution comes out some 200 to 300 ms * after the measurement time. So you may get a message at * 700 ms after the second that uses measurements time tagged * 450 ms after the second. And if some other task jumps up * and delays things, that message may not come out until 900 * ms after the second. Things can get out of sync to the * point that if you try to resolve the GPS time of our 1 PPS * pulses using the navigation messages, you will find it * impossible to be consistent. That is why I added * MID 52 to our system -- it is tied to the creation of the 1 * PPS and always comes out right around the top of the * second." */ return sirf_msg_ppstime(session, buf, len); case 0x38: /* EE Output MID 56 */ return sirf_msg_ee(session, buf, len); case 0x40: /* Nav Library MID 64 */ return sirf_msg_nl(session, buf, len); case 0x47: /* Hardware Config MID 71 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused Hardware Config 0x47\n"); return 0; case 0x5c: /* CW Controller Output MID 92 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused CW Controller Output 0x5c\n"); return 0; case 0x5d: /* TCXO Output MID 93 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF IV: unused TCXO Output 0x5d, SubID: %d\n", buf[1]); return 0; case 0x62: /* u-blox Extended Measured Navigation Data MID 98 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: u-blox EMND 0x62\n"); return sirf_msg_ublox(session, buf, len) | (CLEAR_IS | REPORT_IS); case 0x80: /* Initialize Data Source MID 128 */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: unused INIT 0x80\n"); return 0; case 0xe1: /* Development statistics messages MID 225 */ /* FALLTHROUGH */ case 0xff: /* Debug messages MID 255 */ (void)sirf_msg_debug(session, buf, len); return 0; default: gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Unknown packet id %d length %zd\n", buf[0], len); return 0; } } static gps_mask_t sirfbin_parse_input(struct gps_device_t *session) { if (session->lexer.type == SIRF_PACKET) { return sirf_parse(session, session->lexer.outbuffer, session->lexer.outbuflen); #ifdef NMEA_ENABLE } else if (session->lexer.type == NMEA_PACKET) { return nmea_parse((char *)session->lexer.outbuffer, session); #endif /* NMEA_ENABLE */ } else return 0; } static void sirfbin_init_query(struct gps_device_t *session) { gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Probing for firmware version.\n"); (void)sirf_write(session, versionprobe); } static void sirfbin_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; if (event == event_identified || event == event_reactivate) { if (session->lexer.type == NMEA_PACKET) { gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Switching chip mode to binary.\n"); (void)nmea_send(session, "$PSRF100,0,%d,8,1,0", session->gpsdata.dev.baudrate); } } if (event == event_configure) { #ifdef __UNUSED__ /* might not be time for the next init string yet */ if (session->driver.sirf.need_ack > 0) return; #endif /* UNUSED */ switch (session->driver.sirf.cfg_stage++) { case 0: /* this slot used by event_identified */ return; case 1: #ifdef RECONFIGURE_ENABLE /* unset MID 0x40 = 64 first since there is a flood of them */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: unset MID 64.\n"); putbyte(unsetmidXX, 6, 0x40); (void)sirf_write(session, unsetmidXX); break; case 2: /* * The response to this request will save the navigation * parameters so they can be reverted before close. */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Requesting navigation parameters.\n"); (void)sirf_write(session, navparams); break; case 3: /* unset GND (0x29 = 41), it's not reliable on SiRF II */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: unset MID 64.\n"); putbyte(unsetmidXX, 6, 0x29); (void)sirf_write(session, unsetmidXX); break; case 4: if (!session->context->readonly) { gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Setting Navigation Parameters.\n"); (void)sirf_write(session, modecontrol); } break; case 5: gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Requesting periodic ecef reports.\n"); (void)sirf_write(session, requestecef); break; case 6: gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Requesting periodic tracker reports.\n"); (void)sirf_write(session, requesttracker); break; case 7: gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Setting DGPS control to use SBAS.\n"); (void)sirf_write(session, dgpscontrol); break; case 8: gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Setting SBAS to auto/integrity mode.\n"); (void)sirf_write(session, sbasparams); break; case 9: gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Enabling PPS message.\n"); (void)sirf_write(session, enablemid52); break; case 10: /* SiRF recommends at least 57600 for SiRF IV nav data */ if (session->gpsdata.dev.baudrate >= 57600) { /* fast enough, turn on nav data */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Enabling subframe transmission.\n"); (void)sirf_write(session, enablesubframe); } else { /* too slow, turn off nav data */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Disabling subframe transmission.\n"); (void)sirf_write(session, disablesubframe); } break; case 11: /* * Disable navigation debug messages (the value 5 is magic) * must be done *after* subframe enable. */ gpsd_log(&session->context->errout, LOG_PROG, "SiRF: disable MID 7, 28, 29, 30, 31.\n"); putbyte(unsetmidXX, 5, 0x05); (void)sirf_write(session, unsetmidXX); break; #endif /* RECONFIGURE_ENABLE */ default: /* initialization is done */ return; } } if (event == event_deactivate) { 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 }; putbyte(moderevert, 7, session->driver.sirf.degraded_mode); putbe16(moderevert, 10, session->driver.sirf.altitude_source_input); putbyte(moderevert, 12, session->driver.sirf.altitude_hold_mode); putbyte(moderevert, 13, session->driver.sirf.altitude_hold_source); putbyte(moderevert, 15, session->driver.sirf.degraded_timeout); putbyte(moderevert, 16, session->driver.sirf.dr_timeout); putbyte(moderevert, 17, session->driver.sirf.track_smooth_mode); gpsd_log(&session->context->errout, LOG_PROG, "SiRF: Reverting navigation parameters...\n"); (void)sirf_write(session, moderevert); } } /* this is everything we export */ /* *INDENT-OFF* */ const struct gps_type_t driver_sirf = { .type_name = "SiRF", /* full name of type */ .packet_type = SIRF_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* no trigger */ .channels = SIRF_CHANNELS, /* consumer-grade GPS */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* be prepared for SiRF or NMEA */ .parse_packet = sirfbin_parse_input,/* parse message packets */ .rtcm_writer = gpsd_write, /* send RTCM data straight */ .init_query = sirfbin_init_query,/* non-perturbing initial qury */ .event_hook = sirfbin_event_hook,/* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = sirfbin_speed, /* we can change baud rate */ .mode_switcher = sirfbin_mode, /* there's a mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = sirf_control_send,/* how to send a control string */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = sirf_time_offset, #endif /* NTP_SHM_ENABLE */ }; /* *INDENT-ON* */ #endif /* defined(SIRF_ENABLE) && defined(BINARY_ENABLE) */ gpsd-3.15/driver_superstar2.c0000664000175000017500000004324312520742615014410 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include "gpsd.h" #if defined(SUPERSTAR2_ENABLE) && defined(BINARY_ENABLE) #include "bits.h" #include "driver_superstar2.h" /* * 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_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 */ #ifdef CONTROLSEND_ENABLE static ssize_t superstar2_control_send(struct gps_device_t *, char *, size_t); #endif /* CONTROLSEND_ENABLE */ static void superstar2_event_hook(struct gps_device_t *, event_t); static ssize_t superstar2_write(struct gps_device_t *, char *, size_t); #ifdef RECONFIGURE_ENABLE static bool superstar2_set_speed(struct gps_device_t *, speed_t, char, int); static void superstar2_set_mode(struct gps_device_t *, int); #endif /* RECONFIGURE_ENABLE */ /* * Decode the message ACK message */ static gps_mask_t superstar2_msg_ack(struct gps_device_t *session, unsigned char *buf, size_t data_len) { if (data_len == 11) gpsd_log(&session->context->errout, LOG_PROG, "superstar2 #126 - ACK %d %d %d %d %d\n", buf[5], buf[6], buf[7], buf[8], buf[9]); return 0; } /* * Decode the navigation solution message. The ECEF version is intentionally * unhandled. By suppressing evaluation of it, we gain the desirable feature * that the fix update is atomic and exactly once per cycle. */ static gps_mask_t superstar2_msg_navsol_lla(struct gps_device_t *session, unsigned char *buf, size_t data_len) { gps_mask_t mask; unsigned char flags; double d; struct tm tm; if (data_len != 77) return 0; gpsd_log(&session->context->errout, LOG_PROG, "superstar2 #20 - user navigation data\n"); mask = 0; flags = (unsigned char)getub(buf, 72); if ((flags & 0x0f) != 0x03) /* mode 3 is navigation */ return mask; /* extract time data */ (void)memset(&tm, '\0', sizeof(tm)); tm.tm_hour = (int)getub(buf, 4) & 0x1f; tm.tm_min = (int)getub(buf, 5); d = getled64((char *)buf, 6); tm.tm_sec = (int)d; tm.tm_mday = (int)getub(buf, 14); tm.tm_mon = (int)getub(buf, 15) - 1; tm.tm_year = (int)getleu16(buf, 16) - 1900; tm.tm_isdst = 0; session->newdata.time = (timestamp_t)mkgmtime(&tm) + (d - tm.tm_sec); mask |= TIME_SET | PPSTIME_IS; /* extract the local tangential plane (ENU) solution */ session->newdata.latitude = getled64((char *)buf, 18) * RAD_2_DEG; session->newdata.longitude = getled64((char *)buf, 26) * RAD_2_DEG; session->newdata.altitude = getlef32((char *)buf, 34); session->newdata.speed = getlef32((char *)buf, 38); session->newdata.track = getlef32((char *)buf, 42) * RAD_2_DEG; session->newdata.climb = getlef32((char *)buf, 54); mask |= LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET; session->gpsdata.satellites_used = (int)getub(buf, 71) & 0x0f; session->gpsdata.dop.hdop = getleu16(buf, 66) * 0.1; session->gpsdata.dop.vdop = getleu16(buf, 68) * 0.1; /* other DOP if available */ mask |= DOP_SET | USED_IS; 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; } mask |= MODE_SET | STATUS_SET; gpsd_log(&session->context->errout, 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\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, session->gpsdata.dop.hdop, session->gpsdata.dop.vdop, session->gpsdata.satellites_used); return mask; } /* * GPS Satellite Info */ static gps_mask_t superstar2_msg_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data_len) { int i, st, nchan, nsv; if (data_len != 67) return 0; gpsd_log(&session->context->errout, LOG_PROG, "superstar2 #33 - satellite data\n"); nchan = 12; gpsd_zero_satellites(&session->gpsdata); 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; unsigned int porn; bool used = (getub(buf, off) & 0x60) == 0x60; if ((porn = (unsigned int)getub(buf, off) & 0x1f) == 0) porn = (unsigned int)(getub(buf, off + 3) >> 1) + 87; session->gpsdata.skyview[i].PRN = (short)porn; session->gpsdata.skyview[i].ss = (float)getub(buf, off + 4); session->gpsdata.skyview[i].elevation = (short)getsb(buf, off + 1); session->gpsdata.skyview[i].azimuth = (short)getub(buf, off + 2) + (short)((unsigned short)(getub(buf, off + 3) & 0x1) << 1); session->gpsdata.skyview[i].used = used; if (used) nsv++; if (session->gpsdata.skyview[i].PRN) st++; } session->gpsdata.skyview_time = NAN; session->gpsdata.satellites_used = nsv; session->gpsdata.satellites_visible = st; gpsd_log(&session->context->errout, LOG_DATA, "SVINFO: visible=%d used=%d mask={SATELLITE|USED}\n", session->gpsdata.satellites_visible, session->gpsdata.satellites_used); return SATELLITE_SET | USED_IS; } static gps_mask_t superstar2_msg_version(struct gps_device_t *session, unsigned char *buf, size_t data_len) { #define SZ 16 char main_sw[SZ], hw_part[SZ], boot_sw[SZ], ser_num[SZ]; /* byte 98 is device type, value = 3 means superstar2 */ if ((data_len != 101) || ((getub(buf, 98) & 0x0f) != 3)) return 0; (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_log(&session->context->errout, 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); (void)strlcpy(session->subtype, main_sw, sizeof(session->subtype)); gpsd_log(&session->context->errout, LOG_DATA, "VERSION: subtype='%s' mask={DEVEICEID}\n", session->subtype); return DEVICEID_SET; } /** * GPS Leap Seconds */ static gps_mask_t superstar2_msg_timing(struct gps_device_t *session, unsigned char *buf, size_t data_len) { gps_mask_t mask; struct tm tm; if (data_len != 65) return 0; gpsd_log(&session->context->errout, LOG_PROG, "superstar2 #113 - timing status\n"); if ((getub(buf, 55) & 0x30) != 0) mask = 0; else { double d; /* extract time data */ (void)memset(&tm, '\0', sizeof(tm)); tm.tm_mday = (int)getsb(buf, 37); tm.tm_mon = (int)getsb(buf, 38) - 1; tm.tm_year = (int)getles16(buf, 39) - 1900; tm.tm_hour = (int)getsb(buf, 41); tm.tm_min = (int)getsb(buf, 42); d = getled64((char *)buf, 43); tm.tm_sec = (int)d; tm.tm_isdst = 0; session->newdata.time = (timestamp_t)mkgmtime(&tm); session->context->leap_seconds = (int)getsb(buf, 20); mask = TIME_SET | PPSTIME_IS; } gpsd_log(&session->context->errout, LOG_DATA, "TIMING: time=%.2f mask={TIME}\n", session->newdata.time); return mask; } /** * Raw Measurements */ static gps_mask_t superstar2_msg_measurement(struct gps_device_t *session, unsigned char *buf, size_t data_len UNUSED) { gps_mask_t mask = 0; int i, n; double t; gpsd_log(&session->context->errout, LOG_PROG, "superstar2 #23 - measurement block\n"); n = (int)getub(buf, 6); /* number of measurements */ if ((n < 1) || (n > MAXCHANNELS)) { gpsd_log(&session->context->errout, LOG_INF, "too many measurements\n"); return 0; } t = getled64((char *)buf, 7); /* measurement time */ for (i = 0; i < n; i++) { unsigned long ul; session->gpsdata.raw.mtime[i] = t; session->gpsdata.skyview[i].PRN = (short)(getub(buf, 11 * i + 15) & 0x1f); session->gpsdata.skyview[i].ss = (double)getub(buf, 11 * i * 15 + 1) / 4.0; session->gpsdata.raw.codephase[i] = (double)getleu32(buf, 11 * i * 15 + 2); ul = (unsigned long)getleu32(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_IS; return mask; } /* request for ionospheric and utc time data #75 */ static unsigned 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) { unsigned int i, u; i = (unsigned int)getub(buf, 12); u = (unsigned int)getub(buf, 21); gpsd_log(&session->context->errout, LOG_PROG, "superstar2 #75 - ionospheric & utc data: iono %s utc %s\n", i ? "ok" : "bad", u ? "ok" : "bad"); session->driver.superstar2.last_iono = time(NULL); return 0; } /** * Ephemeris */ static gps_mask_t 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_log(&session->context->errout, 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, (char *)iono_utc_msg, sizeof(iono_utc_msg)); return ONLINE_SET; } static ssize_t superstar2_write(struct gps_device_t *session, char *msg, size_t msglen) { unsigned short c = 0; ssize_t i; for (i = 0; i < (ssize_t) (msglen - 2); i++) c += (unsigned short)msg[i]; c += 0x100; msg[(int)msg[3] + 4] = (char)((c >> 8) & 0xff); msg[(int)msg[3] + 5] = (char)(c & 0xff); gpsd_log(&session->context->errout, LOG_PROG, "writing superstar2 control type %d len %zu\n", (int)msg[1] & 0x7f, msglen); return gpsd_write(session, msg, msglen); } /** * Parse the data from the device */ gps_mask_t superstar2_dispatch(struct gps_device_t * session, unsigned char *buf, size_t len) { int type; if (len == 0) return 0; type = (int)buf[SUPERSTAR2_TYPE_OFFSET]; session->cycle_end_reliable = true; switch (type) { case SUPERSTAR2_ACK: /* Message Acknowledgement */ return superstar2_msg_ack(session, buf, len); 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_IS | REPORT_IS); case SUPERSTAR2_VERSION: /* Hardware/Software Version */ return superstar2_msg_version(session, buf, len); case SUPERSTAR2_TIMING: /* Timing Parameters */ return superstar2_msg_timing(session, buf, len); case SUPERSTAR2_MEASUREMENT: /* Timing Parameters */ return superstar2_msg_measurement(session, buf, len); case SUPERSTAR2_IONO_UTC: return superstar2_msg_iono_utc(session, buf, len); case SUPERSTAR2_EPHEMERIS: return superstar2_msg_ephemeris(session, buf, len); default: gpsd_log(&session->context->errout, LOG_WARN, "unknown superstar2 packet id 0x%02x length %zd\n", type, len); return 0; } } /********************************************************** * * Externally called routines below here * **********************************************************/ static void superstar2_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; if (event == event_identified) { unsigned char version_msg[] = { 0x01, 0x2d, 0xd2, 0x00, 0x00, 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 }; (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); } } /* * This is the entry point to the driver. When the packet sniffer recognizes * a packet for this driver, it calls this method which passes the packet to * the binary processor or the nmea processor, depending on the session type. */ static gps_mask_t superstar2_parse_input(struct gps_device_t *session) { if (session->lexer.type == SUPERSTAR2_PACKET) { return superstar2_dispatch(session, session->lexer.outbuffer, session->lexer.length);; #ifdef NMEA_ENABLE } else if (session->lexer.type == NMEA_PACKET) { return nmea_parse((char *)session->lexer.outbuffer, session); #endif /* NMEA_ENABLE */ } else return 0; } #ifdef CONTROLSEND_ENABLE static ssize_t superstar2_control_send(struct gps_device_t *session, char *msg, size_t msglen) { 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); return superstar2_write(session, session->msgbuf, session->msgbuflen); } #endif /* CONTROLSEND_ENABLE */ #ifdef RECONFIGURE_ENABLE 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) { return false; } else { 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] = (unsigned char)(speed / 300); return (superstar2_write(session, (char *)speed_msg, 7) == 7); } } static void superstar2_set_mode(struct gps_device_t *session, int mode) { if (mode == MODE_NMEA) { 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] = (unsigned char)(session->gpsdata.dev.baudrate / 300); (void)superstar2_write(session, (char *)mode_msg, 7); } else { session->back_to_nmea = false; } } #endif /* RECONFIGURE_ENABLE */ /* *INDENT-OFF* */ const struct gps_type_t driver_superstar2 = { /* Full name of type */ .type_name = "SuperStarII", /* Associated lexer packet type */ .packet_type = SUPERSTAR2_PACKET, /* Driver type flags */ .flags = DRIVER_STICKY, /* Response string that identifies device (not active) */ .trigger = NULL, /* Number of satellite channels supported by the device */ .channels = 12, /* Startup-time device detector */ .probe_detect = NULL, /* Packet getter (using default routine) */ .get_packet = generic_get, /* Parse message packets */ .parse_packet = superstar2_parse_input, /* RTCM handler (using default routine) */ .rtcm_writer = gpsd_write, /* non-perturbing initial query */ .init_query = NULL, /* Fire on various lifetime events */ .event_hook = superstar2_event_hook, #ifdef RECONFIGURE_ENABLE /* Speed (baudrate) switch */ .speed_switcher = superstar2_set_speed, /* Switch to NMEA mode */ .mode_switcher = superstar2_set_mode, /* Message delivery rate switcher (not active) */ .rate_switcher = NULL, /* Minimum cycle time (not used) */ .min_cycle = 1, #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE /* Control string sender - should provide checksum and trailer */ .control_send = superstar2_control_send, #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* defined(SUPERSTAR2_ENABLE) && defined(BINARY_ENABLE) */ gpsd-3.15/driver_superstar2.h0000664000175000017500000000346612506317026014416 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _GPSD_SUPERSTAR2_H_ #define _GPSD_SUPERSTAR2_H_ #define SUPERSTAR2_BASE_SIZE 4 #define SUPERSTAR2_TYPE_OFFSET 1 /* input-only */ #define SUPERSTAR2_RESET 2 #define SUPERSTAR2_LINKUP 63 #define SUPERSTAR2_CHANNEL_INHIBIT 64 #define SUPERSTAR2_TIME_PARAMS 69 #define SUPERSTAR2_ALMANAC_INCREMENT 77 #define SUPERSTAR2_ALMANAC_UPLOAD 79 #define SUPERSTAR2_SET_OPMODE 80 #define SUPERSTAR2_SET_MASK 81 #define SUPERSTAR2_SET_DGPS 83 #define SUPERSTAR2_SET_IONOMODEL 84 #define SUPERSTAR2_SET_MSLMODEL 86 #define SUPERSTAR2_SET_HEIGHT_MODE 87 #define SUPERSTAR2_SET_DATUM 88 #define SUPERSTAR2_SATELLITE_INHIBIT 90 #define SUPERSTAR2_BASE_CONFIG 91 #define SUPERSTAR2_SATELLITE_TRACK 95 #define SUPERSTAR2_NVM_ERASE 99 #define SUPERSTAR2_SET_TIME 103 #define SUPERSTAR2_MESSAGE_CONFIG 105 #define SUPERSTAR2_SERIAL_CONFIG 110 /* output-only */ #define SUPERSTAR2_CHANINF2 7 #define SUPERSTAR2_LINKERR 125 #define SUPERSTAR2_ACK 126 /* bidirectional */ #define SUPERSTAR2_DUMMY 0 #define SUPERSTAR2_CHANINF 6 #define SUPERSTAR2_NAVSOL_LLA 20 #define SUPERSTAR2_NAVSOL_ECEF 21 #define SUPERSTAR2_EPHEMERIS 22 #define SUPERSTAR2_MEASUREMENT 23 #define SUPERSTAR2_RECV_CONFIG 30 #define SUPERSTAR2_SVINFO 33 #define SUPERSTAR2_DGPSCONFIG 43 #define SUPERSTAR2_VERSION 45 #define SUPERSTAR2_BASE_STATUS 47 #define SUPERSTAR2_DGPS_STATUS 48 #define SUPERSTAR2_RECV_STATUS 49 #define SUPERSTAR2_SAT_HEALTH 50 #define SUPERSTAR2_SELFTEST 51 #define SUPERSTAR2_RTCM_DATA 65 #define SUPERSTAR2_SBAS_DATA 67 #define SUPERSTAR2_SBAS_STATUS 68 #define SUPERSTAR2_IONO_UTC 75 #define SUPERSTAR2_ALMANAC_DATA 76 #define SUPERSTAR2_ALMANAC_STATUS 78 #define SUPERSTAR2_TIMING 113 #endif /* _GPSD_SUPERSTAR2_H_ */ gpsd-3.15/driver_tsip.c0000664000175000017500000012507512520742615013261 0ustar esresr/* * Handle the Trimble TSIP packet format * by Rob Janssen, PE1CHL. * Accutime Gold support by Igor Socec * * Week counters are not limited to 10 bits. It's unknown what * the firmware is doing to disambiguate them, if anything; it might just * be adding a fixed offset based on a hidden epoch value, in which case * unhappy things will occur on the next rollover. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include /* for select() */ #include #include #include #include #include #include #include "gpsd.h" #include "bits.h" #include "strfuncs.h" #include #define USE_SUPERPACKET 1 /* use Super Packet mode? */ #define SEMI_2_DEG (180.0 / 2147483647) /* 2^-31 semicircle to deg */ void configuration_packets_accutime_gold(struct gps_device_t *session); void configuration_packets_generic(struct gps_device_t *session); #ifdef TSIP_ENABLE #define TSIP_CHANNELS 12 static int tsip_write(struct gps_device_t *session, unsigned int id, unsigned char *buf, size_t len) { char *ep, *cp; session->msgbuf[0] = '\x10'; session->msgbuf[1] = (char)id; ep = session->msgbuf + 2; for (cp = (char *)buf; len-- > 0; cp++) { if (*cp == '\x10') *ep++ = '\x10'; *ep++ = *cp; } *ep++ = '\x10'; *ep++ = '\x03'; session->msgbuflen = (size_t) (ep - session->msgbuf); gpsd_log(&session->context->errout, LOG_PROG, "Sent TSIP packet id 0x%02x\n", id); if (gpsd_write(session, session->msgbuf, session->msgbuflen) != (ssize_t) session->msgbuflen) return -1; return 0; } /* tsip_detect() * * see if it looks like a TSIP device (speaking 9600O81) is listening and * return 1 if found, 0 if not */ static bool tsip_detect(struct gps_device_t *session) { char buf[BUFSIZ]; bool ret = false; int myfd; fd_set fdset; struct timeval to; speed_t old_baudrate; char old_parity; unsigned int old_stopbits; old_baudrate = session->gpsdata.dev.baudrate; old_parity = session->gpsdata.dev.parity; old_stopbits = session->gpsdata.dev.stopbits; gpsd_set_speed(session, 9600, 'O', 1); /* request firmware revision and look for a valid response */ putbyte(buf, 0, 0x10); putbyte(buf, 1, 0x1f); putbyte(buf, 2, 0x10); putbyte(buf, 3, 0x03); myfd = session->gpsdata.gps_fd; if (write(myfd, buf, 4) == 4) { unsigned int n; for (n = 0; n < 3; n++) { FD_ZERO(&fdset); FD_SET(myfd, &fdset); to.tv_sec = 1; to.tv_usec = 0; if (select(myfd + 1, &fdset, NULL, NULL, &to) != 1) break; if (generic_get(session) >= 0) { if (session->lexer.type == TSIP_PACKET) { gpsd_log(&session->context->errout, LOG_RAW, "tsip_detect found\n"); ret = true; break; } } } } if (!ret) /* return serial port to original settings */ gpsd_set_speed(session, old_baudrate, old_parity, old_stopbits); return ret; } static gps_mask_t tsip_parse_input(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; time_t now; unsigned char buf[BUFSIZ]; char buf2[BUFSIZ]; if (session->lexer.type != TSIP_PACKET) { gpsd_log(&session->context->errout, LOG_INF, "tsip_analyze packet type %d\n", session->lexer.type); return 0; } if (session->lexer.outbuflen < 4 || session->lexer.outbuffer[0] != 0x10) return 0; /* remove DLE stuffing and put data part of message in buf */ memset(buf, 0, sizeof(buf)); buf2[len = 0] = '\0'; for (i = 2; i < (int)session->lexer.outbuflen; i++) { if (session->lexer.outbuffer[i] == 0x10) if (session->lexer.outbuffer[++i] == 0x03) break; str_appendf(buf2, sizeof(buf2), "%02x", buf[len++] = session->lexer.outbuffer[i]); } id = (unsigned)session->lexer.outbuffer[1]; gpsd_log(&session->context->errout, LOG_DATA, "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_log(&session->context->errout, 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 */ gpsd_log(&session->context->errout, LOG_WARN, "No Compact Super Packet, use LFwEI\n"); /* Request LFwEI Super Packet */ putbyte(buf, 0, 0x20); putbyte(buf, 1, 0x01); /* enabled */ (void)tsip_write(session, 0x8e, buf, 2); } #endif /* USE_SUPERPACKET */ break; case 0x1c: /* Hardware/Software Version Information (Accutime Gold) */ /* * FIXME: We could get both kinds of version info. */ u1 = (uint8_t) getub(buf, 0); if (u1 == 0x81) { /* Software Version Information */ uint8_t u6, u7; u2 = getub(buf, 2); /* Major version */ u3 = getub(buf, 3); /* Minor version */ u4 = getub(buf, 4); /* Build number */ u5 = getub(buf, 5); /* Month */ u6 = getub(buf, 6); /* Day */ s1 = (int16_t)getbeu16(buf, 7); /* Year */ u7 = getub(buf, 9); /* Length of first module name */ for (i=0; i < (int)u7; i++) { buf2[i] = (char)getub(buf, 10+i); /* Product name in ASCII */ } buf2[i] = '\0'; (void)snprintf(session->subtype, sizeof(session->subtype), "sw %u %u %u %02u.%02u.%04u %s", u2, u3, u4, u6, u5, s1, buf2); gpsd_log(&session->context->errout, LOG_INF, "Software version: %s\n", session->subtype); mask |= DEVICEID_SET; } if (u1 == 0x83) { /* Hardware Version Information */ ul1 = getbeu32(buf, 1); /* Serial number */ u2 = getub(buf, 5); /* Build day */ u3 = getub(buf, 6); /* Build month */ s1 = (int16_t)getbeu16(buf, 7); /* Build year */ u4 = getub(buf, 6); /* Build hour */ s2 = (int16_t)getbeu16(buf, 10); /* Hardware Code */ u5 = getub(buf, 12); /* Length of Hardware ID */ for (i=0; i < (int)u5; i++) { buf2[i] = (char)getub(buf, 13+i); /* Hardware ID in ASCII */ } buf2[i] = '\0'; (void)snprintf(session->subtype, sizeof(session->subtype), "hw %u %02u.%02u.%04u %02u %u %s", ul1, u2, u3, s1, u4, s2, buf2); gpsd_log(&session->context->errout, LOG_INF, "Hardware version: %s\n", session->subtype); mask |= DEVICEID_SET; /* Detecting device by Hardware Code */ if (s2 == 3001) { gpsd_log(&session->context->errout, LOG_INF, "This device is Accutime Gold\n"); session->driver.tsip.subtype = TSIP_ACCUTIME_GOLD; configuration_packets_accutime_gold(session); } else { configuration_packets_generic(session); } break; } break; case 0x41: /* GPS Time */ if (len != 10) break; session->driver.tsip.last_41 = now; /* keep timestamp for request */ f1 = getbef32((char *)buf, 0); /* gpstime */ s1 = getbes16(buf, 4); /* week */ f2 = getbef32((char *)buf, 6); /* leap seconds */ if (f1 >= 0.0 && f2 > 10.0) { session->context->leap_seconds = (int)round(f2); session->context->valid |= LEAP_SECOND_VALID; session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)s1, (double)f1); mask |= TIME_SET | PPSTIME_IS; } gpsd_log(&session->context->errout, LOG_INF, "GPS Time %f %d %f\n", f1, s1, f2); break; case 0x42: /* Single-Precision Position Fix, XYZ ECEF */ if (len != 16) break; f1 = getbef32((char *)buf, 0); /* X */ f2 = getbef32((char *)buf, 4); /* Y */ f3 = getbef32((char *)buf, 8); /* Z */ f4 = getbef32((char *)buf, 12); /* time-of-fix */ gpsd_log(&session->context->errout, LOG_INF, "GPS Position XYZ %f %f %f %f\n", f1, f2, f3, f4); break; case 0x43: /* Velocity Fix, XYZ ECEF */ if (len != 20) break; f1 = getbef32((char *)buf, 0); /* X velocity */ f2 = getbef32((char *)buf, 4); /* Y velocity */ f3 = getbef32((char *)buf, 8); /* Z velocity */ f4 = getbef32((char *)buf, 12); /* bias rate */ f5 = getbef32((char *)buf, 16); /* time-of-fix */ gpsd_log(&session->context->errout, LOG_INF, "GPS Velocity XYZ %f %f %f %f %f\n", f1, f2, f3, f4, f5); break; case 0x45: /* Software Version Information */ if (len != 10) break; (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)); gpsd_log(&session->context->errout, LOG_INF, "Software version: %s\n", session->subtype); mask |= DEVICEID_SET; break; 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) { session->gpsdata.status = STATUS_NO_FIX; mask |= STATUS_SET; } else { if (session->gpsdata.status < STATUS_FIX) { session->gpsdata.status = STATUS_FIX; mask |= STATUS_SET; } } gpsd_log(&session->context->errout, LOG_PROG, "Receiver health %02x %02x\n", u1, u2); break; case 0x47: /* Signal Levels for all Satellites */ gpsd_zero_satellites(&session->gpsdata); 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 = getbef32((char *)buf, 5 * i + 2)) < 0) f1 = 0.0; for (j = 0; j < TSIP_CHANNELS; j++) if (session->gpsdata.skyview[j].PRN == (short)u1) { session->gpsdata.skyview[j].ss = f1; break; } str_appendf(buf2, sizeof(buf2), " %d=%.1f", (int)u1, f1); } gpsd_log(&session->context->errout, LOG_PROG, "Signal Levels (%d):%s\n", count, buf2); mask |= SATELLITE_SET; break; case 0x48: /* GPS System Message */ buf[len] = '\0'; gpsd_log(&session->context->errout, LOG_PROG, "GPS System Message: %s\n", buf); break; case 0x49: /* Almanac Health Page */ break; case 0x4a: /* Single-Precision Position LLA */ if (len != 20) break; session->newdata.latitude = getbef32((char *)buf, 0) * RAD_2_DEG; session->newdata.longitude = getbef32((char *)buf, 4) * RAD_2_DEG; session->newdata.altitude = getbef32((char *)buf, 8); //f1 = getbef32((char *)buf, 12); clock bias */ f2 = getbef32((char *)buf, 16); /* time-of-fix */ if ((session->context->valid & GPS_TIME_VALID)!=0) { session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)session->context->gps_week, (double)f2); mask |= TIME_SET | PPSTIME_IS; } mask |= LATLON_SET | ALTITUDE_SET | CLEAR_IS | REPORT_IS; gpsd_log(&session->context->errout, LOG_DATA, "SPPLLA 0x4a time=%.2f lat=%.2f lon=%.2f alt=%.2f\n", session->newdata.time, session->newdata.latitude, session->newdata.longitude, session->newdata.altitude); break; 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_log(&session->context->errout, LOG_INF, "Machine ID %02x %02x %02x\n", u1, u2, u3); #if USE_SUPERPACKET if ((u3 & 0x01) != (uint8_t) 0 && !session->driver.tsip.superpkt) { gpsd_log(&session->context->errout, 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 */ (void)tsip_write(session, 0x35, buf, 4); session->driver.tsip.superpkt = true; } #endif /* USE_SUPERPACKET */ break; case 0x4c: /* Operating Parameters Report */ break; case 0x54: /* One Satellite Bias */ break; 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_log(&session->context->errout, 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? */ /* No LFwEI Super Packet */ 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 */ (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) */ if (len != 20) break; f1 = getbef32((char *)buf, 0); /* East velocity */ f2 = getbef32((char *)buf, 4); /* North velocity */ f3 = getbef32((char *)buf, 8); /* Up velocity */ f4 = getbef32((char *)buf, 12); /* clock bias rate */ f5 = getbef32((char *)buf, 16); /* time-of-fix */ session->newdata.climb = f3; session->newdata.speed = sqrt(pow(f2, 2) + pow(f1, 2)); if ((session->newdata.track = atan2(f1, f2) * RAD_2_DEG) < 0) session->newdata.track += 360.0; gpsd_log(&session->context->errout, LOG_INF, "GPS Velocity ENU %f %f %f %f %f\n", f1, f2, f3, f4, f5); mask |= SPEED_SET | TRACK_SET | CLIMB_SET; gpsd_log(&session->context->errout, LOG_DATA, "VFENU 0x56 time=%.2f speed=%.2f track=%.2f climb=%.2f\n", session->newdata.time, session->newdata.speed, session->newdata.track, session->newdata.climb); break; 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 = getbef32((char *)buf, 2); /* gps_time */ s1 = getbes16(buf, 6); /* tsip.gps_week */ if (getub(buf, 0) == 0x01) /* good current fix? */ (void)gpsd_gpstime_resolve(session, (unsigned short)s1, (double)f1); gpsd_log(&session->context->errout, LOG_INF, "Fix info %02x %02x %d %f\n", u1, u2, s1, f1); break; case 0x58: /* Satellite System Data/Acknowledge from Receiver */ break; case 0x59: /* Status of Satellite Disable or Ignore Health */ break; case 0x5a: /* Raw Measurement Data */ if (len != 29) break; f1 = getbef32((char *)buf, 5); /* Signal Level */ f2 = getbef32((char *)buf, 9); /* Code phase */ f3 = getbef32((char *)buf, 13); /* Doppler */ d1 = getbed64((char *)buf, 17); /* Time of Measurement */ gpsd_log(&session->context->errout, LOG_PROG, "Raw Measurement Data %d %f %f %f %f\n", getub(buf, 0), f1, f2, f3, d1); break; case 0x5b: /* Satellite Ephemeris Status */ break; case 0x5c: /* Satellite Tracking Status */ if (len != 24) break; u1 = getub(buf, 0); /* PRN */ u2 = getub(buf, 1); /* chan */ u3 = getub(buf, 2); /* Acquisition flag */ u4 = getub(buf, 3); /* Ephemeris flag */ f1 = getbef32((char *)buf, 4); /* Signal level */ f2 = getbef32((char *)buf, 8); /* time of Last measurement */ d1 = getbef32((char *)buf, 12) * RAD_2_DEG; /* Elevation */ d2 = getbef32((char *)buf, 16) * RAD_2_DEG; /* Azimuth */ i = (int)(u2 >> 3); /* channel number */ gpsd_log(&session->context->errout, 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.skyview[i].PRN = (short)u1; session->gpsdata.skyview[i].ss = (double)f1; session->gpsdata.skyview[i].elevation = (short)round(d1); session->gpsdata.skyview[i].azimuth = (short)round(d2); session->gpsdata.skyview[i].used = false; for (j = 0; j < session->gpsdata.satellites_used; j++) if (session->gpsdata.skyview[i].PRN != 0 && session->driver.tsip.sats_used[j] != 0) session->gpsdata.skyview[i].used = true; } else { session->gpsdata.skyview[i].PRN = session->gpsdata.skyview[i].elevation = session->gpsdata.skyview[i].azimuth = 0; session->gpsdata.skyview[i].ss = 0.0; session->gpsdata.skyview[i].used = false; } if (++i == session->gpsdata.satellites_visible) { session->gpsdata.skyview_time = NAN; mask |= SATELLITE_SET; /* last of the series */ } if (i > session->gpsdata.satellites_visible) session->gpsdata.satellites_visible = i; } break; case 0x5e: /* Additional Fix Status Report */ break; 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 */ #ifdef __UNUSED__ /* * This looks right, but it sets a spurious mode value when * the satellite constellation looks good to the chip but no * actual fix has yet been acquired. We should set the mode * field (which controls gpsd's fix reporting) only from sentences * that convey actual fix information, like 0x20, otherwise we * get results like triggering their error modeler spuriously. */ switch (u1 & 7) { /* dimension */ case 3: //session->gpsdata.status = STATUS_FIX; session->newdata.mode = MODE_2D; break; case 4: //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 |= MODE_SET; #endif /* __UNUSED__ */ session->gpsdata.satellites_used = count; session->gpsdata.dop.pdop = getbef32((char *)buf, 1); session->gpsdata.dop.hdop = getbef32((char *)buf, 5); session->gpsdata.dop.vdop = getbef32((char *)buf, 9); session->gpsdata.dop.tdop = getbef32((char *)buf, 13); session->gpsdata.dop.gdop = sqrt(pow(session->gpsdata.dop.pdop, 2) + pow(session->gpsdata.dop.tdop, 2)); memset(session->driver.tsip.sats_used, 0, sizeof(session->driver.tsip.sats_used)); buf2[0] = '\0'; for (i = 0; i < count; i++) str_appendf(buf2, sizeof(buf2), " %d", session->driver.tsip.sats_used[i] = (short)getub(buf, 17 + i)); gpsd_log(&session->context->errout, LOG_DATA, "AIVSS: 0x6d status=%d used=%d " "pdop=%.1f hdop=%.1f vdop=%.1f tdop=%.1f gdup=%.1f\n", session->gpsdata.status, session->gpsdata.satellites_used, session->gpsdata.dop.pdop, session->gpsdata.dop.hdop, session->gpsdata.dop.vdop, session->gpsdata.dop.tdop, session->gpsdata.dop.gdop); mask |= DOP_SET | STATUS_SET | USED_IS; break; case 0x6e: /* Synchronized Measurements */ break; #ifdef __UNUSED__ case 0x6f: /* Synchronized Measurements Report */ if (len < 20 || getub(buf, 0) != 1 || getub(buf, 1) != 2) break; s1 = getbes16(buf, 2); /* number of bytes */ u1 = getub(buf, 20); /* number of SVs */ break; #endif /* __UNUSED__ */ case 0x70: /* Filter Report */ break; case 0x7a: /* NMEA settings */ break; case 0x82: /* Differential Position Fix Mode */ if (len != 1) break; u1 = getub(buf, 0); /* fix mode */ if (session->gpsdata.status == STATUS_FIX && (u1 & 0x01) != 0) { session->gpsdata.status = STATUS_DGPS_FIX; mask |= STATUS_SET; } gpsd_log(&session->context->errout, LOG_DATA, "DPFM 0x82 status=%d\n", session->gpsdata.status); break; case 0x83: /* Double-Precision XYZ Position Fix and Bias Information */ if (len != 36) break; d1 = getbed64((char *)buf, 0); /* X */ d2 = getbed64((char *)buf, 8); /* Y */ d3 = getbed64((char *)buf, 16); /* Z */ d4 = getbed64((char *)buf, 24); /* clock bias */ f1 = getbef32((char *)buf, 32); /* time-of-fix */ gpsd_log(&session->context->errout, 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 */ if (len != 36) break; session->newdata.latitude = getbed64((char *)buf, 0) * RAD_2_DEG; session->newdata.longitude = getbed64((char *)buf, 8) * RAD_2_DEG; session->newdata.altitude = getbed64((char *)buf, 16); //d1 = getbed64((char *)buf, 24); clock bias */ f1 = getbef32((char *)buf, 32); /* time-of-fix */ if ((session->context->valid & GPS_TIME_VALID)!=0) { session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)session->context->gps_week, (double)f1); mask |= TIME_SET | PPSTIME_IS; } gpsd_log(&session->context->errout, 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_IS | REPORT_IS; gpsd_log(&session->context->errout, LOG_DATA, "DPPLLA 0x84 time=%.2f lat=%.2f lon=%.2f alt=%.2f\n", session->newdata.time, session->newdata.latitude, session->newdata.longitude, session->newdata.altitude); break; case 0x8f: /* Super Packet. Well... */ u1 = (uint8_t) getub(buf, 0); switch (u1) { /* sub-packet ID */ case 0x15: /* Current Datum Values */ if (len != 43) break; s1 = getbes16(buf, 1); /* Datum Index */ d1 = getbed64((char *)buf, 3); /* DX */ d2 = getbed64((char *)buf, 11); /* DY */ d3 = getbed64((char *)buf, 19); /* DZ */ d4 = getbed64((char *)buf, 27); /* A-axis */ d5 = getbed64((char *)buf, 35); /* Eccentricity Squared */ gpsd_log(&session->context->errout, 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) */ /* CSK sez "why does my Lassen iQ output oversize packets?" */ if ((len != 56) && (len != 64)) break; s1 = getbes16(buf, 2); /* east velocity */ s2 = getbes16(buf, 4); /* north velocity */ s3 = getbes16(buf, 6); /* up velocity */ ul1 = getbeu32(buf, 8); /* time */ sl1 = getbes32(buf, 12); /* latitude */ ul2 = getbeu32(buf, 16); /* longitude */ sl2 = getbes32(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 = getbes16(buf, 30); /* tsip.gps_week */ /* PRN/IODE data follows */ gpsd_log(&session->context->errout, 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 = (double)s1 * d5; /* east velocity m/s */ d2 = (double)s2 * d5; /* north velocity m/s */ session->newdata.climb = (double)s3 * d5; /* up velocity m/s */ session->newdata.speed = sqrt(pow(d2, 2) + pow(d1, 2)); if ((session->newdata.track = atan2(d1, d2) * RAD_2_DEG) < 0) session->newdata.track += 360.0; session->newdata.latitude = (double)sl1 * SEMI_2_DEG; session->newdata.longitude = (double)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 = (double)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 */ session->gpsdata.status = STATUS_FIX; if ((u2 & 0x02) != (uint8_t) 0) /* DGPS Corrected */ session->gpsdata.status = STATUS_DGPS_FIX; if ((u2 & 0x04) != (uint8_t) 0) /* Fix Dimension */ session->newdata.mode = MODE_2D; else session->newdata.mode = MODE_3D; } session->gpsdata.satellites_used = (int)u3; if ((int)u4 > 10) { session->context->leap_seconds = (int)u4; session->context->valid |= LEAP_SECOND_VALID; } session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)s4, (double)ul1 *1e-3); mask |= TIME_SET | PPSTIME_IS | LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | STATUS_SET | MODE_SET | CLEAR_IS | REPORT_IS; gpsd_log(&session->context->errout, LOG_DATA, "SP-LFEI 0x20: time=%.2f lat=%.2f lon=%.2f alt=%.2f " "speed=%.2f track=%.2f climb=%.2f " "mode=%d status=%d\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); break; case 0x23: /* Compact Super Packet */ session->driver.tsip.req_compact = 0; /* CSK sez "i don't trust this to not be oversized either." */ if (len < 29) break; ul1 = getbeu32(buf, 1); /* time */ s1 = getbes16(buf, 5); /* tsip.gps_week */ u1 = getub(buf, 7); /* utc offset */ u2 = getub(buf, 8); /* fix flags */ sl1 = getbes32(buf, 9); /* latitude */ ul2 = getbeu32(buf, 13); /* longitude */ sl3 = getbes32(buf, 17); /* altitude */ s2 = getbes16(buf, 21); /* east velocity */ s3 = getbes16(buf, 23); /* north velocity */ s4 = getbes16(buf, 25); /* up velocity */ gpsd_log(&session->context->errout, LOG_INF, "CSP %u %d %u %u %d %u %d %d %d %d\n", ul1, s1, u1, u2, sl1, ul2, sl3, s2, s3, s4); if ((int)u1 > 10) { session->context->leap_seconds = (int)u1; session->context->valid |= LEAP_SECOND_VALID; } session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)s1, (double)ul1 *1e3); session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; if ((u2 & 0x01) == (uint8_t) 0) { /* Fix Available */ session->gpsdata.status = STATUS_FIX; if ((u2 & 0x02) != (uint8_t) 0) /* DGPS Corrected */ session->gpsdata.status = STATUS_DGPS_FIX; if ((u2 & 0x04) != (uint8_t) 0) /* Fix Dimension */ session->newdata.mode = MODE_2D; else session->newdata.mode = MODE_3D; } session->newdata.latitude = (double)sl1 * SEMI_2_DEG; session->newdata.longitude = (double)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 = (double)sl3 * 1e-3 - session->gpsdata.separation;; if ((u2 & 0x20) != (uint8_t) 0) /* check velocity scaling */ d5 = 0.02; else d5 = 0.005; d1 = (double)s2 * d5; /* east velocity m/s */ d2 = (double)s3 * d5; /* north velocity m/s */ session->newdata.climb = (double)s4 * d5; /* up velocity m/s */ session->newdata.speed = sqrt(pow(d2, 2) + pow(d1, 2)) * MPS_TO_KNOTS; if ((session->newdata.track = atan2(d1, d2) * RAD_2_DEG) < 0) session->newdata.track += 360.0; mask |= TIME_SET | PPSTIME_IS | LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET |CLIMB_SET | STATUS_SET | MODE_SET | CLEAR_IS | REPORT_IS; gpsd_log(&session->context->errout, LOG_DATA, "SP-CSP 0x23: time=%.2f lat=%.2f lon=%.2f alt=%.2f " "speed=%.2f track=%.2f climb=%.2f mode=%d status=%d\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); break; case 0xab: /* Thunderbolt Timing Superpacket */ if (len != 17) { gpsd_log(&session->context->errout, 4, "pkt 0xab len=%d\n", len); break; } session->driver.tsip.last_41 = now; /* keep timestamp for request */ ul1 = getbeu32(buf, 1); /* gpstime */ s1 = (int16_t)getbeu16(buf, 5); /* week */ s2 = getbes16(buf, 7); /* leap seconds */ if ((int)ul1 > 10) { session->context->leap_seconds = (int)s2; session->context->valid |= LEAP_SECOND_VALID; session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short)s1, (double)ul1); mask |= TIME_SET | PPSTIME_IS | CLEAR_IS; gpsd_log(&session->context->errout, LOG_DATA, "SP-TTS 0xab time=%.2f mask={TIME}\n", session->newdata.time); } gpsd_log(&session->context->errout, 4, "GPS Time %u %d %d\n", ul1, s1, s2); break; case 0xac: /* Thunderbolt Position Superpacket */ if (len != 68) { gpsd_log(&session->context->errout, 4, "pkt 0xac len=%d\n", len); break; } session->newdata.latitude = getbed64((char *)buf, 36) * RAD_2_DEG; session->newdata.longitude = getbed64((char *)buf, 44) * RAD_2_DEG; session->newdata.altitude = getbed64((char *)buf, 52); //f1 = getbef32((char *)buf, 16); clock bias */ u1 = getub(buf, 12); /* GPS Decoding Status */ u2 = getub(buf, 1); /* Receiver 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; } } /* Decode Fix modes */ switch (u2 & 7) { case 0: /* Auto */ switch (u1) { /* * According to the Thunderbolt Manual, the * first byte of the supplemental timing packet * simply indicates the configuration of the * device, not the actual lock, so we need to * look at the decode status. */ case 0: /* "Doing Fixes" */ session->newdata.mode = MODE_3D; break; case 0x0B: /* "Only 3 usable sats" */ session->newdata.mode = MODE_2D; break; case 0x1: /* "Don't have GPS time" */ case 0x3: /* "PDOP is too high" */ case 0x8: /* "No usable sats" */ case 0x9: /* "Only 1 usable sat" */ case 0x0A: /* "Only 2 usable sats */ case 0x0C: /* "The chosen sat is unusable" */ case 0x10: /* TRAIM rejected the fix */ default: session->newdata.mode = MODE_NO_FIX; } break; 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 | REPORT_IS; gpsd_log(&session->context->errout, LOG_DATA, "SP-TPS 0xac time=%.2f lat=%.2f lon=%.2f alt=%.2f\n", session->newdata.time, session->newdata.latitude, session->newdata.longitude, session->newdata.altitude); break; default: gpsd_log(&session->context->errout, LOG_WARN, "Unhandled TSIP superpacket type 0x%02x\n", u1); } break; case 0xbb: /* Navigation Configuration */ if (len != 40 && len != 43) /* see packet.c for explamation */ break; u1 = getub(buf, 0); /* Subcode */ u2 = getub(buf, 1); /* Operating Dimension */ u3 = getub(buf, 2); /* DGPS Mode (not enabled in Accutime Gold) */ u4 = getub(buf, 3); /* Dynamics Code */ f1 = getbef32((char *)buf, 5); /* Elevation Mask */ f2 = getbef32((char *)buf, 9); /* AMU Mask */ f3 = getbef32((char *)buf, 13); /* DOP Mask */ f4 = getbef32((char *)buf, 17); /* DOP Switch */ u5 = getub(buf, 21); /* DGPS Age Limit (not in Accutime Gold) */ gpsd_log(&session->context->errout, 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_log(&session->context->errout, LOG_WARN, "Unhandled TSIP packet type 0x%02x\n", id); break; } /* see if it is time to send some request packets for reports that */ /* the receiver won't send at fixed intervals */ if ((now - session->driver.tsip.last_41) > 5) { /* Request Current Time */ (void)tsip_write(session, 0x21, buf, 0); session->driver.tsip.last_41 = now; } if ((now - session->driver.tsip.last_6d) > 5) { /* Request GPS Receiver Position Fix Mode */ (void)tsip_write(session, 0x24, buf, 0); session->driver.tsip.last_6d = now; } if ((now - session->driver.tsip.last_48) > 60) { /* Request GPS System Message */ (void)tsip_write(session, 0x28, buf, 0); session->driver.tsip.last_48 = now; } if ((now - session->driver.tsip.last_5c) >= 5) { /* Request Current Satellite Tracking Status */ putbyte(buf, 0, 0x00); /* All satellites */ (void)tsip_write(session, 0x3c, buf, 1); session->driver.tsip.last_5c = now; } if ((now - session->driver.tsip.last_46) > 5) { /* Request Health of Receiver */ (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)) { /* Compact Superpacket requested but no response */ session->driver.tsip.req_compact = 0; gpsd_log(&session->context->errout, LOG_WARN, "No Compact Super Packet, use LFwEI\n"); /* Request LFwEI Super Packet */ putbyte(buf, 0, 0x20); putbyte(buf, 1, 0x01); /* enabled */ (void)tsip_write(session, 0x8e, buf, 2); } #endif /* USE_SUPERPACKET */ return mask; } #ifdef CONTROLSEND_ENABLE static ssize_t tsip_control_send(struct gps_device_t *session, 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); } #endif /* CONTROLSEND_ENABLE */ static void tsip_init_query(struct gps_device_t *session) { unsigned char buf[100]; /* Request Hardware Version Information */ putbyte(buf, 0, 0x03); /* Subcode */ (void)tsip_write(session, 0x1c, buf, 1); /* * After HW information packet is received, a * decision is made how to configure the device. */ } static void tsip_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; if (event == event_identified) { unsigned char buf[100]; /* * Set basic configuration, in case no hardware config response * comes back. */ 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 && session->lexer.counter == 0) { /* * TSIP is ODD parity 1 stopbit, save original values and * change it Thunderbolts and Copernicus use * 8N1... which isn't exactly a good idea due to the * fragile wire format. We must divine a clever * 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; // gpsd_set_speed(session, session->gpsdata.dev.baudrate, 'O', 1); } 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); } } #ifdef RECONFIGURE_ENABLE static bool tsip_speed_switch(struct gps_device_t *session, speed_t speed, char parity, int stopbits) { unsigned char buf[100]; switch (parity) { case 'E': case 2: parity = (char)2; break; case 'O': case 1: parity = (char)1; break; case 'N': case 0: default: parity = (char)0; 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 */ (void)tsip_write(session, 0xbc, buf, 10); return true; /* it would be nice to error-check this */ } static void tsip_mode(struct gps_device_t *session, int mode) { if (mode == MODE_NMEA) { unsigned char buf[16]; /* 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 */ (void)tsip_write(session, 0x7A, buf, 6); /* Now switch to NMEA 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 */ (void)tsip_write(session, 0xBC, buf, 10); } else if (mode == MODE_BINARY) { /* The speed switcher also puts us back in TSIP, so call it */ /* with the default 9600 8O1. */ // FIX-ME: Should preserve the current speed. // (void)tsip_speed_switch(session, 9600, 'O', 1); ; } else { gpsd_log(&session->context->errout, LOG_ERROR, "unknown mode %i requested\n", mode); } } #endif /* RECONFIGURE_ENABLE */ #ifdef TIMEHINT_ENABLE static double tsip_time_offset(struct gps_device_t *session UNUSED) { /* FIX-ME: is a constant offset right here? */ return 0.075; } #endif /* TIMEHINT_ENABLE */ void configuration_packets_generic(struct gps_device_t *session) /* configure generic Trimble TSIP device to a known state */ { 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 */ (void)tsip_write(session, 0x35, buf, 4); /* Request Software Versions */ (void)tsip_write(session, 0x1f, NULL, 0); /* Request Current Time */ (void)tsip_write(session, 0x21, NULL, 0); /* Set Operating Parameters */ /* - dynamic code: land */ putbyte(buf, 0, 0x01); /* - elevation mask */ putbef32((char *)buf, 1, (float)5.0 * DEG_2_RAD); /* - signal level mask */ putbef32((char *)buf, 5, (float)06.0); /* - PDOP mask */ putbef32((char *)buf, 9, (float)8.0); /* - PDOP switch */ putbef32((char *)buf, 13, (float)6.0); (void)tsip_write(session, 0x2c, buf, 17); /* Set Position Fix Mode (auto 2D/3D) */ 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); (void)tsip_write(session, 0x8e, buf, 1); /* Request Navigation Configuration */ putbyte(buf, 0, 0x03); (void)tsip_write(session, 0xbb, buf, 1); } void configuration_packets_accutime_gold(struct gps_device_t *session) /* configure Accutime Gold to a known state */ { unsigned char buf[100]; /* Request Software Version Information */ putbyte(buf, 0, 0x01); (void)tsip_write(session, 0x1c, buf, 1); /* Set Self-Survey Parameters */ putbyte(buf, 0, 0xa9); /* Subcode */ putbyte(buf, 1, 0x01); /* Self-Survey Enable = enable */ putbyte(buf, 2, 0x01); /* Position Save Flag = save position */ putbe32(buf, 3, 2000); /* Self-Survey Length = 2000 */ putbe32(buf, 7, 0); /* Reserved */ (void)tsip_write(session, 0x8e, buf, 11); /* Set PPS Output Option */ putbyte(buf, 0, 0x4e); /* Subcode */ putbyte(buf, 1, 2); /* PPS driver switch = 2 (PPS is always output) */ (void)tsip_write(session, 0x8e, buf, 2); /* Set Primary Receiver Configuration */ putbyte(buf, 0, 0x00); /* Subcode */ putbyte(buf, 1, 0x07); /* Operating Dimension = default full position 4, ODCM 7 */ putbyte(buf, 2, 0xff); /* Not enabled = unchanged */ putbyte(buf, 3, 0x01); /* Dynamics code = default */ putbyte(buf, 4, 0x01); /* Solution Mode = default */ putbef32((char *)buf, 5, (float)0.1745); /* Elevation Mask = 0.1745 */ putbef32((char *)buf, 9, (float)4.0); /* AMU Mask = default is 4.0 */ putbef32((char *)buf, 13, (float)8.0); /* PDOP Mask = 8.0 */ putbef32((char *)buf, 17, (float)6.0); /* PDOP Switch = 6.0 */ putbyte(buf, 21, 0xff); /* N/A */ putbyte(buf, 22, 0x0); /* Foliage Mode = default */ putbe16(buf, 23, 0xffff); /* Reserved */ putbe16(buf, 25, 0x0000); /* Measurement Rate and Position Fix Rate = default */ putbe32(buf, 27, 0xffffffff); /* Reserved */ putbe32(buf, 31, 0xffffffff); /* Reserved */ putbe32(buf, 35, 0xffffffff); /* Reserved */ putbe32(buf, 39, 0xffffffff); /* Reserved */ (void)tsip_write(session, 0xbb, buf, 43); /* Set Packet Broadcast Mask */ putbyte(buf, 0, 0xa5); /* Subcode */ putbe16(buf, 1, 0x32e1); /* Packets bit field = default + Primary timing, Supplemental timing 32e1 */ putbyte(buf, 3, 0x00); /* not used */ putbyte(buf, 4, 0x00); /* not used */ (void)tsip_write(session, 0x8e, buf, 5); } /* this is everything we export */ /* *INDENT-OFF* */ const struct gps_type_t driver_tsip = { .type_name = "Trimble TSIP", /* full name of type */ .packet_type = TSIP_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, /* no trigger */ .channels = TSIP_CHANNELS, /* consumer-grade GPS */ .probe_detect = tsip_detect, /* probe for 9600O81 device */ .get_packet = generic_get, /* use the generic packet getter */ .parse_packet = tsip_parse_input, /* parse message packets */ .rtcm_writer = NULL, /* doesn't accept DGPS corrections */ .init_query = tsip_init_query, /* non-perturbing initial query */ .event_hook = tsip_event_hook, /* fire on various lifetime events */ #ifdef RECONFIGURE_ENABLE .speed_switcher = tsip_speed_switch,/* change baud rate */ .mode_switcher = tsip_mode, /* there is a mode switcher */ .rate_switcher = NULL, /* no rate switcher */ .min_cycle = 1, /* not relevant, no rate switcher */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = tsip_control_send,/* how to send commands */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = tsip_time_offset, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* TSIP_ENABLE */ gpsd-3.15/driver_ubx.c0000664000175000017500000010336712520742615013100 0ustar esresr/* * UBX driver. All capabilities are common to Antaris4 and u-blox 6. * Reference manuals are at * http://www.u-blox.com/en/download/documents-a-resources/u-blox-6-gps-modules-resources.html * * updated for u-blox 8 * http://www.ublox.com/images/downloads/Product_Docs/u-bloxM8_ReceiverDescriptionProtocolSpec_%28UBX-13003221%29_Public.pdf * * Week counters are not limited to 10 bits. It's unknown what * the firmware is doing to disambiguate them, if anything; it might just * be adding a fixed offset based on a hidden epoch value, in which case * unhappy things will occur on the next rollover. * * For the Antaris 4, the default leap-second offset (before getting one from * the sats, one presumes) is 0sec; for the u-blox 6 it's 15sec. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ #include #include #include #include #include #include #include "gpsd.h" #if defined(UBLOX_ENABLE) && defined(BINARY_ENABLE) #include "driver_ubx.h" #include "bits.h" /* * A ubx packet looks like this: * leader: 0xb5 0x62 * message class: 1 byte * message type: 1 byte * length of payload: 2 bytes * payload: variable length * checksum: 2 bytes * * see also the FV25 and UBX documents on reference.html */ #define UBX_PREFIX_LEN 6 #define UBX_CLASS_OFFSET 2 #define UBX_TYPE_OFFSET 3 /* because we hates magic numbers forever */ #define USART1_ID 1 #define USART2_ID 2 #define USB_ID 3 #define UBX_PROTOCOL_MASK 0x01 #define NMEA_PROTOCOL_MASK 0x02 #define RTCM_PROTOCOL_MASK 0x04 #define UBX_CFG_LEN 20 #define outProtoMask 14 static gps_mask_t ubx_parse(struct gps_device_t *session, unsigned char *buf, size_t len); static gps_mask_t ubx_msg_nav_dop(struct gps_device_t *session, unsigned char *buf, size_t data_len); static void ubx_msg_inf(struct gps_device_t *session, unsigned char *buf, size_t data_len); static gps_mask_t ubx_msg_nav_pvt(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 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_svinfo(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 void ubx_msg_mon_ver(struct gps_device_t *session, unsigned char *buf, size_t data_len); #ifdef RECONFIGURE_ENABLE static void ubx_mode(struct gps_device_t *session, int mode); #endif /* RECONFIGURE_ENABLE */ /** * Receiver/Software Version * UBX-MON-VER * * sadly more info than fits in session->swtype for now. * so squish the data hard, max is maybe 100? */ static void ubx_msg_mon_ver(struct gps_device_t *session, unsigned char *buf, size_t data_len) { size_t n = 0; /* extended info counter */ char obuf[128]; /* temp version string buffer */ if ( 44 > data_len ) { /* incomplete message */ return; } /* save SW and HW Version as subtype */ (void)snprintf(obuf, sizeof(obuf), "SW %.30s,HW %.10s", (char *)&buf[UBX_MESSAGE_DATA_OFFSET + 0], (char *)&buf[UBX_MESSAGE_DATA_OFFSET + 30]); /* get n number of Extended info strings. what is max n? */ for ( n = 0; ; n++ ) { size_t start_of_str = UBX_MESSAGE_DATA_OFFSET + 40 + (30 * n); if ( (start_of_str + 2 ) > data_len ) { /* last one can be shorter than 30 */ /* no more data */ break; } (void)strlcat(obuf, ",", sizeof(obuf)); (void)strlcat(obuf, (char *)&buf[start_of_str], sizeof(obuf)); } /* save what we can */ (void)strlcpy(session->subtype, obuf, sizeof(session->subtype)); /* output SW and HW Version at LOG_INFO */ gpsd_log(&session->context->errout, LOG_INF, "UBX_MON_VER: %.*s\n", (int)sizeof(obuf), obuf); } /** * Navigation Position Velocity Time solution message */ static gps_mask_t ubx_msg_nav_pvt(struct gps_device_t *session, unsigned char *buf, size_t data_len) { unsigned int flags; gps_mask_t mask = 0; if (data_len != 92) return 0; flags = (unsigned int)getub(buf, 21); /* TODO: finish decoding UBX_MON_PVT * no need until depreacaed UBX_MON_SOL is dead */ gpsd_log(&session->context->errout, LOG_DATA, "NAV-PVT: flags:%02x\n", flags); return mask; } /** * Navigation solution message */ static gps_mask_t ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, size_t data_len) { unsigned int flags; double epx, epy, epz, evx, evy, evz; unsigned char navmode; gps_mask_t mask; if (data_len != 52) return 0; flags = (unsigned int)getub(buf, 11); mask = 0; if ((flags & (UBX_SOL_VALID_WEEK | UBX_SOL_VALID_TIME)) != 0) { unsigned short gw; unsigned int tow; tow = (unsigned int)getleu32(buf, 0); gw = (unsigned short)getles16(buf, 8); session->newdata.time = gpsd_gpstime_resolve(session, gw, tow / 1000.0); mask |= TIME_SET | PPSTIME_IS; } epx = (double)(getles32(buf, 12) / 100.0); epy = (double)(getles32(buf, 16) / 100.0); epz = (double)(getles32(buf, 20) / 100.0); evx = (double)(getles32(buf, 28) / 100.0); evy = (double)(getles32(buf, 32) / 100.0); evz = (double)(getles32(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; if (session->driver.ubx.last_herr > 0.0) { session->newdata.epx = session->newdata.epy = session->driver.ubx.last_herr; mask |= HERR_SET; session->driver.ubx.last_herr = 0.0; } if (session->driver.ubx.last_verr > 0.0) { session->newdata.epv = session->driver.ubx.last_verr; mask |= VERR_SET; session->driver.ubx.last_verr = 0.0; } session->newdata.eps = (double)(getles32(buf, 40) / 100.0); mask |= SPEEDERR_SET; /* Better to have a single point of truth about DOPs */ //session->gpsdata.dop.pdop = (double)(getleu16(buf, 44)/100.0); session->gpsdata.satellites_used = (int)getub(buf, 47); navmode = (unsigned char)getub(buf, 10); switch (navmode) { case UBX_MODE_TMONLY: case UBX_MODE_3D: session->newdata.mode = MODE_3D; break; case UBX_MODE_2D: case UBX_MODE_DR: /* consider this too as 2D */ case UBX_MODE_GPSDR: /* FIX-ME: DR-aided GPS may be valid 3D */ session->newdata.mode = MODE_2D; break; default: session->newdata.mode = MODE_NO_FIX; } if ((flags & UBX_SOL_FLAG_DGPS) != 0) session->gpsdata.status = STATUS_DGPS_FIX; else if (session->newdata.mode != MODE_NO_FIX) session->gpsdata.status = STATUS_FIX; mask |= MODE_SET | STATUS_SET; gpsd_log(&session->context->errout, LOG_DATA, "NAVSOL: time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f climb=%.2f mode=%d status=%d used=%d\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, session->gpsdata.satellites_used); return mask; } /** * Geodetic position solution message */ static gps_mask_t ubx_msg_nav_posllh(struct gps_device_t *session, unsigned char *buf, size_t data_len UNUSED) { session->driver.ubx.last_herr = (double)(getleu32(buf, 20) / 1000.0); session->driver.ubx.last_verr = (double)(getleu32(buf, 24) / 1000.0); return 0; } /** * Dilution of precision message */ static gps_mask_t ubx_msg_nav_dop(struct gps_device_t *session, unsigned char *buf, size_t data_len) { if (data_len != 18) return 0; /* * We make a deliberate choice not to clear DOPs from the * last skyview here, but rather to treat this as a supplement * to our calculations from the visibility matrix, trusting * the firmware algorithms over ours. */ session->gpsdata.dop.gdop = (double)(getleu16(buf, 4) / 100.0); session->gpsdata.dop.pdop = (double)(getleu16(buf, 6) / 100.0); session->gpsdata.dop.tdop = (double)(getleu16(buf, 8) / 100.0); session->gpsdata.dop.vdop = (double)(getleu16(buf, 10) / 100.0); session->gpsdata.dop.hdop = (double)(getleu16(buf, 12) / 100.0); gpsd_log(&session->context->errout, 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; } /** * GPS Leap Seconds */ static gps_mask_t ubx_msg_nav_timegps(struct gps_device_t *session, unsigned char *buf, size_t data_len) { unsigned int gw, tow, flags; if (data_len != 16) return 0; tow = (unsigned int)getleu32(buf, 0); gw = (unsigned int)getles16(buf, 8); flags = (unsigned int)getub(buf, 11); if ((flags & 0x7) != 0) session->context->leap_seconds = (int)getub(buf, 10); session->newdata.time = gpsd_gpstime_resolve(session, (unsigned short int)gw, (double)tow / 1000.0); gpsd_log(&session->context->errout, LOG_DATA, "TIMEGPS: time=%.2f leap=%d, mask={TIME}\n", session->newdata.time, session->context->leap_seconds); return TIME_SET | PPSTIME_IS; } /** * GPS Satellite Info */ static gps_mask_t ubx_msg_nav_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data_len) { unsigned int i, nchan, nsv, st; if (data_len < 152) { gpsd_log(&session->context->errout, LOG_PROG, "runt svinfo (datalen=%zd)\n", data_len); return 0; } nchan = (unsigned int)getub(buf, 4); if (nchan > MAXCHANNELS) { gpsd_log(&session->context->errout, LOG_WARN, "Invalid NAV SVINFO message, >%d reported visible", MAXCHANNELS); return 0; } gpsd_zero_satellites(&session->gpsdata); nsv = 0; for (i = st = 0; i < nchan; i++) { unsigned int off = 8 + 12 * i; bool used = (bool)(getub(buf, off + 2) & 0x01); 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.skyview[st].PRN = (short)getub(buf, off + 1); session->gpsdata.skyview[st].ss = (float)getub(buf, off + 4); session->gpsdata.skyview[st].elevation = (short)getsb(buf, off + 5); session->gpsdata.skyview[st].azimuth = (short)getles16(buf, off + 6); session->gpsdata.skyview[st].used = used; if (session->gpsdata.skyview[st].PRN == 0) continue; if (used || session->gpsdata.skyview[st].PRN == (short)session->driver.ubx.sbas_in_use) { nsv++; session->gpsdata.skyview[st].used = true; } st++; } session->gpsdata.skyview_time = NAN; session->gpsdata.satellites_visible = (int)st; session->gpsdata.satellites_used = (int)nsv; gpsd_log(&session->context->errout, LOG_DATA, "SVINFO: visible=%d used=%d mask={SATELLITE|USED}\n", session->gpsdata.satellites_visible, session->gpsdata.satellites_used); return SATELLITE_SET | USED_IS; } /* * SBAS Info */ static void ubx_msg_sbas(struct gps_device_t *session, unsigned char *buf) { #ifdef __UNUSED_DEBUG__ unsigned int i, nsv; gpsd_log(&session->context->errout, 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)); nsv = (int)getub(buf, 8); for (i = 0; i < nsv; i++) { int off = 12 + 12 * i; gpsd_log(&session->context->errout, LOG_WARN, "SBAS info on SV: %d\n", (int)getub(buf, off)); } #endif /* __UNUSED_DEBUG__ */ /* really 'in_use' depends on the sats info, EGNOS is still in test */ /* In WAAS areas one might also check for the type of corrections indicated */ session->driver.ubx.sbas_in_use = (unsigned char)getub(buf, 4); } /* * Raw Subframes */ static gps_mask_t ubx_msg_sfrb(struct gps_device_t *session, unsigned char *buf) { unsigned int i, chan, svid; uint32_t words[10]; chan = (unsigned int)getub(buf, 0); svid = (unsigned int)getub(buf, 1); gpsd_log(&session->context->errout, LOG_PROG, "UBX_RXM_SFRB: %u %u\n", chan, svid); /* UBX does all the parity checking, but still bad data gets through */ for (i = 0; i < 10; i++) { words[i] = (uint32_t)getleu32(buf, 4 * i + 2) & 0xffffff; } return gpsd_interpret_subframe(session, svid, words); } static void ubx_msg_inf(struct gps_device_t *session, 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; (void)strlcpy(txtbuf, (char *)buf + UBX_PREFIX_LEN, sizeof(txtbuf)); txtbuf[data_len] = '\0'; switch (msgid) { case UBX_INF_DEBUG: gpsd_log(&session->context->errout, LOG_PROG, "UBX_INF_DEBUG: %s\n", txtbuf); break; case UBX_INF_TEST: gpsd_log(&session->context->errout, LOG_PROG, "UBX_INF_TEST: %s\n", txtbuf); break; case UBX_INF_NOTICE: gpsd_log(&session->context->errout, LOG_INF, "UBX_INF_NOTICE: %s\n", txtbuf); break; case UBX_INF_WARNING: gpsd_log(&session->context->errout, LOG_WARN, "UBX_INF_WARNING: %s\n", txtbuf); break; case UBX_INF_ERROR: gpsd_log(&session->context->errout, LOG_WARN, "UBX_INF_ERROR: %s\n", txtbuf); break; default: break; } return; } 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; /* the packet at least contains a head long enough for an empty message */ if (len < UBX_PREFIX_LEN) return 0; session->cycle_end_reliable = true; /* extract message id and length */ msgid = (buf[2] << 8) | buf[3]; data_len = (size_t) getles16(buf, 4); switch (msgid) { case UBX_NAV_POSECEF: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_POSECEF\n"); break; case UBX_NAV_POSLLH: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_POSLLH\n"); mask = ubx_msg_nav_posllh(session, &buf[UBX_PREFIX_LEN], data_len); break; case UBX_NAV_STATUS: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_STATUS\n"); break; case UBX_NAV_DOP: gpsd_log(&session->context->errout, LOG_PROG, "UBX_NAV_DOP\n"); mask = ubx_msg_nav_dop(session, &buf[UBX_PREFIX_LEN], data_len); break; case UBX_NAV_SOL: /* UBX-NAV-SOL deprecated, use UBX-NAV-PVT instead */ gpsd_log(&session->context->errout, LOG_PROG, "UBX_NAV_SOL\n"); mask = ubx_msg_nav_sol(session, &buf[UBX_PREFIX_LEN], data_len) | (CLEAR_IS | REPORT_IS); break; case UBX_NAV_PVT: gpsd_log(&session->context->errout, LOG_PROG, "UBX_NAV_PVT\n"); mask = ubx_msg_nav_pvt(session, &buf[UBX_PREFIX_LEN], data_len); break; case UBX_NAV_POSUTM: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_POSUTM\n"); break; case UBX_NAV_VELECEF: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_VELECEF\n"); break; case UBX_NAV_VELNED: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_VELNED\n"); break; case UBX_NAV_TIMEGPS: gpsd_log(&session->context->errout, LOG_PROG, "UBX_NAV_TIMEGPS\n"); mask = ubx_msg_nav_timegps(session, &buf[UBX_PREFIX_LEN], data_len); break; case UBX_NAV_TIMEUTC: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_TIMEUTC\n"); break; case UBX_NAV_CLOCK: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_CLOCK\n"); break; case UBX_NAV_SVINFO: gpsd_log(&session->context->errout, LOG_PROG, "UBX_NAV_SVINFO\n"); mask = ubx_msg_nav_svinfo(session, &buf[UBX_PREFIX_LEN], data_len); /* this is a hack to move some initialization until after we * get some u-blox message so we know the GPS is alive */ if ('\0' == session->subtype[0]) { /* one time only */ (void)strlcpy(session->subtype, "Unknown", 8); /* request SW and HW Versions */ (void)ubx_write(session, UBX_CLASS_MON, 0x04, NULL, 0); } break; case UBX_NAV_DGPS: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_DGPS\n"); break; case UBX_NAV_SBAS: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_SBAS\n"); ubx_msg_sbas(session, &buf[6]); break; case UBX_NAV_EKFSTATUS: gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_EKFSTATUS\n"); break; case UBX_RXM_RAW: gpsd_log(&session->context->errout, LOG_DATA, "UBX_RXM_RAW\n"); break; case UBX_RXM_SFRB: mask = ubx_msg_sfrb(session, &buf[UBX_PREFIX_LEN]); break; case UBX_RXM_SVSI: gpsd_log(&session->context->errout, LOG_PROG, "UBX_RXM_SVSI\n"); break; case UBX_RXM_ALM: gpsd_log(&session->context->errout, LOG_DATA, "UBX_RXM_ALM\n"); break; case UBX_RXM_EPH: gpsd_log(&session->context->errout, LOG_DATA, "UBX_RXM_EPH\n"); break; case UBX_RXM_POSREQ: gpsd_log(&session->context->errout, LOG_DATA, "UBX_RXM_POSREQ\n"); break; case UBX_MON_SCHED: gpsd_log(&session->context->errout, LOG_DATA, "UBX_MON_SCHED\n"); break; case UBX_MON_IO: gpsd_log(&session->context->errout, LOG_DATA, "UBX_MON_IO\n"); break; case UBX_MON_IPC: gpsd_log(&session->context->errout, LOG_DATA, "UBX_MON_IPC\n"); break; case UBX_MON_VER: gpsd_log(&session->context->errout, LOG_DATA, "UBX_MON_VER\n"); ubx_msg_mon_ver(session, buf, data_len); break; case UBX_MON_EXCEPT: gpsd_log(&session->context->errout, LOG_DATA, "UBX_MON_EXCEPT\n"); break; case UBX_MON_MSGPP: gpsd_log(&session->context->errout, LOG_DATA, "UBX_MON_MSGPP\n"); break; case UBX_MON_RXBUF: gpsd_log(&session->context->errout, LOG_DATA, "UBX_MON_RXBUF\n"); break; case UBX_MON_TXBUF: gpsd_log(&session->context->errout, LOG_DATA, "UBX_MON_TXBUF\n"); break; case UBX_MON_HW: gpsd_log(&session->context->errout, LOG_DATA, "UBX_MON_HW\n"); break; case UBX_MON_USB: gpsd_log(&session->context->errout, LOG_DATA, "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(session, buf, data_len); break; case UBX_CFG_PRT: session->driver.ubx.port_id = (unsigned char)buf[UBX_MESSAGE_DATA_OFFSET + 0]; gpsd_log(&session->context->errout, LOG_INF, "UBX_CFG_PRT: port %d\n", session->driver.ubx.port_id); break; case UBX_TIM_TP: gpsd_log(&session->context->errout, LOG_DATA, "UBX_TIM_TP\n"); break; case UBX_TIM_TM: gpsd_log(&session->context->errout, LOG_DATA, "UBX_TIM_TM\n"); break; case UBX_TIM_TM2: gpsd_log(&session->context->errout, LOG_DATA, "UBX_TIM_TM2\n"); break; case UBX_TIM_SVIN: gpsd_log(&session->context->errout, LOG_DATA, "UBX_TIM_SVIN\n"); break; case UBX_ACK_NAK: gpsd_log(&session->context->errout, LOG_WARN, "UBX_ACK_NAK, class: %02x, id: %02x\n", buf[UBX_CLASS_OFFSET], buf[UBX_TYPE_OFFSET]); break; case UBX_ACK_ACK: gpsd_log(&session->context->errout, LOG_DATA, "UBX_ACK_ACK, class: %02x, id: %02x\n", buf[UBX_CLASS_OFFSET], buf[UBX_TYPE_OFFSET]); break; default: gpsd_log(&session->context->errout, LOG_WARN, "UBX: unknown packet id 0x%04hx (length %zd)\n", msgid, len); } return mask | ONLINE_SET; } static gps_mask_t parse_input(struct gps_device_t *session) { if (session->lexer.type == UBX_PACKET) { return ubx_parse(session, session->lexer.outbuffer, session->lexer.outbuflen); #ifdef NMEA_ENABLE } else if (session->lexer.type == NMEA_PACKET) { return nmea_parse((char *)session->lexer.outbuffer, session); #endif /* NMEA_ENABLE */ } else return 0; } bool ubx_write(struct gps_device_t * session, unsigned int msg_class, unsigned int msg_id, unsigned char *msg, size_t data_len) { unsigned char CK_A, CK_B; ssize_t count; size_t i; bool ok; 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 += session->msgbuf[i]; CK_B += CK_A; } if (msg != NULL) 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; gpsd_log(&session->context->errout, LOG_PROG, "=> GPS: UBX class: %02x, id: %02x, len: %zd, crc: %02x%02x\n", msg_class, msg_id, data_len, CK_A, CK_B); count = gpsd_write(session, session->msgbuf, session->msgbuflen); ok = (count == (ssize_t) session->msgbuflen); return (ok); } #ifdef CONTROLSEND_ENABLE 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, (size_t)(data_len - 2)) ? ((ssize_t) (data_len + 7)) : -1; } #endif /* CONTROLSEND_ENABLE */ static void ubx_init_query(struct gps_device_t *session) { /* MON_VER: query for version information */ (void)ubx_write(session, UBX_CLASS_MON, 0x04, NULL, 0); } static void ubx_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; else if (event == event_identified) { unsigned char msg[32]; gpsd_log(&session->context->errout, LOG_DATA, "UBX configure\n"); msg[0] = 0x03; /* SBAS mode enabled, accept testbed mode */ msg[1] = 0x07; /* SBAS usage: range, differential corrections and integrity */ msg[2] = 0x03; /* use the maximum 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); #ifdef RECONFIGURE_ENABLE /* * Turn off NMEA output, turn on UBX on this port. */ if (session->mode == O_OPTIMIZE) { ubx_mode(session, MODE_BINARY); } #endif /* RECONFIGURE_ENABLE */ } else if (event == event_deactivate) { unsigned char msg[4] = { 0x00, 0x00, /* hotstart */ 0x01, /* controlled software reset */ 0x00 }; /* reserved */ gpsd_log(&session->context->errout, LOG_DATA, "UBX revert\n"); /* Reverting all in one fast and reliable reset */ (void)ubx_write(session, 0x06, 0x04, msg, 4); /* CFG-RST */ } } #ifdef RECONFIGURE_ENABLE static void ubx_cfg_prt(struct gps_device_t *session, speed_t speed, const char parity, const int stopbits, const int mode) /* generate and send a configuration block */ { unsigned long usart_mode = 0; unsigned char buf[UBX_CFG_LEN]; memset(buf, '\0', UBX_CFG_LEN); /* * When this is called from gpsd, the initial probe for UBX should * have picked up the device's port number from the CFG_PRT response. */ if (session->driver.ubx.port_id != 0) buf[0] = session->driver.ubx.port_id; /* * This default can be hit if we haven't sent a CFG_PRT query yet, * which can happen in gpsmon because it doesn't autoprobe. * * What we'd like to do here is dispatch to USART1_ID or * USB_ID intelligently based on whether this is a USB or RS232 * source. Unfortunately the GR601-W screws that up by being * a USB device with port_id 1. So we bite the bullet and * default to port 1. * * Without further logic, this means gpsmon wouldn't be able to * change the speed on the EVK 6H's USB port. But! To pick off * the EVK 6H on Linux as a special case, we notice that its * USB device name is /dev/ACMx - it presents as a USB modem. * * This logic will fail on any USB u-blox device that presents * as an ordinary USB serial device (/dev/USB*) and actually * has port ID 3 the way it ought to. */ else if (strstr(session->gpsdata.dev.path, "/ACM") != NULL) buf[0] = USB_ID; else buf[0] = USART1_ID; putle32(buf, 8, speed); /* * u-blox tech support explains the default contents of the mode * field as follows: * * D0 08 00 00 mode (LSB first) * * re-ordering bytes: 000008D0 * dividing into fields: 000000000000000000 00 100 0 11 0 1 0000 * nStopbits = 00 = 1 * parity = 100 = none * charLen = 11 = 8-bit * reserved1 = 1 * * The protocol reference further gives the following subfield values: * 01 = 1.5 stop bits (?) * 10 = 2 stopbits * 000 = even parity * 001 = odd parity * 10x = no parity * 10 = 7 bits * * Some UBX reference code amplifies this with: * * prtcfg.mode = (1<<4) | // compatibility with ANTARIS 4 * (1<<7) | // charLen = 11 = 8 bit * (1<<6) | // charLen = 11 = 8 bit * (1<<11); // parity = 10x = none */ usart_mode |= (1<<4); /* reserved1 Antaris 4 compatibility bit */ usart_mode |= (1<<7); /* high bit of charLen */ switch (parity) { case (int)'E': case 2: usart_mode |= (1<<7); /* 7E */ break; case (int)'O': case 1: usart_mode |= (1<<9) | (1<<7); /* 7O */ break; case (int)'N': case 0: default: usart_mode |= (1<<11) | (3<<6); /* 8N */ break; } if (stopbits == 2) usart_mode |= (1<<13); putle32(buf, 4, usart_mode); /* enable all input protocols by default */ buf[12] = NMEA_PROTOCOL_MASK | UBX_PROTOCOL_MASK | RTCM_PROTOCOL_MASK; /* selectively enable output protocols */ if (mode == MODE_NMEA) { /* * We have to club the GR601-W over the head to make it stop emitting * UBX after we've told it to start. Turning off the UBX protocol * mask, by itself, seems to be ineffective. */ unsigned char msg[3]; msg[0] = 0x01; /* class */ msg[1] = 0x04; /* msg id = UBX_NAV_DOP */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); /* UBX-NAV-SOL deprecated, use UBX-NAV-PVT instead */ msg[0] = 0x01; /* class */ msg[1] = 0x06; /* msg id = NAV-SOL */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0x01; /* class */ msg[1] = 0x20; /* msg id = UBX_NAV_TIMEGPS */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0x01; /* class */ msg[1] = 0x30; /* msg id = NAV-SVINFO */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0x01; /* class */ msg[1] = 0x32; /* msg id = NAV-SBAS */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); /* try to improve the sentence mix. in particular by enabling ZDA */ msg[0] = 0xf0; /* class */ msg[1] = 0x09; /* msg id = GBS */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x00; /* msg id = GGA */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x02; /* msg id = GSA */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x07; /* msg id = GST */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x03; /* msg id = GSV */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x04; /* msg id = RMC */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x05; /* msg id = VTG */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x08; /* msg id = ZDA */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); buf[outProtoMask] &= ~UBX_PROTOCOL_MASK; buf[outProtoMask] |= NMEA_PROTOCOL_MASK; } else { /* MODE_BINARY */ /* * Just enabling the UBX protocol for output is not enough to * actually get UBX output; the sentence mix is initially empty. * Fix that... */ /* FIXME: possibly sending too many messages without waiting * for u-blox ACK, over running its input buffer. * * for example, the UBX_MON_VER fails here, but works in other * contexts */ unsigned char msg[3] = {0, 0, 0}; /* request SW and HW Versions */ (void)ubx_write(session, UBX_CLASS_MON, 0x04, msg, 0); msg[0] = 0x01; /* class */ msg[1] = 0x04; /* msg id = UBX_NAV_DOP */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); /* UBX-NAV-SOL deprecated, use UBX-NAV-PVT instead */ msg[0] = 0x01; /* class */ msg[1] = 0x06; /* msg id = NAV-SOL */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); #ifdef __UNUSED__ /* leave here for testing. No need to enable until gpsd * can decode UBX-MON-VER */ msg[0] = 0x01; /* class */ msg[1] = 0x07; /* msg id = NAV-PVT */ msg[2] = 0x01; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); #endif /* __UNUSED __ */ 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 */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0x01; /* class */ msg[1] = 0x32; /* msg id = NAV-SBAS */ msg[2] = 0x0a; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); #ifdef __UNUSED__ /* * In theory this should turn off NMEA reporting even if * clearing the NMEA protocol mask does not. In practice it * doesn't work on the GR601-W. If it did, we could get rid * of the crocky code that detects unsuppressed NMEA and * suppresses UBX. */ msg[0] = 0xf0; /* class */ msg[1] = 0x09; /* msg id = GBS */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x00; /* msg id = GGA */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x02; /* msg id = GSA */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x07; /* msg id = GST */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x03; /* msg id = GSV */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x04; /* msg id = RMC */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x05; /* msg id = VTG */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); msg[0] = 0xf0; /* class */ msg[1] = 0x08; /* msg id = ZDA */ msg[2] = 0x00; /* rate */ (void)ubx_write(session, 0x06u, 0x01, msg, 3); #endif /* __UNUSED __ */ buf[outProtoMask] &= ~NMEA_PROTOCOL_MASK; buf[outProtoMask] |= UBX_PROTOCOL_MASK; } (void)ubx_write(session, 0x06u, 0x00, buf, sizeof(buf)); } static void ubx_mode(struct gps_device_t *session, int mode) { ubx_cfg_prt(session, gpsd_get_speed(session), gpsd_get_parity(session), gpsd_get_stopbits(session), mode); } static bool ubx_speed(struct gps_device_t *session, speed_t speed, char parity, int stopbits) { ubx_cfg_prt(session, speed, parity, stopbits, (session->lexer.type == UBX_PACKET) ? MODE_BINARY : MODE_NMEA); return true; } static bool ubx_rate(struct gps_device_t *session, double cycletime) /* change the sample rate of the GPS */ { unsigned short s; 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 */ }; /* clamp to cycle times that i know work on my receiver */ if (cycletime > 1000.0) cycletime = 1000.0; if (cycletime < 200.0) cycletime = 200.0; gpsd_log(&session->context->errout, LOG_DATA, "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 */ } #endif /* RECONFIGURE_ENABLE */ /* This is everything we export */ /* *INDENT-OFF* */ const struct gps_type_t driver_ubx = { .type_name = "u-blox", /* Full name of type */ .packet_type = UBX_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = NULL, .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) */ .parse_packet = parse_input, /* Parse message packets */ .rtcm_writer = gpsd_write, /* RTCM handler (using default routine) */ .init_query = ubx_init_query, /* non-perturbing initial query */ .event_hook = ubx_event_hook, /* Fire on various lifetime events */ #ifdef RECONFIGURE_ENABLE .speed_switcher = ubx_speed, /* Speed (baudrate) switch */ .mode_switcher = ubx_mode, /* Mode switcher */ .rate_switcher = ubx_rate, /* Message delivery rate switcher */ .min_cycle = 0.25, /* Maximum 4Hz sample rate */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = ubx_control_send,/* how to send a control string */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* defined(UBLOX_ENABLE) && defined(BINARY_ENABLE) */ gpsd-3.15/driver_ubx.h0000664000175000017500000001075212506317026013076 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details */ #ifndef _GPSD_UBX_H_ #define _GPSD_UBX_H_ #define UBX_MESSAGE_BASE_SIZE 6 #define UBX_MESSAGE_DATA_OFFSET UBX_MESSAGE_BASE_SIZE typedef enum { UBX_CLASS_NAV = 0x01, /**< Navigation */ UBX_CLASS_RXM = 0x02, /**< Receiver Manager */ UBX_CLASS_INF = 0x04, /**< Informative text messages */ UBX_CLASS_ACK = 0x05, /**< (Not) Acknowledges for cfg messages */ UBX_CLASS_CFG = 0x06, /**< Configuration requests */ UBX_CLASS_UPD = 0x09, /**< Firmware updates */ UBX_CLASS_MON = 0x0a, /**< System monitoring */ UBX_CLASS_AID = 0x0b, /**< AGPS */ UBX_CLASS_TIM = 0x0d, /**< Time */ } ubx_classes_t; #define UBX_MSGID(cls_, id_) (((cls_)<<8)|(id_)) typedef enum { UBX_NAV_POSECEF = UBX_MSGID(UBX_CLASS_NAV, 0x01), UBX_NAV_POSLLH = UBX_MSGID(UBX_CLASS_NAV, 0x02), UBX_NAV_STATUS = UBX_MSGID(UBX_CLASS_NAV, 0x03), UBX_NAV_DOP = UBX_MSGID(UBX_CLASS_NAV, 0x04), UBX_NAV_SOL = UBX_MSGID(UBX_CLASS_NAV, 0x06), UBX_NAV_PVT = UBX_MSGID(UBX_CLASS_NAV, 0x07), UBX_NAV_POSUTM = UBX_MSGID(UBX_CLASS_NAV, 0x08), UBX_NAV_VELECEF = UBX_MSGID(UBX_CLASS_NAV, 0x11), UBX_NAV_VELNED = UBX_MSGID(UBX_CLASS_NAV, 0x12), UBX_NAV_TIMEGPS = UBX_MSGID(UBX_CLASS_NAV, 0x20), UBX_NAV_TIMEUTC = UBX_MSGID(UBX_CLASS_NAV, 0x21), UBX_NAV_CLOCK = UBX_MSGID(UBX_CLASS_NAV, 0x22), UBX_NAV_SVINFO = UBX_MSGID(UBX_CLASS_NAV, 0x30), UBX_NAV_DGPS = UBX_MSGID(UBX_CLASS_NAV, 0x31), UBX_NAV_SBAS = UBX_MSGID(UBX_CLASS_NAV, 0x32), UBX_NAV_EKFSTATUS = UBX_MSGID(UBX_CLASS_NAV, 0x40), UBX_RXM_RAW = UBX_MSGID(UBX_CLASS_RXM, 0x10), UBX_RXM_SFRB = UBX_MSGID(UBX_CLASS_RXM, 0x11), UBX_RXM_SVSI = UBX_MSGID(UBX_CLASS_RXM, 0x20), UBX_RXM_ALM = UBX_MSGID(UBX_CLASS_RXM, 0x30), UBX_RXM_EPH = UBX_MSGID(UBX_CLASS_RXM, 0x31), UBX_RXM_POSREQ = UBX_MSGID(UBX_CLASS_RXM, 0x40), UBX_INF_ERROR = UBX_MSGID(UBX_CLASS_INF, 0X00), UBX_INF_WARNING = UBX_MSGID(UBX_CLASS_INF, 0X01), UBX_INF_NOTICE = UBX_MSGID(UBX_CLASS_INF, 0x02), UBX_INF_TEST = UBX_MSGID(UBX_CLASS_INF, 0x03), UBX_INF_DEBUG = UBX_MSGID(UBX_CLASS_INF, 0x04), UBX_INF_USER = UBX_MSGID(UBX_CLASS_INF, 0x07), UBX_ACK_NAK = UBX_MSGID(UBX_CLASS_ACK, 0x00), UBX_ACK_ACK = UBX_MSGID(UBX_CLASS_ACK, 0x01), UBX_CFG_PRT = UBX_MSGID(UBX_CLASS_CFG, 0x00), UBX_UPD_DOWNL = UBX_MSGID(UBX_CLASS_UPD, 0x01), UBX_UPD_UPLOAD = UBX_MSGID(UBX_CLASS_UPD, 0x02), UBX_UPD_EXEC = UBX_MSGID(UBX_CLASS_UPD, 0x03), UBX_UPD_MEMCPY = UBX_MSGID(UBX_CLASS_UPD, 0x04), UBX_MON_SCHED = UBX_MSGID(UBX_CLASS_MON, 0x01), UBX_MON_IO = UBX_MSGID(UBX_CLASS_MON, 0x02), UBX_MON_IPC = UBX_MSGID(UBX_CLASS_MON, 0x03), UBX_MON_VER = UBX_MSGID(UBX_CLASS_MON, 0x04), UBX_MON_EXCEPT = UBX_MSGID(UBX_CLASS_MON, 0x05), UBX_MON_MSGPP = UBX_MSGID(UBX_CLASS_MON, 0x06), UBX_MON_RXBUF = UBX_MSGID(UBX_CLASS_MON, 0x07), UBX_MON_TXBUF = UBX_MSGID(UBX_CLASS_MON, 0x08), UBX_MON_HW = UBX_MSGID(UBX_CLASS_MON, 0x09), UBX_MON_USB = UBX_MSGID(UBX_CLASS_MON, 0x0a), UBX_AID_REQ = UBX_MSGID(UBX_CLASS_AID, 0x00), UBX_AID_INI = UBX_MSGID(UBX_CLASS_AID, 0x01), UBX_AID_HUI = UBX_MSGID(UBX_CLASS_AID, 0x02), UBX_AID_DATA = UBX_MSGID(UBX_CLASS_AID, 0x10), UBX_AID_ALM = UBX_MSGID(UBX_CLASS_AID, 0x30), UBX_AID_EPH = UBX_MSGID(UBX_CLASS_AID, 0x31), UBX_TIM_TP = UBX_MSGID(UBX_CLASS_TIM, 0x01), UBX_TIM_TM = UBX_MSGID(UBX_CLASS_TIM, 0x02), UBX_TIM_TM2 = UBX_MSGID(UBX_CLASS_TIM, 0x03), UBX_TIM_SVIN = UBX_MSGID(UBX_CLASS_TIM, 0x04), } ubx_message_t; typedef enum { UBX_MODE_NOFIX = 0x00, /* no fix available */ UBX_MODE_DR = 0x01, /* Dead reckoning */ UBX_MODE_2D = 0x02, /* 2D fix */ UBX_MODE_3D = 0x03, /* 3D fix */ UBX_MODE_GPSDR = 0x04, /* GPS + dead reckoning */ UBX_MODE_TMONLY = 0x05, /* Time-only fix */ } ubx_mode_t; #define UBX_SOL_FLAG_GPS_FIX_OK 0x01 #define UBX_SOL_FLAG_DGPS 0x02 #define UBX_SOL_VALID_WEEK 0x04 #define UBX_SOL_VALID_TIME 0x08 /* from UBX_NAV_SVINFO */ #define UBX_SAT_USED 0x01 #define UBX_SAT_DGPS 0x02 #define UBX_SAT_EPHALM 0x04 #define UBX_SAT_EPHEM 0x08 #define UBX_SAT_UNHEALTHY 0x10 #define UBX_SIG_IDLE 0 #define UBX_SIG_SRCH1 1 #define UBX_SIG_SRCH2 2 #define UBX_SIG_DETECT 3 #define UBX_SIG_CDLK 4 #define UBX_SIG_CDCRLK1 5 #define UBX_SIG_CDCRLK2 6 #define UBX_SIG_NAVMSG 7 #endif /* _GPSD_UBX_H_ */ gpsd-3.15/driver_zodiac.c0000664000175000017500000004031112520742615013540 0ustar esresr/* * Handle the Rockwell binary packet format supported by the old Zodiac chipset * * Week counters are not limited to 10 bits. It's unknown what * the firmware is doing to disambiguate them, if anything; it might just * be adding a fixed offset based on a hidden epoch value, in which case * unhappy things will occur on the next rollover. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include "gpsd.h" #include "bits.h" #include "strfuncs.h" /* Zodiac protocol description uses 1-origin indexing by little-endian word */ #define get16z(buf, n) ( (buf[2*(n)-2]) \ | (buf[2*(n)-1] << 8)) #define get32z(buf, n) ( (buf[2*(n)-2]) \ | (buf[2*(n)-1] << 8) \ | (buf[2*(n)+0] << 16) \ | (buf[2*(n)+1] << 24)) #define getstringz(to, from, s, e) \ (void)memcpy(to, from+2*(s)-2, 2*((e)-(s)+1)) #ifdef ZODIAC_ENABLE struct header { unsigned short sync; unsigned short id; unsigned short ndata; unsigned short flags; unsigned short csum; }; static unsigned short zodiac_checksum(unsigned short *w, int n) { unsigned short csum = 0; while (n-- > 0) csum += *(w++); return -csum; } static ssize_t end_write(int fd, void *d, size_t len) /* write an array of shorts in little-endian format */ { unsigned char buf[BUFSIZ]; short *data = (short *)d; size_t n; for (n = 0; n < (size_t)(len/2); n++) putle16(buf, n*2, data[n]); return write(fd, (char*)buf, len); } /* zodiac_spew - Takes a message type, an array of data words, and a length * for the array, and prepends a 5 word header (including checksum). * The data words are expected to be checksummed. */ static ssize_t zodiac_spew(struct gps_device_t *session, unsigned short type, unsigned short *dat, int dlen) { struct header h; int i; char buf[BUFSIZ]; h.sync = 0x81ff; h.id = (unsigned short)type; h.ndata = (unsigned short)(dlen - 1); h.flags = 0; h.csum = zodiac_checksum((unsigned short *)&h, 4); if (!BAD_SOCKET(session->gpsdata.gps_fd)) { 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) { gpsd_log(&session->context->errout, LOG_RAW, "Reconfigure write failed\n"); return -1; } } (void)snprintf(buf, sizeof(buf), "%04x %04x %04x %04x %04x", h.sync, h.id, h.ndata, h.flags, h.csum); for (i = 0; i < dlen; i++) str_appendf(buf, sizeof(buf), " %04x", dat[i]); gpsd_log(&session->context->errout, LOG_RAW, "Sent Zodiac packet: %s\n", buf); return 0; } static void send_rtcm(struct gps_device_t *session, const char *rtcmbuf, size_t rtcmbytes) { unsigned short data[34]; 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 */ memcpy(&data[1], rtcmbuf, rtcmbytes); data[n] = zodiac_checksum(data, n); (void)zodiac_spew(session, 1351, data, n + 1); } static ssize_t zodiac_send_rtcm(struct gps_device_t *session, const char *rtcmbuf, size_t rtcmbytes) { while (rtcmbytes > 0) { size_t len = (size_t) (rtcmbytes > 64 ? 64 : rtcmbytes); send_rtcm(session, rtcmbuf, len); rtcmbytes -= len; rtcmbuf += len; } return 1; } #define getzword(n) get16z(session->lexer.outbuffer, n) #define getzlong(n) get32z(session->lexer.outbuffer, n) static gps_mask_t handle1000(struct gps_device_t *session) /* time-position-velocity report */ { gps_mask_t mask; double subseconds; struct tm unpacked_date; /* ticks = getzlong(6); */ /* sequence = getzword(8); */ /* measurement_sequence = getzword(9); */ session->gpsdata.status = (getzword(10) & 0x1c) ? 0 : 1; if (session->gpsdata.status != 0) session->newdata.mode = (getzword(10) & 1) ? MODE_2D : MODE_3D; else session->newdata.mode = MODE_NO_FIX; /* solution_type = getzword(11); */ session->gpsdata.satellites_used = (int)getzword(12); /* polar_navigation = getzword(13); */ session->context->gps_week = (unsigned short)getzword(14); /* gps_seconds = getzlong(15); */ /* gps_nanoseconds = getzlong(17); */ unpacked_date.tm_mday = (int)getzword(19); unpacked_date.tm_mon = (int)getzword(20) - 1; unpacked_date.tm_year = (int)getzword(21) - 1900; unpacked_date.tm_hour = (int)getzword(22); unpacked_date.tm_min = (int)getzword(23); unpacked_date.tm_sec = (int)getzword(24); unpacked_date.tm_isdst = 0; subseconds = (int)getzlong(25) / 1e9; session->newdata.time = (timestamp_t)mkgmtime(&unpacked_date) + subseconds; 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->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; /* 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; /* clock_bias = (int)getzlong(47) * 1e-2; */ /* clock_bias_sd = (int)getzlong(49) * 1e-2; */ /* clock_drift = (int)getzlong(51) * 1e-2; */ /* clock_drift_sd = (int)getzlong(53) * 1e-2; */ mask = TIME_SET | PPSTIME_IS | LATLON_SET | ALTITUDE_SET | CLIMB_SET | SPEED_SET | TRACK_SET | STATUS_SET | MODE_SET; gpsd_log(&session->context->errout, LOG_DATA, "1000: time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f climb=%.2f mode=%d status=%d\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); return mask; } static gps_mask_t handle1002(struct gps_device_t *session) /* satellite signal quality report */ { int i; /* ticks = getzlong(6); */ /* sequence = getzword(8); */ /* measurement_sequence = getzword(9); */ int gps_week = getzword(10); int gps_seconds = getzlong(11); /* gps_nanoseconds = getzlong(13); */ /* Note: this week counter is not limited to 10 bits. */ session->context->gps_week = (unsigned short)gps_week; session->gpsdata.satellites_used = 0; for (i = 0; i < ZODIAC_CHANNELS; i++) { int status, prn; session->driver.zodiac.Zv[i] = status = (int)getzword(15 + (3 * i)); session->driver.zodiac.Zs[i] = prn = (int)getzword(16 + (3 * i)); if (status & 1) session->gpsdata.satellites_used++; session->gpsdata.skyview[i].PRN = (short)prn; session->gpsdata.skyview[i].ss = (float)getzword(17 + (3 * i)); session->gpsdata.skyview[i].used = (bool)(status & 1); } session->gpsdata.skyview_time = gpsd_gpstime_resolve(session, (unsigned short)gps_week, (double)gps_seconds); gpsd_log(&session->context->errout, LOG_DATA, "1002: visible=%d used=%d mask={SATELLITE|USED}\n", session->gpsdata.satellites_visible, session->gpsdata.satellites_used); return SATELLITE_SET | USED_IS; } static gps_mask_t handle1003(struct gps_device_t *session) /* skyview report */ { int i, n; /* The Polaris (and probably the DAGR) emit some strange variant of * 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; gpsd_zero_satellites(&session->gpsdata); /* ticks = getzlong(6); */ /* sequence = getzword(8); */ session->gpsdata.dop.gdop = (unsigned int)getzword(9) * 1e-2; session->gpsdata.dop.pdop = (unsigned int)getzword(10) * 1e-2; session->gpsdata.dop.hdop = (unsigned int)getzword(11) * 1e-2; session->gpsdata.dop.vdop = (unsigned int)getzword(12) * 1e-2; session->gpsdata.dop.tdop = (unsigned int)getzword(13) * 1e-2; session->gpsdata.satellites_visible = n; for (i = 0; i < ZODIAC_CHANNELS; i++) { if (i < session->gpsdata.satellites_visible) { session->gpsdata.skyview[i].PRN = (short)getzword(15 + (3 * i)); session->gpsdata.skyview[i].azimuth = (short)(((short)getzword(16 + (3 * i))) * RAD_2_DEG * 1e-4); if (session->gpsdata.skyview[i].azimuth < 0) session->gpsdata.skyview[i].azimuth += 360; session->gpsdata.skyview[i].elevation = (short)(((short)getzword(17 + (3 * i))) * RAD_2_DEG * 1e-4); } else { session->gpsdata.skyview[i].PRN = 0; session->gpsdata.skyview[i].azimuth = 0; session->gpsdata.skyview[i].elevation = 0; } } session->gpsdata.skyview_time = NAN; gpsd_log(&session->context->errout, LOG_DATA, "NAVDOP: visible=%d gdop=%.2f pdop=%.2f " "hdop=%.2f vdop=%.2f tdop=%.2f mask={SATELLITE|DOP}\n", session->gpsdata.satellites_visible, 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; } static void handle1005(struct gps_device_t *session UNUSED) /* fix quality report */ { /* ticks = getzlong(6); */ /* sequence = getzword(8); */ int numcorrections = (int)getzword(12); if (session->newdata.mode == MODE_NO_FIX) session->gpsdata.status = STATUS_NO_FIX; else if (numcorrections == 0) session->gpsdata.status = STATUS_FIX; else session->gpsdata.status = STATUS_DGPS_FIX; } static gps_mask_t handle1011(struct gps_device_t *session) /* version report */ { /* * This is UNTESTED -- but harmless if buggy. Added to support * 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->lexer.outbuffer, 19, 28); /* software version field */ gpsd_log(&session->context->errout, LOG_DATA, "1011: subtype=%s mask={DEVICEID}\n", session->subtype); return DEVICEID_SET; } static void handle1108(struct gps_device_t *session) /* leap-second correction report */ { /* ticks = getzlong(6); */ /* sequence = getzword(8); */ /* utc_week_seconds = getzlong(14); */ /* leap_nanoseconds = getzlong(17); */ if ((int)(getzword(19) & 3) == 3) { session->context->valid |= LEAP_SECOND_VALID; session->context->leap_seconds = (int)getzword(16); } } static gps_mask_t zodiac_analyze(struct gps_device_t *session) { unsigned int id = (unsigned int)((session->lexer.outbuffer[3] << 8) | session->lexer.outbuffer[2]); /* * The guard looks superfluous, but it keeps the rather expensive * gpsd_packetdump() function from being called even when the debug * level does not actually require it. */ if (session->context->errout.debug >= LOG_RAW) gpsd_log(&session->context->errout, LOG_RAW, "Raw Zodiac packet type %d length %zd: %s\n", id, session->lexer.outbuflen, gpsd_prettydump(session)); if (session->lexer.outbuflen < 10) return 0; /* * Normal cycle for these devices is 1001 1002. * We count 1001 as end of cycle because 1002 doesn't * carry fix information. */ session->cycle_end_reliable = true; switch (id) { case 1000: return handle1000(session) | (CLEAR_IS | REPORT_IS); case 1002: return handle1002(session); case 1003: return handle1003(session); case 1005: handle1005(session); return 0; case 1011: return handle1011(session); case 1108: handle1108(session); return 0; default: return 0; } } #ifdef CONTROLSEND_ENABLE static ssize_t zodiac_control_send(struct gps_device_t *session, char *msg, size_t len) { unsigned short shortwords[256]; #define min(x,y) ((x) < (y) ? x : y) /* * We used to just cast msg to an unsigned short pointer. * This can fail on word-oriented achitectures like a SPARC. */ memcpy((char *)shortwords, msg, min(sizeof(shortwords), len)); /* and if len isn't even, it's your own fault */ return zodiac_spew(session, shortwords[0], shortwords + 1, (int)(len / 2 - 1)); } #endif /* CONTROLSEND_ENABLE */ #ifdef RECONFIGURE_ENABLE static bool zodiac_speed_switch(struct gps_device_t *session, speed_t speed, char parity, int stopbits) { unsigned short data[15]; if (session->driver.zodiac.sn++ > 32767) session->driver.zodiac.sn = 0; switch (parity) { case 'E': case 2: parity = (char)2; break; case 'O': case 1: parity = (char)1; break; case 'N': case 0: default: parity = (char)0; break; } 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[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[14] = zodiac_checksum(data, 14); (void)zodiac_spew(session, 1330, data, 15); return true; /* it would be nice to error-check this */ } #endif /* RECONFIGURE_ENABLE */ #ifdef TIMEHINT_ENABLE static double zodiac_time_offset(struct gps_device_t *session UNUSED) { /* 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 /* TIMEHINT_ENABLE */ /* this is everything we export */ /* *INDENT-OFF* */ const struct gps_type_t driver_zodiac = { .type_name = "Zodiac", /* full name of type */ .packet_type = ZODIAC_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* no flags set */ .trigger = NULL, /* no trigger */ .channels = 12, /* consumer-grade GPS */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* use the generic packet getter */ .parse_packet = zodiac_analyze, /* parse message packets */ .rtcm_writer = zodiac_send_rtcm, /* send DGPS correction */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* no configuration */ #ifdef RECONFIGURE_ENABLE .speed_switcher = zodiac_speed_switch,/* we can change baud rate */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = zodiac_control_send, /* for gpsctl and friends */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = zodiac_time_offset, /* compute NTO fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* ZODIAC_ENABLE */ gpsd-3.15/drivers.c0000664000175000017500000016412612533045117012402 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include "gpsd.h" #include "bits.h" /* for getbeu16(), to extract big-endian words */ #include "strfuncs.h" ssize_t generic_get(struct gps_device_t *session) { return packet_get(session->gpsdata.gps_fd, &session->lexer); } gps_mask_t generic_parse_input(struct gps_device_t *session) { if (session->lexer.type == BAD_PACKET) return 0; else if (session->lexer.type == COMMENT_PACKET) { gpsd_set_century(session); return 0; #ifdef NMEA_ENABLE } else if (session->lexer.type == NMEA_PACKET) { const struct gps_type_t **dp; gps_mask_t st = 0; char *sentence = (char *)session->lexer.outbuffer; if (sentence[strlen(sentence)-1] != '\n') gpsd_log(&session->context->errout, LOG_IO, "<= GPS: %s\n", sentence); else gpsd_log(&session->context->errout, LOG_IO, "<= GPS: %s", sentence); if ((st=nmea_parse(sentence, session)) == 0) { gpsd_log(&session->context->errout, LOG_WARN, "unknown sentence: \"%s\"\n", sentence); } for (dp = gpsd_drivers; *dp; dp++) { char *trigger = (*dp)->trigger; if (trigger!=NULL && str_starts_with(sentence, trigger)) { gpsd_log(&session->context->errout, LOG_PROG, "found trigger string %s.\n", trigger); if (*dp != session->device_type) { (void)gpsd_switch_driver(session, (*dp)->type_name); if (session->device_type != NULL && session->device_type->event_hook != NULL) session->device_type->event_hook(session, event_triggermatch); st |= DEVICEID_SET; } } } return st; #endif /* NMEA_ENABLE */ } else { gpsd_log(&session->context->errout, LOG_SHOUT, "packet type %d fell through (should never happen): %s.\n", session->lexer.type, gpsd_prettydump(session)); return 0; } } /************************************************************************** * * Generic driver -- make no assumptions about the device type * **************************************************************************/ /* *INDENT-OFF* */ const struct gps_type_t driver_unknown = { .type_name = "Unknown", /* full name of type */ .packet_type = COMMENT_PACKET, /* associated lexer packet type */ .flags = DRIVER_NOFLAGS, /* no flags set */ .trigger = NULL, /* it's the default */ .channels = 12, /* consumer-grade GPS */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* use generic packet getter */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* write RTCM data straight */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = NULL, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #ifdef NMEA_ENABLE /************************************************************************** * * NMEA 0183 * * This is separate from the 'unknown' driver because we don't want to * ship NMEA subtype probe strings to a device until we've seen at * least one NMEA packet. This avoids spamming devices that might * actually be USB modems or other things in USB device class FF that * just happen to have one of 'our' adaptor chips in front of them. * **************************************************************************/ static void nmea_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; /* * This is where we try to tickle NMEA devices into revealing their * inner natures. */ if (event == event_configure) { /* * The reason for splitting these probes up by packet sequence * number, interleaving them with the first few packet receives, * is because many generic-NMEA devices get confused if you send * too much at them in one go. * * A fast response to an early probe will change drivers so the * later ones won't be sent at all. Thus, for best overall * performance, order these to probe for the most popular types * soonest. * * Note: don't make the trigger strings identical to the probe, * because some NMEA devices (notably SiRFs) will just echo * unknown strings right back at you. A useful dodge is to append * a comma to the trigger, because that won't be in the response * unless there is actual following data. */ switch (session->lexer.counter) { #ifdef NMEA_ENABLE case 0: /* probe for Garmin serial GPS -- expect $PGRMC followed by data */ gpsd_log(&session->context->errout, LOG_PROG, "=> Probing for Garmin NMEA\n"); (void)nmea_send(session, "$PGRMCE"); break; #endif /* NMEA_ENABLE */ #ifdef SIRF_ENABLE case 1: /* * We used to try to probe for SiRF by issuing * "$PSRF105,1" and expecting "$Ack Input105.". But it * turns out this only works for SiRF-IIs; SiRF-I and * SiRF-III don't respond. Sadly, the MID132 binary * request for firmware version is ignored in NMEA mode. * Thus the only reliable probe is to try to flip the SiRF * into binary mode, cluing in the library to revert it on * close. * * SiRFs dominate the consumer-grade GPS-mouse market, so * we used to put this test first. Unfortunately this * causes problems for gpsctl, as it cannot select the * NMEA driver without switching the device back to binary * mode! Fix this if we ever find a nondisruptive probe * string. */ gpsd_log(&session->context->errout, LOG_PROG, "=> Probing for SiRF\n"); (void)nmea_send(session, "$PSRF100,0,%d,%d,%d,0", session->gpsdata.dev.baudrate, 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 */ gpsd_log(&session->context->errout, LOG_PROG, "=> Probing for FV-18\n"); (void)nmea_send(session, "$PFEC,GPint"); break; case 3: /* probe for the Trimble Copernicus */ gpsd_log(&session->context->errout, LOG_PROG, "=> Probing for Trimble Copernicus\n"); (void)nmea_send(session, "$PTNLSNM,0139,01"); break; #endif /* NMEA_ENABLE */ #ifdef EVERMORE_ENABLE case 4: gpsd_log(&session->context->errout, LOG_PROG, "=> Probing for Evermore\n"); /* Enable checksum and GGA(1s), GLL(0s), GSA(1s), GSV(1s), RMC(1s), VTG(0s), PEMT101(0s) */ /* 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\x00\x00\x00\x00\x00\x00\x00\x13\x10\x03", 22); break; #endif /* EVERMORE_ENABLE */ #ifdef GPSCLOCK_ENABLE case 5: /* probe for Furuno Electric GH-79L4-N (GPSClock); expect $PFEC,GPssd */ gpsd_log(&session->context->errout, LOG_PROG, "=> Probing for GPSClock\n"); (void)nmea_send(session, "$PFEC,GPsrq"); break; #endif /* GPSCLOCK_ENABLE */ #ifdef ASHTECH_ENABLE case 6: /* probe for Ashtech -- expect $PASHR,RID */ gpsd_log(&session->context->errout, LOG_PROG, "=> Probing for Ashtech\n"); (void)nmea_send(session, "$PASHQ,RID"); break; #endif /* ASHTECH_ENABLE */ #ifdef UBLOX_ENABLE case 7: /* probe for UBX -- query port configuration */ gpsd_log(&session->context->errout, LOG_PROG, "=> Probing for UBX\n"); (void)ubx_write(session, 0x06, 0x00, NULL, 0); break; #endif /* UBLOX_ENABLE */ #ifdef MTK3301_ENABLE case 8: /* probe for MTK-3301 -- expect $PMTK705 */ gpsd_log(&session->context->errout, LOG_PROG, "=> Probing for MediaTek\n"); (void)nmea_send(session, "$PMTK605"); break; #endif /* MTK3301_ENABLE */ default: break; } } } /* *INDENT-OFF* */ const struct gps_type_t driver_nmea0183 = { .type_name = "NMEA0183", /* full name of type */ .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_NOFLAGS, /* remember this */ .trigger = NULL, /* it's the default */ .channels = 12, /* consumer-grade GPS */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* use generic packet getter */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = gpsd_write, /* write RTCM data straight */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = nmea_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ #ifdef BINARY_ENABLE .mode_switcher = NULL, /* maybe switchable if it was a SiRF */ #else .mode_switcher = NULL, /* no binary mode to revert to */ #endif /* BINARY_ENABLE */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #if defined(GARMIN_ENABLE) && defined(NMEA_ENABLE) /************************************************************************** * * Garmin NMEA * **************************************************************************/ #ifdef RECONFIGURE_ENABLE static void garmin_mode_switch(struct gps_device_t *session, int mode) /* only does anything in one direction, going to Garmin binary driver */ { if (mode == MODE_BINARY) { (void)nmea_send(session, "$PGRMC1,1,2,1,,,,2,W,N"); (void)nmea_send(session, "$PGRMI,,,,,,,R"); (void)usleep(333); /* standard Garmin settling time */ } } #endif /* RECONFIGURE_ENABLE */ static void garmin_nmea_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; if (event == event_driver_switch) { /* forces a reconfigure as the following packets come in */ session->lexer.counter = 0; } if (event == event_configure) { /* * And here's that reconfigure. It's split up like this because * receivers like the Garmin GPS-10 don't handle having having a lot of * probes shoved at them very well. */ switch (session->lexer.counter) { case 0: /* reset some config, AutoFix, WGS84, PPS * Set the PPS pulse length to 40ms which leaves the Garmin 18-5hz * with a 160ms low state. * NOTE: new PPS only takes effect after next power cycle */ (void)nmea_send(session, "$PGRMC,A,,100,,,,,,A,,1,2,1,30"); break; case 1: /* once a sec, no averaging, NMEA 2.3, WAAS */ (void)nmea_send(session, "$PGRMC1,1,1,1,,,,2,W,N"); break; case 2: /* get some more config info */ (void)nmea_send(session, "$PGRMC1E"); break; case 3: /* turn off all output except GGA */ (void)nmea_send(session, "$PGRMO,,2"); (void)nmea_send(session, "$PGRMO,GPGGA,1"); break; case 4: /* enable GPGGA, GPGSA, GPGSV, GPRMC on Garmin serial GPS */ (void)nmea_send(session, "$PGRMO,GPGSA,1"); break; case 5: (void)nmea_send(session, "$PGRMO,GPGSV,1"); break; case 6: (void)nmea_send(session, "$PGRMO,GPRMC,1"); break; case 7: (void)nmea_send(session, "$PGRMO,PGRME,1"); break; } } } /* *INDENT-OFF* */ const struct gps_type_t driver_garmin = { .type_name = "Garmin NMEA", /* full name of type */ .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = "$PGRMC,", /* Garmin private */ .channels = 12, /* not used by this driver */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* use generic packet getter */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* some do, some don't, skip for now */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = garmin_nmea_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = garmin_mode_switch, /* mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /*RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* GARMIN_ENABLE && NMEA_ENABLE */ #ifdef ASHTECH_ENABLE /************************************************************************** * * Ashtech (then Thales, now Magellan Professional) Receivers * **************************************************************************/ static void ashtech_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; if (event == event_wakeup) (void)nmea_send(session, "$PASHQ,RID"); if (event == event_identified) { /* turn WAAS on. can't hurt... */ (void)nmea_send(session, "$PASHS,WAS,ON"); /* reset to known output state */ (void)nmea_send(session, "$PASHS,NME,ALL,A,OFF"); /* then turn on some useful sentences */ #ifdef __future__ /* we could parse these, but they're oversize so they get dropped */ (void)nmea_send(session, "$PASHS,NME,POS,A,ON"); (void)nmea_send(session, "$PASHS,NME,SAT,A,ON"); #else (void)nmea_send(session, "$PASHS,NME,GGA,A,ON"); (void)nmea_send(session, "$PASHS,NME,GSA,A,ON"); (void)nmea_send(session, "$PASHS,NME,GSV,A,ON"); (void)nmea_send(session, "$PASHS,NME,RMC,A,ON"); #endif (void)nmea_send(session, "$PASHS,NME,ZDA,A,ON"); } } /* *INDENT-OFF* */ const struct gps_type_t driver_ashtech = { .type_name = "Ashtech", /* full name of type */ .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = "$PASHR,RID,", /* Ashtech receivers respond thus */ .channels = 24, /* not used, GG24 has 24 channels */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = gpsd_write, /* write RTCM data straight */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = ashtech_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* ASHTECH_ENABLE */ #ifdef FV18_ENABLE /************************************************************************** * * FV18 -- uses 2 stop bits, needs to be told to send GSAs * **************************************************************************/ static void fv18_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; /* * Tell an FV18 to send GSAs so we'll know if 3D is accurate. * Suppress GLL and VTG. Enable ZDA so dates will be accurate for replay. * It's possible we might not need to redo this on event_reactivate, * but doing so is safe and cheap. */ if (event == event_identified || event == event_reactivate) (void)nmea_send(session, "$PFEC,GPint,GSA01,DTM00,ZDA01,RMC01,GLL00,VTG00,GSV05"); } /* *INDENT-OFF* */ const struct gps_type_t driver_fv18 = { .type_name = "San Jose Navigation FV18", /* full name of type */ .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = "$PFEC,GPint,", /* FV18s should echo the probe */ .channels = 12, /* not used by this driver */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = gpsd_write, /* write RTCM data straight */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = fv18_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* FV18_ENABLE */ #ifdef GPSCLOCK_ENABLE /************************************************************************** * * Furuno Electric GPSClock (GH-79L4) * **************************************************************************/ /* * Based on http://www.tecsys.de/fileadmin/user_upload/pdf/gh79_1an_intant.pdf */ /* *INDENT-OFF* */ const struct gps_type_t driver_gpsclock = { .type_name = "Furuno Electric GH-79L4", /* full name of type */ .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = "$PFEC,GPssd", /* GPSClock should return this */ .channels = 12, /* not used by this driver */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = gpsd_write, /* write RTCM data straight */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* no lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* sample rate is fixed */ .min_cycle = 1, /* sample rate is fixed */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* GPSCLOCK_ENABLE */ #ifdef TRIPMATE_ENABLE /************************************************************************** * * TripMate -- extended NMEA, gets faster fix when primed with lat/long/time * **************************************************************************/ /* * Some technical FAQs on the TripMate: * http://vancouver-webpages.com/pub/peter/tripmate.faq * http://www.asahi-net.or.jp/~KN6Y-GTU/tripmate/trmfaqe.html * The TripMate was discontinued sometime before November 1998 * and was replaced by the Zodiac EarthMate. */ static void tripmate_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; /* TripMate requires this response to the ASTRAL it sends at boot time */ if (event == event_identified) (void)nmea_send(session, "$IIGPQ,ASTRAL"); /* stop it sending PRWIZCH */ if (event == event_identified || event == event_reactivate) (void)nmea_send(session, "$PRWIILOG,ZCH,V,,"); } /* *INDENT-OFF* */ static const struct gps_type_t driver_tripmate = { .type_name = "Delorme TripMate", /* full name of type */ .packet_type = NMEA_PACKET, /* lexer packet type */ .flags = DRIVER_STICKY, /* no rollover or other flags */ .trigger ="ASTRAL", /* tells us to switch */ .channels = 12, /* consumer-grade GPS */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = gpsd_write, /* send RTCM data straight */ .init_query = NULL, /* non-perturbing query */ .event_hook = tripmate_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher= NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* TRIPMATE_ENABLE */ #ifdef EARTHMATE_ENABLE /************************************************************************** * * Zodiac EarthMate textual mode * * Note: This is the pre-2003 version using Zodiac binary protocol. * There is a good HOWTO at . * It has been replaced with a design that uses a SiRF chipset. * **************************************************************************/ static void earthmate_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; if (event == event_triggermatch) { (void)gpsd_write(session, "EARTHA\r\n", 8); (void)usleep(10000); (void)gpsd_switch_driver(session, "Zodiac"); } } /* *INDENT-OFF* */ static const struct gps_type_t driver_earthmate = { .type_name = "Pre-2003 Delorme EarthMate", .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* no rollover or other flags */ .trigger = "EARTHA", /* Earthmate trigger string */ .channels = 12, /* not used by NMEA parser */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* don't send RTCM data */ .init_query = NULL, /* non-perturbing query */ .event_hook = earthmate_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher= NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* never actually used. */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* EARTHMATE_ENABLE */ #endif /* NMEA_ENABLE */ #ifdef TNT_ENABLE /************************************************************************** * True North Technologies - Revolution 2X Digital compass * * More info: http://www.tntc.com/ * * This is a digital compass which uses magnetometers to measure the * strength of the earth's magnetic field. Based on these measurements * it provides a compass heading using NMEA formatted output strings. * This is useful to supplement the heading provided by another GPS * unit. A GPS heading is unreliable at slow speed or no speed. * **************************************************************************/ static ssize_t tnt_control_send(struct gps_device_t *session, char *msg, size_t len UNUSED) /* send a control string in TNT native formal */ { ssize_t status; unsigned char sum = '\0'; char c, *p = msg; if (*p == '@') { p++; } #ifdef __UNUSED__ else { gpsd_log(&session->context->errout, LOG_ERROR, "Bad TNT sentence: '%s'\n", msg); } #endif /* __UNUSED__ */ while (((c = *p) != '\0')) { sum ^= c; p++; } (void)snprintf(p, 6, "*%02X\r\n", (unsigned int)sum); status = gpsd_write(session, msg, strlen(msg)); return status; } static bool tnt_send(struct gps_device_t *session, const char *fmt, ...) /* printf(3)-like TNT command generator */ { char buf[BUFSIZ]; va_list ap; ssize_t sent; va_start(ap, fmt); (void)vsnprintf(buf, sizeof(buf) - 5, fmt, ap); va_end(ap); sent = tnt_control_send(session, buf, strlen(buf)); if (sent == (ssize_t) strlen(buf)) { gpsd_log(&session->context->errout, LOG_IO, "=> GPS: %s\n", buf); return true; } else { gpsd_log(&session->context->errout, LOG_WARN, "=> GPS: %s FAILED\n", buf); return false; } } #ifdef RECONFIGURE_ENABLE static bool tnt_speed(struct gps_device_t *session, speed_t speed, char parity UNUSED, int stopbits UNUSED) { /* * 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 /* RECONFIGURE_ENABLE */ static void tnt_event_hook(struct gps_device_t *session, event_t event) /* TNT lifetime event hook */ { if (session->context->readonly) return; if (event == event_wakeup) { (void)tnt_send(session, "@F0.3=1"); /* set run mode */ (void)tnt_send(session, "@F2.2=1"); /* report in degrees */ } } /* *INDENT-OFF* */ const struct gps_type_t driver_trueNorth = { .type_name = "True North", /* full name of type */ .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = "$PTNTHTM", /* their proprietary sentence */ .channels = 0, /* not an actual GPS at all */ .probe_detect = NULL, /* no probe in run mode */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* Don't send */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = tnt_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .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 /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = tnt_control_send, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif #ifdef OCEANSERVER_ENABLE /************************************************************************** * OceanServer - Digital Compass, OS5000 Series * * More info: http://www.ocean-server.com/download/OS5000_Compass_Manual.pdf * * This is a digital compass which uses magnetometers to measure the * strength of the earth's magnetic field. Based on these measurements * it provides a compass heading using NMEA formatted output strings. * This is useful to supplement the heading provided by another GPS * unit. A GPS heading is unreliable at slow speed or no speed. * **************************************************************************/ static int oceanserver_send(struct gpsd_errout_t *errout, const 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_end(ap); (void)strlcat(buf, "", sizeof(buf)); status = (int)write(fd, buf, strlen(buf)); (void)tcdrain(fd); if (status == (int)strlen(buf)) { gpsd_log(errout, LOG_IO, "=> GPS: %s\n", buf); return status; } else { gpsd_log(errout, LOG_WARN, "=> GPS: %s FAILED\n", buf); return -1; } } static void oceanserver_event_hook(struct gps_device_t *session, event_t event) { if (session->context->readonly) return; if (event == event_configure && session->lexer.counter == 0) { /* report in NMEA format */ (void)oceanserver_send(&session->context->errout, session->gpsdata.gps_fd, "2\n"); /* ship all fields */ (void)oceanserver_send(&session->context->errout, session->gpsdata.gps_fd, "X2047"); } } /* *INDENT-OFF* */ static const struct gps_type_t driver_oceanServer = { .type_name = "OceanServer OS5000", /* full name of type */ .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* no rollover or other flags */ .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 */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* Don't send */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = oceanserver_event_hook, #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no wrapup */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif #ifdef FURY_ENABLE /************************************************************************** * * Jackson Labs Fury, a high-precision laboratory clock * * Will also support other Jackon Labs boards, including the Firefly. * * Note: you must either build with fixed_port_speed=115200 or tweak the * speed on the port to 115200 before running. The device's default mode * does not stream output, so our hunt loop will simply time out otherwise. * **************************************************************************/ static bool fury_rate_switcher(struct gps_device_t *session, double rate) { char buf[78]; double inverted; /* rate is a frequency, but the command takes interval in # of seconds */ if (rate == 0.0) inverted = 0.0; else inverted = 1.0/rate; if (inverted > 256) return false; (void)snprintf(buf, sizeof(buf), "GPS:GPGGA %d\r\n", (int)inverted); (void)gpsd_write(session, buf, strlen(buf)); return true; } static void fury_event_hook(struct gps_device_t *session, event_t event) { if (event == event_wakeup && gpsd_get_speed(session) == 115200) (void)fury_rate_switcher(session, 1.0); else if (event == event_deactivate) (void)fury_rate_switcher(session, 0.0); } /* *INDENT-OFF* */ static const struct gps_type_t driver_fury = { .type_name = "Jackson Labs Fury", /* full name of type */ .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* no rollover or other flags */ .trigger = NULL, /* detect their main sentence */ .channels = 0, /* not an actual GPS at all */ .probe_detect = NULL, .get_packet = generic_get, /* how to get a packet */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* Don't send */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = fury_event_hook, #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = fury_rate_switcher, .min_cycle = 1, /* has rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* FURY_ENABLE */ #ifdef RTCM104V2_ENABLE /************************************************************************** * * RTCM-104 (v2), used for broadcasting DGPS corrections and by DGPS radios * **************************************************************************/ static gps_mask_t rtcm104v2_analyze(struct gps_device_t *session) { rtcm2_unpack(&session->gpsdata.rtcm2, (char *)session->lexer.isgps.buf); /* extra guard prevents expensive hexdump calls */ if (session->context->errout.debug >= LOG_RAW) gpsd_log(&session->context->errout, LOG_RAW, "RTCM 2.x packet type 0x%02x length %d words from %zd bytes: %s\n", session->gpsdata.rtcm2.type, session->gpsdata.rtcm2.length + 2, session->lexer.isgps.buflen, gpsd_hexdump(session->msgbuf, sizeof(session->msgbuf), (char *)session->lexer.isgps.buf, (session->gpsdata.rtcm2.length + 2) * sizeof(isgps30bits_t))); session->cycle_end_reliable = true; return RTCM2_SET; } /* *INDENT-OFF* */ static const struct gps_type_t driver_rtcm104v2 = { .type_name = "RTCM104V2", /* full name of type */ .packet_type = RTCM2_PACKET, /* associated lexer packet type */ .flags = DRIVER_NOFLAGS, /* no rollover or other flags */ .trigger = NULL, /* no recognition string */ .channels = 0, /* not used */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = rtcm104v2_analyze, /* */ .rtcm_writer = NULL, /* don't send RTCM data, */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* no event_hook */ #ifdef RECONFIGURE_ENABLE .speed_switcher= NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = NULL, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* RTCM104V2_ENABLE */ #ifdef RTCM104V3_ENABLE /************************************************************************** * * RTCM-104 (v3), used for broadcasting DGPS corrections and by DGPS radios * **************************************************************************/ static gps_mask_t rtcm104v3_analyze(struct gps_device_t *session) { uint16_t type = getbeu16(session->lexer.inbuffer, 3) >> 4; gpsd_log(&session->context->errout, LOG_RAW, "RTCM 3.x packet %d\n", type); rtcm3_unpack(session->context, &session->gpsdata.rtcm3, (char *)session->lexer.outbuffer); session->cycle_end_reliable = true; return RTCM3_SET; } /* *INDENT-OFF* */ static const struct gps_type_t driver_rtcm104v3 = { .type_name = "RTCM104V3", /* full name of type */ .packet_type = RTCM3_PACKET, /* associated lexer packet type */ .flags = DRIVER_NOFLAGS, /* no rollover or other flags */ .trigger = NULL, /* no recognition string */ .channels = 0, /* not used */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = rtcm104v3_analyze, /* */ .rtcm_writer = NULL, /* don't send RTCM data, */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* no event hook */ #ifdef RECONFIGURE_ENABLE .speed_switcher= NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = NULL, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* RTCM104V3_ENABLE */ #ifdef GARMINTXT_ENABLE /************************************************************************** * * Garmin Simple Text protocol * **************************************************************************/ /* *INDENT-OFF* */ static const struct gps_type_t driver_garmintxt = { .type_name = "Garmin Simple Text", /* full name of type */ .packet_type = GARMINTXT_PACKET, /* associated lexer packet type */ .flags = DRIVER_NOFLAGS, /* no rollover or other flags */ .trigger = NULL, /* no recognition string */ .channels = 0, /* not used */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = garmintxt_parse, /* how to parse one */ .rtcm_writer = NULL, /* don't send RTCM data, */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* no event hook */ #ifdef RECONFIGURE_ENABLE .speed_switcher= NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = NULL, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* GARMINTXT_ENABLE */ #ifdef MTK3301_ENABLE /************************************************************************** * * MediaTek MTK-3301 and 3329 * * OEMs for several GPS vendors, notably including Garmin and FasTrax. * Website at . * * The Trimble Condor appears to be an MTK3329. It behaves as an MTK3301 * and positively acknowledges all 3301 sentences as valid. It ignores $PMTK * sentence fields that are not implemented in the Trimble Condor. It does * not have power-save mode and ignores $PMTK320. For $PMTK314 it silently * ignores periodic enabling of messages that aren't supported. * **************************************************************************/ static void mtk3301_event_hook(struct gps_device_t *session, event_t event) { /* 0 NMEA_SEN_GLL, GPGLL interval - Geographic Position - Latitude longitude 1 NMEA_SEN_RMC, GPRMC interval - Recommended Minimum Specific GNSS Sentence 2 NMEA_SEN_VTG, GPVTG interval - Course Over Ground and Ground Speed 3 NMEA_SEN_GGA, GPGGA interval - GPS Fix Data 4 NMEA_SEN_GSA, GPGSA interval - GNSS DOPS and Active Satellites 5 NMEA_SEN_GSV, GPGSV interval - GNSS Satellites in View 6 NMEA_SEN_GRS, GPGRS interval - GNSS Range Residuals 7 NMEA_SEN_GST, GPGST interval - GNSS Pseudorange Errors Statistics 13 NMEA_SEN_MALM, PMTKALM interval - GPS almanac information 14 NMEA_SEN_MEPH, PMTKEPH interval - GPS ephemeris information 15 NMEA_SEN_MDGP, PMTKDGP interval - GPS differential correction information 16 NMEA_SEN_MDBG, PMTKDBG interval – MTK debug information 17 NMEA_SEN_ZDA, GPZDA interval - Time & Date 18 NMEA_SEN_MCHN, PMTKCHN interval – GPS channel status "$PMTK314,1,1,1,1,1,5,1,1,0,0,0,0,0,0,0,0,0,1,0" */ if (session->context->readonly) return; if (event == event_triggermatch) { (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 */ /* PMTK_API_Q_OUTPUT_CTL - Query PPS pulse width - Trimble only? * http://trl.trimble.com/docushare/dsweb/Get/Document-482603/CONDOR_UG_2C_75263-00.pdf * * badly documented */ (void)nmea_send(session, "$PMTK424"); } } #ifdef RECONFIGURE_ENABLE static bool mtk3301_rate_switcher(struct gps_device_t *session, double rate) { char buf[78]; unsigned int milliseconds = (unsigned int)(1000 * rate); if (rate > 1) milliseconds = 1000; else if (rate < 0.2) milliseconds = 200; (void)snprintf(buf, sizeof(buf), "$PMTK300,%u,0,0,0,0", milliseconds); (void)nmea_send(session, buf); /* Fix interval */ return true; } #endif /* RECONFIGURE_ENABLE */ /* *INDENT-OFF* */ const struct gps_type_t driver_mtk3301 = { .type_name = "MTK-3301", /* full name of type */ .packet_type = NMEA_PACKET, /* associated lexer packet type */ .flags = DRIVER_STICKY, /* remember this */ .trigger = "$PMTK705,", /* firmware release name and version */ .channels = 12, /* not used by this driver */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = generic_parse_input, /* how to interpret a packet */ .rtcm_writer = gpsd_write, /* write RTCM data straight */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = mtk3301_event_hook, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = mtk3301_rate_switcher, /* sample rate switcher */ .min_cycle = 0.2, /* max 5Hz */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = nmea_write, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* MTK3301_ENABLE */ #ifdef AIVDM_ENABLE /************************************************************************** * * AIVDM - ASCII armoring of binary AIS packets * **************************************************************************/ static bool aivdm_decode(const char *buf, size_t buflen, struct gps_device_t *session, struct ais_t *ais, int debug) { #ifdef __UNUSED_DEBUG__ char *sixbits[64] = { "000000", "000001", "000010", "000011", "000100", "000101", "000110", "000111", "001000", "001001", "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", }; #endif /* __UNUSED_DEBUG__ */ int nfrags, ifrag, nfields = 0; unsigned char *field[NMEA_MAX*2]; unsigned char fieldcopy[NMEA_MAX*2+1]; unsigned char *data, *cp; unsigned char pad; struct aivdm_context_t *ais_context; int i; if (buflen == 0) return false; /* we may need to dump the raw packet */ gpsd_log(&session->context->errout, LOG_PROG, "AIVDM packet length %zd: %s\n", buflen, buf); /* first clear the result, making sure we don't return garbage */ memset(ais, 0, sizeof(*ais)); /* discard overlong sentences */ if (strlen(buf) > sizeof(fieldcopy)-1) { gpsd_log(&session->context->errout, LOG_ERROR, "overlong AIVDM packet.\n"); return false; } /* extract packet fields */ (void)strlcpy((char *)fieldcopy, buf, sizeof(fieldcopy)); field[nfields++] = (unsigned char *)buf; for (cp = fieldcopy; cp < fieldcopy + buflen; cp++) if (*cp == (unsigned char)',') { *cp = '\0'; field[nfields++] = cp + 1; } /* discard sentences with exiguous commas; catches run-ons */ if (nfields < 7) { gpsd_log(&session->context->errout, LOG_ERROR, "malformed AIVDM packet.\n"); return false; } switch (field[4][0]) { case '\0': /* * Apparently an empty channel is normal for AIVDO sentences, * which makes sense as they don't come in over radio. This * is going to break if there's ever an AIVDO type 24, though. */ if (!str_starts_with((const char *)field[0], "!AIVDO")) gpsd_log(&session->context->errout, LOG_INF, "invalid empty AIS channel. Assuming 'A'\n"); ais_context = &session->driver.aivdm.context[0]; session->driver.aivdm.ais_channel ='A'; break; case '1': if (strcmp((char *)field[4], (char *)"12") == 0) { gpsd_log(&session->context->errout, LOG_INF, "ignoring bogus AIS channel '12'.\n"); return false; } case 'A': ais_context = &session->driver.aivdm.context[0]; session->driver.aivdm.ais_channel ='A'; break; case '2': case 'B': ais_context = &session->driver.aivdm.context[1]; session->driver.aivdm.ais_channel ='B'; break; case 'C': gpsd_log(&session->context->errout, LOG_INF, "ignoring AIS channel C (secure AIS).\n"); return false; default: gpsd_log(&session->context->errout, LOG_ERROR, "invalid AIS channel 0x%0X .\n", field[4][0]); return false; } nfrags = atoi((char *)field[1]); /* number of fragments to expect */ ifrag = atoi((char *)field[2]); /* fragment id */ data = field[5]; pad = field[6][0]; /* number of padding bits */ gpsd_log(&session->context->errout, LOG_PROG, "nfrags=%d, ifrag=%d, decoded_frags=%d, data=%s\n", nfrags, ifrag, ais_context->decoded_frags, data); /* assemble the binary data */ /* check fragment ordering */ if (ifrag != ais_context->decoded_frags + 1) { gpsd_log(&session->context->errout, LOG_ERROR, "invalid fragment #%d received, expected #%d.\n", ifrag, ais_context->decoded_frags + 1); if (ifrag != 1) return false; /* else, ifrag==1: Just discard all that was previously decoded and * simply handle that packet */ ais_context->decoded_frags = 0; } if (ifrag == 1) { (void)memset(ais_context->bits, '\0', sizeof(ais_context->bits)); ais_context->bitlen = 0; } /* wacky 6-bit encoding, shades of FIELDATA */ for (cp = data; cp < data + strlen((char *)data); cp++) { unsigned char ch; ch = *cp; ch -= 48; if (ch >= 40) ch -= 8; #ifdef __UNUSED_DEBUG__ gpsd_log(&session->context->errout, LOG_RAW, "%c: %s\n", *cp, sixbits[ch]); #endif /* __UNUSED_DEBUG__ */ 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->bitlen++; if (ais_context->bitlen > sizeof(ais_context->bits)) { gpsd_log(&session->context->errout, LOG_INF, "overlong AIVDM payload truncated.\n"); return false; } } } if (isdigit(pad)) ais_context->bitlen -= (pad - '0'); /* ASCII assumption */ /* time to pass buffered-up data to where it's actually processed? */ if (ifrag == nfrags) { if (debug >= LOG_INF) { size_t clen = BITS_TO_BYTES(ais_context->bitlen); gpsd_log(&session->context->errout, LOG_INF, "AIVDM payload is %zd bits, %zd chars: %s\n", ais_context->bitlen, clen, gpsd_hexdump(session->msgbuf, sizeof(session->msgbuf), (char *)ais_context->bits, clen)); } /* clear waiting fragments count */ ais_context->decoded_frags = 0; /* decode the assembled binary packet */ return ais_binary_decode(&session->context->errout, ais, ais_context->bits, ais_context->bitlen, &ais_context->type24_queue); } /* we're still waiting on another sentence */ ais_context->decoded_frags++; return false; } static gps_mask_t aivdm_analyze(struct gps_device_t *session) { if (session->lexer.type == AIVDM_PACKET) { if (aivdm_decode ((char *)session->lexer.outbuffer, session->lexer.outbuflen, session, &session->gpsdata.ais, session->context->errout.debug)) { return ONLINE_SET | AIS_SET; } else return ONLINE_SET; #ifdef NMEA_ENABLE } else if (session->lexer.type == NMEA_PACKET) { return nmea_parse((char *)session->lexer.outbuffer, session); #endif /* NMEA_ENABLE */ } else return 0; } /* *INDENT-OFF* */ const struct gps_type_t driver_aivdm = { /* Full name of type */ .type_name = "AIVDM", /* associated lexer packet type */ .packet_type = AIVDM_PACKET, /* numeric packet type */ .flags = DRIVER_NOFLAGS, /* no rollover or other flags */ .trigger = NULL, /* identifying response */ .channels = 0, /* not used by this driver */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* how to get a packet */ .parse_packet = aivdm_analyze, /* how to analyze a packet */ .rtcm_writer = NULL, /* don't send RTCM data, */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no rate switcher */ .min_cycle = 1, /* max 1Hz */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = NULL, /* no control sender */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no NTP communication */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* AIVDM_ENABLE */ #ifdef PASSTHROUGH_ENABLE /************************************************************************** * * JSON passthrough driver * **************************************************************************/ static void path_rewrite(struct gps_device_t *session, char *prefix) /* prepend the session path to the value of a specified attribute */ { /* * Hack the packet to reflect its origin. This code is supposed * to insert the path naming the remote gpsd instance into the * beginning of the path attribute, followed by a # to separate it * from the device. */ char *prefloc; assert(prefix != NULL && session->lexer.outbuffer != NULL); /* possibly the rewrite has been done already, this comw up in gpsmon */ if (strstr((char *)session->lexer.outbuffer, session->gpsdata.dev.path) != NULL) return; for (prefloc = (char *)session->lexer.outbuffer; prefloc < (char *)session->lexer.outbuffer+session->lexer.outbuflen; prefloc++) if (str_starts_with(prefloc, prefix)) { char copy[sizeof(session->lexer.outbuffer)+1]; (void)strlcpy(copy, (char *)session->lexer.outbuffer, sizeof(copy)); prefloc += strlen(prefix); (void)strlcpy(prefloc, session->gpsdata.dev.path, sizeof(session->gpsdata.dev.path)); (void)strlcat((char *)session->lexer.outbuffer, "#", sizeof(session->lexer.outbuffer)); (void)strlcat((char *)session->lexer.outbuffer, copy + (prefloc-(char *)session->lexer.outbuffer), sizeof(session->lexer.outbuffer)); } session->lexer.outbuflen = strlen((char *)session->lexer.outbuffer); } static gps_mask_t json_pass_packet(struct gps_device_t *session) { gpsd_log(&session->context->errout, LOG_IO, "<= GPS: %s\n", (char *)session->lexer.outbuffer); if (strstr(session->gpsdata.dev.path, ":/") != NULL && strstr(session->gpsdata.dev.path, "localhost") == NULL) { /* devices and paths need to be edited */ if (strstr((char *)session->lexer.outbuffer, "DEVICE") != NULL) path_rewrite(session, "\"path\":\""); path_rewrite(session, "\"device\":\""); /* mark certain responses without a path or device attribute */ if (session->gpsdata.dev.path[0] != '\0') { if (strstr((char *)session->lexer.outbuffer, "VERSION") != NULL || strstr((char *)session->lexer.outbuffer, "WATCH") != NULL || strstr((char *)session->lexer.outbuffer, "DEVICES") != NULL) { session->lexer.outbuffer[session->lexer.outbuflen-1] = '\0'; (void)strlcat((char *)session->lexer.outbuffer, ",\"remote\":\"", sizeof(session->lexer.outbuffer)); (void)strlcat((char *)session->lexer.outbuffer, session->gpsdata.dev.path, sizeof(session->lexer.outbuffer)); (void)strlcat((char *)session->lexer.outbuffer, "\"}", sizeof(session->lexer.outbuffer)); } session->lexer.outbuflen = strlen((char *)session->lexer.outbuffer); } } gpsd_log(&session->context->errout, LOG_PROG, "JSON, passing through %s\n", (char *)session->lexer.outbuffer); return PASSTHROUGH_IS; } /* *INDENT-OFF* */ const struct gps_type_t driver_json_passthrough = { .type_name = "JSON slave driver", /* full name of type */ .packet_type = JSON_PACKET, /* associated lexer packet type */ .flags = DRIVER_NOFLAGS, /* don't remember this */ .trigger = NULL, /* it's the default */ .channels = 0, /* not used */ .probe_detect = NULL, /* no probe */ .get_packet = generic_get, /* use generic packet getter */ .parse_packet = json_pass_packet, /* how to interpret a packet */ .rtcm_writer = NULL, /* write RTCM data straight */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = NULL, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* PASSTHROUGH_ENABLE */ #if defined(PPS_ENABLE) /* *INDENT-OFF* */ const struct gps_type_t driver_pps = { .type_name = "PPS", /* full name of type */ .packet_type = BAD_PACKET, /* associated lexer packet type */ .flags = DRIVER_NOFLAGS, /* don't remember this */ .trigger = NULL, /* it's the default */ .channels = 0, /* not used */ .probe_detect = NULL, /* no probe */ .get_packet = NULL, /* use generic packet getter */ .parse_packet = NULL, /* how to interpret a packet */ .rtcm_writer = NULL, /* write RTCM data straight */ .init_query = NULL, /* non-perturbing initial query */ .event_hook = NULL, /* lifetime event handler */ #ifdef RECONFIGURE_ENABLE .speed_switcher = NULL, /* no speed switcher */ .mode_switcher = NULL, /* no mode switcher */ .rate_switcher = NULL, /* no sample-rate switcher */ .min_cycle = 1, /* not relevant, no rate switch */ #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE .control_send = NULL, /* how to send control strings */ #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE .time_offset = NULL, /* no method for NTP fudge factor */ #endif /* TIMEHINT_ENABLE */ }; /* *INDENT-ON* */ #endif /* PPS_ENABLE */ extern const struct gps_type_t driver_evermore; extern const struct gps_type_t driver_garmin_ser_binary; extern const struct gps_type_t driver_garmin_usb_binary; extern const struct gps_type_t driver_geostar; extern const struct gps_type_t driver_italk; extern const struct gps_type_t driver_navcom; extern const struct gps_type_t driver_nmea2000; extern const struct gps_type_t driver_oncore; extern const struct gps_type_t driver_sirf; extern const struct gps_type_t driver_superstar2; extern const struct gps_type_t driver_tsip; extern const struct gps_type_t driver_ubx; extern const struct gps_type_t driver_zodiac; /* the point of this rigamarole is to not have to export a table size */ static const struct gps_type_t *gpsd_driver_array[] = { &driver_unknown, #ifdef NMEA_ENABLE &driver_nmea0183, #ifdef ASHTECH_ENABLE &driver_ashtech, #endif /* ASHTECH_ENABLE */ #ifdef TRIPMATE_ENABLE &driver_tripmate, #endif /* TRIPMATE_ENABLE */ #ifdef EARTHMATE_ENABLE &driver_earthmate, #endif /* EARTHMATE_ENABLE */ #ifdef GPSCLOCK_ENABLE &driver_gpsclock, #endif /* GPSCLOCK_ENABLE */ #ifdef GARMIN_ENABLE &driver_garmin, #endif /* GARMIN_ENABLE */ #ifdef MTK3301_ENABLE &driver_mtk3301, #endif /* MTK3301_ENABLE */ #ifdef OCEANSERVER_ENABLE &driver_oceanServer, #endif /* OCEANSERVER_ENABLE */ #ifdef FV18_ENABLE &driver_fv18, #endif /* FV18_ENABLE */ #ifdef TNT_ENABLE &driver_trueNorth, #endif /* TNT_ENABLE */ #ifdef FURY_ENABLE &driver_fury, #endif /* FURY_ENABLE */ #ifdef AIVDM_ENABLE &driver_aivdm, #endif /* AIVDM_ENABLE */ #endif /* NMEA_ENABLE */ #ifdef EVERMORE_ENABLE &driver_evermore, #endif /* EVERMORE_ENABLE */ #ifdef GARMIN_ENABLE /* be sure to try Garmin Serial Binary before Garmin USB Binary */ &driver_garmin_ser_binary, &driver_garmin_usb_binary, #endif /* GARMIN_ENABLE */ #ifdef GEOSTAR_ENABLE &driver_geostar, #endif /* GEOSTAR_ENABLE */ #ifdef ITRAX_ENABLE &driver_italk, #endif /* ITRAX_ENABLE */ #ifdef ONCORE_ENABLE &driver_oncore, #endif /* ONCORE_ENABLE */ #ifdef NAVCOM_ENABLE &driver_navcom, #endif /* NAVCOM_ENABLE */ #ifdef SIRF_ENABLE &driver_sirf, #endif /* SIRF_ENABLE */ #ifdef SUPERSTAR2_ENABLE &driver_superstar2, #endif /* SUPERSTAR2_ENABLE */ #ifdef TSIP_ENABLE &driver_tsip, #endif /* TSIP_ENABLE */ #ifdef UBLOX_ENABLE &driver_ubx, #endif /* UBLOX_ENABLE */ #ifdef ZODIAC_ENABLE &driver_zodiac, #endif /* ZODIAC_ENABLE */ #ifdef NMEA2000_ENABLE &driver_nmea2000, #endif /* NMEA2000_ENABLE */ #ifdef RTCM104V2_ENABLE &driver_rtcm104v2, #endif /* RTCM104V2_ENABLE */ #ifdef RTCM104V3_ENABLE &driver_rtcm104v3, #endif /* RTCM104V3_ENABLE */ #ifdef GARMINTXT_ENABLE &driver_garmintxt, #endif /* GARMINTXT_ENABLE */ #ifdef PASSTHROUGH_ENABLE &driver_json_passthrough, #endif /* PASSTHROUGH_ENABLE */ #if defined(PPS_ENABLE) &driver_pps, #endif /* PPS_ENABLE */ NULL, }; const struct gps_type_t **gpsd_drivers = &gpsd_driver_array[0]; gpsd-3.15/gegps0000775000175000017500000000551512461156335011614 0ustar esresr#!/usr/bin/env python # -*- coding: utf-8 -*- # # usage: gegps [-i] [-d kmldir] # # Feed location data from a running GPSD to a Google Earth instance. # The -d argument is the location of the Google Earth installation # directory. If not specified, it defaults to the current directory. # # If you have the free (non-subscription) version, start by running with # the -i option to drop a clue in the Google Earth installation directory, # as 'Open_in_Google_Earth_RT_GPS.kml', then open that file in Places # (File > Open...), # # The basic recipe is here: # http://tjworld.net/wiki/Linux/Ubuntu/GoogleEarthPlusRealTimeGPS # # This code originally by Jaroslaw Zachwieja and a guy referring # to himself/herself as TJ(http://tjworld.net) # Modified by Chen Wei for use with gpsd # Cleaned up and adapted for the GPSD project by Eric S. Raymond. import sys, os, getopt import gps KML_OPEN_IN_GE = '''\ Realtime GPS 1 Realtime_GPS.kml onInterval ''' def kmlize(tpv): '''http://code.google.com/apis/kml/documentation/kmlreference.html for official kml document''' latitude = tpv['lat'] longitude = tpv['lon'] speed_in = tpv['speed'] # meter/second speed = speed_in * gps.MPS_TO_KPH # Km/h heading = int(round(tpv['track'], 0)) altitude = tpv['alt'] if speed < 1: heading = 0 return """ %s km/h,heading %s Realtime GPS feeding %s %s %s,%s,%s """ % (speed,heading,longitude,latitude,longitude,latitude,altitude) if __name__ == "__main__": session = gps.gps() session.stream(gps.WATCH_ENABLE) kmldir = "." initialize = False (options, arguments) = getopt.getopt(sys.argv[1:], "d:i") for (opt, arg) in options: if opt == '-d': kmldir = arg elif opt == '-i': initialize = True if initialize: f = open(os.path.join(kmldir, 'Open_in_Google_Earth_RT_GPS.kml'), 'w') f.write(KML_OPEN_IN_GE) f.close() else: try: while True: report = session.next() if report['class'] == 'TPV': f = open(os.path.join(kmldir, 'Realtime_GPS.kml'), 'w') f.write(kmlize(report)) f.close() except StopIteration: pass except KeyboardInterrupt: print 'gegpsd stopped ' # end gpsd-3.15/geoid.c0000664000175000017500000001555712506317026012017 0ustar esresr/* * geoid.c -- ECEF to WGS84 conversions, including ellipsoid-to-MSL height * * Geoid separation code by Oleg Gusev, from data by Peter Dana. * ECEF conversion by Rob Janssen. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include "gpsd.h" 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) { double delta; #define EQ(a, b) (fabs((a) - (b)) < 0.001) if (EQ(y1, y2) && EQ(x1, x2)) return (z11); if (EQ(y1, y2) && !EQ(x1, x2)) return (z22 * (x - x1) + z11 * (x2 - x)) / (x2 - x1); if (EQ(x1, x2) && !EQ(y1, y2)) return (z22 * (y - y1) + z11 * (y2 - y)) / (y2 - y1); #undef EQ 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; } double wgs84_separation(double lat, double lon) /* return geoid separation (MSL-WGS84) in meters, given a lat/lon in degrees */ { #define GEOID_ROW 19 #define GEOID_COL 37 /* *INDENT-OFF* */ const int 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, /* 70S */ -61,-60,-61,-55,-49,-44,-38,-31,-25,-16, -6, 1, 4, 5, 4, 2, 6, 12, 16, 16, 17, 21, 20, 26, 26, 22, 16, 10, -1,-16,-29,-36,-46,-55,-54,-59,-61, /* 60S */ -45,-43,-37,-32,-30,-26,-23,-22,-16,-10, -2, 10, 20, 20, 21, 24, 22, 17, 16, 19, 25, 30, 35, 35, 33, 30, 27, 10, -2,-14,-23,-30,-33,-29,-35,-43,-45, /* 50S */ -15,-18,-18,-16,-17,-15,-10,-10, -8, -2, 6, 14, 13, 3, 3, 10, 20, 27, 25, 26, 34, 39, 45, 45, 38, 39, 28, 13, -1,-15,-22,-22,-18,-15,-14,-10,-15, /* 40S */ 21, 6, 1, -7,-12,-12,-12,-10, -7, -1, 8, 23, 15, -2, -6, 6, 21, 24, 18, 26, 31, 33, 39, 41, 30, 24, 13, -2,-20,-32,-33,-27,-14, -2, 5, 20, 21, /* 30S */ 46, 22, 5, -2, -8,-13,-10, -7, -4, 1, 9, 32, 16, 4, -8, 4, 12, 15, 22, 27, 34, 29, 14, 15, 15, 7, -9,-25,-37,-39,-23,-14, 15, 33, 34, 45, 46, /* 20S */ 51, 27, 10, 0, -9,-11, -5, -2, -3, -1, 9, 35, 20, -5, -6, -5, 0, 13, 17, 23, 21, 8, -9,-10,-11,-20, -40,-47,-45,-25, 5, 23, 45, 58, 57, 63, 51, /* 10S */ 36, 22, 11, 6, -1, -8,-10, -8,-11, -9, 1, 32, 4,-18,-13, -9, 4, 14, 12, 13, -2,-14,-25,-32,-38,-60, -75,-63,-26, 0, 35, 52, 68, 76, 64, 52, 36, /* 00N */ 22, 16, 17, 13, 1,-12,-23,-20,-14, -3, 14, 10,-15,-27,-18, 3, 12, 20, 18, 12,-13, -9,-28,-49,-62,-89,-102,-63, -9, 33, 58, 73, 74, 63, 50, 32, 22, /* 10N */ 13, 12, 11, 2,-11,-28,-38,-29,-10, 3, 1,-11,-41,-42,-16, 3, 17, 33, 22, 23, 2, -3, -7,-36,-59,-90, -95,-63,-24, 12, 53, 60, 58, 46, 36, 26, 13, /* 20N */ 5, 10, 7, -7,-23,-39,-47,-34, -9,-10,-20,-45,-48,-32, -9, 17, 25, 31, 31, 26, 15, 6, 1,-29,-44,-61, -67,-59,-36,-11, 21, 39, 49, 39, 22, 10, 5, /* 30N */ -7, -5, -8,-15,-28,-40,-42,-29,-22,-26,-32,-51,-40,-17, 17, 31, 34, 44, 36, 28, 29, 17, 12,-20,-15,-40, -33,-34,-34,-28, 7, 29, 43, 20, 4, -6, -7, /* 40N */ -12,-10,-13,-20,-31,-34,-21,-16,-26,-34,-33,-35,-26, 2, 33, 59, 52, 51, 52, 48, 35, 40, 33, -9,-28,-39, -48,-59,-50,-28, 3, 23, 37, 18, -1,-11,-12, /* 50N */ -8, 8, 8, 1,-11,-19,-16,-18,-22,-35,-40,-26,-12, 24, 45, 63, 62, 59, 47, 48, 42, 28, 12,-10,-19,-33, -43,-42,-43,-29, -2, 17, 23, 22, 6, 2, -8, /* 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 }; /* *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 ((GEOID_ROW <= ilat) || (0 > ilat) || (GEOID_COL <= ilon) || (0 > ilon)) 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.0 - 180.0, ilat1 * 10.0 - 90.0, ilon2 * 10.0 - 180.0, ilat2 * 10.0 - 90.0, 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) /* 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); /* geodetic location */ lambda = atan2(y, x); 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)); heading = atan2(fix_minuz(veast), fix_minuz(vnorth)); if (heading < 0) heading += 2 * GPS_PI; fix->track = heading * RAD_2_DEG; } /* * Some systems propagate the sign along with zero. This messes up * certain trig functions, like atan2(): * atan2(+0, +0) = 0 * atan2(+0, -0) = PI * Obviously that will break things. Luckily the "==" operator thinks * that -0 == +0; we will use this to return an unambiguous value. * * I hereby decree that zero is not allowed to have a negative sign! */ static double fix_minuz(double d) { return ((d == 0.0) ? 0.0 : d); } gpsd-3.15/gps.h0000664000175000017500000023504312532614165011523 0ustar esresr/* gps.h -- interface of the libgps library */ /* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _GPSD_GPS_H_ #define _GPSD_GPS_H_ #ifdef __cplusplus extern "C" { #endif #include #include #include #include /* stdint.h would be smaller but not all have it */ #include #include #include #include #include /* pacifies OpenBSD's compiler */ /* * 4.1 - Base version for initial JSON protocol (Dec 2009, release 2.90) * 4.2 - AIS application IDs split into DAC and FID (July 2010, release 2.95) * 5.0 - MAXCHANNELS bumped from 20 to 32 for GLONASS (Mar 2011, release 2.96) * gps_open() becomes reentrant, what gps_open_r() used to be. * gps_poll() removed in favor of gps_read(). The raw hook is gone. * (Aug 2011, release 3.0) * 5.1 - GPS_PATH_MAX uses system PATH_MAX; split24 flag added. New * model and serial members in part B of AIS type 24, conforming * with ITU-R 1371-4. New timedrift structure (Nov 2013, release 3.10). * 6.0 - AIS type 6 and 8 get 'structured' flag; GPS_PATH_MAX * shortened because devices has moved out of the tail union. Sentence * tag fields dropped from emitted JSON. The shape of the skyview * structure has changed to make working with the satellites-used * bits less confusing. (January 2015, release 3.12). * 6.1 - Add navdata_t for more (nmea2000) info. */ #define GPSD_API_MAJOR_VERSION 6 /* bump on incompatible changes */ #define GPSD_API_MINOR_VERSION 1 /* bump on compatible changes */ #define MAXCHANNELS 72 /* must be > 12 GPS + 12 GLONASS + 2 WAAS */ #define MAXUSERDEVS 4 /* max devices per user */ #define GPS_PATH_MAX 128 /* for names like /dev/serial/by-id/... */ /* * The structure describing an uncertainty volume in kinematic space. * This is what GPSes are meant to produce; all the other info is * technical impedimenta. * * All double values use NAN to indicate data not available. * * All the information in this structure was considered valid * by the GPS at the time of update. * * Error estimates are at 95% confidence. */ /* WARNING! potential loss of precision in timestamp_t * a double is 53 significant bits. * UNIX time to nanoSec precision is 62 significant bits * UNIX time to nanoSec precision after 2038 is 63 bits * timestamp_t is only microSec precision * timestamp_t and PPS do not play well together */ typedef double timestamp_t; /* Unix time in seconds with fractional part */ struct gps_fix_t { timestamp_t time; /* Time of update */ int mode; /* Mode of fix */ #define MODE_NOT_SEEN 0 /* mode update not seen yet */ #define MODE_NO_FIX 1 /* none */ #define MODE_2D 2 /* good for latitude/longitude */ #define MODE_3D 3 /* good for altitude/climb too */ double ept; /* Expected time uncertainty */ double latitude; /* Latitude in degrees (valid if mode >= 2) */ double epy; /* Latitude position uncertainty, meters */ double longitude; /* Longitude in degrees (valid if mode >= 2) */ double epx; /* Longitude position uncertainty, meters */ double altitude; /* Altitude in meters (valid if mode == 3) */ double epv; /* Vertical position uncertainty, meters */ double track; /* Course made good (relative to true north) */ double epd; /* Track uncertainty, degrees */ double speed; /* Speed over ground, meters/sec */ double eps; /* Speed uncertainty, meters/sec */ double climb; /* Vertical speed, meters/sec */ double epc; /* Vertical speed uncertainty */ }; /* * Satellite ID classes. * According to IS-GPS-200 Revision H paragraph 6.3.6, and earlier revisions * at least back to E, the upper bound of U.S. GPS PRNs is actually 64. However, * NMEA0183 only allocates 1-32 for U.S. GPS IDs; it uses 33-64 for IDs ub the * SBAS range. */ #define GPS_PRN(n) (((n) >= 1) && ((n) <= 32)) /* U.S. GPS satellite */ #define GBAS_PRN(n) ((n) >= 64 && ((n) <= 119)) /* Other GNSS (GLONASS) and Ground Based Augmentation System (eg WAAS)*/ #define SBAS_PRN(n) ((n) >= 120 && ((n) <= 158)) /* Satellite Based Augmentation System (eg GAGAN)*/ #define GNSS_PRN(n) ((n) >= 159 && ((n) <= 210)) /* other GNSS (eg BeiDou) */ /* * GLONASS birds reuse GPS PRNs. * It is an NMEA0183 convention to map them to pseudo-PRNs 65..96. * (some other programs push them to 33 and above). * The US GPS constellation plans to use the 33-63 range. */ #define GLONASS_PRN_OFFSET 64 /* * The structure describing the pseudorange errors (GPGST) */ struct gst_t { double utctime; double rms_deviation; double smajor_deviation; double sminor_deviation; double smajor_orientation; double lat_err_deviation; double lon_err_deviation; double alt_err_deviation; }; /* * From the RCTM104 2.x standard: * * "The 30 bit words (as opposed to 32 bit words) coupled with a 50 Hz * transmission rate provides a convenient timing capability where the * times of word boundaries are a rational multiple of 0.6 seconds." * * "Each frame is N+2 words long, where N is the number of message data * words. For example, a filler message (type 6 or 34) with no message * data will have N=0, and will consist only of two header words. The * maximum number of data words allowed by the format is 31, so that * the longest possible message will have a total of 33 words." */ #define RTCM2_WORDS_MAX 33 #define MAXCORRECTIONS 18 /* max correction count in type 1 or 9 */ #define MAXSTATIONS 10 /* maximum stations in almanac, type 5 */ /* RTCM104 doesn't specify this, so give it the largest reasonable value */ #define MAXHEALTH (RTCM2_WORDS_MAX-2) /* * A nominally 30-bit word (24 bits of data, 6 bits of parity) * used both in the GPS downlink protocol described in IS-GPS-200 * and in the format for DGPS corrections used in RTCM-104v2. */ typedef uint32_t isgps30bits_t; /* * Values for "system" fields. Note, the encoding logic is senstive to the * actual values of these; it's not sufficient that they're distinct. */ #define NAVSYSTEM_GPS 0 #define NAVSYSTEM_GLONASS 1 #define NAVSYSTEM_GALILEO 2 #define NAVSYSTEM_UNKNOWN 3 struct rtcm2_t { /* header contents */ unsigned type; /* RTCM message type */ unsigned length; /* length (words) */ double zcount; /* time within hour: GPS time, no leap secs */ unsigned refstaid; /* reference station ID */ unsigned seqnum; /* message sequence number (modulo 8) */ unsigned stathlth; /* station health */ /* message data in decoded form */ union { struct { unsigned int nentries; struct gps_rangesat_t { /* data from messages 1 & 9 */ unsigned ident; /* satellite ID */ unsigned udre; /* user diff. range error */ unsigned iod; /* issue of data */ double prc; /* range error */ double rrc; /* range error rate */ } sat[MAXCORRECTIONS]; } gps_ranges; struct { /* data for type 3 messages */ bool valid; /* is message well-formed? */ double x, y, z; } ecef; struct { /* data from type 4 messages */ bool valid; /* is message well-formed? */ int system; int sense; #define SENSE_INVALID 0 #define SENSE_GLOBAL 1 #define SENSE_LOCAL 2 char datum[6]; double dx, dy, dz; } reference; struct { /* data from type 5 messages */ unsigned int nentries; struct consat_t { unsigned ident; /* satellite ID */ bool iodl; /* issue of data */ unsigned int health; /* is satellite healthy? */ #define HEALTH_NORMAL (0) /* Radiobeacon operation normal */ #define HEALTH_UNMONITORED (1) /* No integrity monitor operating */ #define HEALTH_NOINFO (2) /* No information available */ #define HEALTH_DONOTUSE (3) /* Do not use this radiobeacon */ int snr; /* signal-to-noise ratio, dB */ #define SNR_BAD -1 /* not reported */ bool health_en; /* health enabled */ bool new_data; /* new data? */ bool los_warning; /* line-of-sight warning */ unsigned int tou; /* time to unhealth, seconds */ } sat[MAXHEALTH]; } conhealth; struct { /* data from type 7 messages */ unsigned int nentries; struct station_t { double latitude, longitude; /* location */ unsigned int range; /* range in km */ double frequency; /* broadcast freq */ unsigned int health; /* station health */ unsigned int station_id; /* of the transmitter */ unsigned int bitrate; /* of station transmissions */ } station[MAXSTATIONS]; } almanac; struct { /* data for type 13 messages */ bool status; /* expect a text message */ bool rangeflag; /* station range altered? */ double lat, lon; /* station longitude/latitude */ unsigned int range; /* transmission range in km */ } xmitter; struct { /* data from type 14 messages */ unsigned int week; /* GPS week (0-1023) */ unsigned int hour; /* Hour in week (0-167) */ unsigned int leapsecs; /* Leap seconds (0-63) */ } gpstime; struct { unsigned int nentries; struct glonass_rangesat_t { /* data from message type 31 */ unsigned ident; /* satellite ID */ unsigned udre; /* user diff. range error */ unsigned tod; /* issue of data */ bool change; /* ephemeris change bit */ double prc; /* range error */ double rrc; /* range error rate */ } sat[MAXCORRECTIONS]; } glonass_ranges; /* data from type 16 messages */ char message[(RTCM2_WORDS_MAX-2) * sizeof(isgps30bits_t)]; /* data from messages of unknown type */ isgps30bits_t words[RTCM2_WORDS_MAX-2]; }; }; /* RTCM3 report structures begin here */ #define RTCM3_MAX_SATELLITES 64 #define RTCM3_MAX_DESCRIPTOR 31 #define RTCM3_MAX_ANNOUNCEMENTS 32 struct rtcm3_rtk_hdr { /* header data from 1001, 1002, 1003, 1004 */ /* Used for both GPS and GLONASS, but their timebases differ */ unsigned int station_id; /* Reference Station ID */ time_t tow; /* GPS Epoch Time (TOW) in ms, or GLONASS Epoch Time in ms */ bool sync; /* Synchronous GNSS Message Flag */ unsigned short satcount; /* # Satellite Signals Processed */ bool smoothing; /* Divergence-free Smoothing Indicator */ unsigned int interval; /* Smoothing Interval */ }; struct rtcm3_basic_rtk { unsigned char indicator; /* Indicator */ unsigned int channel; /* Satellite Frequency Channel Number (GLONASS only) */ double pseudorange; /* Pseudorange */ double rangediff; /* PhaseRange – Pseudorange in meters */ unsigned char locktime; /* Lock time Indicator */ }; struct rtcm3_extended_rtk { unsigned char indicator; /* Indicator */ unsigned int channel; /* Satellite Frequency Channel Number (GLONASS only) */ double pseudorange; /* Pseudorange */ double rangediff; /* PhaseRange – L1 Pseudorange */ unsigned char locktime; /* Lock time Indicator */ unsigned char ambiguity; /* Integer Pseudorange Modulus Ambiguity */ double CNR; /* Carrier-to-Noise Ratio */ }; struct rtcm3_network_rtk_header { unsigned int network_id; /* Network ID */ unsigned int subnetwork_id; /* Subnetwork ID */ time_t time; /* GPS Epoch Time (TOW) in ms */ bool multimesg; /* GPS Multiple Message Indicator */ unsigned master_id; /* Master Reference Station ID */ unsigned aux_id; /* Auxilary Reference Station ID */ unsigned char satcount; /* count of GPS satellites */ }; struct rtcm3_correction_diff { unsigned char ident; /* satellite ID */ enum {reserved, correct, widelane, uncertain} ambiguity; unsigned char nonsync; double geometric_diff; /* Geometric Carrier Phase Correction Difference (1016, 1017) */ unsigned char iode; /* GPS IODE (1016, 1017) */ double ionospheric_diff; /* Ionospheric Carrier Phase Correction Difference (1015, 1017) */ }; struct rtcm3_t { /* header contents */ unsigned type; /* RTCM 3.x message type */ unsigned length; /* payload length, inclusive of checksum */ union { /* 1001-1013 were present in the 3.0 version */ struct { struct rtcm3_rtk_hdr header; struct rtcm3_1001_t { unsigned ident; /* Satellite ID */ struct rtcm3_basic_rtk L1; } rtk_data[RTCM3_MAX_SATELLITES]; } rtcm3_1001; struct { struct rtcm3_rtk_hdr header; struct rtcm3_1002_t { unsigned ident; /* Satellite ID */ struct rtcm3_extended_rtk L1; } rtk_data[RTCM3_MAX_SATELLITES]; } rtcm3_1002; struct rtcm3_1003_t { struct rtcm3_rtk_hdr header; struct { unsigned ident; /* Satellite ID */ struct rtcm3_basic_rtk L1; struct rtcm3_basic_rtk L2; } rtk_data[RTCM3_MAX_SATELLITES]; } rtcm3_1003; struct rtcm3_1004_t { struct rtcm3_rtk_hdr header; struct { unsigned ident; /* Satellite ID */ struct rtcm3_extended_rtk L1; struct rtcm3_extended_rtk L2; } rtk_data[RTCM3_MAX_SATELLITES]; } rtcm3_1004; struct rtcm3_1005_t { unsigned int station_id; /* Reference Station ID */ int system; /* Which system is it? */ bool reference_station; /* Reference-station indicator */ bool single_receiver; /* Single Receiver Oscillator */ double ecef_x, ecef_y, ecef_z; /* ECEF antenna location */ } rtcm3_1005; struct rtcm3_1006_t { unsigned int station_id; /* Reference Station ID */ int system; /* Which system is it? */ bool reference_station; /* Reference-station indicator */ bool single_receiver; /* Single Receiver Oscillator */ double ecef_x, ecef_y, ecef_z; /* ECEF antenna location */ double height; /* Antenna height */ } rtcm3_1006; struct { unsigned int station_id; /* Reference Station ID */ char descriptor[RTCM3_MAX_DESCRIPTOR+1]; /* Description string */ unsigned int setup_id; } rtcm3_1007; struct { unsigned int station_id; /* Reference Station ID */ char descriptor[RTCM3_MAX_DESCRIPTOR+1]; /* Description string */ unsigned int setup_id; char serial[RTCM3_MAX_DESCRIPTOR+1]; /* Serial # string */ } rtcm3_1008; struct { struct rtcm3_rtk_hdr header; struct rtcm3_1009_t { unsigned ident; /* Satellite ID */ struct rtcm3_basic_rtk L1; } rtk_data[RTCM3_MAX_SATELLITES]; } rtcm3_1009; struct { struct rtcm3_rtk_hdr header; struct rtcm3_1010_t { unsigned ident; /* Satellite ID */ struct rtcm3_extended_rtk L1; } rtk_data[RTCM3_MAX_SATELLITES]; } rtcm3_1010; struct { struct rtcm3_rtk_hdr header; struct rtcm3_1011_t { unsigned ident; /* Satellite ID */ struct rtcm3_extended_rtk L1; struct rtcm3_extended_rtk L2; } rtk_data[RTCM3_MAX_SATELLITES]; } rtcm3_1011; struct { struct rtcm3_rtk_hdr header; struct rtcm3_1012_t { unsigned ident; /* Satellite ID */ struct rtcm3_extended_rtk L1; struct rtcm3_extended_rtk L2; } rtk_data[RTCM3_MAX_SATELLITES]; } rtcm3_1012; struct { unsigned int station_id; /* Reference Station ID */ unsigned short mjd; /* Modified Julian Day (MJD) Number */ unsigned int sod; /* Seconds of Day (UTC) */ unsigned char leapsecs; /* Leap Seconds, GPS-UTC */ unsigned char ncount; /* Count of announcements to follow */ struct rtcm3_1013_t { unsigned short id; /* message type ID */ bool sync; unsigned short interval; /* interval in 0.1sec units */ } announcements[RTCM3_MAX_ANNOUNCEMENTS]; } rtcm3_1013; /* 1014-1017 were added in the 3.1 version */ struct rtcm3_1014_t { unsigned int network_id; /* Network ID */ unsigned int subnetwork_id; /* Subnetwork ID */ unsigned int stationcount; /* # auxiliary stations transmitted */ unsigned int master_id; /* Master Reference Station ID */ unsigned int aux_id; /* Auxilary Reference Station ID */ double d_lat, d_lon, d_alt; /* Aux-master location delta */ } rtcm3_1014; struct rtcm3_1015_t { struct rtcm3_network_rtk_header header; struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES]; } rtcm3_1015; struct rtcm3_1016_t { struct rtcm3_network_rtk_header header; struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES]; } rtcm3_1016; struct rtcm3_1017_t { struct rtcm3_network_rtk_header header; struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES]; } rtcm3_1017; /* 1018-1029 were in the 3.0 version */ struct rtcm3_1019_t { unsigned int ident; /* Satellite ID */ unsigned int week; /* GPS Week Number */ unsigned char sv_accuracy; /* GPS SV ACCURACY */ enum {reserved_code, p, ca, l2c} code; double idot; unsigned char iode; /* ephemeris fields, not scaled */ unsigned int t_sub_oc; signed int a_sub_f2; signed int a_sub_f1; signed int a_sub_f0; unsigned int iodc; signed int C_sub_rs; signed int delta_sub_n; signed int M_sub_0; signed int C_sub_uc; unsigned int e; signed int C_sub_us; unsigned int sqrt_sub_A; unsigned int t_sub_oe; signed int C_sub_ic; signed int OMEGA_sub_0; signed int C_sub_is; signed int i_sub_0; signed int C_sub_rc; signed int argument_of_perigee; signed int omegadot; signed int t_sub_GD; unsigned char sv_health; bool p_data; bool fit_interval; } rtcm3_1019; struct rtcm3_1020_t { unsigned int ident; /* Satellite ID */ unsigned short channel; /* Satellite Frequency Channel Number */ /* ephemeris fields, not scaled */ bool C_sub_n; bool health_avAilability_indicator; unsigned char P1; unsigned short t_sub_k; bool msb_of_B_sub_n; bool P2; bool t_sub_b; signed int x_sub_n_t_of_t_sub_b_prime; signed int x_sub_n_t_of_t_sub_b; signed int x_sub_n_t_of_t_sub_b_prime_prime; signed int y_sub_n_t_of_t_sub_b_prime; signed int y_sub_n_t_of_t_sub_b; signed int y_sub_n_t_of_t_sub_b_prime_prime; signed int z_sub_n_t_of_t_sub_b_prime; signed int z_sub_n_t_of_t_sub_b; signed int z_sub_n_t_of_t_sub_b_prime_prime; bool P3; signed int gamma_sub_n_of_t_sub_b; unsigned char MP; bool Ml_n; signed int tau_n_of_t_sub_b; signed int M_delta_tau_sub_n; unsigned int E_sub_n; bool MP4; unsigned char MF_sub_T; unsigned char MN_sub_T; unsigned char MM; bool additioinal_data_availability; unsigned int N_sup_A; unsigned int tau_sub_c; unsigned int M_N_sub_4; signed int M_tau_sub_GPS; bool M_l_sub_n; } rtcm3_1020; struct rtcm3_1029_t { unsigned int station_id; /* Reference Station ID */ unsigned short mjd; /* Modified Julian Day (MJD) Number */ unsigned int sod; /* Seconds of Day (UTC) */ size_t len; /* # chars to follow */ size_t unicode_units; /* # Unicode units in text */ unsigned char text[128]; } rtcm3_1029; struct rtcm3_1033_t { unsigned int station_id; /* Reference Station ID */ char descriptor[RTCM3_MAX_DESCRIPTOR+1]; /* Description string */ unsigned int setup_id; char serial[RTCM3_MAX_DESCRIPTOR+1]; /* Serial # string */ char receiver[RTCM3_MAX_DESCRIPTOR+1]; /* Receiver string */ char firmware[RTCM3_MAX_DESCRIPTOR+1]; /* Firmware string */ } rtcm3_1033; char data[1024]; /* Max RTCM3 msg length is 1023 bytes */ } rtcmtypes; }; /* RTCM3 scaling constants */ #define GPS_AMBIGUITY_MODULUS 299792.458 /* 1004, DF014*/ #define GLONASS_AMBIGUITY_MODULUS 599584.916 /* 1012, DF044 */ #define MESSAGE_INTERVAL_UNITS 0.1 /* 1013, DF047 */ /* * Raw IS_GPS subframe data */ /* The almanac is a subset of the clock and ephemeris data, with reduced * precision. See IS-GPS-200E, Table 20-VI */ struct almanac_t { uint8_t sv; /* The satellite this refers to */ /* toa, almanac reference time, 8 bits unsigned, seconds */ uint8_t toa; long l_toa; /* SV health data, 8 bit unsigned bit map */ uint8_t svh; /* deltai, correction to inclination, 16 bits signed, semi-circles */ int16_t deltai; double d_deltai; /* M0, Mean Anomaly at Reference Time, 24 bits signed, semi-circles */ int32_t M0; double d_M0; /* Omega0, Longitude of Ascending Node of Orbit Plane at Weekly Epoch, * 24 bits signed, semi-circles */ int32_t Omega0; double d_Omega0; /* omega, Argument of Perigee, 24 bits signed, semi-circles */ int32_t omega; double d_omega; /* af0, SV clock correction constant term * 11 bits signed, seconds */ int16_t af0; double d_af0; /* af1, SV clock correction first order term * 11 bits signed, seconds/second */ int16_t af1; double d_af1; /* eccentricity, 16 bits, unsigned, dimensionless */ uint16_t e; double d_eccentricity; /* sqrt A, Square Root of the Semi-Major Axis * 24 bits unsigned, square_root(meters) */ uint32_t sqrtA; double d_sqrtA; /* Omega dot, Rate of Right Ascension, 16 bits signed, semi-circles/sec */ int16_t Omegad; double d_Omegad; }; struct subframe_t { /* subframe number, 3 bits, unsigned, 1 to 5 */ uint8_t subframe_num; /* data_id, denotes the NAV data structure of D(t), 2 bits, in * IS-GPS-200E always == 0x1 */ uint8_t data_id; /* SV/page id used for subframes 4 & 5, 6 bits */ uint8_t pageid; /* tSVID, SV ID of the sat that transmitted this frame, 6 bits unsigned */ uint8_t tSVID; /* TOW, Time of Week of NEXT message, 17 bits unsigned, scale 6, seconds */ uint32_t TOW17; long l_TOW17; /* integrity, URA bounds flag, 1 bit */ bool integrity; /* alert, alert flag, SV URA and/or the SV User Differential Range * Accuracy (UDRA) may be worse than indicated, 1 bit */ bool alert; /* antispoof, A-S mode is ON in that SV, 1 bit */ bool antispoof; int is_almanac; union { /* subframe 1, part of ephemeris, see IS-GPS-200E, Table 20-II * and Table 20-I */ struct { /* WN, Week Number, 10 bits unsigned, scale 1, weeks */ uint16_t WN; /* IODC, Issue of Data, Clock, 10 bits, unsigned, * issued in 8 data ranges at the same time */ uint16_t IODC; /* toc, clock data reference time, 16 bits, unsigned, seconds * scale 2**4, issued in 8 data ranges at the same time */ uint16_t toc; long l_toc; /* l2, code on L2, 2 bits, bit map */ uint8_t l2; /* l2p, L2 P data flag, 1 bit */ uint8_t l2p; /* ura, SV accuracy, 4 bits unsigned index */ unsigned int ura; /* hlth, SV health, 6 bits unsigned bitmap */ unsigned int hlth; /* af0, SV clock correction constant term * 22 bits signed, scale 2**-31, seconds */ int32_t af0; double d_af0; /* af1, SV clock correction first order term * 22 bits signed, scale 2**-43, seconds/second */ int16_t af1; double d_af1; /* af2, SV clock correction second order term * 8 bits signed, scale 2**-55, seconds/second**2 */ int8_t af2; double d_af2; /* Tgd, L1-L2 correction term, 8 bits signed, scale 2**-31, * seconds */ int8_t Tgd; double d_Tgd; } sub1; /* subframe 2, part of ephemeris, see IS-GPS-200E, Table 20-II * and Table 20-III */ struct { /* Issue of Data (Ephemeris), * equal to the 8 LSBs of the 10 bit IODC of the same data set */ uint8_t IODE; /* Age of Data Offset for the NMCT, 6 bits, scale 900, * ignore if all ones, seconds */ uint8_t AODO; uint16_t u_AODO; /* fit, FIT interval flag, indicates a fit interval greater than * 4 hour, 1 bit */ uint8_t fit; /* toe, Reference Time Ephemeris, 16 bits unsigned, scale 2**4, * seconds */ uint16_t toe; long l_toe; /* Crs, Amplitude of the Sine Harmonic Correction Term to the * Orbit Radius, 16 bits, scale 2**-5, signed, meters */ int16_t Crs; double d_Crs; /* Cus, Amplitude of the Sine Harmonic Correction Term to the * Argument of Latitude, 16 bits, signed, scale 2**-29, radians */ int16_t Cus; double d_Cus; /* Cuc, Amplitude of the Cosine Harmonic Correction Term to the * Argument of Latitude, 16 bits, signed, scale 2**-29, radians */ int16_t Cuc; double d_Cuc; /* deltan, Mean Motion Difference From Computed Value * Mean Motion Difference From Computed Value * 16 bits, signed, scale 2**-43, semi-circles/sec */ int16_t deltan; double d_deltan; /* M0, Mean Anomaly at Reference Time, 32 bits signed, * scale 2**-31, semi-circles */ int32_t M0; double d_M0; /* eccentricity, 32 bits, unsigned, scale 2**-33, dimensionless */ uint32_t e; double d_eccentricity; /* sqrt A, Square Root of the Semi-Major Axis * 32 bits unsigned, scale 2**-19, square_root(meters) */ uint32_t sqrtA; double d_sqrtA; } sub2; /* subframe 3, part of ephemeris, see IS-GPS-200E, Table 20-II, * Table 20-III */ struct { /* Issue of Data (Ephemeris), 8 bits, unsigned * equal to the 8 LSBs of the 10 bit IODC of the same data set */ uint8_t IODE; /* Rate of Inclination Angle, 14 bits signed, scale2**-43, * semi-circles/sec */ int16_t IDOT; double d_IDOT; /* Cic, Amplitude of the Cosine Harmonic Correction Term to the * Angle of Inclination, 16 bits signed, scale 2**-29, radians*/ int16_t Cic; double d_Cic; /* Cis, Amplitude of the Sine Harmonic Correction Term to the * Angle of Inclination, 16 bits, unsigned, scale 2**-29, radians */ int16_t Cis; double d_Cis; /* Crc, Amplitude of the Cosine Harmonic Correction Term to the * Orbit Radius, 16 bits signed, scale 2**-5, meters */ int16_t Crc; double d_Crc; /* i0, Inclination Angle at Reference Time, 32 bits, signed, * scale 2**-31, semi-circles */ int32_t i0; double d_i0; /* Omega0, Longitude of Ascending Node of Orbit Plane at Weekly * Epoch, 32 bits signed, semi-circles */ int32_t Omega0; double d_Omega0; /* omega, Argument of Perigee, 32 bits signed, scale 2**-31, * semi-circles */ int32_t omega; double d_omega; /* Omega dot, Rate of Right Ascension, 24 bits signed, * scale 2**-43, semi-circles/sec */ int32_t Omegad; double d_Omegad; } sub3; struct { struct almanac_t almanac; } sub4; /* subframe 4, page 13 */ struct { /* mapping ord ERD# to SV # is non trivial * leave it alone. See IS-GPS-200E Section 20.3.3.5.1.9 */ /* Estimated Range Deviation, 6 bits signed, meters */ char ERD[33]; /* ai, Availability Indicator, 2bits, bit map */ unsigned char ai; } sub4_13; /* subframe 4, page 17, system message, 23 chars, plus nul */ struct { char str[24]; } sub4_17; /* subframe 4, page 18 */ struct { /* ionospheric and UTC data */ /* A0, Bias coefficient of GPS time scale relative to UTC time * scale, 32 bits signed, scale 2**-30, seconds */ int32_t A0; double d_A0; /* A1, Drift coefficient of GPS time scale relative to UTC time * scale, 24 bits signed, scale 2**-50, seconds/second */ int32_t A1; double d_A1; /* alphaX, the four coefficients of a cubic equation representing * the amplitude of the vertical delay */ /* alpha0, 8 bits signed, scale w**-30, seconds */ int8_t alpha0; double d_alpha0; /* alpha1, 8 bits signed, scale w**-27, seconds/semi-circle */ int8_t alpha1; double d_alpha1; /* alpha2, 8 bits signed, scale w**-24, seconds/semi-circle**2 */ int8_t alpha2; double d_alpha2; /* alpha3, 8 bits signed, scale w**-24, seconds/semi-circle**3 */ int8_t alpha3; double d_alpha3; /* betaX, the four coefficients of a cubic equation representing * the period of the model */ /* beta0, 8 bits signed, scale w**11, seconds */ int8_t beta0; double d_beta0; /* beta1, 8 bits signed, scale w**14, seconds/semi-circle */ int8_t beta1; double d_beta1; /* beta2, 8 bits signed, scale w**16, seconds/semi-circle**2 */ int8_t beta2; double d_beta2; /* beta3, 8 bits signed, scale w**16, seconds/semi-circle**3 */ int8_t beta3; double d_beta3; /* leap (delta t ls), current leap second, 8 bits signed, * scale 1, seconds */ int8_t leap; /* lsf (delta t lsf), future leap second, 8 bits signed, * scale 1, seconds */ int8_t lsf; /* tot, reference time for UTC data, * 8 bits unsigned, scale 2**12, seconds */ uint8_t tot; double d_tot; /* WNt, UTC reference week number, 8 bits unsigned, scale 1, * weeks */ uint8_t WNt; /* WNlsf, Leap second reference Week Number, * 8 bits unsigned, scale 1, weeks */ uint8_t WNlsf; /* DN, Leap second reference Day Number , 8 bits unsigned, * scale 1, days */ uint8_t DN; } sub4_18; /* subframe 4, page 25 */ struct { /* svf, A-S status and the configuration code of each SV * 4 bits unsigned, bitmap */ unsigned char svf[33]; /* svh, SV health data for SV 25 through 32 * 6 bits unsigned bitmap */ uint8_t svhx[8]; } sub4_25; struct { struct almanac_t almanac; } sub5; struct { /* toa, Almanac reference Time, 8 bits unsigned, scale 2**12, * seconds */ uint8_t toa; long l_toa; /* WNa, Week Number almanac, 8 bits, scale 2, GPS Week * Number % 256 */ uint8_t WNa; /* sv, SV health status, 6 bits, bitmap */ uint8_t sv[25]; } sub5_25; }; }; typedef uint64_t gps_mask_t; /* * Is an MMSI number that of an auxiliary associated with a mother ship? * We need to be able to test this for decoding AIS Type 24 messages. * According to , * auxiliary-craft MMSIs have the form 98MIDXXXX, where MID is a country * code and XXXX the vessel ID. */ #define AIS_AUXILIARY_MMSI(n) ((n) / 10000000 == 98) /* N/A values and scaling constant for 25/24 bit lon/lat pairs */ #define AIS_LON3_NOT_AVAILABLE 181000 #define AIS_LAT3_NOT_AVAILABLE 91000 #define AIS_LATLON3_DIV 60000.0 /* N/A values and scaling constant for 28/27 bit lon/lat pairs */ #define AIS_LON4_NOT_AVAILABLE 1810000 #define AIS_LAT4_NOT_AVAILABLE 910000 #define AIS_LATLON4_DIV 600000.0 struct route_info { unsigned int linkage; /* Message Linkage ID */ unsigned int sender; /* Sender Class */ unsigned int rtype; /* Route Type */ unsigned int month; /* Start month */ unsigned int day; /* Start day */ unsigned int hour; /* Start hour */ unsigned int minute; /* Start minute */ unsigned int duration; /* Duration */ int waycount; /* Waypoint count */ struct waypoint_t { signed int lon; /* Longitude */ signed int lat; /* Latitude */ } waypoints[16]; }; struct ais_t { unsigned int type; /* message type */ unsigned int repeat; /* Repeat indicator */ unsigned int mmsi; /* MMSI */ union { /* Types 1-3 Common navigation info */ struct { unsigned int status; /* navigation status */ signed turn; /* rate of turn */ #define AIS_TURN_HARD_LEFT -127 #define AIS_TURN_HARD_RIGHT 127 #define AIS_TURN_NOT_AVAILABLE 128 unsigned int speed; /* speed over ground in deciknots */ #define AIS_SPEED_NOT_AVAILABLE 1023 #define AIS_SPEED_FAST_MOVER 1022 /* >= 102.2 knots */ bool accuracy; /* position accuracy */ #define AIS_LATLON_DIV 600000.0 int lon; /* longitude */ #define AIS_LON_NOT_AVAILABLE 0x6791AC0 int lat; /* latitude */ #define AIS_LAT_NOT_AVAILABLE 0x3412140 unsigned int course; /* course over ground */ #define AIS_COURSE_NOT_AVAILABLE 3600 unsigned int heading; /* true heading */ #define AIS_HEADING_NOT_AVAILABLE 511 unsigned int second; /* seconds of UTC timestamp */ #define AIS_SEC_NOT_AVAILABLE 60 #define AIS_SEC_MANUAL 61 #define AIS_SEC_ESTIMATED 62 #define AIS_SEC_INOPERATIVE 63 unsigned int maneuver; /* maneuver indicator */ //unsigned int spare; spare bits */ bool raim; /* RAIM flag */ unsigned int radio; /* radio status bits */ } type1; /* Type 4 - Base Station Report & Type 11 - UTC and Date Response */ struct { unsigned int year; /* UTC year */ #define AIS_YEAR_NOT_AVAILABLE 0 unsigned int month; /* UTC month */ #define AIS_MONTH_NOT_AVAILABLE 0 unsigned int day; /* UTC day */ #define AIS_DAY_NOT_AVAILABLE 0 unsigned int hour; /* UTC hour */ #define AIS_HOUR_NOT_AVAILABLE 24 unsigned int minute; /* UTC minute */ #define AIS_MINUTE_NOT_AVAILABLE 60 unsigned int second; /* UTC second */ #define AIS_SECOND_NOT_AVAILABLE 60 bool accuracy; /* fix quality */ int lon; /* longitude */ int lat; /* latitude */ unsigned int epfd; /* type of position fix device */ //unsigned int spare; spare bits */ bool raim; /* RAIM flag */ unsigned int radio; /* radio status bits */ } type4; /* Type 5 - Ship static and voyage related data */ struct { unsigned int ais_version; /* AIS version level */ unsigned int imo; /* IMO identification */ char callsign[7+1]; /* callsign */ #define AIS_SHIPNAME_MAXLEN 20 char shipname[AIS_SHIPNAME_MAXLEN+1]; /* vessel name */ unsigned int shiptype; /* ship type code */ unsigned int to_bow; /* dimension to bow */ unsigned int to_stern; /* dimension to stern */ unsigned int to_port; /* dimension to port */ unsigned int to_starboard; /* dimension to starboard */ unsigned int epfd; /* type of position fix deviuce */ unsigned int month; /* UTC month */ unsigned int day; /* UTC day */ unsigned int hour; /* UTC hour */ unsigned int minute; /* UTC minute */ unsigned int draught; /* draft in meters */ char destination[20+1]; /* ship destination */ unsigned int dte; /* data terminal enable */ //unsigned int spare; spare bits */ } type5; /* Type 6 - Addressed Binary Message */ struct { unsigned int seqno; /* sequence number */ unsigned int dest_mmsi; /* destination MMSI */ bool retransmit; /* retransmit flag */ //unsigned int spare; spare bit(s) */ unsigned int dac; /* Application ID */ unsigned int fid; /* Functional ID */ bool structured; /* True match for DAC/FID? */ #define AIS_TYPE6_BINARY_MAX 920 /* 920 bits */ size_t bitcount; /* bit count of the data */ union { char bitdata[(AIS_TYPE6_BINARY_MAX + 7) / 8]; /* Inland AIS - ETA at lock/bridge/terminal */ struct { char country[2+1]; /* UN Country Code */ char locode[3+1]; /* UN/LOCODE */ char section[5+1]; /* Fairway section */ char terminal[5+1]; /* Terminal code */ char hectometre[5+1]; /* Fairway hectometre */ unsigned int month; /* ETA month */ unsigned int day; /* ETA day */ unsigned int hour; /* ETA hour */ unsigned int minute; /* ETA minute */ unsigned int tugs; /* Assisting Tugs */ unsigned int airdraught; /* Air Draught */ } dac200fid21; /* Inland AIS - ETA at lock/bridge/terminal */ struct { char country[2+1]; /* UN Country Code */ char locode[3+1]; /* UN/LOCODE */ char section[5+1]; /* Fairway section */ char terminal[5+1]; /* Terminal code */ char hectometre[5+1]; /* Fairway hectometre */ unsigned int month; /* RTA month */ unsigned int day; /* RTA day */ unsigned int hour; /* RTA hour */ unsigned int minute; /* RTA minute */ unsigned int status; /* Status */ #define DAC200FID22_STATUS_OPERATIONAL 0 #define DAC200FID22_STATUS_LIMITED 1 #define DAC200FID22_STATUS_OUT_OF_ORDER 2 #define DAC200FID22_STATUS_NOT_AVAILABLE 0 } dac200fid22; /* Inland AIS - Number of persons on board */ struct { unsigned int crew; /* # crew on board */ unsigned int passengers; /* # passengers on board */ unsigned int personnel; /* # personnel on board */ #define DAC200FID55_COUNT_NOT_AVAILABLE 255 } dac200fid55; /* GLA - AtoN monitoring data (UK/ROI) */ struct { unsigned int ana_int; /* Analogue (internal) */ unsigned int ana_ext1; /* Analogue (external #1) */ unsigned int ana_ext2; /* Analogue (external #2) */ unsigned int racon; /* RACON status */ unsigned int light; /* Light status */ bool alarm; /* Health alarm*/ unsigned int stat_ext; /* Status bits (external) */ bool off_pos; /* Off position status */ } dac235fid10; /* IMO236 - Dangerous Cargo Indication */ struct { char lastport[5+1]; /* Last Port Of Call */ unsigned int lmonth; /* ETA month */ unsigned int lday; /* ETA day */ unsigned int lhour; /* ETA hour */ unsigned int lminute; /* ETA minute */ char nextport[5+1]; /* Next Port Of Call */ unsigned int nmonth; /* ETA month */ unsigned int nday; /* ETA day */ unsigned int nhour; /* ETA hour */ unsigned int nminute; /* ETA minute */ char dangerous[20+1]; /* Main Dangerous Good */ char imdcat[4+1]; /* IMD Category */ unsigned int unid; /* UN Number */ unsigned int amount; /* Amount of Cargo */ unsigned int unit; /* Unit of Quantity */ } dac1fid12; /* IMO236 - Extended Ship Static and Voyage Related Data */ struct { unsigned int airdraught; /* Air Draught */ } dac1fid15; /* IMO236 - Number of Persons on board */ struct { unsigned persons; /* number of persons */ } dac1fid16; /* IMO289 - Clearance Time To Enter Port */ struct { unsigned int linkage; /* Message Linkage ID */ unsigned int month; /* Month (UTC) */ unsigned int day; /* Day (UTC) */ unsigned int hour; /* Hour (UTC) */ unsigned int minute; /* Minute (UTC) */ char portname[20+1]; /* Name of Port & Berth */ char destination[5+1]; /* Destination */ signed int lon; /* Longitude */ signed int lat; /* Latitude */ } dac1fid18; /* IMO289 - Berthing Data (addressed) */ struct { unsigned int linkage; /* Message Linkage ID */ unsigned int berth_length; /* Berth length */ unsigned int berth_depth; /* Berth Water Depth */ unsigned int position; /* Mooring Position */ unsigned int month; /* Month (UTC) */ unsigned int day; /* Day (UTC) */ unsigned int hour; /* Hour (UTC) */ unsigned int minute; /* Minute (UTC) */ unsigned int availability; /* Services Availability */ unsigned int agent; /* Agent */ unsigned int fuel; /* Bunker/fuel */ unsigned int chandler; /* Chandler */ unsigned int stevedore; /* Stevedore */ unsigned int electrical; /* Electrical */ unsigned int water; /* Potable water */ unsigned int customs; /* Customs house */ unsigned int cartage; /* Cartage */ unsigned int crane; /* Crane(s) */ unsigned int lift; /* Lift(s) */ unsigned int medical; /* Medical facilities */ unsigned int navrepair; /* Navigation repair */ unsigned int provisions; /* Provisions */ unsigned int shiprepair; /* Ship repair */ unsigned int surveyor; /* Surveyor */ unsigned int steam; /* Steam */ unsigned int tugs; /* Tugs */ unsigned int solidwaste; /* Waste disposal (solid) */ unsigned int liquidwaste; /* Waste disposal (liquid) */ unsigned int hazardouswaste; /* Waste disposal (hazardous) */ unsigned int ballast; /* Reserved ballast exchange */ unsigned int additional; /* Additional services */ unsigned int regional1; /* Regional reserved 1 */ unsigned int regional2; /* Regional reserved 2 */ unsigned int future1; /* Reserved for future */ unsigned int future2; /* Reserved for future */ char berth_name[20+1]; /* Name of Berth */ signed int berth_lon; /* Longitude */ signed int berth_lat; /* Latitude */ } dac1fid20; /* IMO289 - Weather observation report from ship */ /*** WORK IN PROGRESS - NOT YET DECODED ***/ struct { bool wmo; /* true if WMO variant */ union { struct { char location[20+1]; /* Location */ signed int lon; /* Longitude */ signed int lat; /* Latitude */ unsigned int day; /* Report day */ unsigned int hour; /* Report hour */ unsigned int minute; /* Report minute */ bool vislimit; /* Max range? */ unsigned int visibility; /* Units of 0.1 nm */ #define DAC1FID21_VISIBILITY_NOT_AVAILABLE 127 #define DAC1FID21_VISIBILITY_SCALE 10.0 unsigned humidity; /* units of 1% */ unsigned int wspeed; /* average wind speed */ unsigned int wgust; /* wind gust */ #define DAC1FID21_WSPEED_NOT_AVAILABLE 127 unsigned int wdir; /* wind direction */ #define DAC1FID21_WDIR_NOT_AVAILABLE 360 unsigned int pressure; /* air pressure, hpa */ #define DAC1FID21_NONWMO_PRESSURE_NOT_AVAILABLE 403 #define DAC1FID21_NONWMO_PRESSURE_HIGH 402 /* > 1200hPa */ #define DAC1FID21_NONWMO_PRESSURE_OFFSET 400 /* N/A */ unsigned int pressuretend; /* tendency */ int airtemp; /* temp, units 0.1C */ #define DAC1FID21_AIRTEMP_NOT_AVAILABLE -1024 #define DAC1FID21_AIRTEMP_SCALE 10.0 unsigned int watertemp; /* units 0.1degC */ #define DAC1FID21_WATERTEMP_NOT_AVAILABLE 501 #define DAC1FID21_WATERTEMP_SCALE 10.0 unsigned int waveperiod; /* in seconds */ #define DAC1FID21_WAVEPERIOD_NOT_AVAILABLE 63 unsigned int wavedir; /* direction in deg */ #define DAC1FID21_WAVEDIR_NOT_AVAILABLE 360 unsigned int swellheight; /* in decimeters */ unsigned int swellperiod; /* in seconds */ unsigned int swelldir; /* direction in deg */ } nonwmo_obs; struct { signed int lon; /* Longitude */ signed int lat; /* Latitude */ unsigned int month; /* UTC month */ unsigned int day; /* Report day */ unsigned int hour; /* Report hour */ unsigned int minute; /* Report minute */ unsigned int course; /* course over ground */ unsigned int speed; /* speed, m/s */ #define DAC1FID21_SOG_NOT_AVAILABLE 31 #define DAC1FID21_SOG_HIGH_SPEED 30 #define DAC1FID21_SOG_SCALE 2.0 unsigned int heading; /* true heading */ #define DAC1FID21_HDG_NOT_AVAILABLE 127 #define DAC1FID21_HDG_SCALE 5.0 unsigned int pressure; /* units of hPa * 0.1 */ #define DAC1FID21_WMO_PRESSURE_SCALE 10 #define DAC1FID21_WMO_PRESSURE_OFFSET 90.0 unsigned int pdelta; /* units of hPa * 0.1 */ #define DAC1FID21_PDELTA_SCALE 10 #define DAC1FID21_PDELTA_OFFSET 50.0 unsigned int ptend; /* enumerated */ unsigned int twinddir; /* in 5 degree steps */ #define DAC1FID21_TWINDDIR_NOT_AVAILABLE 127 unsigned int twindspeed; /* meters per second */ #define DAC1FID21_TWINDSPEED_SCALE 2 #define DAC1FID21_RWINDSPEED_NOT_AVAILABLE 255 unsigned int rwinddir; /* in 5 degree steps */ #define DAC1FID21_RWINDDIR_NOT_AVAILABLE 127 unsigned int rwindspeed; /* meters per second */ #define DAC1FID21_RWINDSPEED_SCALE 2 #define DAC1FID21_RWINDSPEED_NOT_AVAILABLE 255 unsigned int mgustspeed; /* meters per second */ #define DAC1FID21_MGUSTSPEED_SCALE 2 #define DAC1FID21_MGUSTSPEED_NOT_AVAILABLE 255 unsigned int mgustdir; /* in 5 degree steps */ #define DAC1FID21_MGUSTDIR_NOT_AVAILABLE 127 unsigned int airtemp; /* degress K */ #define DAC1FID21_AIRTEMP_OFFSET 223 unsigned humidity; /* units of 1% */ #define DAC1FID21_HUMIDITY_NOT_VAILABLE 127 /* some trailing fields are missing */ } wmo_obs; }; } dac1fid21; /*** WORK IN PROGRESS ENDS HERE ***/ /* IMO289 - Dangerous Cargo Indication */ struct { unsigned int unit; /* Unit of Quantity */ unsigned int amount; /* Amount of Cargo */ int ncargos; struct cargo_t { unsigned int code; /* Cargo code */ unsigned int subtype; /* Cargo subtype */ } cargos[28]; } dac1fid25; /* IMO289 - Route info (addressed) */ struct route_info dac1fid28; /* IMO289 - Text message (addressed) */ struct { unsigned int linkage; #define AIS_DAC1FID30_TEXT_MAX 154 /* 920 bits of six-bit, plus NUL */ char text[AIS_DAC1FID30_TEXT_MAX]; } dac1fid30; /* IMO289 & IMO236 - Tidal Window */ struct { unsigned int month; /* Month */ unsigned int day; /* Day */ signed int ntidals; struct tidal_t { signed int lon; /* Longitude */ signed int lat; /* Latitude */ unsigned int from_hour; /* From UTC Hour */ unsigned int from_min; /* From UTC Minute */ unsigned int to_hour; /* To UTC Hour */ unsigned int to_min; /* To UTC Minute */ #define DAC1FID32_CDIR_NOT_AVAILABLE 360 unsigned int cdir; /* Current Dir. Predicted */ #define DAC1FID32_CSPEED_NOT_AVAILABLE 127 unsigned int cspeed; /* Current Speed Predicted */ } tidals[3]; } dac1fid32; }; } type6; /* Type 7 - Binary Acknowledge */ struct { unsigned int mmsi1; unsigned int mmsi2; unsigned int mmsi3; unsigned int mmsi4; /* spares ignored, they're only padding here */ } type7; /* Type 8 - Broadcast Binary Message */ struct { unsigned int dac; /* Designated Area Code */ unsigned int fid; /* Functional ID */ #define AIS_TYPE8_BINARY_MAX 952 /* 952 bits */ size_t bitcount; /* bit count of the data */ bool structured; /* True match for DAC/FID? */ union { char bitdata[(AIS_TYPE8_BINARY_MAX + 7) / 8]; /* Inland static ship and voyage-related data */ struct { char vin[8+1]; /* European Vessel ID */ unsigned int length; /* Length of ship */ unsigned int beam; /* Beam of ship */ unsigned int shiptype; /* Ship/combination type */ unsigned int hazard; /* Hazardous cargo */ #define DAC200FID10_HAZARD_MAX 5 unsigned int draught; /* Draught */ unsigned int loaded; /* Loaded/Unloaded */ bool speed_q; /* Speed inf. quality */ bool course_q; /* Course inf. quality */ bool heading_q; /* Heading inf. quality */ } dac200fid10; /* Inland AIS EMMA Warning */ struct { unsigned int start_year; /* Start Year */ unsigned int start_month; /* Start Month */ unsigned int start_day; /* Start Day */ unsigned int end_year; /* End Year */ unsigned int end_month; /* End Month */ unsigned int end_day; /* End Day */ unsigned int start_hour; /* Start Hour */ unsigned int start_minute; /* Start Minute */ unsigned int end_hour; /* End Hour */ unsigned int end_minute; /* End Minute */ signed int start_lon; /* Start Longitude */ signed int start_lat; /* Start Latitude */ signed int end_lon; /* End Longitude */ signed int end_lat; /* End Latitude */ unsigned int type; /* Type */ #define DAC200FID23_TYPE_UNKNOWN 0 signed int min; /* Min value */ #define DAC200FID23_MIN_UNKNOWN 255 signed int max; /* Max value */ #define DAC200FID23_MAX_UNKNOWN 255 unsigned int intensity; /* Classification */ #define DAC200FID23_CLASS_UNKNOWN 0 unsigned int wind; /* Wind Direction */ #define DAC200FID23_WIND_UNKNOWN 0 } dac200fid23; struct { char country[2+1]; /* UN Country Code */ signed int ngauges; struct gauge_t { unsigned int id; /* Gauge ID */ #define DAC200FID24_GAUGE_ID_UNKNOWN 0 signed int level; /* Water Level */ #define DAC200FID24_GAUGE_LEVEL_UNKNOWN 0 } gauges[4]; } dac200fid24; struct { signed int lon; /* Signal Longitude */ signed int lat; /* Signal Latitude */ unsigned int form; /* Signal form */ #define DAC200FID40_FORM_UNKNOWN 0 unsigned int facing; /* Signal orientation */ #define DAC200FID40_FACING_UNKNOWN 0 unsigned int direction; /* Direction of impact */ #define DAC200FID40_DIRECTION_UNKNOWN 0 unsigned int status; /* Light Status */ #define DAC200FID40_STATUS_UNKNOWN 0 } dac200fid40; /* IMO236 - Meteorological-Hydrological data * Trial message, not to be used after January 2013 * Replaced by IMO289 (DAC 1, FID 31) */ struct { #define DAC1FID11_LATLON_SCALE 1000 int lon; /* longitude in minutes * .001 */ #define DAC1FID11_LON_NOT_AVAILABLE 0xFFFFFF int lat; /* latitude in minutes * .001 */ #define DAC1FID11_LAT_NOT_AVAILABLE 0x7FFFFF unsigned int day; /* UTC day */ unsigned int hour; /* UTC hour */ unsigned int minute; /* UTC minute */ unsigned int wspeed; /* average wind speed */ unsigned int wgust; /* wind gust */ #define DAC1FID11_WSPEED_NOT_AVAILABLE 127 unsigned int wdir; /* wind direction */ unsigned int wgustdir; /* wind gust direction */ #define DAC1FID11_WDIR_NOT_AVAILABLE 511 unsigned int airtemp; /* temperature, units 0.1C */ #define DAC1FID11_AIRTEMP_NOT_AVAILABLE 2047 #define DAC1FID11_AIRTEMP_OFFSET 600 #define DAC1FID11_AIRTEMP_DIV 10.0 unsigned int humidity; /* relative humidity, % */ #define DAC1FID11_HUMIDITY_NOT_AVAILABLE 127 unsigned int dewpoint; /* dew point, units 0.1C */ #define DAC1FID11_DEWPOINT_NOT_AVAILABLE 1023 #define DAC1FID11_DEWPOINT_OFFSET 200 #define DAC1FID11_DEWPOINT_DIV 10.0 unsigned int pressure; /* air pressure, hpa */ #define DAC1FID11_PRESSURE_NOT_AVAILABLE 511 #define DAC1FID11_PRESSURE_OFFSET -800 unsigned int pressuretend; /* tendency */ #define DAC1FID11_PRESSURETREND_NOT_AVAILABLE 3 unsigned int visibility; /* units 0.1 nautical miles */ #define DAC1FID11_VISIBILITY_NOT_AVAILABLE 255 #define DAC1FID11_VISIBILITY_DIV 10.0 int waterlevel; /* decimeters */ #define DAC1FID11_WATERLEVEL_NOT_AVAILABLE 511 #define DAC1FID11_WATERLEVEL_OFFSET 100 #define DAC1FID11_WATERLEVEL_DIV 10.0 unsigned int leveltrend; /* water level trend code */ #define DAC1FID11_WATERLEVELTREND_NOT_AVAILABLE 3 unsigned int cspeed; /* surface current speed in deciknots */ #define DAC1FID11_CSPEED_NOT_AVAILABLE 255 #define DAC1FID11_CSPEED_DIV 10.0 unsigned int cdir; /* surface current dir., degrees */ #define DAC1FID11_CDIR_NOT_AVAILABLE 511 unsigned int cspeed2; /* current speed in deciknots */ unsigned int cdir2; /* current dir., degrees */ unsigned int cdepth2; /* measurement depth, m */ #define DAC1FID11_CDEPTH_NOT_AVAILABLE 31 unsigned int cspeed3; /* current speed in deciknots */ unsigned int cdir3; /* current dir., degrees */ unsigned int cdepth3; /* measurement depth, m */ unsigned int waveheight; /* in decimeters */ #define DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE 255 #define DAC1FID11_WAVEHEIGHT_DIV 10.0 unsigned int waveperiod; /* in seconds */ #define DAC1FID11_WAVEPERIOD_NOT_AVAILABLE 63 unsigned int wavedir; /* direction in degrees */ #define DAC1FID11_WAVEDIR_NOT_AVAILABLE 511 unsigned int swellheight; /* in decimeters */ unsigned int swellperiod; /* in seconds */ unsigned int swelldir; /* direction in degrees */ unsigned int seastate; /* Beaufort scale, 0-12 */ #define DAC1FID11_SEASTATE_NOT_AVAILABLE 15 unsigned int watertemp; /* units 0.1deg Celsius */ #define DAC1FID11_WATERTEMP_NOT_AVAILABLE 1023 #define DAC1FID11_WATERTEMP_OFFSET 100 #define DAC1FID11_WATERTEMP_DIV 10.0 unsigned int preciptype; /* 0-7, enumerated */ #define DAC1FID11_PRECIPTYPE_NOT_AVAILABLE 7 unsigned int salinity; /* units of 0.1ppt */ #define DAC1FID11_SALINITY_NOT_AVAILABLE 511 #define DAC1FID11_SALINITY_DIV 10.0 unsigned int ice; /* is there sea ice? */ #define DAC1FID11_ICE_NOT_AVAILABLE 3 } dac1fid11; /* IMO236 - Fairway Closed */ struct { char reason[20+1]; /* Reason For Closing */ char closefrom[20+1]; /* Location Of Closing From */ char closeto[20+1]; /* Location of Closing To */ unsigned int radius; /* Radius extension */ #define AIS_DAC1FID13_RADIUS_NOT_AVAILABLE 10001 unsigned int extunit; /* Unit of extension */ #define AIS_DAC1FID13_EXTUNIT_NOT_AVAILABLE 0 unsigned int fday; /* From day (UTC) */ unsigned int fmonth; /* From month (UTC) */ unsigned int fhour; /* From hour (UTC) */ unsigned int fminute; /* From minute (UTC) */ unsigned int tday; /* To day (UTC) */ unsigned int tmonth; /* To month (UTC) */ unsigned int thour; /* To hour (UTC) */ unsigned int tminute; /* To minute (UTC) */ } dac1fid13; /* IMO236 - Extended ship and voyage data */ struct { unsigned int airdraught; /* Air Draught */ } dac1fid15; /* IMO286 - Number of Persons on board */ struct { unsigned persons; /* number of persons */ } dac1fid16; /* IMO289 - VTS-generated/Synthetic Targets */ struct { signed int ntargets; struct target_t { #define DAC1FID17_IDTYPE_MMSI 0 #define DAC1FID17_IDTYPE_IMO 1 #define DAC1FID17_IDTYPE_CALLSIGN 2 #define DAC1FID17_IDTYPE_OTHER 3 unsigned int idtype; /* Identifier type */ union target_id { /* Target identifier */ unsigned int mmsi; unsigned int imo; #define DAC1FID17_ID_LENGTH 7 char callsign[DAC1FID17_ID_LENGTH+1]; char other[DAC1FID17_ID_LENGTH+1]; } id; signed int lat; /* Latitude */ signed int lon; /* Longitude */ #define DAC1FID17_COURSE_NOT_AVAILABLE 360 unsigned int course; /* Course Over Ground */ unsigned int second; /* Time Stamp */ #define DAC1FID17_SPEED_NOT_AVAILABLE 255 unsigned int speed; /* Speed Over Ground */ } targets[4]; } dac1fid17; /* IMO 289 - Marine Traffic Signal */ struct { unsigned int linkage; /* Message Linkage ID */ char station[20+1]; /* Name of Signal Station */ signed int lon; /* Longitude */ signed int lat; /* Latitude */ unsigned int status; /* Status of Signal */ unsigned int signal; /* Signal In Service */ unsigned int hour; /* UTC hour */ unsigned int minute; /* UTC minute */ unsigned int nextsignal; /* Expected Next Signal */ } dac1fid19; /* IMO289 - Route info (broadcast) */ struct route_info dac1fid27; /* IMO289 - Text message (broadcast) */ struct { unsigned int linkage; #define AIS_DAC1FID29_TEXT_MAX 162 /* 920 bits of six-bit, plus NUL */ char text[AIS_DAC1FID29_TEXT_MAX]; } dac1fid29; /* IMO289 - Meteorological-Hydrological data */ struct { bool accuracy; /* position accuracy, <10m if true */ #define DAC1FID31_LATLON_SCALE 1000 int lon; /* longitude in minutes * .001 */ #define DAC1FID31_LON_NOT_AVAILABLE (181*60*DAC1FID31_LATLON_SCALE) int lat; /* longitude in minutes * .001 */ #define DAC1FID31_LAT_NOT_AVAILABLE (91*60*DAC1FID31_LATLON_SCALE) unsigned int day; /* UTC day */ unsigned int hour; /* UTC hour */ unsigned int minute; /* UTC minute */ unsigned int wspeed; /* average wind speed */ unsigned int wgust; /* wind gust */ #define DAC1FID31_WIND_HIGH 126 #define DAC1FID31_WIND_NOT_AVAILABLE 127 unsigned int wdir; /* wind direction */ unsigned int wgustdir; /* wind gust direction */ #define DAC1FID31_DIR_NOT_AVAILABLE 360 int airtemp; /* temperature, units 0.1C */ #define DAC1FID31_AIRTEMP_NOT_AVAILABLE -1024 #define DAC1FID31_AIRTEMP_DIV 10.0 unsigned int humidity; /* relative humidity, % */ #define DAC1FID31_HUMIDITY_NOT_AVAILABLE 101 int dewpoint; /* dew point, units 0.1C */ #define DAC1FID31_DEWPOINT_NOT_AVAILABLE 501 #define DAC1FID31_DEWPOINT_DIV 10.0 unsigned int pressure; /* air pressure, hpa */ #define DAC1FID31_PRESSURE_NOT_AVAILABLE 511 #define DAC1FID31_PRESSURE_HIGH 402 #define DAC1FID31_PRESSURE_OFFSET -799 unsigned int pressuretend; /* tendency */ #define DAC1FID31_PRESSURETEND_NOT_AVAILABLE 3 bool visgreater; /* visibility greater than */ unsigned int visibility; /* units 0.1 nautical miles */ #define DAC1FID31_VISIBILITY_NOT_AVAILABLE 127 #define DAC1FID31_VISIBILITY_DIV 10.0 int waterlevel; /* cm */ #define DAC1FID31_WATERLEVEL_NOT_AVAILABLE 4001 #define DAC1FID31_WATERLEVEL_OFFSET 1000 #define DAC1FID31_WATERLEVEL_DIV 100.0 unsigned int leveltrend; /* water level trend code */ #define DAC1FID31_WATERLEVELTREND_NOT_AVAILABLE 3 unsigned int cspeed; /* current speed in deciknots */ #define DAC1FID31_CSPEED_NOT_AVAILABLE 255 #define DAC1FID31_CSPEED_DIV 10.0 unsigned int cdir; /* current dir., degrees */ unsigned int cspeed2; /* current speed in deciknots */ unsigned int cdir2; /* current dir., degrees */ unsigned int cdepth2; /* measurement depth, 0.1m */ #define DAC1FID31_CDEPTH_NOT_AVAILABLE 301 #define DAC1FID31_CDEPTH_SCALE 10.0 unsigned int cspeed3; /* current speed in deciknots */ unsigned int cdir3; /* current dir., degrees */ unsigned int cdepth3; /* measurement depth, 0.1m */ unsigned int waveheight; /* in decimeters */ #define DAC1FID31_HEIGHT_NOT_AVAILABLE 31 #define DAC1FID31_HEIGHT_DIV 10.0 unsigned int waveperiod; /* in seconds */ #define DAC1FID31_PERIOD_NOT_AVAILABLE 63 unsigned int wavedir; /* direction in degrees */ unsigned int swellheight; /* in decimeters */ unsigned int swellperiod; /* in seconds */ unsigned int swelldir; /* direction in degrees */ unsigned int seastate; /* Beaufort scale, 0-12 */ #define DAC1FID31_SEASTATE_NOT_AVAILABLE 15 int watertemp; /* units 0.1deg Celsius */ #define DAC1FID31_WATERTEMP_NOT_AVAILABLE 601 #define DAC1FID31_WATERTEMP_DIV 10.0 unsigned int preciptype; /* 0-7, enumerated */ #define DAC1FID31_PRECIPTYPE_NOT_AVAILABLE 7 unsigned int salinity; /* units of 0.1 permil (ca. PSU) */ #define DAC1FID31_SALINITY_NOT_AVAILABLE 510 #define DAC1FID31_SALINITY_DIV 10.0 unsigned int ice; /* is there sea ice? */ #define DAC1FID31_ICE_NOT_AVAILABLE 3 } dac1fid31; }; } type8; /* Type 9 - Standard SAR Aircraft Position Report */ struct { unsigned int alt; /* altitude in meters */ #define AIS_ALT_NOT_AVAILABLE 4095 #define AIS_ALT_HIGH 4094 /* 4094 meters or higher */ unsigned int speed; /* speed over ground in deciknots */ #define AIS_SAR_SPEED_NOT_AVAILABLE 1023 #define AIS_SAR_FAST_MOVER 1022 bool accuracy; /* position accuracy */ int lon; /* longitude */ int lat; /* latitude */ unsigned int course; /* course over ground */ unsigned int second; /* seconds of UTC timestamp */ unsigned int regional; /* regional reserved */ unsigned int dte; /* data terminal enable */ //unsigned int spare; spare bits */ bool assigned; /* assigned-mode flag */ bool raim; /* RAIM flag */ unsigned int radio; /* radio status bits */ } type9; /* Type 10 - UTC/Date Inquiry */ struct { //unsigned int spare; unsigned int dest_mmsi; /* destination MMSI */ //unsigned int spare2; } type10; /* Type 12 - Safety-Related Message */ struct { unsigned int seqno; /* sequence number */ unsigned int dest_mmsi; /* destination MMSI */ bool retransmit; /* retransmit flag */ //unsigned int spare; spare bit(s) */ #define AIS_TYPE12_TEXT_MAX 157 /* 936 bits of six-bit, plus NUL */ char text[AIS_TYPE12_TEXT_MAX]; } type12; /* Type 14 - Safety-Related Broadcast Message */ struct { //unsigned int spare; spare bit(s) */ #define AIS_TYPE14_TEXT_MAX 161 /* 952 bits of six-bit, plus NUL */ char text[AIS_TYPE14_TEXT_MAX]; } type14; /* Type 15 - Interrogation */ struct { //unsigned int spare; spare bit(s) */ unsigned int mmsi1; unsigned int type1_1; unsigned int offset1_1; //unsigned int spare2; spare bit(s) */ unsigned int type1_2; unsigned int offset1_2; //unsigned int spare3; spare bit(s) */ unsigned int mmsi2; unsigned int type2_1; unsigned int offset2_1; //unsigned int spare4; spare bit(s) */ } type15; /* Type 16 - Assigned Mode Command */ struct { //unsigned int spare; spare bit(s) */ unsigned int mmsi1; unsigned int offset1; unsigned int increment1; unsigned int mmsi2; unsigned int offset2; unsigned int increment2; } type16; /* Type 17 - GNSS Broadcast Binary Message */ struct { //unsigned int spare; spare bit(s) */ #define AIS_GNSS_LATLON_DIV 600.0 int lon; /* longitude */ int lat; /* latitude */ //unsigned int spare2; spare bit(s) */ #define AIS_TYPE17_BINARY_MAX 736 /* 920 bits */ size_t bitcount; /* bit count of the data */ char bitdata[(AIS_TYPE17_BINARY_MAX + 7) / 8]; } type17; /* Type 18 - Standard Class B CS Position Report */ struct { unsigned int reserved; /* altitude in meters */ unsigned int speed; /* speed over ground in deciknots */ bool accuracy; /* position accuracy */ int lon; /* longitude */ #define AIS_GNS_LON_NOT_AVAILABLE 0x1a838 int lat; /* latitude */ #define AIS_GNS_LAT_NOT_AVAILABLE 0xd548 unsigned int course; /* course over ground */ unsigned int heading; /* true heading */ unsigned int second; /* seconds of UTC timestamp */ unsigned int regional; /* regional reserved */ bool cs; /* carrier sense unit flag */ bool display; /* unit has attached display? */ bool dsc; /* unit attached to radio with DSC? */ bool band; /* unit can switch frequency bands? */ bool msg22; /* can accept Message 22 management? */ bool assigned; /* assigned-mode flag */ bool raim; /* RAIM flag */ unsigned int radio; /* radio status bits */ } type18; /* Type 19 - Extended Class B CS Position Report */ struct { unsigned int reserved; /* altitude in meters */ unsigned int speed; /* speed over ground in deciknots */ bool accuracy; /* position accuracy */ int lon; /* longitude */ int lat; /* latitude */ unsigned int course; /* course over ground */ unsigned int heading; /* true heading */ unsigned int second; /* seconds of UTC timestamp */ unsigned int regional; /* regional reserved */ char shipname[AIS_SHIPNAME_MAXLEN+1]; /* ship name */ unsigned int shiptype; /* ship type code */ unsigned int to_bow; /* dimension to bow */ unsigned int to_stern; /* dimension to stern */ unsigned int to_port; /* dimension to port */ unsigned int to_starboard; /* dimension to starboard */ unsigned int epfd; /* type of position fix deviuce */ bool raim; /* RAIM flag */ unsigned int dte; /* date terminal enable */ bool assigned; /* assigned-mode flag */ //unsigned int spare; spare bits */ } type19; /* Type 20 - Data Link Management Message */ struct { //unsigned int spare; spare bit(s) */ unsigned int offset1; /* TDMA slot offset */ unsigned int number1; /* number of xlots to allocate */ unsigned int timeout1; /* allocation timeout */ unsigned int increment1; /* repeat increment */ unsigned int offset2; /* TDMA slot offset */ unsigned int number2; /* number of xlots to allocate */ unsigned int timeout2; /* allocation timeout */ unsigned int increment2; /* repeat increment */ unsigned int offset3; /* TDMA slot offset */ unsigned int number3; /* number of xlots to allocate */ unsigned int timeout3; /* allocation timeout */ unsigned int increment3; /* repeat increment */ unsigned int offset4; /* TDMA slot offset */ unsigned int number4; /* number of xlots to allocate */ unsigned int timeout4; /* allocation timeout */ unsigned int increment4; /* repeat increment */ } type20; /* Type 21 - Aids to Navigation Report */ struct { unsigned int aid_type; /* aid type */ char name[35]; /* name of aid to navigation */ bool accuracy; /* position accuracy */ int lon; /* longitude */ int lat; /* latitude */ unsigned int to_bow; /* dimension to bow */ unsigned int to_stern; /* dimension to stern */ unsigned int to_port; /* dimension to port */ unsigned int to_starboard; /* dimension to starboard */ unsigned int epfd; /* type of EPFD */ unsigned int second; /* second of UTC timestamp */ bool off_position; /* off-position indicator */ unsigned int regional; /* regional reserved field */ bool raim; /* RAIM flag */ bool virtual_aid; /* is virtual station? */ bool assigned; /* assigned-mode flag */ //unsigned int spare; unused */ } type21; /* Type 22 - Channel Management */ struct { //unsigned int spare; spare bit(s) */ unsigned int channel_a; /* Channel A number */ unsigned int channel_b; /* Channel B number */ unsigned int txrx; /* transmit/receive mode */ bool power; /* high-power flag */ #define AIS_CHANNEL_LATLON_DIV 600.0 union { struct { int ne_lon; /* NE corner longitude */ int ne_lat; /* NE corner latitude */ int sw_lon; /* SW corner longitude */ int sw_lat; /* SW corner latitude */ } area; struct { unsigned int dest1; /* addressed station MMSI 1 */ unsigned int dest2; /* addressed station MMSI 2 */ } mmsi; }; bool addressed; /* addressed vs. broadast flag */ bool band_a; /* fix 1.5kHz band for channel A */ bool band_b; /* fix 1.5kHz band for channel B */ unsigned int zonesize; /* size of transitional zone */ } type22; /* Type 23 - Group Assignment Command */ struct { int ne_lon; /* NE corner longitude */ int ne_lat; /* NE corner latitude */ int sw_lon; /* SW corner longitude */ int sw_lat; /* SW corner latitude */ //unsigned int spare; spare bit(s) */ unsigned int stationtype; /* station type code */ unsigned int shiptype; /* ship type code */ //unsigned int spare2; spare bit(s) */ unsigned int txrx; /* transmit-enable code */ unsigned int interval; /* report interval */ unsigned int quiet; /* quiet time */ //unsigned int spare3; spare bit(s) */ } type23; /* Type 24 - Class B CS Static Data Report */ struct { char shipname[AIS_SHIPNAME_MAXLEN+1]; /* vessel name */ enum { both, part_a, part_b, } part; unsigned int shiptype; /* ship type code */ char vendorid[8]; /* vendor ID */ unsigned int model; /* unit model code */ unsigned int serial; /* serial number */ char callsign[8]; /* callsign */ union { unsigned int mothership_mmsi; /* MMSI of main vessel */ struct { unsigned int to_bow; /* dimension to bow */ unsigned int to_stern; /* dimension to stern */ unsigned int to_port; /* dimension to port */ unsigned int to_starboard; /* dimension to starboard */ } dim; }; } type24; /* Type 25 - Addressed Binary Message */ struct { bool addressed; /* addressed-vs.broadcast flag */ bool structured; /* structured-binary flag */ unsigned int dest_mmsi; /* destination MMSI */ unsigned int app_id; /* Application ID */ #define AIS_TYPE25_BINARY_MAX 128 /* Up to 128 bits */ size_t bitcount; /* bit count of the data */ char bitdata[(AIS_TYPE25_BINARY_MAX + 7) / 8]; } type25; /* Type 26 - Addressed Binary Message */ struct { bool addressed; /* addressed-vs.broadcast flag */ bool structured; /* structured-binary flag */ unsigned int dest_mmsi; /* destination MMSI */ unsigned int app_id; /* Application ID */ #define AIS_TYPE26_BINARY_MAX 1004 /* Up to 128 bits */ size_t bitcount; /* bit count of the data */ char bitdata[(AIS_TYPE26_BINARY_MAX + 7) / 8]; unsigned int radio; /* radio status bits */ } type26; /* Type 27 - Long Range AIS Broadcast message */ struct { bool accuracy; /* position accuracy */ bool raim; /* RAIM flag */ unsigned int status; /* navigation status */ #define AIS_LONGRANGE_LATLON_DIV 600.0 int lon; /* longitude */ #define AIS_LONGRANGE_LON_NOT_AVAILABLE 0x1a838 int lat; /* latitude */ #define AIS_LONGRANGE_LAT_NOT_AVAILABLE 0xd548 unsigned int speed; /* speed over ground in deciknots */ #define AIS_LONGRANGE_SPEED_NOT_AVAILABLE 63 unsigned int course; /* course over ground */ #define AIS_LONGRANGE_COURSE_NOT_AVAILABLE 511 bool gnss; /* are we reporting GNSS position? */ } type27; }; }; struct satellite_t { double ss; /* signal-to-noise ratio (dB) */ bool used; /* PRNs of satellites used in solution */ short PRN; /* PRNs of satellite */ short elevation; /* elevation of satellite */ short azimuth; /* azimuth */ }; 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 mag_st; char pitch_st; char roll_st; char yaw_st; }; struct navdata_t { unsigned int version; double compass_heading; double compass_deviation; double compass_variation; double air_temp; double air_pressure; double water_temp; double depth; double depth_offset; double wind_speed; double wind_dir; double crosstrack_error; unsigned int compass_status; unsigned int log_cumulative; unsigned int log_trip; unsigned int crosstrack_status; }; struct dop_t { /* Dilution of precision factors */ double xdop, ydop, pdop, hdop, vdop, tdop, gdop; }; struct rawdata_t { /* raw measurement data */ double codephase[MAXCHANNELS]; /* meters */ double carrierphase[MAXCHANNELS]; /* meters */ double pseudorange[MAXCHANNELS]; /* meters */ double deltarange[MAXCHANNELS]; /* meters/sec */ double doppler[MAXCHANNELS]; /* Hz */ double mtime[MAXCHANNELS]; /* sec */ unsigned satstat[MAXCHANNELS]; /* tracking status */ #define SAT_ACQUIRED 0x01 /* satellite acquired */ #define SAT_CODE_TRACK 0x02 /* code-tracking loop acquired */ #define SAT_CARR_TRACK 0x04 /* carrier-tracking loop acquired */ #define SAT_DATA_SYNC 0x08 /* data-bit synchronization done */ #define SAT_FRAME_SYNC 0x10 /* frame synchronization done */ #define SAT_EPHEMERIS 0x20 /* ephemeris collected */ #define SAT_FIX_USED 0x40 /* used for position fix */ }; struct version_t { char release[64]; /* external version */ char rev[64]; /* internal revision ID */ int proto_major, proto_minor; /* API major and minor versions */ char remote[GPS_PATH_MAX]; /* could be from a remote device */ }; struct devconfig_t { char path[GPS_PATH_MAX]; int flags; #define SEEN_GPS 0x01 #define SEEN_RTCM2 0x02 #define SEEN_RTCM3 0x04 #define SEEN_AIS 0x08 char driver[64]; char subtype[64]; double activated; unsigned int baudrate, stopbits; /* RS232 link parameters */ char parity; /* 'N', 'O', or 'E' */ double cycle, mincycle; /* refresh cycle time in seconds */ int driver_mode; /* is driver in native mode or not? */ }; struct policy_t { bool watcher; /* is watcher mode on? */ bool json; /* requesting JSON? */ bool nmea; /* requesting dumping as NMEA? */ int raw; /* requesting raw data? */ bool scaled; /* requesting report scaling? */ bool timing; /* requesting timing info */ bool split24; /* requesting split AIS Type 24s */ bool pps; /* requesting PPS in NMEA/raw modes */ int loglevel; /* requested log level of messages */ char devpath[GPS_PATH_MAX]; /* specific device to watch */ char remote[GPS_PATH_MAX]; /* ...if this was passthrough */ }; #ifndef TIMEDELTA_DEFINED #define TIMEDELTA_DEFINED struct timedelta_t { struct timespec real; struct timespec clock; }; #endif /* TIMEDELTA_DEFINED */ /* * 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, * as it makes clearer what some declarations are doing without breaking * binary compatibility. */ typedef int socket_t; #define BAD_SOCKET(s) ((s) == -1) #define INVALIDATE_SOCKET(s) do { s = -1; } while (0) /* mode flags for setting streaming policy */ #define WATCH_ENABLE 0x000001u /* enable streaming */ #define WATCH_DISABLE 0x000002u /* disable watching */ #define WATCH_JSON 0x000010u /* JSON output */ #define WATCH_NMEA 0x000020u /* output in NMEA */ #define WATCH_RARE 0x000040u /* output of packets in hex */ #define WATCH_RAW 0x000080u /* output of raw packets */ #define WATCH_SCALED 0x000100u /* scale output to floats */ #define WATCH_TIMING 0x000200u /* timing information */ #define WATCH_DEVICE 0x000800u /* watch specific device */ #define WATCH_SPLIT24 0x001000u /* split AIS Type 24s */ #define WATCH_PPS 0x002000u /* enable PPS JSON */ #define WATCH_NEWSTYLE 0x010000u /* force JSON streaming */ /* * 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 (1llu<<1) #define TIME_SET (1llu<<2) #define TIMERR_SET (1llu<<3) #define LATLON_SET (1llu<<4) #define ALTITUDE_SET (1llu<<5) #define SPEED_SET (1llu<<6) #define TRACK_SET (1llu<<7) #define CLIMB_SET (1llu<<8) #define STATUS_SET (1llu<<9) #define MODE_SET (1llu<<10) #define DOP_SET (1llu<<11) #define HERR_SET (1llu<<12) #define VERR_SET (1llu<<13) #define ATTITUDE_SET (1llu<<14) #define SATELLITE_SET (1llu<<15) #define SPEEDERR_SET (1llu<<16) #define TRACKERR_SET (1llu<<17) #define CLIMBERR_SET (1llu<<18) #define DEVICE_SET (1llu<<19) #define DEVICELIST_SET (1llu<<20) #define DEVICEID_SET (1llu<<21) #define RTCM2_SET (1llu<<22) #define RTCM3_SET (1llu<<23) #define AIS_SET (1llu<<24) #define PACKET_SET (1llu<<25) #define SUBFRAME_SET (1llu<<26) #define GST_SET (1llu<<27) #define VERSION_SET (1llu<<28) #define POLICY_SET (1llu<<29) #define LOGMESSAGE_SET (1llu<<30) #define ERROR_SET (1llu<<31) #define TOFF_SET (1llu<<32) /* not yet used */ #define PPS_SET (1llu<<33) #define NAVDATA_SET (1llu<<34) #define SET_HIGH_BIT 35 timestamp_t online; /* NZ if GPS is on line, 0 if not. * * Note: gpsd clears this time when sentences * fail to show up within the GPS's normal * send cycle time. If the host-to-GPS * link is lossy enough to drop entire * sentences, this field will be * prone to false zero values. */ #ifndef USE_QT socket_t gps_fd; /* socket or file descriptor to GPS */ #else void* gps_fd; #endif struct gps_fix_t fix; /* accumulated PVT data */ /* this should move to the per-driver structure */ double separation; /* Geoidal separation, MSL - WGS84 (Meters) */ /* GPS status -- always valid */ int status; /* Do we have a fix? */ #define STATUS_NO_FIX 0 /* no */ #define STATUS_FIX 1 /* yes */ /* precision of fix -- valid if satellites_used > 0 */ int satellites_used; /* Number of satellites used in solution */ struct dop_t dop; /* redundant with the estimate elements in the fix structure */ double epe; /* spherical position error, 95% confidence (meters) */ /* satellite status -- valid when satellites_visible > 0 */ timestamp_t skyview_time; /* skyview timestamp */ int satellites_visible; /* # of satellites in view */ struct satellite_t skyview[MAXCHANNELS]; struct devconfig_t dev; /* device that shipped last update */ struct policy_t policy; /* our listening policy */ struct { timestamp_t time; int ndevices; struct devconfig_t list[MAXUSERDEVS]; } devices; /* pack things never reported together to reduce structure size */ #define UNION_SET (RTCM2_SET|RTCM3_SET|SUBFRAME_SET|AIS_SET|ATTITUDE_SET|GST_SET|VERSION_SET|LOGMESSAGE_SET|ERROR_SET|TOFF_SET|PPS_SET) union { /* unusual forms of sensor data that might come up the pipe */ struct rtcm2_t rtcm2; struct rtcm3_t rtcm3; struct subframe_t subframe; struct ais_t ais; struct attitude_t attitude; struct navdata_t navdata; struct rawdata_t raw; struct gst_t gst; /* "artificial" structures for various protocol responses */ struct version_t version; char error[256]; struct timedelta_t toff; struct timedelta_t pps; }; /* FIXME! next lib rev need to add a place to put PPS precision */ /* Private data - client code must not set this */ void *privdata; }; extern int gps_open(const char *, const char *, struct gps_data_t *); extern int gps_close(struct gps_data_t *); extern int gps_send(struct gps_data_t *, const char *, ... ); extern int gps_read(struct gps_data_t *); extern int gps_unpack(char *, struct gps_data_t *); extern bool gps_waiting(const struct gps_data_t *, int); extern int gps_stream(struct gps_data_t *, unsigned int, void *); extern int gps_mainloop(struct gps_data_t *, int, void (*)(struct gps_data_t *)); extern const char *gps_data(const struct gps_data_t *); extern const char *gps_errstr(const int); int json_toff_read(const char *buf, struct gps_data_t *, const char **); int json_pps_read(const char *buf, struct gps_data_t *, const char **); /* dependencies on struct gpsdata_t end here */ extern void libgps_trace(int errlevel, const char *, ...); extern void gps_clear_fix(struct gps_fix_t *); extern void gps_clear_dop( struct dop_t *); extern void gps_merge_fix(struct gps_fix_t *, gps_mask_t, struct gps_fix_t *); extern void gps_enable_debug(int, FILE *); extern const char *gps_maskdump(gps_mask_t); extern double safe_atof(const char *); extern time_t mkgmtime(register struct tm *); extern timestamp_t timestamp(void); extern timestamp_t iso8601_to_unix(char *); extern char *unix_to_iso8601(timestamp_t t, char[], size_t len); extern double earth_distance(double, double, double, double); extern double earth_distance_and_bearings(double, double, double, double, double *, double *); extern double wgs84_separation(double, double); /* 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 */ #define METERS_TO_FATHOMS 0.54680665 /* Meters to fathoms */ #define KNOTS_TO_MPH 1.1507794 /* Knots to miles per hour */ #define KNOTS_TO_KPH 1.852 /* Knots to kilometers per hour */ #define KNOTS_TO_MPS 0.51444444 /* Knots to meters per second */ #define MPS_TO_KPH 3.6 /* Meters per second to klicks/hr */ #define MPS_TO_MPH 2.2369363 /* Meters/second to miles per hour */ #define MPS_TO_KNOTS 1.9438445 /* Meters per second to knots */ /* miles and knots are both the international standard versions of the units */ /* angle conversion multipliers */ #define GPS_PI 3.1415926535897932384626433832795029 #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 */ /* netlib_connectsock() errno return values */ #define NL_NOSERVICE -1 /* can't get service entry */ #define NL_NOHOST -2 /* can't get host entry */ #define NL_NOPROTO -3 /* can't get protocol entry */ #define NL_NOSOCK -4 /* can't create socket */ #define NL_NOSOCKOPT -5 /* error SETSOCKOPT SO_REUSEADDR */ #define NL_NOCONNECT -6 /* can't connect to host/socket pair */ #define SHM_NOSHARED -7 /* shared-memory segment not available */ #define SHM_NOATTACH -8 /* shared-memory attach failed */ #define DBUS_FAILURE -9 /* DBUS initialization failure */ #define DEFAULT_GPSD_PORT "2947" /* IANA assignment */ #define DEFAULT_RTCM_PORT "2101" /* IANA assignment */ /* special host values for non-socket exports */ #define GPSD_SHARED_MEMORY "shared memory" #define GPSD_DBUS_EXPORT "DBUS export" #ifdef __cplusplus } /* End of the 'extern "C"' block */ #endif #endif /* _GPSD_GPS_H_ */ /* gps.h ends here */ gpsd-3.15/gps.xml0000664000175000017500000003377212520742615012100 0ustar esresr 9 Aug 2004 gps 1 The GPSD Project GPSD Documentation gps xgps xgpsspeed cgps lcdgps gegps test clients for gpsd xgps -D debug-level -h -V -l dms -u inm server :port :device xgpsspeed -D debug-level -h -V --speedunits mphkphknots server :port :device cgps -D debug-level -h -V -l dms -m -s -u inm server :port :device lcdgps -h -V -l dms -u inm server :port :device gpxlogger -D debug-level -d -e export-method -f filename -l -m minmove -h -V -i track timeout server :port :device gegps -d directory -i DESCRIPTION These are the demonstration clients shipped with gpsd. They have some common options: The option causes each client to emit a summary of its options and then exit. The option causes each client to dump the package version and exit. The option, when present, sets the format of latitude and longitude reports. The value 'd' produces decimal degrees and is the default. The value 'm' produces degrees and decimal minutes. The value 's' produces degrees, minutes, and decimal seconds. xgps, cgps, and lcdgps look at variables in the environment to figure out what units they should default to using for display — imperial, nautical, or metric. Here are the variables and values they check: GPSD_UNITS one of: imperial = miles/feet nautical = knots/feet metric = km/meters LC_MEASUREMENT en_US = miles/feet C = miles/feet POSIX = miles/feet [other] = km/meters LANG en_US = miles/feet C = miles/feet POSIX = miles/feet [other] = km/meters These preferences may be overridden by the option. Where present, the option can be used to set the system units for display; follow the keyword with 'i' for 'imperial' for American units (feet in altitude and error estimates, miles per hour in speeds), 'n' for 'nautical' (feet in altitude and error estimates, knots in speed) or 'm' for 'metric' (meters in altitude and error estimates, kilometers per hour in speeds). The option, when present, sets a debug level; it is primarily for use by GPSD developers. It enables various progress messages to standard error. By default, clients collect data from all compatible devices on localhost, using the default GPSD port 2947. An optional argument to any client may specify a server to get data from. A colon-separated suffix is taken as a port number. If there is a second colon-separated suffix, that is taken as a specific device name to be watched. However, if the server specification contains square brackets, the part inside them is taken as an IPv6 address and port/device suffixes are only parsed after the trailing bracket. Possible cases look like this: localhost:/dev/ttyS1 Look at the default port of localhost, trying both IPv4 and IPv6 and watching output from serial device 1. example.com:2317 Look at port 2317 on example.com, trying both IPv4 and IPv6. 71.162.241.5:2317:/dev/ttyS3 Look at port 2317 at the specified IPv4 address, collecting data from attached serial device 3. [FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:2317:/dev/ttyS5 Look at port 2317 at the specified IPv6 address, collecting data from attached serial device 5. Not all clients shipped with GPSD are documented here. See also the separate manual pages for gpspipe1 and gpsmon1. xgps xgps is a simple test client for gpsd with an X interface. It displays current GPS position/time/velocity information and (for GPSes that support the feature) the locations of accessible satellites. In the sky view, satellites are color-coded to indicate quality of signal; consult the data display to the left for exact figures in dB. Square icons indicate WAAS/EGNOS satellites, circles indicate ordinary GPS satellites. Filled icons were used in the last fix, outline icons were not. xgpsspeed xgpsspeed is a speedometer that uses position information from the GPS. It accepts an -h option and optional argument as for gps, or a -V option to dump the package version and exit. The default display mode resembles a car speedometer. With the option --nautical you get a more elaborate speed and track presentation modeled after a marine navigation display. The -speedunits option can be used to set the speed units for display; follow the keyword with knots for nautical miles per hour, kph for kilometres per hour, or mph for miles per hour. The default is miles per hour. In the nautical mode only, --maxspeed sets the maximum on the speedometer. cgps cgps is a client resembling xgps, but without the pictorial satellite display and able to run on a serial terminal or terminal emulator. The option prevents cgps from displaying the data coming from the daemon. This display can also be toggled with the s command. The option will display your magnetic heading (as opposed to your true heading). This is a calculated value, not a measured value, and is subject to a potential error of up to two degrees in the areas for which the calculation is valid (currently Western Europe, Alaska, and Lower 48 in the USA). The formulas used are those found in the Aviation Formulary v1.43. cgps terminates when you send it a SIGHUP or SIGINT; given default terminal settings this will happen when you type Ctrl-C at it. It will also terminate on 'q' lcdgps A client that passes gpsd data to lcdproc, turning your car computer into a very expensive and nearly feature-free GPS receiver. Currently assumes a 4x40 LCD and writes data formatted to fit that size screen. Also displays 4- or 6-character Maidenhead grid square output. gpxlogger This program collects fixes from gpsd and logs them to standard output in GPX, an XML profile for track logging. The output may be composed of multiple tracks. A new track is created if there's no fix for an interval specified by the and defaulting to 5 seconds. The option tells gpxlogger to run as a daemon in background. It requires the option, which directs output to a specified logfile. The option sets a minimum move distance in meters (it may include a fractional decimal part). Motions shorter than this will not be logged. gpxlogger can use any of the export methods that gpsd supports. For a list of these methods, use the . To force the method, give the one of the colon-terminated method names from the table. If D-Bus support is available on the host, GPSD is configured to use it, and -e dbus is specified, this program listens to DBUS broadcasts from gpsd via org.gpsd.fix. With -e sockets, or if sockets is the method defaulted to, you may give a server-port-device specification as arguments. gegps This program collects fixes from gpsd and feeds them to a running instance of Google Earth for live location tracking. The argument is the location of the Google Earth installation directory. If not specified, it defaults to the current directory. If you have the free (non-subscription) version, start by running with the option to drop a clue in the Google Earth installation directory, as 'Open_in_Google_Earth_RT_GPS.kml', then open that file in Places (File > Open...). Run gpsd in the normal way after that. SEE ALSO gpsd8, libgps3, libgpsd3, gpsfake1, gpsctl1, gpscat1, gpsprof1. gpspipe1. gpsmon1. AUTHORS Remco Treffcorn, Derrick Brashear, Russ Nelson & Eric S. Raymond, Jeff Francis (cgps). Amaury Jacquot sxpert@sxpert.org & Petter Reinholdtsen pere@hungry.com (gpxlogger). Chris Kuethe chris.kuethe@gmail.com (gpxlogger), Chen Wei weichen302@aol.com (gegps & xgpsspeed), Robin Wittler real@the-real.org (xgpsspeed). This manual page by Eric S. Raymond esr@thyrsus.com gpsd-3.15/gps/__init__.py0000664000175000017500000000075012460513551013453 0ustar esresr# Make core client functions available without prefix. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. api_major_version = 5 # bumped on incompatible changes api_minor_version = 0 # bumped on compatible changes from gps import * from misc import * # The 'client' module exposes some C utility functions for Python clients. # The 'packet' module exposes the packet getter via a Python interface. gpsd-3.15/gps/client.py0000664000175000017500000001677712506064205013210 0ustar esresr# This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # import time, socket, sys, select, exceptions if sys.hexversion >= 0x2060000: import json # For Python 2.6 else: import simplejson as json # For Python 2.4 and 2.5 GPSD_PORT = "2947" class json_error(exceptions.Exception): def __init__(self, data, explanation): exceptions.Exception.__init__(self) self.data = data self.explanation = explanation class gpscommon: "Isolate socket handling and buffering from the protocol interpretation." def __init__(self, host="127.0.0.1", port=GPSD_PORT, verbose=0): self.sock = None # in case we blow up in connect self.linebuffer = "" self.verbose = verbose if host is not None: self.connect(host, port) def connect(self, host, port): """Connect to a host on a given port. If the hostname ends with a colon (`:') followed by a number, and there is no port specified, that suffix will be stripped off and the number interpreted as the port number to use. """ if not port and (host.find(':') == host.rfind(':')): i = host.rfind(':') if i >= 0: host, port = host[:i], host[i + 1:] try: port = int(port) except ValueError: raise socket.error, "nonnumeric port" # if self.verbose > 0: # print 'connect:', (host, port) msg = "getaddrinfo returns an empty list" self.sock = None for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): af, socktype, proto, _canonname, sa = res try: self.sock = socket.socket(af, socktype, proto) # if self.debuglevel > 0: print 'connect:', (host, port) self.sock.connect(sa) except socket.error, msg: # if self.debuglevel > 0: print 'connect fail:', (host, port) self.close() continue break if not self.sock: raise socket.error, msg def close(self): if self.sock: self.sock.close() self.sock = None def __del__(self): self.close() def waiting(self, timeout=0): "Return True if data is ready for the client." if self.linebuffer: return True (winput, _woutput, _wexceptions) = select.select((self.sock,), (), (), timeout) return winput != [] def read(self): "Wait for and read data being streamed from the daemon." if self.verbose > 1: sys.stderr.write("poll: reading from daemon...\n") eol = self.linebuffer.find('\n') if eol == -1: frag = self.sock.recv(4096) self.linebuffer += frag if self.verbose > 1: sys.stderr.write("poll: read complete.\n") if not self.linebuffer: if self.verbose > 1: sys.stderr.write("poll: returning -1.\n") # Read failed return -1 eol = self.linebuffer.find('\n') if eol == -1: if self.verbose > 1: sys.stderr.write("poll: returning 0.\n") # Read succeeded, but only got a fragment return 0 else: if self.verbose > 1: sys.stderr.write("poll: fetching from buffer.\n") # We got a line eol += 1 self.response = self.linebuffer[:eol] self.linebuffer = self.linebuffer[eol:] # Can happen if daemon terminates while we're reading. if not self.response: return -1 if self.verbose: sys.stderr.write("poll: data is %s\n" % repr(self.response)) self.received = time.time() # We got a \n-terminated line return len(self.response) def data(self): "Return the client data buffer." return self.response def send(self, commands): "Ship commands to the daemon." if not commands.endswith("\n"): commands += "\n" self.sock.send(commands) WATCH_ENABLE = 0x000001 # enable streaming WATCH_DISABLE = 0x000002 # disable watching WATCH_JSON = 0x000010 # JSON output WATCH_NMEA = 0x000020 # output in NMEA WATCH_RARE = 0x000040 # output of packets in hex WATCH_RAW = 0x000080 # output of raw packets WATCH_SCALED = 0x000100 # scale output to floats WATCH_TIMING = 0x000200 # timing information WATCH_SPLIT24 = 0x001000 # split AIS Type 24s WATCH_PPS = 0x002000 # enable PPS in raw/NMEA WATCH_DEVICE = 0x000800 # watch specific device class gpsjson: "Basic JSON decoding." def __iter__(self): return self def unpack(self, buf): try: self.data = dictwrapper(json.loads(buf.strip(), encoding="ascii")) except ValueError, e: raise json_error(buf, e.args[0]) # Should be done for any other array-valued subobjects, too. # This particular logic can fire on SKY or RTCM2 objects. if hasattr(self.data, "satellites"): self.data.satellites = map(dictwrapper, self.data.satellites) def stream(self, flags=0, devpath=None): "Control streaming reports from the daemon," if flags & WATCH_DISABLE: arg = '?WATCH={"enable":false' if flags & WATCH_JSON: arg += ',"json":false' if flags & WATCH_NMEA: arg += ',"nmea":false' if flags & WATCH_RARE: arg += ',"raw":1' if flags & WATCH_RAW: arg += ',"raw":2' if flags & WATCH_SCALED: arg += ',"scaled":false' if flags & WATCH_TIMING: arg += ',"timing":false' if flags & WATCH_SPLIT24: arg += ',"split24":false' if flags & WATCH_PPS: arg += ',"pps":false' else: # flags & WATCH_ENABLE: arg = '?WATCH={"enable":true' if flags & WATCH_JSON: arg += ',"json":true' if flags & WATCH_NMEA: arg += ',"nmea":true' if flags & WATCH_RARE: arg += ',"raw":1' if flags & WATCH_RAW: arg += ',"raw":2' if flags & WATCH_SCALED: arg += ',"scaled":true' if flags & WATCH_TIMING: arg += ',"timing":true' if flags & WATCH_SPLIT24: arg += ',"split24":true' if flags & WATCH_PPS: arg += ',"pps":true' if flags & WATCH_DEVICE: arg += ',"device":"%s"' % devpath return self.send(arg + "}") class dictwrapper: "Wrapper that yields both class and dictionary behavior," def __init__(self, ddict): self.__dict__ = ddict def get(self, k, d=None): return self.__dict__.get(k, d) def keys(self): return self.__dict__.keys() def __getitem__(self, key): "Emulate dictionary, for new-style interface." return self.__dict__[key] def __setitem__(self, key, val): "Emulate dictionary, for new-style interface." self.__dict__[key] = val def __contains__(self, key): return key in self.__dict__ def __str__(self): return "" __repr__ = __str__ # # Someday a cleaner Python interface using this machinery will live here # # End gpsd-3.15/gps/fake.py0000664000175000017500000007045612506064067012640 0ustar esresr# This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. """ gpsfake.py -- classes for creating a controlled test environment around gpsd. The gpsfake(1) regression tester shipped with GPSD is a trivial wrapper around this code. For a more interesting usage example, see the valgrind-audit script shipped with the GPSD code. To use this code, start by instantiating a TestSession class. Use the prefix argument if you want to run the daemon under some kind of run-time monitor like valgrind or gdb. Here are some particularly useful possibilities: valgrind --tool=memcheck --gen-suppressions=yes --leak-check=yes Run under Valgrind, checking for malloc errors and memory leaks. xterm -e gdb -tui --args Run under gdb, controlled from a new xterm. You can use the options argument to pass in daemon options; normally you will use this to set the debug-logging level. On initialization, the test object spawns an instance of gpsd with no devices or clients attached, connected to a control socket. TestSession has methods to attach and detch fake GPSes. The TestSession class simulates GPS devices for you with objects composed from a pty and a class instance that cycles sentences into the master side from some specified logfile; gpsd reads the slave side. A fake GPS is identified by the string naming its slave device. TestSession also has methods to start and end client sessions. Daemon responses to a client are fed to a hook function which, by default, discards them. You can change the hook to sys.stdout.write() to dump responses to standard output (this is what the gpsfake executable does) or do something more exotic. A client session is identified by a small integer that counts the number of client session starts. There are a couple of convenience methods. TestSession.wait() does nothing, allowing a specified number of seconds to elapse. TestSession.send() ships commands to an open client session. TestSession does not currently capture the daemon's log output. It is run with -N, so the output will go to stderr (along with, for example, Valgrind notifications). Each FakeGPS instance tries to packetize the data from the logfile it is initialized with. It uses the same packet-getter as the daemon. Exception: if there is a Delay-Cookie line in a header comment, that delimiter is used to split up the test load. The TestSession code maintains a run queue of FakeGPS and gps.gs (client- session) objects. It repeatedly cycles through the run queue. For each client session object in the queue, it tries to read data from gpsd. For each fake GPS, it sends one line or packet of stored data. When a fake-GPS's go predicate becomes false, the fake GPS is removed from the run queue. There are two ways to use this code. The more deterministic is non-threaded mode: set up your client sessions and fake GPS devices, then call the run() method. The run() method will terminate when there are no more objects in the run queue. Note, you must have created at least one fake client or fake GPS before calling run(), otherwise it will terminate immediately. To allow for adding and removing clients while the test is running, run in threaded mode by calling the start() method. This simply calls the run method in a subthread, with locking of critical regions. """ import os, sys, time, signal, pty, termios # fcntl, array, struct import exceptions, threading, socket, select import gps import packet as sniffer import stat # The magic number below has to be derived from observation. If # it's too high you'll slow the tests down a lot. If it's too low # you'll get regression tests timing out. # WRITE_PAD: Define a per-line delay on writes so we won't spam the # buffers in the pty layer or gpsd itself. Values smaller than the # system timer tick don't make any difference here. Can be set from # WRITE_PAD in the environment. if sys.platform.startswith("linux"): WRITE_PAD = 0.0 elif sys.platform.startswith("freebsd"): WRITE_PAD = 0.01 elif sys.platform.startswith("netbsd5"): WRITE_PAD = 0.200 elif sys.platform.startswith("netbsd"): WRITE_PAD = 0.004 elif sys.platform.startswith("darwin"): # darwin Darwin-13.4.0-x86_64-i386-64bit WRITE_PAD = 0.03 else: WRITE_PAD = 0.004 # Make it easier to test pad values if os.getenv("WRITE_PAD"): WRITE_PAD = eval(os.getenv("WRITE_PAD")) # Additional delays in slow mode WRITE_PAD_SLOWDOWN = 0.01 # If a test takes longer than this, we deem it to have timed out TEST_TIMEOUT = 60 class TestLoadError(exceptions.Exception): def __init__(self, msg): exceptions.Exception.__init__(self) self.msg = msg class TestLoad: "Digest a logfile into a list of sentences we can cycle through." def __init__(self, logfp, predump=False, slow=False, oneshot=False): self.sentences = [] # This is the interesting part if type(logfp) == type(""): logfp = open(logfp, "r") self.name = logfp.name self.logfp = logfp self.predump = predump self.type = None self.sourcetype = "pty" self.serial = None self.delay = WRITE_PAD if slow: self.delay += WRITE_PAD_SLOWDOWN self.delimiter = None # Stash away a copy in case we need to resplit text = logfp.read() logfp = open(logfp.name) # Grab the packets in the normal way getter = sniffer.new() #gps.packet.register_report(reporter) type_latch = None commentlen = 0 while True: (plen, ptype, packet, _counter) = getter.get(logfp.fileno()) if plen <= 0: break elif ptype == sniffer.COMMENT_PACKET: commentlen += len(packet) # Some comments are magic if "Serial:" in packet: # Change serial parameters packet = packet[1:].strip() try: (_xx, baud, params) = packet.split() baud = int(baud) if params[0] in ('7', '8'): databits = int(params[0]) else: raise ValueError if params[1] in ('N', 'O', 'E'): parity = params[1] else: raise ValueError if params[2] in ('1', '2'): stopbits = int(params[2]) else: raise ValueError except (ValueError, IndexError): raise TestLoadError("bad serial-parameter spec in %s"%\ self.name) self.serial = (baud, databits, parity, stopbits) elif "Transport: UDP" in packet: self.sourcetype = "UDP" elif "Transport: TCP" in packet: self.sourcetype = "TCP" elif "Delay-Cookie:" in packet: if packet.startswith("#"): packet = packet[1:] try: (_dummy, self.delimiter, delay) = packet.strip().split() self.delay = float(delay) except ValueError: raise TestLoadError("bad Delay-Cookie line in %s"%\ self.name) self.resplit = True else: if type_latch is None: type_latch = ptype if self.predump: print repr(packet) if not packet: raise TestLoadError("zero-length packet from %s"%\ self.name) self.sentences.append(packet) # Look at the first packet to grok the GPS type self.textual = (type_latch == sniffer.NMEA_PACKET) if self.textual: self.legend = "gpsfake: line %d: " else: self.legend = "gpsfake: packet %d" # Maybe this needs to be split on different delimiters? if self.delimiter is not None: self.sentences = text[commentlen:].split(self.delimiter) # Do we want single-shot operation? if oneshot: self.sentences.append("# EOF\n") class PacketError(exceptions.Exception): def __init__(self, msg): exceptions.Exception.__init__(self) self.msg = msg class FakeGPS: def __init__(self, testload, progress=None): self.testload = testload self.progress = progress self.go_predicate = lambda: True self.readers = 0 self.index = 0 self.progress("gpsfake: %s provides %d sentences\n" % (self.testload.name, len(self.testload.sentences))) def write(self, line): "Throw an error if this superclass is ever instantiated." raise ValueError, line def feed(self): "Feed a line from the contents of the GPS log to the daemon." line = self.testload.sentences[self.index % len(self.testload.sentences)] if "%Delay:" in line: # Delay specified number of seconds delay = line.split()[1] time.sleep(int(delay)) # self.write has to be set by the derived class self.write(line) time.sleep(self.testload.delay) self.index += 1 class FakePTY(FakeGPS): "A FakePTY is a pty with a test log ready to be cycled to it." def __init__(self, testload, speed=4800, databits=8, parity='N', stopbits=1, progress=None): FakeGPS.__init__(self, testload, progress) # Allow Serial: header to be overridden by explicit speed. if self.testload.serial: (speed, databits, parity, stopbits) = self.testload.serial self.speed = speed baudrates = { 0: termios.B0, 50: termios.B50, 75: termios.B75, 110: termios.B110, 134: termios.B134, 150: termios.B150, 200: termios.B200, 300: termios.B300, 600: termios.B600, 1200: termios.B1200, 1800: termios.B1800, 2400: termios.B2400, 4800: termios.B4800, 9600: termios.B9600, 19200: termios.B19200, 38400: termios.B38400, 57600: termios.B57600, 115200: termios.B115200, 230400: termios.B230400, } (self.fd, self.slave_fd) = pty.openpty() self.byname = os.ttyname(self.slave_fd) os.chmod( self.byname, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH ) (iflag, oflag, cflag, lflag, ispeed, ospeed, cc) = termios.tcgetattr(self.slave_fd) cc[termios.VMIN] = 1 cflag &= ~(termios.PARENB | termios.PARODD | termios.CRTSCTS) cflag |= termios.CREAD | termios.CLOCAL iflag = oflag = lflag = 0 iflag &=~ (termios.PARMRK | termios.INPCK) cflag &=~ (termios.CSIZE | termios.CSTOPB | termios.PARENB | termios.PARODD) if databits == 7: cflag |= termios.CS7 else: cflag |= termios.CS8 if stopbits == 2: cflag |= termios.CSTOPB # Warning: attempting to set parity makes Fedora lose its cookies if parity == 'E': iflag |= termios.INPCK cflag |= termios.PARENB elif parity == 'O': iflag |= termios.INPCK cflag |= termios.PARENB | termios.PARODD ispeed = ospeed = baudrates[speed] try: termios.tcsetattr(self.slave_fd, termios.TCSANOW, [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]) except termios.error: raise TestLoadError("error attempting to set serial mode to %s %s%s%s" \ % (speed, databits, parity, stopbits)) def read(self): "Discard control strings written by gpsd." # A tcflush implementation works on Linux but fails on OpenBSD 4. termios.tcflush(self.fd, termios.TCIFLUSH) # Alas, the FIONREAD version also works on Linux and fails on OpenBSD. #try: # buf = array.array('i', [0]) # fcntl.ioctl(self.master_fd, termios.FIONREAD, buf, True) # n = struct.unpack('i', buf)[0] # os.read(self.master_fd, n) #except IOError: # pass def write(self, line): self.progress("gpsfake: %s writes %d=%s\n" % (self.testload.name, len(line), repr(line))) os.write(self.fd, line) def drain(self): "Wait for the associated device to drain (e.g. before closing)." termios.tcdrain(self.fd) def cleansocket(host, port): "Get a socket that we can re-use cleanly after it's closed." cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # This magic prevents "Address already in use" errors after # we release the socket. cs.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) cs.bind((host, port)) return cs class FakeTCP(FakeGPS): "A TCP serverlet with a test log ready to be cycled to it." def __init__(self, testload, host, port, progress=None): FakeGPS.__init__(self, testload, progress) self.host = host self.port = int(port) self.byname = "tcp://" + host + ":" + str(port) self.dispatcher = cleansocket(self.host, self.port) self.dispatcher.listen(5) self.readables = [self.dispatcher] def read(self): "Handle connection requests and data." readable, _writable, _errored = select.select(self.readables, [], [], 0) for s in readable: if s == self.dispatcher: # Connection request client_socket, _address = s.accept() self.readables = [client_socket] self.dispatcher.close() else: # Incoming data data = s.recv(1024) if not data: s.close() self.readables.remove(s) def write(self, line): "Send the next log packet to everybody connected." self.progress("gpsfake: %s writes %d=%s\n" % (self.testload.name, len(line), repr(line))) for s in self.readables: if s != self.dispatcher: s.send(line) def drain(self): "Wait for the associated device(s) to drain (e.g. before closing)." for s in self.readables: if s != self.dispatcher: s.shutdown(socket.SHUT_RDWR) class FakeUDP(FakeGPS): "A UDP broadcaster with a test log ready to be cycled to it." def __init__(self, testload, ipaddr, port, progress=None): FakeGPS.__init__(self, testload, progress) self.ipaddr = ipaddr self.port = port self.byname = "udp://" + ipaddr + ":" + str(port) self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) def read(self): "Discard control strings written by gpsd." pass def write(self, line): self.progress("gpsfake: %s writes %d=%s\n" % (self.testload.name, len(line), repr(line))) self.sock.sendto(line, (self.ipaddr, int(self.port))) def drain(self): "Wait for the associated device to drain (e.g. before closing)." pass # shutdown() fails on UDP class DaemonError(exceptions.Exception): def __init__(self, msg): exceptions.Exception.__init__(self) self.msg = msg def __str__(self): return repr(self.msg) class DaemonInstance: "Control a gpsd instance." def __init__(self, control_socket=None): self.sockfile = None self.pid = None self.tmpdir = os.environ.get('TMPDIR', '/tmp') if control_socket: self.control_socket = control_socket else: self.control_socket = "%s/gpsfake-%d.sock" % (self.tmpdir, os.getpid()) self.pidfile = "%s/gpsfake-%d.pid" % (self.tmpdir, os.getpid()) def spawn(self, options, port, background=False, prefix=""): "Spawn a daemon instance." self.spawncmd = None # Look for gpsd in GPSD_HOME env variable if os.environ.get('GPSD_HOME'): for path in os.environ['GPSD_HOME'].split(':'): _spawncmd = "%s/gpsd" % path if os.path.isfile(_spawncmd) and os.access(_spawncmd, os.X_OK): self.spawncmd = _spawncmd break # if we could not find it yet try PATH env variable for it if not self.spawncmd: if not '/usr/sbin' in os.environ['PATH']: os.environ['PATH']=os.environ['PATH'] + ":/usr/sbin" for path in os.environ['PATH'].split(':'): _spawncmd = "%s/gpsd" % path if os.path.isfile(_spawncmd) and os.access(_spawncmd, os.X_OK): self.spawncmd = _spawncmd break if not self.spawncmd: raise DaemonError("Cannot execute gpsd: executable not found. Set GPSD_HOME env variable") # The -b option to suppress hanging on probe returns is needed to cope # with OpenBSD (and possibly other non-Linux systems) that don't support # anything we can use to implement the FakeGPS.read() method self.spawncmd += " -b -N -S %s -F %s -P %s %s" % (port, self.control_socket, self.pidfile, options) if prefix: self.spawncmd = prefix + " " + self.spawncmd.strip() if background: self.spawncmd += " &" status = os.system(self.spawncmd) if os.WIFSIGNALED(status) or os.WEXITSTATUS(status): raise DaemonError("daemon exited with status %d" % status) def wait_pid(self): "Wait for the daemon, get its PID and a control-socket connection." while True: try: fp = open(self.pidfile) except IOError: time.sleep(0.1) continue try: fp.seek(0) pidstr = fp.read() self.pid = int(pidstr) except ValueError: time.sleep(0.5) continue # Avoid race condition -- PID not yet written fp.close() break def __get_control_socket(self): # Now we know it's running, get a connection to the control socket. if not os.path.exists(self.control_socket): return None try: self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0) self.sock.connect(self.control_socket) except socket.error: if self.sock: self.sock.close() self.sock = None return self.sock def is_alive(self): "Is the daemon still alive?" try: os.kill(self.pid, 0) return True except OSError: return False def add_device(self, path): "Add a device to the daemon's internal search list." if self.__get_control_socket(): self.sock.sendall("+%s\r\n\x00" % path) self.sock.recv(12) self.sock.close() def remove_device(self, path): "Remove a device from the daemon's internal search list." if self.__get_control_socket(): self.sock.sendall("-%s\r\n\x00" % path) self.sock.recv(12) self.sock.close() def kill(self): "Kill the daemon instance." if self.pid: try: os.kill(self.pid, signal.SIGTERM) # Raises an OSError for ESRCH when we've killed it. while True: os.kill(self.pid, signal.SIGTERM) time.sleep(0.01) except OSError: pass self.pid = None class TestSessionError(exceptions.Exception): def __init__(self, msg): exceptions.Exception.__init__(self) self.msg = msg class TestSession: "Manage a session including a daemon with fake GPSes and clients." def __init__(self, prefix=None, port=None, options=None, verbose=0, predump=False, udp=False, tcp=False, slow=False): "Initialize the test session by launching the daemon." self.prefix = prefix self.port = port self.options = options self.verbose = verbose self.predump = predump self.udp = udp self.tcp = tcp self.slow = slow self.daemon = DaemonInstance() self.fakegpslist = {} self.client_id = 0 self.readers = 0 self.writers = 0 self.runqueue = [] self.index = 0 self.baseport = 49194 # In the IANA orivate port range if port: self.port = port else: # Magic way to get a socket with an unused port number s = cleansocket("localhost", 0) self.port = s.getsockname()[1] s.close() self.progress = lambda x: None self.reporter = lambda x: None self.default_predicate = None self.fd_set = [] self.threadlock = None def spawn(self): for sig in (signal.SIGQUIT, signal.SIGINT, signal.SIGTERM): signal.signal(sig, lambda unused, dummy: self.cleanup()) self.daemon.spawn(background=True, prefix=self.prefix, port=self.port, options=self.options) self.daemon.wait_pid() def set_predicate(self, pred): "Set a default go predicate for the session." self.default_predicate = pred def gps_add(self, logfile, speed=19200, pred=None, oneshot=False): "Add a simulated GPS being fed by the specified logfile." self.progress("gpsfake: gps_add(%s, %d)\n" % (logfile, speed)) if logfile not in self.fakegpslist: testload = TestLoad(logfile, predump=self.predump, slow=self.slow, oneshot=oneshot) if testload.sourcetype == "UDP" or self.udp: newgps = FakeUDP(testload, ipaddr="127.0.0.1", port=self.baseport, progress=self.progress) self.baseport += 1 elif testload.sourcetype == "TCP" or self.tcp: newgps = FakeTCP(testload, host="127.0.0.1", port=self.baseport, progress=self.progress) self.baseport += 1 else: newgps = FakePTY(testload, speed=speed, progress=self.progress) if pred: newgps.go_predicate = pred elif self.default_predicate: newgps.go_predicate = self.default_predicate self.fakegpslist[newgps.byname] = newgps self.append(newgps) newgps.exhausted = 0 self.daemon.add_device(newgps.byname) return newgps.byname def gps_remove(self, name): "Remove a simulated GPS from the daemon's search list." self.progress("gpsfake: gps_remove(%s)\n" % name) self.fakegpslist[name].drain() self.remove(self.fakegpslist[name]) self.daemon.remove_device(name) del self.fakegpslist[name] def client_add(self, commands): "Initiate a client session and force connection to a fake GPS." self.progress("gpsfake: client_add()\n") newclient = gps.gps(port=self.port, verbose=self.verbose) self.append(newclient) newclient.id = self.client_id + 1 self.client_id += 1 self.progress("gpsfake: client %d has %s\n" % (self.client_id,newclient.device)) if commands: self.initialize(newclient, commands) return self.client_id def client_remove(self, cid): "Terminate a client session." self.progress("gpsfake: client_remove(%d)\n" % cid) for obj in self.runqueue: if isinstance(obj, gps.gps) and obj.id == cid: self.remove(obj) return True return False def wait(self, seconds): "Wait, doing nothing." self.progress("gpsfake: wait(%d)\n" % seconds) time.sleep(seconds) def gather(self, seconds): "Wait, doing nothing but watching for sentences." self.progress("gpsfake: gather(%d)\n" % seconds) #mark = time.time() time.sleep(seconds) def cleanup(self): "We're done, kill the daemon." self.progress("gpsfake: cleanup()\n") if self.daemon: self.daemon.kill() self.daemon = None def run(self): "Run the tests." try: self.progress("gpsfake: test loop begins\n") while self.daemon: # We have to read anything that gpsd might have tried # to send to the GPS here -- under OpenBSD the # TIOCDRAIN will hang, otherwise. for device in self.runqueue: if isinstance(device, FakeGPS): device.read() had_output = False chosen = self.choose() if isinstance(chosen, FakeGPS): if chosen.exhausted and (time.time() - chosen.exhausted > TEST_TIMEOUT) and chosen.byname in self.fakegpslist: sys.stderr.write("Test timed out: increase WRITE_PAD = %s\n" % WRITE_PAD) raise SystemExit, 1 elif not chosen.go_predicate(chosen.index, chosen): if chosen.exhausted == 0: chosen.exhausted = time.time() self.progress("gpsfake: GPS %s ran out of input\n" % chosen.byname) else: chosen.feed() elif isinstance(chosen, gps.gps): if chosen.enqueued: chosen.send(chosen.enqueued) chosen.enqueued = "" while chosen.waiting(): chosen.read() if chosen.valid & gps.PACKET_SET: self.reporter(chosen.response) if chosen.data["class"] == "DEVICE" and chosen.data["activated"] == 0 and chosen.data["path"] in self.fakegpslist: self.gps_remove(chosen.data["path"]) self.progress("gpsfake: GPS %s removed (notification)\n" % chosen.data["path"]) had_output = True else: raise TestSessionError("test object of unknown type") if not self.writers and not had_output: self.progress("gpsfake: no writers and no output\n") break self.progress("gpsfake: test loop ends\n") finally: self.cleanup() # All knowledge about locks and threading is below this line, # except for the bare fact that self.threadlock is set to None # in the class init method. def append(self, obj): "Add a producer or consumer to the object list." if self.threadlock: self.threadlock.acquire() self.runqueue.append(obj) if isinstance(obj, FakeGPS): self.writers += 1 elif isinstance(obj, gps.gps): self.readers += 1 if self.threadlock: self.threadlock.release() def remove(self, obj): "Remove a producer or consumer from the object list." if self.threadlock: self.threadlock.acquire() self.runqueue.remove(obj) if isinstance(obj, FakeGPS): self.writers -= 1 elif isinstance(obj, gps.gps): self.readers -= 1 self.index = min(len(self.runqueue)-1, self.index) if self.threadlock: self.threadlock.release() def choose(self): "Atomically get the next object scheduled to do something." if self.threadlock: self.threadlock.acquire() chosen = self.index self.index += 1 self.index %= len(self.runqueue) if self.threadlock: self.threadlock.release() return self.runqueue[chosen] def initialize(self, client, commands): "Arrange for client to ship specified commands when it goes active." client.enqueued = "" if not self.threadlock: client.send(commands) else: client.enqueued = commands def start(self): self.threadlock = threading.Lock() threading.Thread(target=self.run) # End gpsd-3.15/gps/gps.py0000775000175000017500000003440412513107374012514 0ustar esresr#!/usr/bin/env python # -*- coding: utf-8 -*- # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # gps.py -- Python interface to GPSD. # # This interface has a lot of historical cruft in it related to old # protocol, and was modeled on the C interface. It won't be thrown # away, but it's likely to be deprecated in favor of something more # Pythonic. # # The JSON parts of this (which will be reused by any new interface) # now live in a different module. # from client import * from misc import isotime NaN = float('nan') def isnan(x): return str(x) == 'nan' # Don't hand-hack this list, it's generated. ONLINE_SET = (1<<1) TIME_SET = (1<<2) TIMERR_SET = (1<<3) LATLON_SET = (1<<4) ALTITUDE_SET = (1<<5) SPEED_SET = (1<<6) TRACK_SET = (1<<7) CLIMB_SET = (1<<8) STATUS_SET = (1<<9) MODE_SET = (1<<10) DOP_SET = (1<<11) HERR_SET = (1<<12) VERR_SET = (1<<13) ATTITUDE_SET = (1<<14) SATELLITE_SET = (1<<15) SPEEDERR_SET = (1<<16) TRACKERR_SET = (1<<17) CLIMBERR_SET = (1<<18) DEVICE_SET = (1<<19) DEVICELIST_SET = (1<<20) DEVICEID_SET = (1<<21) RTCM2_SET = (1<<22) RTCM3_SET = (1<<23) AIS_SET = (1<<24) PACKET_SET = (1<<25) SUBFRAME_SET = (1<<26) GST_SET = (1<<27) VERSION_SET = (1<<28) POLICY_SET = (1<<29) LOGMESSAGE_SET = (1<<30) ERROR_SET = (1<<31) TIMEDRIFT_SET = (1<<32) EOF_SET = (1<<33) SET_HIGH_BIT = 34 UNION_SET = (RTCM2_SET|RTCM3_SET|SUBFRAME_SET|AIS_SET|VERSION_SET|DEVICELIST_SET|ERROR_SET|GST_SET) STATUS_NO_FIX = 0 STATUS_FIX = 1 STATUS_DGPS_FIX = 2 MODE_NO_FIX = 1 MODE_2D = 2 MODE_3D = 3 MAXCHANNELS = 20 SIGNAL_STRENGTH_UNKNOWN = NaN WATCH_ENABLE = 0x000001 # enable streaming WATCH_DISABLE = 0x000002 # disable watching WATCH_JSON = 0x000010 # JSON output WATCH_NMEA = 0x000020 # output in NMEA WATCH_RARE = 0x000040 # output of packets in hex WATCH_RAW = 0x000080 # output of raw packets WATCH_SCALED = 0x000100 # scale output to floats WATCH_TIMING = 0x000200 # timing information WATCH_DEVICE = 0x000800 # watch specific device WATCH_SPLIT24 = 0x001000 # split AIS Type 24s WATCH_PPS = 0x002000 # enable PPS JSON WATCH_NEWSTYLE = 0x010000 # force JSON streaming WATCH_OLDSTYLE = 0x020000 # force old-style streaming class gpsfix: def __init__(self): self.mode = MODE_NO_FIX self.time = NaN self.ept = NaN self.latitude = self.longitude = 0.0 self.epx = NaN self.epy = NaN self.altitude = NaN # Meters self.epv = NaN self.track = NaN # Degrees from true north self.speed = NaN # Knots self.climb = NaN # Meters per second self.epd = NaN self.eps = NaN self.epc = NaN class gpsdata: "Position, track, velocity and status information returned by a GPS." class satellite: def __init__(self, PRN, elevation, azimuth, ss, used=None): self.PRN = PRN self.elevation = elevation self.azimuth = azimuth self.ss = ss self.used = used def __repr__(self): return "PRN: %3d E: %3d Az: %3d Ss: %3d Used: %s" % ( self.PRN, self.elevation, self.azimuth, self.ss, "ny"[self.used] ) def __init__(self): # Initialize all data members self.online = 0 # NZ if GPS on, zero if not self.valid = 0 self.fix = gpsfix() self.status = STATUS_NO_FIX self.utc = "" self.satellites_used = 0 # Satellites used in last fix self.xdop = self.ydop = self.vdop = self.tdop = 0 self.pdop = self.hdop = self.gdop = 0.0 self.epe = 0.0 self.satellites = [] # satellite objects in view self.gps_id = None self.driver_mode = 0 self.baudrate = 0 self.stopbits = 0 self.cycle = 0 self.mincycle = 0 self.device = None self.devices = [] self.version = None def __repr__(self): st = "Time: %s (%s)\n" % (self.utc, self.fix.time) st += "Lat/Lon: %f %f\n" % (self.fix.latitude, self.fix.longitude) if isnan(self.fix.altitude): st += "Altitude: ?\n" else: st += "Altitude: %f\n" % (self.fix.altitude) if isnan(self.fix.speed): st += "Speed: ?\n" else: st += "Speed: %f\n" % (self.fix.speed) if isnan(self.fix.track): st += "Track: ?\n" else: st += "Track: %f\n" % (self.fix.track) st += "Status: STATUS_%s\n" % ("NO_FIX", "FIX", "DGPS_FIX")[self.status] st += "Mode: MODE_%s\n" % ("ZERO", "NO_FIX", "2D", "3D")[self.fix.mode] st += "Quality: %d p=%2.2f h=%2.2f v=%2.2f t=%2.2f g=%2.2f\n" % \ (self.satellites_used, self.pdop, self.hdop, self.vdop, self.tdop, self.gdop) st += "Y: %s satellites in view:\n" % len(self.satellites) for sat in self.satellites: st += " %r\n" % sat return st class gps(gpscommon, gpsdata, gpsjson): "Client interface to a running gpsd instance." def __init__(self, host="127.0.0.1", port=GPSD_PORT, verbose=0, mode=0): gpscommon.__init__(self, host, port, verbose) gpsdata.__init__(self) self.newstyle = False if mode: self.stream(mode) def __oldstyle_unpack(self, buf): # unpack a daemon response into the gps instance members self.fix.time = 0.0 fields = buf.strip().split(",") if fields[0] == "GPSD": for field in fields[1:]: if not field or field[1] != '=': continue cmd = field[0].upper() data = field[2:] if data[0] == "?": continue if cmd == 'F': self.device = data elif cmd == 'I': self.gps_id = data elif cmd == 'O': fields = data.split() if fields[0] == '?': self.fix.mode = MODE_NO_FIX else: def default(i, vbit=0, cnv=float): if fields[i] == '?': return NaN else: try: value = cnv(fields[i]) except ValueError: return NaN self.valid |= vbit return value # clear all valid bits that might be set again below self.valid &= ~( TIME_SET | TIMERR_SET | LATLON_SET | ALTITUDE_SET | HERR_SET | VERR_SET | TRACK_SET | SPEED_SET | CLIMB_SET | SPEEDERR_SET | CLIMBERR_SET | MODE_SET ) self.utc = fields[1] self.fix.time = default(1, TIME_SET) if not isnan(self.fix.time): self.utc = isotime(self.fix.time) self.fix.ept = default(2, TIMERR_SET) self.fix.latitude = default(3, LATLON_SET) self.fix.longitude = default(4) self.fix.altitude = default(5, ALTITUDE_SET) self.fix.epx = self.epy = default(6, HERR_SET) self.fix.epv = default(7, VERR_SET) self.fix.track = default(8, TRACK_SET) self.fix.speed = default(9, SPEED_SET) self.fix.climb = default(10, CLIMB_SET) self.fix.epd = default(11) self.fix.eps = default(12, SPEEDERR_SET) self.fix.epc = default(13, CLIMBERR_SET) if len(fields) > 14: self.fix.mode = default(14, MODE_SET, int) else: if self.valid & ALTITUDE_SET: self.fix.mode = MODE_2D else: self.fix.mode = MODE_3D self.valid |= MODE_SET elif cmd == 'X': self.online = float(data) self.valid |= ONLINE_SET elif cmd == 'Y': satellites = data.split(":") prefix = satellites.pop(0).split() d1 = int(prefix.pop()) newsats = [] for i in range(d1): newsats.append(gps.satellite(*map(int, satellites[i].split()))) self.satellites = newsats self.valid |= SATELLITE_SET def __oldstyle_shim(self): # The rest is backwards compatibility for the old interface def default(k, dflt, vbit=0): if k not in self.data.keys(): return dflt else: self.valid |= vbit return self.data[k] if self.data.get("class") == "VERSION": self.version = self.data elif self.data.get("class") == "DEVICE": self.valid = ONLINE_SET | DEVICE_SET self.path = self.data["path"] self.activated = default("activated", None) driver = default("driver", None, DEVICEID_SET) subtype = default("subtype", None, DEVICEID_SET) self.gps_id = driver if subtype: self.gps_id += " " + subtype self.driver_mode = default("native", 0) self.baudrate = default("bps", 0) self.serialmode = default("serialmode", "8N1") self.cycle = default("cycle", NaN) self.mincycle = default("mincycle", NaN) elif self.data.get("class") == "TPV": self.valid = ONLINE_SET self.utc = default("time", None, TIME_SET) if self.utc is not None: # Time can be either Unix time as a float or an ISO8601 string if type(self.fix.time) == type(0.0): self.fix.time = self.utc else: self.fix.time = isotime(self.utc.encode("ascii")) self.fix.ept = default("ept", NaN, TIMERR_SET) self.fix.latitude = default("lat", NaN, LATLON_SET) self.fix.longitude = default("lon", NaN) self.fix.altitude = default("alt", NaN, ALTITUDE_SET) self.fix.epx = default("epx", NaN, HERR_SET) self.fix.epy = default("epy", NaN, HERR_SET) self.fix.epv = default("epv", NaN, VERR_SET) self.fix.track = default("track", NaN, TRACK_SET) self.fix.speed = default("speed", NaN, SPEED_SET) self.fix.climb = default("climb", NaN, CLIMB_SET) self.fix.epd = default("epd", NaN) self.fix.eps = default("eps", NaN, SPEEDERR_SET) self.fix.epc = default("epc", NaN, CLIMBERR_SET) self.fix.mode = default("mode", 0, MODE_SET) elif self.data.get("class") == "SKY": for attrp in ("x", "y", "v", "h", "p", "g"): setattr(self, attrp+"dop", default(attrp+"dop", NaN, DOP_SET)) if "satellites" in self.data.keys(): self.satellites = [] for sat in self.data['satellites']: self.satellites.append(gps.satellite(PRN=sat['PRN'], elevation=sat['el'], azimuth=sat['az'], ss=sat['ss'], used=sat['used'])) self.satellites_used = 0 for sat in self.satellites: if sat.used: self.satellites_used += 1 self.valid = ONLINE_SET | SATELLITE_SET def read(self): "Read and interpret data from the daemon." status = gpscommon.read(self) if status <= 0: return status if self.response.startswith("{") and self.response.endswith("}\r\n"): self.unpack(self.response) self.__oldstyle_shim() self.newstyle = True self.valid |= PACKET_SET elif self.response.startswith("GPSD"): self.__oldstyle_unpack(self.response) self.valid |= PACKET_SET return 0 def next(self): if self.read() == -1: raise StopIteration if hasattr(self, "data"): return self.data else: return self.response def stream(self, flags=0, devpath=None): "Ask gpsd to stream reports at your client." if (flags & (WATCH_JSON|WATCH_OLDSTYLE|WATCH_NMEA|WATCH_RAW)) == 0: flags |= WATCH_JSON if flags & WATCH_DISABLE: if flags & WATCH_OLDSTYLE: arg = "w-" if flags & WATCH_NMEA: arg += 'r-' return self.send(arg) else: gpsjson.stream(self, ~flags, devpath) else: # flags & WATCH_ENABLE: if flags & WATCH_OLDSTYLE: arg = 'w+' if flags & WATCH_NMEA: arg += 'r+' return self.send(arg) else: gpsjson.stream(self, flags, devpath) def is_sbas(prn): "Is this the NMEA ID of an SBAS satellite?" return prn >= 120 and prn <= 158 if __name__ == '__main__': import getopt, sys (options, arguments) = getopt.getopt(sys.argv[1:], "v") streaming = False verbose = False for (switch, val) in options: if switch == '-v': verbose = True if len(arguments) > 2: print 'Usage: gps.py [-v] [host [port]]' sys.exit(1) opts = { "verbose" : verbose } if len(arguments) > 0: opts["host"] = arguments[0] if len(arguments) > 1: opts["port"] = arguments[1] session = gps(**opts) session.stream(WATCH_ENABLE) try: for report in session: print report except KeyboardInterrupt: # Avoid garble on ^C print "" # gps.py ends here gpsd-3.15/gps/misc.py0000664000175000017500000000724012467336022012653 0ustar esresr# misc.py - miscellaneous geodesy and time functions # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. import time, calendar, math # some multipliers for interpreting GPS output METERS_TO_FEET = 3.2808399 # Meters to U.S./British feet METERS_TO_MILES = 0.00062137119 # Meters to miles METERS_TO_FATHOMS = 0.54680665 # Meters to fathoms KNOTS_TO_MPH = 1.1507794 # Knots to miles per hour KNOTS_TO_KPH = 1.852 # Knots to kilometers per hour KNOTS_TO_MPS = 0.51444444 # Knots to meters per second MPS_TO_KPH = 3.6 # Meters per second to klicks/hr MPS_TO_MPH = 2.2369363 # Meters/second to miles per hour MPS_TO_KNOTS = 1.9438445 # Meters per second to knots # EarthDistance code swiped from Kismet and corrected def Deg2Rad(x): "Degrees to radians." return x * (math.pi/180) def Rad2Deg(x): "Radians to degress." return x * (180/math.pi) def CalcRad(lat): "Radius of curvature in meters at specified latitude." a = 6378.137 e2 = 0.081082 * 0.081082 # the radius of curvature of an ellipsoidal Earth in the plane of a # meridian of latitude is given by # # R' = a * (1 - e^2) / (1 - e^2 * (sin(lat))^2)^(3/2) # # where a is the equatorial radius, # b is the polar radius, and # e is the eccentricity of the ellipsoid = sqrt(1 - b^2/a^2) # # a = 6378 km (3963 mi) Equatorial radius (surface to center distance) # b = 6356.752 km (3950 mi) Polar radius (surface to center distance) # e = 0.081082 Eccentricity sc = math.sin(Deg2Rad(lat)) x = a * (1.0 - e2) z = 1.0 - e2 * sc * sc y = pow(z, 1.5) r = x / y r = r * 1000.0 # Convert to meters return r def EarthDistance((lat1, lon1), (lat2, lon2)): "Distance in meters between two points specified in degrees." x1 = CalcRad(lat1) * math.cos(Deg2Rad(lon1)) * math.sin(Deg2Rad(90-lat1)) x2 = CalcRad(lat2) * math.cos(Deg2Rad(lon2)) * math.sin(Deg2Rad(90-lat2)) y1 = CalcRad(lat1) * math.sin(Deg2Rad(lon1)) * math.sin(Deg2Rad(90-lat1)) y2 = CalcRad(lat2) * math.sin(Deg2Rad(lon2)) * math.sin(Deg2Rad(90-lat2)) z1 = CalcRad(lat1) * math.cos(Deg2Rad(90-lat1)) z2 = CalcRad(lat2) * math.cos(Deg2Rad(90-lat2)) a = (x1*x2 + y1*y2 + z1*z2)/pow(CalcRad((lat1+lat2)/2), 2) # a should be in [1, -1] but can sometimes fall outside it by # a very small amount due to rounding errors in the preceding # calculations (this is prone to happen when the argument points # are very close together). Thus we constrain it here. if abs(a) > 1: a = 1 elif a < -1: a = -1 return CalcRad((lat1+lat2) / 2) * math.acos(a) def MeterOffset((lat1, lon1), (lat2, lon2)): "Return offset in meters of second arg from first." dx = EarthDistance((lat1, lon1), (lat1, lon2)) dy = EarthDistance((lat1, lon1), (lat2, lon1)) if lat1 < lat2: dy *= -1 if lon1 < lon2: dx *= -1 return (dx, dy) def isotime(s): "Convert timestamps in ISO8661 format to and from Unix time." if type(s) == type(1): return time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime(s)) elif type(s) == type(1.0): date = int(s) msec = s - date date = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime(s)) return date + "." + repr(msec)[3:] elif type(s) == type("") or type(s) == type(u""): if s[-1] == "Z": s = s[:-1] if "." in s: (date, msec) = s.split(".") else: date = s msec = "0" # Note: no leap-second correction! return calendar.timegm(time.strptime(date, "%Y-%m-%dT%H:%M:%S")) + float("0." + msec) else: raise TypeError # End gpsd-3.15/gps2udp.c0000600000175000017500000002773712532625515012311 0ustar esresr/* * gps2udp * * Dump NMEA to UDP socket for AIShub * gps2udp -u data.aishub.net:1234 * * Author: Fulup Ar Foll (directly inspired from gpspipe.c) * Date: 2013-03-01 * * This file is Copyright (c) 2013 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ #include #include "gpsd_config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gpsd.h" #include "gpsdclient.h" #include "revision.h" #include "strfuncs.h" #define MAX_TIME_LEN 80 #define MAX_GPSD_RETRY 10 static struct gps_data_t gpsdata; /* UDP socket variables */ #define MAX_UDP_DEST 5 static struct sockaddr_in remote[MAX_UDP_DEST]; static int sock[MAX_UDP_DEST]; static int udpchannel; /* gpsclient source */ static struct fixsource_t gpsd_source; static unsigned int flags; static int debug = 0; static bool aisonly = false; static char* time2string(void) /* return local time hh:mm:ss */ { static char buffer[MAX_TIME_LEN]; time_t curtime; struct tm *loctime; /* Get the current time. */ curtime = time (NULL); /* Convert it to local time representation. */ loctime = localtime (&curtime); /* Print it out in a nice format. */ (void)strftime (buffer, sizeof(buffer), "%H:%M:%S", loctime); return (buffer); } static int send_udp (char *nmeastring, size_t ind) { char message [255]; char *buffer; int channel; /* if string length is unknow make a copy and compute it */ if (ind == 0) { /* compute message size and add 0x0a 0x0d */ for (ind=0; nmeastring [ind] != '\0'; ind ++) { if (ind >= sizeof(message) - 3) { fprintf(stderr, "gps2udp: too big [%s] \n", nmeastring); return -1; } message[ind] = nmeastring[ind]; } buffer = message; } else { /* use directly nmeastring but change terminition */ buffer = nmeastring; ind = ind-1; } /* Add termination to NMEA feed for AISHUB */ buffer[ind] = '\r'; ind++; buffer[ind] = '\n'; ind++; buffer[ind] = '\0'; if ((flags & WATCH_JSON)==0 && buffer[0] == '{') { /* do not send JSON when not configured to do so */ return 0; } /* send message on udp channel */ for (channel=0; channel < udpchannel; channel ++) { ssize_t status = sendto(sock[channel], buffer, ind, 0, (const struct sockaddr *)&remote[channel], (int)sizeof(remote)); if (status < (ssize_t)ind) { (void)fprintf(stderr, "gps2udp: failed to send [%s] \n", nmeastring); return -1; } } return 0; } static int open_udp(char **hostport) /* Open and bind udp socket to host */ { int channel; for (channel=0; channel portnum || 65535 < portnum || '\0' != *endptr || 0 != errno) { (void)fprintf(stderr, "gps2udp: syntax is [-u hostname:port] [%s] is not a valid port number\n",portname); return (-1); } sock[channel]= socket(AF_INET, SOCK_DGRAM, 0); if (sock[channel] < 0) { fprintf(stderr, "gps2udp: error creating UDP socket\n"); return (-1); } remote[channel].sin_family = (sa_family_t)AF_INET; hp = gethostbyname(hostname); if (hp==NULL) { fprintf(stderr, "gps2udp: syntax is [-u hostname:port] [%s] is not a valid hostname\n",hostname); return (-1); } bcopy((char *)hp->h_addr, (char *)&remote[channel].sin_addr, hp->h_length); remote[channel].sin_port = htons((in_port_t)portnum); } return (0); } static void usage(void) { (void)fprintf(stderr, "Usage: gps2udp [OPTIONS] [server[:port[:device]]]\n\n" "-h Show this help.\n" "-u Send UDP NMEA/JASON feed to host:port [multiple -u host:port accepted\n" "-n Feed NMEA.\n" "-j Feed Jason.\n" "-a Select !AISDM message only.\n" "-c [count] exit after count packets.\n" "-b Run in background as a daemon.\n" "-d [0-2] 1 display sent packets, 2 ignored packets.\n" "-v Print version and exit.\n\n" "example: gps2udp -a -n -c 2 -d 1 -u data.aishub.net:2222 fridu.net\n" ); } static void connect2gpsd(bool restart) /* loop until we connect with gpsd */ { unsigned int delay; if (restart) { (void)gps_close(&gpsdata); if (debug > 0) (void)fprintf(stdout, "gps2udp [%s] reset gpsd connection\n", time2string()); } /* loop until we reach GPSd */ for (delay = 10; ; delay = delay*2) { int status = gps_open(gpsd_source.server, gpsd_source.port, &gpsdata); if (status != 0) { (void)fprintf(stderr, "gps2udp [%s] connection failed at %s:%s\n", time2string(), gpsd_source.server, gpsd_source.port); (void)sleep(delay); } else { if (debug > 0) (void)fprintf(stdout, "gps2udp [%s] connect to gpsd %s:%s\n", time2string(), gpsd_source.server, gpsd_source.port); break; } } /* select the right set of gps data */ (void)gps_stream(&gpsdata, flags, gpsd_source.device); } static ssize_t read_gpsd(char *message, size_t len) /* get data from gpsd */ { struct timeval tv; fd_set fds,master; int ind; char c; int retry=0; // prepare select structure */ FD_ZERO(&master); FD_SET(gpsdata.gps_fd, &master); /* loop until we get some data or an error */ for (ind = 0; ind < (int)len;) { int result; /* prepare for a blocking read with a 10s timeout */ tv.tv_sec = 10; tv.tv_usec = 0; fds = master; result = select(gpsdata.gps_fd+1, &fds, NULL, NULL, &tv); switch (result) { case 1: /* we have data waiting, let's process them */ result = (int)read(gpsdata.gps_fd, &c, 1); /* If we lost gpsd connection reset it */ if (result != 1) { connect2gpsd (true); } if ((c == '\n') || (c == '\r')){ message[ind]='\0'; if (ind > 0) { if (retry > 0) { if (debug ==1) (void)fprintf (stdout,"\r"); if (debug > 1) (void)fprintf(stdout, " [%s] No Data for: %ds\n", time2string(), retry*10); } if (aisonly && message[0] != '!') { if (debug >1) (void)fprintf(stdout, ".... [%s %d] %s\n", time2string(), ind, message); return(0); } } return ((ssize_t)ind+1); } else { message[ind]= c; ind++; } break; case 0: /* no data fail in timeout */ retry++; /* if too many empty packets are received reset gpsd connection */ if (retry > MAX_GPSD_RETRY) { connect2gpsd(true); retry = 0; } if (debug > 0) ignore_return(write (1, ".", 1)); break; default: /* we lost connection with gpsd */ connect2gpsd(true); break; } } message[ind] = '\0'; (void)fprintf (stderr,"\n gps2udp: message too big [%s]\n", message); return(-1); } static unsigned char AISto6bit(unsigned char c) /* 6 bits decoding of AIS payload */ { unsigned char cp = c; if(c < (unsigned char)0x30) return (unsigned char)-1; if(c > (unsigned char)0x77) return (unsigned char)-1; if(((unsigned char)0x57 < c) && (c < (unsigned char)0x60)) return (unsigned char)-1; cp += (unsigned char)0x28; if(cp > (unsigned char)0x80) cp += (unsigned char)0x20; else cp += (unsigned char)0x28; return (unsigned char)(cp & (unsigned char)0x3f); } static unsigned int AISGetInt(unsigned char *bitbytes, unsigned int sp, unsigned int len) /* get MMSI from AIS bit string */ { unsigned int acc = 0; unsigned int s0p = sp-1; // to zero base unsigned int i; for(i=0 ; i= byte_length? c0 = (cx >> (5 - ((s0p + i) % 6))) & 1; acc |= c0; } return acc; } int main(int argc, char **argv) { bool daemonize = false; long count = -1; int option; char *udphostport[MAX_UDP_DEST]; flags = WATCH_ENABLE; while ((option = getopt(argc, argv, "?habnjvc:l:u:d:")) != -1) { switch (option) { case 'd': debug = atoi(optarg); if ((debug <1) || (debug > 2)) { usage(); exit(1); } break; case 'n': if (debug >0) (void)fprintf(stdout, "NMEA selected\n"); flags |= WATCH_NMEA; break; case 'j': if (debug >0) (void)fprintf(stdout, "JSON selected\n"); flags |= WATCH_JSON; break; case 'a': aisonly = true; break; case 'c': count = atol(optarg); break; case 'b': daemonize = true; break; case 'u': if (udpchannel >= MAX_UDP_DEST) { (void)fprintf(stderr, "gps2udp: too many UDP destinations (max=%d)\n", MAX_UDP_DEST); } else { udphostport[udpchannel++] = optarg; } break; case 'v': (void)fprintf(stderr, "%s: %s (revision %s)\n", argv[0], VERSION, REVISION); exit(0); case '?': case 'h': default: usage(); exit(1); } } /* Grok the server, port, and device. */ if (optind < argc) gpsd_source_spec(argv[optind], &gpsd_source); else gpsd_source_spec(NULL, &gpsd_source); if (gpsd_source.device != NULL) flags |= WATCH_DEVICE; /* check before going background if we can connect to gpsd */ connect2gpsd(false); /* Open UDP port */ if (udpchannel > 0) { int status = open_udp(udphostport); if (status !=0) exit (1); } /* Daemonize if the user requested it. */ if (daemonize) { if (daemon(0, 0) != 0) { (void)fprintf(stderr, "gps2udp: demonization failed: %s\n", strerror(errno)); } } /* infinite loop to get data from gpsd and push them to aggregators */ for (;;) { char buffer[512]; ssize_t len; len = read_gpsd(buffer, sizeof(buffer)); /* ignore empty message */ if (len > 3) { if (debug > 0) { (void)fprintf (stdout,"---> [%s] -- %s",time2string(),buffer); // Try to extract MMSI from AIS payload if (str_starts_with(buffer, "!AIVDM")) { #define MAX_INFO 6 int i,j; unsigned char packet[512]; unsigned char *adrpkt = packet; unsigned char *info[MAX_INFO]; unsigned int mmsi; unsigned char bitstrings [255]; // strtok break original string (void)strlcpy((char *)packet, buffer, sizeof(packet)); for (j=0; j (int) sizeof (bitstrings)) break; bitstrings[i] = AISto6bit(info[5][i]); } mmsi = AISGetInt(bitstrings, 9, 30); (void)fprintf(stdout," MMSI=%9u", mmsi); } fprintf(stdout,"\n"); } // send to all UDP destinations if (udpchannel > 0) (void)send_udp(buffer, (size_t)len); // if we count messages check it now if (count >= 0) { if (count-- == 0) { /* completed count */ (void)fprintf(stderr, "gpsd2udp: normal exit after counted packets\n"); exit (0); } } // end count } // end len > 3 } // end for (;;) // This is an infinite loop, should never be here fprintf (stderr, "gpsd2udp ERROR abnormal exit\n"); exit (-1); } /* end */ gpsd-3.15/gps2udp.xml0000664000175000017500000001221312467336022012657 0ustar esresr 01 Marc 2013 gps2udp 1 The GPSD Project GPSD Documentation gps2udp feed the take from gpsd to one or more aggregation sites gps2udp -h -n -j -a -u hostname:udpport -c count -d 1|2 -v server :port :device DESCRIPTION gps2udp is a tool to connect to gpsd and output the received sentences to one or many UDP host:port destinations. This makes the program useful for feeding AIS information from gpsd to aishub, marinetraffic, shipfinder,... gps2udp does not require root privileges, and can be run concurrently with other tools connecting to the local gpsd without causing problems. The output will consist of one or both of NMEA (-n option) or JSON (-j option) gpsd sentences. The output is sent to one or many destinations host through a UDP network socket (-u host:port options) . Optionally a server, TCP/IP port number and remote device can be given. If omitted, gps2udp connects to localhost on the default port (2947) and watches all devices opened by gpsd. gps2udp may be run as a daemon (-b option). gps2udp is designed to run smoothly in background; it reconnects automatically to gpsd whenever it is restarted. For debugging purporses, there is an option to exit gracefully after a given count of packets (-c option). OPTIONS -h makes gps2udp print a usage message and exit. -n causes NMEA sentences to be output. -j causes JSON sentences to be output. -u host:port UDP destination for output sentenses (up to five destinations). -a output only AIS messages. -b causes gps2udp to run as a daemon. -c [count] causes [count] sentences to be output. gps2udp will then exit gracefully. -d 1 prints sent packet on stdout. -v prints the version, then exits. EXAMPLE With a running gpsd accessible on the network gps2udp -d 1 -n -u data.aishub.net:2222 will collect data from localhost:gpsd display them on stdout and send a copy to test aishub in NMEA format. gps2udp -a -n -b -u data.aishub.net:2222 -u 5.9.207.224:5321 -u 109.200.19.151:4001 fridu.net:2947 will collect data from a remote gpsd located on fridu.net host, will filter AIS messages and send them to 3 destination (aishub, marinetraffic, shipfinder) in NMEA format, command is running in background mode SEE ALSO gpsd8, gps1, libgps3, libgpsd3, gpsprof1, gpsfake1, gpsctl1, gpscat1. gpsmon1. AUTHOR Fulup Ar Foll fulup@sinagot.net. gpsd-3.15/gps_json.h0000664000175000017500000000356012506322474012551 0ustar esresr/* gps_json.h - JSON handling for libgps and gpsd * * By Eric S. Raymond, 2009 * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include "json.h" #define GPS_JSON_COMMAND_MAX 80 #define GPS_JSON_RESPONSE_MAX 4096 #ifdef __cplusplus extern "C" { #endif void json_data_report(const gps_mask_t, const struct gps_device_t *, const struct policy_t *, char *, size_t); char *json_stringify(char *, size_t, const char *); void json_tpv_dump(const struct gps_device_t *, const struct policy_t *, char *, size_t); void json_noise_dump(const struct gps_data_t *, char *, size_t); void json_sky_dump(const struct gps_data_t *, char *, size_t); void json_att_dump(const struct gps_data_t *, char *, size_t); void json_subframe_dump(const struct gps_data_t *, char buf[], size_t); void json_device_dump(const struct gps_device_t *, char *, size_t); void json_watch_dump(const struct policy_t *, char *, size_t); int json_watch_read(const char *, struct policy_t *, const char **); int json_device_read(const char *, struct devconfig_t *, const char **); void json_version_dump(char *, size_t); void json_aivdm_dump(const struct ais_t *, const char *, bool, char *, size_t); int json_rtcm2_read(const char *, char *, size_t, struct rtcm2_t *, const char **); int json_rtcm3_read(const char *, char *, size_t, struct rtcm3_t *, const char **); int json_ais_read(const char *, char *, size_t, struct ais_t *, const char **); int libgps_json_unpack(const char *, struct gps_data_t *, const char **); #ifdef __cplusplus } #endif /* these values don't matter in themselves, they just have to be out-of-band */ #define DEVDEFAULT_BPS 0 #define DEVDEFAULT_PARITY 'X' #define DEVDEFAULT_STOPBITS 3 #define DEVDEFAULT_NATIVE -1 /* gps_json.h ends here */ gpsd-3.15/gpscap.ini0000664000175000017500000021704512513107374012537 0ustar esresr# GPS capability description file # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # Our apologies to all Unix hackers in advance for the grubby .INI syntax, # we're using it because the format has good cross-Unix support in Python. # # Each section may have the following capabilities # # type = "engine", "vendor", or "device" # date = date of submission # submitter = email of submitter, name may need quoting for RFC822 # description = Human-readable description of this item # packaging = A device's form factor # techdoc = URL to technical documentation, or at least a spec sheet # vendor_site = URL of a vendor site # vendor = vendor name # eval_unit = Which GPSD devs have one for testing (list) # engine = GPS chipset (may reference another section) # subtype = engine subtype or firmware revision level # interfaces = interface types: USB, RS-232, Bluetooth, CF, TTL, CAN. # May be a list. # usbchip = USB I/O chipset # pps = supports pulse-per-second precision time reporting # pps_accuracy = claimed PPS accuracy # time_offset = NTP offset # configurable = can the device be bricked by speed changes? # tested = last gpsd tested, or "regression" if we have a test load # nmea = NMEA version this emits, if known # notes = Miscellaneous notes on this item. To be interpreted as HTML # rating = excellent, good, fair, poor, broken, other # discontinued = If True, product has been discontinued # # Capability strings: # # to_nmea = if present, how to switch to NMEA 0183 mode from native binary # to_native = if present, how to swith to native binary mode from NMEA # modeset = set protocol, baud rate, 8N1 # # Inheritance # # To inherit capabilities from a specified section, name the section in # a "uses =" attribute. Use chains are followed recursively. An attribute # in a section overrides all attributes of the same name in all ancestor # sections. # # Certain escapes in capability strings are translated: # # %b - baud rate as ASCII numeral # # A string beginning with 0x is interpreted as a sequence of paired hex bytes, # leading 0x not included. # # Comment lines led with "#%" are vendor section marks to be used when # generating an HTML table from this file. Each should consist of a vendor # name. # # Further notes: # * In the packaging feld, a "GPS mouse" is a standalone sensor in a # display-less case designed be used as an outbard peripheral. An # "OEM module" is an un-cased circuit board with edge connectors; a # "chipset" is what it sounds like. # A "handset" is a standalone GPS with a display and human-usable # controls. A "handsfree" is a hands-free unit with display designed for # mounting on a car windshield or boat dash. # * In the rating field: # "excellent" - gpsd recognizes the GPS rapidly and reliably, # reports are complete and correct. # "good" -- gpsd has minor problems or lag recognizing the device, # but reports are complete and correct. # "fair" -- Reports have minor dropouts or problems, including occasional # transient nonsense values. # "poor" -- Reports frequently have values that are wrong or nonsense. # "broken" -- gpsd frequently fails to recognize the device at all. # "other -- See Technical Notes. # # Chipsets (alphabetical) # [ANTARIS] type = engine engine = ANTARIS nmea = 2.3 rating = good techdoc = http://www.u-blox.com/products/tim_lp.html discontinued = True notes = The ANTARIS chipset has been end-of-lifed. [ANTARIS4] type = engine engine = ANTARIS4 techdoc = http://www.u-blox.com/products/a4products.html nmea = 2.3 rating = good notes = Sends 'E' in second field of GSA record, not an NMEA value. Actually sends '6' in the GGA rating record for dead-reckoning fixes. (This behavior reported on the 4H chipset.) logs = ublox-lea-4h.log, ublox-lea-4s.log, ublox-lea-4t.log [BD960] type = engine engine = BD960 nmea = 3.0? tested = 2.39 notes = Spec sheet says it emits GSV, AVR, RMC, HDT, VGK, VHD, GGLK, GGA, GSA, ZDA, VTG, GST, and PIT in NMEA mode. Many of these are nonstandard. Also says: "JK and Binary: Trimble GSOF". Other web sources say it has RTK capability. rating = good [FastraX iTrax03] type = engine techdoc = http://www.fastraxgps.com/products/gpsmodules/index.cfm?template=products.show.cfm&productGuid=4594da1a-503c-469c-91b2-6948043189be engine = FastraX iTrax03 rating = good logs = com-1289.log notes = Start of fix cycle is RMC, end is GGA (GSVs may come after). [Garmin] type = engine engine = Garmin description = There are several versions; the differences are not clear. techdoc = http://www.garmin.com/support/commProtocol.html rating = good [LEA-5H] type = engine engine = LEA-5H nmea = 2.3 rating = good tested = 2.92 notes = Appears not to have the ANTARIS4 GSA quirk. logs = ublox-lea-5h.log [LEA-6H] type = engine engine = LEA-6H nmea = 2.3 rating = good tested = 3.9 notes = Appears not to have the ANTARIS4 GSA quirk. Excellent indoors. [MSB2122] type = engine engine = MSB2122 nmea = 2.3 rating = good techdoc = http://www.mstar-europe.com/products.php notes = Code-named "Poseidon 2", this appears to be a MIPS core. May ship with serious bugs that cause bogus fixes or hard crashes. [MT3339] type = engine nmea = 3.01 engine = MT3339 rating = good techdoc = http://www.adafruit.com/datasheets/PMTK_A11.pdf notes = 10Hz update. [MTK] type = engine nmea = 3.01 engine = MTK rating = good techdoc = http://www.fastraxgps.cn/download/NMEA_manual_for_Fastrax_IT500_Series_GPS_receivers.pdf notes = We have seen two versions of this, the MTK3301 and MTK3329. The technical-documentation link describes the 3329, but we think the 3301 is compatible for GPSD purposes. [Nemerix] type = engine engine = Nemerix nmea = 3.01 rating = good notes = NemeriX has gone into liquidation as of Jan 2009). It's funny, they didn't understand why they should give me an unencumbered protocol techdoc. [NovAtel-L1] type = engine engine = NovAtel-L1 techdoc = http://www.novatel.com/Documents/Manuals/om-20000086.pdf nmea = 2.20 rating = good notes = Seems to be built around the Zarlink GP4020. [Pilot Plug] type = engine engine = Pilot Plug rating = good [SE4100L] type = engine nmea = 3.01 rating = fair notes = Does not handle dates after the 10-bit GPS week rollover in 2019 well. logs = gp-320fw-2019-03-28.log, gp-320fw-2019-03-28.log-overflow, gp-320fw-2019-03-28.log-coldboot [SirfGeneric] type = engine description = Capabilities generic to all SiRF chips # Sets 4800 baud shipping GGA+GSA+GSV+RMC to_nmea = 0xa0a200188102010100000101050101010000000100010001000112c00000b0b3 to_native = $PSRF100,0,%b,8,1,0 # Sets 8N1 with specified speed [SiRF-1] type = engine description = Version 1 of the SiRF GPS engine engine = SiRF-1 nmea = 2.2 uses = SirfGeneric tested = 2.34 rating = good logs = ublox-sirf1.log notes = ublox-sirf1.log was made from a device with ublox firmware and may not be typical of SiRF-1 chips. [SiRF-2] type = engine description = Version 2 of the SiRF GPS engine engine = SiRF-2 # Later versions may do 2.3 nmea = 2.2 uses = SirfGeneric tested = 2.37 rating = good logs = bu303b-nofix.log, bu303-climbing.log, bu303-moving.log, bu303-nofix.log, bu303-stillfix.log, haicom-305N.log, holux-gm-210.log, pharos-360.log, tn200-all.log, tn200.log, tn204.log notes = The bu* logs are in native binary format; the Haicom, Holux, Pharos, and TripNav logs in NMEA. NMEA starts with GGA and ends with RMC. The tn204 NMEA looks remarkably like older Garmin cruft and may be emulating one, including the split reporting cycle. [SiRF-3] type = engine description = Version 3 of the SiRF GPS engine engine = SiRF-3 nmea = 3.01 uses = SirfGeneric rating = good logs = blumax-gps009.log, gpslim236.log, motorola-t805.log, rgm3800.log, et-332.log, tomtom-mkII.log notes = The Blumax log is in NMEA mode. Start of cycle is GGA, End of cycle is RMC. Some variants (like the Blumax) emit ZDA before GGA; others (like the GPSlim 1236, Motorola T805, RGM3800) do not. [SiRF-4] type = engine description = Version 4 of the SiRF GPS engine engine = SiRF-4 nmea = 3.01 uses = SirfGeneric rating = poor logs = bu353s4.log notes = Low power usage, but poor sensitivity and very long startup. Resets to 4800N1 every time it is unplugged. Has a tendency to freeze when switched from binary to NMEA mode (unplugging it fixes this). [SiRF-TriG] type = engine description = Chinese variant of the SiRF GPS engine engine = SiRF-TriG nmea = 4.00 uses = SirfGeneric #rating = poor logs = beidou-bd.log, beidou-gb.log notes = SiRF-IV variant produced for the Chinese market; it handles the Beidou and GLONASS constellations as well as US GPS. The main variant is described by the Chinese standard "Technical Specification of Communication Protocol for BDS Compatible Positioning Module" (TSCPB) and uses the talker ID BD. This standard is not available in English translation. There is a variant with closer NMEA 4.00 conformance that uses the talker ID GB. [Skytraq Venus 6] type = engine nmea = 3.01 rating = good tested = 2.90 [Sony CXD2951] type = engine techdoc = http://gpsd.googlecode.com/files/cxd2951-commands.pdf engine = Sony CXD2951 rating = good [STA8088] type = engine nmea = 2.2 rating = good tested = 3.7 notes = From ST Microelectronics [Touchstone ASIC] type = engine engine = Touchstone ASIC rating = good techdoc = http://www.navcomtech.com/Products/GPS/Touchstone.cfm [uNav] type = engine engine = uN3010 nmea = 3.01 notes = uNav was acquired by Atheros in 2007. They have inherited one GPS product, now designated uN3010. rating = good [UBLOX M8030-KT] type = engine engine = M8030-KT rating = good tested = 3.14 notes = Supports GPS, GLONASS, Galileo, BeiDou, QZSS and SBAS. a.k.a NEO-M8N logs = neo-m8n.log [UBLOX NEO-5Q] type = engine nmea = 2.3 rating = good tested = 2.39 notes = Supports WAAS. [Zodiac] type = engine engine = Zodiac nmea = 2.2 tested = 2.0 techdoc = http://www.gpskit.nl/downloads-en.htm notes = This chip was made by Rockwell International. It was also known as the Jupiter. It has been EOLed. rating = good logs = zodiac.log # # Vendors (alphabetical by vendor) # [Adafruit] type = vendor vendor_site = https://www.adafruit.com/ [Altina] type = vendor vendor_site = http://www.altina.com [Adapt Mobile] type = vendor vendor_site = http://www.adapt-mobile.com> [Axiom] type = vendor vendor_site = http://code.google.com/p/gpsd/downloads/detail?name=SiRF-Axiom.pdf&can=2&q= [BeStar] type = vendor vendor_site = http://www.sz-beitian.com/ [Billionton] type = vendor vendor_site = http://www.billionton.com/english/index.htm [Bluenext] type = vendor vendor_site = http://www.bluenext.co.uk/ [Canmore] type = vendor vendor_site = http://www.canmore.com.tw/ [Columbus] type = vendor vendor_site = http://www.columbus-gps.de/ [Central Pacific] type = vendor vendor_site = http://www.cpit.com [Delorme] type = vendor vendor_site = http://www.delorme.com [Digital Yacht] type = vendor vendor_site = http://digitalyacht.mesltd.co.uk/ [Eurotech] type = vendor vendor_site = http://www.eurotech-inc.com/ [Fastrax] type = vendor vendor_site = http://www.fastraxgps.com/ [EuroTronics] type = vendor vendor_site = http://www.eurotronic.net/ [Garmin] type = vendor vendor_site = http://www.garmin.com [Geostar] type = vendor vendor_site = http://www.geostar-navigation.com [GlobalSat] type = vendor vendor_site = http://www.globalsat.com.tw/ [Haicom] type = vendor vendor_site = http://www.haicom.com.tw/ [Holux] type = vendor vendor_site = http://www.holux.com [Humminbird] type = vendor vendor_site = http://www.humminbird.com/ notes = These guys make fish-finders that incorporate GPSes [iTrek] type = vendor vendor_site = http://www.i-trek.jp [Jackson Labs] type = vendor vendor_site = http://jackson-labs.com/ [LyconSys] type = vendor vendor_site = http://www.lyconsys.com/index.php/en/ [Magellan] type = vendor vendor_site = http://www.magellangps.com notes = Now owns what used to be the Thales and Asht product lines [Motorola] type = vendor vendor_site = http://www.motorola.com/ies/GPS/products_legacy.html notes = Motorola has exited the GPS business. The OnCore line of GPSes is now sold by Synergy Systems LLC [Navcom] type = vendor vendor_site = http://www.navcomtech.com/ [Navis Engineering Bureau] type = vendor vendor_site = http://navis.ru/ [Navisys] type = vendor vendor_site = http://www.navisys.com.tw/ [Navius] type = vendor vendor_site = http://www.navius.biz/ notes = This vendor has also traded as "Navisky". [NaviLock] type = vendor vendor_site = http://www.navilock.de [Navisys] type = vendor vendor_site = http://www.navisys.com.tw/ [NavMan] type = vendor vendor_site = http://www.navmanwirelessoem.com/ [Nokia] type = vendor vendor_site = http://www.nokia.com/ [NovAtel] type = vendor vendor_site = http://www.novatel.com/ [Parrot] type = vendor vendor_site = http://www.parrot.com/ [Pharos] type = vendor vendor_site = http://www.pharosgps.co/ [Phonix] type=vendor vendor_site = http://www.phonix.it/ [Qstarz] type=vendor vendor_site = http://www.qstarz.com/ [RF Solutions] type = vendor vendor_site = http://www.rfsolutions.co.uk [Rikaline] type = vendor vendor_site = http://www.rikaline.com [Royaltek] type = vendor vendor_site = http://www.royaltek.com/ [Saab] type = vendor vendor_site = http://www.saabgroup.com/ [San Jose Navigation] type = vendor vendor_site = http://www.sanav.com [Sejat] type = vendor vendor_site = http://sejats.blogspot.com/ [SkyTraq] type = vendor vendor_site = http://www.skytraq.com.tw/ [Sure] type = vendor vendor_site = http://stores.ebay.com/Sure-Electronics/_i.html?_nkw=gps&submit=Search&_sid=208644246 [Telit] type = vendor vendor_site = http://www.telit.com/ [Transystem] type = vendor vendor_site = http://www.transystem.com.tw/ [Techway] type = vendor vendor_site = http://www.techwayinc.com.tw/ notes = This vendor has dropped off the web [TomTom] type = vendor vendor_site = http://www.tomtom.com/ [Trimble] type = vendor vendor_site = http://www.trimble.com/ [u-blox] type = vendor vendor_site = http://www.u-blox.de/en/ [UniTraq] type = vendor vendor_site = http://www.unitraq.com/ [Variotek] type = vendor vendor_site = http://variotek.de/ [Wintec] type = vendor vendor_site = http://www.wintec.com.tw/ # # Devices (alphabetical by vendor) # #% Adafruit [Ultimate GPS HAT] type = device packaging = HAT vendor = Adafruit techdoc = https://learn.adafruit.com/adafruit-ultimate-gps-hat-for-raspberry-pi interfaces = Raspberry Pi HAT tested = 3.14 rating = excellent uses = MT3339 pps = Yes submitter = Gary E. Miller notes = Built-in antenna with conenctor for external antenna. Good, not great sensitivity with built-in antenna. Built-in RTC and battery. #% Altina [GBT709] type = device vendor = Altina packaging = handset techdoc = http://www.altina.com/produkty.php?destCatId=&mainCatId=13&subCatId=&prId=19 interfaces = Bluetooth configurable = insane tested = 2.35 uses = SiRF-3 submitter = Benoit Panizzon notes = Requires the "-b" flag to prevent mode switching. If the receiver locks up due to a mode switch, remove the battery for 5 to 10 minutes. #% Adapt Mobile [AD-500] type = device vendor = Adapt Mobile packaging = mouse techdoc = http://adapt-mobile.bosqom.com/default.php?page_ID=3&spage_ID=1 uses = Nemerix interfaces = Bluetooth, USB usbchip = pl2303 tested = 2.32 submitter = Dennis van Zuijlekom . discontinued = True #% Axiom [Sandpiper] type = device vendor = Axiom packaging = OEM module techdoc = http://code.google.com/p/gpsd/downloads/detail?name=SiRF-Axiom.pdf&can=2&q= uses = SiRF-1 interfaces = RS-232 tested = 2.34 pps = True notes = The vendor is out of business, but there are lots of these still around in 2006. Complete documentation for this OEM module has been archived at the GPSD site. #% BeStar [BN-880] type = device vendor = BeStar packaging = OEM module uses = UBLOX M8030-KT interfaces = LV RS-232 tested = 3.14 rating = excellent submitter = Gary E. Miller pps = False notes = Vendor is in Shenzhen, China. Frequently on eBay. Sold as a 'Flight Control Module' as it also contains gyros and acceleromters in a separate I2C bus. Does not have PPS but some resellers claim PPS. #% Billionton [Billionton CF-GPS] type = device vendor = Billionton packaging = mouse techdoc = http://www.billionton.com/english/product/CF-GPS.htm uses = SiRF-2 interfaces = CF tested = 2.16 submitter = Oleg Gusev . notes = Uses SiRF firmware version 220.006.000ES. Accepts WAAS Mode Disable ($PSRF108,00*02) and WAAS Mode Enable ($PSRF108,01*03) controls. #%Bluenext [BN-901S] type = device engine = Skytraq Venus 6 date = 2010-06-10 location = model = BN-901S packaging = mouse interfaces = Bluetooth rating = excellent submitter = Andrew Gray techdoc =http://www.bluenext.co.uk/customer-support/downloads/doc_download/34-bluenext-bn-901s-gps-receiver.html tested = 2.39 vendor = Bluenext notes = Device reports protocol as "Generic NMEA" without a version number. Purchased retail (30GBP) to work with a Nokia 5233 - which is does well. Best performing GPS receiver I have seen - fast fix and robust against obstructions to sky view. logs = bn-9015.log #% Canmore [GT-730F] type = device engine = SKYTRAK interfaces = USB nmea = 3.01 packaging = mouse rating = good submitter = Rene Warren techdoc = http://www.canmore.com.tw/pdf/English%20user%20manual_GT-730F_L.pdf tested = 2.33 vendor = Canmore notes = #% Columbus [V900] type = device uses = MTK interfaces = Bluetooth model = V900 packaging = mouse rating = fair submitter = Konstantin Ristl techdoc = http://www.columbus-gps.de/v-900_support.php tested = 2.38 vendor = Columbus notes = Device is also a GPS-Logger #% Central Pacific [CPIT GP-27] type = device vendor = Central Pacific packaging = mouse techdoc = http://www.cpit.com/en/GP-27.html uses = Nemerix interfaces = Bluetooth tested = 2.28 configurable = insane submitter = Tobias Minich notes =
  • There are proprietary PNMRX{30[0124],603} sentences that are only sent on change or by request
  • Several sentences can be sent to the device to change settings or request information. DO NOT USE THE PNMRX100 SENTENCE TO CHANGE THE BAUD RATE! This is not supported by the bluetooth chip on the device.
  • Settings are saved in flash powered by a backup battery and persistent over connections and when you turn it off.
  • The syntax of the PNMRX303 message and part 4 of the PNMRX603 message may differ from the syntax found in several documents on the net.
#% Delorme [EarthMate USB] type = device vendor = Delorme packaging = mouse techdoc = https://shop.delorme.com/OA_HTML/DELibeCCtpSctDspRte.jsp?section=10043&minisite=10020 uses = SiRF-2 interfaces = USB usbchip = Cypress M8 CY7C64013 tested = 2.5 discontinued = True notes = This was the replacement for the old Zodiac version that spoke Rockwell binary protocol; it in turn has been discontinued. Some other sentences can be enabled. Requires a 2.6.10 or better kernel for the Cypress USB-HID support. [EarthMate] type = device vendor = Delorme packaging = mouse uses = Zodiac interfaces = RS-232 discontinued = True rating = good notes = This device was supported by GPSD up to release 2.96, but some bug introduced after that interfered with it until support was restored after 3.6. [TripMate] type = device vendor = Delorme packaging = mouse techdoc = http://vancouver-webpages.com/peter/tripmate.faq uses = Zodiac interfaces = RS-232 discontinued = True notes = Discontinued sometime before November 1998. #% Digital Yacht [AIT250] type = device vendor = Digital Yacht engine = unknown packaging = handsfree techdoc = http://www.yachtronics.com/yachtronics/manuals/DIGITAL%20YACHT%20AIT250%20OPERATION.pdf interfaces = RS-232 discontinued = False tested = regression rating = good submitter = Jan Veninga notes = Both a Class B AIS transceiver and a GPS. logs = ait250.log #% Eurotech [Com-1289] type = device vendor = Eurotech packaging = OEM module techdoc = http://www.eurotech.fi/products/COM-1289.html engine = FastraX iTrax03 interfaces = RS-232 tested = regression rating = good submitter = Simon Le Pape #% EuroTronics [Blumax GPS009] type = device vendor = EuroTronics packaging = mouse techdoc = http://www.eurotronic.net/products/produktdetails/gps_receiver.html uses = SiRF-3 interfaces = Bluetooth configurable = insane tested = regression submitter = Hartmut Holzgraefe notes = Requires "-b" ... I had to totally drain the battery of the device and let it rest for a few days before i was able to use it again after a first attempt of using it with without "-b" #% Fastrax [IT520U] type = device vendor = Fastrax engine = MTK packaging = OEM module techdoc = http://www.fastraxgps.com/showfile.cfm?guid=5861a92d-2628-4c8b-9621-058a3435edb5 date = 2011-02-21 firmware = AXN_1.30,0145,Fastrax IT500 interfaces = USB location = Kamp Lintfort, DE, 51deg 29min N, 6deg 32min E model = IT520 rating = good submitter = Kai Scharwies tested = 2.95 logs = mtk-3329.log #% Garmin [Foretrex 201] type = device engine = SiRF-3 date = 2010-08-26 interfaces = RS-232 location = Ulb?lle, DK, 55.04N 10.25E model = Foretrex 201 nmea = 3.0 notes = This device is not a conventional handfrtee unut for a car; it looks like a bulky wristwatch and is meant for bicycle handlebars. It must be set to NMEA output in the settings->interface page. packaging = handset rating = excellent submitter = Anders Lund techdoc = http://www.garmin.com/manuals/Foretrex201_OwnersManual.pdf tested = 2.95 vendor = Garmin discontinued = True logs = foretrex-201.log [Garmin GPS 10x] type = device uses = SiRF-3 date = 2010-07-18 model = GPS 10x nmea = 2.0 and 2.30 interfaces = Bluetooth packaging = mouse rating = excellent submitter = David Ludlow techdoc = http://www.garmin.com/manuals/GarminMobile10forlaptops_PDAs_TechnicalSpecifications.pdf tested = 2.95 vendor = Garmin uses = Garmin logs = garmin-10x.log [Garmin GPS-15] type = device packaging = OEM module vendor = Garmin techdoc = http://www.garmin.com/products/gps15/spec.html uses = Garmin interfaces = RS-232 tested = 2.33 nmea = 2.0 pps = True submitter = Jason Hecker notes = "$PGRMI,,,,,,,R" must be sent to reset the device before PPS works; after about 5 minutes the PPS signal is detected properly by GPSD. [Garmin GPS-16] type = device packaging = mouse vendor = Garmin techdoc = http://www.garmin.com/products/gps16/spec.html uses = Garmin interfaces = RS-232 tested = 2.38 nmea = 2.0 submitter = Reported by Ron Marosko, Jr. , Amaury Jacquot , Jeff Francis notes = DGPS information in GPGGA sentence is not returned. Satellite azimuths/elevations and magnetic variation information are not available in binary mode. Garmin uses a nonstandard 16-bit SNR scale for signal quality in GSA. Can be switched to NMEA 3.0 with PGRMC1. . [Garmin GPS-17N] type = device packaging = mouse vendor = Garmin techdoc = http://www.garmin.com/products/gps17/spec.html uses = Garmin interfaces = RS-232 tested = regression nmea = 2.0 or 3.0 submitter = Wojciech Kazubski . notes = The 17N has been discontinued and replaced by the 17HVS. The interface was RS-232 but used a custom RJ-45 jack. logs = garmin17n.log [Garmin GPS-17HVS] type = device vendor = Garmin packaging = mouse techdoc = https://buy.garmin.com/shop/shop.do?cID=158&pID=8630 engine = unknown interfaces = RS-232 tested = 2.37 rating = good nmea = 2.0 or 3.0 notes = Reported by Ulrich Voigt (no email address) [Garmin GPS-18 USB] interfaces = USB nmea = N/A packaging = mouse submitter = Gary E. Miller techdoc = http://www.garmin.com/manuals/GPS18_TechnicalSpecification.pdf tested = 2.38 type = device uses = Garmin vendor = Garmin notes = The USB version requires the Linux kernel garmin_usb driver. usbfs is not required after gpsd version 2.39. DOP (Dilution of Precision) information is not available (Garmin protocol includes EPE only); gpsd uses EPE to approximate DOP. Magnetic variation information is not available. Garmin uses a nonstandard 16-bit SNR scale. The 18 series, unlike the 16, reports skyview via a packet 114. They will not operate indoors and require a good sky view. [Garmin GPS-18 (all but USB)] interfaces = RS-232 nmea = 2.0 and 2.3 packaging = mouse pps = True pps_accuracy = 1us time_offset = 0.125s submitter = Gary E. Miller techdoc = http://www.garmin.com/manuals/GPS18_TechnicalSpecification.pdf tested = 2.5 type = device uses = Garmin vendor = Garmin notes = The RS-232 versions can emit NMEA and are found by normal autoconfiguration. GPS-18 LVC and GPS-18 LVC/5m have PPS outputs. WAAS is supported. The 18 series, unlike the 16, reports skyview via a packet 114. They will not operate indoors and require a good sky view. NTP offset quoted is at 19200bps; drops to 0.525 at 4800bps. [GPS-25LP] type = device packaging = OEM module vendor = Garmin techdoc = http://www8.garmin.com/products/gps25/spec.html uses = Garmin interfaces = RS-232 nmea = 2.0 tested = regression discontinued = True submitter = Daniele Giangrazi notes = Discontinued embedded module. logs = garmin25lp.log [Garmin 38] type = device vendor = Garmin packaging = handset techdoc = http://au.geocities.com/glennbaddeley/gps/data/GPS38_OwnersManualAndTechdoc_June1997_RevB.pdf uses = Garmin interfaces = RS-232 rating = excellent tested = regression nmea = 2.0 discontinued = True submitter = Pascal F. Martin notes = Start-of-cycle is RMC. 2-second cycle time, 1 fix per cycle. logs = garmin38.log [Garmin 48] type = device vendor = Garmin packaging = handset techdoc = https://buy.garmin.com/shop/shop.do?pID=85 uses = Garmin interfaces = RS-232 nmea = 2.0 discontinued = True rating = excellent tested = regression notes = Start-of-cycle is RMC. 2-second cycle time, 2 fixes per cycle, GLL reports second fix. The 48 has been discontinued. The Garmin 12XL and 45 are nearly identical and should work as well. Details on the Garmin proprietary protocol can be found at here. [Garmin GPS 60] type = device vendor = Garmin packaging = handset techdoc = http://www.garmin.com/manuals/GPS60_OwnersManual.pdf uses = Garmin interfaces = USB, RS-232 tested = 2.33 nmea = 3.01 submitter = Diego Berge [Garmin GPS 76] type = device vendor = Garmin packaging = handset techdoc = http://www.garmin.com/manuals/GPS76_OwnersManual.pdf uses = Garmin interfaces = RS-232 tested = 2.39 nmea = 2.3 submitter = Sebastian Niehaus , Geoff Childs notes = The device has a four pin socket described by Garmin as a serial interface. Connection to a standard 9 pin RS-232 computer socket is made using the special adaptor lead supplied by Garmin. Sebastian Niehaus says it annunces "Software Version 3.70". Geoff Childs adds: "The Garmin GPS 76 comms MUST be set to 'NMEA'. The kernel module garmin_gps is not needed and should not be specially loaded." [Geko 201] type = device vendor = Garmin packaging = handset techdoc = http://www.garmin.com/manuals/Geko201_OwnersManual.pdf uses = Garmin interfaces = RS-232 tested = regression nmea = 3.0 submitter = Jose Luis Domingo Lopez notes = logs = garmin-geko201.log [eTrex Vista] type = device vendor = Garmin packaging = handset techdoc = http://www.garmin.com/manuals/eTrexVista_OwnersManual.pdf uses = Garmin interfaces = RS-232 tested = 2.32 nmea = 3.0 submitter = Reed Hedges notes = [Nuvi 650] type = device vendor = Garmin packaging = handsfree techdoc = http://www.garmin.com/manuals/nuvi650_OwnersManual.pdf uses = SiRF-3 interfaces = USB tested = * nmea = 3.0 rating = broken notes = This device does not have real-time data output, and is incompatible with GPSD. [GPSmap 76S] type = device vendor = Garmin engine = unknown packaging = handset rating = other techdoc = http://www8.garmin.com/manuals/GPSMAP76S_OwnersManual.pdf tested = 2.94 nmea = 2.3 date = 2011-10-24 interfaces = USB submitter = Brad Skillman model = GPSmap 76S notes = When the GPSmap 76S is placed into simulator mode, for some unknown reason, both the xgps and cgps clients display "n/a" in the time field. However, the lat., long., and altitude fields are being displayed correctly. Using gpspipe -r is appears that the $GPGLL message is sending out the UTC time in the HHMMSS format (Note: There are no fractional seconds being generated) logs = GPSmap-76S [Montana 650t] type = device packaging = handheld interfaces = USB submitter = Richard Allen vendor = Garmin techdoc = http://static.garmincdn.com/pumac/Montana_600_OM_EN.pdf engine = STA2065 rating = good tested = 3.6 [GPS 152] type = device submitter = Erkki Laasonen vendor = Garmin techdoc = http://www.manualrepubliccdn.com/pdf/garmin/396-m-gps-152-manual-owner-s-manual.pdf packaging = handheld engine = unknown firmware = 3.60 nmea = 2.3 interfaces = FTDI tested = 3.6 rating = broken location = Uusikaupunki, FI, 61N 21E date = 2014-06-30 sample_notes: Log was taken on my moored boat. #% Geostar Navigation [GeoS-1M] type = device date = 2010-07-09 location = Minsk, Belarus, 53N 27E model = GeoS-1M engine = custom interfaces = TTL nmea = 3.01 packaging = OEM module rating = good sample_notes = NMEA output for a few minutes after power up. submitter = Viktar Palstsiuk techdoc = http://geostar-navigation.com/fail/manuals/User_Manual_GeoS-1M_en.pdf tested = 2.90 vendor = Geostar notes = GeoS-1M is the combined GPS/GLONASS OEM receiver board. Its architecture includes 24 tracking channels. logs = geos-1m.log #% GlobalSat [BC-307] type = device vendor = GlobalSat packaging = mouse techdoc = http://www.usglobalsat.com/item.asp?itemid=12 uses = SiRF-2 interfaces = CF tested = 2.35 nmea = 2.2 rating = fair submitter = Chris Kuethe . notes = Acceptably functional running firmware 231ES. [BT-318] type = device vendor = GlobalSat packaging = mouse techdoc = http://www.globalsat.com.tw/english/products_detail.php?main_id=21&p_id=107 uses = SiRF-2 interfaces = Bluetooth tested = 3.12 nmea = 2.2 rating = fair configurable = insane submitter = Frank Nicholas notes = Requires the -b option. [BT-338] type = device vendor = GlobalSat packaging = mouse techdoc = http://www.usglobalsat.com/item.asp?itemid=6 uses = SiRF-3 interfaces = Bluetooth tested = 2.13 rating = fair submitter = Michal Panczyk [BU-303] type = device vendor = GlobalSat packaging = mouse techdoc = http://www.usglobalsat.com/item.asp?itemid=11&catid=13 uses = SiRF-2 interfaces = USB usbchip = pl2303 tested = regression rating = excellent eval_unit = esr nmea = 2.2 notes = Older versions of the BU-303 had a design defect that made it likely to fail if subjected to vibration or hard shocks. [BU-353] type = device vendor = GlobalSat packaging = mouse techdoc = http://www.usglobalsat.com/item.asp?itemid=60&catid=17 uses = SiRF-3 interfaces = USB usbchip = pl2303 tested = pre-2.29 rating = excellent eval_unit = esr nmea = 2.3 notes = This receiver does not support PPS timing output. Some versions of firmware do not support WAAS, though updates may be available for a fee from GlobalSat. [BU-355] type = device vendor = GlobalSat packaging = mouse uses = SiRF-3 interfaces = USB usbchip = pl2303 tested = 3.10 rating = good eval_unit = esr nmea = 2.3 notes = This receiver does not support PPS timing output. Does support WAAS/EGNOS, unlike some 353s. [BU-353-S4] type = device vendor = GlobalSat packaging = mouse techdoc = http://usglobalsat.com/store/download/688/bu353s4_ds.pdf uses = SiRF-4 interfaces = USB usbchip = pl2303 tested = 3.11 rating = poor eval-unit = esr,gary nmea = 3.0 # Also tested by Paul Beard # Hamilton, Waikato, 37.8S 175.3E 2014-12-31 notes = This receiver does not support PPS timing output. Much like the BU-353 except for using a SiRFStar IV chip. Has poor sensitivity and takes a lot longer to cold-start than the vendor claim 45 of 45 seconds. Gary Miller rates this device "DO NOT EVER BUY ONE!", observing "The big selling point of the SiRF IV is the lower power needs. Looks like they made that happen at the expense of sensitivity and timeliness of fixes." Also, has the SiRF-IV tendency to freeze when switched from binary to NMEA mode (power-cycling it unjams it). [BT-359] vendor = GlobalSat uses = SiRF-3 interfaces = Bluetooth nmea = 2.2 packaging = mouse rating = excellent submitter = Patrick Forristal techdoc = http://www.globalsat.com.tw/eng/support_check.php?check_id=126&checkType=Manual tested = 2.37 [ET-332 Engine Board] type = device engine = SiRF-3 firmware = unknown model = ET-322 Engine Board interfaces = TTL notes = This is an OEM module but it is available in small quantities. logs = et-332.log packaging = OEM module rating = good submitter = Val Schmidt techdoc =http://www.globalsat.com.tw/products-page.php?menu=2&gs_en_product_id=4&gs_en_product_cnt_id=44&img_id=110&product_cnt_folder=4 vendor = GlobalSat [ND-100S] type = device engine = SiRF-3 date = 2011-03-14 interfaces = USB model = ND-100S notes = SirfDemo can be used to configure the product. packaging = mouse rating = excellent submitter = George E Farmer techdoc = http://usglobalsat.com/store/download/590/nd100s_v1.0-manual.pdf tested = 2.95 vendor = GlobalSat logs = nd-1005.log [MR-350P] date = 2010-02-03 interfaces = RS-232 nmea = 3.01 packaging = mouse pps = True pps_accuracy = 50ns time_offset = ? rating = excellent submitter = Gary E. Miller , Tony Hain techdoc = http://usglobalsat.com/p-58-mr-350p-bulkhead.aspx tested = 3.3 type = device uses = SiRF-3 vendor = GlobalSat notes = May work inside wood frame buildings. PPS pulse is only 1uS wide, but newer gpsd handles that fine. Be careful, there is also an MR-350 (no suffix P) that does NOT have PPS. logs = mr-350p [TripNav TN-200] type = device vendor = GlobalSat packaging = mouse techdoc = http://www.usglobalsat.com/item.asp?itemid=45&catid=13 uses = SiRF-2 interfaces = USB usbchip = FTDI FT232 tested = regression rating = excellent notes = We tested a version with SiRF Firmware level 231ES. The FTDI USB-to-serial chip is supported only as alpha software not yet incorporated into the Linux kernel, though it seems to be well supported by OS X and various BSDs. It seems like the only difference between this and the BU-303 is the different USB-to-serial chip. [TripNav TN-204] type = device vendor = GlobalSat packaging = mouse uses = SiRF-2 interfaces = CF tested = regression rating = excellent submitter = Pascal F. Martin notes = Sometimes sold under the brand name "Rayming", but that vendor seems to have disappeared. Chipset said to be SiRF 2 but the output looks more like old Garmin GPSes. [ND100] type = device uses = MSB2122 interfaces = USB usbchip = pl2303 nmea = 3.0 packaging = mouse rating = excellent submitter = Arnaud Le Meur techdoc = http://www.globalsat.com.tw/eng/product_detail_00000124.htm tested = 2.38 vendor = GlobalSat notes = May ship with broken firmware that incorrectly reports the current year (2009) as 1953. A firmware update is available to resolve this issue. #% Haicom [HI-204S] type = device vendor = Haicom packaging = mouse techdoc = http://www.haicom.com.tw/products.htm uses = SiRF-2 interfaces = USB usbchip = pl2303 tested = 3.12 rating = excellent eval_unit = esr nmea = 2.2 notes = SiRF firmware level 231ES (XTrac). Haicom provided a test unit. Manual states incorrectly that VTG is off by default. [HI-204E] type = device vendor = Haicom packaging = mouse techdoc = http://www.haicom.com.tw/gps204E.shtml engine = Evermore BBP1202 interfaces = USB tested = 2.6 rating = excellent nmea = 2.2 notes = Probably uses PL2303 but we have not verified this. [HI-303S] type = device vendor = Haicom packaging = handsfree techdoc = http://www.haicom.com.tw/gps303s.shtml uses = SiRF-3 interfaces = RS-232 tested = 2.25 nmea = 2.2 submitter = Denis Perchine discontinued = True notes = NMEA works, but SiRF binary does not. This device seems to ignore the $PSRF100 mode switch command. (SiRF binary may be available on the auxiliary serial port, but this is unconfirmed.) This device ships with XTrac firmware. [HI-305N] type = device vendor = Haicom packaging = mouse techdoc = http://www.haicom.com.tw/ uses = Nemerix interfaces = CF tested = regression discontinued = True submitter = David Findlay notes = Adaptors for RS-232, USB, and Bluetooth operation are available. #% Holux [GM-210] type = device vendor = Holux packaging = mouse techdoc = http://www.amazon.com/Holux-GM-210-Receiver-Laptop-Pocket/dp/B0006ZMBTW uses = SiRF-2 interfaces = RS-232 tested = regression nmea = 2.2 discontinued = True submitter = Patrick L. McGillan . [GR-230] type = device vendor = Holux packaging = mouse techdoc = http://www.holux.com.tw/Temp%20web/GR-230.html uses = SiRF-2 interfaces = Bluetooth configurable = insane tested = 2.19 nmea = 2.2 discontinued = True notes = 4 color LED showing: Bluetooth, Navigation Update and Battery and Charger Rating Indication. FLASH based program memory. Firmware upgradeable through serial interface. Water resistant. [GPSlim 236] type = device vendor = Holux packaging = mouse techdoc = http://en.holux.com.cn/product/search.htm?filename=gpsreceiver_bluetooth_gpslim2+36.htm&target=bluetooth00&level=grandsonson uses = SiRF-3 interfaces = Bluetooth tested = regression rating = poor nmea = 2.2 submitter = Kévin Redon notes = Does not report altitude reliably. Optional interfaces: mini-USB -> USB, needing a special cable : GR230-A2 (USB data cable), otherwise it will not work; mini-USB -> RS-232, need cable GR230-A1(RS-232 data cable), I didn't try it with a normal cable; mini-USB -> PS2, need cable GR230-A3 (Mini USB port to PS2 port ), I didn't try it with a normal cable. [Holux GR-239] type = device vendor = Holux packaging = mouse techdoc = http://www.holux.com/JCore/en/support/DLF.jsp?DLU=http://www1.holux.com.tw:8080/JCore/UploadFile/79754.pdf uses = SiRF-3 interfaces = Bluetooth, USB configurable = insane tested = 2.36 rating = poor nmea = 2.2 notes = Bluetooth operation requires -b option. Powered from a car cigarette-lighter. [M-241] type = device vendor = Holux packaging = mouse techdoc = http://www.holux.com/JCore/en/products/products_content.jsp?pno=341 uses = MTK interfaces = Bluetooth, USB usbchip = CP2101 configurable = insane tested = 2.37 btglitch = yes submitter = Roland Ager notes = gpsd crashes the device when autoprobing @ baud rate 9600 (unless '-b'/broken-device-safety is enabled - need to unplug/reset the device). 'stty -F /dev/ttyUSB1 ispeed 38400' helps avoiding too much autoprobing - though stty complains about not being able to perform all requested operations. #% Humminbird [Matrix-37] type = device vendor = Humminbird packaging = handsfree techdoc = http://www.retrevo.com/support/Humminbird-37-GPS-manual/ engine = unknown interfaces = RS-232 discontinued = True tested = regression rating = good submitter = Carl Brown notes = Depth finder and water-temperature sensor. logs = humminbird-M37.log #% iTrek [M3] type = device vendor = iTrek packaging = mouse techdoc = http://www.semsons.com/im3blgpsresi.html uses = SiRF-3 interfaces = Bluetooth tested = 2.28 submitter = Lance Fetters notes = The product page points at a retail site carrying these because the vendor site is in Japanese only. This GPS emits a weirdly broken GSA sentence that crashed gpsd versions prior to 2.28. Serial parameters default to 38400; 8, N, 1. May come bundled with Microsoft Streets and Trips. logs = iTrek.log #% Jackson Labs [Firefly-1a] type = device engine = UBLOX NEO-5Q firmware = 0.918 interfaces = RS-232 pps = True pps_accuracy = 50ns packaging = OEM module rating = excellent submitter = Don Weeks , Said Jackson techdoc = http://jackson-labs.com/docs/FireFly_quickstart.pdf vendor = Jackson Labs notes = Only outputs GGA and RMC NMEA strings. There are other proprietary commands. See the gpsd-dev list for patches. GPSD works as far back as the 0.914 version, which emitted \r\r\n terminations. All the FireFly units are OCXO driven, so the 1PPS output stays accurate even if GPS reception is lost. [FireFly-II] type = device engine = UBLOX NEO-5Q date = 2010-07-07 firmware = 2.18 interfaces = RS-232 pps = True pps_accuracy = 50ns time_offset = ? model = FireFly-1A and FireFly-II GPSDO notes = Uses ublox Antaris 5 with Kick Start and Super Sense, soon movingto ublox-6. Defective \r\r\n string terminations have been fixed in the 2.18 firmware version. All the FireFly units are OCXO driven, so the 1PPS output stays accurate even if GPS reception is lost. packaging = OEM module rating = good sample_notes = Stationary state, roof-mounted antenna, three levels of GPS distribution Amplifier between antenna and receiver. submitter = Said Jackson techdoc = http://www.jackson-labs.com/docs/Quickstart_FireFly_IIA_FW-rev_2.x.pdf vendor = Jackson Labs #% LyconSys [GPSMOD1] type = device engine = ANTARIS5 firmware = ROM CORE 4.00 (25682) interfaces = USB model = GPSMOD1 nmea = 2.3 packaging = mouse rating = excellent submitter = info@lyconsys.com techdoc = http://www.lyconsys.com/produkte/gps-emfanger-lyconsys-gpsmod1.htm tested = 2.95 vendor = LyconSys #% Magellan [EC-10X] type = device vendor = Magellan packaging = handset techdoc = http://www.herman-nelson.com/itemInfo.cfm?itemID=205 uses = Zodiac interfaces = RS-232 pps = True tested = regression discontinued = True submitter = Gary E. Miller notes = It was cool in its day, now a dinosaur mainly good for regression testing. NMEA time is accurate to about 500mS. Start of cycle is GPRMC on odd seconds, GPRMB on even seconds. logs = magellan315.log [315] type = device vendor = Magellan packaging = handset techdoc = https://www.magellangps.com/assets/manuals/gps_310_315_en.pdf engine = unknown interfaces = RS-232 tested = regression rating = good submitter = Angel Marques Mateu notes = logs = magellan315.log [Meridian Platinum] type = device vendor = Magellan packaging = handset techdoc = http://www.amazon.com/Magellan-Meridian-Platinum-Handheld-GPS/dp/B00005OLYD engine = Motorola interfaces = RS-232 tested = 2.21 rating = excellent nmea = v1.5 APA, v1.5 XTE, v2.1 GSA discontinued = True submitter = Chris S. Newell [eXplorist 110] type = device vendor = Magellan packaging = handset techdoc = http://support.magellangps.com/support/index.php?_m=downloads%26_a=viewdownload#26downloaditemid=322 engine = unknown interfaces = USB tested = regression rating = good nmea = 2.1 submitter = rickyconnell@gmail.com logs = eXplorist110.log [eXplorist 210] type = device vendor = Magellan packaging = handset techdoc = http://www.magellangps.com/assets/manuals/newprod/eXplorist%20210_US.pdf engine = unknown interfaces = USB tested = regression rating = good nmea = 2.1 submitter = Paul van den Berg notes = USB has 3 modes — NMEA data comm (3 submodes): outputs GPS data (creates /dev/ttyACM0), USB file transfer: transfer files (creates /dev/sdX and /dev/sdX1), or Power Only: use USB only for electrical power. The APA and XTE extensions choke gpsd, so select V2.1 GSA under "NMEA Data Comm>". logs = eXplorist210.log [Thales AC12] type = device vendor = Magellan packaging = OEM module techdoc = ftp://ftp.magellangps.com/OEM,%20Sensor%20&%20ADU/A12,%20%20B12,%20&%20AC12/Techdoc%20Material/A12,%20B12%20&%20AC12%20RM%20rev%20E.pdf engine = unknown interfaces = TTL nmea = 3.0 tested = regression rating = good pps = True pps_accuracy = 250ns time_offset = ? submitter = Chris Kuethe notes = Receiver comes up in silent mode, you may need to use ashctl to turn on a default set of messages. Tested with firmware BQ00 and BQ04. logs=ac12.log [Triton 400] type = device vendor = Magellan submitter = James Gerlach techdoc = http://www.tritonforum.com/Files/UserManual_ENG.pdf packaging = handset uses = SiRF-3 firmware = GSW3.2.4 nmea = 2.1 interfaces = USB tested = 3.8 and 3.5 rating = good location = Wellington, FL, USA date: 2013-03-31 logs=triton400.log #% Motorola [Oncore GT+] type = device vendor = Motorola packaging = OEM module techdoc = http://www.tapr.org/gps_oncorevp.html engine = Motorola interfaces = RS-232 or TTL tested = 2.20 nmea = 2.2 pps = True pps_accuracy = 50ns time_offset = ? rating = good discontinued = True submitter = Wojciech Kazubski notes = RTCM input, no WAAS. In binary mode can deliver differential correction for another Oncore GT+. Similar Motorola Oncore UT timing receiver has less functions but better timing accuracy. logs = oncore.log [T805] type = device vendor = Motorola packaging = mouse techdoc = http://www.motorola.com/motoinfo/product/detailsPf.jsp?globalObjectId=185 uses = SiRF-3 subtype = GSC3f-7879 interfaces = Bluetooth tested = 2.35 submitter = Reported by Olivier Lahaye #% Navcom [SF-2040G] type = device vendor = Navcom packaging = survey techdoc = http://www.navcomtech.com/Products/GPS/sf2040g.cfm uses = Touchstone ASIC interfaces = RS-232, Bluetooth, Radio (untested) tested = 2.35 rating = good nmea = 3.0 submitter = Diego Berge #$ NaviSys [GR601-W] type = device vendor = Navisys packaging = mouse techdoc = http://www.navisys.com.tw/products/image/130416/GR-601_flyer-130416.pdf engine = LEA-6H interfaces = USB tested = 3.12 pps = True pps_accuracy = 1ms time_offset = ? rating = excellent eval-unit = esr, gary submitter = Eric S. Raymond . notes = Also known as the Macx-1, this is the USB variant of the GR601, customized for timing use by connecting 1PPS to DCD and capable of delivering time to 1ms accuracy. The best indoor performer I have tested. Has one odd quirk: UBX reporting can be turned on, but NMEA cannot be turned off. logs = gr601-w.log [EVK 6H] type = device vendor = u-blox packaging = other techdoc = http://www.u-blox.com/images/downloads/Product_Docs/EVK-6_UserGuide_%28GPS.G6-EK-10040%29.pdf engine = LEA-6H interfaces = USB, RS232 tested = 3.9 pps = True pps_accuracy = 1ms time_offset = ? rating = excellent eval-unit = esr submitter = Eric S. Raymond . notes = The u-blox eval kit for the LEA-6H. Has a TCXO on a miniboard in a nice aluminum case with both USB and serial output. PPS on DCD and DSR. Good Stratum 0 time source. #% Navius [NSA-U3] type = device vendor = Navius packaging = mouse techdoc = http://www.navius.biz/ uses = SiRF-2 interfaces = USB usbchip = pl2303 tested = 2.24 rating = excellent submitter = Jeff Francis notes = Included with the horrible Windows navigation software from Rand McNally. #% NaviLock [NL-209P] type = device vendor = NaviLock packaging = mouse techdoc = http://www.navilock.de/produkte/gruppen/3/Kabel_Empfaenger/61371_NL-209PU.html?show=spec uses = Sony CXD2951 interfaces = USB, RS-232, Bluetooth configurable = insane usbchip = pl2303 tested = 2.35 nmea = 2.2 submitter = Jason Curl notes = When running, need to use the -b option, else the device will hang during the GPSD probing phase and it needs to be unplugged and reinserted. To use this device with NTPd, set the the "fudge" factor to 0.840. There is no known PPS signal associated with this device. While the technical information claims 1us accuracy on the clock, the interface is undocumented, so there is no way to know if there is a usable 1PPS signal. [NL-302U] type = device vendor = NaviLock packaging = mouse techdoc = http://www.navilock.de/produkte/gruppen/3/Kabel_Empfaenger/61422_NL-302U.html?show=spec uses = SiRF-3 subtype = GSW3.2.4_3.1.00.12-SDK003P1 interfaces = USB usbchip = pl2303 nmea = 2.34 submitter = Beat Bolli notes = gpsprof output can be found here. [NL-402U USB] type = device engine = u-blox5 GPS & GALILEO SuperSense date = 2008-07-24 location = Neustadt / Holstein 54.05N 10.49 E model = NL-402U USB EmpfÀnger interfaces = USB packaging = mouse rating = excellent submitter = Klaus Plöger techdoc = http://www.navilock.de/download/PDFs/60095_-_NL-402U_Datenblatt/531 tested = regression vendor = NaviLock logs = nl402u.log notes = Starts with RMC, ends with GLL. [NL-551EUSB] type = device engine = u-blox5 GPS & GALILEO SuperSense submitter = Bas van Duijnhoven vendor = NaviLock techdoc = http://www.navilock.de/files/11409.download packaging = OEM module interfaces = TTL firmware = 6.02 nmea = 2.3 tested = 3.5 location = Rheden, NL, 52.002N 6.036E date = 2012-07-03 rating = good logs = nl551e.log [BT-451] type = device engine= ANTARIS4 date = 2009-12-09 location = Lithuania, 55.8N 23.6E model = BT-451 packaging = mouse interfaces = USB rating = good submitter = Mindaugas techdoc = http://www.navilock.de/produkte/gruppen/28/Nicht_mehr_lieferbare_Artikel/60307_BT-451.html?show=spec tested = 2.39 vendor = NaviLock logs = bt451.log notes = Uses the ANTARIS4 ATR062x variant. #% NavMan [Jupiter 20] type = device vendor = NavMan packaging = chipset techdoc = uses = SiRF-2 subtype = Jupiter 21DR Firmware interfaces = RS-232 tested = 2.32 nmea = 2.2 discontinued = True submitter = Andreas Stricker notes = Not a complete GPS, but a chipset. It is running with an external gyro on a our self-developed board. #%Navis Engineering Bureau [CH-4711] type = device vendor = Navis Engineering Bureau engine = CH-4706 date = 2009-11-21 firmware = m4706 03.10 02/06/09 | 12044 | M2002 05.01 02/06/09 nmea = 3.0? packaging = mouse interfaces = USB usbchip = FTDI FT232 rating = good submitter = walkie@mail.ru techdoc = http://navis.ru/downloads/CH-4711_USB/ logs = ch-4711.log notes = By default the device does not report 2d fixes; the vendor configuration tool offers checkboxes to enable any combination of none, 2D fixes, 3D fixes, or both. The devices has only a very limited set of NMEA controls but speaks a proprietary vendor format called BINR with more capabilities. [NAVIOR-24] type = device engine = CH-4701 interfaces = TTL date = 2008-05-29 location = Minsk, Belarus, 53N 27E model = NAVIOR-24 packaging = OEM module rating = good submitter = Viktar Palstsiuk techdoc = http://navis.ru/en/catalog_110_139.html vendor = Navis Engineering Bureau notes = NAVIOR-24 is the single board 24-channel navigation OEM receiver supporting GLONASS/GPS systems. logs = ch-4701.log #%Navisys [GR-300] type = device uses = SiRF-3 date = 2009-07-03 firmware = GSW3.2.4Pat2_3.1.00.12-SDK001P1.00 interfaces = USB location = East Haddon, Northampton, England, UK, 53.3N, 1.02W model = GR-300 nmea = 3.0 packaging = mouse rating = excellent submitter = sk1ppy14@yahoo.co.uk techdoc = http://www.navisys.com.tw/products/image/GR-300_flyer-080409.pdf tested = 2.38 vendor = Navisys notes = Also includes an (untested) Bluetooth interface. Has two LEDs: blue for bluetooth, green for rating. Solid green = on and searching for satellite fixes. Blinking green = on and has 3D fix. Also a similar GR-310 version available. It is possible that only GR-310 supports Bluetooth. Programs only seem to be able to communicate with the dongle at 4800 baud rates, though this is autodetected by gpsd with no problems. Approx £40 per dongle. #%Nokia [LD-4W] type = device uses = SiRF-3 date = 2009-12-05 location = Oulu, FI, 65N 25E model = LD-4W interfaces = Bluetooth noconfigure = yes packaging = mouse rating = fair submitter = jussi.kivilinna@mbnet.fi techdoc = http://www.microsoft.com/en/mobile/phones/ tested = 2.39 vendor = Nokia logs = nokia-ld-4w.log notes = I first tried gpsd package from Ubuntu 9.10, which broke device on probe. Luckily this device has 'reset' function by pressing power button for 10 sec. Then I recompiled gpsd with only support for Generic NMEA and SiRF binary and with fixed speed (--enable-fixed-port-speed=9600). Now device works in sirf mode, and does not break on probe. #% NovAtel [SuperStar II (202)] type = device vendor = NovAtel packaging = OEM Module uses = NovAtel-L1 techdoc = http://www.novatel.com/Documents/Manuals/om-20000077.pdf tested = 2.38 discontinued = True interfaces = RS-232 pps = True submitter = Chris Kuethe notes = There are quite a number of models of SuperStarII, this is a 169-613955-202 (1Hz, Carrier Phase, Timing, 19200). Other SuperStarII boards should work. #% Parrot [CK3300] type = device vendor = Parrot packaging = handsfree techdoc = http://www.parrot.com/ engine = unknown interfaces = Bluetooth tested = 2.35 rating = good nmea = 2.? submitter = Andy Brown notes = In-car hands-free bluetooth phone and GPS device. Outputs NMEA #% Pharos [GPS-360] type = device vendor = Pharos packaging = mouse techdoc = http://www.pharosgps.com/support/igps360_spec.htm uses = SiRF-2 interfaces = USB usbchip = pl2303 tested = regression nmea = 2.3 discontinued = True submitter = Robert Pouliot notes = The Pharos comes with adaptors for SDIO, CF, USB and plain RS-232. Usually ships with XTrac firmware. It is strongly recommended that this device not be flashed with a different firmware as all reflashed receivers tested thus far fail to work afterward. May come bundled with Microsoft Streets and Trips. [iGPS-500] type = device vendor = Pharos packaging = mouse techdoc = http://www.pharosgps.com/products/proddetail.asp?prod=006_PB010_1.00&cat=141 uses = SiRF-3 subtype = GSC3f usbchip = PL2303 interfaces = USB tested = 2.3 submitter = Aurelian Maga #% Phonix [BGR6205] type = device vendor = Phonix packaging = mouse techdoc = http://www.phonix.it/html/catalogo_dettaglio.cfm?idProducts=E09B5AB7-BCDF-DF66-24853E2B4680AB2C uses = SiRF-2 interfaces = Bluetooth configurable = insane tested = 2.34 nmea = 2.2 notes = As this is a Bluetooth device, gpsd must either be run with "-b" or must be compiled with fixed port speed, as the Bluetooth interface does not tolerate port speed changes at all. Reported by Sebastiano Zabert (no emal address) #% Qstarz [BT-Q818] type = device vendor = Qstarz uses = MTK interfaces = Bluetooth date = 2010-06-03 location = +34d 1m 58.80sec, -117deg 44min 49.56sec model = BT-Q818 notes = Had to use the -b option. packaging = mouse rating = excellent sample_notes = Not moving. Left unit on a north facing window sill. submitter = jason.komut+gpsd@gmail.com techdoc = http://www.qstarz.com/download/BT-Q818%20Quick%20Guide-V1.pdf tested = 2.92-4 logs=bt-q818.log #% RF Solutions [GPS-320FW] type = device engine = SE4100L interfaces = TTL nmea = 3.01 packaging = chipset rating = fair submitter = Stoo techdoc = http://www.rfsolutions.co.uk/acatalog/DS320-2.pdf vendor = RF Solutions notes = Has a binary protcol documetened at http://www.rfsolutions.co.uk/acatalog/DS-41COM-2.pdf. Sat-simulator testing reveals that the chipset does not handle dates after 2019 well; they wrap to 1999. The device sends out "$PLCS,REV,PLN012054S07,070312,145743" at reset, not documented. May actually be manufactured by Unitraq as the GP-320FW. #% Rikaline [GPS-6010 USB] type = device vendor = Rikaline packaging = mouse techdoc = http://www.rikaline.com/download/GPS-6010-Manual-E.pdf uses = SiRF-2 interfaces = USB usbchip = pl2303 tested = 2.20 nmea = 2.2 notes = Uses SiRF firmware version 2.3.2-GSW2-2.05.024-C1Prod1.1. Manufacturer claims it is waterproof (1 meter), WAAS and EGNOS are supported. [GPS-6010-X5] type = device vendor = Rikaline packaging = mouse techdoc = http://www.rikaline.com/gps_receiver.htm uses = SiRF-2 interfaces = USB usbchip = PL2303 tested = 2.20 nmea = 2.2 submitter = Koos van den Hout notes = The USB cable is a separate item to order. You can also order an RS-232 cable or a PDA cable. #% Royaltek [Sapphire USB] type = device vendor = Royaltek packaging = mouse techdoc = http://www.royaltek.com/content/view/27/27/ uses = SiRF-2 interfaces = USB tested = 1.97 nmea = 2.2 notes = There is an RS-232 variant as well, not yet tested. [RGM-3600] type = device uses = SiRF-3 firmware = GSW3.2.5_3.3.01.06_SDK001P1.00 interfaces = USB nmea = 3.0 notes = Works out of the box. packaging = mouse rating = excellent submitter = Stijn Ghesquiere techdoc = http://www.royaltek.com/FileDownload.php?dir=Product_C1_Info&file=RGM-3600%20operational%20manual%20V1_1209966059.pdf tested = 2.37 vendor = Royaltek [RGM-3800] type = device techdoc = http://www.royaltek.com/products_dtl.php?cid=2&id=23&argPage=1&argI=3 vendor = Royaltek packaging = mouse uses = SiRF-2 subtype = GSC3f/LP interfaces = USB (PL2303) tested = regression nmea = 3.0 submitter = Philipp Klenze notes = This is a GPS data logger with mouse functionality. Before it can be used with gpsd, the mouse functionality has to be switched on. That can be done with the rgm3800py utility by Karsten Petersen. The author of said tool has been very helpful to me by describing how to do that on the projectpage. Basically, one needs to run "rgm3800.py -d /dev/ttyUSB0 gmouse on" before starting gpsd. #% Saab [Saab R4] type = device date = 2011-06-01 interfaces = Other model = SAAB AIS GPS R4 positioning system uses = Pilot Plug notes = This is data from the PilotPlug, AIS + NMEA from various instruments on a Transas bridge. This is not normal GPS data. Pilotplugs are RS422, 38400 8N1. This data is obtained via a Moxa UPort 1130 using Minicom. GPSD does not work well with the UPort 1130, but the data is recognised (but not all NMEA sentences). This is from a simulator but with real equipment. packaging = other rating = broken submitter = vwf@vulkor.net techdoc = http://www.saabgroup.com/Civil-security/Maritime-Transportation-and-Port-Security/Traffic-Management-Solutions/Shipborne-AIS--NAV-Solutions/R4-GPS--DGPS--Navigation-System/ tested = 2.95 vendor = Saab logs = saab-r4 #% San Jose Navigation [FV-18] type = device vendor = San Jose Navigation packaging = OEM module techdoc = http://www.sanav.com/gps_engine_board/fv-18.htm engine = FV-18 interfaces = UART tested = 2.0 rating = good nmea = 2.3 notes = Special gpsd support uses 8N2 and requests sentences that gpsd requires. OEM module only, not a retail product. [FV-25] type = device vendor = San Jose Navigation packaging = OEM module techdoc = http://www.tri-m.com/products/systems/fv25.html uses = ANTARIS subtype = TIM-LP interfaces = UART tested = 2.34 pps = True notes = OEM module, available in small quantities from Tri-M systems. The ANTARIS chipset is obsolete, replaced by ANTARIS4. This module works in NMEA mode; gpsd also supports the UBX binary protocol. Firmware updates are available from ublox; the update is strongly recommended as it fixes a number of UBX bugs, and adds useful new features. [FV-M11] type = device vendor = San Jose Navigation engine = MTK packaging = OEM module techdoc = http://www.sanav.com/gps_engine_board/FV-M7_FV-M11.htm interfaces = UART rating = good tested = regression submitter = Henk Fijnvandraat (no email address) logs = mtk-3301.log [GM-38/12V] type = device vendor = San Jose Navigation packaging = mouse techdoc = http://www.tri-m.com/products/systems/gm38.html engine = Furuno GN-77 interfaces = RS-232 tested = 2.21 nmea = 2.x discontinued = True rating = broken notes = Ships bad packet checksums when it does not have a fix. #%Sejat [SJ-5210] type = device engine = SiRF-3 date = 2011-05-04 interfaces = USB location = Boise, ID: 43deg 33min 52sec N / 116deg 13min 22sec W model = SJ-5210 notes = Page that comes with it states: NMEA 0183 - CGA, GSA, GSV, RMC Baud Rate - 4800 bps; Datum WGS-84 SiRF Star III 20-channel -159 dBm sensitivity Frequency L1, 1575.42 Mhz, C/A Code: 1023 Mhz Chip Rate Acq time: Hot start 1 sec/ warm start 38 sec/cold start 42 sec (ave) WAAS/EGNOS supported Do not know (but doubt) device handles baud rate changes. packaging = mouse rating = excellent submitter = rickyrockrat techdoc = http://www.sejats.com/SEJAT-SJ-5210-USB-Mouse-GPS-Receiver-w-SiRF-star-III-SJ-5210.htm tested = 2.92 vendor = Sejat #%Skytraq [Venus634LP] type = device engine = SkyTraq Venus 6 interfaces = TTL date = 2010-02-05 firmware = ver,011023,rev,090210 location = Minsk, Belarus, 53N 27E model = Venus634LP nmea = 3.01 notes = Supports A-GPS from the SkyTraq FTP server. packaging = OEM module rating = good submitter = Viktar Palstsiuk techdoc = http://www.skytraq.com.tw/download/Venus634LPx_PB_v3.pdf tested = 2.90 vendor = SkyTraq logs = venus634lp.log #%Sure [SKG16B] type = device users = MTK engine = MTK interfaces = Bluetooth, USB, RS-232 date = 2015-04-11 firmware = MTK-3301 AXN_1.36-0000 model = SKG16B nmea = 3.01 notes = See David Taylor's page: http://www.satsignal.eu/ntp/Sure-GPS.htm techdoc = http://sure-electronics.net/download/GP-GS010_Ver2.0_EN.pdf packaging = OEM module rating = excellent pps = True pps_accuracy = 50ns time_offset = ? submitter = Sanjeev Gupta tested = 3.14 vendor = Sure #% Techway [TP-051] type = device vendor = Techway packaging = mouse techdoc = http://www.techwayinc.com.tw/TP-051.htm uses = SiRF-2 interfaces = USB usbchip = pl2303 tested = 2.3 nmea = 2.x discontinued = True notes = Advertises that it is waterproof. #% Telit [SL869] type = device engine = STA8088 submitter = Arn vendor = Telit techdoc = http://www.telit.com/module/infopool/download.php?id=4906 firmware = TELIT SW Version: SL869 v3.1.2.1 -STD -N96 packaging = OEM module interfaces = TTL location = Sydney, NSW, AU, -33.68 151.29 rating = good date = 2012-11-25 logs = sl869.log #% TomTom [TomTom Go910] type = device vendor = TomTom packaging = handsfree techdoc = http://www.tomtom.com/en_us/drive/car/products/ engine = SiRF-3 interfaces = USB nmea = None rating = broken notes = This device does not have real-time data output, and is incompatible with GPSD. [Mark II Bluetooth GPS] type = device vendor = TomTom engine = SiRF-3 interfaces = Bluetooth date = 2010-06-20 location = Veldhoven, NL nmea = Version 2.2 packaging = mouse rating = good sample_notes = The unit was stationary (sorry). It is a putty log after connecting to port 2947. submitter = Jose Baars peut@peut.org techdoc = http://download.tomtom.com/open/manuals/mob5_nav5/Wireless_GPS_manual_NAV5_MOB5.pdf tested = 2.36 logs = tomtom-mkII.log notes = I use this GPS as a time source. I use a time1 parameter of -1.4 in /etc/ntp.conf, but then it appears to provide time reliably within 100ms and only limited sky view. #% Transystem [iGPS-M] type = device vendor = Transystem packaging = mouse techdoc = http://www.transystem.com.tw/products/index_detail.php?mcat_no=2&cat_no=32&pno=10&ver=en uses = uNav interfaces = USB usbchip = pl2303 tested = 2.28 submitter = Romain Goyet notes = Formerly sold under the corporate name "Bona CompuTech". [737A+ Bluetooth] type = device uses = MTK date = 2011-11-10 interfaces = Bluetooth location = Bend, Oregon 44N, 121W model = 737A+ Bluetooth nmea = 3.01 notes = USB ID: 0e8d:3329. Bluetooth (V1.2) and USB (V2) output. Linux sees the USB as a cell phone (/dev/ttyACM0). Seems a tad less sensitive than a SiRF III, but has 66 channels. Uses replaceable Lithium Ion battery that charges from the mini-USB connector. Small yet 32 hour runtime on a single charge. packaging = mouse rating = excellent sample_notes = Covered up with aluminum foil until lost lock, started capture, removed foil and logged until a good fix. submitter = Gary E. Miller techdoc = http://www.transystem.com.tw/product/53/737A+%20User%20Manual_v1.3.pdf tested = 3.2 logs = tr737A+.log vendor = Transystem #% Trimble [Trimble Lassen SK] type = device vendor = Trimble packaging = OEM module techdoc = http://www.trimble.com/lassensk2.shtml engine = Colossus RF ASIC, Scorpion DSP interfaces = UART tested = 2.26 rating = good nmea = 2.1 notes = Reported by Rob Janssen (no email address) [Trimble Lassen IQ] type = device vendor = Trimble packaging = OEM module techdoc = http://www.trimble.com/lasseniq.shtml engine = Colossus RF ASIC, IO-C33 (Epson C33 RISC) interfaces = USB,RS-232 pps = True pps_accuracy = 50ns time_offset = 0.675s usbchip = CP2102 tested = regression rating = good nmea = 3.0 submitter = Chris Kuethe logs = trimble-lassen_iq-3dfix.log, trimble-lassen_iq-playacar.log, trimble-lassen_iq.log [Trimble BX960] type = device vendor = Trimble packaging = OEM module techdoc = http://www.trimble.com/embeddedsystems/pdf/bx960_ds.pdf engine = BD960 interfaces = Ethernet tested = regression rating = good submitter = Miika Ojanen notes = Firmware versoon 4.00, dated 2009-03-10 [Accutime Gold] type = device packaging = other submitter = Venkatesh Sandilya vendor = Trimble techdoc = http://www.trimble.com/timing/acutime-gold-gps-antenna.aspx?dtID=support engine = Trimble custom interfaces = RS-232 tested = 3.9 rating = excellent date = 2013-08-28 #% u-blox [ANTARIS LEA-4H] type = device vendor = u-blox packaging = OEM module techdoc = http://www.u-blox.com/products/lea_4h.html uses = ANTARIS4 tested = regression interfaces = RS-232 pps = True submitter = Andreas Stricker [ANTARIS LEA-4S] type = device vendor = u-blox packaging = OEM module techdoc = http://www.u-blox.com/products/lea_4s.html uses = ANTARIS4 interfaces = USB,UART tested = regression submitter = Ali Utku Selen [ANTARIS LEA-4T] type = device vendor = u-blox packaging = OEM module techdoc = http://www.u-blox.com/products/lea_4t.html uses = ANTARIS4 interfaces = USB,UART tested = regression pps = True pps_accuracy = 50ns time_offset = ? submitter = Chris Kuethe [EVK-5H-0] type = device uses = LEA-5H date = 2010-08-21 interfaces = USB location = Rotterdam, NL, 51.9N 4.6E model = EVK-5H-0 packaging = other rating = other submitter = Stephan Dierick techdoc = http://www.u-blox.com/images/downloads/Product_Docs/u-blox5_Protocol_Specifications%28GPS.G5-X-07036%29.pdf vendor = u-blox [LEA 5Q] type = device engine = UBLOX NEO-5Q date = 2011-02-02 interfaces = TTL pps = True pps_accuracy = 50ns time_offset = ? location = Adelaide, AU, 34.9S, 138.6E model = LEA 5Q notes = Sample contains GPGST (pseudorange noise statistics). This had to be manually enabled by sending "$PUBX,40,GST,1,1,1,0*5A\n" to the device. packaging = OEM module rating = excellent submitter = Thomas Sprinkmeier techdoc = http://www.u-blox.com/customersupport/gps.g5/u-blox5_Protocol_Specifications(GPS.G5-X-07036).pdf tested = 2.95 vendor = u-blox logs = ublox-lea-5q.log [EVK-6H-0] type = device uses = LEA-6H date = 2013-10-24 interfaces = R232, USB location = Malvern, PA, 40N 75W model = EVK-6H-0 packaging = other rating = excellent pps_accuracy = 50ns time_offset = ? submitter = Eric S. Raymond techdoc = http://www.u-blox.com/images/downloads/Product_Docs/u-blox6_ReceiverDescriptionProtocolSpec_%28GPS.G6-SW-10018%29.pdf vendor = u-blox notes = This is the u-blox eval kit for the LEA-6H. Has both USB and RS232 with PPS outputs. Excellent indoor performance, and well suited for time service even though the 6H is not specialized for that. #% UniTraq [WGM-300U] type = device vendor = UniTraq packaging = mouse techdoc = http://www.wintec.com.tw/en/support_detail.php?cate_id=11&support_id=14 uses = Sony CXD2951 configurable = insane interfaces = USB usbchip = CP2101 tested = 2.35 nmea = 3.0 submitter = Reported by Ian Darwin notes = This receiver operates as a generic NMEA device, the Sony binary protocol is unsupported. The receiver seems to lock up if too much data is thrown at it (ie. gpsd probes) thus it may require a read-only (-b) instance of gpsd. (We say 'may' because more recent instances of gpsd break the probe writes into pieces interleaved with read, and may no longer trigger this problem) [UD731] type = device vendor = UniTraq packaging = dongle techdoc = http://www.unitraq.com/product_main.php?id=17 engine = Skytraq Venus 524c rating = excellent interfaces = USB usbchip = CP2101 tested = 3.4 nmea = 3.01 submitter = Reported by Eric S. Raymond notes = Device has two variants; the basic receiver is 'R' and the version with additional data-logger capability is N. Emits only NMEA. Some Web sources incorrectly describe it as SiRF-3-based. #%Variotek [VT-BT-204] type = device engine = Skytraq Venus 6 date = 2010-03-20 model = VT-BT-204 packaging = mouse interfaces = Bluetooth #location = 48.13333 N 11.593281 E #sample_notes = all time fixed submitter = Claus Seitter techdoc = http://variotek.de/wp-content/uploads/2009/02/vt_bt204_guide_english.pdf vendor = Variotek rating = good #% Wintec [WBT-200] type = device vendor = Wintec packaging = mouse techdoc = http://www.wintec.com.tw/en/product_detail.php?pro_id=57 engine = FastraX iTrax03 interfaces = Bluetooth, USB usbchip = CP2101 tested = regression nmea = 3.0 rating = good submitter = Chris Kuethe notes = This receiver operates correctly as a generic NMEA device, iTalk support is also functional, though switching between NMEA and iTalk does not yet work, nor does any device configuration. [WBT-201] type = device vendor = Wintec packaging = mouse techdoc = http://www.wintec.com.tw/en/product_detail.php?pro_id=65 uses = ANTARIS4 interfaces = Bluetooth, USB usbchip = CP2101 tested = 2.33 submitter = Espen Talberg notes = This receiver operates correctly as a generic NMEA device, UBX support is also functional, though switching between NMEA and UBX does not yet work, nor does any device configuration. gpsd-3.15/gpscap.py0000664000175000017500000002102512513107374012377 0ustar esresr""" gpscap - GPS/AIS capability dictionary class. This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. """ import ConfigParser class GPSDictionary(ConfigParser.RawConfigParser): def __init__(self, *files): "Initialize the capability dictionary" ConfigParser.RawConfigParser.__init__(self) if not files: files = ["gpscap.ini", "/usr/share/gpsd/gpscap.ini"] self.read(files) # Resolve uses= members while True: keepgoing = False for section in self.sections(): if self.has_option(section, "uses"): parent = self.get(section, "uses") if self.has_option(parent, "uses"): continue # Found a parent section without a uses = part. for heritable in self.options(parent): if not self.has_option(section, heritable): self.set(section, heritable, self.get(parent, heritable)) keepgoing = True self.remove_option(section, "uses") if not keepgoing: break # Sanity check: All items must have a type field. for section in self.sections(): if not self.has_option(section, "type"): raise ConfigParser.Error("%s has no type" % section) elif self.get(section, "type") not in ("engine", "vendor", "device"): raise ConfigParser.Error("%s has invalid type" % section) # Sanity check: All devices must point at a vendor object. # Side effect: build the lists of vendors and devices. self.vendors = [] self.devices = [] for section in self.sections(): if self.get(section, "type") == "vendor": self.vendors.append(section) if self.get(section, "type") == "device": self.devices.append(section) self.vendors.sort() for section in self.sections(): if self.get(section, "type") == "device": if not self.has_option(section, "vendor"): raise ConfigParser.Error("%s has no vendor" % section) if self.get(section, "vendor") not in self.vendors: raise ConfigParser.Error("%s has invalid vendor" % section) def HTMLDump(self, ofp): thead = """ """ vhead1 = "\n" vhead2 = "\n" hotpluggables = ("pl2303", "CP2101") ofp.write(thead % (len(self.devices), len(self.vendors))) for vendor in self.vendors: if self.has_option(vendor, "notes"): ofp.write(vhead2 % (self.get(vendor, "vendor_site"), vendor, self.get(vendor, "notes"))) else: ofp.write(vhead1 % (self.get(vendor, "vendor_site"), vendor)) relevant = [] for dev in self.devices: if self.get(dev, "vendor") == vendor: relevant.append(dev) relevant.sort() for dev in relevant: rowcolor = "white" if self.get(dev, "packaging") == "OEM module": rowcolor = "#32CD32" elif self.get(dev, "packaging") == "chipset": rowcolor = "#FFFFE0" elif self.get(dev, "packaging") == "handset": rowcolor = "#00FFFF" elif self.get(dev, "packaging") == "hansdfree": rowcolor = "#008B8B" ofp.write("\n" % rowcolor) namefield = dev if self.has_option(dev, "techdoc"): namefield = "%s" % (self.get(dev, "techdoc"), dev) if self.has_option(dev, "discontinued") and self.getboolean(dev, "discontinued"): namefield = namefield + " Discontinued icon" ofp.write("\n" % namefield) ofp.write("\n" % self.get(dev, "packaging")) engine = self.get(dev, "engine") if self.has_option(engine, "techdoc"): engine = "%s" % (self.get(engine, "techdoc"), engine) if self.has_option(dev, "subtype"): engine += " (" + self.get(dev, "subtype") + ")" ofp.write("\n" % engine) interfaces = self.get(dev, "interfaces") if self.has_option(dev, "pps"): interfaces += ",PPS" ofp.write("\n" % interfaces) testfield = "" if self.has_option(dev, "tested"): tested = self.get(dev, "tested") if tested == "regression": testfield += "Regression-test icon" else: testfield += tested if self.has_option(dev, "configurable") and self.get(dev, "configurable") == 'insane': testfield += "No-configure icon" if self.get(dev, "rating") == "excellent": testfield += "Star iconStar iconStar iconStar icon" elif self.get(dev, "rating") == "good": testfield += "Star iconStar iconStar icon" elif self.get(dev, "rating") == "fair": testfield += "Star iconStar icon" elif self.get(dev, "rating") == "poor": testfield += "Star icon" elif self.get(dev, "rating") == "broken": testfield += "Bomb icon" if self.has_option(dev, "usbchip") and self.get(dev, "usbchip") in hotpluggables: testfield += "Hotplug icon" ofp.write("\n" % testfield) nmea = " " if self.has_option(dev, "nmea"): nmea = self.get(dev, "nmea") ofp.write("\n" % nmea) if self.has_option(dev, "pps") and self.get(dev, "pps") == "True": pps_accuracy = time_offset = "" if self.has_option(dev, "pps_accuracy"): pps_accuracy = self.get(dev, "pps_accuracy") if self.has_option(dev, "time_offset"): time_offset = self.get(dev, "time_offset") if pps_accuracy and time_offset: ofp.write("\n" % (pps_accuracy, time_offset)) else: ofp.write("\n") if self.has_option(dev, "notes"): notes = self.get(dev, "notes") else: notes = "" if self.has_option(dev, "submitter"): notes += " Reported by %s." % self.get(dev, "submitter").replace("@", "@").replace("<", "<").replace(">", ">") ofp.write("\n" % notes) ofp.write("\n") ofp.write("
Listing %s devices from %s vendors
Name Packaging Engine Interface Tested with NMEA version PPS Notes
%s
%s

%s

%s%s%s%s%s%s%s
%s
?
\n") else: ofp.write("
No%s
\n") if __name__ == "__main__": import sys try: d = GPSDictionary() d.HTMLDump(sys.stdout) except ConfigParser.Error, e: print >>sys.stderr, sys.argv[0]+":", e raise SystemExit, 1 gpsd-3.15/gpscat0000755000175000017500000001075512472375230011767 0ustar esresr#!/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. # # Display GPS output. Hexify it if necessary. # import os, sys, termios, socket, select, getopt, curses.ascii import gps.packet as sniffer # The spec says 82, but some receivers (TN-200, GSW 2.3.2) output 86 characters NMEA_MAX = 86 # Lowest debug level at which packet getter begins to emit messages, minus one BASELEVEL = sniffer.LOG_IO highhalf_latch = True def hexdump(st): dmp = "" for (_i, ch) in enumerate(st): if curses.ascii.isprint(ord(ch)) or curses.ascii.isspace(ord(ch)): dmp += ch else: dmp += "\\x%02x" % ord(ch) return dmp debuglevel = 0 def reporter(errlevel, msg): if errlevel <= debuglevel: sys.stdout.write(msg) def printusage(): sys.stderr.write("usage: gpscat [-s speed] [-p] [-t] [-D debuglevel] serial-port\n") if __name__ == '__main__': buf = "" try: try: (options, arguments) = getopt.getopt(sys.argv[1:], "hps:tD:V") except getopt.GetoptError, msg: print "gpscat: " + str(msg) raise SystemExit, 1 speed = None parity = None stopbits = None rawmode = True typeflag = False for (switch, val) in options: if switch == '-p': rawmode = False elif switch == '-s': if val[-2] in ('N', 'E', 'O'): parity = val[-2] stopbits = int(val[-1]) val = val[:-2] speed = int(val) elif switch == '-t': typeflag = True rawmode = False elif switch == '-D': debuglevel = BASELEVEL + int(val) elif switch == '-h': printusage() raise SystemExit, 0 if len(arguments) != 1: printusage() raise SystemExit, 1 if "rfcomm" in arguments[0]: # Bluetooth special case s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) s.connect((arguments[0], 1)) tty = s.fileno() else: # Ordinary device tty = os.open(arguments[0], os.O_RDWR) if speed != None: (iflag, oflag, cflag, lflag, ispeed, ospeed, cc) = termios.tcgetattr(tty) try: ispeed = ospeed = eval("termios.B%d" % speed) except AttributeError: sys.stderr.write("gpscat: unknown baud rate %d\n" % speed) raise SystemExit, 1 if stopbits: cflag &= ~termios.CSIZE cflag |= (termios.CS8, termios.CS7)[stopbits-1] if parity: if parity == 'N': iflag &= ~termios.PARENB iflag &= ~termios.INPCK elif parity == 'O': iflag |= termios.INPCK cflag |= termios.PARENB cflag |= termios.PARODD elif parity == 'E': iflag |= termios.INPCK cflag |= termios.PARENB cflag &= ~termios.PARODD termios.tcsetattr(tty, termios.TCSANOW, [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]) poller = select.poll() poller.register(tty, select.POLLIN) buf = "" if not rawmode: getter = sniffer.new() sniffer.register_report(reporter) seqno = 0 while True: (fd, event) = poller.poll()[0] if fd == tty and event == select.POLLIN: if rawmode: buf += os.read(tty, NMEA_MAX) sys.stdout.write(hexdump(buf)) buf = "" else: (length, ptype, packet, counter) = getter.get(tty) seqno += 1 if length == 0: break if typeflag: sys.stdout.write(repr(ptype) + " (" + repr(length) + "@" + repr(counter-length) + "): " + hexdump(packet)) sys.stdout.write("\n") else: sys.stdout.write(hexdump(packet) + "\n") except KeyboardInterrupt: if rawmode: sys.stdout.write("\n") raise SystemExit, 0 # Local variables: # mode: python # end: gpsd-3.15/gpscat.xml0000664000175000017500000001150112520742615012552 0ustar esresr 16 Nov 2006 gpscat 1 The GPSD Project GPSD Documentation gpscat dump the output from a GPS gpscat -s speed -p -t -D debuglevel file-or-serial-port DESCRIPTION gpscat is a simple program for logging and packetizing GPS data streams. It takes input from a specified file or serial device (presumed to have a GPS attached) and reports to standard output. The program runs until end of input or it is interrupted by ^C or other means. It does not terminate on a bad backet; this is intentional. In raw mode (the default) gpscat simply dumps its input to standard output. Nonprintable characters other than ASCII whitespace are rendered as hexadecimal string escapes. In packetizing mode, gpscat uses the same code as gpsd8's packet sniffer to break the input into packets. Packets are reported one per line; line breaks in the packets themselves are escaped. This program is useful as a sanity checker when examining a new device. It can be used as a primitive NMEA logger, but beware that (a) interrupting it likely to cut off output in mid-sentence, and (b) to avoid displaying incomplete NMEA sentences right up next to shell prompts that often contain a $, raw mode always emits an extra final linefeed. Also, be aware that packetizing mode will produce useless results — probably consuming the entirety of input and appearing to hang — if it is fed data that is not a sequence of packets of one of the known types. The program accepts the following options: -p Invoke packetizer mode. -s Set the port's baud rate (and optionally its parity and stop bits) before reading. Argument should begin with one of the normal integer baud rates (300, 1200, 4800, 9600, 19200, 38400, etc.). It may be followed by an optional suffix [NOE][12] to set parity (None, Even, Odd) and stop bits (1 or 2). -t Invoke packetizer mode, with the packet type and length (in parentheses) reported before a colon and space on each line. -D In packetizer mode, enable progress messages from the packet getter. Probably only of interest to developers testing packet getter changes. -h Display program usage and exit. Specifying -s 4800N1 is frequently helpful with unknown devices. SEE ALSO gpsd8, gps1, libgps3, libgpsd3, gpsfake1. gpsprof1, gpsctl1, gpsdctl8, gpsmon1. AUTHOR Eric S. Raymond esr@thyrsus.com. gpsd-3.15/gpsclient.c0000664000175000017500000000526112520742615012711 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * * Python binding for selected libgps library functions */ #include #include #include "gps.h" #include "gpsdclient.h" #include "compiler.h" /* for UNUSED */ /* * Client utility functions */ static PyObject * gpsclient_deg_to_str(PyObject *self UNUSED, PyObject *args) { int fmt; double degrees; if (!PyArg_ParseTuple(args, "id", &fmt, °rees)) return NULL; return Py_BuildValue("s", deg_to_str((enum deg_str_type)fmt, degrees)); } static PyObject * gpsclient_gpsd_units(PyObject *self UNUSED, PyObject *args) { if (!PyArg_ParseTuple(args, "")) return NULL; return Py_BuildValue("i", (int)gpsd_units()); } /* * Miscellanea */ static PyObject * gpsclient_wgs84_separation(PyObject *self UNUSED, PyObject *args) { const double lat, lon; double sep; if (!PyArg_ParseTuple(args, "dd", &lat, &lon)) return NULL; sep = wgs84_separation(lat, lon); return Py_BuildValue("d", sep); } static PyObject * gpsclient_maidenhead(PyObject *self UNUSED, PyObject *args) { const double lat, lon; char *gs; if (!PyArg_ParseTuple(args, "dd", &lat, &lon)) return NULL; gs = maidenhead(lat, lon); return Py_BuildValue("s", gs); } /* List of functions defined in the module */ static PyMethodDef gpsclient_methods[] = { {"wgs84_separation", gpsclient_wgs84_separation, METH_VARARGS, PyDoc_STR("Return WGS84 geodetic separation in meters.")}, {"deg_to_str", gpsclient_deg_to_str, METH_VARARGS, PyDoc_STR("String-format a latitude/longitude.")}, {"gpsd_units", gpsclient_gpsd_units, METH_VARARGS, PyDoc_STR("Deduce a set of units from locale and environment.")}, {"maidenhead", gpsclient_maidenhead, METH_VARARGS, PyDoc_STR("Maidenhead grid-square locator from lat/lon.")}, {NULL, NULL} /* sentinel */ }; PyDoc_STRVAR(module_doc, "Python wrapper for selected libgps library routines.\n\ "); /* banishes a pointless compiler warning */ extern PyMODINIT_FUNC initclienthelpers(void); PyMODINIT_FUNC // cppcheck-suppress unusedFunction initclienthelpers(void) { PyObject *m; m = Py_InitModule3("gps.clienthelpers", gpsclient_methods, module_doc); PyModule_AddIntConstant(m, "deg_dd", deg_dd); PyModule_AddIntConstant(m, "deg_ddmm", deg_ddmm); PyModule_AddIntConstant(m, "deg_ddmmss", deg_ddmmss); PyModule_AddIntConstant(m, "unspecified", unspecified); PyModule_AddIntConstant(m, "imperial", imperial); PyModule_AddIntConstant(m, "nautical", nautical); PyModule_AddIntConstant(m, "metric", metric); } gpsd-3.15/gpsctl.c0000600000175000017500000006075212532625515012213 0ustar esresr/* gpsctl.c -- tweak the control settings on a GPS * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include "gpsd.h" #include "revision.h" #ifdef SHM_EXPORT_ENABLE #include #include #endif /* SHM_EXPORT_ENABLE */ #define HIGH_LEVEL_TIMEOUT 8 static int debuglevel; static bool explicit_timeout = false; static unsigned int timeout = 0; /* no timeout */ static struct gps_context_t context; static bool hunting = true; /* * Set this as high or higher than the maximum number of subtype * probes in drivers.c. */ #define REDIRECT_SNIFF 15 #if defined(RECONFIGURE_ENABLE) || defined(CONTROLSEND_ENABLE) static void settle(struct gps_device_t *session) /* allow the device to settle after a control operation */ { /* * See the 'deep black magic' comment in serial.c:set_serial(). */ (void)tcdrain(session->gpsdata.gps_fd); (void)usleep(50000); (void)tcdrain(session->gpsdata.gps_fd); } #endif /* defined(RECONFIGURE_ENABLE) || defined(CONTROLSEND_ENABLE) */ /* * Allows any response other than ERROR. Use it for queries where a * failure return (due to, for example, a missing driver method) is * immediate, but successful responses have unpredictable lag. */ #define NON_ERROR 0 /* must be distinct from any gps_mask_t value */ static bool gps_query(struct gps_data_t *gpsdata, gps_mask_t expect, const int timeout, const char *fmt, ... ) /* ship a command and wait on an expected response type */ { static fd_set rfds; char buf[BUFSIZ]; va_list ap; time_t starttime; struct timespec tv; sigset_t oldset, blockset; (void)sigemptyset(&blockset); (void)sigaddset(&blockset, SIGHUP); (void)sigaddset(&blockset, SIGINT); (void)sigaddset(&blockset, SIGTERM); (void)sigaddset(&blockset, SIGQUIT); (void)sigprocmask(SIG_BLOCK, &blockset, &oldset); va_start(ap, fmt); (void)vsnprintf(buf, sizeof(buf)-2, fmt, ap); va_end(ap); if (buf[strlen(buf)-1] != '\n') (void)strlcat(buf, "\n", sizeof(buf)); if (write(gpsdata->gps_fd, buf, strlen(buf)) <= 0) { gpsd_log(&context.errout, LOG_ERROR, "gps_query(), write failed\n"); return false; } gpsd_log(&context.errout, LOG_PROG, "gps_query(), wrote, %s\n", buf); FD_ZERO(&rfds); starttime = time(NULL); for (;;) { FD_CLR(gpsdata->gps_fd, &rfds); gpsd_log(&context.errout, LOG_PROG, "waiting...\n"); tv.tv_sec = 2; tv.tv_nsec = 0; if (pselect(gpsdata->gps_fd + 1, &rfds, NULL, NULL, &tv, &oldset) == -1) { if (errno == EINTR || !FD_ISSET(gpsdata->gps_fd, &rfds)) continue; gpsd_log(&context.errout, LOG_ERROR, "select %s\n", strerror(errno)); exit(EXIT_FAILURE); } gpsd_log(&context.errout, LOG_PROG, "reading...\n"); (void)gps_read(gpsdata); if (ERROR_SET & gpsdata->set) { gpsd_log(&context.errout, LOG_ERROR, "error '%s'\n", gpsdata->error); return false; } if ((expect == NON_ERROR) || (expect & gpsdata->set) != 0) return true; else if (timeout > 0 && (time(NULL) - starttime > timeout)) { gpsd_log(&context.errout, LOG_ERROR, "timed out after %d seconds\n", timeout); return false; } } return false; } static void onsig(int sig) { if (sig == SIGALRM) { gpsd_log(&context.errout, LOG_ERROR, "packet recognition timed out.\n"); exit(EXIT_FAILURE); } else { gpsd_log(&context.errout, LOG_ERROR, "killed by signal %d\n", sig); exit(EXIT_SUCCESS); } } static char *gpsd_id(struct gps_device_t *session) /* full ID of the device for reports, including subtype */ { static char buf[128]; if ((session == NULL) || (session->device_type == NULL) || (session->device_type->type_name == NULL)) return "unknown,"; (void)strlcpy(buf, session->device_type->type_name, sizeof(buf)); if (session->subtype[0] != '\0') { (void)strlcat(buf, " ", sizeof(buf)); (void)strlcat(buf, session->subtype, sizeof(buf)); } return (buf); } static void ctlhook(struct gps_device_t *device UNUSED, gps_mask_t changed UNUSED) /* recognize when we've achieved sync */ { static int packet_counter = 0; /* * If it's NMEA, go back around enough times for the type probes to * reveal any secret identity (like SiRF or UBX) the chip might have. * If it's not, getting more packets might fetch subtype information. */ if (packet_counter++ >= REDIRECT_SNIFF) { hunting = false; (void) alarm(0); } } int main(int argc, char **argv) { int option, status; char *device = NULL, *devtype = NULL; char *speed = NULL, *control = NULL, *rate = NULL; bool to_binary = false, to_nmea = false, reset = false; bool lowlevel=false, echo=false; struct gps_data_t gpsdata; const struct gps_type_t *forcetype = NULL; const struct gps_type_t **dp; #ifdef CONTROLSEND_ENABLE char cooked[BUFSIZ]; ssize_t cooklen = 0; #endif /* RECONFIGURE_ENABLE */ context.errout.label = "gpsctl"; #define USAGE "usage: gpsctl [-l] [-b | -n | -r] [-D n] [-s speed] [-c rate] [-T timeout] [-V] [-t devtype] [-x control] [-R] [-e] [device]\n" while ((option = getopt(argc, argv, "bec:fhlnrs:t:x:D:RT:V")) != -1) { switch (option) { case 'b': /* switch to vendor binary mode */ to_binary = true; break; case 'c': #ifdef RECONFIGURE_ENABLE rate = optarg; #else gpsd_log(&context.errout, LOG_ERROR, "cycle-change capability has been conditioned out.\n"); #endif /* RECONFIGURE_ENABLE */ break; case 'x': /* ship specified control string */ #ifdef CONTROLSEND_ENABLE control = optarg; lowlevel = true; if ((cooklen = hex_escapes(cooked, control)) <= 0) { gpsd_log(&context.errout, LOG_ERROR, "invalid escape string (error %d)\n", (int)cooklen); exit(EXIT_FAILURE); } #else gpsd_log(&context.errout, LOG_ERROR, "control_send capability has been conditioned out.\n"); #endif /* CONTROLSEND_ENABLE */ break; case 'e': /* echo specified control string with wrapper */ lowlevel = true; echo = true; break; case 'f': /* force direct access to the device */ lowlevel = true; break; case 'l': /* list known device types */ for (dp = gpsd_drivers; *dp; dp++) { #ifdef RECONFIGURE_ENABLE if ((*dp)->mode_switcher != NULL) (void)fputs("-[bn]\t", stdout); else (void)fputc('\t', stdout); if ((*dp)->speed_switcher != NULL) (void)fputs("-s\t", stdout); else (void)fputc('\t', stdout); if ((*dp)->rate_switcher != NULL) (void)fputs("-c\t", stdout); else (void)fputc('\t', stdout); #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE if ((*dp)->control_send != NULL) (void)fputs("-x\t", stdout); else (void)fputc('\t', stdout); #endif /* CONTROLSEND_ENABLE */ (void)puts((*dp)->type_name); } exit(EXIT_SUCCESS); case 'n': /* switch to NMEA mode */ #ifdef RECONFIGURE_ENABLE to_nmea = true; #else gpsd_log(&context.errout, LOG_ERROR, "speed-change capability has been conditioned out.\n"); #endif /* RECONFIGURE_ENABLE */ break; case 'r': /* force-switch to default mode */ #ifdef RECONFIGURE_ENABLE reset = true; lowlevel = false; /* so we'll abort if the daemon is running */ #else gpsd_log(&context.errout, LOG_ERROR, "reset capability has been conditioned out.\n"); #endif /* RECONFIGURE_ENABLE */ break; case 's': /* change output baud rate */ #ifdef RECONFIGURE_ENABLE speed = optarg; #else gpsd_log(&context.errout, LOG_ERROR, "speed-change capability has been conditioned out.\n"); #endif /* RECONFIGURE_ENABLE */ break; case 't': /* force the device type */ devtype = optarg; break; case 'R': /* remove the SHM export segment */ #ifdef SHM_EXPORT_ENABLE status = shmget(getenv("GPSD_SHM_KEY") ? (key_t)strtol(getenv("GPSD_SHM_KEY"), NULL, 0) : (key_t)GPSD_SHM_KEY, 0, 0); if (status == -1) { gpsd_log(&context.errout, LOG_WARN, "GPSD SHM segment does not exist.\n"); exit(1); } else { status = shmctl(status, IPC_RMID, NULL); if (status == -1) { gpsd_log(&context.errout, LOG_ERROR, "shmctl failed, errno = %d (%s)\n", errno, strerror(errno)); exit(1); } } exit(0); #endif /* SHM_EXPORT_ENABLE */ case 'T': /* set the timeout on packet recognition */ timeout = (unsigned)atoi(optarg); explicit_timeout = true; break; case 'D': /* set debugging level */ debuglevel = atoi(optarg); #ifdef CLIENTDEBUG_ENABLE gps_enable_debug(debuglevel, stderr); #endif /* CLIENTDEBUG_ENABLE */ break; case 'V': (void)fprintf(stderr, "%s: version %s (revision %s)\n", argv[0], VERSION, REVISION); exit(EXIT_SUCCESS); case 'h': default: fprintf(stderr, USAGE); break; } } if (optind < argc) device = argv[optind]; if (devtype != NULL) { int matchcount = 0; for (dp = gpsd_drivers; *dp; dp++) { if (strstr((*dp)->type_name, devtype) != NULL) { forcetype = *dp; matchcount++; } } if (matchcount == 0) gpsd_log(&context.errout, LOG_ERROR, "no driver type name matches '%s'.\n", devtype); else if (matchcount == 1) { assert(forcetype != NULL); gpsd_log(&context.errout, LOG_PROG, "%s driver selected.\n", forcetype->type_name); } else { forcetype = NULL; gpsd_log(&context.errout, LOG_ERROR, "%d driver type names match '%s'.\n", matchcount, devtype); } } if (((int)to_nmea + (int)to_binary + (int)reset) > 1) { gpsd_log(&context.errout, LOG_ERROR, "make up your mind, would you?\n"); exit(EXIT_SUCCESS); } (void) signal(SIGINT, onsig); (void) signal(SIGTERM, onsig); (void) signal(SIGQUIT, onsig); if (!lowlevel) { /* Try to open the stream to gpsd. */ if (gps_open(NULL, NULL, &gpsdata) != 0) { gpsd_log(&context.errout, LOG_ERROR, "no gpsd running or network error: %s.\n", gps_errstr(errno)); lowlevel = true; } } if (!lowlevel) { int i, devcount; if (!explicit_timeout) timeout = HIGH_LEVEL_TIMEOUT; /* what devices have we available? */ if (!gps_query(&gpsdata, DEVICELIST_SET, (int)timeout, "?DEVICES;\n")) { gpsd_log(&context.errout, LOG_ERROR, "no DEVICES response received.\n"); (void)gps_close(&gpsdata); exit(EXIT_FAILURE); } if (gpsdata.devices.ndevices == 0) { gpsd_log(&context.errout, LOG_ERROR, "no devices connected.\n"); (void)gps_close(&gpsdata); exit(EXIT_FAILURE); } else if (gpsdata.devices.ndevices > 1 && device == NULL) { gpsd_log(&context.errout, LOG_ERROR, "multiple devices and no device specified.\n"); (void)gps_close(&gpsdata); exit(EXIT_FAILURE); } gpsd_log(&context.errout, LOG_PROG, "%d device(s) found.\n",gpsdata.devices.ndevices); /* try to mine the devicelist return for the data we want */ if (gpsdata.devices.ndevices == 1 && device == NULL) { device = gpsdata.dev.path; i = 0; } else { assert(device != NULL); for (i = 0; i < gpsdata.devices.ndevices; i++) if (strcmp(device, gpsdata.devices.list[i].path) == 0) { goto devicelist_entry_matches; } gpsd_log(&context.errout, LOG_ERROR, "specified device not found in device list.\n"); (void)gps_close(&gpsdata); exit(EXIT_FAILURE); devicelist_entry_matches:; } gpsdata.dev = gpsdata.devices.list[i]; devcount = gpsdata.devices.ndevices; /* if the device has not identified, watch it until it does so */ if (gpsdata.dev.driver[0] == '\0') { if (gps_stream(&gpsdata, WATCH_ENABLE|WATCH_JSON, NULL) == -1) { gpsd_log(&context.errout, LOG_ERROR, "stream set failed.\n"); (void)gps_close(&gpsdata); exit(EXIT_FAILURE); } while (devcount > 0) { errno = 0; if (gps_read(&gpsdata) == -1) { gpsd_log(&context.errout, LOG_ERROR, "data read failed.\n"); (void)gps_close(&gpsdata); exit(EXIT_FAILURE); } if (gpsdata.set & DEVICE_SET) { --devcount; assert(gpsdata.dev.path[0]!='\0' && gpsdata.dev.driver[0]!='\0'); if (strcmp(gpsdata.dev.path, device) == 0) { goto matching_device_seen; } } } gpsd_log(&context.errout, LOG_ERROR, "data read failed.\n"); (void)gps_close(&gpsdata); exit(EXIT_FAILURE); matching_device_seen:; } /* sanity check */ if (gpsdata.dev.driver[0] == '\0') { gpsd_log(&context.errout, LOG_SHOUT, "%s can't be identified.\n", gpsdata.dev.path); (void)gps_close(&gpsdata); exit(EXIT_SUCCESS); } /* if no control operation was specified, just ID the device */ if (speed==NULL && rate == NULL && !to_nmea && !to_binary && !reset) { (void)printf("%s identified as a %s", gpsdata.dev.path, gpsdata.dev.driver); if (gpsdata.dev.subtype[0] != '\0') { (void)fputc(' ', stdout); (void)fputs(gpsdata.dev.subtype, stdout); } if (gpsdata.dev.baudrate > 0) (void)printf(" at %u baud", gpsdata.dev.baudrate); (void)fputc('.', stdout); (void)fputc('\n', stdout); } status = 0; #ifdef RECONFIGURE_ENABLE if (reset) { gpsd_log(&context.errout, LOG_PROG, "cannot reset with gpsd running.\n"); exit(EXIT_SUCCESS); } /* * We used to wait on DEVICE_SET here. That doesn't work * anymore because when the demon generates its response it * sets the mode bit in the response from the current packet * type, which may not have changed (probably will not have * changed) even though the command to switch modes has been * sent and will shortly take effect. */ if (to_nmea) { if (!gps_query(&gpsdata, NON_ERROR, (int)timeout, "?DEVICE={\"path\":\"%s\",\"native\":0}\r\n", device)) { gpsd_log(&context.errout, LOG_ERROR, "%s mode change to NMEA failed\n", gpsdata.dev.path); status = 1; } else gpsd_log(&context.errout, LOG_PROG, "%s mode change succeeded\n", gpsdata.dev.path); } else if (to_binary) { if (!gps_query(&gpsdata, NON_ERROR, (int)timeout, "?DEVICE={\"path\":\"%s\",\"native\":1}\r\n", device)) { gpsd_log(&context.errout, LOG_ERROR, "%s mode change to native mode failed\n", gpsdata.dev.path); status = 1; } else gpsd_log(&context.errout, LOG_PROG, "%s mode change succeeded\n", gpsdata.dev.path); } if (speed != NULL) { char parity = 'N'; char stopbits = '1'; if (strchr(speed, ':') == NULL) (void)gps_query(&gpsdata, DEVICE_SET, (int)timeout, "?DEVICE={\"path\":\"%s\",\"bps\":%s}\r\n", device, speed); else { char *modespec = strchr(speed, ':'); status = 0; if (modespec!=NULL) { *modespec = '\0'; if (strchr("78", *++modespec) == NULL) { gpsd_log(&context.errout, LOG_ERROR, "No support for that word length.\n"); status = 1; } parity = *++modespec; if (strchr("NOE", parity) == NULL) { gpsd_log(&context.errout, LOG_ERROR, "What parity is '%c'?\n", parity); status = 1; } stopbits = *++modespec; if (strchr("12", stopbits) == NULL) { gpsd_log(&context.errout, LOG_ERROR, "Stop bits must be 1 or 2.\n"); status = 1; } } if (status == 0) (void)gps_query(&gpsdata, DEVICE_SET, (int)timeout, "?DEVICE={\"path\":\"%s\",\"bps\":%s,\"parity\":\"%c\",\"stopbits\":%c}\r\n", device, speed, parity, stopbits); } if (atoi(speed) != (int)gpsdata.dev.baudrate) { gpsd_log(&context.errout, LOG_ERROR, "%s driver won't support %s%c%c\n", gpsdata.dev.path, speed, parity, stopbits); status = 1; } else gpsd_log(&context.errout, LOG_PROG, "%s change to %s%c%c succeeded\n", gpsdata.dev.path, speed, parity, stopbits); } if (rate != NULL) { (void)gps_query(&gpsdata, DEVICE_SET, (int)timeout, "?DEVICE={\"path\":\"%s\",\"cycle\":%s}\n", device, rate); } #endif /* RECONFIGURE_ENABLE */ (void)gps_close(&gpsdata); exit(status); #ifdef RECONFIGURE_ENABLE } else if (reset) { /* hard reset will go through lower-level operations */ const int speeds[] = {2400, 4800, 9600, 19200, 38400, 57600, 115200}; static struct gps_device_t session; /* zero this too */ int i; if (device == NULL || forcetype == NULL) { gpsd_log(&context.errout, LOG_ERROR, "device and type must be specified for the reset operation.\n"); exit(EXIT_FAILURE); } gps_context_init(&context, "gpsctl"); context.errout.debug = debuglevel; session.context = &context; gpsd_tty_init(&session); (void)strlcpy(session.gpsdata.dev.path, device, sizeof(session.gpsdata.dev.path)); session.device_type = forcetype; (void)gpsd_open(&session); (void)gpsd_set_raw(&session); (void)session.device_type->speed_switcher(&session, 4800, 'N', 1); (void)tcdrain(session.gpsdata.gps_fd); for(i = 0; i < (int)(sizeof(speeds) / sizeof(speeds[0])); i++) { (void)gpsd_set_speed(&session, speeds[i], 'N', 1); (void)session.device_type->speed_switcher(&session, 4800, 'N', 1); (void)tcdrain(session.gpsdata.gps_fd); } gpsd_set_speed(&session, 4800, 'N', 1); for (i = 0; i < 3; i++) if (session.device_type->mode_switcher) session.device_type->mode_switcher(&session, MODE_NMEA); gpsd_wrap(&session); exit(EXIT_SUCCESS); #endif /* RECONFIGURE_ENABLE */ } else { /* access to the daemon failed, use the low-level facilities */ static struct gps_device_t session; /* zero this too */ fd_set all_fds; fd_set rfds; /* * Unless the user explicitly requested it, always run to end of * hunt rather than timing out. Otherwise we can easily get messages * that spuriously look like failure at high baud rates. */ gps_context_init(&context, "gpsctl"); context.errout.debug = debuglevel; session.context = &context; /* in case gps_init isn't called */ if (echo) context.readonly = true; if (timeout > 0) { (void) alarm(timeout); (void) signal(SIGALRM, onsig); } /* * Unless the user has forced a type and only wants to see the * string (not send it) we now need to try to open the device * and find out what is actually there. */ if (!(forcetype != NULL && echo)) { int maxfd = 0; int activated = -1; if (device == NULL) { gpsd_log(&context.errout, LOG_ERROR, "device must be specified for low-level access.\n"); exit(EXIT_FAILURE); } gpsd_init(&session, &context, device); activated = gpsd_activate(&session, O_PROBEONLY); if ( 0 > activated ) { if ( PLACEHOLDING_FD == activated ) { (void)printf("%s identified as a %s.\n", device, gpsd_id(&session)); exit(EXIT_SUCCESS); } gpsd_log(&context.errout, LOG_ERROR, "initial GPS device %s open failed\n", device); exit(EXIT_FAILURE); } gpsd_log(&context.errout, LOG_INF, "device %s activated\n", session.gpsdata.dev.path); FD_SET(session.gpsdata.gps_fd, &all_fds); if (session.gpsdata.gps_fd > maxfd) maxfd = session.gpsdata.gps_fd; /* initialize the GPS context's time fields */ gpsd_time_init(&context, time(NULL)); /* grab packets until we time out, get sync, or fail sync */ for (hunting = true; hunting; ) { fd_set efds; switch(gpsd_await_data(&rfds, &efds, maxfd, &all_fds, &context.errout)) { case AWAIT_GOT_INPUT: break; case AWAIT_NOT_READY: /* no recovery from bad fd is possible */ if (FD_ISSET(session.gpsdata.gps_fd, &efds)) exit(EXIT_FAILURE); continue; case AWAIT_FAILED: exit(EXIT_FAILURE); } switch(gpsd_multipoll(FD_ISSET(session.gpsdata.gps_fd, &rfds), &session, ctlhook, 0)) { case DEVICE_READY: FD_SET(session.gpsdata.gps_fd, &all_fds); break; case DEVICE_UNREADY: FD_CLR(session.gpsdata.gps_fd, &all_fds); break; case DEVICE_ERROR: /* this is where a failure to sync lands */ gpsd_log(&context.errout, LOG_WARN, "device error, bailing out.\n"); exit(EXIT_FAILURE); case DEVICE_EOF: gpsd_log(&context.errout, LOG_WARN, "device signed off, bailing out.\n"); exit(EXIT_SUCCESS); default: break; } } gpsd_log(&context.errout, LOG_PROG, "%s looks like a %s at %d.\n", device, gpsd_id(&session), session.gpsdata.dev.baudrate); if (forcetype!=NULL && strcmp("NMEA0183", session.device_type->type_name) !=0 && strcmp(forcetype->type_name, session.device_type->type_name)!=0) { gpsd_log(&context.errout, LOG_ERROR, "'%s' doesn't match non-generic type '%s' of selected device.\n", forcetype->type_name, session.device_type->type_name); } } (void)printf("%s identified as a %s at %u baud.\n", device, gpsd_id(&session), session.gpsdata.dev.baudrate); /* if no control operation was specified, we're done */ if (speed==NULL && !to_nmea && !to_binary && control==NULL) exit(EXIT_SUCCESS); /* maybe user wants to see the packet rather than send it */ if (echo) session.gpsdata.gps_fd = fileno(stdout); /* control op specified; maybe we forced the type */ if (forcetype != NULL) (void)gpsd_switch_driver(&session, forcetype->type_name); /* now perform the actual control function */ status = 0; #ifdef RECONFIGURE_ENABLE if (to_nmea || to_binary) { bool write_enable = context.readonly; context.readonly = false; if (session.device_type->mode_switcher == NULL) { gpsd_log(&context.errout, LOG_SHOUT, "%s devices have no mode switch.\n", session.device_type->type_name); status = 1; } else { int target_mode = to_nmea ? MODE_NMEA : MODE_BINARY; gpsd_log(&context.errout, LOG_SHOUT, "switching to mode %s.\n", to_nmea ? "NMEA" : "BINARY"); session.device_type->mode_switcher(&session, target_mode); settle(&session); } context.readonly = write_enable; } if (speed) { char parity = echo ? 'N': session.gpsdata.dev.parity; int stopbits = echo ? 1 : session.gpsdata.dev.stopbits; char *modespec; modespec = strchr(speed, ':'); status = 0; if (modespec!=NULL) { *modespec = '\0'; if (strchr("78", *++modespec) == NULL) { gpsd_log(&context.errout, LOG_ERROR, "No support for that word lengths.\n"); status = 1; } parity = *++modespec; if (strchr("NOE", parity) == NULL) { gpsd_log(&context.errout, LOG_ERROR, "What parity is '%c'?\n", parity); status = 1; } stopbits = *++modespec; if (strchr("12", parity) == NULL) { gpsd_log(&context.errout, LOG_ERROR, "Stop bits must be 1 or 2.\n"); status = 1; } stopbits = (int)(stopbits-'0'); } if (status == 0) { if (session.device_type->speed_switcher == NULL) { gpsd_log(&context.errout, LOG_ERROR, "%s devices have no speed switch.\n", session.device_type->type_name); status = 1; } else if (session.device_type->speed_switcher(&session, (speed_t)atoi(speed), parity, stopbits)) { settle(&session); gpsd_log(&context.errout, LOG_PROG, "%s change to %s%c%d succeeded\n", session.gpsdata.dev.path, speed, parity, stopbits); } else { gpsd_log(&context.errout, LOG_ERROR, "%s driver won't support %s%c%d.\n", session.gpsdata.dev.path, speed, parity, stopbits); status = 1; } } } if (rate) { bool write_enable = context.readonly; context.readonly = false; if (session.device_type->rate_switcher == NULL) { gpsd_log(&context.errout, LOG_ERROR, "%s devices have no rate switcher.\n", session.device_type->type_name); status = 1; } else { double rate_dbl = strtod(rate, NULL); if (!session.device_type->rate_switcher(&session, rate_dbl)) { gpsd_log(&context.errout, LOG_ERROR, "rate switch failed.\n"); status = 1; } settle(&session); } context.readonly = write_enable; } #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE if (control) { bool write_enable = context.readonly; context.readonly = false; if (session.device_type->control_send == NULL) { gpsd_log(&context.errout, LOG_ERROR, "%s devices have no control sender.\n", session.device_type->type_name); status = 1; } else { if (session.device_type->control_send(&session, cooked, (size_t)cooklen) == -1) { gpsd_log(&context.errout, LOG_ERROR, "control transmission failed.\n"); status = 1; } settle(&session); } context.readonly = write_enable; } #endif /* CONTROLSEND_ENABLE */ exit(status); } } /* end */ gpsd-3.15/gpsctl.xml0000664000175000017500000002302412467342657012604 0ustar esresr 29 Oct 2006 gpsctl 1 The GPSD Project GPSD Documentation gpsctl control the modes of a GPS gpsctl -h -b -n -x control -e -f -l -s speed -t devicetype -R -D debuglevel -V serial-port DESCRIPTION gpsctl can switch a dual-mode GPS between NMEA and vendor-binary modes. It can also be used to set the device baudrate. Note: Not all devices have these capabilities. If you have only one GPS attached to your machine, and gpsd is running, it is not necessary to specify the device; gpsctl does its work through gpsd, which will locate it for you. When gpsd is not running, the device specification is required, and you will need to be running as root or be a member of the device's owning group in order to have write access to the device. On many Unix variants the owning group will be named 'dialout'. The program accepts the following options: -b Put the GPS into native (binary) mode. -c Change the GPS's cycle time. Units are seconds. Note, most GPSes have a fixed cycle time of 1 second. -e Generate the packet from any other arguments specified and ship it to standard output instead of the device. This switch can be used with the option without specifying a device. Note: the packet data for a binary prototype will be raw, not ASCII-ized in any way. -f Force low-level access (not through the daemon). -l List a table showing which option switches can be applied to which device types, and exit. -n Put GPS into NMEA mode. -s Set the baud rate at which the GPS emits packets. Use this option with caution. On USB and Bluetooth GPSes it is also possible for serial mode setting to fail either because the serial adaptor chip does not support non-8N1 modes or because the device firmware does not properly synchronize the serial adaptor chip with the UART on the GPS chipset when the speed changes. These failures can hang your device, possibly requiring a GPS power cycle or (in extreme cases) physically disconnecting the NVRAM backup battery. -t Force the device type. -x Send a specified control string to the GPS; gpsctl will provide packet headers and trailers and checksum as appropriate for binary packet types, and whatever checksum and trailer is required for text packet types. (You must include the leading $ for NMEA packets.) When sending to a UBX device, the first two bytes of the string supplied will become the message class and type, and the remainder the payload. When sending to a Navcom NCT or Trimble TSIP device, the first byte is interpreted as the command ID and the rest as payload. When sending to a Zodiac device, the first two bytes are used as a message ID of type little-endian short, and the remainder as payload in byte pairs interpreted as little-endian short. For all other supported binary GPSes (notably including SiRF) the string is taken as the entire message payload and wrapped with appropriate header, trailer and checksum bytes. C-style backslash escapes in the string, notably \xNN for hex, will be interpreted; additionally, \e will be replaced with ESC. This switch implies . -T Change the sampling timeout. Defaults to 8 seconds, which should always be sufficient to get an identifying packet from a device emitting at the normal rate of 1 per second. -R Remove the GPSD shared-memory segment used for SHM export. This option will normally only be of interest to GPSD developers. -h Display program usage and exit. -D Set level of debug messages. -V Display program version and exit. The argument of the forcing option, , should be a string which is contained in exactly one of the known driver names; for a list, do gpsctl -l. Forcing the device type behaves somewhat differently depending on whether this tool is going through the daemon or not. In high-level mode, if the device that daemon selects for you doesn't match the driver you specified, gpsctl exits with a warning. (This may be useful in scripts.) In low-level mode, if the device identifies as a Generic NMEA, use the selected driver instead. This will be useful if you have a GPS device of known type that is in NMEA mode and not responding to probes. (This option was originally implemented for talking to SiRFStar I chips, which don't respond to the normal SiRF ID probe.) If no options are given, the program will display a message identifying the GPS type of the selected device and exit. Reset (-r) operations must stand alone; others can be combined. Multiple options will be executed in this order: mode changes (-b and -n) first, speed changes (-s) second, and control-string sends (-c) last. ENVIRONMENT VARIABLES By setting the environment variable GPSD_SHM_KEY, you can control the key value used to designate the shared-memory segment removed with the -R option. This will be useful mainly when isolating test instances of gpsd from production ones. EXAMPLES gpsctl /dev/ttyUSB0 Attempt to identify the device on USB serial device 0. Time out after the default number of seconds. Adding the will force low-level access and suppress the normal complaint when this tool can't find a GPSD to work through. gpsctl -f -n -s 9600 /dev/ttyUSB0 Use low-level operations (not going through a gpsd instance) to switch a GPS to NMEA mode at 9600bps. The tool will identify the GPS type itself. BUGS SiRF GPSes can only be identified by the success of an attempt to flip them into SiRF binary mode. Thus, the process of probing one of these running in NMEA will change its behavior. Baud rate and mode changes work in direct mode but are not reliable in client mode. This will be fixed in a future release. SEE ALSO gpsd8, gpsdctl8, gps1, libgps3, libgpsd3, gpsprof1, gpsfake1. AUTHOR Eric S. Raymond esr@thyrsus.com. gpsd-3.15/gpsd.c0000600000175000017500000022347012533057047011652 0ustar esresr/* * This is the main sequence of the gpsd daemon. The IO dispatcher, main * select loop, and user command handling lives here. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include /* for select() */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef AF_UNSPEC #include #endif /* AF_UNSPEC */ #ifndef INADDR_ANY #include #endif /* INADDR_ANY */ #include #include /* for htons() and friends */ #include #include "gpsd_config.h" #include "gpsd.h" #include "sockaddr.h" #include "gps_json.h" #include "revision.h" #include "strfuncs.h" #if defined(SYSTEMD_ENABLE) #include "sd_socket.h" #endif /* * The name of a tty device from which to pick up whatever the local * 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 */ #else #define PROTO_TTY "/dev/ttyS0" /* correct for Linux */ #endif /* * Timeout policy. We can't rely on clients closing connections * correctly, so we need timeouts to tell us when it's OK to * reclaim client fds. COMMAND_TIMEOUT fends off programs * that open connections and just sit there, not issuing a WATCH or * doing anything else that triggers a device assignment. Clients * in watcher or raw mode that don't read their data will get dropped * when throttled_write() fills up the outbound buffers and the * NOREAD_TIMEOUT expires. * * RELEASE_TIMEOUT sets the amount of time we hold a device * open after the last subscriber closes it; this is nonzero so a * client that does open/query/close will have time to come back and * do another single-shot query, if it wants to, before the device is * actually closed. The reason this matters is because some Bluetooth * GPSes not only shut down the GPS receiver on close to save battery * power, they actually shut down the Bluetooth RF stage as well and * only re-wake it periodically to see if an attempt to raise the * device is in progress. The result is that if you close the device * when it's powered up, a re-open can fail with EIO and needs to be * tried repeatedly. Better to avoid this... * * DEVICE_REAWAKE says how long to wait before repolling after a zero-length * read. It's there so we avoid spinning forever on an EOF condition. * * DEVICE_RECONNECT sets interval on retries when (re)connecting to * a device. */ #define COMMAND_TIMEOUT 60*15 #define NOREAD_TIMEOUT 60*3 #define RELEASE_TIMEOUT 60 #define DEVICE_REAWAKE 0.01 #define DEVICE_RECONNECT 2 #define QLEN 5 /* * If ntpshm is enabled, we renice the process to this priority level. * For precise timekeeping increase priority. */ #define NICEVAL -10 #if defined(FIXED_PORT_SPEED) || !defined(SOCKET_EXPORT_ENABLE) /* * Force nowait in two circumstances: * * (1) If we're running with FIXED_PORT_SPEED we're some sort * of embedded configuration where we don't want to wait for connect * * (2) Socket export has been disabled. In this case we have no * way to know when client apps are watching the export channels, * so we need to be running all the time. */ #define FORCE_NOWAIT #endif /* defined(FIXED_PORT_SPEED) || !defined(SOCKET_EXPORT_ENABLE) */ #ifdef SOCKET_EXPORT_ENABLE /* IP version used by the program */ /* AF_UNSPEC: all * AF_INET: IPv4 only * AF_INET6: IPv6 only */ #ifdef IPV6_ENABLE static const int af_allowed = AF_UNSPEC; #else static const int af_allowed = AF_INET; #endif #endif /* SOCKET_EXPORT_ENABLE */ #define AFCOUNT 2 static fd_set all_fds; static int maxfd; static int highwater; #ifndef FORCE_GLOBAL_ENABLE static bool listen_global = false; #endif /* FORCE_GLOBAL_ENABLE */ #ifndef FORCE_NOWAIT #define NOWAIT nowait static bool nowait = false; #else /* FORCE_NOWAIT */ #define NOWAIT true #endif /* FORCE_NOWAIT */ static jmp_buf restartbuf; static struct gps_context_t context; #if defined(SYSTEMD_ENABLE) static int sd_socket_count = 0; #endif /* work around the unfinished ipv6 implementation on hurd */ #ifdef __GNU__ #ifndef IPV6_TCLASS #define IPV6_TCLASS 61 #endif #endif 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; } static void typelist(void) /* list installed drivers and enabled features */ { const struct gps_type_t **dp; for (dp = gpsd_drivers; *dp; dp++) { if ((*dp)->packet_type == COMMENT_PACKET) continue; #ifdef RECONFIGURE_ENABLE if ((*dp)->mode_switcher != NULL) (void)fputs("n\t", stdout); else (void)fputc('\t', stdout); if ((*dp)->speed_switcher != NULL) (void)fputs("b\t", stdout); else (void)fputc('\t', stdout); if ((*dp)->rate_switcher != NULL) (void)fputs("c\t", stdout); else (void)fputc('\t', stdout); if ((*dp)->packet_type > NMEA_PACKET) (void)fputs("*\t", stdout); else (void)fputc('\t', stdout); #endif /* RECONFIGURE_ENABLE */ (void)puts((*dp)->type_name); } (void)printf("# n: mode switch, b: speed switch, " "c: rate switch, *: non-NMEA packet type.\n"); #if defined(SOCKET_EXPORT_ENABLE) (void)printf("# Socket export enabled.\n"); #endif #if defined(SHM_EXPORT_ENABLE) (void)printf("# Shared memory export enabled.\n"); #endif #if defined(DBUS_EXPORT_ENABLE) (void)printf("# DBUS export enabled\n"); #endif #if defined(TIMEHINT_ENABLE) (void)printf("# Time service features enabled.\n"); #endif #if defined(PPS_ENABLE) (void)printf("# PPS enabled.\n"); #endif exit(EXIT_SUCCESS); } static void usage(void) { (void)printf("usage: gpsd [-b] [-n] [-N] [-D n] [-F sockfile] [-G] [-P pidfile] [-S port] [-h] device...\n\ Options include: \n\ -b = bluetooth-safe: open data sources read-only\n\ -n = don't wait for client connects to poll GPS\n\ -N = don't go into background\n\ -F sockfile = specify control socket location\n" #ifndef FORCE_GLOBAL_ENABLE " -G = make gpsd listen on INADDR_ANY\n" #endif /* FORCE_GLOBAL_ENABLE */ " -P pidfile = set file to record process ID \n\ -D integer (default 0) = set debug level \n\ -S integer (default %s) = set port for daemon \n\ -h = help message \n\ -V = emit version and exit.\n\ A device may be a local serial device for GPS input, or a URL in one \n\ of the following forms:\n\ tcp://host[:port]\n\ udp://host[:port]\n\ {dgpsip|ntrip}://[user:passwd@]host[:port][/stream]\n\ gpsd://host[:port][/device][?protocol]\n\ in which case it specifies an input source for device, DGPS or ntrip data.\n\ \n\ The following driver types are compiled into this gpsd instance:\n", DEFAULT_GPSD_PORT); typelist(); } #ifdef CONTROL_SOCKET_ENABLE static socket_t filesock(char *filename) { struct sockaddr_un addr; socket_t sock; if (BAD_SOCKET(sock = socket(AF_UNIX, SOCK_STREAM, 0))) { gpsd_log(&context.errout, LOG_ERROR, "Can't create device-control socket\n"); return -1; } (void)strlcpy(addr.sun_path, filename, sizeof(addr.sun_path)); addr.sun_family = (sa_family_t)AF_UNIX; if (bind(sock, (struct sockaddr *)&addr, (int)sizeof(addr)) < 0) { gpsd_log(&context.errout, LOG_ERROR, "can't bind to local socket %s\n", filename); (void)close(sock); return -1; } if (listen(sock, QLEN) == -1) { gpsd_log(&context.errout, LOG_ERROR, "can't listen on local socket %s\n", filename); (void)close(sock); return -1; } /* coverity[leaked_handle] This is an intentional allocation */ return sock; } #endif /* CONTROL_SOCKET_ENABLE */ #define sub_index(s) (int)((s) - subscribers) #define allocated_device(devp) ((devp)->gpsdata.dev.path[0] != '\0') #define free_device(devp) (devp)->gpsdata.dev.path[0] = '\0' #define initialized_device(devp) ((devp)->context != NULL) /* * This array fills from the bottom, so as an extreme case you can * reduce MAX_DEVICES to 1 in the build recipe. */ static struct gps_device_t devices[MAX_DEVICES]; static void adjust_max_fd(int fd, bool on) /* track the largest fd currently in use */ { if (on) { if (fd > maxfd) maxfd = fd; } else { if (fd == maxfd) { int tfd; for (maxfd = tfd = 0; tfd < FD_SETSIZE; tfd++) if (FD_ISSET(tfd, &all_fds)) maxfd = tfd; } } } #ifdef SOCKET_EXPORT_ENABLE #ifndef IPTOS_LOWDELAY #define IPTOS_LOWDELAY 0x10 #endif static socket_t passivesock_af(int af, char *service, char *tcp_or_udp, int qlen) /* bind a passive command socket for the daemon */ { volatile socket_t s; /* * af = address family, * service = IANA protocol name or number. * tcp_or_udp = TCP or UDP * qlen = maximum wait-queue length for connections */ struct servent *pse; struct protoent *ppe; sockaddr_t sat; int sin_len = 0; int type, proto, one = 1; in_port_t port; char *af_str = ""; const int dscp = IPTOS_LOWDELAY; /* Prioritize packet */ INVALIDATE_SOCKET(s); if ((pse = getservbyname(service, tcp_or_udp))) port = ntohs((in_port_t) pse->s_port); // cppcheck-suppress unreadVariable else if ((port = (in_port_t) atoi(service)) == 0) { gpsd_log(&context.errout, 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; proto = (ppe) ? ppe->p_proto : IPPROTO_UDP; } else { type = SOCK_STREAM; proto = (ppe) ? ppe->p_proto : IPPROTO_TCP; } 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; #ifndef FORCE_GLOBAL_ENABLE if (!listen_global) sat.sa_in.sin_addr.s_addr = htonl(INADDR_LOOPBACK); else #endif /* FORCE_GLOBAL_ENABLE */ sat.sa_in.sin_addr.s_addr = htonl(INADDR_ANY); sat.sa_in.sin_port = htons(port); af_str = "IPv4"; /* see PF_INET6 case below */ s = socket(PF_INET, type, proto); if (s > -1 ) { /* Set packet priority */ if (setsockopt(s, IPPROTO_IP, IP_TOS, &dscp, sizeof(dscp)) == -1) gpsd_log(&context.errout, LOG_WARN, "Warning: SETSOCKOPT TOS failed\n"); } break; #ifdef IPV6_ENABLE 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; #ifndef FORCE_GLOBAL_ENABLE if (!listen_global) sat.sa_in6.sin6_addr = in6addr_loopback; else #endif /* FORCE_GLOBAL_ENABLE */ sat.sa_in6.sin6_addr = in6addr_any; 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. */ af_str = "IPv6"; s = socket(PF_INET6, type, proto); /* * On some network stacks, including Linux's, an IPv6 socket * defaults to listening on IPv4 as well. Unless we disable * this, trying to listen on in6addr_any will fail with the * address-in-use error condition. */ if (s > -1) { int on = 1; if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)) == -1) { gpsd_log(&context.errout, LOG_ERROR, "Error: SETSOCKOPT IPV6_V6ONLY\n"); (void)close(s); return -1; } /* Set packet priority */ if (setsockopt(s, IPPROTO_IPV6, IPV6_TCLASS, &dscp, sizeof(dscp)) == -1) gpsd_log(&context.errout, LOG_WARN, "Warning: SETSOCKOPT TOS failed\n"); } break; #endif /* IPV6_ENABLE */ default: gpsd_log(&context.errout, LOG_ERROR, "unhandled address family %d\n", af); return -1; } gpsd_log(&context.errout, LOG_IO, "opening %s socket\n", af_str); if (BAD_SOCKET(s)) { gpsd_log(&context.errout, 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) { gpsd_log(&context.errout, LOG_ERROR, "Error: SETSOCKOPT SO_REUSEADDR\n"); (void)close(s); return -1; } if (bind(s, &sat.sa, sin_len) < 0) { gpsd_log(&context.errout, LOG_ERROR, "can't bind to %s port %s, %s\n", af_str, service, strerror(errno)); if (errno == EADDRINUSE) { gpsd_log(&context.errout, LOG_ERROR, "maybe gpsd is already running!\n"); } (void)close(s); return -1; } if (type == SOCK_STREAM && listen(s, qlen) == -1) { gpsd_log(&context.errout, LOG_ERROR, "can't listen on port %s\n", service); (void)close(s); return -1; } gpsd_log(&context.errout, LOG_SPIN, "passivesock_af() -> %d\n", s); return s; } /* *INDENT-OFF* */ static int passivesocks(char *service, char *tcp_or_udp, int qlen, socket_t socks[]) { int numsocks = AFCOUNT; int i; for (i = 0; i < AFCOUNT; i++) INVALIDATE_SOCKET(socks[i]); #if defined(SYSTEMD_ENABLE) if (sd_socket_count > 0) { for (i = 0; i < AFCOUNT && i < sd_socket_count - 1; i++) { socks[i] = SD_SOCKET_FDS_START + i + 1; } return sd_socket_count - 1; } #endif if (AF_UNSPEC == af_allowed || (AF_INET == af_allowed)) socks[0] = passivesock_af(AF_INET, service, tcp_or_udp, qlen); if (AF_UNSPEC == af_allowed || (AF_INET6 == af_allowed)) socks[1] = passivesock_af(AF_INET6, service, tcp_or_udp, qlen); 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* */ struct subscriber_t { int fd; /* client file descriptor. -1 if unused */ time_t active; /* when subscriber last polled for data */ struct policy_t policy; /* configurable bits */ pthread_mutex_t mutex; /* serialize access to fd */ }; #define subscribed(sub, devp) (sub->policy.watcher && (sub->policy.devpath[0]=='\0' || strcmp(sub->policy.devpath, devp->gpsdata.dev.path)==0)) static struct subscriber_t subscribers[MAX_CLIENTS]; /* indexed by client file descriptor */ static void lock_subscriber(struct subscriber_t *sub) { (void)pthread_mutex_lock(&sub->mutex); } static void unlock_subscriber(struct subscriber_t *sub) { (void)pthread_mutex_unlock(&sub->mutex); } static 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 for (si = 0; si < NITEMS(subscribers); si++) { if (subscribers[si].fd == UNALLOCATED_FD) { subscribers[si].fd = 0; /* mark subscriber as allocated */ return &subscribers[si]; } } return NULL; } static void detach_client(struct subscriber_t *sub) /* detach a client and terminate the session */ { char *c_ip; lock_subscriber(sub); if (sub->fd == UNALLOCATED_FD) { unlock_subscriber(sub); return; } c_ip = netlib_sock2ip(sub->fd); (void)shutdown(sub->fd, SHUT_RDWR); gpsd_log(&context.errout, LOG_SPIN, "close(%d) in detach_client()\n", sub->fd); (void)close(sub->fd); gpsd_log(&context.errout, LOG_INF, "detaching %s (sub %d, fd %d) in detach_client\n", c_ip, sub_index(sub), sub->fd); FD_CLR(sub->fd, &all_fds); adjust_max_fd(sub->fd, false); sub->active = 0; sub->policy.watcher = false; sub->policy.json = false; sub->policy.nmea = false; sub->policy.raw = 0; sub->policy.scaled = false; sub->policy.timing = false; sub->policy.split24 = false; sub->policy.devpath[0] = '\0'; sub->fd = UNALLOCATED_FD; unlock_subscriber(sub); } 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; if (context.errout.debug >= LOG_CLIENT) { if (isprint((unsigned char) buf[0])) gpsd_log(&context.errout, LOG_CLIENT, "=> client(%d): %s\n", sub_index(sub), buf); else { #ifndef __clang_analyzer__ char *cp, buf2[MAX_PACKET_LENGTH * 3]; buf2[0] = '\0'; for (cp = buf; cp < buf + len; cp++) str_appendf(buf2, sizeof(buf2), "%02x", (unsigned int)(*cp & 0xff)); gpsd_log(&context.errout, LOG_CLIENT, "=> client(%d): =%s\n", sub_index(sub), buf2); #endif /* __clang_analyzer__ */ } } #if defined(PPS_ENABLE) gpsd_acquire_reporting_lock(); #endif /* PPS_ENABLE */ status = send(sub->fd, buf, len, 0); #if defined(PPS_ENABLE) gpsd_release_reporting_lock(); #endif /* PPS_ENABLE */ if (status == (ssize_t) len) return status; else if (status > -1) { gpsd_log(&context.errout, LOG_INF, "short write disconnecting client(%d)\n", 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) gpsd_log(&context.errout, LOG_WARN, "client(%d) has vanished.\n", sub_index(sub)); else if (errno == EWOULDBLOCK && time(NULL) - sub->active > NOREAD_TIMEOUT) gpsd_log(&context.errout, LOG_INF, "client(%d) timed out.\n", sub_index(sub)); else gpsd_log(&context.errout, LOG_INF, "client(%d) write: %s\n", sub_index(sub), strerror(errno)); detach_client(sub); return status; } static void notify_watchers(struct gps_device_t *device, bool onjson, bool onpps, const char *sentence, ...) /* notify all JSON-watching clients of a given device about an event */ { va_list ap; char buf[BUFSIZ]; struct subscriber_t *sub; va_start(ap, sentence); (void)vsnprintf(buf, sizeof(buf), sentence, ap); va_end(ap); for (sub = subscribers; sub < subscribers + MAX_CLIENTS; sub++) if (sub->active != 0 && subscribed(sub, device)) { if ((onjson && sub->policy.json) || (onpps && sub->policy.pps)) (void)throttled_write(sub, buf, strlen(buf)); } } #endif /* SOCKET_EXPORT_ENABLE */ static void deactivate_device(struct gps_device_t *device) /* deactivate device, but leave it in the pool (do not free it) */ { #ifdef SOCKET_EXPORT_ENABLE notify_watchers(device, true, false, "{\"class\":\"DEVICE\",\"path\":\"%s\",\"activated\":0}\r\n", device->gpsdata.dev.path); #endif /* SOCKET_EXPORT_ENABLE */ if (!BAD_SOCKET(device->gpsdata.gps_fd)) { FD_CLR(device->gpsdata.gps_fd, &all_fds); adjust_max_fd(device->gpsdata.gps_fd, false); #ifdef NTPSHM_ENABLE ntpshm_link_deactivate(device); #endif /* NTPSHM_ENABLE */ gpsd_deactivate(device); } } #if defined(SOCKET_EXPORT_ENABLE) || defined(CONTROL_SOCKET_ENABLE) /* *INDENT-OFF* */ static struct gps_device_t *find_device(const char *device_name) /* find the device block for an existing device name */ { struct gps_device_t *devp; for (devp = devices; devp < devices + MAX_DEVICES; devp++) { if (allocated_device(devp) && NULL != device_name && strcmp(devp->gpsdata.dev.path, device_name) == 0) return devp; } return NULL; } /* *INDENT-ON* */ #endif /* defined(SOCKET_EXPORT_ENABLE) || defined(CONTROL_SOCKET_ENABLE) */ static bool open_device( struct gps_device_t *device) /* open the input device * return: false on failure * true on success */ { int activated = -1; if (NULL == device ) { return false; } activated = gpsd_activate(device, O_OPTIMIZE); if ( ( 0 > activated ) && ( PLACEHOLDING_FD != activated ) ) { /* failed to open device, and it is not a /dev/ppsX */ return false; } #ifdef NTPSHM_ENABLE /* * Now is the right time to grab the shared memory segment(s) * to communicate the navigation message derived and (possibly) * 1PPS derived time data to ntpd/chrony. */ ntpshm_link_activate(device); gpsd_log(&context.errout, LOG_INF, "PPS:%s ntpshm_link_activate: %d\n", device->gpsdata.dev.path, device->shm_clock != NULL); #endif /* NTPSHM_ENABLE */ gpsd_log(&context.errout, LOG_INF, "device %s activated\n", device->gpsdata.dev.path); if ( PLACEHOLDING_FD == activated ) { /* it is a /dev/ppsX, no need to select() it */ return true; } FD_SET(device->gpsdata.gps_fd, &all_fds); adjust_max_fd(device->gpsdata.gps_fd, true); ++highwater; return true; } bool gpsd_add_device(const char *device_name, bool flag_nowait) /* add a device to the pool; open it right away if in nowait mode * return: false on failure * true on success */ { struct gps_device_t *devp; bool ret = false; /* we can't handle paths longer than GPS_PATH_MAX, so don't try */ if (strlen(device_name) >= GPS_PATH_MAX) { gpsd_log(&context.errout, LOG_ERROR, "ignoring device %s: path length exceeds maximum %d\n", device_name, GPS_PATH_MAX); return false; } /* stash devicename away for probing when the first client connects */ for (devp = devices; devp < devices + MAX_DEVICES; devp++) if (!allocated_device(devp)) { gpsd_init(devp, &context, device_name); #ifdef NTPSHM_ENABLE ntpshm_session_init(devp); #endif /* NTPSHM_ENABLE */ gpsd_log(&context.errout, LOG_INF, "stashing device %s at slot %d\n", device_name, (int)(devp - devices)); if (!flag_nowait) { devp->gpsdata.gps_fd = UNALLOCATED_FD; ret = true; } else { ret = open_device(devp); } #ifdef SOCKET_EXPORT_ENABLE notify_watchers(devp, true, false, "{\"class\":\"DEVICE\",\"path\":\"%s\",\"activated\":%lf}\r\n", devp->gpsdata.dev.path, timestamp()); #endif /* SOCKET_EXPORT_ENABLE */ break; } return ret; } #ifdef CONTROL_SOCKET_ENABLE static char *snarfline(char *p, char **out) /* copy the rest of the command line, before CR-LF */ { char *q; static char stash[BUFSIZ]; for (q = p; isprint((unsigned char) *p) && !isspace((unsigned char) *p) && (p - q < (ssize_t) sizeof(stash) - 1); p++) continue; (void)memcpy(stash, q, (size_t) (p - q)); stash[p - q] = '\0'; *out = stash; return p; } static void handle_control(int sfd, char *buf) /* handle privileged commands coming through the control socket */ { char *stash; struct gps_device_t *devp; /* * The only other place in the code that knows about the format * of the + and - commands is the gpsd_control() function in * gpsdctl.c. Be careful about keeping them in sync, or * hotplugging will have mysterious failures. */ if (buf[0] == '-') { /* remove device named after - */ (void)snarfline(buf + 1, &stash); gpsd_log(&context.errout, LOG_INF, "<= control(%d): removing %s\n", sfd, stash); if ((devp = find_device(stash))) { 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] == '+') { /* add device named after + */ (void)snarfline(buf + 1, &stash); if (find_device(stash)) { gpsd_log(&context.errout, LOG_INF, "<= control(%d): %s already active \n", sfd, stash); ignore_return(write(sfd, "ERROR\n", 6)); } else { gpsd_log(&context.errout, LOG_INF, "<= control(%d): adding %s\n", sfd, stash); if (gpsd_add_device(stash, NOWAIT)) ignore_return(write(sfd, "OK\n", 3)); else { ignore_return(write(sfd, "ERROR\n", 6)); gpsd_log(&context.errout, LOG_INF, "control(%d): adding %s failed, too many devices active\n", sfd, stash); } } } else if (buf[0] == '!') { /* split line after ! into device=string, send string to device */ char *eq; (void)snarfline(buf + 1, &stash); eq = strchr(stash, '='); if (eq == NULL) { gpsd_log(&context.errout, LOG_WARN, "<= control(%d): ill-formed command \n", sfd); ignore_return(write(sfd, "ERROR\n", 6)); } else { *eq++ = '\0'; if ((devp = find_device(stash))) { if (devp->context->readonly || (devp->sourcetype <= source_blockdev)) { gpsd_log(&context.errout, LOG_WARN, "<= control(%d): attempted to write to a read-only device\n", sfd); ignore_return(write(sfd, "ERROR\n", 6)); } else { gpsd_log(&context.errout, LOG_INF, "<= control(%d): writing to %s \n", sfd, stash); if (write(devp->gpsdata.gps_fd, eq, strlen(eq)) <= 0) { gpsd_log(&context.errout, LOG_WARN, "<= control(%d): write to device failed\n", sfd); ignore_return(write(sfd, "ERROR\n", 6)); } else { ignore_return(write(sfd, "OK\n", 3)); } } } else { gpsd_log(&context.errout, LOG_INF, "<= control(%d): %s not active \n", sfd, stash); ignore_return(write(sfd, "ERROR\n", 6)); } } } else if (buf[0] == '&') { /* split line after & into dev=hexdata, send unpacked hexdata to dev */ char *eq; (void)snarfline(buf + 1, &stash); eq = strchr(stash, '='); if (eq == NULL) { gpsd_log(&context.errout, LOG_WARN, "<= control(%d): ill-formed command\n", sfd); ignore_return(write(sfd, "ERROR\n", 6)); } else { size_t len; *eq++ = '\0'; len = strlen(eq) + 5; if ((devp = find_device(stash)) != NULL) { if (devp->context->readonly || (devp->sourcetype <= source_blockdev)) { gpsd_log(&context.errout, LOG_WARN, "<= control(%d): attempted to write to a read-only device\n", sfd); ignore_return(write(sfd, "ERROR\n", 6)); } else { int st; /* NOTE: this destroys the original buffer contents */ st = gpsd_hexpack(eq, eq, len); if (st <= 0) { gpsd_log(&context.errout, LOG_INF, "<= control(%d): invalid hex string (error %d).\n", sfd, st); ignore_return(write(sfd, "ERROR\n", 6)); } else { gpsd_log(&context.errout, LOG_INF, "<= control(%d): writing %d bytes fromhex(%s) to %s\n", sfd, st, eq, stash); if (write(devp->gpsdata.gps_fd, eq, (size_t) st) <= 0) { gpsd_log(&context.errout, LOG_WARN, "<= control(%d): write to device failed\n", sfd); ignore_return(write(sfd, "ERROR\n", 6)); } else { ignore_return(write(sfd, "OK\n", 3)); } } } } else { gpsd_log(&context.errout, LOG_INF, "<= control(%d): %s not active\n", sfd, stash); ignore_return(write(sfd, "ERROR\n", 6)); } } } else if (strstr(buf, "?devices")==buf) { /* write back devices list followed by OK */ for (devp = devices; devp < devices + MAX_DEVICES; devp++) { char *path = devp->gpsdata.dev.path; ignore_return(write(sfd, path, strlen(path))); ignore_return(write(sfd, "\n", 1)); } ignore_return(write(sfd, "OK\n", 3)); } else { /* unknown command */ ignore_return(write(sfd, "ERROR\n", 6)); } } #endif /* CONTROL_SOCKET_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE static bool awaken(struct gps_device_t *device) /* awaken a device and notify all watchers*/ { /* open that device */ if (!initialized_device(device)) { if (!open_device(device)) { gpsd_log(&context.errout, LOG_WARN, "%s: open failed\n", device->gpsdata.dev.path); free_device(device); return false; } } if (!BAD_SOCKET(device->gpsdata.gps_fd)) { gpsd_log(&context.errout, LOG_PROG, "device %d (fd=%d, path %s) already active.\n", (int)(device - devices), device->gpsdata.gps_fd, device->gpsdata.dev.path); return true; } else { if (gpsd_activate(device, O_OPTIMIZE) < 0) { gpsd_log(&context.errout, LOG_ERROR, "%s: device activation failed.\n", device->gpsdata.dev.path); gpsd_log(&context.errout, LOG_ERROR, "%s: activation failed, freeing device\n", device->gpsdata.dev.path); /* FIXME: works around a crash bug, but prevents retries */ free_device(device); return false; } else { gpsd_log(&context.errout, 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); return true; } } } #ifdef RECONFIGURE_ENABLE static bool privileged_user(struct gps_device_t *device) /* is this channel privileged to change a device's behavior? */ { /* grant user privilege if he's the only one listening to the device */ struct subscriber_t *sub; int subcount = 0; for (sub = subscribers; sub < subscribers + MAX_CLIENTS; sub++) { if (subscribed(sub, device)) subcount++; } /* * Yes, zero subscribers is possible. For example, gpsctl talking * to the daemon connects but doesn't necessarily issue a ?WATCH * before shipping a request, which means it isn't marked as a * subscriber. */ return subcount <= 1; } 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 */ { unsigned int stopbits = device->gpsdata.dev.stopbits; char parity = device->gpsdata.dev.parity; int wordsize = 8; #ifndef __clang_analyzer__ while (isspace((unsigned char) *modestring)) modestring++; if (*modestring && strchr("78", *modestring) != NULL) { wordsize = (int)(*modestring++ - '0'); if (*modestring && strchr("NOE", *modestring) != NULL) { parity = *modestring++; while (isspace((unsigned char) *modestring)) modestring++; if (*modestring && strchr("12", *modestring) != NULL) stopbits = (unsigned int)(*modestring - '0'); } } #endif /* __clang_analyzer__ */ gpsd_log(&context.errout, LOG_PROG, "set_serial(%s,%u,%s) %c%d\n", device->gpsdata.dev.path, (unsigned int)speed, modestring, parity, stopbits); /* no support for other word sizes yet */ /* *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 * GPS before we do the baud rate switch, which * effectively trashes the UART's buffer. * * 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 * so it looks pretty solid. * * The minimum delay time is probably constant * across any given type of UART. */ (void)tcdrain(device->gpsdata.gps_fd); (void)usleep(50000); gpsd_set_speed(device, speed, parity, stopbits); } } /* *INDENT-ON* */ } #endif /* RECONFIGURE_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE static void json_devicelist_dump(char *reply, size_t replylen) { struct gps_device_t *devp; (void)strlcpy(reply, "{\"class\":\"DEVICES\",\"devices\":[", replylen); for (devp = devices; devp < devices + MAX_DEVICES; devp++) 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)); cp = reply + strlen(reply); *--cp = '\0'; *--cp = '\0'; (void)strlcat(reply, ",", replylen); } str_rstrip_char(reply, ','); (void)strlcat(reply, "]}\r\n", replylen); } #endif /* SOCKET_EXPORT_ENABLE */ static void rstrip(char *str) /* strip trailing \r\n\t\SP from a string */ { char *strend; strend = str + strlen(str) - 1; while (isspace((unsigned char) *strend)) { *strend = '\0'; --strend; } } 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; if (buf[0] == '?') ++buf; if (str_starts_with(buf, "DEVICES;")) { buf += 8; json_devicelist_dump(reply, replylen); } else if (str_starts_with(buf, "WATCH") && (buf[5] == ';' || buf[5] == '=')) { const char *start = buf; buf += 5; if (*buf == ';') { ++buf; } else { int status = json_watch_read(buf + 1, &sub->policy, &end); #ifndef TIMING_ENABLE sub->policy.timing = false; #endif /* TIMING_ENABLE */ if (end == NULL) buf += strlen(buf); else { if (*end == ';') ++end; buf = end; } if (status != 0) { (void)snprintf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"Invalid WATCH: %s\"}\r\n", json_error_string(status)); gpsd_log(&context.errout, LOG_ERROR, "response: %s\n", reply); } else if (sub->policy.watcher) { if (sub->policy.devpath[0] == '\0') { /* awaken all devices */ for (devp = devices; devp < devices + MAX_DEVICES; devp++) if (allocated_device(devp)) { (void)awaken(devp); if (devp->sourcetype == source_gpsd) { (void)gpsd_write(devp, "?", 1); (void)gpsd_write(devp, start, (size_t)(end-start)); } } } else { devp = find_device(sub->policy.devpath); if (devp == NULL) { (void)snprintf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"No such device as %s\"}\r\n", sub->policy.devpath); gpsd_log(&context.errout, LOG_ERROR, "response: %s\n", reply); goto bailout; } else if (awaken(devp)) { if (devp->sourcetype == source_gpsd) { (void)gpsd_write(devp, "?", 1); (void)gpsd_write(devp, start, (size_t)(end-start)); } } else { (void)snprintf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"Can't assign %s\"}\r\n", sub->policy.devpath); gpsd_log(&context.errout, LOG_ERROR, "response: %s\n", 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 (str_starts_with(buf, "DEVICE") && (buf[6] == ';' || buf[6] == '=')) { struct devconfig_t devconf; buf += 6; devconf.path[0] = '\0'; /* initially, no device selection */ if (*buf == ';') { ++buf; } else { #ifdef RECONFIGURE_ENABLE struct gps_device_t *device; /* first, select a device to operate on */ int status = json_device_read(buf + 1, &devconf, &end); if (end == NULL) buf += strlen(buf); else { if (*end == ';') ++end; buf = end; } device = NULL; if (status != 0) { (void)snprintf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"Invalid DEVICE: \"%s\"}\r\n", json_error_string(status)); gpsd_log(&context.errout, LOG_ERROR, "response: %s\n", reply); goto bailout; } else { if (devconf.path[0] != '\0') { /* user specified a path, try to assign it */ device = find_device(devconf.path); /* do not optimize away, we need 'device' later on! */ if (device == NULL || !awaken(device)) { (void)snprintf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"Can't open %s.\"}\r\n", devconf.path); gpsd_log(&context.errout, LOG_ERROR, "response: %s\n", reply); goto bailout; } } else { /* no path specified */ int devcount = 0; for (devp = devices; devp < devices + MAX_DEVICES; devp++) if (allocated_device(devp)) { device = devp; devcount++; } if (devcount == 0) { (void)strlcat(reply, "{\"class\":\"ERROR\",\"message\":\"Can't perform DEVICE configuration, no devices attached.\"}\r\n", replylen); gpsd_log(&context.errout, LOG_ERROR, "response: %s\n", reply); goto bailout; } else if (devcount > 1) { str_appendf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"No path specified in DEVICE, but multiple devices are attached.\"}\r\n"); gpsd_log(&context.errout, LOG_ERROR, "response: %s\n", reply); goto bailout; } /* we should have exactly one device now */ } if (!privileged_user(device)) str_appendf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"Multiple subscribers, cannot change control bits on %s.\"}\r\n", device->gpsdata.dev.path); else if (device->device_type == NULL) str_appendf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"Type of %s is unknown.\"}\r\n", device->gpsdata.dev.path); else { const struct gps_type_t *dt = device->device_type; bool no_serial_change = (devconf.baudrate == DEVDEFAULT_BPS) && (devconf.parity == DEVDEFAULT_PARITY) && (devconf.stopbits == DEVDEFAULT_STOPBITS); /* interpret defaults */ if (devconf.baudrate == DEVDEFAULT_BPS) devconf.baudrate = (uint) gpsd_get_speed(device); if (devconf.parity == DEVDEFAULT_PARITY) devconf.stopbits = device->gpsdata.dev.stopbits; if (devconf.stopbits == DEVDEFAULT_STOPBITS) devconf.stopbits = device->gpsdata.dev.stopbits; if (isnan(devconf.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) dt->mode_switcher(device, devconf.driver_mode); if (!no_serial_change) { char serialmode[3]; serialmode[0] = devconf.parity; serialmode[1] = '0' + devconf.stopbits; serialmode[2] = '\0'; set_serial(device, (speed_t) devconf.baudrate, serialmode); } if (devconf.cycle != device->gpsdata.dev.cycle && devconf.cycle >= dt->min_cycle && dt->rate_switcher != NULL) if (dt->rate_switcher(device, devconf.cycle)) device->gpsdata.dev.cycle = devconf.cycle; } } #else /* RECONFIGURE_ENABLE */ str_appendf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"Device configuration support not compiled.\"}\r\n"); #endif /* RECONFIGURE_ENABLE */ } /* dump a response for each selected channel */ for (devp = devices; devp < devices + MAX_DEVICES; devp++) if (!allocated_device(devp)) continue; else if (devconf.path[0] != '\0' && strcmp(devp->gpsdata.dev.path, devconf.path) != 0) continue; else { json_device_dump(devp, reply + strlen(reply), replylen - strlen(reply)); } } else if (str_starts_with(buf, "POLL;")) { char tbuf[JSON_DATE_MAX+1]; int active = 0; buf += 5; for (devp = devices; devp < devices + MAX_DEVICES; devp++) if (allocated_device(devp) && subscribed(sub, devp)) if ((devp->observed & GPS_TYPEMASK) != 0) active++; (void)snprintf(reply, replylen, "{\"class\":\"POLL\",\"time\":\"%s\",\"active\":%d,\"tpv\":[", unix_to_iso8601(timestamp(), tbuf, sizeof(tbuf)), active); for (devp = devices; devp < devices + MAX_DEVICES; devp++) { if (allocated_device(devp) && subscribed(sub, devp)) { if ((devp->observed & GPS_TYPEMASK) != 0) { json_tpv_dump(devp, &sub->policy, reply + strlen(reply), replylen - strlen(reply)); rstrip(reply); (void)strlcat(reply, ",", replylen); } } } str_rstrip_char(reply, ','); (void)strlcat(reply, "],\"gst\":[", replylen); for (devp = devices; devp < devices + MAX_DEVICES; devp++) { if (allocated_device(devp) && subscribed(sub, devp)) { if ((devp->observed & GPS_TYPEMASK) != 0) { json_noise_dump(&devp->gpsdata, reply + strlen(reply), replylen - strlen(reply)); rstrip(reply); (void)strlcat(reply, ",", replylen); } } } str_rstrip_char(reply, ','); (void)strlcat(reply, "],\"sky\":[", replylen); for (devp = devices; devp < devices + MAX_DEVICES; devp++) { if (allocated_device(devp) && subscribed(sub, devp)) { if ((devp->observed & GPS_TYPEMASK) != 0) { json_sky_dump(&devp->gpsdata, reply + strlen(reply), replylen - strlen(reply)); rstrip(reply); (void)strlcat(reply, ",", replylen); } } } str_rstrip_char(reply, ','); (void)strlcat(reply, "]}\r\n", replylen); } else if (str_starts_with(buf, "VERSION;")) { buf += 8; json_version_dump(reply, replylen); } else { const char *errend; errend = buf + strlen(buf) - 1; while (isspace((unsigned char) *errend) && errend > buf) --errend; (void)snprintf(reply, replylen, "{\"class\":\"ERROR\",\"message\":\"Unrecognized request '%.*s'\"}\r\n", (int)(errend - buf), buf); gpsd_log(&context.errout, LOG_ERROR, "ERROR response: %s\n", reply); buf += strlen(buf); } bailout: *after = buf; } static void raw_report(struct subscriber_t *sub, struct gps_device_t *device) /* report a raw packet to a subscriber */ { /* *INDENT-OFF* */ /* * NMEA and other textual sentences are simply * copied to all clients that are in raw or nmea * mode. */ if (TEXTUAL_PACKET_TYPE(device->lexer.type) && (sub->policy.raw > 0 || sub->policy.nmea)) { (void)throttled_write(sub, (char *)device->lexer.outbuffer, device->lexer.outbuflen); return; } /* * Also, simply copy if user has specified * super-raw mode. */ if (sub->policy.raw > 1) { (void)throttled_write(sub, (char *)device->lexer.outbuffer, device->lexer.outbuflen); return; } #ifdef BINARY_ENABLE /* * Maybe the user wants a binary packet hexdumped. */ if (sub->policy.raw == 1) { const char *hd = gpsd_hexdump(device->msgbuf, sizeof(device->msgbuf), (char *)device->lexer.outbuffer, device->lexer.outbuflen); (void)strlcat((char *)hd, "\r\n", sizeof(device->msgbuf)); (void)throttled_write(sub, (char *)hd, strlen(hd)); } #endif /* BINARY_ENABLE */ } static void pseudonmea_report(struct subscriber_t *sub, gps_mask_t changed, struct gps_device_t *device) /* report pseudo-NMEA in appropriate circumstances */ { if (GPS_PACKET_TYPE(device->lexer.type) && !TEXTUAL_PACKET_TYPE(device->lexer.type)) { char buf[MAX_PACKET_LENGTH * 3 + 2]; if ((changed & REPORT_IS) != 0) { nmea_tpv_dump(device, buf, sizeof(buf)); gpsd_log(&context.errout, LOG_IO, "<= GPS (binary tpv) %s: %s\n", device->gpsdata.dev.path, buf); (void)throttled_write(sub, buf, strlen(buf)); } if ((changed & SATELLITE_SET) != 0) { nmea_sky_dump(device, buf, sizeof(buf)); gpsd_log(&context.errout, LOG_IO, "<= GPS (binary sky) %s: %s\n", device->gpsdata.dev.path, buf); (void)throttled_write(sub, buf, strlen(buf)); } if ((changed & SUBFRAME_SET) != 0) { nmea_subframe_dump(device, buf, sizeof(buf)); gpsd_log(&context.errout, LOG_IO, "<= GPS (binary subframe) %s: %s\n", device->gpsdata.dev.path, buf); (void)throttled_write(sub, buf, strlen(buf)); } #ifdef AIVDM_ENABLE if ((changed & AIS_SET) != 0) { nmea_ais_dump(device, buf, sizeof(buf)); gpsd_log(&context.errout, LOG_IO, "<= AIS (binary ais) %s: %s\n", device->gpsdata.dev.path, buf); (void)throttled_write(sub, buf, strlen(buf)); } #endif /* AIVDM_ENABLE */ } } #endif /* SOCKET_EXPORT_ENABLE */ static void all_reports(struct gps_device_t *device, gps_mask_t changed) /* report on the current packet from a specified device */ { #ifdef SOCKET_EXPORT_ENABLE struct subscriber_t *sub; /* add any just-identified device to watcher lists */ if ((changed & DRIVER_IS) != 0) { bool listeners = false; for (sub = subscribers; sub < subscribers + MAX_CLIENTS; sub++) if (sub->active != 0 && sub->policy.watcher && subscribed(sub, device)) listeners = true; if (listeners) { (void)awaken(device); } } /* handle laggy response to a firmware version query */ if ((changed & (DEVICEID_SET | DRIVER_IS)) != 0) { if (device->device_type == NULL) gpsd_log(&context.errout, LOG_ERROR, "internal error - device type of %s not set when expected\n", device->gpsdata.dev.path); else { char id2[GPS_JSON_RESPONSE_MAX]; json_device_dump(device, id2, sizeof(id2)); notify_watchers(device, true, false, id2); } } #endif /* SOCKET_EXPORT_ENABLE */ /* * If the device provided an RTCM packet, repeat it to all devices. */ if ((changed & RTCM2_SET) != 0 || (changed & RTCM3_SET) != 0) { if (device->lexer.outbuflen > RTCM_MAX) { gpsd_log(&context.errout, LOG_ERROR, "overlong RTCM packet (%zd bytes)\n", device->lexer.outbuflen); } else { struct gps_device_t *dp; for (dp = devices; dp < devices+MAX_DEVICES; dp++) { if (allocated_device(dp)) { /* *INDENT-OFF* */ if (dp->device_type->rtcm_writer != NULL) { if (dp->device_type->rtcm_writer(dp, (const char *)device->lexer.outbuffer, device->lexer.outbuflen) == 0) gpsd_log(&context.errout, LOG_ERROR, "Write to RTCM sink failed\n"); else { gpsd_log(&context.errout, LOG_IO, "<= DGPS: %zd bytes of RTCM relayed.\n", device->lexer.outbuflen); } } /* *INDENT-ON* */ } } } } #ifdef NTP_ENABLE /* * Time is eligible for shipping to NTPD if the driver has * asserted PPSTIME_IS at any point in the current cycle. */ if ((changed & CLEAR_IS)!=0) device->ship_to_ntpd = false; if ((changed & PPSTIME_IS)!=0) device->ship_to_ntpd = true; /* * Only update the NTP time if we've seen the leap-seconds data. * Else we may be providing GPS time. */ if ((changed & TIME_SET) == 0) { //gpsd_log(&context.errout, LOG_PROG, "NTP: No time this packet\n"); } else if ( 0 >= device->fixcnt ) { /* many GPS spew random times until a valid GPS fix */ //gpsd_log(&context.errout, LOG_PROG, "NTP: no fix\n"); } else if (isnan(device->newdata.time)) { //gpsd_log(&context.errout, LOG_PROG, "NTP: bad new time\n"); #if defined(PPS_ENABLE) } else if (device->newdata.time <= device->pps_thread.fix_in.real.tv_sec) { //gpsd_log(&context.errout, LOG_PROG, "NTP: Not a new time\n"); #endif /* PPS_ENABLE */ } else if (!device->ship_to_ntpd) { //gpsd_log(&context.errout, LOG_PROG, "NTP: No precision time report\n"); } else { struct timedelta_t td; #if defined(PPS_ENABLE) struct gps_device_t *ppsonly; #endif /* PPS_ENABLE */ ntp_latch(device, &td); #if defined(PPS_ENABLE) /* propagate this in-band-time to all PPS-only devices */ for (ppsonly = devices; ppsonly < devices + MAX_DEVICES; ppsonly++) if (ppsonly->sourcetype == source_pps) pps_thread_fixin(&ppsonly->pps_thread, &td); #endif /* PPS_ENABLE */ #ifdef NTPSHM_ENABLE if (device->shm_clock != NULL) { (void)ntpshm_put(device, device->shm_clock, &td); } #endif /* NTPSHM_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE notify_watchers(device, false, true, "{\"class\":\"TOFF\",\"device\":\"%s\",\"real_sec\":%ld, \"real_nsec\":%ld,\"clock_sec\":%ld,\"clock_nsec\":%ld}\r\n", device->gpsdata.dev.path, td.real.tv_sec, td.real.tv_nsec, td.clock.tv_sec, td.clock.tv_nsec); #endif /* SOCKET_EXPORT_ENABLE */ } #endif /* NTP_ENABLE */ /* * If no reliable end of cycle, must report every time * a sentence changes position or mode. Likely to * cause display jitter. */ if (!device->cycle_end_reliable && (changed & (LATLON_SET | MODE_SET))!=0) changed |= REPORT_IS; /* a few things are not per-subscriber reports */ if ((changed & REPORT_IS) != 0) { #ifdef NETFEED_ENABLE if (device->gpsdata.fix.mode == MODE_3D) { struct gps_device_t *dgnss; /* * Pass the fix to every potential caster, here. * netgnss_report() individual caster types get to * make filtering decisiona. */ for (dgnss = devices; dgnss < devices + MAX_DEVICES; dgnss++) if (dgnss != device) netgnss_report(&context, device, dgnss); } #endif /* NETFEED_ENABLE */ #if defined(DBUS_EXPORT_ENABLE) if (device->gpsdata.fix.mode > MODE_NO_FIX) send_dbus_fix(device); #endif /* defined(DBUS_EXPORT_ENABLE) */ } #ifdef SHM_EXPORT_ENABLE if ((changed & (REPORT_IS|GST_SET|SATELLITE_SET|SUBFRAME_SET| ATTITUDE_SET|RTCM2_SET|RTCM3_SET|AIS_SET)) != 0) shm_update(&context, &device->gpsdata); #endif /* SHM_EXPORT_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE /* update all subscribers associated with this device */ for (sub = subscribers; sub < subscribers + MAX_CLIENTS; sub++) { if (sub == NULL || sub->active == 0 || !subscribed(sub, device)) continue; #ifdef PASSTHROUGH_ENABLE /* this is for passing through JSON packets */ if ((changed & PASSTHROUGH_IS) != 0) { (void)strlcat((char *)device->lexer.outbuffer, "\r\n", sizeof(device->lexer.outbuffer)); (void)throttled_write(sub, (char *)device->lexer.outbuffer, device->lexer.outbuflen+2); continue; } #endif /* PASSTHROUGH_ENABLE */ /* report raw packets to users subscribed to those */ raw_report(sub, device); /* some listeners may be in watcher mode */ if (sub->policy.watcher) { if (changed & DATA_IS) { /* guard keeps mask dumper from eating CPU */ if (context.errout.debug >= LOG_PROG) gpsd_log(&context.errout, LOG_PROG, "Changed mask: %s with %sreliable cycle detection\n", gps_maskdump(changed), device->cycle_end_reliable ? "" : "un"); if ((changed & REPORT_IS) != 0) gpsd_log(&context.errout, LOG_PROG, "time to report a fix\n"); if (sub->policy.nmea) pseudonmea_report(sub, changed, device); if (sub->policy.json) { char buf[GPS_JSON_RESPONSE_MAX * 4]; if ((changed & AIS_SET) != 0) if (device->gpsdata.ais.type == 24 && device->gpsdata.ais.type24.part != both && !sub->policy.split24) continue; json_data_report(changed, device, &sub->policy, buf, sizeof(buf)); if (buf[0] != '\0') (void)throttled_write(sub, buf, strlen(buf)); } } } } /* subscribers */ #endif /* SOCKET_EXPORT_ENABLE */ } #ifdef SOCKET_EXPORT_ENABLE static int handle_gpsd_request(struct subscriber_t *sub, const char *buf) /* execute GPSD requests from a buffer */ { char reply[GPS_JSON_RESPONSE_MAX + 1]; reply[0] = '\0'; if (buf[0] == '?') { const char *end; for (end = buf; *buf != '\0'; buf = end) if (isspace((unsigned char) *buf)) end = buf + 1; else handle_request(sub, buf, &end, reply + strlen(reply), sizeof(reply) - strlen(reply)); } return (int)throttled_write(sub, reply, strlen(reply)); } #endif /* SOCKET_EXPORT_ENABLE */ #if defined(CONTROL_SOCKET_ENABLE) && defined(PPS_ENABLE) && defined(SOCKET_EXPORT_ENABLE) static void ship_pps_message(struct gps_device_t *session, struct timedelta_t *td) /* on PPS interrupt, ship a message to all clients */ { int precision = -20; if ( source_usb == session->sourcetype) { /* PPS over USB not so good */ precision = -10; } /* real_XXX - the time the GPS thinks it is at the PPS edge */ /* clock_XXX - the time the system clock thinks it is at the PPS edge */ notify_watchers(session, true, true, "{\"class\":\"PPS\",\"device\":\"%s\",\"real_sec\":%ld, \"real_nsec\":%ld,\"clock_sec\":%ld,\"clock_nsec\":%ld,\"precision\":%d}\r\n", session->gpsdata.dev.path, td->real.tv_sec, td->real.tv_nsec, td->clock.tv_sec, td->clock.tv_nsec, precision); /* * PPS receipt resets the device's timeout. This keeps PPS-only * devices, which never deliver in-band data, from timing out. */ session->gpsdata.online = timestamp(); } #endif #ifdef __UNUSED_AUTOCONNECT__ #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 { double lat, lon; char server[257]; double dist; }; 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 */ } static void netgnss_autoconnect(struct gps_context_t *context, 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; char buf[BUFSIZ]; FILE *sfp = fopen(serverlist, "r"); if (sfp == NULL) { gpsd_log(&context.errout, LOG_ERROR, "no DGPS server list found.\n"); return; } for (sp = keep; sp < keep + SERVER_SAMPLE; sp++) { sp->dist = DGPS_THRESHOLD; sp->server[0] = '\0'; } while (fgets(buf, (int)sizeof(buf), sfp)) { char *cp = strchr(buf, '#'); if (cp != NULL) *cp = '\0'; if (sscanf(buf, "%32lf %32lf %256s", &hold.lat, &hold.lon, hold.server) == 3) { hold.dist = earth_distance(lat, lon, hold.lat, hold.lon); tp = NULL; /* * The idea here is to look for a server in the sample array * that is (a) closer than the one we're checking, and (b) * furtherest away of all those that are closer. Replace it. * 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)) tp = sp; if (tp != NULL) *tp = hold; } } (void)fclose(sfp); if (keep[0].server[0] == '\0') { gpsd_log(&context.errout, LOG_ERROR, "no DGPS servers within %dm.\n", (int)(DGPS_THRESHOLD / 1000)); return; } /* sort them and try the closest first */ 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_log(&context.errout, LOG_INF, "%s is %dkm away.\n", sp->server, (int)(sp->dist / 1000)); if (dgpsip_open(context, sp->server) >= 0) break; } } } #endif /* __UNUSED_AUTOCONNECT__ */ #ifdef PPS_ENABLE #define CONDITIONALLY_UNUSED #else #define CONDITIONALLY_UNUSED UNUSED #endif /* PPS_ENABLE */ static void gpsd_terminate(struct gps_context_t *context CONDITIONALLY_UNUSED) /* finish cleanly, reverting device configuration */ { int dfd; for (dfd = 0; dfd < MAX_DEVICES; dfd++) { if (allocated_device(&devices[dfd])) { (void)gpsd_wrap(&devices[dfd]); } } #ifdef PPS_ENABLE context->pps_hook = NULL; /* tell any PPS-watcher thread to die */ #endif /* PPS_ENABLE */ } int main(int argc, char *argv[]) { /* some of these statics suppress -W warnings due to longjmp() */ #ifdef SOCKET_EXPORT_ENABLE static char *gpsd_service = NULL; struct subscriber_t *sub; #endif /* SOCKET_EXPORT_ENABLE */ fd_set rfds; #ifdef CONTROL_SOCKET_ENABLE fd_set control_fds; #endif /* CONTROL_SOCKET_ENABLE */ #ifdef CONTROL_SOCKET_ENABLE static socket_t csock; socket_t cfd; static char *control_socket = NULL; #endif /* CONTROL_SOCKET_ENABLE */ #if defined(SOCKET_EXPORT_ENABLE) || defined(CONTROL_SOCKET_ENABLE) sockaddr_t fsin; #endif /* defined(SOCKET_EXPORT_ENABLE) || defined(CONTROL_SOCKET_ENABLE) */ static char *pid_file = NULL; struct gps_device_t *device; int i, option; int msocks[2] = {-1, -1}; bool go_background = true; volatile bool in_restart; gps_context_init(&context, "gpsd"); #ifdef CONTROL_SOCKET_ENABLE INVALIDATE_SOCKET(csock); #if defined(PPS_ENABLE) && defined(SOCKET_EXPORT_ENABLE) context.pps_hook = ship_pps_message; #endif /* PPS_ENABLE && SOCKET_EXPORT_ENABLE */ #endif /* CONTROL_SOCKET_ENABLE */ while ((option = getopt(argc, argv, "F:D:S:bGhlNnP:V")) != -1) { switch (option) { case 'D': context.errout.debug = (int)strtol(optarg, 0, 0); #ifdef CLIENTDEBUG_ENABLE gps_enable_debug(context.errout.debug, stderr); #endif /* CLIENTDEBUG_ENABLE */ break; #ifdef CONTROL_SOCKET_ENABLE case 'F': control_socket = optarg; break; #endif /* CONTROL_SOCKET_ENABLE */ case 'N': go_background = false; break; case 'b': context.readonly = true; break; #ifndef FORCE_GLOBAL_ENABLE case 'G': listen_global = true; break; #endif /* FORCE_GLOBAL_ENABLE */ case 'l': /* list known device types and exit */ typelist(); break; case 'S': #ifdef SOCKET_EXPORT_ENABLE gpsd_service = optarg; #endif /* SOCKET_EXPORT_ENABLE */ break; case 'n': #ifndef FORCE_NOWAIT nowait = true; #endif /* FORCE_NOWAIT */ break; case 'P': pid_file = optarg; break; case 'V': (void)printf("%s: %s (revision %s)\n", argv[0], VERSION, REVISION); exit(EXIT_SUCCESS); case 'h': case '?': default: usage(); exit(EXIT_SUCCESS); } } /* sanity check */ if (argc - optind > MAX_DEVICES) { gpsd_log(&context.errout, LOG_ERROR, "too many devices on command line\n"); exit(1); } #if defined(SYSTEMD_ENABLE) && defined(CONTROL_SOCKET_ENABLE) sd_socket_count = sd_get_socket_count(); if (sd_socket_count > 0 && control_socket != NULL) { gpsd_log(&context.errout, LOG_WARN, "control socket passed on command line ignored\n"); control_socket = NULL; } #endif #if defined(CONTROL_SOCKET_ENABLE) || defined(SYSTEMD_ENABLE) if ( #ifdef CONTROL_SOCKET_ENABLE control_socket == NULL #endif #if defined(CONTROL_SOCKET_ENABLE) && defined(SYSTEMD_ENABLE) && #endif #ifdef SYSTEMD_ENABLE sd_socket_count <= 0 #endif && optind >= argc) { gpsd_log(&context.errout, LOG_ERROR, "can't run with neither control socket nor devices\n"); exit(EXIT_FAILURE); } /* * Control socket has to be created before we go background in order to * avoid a race condition in which hotplug scripts can try opening * the socket before it's created. */ #if defined(SYSTEMD_ENABLE) && defined(CONTROL_SOCKET_ENABLE) if (sd_socket_count > 0) { csock = SD_SOCKET_FDS_START; FD_SET(csock, &all_fds); adjust_max_fd(csock, true); } #endif #ifdef CONTROL_SOCKET_ENABLE if (control_socket) { (void)unlink(control_socket); if (BAD_SOCKET(csock = filesock(control_socket))) { gpsd_log(&context.errout, LOG_ERROR, "control socket create failed, netlib error %d\n", csock); exit(EXIT_FAILURE); } else gpsd_log(&context.errout, LOG_SPIN, "control socket %s is fd %d\n", control_socket, csock); FD_SET(csock, &all_fds); adjust_max_fd(csock, true); gpsd_log(&context.errout, LOG_PROG, "control socket opened at %s\n", control_socket); } #endif /* CONTROL_SOCKET_ENABLE */ #else if (optind >= argc) { gpsd_log(&context.errout, LOG_ERROR, "can't run with no devices specified\n"); exit(EXIT_FAILURE); } #endif /* defined(CONTROL_SOCKET_ENABLE) || defined(SYSTEMD_ENABLE) */ /* might be time to daemonize */ if (go_background) { /* not SuS/POSIX portable, but we have our own fallback version */ if (daemon(0, 0) != 0) gpsd_log(&context.errout, LOG_ERROR, "demonization failed: %s\n",strerror(errno)); } if (pid_file != NULL) { FILE *fp; if ((fp = fopen(pid_file, "w")) != NULL) { (void)fprintf(fp, "%u\n", (unsigned int)getpid()); (void)fclose(fp); } else { gpsd_log(&context.errout, LOG_ERROR, "Cannot create PID file: %s.\n", pid_file); } } openlog("gpsd", LOG_PID, LOG_USER); gpsd_log(&context.errout, LOG_INF, "launching (Version %s)\n", VERSION); #ifdef SOCKET_EXPORT_ENABLE if (!gpsd_service) gpsd_service = getservbyname("gpsd", "tcp") ? "gpsd" : DEFAULT_GPSD_PORT; if (passivesocks(gpsd_service, "tcp", QLEN, msocks) < 1) { gpsd_log(&context.errout, LOG_ERR, "command sockets creation failed, netlib errors %d, %d\n", msocks[0], msocks[1]); if (pid_file != NULL) (void)unlink(pid_file); exit(EXIT_FAILURE); } gpsd_log(&context.errout, LOG_INF, "listening on port %s\n", gpsd_service); #endif /* SOCKET_EXPORT_ENABLE */ #ifdef NTPSHM_ENABLE if (getuid() == 0) { errno = 0; // nice() can ONLY succeed when run as root! // do not even bother as non-root if (nice(NICEVAL) == -1 && errno != 0) gpsd_log(&context.errout, LOG_WARN, "PPS: o=priority setting failed. Time accuracty will be degraded\n"); } /* * By initializing before we drop privileges, we guarantee that even * hotplugged devices added *after* we drop privileges will be able * to use segments 0 and 1. */ (void)ntpshm_context_init(&context); #endif /* NTPSHM_ENABLE */ #if defined(DBUS_EXPORT_ENABLE) /* we need to connect to dbus as root */ if (initialize_dbus_connection()) { /* the connection could not be started */ gpsd_log(&context.errout, LOG_ERROR, "unable to connect to the DBUS system bus\n"); } else gpsd_log(&context.errout, LOG_PROG, "successfully connected to the DBUS system bus\n"); #endif /* defined(DBUS_EXPORT_ENABLE) */ #ifdef SHM_EXPORT_ENABLE /* create the shared segment as root so readers can't mess with it */ (void)shm_acquire(&context); #endif /* SHM_EXPORT_ENABLE */ /* * We open devices specified on the command line *before* dropping * privileges in case one of them is a serial device with PPS support * and we need to set the line discipline, which requires root. */ in_restart = false; for (i = optind; i < argc; i++) { if (!gpsd_add_device(argv[i], NOWAIT)) { gpsd_log(&context.errout, LOG_ERROR, "initial GPS device %s open failed\n", argv[i]); } } /* drop privileges */ if (0 == getuid()) { struct passwd *pw; struct stat stb; /* make default devices accessible even after we drop privileges */ for (i = optind; i < argc; i++) /* coverity[toctou] */ if (stat(argv[i], &stb) == 0) (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 gpsd * user set by thre build is) and the group ID to the owning * group of a prototypical TTY device. This limits the scope * of any compromises in the code. It requires that all GPS * devices have their group read/write permissions set. */ if (setgroups(0, NULL) != 0) gpsd_log(&context.errout, LOG_ERROR, "setgroups() failed, errno %s\n", strerror(errno)); #ifdef GPSD_GROUP { struct group *grp = getgrnam(GPSD_GROUP); if (grp) if (setgid(grp->gr_gid) != 0) gpsd_log(&context.errout, LOG_ERROR, "setgid() failed, errno %s\n", strerror(errno)); } #else if ((optind < argc && stat(argv[optind], &stb) == 0) || stat(PROTO_TTY, &stb) == 0) { gpsd_log(&context.errout, LOG_PROG, "changing to group %d\n", stb.st_gid); if (setgid(stb.st_gid) != 0) gpsd_log(&context.errout, LOG_ERROR, "setgid() failed, errno %s\n", strerror(errno)); } #endif pw = getpwnam(GPSD_USER); if (pw) if (setuid(pw->pw_uid) != 0) gpsd_log(&context.errout, LOG_ERROR, "setuid() failed, errno %s\n", strerror(errno)); } gpsd_log(&context.errout, LOG_INF, "running with effective group ID %d\n", getegid()); gpsd_log(&context.errout, LOG_INF, "running with effective user ID %d\n", geteuid()); #ifdef SOCKET_EXPORT_ENABLE for (i = 0; i < NITEMS(subscribers); i++) { subscribers[i].fd = UNALLOCATED_FD; (void)pthread_mutex_init(&subscribers[i].mutex, NULL); } #endif /* SOCKET_EXPORT_ENABLE*/ { struct sigaction sa; sa.sa_flags = 0; #ifdef __COVERITY__ /* * Obsolete and unused. We're only doing this to pacify Coverity * which otherwise throws an UNINIT event here. Don't swap with the * handler initialization, they're unioned on some architectures. */ sa.sa_restorer = NULL; #endif /* __COVERITY__ */ sa.sa_handler = onsig; (void)sigfillset(&sa.sa_mask); (void)sigaction(SIGHUP, &sa, NULL); (void)sigaction(SIGINT, &sa, NULL); (void)sigaction(SIGTERM, &sa, NULL); (void)sigaction(SIGQUIT, &sa, NULL); (void)signal(SIGPIPE, SIG_IGN); } /* daemon got termination or interrupt signal */ if (setjmp(restartbuf) > 0) { gpsd_terminate(&context); in_restart = true; gpsd_log(&context.errout, LOG_WARN, "gpsd restarted by SIGHUP\n"); } signalled = 0; for (i = 0; i < AFCOUNT; i++) if (msocks[i] >= 0) { FD_SET(msocks[i], &all_fds); adjust_max_fd(msocks[i], true); } #ifdef CONTROL_SOCKET_ENABLE FD_ZERO(&control_fds); #endif /* CONTROL_SOCKET_ENABLE */ /* initialize the GPS context's time fields */ gpsd_time_init(&context, time(NULL)); /* * If we got here via SIGINT, reopen any command-line devices. PPS * through these won't work, as we've dropped privileges and can * no longer change line disciplines. */ if (in_restart) for (i = optind; i < argc; i++) { if (!gpsd_add_device(argv[i], NOWAIT)) { gpsd_log(&context.errout, LOG_ERROR, "GPS device %s open failed\n", argv[i]); } } while (0 == signalled) { fd_set efds; switch(gpsd_await_data(&rfds, &efds, maxfd, &all_fds, &context.errout)) { case AWAIT_GOT_INPUT: break; case AWAIT_NOT_READY: for (device = devices; device < devices + MAX_DEVICES; device++) if (allocated_device(device) && FD_ISSET(device->gpsdata.gps_fd, &efds)) { deactivate_device(device); free_device(device); } continue; case AWAIT_FAILED: exit(EXIT_FAILURE); } #ifdef SOCKET_EXPORT_ENABLE /* always be open to new client connections */ for (i = 0; i < AFCOUNT; i++) { if (msocks[i] >= 0 && FD_ISSET(msocks[i], &rfds)) { socklen_t alen = (socklen_t) sizeof(fsin); socket_t ssock = accept(msocks[i], (struct sockaddr *)&fsin, &alen); if (BAD_SOCKET(ssock)) gpsd_log(&context.errout, 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 }; char *c_ip; if (opts >= 0) (void)fcntl(ssock, F_SETFL, opts | O_NONBLOCK); c_ip = netlib_sock2ip(ssock); client = allocate_client(); if (client == NULL) { gpsd_log(&context.errout, LOG_ERROR, "Client %s connect on fd %d -" "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_log(&context.errout, LOG_ERROR, "Error: SETSOCKOPT SO_LINGER\n"); (void)close(ssock); } else { char announce[GPS_JSON_RESPONSE_MAX]; FD_SET(ssock, &all_fds); adjust_max_fd(ssock, true); client->fd = ssock; client->active = time(NULL); gpsd_log(&context.errout, 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)); } } FD_CLR(msocks[i], &rfds); } } #endif /* SOCKET_EXPORT_ENABLE */ #ifdef CONTROL_SOCKET_ENABLE /* also be open to new control-socket connections */ if (csock > -1 && FD_ISSET(csock, &rfds)) { socklen_t alen = (socklen_t) sizeof(fsin); socket_t ssock = accept(csock, (struct sockaddr *)&fsin, &alen); if (BAD_SOCKET(ssock)) gpsd_log(&context.errout, LOG_ERROR, "accept: %s\n", strerror(errno)); else { gpsd_log(&context.errout, 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); } FD_CLR(csock, &rfds); } /* read any commands that came in over the control socket */ for (cfd = 0; cfd < (int)FD_SETSIZE; cfd++) if (FD_ISSET(cfd, &control_fds)) { char buf[BUFSIZ]; ssize_t rd; while ((rd = read(cfd, buf, sizeof(buf) - 1)) > 0) { buf[rd] = '\0'; gpsd_log(&context.errout, LOG_CLIENT, "<= control(%d): %s\n", cfd, buf); /* coverity[tainted_data] Safe, never handed to exec */ handle_control(cfd, buf); } gpsd_log(&context.errout, LOG_SPIN, "close(%d) of control socket\n", cfd); (void)close(cfd); FD_CLR(cfd, &all_fds); FD_CLR(cfd, &control_fds); adjust_max_fd(cfd, false); } #endif /* CONTROL_SOCKET_ENABLE */ /* poll all active devices */ for (device = devices; device < devices + MAX_DEVICES; device++) if (allocated_device(device) && device->gpsdata.gps_fd > 0) switch (gpsd_multipoll(FD_ISSET(device->gpsdata.gps_fd, &rfds), device, all_reports, DEVICE_REAWAKE)) { case DEVICE_READY: FD_SET(device->gpsdata.gps_fd, &all_fds); adjust_max_fd(device->gpsdata.gps_fd, true); break; case DEVICE_UNREADY: FD_CLR(device->gpsdata.gps_fd, &all_fds); adjust_max_fd(device->gpsdata.gps_fd, false); break; case DEVICE_ERROR: case DEVICE_EOF: deactivate_device(device); break; default: break; } #ifdef __UNUSED_AUTOCONNECT__ if (context.fixcnt > 0 && !context.autconnect) { for (device = devices; device < devices + MAX_DEVICES; device++) { if (device->gpsdata.fix.mode > MODE_NO_FIX) { netgnss_autoconnect(&context, device->gpsdata.fix.latitude, device->gpsdata.fix.longitude); context.autconnect = True; break; } } } #endif /* __UNUSED_AUTOCONNECT__ */ #ifdef SOCKET_EXPORT_ENABLE /* accept and execute commands for all clients */ for (sub = subscribers; sub < subscribers + MAX_CLIENTS; sub++) { if (sub->active == 0) continue; lock_subscriber(sub); if (FD_ISSET(sub->fd, &rfds)) { char buf[BUFSIZ]; int buflen; unlock_subscriber(sub); gpsd_log(&context.errout, 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') buf[buflen++] = '\n'; buf[buflen] = '\0'; gpsd_log(&context.errout, LOG_CLIENT, "<= client(%d): %s\n", sub_index(sub), buf); /* * When a command comes in, update subscriber.active to * timestamp() so we don't close the connection * after COMMAND_TIMEOUT seconds. This makes * COMMAND_TIMEOUT useful. */ sub->active = time(NULL); if (handle_gpsd_request(sub, buf) < 0) detach_client(sub); } } else { unlock_subscriber(sub); if (!sub->policy.watcher && time(NULL) - sub->active > COMMAND_TIMEOUT) { gpsd_log(&context.errout, LOG_WARN, "client(%d) timed out on command wait.\n", sub_index(sub)); detach_client(sub); } } } /* * Mark devices with an identified packet type but no * remaining subscribers to be closed in RELEASE_TIME seconds. * See the explanation of RELEASE_TIME for the reasoning. * * Re-poll devices that are disconnected, but have potential * subscribers in the same cycle. */ for (device = devices; device < devices + MAX_DEVICES; device++) { bool device_needed = NOWAIT; if (!allocated_device(device)) continue; if (!device_needed) for (sub=subscribers; subactive == 0) continue; device_needed = subscribed(sub, device); if (device_needed) break; } if (!device_needed && device->gpsdata.gps_fd > -1 && device->lexer.type != BAD_PACKET) { if (device->releasetime == 0) { device->releasetime = time(NULL); gpsd_log(&context.errout, LOG_PROG, "device %d (fd %d) released\n", (int)(device - devices), device->gpsdata.gps_fd); } else if (time(NULL) - device->releasetime > RELEASE_TIMEOUT) { gpsd_log(&context.errout, LOG_PROG, "device %d closed\n", (int)(device - devices)); gpsd_log(&context.errout, LOG_RAW, "unflagging descriptor %d\n", device->gpsdata.gps_fd); deactivate_device(device); } } if (device_needed && BAD_SOCKET(device->gpsdata.gps_fd) && (device->opentime == 0 || time(NULL) - device->opentime > DEVICE_RECONNECT)) { device->opentime = time(NULL); gpsd_log(&context.errout, LOG_INF, "reconnection attempt on device %d\n", (int)(device - devices)); (void)awaken(device); } } #endif /* SOCKET_EXPORT_ENABLE */ /* * Might be time for graceful shutdown if no command-line * devices were specified, there are no subscribers, there are * no active devices, and there *have been* active * devices. The goal is to go away and free up text space when * the daemon was hotplug-activated but there are no * subscribers and the last GPS has unplugged, and the point * of the last check is to prevent shutdown when the daemon * has been launched but not yet received its first device * over the socket. */ if (argc == optind && highwater > 0) { int subcount = 0, devcount = 0; #ifdef SOCKET_EXPORT_ENABLE for (sub = subscribers; sub < subscribers + MAX_CLIENTS; sub++) if (sub->active != 0) ++subcount; #endif /* SOCKET_EXPORT_ENABLE */ for (device = devices; device < devices + MAX_DEVICES; device++) if (allocated_device(device)) ++devcount; if (subcount == 0 && devcount == 0) { gpsd_log(&context.errout, LOG_SHOUT, "no subscribers or devices, shutting down.\n"); goto shutdown; } } } /* if we make it here, we got a signal... deal with it */ /* restart on SIGHUP, clean up and exit otherwise */ if (SIGHUP == (int)signalled) longjmp(restartbuf, 1); gpsd_log(&context.errout, LOG_WARN, "received terminating signal %d.\n", signalled); shutdown: gpsd_terminate(&context); gpsd_log(&context.errout, LOG_WARN, "exiting.\n"); #ifdef SOCKET_EXPORT_ENABLE /* * A linger option was set on each client socket when it was * 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. */ for (sub = subscribers; sub < subscribers + MAX_CLIENTS; sub++) { if (sub->active != 0) detach_client(sub); } #endif /* SOCKET_EXPORT_ENABLE */ #ifdef SHM_EXPORT_ENABLE shm_release(&context); #endif /* SHM_EXPORT_ENABLE */ #ifdef CONTROL_SOCKET_ENABLE if (control_socket) (void)unlink(control_socket); #endif /* CONTROL_SOCKET_ENABLE */ if (pid_file) (void)unlink(pid_file); return 0; } gpsd-3.15/gpsd.h-head0000664000175000017500000000066312477231774012575 0ustar esresr/* gpsd.h -- fundamental types and structures for the gpsd library * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _GPSD_H_ #define _GPSD_H_ # ifdef __cplusplus extern "C" { # endif #include #include #include /* for time_t */ #ifndef GPSD_CONFIG_H /* Feature configuration switches begin here */ gpsd-3.15/gpsd.h-tail0000664000175000017500000010620412520742615012611 0ustar esresr/* Feature configuration switches end here * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #endif /* GPSD_CONFIG_H */ #include #include #include #include "gps.h" #include "compiler.h" /* * Constants for the VERSION response * 3.1: Base JSON version * 3.2: Added POLL command and response * 3.3: AIS app_id split into DAC and FID * 3.4: Timestamps change from seconds since Unix epoch to ISO8601. * 3.5: POLL subobject name changes: fixes -> tpv, skyview -> sky. * DEVICE::activated becomes ISO8601 rather than real. * 3.6 VERSION, WATCH, and DEVICES from slave gpsds get "remote" attribute. * 3.7 PPS message added to repertoire. SDDBT water depth reported as * negative altitude with Mode 3 set. * 3.8 AIS course member becomes float in scaled mode (bug fix). * 3.9 split24 flag added. Controlled-vocabulary fields are now always * dumped in both numeric and string form, with the string being the * value of a synthesized additional attribute with "_text" appended. * (Thus, the 'scaled' flag no longer affects display of these fields.) * PPS drift message ships nsec rather than msec. * 3.10 The obsolete tag field has been dropped from JSON. * 3.11 A precision field, log2 of the time source jitter, as been added * to the PPS report. See ntpshm.h for more details. */ #define GPSD_PROTO_MAJOR_VERSION 3 /* bump on incompatible changes */ #define GPSD_PROTO_MINOR_VERSION 11 /* bump on compatible changes */ #define JSON_DATE_MAX 24 /* ISO8601 timestamp with 2 decimal places */ #ifndef DEFAULT_GPSD_SOCKET #define DEFAULT_GPSD_SOCKET "/var/run/gpsd.sock" #endif /* Some internal capabilities depend on which drivers we're compiling. */ #if !defined(AIVDM_ENABLE) && defined(NMEA2000_ENABLE) #define AIVDM_ENABLE #endif #if !defined(NMEA_ENABLE) && (defined(FV18_ENABLE) || defined(MTK3301_ENABLE) || defined(TNT_ENABLE) || defined(OCEANSERVER_ENABLE) || defined(GPSCLOCK_ENABLE) || defined(FURY_ENABLE)) #define NMEA_ENABLE #endif #ifdef EARTHMATE_ENABLE #define ZODIAC_ENABLE #endif #if defined(ZODIAC_ENABLE) || defined(SIRF_ENABLE) || defined(GARMIN_ENABLE) || defined(TSIP_ENABLE) || defined(EVERMORE_ENABLE) || defined(ITRAX_ENABLE) || defined(UBLOX_ENABLE) || defined(SUPERSTAR2_ENABLE) || defined(ONCORE_ENABLE) || defined(GEOSTAR_ENABLE) || defined(NAVCOM_ENABLE) || defined(NMEA2000_ENABLE) #define BINARY_ENABLE #endif #if defined(TRIPMATE_ENABLE) || defined(BINARY_ENABLE) #define NON_NMEA_ENABLE #endif #if defined(TNT_ENABLE) || defined(OCEANSERVER_ENABLE) #define COMPASS_ENABLE #endif #ifdef NTPSHM_ENABLE #define TIMEHINT_ENABLE #endif /* First, declarations for the packet layer... */ /* * For NMEA-conforming receivers this is supposed to be 82, but * some receivers (TN-200, GSW 2.3.2) emit oversized sentences. * The current hog champion is the Trimble BX-960 receiver, which * emits a 91-character GGA message. */ #define NMEA_MAX 91 /* max length of NMEA sentence */ #define NMEA_BIG_BUF (2*NMEA_MAX+1) /* longer than longest NMEA sentence */ /* a few bits of ISGPS magic */ enum isgpsstat_t { ISGPS_NO_SYNC, ISGPS_SYNC, ISGPS_SKIP, ISGPS_MESSAGE, }; #define RTCM_MAX (RTCM2_WORDS_MAX * sizeof(isgps30bits_t)) /* * The packet buffers need to be as long than the longest packet we * expect to see in any protocol, because we have to be able to hold * an entire packet for checksumming... * First we thought it had to be big enough for a SiRF Measured Tracker * Data packet (188 bytes). Then it had to be big enough for a UBX SVINFO * packet (206 bytes). Now it turns out that a couple of ITALK messages are * over 512 bytes. I know we like verbose output, but this is ridiculous. */ #define MAX_PACKET_LENGTH 516 /* 7 + 506 + 3 */ /* * UTC of second 0 of week 0 of the first rollover period of GPS time. * Used to compute UTC from GPS time. Also, the threshold value * under which system clock times are considered unreliable. Often, * embedded systems come up thinking it's early 1970 and the system * clock will report small positive values until the clock is set. By * choosing this as the cutoff, we'll never reject historical GPS logs * that are actually valid. */ #define GPS_EPOCH 315964800 /* 6 Jan 1981 00:00:00 UTC */ /* time constant */ #define SECS_PER_DAY (60*60*24) /* seconds per day */ #define SECS_PER_WEEK (7*SECS_PER_DAY) /* seconds per week */ #define GPS_ROLLOVER (1024*SECS_PER_WEEK) /* rollover period */ struct gpsd_errout_t { int debug; /* lexer debug level */ void (*report)(const char *); /* reporting hook for lexer errors */ char *label; }; struct gps_lexer_t { /* packet-getter internals */ int type; #define BAD_PACKET -1 #define COMMENT_PACKET 0 #define NMEA_PACKET 1 #define AIVDM_PACKET 2 #define GARMINTXT_PACKET 3 #define MAX_TEXTUAL_TYPE 3 /* increment this as necessary */ #define SIRF_PACKET 4 #define ZODIAC_PACKET 5 #define TSIP_PACKET 6 #define EVERMORE_PACKET 7 #define ITALK_PACKET 8 #define GARMIN_PACKET 9 #define NAVCOM_PACKET 10 #define UBX_PACKET 11 #define SUPERSTAR2_PACKET 12 #define ONCORE_PACKET 13 #define GEOSTAR_PACKET 14 #define NMEA2000_PACKET 15 #define MAX_GPSPACKET_TYPE 15 /* increment this as necessary */ #define RTCM2_PACKET 16 #define RTCM3_PACKET 17 #define JSON_PACKET 18 #define PACKET_TYPES 19 /* increment this as necessary */ #define TEXTUAL_PACKET_TYPE(n) ((((n)>=NMEA_PACKET) && ((n)<=MAX_TEXTUAL_TYPE)) || (n)==JSON_PACKET) #define GPS_PACKET_TYPE(n) (((n)>=NMEA_PACKET) && ((n)<=MAX_GPSPACKET_TYPE)) #define LOSSLESS_PACKET_TYPE(n) (((n)>=RTCM2_PACKET) && ((n)<=RTCM3_PACKET)) #define PACKET_TYPEMASK(n) (1 << (n)) #define GPS_TYPEMASK (((2<<(MAX_GPSPACKET_TYPE+1))-1) &~ PACKET_TYPEMASK(COMMENT_PACKET)) unsigned int state; size_t length; unsigned char inbuffer[MAX_PACKET_LENGTH*2+1]; size_t inbuflen; unsigned char *inbufptr; /* outbuffer needs to be able to hold 4 GPGSV records at once */ unsigned char outbuffer[MAX_PACKET_LENGTH*2+1]; size_t outbuflen; unsigned long char_counter; /* count characters processed */ unsigned long retry_counter; /* count sniff retries */ unsigned counter; /* packets since last driver switch */ struct gpsd_errout_t errout; /* how to report errors */ #ifdef TIMING_ENABLE timestamp_t start_time; /* timestamp of first input */ unsigned long start_char; /* char counter at first input */ #endif /* TIMING_ENABLE */ /* * ISGPS200 decoding context. * * This is not conditionalized on RTCM104_ENABLE because we need to * be able to build gpsdecode even when RTCM support is not * configured in the daemon. */ struct { bool locked; int curr_offset; isgps30bits_t curr_word; unsigned int bufindex; /* * Only these should be referenced from elsewhere, and only when * RTCM_MESSAGE has just been returned. */ isgps30bits_t buf[RTCM2_WORDS_MAX]; /* packet data */ size_t buflen; /* packet length in bytes */ } isgps; #ifdef PASSTHROUGH_ENABLE unsigned int json_depth; unsigned int json_after; #endif /* PASSTHROUGH_ENABLE */ }; extern void lexer_init(struct gps_lexer_t *); extern void packet_reset(struct gps_lexer_t *); extern void packet_pushback(struct gps_lexer_t *); extern void packet_parse(struct gps_lexer_t *); extern ssize_t packet_get(int, struct gps_lexer_t *); extern int packet_sniff(struct gps_lexer_t *); #define packet_buffered_input(lexer) ((lexer)->inbuffer + (lexer)->inbuflen - (lexer)->inbufptr) /* Next, declarations for the core library... */ /* factors for converting among confidence interval units */ #define CEP50_SIGMA 1.18 #define DRMS_SIGMA 1.414 #define CEP95_SIGMA 2.45 /* this is where we choose the confidence level to use in reports */ #define GPSD_CONFIDENCE CEP95_SIGMA #define NTPSHMSEGS (MAX_DEVICES * 2) /* number of NTP SHM segments */ #define AIVDM_CHANNELS 2 /* A, B */ struct gps_device_t; struct gps_context_t { int valid; /* member validity flags */ #define LEAP_SECOND_VALID 0x01 /* we have or don't need correction */ #define GPS_TIME_VALID 0x02 /* GPS week/tow is valid */ #define CENTURY_VALID 0x04 /* have received ZDA or 4-digit year */ struct gpsd_errout_t errout; /* debug verbosity level and hook */ bool readonly; /* if true, never write to device */ /* DGPS status */ int fixcnt; /* count of good fixes seen */ /* timekeeping */ time_t start_time; /* local time of daemon startup */ int leap_seconds; /* Unix seconds to UTC (GPS-UTC offset) */ unsigned short gps_week; /* GPS week, actually 10 bits */ double gps_tow; /* GPS time of week, actually 19 bits */ int century; /* for NMEA-only devices without ZDA */ int rollovers; /* rollovers since start of run */ #ifdef TIMEHINT_ENABLE int leap_notify; /* notification state from subframe */ #define LEAP_NOWARNING 0x0 /* normal, no leap second warning */ #define LEAP_ADDSECOND 0x1 /* last minute of day has 60 seconds */ #define LEAP_DELSECOND 0x2 /* last minute of day has 59 seconds */ #define LEAP_NOTINSYNC 0x3 /* overload, clock is free running */ #endif /* TIMEHINT_ENABLE */ #ifdef NTPSHM_ENABLE /* we need the volatile here to tell the C compiler not to * 'optimize' as 'dead code' the writes to SHM */ volatile struct shmTime *shmTime[NTPSHMSEGS]; bool shmTimeInuse[NTPSHMSEGS]; #endif /* NTPSHM_ENABLE */ #ifdef PPS_ENABLE void (*pps_hook)(struct gps_device_t *, struct timedelta_t *); #endif /* PPS_ENABLE */ #ifdef SHM_EXPORT_ENABLE /* we don't want the compiler to treat writes to shmexport as dead code, * and we don't want them reordered either */ volatile void *shmexport; #endif ssize_t (*serial_write)(struct gps_device_t *, const char *buf, const size_t len); }; /* state for resolving interleaved Type 24 packets */ struct ais_type24a_t { unsigned int mmsi; char shipname[AIS_SHIPNAME_MAXLEN+1]; }; #define MAX_TYPE24_INTERLEAVE 8 /* max number of queued type 24s */ struct ais_type24_queue_t { struct ais_type24a_t ships[MAX_TYPE24_INTERLEAVE]; int index; }; /* state for resolving AIVDM decodes */ struct aivdm_context_t { /* hold context for decoding AIDVM packet sequences */ int decoded_frags; /* for tracking AIDVM parts in a multipart sequence */ unsigned char bits[2048]; size_t bitlen; /* how many valid bits */ struct ais_type24_queue_t type24_queue; }; #define MODE_NMEA 0 #define MODE_BINARY 1 typedef enum {ANY, GPS, RTCM2, RTCM3, AIS} gnss_type; typedef enum { event_wakeup, event_triggermatch, event_identified, event_configure, event_driver_switch, event_deactivate, event_reactivate, } event_t; /* * Used internally only in the gpsdata status field; not exported to * client-side gpsdata structures. Instead this is used to change * the base U_ERE values used by the error modeler. */ #define STATUS_DGPS_FIX 2 /* yes, with DGPS */ #define INTERNAL_SET(n) ((gps_mask_t)(1llu<<(SET_HIGH_BIT+(n)))) #define RAW_IS INTERNAL_SET(1) /* raw pseudoranges available */ #define USED_IS INTERNAL_SET(2) /* sat-used count available */ #define DRIVER_IS INTERNAL_SET(3) /* driver type identified */ #define CLEAR_IS INTERNAL_SET(4) /* starts a reporting cycle */ #define REPORT_IS INTERNAL_SET(5) /* ends a reporting cycle */ #define NODATA_IS INTERNAL_SET(6) /* no data read from fd */ #define PPSTIME_IS INTERNAL_SET(7) /* precision time is available */ #define PERR_IS INTERNAL_SET(8) /* PDOP set */ #define PASSTHROUGH_IS INTERNAL_SET(9) /* passthrough mode */ #define EOF_IS INTERNAL_SET(10) /* synthetic EOF */ #define DATA_IS ~(ONLINE_SET|PACKET_SET|CLEAR_IS|REPORT_IS) typedef unsigned int driver_mask_t; #define DRIVER_NOFLAGS 0x00000000u #define DRIVER_STICKY 0x00000001u /* * True if a device type is non-null and has control methods. */ #define CONTROLLABLE(dp) (((dp) != NULL) && \ ((dp)->speed_switcher != NULL \ || (dp)->mode_switcher != NULL \ || (dp)->rate_switcher != NULL)) /* * True if a driver selection of it should be sticky. */ #define STICKY(dp) ((dp) != NULL && ((dp)->flags & DRIVER_STICKY) != 0) struct gps_type_t { /* GPS method table, describes how to talk to a particular GPS type */ char *type_name; int packet_type; driver_mask_t flags; /* reserved for expansion */ char *trigger; int channels; bool (*probe_detect)(struct gps_device_t *session); ssize_t (*get_packet)(struct gps_device_t *session); gps_mask_t (*parse_packet)(struct gps_device_t *session); ssize_t (*rtcm_writer)(struct gps_device_t *session, const char *rtcmbuf, size_t rtcmbytes); void (*init_query)(struct gps_device_t *session); void (*event_hook)(struct gps_device_t *session, event_t event); #ifdef RECONFIGURE_ENABLE bool (*speed_switcher)(struct gps_device_t *session, speed_t speed, char parity, int stopbits); void (*mode_switcher)(struct gps_device_t *session, int mode); bool (*rate_switcher)(struct gps_device_t *session, double rate); double min_cycle; #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE ssize_t (*control_send)(struct gps_device_t *session, char *buf, size_t buflen); #endif /* CONTROLSEND_ENABLE */ #ifdef TIMEHINT_ENABLE double (*time_offset)(struct gps_device_t *session); #endif /* TIMEHINT_ENABLE */ }; /* * Each input source has an associated type. This is currently used in two * ways: * * (1) To determince if we require that gpsd be the only process opening a * device. We make an exception for PTYs because the master side has to be * opened by test code. * * (2) To determine whether it's safe to send wakeup strings. These are * required on some unusual RS-232 devices (such as the TNT compass and * Thales/Ashtech GPSes) but should not be shipped to unidentified USB * or Bluetooth devices as we don't even know in advance those are GPSes; * they might not cope well. * * Where it says "case detected but not used" it means that we can identify * a source type but no behavior is yet contingent on it. A "discoverable" * device is one for which there is discoverable metadata such as a * vendor/product ID. * * We should never see a block device; that would indicate a serious error * in command-line usage or the hotplug system. */ typedef enum {source_unknown, source_blockdev, /* block devices can't be GPS sources */ source_rs232, /* potential GPS source, not discoverable */ source_usb, /* potential GPS source, discoverable */ source_bluetooth, /* potential GPS source, discoverable */ source_can, /* potential GPS source, fixed CAN format */ source_pty, /* PTY: we don't require exclusive access */ source_tcp, /* TCP/IP stream: case detected but not used */ source_udp, /* UDP stream: case detected but not used */ source_gpsd, /* Remote gpsd instance over TCP/IP */ source_pps, /* PPS-only device, such as /dev/ppsN */ } sourcetype_t; /* * Each input source also has an associated service type. */ typedef enum {service_unknown, service_sensor, service_dgpsip, service_ntrip, } servicetype_t; /* * Private state information about an NTRIP stream. */ struct ntrip_stream_t { char mountpoint[101]; char credentials[128]; char authStr[128]; char url[256]; char port[32]; /* in my /etc/services 16 was the longest */ bool set; /* found and set */ 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; int fee; int bitrate; }; #ifdef PPS_ENABLE #include "ppsthread.h" #endif /* PPS_ENABLE */ struct gps_device_t { /* session object, encapsulates all global state */ struct gps_data_t gpsdata; const struct gps_type_t *device_type; unsigned int driver_index; /* numeric index of current driver */ unsigned int drivers_identified; /* bitmask; what drivers have we seen? */ #ifdef RECONFIGURE_ENABLE const struct gps_type_t *last_controller; #endif /* RECONFIGURE_ENABLE */ struct gps_context_t *context; sourcetype_t sourcetype; servicetype_t servicetype; int mode; struct termios ttyset, ttyset_old; #ifndef FIXED_PORT_SPEED unsigned int baudindex; #endif /* FIXED_PORT_SPEED */ int saved_baud; struct gps_lexer_t lexer; int badcount; int subframe_count; char subtype[64]; /* firmware version or subtype ID */ time_t opentime; time_t releasetime; bool zerokill; time_t reawake; #ifdef TIMING_ENABLE timestamp_t sor; /* timestamp start of this reporting cycle */ unsigned long chars; /* characters in the cycle */ #endif /* TIMING_ENABLE */ #ifdef NTP_ENABLE bool ship_to_ntpd; #ifdef NTPSHM_ENABLE volatile struct shmTime *shm_clock; #endif /* NTPSHM_ENABLE */ # ifdef PPS_ENABLE volatile struct shmTime *shm_pps; int chronyfd; /* for talking to chrony */ # endif /* PPS_ENABLE */ #endif /* NTP_ENABLE */ #ifdef PPS_ENABLE volatile struct pps_thread_t pps_thread; #endif /* PPS_ENABLE */ double mag_var; /* magnetic variation in degrees */ bool back_to_nmea; /* back to NMEA on revert? */ 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 driver signal REPORT_MASK */ int fixcnt; /* count of fixes from this device */ struct gps_fix_t newdata; /* where drivers put their data */ struct gps_fix_t oldfix; /* previous fix for error modeling */ #ifdef NMEA_ENABLE struct { unsigned short sats_used[MAXCHANNELS]; int part, await; /* for tracking GSV parts */ struct tm date; /* date part of last sentence time */ double subseconds; /* subsec part of last sentence time */ char *field[NMEA_MAX]; unsigned char fieldcopy[NMEA_MAX+1]; /* detect receivers that ship GGA with non-advancing timestamp */ bool latch_mode; char last_gga_timestamp[16]; bool seen_glgsv; bool seen_bdgsv; bool seen_qzss; char last_gsv_talker; /* * State for the cycle-tracking machinery. * The reason these timestamps are separate from the * general sentence timestamps is that we can * use the minutes and seconds part of a sentence * with an incomplete timestamp (like GGA) for * end-cycle recognition, even if we don't have a previous * RMC or ZDA that lets us get full time from it. */ timestamp_t this_frac_time, last_frac_time; bool latch_frac_time; unsigned int lasttag; unsigned int cycle_enders; bool cycle_continue; } nmea; #endif /* NMEA_ENABLE */ /* * The rest of this structure is driver-specific private storage. * Only put a driver's scratch storage in here if it is never * implemented on the same device that supports any mode already * in this union; otherwise bad things might happen after a device * mode switch. */ union { #ifdef GARMINTXT_ENABLE struct { struct tm date; /* date part of last sentence time */ double subseconds; /* subsec part of last sentence time */ } garmintxt; #endif /* GARMINTXT_ENABLE */ #ifdef BINARY_ENABLE #ifdef GEOSTAR_ENABLE struct { unsigned int physical_port; } geostar; #endif /* GEOSTAR_ENABLE */ #ifdef SIRF_ENABLE struct { unsigned int need_ack; /* if NZ we're awaiting ACK */ unsigned int cfg_stage; /* configuration stage counter */ unsigned int driverstate; /* for private use */ #define SIRF_LT_231 0x01 /* SiRF at firmware rev < 231 */ #define SIRF_EQ_231 0x02 /* SiRF at firmware rev == 231 */ #define SIRF_GE_232 0x04 /* SiRF at firmware rev >= 232 */ #define UBLOX 0x08 /* u-blox firmware with packet 0x62 */ unsigned long satcounter; unsigned int time_seen; unsigned char lastid; /* ID with last timestamp seen */ #define TIME_SEEN_UTC_2 0x08 /* Seen UTC time variant 2? */ /* fields from Navigation Parameters message */ bool nav_parameters_seen; /* have we seen one? */ unsigned char altitude_hold_mode; unsigned char altitude_hold_source; int16_t altitude_source_input; unsigned char degraded_mode; unsigned char degraded_timeout; unsigned char dr_timeout; unsigned char track_smooth_mode; /* fields from DGPS Status */ unsigned int dgps_source; #define SIRF_DGPS_SOURCE_NONE 0 /* No DGPS correction type have been selected */ #define SIRF_DGPS_SOURCE_SBAS 1 /* SBAS */ #define SIRF_DGPS_SOURCE_SERIAL 2 /* RTCM corrections */ #define SIRF_DGPS_SOURCE_BEACON 3 /* Beacon corrections */ #define SIRF_DGPS_SOURCE_SOFTWARE 4 /* Software API corrections */ } sirf; #endif /* SIRF_ENABLE */ #ifdef SUPERSTAR2_ENABLE struct { time_t last_iono; } superstar2; #endif /* SUPERSTAR2_ENABLE */ #ifdef TSIP_ENABLE struct { unsigned short sats_used[MAXCHANNELS]; bool superpkt; /* Super Packet mode requested */ time_t last_41; /* Timestamps for packet requests */ time_t last_48; time_t last_5c; time_t last_6d; time_t last_46; time_t req_compact; unsigned int stopbits; /* saved RS232 link parameter */ char parity; int subtype; #define TSIP_UNKNOWN 0 #define TSIP_ACCUTIME_GOLD 1 } tsip; #endif /* TSIP_ENABLE */ #ifdef GARMIN_ENABLE /* private housekeeping stuff for the Garmin driver */ struct { unsigned char Buffer[4096+12]; /* Garmin packet buffer */ size_t BufferLen; /* current GarminBuffer Length */ } garmin; #endif /* GARMIN_ENABLE */ #ifdef ZODIAC_ENABLE /* private housekeeping stuff for the Zodiac driver */ struct { unsigned short sn; /* packet sequence number */ /* * Zodiac chipset channel status from PRWIZCH. Keep it so * raw-mode translation of Zodiac binary protocol can send * it up to the client. */ #define ZODIAC_CHANNELS 12 unsigned int Zs[ZODIAC_CHANNELS]; /* satellite PRNs */ unsigned int Zv[ZODIAC_CHANNELS]; /* signal values (0-7) */ } zodiac; #endif /* ZODIAC_ENABLE */ #ifdef UBLOX_ENABLE struct { unsigned char port_id; unsigned char sbas_in_use; /* * NAV-* message order is not defined, thus we handle them isochronously * and store the latest data into these variables rather than expect * some messages to arrive in order. NAV-SOL handler picks up these values * and inserts them into the fix structure in one go. */ double last_herr; double last_verr; } ubx; #endif /* UBLOX_ENABLE */ #ifdef NAVCOM_ENABLE struct { uint8_t physical_port; bool warned; } navcom; #endif /* NAVCOM_ENABLE */ #ifdef ONCORE_ENABLE struct { #define ONCORE_VISIBLE_CH 12 int visible; int PRN[ONCORE_VISIBLE_CH]; /* PRNs of satellite */ int elevation[ONCORE_VISIBLE_CH]; /* elevation of satellite */ int azimuth[ONCORE_VISIBLE_CH]; /* azimuth */ int pps_offset_ns; } oncore; #endif /* ONCORE_ENABLE */ #ifdef NMEA2000_ENABLE struct { unsigned int can_msgcnt; unsigned int can_net; unsigned int unit; bool unit_valid; int mode; unsigned int mode_valid; unsigned int idx; // size_t ptr; size_t fast_packet_len; int type; void *workpgn; void *pgnlist; unsigned char sid[8]; } nmea2000; #endif /* NMEA2000_ENABLE */ /* * This is not conditionalized on RTCM104_ENABLE because we need to * be able to build gpsdecode even when RTCM support is not * configured in the daemon. It doesn't take up extra space. */ struct { /* ISGPS200 decoding */ bool locked; int curr_offset; isgps30bits_t curr_word; isgps30bits_t buf[RTCM2_WORDS_MAX]; unsigned int bufindex; } isgps; #endif /* BINARY_ENABLE */ #ifdef AIVDM_ENABLE struct { struct aivdm_context_t context[AIVDM_CHANNELS]; char ais_channel; } aivdm; #endif /* AIVDM_ENABLE */ } driver; /* * State of an NTRIP connection. We don't want to zero this on every * activation, otherwise the connection state will get lost. Information * in this substructure is only valid if servicetype is service_ntrip. */ struct { /* state information about the stream */ struct ntrip_stream_t stream; /* state information about our response parsing */ enum { ntrip_conn_init, ntrip_conn_sent_probe, ntrip_conn_sent_get, ntrip_conn_established, ntrip_conn_err } conn_state; /* connection state for multi stage connect */ bool works; /* marks a working connection, so we try to reconnect once */ bool sourcetable_parse; /* have we read the sourcetable header? */ } ntrip; /* State of a DGPSIP connection */ struct { bool reported; } dgpsip; }; /* * These are used where a file descriptor of 0 or greater indicaes open device. */ #define UNALLOCATED_FD -1 /* this slot is available for reallocation */ #define PLACEHOLDING_FD -2 /* this slot *not* available for reallocation */ /* logging levels */ #define LOG_ERROR -1 /* errors, display always */ #define LOG_SHOUT 0 /* not an error but we should always see it */ #define LOG_WARN 1 /* not errors but may indicate a problem */ #define LOG_CLIENT 2 /* log JSON reports to clients */ #define LOG_INF 3 /* key informative messages */ #define LOG_PROG 4 /* progress messages */ #define LOG_IO 5 /* IO to and from devices */ #define LOG_DATA 6 /* log data management messages */ #define LOG_SPIN 7 /* logging for catching spin bugs */ #define LOG_RAW 8 /* raw low-level I/O */ #define ISGPS_ERRLEVEL_BASE LOG_RAW #define IS_HIGHEST_BIT(v,m) (v & ~((m<<1)-1))==0 /* driver helper functions */ extern void isgps_init(struct gps_lexer_t *); enum isgpsstat_t isgps_decode(struct gps_lexer_t *, bool (*preamble_match)(isgps30bits_t *), bool (*length_check)(struct gps_lexer_t *), size_t, unsigned int); extern unsigned int isgps_parity(isgps30bits_t); extern void isgps_output_magnavox(const isgps30bits_t *, unsigned int, FILE *); extern enum isgpsstat_t rtcm2_decode(struct gps_lexer_t *, unsigned int); extern void json_rtcm2_dump(const struct rtcm2_t *, const char *, char[], size_t); extern void rtcm2_unpack(struct rtcm2_t *, char *); extern void json_rtcm3_dump(const struct rtcm3_t *, const char *, char[], size_t); extern void rtcm3_unpack(const struct gps_context_t *, struct rtcm3_t *, char *); /* here are the available GPS drivers */ extern const struct gps_type_t **gpsd_drivers; /* gpsd library internal prototypes */ extern gps_mask_t generic_parse_input(struct gps_device_t *); extern ssize_t generic_get(struct gps_device_t *); extern gps_mask_t nmea_parse(char *, struct gps_device_t *); extern ssize_t nmea_write(struct gps_device_t *, char *, size_t); extern ssize_t nmea_send(struct gps_device_t *, const char *, ... ); extern void nmea_add_checksum(char *); extern gps_mask_t sirf_parse(struct gps_device_t *, unsigned char *, size_t); extern gps_mask_t evermore_parse(struct gps_device_t *, unsigned char *, size_t); extern gps_mask_t navcom_parse(struct gps_device_t *, unsigned char *, size_t); extern gps_mask_t garmin_ser_parse(struct gps_device_t *); extern gps_mask_t garmintxt_parse(struct gps_device_t *); extern gps_mask_t aivdm_parse(struct gps_device_t *); extern bool netgnss_uri_check(char *); extern int netgnss_uri_open(struct gps_device_t *, char *); extern void netgnss_report(struct gps_context_t *, struct gps_device_t *, struct gps_device_t *); extern void netgnss_autoconnect(struct gps_context_t *, double, double); extern int dgpsip_open(struct gps_device_t *, const char *); extern void dgpsip_report(struct gps_context_t *, struct gps_device_t *, struct gps_device_t *); extern void dgpsip_autoconnect(struct gps_context_t *, double, double, const char *); extern int ntrip_open(struct gps_device_t *, char *); extern void ntrip_report(struct gps_context_t *, struct gps_device_t *, struct gps_device_t *); extern void gpsd_tty_init(struct gps_device_t *); extern int gpsd_serial_open(struct gps_device_t *); extern bool gpsd_set_raw(struct gps_device_t *); extern ssize_t gpsd_serial_write(struct gps_device_t *, const char *, const size_t); extern bool gpsd_next_hunt_setting(struct gps_device_t *); extern int gpsd_switch_driver(struct gps_device_t *, char *); extern void gpsd_set_speed(struct gps_device_t *, speed_t, char, unsigned int); extern speed_t gpsd_get_speed(const struct gps_device_t *); extern speed_t gpsd_get_speed_old(const struct gps_device_t *); extern int gpsd_get_stopbits(const struct gps_device_t *); extern char gpsd_get_parity(const struct gps_device_t *); extern void gpsd_assert_sync(struct gps_device_t *); extern void gpsd_close(struct gps_device_t *); extern ssize_t gpsd_write(struct gps_device_t *, const char *, const size_t); extern void gpsd_time_init(struct gps_context_t *, time_t); extern void gpsd_set_century(struct gps_device_t *); extern timestamp_t gpsd_gpstime_resolve(struct gps_device_t *, const unsigned short, const double); extern timestamp_t gpsd_utc_resolve(struct gps_device_t *); extern void gpsd_century_update(struct gps_device_t *, int); extern void gpsd_zero_satellites(struct gps_data_t *sp); extern gps_mask_t gpsd_interpret_subframe(struct gps_device_t *, unsigned int, uint32_t[]); extern gps_mask_t gpsd_interpret_subframe_raw(struct gps_device_t *, unsigned int, uint32_t[]); extern const char *gpsd_hexdump(char *, size_t, char *, size_t); extern const char *gpsd_packetdump(char *, size_t, char *, size_t); extern const char *gpsd_prettydump(struct gps_device_t *); # ifdef __cplusplus extern "C" { # endif extern int gpsd_hexpack(const char *, char *, size_t); # ifdef __cplusplus } # endif extern ssize_t hex_escapes(char *, const char *); extern void gpsd_position_fix_dump(struct gps_device_t *, char[], size_t); extern void gpsd_clear_data(struct gps_device_t *); extern socket_t netlib_connectsock(int, const char *, const char *, const char *); extern socket_t netlib_localsocket(const char *, int); extern const char *netlib_errstr(const int); extern char *netlib_sock2ip(socket_t); extern void nmea_tpv_dump(struct gps_device_t *, char[], size_t); extern void nmea_sky_dump(struct gps_device_t *, char[], size_t); extern void nmea_subframe_dump(struct gps_device_t *, char[], size_t); extern void nmea_ais_dump(struct gps_device_t *, char[], size_t); extern unsigned int ais_binary_encode(struct ais_t *ais, unsigned char *bits, int flag); #ifdef NTP_ENABLE extern void ntp_latch(struct gps_device_t *device, struct timedelta_t *td); #ifdef NTPSHM_ENABLE extern void ntpshm_context_init(struct gps_context_t *); extern void ntpshm_session_init(struct gps_device_t *); extern int ntpshm_put(struct gps_device_t *, volatile struct shmTime *, struct timedelta_t *); extern void ntpshm_link_deactivate(struct gps_device_t *); extern void ntpshm_link_activate(struct gps_device_t *); #endif /* NTPSHM_ENABLE */ #endif /* NTP_ENABLE */ extern void errout_reset(struct gpsd_errout_t *errout); extern void gpsd_acquire_reporting_lock(void); extern void gpsd_release_reporting_lock(void); extern void ecef_to_wgs84fix(struct gps_fix_t *, double *, double, double, double, double, double, double); extern void clear_dop(struct dop_t *); /* shmexport.c */ #define GPSD_SHM_KEY 0x47505344 /* "GPSD" */ struct shmexport_t { int bookend1; struct gps_data_t gpsdata; int bookend2; }; extern bool shm_acquire(struct gps_context_t *); extern void shm_release(struct gps_context_t *); extern void shm_update(struct gps_context_t *, struct gps_data_t *); /* dbusexport.c */ #if defined(DBUS_EXPORT_ENABLE) int initialize_dbus_connection (void); void send_dbus_fix (struct gps_device_t* channel); #endif /* defined(DBUS_EXPORT_ENABLE) */ /* srecord.c */ extern void hexdump(size_t, unsigned char *, unsigned char *); extern unsigned char sr_sum(unsigned int, unsigned int, unsigned char *); extern int bin2srec(unsigned int, unsigned int, unsigned int, unsigned char *, unsigned char *); extern int srec_hdr(unsigned int, unsigned char *, unsigned char *); extern int srec_fin(unsigned int, unsigned char *); extern unsigned char hc(unsigned char); /* a BSD transplant */ int b64_ntop(unsigned char const *src, size_t srclength, char *target, size_t targsize); /* application interface */ extern void gps_context_init(struct gps_context_t *context, const char *label); extern void gpsd_init(struct gps_device_t *, struct gps_context_t *, const char *); extern void gpsd_clear(struct gps_device_t *); extern int gpsd_open(struct gps_device_t *); #define O_CONTINUE 0 #define O_PROBEONLY 1 #define O_OPTIMIZE 2 extern int gpsd_activate(struct gps_device_t *, const int); extern void gpsd_deactivate(struct gps_device_t *); #define AWAIT_GOT_INPUT 1 #define AWAIT_NOT_READY 0 #define AWAIT_FAILED -1 extern int gpsd_await_data(fd_set *, fd_set *, const int, fd_set *, struct gpsd_errout_t *errout); extern gps_mask_t gpsd_poll(struct gps_device_t *); #define DEVICE_EOF -3 #define DEVICE_ERROR -2 #define DEVICE_UNREADY -1 #define DEVICE_READY 1 #define DEVICE_UNCHANGED 0 extern int gpsd_multipoll(const bool, struct gps_device_t *, void (*)(struct gps_device_t *, gps_mask_t), float reawake_time); extern void gpsd_wrap(struct gps_device_t *); extern bool gpsd_add_device(const char *device_name, bool flag_nowait); extern const char *gpsd_maskdump(gps_mask_t); /* exceptional driver methods */ extern bool ubx_write(struct gps_device_t *, unsigned int, unsigned int, unsigned char *, size_t); extern bool ais_binary_decode(const struct gpsd_errout_t *errout, struct ais_t *ais, const unsigned char *, size_t, struct ais_type24_queue_t *); /* debugging apparatus for the client library */ #ifdef CLIENTDEBUG_ENABLE #define LIBGPS_DEBUG #endif /* CLIENTDEBUG_ENABLE */ #ifdef LIBGPS_DEBUG #define DEBUG_CALLS 1 /* shallowest debug level */ #define DEBUG_JSON 5 /* minimum level for verbose JSON debugging */ # define libgps_debug_trace(args) (void) libgps_trace args extern int libgps_debuglevel; extern void libgps_dump_state(struct gps_data_t *); #else # define libgps_debug_trace(args) do { } while (0) #endif /* LIBGPS_DEBUG */ void gpsd_labeled_report(const int, const int, const char *, const char *, va_list); void gpsd_vlog(const struct gpsd_errout_t *, const int, char *, size_t, const char *, va_list ap); PRINTF_FUNC(3, 4) void gpsd_log(const struct gpsd_errout_t *, const int, const char *, ...); /* * How to mix together epx and epy to get a horizontal circular error * eph when reporting requires it. Most devices don't report these; * NMEA 3.x devices reporting $GPGBS are the exception. */ #define EMIX(x, y) (((x) > (y)) ? (x) : (y)) #define NITEMS(x) ((int) (sizeof(x) / sizeof(x[0]) + COMPILE_CHECK_IS_ARRAY(x))) /* Ugh - required for build on Solaris */ #ifndef NAN #define NAN (0.0f/0.0f) #endif /* Cygwin, in addition to NAN, doesn't have cfmakeraw */ #if defined(__CYGWIN__) void cfmakeraw(struct termios *); #endif /* defined(__CYGWIN__) */ #define DEVICEHOOKPATH "/"SYSCONFDIR"/gpsd/device-hook" # ifdef __cplusplus } # endif #endif /* _GPSD_H_ */ // Local variables: // mode: c // end: gpsd-3.15/gpsd.hotplug0000664000175000017500000000413112520742615013111 0ustar esresr#!/bin/sh # # This script is the gpsd udev handler for add/remove events on matched USB # devices. It expects to see the following environment variables: # # ACTION = either "add" or "remove" # DEVNAME = the full name of the USB device that was just activated # # It will accept from /etc/sysconfig/gpsd the following config variables: # # CONTROL_SOCKET = location of the gpsd control socket # OPTIONS = options to be passed to gpsd on launch # # It hands off to gpsdctl for the actual communication with the daemon. # # Do not introduce bashims into this script, as we want it to continue to # work under Ubuntu. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. PATH=/usr/sbin:$PATH export PATH if [ -r /etc/default/gpsd ]; then . /etc/default/gpsd elif [ -r /etc/conf.d/gpsd ]; then . /etc/conf.d/gpsd elif [ -r /etc/sysconfig/gpsd ]; then . /etc/sysconfig/gpsd GPSD_OPTIONS=$OPTIONS GPSD_SOCKET=$CONTROL_SOCKET fi if [ -n "$GPSD_OPTIONS" ]; then export GPSD_OPTIONS fi if [ -n "$GPSD_SOCKET" ]; then export GPSD_SOCKET fi if [ -n "$USBAUTO" ]; then [ "$USBAUTO" = "true" ] || exit 0 fi if [ "$ACTION" = "remove" ] ; then if echo $DEVLINKS | grep -q /dev/gps; then : else exit 0 fi fi logger -t "gpsd.hotplug" -p daemon.info "$ACTION" "$DEVNAME" if [ -z "$DEVNAME" ] then logger -t gpsd.hotplug -p daemon.err "no device" exit 0 fi # In recent versions of udev, the gpsd script runs in series with # the task that creates the real /dev/ttyUSBn device # node. Unfortunately, the gpsd script runs BEFORE the creation of # the node, and the node is not created until after you kill the # gpsd script, because the gpsd script waits forever for the node # to appear. # # This is a race condition, and is best fixed by running the # actual wait/hotplug portion in the background. { #logger -t gpsd.hotplug -p daemon.info "waiting for" $DEVNAME while [ -x $DEVNAME ] do sleep 1 done #logger -t gpsd.hotplug -p daemon.info $DEVNAME "is active" gpsdctl $ACTION $DEVNAME } & gpsd-3.15/gpsd.php.in0000664000175000017500000004530112513107374012626 0ustar esresr # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # Changed to Google Maps API v3, requires no API key, and shorter code # Sanjeev Gupta 2013-01-05 global $head, $blurb, $title, $showmap, $autorefresh, $footer, $gmap_key; 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); ini_set('max_execution_time', 3); if (!file_exists("gpsd_config.inc")) write_config(); require_once("gpsd_config.inc"); # sample data $resp = <<0) && ($port<65536)) $port = $_GET['port']; if ($testmode){ $sock = @fsockopen($server, $port, $errno, $errstr, 2); @fwrite($sock, "?WATCH={\"enable\":true}\n"); usleep(1000); @fwrite($sock, "?POLL;\n"); usleep(1000); for($tries = 0; $tries < 10; $tries++){ $resp = @fread($sock, 2000); # SKY can be pretty big if (preg_match('/{"class":"POLL".+}/i', $resp, $m)){ $resp = $m[0]; break; } } @fclose($sock); if (!$resp) $resp = '{"class":"ERROR","message":"no response from GPS daemon"}'; } } if ($op == 'view') gen_image($resp); else if ($op == 'json') write_json($resp); else write_html($resp); exit(0); ########################################################################### # Function to decide if a PRN is a true GPS bird or SBAS, GBAS, etc. # Sanjeev Gupta 20150408 # Please refer to gps.h lines ~~ 95 , for a central definition function isGPS($PRN) { if ($PRN <= 32) return TRUE ; # Navstar GPS if ($PRN >= 64 && $PRN <= 96) return TRUE ; # GLONASS if ($PRN >= 159 ) return TRUE ; # BeiDou ? return FALSE ; # SBAS, GBAS, unknown } function colorsetup($im){ $C['white'] = imageColorAllocate($im, 255, 255, 255); $C['ltgray'] = imageColorAllocate($im, 191, 191, 191); $C['mdgray'] = imageColorAllocate($im, 127, 127, 127); $C['dkgray'] = imageColorAllocate($im, 63, 63, 63); $C['black'] = imageColorAllocate($im, 0, 0, 0); $C['red'] = imageColorAllocate($im, 255, 0, 0); $C['brightgreen'] = imageColorAllocate($im, 0, 255, 0); $C['darkgreen'] = imageColorAllocate($im, 0, 192, 0); $C['blue'] = imageColorAllocate($im, 0, 0, 255); $C['cyan'] = imageColorAllocate($im, 0, 255, 255); $C['magenta'] = imageColorAllocate($im, 255, 0, 255); $C['yellow'] = imageColorAllocate($im, 255, 255, 0); $C['orange'] = imageColorAllocate($im, 255, 128, 0); return $C; } function legend($im, $sz, $C){ $r = 30; $fn = 5; $x = $sz - (4*$r+7) - 2; $y = $sz - $r - 3; imageFilledRectangle($im, $x, $y, $x + 4*$r + 7, $y + $r +1, $C['dkgray']); imageRectangle($im, $x+0*$r+1, $y+1, $x + 1*$r + 0, $y + $r, $C['red']); imageRectangle($im, $x+1*$r+2, $y+1, $x + 2*$r + 2, $y + $r, $C['yellow']); imageRectangle($im, $x+2*$r+4, $y+1, $x + 3*$r + 4, $y + $r, $C['darkgreen']); imageRectangle($im, $x+4*$r+6, $y+1, $x + 3*$r + 6, $y + $r, $C['brightgreen']); imageString($im, $fn, $x+3+0*$r, $y+$r/3, "<30", $C['red']); imageString($im, $fn, $x+5+1*$r, $y+$r/3, "30+", $C['yellow']); imageString($im, $fn, $x+7+2*$r, $y+$r/3, "35+", $C['darkgreen']); imageString($im, $fn, $x+9+3*$r, $y+$r/3, "40+", $C['brightgreen']); } function radial($angle, $sz){ #turn into radians $angle = deg2rad($angle); # determine length of radius $r = $sz * 0.5 * 0.95; # and convert length/azimuth to cartesian $x0 = sprintf("%d", (($sz * 0.5) - ($r * cos($angle)))); $y0 = sprintf("%d", (($sz * 0.5) - ($r * sin($angle)))); $x1 = sprintf("%d", (($sz * 0.5) + ($r * cos($angle)))); $y1 = sprintf("%d", (($sz * 0.5) + ($r * sin($angle)))); return array($x0, $y0, $x1, $y1); } function azel2xy($az, $el, $sz){ global $swap_ew; #rotate coords... 90deg W = 180deg trig $az += 270; #turn into radians $az = deg2rad($az); # determine length of radius $r = $sz * 0.5 * 0.95; $r -= ($r * ($el/90)); # and convert length/azimuth to cartesian $x = sprintf("%d", (($sz * 0.5) + ($r * cos($az)))); $y = sprintf("%d", (($sz * 0.5) + ($r * sin($az)))); if ($swap_ew == 0) $x = $sz - $x; return array($x, $y); } function splot($im, $sz, $C, $e){ if ((0 == $e['PRN']) || (0 == $e['az'] + $e['el'] + $e['ss']) || ($e['az'] < 0) || ($e['el'] < 0)) return; $color = $C['brightgreen']; if ($e['ss'] < 40) $color = $C['darkgreen']; if ($e['ss'] < 35) $color = $C['yellow']; if ($e['ss'] < 30) $color = $C['red']; if ($e['el']<10) $color = $C['blue']; if ($e['ss'] < 10) $color = $C['black']; list($x, $y) = azel2xy($e['az'], $e['el'], $sz); $r = 12; if (isset($_GET['sz']) && ($_GET['sz'] == 'small')) $r = 8; imageString($im, 3, $x+4, $y+4, $e['PRN'], $C['black']); if ($e['used'] == true) if (isGPS($e['PRN'])) imageFilledArc($im, $x, $y, $r, $r, 0, 360, $color, 0); else imageFilledDiamond($im, $x, $y, $r, $color); else if (isGPS($e['PRN'])) imageArc($im, $x, $y, $r, $r, 0, 360, $color); else imageDiamond($im, $x, $y, $r, $color); } function imageDiamond($im, $x, $y, $r, $color){ $t = $r/2; # this lunacy is because imagesetthickness doesn't seem to work $vx = array ( $x+$t, $y, $x, $y+$t, $x-$t, $y, $x, $y-$t ); imagepolygon($im, $vx, 4, $color); $t--; $vx = array ( $x+$t, $y, $x, $y+$t, $x-$t, $y, $x, $y-$t ); imagepolygon($im, $vx, 4, $color); $t--; $vx = array ( $x+$t, $y, $x, $y+$t, $x-$t, $y, $x, $y-$t ); imagepolygon($im, $vx, 4, $color); } function imageFilledDiamond($im, $x, $y, $r, $color){ $t = $r/2; while($t){ $vx = array ( $x+$t, $y, $x, $y+$t, $x-$t, $y, $x, $y-$t ); imagepolygon($im, $vx, 4, $color); $t -= 0.5; } } function elevation($im, $sz, $C, $a){ $b = 90 - $a; $a = $sz * 0.95 * ($a/180); imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['ltgray']); $x = $sz/2 - 16; $y = $sz/2 - $a; imageString($im, 2, $x, $y, $b, $C['ltgray']); } function skyview($im, $sz, $C){ global $swap_ew; $a = 90; $a = $sz * 0.95 * ($a/180); imageFilledArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['mdgray'], 0); imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['black']); $x = $sz/2 - 16; $y = $sz/2 - $a; imageString($im, 2, $x, $y, "0", $C['ltgray']); $a = 85; $a = $sz * 0.95 * ($a/180); imageFilledArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['white'], 0); imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['ltgray']); imageString($im, 1, $sz/2 - 6, $sz+$a, '5', $C['black']); $x = $sz/2 - 16; $y = $sz/2 - $a; imageString($im, 2, $x, $y, "5", $C['ltgray']); for($i = 0; $i < 180; $i += 15){ list($x0, $y0, $x1, $y1) = radial($i, $sz); imageLine($im, $x0, $y0, $x1, $y1, $C['ltgray']); } for($i = 15; $i < 90; $i += 15) elevation($im, $sz, $C, $i); $x = $sz/2 - 16; $y = $sz/2 - 8; /* imageString($im, 2, $x, $y, "90", $C['ltgray']); */ imageString($im, 4, $sz/2 + 4, 2 , 'N', $C['black']); imageString($im, 4, $sz/2 + 4, $sz - 16 , 'S', $C['black']); if ($swap_ew == 0){ imageString($im, 4, 4 , $sz/2 + 4, 'E', $C['black']); imageString($im, 4, $sz - 10 , $sz/2 + 4, 'W', $C['black']); } else { imageString($im, 4, 4 , $sz/2 + 4, 'W', $C['black']); imageString($im, 4, $sz - 10 , $sz/2 + 4, 'E', $C['black']); } } function gen_image($resp){ $sz = 600; if (isset($_GET['sz']) && ($_GET['sz'] == 'small')) $sz = 240; $GPS = json_decode($resp, true); if ($GPS['class'] != "POLL"){ die("json_decode error: $resp"); } $im = imageCreate($sz, $sz); $C = colorsetup($im); skyview($im, $sz, $C); if ($sz > 240) legend($im, $sz, $C); for($i = 0; $i < count($GPS['sky'][0]['satellites']); $i++){ splot($im, $sz, $C, $GPS['sky'][0]['satellites'][$i]); } header("Content-type: image/png"); imagePNG($im); imageDestroy($im); } function dfix($x, $y, $z){ if ($x < 0){ $x = sprintf("%f %s", -1 * $x, $z); } else { $x = sprintf("%f %s", $x, $y); } return $x; } function write_html($resp){ global $sock, $errstr, $errno, $server, $port, $head, $body, $open; global $blurb, $title, $autorefresh, $showmap, $gmap_key, $footer; 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"); global $lat, $lon; $lat = (float)$GPS['tpv'][0]['lat']; $lon = (float)$GPS['tpv'][0]['lon']; $x = $server; $y = $port; $imgdata = base64_encode($resp); $server = $x; $port = $y; if ($autorefresh > 0) $autorefresh = ""; else $autorefresh = ''; $map_head = $map_body = $map_code = ''; if ($showmap == 1) { $map_head = gen_gmap_head(); $map_body = 'onload="Load()" onunload="GUnload()"'; $map_code = gen_map_code(); } else if ($showmap == 2) { $map_head = gen_osm_head(); $map_body = 'onload="Load()"'; $map_code = gen_map_code(); } $part1 = << {$head} {$map_head} {$title} - GPSD Test Station {$lat}, {$lon} {$autorefresh}
EOF; if (!strlen($advertise)) $advertise = $server; if ($testmode && !$sock) $part2 = ""; else $part2 = << EOF; if (!$open) $part3 = ''; else $part3 = << EOF; if ($testmode && !$sock) $part4 = ""; else { $fix = $GPS['tpv'][0]; $sky = $GPS['sky'][0]; $sats = $sky['satellites']; $nsv = count($sats); $ts = $fix['time']; $sat = ''; foreach($sats as $s) $sat .= sprintf( "\t\n", $s['PRN'], $s['el'], $s['az'], $s['ss'], $s['used'] ? 'Y' : 'N' ); $part4 = << EOF; } $part5 = << {$footer}

This script is distributed by the GPSD project.

EOF; 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) die("can't generate prototype config file. try running this script as root in DOCUMENT_ROOT"); $buf = <<gpsd server located someplace. The hardware is a hardware description and link. This machine is maintained by Your Name Goes Here.
EOT; ?> EOB; fwrite($f, $buf); fclose($f); } function gen_gmap_head() { global $gmap_key; return << EOT; } function gen_osm_head() { global $GPS; return << EOT; } function gen_map_code() { return <<
Loading...
EOT; } ?> gpsd-3.15/gpsd.rules.in0000664000175000017500000000636612467340617013210 0ustar esresr# udev rules for gpsd # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # GPSes don't have their own USB device class. They're serial-over-USB # devices, so what you see is actually the ID of the serial-over-USB chip. # Fortunately, just two of these account for over 80% of consumer-grade # GPS sensors. The gpsd.hotplug wrapper script will tell a running gpsd # that it should look at the device that just went active, because it # might be a GPS. # # The following setup works on Debian and Ubuntu - something similar # will apply on other distributions: # # /lib/udev/rules.d/25-gpsd.rules # /lib/udev/gpsd.hotplug # # Setting the link in /lib/udev/rules.d activates the rule and determines # when to run it on boot (similar to init.d processing). SUBSYSTEM!="tty", GOTO="gpsd_rules_end" # Prolific Technology, Inc. PL2303 Serial Port [linux module: pl2303] ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", SYMLINK+="gps%n", @udevcommand@ # ATEN International Co., Ltd UC-232A Serial Port [linux module: pl2303] ATTRS{idVendor}=="0557", ATTRS{idProduct}=="2008", SYMLINK+="gps%n", @udevcommand@ # PS-360 OEM (GPS sold with MS Street and Trips 2005) [linux module: pl2303] ATTRS{idVendor}=="067b", ATTRS{idProduct}=="aaa0", SYMLINK+="gps%n", @udevcommand@ # FTDI 8U232AM / FT232 [linux module: ftdi_sio] ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="gps%n", @udevcommand@ # Cypress M8/CY7C64013 (Delorme uses these) [linux module: cypress_m8] ATTRS{idVendor}=="1163", ATTRS{idProduct}=="0100", SYMLINK+="gps%n", @udevcommand@ # Cypress M8/CY7C64013 (DeLorme LT-40) ATTRS{idVendor}=="1163", ATTRS{idProduct}=="0200", SYMLINK+="gps%n", @udevcommand@ # Garmin International GPSmap, various models (tested with Garmin GPS 18 USB) [linux module: garmin_gps] ATTRS{idVendor}=="091e", ATTRS{idProduct}=="0003", SYMLINK+="gps%n", @udevcommand@ # Cygnal Integrated Products, Inc. CP210x Composite Device (Used by Holux m241 and Wintec grays2 wbt-201) [linux module: cp210x] ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="gps%n", @udevcommand@ # Cygnal Integrated Products, Inc. [linux module: cp210x] ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea71", SYMLINK+="gps%n", @udevcommand@ # u-blox AG, u-blox 5 (tested with Navilock NL-402U) [linux module: cdc_acm] ATTRS{idVendor}=="1546", ATTRS{idProduct}=="01a5", SYMLINK+="gps%n", @udevcommand@ # u-blox AG, u-blox 6 (tested with GNSS Evaluation Kit TCXO) [linux module: cdc_acm] ATTRS{idVendor}=="1546", ATTRS{idProduct}=="01a6", SYMLINK+="gps%n", @udevcommand@ # u-blox AG, u-blox 7 [linux module: cdc_acm] ATTRS{idVendor}=="1546", ATTRS{idProduct}=="01a7", SYMLINK+="gps%n", @udevcommand@ # u-blox AG, u-blox 8 (tested with GNSS Evaluation Kit EKV-M8N) [linux module: cdc_acm] ATTRS{idVendor}=="1546", ATTRS{idProduct}=="01a8", SYMLINK+="gps%n", @udevcommand@ # MediaTek (tested with HOLUX M-1200E) [linux module: cdc_acm] ATTRS{idVendor}=="0e8d", ATTRS{idProduct}=="3329", SYMLINK+="gps%n", @udevcommand@ # Telit wireless solutions (tested with HE910G) [linux module: cdc_acm] ATTRS{interface}=="Telit Wireless Module Port", ATTRS{bInterfaceNumber}=="06", SYMLINK+="gps%n", @udevcommand@ ACTION=="remove", @udevcommand@ LABEL="gpsd_rules_end" gpsd-3.15/gpsd.usermap0000664000175000017500000000206612520742615013110 0ustar esresr# Hotplug device map for GPSD # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # GPSes don't have their own USB device class. They're serial-over-USB # devices, so what you see is actually the ID of the serial-over-USB chip. # Fortunately, just two of these account for over 80% of consumer-grade # GPS sensors. The gpsdplug script will tell a running gpsd that it should # look at the device that just went active, because it might be a GPS. # # The Prolific Technology 2303 (commonly in tandem with SiRF chips) gpsd.hotplug 0x0003 0x067b 0x2303 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # FTDI 8U232AM gpsd.hotplug 0x0003 0x0403 0x6001 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Cypress M8/CY7C64013 (DeLorme uses these) gpsd.hotplug 0x0003 0x1163 0x0100 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # PS-360 OEM (Microsoft GPS sold with Street and Trips 2005) gpsd.hotplug 0x0003 0x067b 0xaaa0 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 gpsd-3.15/gpsd.xml0000664000175000017500000011352212520742615012234 0ustar esresr ]> 9 Aug 2004 gpsd 8 The GPSD Project GPSD Documentation gpsd interface daemon for GPS receivers gpsd -F control-socket -S listener-port -b -l -G -n -N -h -P pidfile -D debuglevel -V source-name QUICK START If you have a GPS attached on the lowest-numbered USB port of a Linux system, and want to read reports from it on TCP/IP port 2947, it will normally suffice to do this: gpsd /dev/ttyUSB0 For the lowest-numbered serial port: gpsd /dev/ttyS0 Change the device number as appropriate if you need to use a different port. Command-line flags enable verbose logging, a control port, and other optional extras but should not be needed for basic operation; the one exception, on very badly designed hardware, might be (which see). On Linux systems supporting udev, gpsd is normally started automatically when a USB plugin event fires (if it is not already running) and is handed the name of the newly active device. In that case no invocation is required at all. For your initial tests set your GPS hardware to speak NMEA, as gpsd is guaranteed to be able to process that. If your GPS has a native or binary mode with better performance that gpsd knows how to speak, gpsd will autoconfigure that mode. You can verify correct operation by first starting gpsd and then xgps, the X windows test client. If you have problems, the GPSD project maintains a FAQ to assist troubleshooting. DESCRIPTION gpsd is a monitor daemon that collects information from GPSes, differential-GPS radios, or AIS receivers attached to the host machine. Each GPS, DGPS radio, or AIS receiver is expected to be direct-connected to the host via a USB or RS232C serial device. The serial device may be specified to gpsd at startup, or it may be set via a command shipped down a local control socket (e.g. by a USB hotplug script). Given a GPS device by either means, gpsd discovers the correct port speed and protocol for it. gpsd should be able to query any GPS that speaks either the standard textual NMEA 0183 protocol, or the (differing) extended NMEA dialects used by MKT-3301, iTrax, Motorola OnCore, Sony CXD2951, and Ashtech/Thales devices. It can also interpret the binary protocols used by EverMore, Garmin, Navcom, Rockwell/Zodiac, SiRF, Trimble, and u-blox ANTARIS devices. Under Linux it can read NMEA2000 packets through the kernel CAN socket. It can read heading and attitude information from the Oceanserver 5000 or TNT Revolution digital compasses. The GPS reporting formats supported by your instance of gpsd may differ depending on how it was compiled; general-purpose versions support many, but it can be built with protocol subsets down to a singleton for use in constrained environments. For a list of the GPS protocols supported by your instance, see the output of gpsd -l gpsd effectively hides the differences among the GPS types it supports. It also knows about and uses commands that tune these GPSes for lower latency. By using gpsd as an intermediary, applications avoid contention for serial devices. gpsd can use differential-GPS corrections from a DGPS radio or over the net, from a ground station running a DGPSIP server or a Ntrip broadcaster that reports RTCM-104 data; this will shrink position errors by roughly a factor of four. When gpsd opens a serial device emitting RTCM-104, it automatically recognizes this and uses the device as a correction source for all connected GPSes that accept RTCM corrections (this is dependent on the type of the GPS; not all GPSes have the firmware capability to accept RTCM correction packets). See and for discussion. Client applications will communicate with gpsd via a TCP/IP port, 2947 by default). Both IPv4 and IPv6 connections are supported and a client may connect via either. The program accepts the following options: -F Create a control socket for device addition and removal commands. You must specify a valid pathname on your local filesystem; this will be created as a Unix-domain socket to which you can write commands that edit the daemon's internal device list. -S Set TCP/IP port on which to listen for GPSD clients (default is 2947). -b Broken-device-safety mode, otherwise known as read-only mode. A few bluetooth and USB receivers lock up or become totally inaccessible when probed or reconfigured; see the hardware compatibility list on the GPSD project website for details. This switch prevents gpsd from writing to a receiver. This means that gpsd cannot configure the receiver for optimal performance, but it also means that gpsd cannot break the receiver. A better solution would be for Bluetooth to not be so fragile. A platform independent method to identify serial-over-Bluetooth devices would also be nice. -G This flag causes gpsd to listen on all addresses (INADDR_ANY) rather than just the loop back (INADDR_LOOPBACK) address. For the sake of privacy and security, TPV information is now private to the local machine until the user makes an effort to expose this to the world. -l List all drivers compiled into this gpsd instance. The letters to the left of each driver name are the gpsd control commands supported by that driver. -n Don't wait for a client to connect before polling whatever GPS is associated with it. Some RS232 GPSes wait in a standby mode (drawing less power) when the host machine is not asserting DTR, and some cellphone and handheld embedded GPSes have similar behaviors. Accordingly, waiting for a watch request to open the device may save battery power. (This capability is rare in consumer-grade devices). -N Don't daemonize; run in foreground. This switch is mainly useful for debugging. -h Display help message and terminate. -P Specify the name and path to record the daemon's process ID. -D Set debug level. At debug levels 2 and above, gpsd reports incoming sentence and actions to standard error if gpsd is in the foreground (-N) or to syslog if in the background. -V Dump version and exit. Arguments are interpreted as the names of data sources. Normally, a data source is the device pathname of a local device from which the daemon may expect GPS data. But there are three other special source types recognized, for a total of four: Local serial or USB device A normal Unix device name of a serial or USB device to which a sensor is attached. Example: /dev/ttyUSB0. Local PPS device A normal Unix device name of a PPS device to which a PPS source is attached. The device name must start with "/dev/pps" and a local serial or USB GPS device must also be available. Example: /dev/pps0. TCP feed A URI with the prefix "tcp://", followed by a hostname, a colon, and a port number. The daemon will open a socket to the indicated address and port and read data packets from it, which will be interpreted as though they had been issued by a serial device. Example: tcp://data.aishub.net:4006. UDP feed A URI with the prefix "udp://", followed by a hostname, a colon, and a port number. The daemon will open a socket listening for UDP datagrams arriving on the indicated address and port, which will be interpreted as though they had been issued by a serial device. Example: udp://127.0.0.1:5000. Ntrip caster A URI with the prefix "ntrip://" followed by the name of an Ntrip caster (Ntrip is a protocol for broadcasting differential-GPS fixes over the net). For Ntrip services that require authentication, a prefix of the form "username:password@" can be added before the name of the Ntrip broadcaster. For Ntrip service, you must specify which stream to use; the stream is given in the form "/streamname". An example DGPSIP URI could be "dgpsip://dgpsip.example.com" and a Ntrip URI could be "ntrip://foo:bar@ntrip.example.com:80/example-stream". Corrections from the caster will be send to each attached GPS with the capability to accept them. DGPSIP server A URI with the prefix "dgpsip://" followed by a hostname, a colon, and an optional colon-separated port number (defaulting to 2101). The daemon will handshake with the DGPSIP server and read RTCM2 correction data from it. Corrections from the server will be set to each attached GPS with the capability to accept them. Example: dgpsip://dgps.wsrcc.com:2101. Remote gpsd feed A URI with the prefix "gpsd://", followed by a hostname and optionally a colony and a port number (if the port is absent the default gpsd port will be used). The daemon will open a socket to the indicated address and port and emulate a gpsd client, collecting JSON reports from the remote gpsd instance that will be passed to local clients. NMEA2000 CAN data A URI with the prefix "nmea2000://", followed by a CAN devicename. Only Linux socket CAN interfaces are supported. The interface must be configured to receive CAN messages before gpsd can be started. If there is more then one unit on the CAN bus that provides GPS data, gpsd chooses the unit from which a GPS message is first seen. Example: nmea2000://can0. (The "ais:://" source type supported in some older versions of the daemon has been retired in favor of the more general "tcp://".) 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 the daemon will have no devices on its search list until they are added by a control-socket command (see for details on this). Daemon startup will abort with an error if neither any devices nor a control socket are specified. When a device is activated (i.e. a client requests data from it), gpsd attempts to execute a hook from /etc/gpsd/device-hook with first command line argument set to the pathname of the device and the second to . On deactivation it does the same passing for the second argument. gpsd can export data to client applications in three ways: via a sockets interface, via a shared-memory segment, and via D-Bus. The next three major sections describe these interfaces. THE SOCKET INTERFACE Clients may communicate with the daemon via textual request and responses over a socket. It is a bad idea for applications to speak the protocol directly: rather, they should use the libgps client library and take appropriate care to conditionalize their code on the major and minor protocol version symbols. The request-response protocol for the socket interface is fully documented in gpsd_json5. SHARED-MEMORY AND DBUS INTERFACES gpsd has two other (read-only) interfaces. Whenever the daemon recognizes a packet from any attached device, it writes the accumulated state from that device to a shared memory segment. The C and C++ client libraries shipped with GPSD can read this segment. Client methods, and various restrictions associated with the read-only nature of this interface, are documented at libgps3. The shared-memory interface is intended primarily for embedded deployments in which gpsd monitors a single device, and its principal advantage is that a daemon instance configured with shared memory but without the sockets interface loses a significant amount of runtime weight. The daemon may be configured to emit a D-Bus signal each time an attached device delivers a fix. The signal path is path /org/gpsd, the signal interface is "org.gpsd", and the signal name is "fix". The signal payload layout is as follows:
{$blurb}

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 Augmentation satellites.

{$map_code}
To get real-time information, connect to telnet://{$advertise}:{$port}/ and type "?POLL;" or "?WATCH={"enable":true,"raw":true}".
Use a different server:
:

The gpsd instance that this page monitors is not running.
%d%d%d%d%s
Current Information
Time (UTC){$ts}
Latitude{$fix['lat']}
Longitude{$fix['lon']}
Altitude{$fix['alt']}
Fix Type{$fix['mode']}
Satellites{$nsv}
HDOP{$sky['hdop']}
VDOP{$sky['vdop']}

$sat
Current Satellites
PRNElevationAzimuthSSUsed
Satellite object Type Description DBUS_TYPE_DOUBLE Time (seconds since Unix epoch) DBUS_TYPE_INT32 mode DBUS_TYPE_DOUBLE Time uncertainty (seconds). DBUS_TYPE_DOUBLE Latitude in degrees. DBUS_TYPE_DOUBLE Longitude in degrees. DBUS_TYPE_DOUBLE Horizontal uncertainty in meters, 95% confidence. DBUS_TYPE_DOUBLE Altitude in meters. DBUS_TYPE_DOUBLE Altitude uncertainty in meters, 95% confidence. DBUS_TYPE_DOUBLE Course in degrees from true north. DBUS_TYPE_DOUBLE Course uncertainty in meters, 95% confidence. DBUS_TYPE_DOUBLE Speed, meters per second. DBUS_TYPE_DOUBLE Speed uncertainty in meters per second, 95% confidence. DBUS_TYPE_DOUBLE Climb, meters per second. DBUS_TYPE_DOUBLE Climb uncertainty in meters per second, 95% confidence. DBUS_TYPE_STRING Device name
GPS DEVICE MANAGEMENT gpsd maintains an internal list of 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. 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. When gpsd is properly installed along with hotplug notifier scripts feeding it device-add commands over the control socket, gpsd should require no configuration or user action to find devices. Sending SIGHUP to a running gpsd forces it to close all GPSes and all client connections. It will then attempt to reconnect to any GPSes on its device list and resume listening for client connections. This may be useful if your GPS enters a wedged or confused state but can be soft-reset by pulling down DTR. When gpsd is called with no initial devices (thus, expecting devices to be passed to it by notifications to the control socket), and reaches a state where there are no devices connected and no subscribers after after some devices have been seen, it shuts down gracefully. It is expected that future device hotplug events will reactivate it. To point gpsd at a device that may be a GPS, write to the control socket a plus sign ('+') followed by the device name followed by LF or CR-LF. Thus, to point the daemon at /dev/foo. send "+/dev/foo\n". To tell the daemon that a device has been disconnected and is no longer available, send a minus sign ('-') followed by the device name followed by LF or CR-LF. Thus, to remove /dev/foo from the search list, send "-/dev/foo\n". To send a control string to a specified device, write to the control socket a '!', followed by the device name, followed by '=', followed by the control string. To send a binary control string to a specified device, write to the control socket a '&', followed by the device name, followed by '=', followed by the control string in paired hex digits. Your client may await a response, which will be a line beginning with either "OK" or "ERROR". An ERROR response 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 gpsd's device pool. An ERROR response to a ! command means the daemon did not recognize the devicename specified. The control socket is intended for use by hotplug scripts and other device-discovery services. This control channel is separate from the public gpsd service port, and only locally accessible, in order to prevent remote denial-of-service and spoofing attacks. ACCURACY The base User Estimated Range Error (UERE) of GPSes is 8 meters 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 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 (VDOP) dependent on satellite geometry, and VDOP is typically larger than HDOP. Users should not rely on GPS altitude for life-critical tasks such as landing an airplane. These errors are intrinsic to the design and physics of the GPS system. gpsd does its internal computations at sufficient accuracy that it will add no measurable position error of its own. DGPS correction will reduce UERE by a factor of 4, provided you are within about 100mi (160km) of a DGPS ground station from which you are receiving corrections. On a 4800bps connection, the time latency of fixes provided by gpsd will be one second or less 95% of the time. Most of this lag is due to the fact that GPSes normally emit fixes once per second, thus expected latency is 0.5sec. On the personal-computer hardware available in 2005 and later, computation lag induced by gpsd will be negligible, on the order of a millisecond. Nevertheless, latency can introduce significant errors for vehicles in motion; at 50km/h (31mi/h) of speed over ground, 1 second of lag corresponds to 13.8 meters change in position between updates. The time reporting of the GPS system itself has an intrinsic accuracy limit of 14 nanoseconds, but this can only be approximated by specialized receivers using that send the high-accuracy PPS (Pulse-Per-Second) over RS232 to cue a clock crystal. Most GPS receivers only report time to a precision of 0.01s or 0.001s, and with no accuracy guarantees below 1sec. If your GPS uses a SiRF chipset at firmware level 231, reported UTC time may be off by the difference between whatever default leap-second offset has been compiled in and whatever leap-second correction is currently applicable, from startup until complete subframe information is received. Firmware levels 232 and up don't have this problem. You may run gpsd at debug level 4 to see the chipset type and firmware revision level. There are exactly two circumstances under which gpsd relies on the host-system clock: In the GPS broadcast signal, GPS time is represented using a week number that rolls over after 2^10 or 2^13 weeks (about 19.6 years, or 157 years), depending on the spacecraft. Receivers are required to disambiguate this to the correct date, but may have difficulty due to not knowing time to within half this interval, or may have bugs. Users have reported incorrect dates which appear to be due to this issue. gpsd uses the startup time of the daemon detect and compensate for rollovers while it is running, but otherwise reports the date as it is reported by the receiver without attempting to correct it. If you are using an NMEA-only GPS (that is, not using SiRF or Garmin or Zodiac binary mode), gpsd relies on the system clock to tell it the current century. If the system clock returns an invalid value near zero, and the GPS does not emit GPZDA at the start of its update cycle (which most consumer-grade NMEA GPSes do not) then the century part of the dates gpsd delivers may be wrong. Additionally, near the century turnover, a range of dates as wide in seconds as the accuracy of your system clock may be referred to the wrong century. USE WITH NTP gpsd can provide reference clock information to ntpd, to keep the system clock synchronized to the time provided by the GPS receiver. On Linux, gpsd includes support for interpreting the PPS pulses emitted at the start of every clock second on the carrier-detect lines of some serial GPSes; this pulse can be used to update NTP at much higher accuracy than message time provides. You can determine whether your GPS emits this pulse by running at -D 5 and watching for carrier-detect state change messages in the logfile. In addition, if your kernel provides the RFC 2783 kernel PPS API then gpsd will use that for extra accuracy. Detailed instructions for using GPSD to set up a high-quality time service can be found among the documentation on the GPSD website. USE WITH D-BUS On operating systems that support D-BUS, gpsd can be built to broadcast GPS fixes to D-BUS-aware applications. As D-BUS is still at a pre-1.0 stage, we will not attempt to document this interface here. Read the gpsd source code to learn more. SECURITY AND PERMISSIONS ISSUES gpsd, if given the -G flag, will listen for connections from any reachable host, and then disclose the current position. Before using the -G flag, consider whether you consider your computer's location to be sensitive data to be kept private or something that you wish to publish. gpsd must start up as root in order to open the NTPD shared-memory segment, open its logfile, and create its local control socket. Before doing any processing of GPS data, it tries to drop root privileges by setting its UID to "nobody" (or another configured userid) and its group ID to the group of the initial GPS passed on the command line — or, if that device doesn't exist, to the group of /dev/ttyS0. Privilege-dropping is a hedge against the possibility that carefully crafted data, either presented from a client socket or from a subverted serial device posing as a GPS, could be used to induce misbehavior in the internals of gpsd. It ensures that any such compromises cannot be used for privilege elevation to root. The assumption behind gpsd's particular behavior is that all the tty devices to which a GPS might be connected are owned by the same non-root group and allow group read/write, though the group may vary because of distribution-specific or local administrative practice. If this assumption is false, gpsd may not be able to open GPS devices in order to read them (such failures will be logged). In order to fend off inadvertent denial-of-service attacks by port scanners (not to mention deliberate ones), gpsd will time out inactive client connections. Before the client has issued a command that requests a channel assignment, a short timeout (60 seconds) applies. There is no timeout for clients in watcher or raw modes; rather, gpsd drops these clients if they fail to read data long enough for the outbound socket write buffer to fill. Clients with an assigned device in polling mode are subject to a longer timeout (15 minutes). LIMITATIONS 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), 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. gpsd may change control settings on your GPS (such as the emission frequency of various sentences or packets) and not restore the original settings on exit. This is a result of inadequacies in NMEA and the vendor binary GPS protocols, which often do not give clients any way to query the values of control settings in order to be able to restore them later. When using SiRF chips, the VDOP/TDOP/GDOP figures and associated error estimates are computed by gpsd rather than reported by the chip. The computation does not exactly match what SiRF chips do internally, which includes some satellite weighting using parameters gpsd cannot see. Autobauding on the Trimble GPSes can take as long as 5 seconds if the device speed is not matched to the GPS speed. Generation of position error estimates (eph, epv, epd, eps, epc) from the incomplete data handed back by GPS reporting protocols involves both a lot of mathematical black art and fragile device-dependent assumptions. This code has been bug-prone in tbe past and problems may still lurk there. AIDVM decoding of types 16-17, 22-23, and 25-26 is unverified. GPSD presently fully recognizes only the 2.1 level of RTCM2 (message types 1, 3, 4, 5, 6, 7, 9, 16). The 2.3 message types 13, 14, and 31 are recognized and reported. Message types 8, 10-12, 15-27, 28-30 (undefined), 31-37, 38-58 (undefined), and 60-63 are not yet supported. The ISGPS used for RTCM2 and subframes decoder logic is sufficiently convoluted to confuse some compiler optimizers, notably in GCC 3.x at -O2, into generating bad code. Devices meant to use PPS for high-precision timekeeping may fail if they are specified after startup by a control-socket command, as opposed to on the daemon's original command line. Root privileges are dropped early, and some Unix variants require them in order to set the PPS line discipline. Under Linux the POSIX capability to set the line discipline is retained, but other platforms cannot use this code. USB GPS devices often do not identify themselves through the USB subsystem; they typically present as the class 00h (undefined) or class FFh (vendor-specific) of USB-to-serial adapters. Because of this, the Linux hotplug scripts must tell gpsd to sniff data from every USB-to-serial adapter that goes active and is known to be of a type used in GPSes. No such device is sent configuration strings until after it has been identified as a GPS, and gpsd never opens a device that is opened by another process. But there is a tiny window for non-GPS devices not opened; if the application that wants them loses a race with GPSD its device open will fail and have to be retried after GPSD sniffs the device (normally less than a second later). FILES /dev/ttyS0 Prototype TTY device. After startup, gpsd sets its group ID to the owning group of this device if no GPS device was specified on the command line does not exist. /etc/gpsd/device-hook Optional file containing the device activation/deactivation script. Note that while /etc/gpsd is the default system configuration directory, it is possible to build the GPSD source code with different assumptions. ENVIRONMENT VARIABLES By setting the environment variable GPSD_SHM_KEY, you can control the key value used to create the shared-memory segment used for communication with the client library. This will be useful mainly when isolating test instances of gpsd from production ones. APPLICABLE STANDARDS The official NMEA protocol standards for NMEA0183 and NMEA2000 are available from the National Marine Electronics Association, but are proprietary and expensive; the maintainers of gpsd have made a point of not looking at them. The GPSD project website links to several documents that collect publicly disclosed information about the protocol. gpsd parses the following NMEA sentences: RMC, GGA, GLL, GSA, GSV, VTG, ZDA, GBS, HDT, DBT, GST. It recognizes these with either the normal GP talker-ID prefix, or with the GN prefix used by GLONASS, or with the II prefix emitted by Seahawk Autohelm marine navigation systems, or with the IN prefix emitted by some Garmin units, or with the EC prefix emitted by ECDIS units, or with the SD prefix emitted by depth sounders, or with the HC and TI prefix emitted by some Airmar equipment. It recognizes some vendor extensions: the PGRME emitted by some Garmin GPS models, the OHPR emitted by Oceanserver digital compasses, the PTNTHTM emitted by True North digital compasses, the PMTK omitted by some San Jose Navigation GPSes, and the PASHR sentences emitted by some Ashtech GPSes. Note that gpsd JSON returns pure decimal degrees, not the hybrid degree/minute format described in the NMEA standard. Differential-GPS corrections are conveyed by the RTCM protocols. The applicable standard for RTCM-104 V2 is RTCM Recommended Standards for Differential GNSS (Global Navigation Satellite) Service RTCM Paper 136-2001/SC 104-STD. The applicable standard for RTCM-104 V3 is RTCM Standard 10403.1 for Differential GNSS Services - Version 3 RTCM Paper 177-2006-SC104-STD. Ordering instructions for the RTCM standards are accessible from the website of the Radio Technical Commission for Maritime Services under "Publications". AIS is defined by ITU Recommendation M.1371, Technical Characteristics for a Universal Shipborne Automatic Identification System Using Time Division Multiple Access. The AIVDM/AIVDO format understood by this program is defined by IEC-PAS 61162-100, Maritime navigation and radiocommunication equipment and systems. A more accessible description of both can be found at AIVDM/AIVDO Protocol Decoding, on the references page of the GPSD project website. Subframe data is defined by IS-GPS-200E, GLOBAL POSITIONING SYSTEM WING (GPSW) SYSTEMS ENGINEERING & INTEGRATION, INTERFACE SPECIFICATION IS-GPS-200 Revision E. The format understood by this program is defined in Section 20 (Appendix II) of the IS-GPS-200E, GPS NAVIGATION DATA STRUCTURE FOR DATA, D(t) JSON is specified by RFC 7159, The JavaScript Object Notation (JSON) Data Interchange Format. The API for PPS time service is specified by RFC 2783, Pulse-Per-Second API for UNIX-like Operating Systems, Version 1.0 SEE ALSO gpsdctl8, gps1, libgps3, gpsd_json5, libgpsd3, gpsprof1, gpsfake1, gpsctl1, gpscat1, AUTHORS Authors: Eric S. Raymond, Chris Kuethe, Gary Miller. Former authors whose bits have been plowed under by code turnover: Remco Treffcorn, Derrick Brashear, Russ Nelson. This manual page by Eric S. Raymond esr@thyrsus.com. gpsd-3.15/gpsd_json.c0000664000175000017500000034567712520742615012731 0ustar esresr/**************************************************************************** NAME gpsd_json.c - move data between in-core and JSON structures DESCRIPTION These are functions (used only by the daemon) to dump the contents of various core data structures in JSON. PERMISSIONS Written by Eric S. Raymond, 2009 This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. ***************************************************************************/ #include #include #include #include #include #include "gpsd.h" #include "bits.h" #include "strfuncs.h" #ifdef SOCKET_EXPORT_ENABLE #include "gps_json.h" #include "timespec.h" #include "revision.h" /* *INDENT-OFF* */ #define JSON_BOOL(x) ((x)?"true":"false") /* * 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. */ /* the map of device class names */ struct classmap_t { char *name; int typemask; int packetmask; }; #define CLASSMAP_NITEMS 5 struct classmap_t classmap[CLASSMAP_NITEMS] = { /* name typemask packetmask */ {"ANY", 0, 0}, {"GPS", SEEN_GPS, GPS_TYPEMASK}, {"RTCM2", SEEN_RTCM2, PACKET_TYPEMASK(RTCM2_PACKET)}, {"RTCM3", SEEN_RTCM3, PACKET_TYPEMASK(RTCM3_PACKET)}, {"AIS", SEEN_AIS, PACKET_TYPEMASK(AIVDM_PACKET)}, }; /* *INDENT-ON* */ char *json_stringify( char *to, size_t len, const char *from) /* escape double quotes and control characters inside a JSON string */ { const char *sp; char *tp; tp = to; /* * The limit is len-6 here because we need to be leave room for * each character to generate an up to 6-character Java-style * escape */ for (sp = from; *sp != '\0' && ((tp - to) < ((int)len - 6)); sp++) { if (!isascii((unsigned char) *sp) || iscntrl((unsigned char) *sp)) { *tp++ = '\\'; switch (*sp) { case '\b': *tp++ = 'b'; break; case '\f': *tp++ = 'f'; break; case '\n': *tp++ = 'n'; break; case '\r': *tp++ = 'r'; break; case '\t': *tp++ = 't'; break; default: /* ugh, we'd prefer a C-style escape here, but this is JSON */ /* http://www.ietf.org/rfc/rfc4627.txt * section 2.5, escape is \uXXXX */ /* don't forget the NUL in the output count! */ (void)snprintf(tp, 6, "u%04x", 0x00ff & (unsigned int)*sp); tp += strlen(tp); } } else { if (*sp == '"' || *sp == '\\') *tp++ = '\\'; *tp++ = *sp; } } *tp = '\0'; return to; } void json_version_dump( 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, GPSD_PROTO_MAJOR_VERSION, GPSD_PROTO_MINOR_VERSION); } #ifdef TIMING_ENABLE #define CONDITIONALLY_UNUSED #else #define CONDITIONALLY_UNUSED UNUSED #endif /* TIMING_ENABLE */ void json_tpv_dump(const struct gps_device_t *session, const struct policy_t *policy CONDITIONALLY_UNUSED, char *reply, size_t replylen) { const struct gps_data_t *gpsdata = &session->gpsdata; assert(replylen > sizeof(char *)); (void)strlcpy(reply, "{\"class\":\"TPV\",", replylen); if (gpsdata->dev.path[0] != '\0') str_appendf(reply, replylen, "\"device\":\"%s\",", gpsdata->dev.path); str_appendf(reply, replylen, "\"mode\":%d,", gpsdata->fix.mode); if (isnan(gpsdata->fix.time) == 0) { char tbuf[JSON_DATE_MAX+1]; str_appendf(reply, replylen, "\"time\":\"%s\",", unix_to_iso8601(gpsdata->fix.time, tbuf, sizeof(tbuf))); } if (isnan(gpsdata->fix.ept) == 0) str_appendf(reply, replylen, "\"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 * volume of meaningless output, but the real reason to do it is * that we've observed that geodetic fix computation is unstable * in a way that tends to change low-order digits in invalid * fixes. Dumping these tends to cause cross-architecture failures * in the regression tests. This effect has been seen on SiRF-II * chips, which are quite common. */ if (gpsdata->fix.mode >= MODE_2D) { if (isnan(gpsdata->fix.latitude) == 0) str_appendf(reply, replylen, "\"lat\":%.9f,", gpsdata->fix.latitude); if (isnan(gpsdata->fix.longitude) == 0) str_appendf(reply, replylen, "\"lon\":%.9f,", gpsdata->fix.longitude); if (gpsdata->fix.mode >= MODE_3D && isnan(gpsdata->fix.altitude) == 0) str_appendf(reply, replylen, "\"alt\":%.3f,", gpsdata->fix.altitude); if (isnan(gpsdata->fix.epx) == 0) str_appendf(reply, replylen, "\"epx\":%.3f,", gpsdata->fix.epx); if (isnan(gpsdata->fix.epy) == 0) str_appendf(reply, replylen, "\"epy\":%.3f,", gpsdata->fix.epy); if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.epv) == 0) str_appendf(reply, replylen, "\"epv\":%.3f,", gpsdata->fix.epv); if (isnan(gpsdata->fix.track) == 0) str_appendf(reply, replylen, "\"track\":%.4f,", gpsdata->fix.track); if (isnan(gpsdata->fix.speed) == 0) str_appendf(reply, replylen, "\"speed\":%.3f,", gpsdata->fix.speed); if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.climb) == 0) str_appendf(reply, replylen, "\"climb\":%.3f,", gpsdata->fix.climb); if (isnan(gpsdata->fix.epd) == 0) str_appendf(reply, replylen, "\"epd\":%.4f,", gpsdata->fix.epd); if (isnan(gpsdata->fix.eps) == 0) str_appendf(reply, replylen, "\"eps\":%.2f,", gpsdata->fix.eps); if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.epc) == 0) str_appendf(reply, replylen, "\"epc\":%.2f,", gpsdata->fix.epc); #ifdef TIMING_ENABLE if (policy->timing) { char rtime_str[TIMESPEC_LEN]; struct timespec rtime_tmp; (int)clock_gettime(CLOCK_REALTIME, &rtime_tmp); timespec_str(&rtime_tmp, rtime_str, sizeof(rtime_str)); str_appendf(reply, replylen, "\"rtime\":%s,", rtime_str); #ifdef PPS_ENABLE if (session->pps_thread.ppsout_count) { char ts_str[TIMESPEC_LEN]; struct timedelta_t timedelta; /* ugh - de-consting this might get us in trouble someday */ pps_thread_ppsout(&((struct gps_device_t *)session)->pps_thread, &timedelta); timespec_str(&timedelta.clock, ts_str, sizeof(ts_str) ); str_appendf(reply, replylen, "\"pps\":%s,", ts_str); /* TODO: add PPS precision to JSON output */ } #endif /* PPS_ENABLE */ str_appendf(reply, replylen, "\"sor\":%.9f,\"chars\":%lu,\"sats\":%2d," "\"week\":%u,\"tow\":%.3f,\"rollovers\":%d", session->sor, session->chars, gpsdata->satellites_used, session->context->gps_week, session->context->gps_tow, session->context->rollovers); } #endif /* TIMING_ENABLE */ } str_rstrip_char(reply, ','); (void)strlcat(reply, "}\r\n", replylen); } void json_noise_dump(const struct gps_data_t *gpsdata, char *reply, size_t replylen) { char tbuf[JSON_DATE_MAX+1]; assert(replylen > sizeof(char *)); (void)strlcpy(reply, "{\"class\":\"GST\",", replylen); if (gpsdata->dev.path[0] != '\0') str_appendf(reply, replylen, "\"device\":\"%s\",", gpsdata->dev.path); str_appendf(reply, replylen, "\"time\":\"%s\",", unix_to_iso8601(gpsdata->gst.utctime, tbuf, sizeof(tbuf))); #define ADD_GST_FIELD(tag, field) do { \ if (isnan(gpsdata->gst.field) == 0) \ str_appendf(reply, replylen, "\"" tag "\":%.3f,", gpsdata->gst.field); \ } while(0) ADD_GST_FIELD("rms", rms_deviation); ADD_GST_FIELD("major", smajor_deviation); ADD_GST_FIELD("minor", sminor_deviation); ADD_GST_FIELD("orient", smajor_orientation); ADD_GST_FIELD("lat", lat_err_deviation); ADD_GST_FIELD("lon", lon_err_deviation); ADD_GST_FIELD("alt", alt_err_deviation); #undef ADD_GST_FIELD str_rstrip_char(reply, ','); (void)strlcat(reply, "}\r\n", replylen); } void json_sky_dump(const struct gps_data_t *datap, char *reply, size_t replylen) { int i, reported = 0; assert(replylen > sizeof(char *)); (void)strlcpy(reply, "{\"class\":\"SKY\",", replylen); if (datap->dev.path[0] != '\0') str_appendf(reply, replylen, "\"device\":\"%s\",", datap->dev.path); if (isnan(datap->skyview_time) == 0) { char tbuf[JSON_DATE_MAX+1]; str_appendf(reply, replylen, "\"time\":\"%s\",", unix_to_iso8601(datap->skyview_time, tbuf, sizeof(tbuf))); } if (isnan(datap->dop.xdop) == 0) str_appendf(reply, replylen, "\"xdop\":%.2f,", datap->dop.xdop); if (isnan(datap->dop.ydop) == 0) str_appendf(reply, replylen, "\"ydop\":%.2f,", datap->dop.ydop); if (isnan(datap->dop.vdop) == 0) str_appendf(reply, replylen, "\"vdop\":%.2f,", datap->dop.vdop); if (isnan(datap->dop.tdop) == 0) str_appendf(reply, replylen, "\"tdop\":%.2f,", datap->dop.tdop); if (isnan(datap->dop.hdop) == 0) str_appendf(reply, replylen, "\"hdop\":%.2f,", datap->dop.hdop); if (isnan(datap->dop.gdop) == 0) str_appendf(reply, replylen, "\"gdop\":%.2f,", datap->dop.gdop); if (isnan(datap->dop.pdop) == 0) str_appendf(reply, replylen, "\"pdop\":%.2f,", datap->dop.pdop); /* insurance against flaky drivers */ for (i = 0; i < datap->satellites_visible; i++) if (datap->skyview[i].PRN) reported++; if (reported) { (void)strlcat(reply, "\"satellites\":[", replylen); for (i = 0; i < reported; i++) { if (datap->skyview[i].PRN) { str_appendf(reply, replylen, "{\"PRN\":%d,\"el\":%d,\"az\":%d,\"ss\":%.0f,\"used\":%s},", datap->skyview[i].PRN, datap->skyview[i].elevation, datap->skyview[i].azimuth, datap->skyview[i].ss, datap->skyview[i].used ? "true" : "false"); } } str_rstrip_char(reply, ','); (void)strlcat(reply, "]", replylen); } str_rstrip_char(reply, ','); (void)strlcat(reply, "}\r\n", replylen); } void json_device_dump(const struct gps_device_t *device, char *reply, size_t replylen) { struct classmap_t *cmp; char buf1[JSON_VAL_MAX * 2 + 1]; (void)strlcpy(reply, "{\"class\":\"DEVICE\",\"path\":\"", replylen); (void)strlcat(reply, device->gpsdata.dev.path, replylen); (void)strlcat(reply, "\",", replylen); if (device->device_type != NULL) { (void)strlcat(reply, "\"driver\":\"", replylen); (void)strlcat(reply, device->device_type->type_name, replylen); (void)strlcat(reply, "\",", replylen); } if (device->subtype[0] != '\0') { (void)strlcat(reply, "\"subtype\":\"", replylen); (void)strlcat(reply, json_stringify(buf1, sizeof(buf1), device->subtype), replylen); (void)strlcat(reply, "\",", replylen); } /* * There's an assumption here: Anything that we type service_sensor is * a serial device with the usual control parameters. */ if (device->gpsdata.online > 0) { str_appendf(reply, replylen, "\"activated\":\"%s\",", unix_to_iso8601(device->gpsdata.online, buf1, sizeof(buf1))); if (device->observed != 0) { int mask = 0; for (cmp = classmap; cmp < classmap + NITEMS(classmap); cmp++) if ((device->observed & cmp->packetmask) != 0) mask |= cmp->typemask; if (mask != 0) str_appendf(reply, replylen, "\"flags\":%d,", mask); } if (device->servicetype == service_sensor) { /* speed can be 0 if the device is not currently active */ speed_t speed = gpsd_get_speed(device); if (speed != 0) str_appendf(reply, replylen, "\"native\":%d,\"bps\":%d,\"parity\":\"%c\",\"stopbits\":%u,\"cycle\":%2.2f,", device->gpsdata.dev.driver_mode, (int)speed, device->gpsdata.dev.parity, device->gpsdata.dev.stopbits, device->gpsdata.dev.cycle); #ifdef RECONFIGURE_ENABLE if (device->device_type != NULL && device->device_type->rate_switcher != NULL) str_appendf(reply, replylen, "\"mincycle\":%2.2f,", device->device_type->min_cycle); #endif /* RECONFIGURE_ENABLE */ } } str_rstrip_char(reply, ','); (void)strlcat(reply, "}\r\n", replylen); } void json_watch_dump(const struct policy_t *ccp, char *reply, size_t replylen) { (void)snprintf(reply, replylen, "{\"class\":\"WATCH\",\"enable\":%s,\"json\":%s,\"nmea\":%s,\"raw\":%d,\"scaled\":%s,\"timing\":%s,\"split24\":%s,\"pps\":%s,", ccp->watcher ? "true" : "false", ccp->json ? "true" : "false", ccp->nmea ? "true" : "false", ccp->raw, ccp->scaled ? "true" : "false", ccp->timing ? "true" : "false", ccp->split24 ? "true" : "false", ccp->pps ? "true" : "false"); if (ccp->devpath[0] != '\0') str_appendf(reply, replylen, "\"device\":\"%s\",", ccp->devpath); str_rstrip_char(reply, ','); (void)strlcat(reply, "}\r\n", replylen); } void json_subframe_dump(const struct gps_data_t *datap, char buf[], size_t buflen) { const struct subframe_t *subframe = &datap->subframe; const bool scaled = datap->policy.scaled; (void)snprintf(buf, buflen, "{\"class\":\"SUBFRAME\",\"device\":\"%s\"," "\"tSV\":%u,\"TOW17\":%u,\"frame\":%u,\"scaled\":%s", datap->dev.path, (unsigned int)subframe->tSVID, (unsigned int)subframe->TOW17, (unsigned int)subframe->subframe_num, JSON_BOOL(scaled)); if ( 1 == subframe->subframe_num ) { if (scaled) { str_appendf(buf, buflen, ",\"EPHEM1\":{\"WN\":%u,\"IODC\":%u,\"L2\":%u," "\"ura\":%u,\"hlth\":%u,\"L2P\":%u,\"Tgd\":%g," "\"toc\":%lu,\"af2\":%.4g,\"af1\":%.6e,\"af0\":%.7e}", (unsigned int)subframe->sub1.WN, (unsigned int)subframe->sub1.IODC, (unsigned int)subframe->sub1.l2, subframe->sub1.ura, subframe->sub1.hlth, (unsigned int)subframe->sub1.l2p, subframe->sub1.d_Tgd, (unsigned long)subframe->sub1.l_toc, subframe->sub1.d_af2, subframe->sub1.d_af1, subframe->sub1.d_af0); } else { str_appendf(buf, buflen, ",\"EPHEM1\":{\"WN\":%u,\"IODC\":%u,\"L2\":%u," "\"ura\":%u,\"hlth\":%u,\"L2P\":%u,\"Tgd\":%d," "\"toc\":%u,\"af2\":%ld,\"af1\":%d,\"af0\":%d}", (unsigned int)subframe->sub1.WN, (unsigned int)subframe->sub1.IODC, (unsigned int)subframe->sub1.l2, subframe->sub1.ura, subframe->sub1.hlth, (unsigned int)subframe->sub1.l2p, (int)subframe->sub1.Tgd, (unsigned int)subframe->sub1.toc, (long)subframe->sub1.af2, (int)subframe->sub1.af1, (int)subframe->sub1.af0); } } else if ( 2 == subframe->subframe_num ) { if (scaled) { str_appendf(buf, buflen, ",\"EPHEM2\":{\"IODE\":%u,\"Crs\":%.6e,\"deltan\":%.6e," "\"M0\":%.11e,\"Cuc\":%.6e,\"e\":%f,\"Cus\":%.6e," "\"sqrtA\":%.11g,\"toe\":%lu,\"FIT\":%u,\"AODO\":%u}", (unsigned int)subframe->sub2.IODE, subframe->sub2.d_Crs, subframe->sub2.d_deltan, subframe->sub2.d_M0, subframe->sub2.d_Cuc, subframe->sub2.d_eccentricity, subframe->sub2.d_Cus, subframe->sub2.d_sqrtA, (unsigned long)subframe->sub2.l_toe, (unsigned int)subframe->sub2.fit, (unsigned int)subframe->sub2.u_AODO); } else { str_appendf(buf, buflen, ",\"EPHEM2\":{\"IODE\":%u,\"Crs\":%d,\"deltan\":%d," "\"M0\":%ld,\"Cuc\":%d,\"e\":%ld,\"Cus\":%d," "\"sqrtA\":%lu,\"toe\":%lu,\"FIT\":%u,\"AODO\":%u}", (unsigned int)subframe->sub2.IODE, (int)subframe->sub2.Crs, (int)subframe->sub2.deltan, (long)subframe->sub2.M0, (int)subframe->sub2.Cuc, (long)subframe->sub2.e, (int)subframe->sub2.Cus, (unsigned long)subframe->sub2.sqrtA, (unsigned long)subframe->sub2.toe, (unsigned int)subframe->sub2.fit, (unsigned int)subframe->sub2.AODO); } } else if ( 3 == subframe->subframe_num ) { if (scaled) { str_appendf(buf, buflen, ",\"EPHEM3\":{\"IODE\":%3u,\"IDOT\":%.6g,\"Cic\":%.6e," "\"Omega0\":%.11e,\"Cis\":%.7g,\"i0\":%.11e,\"Crc\":%.7g," "\"omega\":%.11e,\"Omegad\":%.6e}", (unsigned int)subframe->sub3.IODE, subframe->sub3.d_IDOT, subframe->sub3.d_Cic, subframe->sub3.d_Omega0, subframe->sub3.d_Cis, subframe->sub3.d_i0, subframe->sub3.d_Crc, subframe->sub3.d_omega, subframe->sub3.d_Omegad ); } else { str_appendf(buf, buflen, ",\"EPHEM3\":{\"IODE\":%u,\"IDOT\":%u,\"Cic\":%u," "\"Omega0\":%ld,\"Cis\":%d,\"i0\":%ld,\"Crc\":%d," "\"omega\":%ld,\"Omegad\":%ld}", (unsigned int)subframe->sub3.IODE, (unsigned int)subframe->sub3.IDOT, (unsigned int)subframe->sub3.Cic, (long int)subframe->sub3.Omega0, (int)subframe->sub3.Cis, (long int)subframe->sub3.i0, (int)subframe->sub3.Crc, (long int)subframe->sub3.omega, (long int)subframe->sub3.Omegad ); } } else if ( subframe->is_almanac ) { if (scaled) { str_appendf(buf, buflen, ",\"ALMANAC\":{\"ID\":%d,\"Health\":%u," "\"e\":%g,\"toa\":%lu," "\"deltai\":%.10e,\"Omegad\":%.5e,\"sqrtA\":%.10g," "\"Omega0\":%.10e,\"omega\":%.10e,\"M0\":%.11e," "\"af0\":%.5e,\"af1\":%.5e}", (int)subframe->sub5.almanac.sv, (unsigned int)subframe->sub5.almanac.svh, subframe->sub5.almanac.d_eccentricity, (unsigned long)subframe->sub5.almanac.l_toa, subframe->sub5.almanac.d_deltai, subframe->sub5.almanac.d_Omegad, subframe->sub5.almanac.d_sqrtA, subframe->sub5.almanac.d_Omega0, subframe->sub5.almanac.d_omega, subframe->sub5.almanac.d_M0, subframe->sub5.almanac.d_af0, subframe->sub5.almanac.d_af1); } else { str_appendf(buf, buflen, ",\"ALMANAC\":{\"ID\":%d,\"Health\":%u," "\"e\":%u,\"toa\":%u," "\"deltai\":%d,\"Omegad\":%d,\"sqrtA\":%lu," "\"Omega0\":%ld,\"omega\":%ld,\"M0\":%ld," "\"af0\":%d,\"af1\":%d}", (int)subframe->sub5.almanac.sv, (unsigned int)subframe->sub5.almanac.svh, (unsigned int)subframe->sub5.almanac.e, (unsigned int)subframe->sub5.almanac.toa, (int)subframe->sub5.almanac.deltai, (int)subframe->sub5.almanac.Omegad, (unsigned long)subframe->sub5.almanac.sqrtA, (long)subframe->sub5.almanac.Omega0, (long)subframe->sub5.almanac.omega, (long)subframe->sub5.almanac.M0, (int)subframe->sub5.almanac.af0, (int)subframe->sub5.almanac.af1); } } else if ( 4 == subframe->subframe_num ) { str_appendf(buf, buflen, ",\"pageid\":%u", (unsigned int)subframe->pageid); switch (subframe->pageid ) { case 13: case 52: { int i; /* decoding of ERD to SV is non trivial and not done yet */ str_appendf(buf, buflen, ",\"ERD\":{\"ai\":%u,", subframe->sub4_13.ai); /* 1-index loop to construct json, rather than giant snprintf */ for(i = 1 ; i <= 30; i++){ str_appendf(buf, buflen, "\"ERD%d\":%d,", i, subframe->sub4_13.ERD[i]); } str_rstrip_char(buf, ','); str_appendf(buf, buflen, "}"); break; } case 55: /* JSON is UTF-8. double quote, backslash and * control charactores (U+0000 through U+001F).must be * escaped. */ /* system message can be 24 bytes, JSON can escape all * chars so up to 24*6 long. */ { char buf1[25 * 6]; (void)json_stringify(buf1, sizeof(buf1), subframe->sub4_17.str); str_appendf(buf, buflen, ",\"system_message\":\"%.144s\"", buf1); } break; case 56: if (scaled) { str_appendf(buf, buflen, ",\"IONO\":{\"a0\":%.5g,\"a1\":%.5g,\"a2\":%.5g," "\"a3\":%.5g,\"b0\":%.5g,\"b1\":%.5g,\"b2\":%.5g," "\"b3\":%.5g,\"A1\":%.11e,\"A0\":%.11e,\"tot\":%.5g," "\"WNt\":%u,\"ls\":%d,\"WNlsf\":%u,\"DN\":%u," "\"lsf\":%d}", subframe->sub4_18.d_alpha0, subframe->sub4_18.d_alpha1, subframe->sub4_18.d_alpha2, subframe->sub4_18.d_alpha3, subframe->sub4_18.d_beta0, subframe->sub4_18.d_beta1, subframe->sub4_18.d_beta2, subframe->sub4_18.d_beta3, subframe->sub4_18.d_A1, subframe->sub4_18.d_A0, subframe->sub4_18.d_tot, (unsigned int)subframe->sub4_18.WNt, (int)subframe->sub4_18.leap, (unsigned int)subframe->sub4_18.WNlsf, (unsigned int)subframe->sub4_18.DN, (int)subframe->sub4_18.lsf); } else { str_appendf(buf, buflen, ",\"IONO\":{\"a0\":%d,\"a1\":%d,\"a2\":%d,\"a3\":%d," "\"b0\":%d,\"b1\":%d,\"b2\":%d,\"b3\":%d," "\"A1\":%ld,\"A0\":%ld,\"tot\":%u,\"WNt\":%u," "\"ls\":%d,\"WNlsf\":%u,\"DN\":%u,\"lsf\":%d}", (int)subframe->sub4_18.alpha0, (int)subframe->sub4_18.alpha1, (int)subframe->sub4_18.alpha2, (int)subframe->sub4_18.alpha3, (int)subframe->sub4_18.beta0, (int)subframe->sub4_18.beta1, (int)subframe->sub4_18.beta2, (int)subframe->sub4_18.beta3, (long)subframe->sub4_18.A1, (long)subframe->sub4_18.A0, (unsigned int)subframe->sub4_18.tot, (unsigned int)subframe->sub4_18.WNt, (int)subframe->sub4_18.leap, (unsigned int)subframe->sub4_18.WNlsf, (unsigned int)subframe->sub4_18.DN, (int)subframe->sub4_18.lsf); } break; case 25: case 63: { int i; str_appendf(buf, buflen, ",\"HEALTH\":{\"data_id\":%d,", (int)subframe->data_id); /* 1-index loop to construct json, rather than giant snprintf */ for(i = 1 ; i <= 32; i++){ str_appendf(buf, buflen, "\"SV%d\":%d,", i, (int)subframe->sub4_25.svf[i]); } for(i = 0 ; i < 8; i++){ /* 0-index */ str_appendf(buf, buflen, "\"SVH%d\":%d,", i+25, (int)subframe->sub4_25.svhx[i]); } str_rstrip_char(buf, ','); str_appendf(buf, buflen, "}"); break; } } } else if ( 5 == subframe->subframe_num ) { str_appendf(buf, buflen, ",\"pageid\":%u", (unsigned int)subframe->pageid); if ( 51 == subframe->pageid ) { int i; /* subframe5, page 25 */ str_appendf(buf, buflen, ",\"HEALTH2\":{\"toa\":%lu,\"WNa\":%u,", (unsigned long)subframe->sub5_25.l_toa, (unsigned int)subframe->sub5_25.WNa); /* 1-index loop to construct json */ for(i = 1 ; i <= 24; i++){ str_appendf(buf, buflen, "\"SV%d\":%d,", i, (int)subframe->sub5_25.sv[i]); } str_rstrip_char(buf, ','); str_appendf(buf, buflen, "}"); } } (void)strlcat(buf, "}\r\n", buflen); } #if defined(RTCM104V2_ENABLE) void json_rtcm2_dump(const struct rtcm2_t *rtcm, const char *device, char buf[], size_t buflen) /* dump the contents of a parsed RTCM104 message as JSON */ { char buf1[JSON_VAL_MAX * 2 + 1]; unsigned int n; (void)snprintf(buf, buflen, "{\"class\":\"RTCM2\","); if (device != NULL && device[0] != '\0') str_appendf(buf, buflen, "\"device\":\"%s\",", device); str_appendf(buf, buflen, "\"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: case 9: (void)strlcat(buf, "\"satellites\":[", buflen); for (n = 0; n < rtcm->gps_ranges.nentries; n++) { const struct gps_rangesat_t *rsp = &rtcm->gps_ranges.sat[n]; str_appendf(buf, buflen, "{\"ident\":%u,\"udre\":%u,\"iod\":%u,\"prc\":%0.3f,\"rrc\":%0.3f},", rsp->ident, rsp->udre, rsp->iod, rsp->prc, rsp->rrc); } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 3: if (rtcm->ecef.valid) str_appendf(buf, buflen, "\"x\":%.2f,\"y\":%.2f,\"z\":%.2f,", rtcm->ecef.x, rtcm->ecef.y, rtcm->ecef.z); break; case 4: if (rtcm->reference.valid) { /* * 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" }; str_appendf(buf, buflen, "\"system\":\"%s\",\"sense\":%1d,\"datum\":\"%s\",\"dx\":%.1f,\"dy\":%.1f,\"dz\":%.1f,", 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); } break; case 5: (void)strlcat(buf, "\"satellites\":[", buflen); for (n = 0; n < rtcm->conhealth.nentries; n++) { const struct consat_t *csp = &rtcm->conhealth.sat[n]; str_appendf(buf, buflen, "{\"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); } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 6: /* NOP msg */ break; case 7: (void)strlcat(buf, "\"satellites\":[", buflen); for (n = 0; n < rtcm->almanac.nentries; n++) { const struct station_t *ssp = &rtcm->almanac.station[n]; str_appendf(buf, buflen, "{\"lat\":%.4f,\"lon\":%.4f,\"range\":%u,\"frequency\":%.1f,\"health\":%u,\"station_id\":%u,\"bitrate\":%u},", ssp->latitude, ssp->longitude, ssp->range, ssp->frequency, ssp->health, ssp->station_id, ssp->bitrate); } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 13: str_appendf(buf, buflen, "\"status\":%s,\"rangeflag\":%s," "\"lat\":%.2f,\"lon\":%.2f,\"range\":%u,", JSON_BOOL(rtcm->xmitter.status), JSON_BOOL(rtcm->xmitter.rangeflag), rtcm->xmitter.lat, rtcm->xmitter.lon, rtcm->xmitter.range); break; case 14: str_appendf(buf, buflen, "\"week\":%u,\"hour\":%u,\"leapsecs\":%u,", rtcm->gpstime.week, rtcm->gpstime.hour, rtcm->gpstime.leapsecs); break; case 16: str_appendf(buf, buflen, "\"message\":\"%s\"", json_stringify(buf1, sizeof(buf1), rtcm->message)); break; case 31: (void)strlcat(buf, "\"satellites\":[", buflen); for (n = 0; n < rtcm->glonass_ranges.nentries; n++) { const struct glonass_rangesat_t *rsp = &rtcm->glonass_ranges.sat[n]; str_appendf(buf, buflen, "{\"ident\":%u,\"udre\":%u,\"change\":%s,\"tod\":%u,\"prc\":%0.3f,\"rrc\":%0.3f},", rsp->ident, rsp->udre, JSON_BOOL(rsp->change), rsp->tod, rsp->prc, rsp->rrc); } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; default: (void)strlcat(buf, "\"data\":[", buflen); for (n = 0; n < rtcm->length; n++) str_appendf(buf, buflen, "\"0x%08x\",", rtcm->words[n]); str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; } str_rstrip_char(buf, ','); (void)strlcat(buf, "}\r\n", buflen); } #endif /* defined(RTCM104V2_ENABLE) */ #if defined(RTCM104V3_ENABLE) void json_rtcm3_dump(const struct rtcm3_t *rtcm, const char *device, char buf[], size_t buflen) /* dump the contents of a parsed RTCM104v3 message as JSON */ { char buf1[JSON_VAL_MAX * 2 + 1]; unsigned short i; unsigned int n; (void)snprintf(buf, buflen, "{\"class\":\"RTCM3\","); if (device != NULL && device[0] != '\0') str_appendf(buf, buflen, "\"device\":\"%s\",", device); str_appendf(buf, buflen, "\"type\":%u,", rtcm->type); str_appendf(buf, buflen, "\"length\":%u,", rtcm->length); #define CODE(x) (unsigned int)(x) #define INT(x) (unsigned int)(x) switch (rtcm->type) { case 1001: str_appendf(buf, buflen, "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\"," "\"smoothing\":\"%s\",\"interval\":\"%u\",", rtcm->rtcmtypes.rtcm3_1001.header.station_id, (int)rtcm->rtcmtypes.rtcm3_1001.header.tow, JSON_BOOL(rtcm->rtcmtypes.rtcm3_1001.header.sync), JSON_BOOL(rtcm->rtcmtypes.rtcm3_1001.header.smoothing), rtcm->rtcmtypes.rtcm3_1001.header.interval); (void)strlcat(buf, "\"satellites\":[", buflen); for (i = 0; i < rtcm->rtcmtypes.rtcm3_1001.header.satcount; i++) { #define R1001 rtcm->rtcmtypes.rtcm3_1001.rtk_data[i] str_appendf(buf, buflen, "{\"ident\":%u,\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u},", R1001.ident, CODE(R1001.L1.indicator), R1001.L1.pseudorange, R1001.L1.rangediff, INT(R1001.L1.locktime)); #undef R1001 } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 1002: str_appendf(buf, buflen, "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\"," "\"smoothing\":\"%s\",\"interval\":\"%u\",", rtcm->rtcmtypes.rtcm3_1002.header.station_id, (int)rtcm->rtcmtypes.rtcm3_1002.header.tow, JSON_BOOL(rtcm->rtcmtypes.rtcm3_1002.header.sync), JSON_BOOL(rtcm->rtcmtypes.rtcm3_1002.header.smoothing), rtcm->rtcmtypes.rtcm3_1002.header.interval); (void)strlcat(buf, "\"satellites\":[", buflen); for (i = 0; i < rtcm->rtcmtypes.rtcm3_1002.header.satcount; i++) { #define R1002 rtcm->rtcmtypes.rtcm3_1002.rtk_data[i] str_appendf(buf, buflen, "{\"ident\":%u,\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u,\"amb\":%u," "\"CNR\":%.2f},", R1002.ident, CODE(R1002.L1.indicator), R1002.L1.pseudorange, R1002.L1.rangediff, INT(R1002.L1.locktime), INT(R1002.L1.ambiguity), R1002.L1.CNR); #undef R1002 } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 1003: str_appendf(buf, buflen, "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\"," "\"smoothing\":\"%s\",\"interval\":\"%u\",", rtcm->rtcmtypes.rtcm3_1003.header.station_id, (int)rtcm->rtcmtypes.rtcm3_1003.header.tow, JSON_BOOL(rtcm->rtcmtypes.rtcm3_1003.header.sync), JSON_BOOL(rtcm->rtcmtypes.rtcm3_1003.header.smoothing), rtcm->rtcmtypes.rtcm3_1003.header.interval); (void)strlcat(buf, "\"satellites\":[", buflen); for (i = 0; i < rtcm->rtcmtypes.rtcm3_1003.header.satcount; i++) { #define R1003 rtcm->rtcmtypes.rtcm3_1003.rtk_data[i] str_appendf(buf, buflen, "{\"ident\":%u," "\"L1\":{\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u}," "\"L2\":{\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u}," "},", R1003.ident, CODE(R1003.L1.indicator), R1003.L1.pseudorange, R1003.L1.rangediff, INT(R1003.L1.locktime), CODE(R1003.L2.indicator), R1003.L2.pseudorange, R1003.L2.rangediff, INT(R1003.L2.locktime)); #undef R1003 } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 1004: str_appendf(buf, buflen, "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\"," "\"smoothing\":\"%s\",\"interval\":\"%u\",", rtcm->rtcmtypes.rtcm3_1004.header.station_id, (int)rtcm->rtcmtypes.rtcm3_1004.header.tow, JSON_BOOL(rtcm->rtcmtypes.rtcm3_1004.header.sync), JSON_BOOL(rtcm->rtcmtypes.rtcm3_1004.header.smoothing), rtcm->rtcmtypes.rtcm3_1004.header.interval); (void)strlcat(buf, "\"satellites\":[", buflen); for (i = 0; i < rtcm->rtcmtypes.rtcm3_1004.header.satcount; i++) { #define R1004 rtcm->rtcmtypes.rtcm3_1004.rtk_data[i] str_appendf(buf, buflen, "{\"ident\":%u," "\"L1\":{\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u," "\"amb\":%u,\"CNR\":%.2f}" "\"L2\":{\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u," "\"CNR\":%.2f}" "},", R1004.ident, CODE(R1004.L1.indicator), R1004.L1.pseudorange, R1004.L1.rangediff, INT(R1004.L1.locktime), INT(R1004.L1.ambiguity), R1004.L1.CNR, CODE(R1004.L2.indicator), R1004.L2.pseudorange, R1004.L2.rangediff, INT(R1004.L2.locktime), R1004.L2.CNR); #undef R1004 } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 1005: str_appendf(buf, buflen, "\"station_id\":%u,\"system\":[", rtcm->rtcmtypes.rtcm3_1005.station_id); if ((rtcm->rtcmtypes.rtcm3_1005.system & 0x04)!=0) (void)strlcat(buf, "\"GPS\",", buflen); if ((rtcm->rtcmtypes.rtcm3_1005.system & 0x02)!=0) (void)strlcat(buf, "\"GLONASS\",", buflen); if ((rtcm->rtcmtypes.rtcm3_1005.system & 0x01)!=0) (void)strlcat(buf, "\"GALILEO\",", buflen); str_rstrip_char(buf, ','); str_appendf(buf, buflen, "],\"refstation\":%s,\"sro\":%s," "\"x\":%.4f,\"y\":%.4f,\"z\":%.4f,", JSON_BOOL(rtcm->rtcmtypes.rtcm3_1005.reference_station), JSON_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: str_appendf(buf, buflen, "\"station_id\":%u,\"system\":[", rtcm->rtcmtypes.rtcm3_1006.station_id); if ((rtcm->rtcmtypes.rtcm3_1006.system & 0x04)!=0) (void)strlcat(buf, "\"GPS\",", buflen); if ((rtcm->rtcmtypes.rtcm3_1006.system & 0x02)!=0) (void)strlcat(buf, "\"GLONASS\",", buflen); if ((rtcm->rtcmtypes.rtcm3_1006.system & 0x01)!=0) (void)strlcat(buf, "\"GALILEO\",", buflen); str_rstrip_char(buf, ','); str_appendf(buf, buflen, "],\"refstation\":%s,\"sro\":%s," "\"x\":%.4f,\"y\":%.4f,\"z\":%.4f,", JSON_BOOL(rtcm->rtcmtypes.rtcm3_1006.reference_station), JSON_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); str_appendf(buf, buflen, "\"h\":%.4f,", rtcm->rtcmtypes.rtcm3_1006.height); break; case 1007: str_appendf(buf, buflen, "\"station_id\":%u,\"desc\":\"%s\",\"setup_id\":%u", rtcm->rtcmtypes.rtcm3_1007.station_id, rtcm->rtcmtypes.rtcm3_1007.descriptor, rtcm->rtcmtypes.rtcm3_1007.setup_id); break; case 1008: str_appendf(buf, buflen, "\"station_id\":%u,\"desc\":\"%s\"," "\"setup_id\":%u,\"serial\":\"%s\"", 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: str_appendf(buf, buflen, "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\"," "\"smoothing\":\"%s\",\"interval\":\"%u\"," "\"satcount\":\"%u\",", rtcm->rtcmtypes.rtcm3_1009.header.station_id, (int)rtcm->rtcmtypes.rtcm3_1009.header.tow, JSON_BOOL(rtcm->rtcmtypes.rtcm3_1009.header.sync), JSON_BOOL(rtcm->rtcmtypes.rtcm3_1009.header.smoothing), rtcm->rtcmtypes.rtcm3_1009.header.interval, rtcm->rtcmtypes.rtcm3_1009.header.satcount); (void)strlcat(buf, "\"satellites\":[", buflen); for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) { #define R1009 rtcm->rtcmtypes.rtcm3_1009.rtk_data[i] str_appendf(buf, buflen, "{\"ident\":%u,\"ind\":%u,\"channel\":%u," "\"prange\":%8.2f,\"delta\":%6.4f,\"lockt\":%u},", R1009.ident, CODE(R1009.L1.indicator), R1009.L1.channel, R1009.L1.pseudorange, R1009.L1.rangediff, INT(R1009.L1.locktime)); #undef R1009 } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 1010: str_appendf(buf, buflen, "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\"," "\"smoothing\":\"%s\",\"interval\":\"%u\",", rtcm->rtcmtypes.rtcm3_1010.header.station_id, (int)rtcm->rtcmtypes.rtcm3_1010.header.tow, JSON_BOOL(rtcm->rtcmtypes.rtcm3_1010.header.sync), JSON_BOOL(rtcm->rtcmtypes.rtcm3_1010.header.smoothing), rtcm->rtcmtypes.rtcm3_1010.header.interval); (void)strlcat(buf, "\"satellites\":[", buflen); for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) { #define R1010 rtcm->rtcmtypes.rtcm3_1010.rtk_data[i] str_appendf(buf, buflen, "{\"ident\":%u,\"ind\":%u,\"channel\":%u," "\"prange\":%8.2f,\"delta\":%6.4f,\"lockt\":%u," "\"amb\":%u,\"CNR\":%.2f},", R1010.ident, CODE(R1010.L1.indicator), R1010.L1.channel, R1010.L1.pseudorange, R1010.L1.rangediff, INT(R1010.L1.locktime), INT(R1010.L1.ambiguity), R1010.L1.CNR); #undef R1010 } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 1011: str_appendf(buf, buflen, "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\"," "\"smoothing\":\"%s\",\"interval\":\"%u\",", rtcm->rtcmtypes.rtcm3_1011.header.station_id, (int)rtcm->rtcmtypes.rtcm3_1011.header.tow, JSON_BOOL(rtcm->rtcmtypes.rtcm3_1011.header.sync), JSON_BOOL(rtcm->rtcmtypes.rtcm3_1011.header.smoothing), rtcm->rtcmtypes.rtcm3_1011.header.interval); (void)strlcat(buf, "\"satellites\":[", buflen); for (i = 0; i < rtcm->rtcmtypes.rtcm3_1011.header.satcount; i++) { #define R1011 rtcm->rtcmtypes.rtcm3_1011.rtk_data[i] str_appendf(buf, buflen, "{\"ident\":%u,\"channel\":%u," "\"L1\":{\"ind\":%u," "\"prange\":%8.2f,\"delta\":%6.4f,\"lockt\":%u}," "\"L2:{\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u}" "}", R1011.ident,R1011.L1.channel, CODE(R1011.L1.indicator), R1011.L1.pseudorange, R1011.L1.rangediff, INT(R1011.L1.locktime), CODE(R1011.L2.indicator), R1011.L2.pseudorange, R1011.L2.rangediff, INT(R1011.L2.locktime)); #undef R1011 } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 1012: str_appendf(buf, buflen, "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\"," "\"smoothing\":\"%s\",\"interval\":\"%u\",", rtcm->rtcmtypes.rtcm3_1012.header.station_id, (int)rtcm->rtcmtypes.rtcm3_1012.header.tow, JSON_BOOL(rtcm->rtcmtypes.rtcm3_1012.header.sync), JSON_BOOL(rtcm->rtcmtypes.rtcm3_1012.header.smoothing), rtcm->rtcmtypes.rtcm3_1012.header.interval); (void)strlcat(buf, "\"satellites\":[", buflen); for (i = 0; i < rtcm->rtcmtypes.rtcm3_1012.header.satcount; i++) { #define R1012 rtcm->rtcmtypes.rtcm3_1012.rtk_data[i] str_appendf(buf, buflen, "{\"ident\":%u,\"channel\":%u," "\"L1\":{\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u,\"amb\":%u," "\"CNR\":%.2f}," "\"L2\":{\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u," "\"CNR\":%.2f}," "},", R1012.ident, R1012.L1.channel, CODE(R1012.L1.indicator), R1012.L1.pseudorange, R1012.L1.rangediff, INT(R1012.L1.locktime), INT(R1012.L1.ambiguity), R1012.L1.CNR, CODE(R1012.L2.indicator), R1012.L2.pseudorange, R1012.L2.rangediff, INT(R1012.L2.locktime), R1012.L2.CNR); #undef R1012 } str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; case 1013: str_appendf(buf, buflen, "\"station_id\":%u,\"mjd\":%u,\"sec\":%u," "\"leapsecs\":%u,", rtcm->rtcmtypes.rtcm3_1013.station_id, rtcm->rtcmtypes.rtcm3_1013.mjd, rtcm->rtcmtypes.rtcm3_1013.sod, INT(rtcm->rtcmtypes.rtcm3_1013.leapsecs)); for (i = 0; i < (unsigned short)rtcm->rtcmtypes.rtcm3_1013.ncount; i++) str_appendf(buf, buflen, "{\"id\":%u,\"sync\":\"%s\",\"interval\":%u}", rtcm->rtcmtypes.rtcm3_1013.announcements[i].id, JSON_BOOL(rtcm->rtcmtypes.rtcm3_1013. announcements[i].sync), rtcm->rtcmtypes.rtcm3_1013. announcements[i].interval); break; case 1014: str_appendf(buf, buflen, "\"netid\":%u,\"subnetid\":%u,\"statcount\":%u" "\"master\":%u,\"aux\":%u,\"lat\":%f,\"lon\":%f,\"alt\":%f,", rtcm->rtcmtypes.rtcm3_1014.network_id, rtcm->rtcmtypes.rtcm3_1014.subnetwork_id, 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 1016: break; case 1017: break; case 1018: break; case 1019: break; case 1020: break; case 1029: str_appendf(buf, buflen, "\"station_id\":%u,\"mjd\":%u,\"sec\":%u," "\"len\":%zd,\"units\":%zd,\"msg\":\"%s\",", rtcm->rtcmtypes.rtcm3_1029.station_id, rtcm->rtcmtypes.rtcm3_1029.mjd, rtcm->rtcmtypes.rtcm3_1029.sod, rtcm->rtcmtypes.rtcm3_1029.len, rtcm->rtcmtypes.rtcm3_1029.unicode_units, json_stringify(buf1, sizeof(buf1), (char *)rtcm->rtcmtypes.rtcm3_1029.text)); break; case 1033: str_appendf(buf, buflen, "\"station_id\":%u,\"desc\":\"%s\"," "\"setup_id\":%u,\"serial\":\"%s\"," "\"receiver\":%s,\"firmware\":\"%s\"", rtcm->rtcmtypes.rtcm3_1033.station_id, rtcm->rtcmtypes.rtcm3_1033.descriptor, INT(rtcm->rtcmtypes.rtcm3_1033.setup_id), rtcm->rtcmtypes.rtcm3_1033.serial, rtcm->rtcmtypes.rtcm3_1033.receiver, rtcm->rtcmtypes.rtcm3_1033.firmware); break; default: (void)strlcat(buf, "\"data\":[", buflen); for (n = 0; n < rtcm->length; n++) str_appendf(buf, buflen, "\"0x%02x\",",(unsigned int)rtcm->rtcmtypes.data[n]); str_rstrip_char(buf, ','); (void)strlcat(buf, "]", buflen); break; } str_rstrip_char(buf, ','); (void)strlcat(buf, "}\r\n", buflen); #undef CODE #undef INT } #endif /* defined(RTCM104V3_ENABLE) */ #if defined(AIVDM_ENABLE) void json_aivdm_dump(const struct ais_t *ais, const char *device, bool scaled, 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 scratchbuf[MAX_PACKET_LENGTH*2+1]; int i; static char *nav_legends[] = { "Under way using engine", "At anchor", "Not under command", "Restricted manoeuverability", "Constrained by her draught", "Moored", "Aground", "Engaged in fishing", "Under way sailing", "Reserved for HSC", "Reserved for WIG", "Reserved", "Reserved", "Reserved", "Reserved", "Not defined", }; static char *epfd_legends[] = { "Undefined", "GPS", "GLONASS", "Combined GPS/GLONASS", "Loran-C", "Chayka", "Integrated navigation system", "Surveyed", "Galileo", }; #define EPFD_DISPLAY(n) (((n) < (unsigned int)NITEMS(epfd_legends)) ? epfd_legends[n] : "INVALID EPFD") static char *ship_type_legends[100] = { "Not available", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Wing in ground (WIG) - all ships of this type", "Wing in ground (WIG) - Hazardous category A", "Wing in ground (WIG) - Hazardous category B", "Wing in ground (WIG) - Hazardous category C", "Wing in ground (WIG) - Hazardous category D", "Wing in ground (WIG) - Reserved for future use", "Wing in ground (WIG) - Reserved for future use", "Wing in ground (WIG) - Reserved for future use", "Wing in ground (WIG) - Reserved for future use", "Wing in ground (WIG) - Reserved for future use", "Fishing", "Towing", "Towing: length exceeds 200m or breadth exceeds 25m", "Dredging or underwater ops", "Diving ops", "Military ops", "Sailing", "Pleasure Craft", "Reserved", "Reserved", "High speed craft (HSC) - all ships of this type", "High speed craft (HSC) - Hazardous category A", "High speed craft (HSC) - Hazardous category B", "High speed craft (HSC) - Hazardous category C", "High speed craft (HSC) - Hazardous category D", "High speed craft (HSC) - Reserved for future use", "High speed craft (HSC) - Reserved for future use", "High speed craft (HSC) - Reserved for future use", "High speed craft (HSC) - Reserved for future use", "High speed craft (HSC) - No additional information", "Pilot Vessel", "Search and Rescue vessel", "Tug", "Port Tender", "Anti-pollution equipment", "Law Enforcement", "Spare - Local Vessel", "Spare - Local Vessel", "Medical Transport", "Ship according to RR Resolution No. 18", "Passenger - all ships of this type", "Passenger - Hazardous category A", "Passenger - Hazardous category B", "Passenger - Hazardous category C", "Passenger - Hazardous category D", "Passenger - Reserved for future use", "Passenger - Reserved for future use", "Passenger - Reserved for future use", "Passenger - Reserved for future use", "Passenger - No additional information", "Cargo - all ships of this type", "Cargo - Hazardous category A", "Cargo - Hazardous category B", "Cargo - Hazardous category C", "Cargo - Hazardous category D", "Cargo - Reserved for future use", "Cargo - Reserved for future use", "Cargo - Reserved for future use", "Cargo - Reserved for future use", "Cargo - No additional information", "Tanker - all ships of this type", "Tanker - Hazardous category A", "Tanker - Hazardous category B", "Tanker - Hazardous category C", "Tanker - Hazardous category D", "Tanker - Reserved for future use", "Tanker - Reserved for future use", "Tanker - Reserved for future use", "Tanker - Reserved for future use", "Tanker - No additional information", "Other Type - all ships of this type", "Other Type - Hazardous category A", "Other Type - Hazardous category B", "Other Type - Hazardous category C", "Other Type - Hazardous category D", "Other Type - Reserved for future use", "Other Type - Reserved for future use", "Other Type - Reserved for future use", "Other Type - Reserved for future use", "Other Type - no additional information", }; #define SHIPTYPE_DISPLAY(n) (((n) < (unsigned int)NITEMS(ship_type_legends)) ? ship_type_legends[n] : "INVALID SHIP TYPE") static const char *station_type_legends[] = { "All types of mobiles", "Reserved for future use", "All types of Class B mobile stations", "SAR airborne mobile station", "Aid to Navigation station", "Class B shipborne mobile station", "Regional use and inland waterways", "Regional use and inland waterways", "Regional use and inland waterways", "Regional use and inland waterways", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", "Reserved for future use", }; #define STATIONTYPE_DISPLAY(n) (((n) < (unsigned int)NITEMS(station_type_legends)) ? station_type_legends[n] : "INVALID STATION TYPE") static const char *navaid_type_legends[] = { "Unspecified", "Reference point", "RACON", "Fixed offshore structure", "Spare, Reserved for future use.", "Light, without sectors", "Light, with sectors", "Leading Light Front", "Leading Light Rear", "Beacon, Cardinal N", "Beacon, Cardinal E", "Beacon, Cardinal S", "Beacon, Cardinal W", "Beacon, Port hand", "Beacon, Starboard hand", "Beacon, Preferred Channel port hand", "Beacon, Preferred Channel starboard hand", "Beacon, Isolated danger", "Beacon, Safe water", "Beacon, Special mark", "Cardinal Mark N", "Cardinal Mark E", "Cardinal Mark S", "Cardinal Mark W", "Port hand Mark", "Starboard hand Mark", "Preferred Channel Port hand", "Preferred Channel Starboard hand", "Isolated danger", "Safe Water", "Special Mark", "Light Vessel / LANBY / Rigs", }; #define NAVAIDTYPE_DISPLAY(n) (((n) < (unsigned int)NITEMS(navaid_type_legends)) ? navaid_type_legends[n] : "INVALID NAVAID TYPE") // cppcheck-suppress variableScope static const char *signal_legends[] = { "N/A", "Serious emergency – stop or divert according to instructions.", "Vessels shall not proceed.", "Vessels may proceed. One way traffic.", "Vessels may proceed. Two way traffic.", "Vessels shall proceed on specific orders only.", "Vessels in main channel shall not proceed." "Vessels in main channel shall proceed on specific orders only.", "Vessels in main channel shall proceed on specific orders only.", "I = \"in-bound\" only acceptable.", "O = \"out-bound\" only acceptable.", "F = both \"in- and out-bound\" acceptable.", "XI = Code will shift to \"I\" in due time.", "XO = Code will shift to \"O\" in due time.", "X = Vessels shall proceed only on direction.", }; #define SIGNAL_DISPLAY(n) (((n) < (unsigned int)NITEMS(signal_legends)) ? signal_legends[n] : "INVALID SIGNAL TYPE") static const char *route_type[32] = { "Undefined (default)", "Mandatory", "Recommended", "Alternative", "Recommended route through ice", "Ship route plan", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Reserved for future use.", "Cancel route identified by message linkage", }; // cppcheck-suppress variableScope static const char *idtypes[] = { "mmsi", "imo", "callsign", "other", }; // cppcheck-suppress variableScope static const char *racon_status[] = { "No RACON installed", "RACON not monitored", "RACON operational", "RACON ERROR" }; // cppcheck-suppress variableScope static const char *light_status[] = { "No light or no monitoring", "Light ON", "Light OFF", "Light ERROR" }; // cppcheck-suppress variableScope static const char *rta_status[] = { "Operational", "Limited operation", "Out of order", "N/A", }; // cppcheck-suppress variableScope const char *position_types[8] = { "Not available", "Port-side to", "Starboard-side to", "Mediterranean (end-on) mooring", "Mooring buoy", "Anchorage", "Reserved for future use", "Reserved for future use", }; (void)snprintf(buf, buflen, "{\"class\":\"AIS\","); if (device != NULL && device[0] != '\0') str_appendf(buf, buflen, "\"device\":\"%s\",", device); str_appendf(buf, buflen, "\"type\":%u,\"repeat\":%u,\"mmsi\":%u,\"scaled\":%s,", ais->type, ais->repeat, ais->mmsi, JSON_BOOL(scaled)); switch (ais->type) { case 1: /* Position Report */ case 2: case 3: if (scaled) { char turnlegend[20]; char speedlegend[20]; /* * Express turn as nan if not available, * "fastleft"/"fastright" for fast turns. */ if (ais->type1.turn == -128) (void)strlcpy(turnlegend, "\"nan\"", sizeof(turnlegend)); else if (ais->type1.turn == -127) (void)strlcpy(turnlegend, "\"fastleft\"", sizeof(turnlegend)); else if (ais->type1.turn == 127) (void)strlcpy(turnlegend, "\"fastright\"", sizeof(turnlegend)); else { double rot1 = ais->type1.turn / 4.733; (void)snprintf(turnlegend, sizeof(turnlegend), "%.0f", rot1 * rot1); } /* * Express speed as nan if not available, * "fast" for fast movers. */ if (ais->type1.speed == AIS_SPEED_NOT_AVAILABLE) (void)strlcpy(speedlegend, "\"nan\"", sizeof(speedlegend)); else if (ais->type1.speed == AIS_SPEED_FAST_MOVER) (void)strlcpy(speedlegend, "\"fast\"", sizeof(speedlegend)); else (void)snprintf(speedlegend, sizeof(speedlegend), "%.1f", ais->type1.speed / 10.0); str_appendf(buf, buflen, "\"status\":%u,\"status_text\":\"%s\"," "\"turn\":%s,\"speed\":%s," "\"accuracy\":%s,\"lon\":%.4f,\"lat\":%.4f," "\"course\":%.1f,\"heading\":%u,\"second\":%u," "\"maneuver\":%u,\"raim\":%s,\"radio\":%u}\r\n", ais->type1.status, nav_legends[ais->type1.status], turnlegend, speedlegend, JSON_BOOL(ais->type1.accuracy), ais->type1.lon / AIS_LATLON_DIV, ais->type1.lat / AIS_LATLON_DIV, ais->type1.course / 10.0, ais->type1.heading, ais->type1.second, ais->type1.maneuver, JSON_BOOL(ais->type1.raim), ais->type1.radio); } else { str_appendf(buf, buflen, "\"status\":%u,\"status_text\":\"%s\"," "\"turn\":%d,\"speed\":%u," "\"accuracy\":%s,\"lon\":%d,\"lat\":%d," "\"course\":%u,\"heading\":%u,\"second\":%u," "\"maneuver\":%u,\"raim\":%s,\"radio\":%u}\r\n", ais->type1.status, nav_legends[ais->type1.status], ais->type1.turn, ais->type1.speed, JSON_BOOL(ais->type1.accuracy), ais->type1.lon, ais->type1.lat, ais->type1.course, ais->type1.heading, ais->type1.second, ais->type1.maneuver, JSON_BOOL(ais->type1.raim), ais->type1.radio); } break; case 4: /* Base Station Report */ case 11: /* UTC/Date Response */ /* some fields have beem merged to an ISO8601 date */ if (scaled) { // The use of %u instead of %04u for the year is to allow // out-of-band year values. str_appendf(buf, buflen, "\"timestamp\":\"%04u-%02u-%02uT%02u:%02u:%02uZ\"," "\"accuracy\":%s,\"lon\":%.4f,\"lat\":%.4f," "\"epfd\":%u,\"epfd_text\":\"%s\"," "\"raim\":%s,\"radio\":%u}\r\n", ais->type4.year, ais->type4.month, ais->type4.day, ais->type4.hour, ais->type4.minute, ais->type4.second, JSON_BOOL(ais->type4.accuracy), ais->type4.lon / AIS_LATLON_DIV, ais->type4.lat / AIS_LATLON_DIV, ais->type4.epfd, EPFD_DISPLAY(ais->type4.epfd), JSON_BOOL(ais->type4.raim), ais->type4.radio); } else { str_appendf(buf, buflen, "\"timestamp\":\"%04u-%02u-%02uT%02u:%02u:%02uZ\"," "\"accuracy\":%s,\"lon\":%d,\"lat\":%d," "\"epfd\":%u,\"epfd_text\":\"%s\"," "\"raim\":%s,\"radio\":%u}\r\n", ais->type4.year, ais->type4.month, ais->type4.day, ais->type4.hour, ais->type4.minute, ais->type4.second, JSON_BOOL(ais->type4.accuracy), ais->type4.lon, ais->type4.lat, ais->type4.epfd, EPFD_DISPLAY(ais->type4.epfd), JSON_BOOL(ais->type4.raim), ais->type4.radio); } break; case 5: /* Ship static and voyage related data */ /* some fields have beem merged to an ISO8601 partial date */ if (scaled) { /* *INDENT-OFF* */ str_appendf(buf, buflen, "\"imo\":%u,\"ais_version\":%u,\"callsign\":\"%s\"," "\"shipname\":\"%s\"," "\"shiptype\":%u,\"shiptype_text\":\"%s\"," "\"to_bow\":%u,\"to_stern\":%u,\"to_port\":%u," "\"to_starboard\":%u," "\"epfd\":%u,\"epfd_text\":\"%s\"," "\"eta\":\"%02u-%02uT%02u:%02uZ\"," "\"draught\":%.1f,\"destination\":\"%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, SHIPTYPE_DISPLAY(ais->type5.shiptype), ais->type5.to_bow, ais->type5.to_stern, ais->type5.to_port, ais->type5.to_starboard, ais->type5.epfd, EPFD_DISPLAY(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 { str_appendf(buf, buflen, "\"imo\":%u,\"ais_version\":%u,\"callsign\":\"%s\"," "\"shipname\":\"%s\"," "\"shiptype\":%u,\"shiptype_text\":\"%s\"," "\"to_bow\":%u,\"to_stern\":%u,\"to_port\":%u," "\"to_starboard\":%u," "\"epfd\":%u,\"epfd_text\":\"%s\"," "\"eta\":\"%02u-%02uT%02u:%02uZ\"," "\"draught\":%u,\"destination\":\"%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, SHIPTYPE_DISPLAY(ais->type5.shiptype), ais->type5.to_bow, ais->type5.to_stern, ais->type5.to_port, ais->type5.to_starboard, ais->type5.epfd, EPFD_DISPLAY(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 */ str_appendf(buf, buflen, "\"seqno\":%u,\"dest_mmsi\":%u," "\"retransmit\":%s,\"dac\":%u,\"fid\":%u,", ais->type6.seqno, ais->type6.dest_mmsi, JSON_BOOL(ais->type6.retransmit), ais->type6.dac, ais->type6.fid); if (!ais->type6.structured) { str_appendf(buf, buflen, "\"data\":\"%zd:%s\"}\r\n", ais->type6.bitcount, json_stringify(buf1, sizeof(buf1), gpsd_hexdump(scratchbuf, sizeof(scratchbuf), (char *)ais->type6.bitdata, BITS_TO_BYTES(ais->type6.bitcount)))); break; } if (ais->type6.dac == 200) { switch (ais->type6.fid) { case 21: str_appendf(buf, buflen, "\"country\":\"%s\",\"locode\":\"%s\",\"section\":\"%s\",\"terminal\":\"%s\",\"hectometre\":\"%s\",\"eta\":\"%u-%uT%u:%u\",\"tugs\":%u,\"airdraught\":%u}", ais->type6.dac200fid21.country, ais->type6.dac200fid21.locode, ais->type6.dac200fid21.section, ais->type6.dac200fid21.terminal, ais->type6.dac200fid21.hectometre, ais->type6.dac200fid21.month, ais->type6.dac200fid21.day, ais->type6.dac200fid21.hour, ais->type6.dac200fid21.minute, ais->type6.dac200fid21.tugs, ais->type6.dac200fid21.airdraught); break; case 22: str_appendf(buf, buflen, "\"country\":\"%s\",\"locode\":\"%s\"," "\"section\":\"%s\"," "\"terminal\":\"%s\",\"hectometre\":\"%s\"," "\"eta\":\"%u-%uT%u:%u\"," "\"status\":%u,\"status_text\":\"%s\"}", ais->type6.dac200fid22.country, ais->type6.dac200fid22.locode, ais->type6.dac200fid22.section, ais->type6.dac200fid22.terminal, ais->type6.dac200fid22.hectometre, ais->type6.dac200fid22.month, ais->type6.dac200fid22.day, ais->type6.dac200fid22.hour, ais->type6.dac200fid22.minute, ais->type6.dac200fid22.status, rta_status[ais->type6.dac200fid22.status]); break; case 55: str_appendf(buf, buflen, "\"crew\":%u,\"passengers\":%u,\"personnel\":%u}", ais->type6.dac200fid55.crew, ais->type6.dac200fid55.passengers, ais->type6.dac200fid55.personnel); break; } } else if (ais->type6.dac == 235 || ais->type6.dac == 250) { switch (ais->type6.fid) { case 10: /* GLA - AtoN monitoring data */ str_appendf(buf, buflen, "\"off_pos\":%s,\"alarm\":%s," "\"stat_ext\":%u,", JSON_BOOL(ais->type6.dac235fid10.off_pos), JSON_BOOL(ais->type6.dac235fid10.alarm), ais->type6.dac235fid10.stat_ext); if (scaled && ais->type6.dac235fid10.ana_int != 0) str_appendf(buf, buflen, "\"ana_int\":%.2f,", ais->type6.dac235fid10.ana_int*0.05); else str_appendf(buf, buflen, "\"ana_int\":%u,", ais->type6.dac235fid10.ana_int); if (scaled && ais->type6.dac235fid10.ana_ext1 != 0) str_appendf(buf, buflen, "\"ana_ext1\":%.2f,", ais->type6.dac235fid10.ana_ext1*0.05); else str_appendf(buf, buflen, "\"ana_ext1\":%u,", ais->type6.dac235fid10.ana_ext1); if (scaled && ais->type6.dac235fid10.ana_ext2 != 0) str_appendf(buf, buflen, "\"ana_ext2\":%.2f,", ais->type6.dac235fid10.ana_ext2*0.05); else str_appendf(buf, buflen, "\"ana_ext2\":%u,", ais->type6.dac235fid10.ana_ext2); str_appendf(buf, buflen, "\"racon\":%u," "\"racon_text\":\"%s\"," "\"light\":%u," "\"light_text\":\"%s\"", ais->type6.dac235fid10.racon, racon_status[ais->type6.dac235fid10.racon], ais->type6.dac235fid10.light, light_status[ais->type6.dac235fid10.light]); str_rstrip_char(buf, ','); (void)strlcat(buf, "}\r\n", buflen); break; } } else if (ais->type6.dac == 1) { char buf4[JSON_VAL_MAX * 2 + 1]; switch (ais->type6.fid) { case 12: /* IMO236 -Dangerous cargo indication */ /* some fields have beem merged to an ISO8601 partial date */ str_appendf(buf, buflen, "\"lastport\":\"%s\",\"departure\":\"%02u-%02uT%02u:%02uZ\"," "\"nextport\":\"%s\",\"eta\":\"%02u-%02uT%02u:%02uZ\"," "\"dangerous\":\"%s\",\"imdcat\":\"%s\"," "\"unid\":%u,\"amount\":%u,\"unit\":%u}\r\n", json_stringify(buf1, sizeof(buf1), ais->type6.dac1fid12.lastport), ais->type6.dac1fid12.lmonth, ais->type6.dac1fid12.lday, ais->type6.dac1fid12.lhour, ais->type6.dac1fid12.lminute, json_stringify(buf2, sizeof(buf2), ais->type6.dac1fid12.nextport), ais->type6.dac1fid12.nmonth, ais->type6.dac1fid12.nday, ais->type6.dac1fid12.nhour, ais->type6.dac1fid12.nminute, json_stringify(buf3, sizeof(buf3), ais->type6.dac1fid12.dangerous), json_stringify(buf4, sizeof(buf4), ais->type6.dac1fid12.imdcat), ais->type6.dac1fid12.unid, ais->type6.dac1fid12.amount, ais->type6.dac1fid12.unit); break; case 15: /* IMO236 - Extended Ship Static and Voyage Related Data */ str_appendf(buf, buflen, "\"airdraught\":%u}\r\n", ais->type6.dac1fid15.airdraught); break; case 16: /* IMO236 - Number of persons on board */ str_appendf(buf, buflen, "\"persons\":%u}\t\n", ais->type6.dac1fid16.persons); break; case 18: /* IMO289 - Clearance time to enter port */ str_appendf(buf, buflen, "\"linkage\":%u,\"arrival\":\"%02u-%02uT%02u:%02uZ\",\"portname\":\"%s\",\"destination\":\"%s\",", ais->type6.dac1fid18.linkage, ais->type6.dac1fid18.month, ais->type6.dac1fid18.day, ais->type6.dac1fid18.hour, ais->type6.dac1fid18.minute, json_stringify(buf1, sizeof(buf1), ais->type6.dac1fid18.portname), json_stringify(buf2, sizeof(buf2), ais->type6.dac1fid18.destination)); if (scaled) str_appendf(buf, buflen, "\"lon\":%.3f,\"lat\":%.3f}\r\n", ais->type6.dac1fid18.lon/AIS_LATLON3_DIV, ais->type6.dac1fid18.lat/AIS_LATLON3_DIV); else str_appendf(buf, buflen, "\"lon\":%d,\"lat\":%d}\r\n", ais->type6.dac1fid18.lon, ais->type6.dac1fid18.lat); break; case 20: /* IMO289 - Berthing Data */ str_appendf(buf, buflen, "\"linkage\":%u,\"berth_length\":%u," "\"position\":%u,\"position_text\":\"%s\"," "\"arrival\":\"%u-%uT%u:%u\"," "\"availability\":%u," "\"agent\":%u,\"fuel\":%u,\"chandler\":%u," "\"stevedore\":%u,\"electrical\":%u," "\"water\":%u,\"customs\":%u,\"cartage\":%u," "\"crane\":%u,\"lift\":%u,\"medical\":%u," "\"navrepair\":%u,\"provisions\":%u," "\"shiprepair\":%u,\"surveyor\":%u," "\"steam\":%u,\"tugs\":%u,\"solidwaste\":%u," "\"liquidwaste\":%u,\"hazardouswaste\":%u," "\"ballast\":%u,\"additional\":%u," "\"regional1\":%u,\"regional2\":%u," "\"future1\":%u,\"future2\":%u," "\"berth_name\":\"%s\",", ais->type6.dac1fid20.linkage, ais->type6.dac1fid20.berth_length, ais->type6.dac1fid20.position, position_types[ais->type6.dac1fid20.position], ais->type6.dac1fid20.month, ais->type6.dac1fid20.day, ais->type6.dac1fid20.hour, ais->type6.dac1fid20.minute, ais->type6.dac1fid20.availability, ais->type6.dac1fid20.agent, ais->type6.dac1fid20.fuel, ais->type6.dac1fid20.chandler, ais->type6.dac1fid20.stevedore, ais->type6.dac1fid20.electrical, ais->type6.dac1fid20.water, ais->type6.dac1fid20.customs, ais->type6.dac1fid20.cartage, ais->type6.dac1fid20.crane, ais->type6.dac1fid20.lift, ais->type6.dac1fid20.medical, ais->type6.dac1fid20.navrepair, ais->type6.dac1fid20.provisions, ais->type6.dac1fid20.shiprepair, ais->type6.dac1fid20.surveyor, ais->type6.dac1fid20.steam, ais->type6.dac1fid20.tugs, ais->type6.dac1fid20.solidwaste, ais->type6.dac1fid20.liquidwaste, ais->type6.dac1fid20.hazardouswaste, ais->type6.dac1fid20.ballast, ais->type6.dac1fid20.additional, ais->type6.dac1fid20.regional1, ais->type6.dac1fid20.regional2, ais->type6.dac1fid20.future1, ais->type6.dac1fid20.future2, json_stringify(buf1, sizeof(buf1), ais->type6.dac1fid20.berth_name)); if (scaled) str_appendf(buf, buflen, "\"berth_lon\":%.3f," "\"berth_lat\":%.3f," "\"berth_depth\":%.1f}\r\n", ais->type6.dac1fid20.berth_lon / AIS_LATLON3_DIV, ais->type6.dac1fid20.berth_lat / AIS_LATLON3_DIV, ais->type6.dac1fid20.berth_depth * 0.1); else str_appendf(buf, buflen, "\"berth_lon\":%d," "\"berth_lat\":%d," "\"berth_depth\":%u}\r\n", ais->type6.dac1fid20.berth_lon, ais->type6.dac1fid20.berth_lat, ais->type6.dac1fid20.berth_depth); break; case 23: /* IMO289 - Area notice - addressed */ break; case 25: /* IMO289 - Dangerous cargo indication */ str_appendf(buf, buflen, "\"unit\":%u,\"amount\":%u,\"cargos\":[", ais->type6.dac1fid25.unit, ais->type6.dac1fid25.amount); for (i = 0; i < (int)ais->type6.dac1fid25.ncargos; i++) str_appendf(buf, buflen, "{\"code\":%u,\"subtype\":%u},", ais->type6.dac1fid25.cargos[i].code, ais->type6.dac1fid25.cargos[i].subtype); str_rstrip_char(buf, ','); (void)strlcat(buf, "]}\r\n", buflen); break; case 28: /* IMO289 - Route info - addressed */ str_appendf(buf, buflen, "\"linkage\":%u,\"sender\":%u," "\"rtype\":%u," "\"rtype_text\":\"%s\"," "\"start\":\"%02u-%02uT%02u:%02uZ\"," "\"duration\":%u,\"waypoints\":[", ais->type6.dac1fid28.linkage, ais->type6.dac1fid28.sender, ais->type6.dac1fid28.rtype, route_type[ais->type6.dac1fid28.rtype], ais->type6.dac1fid28.month, ais->type6.dac1fid28.day, ais->type6.dac1fid28.hour, ais->type6.dac1fid28.minute, ais->type6.dac1fid28.duration); for (i = 0; i < ais->type6.dac1fid28.waycount; i++) { if (scaled) str_appendf(buf, buflen, "{\"lon\":%.4f,\"lat\":%.4f},", ais->type6.dac1fid28.waypoints[i].lon / AIS_LATLON4_DIV, ais->type6.dac1fid28.waypoints[i].lat / AIS_LATLON4_DIV); else str_appendf(buf, buflen, "{\"lon\":%d,\"lat\":%d},", ais->type6.dac1fid28.waypoints[i].lon, ais->type6.dac1fid28.waypoints[i].lat); } str_rstrip_char(buf, ','); (void)strlcat(buf, "]}\r\n", buflen); break; case 30: /* IMO289 - Text description - addressed */ str_appendf(buf, buflen, "\"linkage\":%u,\"text\":\"%s\"}\r\n", ais->type6.dac1fid30.linkage, json_stringify(buf1, sizeof(buf1), ais->type6.dac1fid30.text)); break; case 14: /* IMO236 - Tidal Window */ case 32: /* IMO289 - Tidal Window */ str_appendf(buf, buflen, "\"month\":%u,\"day\":%u,\"tidals\":[", ais->type6.dac1fid32.month, ais->type6.dac1fid32.day); for (i = 0; i < ais->type6.dac1fid32.ntidals; i++) { const struct tidal_t *tp = &ais->type6.dac1fid32.tidals[i]; if (scaled) str_appendf(buf, buflen, "{\"lon\":%.3f,\"lat\":%.3f,", tp->lon / AIS_LATLON3_DIV, tp->lat / AIS_LATLON3_DIV); else str_appendf(buf, buflen, "{\"lon\":%d,\"lat\":%d,", tp->lon, tp->lat); str_appendf(buf, buflen, "\"from_hour\":%u,\"from_min\":%u,\"to_hour\":%u,\"to_min\":%u,\"cdir\":%u,", tp->from_hour, tp->from_min, tp->to_hour, tp->to_min, tp->cdir); if (scaled) str_appendf(buf, buflen, "\"cspeed\":%.1f},", tp->cspeed / 10.0); else str_appendf(buf, buflen, "\"cspeed\":%u},", tp->cspeed); } str_rstrip_char(buf, ','); (void)strlcat(buf, "]}\r\n", buflen); break; } } break; case 7: /* Binary Acknowledge */ case 13: /* Safety Related Acknowledge */ str_appendf(buf, buflen, "\"mmsi1\":%u,\"mmsi2\":%u,\"mmsi3\":%u,\"mmsi4\":%u}\r\n", ais->type7.mmsi1, ais->type7.mmsi2, ais->type7.mmsi3, ais->type7.mmsi4); break; case 8: /* Binary Broadcast Message */ str_appendf(buf, buflen, "\"dac\":%u,\"fid\":%u,",ais->type8.dac, ais->type8.fid); if (!ais->type8.structured) { str_appendf(buf, buflen, "\"data\":\"%zd:%s\"}\r\n", ais->type8.bitcount, json_stringify(buf1, sizeof(buf1), gpsd_hexdump(scratchbuf, sizeof(scratchbuf), (char *)ais->type8.bitdata, BITS_TO_BYTES(ais->type8.bitcount)))); break; } if (ais->type8.dac == 1) { const char *trends[] = { "steady", "increasing", "decreasing", "N/A", }; // WMO 306, Code table 4.201 const char *preciptypes[] = { "reserved", "rain", "thunderstorm", "freezing rain", "mixed/ice", "snow", "reserved", "N/A", }; const char *ice[] = { "no", "yes", "reserved", "N/A", }; switch (ais->type8.fid) { case 11: /* IMO236 - Meteorological/Hydrological data */ /* some fields have been merged to an ISO8601 partial date */ /* layout is almost identical to FID=31 from IMO289 */ if (scaled) str_appendf(buf, buflen, "\"lat\":%.3f,\"lon\":%.3f,", ais->type8.dac1fid11.lat / AIS_LATLON3_DIV, ais->type8.dac1fid11.lon / AIS_LATLON3_DIV); else str_appendf(buf, buflen, "\"lat\":%d,\"lon\":%d,", ais->type8.dac1fid11.lat, ais->type8.dac1fid11.lon); str_appendf(buf, buflen, "\"timestamp\":\"%02uT%02u:%02uZ\"," "\"wspeed\":%u,\"wgust\":%u,\"wdir\":%u," "\"wgustdir\":%u,\"humidity\":%u,", ais->type8.dac1fid11.day, ais->type8.dac1fid11.hour, ais->type8.dac1fid11.minute, ais->type8.dac1fid11.wspeed, ais->type8.dac1fid11.wgust, ais->type8.dac1fid11.wdir, ais->type8.dac1fid11.wgustdir, ais->type8.dac1fid11.humidity); if (scaled) str_appendf(buf, buflen, "\"airtemp\":%.1f,\"dewpoint\":%.1f," "\"pressure\":%u,\"pressuretend\":\"%s\",", (ais->type8.dac1fid11.airtemp - DAC1FID11_AIRTEMP_OFFSET) / DAC1FID11_AIRTEMP_DIV, (ais->type8.dac1fid11.dewpoint - DAC1FID11_DEWPOINT_OFFSET) / DAC1FID11_DEWPOINT_DIV, ais->type8.dac1fid11.pressure - DAC1FID11_PRESSURE_OFFSET, trends[ais->type8.dac1fid11.pressuretend]); else str_appendf(buf, buflen, "\"airtemp\":%u,\"dewpoint\":%u," "\"pressure\":%u,\"pressuretend\":%u,", ais->type8.dac1fid11.airtemp, ais->type8.dac1fid11.dewpoint, ais->type8.dac1fid11.pressure, ais->type8.dac1fid11.pressuretend); if (scaled) str_appendf(buf, buflen, "\"visibility\":%.1f,", ais->type8.dac1fid11.visibility / DAC1FID11_VISIBILITY_DIV); else str_appendf(buf, buflen, "\"visibility\":%u,", ais->type8.dac1fid11.visibility); if (!scaled) str_appendf(buf, buflen, "\"waterlevel\":%d,", ais->type8.dac1fid11.waterlevel); else str_appendf(buf, buflen, "\"waterlevel\":%.1f,", (ais->type8.dac1fid11.waterlevel - DAC1FID11_WATERLEVEL_OFFSET) / DAC1FID11_WATERLEVEL_DIV); if (scaled) { str_appendf(buf, buflen, "\"leveltrend\":\"%s\"," "\"cspeed\":%.1f,\"cdir\":%u," "\"cspeed2\":%.1f,\"cdir2\":%u,\"cdepth2\":%u," "\"cspeed3\":%.1f,\"cdir3\":%u,\"cdepth3\":%u," "\"waveheight\":%.1f,\"waveperiod\":%u,\"wavedir\":%u," "\"swellheight\":%.1f,\"swellperiod\":%u,\"swelldir\":%u," "\"seastate\":%u,\"watertemp\":%.1f," "\"preciptype\":%u,\"preciptype_text\":\"%s\"," "\"salinity\":%.1f,\"ice\":%u,\"ice_text\":\"%s\"", trends[ais->type8.dac1fid11.leveltrend], ais->type8.dac1fid11.cspeed / DAC1FID11_CSPEED_DIV, ais->type8.dac1fid11.cdir, ais->type8.dac1fid11.cspeed2 / DAC1FID11_CSPEED_DIV, ais->type8.dac1fid11.cdir2, ais->type8.dac1fid11.cdepth2, ais->type8.dac1fid11.cspeed3 / DAC1FID11_CSPEED_DIV, ais->type8.dac1fid11.cdir3, ais->type8.dac1fid11.cdepth3, ais->type8.dac1fid11.waveheight / DAC1FID11_WAVEHEIGHT_DIV, ais->type8.dac1fid11.waveperiod, ais->type8.dac1fid11.wavedir, ais->type8.dac1fid11.swellheight / DAC1FID11_WAVEHEIGHT_DIV, ais->type8.dac1fid11.swellperiod, ais->type8.dac1fid11.swelldir, ais->type8.dac1fid11.seastate, (ais->type8.dac1fid11.watertemp - DAC1FID11_WATERTEMP_OFFSET) / DAC1FID11_WATERTEMP_DIV, ais->type8.dac1fid11.preciptype, preciptypes[ais->type8.dac1fid11.preciptype], ais->type8.dac1fid11.salinity / DAC1FID11_SALINITY_DIV, ais->type8.dac1fid11.ice, ice[ais->type8.dac1fid11.ice]); } else str_appendf(buf, buflen, "\"leveltrend\":%u," "\"cspeed\":%u,\"cdir\":%u," "\"cspeed2\":%u,\"cdir2\":%u,\"cdepth2\":%u," "\"cspeed3\":%u,\"cdir3\":%u,\"cdepth3\":%u," "\"waveheight\":%u,\"waveperiod\":%u,\"wavedir\":%u," "\"swellheight\":%u,\"swellperiod\":%u,\"swelldir\":%u," "\"seastate\":%u,\"watertemp\":%u," "\"preciptype\":%u,\"preciptype_text\":\"%s\"," "\"salinity\":%u,\"ice\":%u,\"ice_text\":\"%s\"", ais->type8.dac1fid11.leveltrend, ais->type8.dac1fid11.cspeed, ais->type8.dac1fid11.cdir, ais->type8.dac1fid11.cspeed2, ais->type8.dac1fid11.cdir2, ais->type8.dac1fid11.cdepth2, ais->type8.dac1fid11.cspeed3, ais->type8.dac1fid11.cdir3, ais->type8.dac1fid11.cdepth3, ais->type8.dac1fid11.waveheight, ais->type8.dac1fid11.waveperiod, ais->type8.dac1fid11.wavedir, ais->type8.dac1fid11.swellheight, ais->type8.dac1fid11.swellperiod, ais->type8.dac1fid11.swelldir, ais->type8.dac1fid11.seastate, ais->type8.dac1fid11.watertemp, ais->type8.dac1fid11.preciptype, preciptypes[ais->type8.dac1fid11.preciptype], ais->type8.dac1fid11.salinity, ais->type8.dac1fid11.ice, ice[ais->type8.dac1fid11.ice]); (void)strlcat(buf, "}\r\n", buflen); break; case 13: /* IMO236 - Fairway closed */ str_appendf(buf, buflen, "\"reason\":\"%s\",\"closefrom\":\"%s\"," "\"closeto\":\"%s\",\"radius\":%u," "\"extunit\":%u," "\"from\":\"%02u-%02uT%02u:%02u\"," "\"to\":\"%02u-%02uT%02u:%02u\"}\r\n", json_stringify(buf1, sizeof(buf1), ais->type8.dac1fid13.reason), json_stringify(buf2, sizeof(buf2), ais->type8.dac1fid13.closefrom), json_stringify(buf3, sizeof(buf3), ais->type8.dac1fid13.closeto), ais->type8.dac1fid13.radius, ais->type8.dac1fid13.extunit, ais->type8.dac1fid13.fmonth, ais->type8.dac1fid13.fday, ais->type8.dac1fid13.fhour, ais->type8.dac1fid13.fminute, ais->type8.dac1fid13.tmonth, ais->type8.dac1fid13.tday, ais->type8.dac1fid13.thour, ais->type8.dac1fid13.tminute); break; case 15: /* IMO236 - Extended ship and voyage */ str_appendf(buf, buflen, "\"airdraught\":%u}\r\n", ais->type8.dac1fid15.airdraught); break; case 16: /* IMO289 - Number of persons on board */ str_appendf(buf, buflen, "\"persons\":%u}\t\n", ais->type6.dac1fid16.persons); break; case 17: /* IMO289 - VTS-generated/synthetic targets */ (void)strlcat(buf, "\"targets\":[", buflen); for (i = 0; i < ais->type8.dac1fid17.ntargets; i++) { str_appendf(buf, buflen, "{\"idtype\":%u,\"idtype_text\":\"%s\",", ais->type8.dac1fid17.targets[i].idtype, idtypes[ais->type8.dac1fid17.targets[i].idtype]); switch (ais->type8.dac1fid17.targets[i].idtype) { case DAC1FID17_IDTYPE_MMSI: str_appendf(buf, buflen, "\"%s\":\"%u\",", idtypes[ais->type8.dac1fid17.targets[i].idtype], ais->type8.dac1fid17.targets[i].id.mmsi); break; case DAC1FID17_IDTYPE_IMO: str_appendf(buf, buflen, "\"%s\":\"%u\",", idtypes[ais->type8.dac1fid17.targets[i].idtype], ais->type8.dac1fid17.targets[i].id.imo); break; case DAC1FID17_IDTYPE_CALLSIGN: str_appendf(buf, buflen, "\"%s\":\"%s\",", idtypes[ais->type8.dac1fid17.targets[i].idtype], json_stringify(buf1, sizeof(buf1), ais->type8.dac1fid17.targets[i].id.callsign)); break; default: str_appendf(buf, buflen, "\"%s\":\"%s\",", idtypes[ais->type8.dac1fid17.targets[i].idtype], json_stringify(buf1, sizeof(buf1), ais->type8.dac1fid17.targets[i].id.other)); } if (scaled) str_appendf(buf, buflen, "\"lat\":%.3f,\"lon\":%.3f,", ais->type8.dac1fid17.targets[i].lat / AIS_LATLON3_DIV, ais->type8.dac1fid17.targets[i].lon / AIS_LATLON3_DIV); else str_appendf(buf, buflen, "\"lat\":%d,\"lon\":%d,", ais->type8.dac1fid17.targets[i].lat, ais->type8.dac1fid17.targets[i].lon); str_appendf(buf, buflen, "\"course\":%u,\"second\":%u,\"speed\":%u},", ais->type8.dac1fid17.targets[i].course, ais->type8.dac1fid17.targets[i].second, ais->type8.dac1fid17.targets[i].speed); } str_rstrip_char(buf, ','); (void)strlcat(buf, "]}\r\n", buflen); break; case 19: /* IMO289 - Marine Traffic Signal */ str_appendf(buf, buflen, "\"linkage\":%u,\"station\":\"%s\"," "\"lon\":%.3f,\"lat\":%.3f,\"status\":%u," "\"signal\":%u,\"signal_text\":\"%s\"," "\"hour\":%u,\"minute\":%u," "\"nextsignal\":%u" "\"nextsignal_text\":\"%s\"" "}\r\n", ais->type8.dac1fid19.linkage, json_stringify(buf1, sizeof(buf1), ais->type8.dac1fid19.station), ais->type8.dac1fid19.lon / AIS_LATLON3_DIV, ais->type8.dac1fid19.lat / AIS_LATLON3_DIV, ais->type8.dac1fid19.status, ais->type8.dac1fid19.signal, SIGNAL_DISPLAY(ais->type8.dac1fid19.signal), ais->type8.dac1fid19.hour, ais->type8.dac1fid19.minute, ais->type8.dac1fid19.nextsignal, SIGNAL_DISPLAY(ais->type8.dac1fid19.nextsignal)); break; case 21: /* IMO289 - Weather obs. report from ship */ break; case 22: /* IMO289 - Area notice - broadcast */ break; case 24: /* IMO289 - Extended ship static & voyage-related data */ break; case 25: /* IMO289 - Dangerous Cargo Indication */ break; case 27: /* IMO289 - Route information - broadcast */ str_appendf(buf, buflen, "\"linkage\":%u,\"sender\":%u," "\"rtype\":%u," "\"rtype_text\":\"%s\"," "\"start\":\"%02u-%02uT%02u:%02uZ\"," "\"duration\":%u,\"waypoints\":[", ais->type8.dac1fid27.linkage, ais->type8.dac1fid27.sender, ais->type8.dac1fid27.rtype, route_type[ais->type8.dac1fid27.rtype], ais->type8.dac1fid27.month, ais->type8.dac1fid27.day, ais->type8.dac1fid27.hour, ais->type8.dac1fid27.minute, ais->type8.dac1fid27.duration); for (i = 0; i < ais->type8.dac1fid27.waycount; i++) { if (scaled) str_appendf(buf, buflen, "{\"lon\":%.4f,\"lat\":%.4f},", ais->type8.dac1fid27.waypoints[i].lon / AIS_LATLON4_DIV, ais->type8.dac1fid27.waypoints[i].lat / AIS_LATLON4_DIV); else str_appendf(buf, buflen, "{\"lon\":%d,\"lat\":%d},", ais->type8.dac1fid27.waypoints[i].lon, ais->type8.dac1fid27.waypoints[i].lat); } str_rstrip_char(buf, ','); (void)strlcat(buf, "]}\r\n", buflen); break; case 29: /* IMO289 - Text Description - broadcast */ str_appendf(buf, buflen, "\"linkage\":%u,\"text\":\"%s\"}\r\n", ais->type8.dac1fid29.linkage, json_stringify(buf1, sizeof(buf1), ais->type8.dac1fid29.text)); break; case 31: /* IMO289 - Meteorological/Hydrological data */ /* some fields have been merged to an ISO8601 partial date */ /* layout is almost identical to FID=11 from IMO236 */ if (scaled) str_appendf(buf, buflen, "\"lat\":%.3f,\"lon\":%.3f,", ais->type8.dac1fid31.lat / AIS_LATLON3_DIV, ais->type8.dac1fid31.lon / AIS_LATLON3_DIV); else str_appendf(buf, buflen, "\"lat\":%d,\"lon\":%d,", ais->type8.dac1fid31.lat, ais->type8.dac1fid31.lon); str_appendf(buf, buflen, "\"accuracy\":%s,", JSON_BOOL(ais->type8.dac1fid31.accuracy)); str_appendf(buf, buflen, "\"timestamp\":\"%02uT%02u:%02uZ\"," "\"wspeed\":%u,\"wgust\":%u,\"wdir\":%u," "\"wgustdir\":%u,\"humidity\":%u,", ais->type8.dac1fid31.day, ais->type8.dac1fid31.hour, ais->type8.dac1fid31.minute, ais->type8.dac1fid31.wspeed, ais->type8.dac1fid31.wgust, ais->type8.dac1fid31.wdir, ais->type8.dac1fid31.wgustdir, ais->type8.dac1fid31.humidity); if (scaled) str_appendf(buf, buflen, "\"airtemp\":%.1f,\"dewpoint\":%.1f," "\"pressure\":%u,\"pressuretend\":\"%s\"," "\"visgreater\":%s,", ais->type8.dac1fid31.airtemp / DAC1FID31_AIRTEMP_DIV, ais->type8.dac1fid31.dewpoint / DAC1FID31_DEWPOINT_DIV, ais->type8.dac1fid31.pressure - DAC1FID31_PRESSURE_OFFSET, trends[ais->type8.dac1fid31.pressuretend], JSON_BOOL(ais->type8.dac1fid31.visgreater)); else str_appendf(buf, buflen, "\"airtemp\":%d,\"dewpoint\":%d," "\"pressure\":%u,\"pressuretend\":%u," "\"visgreater\":%s,", ais->type8.dac1fid31.airtemp, ais->type8.dac1fid31.dewpoint, ais->type8.dac1fid31.pressure, ais->type8.dac1fid31.pressuretend, JSON_BOOL(ais->type8.dac1fid31.visgreater)); if (scaled) str_appendf(buf, buflen, "\"visibility\":%.1f,", ais->type8.dac1fid31.visibility / DAC1FID31_VISIBILITY_DIV); else str_appendf(buf, buflen, "\"visibility\":%u,", ais->type8.dac1fid31.visibility); if (!scaled) str_appendf(buf, buflen, "\"waterlevel\":%d,", ais->type8.dac1fid31.waterlevel); else str_appendf(buf, buflen, "\"waterlevel\":%.1f,", (ais->type8.dac1fid31.waterlevel - DAC1FID31_WATERLEVEL_OFFSET) / DAC1FID31_WATERLEVEL_DIV); if (scaled) { str_appendf(buf, buflen, "\"leveltrend\":\"%s\"," "\"cspeed\":%.1f,\"cdir\":%u," "\"cspeed2\":%.1f,\"cdir2\":%u,\"cdepth2\":%u," "\"cspeed3\":%.1f,\"cdir3\":%u,\"cdepth3\":%u," "\"waveheight\":%.1f,\"waveperiod\":%u,\"wavedir\":%u," "\"swellheight\":%.1f,\"swellperiod\":%u,\"swelldir\":%u," "\"seastate\":%u,\"watertemp\":%.1f," "\"preciptype\":\"%s\",\"salinity\":%.1f,\"ice\":\"%s\"", trends[ais->type8.dac1fid31.leveltrend], ais->type8.dac1fid31.cspeed / DAC1FID31_CSPEED_DIV, ais->type8.dac1fid31.cdir, ais->type8.dac1fid31.cspeed2 / DAC1FID31_CSPEED_DIV, ais->type8.dac1fid31.cdir2, ais->type8.dac1fid31.cdepth2, ais->type8.dac1fid31.cspeed3 / DAC1FID31_CSPEED_DIV, ais->type8.dac1fid31.cdir3, ais->type8.dac1fid31.cdepth3, ais->type8.dac1fid31.waveheight / DAC1FID31_HEIGHT_DIV, ais->type8.dac1fid31.waveperiod, ais->type8.dac1fid31.wavedir, ais->type8.dac1fid31.swellheight / DAC1FID31_HEIGHT_DIV, ais->type8.dac1fid31.swellperiod, ais->type8.dac1fid31.swelldir, ais->type8.dac1fid31.seastate, ais->type8.dac1fid31.watertemp / DAC1FID31_WATERTEMP_DIV, preciptypes[ais->type8.dac1fid31.preciptype], ais->type8.dac1fid31.salinity / DAC1FID31_SALINITY_DIV, ice[ais->type8.dac1fid31.ice]); } else str_appendf(buf, buflen, "\"leveltrend\":%u," "\"cspeed\":%u,\"cdir\":%u," "\"cspeed2\":%u,\"cdir2\":%u,\"cdepth2\":%u," "\"cspeed3\":%u,\"cdir3\":%u,\"cdepth3\":%u," "\"waveheight\":%u,\"waveperiod\":%u,\"wavedir\":%u," "\"swellheight\":%u,\"swellperiod\":%u,\"swelldir\":%u," "\"seastate\":%u,\"watertemp\":%d," "\"preciptype\":%u,\"salinity\":%u,\"ice\":%u", ais->type8.dac1fid31.leveltrend, ais->type8.dac1fid31.cspeed, ais->type8.dac1fid31.cdir, ais->type8.dac1fid31.cspeed2, ais->type8.dac1fid31.cdir2, ais->type8.dac1fid31.cdepth2, ais->type8.dac1fid31.cspeed3, ais->type8.dac1fid31.cdir3, ais->type8.dac1fid31.cdepth3, ais->type8.dac1fid31.waveheight, ais->type8.dac1fid31.waveperiod, ais->type8.dac1fid31.wavedir, ais->type8.dac1fid31.swellheight, ais->type8.dac1fid31.swellperiod, ais->type8.dac1fid31.swelldir, ais->type8.dac1fid31.seastate, ais->type8.dac1fid31.watertemp, ais->type8.dac1fid31.preciptype, ais->type8.dac1fid31.salinity, ais->type8.dac1fid31.ice); (void)strlcat(buf, "}\r\n", buflen); break; } } else if (ais->type8.dac == 200) { struct { const unsigned int code; const unsigned int ais; const char *legend; } *cp, shiptypes[] = { /* * The Inland AIS standard is not clear which numbers are * supposed to be in the type slot. The ranges are disjoint, * so we'll match on both. */ {8000, 99, "Vessel, type unknown"}, {8010, 79, "Motor freighter"}, {8020, 89, "Motor tanker"}, {8021, 80, "Motor tanker, liquid cargo, type N"}, {8022, 80, "Motor tanker, liquid cargo, type C"}, {8023, 89, "Motor tanker, dry cargo as if liquid (e.g. cement)"}, {8030, 79, "Container vessel"}, {8040, 80, "Gas tanker"}, {8050, 79, "Motor freighter, tug"}, {8060, 89, "Motor tanker, tug"}, {8070, 79, "Motor freighter with one or more ships alongside"}, {8080, 89, "Motor freighter with tanker"}, {8090, 79, "Motor freighter pushing one or more freighters"}, {8100, 89, "Motor freighter pushing at least one tank-ship"}, {8110, 79, "Tug, freighter"}, {8120, 89, "Tug, tanker"}, {8130, 31, "Tug freighter, coupled"}, {8140, 31, "Tug, freighter/tanker, coupled"}, {8150, 99, "Freightbarge"}, {8160, 99, "Tankbarge"}, {8161, 90, "Tankbarge, liquid cargo, type N"}, {8162, 90, "Tankbarge, liquid cargo, type C"}, {8163, 99, "Tankbarge, dry cargo as if liquid (e.g. cement)"}, {8170, 99, "Freightbarge with containers"}, {8180, 90, "Tankbarge, gas"}, {8210, 79, "Pushtow, one cargo barge"}, {8220, 79, "Pushtow, two cargo barges"}, {8230, 79, "Pushtow, three cargo barges"}, {8240, 79, "Pushtow, four cargo barges"}, {8250, 79, "Pushtow, five cargo barges"}, {8260, 79, "Pushtow, six cargo barges"}, {8270, 79, "Pushtow, seven cargo barges"}, {8280, 79, "Pushtow, eigth cargo barges"}, {8290, 79, "Pushtow, nine or more barges"}, {8310, 80, "Pushtow, one tank/gas barge"}, {8320, 80, "Pushtow, two barges at least one tanker or gas barge"}, {8330, 80, "Pushtow, three barges at least one tanker or gas barge"}, {8340, 80, "Pushtow, four barges at least one tanker or gas barge"}, {8350, 80, "Pushtow, five barges at least one tanker or gas barge"}, {8360, 80, "Pushtow, six barges at least one tanker or gas barge"}, {8370, 80, "Pushtow, seven barges at least one tanker or gas barg"}, {0, 0, "Illegal ship type value."}, }; const char *hazard_types[] = { "0 blue cones/lights", "1 blue cone/light", "2 blue cones/lights", "3 blue cones/lights", "4 B-Flag", "Unknown", }; #define HTYPE_DISPLAY(n) (((n) < (unsigned int)NITEMS(hazard_types)) ? hazard_types[n] : "INVALID HAZARD TYPE") const char *lstatus_types[] = { "N/A (default)", "Unloaded", "Loaded", }; #define LSTATUS_DISPLAY(n) (((n) < (unsigned int)NITEMS(lstatus_types)) ? lstatus_types[n] : "INVALID LOAD STATUS") const char *emma_types[] = { "Not Available", "Wind", "Rain", "Snow and ice", "Thunderstorm", "Fog", "Low temperature", "High temperature", "Flood", "Forest Fire", }; #define EMMA_TYPE_DISPLAY(n) (((n) < (unsigned int)NITEMS(emma_types)) ? emma_types[n] : "INVALID EMMA TYPE") const char *emma_classes[] = { "Slight", "Medium", "Strong", }; #define EMMA_CLASS_DISPLAY(n) (((n) < (unsigned int)NITEMS(emma_classes)) ? emma_classes[n] : "INVALID EMMA TYPE") const char *emma_winds[] = { "N/A", "North", "North East", "East", "South East", "South", "South West", "West", "North West", }; #define EMMA_WIND_DISPLAY(n) (((n) < (unsigned int)NITEMS(emma_winds)) ? emma_winds[n] : "INVALID EMMA WIND DIRECTION") const char *direction_vocabulary[] = { "Unknown", "Upstream", "Downstream", "To left bank", "To right bank", }; #define DIRECTION_DISPLAY(n) (((n) < (unsigned int)NITEMS(direction_vocabulary)) ? direction_vocabulary[n] : "INVALID DIRECTION") const char *status_vocabulary[] = { "Unknown", "No light", "White", "Yellow", "Green", "Red", "White flashing", "Yellow flashing.", }; #define STATUS_DISPLAY(n) (((n) < (unsigned int)NITEMS(status_vocabulary)) ? status_vocabulary[n] : "INVALID STATUS") switch (ais->type8.fid) { case 10: /* Inland ship static and voyage-related data */ for (cp = shiptypes; cp < shiptypes + NITEMS(shiptypes); cp++) if (cp->code == ais->type8.dac200fid10.shiptype || cp->ais == ais->type8.dac200fid10.shiptype || cp->code == 0) break; str_appendf(buf, buflen, "\"vin\":\"%s\",\"length\":%u,\"beam\":%u," "\"shiptype\":%u,\"shiptype_text\":\"%s\"," "\"hazard\":%u,\"hazard_text\":\"%s\"," "\"draught\":%u," "\"loaded\":%u,\"loaded_text\":\"%s\"," "\"speed_q\":%s," "\"course_q\":%s," "\"heading_q\":%s}\r\n", json_stringify(buf1, sizeof(buf1), ais->type8.dac200fid10.vin), ais->type8.dac200fid10.length, ais->type8.dac200fid10.beam, ais->type8.dac200fid10.shiptype, cp->legend, ais->type8.dac200fid10.hazard, HTYPE_DISPLAY(ais->type8.dac200fid10.hazard), ais->type8.dac200fid10.draught, ais->type8.dac200fid10.loaded, LSTATUS_DISPLAY(ais->type8.dac200fid10.loaded), JSON_BOOL(ais->type8.dac200fid10.speed_q), JSON_BOOL(ais->type8.dac200fid10.course_q), JSON_BOOL(ais->type8.dac200fid10.heading_q)); break; case 23: /* EMMA warning */ if (!ais->type8.structured) break; str_appendf(buf, buflen, "\"start\":\"%4u-%02u-%02uT%02u:%02u\"," "\"end\":\"%4u-%02u-%02uT%02u:%02u\",", ais->type8.dac200fid23.start_year + 2000, ais->type8.dac200fid23.start_month, ais->type8.dac200fid23.start_hour, ais->type8.dac200fid23.start_minute, ais->type8.dac200fid23.start_day, ais->type8.dac200fid23.end_year + 2000, ais->type8.dac200fid23.end_month, ais->type8.dac200fid23.end_day, ais->type8.dac200fid23.end_hour, ais->type8.dac200fid23.end_minute); if (scaled) str_appendf(buf, buflen, "\"start_lon\":%.4f,\"start_lat\":%.4f,\"end_lon\":%.4f,\"end_lat\":%.4f,", ais->type8.dac200fid23.start_lon / AIS_LATLON_DIV, ais->type8.dac200fid23.start_lat / AIS_LATLON_DIV, ais->type8.dac200fid23.end_lon / AIS_LATLON_DIV, ais->type8.dac200fid23.end_lat / AIS_LATLON_DIV); else str_appendf(buf, buflen, "\"start_lon\":%d,\"start_lat\":%d,\"end_lon\":%d,\"end_lat\":%d,", ais->type8.dac200fid23.start_lon, ais->type8.dac200fid23.start_lat, ais->type8.dac200fid23.end_lon, ais->type8.dac200fid23.end_lat); str_appendf(buf, buflen, "\"type\":%u,\"type_text\":\"%s\",\"min\":%d,\"max\":%d,\"class\":%u,\"class_text\":\"%s\",\"wind\":%u,\"wind_text\":\"%s\"}\r\n", ais->type8.dac200fid23.type, EMMA_TYPE_DISPLAY(ais->type8.dac200fid23.type), ais->type8.dac200fid23.min, ais->type8.dac200fid23.max, ais->type8.dac200fid23.intensity, EMMA_CLASS_DISPLAY(ais->type8.dac200fid23.intensity), ais->type8.dac200fid23.wind, EMMA_WIND_DISPLAY(ais->type8.dac200fid23.wind)); break; case 24: /* Inland AIS Water Levels */ str_appendf(buf, buflen, "\"country\":\"%s\",\"gauges\":[", ais->type8.dac200fid24.country); for (i = 0; i < ais->type8.dac200fid24.ngauges; i++) { str_appendf(buf, buflen, "{\"id\":%u,\"level\":%d},", ais->type8.dac200fid24.gauges[i].id, ais->type8.dac200fid24.gauges[i].level); } str_rstrip_char(buf, ','); (void)strlcat(buf, "]}\r\n", buflen); break; case 40: /* Inland AIS Signal Strength */ if (scaled) str_appendf(buf, buflen, "\"lon\":%.4f,\"lat\":%.4f,", ais->type8.dac200fid40.lon / AIS_LATLON_DIV, ais->type8.dac200fid40.lat / AIS_LATLON_DIV); else str_appendf(buf, buflen, "\"lon\":%d,\"lat\":%d,", ais->type8.dac200fid40.lon, ais->type8.dac200fid40.lat); str_appendf(buf, buflen, "\"form\":%u,\"facing\":%u,\"direction\":%u,\"direction_text\":\"%s\",\"status\":%u,\"status_text\":\"%s\"}\r\n", ais->type8.dac200fid40.form, ais->type8.dac200fid40.facing, ais->type8.dac200fid40.direction, DIRECTION_DISPLAY(ais->type8.dac200fid40.direction), ais->type8.dac200fid40.status, STATUS_DISPLAY(ais->type8.dac200fid40.status)); break; } } break; case 9: /* Standard SAR Aircraft Position Report */ if (scaled) { char altlegend[20]; char speedlegend[20]; /* * Express altitude as nan if not available, * "high" for above the reporting ceiling. */ if (ais->type9.alt == AIS_ALT_NOT_AVAILABLE) (void)strlcpy(altlegend, "\"nan\"", sizeof(altlegend)); else if (ais->type9.alt == AIS_ALT_HIGH) (void)strlcpy(altlegend, "\"high\"", sizeof(altlegend)); else (void)snprintf(altlegend, sizeof(altlegend), "%u", ais->type9.alt); /* * Express speed as nan if not available, * "high" for above the reporting ceiling. */ if (ais->type9.speed == AIS_SAR_SPEED_NOT_AVAILABLE) (void)strlcpy(speedlegend, "\"nan\"", sizeof(speedlegend)); else if (ais->type9.speed == AIS_SAR_FAST_MOVER) (void)strlcpy(speedlegend, "\"fast\"", sizeof(speedlegend)); else (void)snprintf(speedlegend, sizeof(speedlegend), "%u", ais->type1.speed); str_appendf(buf, buflen, "\"alt\":%s,\"speed\":%s,\"accuracy\":%s," "\"lon\":%.4f,\"lat\":%.4f,\"course\":%.1f," "\"second\":%u,\"regional\":%u,\"dte\":%u," "\"raim\":%s,\"radio\":%u}\r\n", altlegend, speedlegend, JSON_BOOL(ais->type9.accuracy), ais->type9.lon / AIS_LATLON_DIV, ais->type9.lat / AIS_LATLON_DIV, ais->type9.course / 10.0, ais->type9.second, ais->type9.regional, ais->type9.dte, JSON_BOOL(ais->type9.raim), ais->type9.radio); } else { str_appendf(buf, buflen, "\"alt\":%u,\"speed\":%u,\"accuracy\":%s," "\"lon\":%d,\"lat\":%d,\"course\":%u," "\"second\":%u,\"regional\":%u,\"dte\":%u," "\"raim\":%s,\"radio\":%u}\r\n", ais->type9.alt, ais->type9.speed, JSON_BOOL(ais->type9.accuracy), ais->type9.lon, ais->type9.lat, ais->type9.course, ais->type9.second, ais->type9.regional, ais->type9.dte, JSON_BOOL(ais->type9.raim), ais->type9.radio); } break; case 10: /* UTC/Date Inquiry */ str_appendf(buf, buflen, "\"dest_mmsi\":%u}\r\n", ais->type10.dest_mmsi); break; case 12: /* Safety Related Message */ str_appendf(buf, buflen, "\"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 */ str_appendf(buf, buflen, "\"text\":\"%s\"}\r\n", json_stringify(buf1, sizeof(buf1), ais->type14.text)); break; case 15: /* Interrogation */ str_appendf(buf, buflen, "\"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); break; case 16: str_appendf(buf, buflen, "\"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); break; case 17: if (scaled) { str_appendf(buf, buflen, "\"lon\":%.1f,\"lat\":%.1f,\"data\":\"%zd:%s\"}\r\n", ais->type17.lon / AIS_GNSS_LATLON_DIV, ais->type17.lat / AIS_GNSS_LATLON_DIV, ais->type17.bitcount, gpsd_hexdump(scratchbuf, sizeof(scratchbuf), (char *)ais->type17.bitdata, BITS_TO_BYTES(ais->type17.bitcount))); } else { str_appendf(buf, buflen, "\"lon\":%d,\"lat\":%d,\"data\":\"%zd:%s\"}\r\n", ais->type17.lon, ais->type17.lat, ais->type17.bitcount, gpsd_hexdump(scratchbuf, sizeof(scratchbuf), (char *)ais->type17.bitdata, BITS_TO_BYTES(ais->type17.bitcount))); } break; case 18: if (scaled) { str_appendf(buf, buflen, "\"reserved\":%u,\"speed\":%.1f,\"accuracy\":%s," "\"lon\":%.4f,\"lat\":%.4f,\"course\":%.1f," "\"heading\":%u,\"second\":%u,\"regional\":%u," "\"cs\":%s,\"display\":%s,\"dsc\":%s,\"band\":%s," "\"msg22\":%s,\"raim\":%s,\"radio\":%u}\r\n", ais->type18.reserved, ais->type18.speed / 10.0, JSON_BOOL(ais->type18.accuracy), ais->type18.lon / AIS_LATLON_DIV, ais->type18.lat / AIS_LATLON_DIV, ais->type18.course / 10.0, ais->type18.heading, ais->type18.second, ais->type18.regional, JSON_BOOL(ais->type18.cs), JSON_BOOL(ais->type18.display), JSON_BOOL(ais->type18.dsc), JSON_BOOL(ais->type18.band), JSON_BOOL(ais->type18.msg22), JSON_BOOL(ais->type18.raim), ais->type18.radio); } else { str_appendf(buf, buflen, "\"reserved\":%u,\"speed\":%u,\"accuracy\":%s," "\"lon\":%d,\"lat\":%d,\"course\":%u," "\"heading\":%u,\"second\":%u,\"regional\":%u," "\"cs\":%s,\"display\":%s,\"dsc\":%s,\"band\":%s," "\"msg22\":%s,\"raim\":%s,\"radio\":%u}\r\n", ais->type18.reserved, ais->type18.speed, JSON_BOOL(ais->type18.accuracy), ais->type18.lon, ais->type18.lat, ais->type18.course, ais->type18.heading, ais->type18.second, ais->type18.regional, JSON_BOOL(ais->type18.cs), JSON_BOOL(ais->type18.display), JSON_BOOL(ais->type18.dsc), JSON_BOOL(ais->type18.band), JSON_BOOL(ais->type18.msg22), JSON_BOOL(ais->type18.raim), ais->type18.radio); } break; case 19: if (scaled) { str_appendf(buf, buflen, "\"reserved\":%u,\"speed\":%.1f,\"accuracy\":%s," "\"lon\":%.4f,\"lat\":%.4f,\"course\":%.1f," "\"heading\":%u,\"second\":%u,\"regional\":%u," "\"shipname\":\"%s\"," "\"shiptype\":%u,\"shiptype_text\":\"%s\"," "\"to_bow\":%u,\"to_stern\":%u,\"to_port\":%u," "\"to_starboard\":%u," "\"epfd\":%u,\"epfd_text\":\"%s\"," "\"raim\":%s,\"dte\":%u,\"assigned\":%s}\r\n", ais->type19.reserved, ais->type19.speed / 10.0, JSON_BOOL(ais->type19.accuracy), ais->type19.lon / AIS_LATLON_DIV, ais->type19.lat / AIS_LATLON_DIV, ais->type19.course / 10.0, ais->type19.heading, ais->type19.second, ais->type19.regional, json_stringify(buf1, sizeof(buf1), ais->type19.shipname), ais->type19.shiptype, SHIPTYPE_DISPLAY(ais->type19.shiptype), ais->type19.to_bow, ais->type19.to_stern, ais->type19.to_port, ais->type19.to_starboard, ais->type19.epfd, EPFD_DISPLAY(ais->type19.epfd), JSON_BOOL(ais->type19.raim), ais->type19.dte, JSON_BOOL(ais->type19.assigned)); } else { str_appendf(buf, buflen, "\"reserved\":%u,\"speed\":%u,\"accuracy\":%s," "\"lon\":%d,\"lat\":%d,\"course\":%u," "\"heading\":%u,\"second\":%u,\"regional\":%u," "\"shipname\":\"%s\"," "\"shiptype\":%u,\"shiptype_text\":\"%s\"," "\"to_bow\":%u,\"to_stern\":%u,\"to_port\":%u," "\"to_starboard\":%u," "\"epfd\":%u,\"epfd_text\":\"%s\"," "\"raim\":%s,\"dte\":%u,\"assigned\":%s}\r\n", ais->type19.reserved, ais->type19.speed, JSON_BOOL(ais->type19.accuracy), ais->type19.lon, ais->type19.lat, ais->type19.course, ais->type19.heading, ais->type19.second, ais->type19.regional, json_stringify(buf1, sizeof(buf1), ais->type19.shipname), ais->type19.shiptype, SHIPTYPE_DISPLAY(ais->type19.shiptype), ais->type19.to_bow, ais->type19.to_stern, ais->type19.to_port, ais->type19.to_starboard, ais->type19.epfd, EPFD_DISPLAY(ais->type19.epfd), JSON_BOOL(ais->type19.raim), ais->type19.dte, JSON_BOOL(ais->type19.assigned)); } break; case 20: /* Data Link Management Message */ str_appendf(buf, buflen, "\"offset1\":%u,\"number1\":%u," "\"timeout1\":%u,\"increment1\":%u," "\"offset2\":%u,\"number2\":%u," "\"timeout2\":%u,\"increment2\":%u," "\"offset3\":%u,\"number3\":%u," "\"timeout3\":%u,\"increment3\":%u," "\"offset4\":%u,\"number4\":%u," "\"timeout4\":%u,\"increment4\":%u}\r\n", ais->type20.offset1, ais->type20.number1, ais->type20.timeout1, ais->type20.increment1, ais->type20.offset2, ais->type20.number2, ais->type20.timeout2, ais->type20.increment2, ais->type20.offset3, ais->type20.number3, ais->type20.timeout3, ais->type20.increment3, ais->type20.offset4, ais->type20.number4, ais->type20.timeout4, ais->type20.increment4); break; case 21: /* Aid to Navigation */ if (scaled) { str_appendf(buf, buflen, "\"aid_type\":%u,\"aid_type_text\":\"%s\"," "\"name\":\"%s\",\"lon\":%.4f," "\"lat\":%.4f,\"accuracy\":%s,\"to_bow\":%u," "\"to_stern\":%u,\"to_port\":%u,\"to_starboard\":%u," "\"epfd\":%u,\"epfd_text\":\"%s\"," "\"second\":%u,\"regional\":%u," "\"off_position\":%s,\"raim\":%s," "\"virtual_aid\":%s}\r\n", ais->type21.aid_type, NAVAIDTYPE_DISPLAY(ais->type21.aid_type), json_stringify(buf1, sizeof(buf1), ais->type21.name), ais->type21.lon / AIS_LATLON_DIV, ais->type21.lat / AIS_LATLON_DIV, JSON_BOOL(ais->type21.accuracy), ais->type21.to_bow, ais->type21.to_stern, ais->type21.to_port, ais->type21.to_starboard, ais->type21.epfd, EPFD_DISPLAY(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 { str_appendf(buf, buflen, "\"aid_type\":%u,\"aid_type_text\":\"%s\"," "\"name\":\"%s\",\"accuracy\":%s," "\"lon\":%d,\"lat\":%d,\"to_bow\":%u," "\"to_stern\":%u,\"to_port\":%u,\"to_starboard\":%u," "\"epfd\":%u,\"epfd_text\":\"%s\"," "\"second\":%u,\"regional\":%u," "\"off_position\":%s,\"raim\":%s," "\"virtual_aid\":%s}\r\n", ais->type21.aid_type, NAVAIDTYPE_DISPLAY(ais->type21.aid_type), json_stringify(buf1, sizeof(buf1), ais->type21.name), JSON_BOOL(ais->type21.accuracy), ais->type21.lon, ais->type21.lat, ais->type21.to_bow, ais->type21.to_stern, ais->type21.to_port, ais->type21.to_starboard, ais->type21.epfd, EPFD_DISPLAY(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)); } break; case 22: /* Channel Management */ str_appendf(buf, buflen, "\"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)); if (ais->type22.addressed) { str_appendf(buf, buflen, "\"dest1\":%u,\"dest2\":%u,", ais->type22.mmsi.dest1, ais->type22.mmsi.dest2); } else if (scaled) { str_appendf(buf, buflen, "\"ne_lon\":\"%f\",\"ne_lat\":\"%f\"," "\"sw_lon\":\"%f\",\"sw_lat\":\"%f\",", ais->type22.area.ne_lon / AIS_CHANNEL_LATLON_DIV, ais->type22.area.ne_lat / AIS_CHANNEL_LATLON_DIV, ais->type22.area.sw_lon / AIS_CHANNEL_LATLON_DIV, ais->type22.area.sw_lat / AIS_CHANNEL_LATLON_DIV); } else { str_appendf(buf, buflen, "\"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); } str_appendf(buf, buflen, "\"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); break; case 23: /* Group Assignment Command */ if (scaled) { str_appendf(buf, buflen, "\"ne_lon\":\"%f\",\"ne_lat\":\"%f\"," "\"sw_lon\":\"%f\",\"sw_lat\":\"%f\"," "\"stationtype\":%u,\"stationtype_text\":\"%s\"," "\"shiptype\":%u,\"shiptype_text\":\"%s\"," "\"interval\":%u,\"quiet\":%u}\r\n", ais->type23.ne_lon / AIS_CHANNEL_LATLON_DIV, ais->type23.ne_lat / AIS_CHANNEL_LATLON_DIV, ais->type23.sw_lon / AIS_CHANNEL_LATLON_DIV, ais->type23.sw_lat / AIS_CHANNEL_LATLON_DIV, ais->type23.stationtype, STATIONTYPE_DISPLAY(ais->type23.stationtype), ais->type23.shiptype, SHIPTYPE_DISPLAY(ais->type23.shiptype), ais->type23.interval, ais->type23.quiet); } else { str_appendf(buf, buflen, "\"ne_lon\":%d,\"ne_lat\":%d," "\"sw_lon\":%d,\"sw_lat\":%d," "\"stationtype\":%u,\"stationtype_text\":\"%s\"," "\"shiptype\":%u,\"shiptype_text\":\"%s\"," "\"interval\":%u,\"quiet\":%u}\r\n", ais->type23.ne_lon, ais->type23.ne_lat, ais->type23.sw_lon, ais->type23.sw_lat, ais->type23.stationtype, STATIONTYPE_DISPLAY(ais->type23.stationtype), ais->type23.shiptype, SHIPTYPE_DISPLAY(ais->type23.shiptype), ais->type23.interval, ais->type23.quiet); } break; case 24: /* Class B CS Static Data Report */ if (ais->type24.part != both) { static char *partnames[] = {"AB", "A", "B"}; str_appendf(buf, buflen, "\"part\":\"%s\",", json_stringify(buf1, sizeof(buf1), partnames[ais->type24.part])); } if (ais->type24.part != part_b) str_appendf(buf, buflen, "\"shipname\":\"%s\",", json_stringify(buf1, sizeof(buf1), ais->type24.shipname)); if (ais->type24.part != part_a) { str_appendf(buf, buflen, "\"shiptype\":%u,\"shiptype_text\":\"%s\"," "\"vendorid\":\"%s\",\"model\":%u,\"serial\":%u," "\"callsign\":\"%s\",", ais->type24.shiptype, SHIPTYPE_DISPLAY(ais->type24.shiptype), json_stringify(buf1, sizeof(buf1), ais->type24.vendorid), ais->type24.model, ais->type24.serial, json_stringify(buf2, sizeof(buf2), ais->type24.callsign)); if (AIS_AUXILIARY_MMSI(ais->mmsi)) { str_appendf(buf, buflen, "\"mothership_mmsi\":%u", ais->type24.mothership_mmsi); } else { str_appendf(buf, buflen, "\"to_bow\":%u,\"to_stern\":%u," "\"to_port\":%u,\"to_starboard\":%u", ais->type24.dim.to_bow, ais->type24.dim.to_stern, ais->type24.dim.to_port, ais->type24.dim.to_starboard); } } str_rstrip_char(buf, ','); (void)strlcat(buf, "}\r\n", buflen); break; case 25: /* Binary Message, Single Slot */ str_appendf(buf, buflen, "\"addressed\":%s,\"structured\":%s,\"dest_mmsi\":%u," "\"app_id\":%u,\"data\":\"%zd:%s\"}\r\n", JSON_BOOL(ais->type25.addressed), JSON_BOOL(ais->type25.structured), ais->type25.dest_mmsi, ais->type25.app_id, ais->type25.bitcount, gpsd_hexdump(scratchbuf, sizeof(scratchbuf), (char *)ais->type25.bitdata, BITS_TO_BYTES(ais->type25.bitcount))); break; case 26: /* Binary Message, Multiple Slot */ str_appendf(buf, buflen, "\"addressed\":%s,\"structured\":%s,\"dest_mmsi\":%u," "\"app_id\":%u,\"data\":\"%zd:%s\",\"radio\":%u}\r\n", JSON_BOOL(ais->type26.addressed), JSON_BOOL(ais->type26.structured), ais->type26.dest_mmsi, ais->type26.app_id, ais->type26.bitcount, gpsd_hexdump(scratchbuf, sizeof(scratchbuf), (char *)ais->type26.bitdata, BITS_TO_BYTES(ais->type26.bitcount)), ais->type26.radio); break; case 27: /* Long Range AIS Broadcast message */ if (scaled) str_appendf(buf, buflen, "\"status\":\"%s\"," "\"accuracy\":%s,\"lon\":%.1f,\"lat\":%.1f," "\"speed\":%u,\"course\":%u,\"raim\":%s,\"gnss\":%s}\r\n", nav_legends[ais->type27.status], JSON_BOOL(ais->type27.accuracy), ais->type27.lon / AIS_LONGRANGE_LATLON_DIV, ais->type27.lat / AIS_LONGRANGE_LATLON_DIV, ais->type27.speed, ais->type27.course, JSON_BOOL(ais->type27.raim), JSON_BOOL(ais->type27.gnss)); else str_appendf(buf, buflen, "\"status\":%u," "\"accuracy\":%s,\"lon\":%d,\"lat\":%d," "\"speed\":%u,\"course\":%u,\"raim\":%s,\"gnss\":%s}\r\n", ais->type27.status, JSON_BOOL(ais->type27.accuracy), ais->type27.lon, ais->type27.lat, ais->type27.speed, ais->type27.course, JSON_BOOL(ais->type27.raim), JSON_BOOL(ais->type27.gnss)); break; default: str_rstrip_char(buf, ','); (void)strlcat(buf, "}\r\n", buflen); break; } } #endif /* defined(AIVDM_ENABLE) */ #ifdef COMPASS_ENABLE void json_att_dump(const struct gps_data_t *gpsdata, char *reply, size_t replylen) /* dump the contents of an attitude_t structure as JSON */ { assert(replylen > sizeof(char *)); (void)strlcpy(reply, "{\"class\":\"ATT\",", replylen); str_appendf(reply, replylen, "\"device\":\"%s\",", gpsdata->dev.path); if (isnan(gpsdata->attitude.heading) == 0) { str_appendf(reply, replylen, "\"heading\":%.2f,", gpsdata->attitude.heading); if (gpsdata->attitude.mag_st != '\0') str_appendf(reply, replylen, "\"mag_st\":\"%c\",", gpsdata->attitude.mag_st); } if (isnan(gpsdata->attitude.pitch) == 0) { str_appendf(reply, replylen, "\"pitch\":%.2f,", gpsdata->attitude.pitch); if (gpsdata->attitude.pitch_st != '\0') str_appendf(reply, replylen, "\"pitch_st\":\"%c\",", gpsdata->attitude.pitch_st); } if (isnan(gpsdata->attitude.yaw) == 0) { str_appendf(reply, replylen, "\"yaw\":%.2f,", gpsdata->attitude.yaw); if (gpsdata->attitude.yaw_st != '\0') str_appendf(reply, replylen, "\"yaw_st\":\"%c\",", gpsdata->attitude.yaw_st); } if (isnan(gpsdata->attitude.roll) == 0) { str_appendf(reply, replylen, "\"roll\":%.2f,", gpsdata->attitude.roll); if (gpsdata->attitude.roll_st != '\0') str_appendf(reply, replylen, "\"roll_st\":\"%c\",", gpsdata->attitude.roll_st); } if (isnan(gpsdata->attitude.dip) == 0) str_appendf(reply, replylen, "\"dip\":%.3f,", gpsdata->attitude.dip); if (isnan(gpsdata->attitude.mag_len) == 0) str_appendf(reply, replylen, "\"mag_len\":%.3f,", gpsdata->attitude.mag_len); if (isnan(gpsdata->attitude.mag_x) == 0) str_appendf(reply, replylen, "\"mag_x\":%.3f,", gpsdata->attitude.mag_x); if (isnan(gpsdata->attitude.mag_y) == 0) str_appendf(reply, replylen, "\"mag_y\":%.3f,", gpsdata->attitude.mag_y); if (isnan(gpsdata->attitude.mag_z) == 0) str_appendf(reply, replylen, "\"mag_z\":%.3f,", gpsdata->attitude.mag_z); if (isnan(gpsdata->attitude.acc_len) == 0) str_appendf(reply, replylen, "\"acc_len\":%.3f,", gpsdata->attitude.acc_len); if (isnan(gpsdata->attitude.acc_x) == 0) str_appendf(reply, replylen, "\"acc_x\":%.3f,", gpsdata->attitude.acc_x); if (isnan(gpsdata->attitude.acc_y) == 0) str_appendf(reply, replylen, "\"acc_y\":%.3f,", gpsdata->attitude.acc_y); if (isnan(gpsdata->attitude.acc_z) == 0) str_appendf(reply, replylen, "\"acc_z\":%.3f,", gpsdata->attitude.acc_z); if (isnan(gpsdata->attitude.gyro_x) == 0) str_appendf(reply, replylen, "\"gyro_x\":%.3f,", gpsdata->attitude.gyro_x); if (isnan(gpsdata->attitude.gyro_y) == 0) str_appendf(reply, replylen, "\"gyro_y\":%.3f,", gpsdata->attitude.gyro_y); if (isnan(gpsdata->attitude.temp) == 0) str_appendf(reply, replylen, "\"temp\":%.3f,", gpsdata->attitude.temp); if (isnan(gpsdata->attitude.depth) == 0) str_appendf(reply, replylen, "\"depth\":%.3f,", gpsdata->attitude.depth); str_rstrip_char(reply, ','); (void)strlcat(reply, "}\r\n", replylen); } #endif /* COMPASS_ENABLE */ void json_data_report(const gps_mask_t changed, const struct gps_device_t *session, const struct policy_t *policy, char *buf, size_t buflen) /* report a session state in JSON */ { const struct gps_data_t *datap = &session->gpsdata; buf[0] = '\0'; if ((changed & REPORT_IS) != 0) { json_tpv_dump(session, policy, buf+strlen(buf), buflen-strlen(buf)); } if ((changed & GST_SET) != 0) { json_noise_dump(datap, buf+strlen(buf), buflen-strlen(buf)); } if ((changed & SATELLITE_SET) != 0) { json_sky_dump(datap, buf+strlen(buf), buflen-strlen(buf)); } if ((changed & SUBFRAME_SET) != 0) { json_subframe_dump(datap, buf+strlen(buf), buflen-strlen(buf)); } #ifdef COMPASS_ENABLE if ((changed & ATTITUDE_SET) != 0) { json_att_dump(datap, buf+strlen(buf), buflen-strlen(buf)); } #endif /* COMPASS_ENABLE */ #ifdef RTCM104V2_ENABLE if ((changed & RTCM2_SET) != 0) { json_rtcm2_dump(&datap->rtcm2, datap->dev.path, buf+strlen(buf), buflen-strlen(buf)); } #endif /* RTCM104V2_ENABLE */ #ifdef RTCM104V3_ENABLE if ((changed & RTCM3_SET) != 0) { json_rtcm3_dump(&datap->rtcm3, datap->dev.path, buf+strlen(buf), buflen-strlen(buf)); } #endif /* RTCM104V3_ENABLE */ #ifdef AIVDM_ENABLE if ((changed & AIS_SET) != 0) { json_aivdm_dump(&datap->ais, datap->dev.path, policy->scaled, buf+strlen(buf), buflen-strlen(buf)); } #endif /* AIVDM_ENABLE */ } #undef JSON_BOOL #endif /* SOCKET_EXPORT_ENABLE */ /* gpsd_json.c ends here */ gpsd-3.15/gpsd_json.xml0000664000175000017500000021600512513107374013264 0ustar esresr ]> 28 Aug 2011 gpsd_json 5 The GPSD Project GPSD Documentation gpsd_json gpsd request/response protocol OVERVIEW gpsd is a service daemon that can be used to monitor GPSes, DGPS receivers, Marine AIS broadcasts, and various other location-related and kinematic sensors. Clients may communicate with gpsd via textual requests and responses over a socket. It is a bad idea for applications to speak the protocol directly: rather, they should use the libgps client library (for C; bindings also exist for other languages) and take appropriate care to conditionalize their code on the major and minor protocol version symbols. The GPSD protocol is built on top of JSON, JavaScript Object Notation, as specified in RFC 7159: The JavaScript Object Notation (JSON) Data Interchange Format. GPSD's use of JSON is restricted in some ways that make parsing it in fixed-extent languages (such as C) easier. A request line is introduced by "?" and may include multiple commands. Commands begin with a command identifier, followed either by a terminating ';' or by an equal sign "=" and a JSON object treated as an argument. Any ';' or newline indication (either LF or CR-LF) after the end of a command is ignored. All request lines must be composed of US-ASCII characters and may be no more than 80 characters in length, exclusive of the trailing newline. Responses are JSON objects all of which have a "class" attribute the value of which is either the name of the invoking command. There are reports (including but not limited to as "TPV", "SKY", "DEVICE", and "ERROR") which are not direct responses to commands. The order of JSON attributes within a response object is never significant, and you may specify attributes in commands in any order. Responses never contain the special JSON value null; instead, attributes with empty or undefined values are omitted. The length limit for responses and reports is 1536 characters, including trailing newline; longer responses will be truncated, so client code must be prepared for the possibility of invalid JSON fragments. In JSON reports, if an attribute is present only if the parent attribute is present or has a particular range, then the parent attribute is emitted first. There is one constraint on the order in which attributes will be omitted. If an optional attribute is present only when a parent attribute has a specified value or range of values, the parent attribute will be emitted first to make parsing easier. The next subsection section documents the core GPSD protocol. Extensions are documented in the following subsections. The extensions may not be supported in your gpsd instance if it has been compiled with a restricted feature set. CORE SOCKET PROTOCOL Here are the core-protocol responses: TPV A TPV object is a time-position-velocity report. The "class" and "mode" fields will reliably be present. The "mode" field will be emitted before optional fields that may be absent when there is no fix. Error estimates will be emitted after the fix components they're associated with. Others may be reported or not depending on the fix quality. TPV object Name Always? Type Description class Yes string Fixed: "TPV" device No string Name of originating device. mode Yes numeric NMEA mode: %d, 0=no mode value yet seen, 1=no fix, 2=2D, 3=3D. time No string Time/date stamp in ISO8601 format, UTC. May have a fractional part of up to .001sec precision. May be absent if mode is not 2 or 3. ept No numeric Estimated timestamp error (%f, seconds, 95% confidence). Present if time is present. lat No numeric Latitude in degrees: +/- signifies North/South. Present when mode is 2 or 3. lon No numeric Longitude in degrees: +/- signifies East/West. Present when mode is 2 or 3. alt No numeric Altitude in meters. Present if mode is 3. epx No numeric Longitude error estimate in meters, 95% confidence. Present if mode is 2 or 3 and DOPs can be calculated from the satellite view. epy No numeric Latitude error estimate in meters, 95% confidence. Present if mode is 2 or 3 and DOPs can be calculated from the satellite view. epv No numeric Estimated vertical error in meters, 95% confidence. Present if mode is 3 and DOPs can be calculated from the satellite view. track No numeric Course over ground, degrees from true north. speed No numeric Speed over ground, meters per second. climb No numeric Climb (positive) or sink (negative) rate, meters per second. epd No numeric Direction error estimate in degrees, 95% confidence. eps No numeric Speed error estinmate in meters/sec, 95% confidence. epc No numeric Climb/sink error estimate in meters/sec, 95% confidence.
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 actually received; see gps.h for bitmask names and values. Here's an example: {"class":"TPV","device":"/dev/pts/1", "time":"2005-06-08T10:34:48.283Z","ept":0.005, "lat":46.498293369,"lon":7.567411672,"alt":1343.127, "eph":36.000,"epv":32.321, "track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
SKY A SKY object reports a sky view of the GPS satellite positions. If there is no GPS device available, or no skyview has been reported yet, only the "class" field will reliably be present. SKY object Name Always? Type Description class Yes string Fixed: "SKY" device No string Name of originating device time No numeric Time/date stamp in ISO8601 format, UTC. May have a fractional part of up to .001sec precision. xdop No numeric Longitudinal dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate. ydop No numeric Latitudinal dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate. vdop No numeric Altitude dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate. tdop No numeric Time dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate. hdop No numeric Horizontal dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get a circular error estimate. pdop No numeric Spherical dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate. gdop No numeric Hyperspherical dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate. satellites Yes list List of satellite objects in skyview
Many devices compute dilution of precision factors but do not include them in their reports. Many that do report DOPs report only HDOP, two-dimensional circular error. gpsd always passes through whatever the device actually reports, then attempts to fill in other DOPs by calculating the appropriate determinants in a covariance matrix based on the satellite view. DOPs may be missing if some of these determinants are singular. It can even happen that the device reports an error estimate in meters when the corresponding DOP is unavailable; some devices use more sophisticated error modeling than the covariance calculation. The satellite list objects have the following elements: Satellite object Name Always? Type Description PRN Yes numeric PRN ID of the satellite. 1-63 are GNSS satellites, 64-96 are GLONASS satellites, 100-164 are SBAS satellites az Yes numeric Azimuth, degrees from true north. el Yes numeric Elevation in degrees. ss Yes numeric Signal strength in dB. used Yes boolean Used in current solution? (SBAS/WAAS/EGNOS satellites may be flagged used if the solution has corrections from them, but not all drivers make this information available.)
Note that satellite objects do not have a "class" field, as they are never shipped outside of a SKY object. When the C client library parses a SKY response, it will assert the SATELLITE_SET bit in the top-level set member. Here's an example: {"class":"SKY","device":"/dev/pts/1", "time":"2005-07-08T11:28:07.114Z", "xdop":1.55,"hdop":1.24,"pdop":1.99, "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}]}
GST A GST object is a pseudorange noise report. GST object Name Always? Type Description class Yes string Fixed: "GST" device No string Name of originating device time No numeric Seconds since the Unix epoch, UTC. May have a fractional part of up to .001sec precision. rms No numeric Value of the standard deviation of the range inputs to the navigation process (range inputs include pseudoranges and DGPS corrections). major No numeric Standard deviation of semi-major axis of error ellipse, in meters. minor No numeric Standard deviation of semi-minor axis of error ellipse, in meters. orient No numeric Orientation of semi-major axis of error ellipse, in degrees from true north. lat No numeric Standard deviation of latitude error, in meters. lon No numeric Standard deviation of longitude error, in meters. alt No numeric Standard deviation of altitude error, in meters.
Here's an example: {"class":"GST","device":"/dev/ttyUSB0", "time":"2010-12-07T10:23:07.096Z","rms":2.440, "major":1.660,"minor":1.120,"orient":68.989, "lat":1.600,"lon":1.200,"alt":2.520}
ATT 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. The "class" and "mode" fields will reliably be present. Others may be reported or not depending on the specific device type. ATT object Name Always? Type Description class Yes string Fixed: "ATT" device Yes string Name of originating device time Yes numeric Seconds since the Unix epoch, UTC. May have a fractional part of up to .001sec precision. heading No numeric Heading, degrees from true north. mag_st No string Magnetometer status. pitch No numeric Pitch in degrees. pitch_st No string Pitch sensor status. yaw No numeric Yaw in degrees yaw_st No string Yaw sensor status. roll No numeric Roll in degrees. roll_st No string Roll sensor status. dip No numeric Local magnetic inclination, degrees, positive when the magnetic field points downward (into the Earth). mag_len No numeric Scalar magnetic field strength. mag_x No numeric X component of magnetic field strength. mag_y No numeric Y component of magnetic field strength. mag_z No numeric Z component of magnetic field strength. acc_len No numeric Scalar acceleration. acc_x No numeric X component of acceleration. acc_y No numeric Y component of acceleration. acc_z No numeric Z component of acceleration. gyro_x No numeric X component of acceleration. gyro_y No numeric Y component of acceleration. depth No numeric Water depth in meters. temperature No numeric Temperature at sensor, degrees centigrade.
The heading, pitch, and roll status codes (if present) vary by device. For the TNT Revolution digital compasses, they are coded as follows: Device flags Code Description C magnetometer calibration alarm L low alarm M low warning N normal O high warning P high alarm V magnetometer voltage level alarm
When the C client library parses a response of this kind, it will assert ATT_IS. Here's an example: {"class":"ATT","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}
And here are the commands: ?VERSION; Returns an object with the following attributes: VERSION object Name Always? Type Description class Yes string Fixed: "VERSION" release Yes string Public release level rev Yes string Internal revision-control level. proto_major Yes numeric API major revision level. proto_minor Yes numeric API minor revision level. remote No string URL of the remote daemon reporting this version. If empty, this is the version of the local daemon.
The daemon ships a VERSION response to each client when the client first connects to it. When the C client library parses a response of this kind, it will assert the VERSION_SET bit in the top-level set member. Here's an example: {"class":"VERSION","version":"2.40dev", "rev":"06f62e14eae9886cde907dae61c124c53eb1101f", "proto_major":3,"proto_minor":1 }
?DEVICES; Returns a device list object with the following elements: DEVICES object Name Always? Type Description class Yes string Fixed: "DEVICES" devices Yes list List of device descriptions remote No string URL of the remote daemon reporting the device set. If empty, this is a DEVICES response from the local daemon.
When the C client library parses a response of this kind, it will assert the DEVICELIST_SET bit in the top-level set member. Here's an example: {"class"="DEVICES","devices":[ {"class":"DEVICE","path":"/dev/pts/1","flags":1,"driver":"SiRF binary"}, {"class":"DEVICE","path":"/dev/pts/3","flags":4,"driver":"AIVDM"}]} The daemon occasionally ships a bare DEVICE object to the client (that is, one not inside a DEVICES wrapper). The data content of these objects will be described later as a response to the ?DEVICE command.
?WATCH; This command sets watcher mode. It also sets or elicits a report of per-subscriber policy and the raw bit. An argument WATCH object changes the subscriber's policy. The response describes the subscriber's policy. The response will also include a DEVICES object. A WATCH object has the following elements: WATCH object Name Always? Type Description class Yes string Fixed: "WATCH" enable No boolean Enable (true) or disable (false) watcher mode. Default is true. json No boolean Enable (true) or disable (false) dumping of JSON reports. Default is false. nmea No boolean Enable (true) or disable (false) dumping of binary packets as pseudo-NMEA. Default is false. raw No integer Controls 'raw' mode. When this attribute is set to 1 for a channel, gpsd reports the unprocessed NMEA or AIVDM data stream from whatever device is attached. Binary GPS packets are hex-dumped. RTCM2 and RTCM3 packets are not dumped in raw mode. When this attribute is set to 2 for a channel that processes binary data, gpsd reports the received data verbatim without hex-dumping. scaled No boolean If true, apply scaling divisors to output before dumping; default is false. split24 No boolean If true, aggregate AIS type24 sentence parts. If false, report each part as a separate JSON object, leaving the client to match MMSIs and aggregate. Default is false. Applies only to AIS reports. pps No boolean If true, emit the TOFF JSON message on each cycle and a PPS JSON message when the device issues 1PPS. Default is false. device No string If present, enable watching only of the specified device rather than all devices. Useful with raw and NMEA modes in which device responses aren't tagged. Has no effect when used with enable:false. remote No string URL of the remote daemon reporting the watch set. If empty, this is a WATCH response from the local daemon.
There is an additional boolean "timing" attribute which is undocumented because that portion of the interface is considered unstable and for developer use only. In watcher mode, GPS reports are dumped as TPV and SKY responses. AIS, Subframe and RTCM reporting is described in the next section. When the C client library parses a response of this kind, it will assert the POLICY_SET bit in the top-level set member. Here's an example: {"class":"WATCH", "raw":1,"scaled":true}
?POLL; The POLL command requests data from the last-seen fixes on all active GPS devices. Devices must previously have been activated by ?WATCH to be pollable. Polling can lead to possibly surprising results when it is used on a device such as an NMEA GPS for which a complete fix has to be accumulated from several sentences. If you poll while those sentences are being emitted, the response will contain the last complete fix data and may be as much as one cycle time (typically 1 second) stale. The POLL response will contain a timestamped list of TPV objects describing cached data, and a timestamped list of SKY objects describing satellite configuration. If a device has not seen fixes, it will be reported with a mode field of zero. POLL object Name Always? Type Description class Yes string Fixed: "POLL" time Yes Numeric Timestamp in ISO 8601 format. May have a fractional part of up to .001sec precision. active Yes Numeric Count of active devices. fixes Yes JSON array Comma-separated list of TPV objects. skyviews Yes JSON array Comma-separated list of SKY objects.
Here's an example of a POLL response: {"class":"POLL","time":"2010-06-04T10:31:00.289Z","active":1, "tpv":[{"class":"TPV","device":"/dev/ttyUSB0", "time":"2010-09-08T13:33:06.095Z", "ept":0.005,"lat":40.035093060, "lon":-75.519748733,"track":99.4319,"speed":0.123,"mode":2}], "sky":[{"class":"SKY","device":"/dev/ttyUSB0", "time":1270517264.240,"hdop":9.20, "satellites":[{"PRN":16,"el":55,"az":42,"ss":36,"used":true}, {"PRN":19,"el":25,"az":177,"ss":0,"used":false}, {"PRN":7,"el":13,"az":295,"ss":0,"used":false}, {"PRN":6,"el":56,"az":135,"ss":32,"used":true}, {"PRN":13,"el":47,"az":304,"ss":0,"used":false}, {"PRN":23,"el":66,"az":259,"ss":0,"used":false}, {"PRN":20,"el":7,"az":226,"ss":0,"used":false}, {"PRN":3,"el":52,"az":163,"ss":32,"used":true}, {"PRN":31,"el":16,"az":102,"ss":0,"used":false} ]}]} Client software should not assume the field inventory of the POLL response is fixed for all time. As gpsd collects and caches more data from more sensor types, those data are likely to find their way into this response.
TOFF This message is emitted on each cycle and reports the offset between the host's clock time and the GPS time at top of second (actually, when the first data for the reporting cycle is received). This message exactly mirrors the PPS message except for two details. TOFF emits no NTP precision, this is assumed to be -2. See the NTP documentation for their definition of precision. The TOFF message reports the GPS time as derived from the GPS serial data stream. The PPS message reports the GPS time as derived from the GPS PPS pulse. A TOFF object has the following elements: TOFF object Name Always? Type Description class Yes string Fixed: "TOFF" device Yes string Name of originating device real_sec Yes numeric seconds from the GPS clock real_nsec Yes numeric nanoseconds from the GPS clock clock_sec Yes numeric seconds from the system clock clock_nsec Yes numeric nanoseconds from the system clock
This message is emitted once per second to watchers of a device and is intended to report the time stamps of the in-band report of the GPS and seconds as reported by the system clock (which may be NTP-corrected) when the first valid timestamp of the reporting cycle was seen. The message contains two second/nanosecond pairs: real_sec and real_nsec contain the time the GPS thinks it was at the start of the current cycle; clock_sec and clock_nsec contain the time the system clock thinks it was on receipt of the first timing message of the cycle. real_nsec is always to nanosecond precision. clock_nsec is nanosecond precision on most systems. Here's an example: {"class":"TOFF","device":"/dev/ttyUSB0", "real_sec":1330212592, "real_nsec":343182, "clock_sec":1330212592,"clock_nsec":343184, "precision":-2}}
PPS This message is emitted each time the daemon sees a valid PPS (Pulse Per Second) strobe from a device. This message exactly mirrors the PPS message except for two details. PPS emits the NTP precision. See the NTP documentation for their definition of precision. The TOFF message reports the GPS time as derived from the GPS serial data stream. The PPS message reports the GPS time as derived from the GPS PPS pulse. There are various sources of error in the reported clock times. The speed of the serial connection between the GPS and the system adds a delay to start of cycle detection. An even bigger error is added by the variable computation time inside the GPS. Taken together the time derived from the start of the GPS cycle can have offsets of 10 millisecond to 700 milliseconds and combined jjitter and wander of 100 to 300 millisecond. A PPS object has the following elements: PPS object Name Always? Type Description class Yes string Fixed: "PPS" device Yes string Name of originating device real_sec Yes numeric seconds from the PPS source real_nsec Yes numeric nanoseconds from the PPS source clock_sec Yes numeric seconds from the system clock clock_nsec Yes numeric nanoseconds from the system clock precision Yes numeric NTP style estimate of PPS precision
This message is emitted once per second to watchers of a device emitting PPS, and reports the time of the start of the GPS second (when the 1PPS arrives) and seconds as reported by the system clock (which may be NTP-corrected) at that moment. The message contains two second/nanosecond pairs: real_sec and real_nsec contain the time the GPS thinks it was at the PPS edge; clock_sec and clock_nsec contain the time the system clock thinks it was at the PPS edge. real_nsec is always to nanosecond precision. clock_nsec is nanosecond precision on most systems. There are various sources of error in the reported clock times. For PPS delivered via a real serial-line strobe, serial-interrupt latency plus processing time to the timer call should be bounded above by about 10 microseconds; that can be reduced to less than 1 microsecond if your kernel supports RFC 2783. USB1.1-to-serial control-line emulation is limited to about 1 millisecond. seconds. Here's an example: {"class":"PPS","device":"/dev/ttyUSB0", "real_sec":1330212592, "real_nsec":343182, "clock_sec":1330212592,"clock_nsec":343184, "precision":-3}
?DEVICE This command reports (when followed by ';') the state of a device, or sets (when followed by '=' and a DEVICE object) device-specific control bits, notably the device's speed and serial mode and the native-mode bit. The parameter-setting form will be rejected if more than one client is attached to the channel. Pay attention to the response, because it is possible for this command to fail if the GPS does not support a speed-switching command or only supports some combinations of serial modes. In case of failure, the daemon and GPS will continue to communicate at the old speed. Use the parameter-setting form with caution. On USB and Bluetooth GPSes it is also possible for serial mode setting to fail either because the serial adaptor chip does not support non-8N1 modes or because the device firmware does not properly synchronize the serial adaptor chip with the UART on the GPS chipset when the speed changes. These failures can hang your device, possibly requiring a GPS power cycle or (in extreme cases) physically disconnecting the NVRAM backup battery. A DEVICE object has the following elements: DEVICE object Name Always? Type Description class Yes string Fixed: "DEVICE" path No string Name the device for which the control bits are being reported, or for which they are to be applied. This attribute may be omitted only when there is exactly one subscribed channel. activated No string Time the device was activated as an ISO8601 timestamp. If the device is inactive this attribute is absent. flags No integer Bit vector of property flags. Currently defined flags are: describe packet types seen so far (GPS, RTCM2, RTCM3, AIS). Won't be reported if empty, e.g. before gpsd has seen identifiable packets from the device. driver No string GPSD's name for the device driver type. Won't be reported before gpsd has seen identifiable packets from the device. subtype When the daemon sees a delayed response to a probe for subtype or firmware-version information. string Whatever version information the device returned. bps No integer Device speed in bits per second. parity Yes string N, O or E for no parity, odd, or even. stopbits Yes string Stop bits (1 or 2). native No integer 0 means NMEA mode and 1 means alternate mode (binary if it has one, for SiRF and Evermore chipsets in particular). Attempting to set this mode on a non-GPS device will yield an error. cycle No real Device cycle time in seconds. mincycle No real Device minimum cycle time in seconds. Reported from ?DEVICE when (and only when) the rate is switchable. It is read-only and not settable.
The serial parameters will be omitted in a response describing a TCP/IP source such as an Ntrip, DGPSIP, or AIS feed. The contents of the flags field should be interpreted as follows: Device flags C #define Value Description SEEN_GPS 0x01 GPS data has been seen on this device SEEN_RTCM2 0x02 RTCM2 data has been seen on this device SEEN_RTCM3 0x04 RTCM3 data has been seen on this device SEEN_AIS 0x08 AIS data has been seen on this device
When the C client library parses a response of this kind, it will assert the DEVICE_SET bit in the top-level set member. Here's an example: {"class":"DEVICE","bps":4800,"parity":"N","stopbits":1,"native":0}
When a client is in watcher mode, the daemon will ship it DEVICE notifications when a device is added to the pool or deactivated. When the C client library parses a response of this kind, it will assert the DEVICE_SET bit in the top-level set member. Here's an example: {"class":"DEVICE","path":"/dev/pts1","activated":0} The daemon may ship an error object in response to a syntactically invalid command line or unknown command. It has the following elements: ERROR notification object Name Always? Type Description class Yes string Fixed: "ERROR" message Yes string Textual error message
Here's an example: {"class":"ERROR","message":"Unrecognized request '?FOO'"} When the C client library parses a response of this kind, it will assert the ERR_SET bit in the top-level set member.
RTCM2 RTCM-104 is a family of serial protocols used for broadcasting pseudorange corrections from differential-GPS reference stations. Many GPS receivers can accept these corrections to improve their reporting accuracy. RTCM-104 comes in two major and incompatible flavors, 2.x and 3.x. Each major flavor has minor (compatible) revisions. The applicable standard for RTCM Version 2.x is RTCM Recommended Standards for Differential NAVSTAR GPS Service RTCM Paper 194-93/SC 104-STD. For RTCM 3.1 it is RTCM Paper 177-2006-SC104-STD. Ordering instructions for both standards are accessible from the website of the Radio Technical Commission for Maritime Services under "Publications". RTCM WIRE TRANSMISSIONS Differential-GPS correction stations consist of a GPS reference receiver coupled to a low frequency (LF) transmitter. The GPS reference receiver is a survey-grade GPS that does GPS carrier tracking and can work out its own position to a few millimeters. It generates range and range-rate corrections and encodes them into RTCM104. It ships the RTCM104 to the LF transmitter over serial rs-232 signal at 100 baud or 200 baud depending on the requirements of the transmitter. The LF transmitter broadcasts the approximately 300khz radio signal that differential-GPS radio receivers pick up. Transmitters that are meant to have a higher range will need to transmit at the slower rate. The higher the data rate the harder it will be for the remote radio receiver to receive with a good signal-to-noise ration. (Higher data rate signals can't be averaged over as long a time frame, hence they appear noisier.) RTCM WIRE FORMATS An RTCM 2.x message consists of a sequence of up to 33 30-bit words. The 24 most significant bits of each word are data and the six least significant bits are parity. The parity algorithm used is the same ISGPS-2000 as that used on GPS satellite downlinks. Each RTCM 2.x message consists of two header words followed by zero or more data words, depending upon message type. An RTCM 3.x message begins with a fixed leader byte 0xD3. That is followed by six bits of version information and 10 bits of payload length information. Following that is the payload; following the payload is a 3-byte checksum of the payload using the Qualcomm CRC-24Q algorithm. RTCM2 JSON FORMAT Each RTCM2 message is dumped as a single JSON object per message, with the message fields as attributes of that object. Arrays of satellite, station, and constellation statistics become arrays of JSON sub-objects. Each sentence will normally also have a "device" field containing the pathname of the originating device. All attributes other than the device field are mandatory. Header attributes are emitted before others. Header portion SKY object Name Type Description class string Fixed: "RTCM2". type integer Message type (1-9). station_id integer The id of the GPS reference receiver. The LF transmitters also have (different) id numbers. zcount real The reference time of the corrections in the message in seconds within the current hour. Note that it is in GPS time, which is some seconds ahead of UTC (see the U.S. Naval Observatory's table of leap second corrections). seqnum integer Sequence number. Only 3 bits wide, wraps after 7. length integer The number of words after the header that comprise the message. station_health integer Station transmission status. Indicates the health of the beacon as a reference source. Any nonzero value means the satellite is probably transmitting bad data and should not be used in a fix. 6 means the transmission is unmonitored. 7 means the station is not working properly. Other values are defined by the beacon operator.
<message type> is one of 1 full corrections - one message containing corrections for all GPS satellites in view. This is not common. 3 reference station parameters - the position of the reference station GPS antenna. 4 datum — the datum to which the DGPS data is referred. 5 constellation health — information about the satellites the beacon can see. 6 null message — just a filler. 7 radio beacon almanac — information about this or other beacons. 9 subset corrections — a message containing corrections for only a subset of the GPS satellites in view. 16 special message — a text message from the beacon operator. 31 GLONASS subset corrections — a message containing corrections for a set of the GLONASS satellites in view.
Type 1 and 9: Correction data One or more satellite objects follow the header for type 1 or type 9 messages. Here is the format: Satellite object Name Type Description ident integer The PRN number of the satellite for which this is correction data. udre integer User Differential Range Error (0-3). See the table following for values. iod integer Issue Of Data, matching the IOD for the current ephemeris of this satellite, as transmitted by the satellite. The IOD is a unique tag that identifies the ephemeris; the GPS using the DGPS correction and the DGPS generating the data must use the same orbital positions for the satellite. prc real The pseudorange error in meters for this satellite as measured by the beacon reference receiver at the epoch indicated by the z_count in the parent record. rrc real The rate of change of pseudorange error in meters/sec for this satellite as measured by the beacon reference receiver at the epoch indicated by the z_count field in the parent record. This is used to calculate pseudorange errors at other epochs, if required by the GPS receiver.
User Differential Range Error values are as follows: UDRE values 01-sigma error <= 1m11-sigma error <= 4m21-sigma error <= 8m31-sigma error > 8m
Here's an example: {"class":"RTCM2","type":1, "station_id":688,"zcount":843.0,"seqnum":5,"length":19,"station_health":6, "satellites":[ {"ident":10,"udre":0,"iod":46,"prc":-2.400,"rrc":0.000}, {"ident":13,"udre":0,"iod":94,"prc":-4.420,"rrc":0.000}, {"ident":7,"udre":0,"iod":22,"prc":-5.160,"rrc":0.002}, {"ident":2,"udre":0,"iod":34,"prc":-6.480,"rrc":0.000}, {"ident":4,"udre":0,"iod":47,"prc":-8.860,"rrc":0.000}, {"ident":8,"udre":0,"iod":76,"prc":-7.980,"rrc":0.002}, {"ident":5,"udre":0,"iod":99,"prc":-8.260,"rrc":0.002}, {"ident":23,"udre":0,"iod":81,"prc":-8.060,"rrc":0.000}, {"ident":16,"udre":0,"iod":70,"prc":-11.740,"rrc":0.000}, {"ident":30,"udre":0,"iod":4,"prc":-18.960,"rrc":-0.006}, {"ident":29,"udre":0,"iod":101,"prc":-24.960,"rrc":-0.002} ]}
Type 3: Reference Station Parameters Here are the payload members of a type 3 (Reference Station Parameters) message: Reference Station Parameters Name Type Description x real ECEF X coordinate. y real ECEF Y coordinate. z real ECEF Z coordinate.
The coordinates are the position of the station, in meters to two decimal places, in Earth Centred Earth Fixed coordinates. These are usually referred to the WGS84 reference frame, but may be referred to NAD83 in the US (essentially identical to WGS84 for all except geodesists), or to some other reference frame in other parts of the world. An invalid reference message is represented by a type 3 header without payload fields. Here's an example: {"class":"RTCM2","type":3, "station_id":652,"zcount":1657.2,"seqnum":2,"length":4,"station_health":6, "x":3878620.92,"y":670281.40,"z":5002093.59 }
Type 4: Datum Here are the payload members of a type 4 (Datum) message: Datum Name Type Description dgnss_type string Either "GPS", "GLONASS", "GALILEO", or "UNKNOWN". dat integer 0 or 1 and indicates the sense of the offset shift given by dx, dy, dz. dat = 0 means that the station coordinates (in the reference message) are referred to a local datum and that adding dx, dy, dz to that position will render it in GNSS coordinates (WGS84 for GPS). If dat = 1 then the ref station position is in GNSS coordinates and adding dx, dy, dz will give it referred to the local datum. datum_name string A standard name for the datum. dx real X offset. dy real Y offset. dz real Z offset.
<dx> <dy> <dz> are offsets to convert from local datum to GNSS datum or vice versa. These fields are optional. An invalid datum message is represented by a type 4 header without payload fields.
Type 5: Constellation Health One or more of these follow the header for type 5 messages — one for each satellite. Here is the format: Constellation health Name Type Description ident integer The PRN number of the satellite. iodl bool True indicates that this information relates to the satellite information in an accompanying type 1 or type 9 message. health integer 0 indicates that the satellite is healthy. Any other value indicates a problem (coding is not known). snr integer The carrier/noise ratio of the received signal in the range 25 to 55 dB(Hz). health_en bool If set to True it indicates that the satellite is healthy even if the satellite navigation data says it is unhealthy. new_data bool True indicates that the IOD for this satellite will soon be updated in type 1 or 9 messages. los_warning bool Line-of-sight warning. True indicates that the satellite will shortly go unhealthy. tou integer Healthy time remaining in seconds.
Type 6: Null This just indicates a null message. There are no payload fields. Unknown message This format is used to dump message words in hexadecimal when the message type field doesn't match any of the known ones. Here is the format: Unknown Message Name Type Description data list A list of strings.
Each string in the array is a hex literal representing 30 bits of information, after parity checks and inversion. The high two bits should be ignored.
Type 7: Radio Beacon Almanac Here is the format: Contellation health Name Type Description lat real Latitude in degrees, of the LF transmitter antenna for the station for which this is an almanac. North is positive. lon real Longitude in degrees, of the LF transmitter antenna for the station for which this is an almanac. East is positive. range integer Published range of the station in km. frequency real Station broadcast frequency in kHz. health integer <health> is the health of the station for which this is an almanac. If it is non-zero, the station is issuing suspect data and should not be used for fixes. The ITU and RTCM104 standards differ about the mode detailed interpretation of the <health> field and even about its bit width. station_id integer The id of the transmitter. This is not the same as the reference id in the header, the latter being the id of the reference receiver. bitrate integer The transmitted bitrate.
Here's an example: {"class":"RTCM2","type":9,"station_id":268,"zcount":252.6, "seqnum":4,"length":5,"station_health":0, "satellites":[ {"ident":13,"udre":0,"iod":3,"prc":-25.940,"rrc":0.066}, {"ident":2,"udre":0,"iod":73,"prc":0.920,"rrc":-0.080}, {"ident":8,"udre":0,"iod":22,"prc":23.820,"rrc":0.014} ]}
Type 13: GPS Time of Week Here are the payload members of a type 13 (Groumf Tramitter Parameters) message: Grund Transmitter Parameters Name Type Description status bool If True, signals user to expect a type 16 explanatory message associated with this station. Probably indicates some sort of unusual event. rangeflag bool If True, indicates that the estimated range is different from that found in the Type 7 message (which contains the beacon's listed range). Generally indicates a range reduction due to causes such as poor ionospheric conditions or reduced transmission power. lat real Degrees latitude, signed. Positive is N, negative is S. lon real Degrees longitude, signed. Positive is E, negative is W. range integer Transmission range in km (1-1024).
This message type replaces message type 3 (Reference Station Parameters) in RTCM 2.3.
Type 14: GPS Time of Week Here are the payload members of a type 14 (GPS Time of Week) message: Reference Station Parameters Name Type Description week integer GPS week (0-123). hour integer Hour of week (0-167). leapsecs integer Leap Seconds (0-63).
Here's an example: {"class":"RTCM2","type":14,"station_id":652,"zcount":1657.2, "seqnum":3,"length":1,"station_health":6,"week":601,"hour":109, "leapsecs":15}
Type 16: Special Message Special Message Name Type Description message string A text message sent by the beacon operator.
Type 31: Correction data One or more GLONASS satellite objects follow the header for type 1 or type 9 messages. Here is the format: Satellite object Name Type Description ident integer The PRN number of the satellite for which this is correction data. udre integer User Differential Range Error (0-3). See the table following for values. change boolean Change-of-ephemeris bit. tod uinteger Count of 30-second periods since the top of the hour. prc real The pseudorange error in meters for this satellite as measured by the beacon reference receiver at the epoch indicated by the z_count in the parent record. rrc real The rate of change of pseudorange error in meters/sec for this satellite as measured by the beacon reference receiver at the epoch indicated by the z_count field in the parent record. This is used to calculate pseudorange errors at other epochs, if required by the GPS receiver.
Here's an example: {"class":"RTCM2","type":31,"station_id":652,"zcount":1642.2, "seqnum":0,"length":14,"station_health":6, "satellites":[ {"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000}, {"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002}, {"ident":14,"udre":0,"change":false,"tod":0,"prc":141.520,"rrc":0.000}, {"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000}, {"ident":21,"udre":0,"change":false,"tod":0,"prc":128.780,"rrc":0.000}, {"ident":22,"udre":0,"change":false,"tod":0,"prc":125.260,"rrc":0.002}, {"ident":20,"udre":0,"change":false,"tod":0,"prc":117.280,"rrc":-0.004}, {"ident":16,"udre":0,"change":false,"tod":17,"prc":113.460,"rrc":0.018} ]}
RTCM3 DUMP FORMAT The support for RTCM104v3 dumping is incomplete and buggy. Do not attempt to use it for production! Anyone interested in it should read the source code. AIS DUMP FORMATS AIS support is an extension. It may not be present if your instance of gpsd has been built with a restricted feature set. AIS packets are dumped as JSON objects with class "AIS". Each AIS report object contains a "type" field giving the AIS message type and a "scaled" field telling whether the remainder of the fields are dumped in scaled or unscaled form. (These will be emitted before any type-specific fields.) It will also contain a "device" field naming the data source. Other fields have names and types as specified in the AIVDM/AIVDO Protocol Decoding document on the GPSD project website; each message field table may be directly interpreted as a specification for the members of the corresponding JSON object type. By default, certain scaling and conversion operations are performed for JSON output. Latitudes and longitudes are scaled to decimal degrees rather than the native AIS unit of 1/10000th of a minute of arc. Ship (but not air) speeds are scaled to knots rather than tenth-of-knot units. Rate of turn may appear as "nan" if is unavailable, or as one of the strings "fastright" or "fastleft" if it is out of the AIS encoding range; otherwise it is quadratically mapped back to the turn sensor number in degrees per minute. Vessel draughts are converted to decimal meters rather than native AIS decimeters. Various other scaling conversions are described in "AIVDM/AIVDO Protocol Decoding". SUBFRAME DUMP FORMATS Subframe support is always compiled into gpsd but many GPSes do not output subframe data or the gpsd driver may not support subframes. Subframe packets are dumped as JSON objects with class "SUBFRAME". Each subframe report object contains a "frame" field giving the subframe number, a "tSV" field for the transmitting satellite number, a "TOW17" field containing the 17 MSBs of the start of the next 12-second message and a "scaled" field telling whether the remainder of the fields are dumped in scaled or unscaled form. It will also contain a "device" field naming the data source. Each SUBFRAME object will have a sub-object specific to that subframe page type. Those sub-object fields have names and types similar to those specified in the IS-GPS-200E document; each message field table may be directly interpreted as a specification for the members of the corresponding JSON object type. SEE ALSO gpsd8, libgps3, AUTHOR The protocol was designed and documented by Eric S. Raymond.
gpsd-3.15/gpsdclient.c0000664000175000017500000002225512506327657013070 0ustar esresr/* * gpsdclient.c -- support functions for GPSD clients * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include /* for strcasecmp() */ #include /* for time_t */ #include #include #include "gpsd_config.h" #include "gps.h" #include "gpsdclient.h" static struct exportmethod_t exportmethods[] = { #if defined(DBUS_EXPORT_ENABLE) {"dbus", GPSD_DBUS_EXPORT, "DBUS broadcast"}, #endif /* defined(DBUS_EXPORT_ENABLE) */ #ifdef SHM_EXPORT_ENABLE {"shm", GPSD_SHARED_MEMORY, "shared memory"}, #endif /* SOCKET_EXPORT_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE {"sockets", NULL, "JSON via sockets"}, #endif /* SOCKET_EXPORT_ENABLE */ }; /* convert double degrees to a static string and return a pointer to it * * deg_str_type: * deg_dd : return DD.dddddd * deg_ddmm : return DD MM.mmmm' * deg_ddmmss : return DD MM' SS.sss" * */ 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", sizeof(str)); return str; } fmin = modf(f, &fdeg); deg = (int)fdeg; frac_deg = (long)(fmin * 1000000); if (deg_dd == type) { /* DD.dddddd */ (void)snprintf(str, sizeof(str), "%3d.%06ld", deg, frac_deg); return str; } fsec = modf(fmin * 60, &fmin); min = (int)fmin; sec = (int)(fsec * 10000.0); if (deg_ddmm == type) { /* DD MM.mmmm */ (void)snprintf(str, sizeof(str), "%3d %02d.%04d'", deg, min, sec); return str; } /* else DD MM SS.sss */ 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); return str; } /* * check the environment to determine proper GPS units * * clients should only call this if no user preference is specified on * the command line or via X resources. * * return imperial - Use miles/feet * nautical - Use knots/feet * metric - Use km/meters * unspecified - use compiled default * * In order check these environment vars: * GPSD_UNITS one of: * imperial = miles/feet * nautical = knots/feet * metric = km/meters * LC_MEASUREMENT * en_US = miles/feet * C = miles/feet * POSIX = miles/feet * [other] = km/meters * LANG * en_US = miles/feet * C = miles/feet * POSIX = miles/feet * [other] = km/meters * * if none found then return compiled in default */ enum unit gpsd_units(void) { char *envu = NULL; 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("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; } void gpsd_source_spec(const char *arg, struct fixsource_t *source) /* standard parsing of a GPS data source spec */ { /* the casts attempt to head off a -Wwrite-strings warning */ source->server = (char *)"localhost"; source->port = (char *)DEFAULT_GPSD_PORT; source->device = NULL; if (arg != NULL) { char *colon1, *skipto, *rbrk; source->spec = strdup(arg); assert(source->spec != NULL); skipto = source->spec; if (*skipto == '[' && (rbrk = strchr(skipto, ']')) != NULL) { skipto = rbrk; } colon1 = strchr(skipto, ':'); if (colon1 != NULL) { char *colon2; *colon1 = '\0'; if (colon1 != source->spec) { source->server = source->spec; } source->port = colon1 + 1; colon2 = strchr(source->port, ':'); if (colon2 != NULL) { *colon2 = '\0'; source->device = colon2 + 1; } } else if (strchr(source->spec, '/') != NULL) { source->device = source->spec; } else { source->server = source->spec; } } if (*source->server == '[') { char *rbrk = strchr(source->server, ']'); ++source->server; if (rbrk != NULL) *rbrk = '\0'; } } char *maidenhead(double n, double e) /* lat/lon to Maidenhead */ { /* * Specification at * http://en.wikipedia.org/wiki/Maidenhead_Locator_System * * There's a fair amount of slop in how Maidenhead converters operate * that can make it look like this one is wrong. * * 1. Many return caps for paces 5 and 6 when according to the spwec * they should return smalls. * * 2. Some converters, including QGrid from which this code was originally * derived, add an 0.5 offset to the divided e and n just before it * is cast to integer and used for places 5 and 6. This appears to be * intended as a round-to-nearest hack (as opposed to the implicit * round down from the cast). If I'm reading the spec right it * is not correct to do this. */ static char buf[7]; int t1; e=e+180.0; t1=(int)(e/20); buf[0]=(char)t1+'A'; e-=(float)t1*20.0; t1=(int)e/2; buf[2]=(char)t1+'0'; e-=(float)t1*2; buf[4]=(char)(int)(e*12.0)+'a'; n=n+90.0; t1=(int)(n/10.0); buf[1]=(char)t1+'A'; n-=(float)t1*10.0; buf[3]=(char)n+'0'; n-=(int)n; n*=24; // convert to 24 division buf[5]=(char)(int)(n)+'a'; buf[6] = '\0'; return buf; } #define NITEMS(x) (int)(sizeof(x)/sizeof(x[0])) /* from gpsd.h-tail */ struct exportmethod_t *export_lookup(const char *name) /* Look up an available export method by name */ { struct exportmethod_t *mp, *method = NULL; for (mp = exportmethods; mp < exportmethods + NITEMS(exportmethods); mp++) if (strcmp(mp->name, name) == 0) method = mp; return method; } void export_list(FILE *fp) /* list known export methods */ { struct exportmethod_t *method; for (method = exportmethods; method < exportmethods + NITEMS(exportmethods); method++) (void)fprintf(fp, "%s: %s\n", method->name, method->description); } struct exportmethod_t *export_default(void) { return (NITEMS(exportmethods) > 0) ? &exportmethods[0] : NULL; } /* Convert true heading to magnetic. Taken from the Aviation Formulary v1.43. Valid to within two degrees within the continiental USA except for the following airports: MO49 MO86 MO50 3K6 02K and KOOA. AK correct to better than one degree. Western Europe correct to within 0.2 deg. If you're not in one of these areas, I apologize, I don't have the math to compute your varation. This is obviously extremely floating-point heavy, so embedded people, beware of using. Note that there are issues with using magnetic heading. This code does not account for the possibility of travelling into or out of an area of valid calculation beyond forcing the magnetic conversion off. A better way to communicate this to the user is probably desirable (in case the don't notice the subtle change from "(mag)" to "(true)" on their display). */ float true2magnetic(double lat, double lon, double heading) { /* Western Europe */ 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); } /* 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 { /* We don't know how to compute magnetic heading for this * location. */ heading = NAN; } /* No negative headings. */ if (isnan(heading)== 0 && heading < 0.0) heading += 360.0; return (heading); } /* gpsclient.c ends here */ gpsd-3.15/gpsdclient.h0000664000175000017500000000222712506323632013057 0ustar esresr/* * gpsdclient.h -- common functions for GPSD clients * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ #ifndef _GPSD_GPSDCLIENT_H_ #define _GPSD_GPSDCLIENT_H_ struct exportmethod_t /* describe an export method */ { const char *name; const char *magic; const char *description; }; struct fixsource_t /* describe a data source */ { char *spec; /* pointer to actual storage */ char *server; char *port; char *device; }; struct exportmethod_t *export_lookup(const char *); struct exportmethod_t *export_default(void); void export_list(FILE *); enum unit {unspecified, imperial, nautical, metric}; enum unit gpsd_units(void); enum deg_str_type { deg_dd, deg_ddmm, deg_ddmmss }; float true2magnetic(double, double, double); extern char *deg_to_str( enum deg_str_type type, double f); extern void gpsd_source_spec(const char *fromstring, struct fixsource_t *source); char *maidenhead(double n,double e); /* this needs to match JSON_DATE_MAX in gpsd.h */ #define CLIENT_DATE_MAX 24 #endif /* _GPSDCLIENT_H_ */ /* gpsdclient.h ends here */ gpsd-3.15/gpsdctl.c0000664000175000017500000000646112520742615012364 0ustar esresr/* gpsdctl.c -- communicate with the control socket of a gpsd instance * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ #include #include #include #include #include #include #include #include #include #include #include "gpsd.h" #define DEFAULT_GPSD_TEST_SOCKET "/tmp/gpsd.sock" static char *control_socket = DEFAULT_GPSD_SOCKET; static char *gpsd_options = ""; static int gpsd_control(char *action, char *argument) /* pass a command to gpsd; start the daemon if not already running */ { int connect = -1; char buf[512]; int status; (void)syslog(LOG_ERR, "gpsd_control(action=%s, arg=%s)", action, argument); if (access(control_socket, F_OK) == 0 && (connect = netlib_localsocket(control_socket, SOCK_STREAM)) >= 0) syslog(LOG_INFO, "reached a running gpsd"); else if (strcmp(action, "add") == 0) { (void)snprintf(buf, sizeof(buf), "gpsd %s -F %s", gpsd_options, control_socket); (void)syslog(LOG_NOTICE, "launching %s", buf); if (system(buf) != 0) { (void)syslog(LOG_ERR, "launch of gpsd failed"); return -1; } if (access(control_socket, F_OK) == 0) connect = netlib_localsocket(control_socket, SOCK_STREAM); } if (connect < 0) { syslog(LOG_ERR, "can't reach gpsd"); return -1; } /* * We've got a live connection to the gpsd control socket. No * need to parse the response, because gpsd will lock on to the * device if it's really a GPS and ignore it if it's not. * * The only other place in the code that knows about the format of * the add and remove commands is the handle_control() function in * gpsd.c. Be careful about keeping them in sync, or hotplugging * will have mysterious failures. */ if (strcmp(action, "add") == 0) { /* * Force the group-read & group-write bits on, so gpsd will still be * able to use this device after dropping root privileges. */ struct stat sb; /* coverity[toctou] */ if (stat(argument, &sb) != 1) (void)chmod(argument, sb.st_mode | S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP); (void)snprintf(buf, sizeof(buf), "+%s\r\n", argument); status = (int)write(connect, buf, strlen(buf)); ignore_return(read(connect, buf, 12)); } else if (strcmp(action, "remove") == 0) { (void)snprintf(buf, sizeof(buf), "-%s\r\n", argument); status = (int)write(connect, buf, strlen(buf)); ignore_return(read(connect, buf, 12)); } else { (void)syslog(LOG_ERR, "unknown action \"%s\"", action); status = -1; } (void)close(connect); //syslog(LOG_DEBUG, "gpsd_control ends"); return status; } int main(int argc, char *argv[]) { openlog("gpsdctl", 0, LOG_DAEMON); if (argc != 3) { (void)syslog(LOG_ERR, "requires action and argument (%d)", argc); exit(EXIT_FAILURE); } else { char *sockenv = getenv("GPSD_SOCKET"); char *optenv = getenv("GPSD_OPTIONS"); if (sockenv != NULL) control_socket = sockenv; else if (geteuid() != 0) control_socket = DEFAULT_GPSD_TEST_SOCKET; if (optenv != NULL) gpsd_options = optenv; /* coverity[string_size] */ if (gpsd_control(argv[1], argv[2]) < 0) exit(EXIT_FAILURE); else exit(EXIT_SUCCESS); } } gpsd-3.15/gpsdctl.xml0000664000175000017500000000605012520742615012734 0ustar esresr 25 Jun 2011 gpsdctl 8 The GPSD Project GPSD Documentation gpsdctl tool for sending commands to gpsd over its control socket gpdsctl action device DESCRIPTION This is a tool for sending an instance of gpsd commands over its control socket to add or remove devices from the daemon's device list. It is not intended to be called by users, but rather by the Linux hotplug system and similar facilities. The action argument may be "add" or "remove". If no daemon instance is running when an add is requested, this program will launch one. The "device" argument should be the pathname of a device. A device on the list will be opened to read sensor data whenever a client requests a watch. Two environment variables are interpreted. GPSD_SOCKET sets the location of the control socket. It defaults to /var/run/gpsd.sock if the effective user ID of this program is root, /tmp/gpsd.sock otherwise. GPSD_OPTIONS may be a list of options to be passed to gpsd when this tool launches it. It defaults to an empty string. RETURN VALUES 1 if the action was unknown or the write to the control socket failed, 0 otherwise SEE ALSO gpsd8, gpsctl1, gps1, libgps3, libgpsd3, gpsprof1, gpsfake1. AUTHOR Eric S. Raymond esr@thyrsus.com. gpsd-3.15/gpsdecode.c0000664000175000017500000005403312506327720012657 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include "gpsd.h" #include "bits.h" #include "gps_json.h" #include "strfuncs.h" static int verbose = 0; static bool scaled = true; static bool json = true; static bool pseudonmea = false; static bool split24 = false; static bool minlength = false; static unsigned int ntypes = 0; static unsigned int typelist[32]; static struct gps_context_t context; /************************************************************************** * * Generic machinery * **************************************************************************/ #ifdef AIVDM_ENABLE static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; bool imo = false; (void)snprintf(buf, buflen, "%u|%u|%09u|", ais->type, ais->repeat, ais->mmsi); switch (ais->type) { case 1: /* Position Report */ case 2: case 3: str_appendf(buf, buflen, "%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, 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); break; case 4: /* Base Station Report */ case 11: /* UTC/Date Response */ str_appendf(buf, buflen, "%04u-%02u-%02uT%02u:%02u:%02uZ|%u|%d|%d|%u|%u|0x%x", ais->type4.year, ais->type4.month, ais->type4.day, ais->type4.hour, ais->type4.minute, ais->type4.second, (uint) ais->type4.accuracy, ais->type4.lon, ais->type4.lat, ais->type4.epfd, (uint) ais->type4.raim, ais->type4.radio); break; case 5: /* Ship static and voyage related data */ str_appendf(buf, buflen, "%u|%u|%s|%s|%u|%u|%u|%u|%u|%u|%02u-%02uT%02u:%02uZ|%u|%s|%u", ais->type5.imo, ais->type5.ais_version, ais->type5.callsign, 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, ais->type5.destination, ais->type5.dte); break; case 6: /* Binary Message */ str_appendf(buf, buflen, "%u|%u|%u|%u|%u", ais->type6.seqno, ais->type6.dest_mmsi, (uint) ais->type6.retransmit, ais->type6.dac, ais->type6.fid); switch(ais->type6.dac) { case 235: /* UK */ case 250: /* Rep. Of Ireland */ switch(ais->type6.fid) { case 10: /* GLA - AtoN monitoring */ str_appendf(buf, buflen, "|%u|%u|%u|%u|%u|%u|%u|%u", ais->type6.dac235fid10.ana_int, ais->type6.dac235fid10.ana_ext1, ais->type6.dac235fid10.ana_ext2, ais->type6.dac235fid10.racon, ais->type6.dac235fid10.light, (uint)ais->type6.dac235fid10.alarm, ais->type6.dac235fid10.stat_ext, (uint)ais->type6.dac235fid10.off_pos); imo = true; break; } break; } if (!imo) str_appendf(buf, buflen, "|%zd:%s", ais->type6.bitcount, gpsd_hexdump(scratchbuf, sizeof(scratchbuf), ais->type6.bitdata, BITS_TO_BYTES(ais->type6.bitcount))); break; case 7: /* Binary Acknowledge */ case 13: /* Safety Related Acknowledge */ str_appendf(buf, buflen, "%u|%u|%u|%u", ais->type7.mmsi1, ais->type7.mmsi2, ais->type7.mmsi3, ais->type7.mmsi4); break; case 8: /* Binary Broadcast Message */ str_appendf(buf, buflen, "%u|%u", ais->type8.dac, ais->type8.fid); switch(ais->type8.dac) { case 1: /* International */ switch(ais->type8.fid) { case 11: /* IMO236 - Met/Hydro message */ str_appendf(buf, buflen, "|%d|%d|%02uT%02u:%02uZ|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%d|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u", ais->type8.dac1fid11.lon, ais->type8.dac1fid11.lat, ais->type8.dac1fid11.day, ais->type8.dac1fid11.hour, ais->type8.dac1fid11.minute, ais->type8.dac1fid11.wspeed, ais->type8.dac1fid11.wgust, ais->type8.dac1fid11.wdir, ais->type8.dac1fid11.wgustdir, ais->type8.dac1fid11.airtemp, ais->type8.dac1fid11.humidity, ais->type8.dac1fid11.dewpoint, ais->type8.dac1fid11.pressure, ais->type8.dac1fid11.pressuretend, ais->type8.dac1fid11.visibility, ais->type8.dac1fid11.waterlevel, ais->type8.dac1fid11.leveltrend, ais->type8.dac1fid11.cspeed, ais->type8.dac1fid11.cdir, ais->type8.dac1fid11.cspeed2, ais->type8.dac1fid11.cdir2, ais->type8.dac1fid11.cdepth2, ais->type8.dac1fid11.cspeed3, ais->type8.dac1fid11.cdir3, ais->type8.dac1fid11.cdepth3, ais->type8.dac1fid11.waveheight, ais->type8.dac1fid11.waveperiod, ais->type8.dac1fid11.wavedir, ais->type8.dac1fid11.swellheight, ais->type8.dac1fid11.swellperiod, ais->type8.dac1fid11.swelldir, ais->type8.dac1fid11.seastate, ais->type8.dac1fid11.watertemp, ais->type8.dac1fid11.preciptype, ais->type8.dac1fid11.salinity, ais->type8.dac1fid11.ice); imo = true; break; case 31: /* IMO289 - Met/Hydro message */ str_appendf(buf, buflen, "|%d|%d|%02uT%02u:%02uZ|%u|%u|%u|%u|%d|%u|%d|%u|%u|%u|%d|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%d|%u|%u|%u", ais->type8.dac1fid31.lon, ais->type8.dac1fid31.lat, ais->type8.dac1fid31.day, ais->type8.dac1fid31.hour, ais->type8.dac1fid31.minute, ais->type8.dac1fid31.wspeed, ais->type8.dac1fid31.wgust, ais->type8.dac1fid31.wdir, ais->type8.dac1fid31.wgustdir, ais->type8.dac1fid31.airtemp, ais->type8.dac1fid31.humidity, ais->type8.dac1fid31.dewpoint, ais->type8.dac1fid31.pressure, ais->type8.dac1fid31.pressuretend, ais->type8.dac1fid31.visibility, ais->type8.dac1fid31.waterlevel, ais->type8.dac1fid31.leveltrend, ais->type8.dac1fid31.cspeed, ais->type8.dac1fid31.cdir, ais->type8.dac1fid31.cspeed2, ais->type8.dac1fid31.cdir2, ais->type8.dac1fid31.cdepth2, ais->type8.dac1fid31.cspeed3, ais->type8.dac1fid31.cdir3, ais->type8.dac1fid31.cdepth3, ais->type8.dac1fid31.waveheight, ais->type8.dac1fid31.waveperiod, ais->type8.dac1fid31.wavedir, ais->type8.dac1fid31.swellheight, ais->type8.dac1fid31.swellperiod, ais->type8.dac1fid31.swelldir, ais->type8.dac1fid31.seastate, ais->type8.dac1fid31.watertemp, ais->type8.dac1fid31.preciptype, ais->type8.dac1fid31.salinity, ais->type8.dac1fid31.ice); imo = true; break; } break; } if (!imo) str_appendf(buf, buflen, "|%zd:%s", ais->type8.bitcount, gpsd_hexdump(scratchbuf, sizeof(scratchbuf), ais->type8.bitdata, BITS_TO_BYTES(ais->type8.bitcount))); break; case 9: str_appendf(buf, buflen, "%u|%u|%u|%d|%d|%u|%u|0x%x|%u|%u|0x%x", ais->type9.alt, ais->type9.speed, (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); break; case 10: /* UTC/Date Inquiry */ str_appendf(buf, buflen, "%u", ais->type10.dest_mmsi); break; case 12: /* Safety Related Message */ str_appendf(buf, buflen, "%u|%u|%u|%s", ais->type12.seqno, ais->type12.dest_mmsi, (uint) ais->type12.retransmit, ais->type12.text); break; case 14: /* Safety Related Broadcast Message */ str_appendf(buf, buflen, "%s", ais->type14.text); break; case 15: str_appendf(buf, buflen, "%u|%u|%u|%u|%u|%u|%u|%u", 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: str_appendf(buf, buflen, "%u|%u|%u|%u|%u|%u", ais->type16.mmsi1, ais->type16.offset1, ais->type16.increment1, ais->type16.mmsi2, ais->type16.offset2, ais->type16.increment2); break; case 17: str_appendf(buf, buflen, "%d|%d|%zd:%s", ais->type17.lon, ais->type17.lat, ais->type17.bitcount, gpsd_hexdump(scratchbuf, sizeof(scratchbuf), ais->type17.bitdata, BITS_TO_BYTES(ais->type17.bitcount))); break; case 18: str_appendf(buf, buflen, "%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, 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); break; case 19: str_appendf(buf, buflen, "%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, ais->type19.lon, ais->type19.lat, ais->type19.course, ais->type19.heading, ais->type19.second, ais->type19.regional, ais->type19.shipname, ais->type19.shiptype, ais->type19.to_bow, ais->type19.to_stern, ais->type19.to_port, ais->type19.to_starboard, ais->type19.epfd, (uint) ais->type19.raim, ais->type19.dte, (uint) ais->type19.assigned); break; case 20: /* Data Link Management Message */ str_appendf(buf, buflen, "%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u|%u", ais->type20.offset1, ais->type20.number1, ais->type20.timeout1, ais->type20.increment1, ais->type20.offset2, ais->type20.number2, ais->type20.timeout2, ais->type20.increment2, ais->type20.offset3, ais->type20.number3, ais->type20.timeout3, ais->type20.increment3, ais->type20.offset4, ais->type20.number4, ais->type20.timeout4, ais->type20.increment4); break; case 21: /* Aid to Navigation */ str_appendf(buf, buflen, "%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, ais->type21.lon, ais->type21.lat, ais->type21.to_bow, ais->type21.to_stern, ais->type21.to_port, ais->type21.to_starboard, ais->type21.epfd, ais->type21.second, ais->type21.regional, (uint) ais->type21.off_position, (uint) ais->type21.raim, (uint) ais->type21.virtual_aid); break; case 22: /* Channel Management */ if (!ais->type22.addressed) str_appendf(buf, buflen, "%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, 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); else str_appendf(buf, buflen, "%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, 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); break; case 23: /* Group Management Command */ str_appendf(buf, buflen, "%d|%d|%d|%d|%u|%u|%u|%u|%u", ais->type23.ne_lon, ais->type23.ne_lat, ais->type23.sw_lon, ais->type23.sw_lat, ais->type23.stationtype, ais->type23.shiptype, ais->type23.txrx, ais->type23.interval, ais->type23.quiet); break; case 24: /* Class B CS Static Data Report */ str_appendf(buf, buflen, "%s|", ais->type24.shipname); str_appendf(buf, buflen, "%u|", ais->type24.shiptype); str_appendf(buf, buflen, "%s|", ais->type24.vendorid); str_appendf(buf, buflen, "%u|", ais->type24.model); str_appendf(buf, buflen, "%u|", ais->type24.serial); str_appendf(buf, buflen, "%s|", ais->type24.callsign); if (AIS_AUXILIARY_MMSI(ais->mmsi)) { str_appendf(buf, buflen, "%u", ais->type24.mothership_mmsi); } else { str_appendf(buf, buflen, "%u|%u|%u|%u", 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 */ str_appendf(buf, buflen, "%u|%u|%u|%u|%zd:%s", (uint) ais->type25.addressed, (uint) ais->type25.structured, ais->type25.dest_mmsi, ais->type25.app_id, ais->type25.bitcount, gpsd_hexdump(scratchbuf, sizeof(scratchbuf), ais->type25.bitdata, BITS_TO_BYTES(ais->type25.bitcount))); break; case 26: /* Binary Message, Multiple Slot */ str_appendf(buf, buflen, "%u|%u|%u|%u|%zd:%s:%u", (uint) ais->type26.addressed, (uint) ais->type26.structured, ais->type26.dest_mmsi, ais->type26.app_id, ais->type26.bitcount, gpsd_hexdump(scratchbuf, sizeof(scratchbuf), ais->type26.bitdata, BITS_TO_BYTES(ais->type26.bitcount)), ais->type26.radio); break; case 27: /* Long Range AIS Broadcast message */ str_appendf(buf, buflen, "%u|%u|%d|%d|%u|%u|%u|%u", ais->type27.status, (uint)ais->type27.accuracy, ais->type27.lon, ais->type27.lat, ais->type27.speed, ais->type27.course, (uint)ais->type27.raim, (uint)ais->type27.gnss); break; default: str_appendf(buf, buflen, "unknown AIVDM message content."); break; } (void)strlcat(buf, "\r\n", buflen); } #endif static bool filter(gps_mask_t changed, struct gps_device_t *session) /* say whether a given message should be visible */ { if (ntypes == 0) return true; else { unsigned int i, t; if ((changed & AIS_SET)!=0) t = session->gpsdata.ais.type; else if ((changed & RTCM2_SET)!=0) t = session->gpsdata.rtcm2.type; else if ((changed & RTCM3_SET)!=0) t = session->gpsdata.rtcm3.type; else return true; for (i = 0; i < ntypes; i++) if (t == typelist[i]) return true; } return false; } static void pseudonmea_report(gps_mask_t changed, struct gps_device_t *device) /* report pseudo-NMEA in appropriate circumstances */ { if (GPS_PACKET_TYPE(device->lexer.type) && !TEXTUAL_PACKET_TYPE(device->lexer.type)) { char buf[MAX_PACKET_LENGTH * 3 + 2]; if ((changed & REPORT_IS) != 0) { nmea_tpv_dump(device, buf, sizeof(buf)); (void)fputs(buf, stdout); } if ((changed & SATELLITE_SET) != 0) { nmea_sky_dump(device, buf, sizeof(buf)); (void)fputs(buf, stdout); } if ((changed & SUBFRAME_SET) != 0) { nmea_subframe_dump(device, buf, sizeof(buf)); (void)fputs(buf, stdout); } #ifdef AIVDM_ENABLE if ((changed & AIS_SET) != 0) { nmea_ais_dump(device, buf, sizeof(buf)); (void)fputs(buf, stdout); } #endif /* AIVDM_ENABLE */ } } static void decode(FILE *fpin, FILE*fpout) /* sensor data on fpin to dump format on fpout */ { struct gps_device_t session; struct policy_t policy; size_t minima[PACKET_TYPES+1]; #if defined(SOCKET_EXPORT_ENABLE) || defined(AIVDM_ENABLE) char buf[GPS_JSON_RESPONSE_MAX * 4]; #endif int i; //This looks like a good idea, but it breaks regression tests //(void)strlcpy(session.gpsdata.dev.path, "stdin", sizeof(session.gpsdata.dev.path)); memset(&policy, '\0', sizeof(policy)); policy.json = json; policy.scaled = scaled; policy.nmea = pseudonmea; gpsd_time_init(&context, time(NULL)); context.readonly = true; gpsd_init(&session, &context, NULL); gpsd_clear(&session); session.gpsdata.gps_fd = fileno(fpin); session.gpsdata.dev.baudrate = 38400; /* hack to enable subframes */ (void)strlcpy(session.gpsdata.dev.path, "stdin", sizeof(session.gpsdata.dev.path)); for (i = 0; i < (int)(sizeof(minima)/sizeof(minima[0])); i++) minima[i] = MAX_PACKET_LENGTH+1; for (;;) { gps_mask_t changed = gpsd_poll(&session); if (changed == ERROR_SET || changed == NODATA_IS) break; if (session.lexer.type == COMMENT_PACKET) gpsd_set_century(&session); if (verbose >= 1 && TEXTUAL_PACKET_TYPE(session.lexer.type)) (void)fputs((char *)session.lexer.outbuffer, fpout); if (session.lexer.outbuflen < minima[session.lexer.type+1]) minima[session.lexer.type+1] = session.lexer.outbuflen; /* mask should match what's in report_data() */ if ((changed & (REPORT_IS|GST_SET|SATELLITE_SET|SUBFRAME_SET|ATTITUDE_SET|RTCM2_SET|RTCM3_SET|AIS_SET|PASSTHROUGH_IS)) == 0) continue; if (!filter(changed, &session)) continue; else if (json) { if ((changed & PASSTHROUGH_IS) != 0) { (void)fputs((char *)session.lexer.outbuffer, fpout); (void)fputs("\n", fpout); } #ifdef SOCKET_EXPORT_ENABLE else { if ((changed & AIS_SET)!=0) { if (session.gpsdata.ais.type == 24 && session.gpsdata.ais.type24.part != both && !split24) continue; } json_data_report(changed, &session, &policy, buf, sizeof(buf)); (void)fputs(buf, fpout); } #endif /* SOCKET_EXPORT_ENABLE */ #ifdef AIVDM_ENABLE } else if (session.lexer.type == AIVDM_PACKET) { if ((changed & AIS_SET)!=0) { if (session.gpsdata.ais.type == 24 && session.gpsdata.ais.type24.part != both && !split24) continue; aivdm_csv_dump(&session.gpsdata.ais, buf, sizeof(buf)); (void)fputs(buf, fpout); } #endif /* AIVDM_ENABLE */ } if (policy.nmea) pseudonmea_report(changed, &session); } if (minlength) { for (i = 0; i < (int)(sizeof(minima)/sizeof(minima[0])); i++) { /* dump all minima, ignoring comments */ if (i != 1 && minima[i] < MAX_PACKET_LENGTH+1) { const struct gps_type_t **dp; char *np = "Unknown"; for (dp = gpsd_drivers; *dp; dp++) { if ((*dp)->packet_type == i-1) { np = (*dp)->type_name; break; } } printf("%s (%d): %u\n", np, i-1, (unsigned int)minima[i]); } } } } #ifdef SOCKET_EXPORT_ENABLE static void encode(FILE *fpin, FILE *fpout) /* JSON format on fpin to JSON on fpout - idempotency test */ { char inbuf[BUFSIZ]; struct policy_t policy; struct gps_device_t session; int lineno = 0; memset(&policy, '\0', sizeof(policy)); memset(&session, '\0', sizeof(session)); session.context = &context; context.errout.debug = LOG_SHOUT; context.errout.label = "gpsdecode"; (void)strlcpy(session.gpsdata.dev.path, "stdin", sizeof(session.gpsdata.dev.path)); policy.json = true; policy.nmea = pseudonmea; /* Parsing is always made in unscaled mode, * this policy applies to the dumping */ policy.scaled = scaled; while (fgets(inbuf, (int)sizeof(inbuf), fpin) != NULL) { int status; ++lineno; if (inbuf[0] == '#') continue; status = libgps_json_unpack(inbuf, &session.gpsdata, NULL); if (status != 0) { (void)fprintf(stderr, "gpsdecode: dying with status %d (%s) on line %d\n", status, json_error_string(status), lineno); exit(EXIT_FAILURE); } json_data_report(session.gpsdata.set, &session, &policy, inbuf, sizeof(inbuf)); (void)fputs(inbuf, fpout); } } #endif /* SOCKET_EXPORT_ENABLE */ int main(int argc, char **argv) { int c; enum { doencode, dodecode } mode = dodecode; gps_context_init(&context, "gpsdecode"); while ((c = getopt(argc, argv, "cdejmnpst:uvVD:")) != EOF) { switch (c) { case 'c': json = false; break; case 'd': mode = dodecode; break; case 'e': mode = doencode; break; case 'j': json = true; break; case 'm': minlength = true; json = false; break; case 'n': pseudonmea = true; break; case 's': split24 = true; break; case 't': typelist[ntypes++] = (unsigned int)atoi(strtok(optarg, ",")); for(;;) { char *next = strtok(NULL, ","); if (next == NULL) break; typelist[ntypes++] = (unsigned int)atoi(next); } break; case 'u': scaled = false; break; case 'v': verbose = 1; break; case 'D': context.errout.debug = verbose = atoi(optarg); #if defined(CLIENTDEBUG_ENABLE) && defined(SOCKET_EXPORT_ENABLE) json_enable_debug(verbose - 2, stderr); #endif break; case 'V': (void)fprintf(stderr, "gpsdecode revision " VERSION "\n"); exit(EXIT_SUCCESS); case '?': default: (void)fputs("gpsdecode [-v]\n", stderr); exit(EXIT_FAILURE); } } //argc -= optind; //argv += optind; if (mode == doencode) { #ifdef SOCKET_EXPORT_ENABLE encode(stdin, stdout); #else (void)fprintf(stderr, "gpsdecode: encoding support isn't compiled.\n"); exit(EXIT_FAILURE); #endif /* SOCKET_EXPORT_ENABLE */ } else decode(stdin, stdout); exit(EXIT_SUCCESS); } /* gpsdecode.c ends here */ gpsd-3.15/gpsdecode.xml0000664000175000017500000001417612520742615013241 0ustar esresr 13 Jul 2005 gpsdecode 1 The GPSD Project GPSD Documentation gpsdecode decode GPS, RTCM or AIS streams into a readable format gpsdecode -c -d -e -j -m -n -s -t typelist -u -v -D debuglevel -V DESCRIPTION This tool is a batch-mode decoder for NMEA and various binary packet formats associated with GPS, AIS, and differential-correction services. It produces a JSON dump on standard output from binary on standard input. The JSON is the same format documented in gpsd8; this tool uses the same decoding logic as gpsd, but with a simpler interface intended for batch processing of data files. All sensor-input formats known to the GPSD project can be decoded by this tool. These include: NMEA, AIVDM (the NMEA-derived sentence format used by AIS, the marine Automatic Identification System), RTCM2, and all supported GPS binary formats (notably including SiRF). See gpsd8 for applicable standards and known limitations of the decoding logic. You can use this tool with nc1 to examine AIS feeds from AIS pooling services, RTCM feeds from RTCM receivers or NTRIP broadcasters. OPTIONS The option tells the program to decode packets presented on standard input to standard output. This is the default behavior. The explicitly sets the output dump format to JSON (the default behavior). With the option, dump minimum lengths for each packet type in the input (ignoring comment packets). This is probably of interest only to GSD developers. The enables dumping in generated pseudo-NME0183. The option option tells the program to encode JSON on standard input to JSON on standard output. This option is only useful for regression-testing of the JSON dumping and parsing code. The option option tells the program to report AIS Type 24 sentence halves separately rather than attempting to aggregate them. The accepts a comma-separated list of numeric types. Packets with a numeric AIS, RTCM2, or RTCM3 type are passed through and output only if they match a type in the list. Packets of other kinds (in particular GPS packets) are passed through unconditionally. The suppresses scaling of AIS data to float quantities and text expansion of numeric codes. A dump with this option is lossless. The enables dumping of textual packets to output as they are received on input, immediately preceding corresponding output. The sets the AIS dump format to separate fields with an ASCII pipe symbol. Fields are dumped in the order they occur in the AIS packet. Numerics are not scaled (-u is forced). Strings are unpacked from six-bit to full ASCII The option directs the program to emit its version number, then exit. The option sets a debug verbosity level. It is mainly of interest to developers. AIS DSV FORMAT With the option, dump lines are values of AIS payload fields, pipe-separated, in the order that they occur in the payload. Spans of fields expressing a date are emitted as an ISO8601 timestamp (look for colons and the trailing Z indicating Zulu/UTC time), and the 19-bit group of TDMA status fields found at the end of message types 1-4 are are dumped as a single unsigned integer (in hex preceded by "0x"). Unused regional-authority fields are also dumped (in hex preceded by "0x"). Variable-length binary fields are dumped as an integer bit length, followed by a colon, followed by a hex dump. SEE ALSO gpsd8, gpsctl1, gpsdctl8, gps1, libgps3, libgpsd3, gpsprof1, gpsfake1, AUTHOR Eric S. Raymond esr@thyrsus.com. gpsd-3.15/gpsfake0000775000175000017500000001747212472372460012135 0ustar esresr#!/usr/bin/env python # # gpsfake -- test harness for gpsd # # Simulates one or more GPSes, playing back logfiles. # Most of the logic for this now lives in gps.fake, # factored out so we can write other test programs with it. # # 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 import gps import gps.fake as gpsfake # The "as" pacifies pychecker import os import platform import pty import socket import sys import time class Baton: "Ship progress indications to stderr." # By setting this > 1 we reduce the frequency of the twirl # and speed up test runs. Should be relatively prime to the # nunber of baton states, otherwise it will cause beat artifacts # in the twirling. SPINNER_INTERVAL = 11 def __init__(self, prompt, endmsg=None): self.stream = sys.stderr self.stream.write(prompt + "...") if os.isatty(self.stream.fileno()): self.stream.write(" \b") self.stream.flush() self.count = 0 self.endmsg = endmsg self.time = time.time() return def twirl(self, ch=None): if self.stream is None: return if os.isatty(self.stream.fileno()): if ch: self.stream.write(ch) self.stream.flush() elif self.count % Baton.SPINNER_INTERVAL == 0: self.stream.write("-/|\\"[self.count % 4]) self.stream.write("\b") self.stream.flush() self.count = self.count + 1 return def end(self, msg=None): if msg is None: msg = self.endmsg if self.stream: self.stream.write("...(%2.2f sec) %s.\n" % (time.time() - self.time, msg)) return def hexdump(s): rep = "" for c in s: rep += "%02x" % ord(c) return rep def fakehook(linenumber, fakegps): if len(fakegps.testload.sentences) == 0: print >>sys.stderr, "fakegps: no sentences in test load." raise SystemExit, 1 if linenumber % len(fakegps.testload.sentences) == 0: if singleshot and linenumber > 0: return False if progress: baton.twirl('*\b') elif not singleshot: sys.stderr.write("gpsfake: log cycle of %s begins.\n" % fakegps.testload.name) time.sleep(cycle) if linedump and fakegps.testload.legend: ml = fakegps.testload.sentences[linenumber % len(fakegps.testload.sentences)].strip() if not fakegps.testload.textual: ml = hexdump(ml) announce = fakegps.testload.legend % (linenumber % len(fakegps.testload.sentences) + 1) + ml if promptme: raw_input(announce + "? ") else: print announce if progress: baton.twirl() return True if __name__ == '__main__': try: (options, arguments) = getopt.getopt(sys.argv[1:], "1bc:D:ghilm:no:pP:r:s:StTuvx") except getopt.GetoptError, msg: print "gpsfake: " + str(msg) raise SystemExit, 1 port = None progress = False cycle = 0 monitor = "" speed = 4800 linedump = False predump = False pipe = False singleshot = False promptme = False client_init = '?WATCH={"json":true,"nmea":true}' doptions = "" tcp = False udp = False verbose = 0 slow = False for (switch, val) in options: if switch == '-1': singleshot = True elif switch == '-b': progress = True elif switch == '-c': cycle = float(val) elif switch == '-D': doptions += " -D " + val elif switch == '-g': monitor = "xterm -e gdb -tui --args " elif switch == '-i': linedump = promptme = True elif switch == '-l': linedump = True elif switch == '-m': monitor = val + " " elif switch == '-n': doptions += " -n" elif switch == '-x': predump = True elif switch == '-o': doptions = val elif switch == '-p': pipe = True elif switch == '-P': port = int(val) elif switch == '-r': client_init = val elif switch == '-s': speed = int(val) elif switch == '-S': slow = True elif switch == '-t': tcp = True elif switch == '-T': sys.stdout.write("sys %s platform %s: WRITE_PAD = %.5f\n" % (sys.platform, platform.platform(), gpsfake.WRITE_PAD)) raise SystemExit, 0 elif switch == '-u': udp = True elif switch == '-v': verbose += 1 elif switch == '-h': sys.stderr.write("usage: gpsfake [-h] [-l] [-m monitor] [--D debug] [-o options] [-p] [-s speed] [-S] [-c cycle] [-b] logfile\n") raise SystemExit, 0 try: pty.openpty() except (AttributeError, OSError): print >>sys.stderr, "gpsfake: ptys not available, falling back to UDP." udp = True if not arguments: print >>sys.stderr, "gpsfake: requires at least one logfile argument." raise SystemExit, 1 if progress: baton = Baton("Processing %s" % ",".join(arguments), "done") else: print >>sys.stderr, "Processing %s" % ",".join(arguments) # Don't allocate a private port when cycling logs for client testing. if port is None and not pipe: port = gps.GPSD_PORT test = gpsfake.TestSession(prefix=monitor, port=port, options=doptions, tcp=tcp, udp=udp, verbose=verbose, predump=predump, slow=slow) if pipe: test.reporter = sys.stdout.write if verbose: progress = False test.progress = sys.stdout.write test.spawn() try: for logfile in arguments: try: test.gps_add(logfile, speed=speed, pred=fakehook, oneshot=singleshot) except gpsfake.TestLoadError, e: sys.stderr.write("gpsfake: " + e.msg + "\n") raise SystemExit, 1 except gpsfake.PacketError, e: sys.stderr.write("gpsfake: " + e.msg + "\n") raise SystemExit, 1 except gpsfake.DaemonError, e: sys.stderr.write("gpsfake: " + e.msg + "\n") raise SystemExit, 1 except IOError, e: if e.filename is None: sys.stderr.write("gpsfake: unknown internal I/O error %s\n" % e) else: sys.stderr.write("gpsfake: no such file as %s or file unreadable\n" % e.filename) raise SystemExit, 1 except OSError: sys.stderr.write("gpsfake: can't open pty.\n") raise SystemExit, 1 try: if pipe: test.client_add(client_init + "\n") # Give daemon time to get ready for the feeds. # Without a delay here there's a window for test # sentences to arrive before the watch takes effect. # This needs to increase if leading sentences in # test loads aren't being processed. time.sleep(1) test.run() except socket.error, msg: sys.stderr.write("gpsfake: socket error %s.\n" % msg) raise SystemExit, 1 except gps.client.json_error, e: sys.stderr.write("gpsfake: JSON error on line %s is %s.\n" % (repr(e.data), e.explanation)) raise SystemExit, 1 except KeyboardInterrupt: sys.stderr.write("gpsfake: aborted\n") raise SystemExit, 1 finally: test.cleanup() if progress: baton.end() # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: gpsd-3.15/gpsfake.xml0000664000175000017500000002532412520742615012721 0ustar esresr 12 Feb 2005 gpsfake 1 The GPSD Project GPSD Documentation gpsfake test harness for gpsd, simulating a GPS gpsfake -1 -h -b -c interval -i -D debuglevel -l -m monitor -g -n -o options -p -P port -r initcmd -s speed -S -u -t -v logfile DESCRIPTION gpsfake is a test harness for gpsd and its clients. It opens a pty (pseudo-TTY), launches a gpsd instance that thinks the slave side of the pty is its GPS device, and repeatedly feeds the contents of one or more test logfiles through the master side to the GPS. If there are multiple logfiles, sentences from them are interleaved in the order the files are specified. gpsfake does not require root privileges, and can be run concurrently with a production gpsd instance without causing problems. The logfiles may contain packets in any supported format, including in particular NMEA, SiRF, TSIP, or Zodiac. Leading lines beginning with # will be treated as comments and ignored, except in the following special cases: a comment of the form #Date: yyyy-mm-dd (ISO8601 date format) may be used to set the initial date for the log. a comment of the form #Serial: [0-9]* [78][NOE][12] may be used to set serial parameters for the log - baud rate, word length, stop bits. a comment of the form #Transport: UDP may be used to fake a UDP source rather than the normal pty. The gpsd instance is run in foreground. The thread sending fake GPS data to the daemon is run in background. OPTIONS With the -1 option, the logfile is interpreted once only rather than repeatedly. This option is intended to facilitate regression testing. The enables a twirling-baton progress indicator on standard error. At termination, it reports elapsed time. The sets the delay between sentences in seconds. Fractional values of seconds are legal. The default is zero (no delay). The makes the program dump a line or packet number just before each sentence is fed to the daemon. If the sentence is textual (e.g. NMEA), the text is dumped as well. If not, the packet will be dumped in hexadecimal (except for RTCM packets, which aren't dumped at all). This option is useful for checking that gpsfake is getting packet boundaries right. The is for single-stepping through logfiles. It dumps the line or packet number (and the sentence if the protocol is textual) followed by "? ". Only when the user keys Enter is the line actually fed to gpsd. The specifies a monitor program inside which the daemon should be run. This option is intended to be used with valgrind1, gdb1 and similar programs. The uses the monitor facility to run the gpsd instance within gpsfake under control of gdb. The specifies options to pass to the daemon. The -n option passes -n to start the daemon reading the GPS without waiting for a client (equivalent to -o "-n"). The passes a -D option to the daemon: thus -D 4 is shorthand for -o "-D 4". The -p ("pipe") option sets watcher mode and dumps the NMEA and GPSD notifications generated by the log to standard output. This is useful for regression-testing. The -P ("port") option sets the daemon's listening port. The specifies an initialization command to use in pipe mode. The default is ?WATCH={"enable":true,"json":true}. The sets the baud rate for the slave tty. The default is 4800. The option -S tells gpsfake to insert realistic delays in the test input rather than trying to stuff it through the daemon as fast as possible. This will make the test(s) run much slower, but avoids flaky failures due to machine lode and possible race conditions in the pty layer. The forces the test framework to use TCP rather than pty devices. Besides being a test of TCP source handling, this may be useful for testing from within chroot jails where access to pty devices is locked out. The forces the test framework to use UDP rather than pty devices. Besides being a test of UDP source handling, this may be useful for testing from within chroot jails where access to pty devices is locked out. The enables verbose progress reports to stderr. It is mainly useful for debugging gpsfake itself. The dumps packets as gpsfake gathers them. It is mainly useful for debugging gpsfake itself. The makes gpsfake print a usage message and exit. The argument must be the name of a file containing the data to be cycled at the device. gpsfake will print a notification each time it cycles. Normally, gpsfake creates a pty for each logfile and passes the slave side of the device to the daemon. If the header comment in the logfile contains the string "UDP", packets are instead shipped via UDP port 5000 to the address 192.168.0.1.255. You can monitor them with this: tcpdump -s0 -n -A -i lo udp and port 5000. MAGIC COMMENTS Certain magic comments in test load headers can change the conditions of the test. These are: Serial: May contain a serial-port setting such as 4800 7N2 - baud rate followed by 7 or 8 for byte length, N or O or E for parity and 1 or 2 for stop bits. The test is run with those settings on the slave port that the daemon sees. Transport: Values 'TCP' and 'UDP' force the use of TCP and UDP feeds respectively (the default is a pty). Delay-Cookie: Must be followed by two whitespace-separated fields, a delimiter character and a numeric delay in seconds. Instead of being broken up by packet boundaries, the test load is split on the delimiters. The delay is performed after each feed. Can be useful for imposing write boundaries in the middle of packets. CUSTOM TESTS gpsfake is a trivial wrapper around a Python module, also named gpsfake, that can be used to fully script sessions involving a gpsd instance, any number of client sessions, and any number of fake GPSes feeding the daemon instance with data from specified sentence logs. Source and embedded documentation for this module is shipped with the gpsd development tools. You can use it to torture-test either gpsd itself or any gpsd-aware client application. Logfiles for the use with gpsfake can be retrieved using gpspipe, gpscat, or gpsmon from the gpsd distribution, or any other application which is able to create a compatible output. If gpsfake exits with "Cannot execute gpsd: executable not found." the environment variable GPSD_HOME can be set to the path where gpsd can be found. (instead of adding that folder to the PATH environment variable SEE ALSO gpsd8, gps1, libgps3, libgpsd3, gpsctl1, gpspipe1, gpsprof1 gpsmon1. AUTHOR Eric S. Raymond esr@thyrsus.com. gpsd-3.15/gpsinit0000775000175000017500000000550312520742615012157 0ustar esresr#!/bin/bash # # gpsinit - initialize kernel-CAN interfaces # # This file is Copyright (c) 2012 by the GPSD project. # BSD terms apply: see the file COPYING in the distribution root for details. # speed=38400 net=0 version() { echo `basename $0`" : Version v0.20"; } usage() { version; echo; echo "usage :" `basename $0` "[-n ] [-s ] []"; echo " :" `basename $0` "-v"; echo " :" `basename $0` "-h"; echo " Options include:"; echo " -n = CAN network number, 0 if not given."; echo " -s = Speed of the slcan hardware port, 38400 if not given."; echo " = Needed for some slcan modules only."; echo " -v = Print version of this script and exit."; echo " -h = Print this help message and exit."; echo " can_module_name = One out of plx_pci, esd_usb2, usb_8dev, vcan, slcan, beaglebone."; echo " interface_name = The interface, the SLCAN module is connected to, i.e. /dev/ttyS0 or /dev/ttyUSB0."; echo " = Needed for the slcan module only. The default is /dev/ttyUSB0."; echo "Root permissions are needed for the first calling option (Enforced by socketCAN subsystem)."; } while getopts :n:s:vh opt do case ${opt} in n) net=${OPTARG};; s) speed=${OPTARG};; v) version; exit 0;; h) usage; exit 0;; \?) usage; exit 1;; esac done shift $((${OPTIND} - 1)) candevice=$1 case ${candevice} in plx_pci) # For the SJA1000 based PCI or PCI-Express CAN interface modprobe plx_pci; ip link set can${net} type can tq 250 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1; ip link set can${net} up;; esd_usb2) # For an esd usb/2 CAN interface modprobe esd_usb2; ip link set can${net} type can tq 250 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1; ip link set can${net} up;; usb_8dev) # For an 8devices usb2can CAN interface modprobe usb_8dev; ip link set can${net} type can tq 250 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1; ip link set can${net} up;; vcan) # With this setup, CAN frames can be injected into vcan0 by a test modprobe vcan; ip link add type vcan; ip link set vcan${net} up;; slcan) # For a serial line CAN device # No support for devices, that need a setup of the baudrate yet device=${2:-/dev/ttyUSB0}; modprobe slcan; slcan_attach -f -s5 -o ${device}; slcand `basename ${device}`; ip link set slcan${net} up;; beaglebone) # For CAN interface on a BeagleBone # The d_can driver is part of the kernel ip link set can${net} type can bitrate 250000 sjw 1; ip link set can${net} up;; *) echo `basename ${0}` ": invalid CAN interface ${1} net${net} device ${2:-(none)}" echo; usage; exit 1 esac gpsd-3.15/gpsinit.xml0000664000175000017500000001174012520742615012753 0ustar esresr 18 Jan 2013 gpsinit 8 The GPSD Project GPSD Documentation gpsinit initialize CAN kernel modules for GPSD gpsinit -n control -s speed module_name interface_name gpsinit -h gpsinit -v DESCRIPTION gpsinit initializes whatever kernel-level modules are needed to enable special non-serial hardware to communicate with a gpsd instance. Note: it will need root permissions to load modules and perform other special operations, such as changing kernel-interface baudrates. At present, all modes of this tool are concerned with setting up kernel-level interfaces to hardware on a CAN (Control Area Network) speaking NMEA2000. The program accepts the following options: -h Display a brief help text. -v Display the version of gpsinit. -n Set the CAN network number. The default is 0. -s Set the baudrate to be used to communicate over the serial line to the CAN hardware. The default is 38400 baud. The parameter module_name is mandatory. The socket CAN driver module module_name.ko will be loaded. gpsinit recognize the following module names: plx_pci esd_usb2 vcan slcan The parameter interface_name and -s speed can used here. beaglebone The dcan module needed for the beaglebone is part of the Linux kernel, so no module is loaded in this case. The parameter interface_name is needed for slcan hardware only. It gives the name of the serial device to which the SL CAN hardware is connected. The default is /dev/ttyUSB0. EXAMPLES sudo gpsinit plx_pci Attempt to load the module plx_pci and initialize net 0 for the connection to a NMEA2000 network. It will set the baudrate to 250kBits. sudo gpsinit -n 1 plx_pci As above, but use net 1. sudo gpsinit -s 38400 slcan /dev/ttyUSB0 Attempt to load the module slcan and talk to the hardware at 38400 baud connected to port /dev/ttyUSB0. gpsinit -h Display a brief help message. gpsinit -v Display the version of gpsinit. SEE ALSO gpsd8, gps1, libgps3, libgpsd3. AUTHOR Reinhard Arlt reinhard.arlt@t-online.de. gpsd-3.15/gpsmon.c0000664000175000017500000011562212520742615012227 0ustar esresr/* * The generic GPS packet monitor. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* expected to declare select(2) a la SuS */ #include #include #include #include #include #include "gpsd.h" #include "gps_json.h" #include "gpsmon.h" #include "gpsdclient.h" #include "revision.h" #include "strfuncs.h" #include "timespec.h" #define BUFLEN 2048 /* external capability tables */ extern struct monitor_object_t nmea_mmt, sirf_mmt, ashtech_mmt; extern struct monitor_object_t garmin_mmt, garmin_bin_ser_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, tnt_mmt, aivdm_mmt; #ifdef NMEA_ENABLE extern const struct gps_type_t driver_nmea0183; #endif /* NMEA_ENABLE */ /* These are public */ struct gps_device_t session; WINDOW *devicewin; bool serial; /* These are private */ static struct gps_context_t context; static bool curses_active; static WINDOW *statwin, *cmdwin; static WINDOW *packetwin; static FILE *logfile; static char *type_name; static size_t promptlen = 0; struct termios cooked, rare; struct fixsource_t source; #ifdef NTP_ENABLE struct timedelta_t time_offset; #endif /* NTP_ENABLE */ #ifdef PASSTHROUGH_ENABLE /* no methods, it's all device window */ extern const struct gps_type_t driver_json_passthrough; const struct monitor_object_t json_mmt = { .initialize = NULL, .update = NULL, .command = NULL, .wrap = NULL, .min_y = 0, .min_x = 80, /* no need for a device window */ .driver = &driver_json_passthrough, }; #endif /* PASSTHROUGH_ENABLE */ static const struct monitor_object_t *monitor_objects[] = { #ifdef NMEA_ENABLE &nmea_mmt, #if defined(GARMIN_ENABLE) && defined(NMEA_ENABLE) &garmin_mmt, #endif /* GARMIN_ENABLE && NMEA_ENABLE */ #if defined(GARMIN_ENABLE) && defined(BINARY_ENABLE) &garmin_bin_ser_mmt, #endif /* defined(GARMIN_ENABLE) && defined(BINARY_ENABLE) */ #ifdef ASHTECH_ENABLE &ashtech_mmt, #endif /* ASHTECH_ENABLE */ #ifdef FV18_ENABLE &fv18_mmt, #endif /* FV18_ENABLE */ #ifdef GPSCLOCK_ENABLE &gpsclock_mmt, #endif /* GPSCLOCK_ENABLE */ #ifdef MTK3301_ENABLE &mtk3301_mmt, #endif /* MTK3301_ENABLE */ #ifdef AIVDM_ENABLE &aivdm_mmt, #endif /* AIVDM_ENABLE */ #endif /* NMEA_ENABLE */ #if defined(SIRF_ENABLE) && defined(BINARY_ENABLE) &sirf_mmt, #endif /* defined(SIRF_ENABLE) && defined(BINARY_ENABLE) */ #if defined(UBLOX_ENABLE) && defined(BINARY_ENABLE) &ubx_mmt, #endif /* defined(UBLOX_ENABLE) && defined(BINARY_ENABLE) */ #if defined(ITRAX_ENABLE) && defined(BINARY_ENABLE) &italk_mmt, #endif /* defined(ITALK_ENABLE) && defined(BINARY_ENABLE) */ #if defined(SUPERSTAR2_ENABLE) && defined(BINARY_ENABLE) &superstar2_mmt, #endif /* defined(SUPERSTAR2_ENABLE) && defined(BINARY_ENABLE) */ #if defined(ONCORE_ENABLE) && defined(BINARY_ENABLE) &oncore_mmt, #endif /* defined(ONCORE_ENABLE) && defined(BINARY_ENABLE) */ #ifdef TNT_ENABLE &tnt_mmt, #endif /* TNT_ENABLE */ #ifdef PASSTHROUGH_ENABLE &json_mmt, #endif /* PASSTHROUGH_ENABLE */ NULL, }; static const struct monitor_object_t **active; static const struct gps_type_t *fallback; static jmp_buf terminate; #define display (void)mvwprintw /* termination codes */ #define TERM_SELECT_FAILED 1 #define TERM_DRIVER_SWITCH 2 #define TERM_EMPTY_READ 3 #define TERM_READ_ERROR 4 #define TERM_SIGNAL 5 #define TERM_QUIT 6 /* PPS monitoring */ #if defined(PPS_ENABLE) static inline void report_lock(void) { gpsd_acquire_reporting_lock(); } static inline void report_unlock(void) { gpsd_release_reporting_lock(); } #else static inline void report_lock(void) { } static inline void report_unlock(void) { } #endif /* PPS_ENABLE */ #define PPSBAR "-------------------------------------" \ " PPS " \ "-------------------------------------\n" /****************************************************************************** * * Visualization helpers * ******************************************************************************/ #ifdef PPS_ENABLE static void visibilize(char *buf2, size_t len2, const char *buf) /* string is mostly printable, dress up the nonprintables a bit */ { const char *sp; buf2[0] = '\0'; for (sp = buf; *sp != '\0' && strlen(buf2)+4 < len2; sp++) if (isprint((unsigned char) *sp) || (sp[0] == '\n' && sp[1] == '\0') || (sp[0] == '\r' && sp[2] == '\0')) (void)snprintf(buf2 + strlen(buf2), 2, "%c", *sp); else (void)snprintf(buf2 + strlen(buf2), 6, "\\x%02x", (unsigned)(*sp & 0xff)); } #endif /* PPS_ENABLE */ static void cond_hexdump(char *buf2, size_t len2, const char *buf, size_t len) /* pass through visibilized if all printable, hexdump otherwise */ { size_t i; bool printable = true; for (i = 0; i < len; i++) if (!isprint((unsigned char) buf[i]) && !isspace((unsigned char) buf[i])) printable = false; if (printable) { size_t j; for (i = j = 0; i < len && j < len2 - 1; i++) if (isprint((unsigned char) buf[i])) { buf2[j++] = buf[i]; buf2[j] = '\0'; } else { if (TEXTUAL_PACKET_TYPE(session.lexer.type)) { if (i == len - 1 && buf[i] == '\n') continue; if (i == len - 2 && buf[i] == '\r') continue; } (void)snprintf(&buf2[j], len2-strlen(buf2), "\\x%02x", (unsigned int)(buf[i] & 0xff)); j = strlen(buf2); } } else { buf2[0] = '\0'; for (i = 0; i < len; i++) str_appendf(buf2, len2, "%02x", (unsigned int)(buf[i] & 0xff)); } } #ifdef NTP_ENABLE void toff_update(WINDOW *win, int y, int x) { assert(win != NULL); if (time_offset.real.tv_sec != 0) { /* NOTE: can not use double here due to precision requirements */ struct timespec timedelta; int i, ymax, xmax; getmaxyx(win, ymax, xmax); assert(ymax > 0); /* squash a compiler warning */ (void)wmove(win, y, x); /* * The magic number shortening the field works because * we know we'll never see more than 5 digits of seconds * rather than 10. */ for (i = 0; i < TIMESPEC_LEN-4 && x + i < xmax - 1; i++) (void)waddch(win, ' '); TS_SUB(&timedelta, &time_offset.clock, &time_offset.real); if ( 86400 < (long)labs(timedelta.tv_sec) ) { /* more than one day off, overflow */ /* need a bigger field to show it */ (void)mvwaddstr(win, y, x, "> 1 day"); } else { char buf[TIMESPEC_LEN]; timespec_str(&timedelta, buf, sizeof(buf)); (void)mvwaddstr(win, y, x, buf); } } } #endif /* NTP_ENABLE */ #ifdef PPS_ENABLE void pps_update(WINDOW *win, int y, int x) { struct timedelta_t ppstimes; assert(win != NULL); if (pps_thread_ppsout(&session.pps_thread, &ppstimes) > 0) { /* NOTE: can not use double here due to precision requirements */ struct timespec timedelta; int i, ymax, xmax; getmaxyx(win, ymax, xmax); assert(ymax > 0); /* squash a compiler warning */ (void)wmove(win, y, x); /* see toff_update() for explanation of the magic number */ for (i = 0; i < TIMESPEC_LEN-4 && x + i < xmax - 1; i++) (void)waddch(win, ' '); TS_SUB( &timedelta, &ppstimes.clock, &ppstimes.real); if ( 86400 < (long)labs(timedelta.tv_sec) ) { /* more than one day off, overflow */ /* need a bigger field to show it */ (void)mvwaddstr(win, y, x, "> 1 day"); } else { char buf[TIMESPEC_LEN]; timespec_str(&timedelta, buf, sizeof(buf)); (void)mvwaddstr(win, y, x, buf); } (void)wnoutrefresh(win); } } #endif /* PPS_ENABLE */ /****************************************************************************** * * Curses I/O * ******************************************************************************/ void monitor_fixframe(WINDOW * win) { int ymax, xmax, ycur, xcur; assert(win != NULL); getyx(win, ycur, xcur); getmaxyx(win, ymax, xmax); assert(xcur > -1 && ymax > 0); /* squash a compiler warning */ (void)mvwaddch(win, ycur, xmax - 1, ACS_VLINE); } #if defined(CONTROLSEND_ENABLE) || defined(RECONFIGURE_ENABLE) static void packet_dump(const char *buf, size_t buflen) { if (packetwin != NULL) { char buf2[buflen * 2]; cond_hexdump(buf2, buflen * 2, buf, buflen); (void)waddstr(packetwin, buf2); (void)waddch(packetwin, (chtype)'\n'); } } static void monitor_dump_send(const char *buf, size_t len) { if (packetwin != NULL) { report_lock(); (void)wattrset(packetwin, A_BOLD); (void)wprintw(packetwin, ">>>"); packet_dump(buf, len); (void)wattrset(packetwin, A_NORMAL); report_unlock(); } } #endif /* defined(CONTROLSEND_ENABLE) || defined(RECONFIGURE_ENABLE) */ static void gpsmon_report(const char *buf) /* log to the packet window if curses is up, otherwise stdout */ { /* report locking is left to caller */ if (!curses_active) (void)fputs(buf, stdout); else if (packetwin != NULL) (void)waddstr(packetwin, buf); if (logfile != NULL) (void)fputs(buf, logfile); } #ifdef PPS_ENABLE static void packet_vlog(char *buf, size_t len, const char *fmt, va_list ap) { char buf2[BUFSIZ]; visibilize(buf2, sizeof(buf2), buf); report_lock(); (void)vsnprintf(buf2 + strlen(buf2), len, fmt, ap); gpsmon_report(buf2); report_unlock(); } #endif #ifdef RECONFIGURE_ENABLE static void announce_log(const char *fmt, ...) { char buf[BUFSIZ]; va_list ap; va_start(ap, fmt); (void)vsnprintf(buf, sizeof(buf) - 5, fmt, ap); va_end(ap); if (packetwin != NULL) { report_lock(); (void)wattrset(packetwin, A_BOLD); (void)wprintw(packetwin, ">>>"); (void)waddstr(packetwin, buf); (void)wattrset(packetwin, A_NORMAL); (void)wprintw(packetwin, "\n"); report_unlock(); } if (logfile != NULL) { (void)fprintf(logfile, ">>>%s\n", buf); } } #endif /* RECONFIGURE_ENABLE */ static void monitor_vcomplain(const char *fmt, va_list ap) { assert(cmdwin!=NULL); (void)wmove(cmdwin, 0, (int)promptlen); (void)wclrtoeol(cmdwin); (void)wattrset(cmdwin, A_BOLD); (void)vwprintw(cmdwin, (char *)fmt, ap); (void)wattrset(cmdwin, A_NORMAL); (void)wrefresh(cmdwin); (void)doupdate(); (void)wgetch(cmdwin); (void)wmove(cmdwin, 0, (int)promptlen); (void)wclrtoeol(cmdwin); (void)wrefresh(cmdwin); (void)wmove(cmdwin, 0, (int)promptlen); (void)doupdate(); } void monitor_complain(const char *fmt, ...) { va_list ap; va_start(ap, fmt); monitor_vcomplain(fmt, ap); va_end(ap); } void monitor_log(const char *fmt, ...) { if (packetwin != NULL) { va_list ap; report_lock(); va_start(ap, fmt); (void)vwprintw(packetwin, (char *)fmt, ap); va_end(ap); report_unlock(); } } static const char *promptgen(void) { static char buf[sizeof(session.gpsdata.dev.path)]; if (serial) (void)snprintf(buf, sizeof(buf), "%s %u %u%c%u", session.gpsdata.dev.path, session.gpsdata.dev.baudrate, 9 - session.gpsdata.dev.stopbits, session.gpsdata.dev.parity, session.gpsdata.dev.stopbits); else { (void)strlcpy(buf, session.gpsdata.dev.path, sizeof(buf)); if (source.device != NULL) { (void) strlcat(buf, ":", sizeof(buf)); (void) strlcat(buf, source.device, sizeof(buf)); } } return buf; } static void refresh_statwin(void) /* refresh the device-identification window */ { /* *INDENT-OFF* */ type_name = session.device_type ? session.device_type->type_name : "Unknown device"; /* *INDENT-ON* */ (void)wclear(statwin); (void)wattrset(statwin, A_BOLD); (void)mvwaddstr(statwin, 0, 0, promptgen()); (void)wattrset(statwin, A_NORMAL); (void)wnoutrefresh(statwin); } static void refresh_cmdwin(void) /* refresh the command window */ { (void)wmove(cmdwin, 0, 0); (void)wprintw(cmdwin, type_name); promptlen = strlen(type_name); if (fallback != NULL && strcmp(fallback->type_name, type_name) != 0) { (void)waddch(cmdwin, (chtype)' '); (void)waddch(cmdwin, (chtype)'('); (void)waddstr(cmdwin, fallback->type_name); (void)waddch(cmdwin, (chtype)')'); promptlen += strlen(fallback->type_name) + 3; } (void)wprintw(cmdwin, "> "); promptlen += 2; (void)wclrtoeol(cmdwin); (void)wnoutrefresh(cmdwin); } static bool curses_init(void) { (void)initscr(); (void)cbreak(); (void)intrflush(stdscr, FALSE); (void)keypad(stdscr, true); (void)clearok(stdscr, true); (void)clear(); (void)noecho(); curses_active = true; #define CMDWINHEIGHT 1 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) return false; (void)scrollok(packetwin, true); (void)wsetscrreg(packetwin, 0, LINES - CMDWINHEIGHT); (void)wmove(packetwin, 0, 0); refresh_statwin(); refresh_cmdwin(); return true; } static bool switch_type(const struct gps_type_t *devtype) { const struct monitor_object_t **trial, **newobject; newobject = NULL; for (trial = monitor_objects; *trial; trial++) { if (strcmp((*trial)->driver->type_name, devtype->type_name)==0) { newobject = trial; break; } } if (newobject) { if (LINES < (*newobject)->min_y + 1 || COLS < (*newobject)->min_x) { monitor_complain("%s requires %dx%d screen", (*newobject)->driver->type_name, (*newobject)->min_x, (*newobject)->min_y + 1); } else { int leftover; if (active != NULL) { if ((*active)->wrap != NULL) (*active)->wrap(); (void)delwin(devicewin); } active = newobject; devicewin = newwin((*active)->min_y, (*active)->min_x, 1, 0); /* screen might have JSOM on it from the init sequence */ (void)clearok(stdscr, true); (void)clear(); if ((devicewin == NULL) || ((*active)->initialize != NULL && !(*active)->initialize())) { monitor_complain("Internal initialization failure - screen " "must be at least 80x24. Aborting."); return false; } leftover = LINES - 1 - (*active)->min_y; report_lock(); if (leftover <= 0) { if (packetwin != NULL) (void)delwin(packetwin); packetwin = NULL; } else if (packetwin == NULL) { packetwin = newwin(leftover, COLS, (*active)->min_y + 1, 0); (void)scrollok(packetwin, true); (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); } report_unlock(); } return true; } monitor_complain("No monitor matches %s.", devtype->type_name); return false; } static void select_packet_monitor(struct gps_device_t *device) { static int last_type = BAD_PACKET; /* * Switch display types on packet receipt. Note, this *doesn't* * change the selection of the current device driver; that's done * within gpsd_multipoll() before this hook is called. */ if (device->lexer.type != last_type) { const struct gps_type_t *active_type = device->device_type; #ifdef NMEA_ENABLE if (device->lexer.type == NMEA_PACKET && ((device->device_type->flags & DRIVER_STICKY) != 0)) active_type = &driver_nmea0183; #endif /* NMEA_ENABLE */ if (!switch_type(active_type)) longjmp(terminate, TERM_DRIVER_SWITCH); else { refresh_statwin(); refresh_cmdwin(); } last_type = device->lexer.type; } if (active != NULL && device->lexer.outbuflen > 0 && (*active)->update != NULL) (*active)->update(); if (devicewin != NULL) (void)wnoutrefresh(devicewin); } static char *curses_get_command(void) /* char-by-char nonblocking input, return accumulated command line on \n */ { static char input[80]; static char line[80]; int c; c = wgetch(cmdwin); if (c == CTRL('L')) { (void)clearok(stdscr, true); if (active != NULL && (*active)->initialize != NULL) (void)(*active)->initialize(); } else if (c != '\r' && c != '\n') { size_t len = strlen(input); if (c == '\b' || c == KEY_LEFT || c == (int)erasechar()) { input[len--] = '\0'; } else if (isprint(c)) { input[len] = (char)c; input[++len] = '\0'; (void)waddch(cmdwin, (chtype)c); (void)wrefresh(cmdwin); (void)doupdate(); } return NULL; } (void)wmove(cmdwin, 0, (int)promptlen); (void)wclrtoeol(cmdwin); (void)wrefresh(cmdwin); (void)doupdate(); /* user finished entering a command */ if (input[0] == '\0') return NULL; else { (void) strlcpy(line, input, sizeof(line)); input[0] = '\0'; } /* handle it in the currently selected monitor object if possible */ if (serial && active != NULL && (*active)->command != NULL) { int status = (*active)->command(line); if (status == COMMAND_TERMINATE) longjmp(terminate, TERM_QUIT); else if (status == COMMAND_MATCH) return NULL; assert(status == COMMAND_UNKNOWN); } return line; } /****************************************************************************** * * Mode-independent I/O * * Below this line, all calls to curses-dependent functions are guarded * by curses_active and have ttylike alternatives. * ******************************************************************************/ #ifdef PPS_ENABLE static void packet_log(const char *fmt, ...) { char buf[BUFSIZ]; va_list ap; buf[0] = '\0'; va_start(ap, fmt); packet_vlog(buf, sizeof(buf), fmt, ap); va_end(ap); } #endif /* PPS_ENABLE */ static ssize_t gpsmon_serial_write(struct gps_device_t *session, const char *buf, const size_t len) /* pass low-level data to devices, echoing it to the log window */ { #if defined(CONTROLSEND_ENABLE) || defined(RECONFIGURE_ENABLE) monitor_dump_send((const char *)buf, len); #endif /* defined(CONTROLSEND_ENABLE) || defined(RECONFIGURE_ENABLE) */ return gpsd_serial_write(session, buf, len); } #ifdef CONTROLSEND_ENABLE bool monitor_control_send( unsigned char *buf, size_t len) { if (!serial) return false; else { ssize_t st; context.readonly = false; st = session.device_type->control_send(&session, (char *)buf, len); context.readonly = true; return (st != -1); } } static bool monitor_raw_send( unsigned char *buf, size_t len) { ssize_t st = gpsd_write(&session, (char *)buf, len); return (st > 0 && (size_t) st == len); } #endif /* CONTROLSEND_ENABLE */ static void complain(const char *fmt, ...) { va_list ap; va_start(ap, fmt); if (curses_active) monitor_vcomplain(fmt, ap); else { (void)vfprintf(stderr, fmt, ap); (void)fputc('\n', stderr); } va_end(ap); } /***************************************************************************** * * Main sequence * *****************************************************************************/ static void gpsmon_hook(struct gps_device_t *device, gps_mask_t changed UNUSED) /* per-packet hook */ { char buf[BUFSIZ]; #if defined(SOCKET_EXPORT_ENABLE) && defined(PPS_ENABLE) if (!serial && str_starts_with((char*)device->lexer.outbuffer, "{\"class\":\"TOFF\",")) { const char *end = NULL; int status = json_toff_read((const char *)device->lexer.outbuffer, &session.gpsdata, &end); if (status != 0) { complain("Ill-formed TOFF packet: %d (%s)", status, json_error_string(status)); return; } else { if (!curses_active) (void)fprintf(stderr, "TOFF=%ld.%09ld real=%ld.%09ld\n", (long)session.gpsdata.toff.clock.tv_sec, (long)session.gpsdata.toff.clock.tv_nsec, (long)session.gpsdata.toff.real.tv_sec, (long)session.gpsdata.toff.real.tv_nsec); #ifdef NTP_ENABLE time_offset = session.gpsdata.toff; #endif /* NTP_ENABLE */ return; } } else if (!serial && str_starts_with((char*)device->lexer.outbuffer, "{\"class\":\"PPS\",")) { const char *end = NULL; struct gps_data_t noclobber; int status = json_pps_read((const char *)device->lexer.outbuffer, &noclobber, &end); if (status != 0) { complain("Ill-formed PPS packet: %d (%s)", status, json_error_string(status)); return; } else { struct timespec timedelta; char timedelta_str[TIMESPEC_LEN]; TS_SUB( &timedelta, &noclobber.pps.real, &noclobber.pps.clock); timespec_str( &timedelta, timedelta_str, sizeof(timedelta_str) ); if (!curses_active) { char pps_clock_str[TIMESPEC_LEN]; char pps_real_str[TIMESPEC_LEN]; timespec_str( &noclobber.pps.clock, pps_clock_str, sizeof(pps_clock_str) ); timespec_str( &noclobber.pps.real, pps_real_str, sizeof(pps_real_str) ); (void)fprintf(stderr, "PPS=%.20s clock=%.20s offset=%.20s\n", pps_clock_str, pps_real_str, timedelta_str); } (void)snprintf(buf, sizeof(buf), "------------------- PPS offset: %.20s ------\n ", timedelta_str); /* * In direct mode this would be a bad idea, but we're not actually * watching for handshake events on a spawned thread here. */ /* coverity[missing_lock] */ session.pps_thread.pps_out = noclobber.pps; /* coverity[missing_lock] */ session.pps_thread.ppsout_count++; } } else #endif /* PPS_ENABLE */ { #ifdef __future__ if (!serial) { if (device->lexer.type == JSON_PACKET) { const char *end = NULL; libgps_json_unpack((char *)device->lexer.outbuffer, &session.gpsdata, &end); } } #endif /* __future__ */ if (curses_active) select_packet_monitor(device); (void)snprintf(buf, sizeof(buf), "(%d) ", (int)device->lexer.outbuflen); cond_hexdump(buf + strlen(buf), sizeof(buf) - strlen(buf), (char *)device->lexer.outbuffer,device->lexer.outbuflen); (void)strlcat(buf, "\n", sizeof(buf)); } report_lock(); if (!curses_active) (void)fputs(buf, stdout); else { if (packetwin != NULL) { (void)waddstr(packetwin, buf); (void)wnoutrefresh(packetwin); } (void)doupdate(); } if (logfile != NULL && device->lexer.outbuflen > 0) { UNUSED size_t written_count = fwrite (device->lexer.outbuffer, sizeof(char), device->lexer.outbuflen, logfile); assert(written_count >= 1); } report_unlock(); #ifdef NTP_ENABLE /* Update the last fix time seen for PPS if we've actually seen one, * and it is a new second. */ if ( 0 != isnan(device->newdata.time)) { // "NTP: bad new time #if defined(PPS_ENABLE) } else if (device->newdata.time <= device->pps_thread.fix_in.real.tv_sec) { // "NTP: Not a new time #endif /* PPS_ENABLE */ } else ntp_latch(device, &time_offset); #endif /* NTP_ENABLE */ } static bool do_command(const char *line) { #ifdef RECONFIGURE_ENABLE unsigned int v; #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE unsigned char buf[BUFLEN]; #endif /* CONTROLSEND_ENABLE */ const char *arg; if (isspace((unsigned char) line[1])) { for (arg = line + 2; *arg != '\0' && isspace((unsigned char) *arg); arg++) arg++; arg++; } else arg = line + 1; switch (line[0]) { #ifdef RECONFIGURE_ENABLE case 'c': /* change cycle time */ if (session.device_type == NULL) complain("No device defined yet"); else if (!serial) complain("Only available in low-level mode."); else { double rate = strtod(arg, NULL); const struct gps_type_t *switcher = session.device_type; if (fallback != NULL && fallback->rate_switcher != NULL) switcher = fallback; if (switcher->rate_switcher != NULL) { /* *INDENT-OFF* */ context.readonly = false; if (switcher->rate_switcher(&session, rate)) { announce_log("[Rate switcher called.]"); } else complain("Rate not supported."); context.readonly = true; /* *INDENT-ON* */ } else complain ("Device type %s has no rate switcher", switcher->type_name); } #endif /* RECONFIGURE_ENABLE */ break; case 'i': /* start probing for subtype */ if (session.device_type == NULL) complain("No GPS type detected."); else if (!serial) complain("Only available in low-level mode."); else { if (strcspn(line, "01") == strlen(line)) context.readonly = !context.readonly; else context.readonly = (atoi(line + 1) == 0); #ifdef RECONFIGURE_ENABLE announce_log("[probing %sabled]", context.readonly ? "dis" : "en"); #endif /* RECONFIGURE_ENABLE */ if (!context.readonly) /* magic - forces a reconfigure */ session.lexer.counter = 0; } break; case 'l': /* open logfile */ report_lock(); if (logfile != NULL) { if (packetwin != NULL) (void)wprintw(packetwin, ">>> Logging off\n"); (void)fclose(logfile); } if ((logfile = fopen(line + 1, "a")) != NULL) if (packetwin != NULL) (void)wprintw(packetwin, ">>> Logging to %s\n", line + 1); report_unlock(); break; #ifdef RECONFIGURE_ENABLE case 'n': /* change mode */ /* if argument not specified, toggle */ if (strcspn(line, "01") == strlen(line)) { /* *INDENT-OFF* */ v = (unsigned int)TEXTUAL_PACKET_TYPE( session.lexer.type); /* *INDENT-ON* */ } else v = (unsigned)atoi(line + 1); if (session.device_type == NULL) complain("No device defined yet"); else if (!serial) complain("Only available in low-level mode."); else { const struct gps_type_t *switcher = session.device_type; if (fallback != NULL && fallback->mode_switcher != NULL) switcher = fallback; if (switcher->mode_switcher != NULL) { context.readonly = false; announce_log("[Mode switcher to mode %d]", v); switcher->mode_switcher(&session, (int)v); context.readonly = true; (void)tcdrain(session.gpsdata.gps_fd); (void)usleep(50000); /* * Session device change will be set to NMEA when * gpsmon resyncs. So stash the current type to * be restored if we do 'n' from NMEA mode. */ if (v == 0) fallback = switcher; } else complain ("Device type %s has no mode switcher", switcher->type_name); } break; #endif /* RECONFIGURE_ENABLE */ case 'q': /* quit */ return false; #ifdef RECONFIGURE_ENABLE case 's': /* change speed */ if (session.device_type == NULL) complain("No device defined yet"); else if (!serial) complain("Only available in low-level mode."); else { speed_t speed; char parity = session.gpsdata.dev.parity; unsigned int stopbits = (unsigned int)session.gpsdata.dev.stopbits; char *modespec; const struct gps_type_t *switcher = session.device_type; if (fallback != NULL && fallback->speed_switcher != NULL) switcher = fallback; modespec = strchr(arg, ':'); if (modespec != NULL) { if (strchr("78", *++modespec) == NULL) { complain ("No support for that word length."); break; } parity = *++modespec; if (strchr("NOE", parity) == NULL) { complain("What parity is '%c'?.", parity); break; } stopbits = (unsigned int)*++modespec; if (strchr("12", (char)stopbits) == NULL) { complain("Stop bits must be 1 or 2."); break; } stopbits = (unsigned int)(stopbits - '0'); } speed = (unsigned)atoi(arg); /* *INDENT-OFF* */ if (switcher->speed_switcher) { context.readonly = false; if (switcher->speed_switcher(&session, speed, parity, (int) stopbits)) { announce_log("[Speed switcher called.]"); /* * See the comment attached to the 'DEVICE' * 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 complain ("Speed/mode combination not supported."); context.readonly = true; } else complain ("Device type %s has no speed switcher", switcher->type_name); /* *INDENT-ON* */ if (curses_active) refresh_statwin(); } break; #endif /* RECONFIGURE_ENABLE */ case 't': /* force device type */ if (!serial) complain("Only available in low-level mode."); else 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) { 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* */ if (curses_active) refresh_cmdwin(); } else { complain("Multiple driver type names match '%s'.", arg); } } break; #ifdef CONTROLSEND_ENABLE case 'x': /* send control packet */ if (session.device_type == NULL) complain("No device defined yet"); else if (!serial) complain("Only available in low-level mode."); else { int st = gpsd_hexpack(arg, (char *)buf, strlen(arg)); if (st < 0) complain("Invalid hex string (error %d)", st); else if (session.device_type->control_send == NULL) complain("Device type %s has no control-send method.", session.device_type->type_name); else if (!monitor_control_send(buf, (size_t) st)) complain("Control send failed."); } break; case 'X': /* send raw packet */ if (!serial) complain("Only available in low-level mode."); else { ssize_t len = (ssize_t) gpsd_hexpack(arg, (char *)buf, strlen(arg)); if (len < 0) complain("Invalid hex string (error %d)", len); else if (!monitor_raw_send(buf, (size_t) len)) complain("Raw send failed."); } break; #endif /* CONTROLSEND_ENABLE */ default: complain("Unknown command '%c'", line[0]); break; } /* continue accepting commands */ return true; } #ifdef PPS_ENABLE static char *pps_report(volatile struct pps_thread_t *pps_thread UNUSED, struct timedelta_t *td UNUSED) { packet_log(PPSBAR); return "gpsmon"; } #endif /* PPS_ENABLE */ static jmp_buf assertbuf; static void onsig(int sig UNUSED) { if (sig == SIGABRT) longjmp(assertbuf, 1); else longjmp(terminate, TERM_SIGNAL); } #define WATCHRAW "?WATCH={\"raw\":2,\"pps\":true}\r\n" #define WATCHRAWDEVICE "?WATCH={\"raw\":2,\"pps\":true,\"device\":\"%s\"}\r\n" #define WATCHNMEA "?WATCH={\"nmea\":true,\"pps\":true}\r\n" #define WATCHNMEADEVICE "?WATCH={\"nmea\":true,\"pps\":true,\"device\":\"%s\"}\r\n" /* this placement avoids a compiler warning */ static const char *cmdline; int main(int argc, char **argv) { int option; char *explanation; int bailout = 0, matches = 0; bool nmea = false; fd_set all_fds; fd_set rfds; volatile int maxfd = 0; char inbuf[80]; volatile bool nocurses = false; int activated = -1; (void)putenv("TZ=UTC"); // for ctime() gps_context_init(&context, "gpsmon"); // initialize the report mutex context.serial_write = gpsmon_serial_write; context.errout.report = gpsmon_report; while ((option = getopt(argc, argv, "aD:LVhl:nt:?")) != -1) { switch (option) { case 'a': nocurses = true; break; case 'D': context.errout.debug = atoi(optarg); #if defined(CLIENTDEBUG_ENABLE) && defined(SOCKET_EXPORT_ENABLE) json_enable_debug(context.errout.debug - 2, stderr); #endif break; case 'L': /* list known device types */ (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); #ifdef RECONFIGURE_ENABLE if ((*active)->driver->mode_switcher != NULL) (void)fputc('n', stdout); else (void)fputc(' ', stdout); (void)fputc(' ', stdout); if ((*active)->driver->speed_switcher != NULL) (void)fputc('s', stdout); else (void)fputc(' ', stdout); (void)fputc(' ', stdout); if ((*active)->driver->rate_switcher != NULL) (void)fputc('x', stdout); else (void)fputc(' ', stdout); (void)fputc(' ', stdout); #endif /* RECONFIGURE_ENABLE */ #ifdef CONTROLSEND_ENABLE if ((*active)->driver->control_send != NULL) (void)fputc('x', stdout); else (void)fputc(' ', stdout); #endif /* CONTROLSEND_ENABLE */ (void)fputc(' ', stdout); if ((*active)->command != NULL) (void)fputc('+', stdout); else (void)fputc(' ', stdout); (void)fputs("\t", stdout); (void)fputs((*active)->driver->type_name, stdout); (void)fputc('\n', stdout); } exit(EXIT_SUCCESS); case 'V': (void)printf("%s: %s (revision %s)\n", argv[0], VERSION, REVISION); exit(EXIT_SUCCESS); case 'l': /* enable logging at startup */ logfile = fopen(optarg, "w"); if (logfile == NULL) { (void)fprintf(stderr, "Couldn't open logfile for writing.\n"); exit(EXIT_FAILURE); } break; case 'T': case 't': fallback = NULL; for (active = monitor_objects; *active; active++) { if (str_starts_with((*active)->driver->type_name, optarg)) { fallback = (*active)->driver; matches++; } } if (matches > 1) { (void)fprintf(stderr, "-t option matched more than one driver.\n"); exit(EXIT_FAILURE); } else if (matches == 0) { (void)fprintf(stderr, "-t option didn't match any driver.\n"); exit(EXIT_FAILURE); } active = NULL; break; case 'n': nmea = true; break; case 'h': case '?': default: (void) fputs ("usage: gpsmon [-?hVn] [-l logfile] [-D debuglevel] " "[-t type] [server[:port:[device]]]\n", stderr); exit(EXIT_FAILURE); } } gpsd_time_init(&context, time(NULL)); gpsd_init(&session, &context, NULL); /* Grok the server, port, and device. */ if (optind < argc) { serial = str_starts_with(argv[optind], "/dev"); gpsd_source_spec(argv[optind], &source); } else { serial = false; gpsd_source_spec(NULL, &source); } if (serial) { (void) strlcpy(session.gpsdata.dev.path, source.device, sizeof(session.gpsdata.dev.path)); } else { if (strstr(source.server, "//") == 0) (void) strlcpy(session.gpsdata.dev.path, "tcp://", sizeof(session.gpsdata.dev.path)); else session.gpsdata.dev.path[0] = '\0'; str_appendf(session.gpsdata.dev.path, sizeof(session.gpsdata.dev.path), "%s:%s", source.server, source.port); } activated = gpsd_activate(&session, O_PROBEONLY); if ( 0 > activated ) { if ( PLACEHOLDING_FD == activated ) { (void)fputs("gpsmon:ERROR: PPS device unsupported\n", stderr); } exit(EXIT_FAILURE); } if (serial) { #ifdef PPS_ENABLE /* this guard suppresses a warning on Bluetooth devices */ if (session.sourcetype == source_rs232 || session.sourcetype == source_usb) { session.pps_thread.report_hook = pps_report; pps_thread_activate(&session.pps_thread); } #endif /* PPS_ENABLE */ } else { if (source.device != NULL) (void)gps_send(&session.gpsdata, nmea ? WATCHNMEADEVICE : WATCHRAWDEVICE, source.device); else (void)gps_send(&session.gpsdata, nmea ? WATCHNMEA : WATCHRAW); } /* * This is a monitoring utility. Disable autoprobing, because * in some cases (e.g. SiRFs) there is no way to probe a chip * type without flipping it to native mode. */ context.readonly = true; /* quit cleanly if an assertion fails */ (void)signal(SIGABRT, onsig); if (setjmp(assertbuf) > 0) { if (logfile) (void)fclose(logfile); if (curses_active) (void)endwin(); (void)fputs("gpsmon: assertion failure, probable I/O error\n", stderr); exit(EXIT_FAILURE); } FD_ZERO(&all_fds); #ifndef __clang_analyzer__ FD_SET(0, &all_fds); /* accept keystroke inputs */ #endif /* __clang_analyzer__ */ FD_SET(session.gpsdata.gps_fd, &all_fds); if (session.gpsdata.gps_fd > maxfd) maxfd = session.gpsdata.gps_fd; if ((bailout = setjmp(terminate)) == 0) { (void)signal(SIGQUIT, onsig); (void)signal(SIGINT, onsig); (void)signal(SIGTERM, onsig); if (nocurses) { (void)fputs("gpsmon: ", stdout); (void)fputs(promptgen(), stdout); (void)fputs("\n", stdout); (void)tcgetattr(0, &cooked); (void)tcgetattr(0, &rare); rare.c_lflag &=~ (ICANON | ECHO); rare.c_cc[VMIN] = (cc_t)1; (void)tcflush(0, TCIFLUSH); (void)tcsetattr(0, TCSANOW, &rare); } else if (!curses_init()) goto quit; for (;;) { fd_set efds; switch(gpsd_await_data(&rfds, &efds, maxfd, &all_fds, &context.errout)) { case AWAIT_GOT_INPUT: break; case AWAIT_NOT_READY: /* no recovery from bad fd is possible */ if (FD_ISSET(session.gpsdata.gps_fd, &efds)) longjmp(terminate, TERM_SELECT_FAILED); continue; case AWAIT_FAILED: longjmp(terminate, TERM_SELECT_FAILED); break; } switch(gpsd_multipoll(FD_ISSET(session.gpsdata.gps_fd, &rfds), &session, gpsmon_hook, 0)) { case DEVICE_READY: FD_SET(session.gpsdata.gps_fd, &all_fds); break; case DEVICE_UNREADY: longjmp(terminate, TERM_EMPTY_READ); break; case DEVICE_ERROR: longjmp(terminate, TERM_READ_ERROR); break; case DEVICE_EOF: longjmp(terminate, TERM_QUIT); break; default: break; } if (FD_ISSET(0, &rfds)) { if (curses_active) cmdline = curses_get_command(); else { /* coverity[string_null_argument] */ ssize_t st = read(0, &inbuf, 1); if (st == 1) { #ifdef PPS_ENABLE gpsd_acquire_reporting_lock(); #endif /* PPS_ENABLE*/ (void)tcflush(0, TCIFLUSH); (void)tcsetattr(0, TCSANOW, &cooked); (void)fputs("gpsmon: ", stdout); (void)fputs(promptgen(), stdout); (void)fputs("> ", stdout); (void)putchar(inbuf[0]); cmdline = fgets(inbuf+1, (int)strlen(inbuf)-1, stdin); cmdline--; } } if (cmdline != NULL && !do_command(cmdline)) longjmp(terminate, TERM_QUIT); if (!curses_active) { (void)sleep(2); (void)tcsetattr(0, TCSANOW, &rare); #ifdef PPS_ENABLE gpsd_release_reporting_lock(); #endif /* PPS_ENABLE*/ } } } } quit: /* we'll fall through to here on longjmp() */ #ifdef PPS_ENABLE /* Shut down PPS monitoring. */ if (serial) (void)pps_thread_deactivate(&session.pps_thread); #endif /* PPS_ENABLE*/ gpsd_close(&session); if (logfile) (void)fclose(logfile); if (curses_active) (void)endwin(); else (void)tcsetattr(0, TCSANOW, &cooked); 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; case TERM_SIGNAL: case TERM_QUIT: /* normal exit, no message */ break; default: explanation = "Unknown error, should never happen.\n"; break; } if (explanation != NULL) (void)fputs(explanation, stderr); exit(EXIT_SUCCESS); } /* gpsmon.c ends here */ gpsd-3.15/gpsmon.h0000664000175000017500000000263012506317033012222 0ustar esresr/* gpsmon.h -- what monitor capabuilities look like * * By Eric S. Raymond, 2009 * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _GPSD_GPSMON_H_ #define _GPSD_GPSMON_H_ #include #define COMMAND_TERMINATE -1 #define COMMAND_MATCH 1 #define COMMAND_UNKNOWN 0 struct monitor_object_t { /* a device-specific capability table for the monitor */ bool (*initialize)(void); /* paint legends on windows */ void (*update)(void); /* now paint the data */ int (*command)(char[]); /* interpret device-specific commands */ void (*wrap)(void); /* deallocate storage */ int min_y, min_x; /* space required for device info */ const struct gps_type_t *driver; /* device driver table */ }; // Device-specific may need these. extern bool monitor_control_send(unsigned char *buf, size_t len); extern void monitor_fixframe(WINDOW *win); extern void monitor_log(const char *fmt, ...); extern void monitor_complain(const char *fmt, ...); #define BUFLEN 2048 extern WINDOW *devicewin; extern struct gps_device_t session; extern bool serial; /* True - direct mode, False - daemon mode */ #ifdef NTP_ENABLE void toff_update(WINDOW *, int, int); #endif /* NTP_ENABLE */ #ifdef PPS_ENABLE void pps_update(WINDOW *, int, int); #endif /* PPS_ENABLE */ #endif /* _GPSD_GPSMON_H_ */ /* gpsmon.h ends here */ gpsd-3.15/gpsmon.xml0000664000175000017500000004173512520742615012610 0ustar esresr 17 Feb 2009 gpsmon 1 The GPSD Project GPSD Documentation gpsmon real-time GPS packet monitor and control utility gpsmon -L -V -h -n -a -l logfile -t driver-prefix server :port :device device -D debuglevel DESCRIPTION gpsmon is a monitor that watches packets coming from a GPS and displays them along with diagnostic information. It supports commands that can be used to tweak GPS settings in various ways; some are device-independent, some vary with the GPS chipset type. It will behave sanely, just dumping packets, when connected to a GPS type it knows nothing about. gpsmon differs from a navigation client in that it mostly dumps raw data from the GPS, with only enough data-massaging to allow checks against expected output. In particular, this tool does not do any interpolation or modeling to derive climb/sink or error estimates. Nor does it discard altitude reports when the fix quality is too low. Unlike gpsd, gpsmon never writes control or probe strings to the device unless you explicitly tell it to. Thus, while it will auto-sync to binary packet types, it won't automatically reecognize a device shipping an extended NMEA protocol as anything other than a plain NMEA device. Use the option or the t to work around this. gpsmon is a designed to run in a terminal emulator with a minimum 25x80 size; the non-GUI interface is a design choice made to accommodate users operating in constrained environments and over telnet or ssh connections. If run in a larger window, the size of the packet-log window will be increased to fit. gpsmon accepts an -h option that displays a usage message, or a -V option to dump the package version and exit. This program may be run in either of two modes, as a client for the gpsd daemon (and its associated control socket) or directly connected to a specified serial device. When run with no argument, it attempts to connect to the daemon. If the argument begins with a server:port specification it will also attempt to connect to the daemon. If the argument looks like a bare server name it will attempt to connect to a daemon running on the default gpsd port on that server. Only if the device argument contains slashes but no colons will it be treated as a serial device for direct connection. In direct-connect mode gpsmon will hunt for a correct baud rate and lock on to it automatically. Possible cases look like this: localhost:/dev/ttyS1 Look at the default port of localhost, trying both IPv4 and IPv6 and watching output from serial device 1. example.com:2317 Look at port 2317 on example.com, trying both IPv4 and IPv6. 71.162.241.5:2317:/dev/ttyS3 Look at port 2317 at the specified IPv4 address, collecting data from attached serial device 3. [FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:2317:/dev/ttyS5 Look at port 2317 at the specified IPv6 address, collecting data from attached serial device 5. Unlike gpsd, gpsmon run in direct mode does not do its own device probing. Thus, in particular, if you point it at a GPS with a native binary mode that happens to be emitting NMEA, it won't identify the actual type unless the device emits a recognizable NMEA trigger sentence. The -t and -i options may help you. The -F option is only valid in client mode; it specifies a control socket to which the program should send device control strings. You must specify a valid pathname of a Unix-domain socket on your local filesystem. The -D option enables packet-getter debugging output and is probably only useful to developers of the GPSD code. Consult the packet-getter source code for relevant values. The -L option lists a table showing which GPS device types gpsmon has built-in support for, and which generic commands can be applied to which GPS types, and then exits. Note that this does not list type-specific commands associated with individual GPS types. The -l option sets up logging to a specified file to start immediately on device open. This may be useful is, for example, you want to capture the startup message from a device that displays firmware version information there. The -n option forces gpsmon to request NMEA0183 packets instead of the raw datastream from gpsd. The -t option sets up a fallback type. Give it a string that is a distinguishing prefix of exactly one driver type name; this will be used for mode, speed, and rate switching if the driver selected by the packet type lacks those capabilities. Most useful when the packet type is NMEA but the device is known to have a binary mode, such as SiRF binary. The -a option enables a special debugging mode that does not use screen painting. Packets are dumped normally; any character typed suspends packet dumping and brings up a command prompt. This feature will mainly be of interest to GPSD developers. After startup (without -a), the top part of the screen reports the contents of several especially interesting packet types. The "PPS" field, if nonempty, is the delta between the last 1PPS top of second and the system clock at that time. The bottom half of the screen is a scrolling hex dump of all packets the GPS is issuing. If the packet type is textual, any trailing CR/LF is omitted. Dump lines beginning >>> represent control packets sent to the GPS. Lines consisting of "PPS" surrounded by dashes, if present, indicate 1PPS and the start of the reporting cycle. COMMANDS The following device-independent commands are available while gpsmon is running: i (Direct mode only.) Enable/disable subtype probing and reinitialize the driver. In normal operation, gpsmon does not send configuration strings to the device (except for wakeup strings needed to get it to send data, if any). The command 'i1' causes it to send the same sequence of subtype probes that gpsd would. The command 'i0' turns off probing; 'i' alone toggles the bit. In either case, the current driver is re-selected; if the probe bit is enabled, probes will begin to be issued immediately. Note that enabling probing might flip the device into another mode; in particular, it will flip a SiRF chip into binary mode as if you had used the n command. This is due to a limitation in the SiRF firmware that we can't fix. This command will generally do nothing after the first time you use it, because the device type will already have been discovered. c (Direct mode only.) Change cycle time. Follow it with a number interpreted as a cycle time in seconds. Most devices have a fixed cycle time of 1 second, so this command may fail with a message. l Toggle packet logging. If packet logging is on, it will be turned off and the log closed. If it is off, logging to the filename following the l will be enabled. Differs from simply capturing the data from the GPS device in that only whole packets are logged. The logfile is opened for append, so you can log more than one portion of the packet stream and they will be stitched together correctly. n (Direct mode only.) With an argument of 0, switch device to NMEA mode at current speed; with an argument of 1, change to binary (native) mode. With no argument, toggle the setting. Will show an error if the device doesn't have such modes. After you switch a dual-protocol GPS to NMEA mode wityh this command, it retains the information about the original type and its control capabilities. That is why the device type listed before the prompt doesn't change. q Quit gpsmon. Control-C, or whatever your current interrupt character is, works as well. s (Direct mode only.) Change baud rate. Follow it with a number interpreted as bits per second, for example "s9600". The speed number may optionally be followed by a colon and a wordlength-parity-stopbits specification in the traditional style, e.g 8N1 (the default), 7E1, etc. Some devices don't support serial modes other than their default, so this command may fail with a message. Use this command with caution. On USB and Bluetooth GPSes it is also possible for serial mode setting to fail either because the serial adaptor chip does not support non-8N1 modes or because the device firmware does not properly synchronize the serial adaptor chip with the UART on the GPS chipset when the speed changes. These failures can hang your device, possibly requiring a GPS power cycle or (in extreme cases) physically disconnecting the NVRAM backup battery. t (Direct mode only.) Force a switch of monitoring type. Follow it with a string that is unique to the name of a gpsd driver with gpsmon support; gpsmon will switch to using that driver and display code. Will show an error message if there is no matching gpsd driver, or multiple matches, or the unique match has no display support in gpsmon. x (Direct mode only.) Send hex payload to device. Following the command letter you may type hex digit pairs; end with a newline. These will become the payload of a control packet shipped to the device. The packet will be wrapped with headers, trailers, and checksum appropriate for the current driver type. The first one or two bytes of the payload may be specially interpreted, see the description of the of gpsctl1. X (Direct mode only.) Send raw hex bytes to device. Following the command letter you may type hex digit pairs; end with a newline. These will be shipped to the device. Ctrl-S Freeze display, suspend scrolling in debug window. Ctrl-Q Unfreeze display, resume normal operation. NMEA support (These remarks apply to not just generic NMEA devices but all extended NMEA devices for which gpsmon presently has support.) All fields are raw data from the GPS except (a) the "Cooked PVT" window near top of screen, provided as a check and (b) the "PPS offset" field. There are no device-specific commands. Which generic commands are available may vary by type: examine the output of gpsmon -l to learn more. SiRF support Most information is raw from the GPS. Underlined fields are derived by translation from ECEF coordinates or application of leap-second and local time-zone offsets. 1PPS is the clock lag as usual. The following commands are supported for SiRF GPSes only: A (Direct mode only.) Toggle reporting of 50BPS subframe data. M (Direct mode only.) Set (M1) or clear (M0) static navigation. The SiRF documentation says Static navigation is a position filter designed to be used with motor vehicles. When the vehicle's velocity falls below a threshold, the position and heading are frozen, and velocity is set to zero. This condition will continue until the computed velocity rises above 1.2 times the threshold or until the computed position is at least a set distance from the frozen place. The threshold velocity and set distance may vary with software versions. Non-static mode is designed for use with road navigation software, which often snaps the reported position to the nearest road within some uncertainty radius. You probably want to turn static navigation off for pedestrian use, as it is likely to report speed zero and position changing in large jumps. P (Direct mode only.) Toggle navigation-parameter display mode. Toggles between normal display and one that shows selected navigation parameters from MID 19, including the Static Navigation bit toggled by the 'M' command. To interpret what you see, you will need a copy of the SiRF Binary Protocol Reference Manual. u-blox support Most information is raw from the GPS. Underlined fields are derived by translation from ECEF coordinates. 1PPS is the clock lag as usual. There are no per-type special commands. BUGS AND LIMITATIONS The PPS Offset field will never be updated when running in client mode, even if you can see PPS events in the packet window. This limitation may be fixed in a future release. SEE ALSO gpsd8, gpsdctl8, gps1, libgps3, libgpsd3, gpsprof1, gpsfake1, gpsctl1, gpscat1. gpspipe1. AUTHOR Eric S. Raymond esr@thyrsus.com. gpsd-3.15/gpspacket.c0000664000175000017500000002075712520742615012711 0ustar esresr/* * Python binding for the packet.c module. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ #include #include #include "gpsd.h" static PyObject *ErrorObject = NULL; static PyObject *report_callback = NULL; static void basic_report(const char *buf) { (void)fputs(buf, stderr); } void errout_reset(struct gpsd_errout_t *errout) { errout->debug = LOG_SHOUT; errout->report = basic_report; } void gpsd_log(const struct gpsd_errout_t *errout UNUSED, int errlevel, const char *fmt, ... ) { char buf[BUFSIZ]; PyObject *args; va_list ap; if (!report_callback) /* no callback defined, exit early */ return; if (!PyCallable_Check(report_callback)) { PyErr_SetString(ErrorObject, "Cannot call Python callback function"); return; } va_start(ap, fmt); (void)vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); args = Py_BuildValue("(is)", errlevel, buf); if (!args) return; PyObject_Call(report_callback, args, NULL); Py_DECREF(args); } static PyTypeObject Lexer_Type; typedef struct { PyObject_HEAD struct gps_lexer_t lexer; } LexerObject; static LexerObject * newLexerObject(PyObject *arg UNUSED) { LexerObject *self; self = PyObject_New(LexerObject, &Lexer_Type); if (self == NULL) return NULL; memset(&self->lexer, 0, sizeof(struct gps_lexer_t)); packet_reset(&self->lexer); return self; } /* Lexer methods */ static int Lexer_init(LexerObject *self) { packet_reset(&self->lexer); return 0; } static PyObject * Lexer_get(LexerObject *self, PyObject *args) { ssize_t len; int fd; if (!PyArg_ParseTuple(args, "i;missing or invalid file descriptor argument to gps.packet.get", &fd)) return NULL; len = packet_get(fd, &self->lexer); if (PyErr_Occurred()) return NULL; return Py_BuildValue("(i, i, s#, i)", len, self->lexer.type, self->lexer.outbuffer, self->lexer.outbuflen, self->lexer.char_counter); } static PyObject * Lexer_reset(LexerObject *self) { packet_reset(&self->lexer); if (PyErr_Occurred()) return NULL; return 0; } static void Lexer_dealloc(LexerObject *self) { PyObject_Del(self); } static PyMethodDef Lexer_methods[] = { {"get", (PyCFunction)Lexer_get, METH_VARARGS, PyDoc_STR("Get a packet from a file descriptor.")}, {"reset", (PyCFunction)Lexer_reset, METH_NOARGS, PyDoc_STR("Reset the packet lexer to ground state.")}, {NULL, NULL} /* sentinel */ }; static PyObject * Lexer_getattr(LexerObject *self, char *name) { return Py_FindMethod(Lexer_methods, (PyObject *)self, name); } PyDoc_STRVAR(Lexer__doc__, "GPS packet lexer object\n\ \n\ Fetch a single packet from file descriptor"); static PyTypeObject Lexer_Type = { /* The ob_type field must be initialized in the module init function * to be portable to Windows without using C++. */ PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ "gps.packet.lexer", /*tp_name*/ sizeof(LexerObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)Lexer_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ (getattrfunc)Lexer_getattr, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ Lexer__doc__, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ Lexer_methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ (initproc)Lexer_init, /*tp_init*/ 0, /*tp_alloc*/ 0, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ }; /* Function of no arguments returning new Lexer object */ static PyObject * gpspacket_new(PyObject *self UNUSED, PyObject *args UNUSED) { LexerObject *rv; if (!PyArg_ParseTuple(args, ":new")) return NULL; rv = newLexerObject(args); if (rv == NULL) return NULL; return (PyObject *)rv; } PyDoc_STRVAR(register_report__doc__, "register_report(callback)\n\ \n\ callback must be a callable object expecting a string as parameter."); static PyObject * register_report(LexerObject *self UNUSED, PyObject *args) { PyObject *callback = NULL; if (!PyArg_ParseTuple(args, "O:register_report", &callback)) return NULL; if (!PyCallable_Check(callback)) { PyErr_SetString(PyExc_TypeError, "First argument must be callable"); return NULL; } if (report_callback) { Py_DECREF(report_callback); report_callback = NULL; } report_callback = callback; Py_INCREF(report_callback); Py_INCREF(Py_None); return Py_None; } /* List of functions defined in the module */ static PyMethodDef packet_methods[] = { {"new", gpspacket_new, METH_VARARGS, PyDoc_STR("new() -> new packet-lexer object")}, {"register_report", (PyCFunction)register_report, METH_VARARGS, register_report__doc__}, {NULL, NULL} /* sentinel */ }; PyDoc_STRVAR(module_doc, "Python binding of the libgpsd module for recognizing GPS packets.\n\ The new() function returns a new packet-lexer instance. Lexer instances\n\ have two methods:\n\ get() takes a file descriptor argument and returns a tuple consisting of\n\ the integer packet type and string packet value. On end of file it returns\n\ (-1, '').\n\ reset() resets the packet-lexer to its initial state.\n\ The module also has a register_report() function that accepts a callback\n\ for debug message reporting. The callback will get two arguments, the error\n\ level of the message and the message itself.\n\ "); /* banishes a pointless compiler warning */ extern PyMODINIT_FUNC initpacket(void); PyMODINIT_FUNC // cppcheck-suppress unusedFunction initpacket(void) { PyObject *m; if (PyType_Ready(&Lexer_Type) < 0) return; /* Create the module and add the functions */ m = Py_InitModule3("packet", packet_methods, module_doc); PyModule_AddIntConstant(m, "BAD_PACKET", BAD_PACKET); PyModule_AddIntConstant(m, "COMMENT_PACKET", COMMENT_PACKET); PyModule_AddIntConstant(m, "NMEA_PACKET", NMEA_PACKET); PyModule_AddIntConstant(m, "AIVDM_PACKET", AIVDM_PACKET); PyModule_AddIntConstant(m, "GARMINTXT_PACKET", GARMINTXT_PACKET); PyModule_AddIntConstant(m, "SIRF_PACKET", SIRF_PACKET); PyModule_AddIntConstant(m, "ZODIAC_PACKET", ZODIAC_PACKET); PyModule_AddIntConstant(m, "TSIP_PACKET", TSIP_PACKET); PyModule_AddIntConstant(m, "EVERMORE_PACKET", EVERMORE_PACKET); PyModule_AddIntConstant(m, "ITALK_PACKET", ITALK_PACKET); PyModule_AddIntConstant(m, "GARMIN_PACKET", GARMIN_PACKET); PyModule_AddIntConstant(m, "NAVCOM_PACKET", NAVCOM_PACKET); PyModule_AddIntConstant(m, "UBX_PACKET", UBX_PACKET); PyModule_AddIntConstant(m, "SUPERSTAR2_PACKET", SUPERSTAR2_PACKET); PyModule_AddIntConstant(m, "ONCORE_PACKET", ONCORE_PACKET); PyModule_AddIntConstant(m, "GEOSTAR_PACKET", GEOSTAR_PACKET); PyModule_AddIntConstant(m, "RTCM2_PACKET", RTCM2_PACKET); PyModule_AddIntConstant(m, "RTCM3_PACKET", RTCM3_PACKET); PyModule_AddIntConstant(m, "JSON_PACKET", JSON_PACKET); PyModule_AddIntConstant(m, "PACKET_TYPES", PACKET_TYPES); PyModule_AddIntConstant(m, "LOG_ERROR", LOG_ERROR); PyModule_AddIntConstant(m, "LOG_SHOUT", LOG_SHOUT); PyModule_AddIntConstant(m, "LOG_WARN", LOG_WARN); PyModule_AddIntConstant(m, "LOG_CLIENT", LOG_CLIENT); PyModule_AddIntConstant(m, "LOG_INF", LOG_INF); PyModule_AddIntConstant(m, "LOG_PROG", LOG_PROG); PyModule_AddIntConstant(m, "LOG_IO", LOG_IO); PyModule_AddIntConstant(m, "LOG_DATA", LOG_DATA); PyModule_AddIntConstant(m, "LOG_SPIN", LOG_SPIN); PyModule_AddIntConstant(m, "LOG_RAW", LOG_RAW); } gpsd-3.15/gpspipe.c0000664000175000017500000002426312520742615012373 0ustar esresr/* * gpspipe * * a simple program to connect to a gpsd daemon and dump the received data * to stdout * * This will dump the raw NMEA from gpsd to stdout * gpspipe -r * * This will dump the super-raw data (gps binary) from gpsd to stdout * gpspipe -R * * This will dump the GPSD sentences from gpsd to stdout * gpspipe -w * * This will dump the GPSD and the NMEA sentences from gpsd to stdout * gpspipe -wr * * Original code by: Gary E. Miller . Cleanup by ESR. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ #include /* for time_t */ #include "gpsd_config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gpsd.h" #include "gpsd_config.h" #include "gpsdclient.h" #include "revision.h" static struct gps_data_t gpsdata; static void spinner(unsigned int, unsigned int); /* NMEA-0183 standard baud rate */ #define BAUDRATE B4800 /* Serial port variables */ static struct termios oldtio, newtio; static int fd_out = 1; /* output initially goes to standard output */ static char serbuf[255]; static int debug; 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) { fprintf(stderr, "gpspipe: error opening serial port\n"); exit(EXIT_FAILURE); } /* Save current serial port settings for later */ if (tcgetattr(fd_out, &oldtio) != 0) { fprintf(stderr, "gpspipe: error reading serial port settings\n"); exit(EXIT_FAILURE); } /* Clear struct for new port settings. */ bzero(&newtio, sizeof(newtio)); /* make it raw */ (void)cfmakeraw(&newtio); /* set speed */ (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)fprintf(stderr, "gpspipe: error configuring serial port\n"); exit(EXIT_FAILURE); } } static void usage(void) { (void)fprintf(stderr, "Usage: gpspipe [OPTIONS] [server[:port[:device]]]\n\n" "-d Run as a daemon.\n" "-o [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" "-S Set scaled flag.\n" "-2 Set the split24 flag.\n" "-l Sleep for ten seconds before connecting to gpsd.\n" "-t Time stamp the data.\n" "-T [format] set the timestamp format (strftime(3)-like; implies '-t')\n" "-u usec time stamp, implies -t. Use -uu to output sec.usec\n" "-s [serial dev] emulate a 4800bps NMEA GPS on serial port (use with '-r').\n" "-n [count] exit after count packets.\n" "-v Print a little spinner.\n" "-p Include profiling info in the JSON.\n" "-P Include PPS JSON in NMEA or raw mode.\n" "-V Print version and exit.\n\n" "You must specify one, or more, of -r, -R, or -w\n" "You must use -o if you use -d.\n"); } int main(int argc, char **argv) { char buf[4096]; bool timestamp = false; char *format = "%F %T"; char tmstr[200]; bool daemonize = false; bool binary = false; bool sleepy = false; bool new_line = true; bool raw = false; bool watch = false; bool profile = false; int option_u = 0; // option to show uSeconds long count = -1; int option; unsigned int vflag = 0, l = 0; FILE *fp; unsigned int flags; fd_set fds; struct fixsource_t source; char *serialport = NULL; char *outfile = NULL; flags = WATCH_ENABLE; while ((option = getopt(argc, argv, "?dD:lhrRwStT:vVn:s:o:pPu2")) != -1) { switch (option) { case 'D': debug = atoi(optarg); #ifdef CLIENTDEBUG_ENABLE gps_enable_debug(debug, stderr); #endif /* CLIENTDEBUG_ENABLE */ break; case 'n': count = strtol(optarg, 0, 0); break; case 'r': raw = true; /* * Yes, -r invokes NMEA mode rather than proper raw mode. * This emulates the behavior under the old protocol. */ flags |= WATCH_NMEA; break; case 'R': flags |= WATCH_RAW; binary = true; break; case 'd': daemonize = true; break; case 'l': sleepy = true; break; case 't': timestamp = true; break; case 'T': timestamp = true; format = optarg; break; case 'u': timestamp = true; option_u++; break; case 'v': vflag++; break; case 'w': flags |= WATCH_JSON; watch = true; break; case 'S': flags |= WATCH_SCALED; break; case 'p': profile = true; break; case 'P': flags |= WATCH_PPS; break; case 'V': (void)fprintf(stderr, "%s: %s (revision %s)\n", argv[0], VERSION, REVISION); exit(EXIT_SUCCESS); case 's': serialport = optarg; break; case 'o': outfile = optarg; break; case '2': flags |= WATCH_SPLIT24; break; case '?': case 'h': default: usage(); exit(EXIT_FAILURE); } } /* Grok the server, port, and device. */ if (optind < argc) { gpsd_source_spec(argv[optind], &source); } else gpsd_source_spec(NULL, &source); if (serialport != NULL && !raw) { (void)fprintf(stderr, "gpspipe: use of '-s' requires '-r'.\n"); exit(EXIT_FAILURE); } if (outfile == NULL && daemonize) { (void)fprintf(stderr, "gpspipe: use of '-d' requires '-o'.\n"); exit(EXIT_FAILURE); } if (!raw && !watch && !binary) { (void)fprintf(stderr, "gpspipe: one of '-R', '-r', or '-w' is required.\n"); exit(EXIT_FAILURE); } /* Daemonize if the user requested it. */ if (daemonize) if (daemon(0, 0) != 0) (void)fprintf(stderr, "gpspipe: demonization failed: %s\n", strerror(errno)); /* 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; } 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(EXIT_FAILURE); } } /* Open the serial port and set it up. */ if (serialport) open_serial(serialport); if (gps_open(source.server, source.port, &gpsdata) != 0) { (void)fprintf(stderr, "gpspipe: could not connect to gpsd %s:%s, %s(%d)\n", source.server, source.port, gps_errstr(errno), errno); exit(EXIT_FAILURE); } if (profile) flags |= WATCH_TIMING; if (source.device != NULL) flags |= WATCH_DEVICE; (void)gps_stream(&gpsdata, flags, source.device); if ((isatty(STDERR_FILENO) == 0) || daemonize) vflag = 0; for (;;) { int r = 0; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 100000; FD_ZERO(&fds); FD_SET(gpsdata.gps_fd, &fds); errno = 0; r = select(gpsdata.gps_fd+1, &fds, NULL, NULL, &tv); if (r == -1 && errno != EINTR) { (void)fprintf(stderr, "gpspipe: select error %s(%d)\n", strerror(errno), errno); exit(EXIT_FAILURE); } else if (r == 0) continue; if (vflag) spinner(vflag, l++); /* reading directly from the socket avoids decode overhead */ errno = 0; r = (int)read(gpsdata.gps_fd, buf, sizeof(buf)); if (r > 0) { int i = 0; int j = 0; for (i = 0; i < r; i++) { char c = buf[i]; if (j < (int)(sizeof(serbuf) - 1)) { serbuf[j++] = buf[i]; } if (new_line && timestamp) { char tmstr_u[20]; // time with "usec" resolution struct timespec now; struct tm *tmp_now; (void)clock_gettime(CLOCK_REALTIME, &now); tmp_now = localtime((time_t *)&(now.tv_sec)); (void)strftime(tmstr, sizeof(tmstr), format, tmp_now); new_line = 0; switch( option_u ) { case 2: (void)snprintf(tmstr_u, sizeof(tmstr_u), " %ld.%06ld", (long)now.tv_sec, (long)now.tv_nsec/1000); break; case 1: (void)snprintf(tmstr_u, sizeof(tmstr_u), ".%06ld", (long)now.tv_nsec/1000); break; default: *tmstr_u = '\0'; break; } if (fprintf(fp, "%.24s%s: ", tmstr, tmstr_u) <= 0) { (void)fprintf(stderr, "gpspipe: write error, %s(%d)\n", strerror(errno), errno); exit(EXIT_FAILURE); } } if (fputc(c, fp) == EOF) { fprintf(stderr, "gpspipe: write error, %s(%d)\n", strerror(errno), errno); exit(EXIT_FAILURE); } if (c == '\n') { if (serialport != NULL) { if (write(fd_out, serbuf, (size_t) j) == -1) { fprintf(stderr, "gpspipe: serial port write error, %s(%d)\n", strerror(errno), errno); exit(EXIT_FAILURE); } j = 0; } new_line = true; /* flush after every good line */ if (fflush(fp)) { (void)fprintf(stderr, "gpspipe: fflush error, %s(%d)\n", strerror(errno), errno); exit(EXIT_FAILURE); } if (count > 0) { if (0 >= --count) { /* completed count */ exit(EXIT_SUCCESS); } } } } } else { if (r == -1) { if (errno == EAGAIN) continue; else (void)fprintf(stderr, "gpspipe: read error %s(%d)\n", strerror(errno), errno); exit(EXIT_FAILURE); } else { exit(EXIT_SUCCESS); } } } #ifdef __UNUSED__ if (serialport != NULL) { /* Restore the old serial port settings. */ if (tcsetattr(fd_out, TCSANOW, &oldtio) != 0) { (void)fprintf(stderr, "gpsipe: error restoring serial port settings\n"); exit(EXIT_FAILURE); } } #endif /* __UNUSED__ */ exit(EXIT_SUCCESS); } static void spinner(unsigned int v, unsigned int num) { char *spin = "|/-\\"; (void)fprintf(stderr, "\010%c", spin[(num / (1 << (v - 1))) % 4]); (void)fflush(stderr); return; } gpsd-3.15/gpspipe.xml0000664000175000017500000001476012520742615012752 0ustar esresr 03 Aug 2005 gpspipe 1 The GPSD Project GPSD Documentation gpspipe tool to connect to gpsd and retrieve sentences gpspipe -h -d -l -o filename -n count -r -R -s serial-device -t -T timestamp-format -u -p -w -S -2 -v -D debug-level server :port :device DESCRIPTION gpspipe is a tool to connect to gpsd and output the received sentences to stdout. This makes the program useful as a pipe from gpsd to another program or file. gpspipe does not require root privileges, and can be run concurrently with other tools connecting to the local gpsd without causing problems. The output will consist of one or both of the raw NMEA or native gpsd sentences. Each line can be optionally time stamped. There is also an option to exit gracefully after a given count of packets. Optionally a server, TCP/IP port number and remote device can be given. If omitted, gpspipe connects to localhost on the default port (2947) and watches all devices opened by gpsd. gpspipe may be run as a daemon, but requires the -o flag for writing the output to a file. OPTIONS -h makes gpspipe print a usage message and exit. -d causes gpspipe to run as a daemon. -l causes gpspipe to sleep for ten seconds before attempting to connect to gpsd. This is very useful when running as a daemon, giving gpsd time to start before attempting a connection. -r causes raw NMEA sentences to be output. -R causes super-raw (gps binary) data to be output. This overrides NMEA and gpsd output modes. -s option causes the collected data to be written to the specified serial device with settings 4800 8N1. Thus gpspipe can be used with -s and -r options to emulate a serial port hardwired to a GPS that gpsd is managing. -o option causes the collected data to be written to the specified file. Use of this option is mandatory if gpspipe is run as a daemon. -w causes native gpsdsentences to be output. -S sets the scaled flag. -2 sets the split24 flag on AIS reports. Note: this option is experimental and may be changed or removed in a future release. -t adds a timestamp to each sentence output. -T sets the format of the timestamp. See strftime3 for the available placeholders. Setting this option implies -t. Default setting is "%F %T" -u usec resolution time stamp, implies -t. Use -uu to output sec.usec. -p enables dumping of profiling information in JSON. -P enables dumping of PPS drift JSON in NMEA and raw modes. -n [count] causes [count] sentences to be output. gpspipe will then exit gracefully. -v causes gpspipe to show a spinning activity indicator on stderr. This is useful if stdout is redirected into a file or a pipe. By default the spinner is advanced with every messages written; specifying -v more than once will double the number of messages required to rotate the spinner. -V prints the version, then exits. At least one of -R, -r or -w must be specified. EXAMPLE When gpsd is running gpspipe -r -n 100 will send one hundred raw NMEA sentences to standard output, then exit. SEE ALSO gpsd8, gps1, libgps3, libgpsd3, gpsprof1, gpsfake1, gpsctl1, gpscat1. gpsmon1. AUTHOR Gary E. Miller gem@rellim.com. gpsd-3.15/gpsprof0000775000175000017500000004250112513107374012160 0ustar esresr#!/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. # # Collect and plot latency-profiling data from a running gpsd. # Requires gnuplot. # import copy import getopt import gps import math import os import signal import socket import sys import time class Baton: "Ship progress indication to stderr." def __init__(self, prompt, endmsg=None): self.stream = sys.stderr self.stream.write(prompt + "...") if os.isatty(self.stream.fileno()): self.stream.write(" \b") self.stream.flush() self.count = 0 self.endmsg = endmsg self.time = time.time() return def twirl(self, ch=None): if self.stream is None: return if ch: self.stream.write(ch) elif os.isatty(self.stream.fileno()): self.stream.write("-/|\\"[self.count % 4]) self.stream.write("\b") self.count = self.count + 1 self.stream.flush() return def end(self, msg=None): if msg is None: msg = self.endmsg if self.stream: self.stream.write("...(%2.2f sec) %s.\n" % (time.time() - self.time, msg)) return class plotter: "Generic class for gathering and plotting sensor statistics." def __init__(self): self.fixes = [] self.start_time = int(time.time()) self.watch = {"TPV"} def whatami(self): "How do we identify this plotting run?" return "%s, %s, %d %dN%d, cycle %ds" % \ (gps.misc.isotime(self.start_time), self.device.get('driver', "unknown"), self.device['bps'], 9 - self.device['stopbits'], self.device['stopbits'], self.device['cycle']) def collect(self, verbose, logfp=None): "Collect data from the GPS." try: self.session = gps.gps(host=host, port=port, verbose=verbose) except socket.error: sys.stderr.write("gpsprof: gpsd unreachable.\n") sys.exit(1) # Initialize self.session.read() if self.session.version is None: sys.stderr.write("gpsprof: requires gpsd to speak new protocol.\n") sys.exit(1) # Set parameters flags = gps.WATCH_ENABLE | gps.WATCH_JSON if self.requires_time: flags |= gps.WATCH_TIMING if device: flags |= gps.WATCH_DEVICE try: signal.signal(signal.SIGUSR1, lambda empty, unused: sys.stderr.write("%d of %d (%d%%)..." % (await - countdown, await, ((await - countdown) * 100.0 / await)))) signal.siginterrupt(signal.SIGUSR1, False) self.session.stream(flags, device) baton = Baton("gpsprof: %d looking for fix" % os.getpid(), "done") countdown = await basetime = time.time() while countdown > 0: if self.session.read() == -1: sys.stderr.write("gpsprof: gpsd has vanished.\n") sys.exit(1) baton.twirl() if self.session.data["class"] == "ERROR": sys.stderr.write(" ERROR: %s.\n" % self.session.data["message"]) sys.exit(1) if self.session.data["class"] == "DEVICES": if len(self.session.data["devices"]) != 1 and not device: sys.stderr.write(" ERROR: multiple devices connected, you must explicitly specify the device.\n") sys.exit(1) for i in range(len(self.session.data["devices"])): self.device = copy.copy(self.session.data["devices"][i]) if self.device['path'] == device: break if self.session.data["class"] == "WATCH": if "timing" in options and not self.session.data.get("timing"): sys.stderr.write("timing is not enabled.\n") sys.exit(1) # Log before filtering - might be good for post-analysis. if logfp: logfp.write(self.session.response) # Ignore everything but what we're told to if self.session.data["class"] not in self.watch: continue # We can get some funky artifacts at start of self.session # apparently due to RS232 buffering effects. Ignore # them. if threshold and time.time() - basetime < self.session.cycle * threshold: continue if self.session.fix.mode <= gps.MODE_NO_FIX: continue if countdown == await: sys.stderr.write("first fix in %.2fsec, gathering %d samples..." % (time.time() - basetime, await)) if self.sample(): countdown -= 1 baton.end() finally: self.session.stream(gps.WATCH_DISABLE | gps.WATCH_TIMING) signal.signal(signal.SIGUSR1, signal.SIG_DFL) def replot(self, infp): "Replot from a JSON log file." baton = Baton("gpsprof: replotting", "done") self.session = gps.gps(host=None) for line in infp: baton.twirl() self.session.unpack(line) if self.session.data["class"] == "DEVICES": self.device = copy.copy(self.session.data["devices"][0]) elif self.session.data["class"] not in self.watch: continue self.sample() baton.end() def dump(self): "Dump the raw data for post-analysis." return self.header() + self.data() class spaceplot(plotter): "Spatial scattergram of fixes." name = "space" requires_time = False def __init__(self): plotter.__init__(self) self.recentered = [] def d(self, a, b): return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) def sample(self): # Watch out for the NaN value from gps.py. self.fixes.append((self.session.fix.latitude, self.session.fix.longitude, self.session.fix.altitude)) return True def header(self): return "# Position uncertainty, %s\n" % self.whatami() def postprocess(self): if not self.recentered: # centroid is just arithmetic avg of lat,lon self.centroid = (sum(map(lambda x: x[0], self.fixes)) / len(self.fixes), sum(map(lambda x: x[1], self.fixes)) / len(self.fixes)) # Sort fixes by distance from centroid self.fixes.sort(lambda x, y: cmp(self.d(self.centroid, x), self.d(self.centroid, y))) # Convert fixes to offsets from centroid in meters self.recentered = map(lambda fix: gps.MeterOffset(self.centroid, fix[:2]), self.fixes) def data(self): res = "" for i in range(len(self.recentered)): (lat, lon) = self.recentered[i][:2] (raw1, raw2, alt) = self.fixes[i] res += "%f\t%f\t%f\t%f\t%f\n" % (lat, lon, raw1, raw2, alt) return res def plot(self): # Compute CEP(50%) cep_meters = gps.EarthDistance(self.centroid[:2], self.fixes[int(len(self.fixes) * 0.50)][:2]) cep95_meters = gps.EarthDistance(self.centroid[:2], self.fixes[int(len(self.fixes) * 0.95)][:2]) cep99_meters = gps.EarthDistance(self.centroid[:2], self.fixes[int(len(self.fixes) * 0.99)][:2]) alt_sum = 0 alt_num = 0 alt_fixes = [] lon_max = -9999 for i in range(len(self.recentered)): (_lat, lon) = self.recentered[i][:2] (_raw1, _raw2, alt) = self.fixes[i] if not gps.isnan(alt): alt_sum += alt alt_fixes.append(alt) alt_num += 1 if lon > lon_max: lon_max = lon if alt_num == 0: alt_avg = gps.NaN alt_ep = gps.NaN else: alt_avg = alt_sum / alt_num # Sort fixes by distance from average altitude alt_fixes.sort(lambda x, y: cmp(abs(alt_avg - x), abs(alt_avg - y))) alt_ep = abs(alt_fixes[len(alt_fixes) / 2] - alt_avg) if self.centroid[0] < 0: latstring = "%fS" % -self.centroid[0] elif self.centroid[0] == 0: latstring = "0" else: latstring = "%fN" % self.centroid[0] if self.centroid[1] < 0: lonstring = "%fW" % -self.centroid[1] elif self.centroid[1] == 0: lonstring = "0" else: lonstring = "%fE" % self.centroid[1] fmt = "set autoscale\n" fmt += 'set key below\n' fmt += 'set key title "%s"\n' % gps.misc.isotime(int(time.time())) fmt += 'set size ratio -1\n' fmt += 'set style line 2 pt 1\n' fmt += 'set style line 3 pt 2\n' fmt += 'set xlabel "Meters east from %s"\n' % lonstring fmt += 'set ylabel "Meters north from %s"\n' % latstring fmt += 'set border 15\n' if not gps.isnan(alt_avg): fmt += 'set y2label "Meters Altitude from %f"\n' % alt_avg fmt += 'set ytics nomirror\n' fmt += 'set y2tics\n' fmt += 'cep=%f\n' % self.d((0, 0), self.recentered[len(self.fixes) / 2]) fmt += 'cep95=%f\n' % self.d((0, 0), self.recentered[int(len(self.fixes) * 0.95)]) fmt += 'cep99=%f\n' % self.d((0, 0), self.recentered[int(len(self.fixes) * 0.99)]) fmt += 'set parametric\n' fmt += 'set trange [0:2*pi]\n' fmt += 'cx(t, r) = sin(t)*r\n' fmt += 'cy(t, r) = cos(t)*r\n' fmt += 'chlen = cep/20\n' fmt += "set arrow from -chlen,0 to chlen,0 nohead\n" fmt += "set arrow from 0,-chlen to 0,chlen nohead\n" if len(self.fixes) > 1000: plot_style = 'dots' else: plot_style = 'points' fmt += 'plot "-" using 1:2 with ' + plot_style + ' ls 3 title "%d GPS fixes" ' % (len(self.fixes)) if not gps.isnan(alt_avg): fmt += ', "-" using ( %f ):($5 < 100000 ? $5 - %f : 1/0) axes x1y2 with %s ls 2 title " %d Altitude fixes, Average = %f, EP (50%%) = %f"' % (lon_max + 1, alt_avg, plot_style, alt_num, alt_avg, alt_ep) fmt += ', cx(t, cep),cy(t, cep) ls 1 title "CEP (50%%) = %f meters"' % (cep_meters) fmt += ', cx(t, cep95),cy(t, cep95) title "CEP (95%%) = %f meters"' % (cep95_meters) fmt += ', cx(t, cep99),cy(t, cep99) title "CEP (99%%) = %f meters"' % (cep99_meters) fmt += "\n" fmt += self.header() fmt += self.data() if not gps.isnan(alt_avg): fmt += "e\n" + self.data() return fmt class timeplot(plotter): "Time drift against PPS." name = "time" requires_time = True def __init__(self): plotter.__init__(self) self.watch = {"PPS"} def sample(self): if self.session.data["class"] == "PPS": self.fixes.append((self.session.data['real_sec'], self.session.data['real_nsec'], self.session.data['clock_sec'], self.session.data['clock_nsec'])) return True def header(self): return "# Time drift against PPS, %s\n" % self.whatami() def postprocess(self): pass def data(self): res = "" for (real_sec, real_nsec, clock_sec, clock_nsec) in self.fixes: res += "%d\t%d\t%d\t%d\n" % (real_sec, real_nsec, clock_sec, clock_nsec) return res def plot(self): fmt = '''\ set autoscale set key below set ylabel "System clock delta from GPS time (nsec)" plot "-" using 0:((column(1)-column(3))*1e9 + (column(2)-column(4))) title "Delta" with impulses ''' return fmt + self.header() + self.data() class uninstrumented(plotter): "Total times without instrumentation." name = "uninstrumented" requires_time = False def __init__(self): plotter.__init__(self) def sample(self): if self.session.fix.time: seconds = time.time() - gps.misc.isotime(self.session.data.time) self.fixes.append(seconds) return True else: return False def header(self): return "# Uninstrumented total latency, " + self.whatami() + "\n" def postprocess(self): pass def data(self): res = "" for seconds in self.fixes: res += "%2.6lf\n" % seconds return res def plot(self): fmt = '''\ set autoscale set key below set key title "Uninstrumented total latency" plot "-" using 0:1 title "Total time" with impulses ''' return fmt + self.header() + self.data() class instrumented(plotter): "Latency as analyzed by instrumentation." name = "instrumented" requires_time = True def __init__(self): plotter.__init__(self) def sample(self): if 'rtime' in self.session.data: self.fixes.append((self.session.data['tag'], gps.misc.isotime(self.session.data['time']), self.session.data["chars"], self.session.data['sats'], self.session.data['sor'], self.session.data['rtime'], time.time())) return True else: return False def header(self): res = "# Analyzed latency, " + self.whatami() + "\n" res += "# Tag -- Fix time -- - Chars - -- Latency - RS232- Analysis - Recv -\n" return res def postprocess(self): pass def data(self): res = "" for (tag, fix_time, chars, sats, start, xmit, recv) in self.fixes: rs232_time = (chars * 10.0) / self.device['bps'] res += "%-6s %.3f %9u %2u %.6f %.6f %.6f %.6f\n" % (tag, fix_time, chars, sats, start - fix_time, (start - fix_time) + rs232_time, xmit - fix_time, recv - fix_time) return res def plot(self): legends = ( "Reception delta", "Analysis time", "RS232 time", "Fix latency", ) fmt = '''\ set autoscale set key title "Analyzed latency" set key below plot \\\n''' for (i, legend) in enumerate(legends): j = len(legends) - i + 4 fmt += ' "-" using 0:%d title "%s" with impulses, \\\n' % (j, legend) fmt = fmt[:-4] + "\n" return fmt + self.header() + (self.data() + "e\n") * len(legends) formatters = (spaceplot, timeplot, uninstrumented, instrumented) if __name__ == '__main__': try: (options, arguments) = getopt.getopt(sys.argv[1:], "d:f:hl:m:n:rs:t:T:D:") plotmode = "space" raw = False title = None threshold = 0 await = 100 verbose = 0 terminal = None dumpfile = None logfp = None redo = False for (switch, val) in options: if switch == '-f': plotmode = val elif switch == '-m': threshold = int(val) elif switch == '-n': if val[-1] == 'h': await = int(val[:-1]) * 360 else: await = int(val) elif switch == '-t': title = val elif switch == '-T': terminal = val elif switch == '-d': dumpfile = val elif switch == '-l': logfp = open(val, "w") elif switch == '-r': redo = True elif switch == '-D': verbose = int(val) elif switch == '-h': sys.stderr.write( "usage: gpsprof [-h] [-D debuglevel] [-m threshold] [-n samplecount] [-d]\n" + "\t[-f {" + "|".join(map(lambda x: x.name, formatters)) + "}] [-s speed] [-t title] [-T terminal] [server[:port[:device]]]\n") sys.exit(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] # Select the plotting mode if plotmode: for formatter in formatters: if formatter.name == plotmode: plot = formatter() break else: sys.stderr.write("gpsprof: no such formatter.\n") sys.exit(1) # Get fix data from the GPS if redo: plot.replot(sys.stdin) else: plot.collect(verbose, logfp) plot.postprocess() # Save the timing data (only) for post-analysis if required. if dumpfile: with open(dumpfile, "w") as fp: fp.write(plot.dump()) if logfp: logfp.close() # Ship the plot to standard output if not title: title = plot.whatami() if terminal: sys.stdout.write("set terminal %s\n" % terminal) sys.stdout.write("set title \"%s\"\n" % title) sys.stdout.write(plot.plot()) except KeyboardInterrupt: pass # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: gpsd-3.15/gpsprof.xml0000664000175000017500000001677212520742615012770 0ustar esresr 10 Feb 2005 gpsprof 1 The GPSD Project GPSD Documentation gpsprof profile a GPS and gpsd, plotting latency information gpsprof -f plot_type -m threshold -n packetcount -t title -T terminal -d dumpfile -l logfile -r -D debuglevel -h [server[:port[:device]]] DESCRIPTION gpsprof performs accuracy, latency, and time drift profiling on a GPS. It emits to standard output a GNUPLOT program that draws one of several illustrative graphs. It can also be told to emit the raw profile data. Information from the default spatial plot it provides can be useful for establishing an upper bound on latency, and thus on position accuracy of a GPS in motion. gpsprof uses instrumentation built into gpsd. To display the graph, use gnuplot1. Thus, for example, to display the default spatial scatter plot, do this: gpsprof | gnuplot -persist To generate an image file: gpsprof -T png | gnuplot >image.png OPTIONS The -f option sets the plot type. The X axis is samples (either sentences with timestamps or PPS time drift messages). The Y axis is normally latency in seconds, except for the spatial plot. Currently the following plot types are defined: space Generate a scattergram of fixes and plot a probable-error circle. This data is only meaningful if the GPS is held stationary while gpsprof is running. This is the default. time Plot delta of system clock (NTP corrected time) against GPS time as reported in PPS messages. uninstrumented Plot total latency without instrumentation. Useful mainly as a check that the instrumentation is not producing significant distortion. It only plots times for reports that contain fixes; staircase-like artifacts in the plot are created when elapsed time from reports without fixes is lumped in. instrumented Plot instrumented profile. Plots various components of the total latency between the GPS's fix time fix and when the client receives the fix. For purposes of the description, below, start-of-reporting-cycle (SORC) is when a device's reporting cycle begins. This time is detected by watching to see when data availability follows a long enough amount of quiet time that we can be sure we've seen the gap at the end of the sensor's previous report-transmission cycle. Detecting this gap requires a device running at 9600bps or faster. Similarly, EORC is end-of-reporting-cycle; when the daemon has seen the last sentence it needs in the reporting cycle and ready to ship a fix to the client. The components of the instrumented plot are as follows: Fix latency Delta between GPS time and SORC. RS232 time RS232 transmission time for data shipped during the cycle (computed from character volume and baud rate). Analysis time EORC, minus SORC, minus RS232 time. The amount of real time the daemon spent on computation rather than I/O. Reception time Shipping time from the daemon to when it was received by gpsprof. Because of RS232 buffering effects, the profiler sometimes generates reports of ridiculously high latencies right at the beginning of a session. The -m option lets you set a latency threshold, in multiples of the cycle time, above which reports are discarded. The -n option sets the number of packets to sample. The default is 100. The -t option sets a text string to be included in the plot title. The -T option generates a terminal type setting into the gnuplot code. Typical usage is "-T png" telling gnuplot to write a PNG file. Without this option gnuplot will call its X11 display code. The -d option dumps the plot data, without attached gnuplot code, to a specified file for post-analysis. The -l option dumps the raw JSON reports collected from the device to a specified file. The -r option replots from a JSON logfile (such as -l produces) on standard input. Both -n and -l options are ignored when this one is selected. The -h option makes gpsprof print a usage message and exit. The -D sets debug level. Sending SIGUSR1 to a running instance causes it to write a completion message to standard error and resume processing. The first number in the startup message is the process ID to signal. SEE ALSO gpsd8, gps1, libgps3, libgpsd3, gpsfake1, gpsctl1, gpscat1, gnuplot1. AUTHOR Eric S. Raymond esr@thyrsus.com. gpsd-3.15/gpssim.py0000664000175000017500000002534612472372460012442 0ustar esresr# This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. """ A GPS simulator. This is proof-of-concept code, not production ready; some functions are stubs. """ import sys, math, random, exceptions, time import gps, gpslib # First, the mathematics. We simulate a moving viewpoint on the Earth # and a satellite with specified orbital elements in the sky. class ksv: "Kinematic state vector." def __init__(self, time=0, lat=0, lon=0, alt=0, course=0, speed=0, climb=0, h_acc=0, v_acc=0): self.time = time # Seconds from epoch self.lat = lat # Decimal degrees self.lon = lon # Decimal degrees self.alt = alt # Meters self.course = course # Degrees from true North self.speed = speed # Meters per second self.climb = climb # Meters per second self.h_acc = h_acc # Meters per second per second self.v_acc = v_acc # Meters per second per second def next(self, quantum=1): "State after quantum." self.time += quantum avspeed = (2*self.speed + self.h_acc*quantum)/2 avclimb = (2*self.climb + self.v_acc*quantum)/2 self.alt += avclimb * quantum self.speed += self.h_acc * quantum self.climb += self.v_acc * quantum distance = avspeed * quantum # Formula from # Initial point cannot be a pole, but GPS doesn't work at high. # latitudes anyway so it would be OK to fail there. # Seems to assume a spherical Earth, which means it's going # to have a slight inaccuracy rising towards the poles. # The if/then avoids 0/0 indeterminacies on E-W courses. tc = gps.Deg2Rad(self.course) lat = gps.Deg2Rad(self.lat) lon = gps.Deg2Rad(self.lon) lat += distance * math.cos(tc) dphi = math.log(math.tan(lat/2+math.pi/4)/math.tan(self.lat/2+math.pi/4)) if abs(lat-self.lat) < math.sqrt(1e-15): q = math.cos(self.lat) else: q = (lat-self.lat)/dphi dlon = -distance * math.sin(tc) / q self.lon = gps.Rad2Deg(math.mod(lon + dlon + math.pi, 2 * math.pi) - math.pi) self.lat = gps.Rad2Deg(lat) # Satellite orbital elements are available at: # # Orbital theory at: # class satellite: "Orbital elements of one satellite. PRESENTLY A STUB" def __init__(self, prn): self.prn = prn def position(self, time): "Return right ascension and declination of satellite," pass # Next, the command interpreter. This is an object that takes an # input source in the track description language, interprets it into # sammples that might be reported by a GPS, and calls a reporting # class to generate output. class gpssimException(exceptions.Exception): def __init__(self, message, filename, lineno): exceptions.Exception.__init__(self) self.message = message self.filename = filename self.lineno = lineno def __str__(self): return '"%s", %d:' % (self.filename, self.lineno) class gpssim: "Simulate a moving sensor, with skyview." active_PRNs = range(1, 24+1) + [134,] def __init__(self, outfmt): self.ksv = ksv() self.ephemeris = {} # This sets up satellites at random. Not really what we want. for prn in gpssim.active_PRNs: for (prn, _satellite) in self.ephemeris.items(): self.skyview[prn] = (random.randint(-60, +61), random.randint(0, 359)) self.have_ephemeris = False self.channels = {} self.outfmt = outfmt self.status = gps.STATUS_NO_FIX self.mode = gps.MODE_NO_FIX self.validity = "V" self.satellites_used = 0 self.filename = None self.lineno = 0 def parse_tdl(self, line): "Interpret one TDL directive." line = line.strip() if "#" in line: line = line[:line.find("#")] if line == '': return fields = line.split() command = fields[0] if command == "time": self.ksv.time = gps.isotime(fields[1]) elif command == "location": (self.lat, self.lon, self.alt) = map(float, fields[1:]) elif command == "course": self.ksv.time = float(fields[1]) elif command == "speed": self.ksv.speed = float(fields[1]) elif command == "climb": self.ksv.climb = float(fields[1]) elif command == "acceleration": (self.ksv.h_acc, self.ksv.h_acc) = map(float, fields[1:]) elif command == "snr": self.channels[int(fields[1])] = float(fields[2]) elif command == "go": self.go(int(fields[1])) elif command == "status": try: code = fields[1] self.status = {"no_fix":0, "fix":1, "dgps_fix":2}[code.lower()] except KeyError: raise gpssimException("invalid status code '%s'" % code, self.filename, self.lineno) elif command == "mode": try: code = fields[1] self.status = {"no_fix":1, "2d":2, "3d":3}[code.lower()] except KeyError: raise gpssimException("invalid mode code '%s'" % code, self.filename, self.lineno) elif command == "satellites": self.satellites_used = int(fields[1]) elif command == "validity": self.validity = fields[1] else: raise gpssimException("unknown command '%s'" % fields[1], self.filename, self.lineno) # FIX-ME: add syntax for ephemeris elements self.lineno += 1 def filter(self, inp, outp): "Make this a filter for file-like objects." self.filename = input.name self.lineno = 1 self.output = outp for line in inp: self.execute(line) def go(self, seconds): "Run the simulation for a specified number of seconds." for i in range(seconds): self.ksv.next() if self.have_ephemeris: self.skyview = {} for (prn, satellite) in self.ephemeris.items(): self.skyview[prn] = satellite.position(i) self.output.write(self.gpstype.report(self)) # Reporting classes need to have a report() method returning a string # that is a sentence (or possibly several sentences) reporting the # state of the simulation. Presently we have only one, for NMEA # devices, but the point of the architecture is so that we could simulate # others - SirF, Evermore, whatever. MPS_TO_KNOTS = 1.9438445 # Meters per second to knots class NMEA: "NMEA output generator." def __init__(self): self.sentences = ("RMC", "GGA",) self.counter = 0 def add_checksum(self, mstr): "Concatenate NMEA checksum and trailer to a string" csum = 0 for (i, c) in enumerate(mstr): if i == 0 and c == "$": continue csum ^= ord(c) mstr += "*%02X\r\n" % csum return mstr def degtodm(self, angle): "Decimal degrees to GPS-style, degrees first followed by minutes." (fraction, _integer) = math.modf(angle) return math.floor(angle) * 100 + fraction * 60 def GGA(self, sim): "Emit GGA sentence describing the simulation state." tm = time.gmtime(sim.ksv.time) gga = \ "$GPGGA,%02d%02d%02d,%09.4f,%c,%010.4f,%c,%d,%02d," % ( tm.tm_hour, tm.tm_min, tm.tm_sec, self.degtodm(abs(sim.ksv.lat)), "SN"[sim.ksv.lat > 0], self.degtodm(abs(sim.ksv.lon)), "WE"[sim.ksv.lon > 0], sim.status, sim.satellites_used) # HDOP calculation goes here gga += "," if sim.mode == gps.MODE_3D: gga += "%.1f,M" % self.ksv.lat gga += "," gga += "%.3f,M," % gpslib.wg84_separation(sim.ksv.lat, sim.ksv.lon) # Magnetic variation goes here # gga += "%3.2f,M," % mag_var gga += ",," # Time in seconds since last DGPS update goes here gga += "," # DGPS station ID goes here return self.add_checksum(gga) def GLL(self, sim): "Emit GLL sentence describing the simulation state." tm = time.gmtime(sim.ksv.time) gll = \ "$GPLL,%09.4f,%c,%010.4f,%c,%02d%02d%02d,%s," % ( self.degtodm(abs(sim.ksv.lat)), "SN"[sim.ksv.lat > 0], self.degtodm(abs(sim.ksv.lon)), "WE"[sim.ksv.lon > 0], tm.tm_hour, tm.tm_min, tm.tm_sec, sim.validity, ) # FAA mode indicator could go after these fields. return self.add_checksum(gll) def RMC(self, sim): "Emit RMC sentence describing the simulation state." tm = time.gmtime(sim.ksv.time) rmc = \ "GPRMC,%02d%02d%02d,%s,%09.4f,%c,%010.4f,%c,%.1f,%02d%02d%02d," % ( tm.tm_hour, tm.tm_min, tm.tm_sec, sim.validity, self.degtodm(abs(sim.ksv.lat)), "SN"[sim.ksv.lat > 0], self.degtodm(abs(sim.ksv.lon)), "WE"[sim.ksv.lon > 0], sim.course * MPS_TO_KNOTS, tm.tm_mday, tm.tm_mon, tm.tm_year % 100) # Magnetic variation goes here # rmc += "%3.2f,M," % mag_var rmc += ",," # FAA mode goes here return self.add_checksum(rmc) def ZDA(self, sim): "Emit ZDA sentence describing the simulation state." tm = time.gmtime(sim.ksv.time) zda = "$GPZDA,%02d%2d%02d,%02d,%02d,%04d" % ( tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_mday, tm.tm_mon, tm.tm_year, ) # Local zone description, 00 to +- 13 hours, goes here zda += "," # Local zone minutes description goes here zda += "," return self.add_checksum(zda) def report(self, sim): "Report the simulation state." out = "" for sentence in self.sentences: if type(sentence) == type(()): (interval, sentence) = sentence if self.counter % interval: continue out += apply(getattr(self, sentence), [sim]) self.counter += 1 return out # The very simple main line. if __name__ == "__main__": try: gpssim(NMEA).filter(sys.stdin, sys.stdout) except gpssimException, e: print >>sys.stderr, e # gpssim.py ends here. gpsd-3.15/gpsutils.c0000664000175000017500000003065112506517170012574 0ustar esresr/* gpsutils.c -- code shared between low-level and high-level interfaces * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ /* The strptime prototype is not provided unless explicitly requested. * We also need to set the value high enough to signal inclusion of * newer features (like clock_gettime). See the POSIX spec for more info: * http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_02_01_02 */ #define _XOPEN_SOURCE 600 #include #include #include #include #include #include #include #include #include "gps.h" #include "libgps.h" #ifdef USE_QT #include #include #endif /* * Berkeley implementation of strtod(), inlined to avoid locale problems * with the decimal point and stripped down to an atof()-equivalent. */ double safe_atof(const char *string) /* Takes a decimal ASCII floating-point number, optionally * preceded by white space. Must have form "-I.FE-X", * where I is the integer part of the mantissa, F is * the fractional part of the mantissa, and X is the * exponent. Either of the signs may be "+", "-", or * omitted. Either I or F may be omitted, or both. * The decimal point isn't necessary unless F is * present. The "E" may actually be an "e". E and X * may both be omitted (but not just one). */ { static int maxExponent = 511; /* Largest possible base 10 exponent. Any * exponent larger than this will already * produce underflow or overflow, so there's * no need to worry about additional digits. */ static double powersOf10[] = { /* Table giving binary powers of 10. Entry */ 10., /* is 10^2^i. Used to convert decimal */ 100., /* exponents into floating-point numbers. */ 1.0e4, 1.0e8, 1.0e16, 1.0e32, 1.0e64, 1.0e128, 1.0e256 }; bool sign, expSign = false; double fraction, dblExp, *d; register const char *p; register int c; int exp = 0; /* Exponent read from "EX" field. */ int fracExp = 0; /* Exponent that derives from the fractional * part. Under normal circumstatnces, it is * the negative of the number of digits in F. * However, if I is very long, the last digits * of I get dropped (otherwise a long I with a * large negative exponent could cause an * unnecessary overflow on I alone). In this * case, fracExp is incremented one for each * dropped digit. */ int mantSize; /* Number of digits in mantissa. */ int decPt; /* Number of mantissa digits BEFORE decimal * point. */ const char *pExp; /* Temporarily holds location of exponent * in string. */ /* * Strip off leading blanks and check for a sign. */ p = string; while (isspace((unsigned char) *p)) { p += 1; } if (*p == '-') { sign = true; p += 1; } else { if (*p == '+') { p += 1; } sign = false; } /* * Count the number of digits in the mantissa (including the decimal * point), and also locate the decimal point. */ decPt = -1; for (mantSize = 0; ; mantSize += 1) { c = *p; if (!isdigit(c)) { if ((c != '.') || (decPt >= 0)) { break; } decPt = mantSize; } p += 1; } /* * Now suck up the digits in the mantissa. Use two integers to * collect 9 digits each (this is faster than using floating-point). * If the mantissa has more than 18 digits, ignore the extras, since * they can't affect the value anyway. */ pExp = p; p -= mantSize; if (decPt < 0) { decPt = mantSize; } else { mantSize -= 1; /* One of the digits was the point. */ } if (mantSize > 18) { fracExp = decPt - 18; mantSize = 18; } else { fracExp = decPt - mantSize; } if (mantSize == 0) { fraction = 0.0; //p = string; goto done; } else { int frac1, frac2; frac1 = 0; for ( ; mantSize > 9; mantSize -= 1) { c = *p; p += 1; if (c == '.') { c = *p; p += 1; } frac1 = 10*frac1 + (c - '0'); } frac2 = 0; for (; mantSize > 0; mantSize -= 1) { c = *p; p += 1; if (c == '.') { c = *p; p += 1; } frac2 = 10*frac2 + (c - '0'); } fraction = (1.0e9 * frac1) + frac2; } /* * Skim off the exponent. */ p = pExp; if ((*p == 'E') || (*p == 'e')) { p += 1; if (*p == '-') { expSign = true; p += 1; } else { if (*p == '+') { p += 1; } expSign = false; } while (isdigit((unsigned char) *p)) { exp = exp * 10 + (*p - '0'); p += 1; } } if (expSign) { exp = fracExp - exp; } else { exp = fracExp + exp; } /* * Generate a floating-point number that represents the exponent. * Do this by processing the exponent one bit at a time to combine * many powers of 2 of 10. Then combine the exponent with the * fraction. */ if (exp < 0) { expSign = true; exp = -exp; } else { expSign = false; } if (exp > maxExponent) { exp = maxExponent; errno = ERANGE; } dblExp = 1.0; for (d = powersOf10; exp != 0; exp >>= 1, d += 1) { if (exp & 01) { dblExp *= *d; } } if (expSign) { fraction /= dblExp; } else { fraction *= dblExp; } done: if (sign) { return -fraction; } return fraction; } #define MONTHSPERYEAR 12 /* months per calendar year */ void gps_clear_fix(struct gps_fix_t *fixp) /* stuff a fix structure with recognizable out-of-band values */ { fixp->time = NAN; fixp->mode = MODE_NOT_SEEN; fixp->latitude = fixp->longitude = NAN; fixp->track = NAN; fixp->speed = NAN; fixp->climb = NAN; fixp->altitude = NAN; fixp->ept = NAN; fixp->epx = NAN; fixp->epy = NAN; fixp->epv = NAN; fixp->epd = NAN; fixp->eps = NAN; fixp->epc = NAN; } void gps_clear_dop( struct dop_t *dop) { dop->xdop = dop->ydop = dop->vdop = dop->tdop = dop->hdop = dop->pdop = dop->gdop = NAN; } void gps_merge_fix(struct gps_fix_t *to, gps_mask_t transfer, struct gps_fix_t *from) /* merge new data into an old fix */ { if ((NULL == to) || (NULL == from)) return; if ((transfer & TIME_SET) != 0) to->time = from->time; if ((transfer & LATLON_SET) != 0) { to->latitude = from->latitude; to->longitude = from->longitude; } if ((transfer & MODE_SET) != 0) to->mode = from->mode; if ((transfer & ALTITUDE_SET) != 0) to->altitude = from->altitude; if ((transfer & TRACK_SET) != 0) to->track = from->track; if ((transfer & SPEED_SET) != 0) to->speed = from->speed; if ((transfer & CLIMB_SET) != 0) to->climb = from->climb; if ((transfer & TIMERR_SET) != 0) to->ept = from->ept; if ((transfer & HERR_SET) != 0) { to->epx = from->epx; to->epy = from->epy; } if ((transfer & VERR_SET) != 0) to->epv = from->epv; if ((transfer & SPEEDERR_SET) != 0) to->eps = from->eps; } /* NOTE: timestamp_t is a double, so this is only precise to * near microSec. Do not use near PPS which is nanoSec precise */ timestamp_t timestamp(void) { struct timespec ts; (void)clock_gettime(CLOCK_REALTIME, &ts); return (timestamp_t)(ts.tv_sec + ts.tv_nsec * 1e-9); } 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 }; year = 1900 + t->tm_year + t->tm_mon / MONTHSPERYEAR; result = (year - 1970) * 365 + cumdays[t->tm_mon % MONTHSPERYEAR]; result += (year - 1968) / 4; result -= (year - 1900) / 100; result += (year - 1600) / 400; if ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0) && (t->tm_mon % MONTHSPERYEAR) < 2) result--; result += t->tm_mday - 1; result *= 24; result += t->tm_hour; result *= 60; result += t->tm_min; result *= 60; result += t->tm_sec; if (t->tm_isdst == 1) result -= 3600; return (result); } timestamp_t iso8601_to_unix(char *isotime) /* ISO8601 UTC to Unix UTC, no leapsecond correction. */ { #ifndef __clang_analyzer__ #ifndef USE_QT char *dp = NULL; double usec; struct tm tm; memset(&tm,0,sizeof(tm)); dp = strptime(isotime, "%Y-%m-%dT%H:%M:%S", &tm); if (dp != NULL && *dp == '.') usec = strtod(dp, NULL); else usec = 0; /* * It would be nice if we could say mktime(&tm) - timezone + usec instead, * but timezone is not available at all on some BSDs. Besides, when working * with historical dates the value of timezone after an ordinary tzset(3) * can be wrong; you have to do a redirect through the IANA historical * timezone database to get it right. */ return (timestamp_t)mkgmtime(&tm) + usec; #else double usec = 0; QString t(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()); return (timestamp_t)(d.toTime_t() + usec); #endif #endif /* __clang_analyzer__ */ } /* *INDENT-OFF* */ char *unix_to_iso8601(timestamp_t fixtime, /*@ out @*/ char isotime[], size_t len) /* Unix UTC time to ISO8601, no timezone adjustment */ /* example: 2007-12-11T23:38:51.033Z */ { struct tm when; double integral, fractional; time_t intfixtime; char timestr[30]; char fractstr[10]; fractional = modf(fixtime, &integral); intfixtime = (time_t) integral; (void)gmtime_r(&intfixtime, &when); (void)strftime(timestr, sizeof(timestr), "%Y-%m-%dT%H:%M:%S", &when); /* * Do not mess casually with the number of decimal digits in the * format! Most GPSes report over serial links at 0.01s or 0.001s * precision. */ (void)snprintf(fractstr, sizeof(fractstr), "%.3f", fractional); /* add fractional part, ignore leading 0; "0.2" -> ".2" */ (void)snprintf(isotime, len, "%s%sZ",timestr, strchr(fractstr,'.')); return isotime; } /* *INDENT-ON* */ #define Deg2Rad(n) ((n) * DEG_2_RAD) /* Distance in meters between two points specified in degrees, optionally with initial and final bearings. */ double earth_distance_and_bearings(double lat1, double lon1, double lat2, double lon2, double *ib, double *fb) { /* * 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; // cppcheck-suppress variableScope double s_L, c_L, s_A, C; double c_S, S, s_S, 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))); if (ib != NULL) *ib = atan2(c_U2 * sin(lambda), c_U1 * s_U2 - s_U1 * c_U2 * cos(lambda)); if (fb != NULL) *fb = atan2(c_U1 * sin(lambda), c_U1 * s_U2 * cos(lambda) - s_U1 * c_U2); return (WGS84B * A * (S - d_S)); } /* Distance in meters between two points specified in degrees. */ double earth_distance(double lat1, double lon1, double lat2, double lon2) { return earth_distance_and_bearings(lat1, lon1, lat2, lon2, NULL, NULL); } /* end */ gpsd-3.15/gpxlogger.c0000664000175000017500000002223612520742615012720 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "gps.h" #include "gpsd_config.h" #include "gpsdclient.h" #include "revision.h" static char *progname; static struct fixsource_t source; /************************************************************************** * * Transport-layer-independent functions * **************************************************************************/ static struct gps_data_t gpsdata; static FILE *logfile; static bool intrack = false; static time_t timeout = 5; /* seconds */ static double minmove = 0; /* meters */ #ifdef CLIENTDEBUG_ENABLE static int debug; #endif /* CLIENTDEBUG_ENABLE */ static void print_gpx_header(void) { char tbuf[CLIENT_DATE_MAX+1]; (void)fprintf(logfile,"\n"); (void)fprintf(logfile,"\n"); (void)fprintf(logfile," \n"); (void)fprintf(logfile," \n", unix_to_iso8601((timestamp_t)time(NULL), tbuf, sizeof(tbuf))); (void)fprintf(logfile," \n"); (void)fflush(logfile); } static void print_gpx_trk_end(void) { (void)fprintf(logfile," \n"); (void)fprintf(logfile," \n"); (void)fflush(logfile); } static void print_gpx_footer(void) { if (intrack) print_gpx_trk_end(); (void)fprintf(logfile,"\n"); (void)fclose(logfile); } static void print_gpx_trk_start(void) { (void)fprintf(logfile," \n"); (void)fprintf(logfile," GPSD %s\n", VERSION); (void)fprintf(logfile," \n"); (void)fflush(logfile); } static void print_fix(struct gps_data_t *gpsdata, double time) { char tbuf[CLIENT_DATE_MAX+1]; (void)fprintf(logfile," \n", gpsdata->fix.latitude, gpsdata->fix.longitude); if ((isnan(gpsdata->fix.altitude) == 0)) (void)fprintf(logfile," %f\n", gpsdata->fix.altitude); (void)fprintf(logfile," \n", unix_to_iso8601(time, tbuf, sizeof(tbuf))); switch (gpsdata->fix.mode) { case MODE_3D: (void)fprintf(logfile," 3d\n"); break; case MODE_2D: (void)fprintf(logfile," 2d\n"); break; case MODE_NO_FIX: (void)fprintf(logfile," none\n"); break; default: /* don't print anything if no fix indicator */ break; } if ((gpsdata->fix.mode > MODE_NO_FIX) && (gpsdata->satellites_used > 0)) (void)fprintf(logfile," %d\n", gpsdata->satellites_used); if (isnan(gpsdata->dop.hdop) == 0) (void)fprintf(logfile," %.1f\n", gpsdata->dop.hdop); if (isnan(gpsdata->dop.vdop) == 0) (void)fprintf(logfile," %.1f\n", gpsdata->dop.vdop); if (isnan(gpsdata->dop.pdop) == 0) (void)fprintf(logfile," %.1f\n", gpsdata->dop.pdop); (void)fprintf(logfile," \n"); (void)fflush(logfile); } static void conditionally_log_fix(struct gps_data_t *gpsdata) { static double int_time, old_int_time; static double old_lat, old_lon; static bool first = true; int_time = gpsdata->fix.time; if ((int_time == old_int_time) || gpsdata->fix.mode < MODE_2D) return; /* may not be worth logging if we've moved only a very short distance */ if (minmove>0 && !first && earth_distance( gpsdata->fix.latitude, gpsdata->fix.longitude, old_lat, old_lon) < minmove) return; /* * Make new track if the jump in time is above * timeout. Handle jumps both forward and * backwards in time. The clock sometimes jumps * backward when gpsd is submitting junk on the * dbus. */ if (fabs(int_time - old_int_time) > timeout && !first) { print_gpx_trk_end(); intrack = false; } if (!intrack) { print_gpx_trk_start(); intrack = true; if (first) first = false; } old_int_time = int_time; if (minmove > 0) { old_lat = gpsdata->fix.latitude; old_lon = gpsdata->fix.longitude; } print_fix(gpsdata, int_time); } 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(); (void)gps_close(&gpsdata); exit(EXIT_SUCCESS); } /************************************************************************** * * Main sequence * **************************************************************************/ static void usage(void) { fprintf(stderr, "Usage: %s [-V] [-h] [-d] [-i timeout] [-f filename] [-m minmove]\n" "\t[-e exportmethod] [server[:port:[device]]]\n\n" "defaults to '%s -i 5 -e %s localhost:2947'\n", progname, progname, export_default()->name); exit(EXIT_FAILURE); } int main(int argc, char **argv) { int ch; bool daemonize = false; unsigned int flags = WATCH_ENABLE; struct exportmethod_t *method = NULL; progname = argv[0]; method = export_default(); if (method == NULL) { (void)fprintf(stderr, "%s: no export methods.\n", progname); exit(EXIT_FAILURE); } logfile = stdout; while ((ch = getopt(argc, argv, "dD:e:f:hi:lm:V")) != -1) { switch (ch) { case 'd': openlog(basename(progname), LOG_PID | LOG_PERROR, LOG_DAEMON); daemonize = true; break; #ifdef CLIENTDEBUG_ENABLE case 'D': debug = atoi(optarg); gps_enable_debug(debug, logfile); break; #endif /* CLIENTDEBUG_ENABLE */ case 'e': method = export_lookup(optarg); if (method == NULL) { (void)fprintf(stderr, "%s: %s is not a known export method.\n", progname, optarg); exit(EXIT_FAILURE); } break; case 'f': /* Output file name. */ { char *fname = NULL; time_t t; size_t s = 0; size_t fnamesize = strlen(optarg); t = time(NULL); while (s == 0) { char *newfname = realloc(fname, fnamesize); if (newfname == NULL) { syslog(LOG_ERR, "realloc failed."); goto bailout; } else { fnamesize += 1024; fname = newfname; } s = strftime(fname, fnamesize-1, optarg, localtime(&t)); } fname[s] = '\0';; logfile = fopen(fname, "w"); if (logfile == NULL) syslog(LOG_ERR, "Failed to open %s: %s, logging to stdout.", fname, strerror(errno)); bailout: free(fname); break; } case 'i': /* set polling interfal */ timeout = (time_t) atoi(optarg); if (timeout < 1) timeout = 1; if (timeout >= 3600) fprintf(stderr, "WARNING: track timeout is an hour or more!\n"); break; case 'l': export_list(stderr); exit(EXIT_SUCCESS); case 'm': minmove = (double )atoi(optarg); break; case 'V': (void)fprintf(stderr, "%s: version %s (revision %s)\n", progname, VERSION, REVISION); exit(EXIT_SUCCESS); default: usage(); /* NOTREACHED */ } } if (daemonize && logfile == stdout) { syslog(LOG_ERR, "Daemon mode with no valid logfile name - exiting."); exit(EXIT_FAILURE); } if (method->magic != NULL) { source.server = (char *)method->magic; source.port = NULL; source.device = NULL; } else { source.server = (char *)"localhost"; source.port = (char *)DEFAULT_GPSD_PORT; source.device = NULL; } if (optind < argc) { /* in this case, switch to the method "socket" always */ gpsd_source_spec(argv[optind], &source); } #if 0 (void)fprintf(logfile,"\n", source.server, source.port, source.device); #endif /* catch all interesting signals */ (void)signal(SIGTERM, quit_handler); (void)signal(SIGQUIT, quit_handler); (void)signal(SIGINT, quit_handler); /* might be time to daemonize */ if (daemonize) { /* not SuS/POSIX portable, but we have our own fallback version */ if (daemon(0, 0) != 0) (void) fprintf(stderr,"demonization failed: %s\n", strerror(errno)); } //syslog (LOG_INFO, "---------- STARTED ----------"); if (gps_open(source.server, source.port, &gpsdata) != 0) { (void)fprintf(stderr, "%s: no gpsd running or network error: %d, %s\n", progname, errno, gps_errstr(errno)); exit(EXIT_FAILURE); } if (source.device != NULL) flags |= WATCH_DEVICE; (void)gps_stream(&gpsdata, flags, source.device); print_gpx_header(); (void)gps_mainloop(&gpsdata, 5000000, conditionally_log_fix); print_gpx_footer(); (void)gps_close(&gpsdata); exit(EXIT_SUCCESS); } gpsd-3.15/hex.c0000664000175000017500000001110512506324532011475 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include "gpsd.h" const char *gpsd_packetdump(char *scbuf, size_t scbuflen, char *binbuf, size_t binbuflen) { char *cp; bool printable = true; assert(binbuf != NULL); for (cp = binbuf; cp < binbuf + binbuflen; cp++) if (!isprint((unsigned char) *cp) && !isspace((unsigned char) *cp)) printable = false; if (printable) return binbuf; else return gpsd_hexdump(scbuf, scbuflen, binbuf, binbuflen); } const char *gpsd_hexdump(char *scbuf, size_t scbuflen, char *binbuf, size_t binbuflen) { #ifndef SQUELCH_ENABLE size_t i, j = 0; 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) return ""; for (i = 0; i < len && i * 2 < scbuflen - 2; i++) { scbuf[j++] = hexchar[(ibuf[i] & 0xf0) >> 4]; scbuf[j++] = hexchar[ibuf[i] & 0x0f]; } scbuf[j] = '\0'; #else /* SQUELCH defined */ scbuf[0] = '\0'; (void)scbuflen; (void)binbuf; (void)binbuflen; #endif /* SQUELCH_ENABLE */ return scbuf; } static int hex2bin(const char *s) { int a, b; a = s[0] & 0xff; b = s[1] & 0xff; if ((a >= 'a') && (a <= 'f')) a = a + 10 - 'a'; else if ((a >= 'A') && (a <= 'F')) a = a + 10 - 'A'; else if ((a >= '0') && (a <= '9')) a -= '0'; else return -1; if ((b >= 'a') && (b <= 'f')) b = b + 10 - 'a'; else if ((b >= 'A') && (b <= 'F')) b = b + 10 - 'A'; else if ((b >= '0') && (b <= '9')) b -= '0'; else return -1; return ((a << 4) + b); } int gpsd_hexpack(const char *src, char *dst, size_t len) /* hex2bin source string to destination - destination can be same as source */ { int i, j; j = (int)(strlen(src) / 2); if ((j < 1) || ((size_t) j > len)) return -2; for (i = 0; i < j; i++) { int k; if ((k = hex2bin(src + i * 2)) != -1) dst[i] = (char)(k & 0xff); else return -1; } (void)memset(dst + i, '\0', (size_t) (len - i)); return j; } ssize_t hex_escapes(char *cooked, const char *raw) /* interpret C-style hex escapes */ { char c, *cookend; for (cookend = cooked; *raw != '\0'; 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; 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; 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; default: return -2; } *cookend++ = c; break; case '\\': *cookend++ = '\\'; break; default: return -3; } } return (ssize_t) (cookend - cooked); } gpsd-3.15/isgps.c0000664000175000017500000002435612506324210012043 0ustar esresr/***************************************************************************** This is a decoder for the unnamed protocol described in IS-GPS-200, the Navstar GPS Interface Specification, and used as a transport layer for both GPS satellite downlink transmissions and the RTCM104 version 2 format for broadcasting differential-GPS corrections. The purpose of this protocol is to support analyzing a serial bit stream without byte framing into parity-checked 30-bit words. Interpretation of the words is left to an upper layer. Note that RTCM104 version 3 does *not* use this code; it assumes a byte-oriented underlayer. The upper layer must supply a preamble_match() hook to tell our decoder when it has a legitimate start of packet, and a length_check() hook to tell it when the packet has reached the length it is supposed to have. Here are Wolfgang's original rather cryptic notes on this code: -------------------------------------------------------------------------- 1) trim and bitflip the input. While syncing the msb of the input gets shifted into lsb of the assembled word. word <<= 1, or in input >> 5 word <<= 1, or in input >> 4 word <<= 1, or in input >> 3 word <<= 1, or in input >> 2 word <<= 1, or in input >> 1 word <<= 1, or in input At one point it should sync-lock. ---- Shift 6 bytes of RTCM data in as such: ---> (trim-bits-to-5-bits) ---> (end-for-end-bit-flip) ---> ---> shift-into-30-bit-shift-register ||||||||||||||||||||||| detector-for-preamble ||||||||||||||||||||||| detector-for-parity ||||||||||||||||||||||| -------------------------------------------------------------------------- The code was originally by Wolfgang Rupprecht. ESR severely hacked it, with Wolfgang's help, in order to separate message analysis from message dumping and separate this lower layer from the upper layer handing GPS-subframe and RTCM decoding. You are not expected to understand any of this. This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. *****************************************************************************/ #include #include "gpsd.h" #define MAG_SHIFT 6u #define MAG_TAG_DATA (1 << MAG_SHIFT) #define MAG_TAG_MASK (3 << MAG_SHIFT) #define W_DATA_MASK 0x3fffffc0u 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, 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, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 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, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 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, 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, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }; static unsigned int reverse_bits[] = { 0, 32, 16, 48, 8, 40, 24, 56, 4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 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 }; unsigned int isgps_parity(isgps30bits_t th) { #define P_30_MASK 0x40000000u #define PARITY_25 0xbb1f3480u #define PARITY_26 0x5d8f9a40u #define PARITY_27 0xaec7cd00u #define PARITY_28 0x5763e680u #define PARITY_29 0x6bb1f340u #define PARITY_30 0x8b7a89c0u isgps30bits_t t; unsigned int p; /* * if (th & P_30_MASK) * th ^= W_DATA_MASK; */ t = th & PARITY_25; p = parity_array[t & 0xff] ^ parity_array[(t >> 8) & 0xff] ^ 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]); 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]); 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]); 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]); 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]); #ifdef __UNUSED__ gpsd_log(errout, ISGPS_ERRLEVEL_BASE + 2, "ISGPS parity %u\n", p); #endif /* __UNUSED__ */ return (p); } /* * ESR found a doozy of a bug... * * Defining isgps_parityok as a function triggers an optimizer bug in gcc * 3.4.2. The symptom is that parity computation is screwed up and the decoder * never achieves sync lock. Something steps on the argument to * isgpsparity(); the lossage appears to be related to the compiler's * attempt to fold the isgps_parity() call into isgps_parityok() in some * tail-recursion-like manner. This happens under -O2, but not -O1, on * both i386 and amd64. Disabling all of the individual -O2 suboptions * does *not* fix it. * * And the fun doesn't stop there! It turns out that even with this fix, bare * -O2 generates bad code. It takes "-O2 -fschedule-insns" to generate good * code under 3.4.[23]...which is weird because -O2 is supposed to *imply* * -fschedule-insns. * * gcc 4.0 does not manifest these bugs. */ #define isgps_parityok(w) (isgps_parity(w) == ((w) & 0x3f)) void isgps_init(struct gps_lexer_t *lexer) { lexer->isgps.curr_word = 0; lexer->isgps.curr_offset = 24; /* first word */ lexer->isgps.locked = false; lexer->isgps.bufindex = 0; lexer->isgps.buflen = 0; } // This works around cppcheck not looking into enough config branches // cppcheck-suppress unusedFunction enum isgpsstat_t isgps_decode(struct gps_lexer_t *lexer, bool(*preamble_match) (isgps30bits_t *), bool(*length_check) (struct gps_lexer_t *), size_t maxlen, unsigned int c) { /* ASCII characters 64-127, @ through DEL */ if ((c & MAG_TAG_MASK) != MAG_TAG_DATA) { gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 1, "ISGPS word tag not correct, skipping byte\n"); return ISGPS_SKIP; } c = reverse_bits[c & 0x3f]; if (!lexer->isgps.locked) { lexer->isgps.curr_offset = -5; lexer->isgps.bufindex = 0; while (lexer->isgps.curr_offset <= 0) { lexer->isgps.curr_word <<= 1; if (lexer->isgps.curr_offset > 0) { lexer->isgps.curr_word |= c << lexer->isgps.curr_offset; } else { lexer->isgps.curr_word |= c >> -(lexer->isgps.curr_offset); } gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 2, "ISGPS syncing at byte %lu: 0x%08x\n", lexer->char_counter, lexer->isgps.curr_word); if (preamble_match(&lexer->isgps.curr_word)) { if (isgps_parityok(lexer->isgps.curr_word)) { gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 1, "ISGPS preamble ok, parity ok -- locked\n"); lexer->isgps.locked = true; break; } gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 1, "ISGPS preamble ok, parity fail\n"); } lexer->isgps.curr_offset++; } /* end while */ } if (lexer->isgps.locked) { enum isgpsstat_t res; res = ISGPS_SYNC; if (lexer->isgps.curr_offset > 0) { lexer->isgps.curr_word |= c << lexer->isgps.curr_offset; } else { lexer->isgps.curr_word |= c >> -(lexer->isgps.curr_offset); } if (lexer->isgps.curr_offset <= 0) { /* weird-assed inversion */ if (lexer->isgps.curr_word & P_30_MASK) lexer->isgps.curr_word ^= W_DATA_MASK; if (isgps_parityok(lexer->isgps.curr_word)) { #if 0 /* * Don't clobber the buffer just because we spot * another preamble pattern in the data stream. -wsr */ if (preamble_match(&lexer->isgps.curr_word)) { gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 2, "ISGPS preamble spotted (index: %u)\n", lexer->isgps.bufindex); lexer->isgps.bufindex = 0; } #endif gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 2, "ISGPS processing word %u (offset %d)\n", lexer->isgps.bufindex, lexer->isgps.curr_offset); { /* * Guard against a buffer overflow attack. Just wait for * the next preamble match and go on from there. */ if (lexer->isgps.bufindex >= (unsigned)maxlen) { lexer->isgps.bufindex = 0; gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 1, "ISGPS buffer overflowing -- resetting\n"); return ISGPS_NO_SYNC; } lexer->isgps.buf[lexer->isgps.bufindex] = lexer->isgps.curr_word; /* *INDENT-OFF* */ if ((lexer->isgps.bufindex == 0) && !preamble_match((isgps30bits_t *) lexer->isgps.buf)) { gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 1, "ISGPS word 0 not a preamble- punting\n"); return ISGPS_NO_SYNC; } /* *INDENT-ON* */ lexer->isgps.bufindex++; if (length_check(lexer)) { /* jackpot, we have a complete packet */ lexer->isgps.buflen = lexer->isgps.bufindex * sizeof(isgps30bits_t); lexer->isgps.bufindex = 0; res = ISGPS_MESSAGE; } } lexer->isgps.curr_word <<= 30; /* preserve the 2 low bits */ lexer->isgps.curr_offset += 30; if (lexer->isgps.curr_offset > 0) { lexer->isgps.curr_word |= c << lexer->isgps.curr_offset; } else { lexer->isgps.curr_word |= c >> -(lexer->isgps.curr_offset); } } else { gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 0, "ISGPS parity failure, lost lock\n"); lexer->isgps.locked = false; } } lexer->isgps.curr_offset -= 6; gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 2, "ISGPS residual %d\n", lexer->isgps.curr_offset); return res; } /* never achieved lock */ gpsd_log(&lexer->errout, ISGPS_ERRLEVEL_BASE + 1, "ISGPS lock never achieved\n"); return ISGPS_NO_SYNC; } gpsd-3.15/json.c0000664000175000017500000005232112520742615011671 0ustar esresr/**************************************************************************** NAME json.c - parse JSON into fixed-extent data structures DESCRIPTION This module parses a large subset of JSON (JavaScript Object Notation). Unlike more general JSON parsers, it doesn't use malloc(3) and doesn't support polymorphism; you need to give it a set of template structures describing the expected shape of the incoming JSON, and it will error out if that shape is not matched. When the parse succeeds, attribute values will be extracted into static locations specified in the template structures. The "shape" of a JSON object in the type signature of its attributes (and attribute values, and so on recursively down through all nestings of objects and arrays). This parser is indifferent to the order of attributes at any level, but you have to tell it in advance what the type of each attribute value will be and where the parsed value will be stored. The template structures may supply default values to be used when an expected attribute is omitted. The preceding paragraph told one fib. A single attribute may actually have a span of multiple specifications with different syntactically distinguishable types (e.g. string vs. real vs. integer vs. boolean, but not signed integer vs. unsigned integer). The parser will match the right spec against the actual data. The dialect this parses has some limitations. First, it cannot recognize the JSON "null" value. Secondly, arrays may not have character values as elements (this limitation could be easily removed if required). Third, all elements of an array must be of the same type. There are separate entry points for beginning a parse of either JSON object or a JSON array. JSON "float" quantities are actually stored as doubles. This parser processes object arrays in one of two different ways, defending on whether the array subtype is declared as object or structobject. Object arrays take one base address per object subfield, and are mapped into parallel C arrays (one per subfield). Strings are not supported in this kind of array, as they don't have a "natural" size to use as an offset multiplier. Structobjects arrays are a way to parse a list of objects to a set of modifications to a corresponding array of C structs. The trick is that the array object initialization has to specify both the C struct array's base address and the stride length (the size of the C struct). If you initialize the offset fields with the correct offsetof calls, everything will work. Strings are supported but all string storage has to be inline in the struct. NOTE This code has been spun out, packaged, and documented as a reusable module; search for "microjson". PERMISSIONS This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. ***************************************************************************/ #include #include #include #include #include #include /* for time_t */ #include #include "gpsd_config.h" /* for strlcpy() prototype */ #ifdef SOCKET_EXPORT_ENABLE #include "json.h" #include "gps.h" /* for safe_atof() prototype */ #include "strfuncs.h" #define JSON_MINIMAL /* GPSD only uses a subset of the features */ #ifdef CLIENTDEBUG_ENABLE static int debuglevel = 0; static FILE *debugfp; 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, ...) /* assemble command in printf(3) style */ { if (errlevel <= debuglevel) { char buf[BUFSIZ]; va_list ap; (void)strlcpy(buf, "json: ", sizeof(buf)); va_start(ap, fmt); str_vappendf(buf, sizeof(buf), fmt, ap); va_end(ap); (void)fputs(buf, debugfp); } } # define json_debug_trace(args) (void) json_trace args #else # define json_debug_trace(args) do { } while (0) #endif /* CLIENTDEBUG_ENABLE */ static char *json_target_address(const struct json_attr_t *cursor, const struct json_array_t *parent, int offset) { char *targetaddr = NULL; if (parent == NULL || parent->element_type != t_structobject) { /* ordinary case - use the address in the cursor structure */ switch (cursor->type) { case t_ignore: targetaddr = NULL; break; case t_integer: targetaddr = (char *)&cursor->addr.integer[offset]; break; case t_uinteger: targetaddr = (char *)&cursor->addr.uinteger[offset]; break; case t_time: case t_real: targetaddr = (char *)&cursor->addr.real[offset]; break; case t_string: targetaddr = cursor->addr.string; break; case t_boolean: targetaddr = (char *)&cursor->addr.boolean[offset]; break; case t_character: targetaddr = (char *)&cursor->addr.character[offset]; break; default: targetaddr = NULL; break; } } 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", cursor->attribute, offset, targetaddr)); return targetaddr; } static int json_internal_read_object(const char *cp, const struct json_attr_t *attrs, const struct json_array_t *parent, int offset, const char **end) { 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", "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; bool value_quoted = false; 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; const struct json_enum_t *mp; char *lptr; if (end != NULL) *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++) if (!cursor->nodefault) { lptr = json_target_address(cursor, parent, offset); if (lptr != NULL) switch (cursor->type) { case t_integer: memcpy(lptr, &cursor->dflt.integer, sizeof(int)); break; case t_uinteger: memcpy(lptr, &cursor->dflt.uinteger, sizeof(unsigned int)); break; case t_time: case t_real: memcpy(lptr, &cursor->dflt.real, sizeof(double)); break; case t_string: if (parent != NULL && parent->element_type != t_structobject && offset > 0) return JSON_ERR_NOPARSTR; lptr[0] = '\0'; break; case t_boolean: memcpy(lptr, &cursor->dflt.boolean, sizeof(bool)); break; case t_character: lptr[0] = cursor->dflt.character; break; case t_object: /* silences a compiler warning */ case t_structobject: case t_array: case t_check: case t_ignore: break; } } 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) { case init: if (isspace((unsigned char) *cp)) continue; else if (*cp == '{') state = await_attr; else { json_debug_trace((1, "Non-WS when expecting object start.\n")); #ifndef JSON_MINIMAL if (end != NULL) *end = cp; #endif /* JSON_MINIMAL */ return JSON_ERR_OBSTART; } break; case await_attr: if (isspace((unsigned char) *cp)) continue; else if (*cp == '"') { state = in_attr; pattr = attrbuf; #ifndef JSON_MINIMAL if (end != NULL) *end = cp; #endif /* JSON_MINIMAL */ } else if (*cp == '}') break; else { json_debug_trace((1, "Non-WS when expecting attribute.\n")); #ifndef JSON_MINIMAL if (end != NULL) *end = cp; #endif /* JSON_MINIMAL */ return JSON_ERR_ATTRSTART; } break; case in_attr: if (pattr == NULL) /* don't update end here, leave at attribute start */ return JSON_ERR_NULLPTR; if (*cp == '"') { *pattr++ = '\0'; json_debug_trace((1, "Collected attribute name %s\n", attrbuf)); for (cursor = attrs; cursor->attribute != NULL; cursor++) { json_debug_trace((2, "Checking against %s\n", cursor->attribute)); 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)); /* don't update end here, leave at attribute start */ return JSON_ERR_BADATTR; } state = await_value; if (cursor->type == t_string) maxlen = (int)cursor->len - 1; else if (cursor->type == t_check) maxlen = (int)strlen(cursor->dflt.check); else if (cursor->type == t_time || cursor->type == t_ignore) maxlen = JSON_VAL_MAX; else if (cursor->map != NULL) maxlen = (int)sizeof(valbuf) - 1; pval = valbuf; } else if (pattr >= attrbuf + JSON_ATTR_MAX - 1) { json_debug_trace((1, "Attribute name too long.\n")); /* don't update end here, leave at attribute start */ return JSON_ERR_ATTRLEN; } else *pattr++ = *cp; break; case await_value: if (isspace((unsigned char) *cp) || *cp == ':') continue; else if (*cp == '[') { if (cursor->type != t_array) { json_debug_trace((1, "Saw [ when not expecting array.\n")); #ifndef JSON_MINIMAL if (end != NULL) *end = cp; #endif /* JSON_MINIMAL */ return JSON_ERR_NOARRAY; } substatus = json_read_array(cp, &cursor->addr.array, &cp); if (substatus != 0) return substatus; state = post_array; } else if (cursor->type == t_array) { json_debug_trace((1, "Array element was specified, but no [.\n")); #ifndef JSON_MINIMAL if (end != NULL) *end = cp; #endif /* JSON_MINIMAL */ return JSON_ERR_NOBRAK; } else if (*cp == '"') { value_quoted = true; state = in_val_string; pval = valbuf; } else { value_quoted = false; state = in_val_token; pval = valbuf; *pval++ = *cp; } break; case in_val_string: if (pval == NULL) /* don't update end here, leave at value start */ return JSON_ERR_NULLPTR; if (*cp == '\\') state = in_escape; else if (*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) { json_debug_trace((1, "String value too long.\n")); /* don't update end here, leave at value start */ return JSON_ERR_STRLONG; /* */ } else *pval++ = *cp; break; case in_escape: if (pval == NULL) /* don't update end here, leave at value start */ return JSON_ERR_NULLPTR; switch (*cp) { case 'b': *pval++ = '\b'; break; case 'f': *pval++ = '\f'; break; case 'n': *pval++ = '\n'; break; case 'r': *pval++ = '\r'; break; case 't': *pval++ = '\t'; break; case 'u': for (n = 0; n < 4 && cp[n] != '\0'; n++) uescape[n] = *cp++; --cp; (void)sscanf(uescape, "%04x", &u); *pval++ = (char)u; /* will truncate values above 0xff */ break; default: /* handles double quote and solidus */ *pval++ = *cp; break; } state = in_val_string; break; case in_val_token: if (pval == NULL) /* don't update end here, leave at value start */ return JSON_ERR_NULLPTR; if (isspace((unsigned char) *cp) || *cp == ',' || *cp == '}') { *pval = '\0'; json_debug_trace((1, "Collected token value %s.\n", valbuf)); state = post_val; if (*cp == '}' || *cp == ',') --cp; } else if (pval > valbuf + JSON_VAL_MAX - 1) { json_debug_trace((1, "Token value too long.\n")); /* don't update end here, leave at value start */ return JSON_ERR_TOKLONG; } else *pval++ = *cp; break; case post_val: /* * We know that cursor points at the first spec matching * the current attribute. We don't know that it's *the* * correct spec; our dialect allows there to be any number * of adjacent ones with the same attrname but different * types. Here's where we try to seek forward for a * matching type/attr pair if we're not looking at one. */ for (;;) { int seeking = cursor->type; if (value_quoted && (cursor->type == t_string || cursor->type == t_time)) break; if ((strcmp(valbuf, "true")==0 || strcmp(valbuf, "false")==0) && seeking == t_boolean) break; if (isdigit((unsigned char) valbuf[0])) { bool decimal = strchr(valbuf, '.') != NULL; if (decimal && seeking == t_real) break; if (!decimal && (seeking == t_integer || seeking == t_uinteger)) break; } if (cursor[1].attribute==NULL) /* out of possiblities */ break; if (strcmp(cursor[1].attribute, attrbuf)!=0) break; ++cursor; } if (value_quoted && (cursor->type != t_string && cursor->type != t_character && cursor->type != t_check && cursor->type != t_time && cursor->type != t_ignore && 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->type == t_time || 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)); return JSON_ERR_BADENUM; foundit: (void)snprintf(valbuf, sizeof(valbuf), "%d", mp->value); } lptr = json_target_address(cursor, parent, offset); if (lptr != NULL) switch (cursor->type) { case t_integer: { int tmp = atoi(valbuf); memcpy(lptr, &tmp, sizeof(int)); } break; case t_uinteger: { unsigned int tmp = (unsigned int)atoi(valbuf); memcpy(lptr, &tmp, sizeof(unsigned int)); } break; case t_time: { double tmp = iso8601_to_unix(valbuf); memcpy(lptr, &tmp, sizeof(double)); } break; case t_real: { double tmp = safe_atof(valbuf); memcpy(lptr, &tmp, sizeof(double)); } break; case t_string: if (parent != NULL && parent->element_type != t_structobject && offset > 0) return JSON_ERR_NOPARSTR; (void)strlcpy(lptr, valbuf, cursor->len); break; case t_boolean: { bool tmp = (strcmp(valbuf, "true") == 0); memcpy(lptr, &tmp, sizeof(bool)); } break; case t_character: if (strlen(valbuf) > 1) /* don't update end here, leave at value start */ return JSON_ERR_STRLONG; else lptr[0] = valbuf[0]; break; case t_ignore: /* silences a compiler warning */ case t_object: /* silences a compiler warning */ case t_structobject: case t_array: break; case t_check: if (strcmp(cursor->dflt.check, valbuf) != 0) { json_debug_trace((1, "Required attribute value %s not present.\n", cursor->dflt.check)); /* don't update end here, leave at start of attribute */ return JSON_ERR_CHECKFAIL; } break; } case post_array: if (isspace((unsigned char) *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")); #ifndef JSON_MINIMAL if (end != NULL) *end = cp; #endif /* JSON_MINIMAL */ return JSON_ERR_BADTRAIL; } break; } } good_parse: /* in case there's another object following, consume trailing WS */ while (isspace((unsigned char) *cp)) ++cp; if (end != NULL) *end = cp; json_debug_trace((1, "JSON parse ends.\n")); return 0; } int json_read_array(const char *cp, const struct json_array_t *arr, const char **end) { int substatus, offset, arrcount; char *tp; if (end != NULL) *end = NULL; /* give it a well-defined value on parse failure */ json_debug_trace((1, "Entered json_read_array()\n")); while (isspace((unsigned char) *cp)) cp++; if (*cp != '[') { json_debug_trace((1, "Didn't find expected array start\n")); return JSON_ERR_ARRAYSTART; } else cp++; tp = arr->arr.strings.store; arrcount = 0; /* Check for empty array */ while (isspace((unsigned char) *cp)) cp++; if (*cp == ']') goto breakout; for (offset = 0; offset < arr->maxlen; offset++) { #ifndef JSON_MINIMAL char *ep = NULL; #endif /* JSON_MINIMAL */ json_debug_trace((1, "Looking at %s\n", cp)); switch (arr->element_type) { case t_string: if (isspace((unsigned char) *cp)) cp++; if (*cp != '"') return JSON_ERR_BADSTRING; else ++cp; arr->arr.strings.ptrs[offset] = 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")); return JSON_ERR_BADSTRING; } else { *tp = *cp++; } json_debug_trace((1, "Bad string syntax in string list.\n")); return JSON_ERR_BADSTRING; stringend: break; case t_object: case t_structobject: substatus = json_internal_read_object(cp, arr->arr.objects.subtype, arr, offset, &cp); if (substatus != 0) { #ifndef JSON_MINIMAL if (end != NULL) end = &cp; #endif /* JSON_MINIMAL */ return substatus; } break; case t_integer: #ifndef JSON_MINIMAL arr->arr.integers.store[offset] = (int)strtol(cp, &ep, 0); if (ep == cp) return JSON_ERR_BADNUM; else cp = ep; break; #endif /* JSON_MINIMAL */ case t_uinteger: #ifndef JSON_MINIMAL arr->arr.uintegers.store[offset] = (unsigned int)strtoul(cp, &ep, 0); if (ep == cp) return JSON_ERR_BADNUM; else cp = ep; break; #endif /* JSON_MINIMAL */ case t_time: #ifndef JSON_MINIMAL if (*cp != '"') return JSON_ERR_BADSTRING; else ++cp; arr->arr.reals.store[offset] = iso8601_to_unix((char *)cp); if (arr->arr.reals.store[offset] >= HUGE_VAL) return JSON_ERR_BADNUM; while (*cp && *cp != '"') cp++; if (*cp != '"') return JSON_ERR_BADSTRING; else ++cp; break; #endif /* JSON_MINIMAL */ case t_real: #ifndef JSON_MINIMAL arr->arr.reals.store[offset] = strtod(cp, &ep); if (ep == cp) return JSON_ERR_BADNUM; else cp = ep; break; #endif /* JSON_MINIMAL */ case t_boolean: #ifndef JSON_MINIMAL if (str_starts_with(cp, "true")) { arr->arr.booleans.store[offset] = true; cp += 4; } else if (str_starts_with(cp, "false")) { arr->arr.booleans.store[offset] = false; cp += 5; } break; #endif /* JSON_MINIMAL */ case t_character: case t_array: case t_check: case t_ignore: json_debug_trace((1, "Invalid array subtype.\n")); return JSON_ERR_SUBTYPE; } arrcount++; if (isspace((unsigned char) *cp)) cp++; if (*cp == ']') { json_debug_trace((1, "End of array found.\n")); goto breakout; } else if (*cp == ',') cp++; else { json_debug_trace((1, "Bad trailing syntax on array.\n")); return JSON_ERR_BADSUBTRAIL; } } json_debug_trace((1, "Too many elements in array.\n")); #ifndef JSON_MINIMAL if (end != NULL) *end = cp; #endif /* JSON_MINIMAL */ return JSON_ERR_SUBTOOLONG; breakout: if (arr->count != NULL) *(arr->count) = arrcount; if (end != NULL) *end = cp; json_debug_trace((1, "leaving json_read_array() with %d elements\n", arrcount)); return 0; } int json_read_object(const char *cp, const struct json_attr_t *attrs, const char **end) { int st; json_debug_trace((1, "json_read_object() sees '%s'\n", cp)); st = json_internal_read_object(cp, attrs, NULL, 0, end); return st; } const char *json_error_string(int err) { const char *errors[] = { "unknown error while parsing JSON", "non-whitespace when expecting object start", "non-whitespace when expecting attribute start", "unknown attribute name", "attribute name too long", "saw [ when not expecting array", "array element specified, but no [", "string value too long", "token value too long", "garbage while expecting comma or } or ]", "didn't find expected array start", "error while parsing object array", "too many array elements", "garbage while expecting array comma", "unsupported array element type", "error while string parsing", "check attribute not matched", "can't support strings in parallel arrays", "invalid enumerated value", "saw quoted value when expecting nonstring", "didn't see quoted value when expecting string", "other data conversion error", "unexpected null value or attribute pointer", }; if (err <= 0 || err >= (int)(sizeof(errors) / sizeof(errors[0]))) return errors[0]; else return errors[err]; } #endif /* SOCKET_EXPORT_ENABLE */ /* end */ gpsd-3.15/json.h0000664000175000017500000000776512520742615011712 0ustar esresr/* Structures for JSON parsing using only fixed-extent memory * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include typedef enum {t_integer, t_uinteger, t_real, t_string, t_boolean, t_character, t_time, t_object, t_structobject, t_array, t_check, t_ignore} json_type; struct json_enum_t { char *name; int value; }; struct json_array_t { json_type element_type; union { struct { const struct json_attr_t *subtype; char *base; size_t stride; } objects; struct { char **ptrs; char *store; int storelen; } strings; struct { int *store; } integers; struct { unsigned int *store; } uintegers; struct { double *store; } reals; struct { bool *store; } booleans; } arr; int *count, maxlen; }; struct json_attr_t { char *attribute; json_type type; union { int *integer; unsigned int *uinteger; double *real; char *string; bool *boolean; char *character; struct json_array_t array; size_t offset; } addr; union { int integer; unsigned int uinteger; double real; bool boolean; char character; char *check; } dflt; size_t len; const struct json_enum_t *map; bool nodefault; }; #define JSON_ATTR_MAX 31 /* max chars in JSON attribute name */ #define JSON_VAL_MAX 512 /* max chars in JSON value part */ #ifdef __cplusplus extern "C" { #endif int json_read_object(const char *, const struct json_attr_t *, const char **); int json_read_array(const char *, const struct json_array_t *, const char **); const char *json_error_string(int); void json_enable_debug(int, FILE *); #ifdef __cplusplus } #endif #define JSON_ERR_OBSTART 1 /* non-WS when expecting object start */ #define JSON_ERR_ATTRSTART 2 /* non-WS when expecting attrib start */ #define JSON_ERR_BADATTR 3 /* unknown attribute name */ #define JSON_ERR_ATTRLEN 4 /* attribute name too long */ #define JSON_ERR_NOARRAY 5 /* saw [ when not expecting array */ #define JSON_ERR_NOBRAK 6 /* array element specified, but no [ */ #define JSON_ERR_STRLONG 7 /* string value too long */ #define JSON_ERR_TOKLONG 8 /* token value too long */ #define JSON_ERR_BADTRAIL 9 /* garbage while expecting comma or } or ] */ #define JSON_ERR_ARRAYSTART 10 /* didn't find expected array start */ #define JSON_ERR_OBJARR 11 /* error while parsing object array */ #define JSON_ERR_SUBTOOLONG 12 /* too many array elements */ #define JSON_ERR_BADSUBTRAIL 13 /* garbage while expecting array comma */ #define JSON_ERR_SUBTYPE 14 /* unsupported array element type */ #define JSON_ERR_BADSTRING 15 /* error while string parsing */ #define JSON_ERR_CHECKFAIL 16 /* check attribute not matched */ #define JSON_ERR_NOPARSTR 17 /* can't support strings in parallel arrays */ #define JSON_ERR_BADENUM 18 /* invalid enumerated value */ #define JSON_ERR_QNONSTRING 19 /* saw quoted value when expecting nonstring */ #define JSON_ERR_NONQSTRING 19 /* didn't see quoted value when expecting string */ #define JSON_ERR_MISC 20 /* other data conversion error */ #define JSON_ERR_BADNUM 21 /* error while parsing a numerical argument */ #define JSON_ERR_NULLPTR 22 /* unexpected null value or attribute pointer */ /* * Use the following macros to declare template initializers for structobject * arrays. Writing the equivalents out by hand is error-prone. * * STRUCTOBJECT takes a structure name s, and a fieldname f in s. * * STRUCTARRAY takes the name of a structure array, a pointer to a an * initializer defining the subobject type, and the address of an integer to * store the length in. */ #define STRUCTOBJECT(s, f) .addr.offset = offsetof(s, f) #define STRUCTARRAY(a, e, n) \ .addr.array.element_type = t_structobject, \ .addr.array.arr.objects.subtype = e, \ .addr.array.arr.objects.base = (char*)a, \ .addr.array.arr.objects.stride = sizeof(a[0]), \ .addr.array.count = n, \ .addr.array.maxlen = NITEMS(a) /* json.h ends here */ gpsd-3.15/jsongen.py.in0000664000175000017500000013007612506332115013174 0ustar esresr#!@PYTHON@ # # @MASTER@ # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # Never hand-hack what you can generate... # # This code generates template declarations for AIS-JSON parsing from a # declarative specification of a JSON structure. # import sys, getopt # # Here is the information that makes it all work - attribute, type, and # defult information for all fields. We generate a JSON # parser template spec. Doing it this way guarantees consistency. # # Notes on the fields: # initname: becomes the name of the generated structure initializer # header: common header to include in front of the structure template # structname: gets prepended to all fieldnames in the generated C # fieldmap: each member fills an initializer slot # stringbuffered: list strings that should be buffered rather than copied # directly into the structure. ais_specs = ( { "initname": "json_ais1", "headers": ("AIS_HEADER",), "structname": "ais->type1", "fieldmap": ( # fieldname type default ('status', 'uinteger', '0'), ('status_text', 'ignore', None), ('turn', 'integer', 'AIS_TURN_NOT_AVAILABLE'), ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), ('accuracy', 'boolean', 'false'), ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), ('heading', 'uinteger', 'AIS_HEADING_NOT_AVAILABLE'), ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), ('maneuver', 'uinteger', 'AIS_SEC_INOPERATIVE'), ('raim', 'boolean', 'false'), ('radio', 'uinteger', '0'), ), }, # Message types 2 and 3 duplicate 1 { "initname": "json_ais4", "headers": ("AIS_HEADER",), "structname": "ais->type4", "fieldmap": ( # fieldname type default ('timestamp', 'string', None), ('accuracy', 'boolean', "true"), ('lon', 'integer', "AIS_LON_NOT_AVAILABLE"), ('lat', 'integer', "AIS_LAT_NOT_AVAILABLE"), ('epfd', 'uinteger', "0"), ('epfd_text', 'ignore', None), ('raim', 'boolean', "false"), ('radio', 'uinteger', "0"), ), "stringbuffered": ("timestamp",), }, { "initname": "json_ais5", "headers": ("AIS_HEADER",), "structname": "ais->type5", "fieldmap": ( # fieldname type default ('imo', 'uinteger', '0'), ('ais_version', 'uinteger', '0'), ('callsign', 'string', None), ('shipname', 'string', None), ('shiptype', 'uinteger', '0'), ('shiptype_text', 'ignore', None), ('to_bow', 'uinteger', '0'), ('to_stern', 'uinteger', '0'), ('to_port', 'uinteger', '0'), ('to_starboard', 'uinteger', '0'), ('epfd', 'uinteger', '0'), ('epfd_text', 'ignore', None), ('eta', 'string', None), ('draught', 'uinteger', '0'), ('destination', 'string', None), ('dte', 'uinteger', '1'), ), "stringbuffered": ("eta",), }, { "initname": "json_ais6", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6", "fieldmap": ( # fieldname type default ('data', 'string', None), ), "stringbuffered": ("data",), }, { "initname": "json_ais6_fid10", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6.dac235fid10", "fieldmap": ( # fieldname type default ('ana_int', 'uinteger', '0'), ('ana_ext1', 'uinteger', '0'), ('ana_ext2', 'uinteger', '0'), ('racon', 'uinteger', '0'), ('racon_text', 'ignore', None), ('light', 'uinteger', '0'), ('light_text', 'ignore', None), ('alarm', 'boolean', 'false'), ('stat_ext', 'uinteger', '0'), ('off_pos', 'boolean', 'false'), ), }, { "initname": "json_ais6_fid12", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6.dac1fid12", "fieldmap": ( # fieldname type default ('lastport', 'string', None), ('departure', 'string', None), ('nextport', 'string', None), ('eta', 'string', None), ('dangerous', 'string', None), ('imdcat', 'string', None), ('unid', 'uinteger', '0'), ('amount', 'uinteger', '0'), ('unit', 'uinteger', '0'), ), "stringbuffered": ("departure", "eta",), }, { "initname": "json_ais6_fid15", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6.dac1fid15", "fieldmap": ( # fieldname type default ('airdraught', 'uinteger', '0'), ), }, { "initname": "json_ais6_fid16", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6.dac1fid16", "fieldmap": ( # fieldname type default ('persons', 'uinteger', '0'), ), }, { "initname": "json_ais6_fid18", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6.dac1fid18", "fieldmap": ( # fieldname type default ('linkage', 'uinteger', '0'), ('arrival', 'string', None), ('portname', 'string', None), ('destination', 'string', None), ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), ), 'stringbuffered': ('arrival',), }, { "initname": "json_ais6_fid20", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6.dac1fid20", "fieldmap": ( # fieldname type default ('linkage', 'uinteger', '0'), ('berth_length', 'uinteger', '0'), ('berth_depth', 'uinteger', '0'), ('position', 'uinteger', '0'), ('position_text', 'ignore', None), ('arrival', 'string', None), ('availability', 'uinteger', '0'), ('agent', 'uinteger', '0'), ('fuel', 'uinteger', '0'), ('chandler', 'uinteger', '0'), ('stevedore', 'uinteger', '0'), ('electrical', 'uinteger', '0'), ('water', 'uinteger', '0'), ('customs', 'uinteger', '0'), ('cartage', 'uinteger', '0'), ('crane', 'uinteger', '0'), ('lift', 'uinteger', '0'), ('medical', 'uinteger', '0'), ('navrepair', 'uinteger', '0'), ('provisions', 'uinteger', '0'), ('shiprepair', 'uinteger', '0'), ('surveyor', 'uinteger', '0'), ('steam', 'uinteger', '0'), ('tugs', 'uinteger', '0'), ('solidwaste', 'uinteger', '0'), ('liquidwaste', 'uinteger', '0'), ('hazardouswaste', 'uinteger', '0'), ('ballast', 'uinteger', '0'), ('additional', 'uinteger', '0'), ('regional1', 'uinteger', '0'), ('regional2', 'uinteger', '0'), ('future1', 'uinteger', '0'), ('future2', 'uinteger', '0'), ('berth_name', 'string', None), ('berth_lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), ('berth_lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), ), 'stringbuffered': ('arrival', 'berth_name',), }, { "initname": "json_ais6_fid21", "headers": ("AIS_HEADER", "AIS_TYPE6"), "structname": "ais->type6.dac200fid21", "fieldmap": ( # fieldname type default ('country', 'string', None), ('locode', 'string', None), ('section', 'string', None), ('terminal', 'string', None), ('hectometre', 'string', None), ('eta', 'string', None), ('tugs', 'uinteger', '0'), ('airdraught', 'uinteger', '0'), ), "stringbuffered": ("eta",), }, { "initname": "json_ais6_fid22", "headers": ("AIS_HEADER", "AIS_TYPE6"), "structname": "ais->type6.dac200fid22", "fieldmap": ( # fieldname type default ('country', 'string', None), ('locode', 'string', None), ('section', 'string', None), ('terminal', 'string', None), ('hectometre', 'string', None), ('rta', 'string', None), ('status', 'uinteger', 'DAC200FID22_STATUS_NOT_AVAILABLE'), ), "stringbuffered": ("rta",), }, { "initname": "json_ais6_fid25", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6.dac1fid25", "fieldmap": ( # fieldname type default ('unit', 'uinteger', '0'), ('amount', 'uinteger', '0'), ('cargos', 'array', ( ('cargo_t', 'ncargos', ( ('code', 'uinteger', '0'), ('subtype', 'uinteger', '0'), )))), ), }, { "initname": "json_ais6_fid28", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6.dac1fid28", "fieldmap": ( # fieldname type default ('linkage', 'uinteger', '0'), ('sender', 'uinteger', '0'), ('rtype', 'uinteger', '0'), ('rtype_text', 'ignore', None), ('start', 'string', None), ('duration', 'uinteger', '0'), ('waypoints', 'array', ( ('waypoint_t', 'waycount', ( ('lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), )))), ), 'stringbuffered': ('start',), }, { "initname": "json_ais6_fid30", "headers": ("AIS_HEADER", "AIS_TYPE6",), "structname": "ais->type6.dac1fid30", "fieldmap": ( # fieldname type default ('linkage', 'uinteger', '0'), ('text', 'string', '0'), ), }, { "initname": "json_ais6_fid32", "headers": ("AIS_HEADER", "AIS_TYPE6"), "structname": "ais->type6.dac1fid32", "fieldmap": ( # fieldname type default ('month', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), ('day', 'uinteger', 'AIS_DAY_NOT_AVAILABLE'), ('tidals', 'array', ( ('tidal_t', 'ntidals', ( ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), ('from_hour', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), ('from_min', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), ('to_hour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), ('to_min', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), ('cdir', 'uinteger', 'DAC1FID32_CDIR_NOT_AVAILABLE'), ('cspeed', 'uinteger', 'DAC1FID32_CSPEED_NOT_AVAILABLE'), )))), ), }, { "initname": "json_ais6_fid55", "headers": ("AIS_HEADER", "AIS_TYPE6"), "structname": "ais->type6.dac200fid55", "fieldmap": ( # fieldname type default ('crew', 'uinteger', 'DAC200FID55_COUNT_NOT_AVAILABLE'), ('passengers', 'uinteger', 'DAC200FID55_COUNT_NOT_AVAILABLE'), ('personnel', 'uinteger', 'DAC200FID55_COUNT_NOT_AVAILABLE'), ), }, { "initname": "json_ais7", "headers": ("AIS_HEADER",), "structname": "ais->type7", "fieldmap": ( # fieldname type default ('mmsi1', 'uinteger', '0'), ('mmsi2', 'uinteger', '0'), ('mmsi3', 'uinteger', '0'), ('mmsi4', 'uinteger', '0'), ), }, { "initname": "json_ais8", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8", "fieldmap": ( # fieldname type default ('data', 'string', None), ), "stringbuffered": ("data",), }, { "initname": "json_ais8_fid10", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac200fid10", "fieldmap": ( # fieldname type default ('vin', 'string', None), ('length', 'uinteger', '0'), ('beam', 'uinteger', '0'), ('shiptype', 'uinteger', '0'), ('shiptype_text', 'ignore', None), ('hazard', 'uinteger', '0'), ('hazard_text', 'ignore', None), ('draught', 'uinteger', '0'), ('loaded', 'uinteger', '0'), ('loaded_text', 'ignore', None), ('speed_q', 'boolean', 'false'), ('course_q', 'boolean', 'false'), ('heading_q', 'boolean', 'false'), ), }, { "initname": "json_ais8_fid11", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac1fid11", "fieldmap": ( # fieldname type default ('lat', 'integer', 'DAC1FID11_LAT_NOT_AVAILABLE'), ('lon', 'integer', 'DAC1FID11_LON_NOT_AVAILABLE'), ('timestamp', 'string', None), ('wspeed', 'uinteger', 'DAC1FID11_WSPEED_NOT_AVAILABLE'), ('wgust', 'uinteger', 'DAC1FID11_WSPEED_NOT_AVAILABLE'), ('wdir', 'uinteger', 'DAC1FID11_WDIR_NOT_AVAILABLE'), ('wgustdir', 'uinteger', 'DAC1FID11_WDIR_NOT_AVAILABLE'), ('airtemp', 'uinteger', 'DAC1FID11_AIRTEMP_NOT_AVAILABLE'), ('humidity', 'uinteger', 'DAC1FID11_HUMIDITY_NOT_AVAILABLE'), ('dewpoint', 'uinteger', 'DAC1FID11_DEWPOINT_NOT_AVAILABLE'), ('pressure', 'uinteger', 'DAC1FID11_PRESSURE_NOT_AVAILABLE'), ('pressuretend', 'uinteger', 'DAC1FID11_PRESSURETREND_NOT_AVAILABLE'), ('visibility', 'uinteger', 'DAC1FID11_VISIBILITY_NOT_AVAILABLE'), ('waterlevel', 'integer', 'DAC1FID11_WATERLEVEL_NOT_AVAILABLE'), ('leveltrend', 'uinteger', 'DAC1FID11_WATERLEVELTREND_NOT_AVAILABLE'), ('cspeed', 'uinteger', 'DAC1FID11_CSPEED_NOT_AVAILABLE'), ('cdir', 'uinteger', 'DAC1FID11_CDIR_NOT_AVAILABLE'), ('cspeed2', 'uinteger', 'DAC1FID11_CSPEED_NOT_AVAILABLE'), ('cdir2', 'uinteger', 'DAC1FID11_CDIR_NOT_AVAILABLE'), ('cdepth2', 'uinteger', 'DAC1FID11_CDEPTH_NOT_AVAILABLE'), ('cspeed3', 'uinteger', 'DAC1FID11_CSPEED_NOT_AVAILABLE'), ('cdir3', 'uinteger', 'DAC1FID11_CDIR_NOT_AVAILABLE'), ('cdepth3', 'uinteger', 'DAC1FID11_CDEPTH_NOT_AVAILABLE'), ('waveheight', 'uinteger', 'DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE'), ('waveperiod', 'uinteger', 'DAC1FID11_WAVEPERIOD_NOT_AVAILABLE'), ('wavedir', 'uinteger', 'DAC1FID11_WAVEDIR_NOT_AVAILABLE'), ('swellheight', 'uinteger', 'DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE'), ('swellperiod', 'uinteger', 'DAC1FID11_WAVEPERIOD_NOT_AVAILABLE'), ('swelldir', 'uinteger', 'DAC1FID11_WAVEDIR_NOT_AVAILABLE'), ('seastate', 'uinteger', 'DAC1FID11_SEASTATE_NOT_AVAILABLE'), ('watertemp', 'uinteger', 'DAC1FID11_WATERTEMP_NOT_AVAILABLE'), ('preciptype', 'uinteger', 'DAC1FID11_PRECIPTYPE_NOT_AVAILABLE'), ('preciptype_text', 'ignore', None), ('salinity', 'uinteger', 'DAC1FID11_SALINITY_NOT_AVAILABLE'), ('ice', 'uinteger', 'DAC1FID11_ICE_NOT_AVAILABLE'), ('ice_text', 'ignore', None), ), "stringbuffered": ("timestamp",), }, { "initname": "json_ais8_fid13", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac1fid13", "fieldmap": ( # fieldname type default ('reason', 'string', None), ('closefrom', 'string', None), ('closeto', 'string', None), ('radius', 'uinteger', 'AIS_DAC1FID13_RADIUS_NOT_AVAILABLE'), ('extunit', 'uinteger', 'AIS_DAC1FID13_EXTUNIT_NOT_AVAILABLE'), ('fday', 'uinteger', 'AIS_DAY_NOT_AVAILABLE'), ('fmonth', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), ('fhour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), ('fminute', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), ('tday', 'uinteger', 'AIS_DAY_NOT_AVAILABLE'), ('tmonth', 'uinteger', 'AIS_MONTH_NOT_AVAILABLE'), ('thour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), ('tminute', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), ), 'stringbuffered': ('closefrom', 'closeto'), }, { "initname": "json_ais8_fid15", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac1fid15", "fieldmap": ( # fieldname type default ('airdraught', 'uinteger', '0'), ), }, { "initname": "json_ais8_fid16", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac1fid16", "fieldmap": ( # fieldname type default ('persons', 'uinteger', '0'), ), }, { "initname": "json_ais8_fid17", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac1fid17", "fieldmap": ( # fieldname type default ('targets', 'array', ( ('target_t', 'ntargets', ( ('idtype', 'uinteger', 'DAC1FID17_IDTYPE_OTHER'), ("id.mmsi", 'uinteger', '0'), ("id.imo", 'uinteger', '0'), ("id.callsign", 'string', 'DAC1FID17_ID_LENGTH'), ("id.other", 'string', 'DAC1FID17_ID_LENGTH'), ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), ('course', 'uinteger', 'DAC1FID17_COURSE_NOT_AVAILABLE'), ('second', 'uinteger', 'AIS_SECOND_NOT_AVAILABLE'), ('speed', 'uinteger', 'DAC1FID17_SPEED_NOT_AVAILABLE'), )))), ), }, { "initname": "json_ais8_fid19", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac1fid19", "fieldmap": ( # fieldname type default ('linkage', 'uinteger', '0'), ('station', 'string', None), ('lon', 'integer', 'AIS_LON3_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT3_NOT_AVAILABLE'), ('status', 'uinteger', '0'), ('signal', 'uinteger', '0'), ('signal_text', 'ignore', None), ('hour', 'uinteger', 'AIS_HOUR_NOT_AVAILABLE'), ('minute', 'uinteger', 'AIS_MINUTE_NOT_AVAILABLE'), ('nextsignal', 'uinteger', '0'), ('nextsignal_type', 'ignore', None), ), }, { "initname": "json_ais8_fid23", "headers": ("AIS_HEADER", "AIS_TYPE8"), "structname": "ais->type8.dac200fid23", "fieldmap": ( # fieldname type default ('start', 'string', None), ('end', 'string', None), ('start_lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), ('start_lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), ('end_lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), ('end_lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), ('type', 'uinteger', 'DAC200FID23_TYPE_UNKNOWN'), ('type_text', 'ignore', None), ('min', 'integer', 'DAC200FID23_MIN_UNKNOWN'), ('max', 'integer', 'DAC200FID23_MAX_UNKNOWN'), ('intensity', 'uinteger', 'DAC200FID23_CLASS_UNKNOWN'), ('intensity_text', 'ignore', None), ('wind', 'uinteger', 'DAC200FID23_WIND_UNKNOWN'), ('wind_text', 'ignore', None), ), 'stringbuffered': ('start', 'end'), }, { "initname": "json_ais8_fid24", "headers": ("AIS_HEADER", "AIS_TYPE8"), "structname": "ais->type8.dac200fid24", "fieldmap": ( # fieldname type default ('country', 'string', None), ('gauges', 'array', ( ('gauge_t', 'ngauges', ( ('id', 'uinteger', 'DAC200FID24_GAUGE_ID_UNKNOWN'), ('level', 'integer', 'DAC200FID24_GAUGE_LEVEL_UNKNOWN'), )))), ), }, { "initname": "json_ais8_fid27", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac1fid27", "fieldmap": ( # fieldname type default ('linkage', 'uinteger', '0'), ('sender', 'uinteger', '0'), ('rtype', 'uinteger', '0'), ('rtype_text', 'ignore', None), ('start', 'string', None), ('duration', 'uinteger', '0'), ('waypoints', 'array', ( ('waypoint_t', 'waycount', ( ('lon', 'integer', 'AIS_LON4_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT4_NOT_AVAILABLE'), )))), ), 'stringbuffered': ('start',), }, { "initname": "json_ais8_fid29", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac1fid29", "fieldmap": ( # fieldname type default ('linkage', 'uinteger', '0'), ('text', 'string', '0'), ), }, { "initname": "json_ais8_fid31", "headers": ("AIS_HEADER", "AIS_TYPE8",), "structname": "ais->type8.dac1fid31", "fieldmap": ( # fieldname type default ('lon', 'integer', 'DAC1FID31_LON_NOT_AVAILABLE'), ('lat', 'integer', 'DAC1FID31_LAT_NOT_AVAILABLE'), ('accuracy', 'boolean', 'false'), ('timestamp', 'string', None), ('wspeed', 'uinteger', 'DAC1FID31_WIND_NOT_AVAILABLE'), ('wgust', 'uinteger', 'DAC1FID31_WIND_NOT_AVAILABLE'), ('wdir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), ('wgustdir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), ('airtemp', 'integer', 'DAC1FID31_AIRTEMP_NOT_AVAILABLE'), ('humidity', 'uinteger', 'DAC1FID31_HUMIDITY_NOT_AVAILABLE'), ('dewpoint', 'integer', 'DAC1FID31_DEWPOINT_NOT_AVAILABLE'), ('pressure', 'uinteger', 'DAC1FID31_PRESSURE_NOT_AVAILABLE'), ('pressuretend', 'uinteger', 'DAC1FID31_PRESSURETEND_NOT_AVAILABLE'), ('visgreater', 'boolean', 'false'), ('visibility', 'uinteger', 'DAC1FID31_VISIBILITY_NOT_AVAILABLE'), ('waterlevel', 'integer', 'DAC1FID31_WATERLEVEL_NOT_AVAILABLE'), ('leveltrend', 'uinteger', 'DAC1FID31_WATERLEVELTREND_NOT_AVAILABLE'), ('cspeed', 'uinteger', 'DAC1FID31_CSPEED_NOT_AVAILABLE'), ('cdir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), ('cspeed2', 'uinteger', 'DAC1FID31_CSPEED_NOT_AVAILABLE'), ('cdir2', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), ('cdepth2', 'uinteger', 'DAC1FID31_CDEPTH_NOT_AVAILABLE'), ('cspeed3', 'uinteger', 'DAC1FID31_CSPEED_NOT_AVAILABLE'), ('cdir3', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), ('cdepth3', 'uinteger', 'DAC1FID31_CDEPTH_NOT_AVAILABLE'), ('waveheight', 'uinteger', 'DAC1FID31_HEIGHT_NOT_AVAILABLE'), ('waveperiod', 'uinteger', 'DAC1FID31_PERIOD_NOT_AVAILABLE'), ('wavedir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), ('swellheight', 'uinteger', 'DAC1FID31_HEIGHT_NOT_AVAILABLE'), ('swellperiod', 'uinteger', 'DAC1FID31_PERIOD_NOT_AVAILABLE'), ('swelldir', 'uinteger', 'DAC1FID31_DIR_NOT_AVAILABLE'), ('seastate', 'uinteger', 'DAC1FID31_SEASTATE_NOT_AVAILABLE'), ('watertemp', 'integer', 'DAC1FID31_WATERTEMP_NOT_AVAILABLE'), ('preciptype', 'uinteger', 'DAC1FID31_PRECIPTYPE_NOT_AVAILABLE'), ('preciptype_text', 'ignore', None), ('salinity', 'uinteger', 'DAC1FID31_SALINITY_NOT_AVAILABLE'), ('ice', 'uinteger', 'DAC1FID31_ICE_NOT_AVAILABLE'), ), "stringbuffered": ("timestamp",), }, { "initname": "json_ais8_fid40", "headers": ("AIS_HEADER", "AIS_TYPE8"), "structname": "ais->type8.dac200fid40", "fieldmap": ( # fieldname type default ('form', 'uinteger', 'DAC200FID40_FORM_UNKNOWN'), ('facing', 'uinteger', 'DAC200FID40_FACING_UNKNOWN'), ('direction', 'uinteger', 'DAC200FID40_DIRECTION_UNKNOWN'), ('direction_text', 'ignore', None), ('status', 'uinteger', 'DAC200FID40_STATUS_UNKNOWN'), ('status_text', 'ignore', None), ), }, { "initname": "json_ais9", "headers": ("AIS_HEADER",), "structname": "ais->type9", "fieldmap": ( # fieldname type default ('alt', 'uinteger', 'AIS_ALT_NOT_AVAILABLE'), ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), ('accuracy', 'boolean', 'false'), ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), ('regional', 'uinteger', '0'), ('dte', 'uinteger', '1'), ('raim', 'boolean', 'false'), ('radio', 'uinteger', '0'), ), }, { "initname": "json_ais10", "headers": ("AIS_HEADER",), "structname": "ais->type10", "fieldmap": ( # fieldname type default ('dest_mmsi', 'uinteger', '0'), ), }, # Message type 11 duplicates 4 { "initname": "json_ais12", "headers": ("AIS_HEADER",), "structname": "ais->type12", "fieldmap": ( # fieldname type default ('seqno', 'uinteger', '0'), ('dest_mmsi', 'uinteger', '0'), ('retransmit', 'boolean', '0'), ('text', 'string', None), ), }, # Message type 13 duplicates 7 { "initname": "json_ais14", "headers": ("AIS_HEADER",), "structname": "ais->type14", "fieldmap": ( # fieldname type default ('text', 'string', None), ), }, { "initname": "json_ais15", "headers": ("AIS_HEADER",), "structname": "ais->type15", "fieldmap": ( # fieldname type default ('mmsi1', 'uinteger', '0'), ('type1_1', 'uinteger', '0'), ('offset1_1', 'uinteger', '0'), ('type1_2', 'uinteger', '0'), ('offset1_2', 'uinteger', '0'), ('mmsi2', 'uinteger', '0'), ('type2_1', 'uinteger', '0'), ('offset2_1', 'uinteger', '0'), ), }, { "initname": "json_ais16", "headers": ("AIS_HEADER",), "structname": "ais->type16", "fieldmap": ( # fieldname type default ('mmsi1', 'uinteger', '0'), ('offset1', 'uinteger', '0'), ('increment1', 'uinteger', '0'), ('mmsi2', 'uinteger', '0'), ('offset2', 'uinteger', '0'), ('increment2', 'uinteger', '0'), ), }, { "initname": "json_ais17", "headers": ("AIS_HEADER",), "structname": "ais->type17", "fieldmap": ( # fieldname type default ('lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), ('data', 'string', None), ), "stringbuffered": ("data",), }, { "initname": "json_ais18", "headers": ("AIS_HEADER",), "structname": "ais->type18", "fieldmap": ( # fieldname type default ('reserved', 'uinteger', '0'), ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), ('accuracy', 'boolean', 'false'), ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), ('heading', 'uinteger', 'AIS_HEADING_NOT_AVAILABLE'), ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), ('regional', 'uinteger', '0'), ('cs', 'boolean', 'false'), ('display', 'boolean', 'false'), ('dsc', 'boolean', 'false'), ('band', 'boolean', 'false'), ('msg22', 'boolean', 'false'), ('raim', 'boolean', 'false'), ('radio', 'uinteger', '0'), ), }, { "initname": "json_ais19", "headers": ("AIS_HEADER",), "structname": "ais->type19", "fieldmap": ( # fieldname type default ('reserved', 'uinteger', '0'), ('speed', 'uinteger', 'AIS_SPEED_NOT_AVAILABLE'), ('accuracy', 'boolean', 'false'), ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), ('course', 'uinteger', 'AIS_COURSE_NOT_AVAILABLE'), ('heading', 'uinteger', 'AIS_HEADING_NOT_AVAILABLE'), ('second', 'uinteger', 'AIS_SEC_NOT_AVAILABLE'), ('regional', 'uinteger', '0'), ('shipname', 'string', None), ('shiptype', 'uinteger', '0'), ('shiptype_text', 'ignore', None), ('to_bow', 'uinteger', '0'), ('to_stern', 'uinteger', '0'), ('to_port', 'uinteger', '0'), ('to_starboard', 'uinteger', '0'), ('epfd', 'uinteger', '0'), ('epfd_text', 'ignore', None), ('raim', 'boolean', 'false'), ('dte', 'uinteger', '1'), ('assigned', 'boolean', 'false'), ), }, { "initname": "json_ais20", "headers": ("AIS_HEADER",), "structname": "ais->type20", "fieldmap": ( # fieldname type default ('offset1', 'uinteger', '0'), ('number1', 'uinteger', '0'), ('timeout1', 'uinteger', '0'), ('increment1', 'uinteger', '0'), ('offset2', 'uinteger', '0'), ('number2', 'uinteger', '0'), ('timeout2', 'uinteger', '0'), ('increment2', 'uinteger', '0'), ('offset3', 'uinteger', '0'), ('number3', 'uinteger', '0'), ('timeout3', 'uinteger', '0'), ('increment3', 'uinteger', '0'), ('offset4', 'uinteger', '0'), ('number4', 'uinteger', '0'), ('timeout4', 'uinteger', '0'), ('increment4', 'uinteger', '0'), ), }, { "initname": "json_ais21", "headers": ("AIS_HEADER",), "structname": "ais->type21", "fieldmap": ( # fieldname type default ('aid_type', 'uinteger', '0'), ('aid_type_text', 'ignore', None), ('name', 'string', None), ('accuracy', 'boolean', 'false'), ('lon', 'integer', 'AIS_LON_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LAT_NOT_AVAILABLE'), ('to_bow', 'uinteger', '0'), ('to_stern', 'uinteger', '0'), ('to_port', 'uinteger', '0'), ('to_starboard', 'uinteger', '0'), ('epfd', 'uinteger', '0'), ('epfd_text', 'ignore', None), ('second', 'uinteger', '0'), ('regional', 'uinteger', '0'), ('off_position', 'boolean', 'false'), ('raim', 'boolean', 'false'), ('virtual_aid', 'boolean', 'false'), ), }, { "initname": "json_ais22", "headers": ("AIS_HEADER",), "structname": "ais->type22", "fieldmap": ( # fieldname type default ('channel_a', 'uinteger', '0'), ('channel_b', 'uinteger', '0'), ('txrx', 'uinteger', '0'), ('power', 'boolean', 'false'), ('area.ne_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), ('area.ne_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), ('area.sw_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), ('area.sw_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), ('mmsi.dest1', 'uinteger', '0'), ('mmsi.dest2', 'uinteger', '0'), ('addressed', 'boolean', 'false'), ('band_a', 'boolean', 'false'), ('band_b', 'boolean', 'false'), ('zonesize', 'uinteger', '0'), ), }, { "initname": "json_ais23", "headers": ("AIS_HEADER",), "structname": "ais->type23", "fieldmap": ( # fieldname type default ('ne_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), ('ne_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), ('sw_lon', 'integer', 'AIS_GNS_LON_NOT_AVAILABLE'), ('sw_lat', 'integer', 'AIS_GNS_LAT_NOT_AVAILABLE'), ('stationtype', 'uinteger', '0'), ('stationtype_text', 'ignore', None), ('shiptype', 'uinteger', '0'), ('shiptype_text', 'ignore', None), ('txrx', 'uinteger', '0'), ('interval', 'uinteger', '0'), ('quiet', 'uinteger', '0'), ), }, { "initname": "json_ais24", "headers": ("AIS_HEADER",), "structname": "ais->type24", "fieldmap": ( # fieldname type default ('shipname', 'string', None), # Part A ('shiptype', 'uinteger', '0'), # Part B ('shiptype_text', 'ignore', None), ('vendorid', 'string', None), # Part B ('model', 'uinteger', '0'), # Part B ('serial', 'uinteger', '0'), # Part B ('callsign', 'string', None), # Part B ('mothership_mmsi', 'uinteger', '0'), # Part B ('dim.to_bow', 'uinteger', '0'), # Part B ('dim.to_stern', 'uinteger', '0'), # Part B ('dim.to_port', 'uinteger', '0'), # Part B ('dim.to_starboard', 'uinteger', '0'), # Part B ), }, { "initname": "json_ais25", "headers": ("AIS_HEADER",), "structname": "ais->type25", "fieldmap": ( # fieldname type default ('addressed', 'boolean', 'false'), ('structured', 'boolean', 'false'), ('dest_mmsi', 'uinteger', '0'), ('app_id', 'uinteger', '0'), ('data', 'string', None), ), "stringbuffered": ("data",), }, { "initname": "json_ais26", "headers": ("AIS_HEADER",), "structname": "ais->type26", "fieldmap": ( # fieldname type default ('addressed', 'boolean', 'false'), ('structured', 'boolean', 'false'), ('dest_mmsi', 'uinteger', '0'), ('app_id', 'uinteger', '0'), ('data', 'string', None), ('radio', 'uinteger', '0'), ), "stringbuffered": ("data",), }, { "initname": "json_ais27", "headers": ("AIS_HEADER",), "structname": "ais->type27", "fieldmap": ( # fieldname type default ('status', 'uinteger', '0'), ('speed', 'uinteger', 'AIS_LONGRANGE_SPEED_NOT_AVAILABLE'), ('accuracy', 'boolean', 'false'), ('lon', 'integer', 'AIS_LONGRANGE_LON_NOT_AVAILABLE'), ('lat', 'integer', 'AIS_LONGRANGE_LAT_NOT_AVAILABLE'), ('course', 'uinteger', 'AIS_LONGRANGE_COURSE_NOT_AVAILABLE'), ('raim', 'boolean', 'false'), ('gnss', 'boolean', 'true'), ), }, ) # You should not need to modify anything below this line. def generate(spec): report = "" leader = " " * 39 initname = spec["initname"] # Utter storage declarations for any fields that are declared to be # stringbuffered. These will need to be postprocessed in json_ais_read(). attributes = [t[0] for t in spec["fieldmap"]] for attr in spec.get("stringbuffered", []): if attr not in attributes: print >>sys.stderr, "buffered %s is not in base attributes of %s"\ % (attr, initname) raise SystemExit, 1 elif attr not in outboard: report += " char %s[JSON_VAL_MAX+1];\n" % attr outboard.append(attr) structname = spec["structname"] # If there are structarrays describing array subobjects, we need # to make a separate parse control initializer for each one. The # attribute name is the name of the array; substructure and length # fieldnames must be given in the defaults part. for (attr, itype, arrayparts) in spec["fieldmap"]: if itype == 'array': (innerstruct, lengthfield, elements) = arrayparts report += " const struct json_attr_t %s_%s_subtype[] = {\n" % (initname, attr) for (subattr, subitype, default) in elements: report += '\t{"%s",%st_%s,%sSTRUCTOBJECT(struct %s, %s),\n' % \ (subattr, " " * (14 - len(subattr)), subitype, " " * (8 - len(subitype)), innerstruct, subattr) if subitype != "string": report += leader + ".dflt.%s = %s},\n" % (subitype, default) elif default: report += leader + ".len = %s},\n" % (default,) else: print >>sys.stderr, "explicit length specification required" raise SystemExit, 1 report += """\ {NULL} }; """ # Generate the main structure definition describing this parse. # It may have object subarrays. report += " const struct json_attr_t %s[] = {\n" % initname if "headers" in spec: for header in spec["headers"]: report += '\t' + header + "\n" for (attr, itype, default) in spec["fieldmap"]: if itype == 'array': (innerstruct, lengthfield, elements) = default report += '\t{"%s",%st_array, STRUCTARRAY(%s.%s, %s_%s_subtype, &%s.%s)},\n' \ % (attr, " " * (14 - len(attr)), structname, attr, initname, attr, structname, lengthfield) else: if itype == "string": deref = "" else: deref = "&" if attr in spec.get("stringbuffered", []): target = attr else: target = structname + "." + attr if "." in attr: attr = attr[attr.rfind(".") + 1:] if itype == 'ignore': report += '\t{"%s", t_ignore},\n' % attr continue report += '\t{"%s",%st_%s,%s.addr.%s = %s%s,\n' % \ (attr, " " * (14 - len(attr)), itype, " " * (10 - len(itype)), itype, deref, target) if itype == "string": report += leader + ".len = sizeof(%s)},\n" % target else: report += leader + ".dflt.%s = %s},\n" % (itype, default) report += """\ {NULL} }; """ print report if __name__ == '__main__': try: # The --ais and --target= options are (required) placeholders. # In the future, this script will generate more different kinds # of code. (options, arguments) = getopt.getopt(sys.argv[1:], "", ["ais", "target="]) except getopt.GetoptError, msg: print "jsongen.py: " + str(msg) raise SystemExit, 1 spec = None target = None for (switch, val) in options: if switch == '--ais': spec = ais_specs elif switch == '--target': target = val if not target or not spec: print "jsongen.py: must specify type and target." raise SystemExit, 1 if target == 'parser': print """/* * This is code generated by jsongen.py. Do not hand-hack it! */ #define NITEMS(x) (int)(sizeof(x)/sizeof(x[0])) /*@ -fullinitblock */ """ outboard = [] for description in spec: generate(description) print """ /*@ +fullinitblock */ /* Generated code ends. */ """ # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: gpsd-3.15/lcdgps.c0000664000175000017500000002522212506330203012162 0ustar esresr/* * Copyright (c) 2005 Jeff Francis * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* Jeff Francis jeff@gritch.org A client that passes gpsd data to lcdproc, turning your car computer into a very expensive feature-free GPS receiver ;^). Currently assumes a 4x40 LCD and writes data formatted to fit that size screen. Also displays Maidenhead grid square output for the hams among us. This program assumes that LCDd (lcdproc) is running locally on the default (13666) port. The #defines LCDDHOST and LCDDPORT can be changed to talk to a different host and TCP port. */ #define LCDDHOST "localhost" #define LCDDPORT 13666 #define CLIMB 3 #include #ifndef AF_UNSPEC #include #include #include #endif /* AF_UNSPEC */ #ifndef INADDR_ANY #include #endif /* INADDR_ANY */ #include #include #include #include #include #include #include #include "gps.h" #include "gpsdclient.h" #include "revision.h" /* Prototypes. */ ssize_t sockreadline(int sockd,void *vptr,size_t maxlen); ssize_t sockwriteline(int sockd,const void *vptr,size_t n); int send_lcd(char *buf); static struct fixsource_t source; static struct gps_data_t gpsdata; static float altfactor = METERS_TO_FEET; static float speedfactor = MPS_TO_MPH; static char *altunits = "ft"; static char *speedunits = "mph"; double avgclimb, climb[CLIMB]; /* Global socket descriptor for LCDd. */ int sd; /* Read a line from a socket */ ssize_t sockreadline(int sockd,void *vptr,size_t maxlen) { ssize_t n; char c,*buffer; buffer=vptr; for (n = 1; n < (ssize_t)maxlen; n++) { ssize_t rc; if ((rc=read(sockd,&c,1))==1) { *buffer++=c; if (c=='\n') break; } else if (rc==0) { if (n==1) return(0); else break; } else { if (errno==EINTR) continue; return(-1); } } *buffer=0; return(n); } /* Write a line to a socket */ ssize_t sockwriteline(int sockd,const void *vptr,size_t n) { size_t nleft; const char *buffer; buffer=vptr; nleft=n; while (nleft>0) { ssize_t nwritten; if ((nwritten= write(sockd,buffer,nleft))<=0) { if (errno==EINTR) nwritten=0; else return(-1); } nleft-=nwritten; buffer+=nwritten; } return(n); } /* send a command to the LCD */ int send_lcd(char *buf) { int res; char rcvbuf[256]; size_t outlen; /* Limit the size of outgoing strings. */ outlen = strlen(buf); if (outlen > 255) { outlen = 256; } /* send the command */ (void)sockwriteline(sd,buf,outlen); /* TODO: check return status */ /* read the data */ res=sockreadline(sd,rcvbuf,sizeof(rcvbuf)-1); /* null-terminate the string before printing */ /* rcvbuf[res-1]=0; FIX-ME: not using this at the moment... */ /* return the result */ return(res); } /* reset the LCD */ static void reset_lcd(void) { /* Initialize. In theory, we should look at what's returned, as it tells us info on the attached LCD module. TODO. */ send_lcd("hello\n"); /* Set up the screen */ send_lcd("client_set name {GPSD test}\n"); send_lcd("screen_add gpsd\n"); send_lcd("widget_add gpsd one string\n"); send_lcd("widget_add gpsd two string\n"); send_lcd("widget_add gpsd three string\n"); send_lcd("widget_add gpsd four string\n"); } static enum deg_str_type deg_type = deg_dd; /* This gets called once for each new sentence. */ static void update_lcd(struct gps_data_t *gpsdata) { char tmpbuf[255]; char *gridsquare; /* Get our location in Maidenhead. */ gridsquare = maidenhead(gpsdata->fix.latitude,gpsdata->fix.longitude); /* Fill in the latitude and longitude. */ if (gpsdata->fix.mode >= MODE_2D) { int track; char *s; s = deg_to_str(deg_type, fabs(gpsdata->fix.latitude)); snprintf(tmpbuf, sizeof(tmpbuf) - 1, "widget_set gpsd one 1 1 {Lat: %s %c}\n", s, (gpsdata->fix.latitude < 0) ? 'S' : 'N'); send_lcd(tmpbuf); s = deg_to_str(deg_type, fabs(gpsdata->fix.longitude)); snprintf(tmpbuf, sizeof(tmpbuf) - 1, "widget_set gpsd two 1 2 {Lon: %s %c}\n", s, (gpsdata->fix.longitude < 0) ? 'W' : 'E'); send_lcd(tmpbuf); /* As a pilot, a heading of "0" gives me the heebie-jeebies (ie, 0 == "invalid heading data", 360 == "North"). */ track=(int)(gpsdata->fix.track); if (track == 0) track = 360; snprintf(tmpbuf, sizeof(tmpbuf) - 1, "widget_set gpsd three 1 3 {%.1f %s %d deg}\n", gpsdata->fix.speed*speedfactor, speedunits, track); send_lcd(tmpbuf); } else { send_lcd("widget_set gpsd one 1 1 {Lat: n/a}\n"); send_lcd("widget_set gpsd two 1 2 {Lon: n/a}\n"); send_lcd("widget_set gpsd three 1 3 {n/a}\n"); } /* Fill in the altitude and fix status. */ if (gpsdata->fix.mode == MODE_3D) { int n; for(n=0;nfix.climb; avgclimb=0.0; for(n=0;nfix.altitude*altfactor), altunits, gridsquare, (int)(avgclimb * METERS_TO_FEET * 60)); } else { snprintf(tmpbuf, sizeof(tmpbuf) - 1, "widget_set gpsd four 1 4 {n/a}\n"); } send_lcd(tmpbuf); } static void usage( char *prog) { (void)fprintf(stderr, "Usage: %s [-h] [-v] [-V] [-s] [-l {d|m|s}] [-u {i|m|n}] [server[:port:[device]]]\n\n" " -h Show this help, then exit\n" " -V Show version, then exit\n" " -s Sleep for 10 seconds before starting\n" " -j Turn on anti-jitter buffering\n" " -l {d|m|s} Select lat/lon format\n" " d = DD.dddddd (default)\n" " m = DD MM.mmmm'\n" " s = DD MM' SS.sss\"\n" " -u {i|m|n} Select Units\n" " i = Imperial (default)\n" " m = Metric'\n" " n = Nautical\"\n" , prog); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { int option, rc; struct sockaddr_in localAddr, servAddr; struct hostent *h; int n; for(n=0;nh_addrtype; memcpy((char *) &servAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length); servAddr.sin_port = htons(LCDDPORT); /* create socket */ sd = socket(AF_INET, SOCK_STREAM, 0); if (BAD_SOCKET(sd)) { perror("cannot open socket "); exit(EXIT_FAILURE); } /* bind any port number */ localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = htonl(INADDR_ANY); localAddr.sin_port = htons(0); /* coverity[uninit_use_in_call] */ rc = bind(sd, (struct sockaddr *) &localAddr, sizeof(localAddr)); if (rc == -1) { printf("%s: cannot bind port TCP %u\n",argv[0],LCDDPORT); perror("error "); exit(EXIT_FAILURE); } /* connect to server */ /* coverity[uninit_use_in_call] */ rc = connect(sd, (struct sockaddr *) &servAddr, sizeof(servAddr)); if (rc == -1) { perror("cannot connect "); exit(EXIT_FAILURE); } /* Do the initial field label setup. */ reset_lcd(); /* Here's where updates go. */ unsigned int flags = WATCH_ENABLE; if (source.device != NULL) flags |= WATCH_DEVICE; (void)gps_stream(&gpsdata, flags, source.device); for (;;) { /* heart of the client */ if (!gps_waiting(&gpsdata, 50000000)) { fprintf( stderr, "lcdgps: error while waiting\n"); exit(EXIT_FAILURE); } else { (void)gps_read(&gpsdata); update_lcd(&gpsdata); } } } gpsd-3.15/leapsecond.py0000775000175000017500000003241712532614165013253 0ustar esresr#!/usr/bin/env python """ Usage: leapsecond.py [-v] { [-h] | [-f filename] | [-g filename] | [-H filename] | [-I isodate] | [-O unixdate] | [-i rfcdate] | [-o unixdate] | [-n MMMYYYY] } Options: -I take a date in ISO8601 format and convert to Unix gmt time -O take a date in Unix gmt time and convert to ISO8601. -i take a date in RFC822 format and convert to Unix gmt time -o take a date in Unix gmt time and convert to RFC822. -f fetch leap-second offset data and save to local cache file -H make leapsecond include -h print this help -v be verbose -g generate a plot of leap-second dates over time. The command you probably want is something like (depending on if your gnuplot install does or does not support X11. leapsecond.py -g leapseconds.cache | gnuplot --persist leapsecond.py -g leapseconds.cache | gnuplot -e 'set terminal svg' - | display -n compute Unix gmt time for an IERS leap-second event given as a three-letter English Gregorian month abbreviation followed by a 4-digit year. Public urls and local cache file used: http://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat http://hpiers.obspm.fr/iers/bul/bulc/UTC-TAI.history ftp://maia.usno.navy.mil/ser7/tai-utc.dat leapseconds.cache This file is Copyright (c) 2013 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. """ import os, urllib, re, random, time, calendar, math, sys, signal # Set a socket timeout for slow servers import socket socket.setdefaulttimeout(30) del socket verbose = 0 __locations = [ ( # U.S. Navy's offset-history file "ftp://maia.usno.navy.mil/ser7/tai-utc.dat", r" TAI-UTC= +([0-9-]+)[^\n]*\n$", 1, 19, # Magic TAI-GPS offset -> (leapseconds 1980) "ftp://maia.usno.navy.mil/ser7/tai-utc.dat", ), ( # International Earth Rotation Service Bulletin C "http://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat", r" UTC-TAI = ([0-9-]+)", -1, 19, # Magic TAI-GPS offset -> (leapseconds 1980) "http://hpiers.obspm.fr/iers/bul/bulc/UTC-TAI.history", ), ] GPS_EPOCH = 315964800 # 6 Jan 1981 00:00:00 SECS_PER_WEEK = 60 * 60 * 24 * 7 # Seconds per GPS week ROLLOVER = 1024 # 10-bit week rollover def gps_week(t): return (t - GPS_EPOCH) / SECS_PER_WEEK % ROLLOVER def gps_rollovers(t): return (t - GPS_EPOCH) / SECS_PER_WEEK / ROLLOVER def isotime(s): "Convert timestamps in ISO8661 format to and from Unix time including optional fractional seconds." if type(s) == type(1): return time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime(s)) elif type(s) == type(1.0): date = int(s) msec = s - date date = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime(s)) return date + "." + repr(msec)[3:] elif type(s) == type("") or type(s) == type(u""): if s[-1] == "Z": s = s[:-1] if "." in s: (date, msec) = s.split(".") else: date = s msec = "0" # Note: no leap-second correction! return calendar.timegm(time.strptime(date, "%Y-%m-%dT%H:%M:%S")) + float("0." + msec) else: raise TypeError def retrieve(): "Retrieve current leap-second from Web sources." random.shuffle(__locations) # To spread the load for (url, regexp, sign, offset, _) in __locations: try: if os.path.exists(url): ifp = open(url) else: ifp = urllib.urlopen(url) txt = ifp.read() ifp.close() if verbose: print >>sys.stderr, "%s" % txt m = re.search(regexp, txt) if m: return int(m.group(1)) * sign - offset except IOError: if verbose: print >>sys.stderr, "IOError: %s" % url return None def last_insertion_time(): "Give last potential insertion time for a leap second." # We need the Unix times for midnights Jan 1 and Jul 1 this year. when = time.gmtime() (tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst) = when tm_mday = 1 tm_hour = tm_min = tm_sec = 0 tm_mon = 1 jan = (tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst) jan = int(calendar.timegm(jan)) tm_mon = 7 jul = (tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst) jul = int(calendar.timegm(jul)) # We have the UTC times of the potential insertion points this year. now = time.time() if now > jul: return jul else: return jan def save_leapseconds(outfile): "Fetch the leap-second history data and make a leap-second list since Unix epoch GMT (1970-01-01T00:00:00)." random.shuffle(__locations) # To spread the load for (_, _, _, _, url) in __locations: skip = True try: fetchobj = urllib.urlopen(url) except IOError: print >>sys.stderr, "Fetch from %s failed." % url continue # This code assumes that after 1980, leap-second increments are # always integrally one second and every increment is listed here fp = open(outfile, "w") for line in fetchobj: if verbose: print >>sys.stderr, "%s" % line[:-1] if line.startswith(" 1980"): skip = False if skip: continue fields = line.strip().split() if len(fields) < 2: continue md = leapbound(fields[0], fields[1]) if verbose: print >>sys.stderr, "# %s" % md fp.write(repr(iso_to_unix(md)) + "\t# " + str(md) + "\n") fp.close() return print >>sys.stderr, "%s not updated." % outfile def fetch_leapsecs(filename): "Get a list of leap seconds from the local cache of the USNO history" leapsecs = [] for line in open(str(filename)): leapsecs.append(float(line.strip().split()[0])) return leapsecs def make_leapsecond_include(infile): "Get the current leap second count and century from the local cache usable as C preprocessor #define" # Underscore prefixes avoids warning W0612 from pylint, # which doesn't count substitution through locals() as use. leapjumps = fetch_leapsecs(infile) now = int(time.time()) _century = time.strftime("%Y", time.gmtime(now))[:2] + "00" _week = gps_week(now) _rollovers = gps_rollovers(now) _isodate = isotime(now - now % SECS_PER_WEEK) _leapsecs = -1 for leapjump in leapjumps: if leapjump < time.time(): _leapsecs += 1 return """\ /* * Constants used for GPS time detection and rollover correction. * * Correct for week beginning %(_isodate)s */ #define BUILD_CENTURY\t%(_century)s #define BUILD_WEEK\t%(_week)d # Assumes 10-bit week counter #define BUILD_LEAPSECONDS\t%(_leapsecs)d #define BUILD_ROLLOVERS\t%(_rollovers)d # Assumes 10-bit week counter """ % locals() def conditional_leapsecond_fetch(outfile, timeout): "Conditionally fetch leapsecond data, w. timeout in case of evil firewalls." if not os.path.exists(outfile): stale = True else: # If there can't have been a leapsecond insertion since the # last time the cache was updated, we don't need to refresh. # This test cuts way down on the frequency with which we fetch. stale = last_insertion_time() > os.path.getmtime(outfile) if not stale: return True else: def handler(_signum, _frame): raise IOError try: signal.signal(signal.SIGALRM, handler) except ValueError: # Parallel builds trigger this - signal only works in main thread sys.stdout.write("Signal set failed; ") return False signal.alarm(timeout) sys.stdout.write("Attempting leap-second fetch...") try: save_leapseconds(outfile) sys.stdout.write("succeeded.\n") except IOError: sys.stdout.write("failed; ") return False signal.alarm(0) return True def leastsquares(tuples): "Generate coefficients for a least-squares fit to the specified data." sum_x = 0 sum_y = 0 sum_xx = 0 sum_xy = 0 for (x, y) in tuples: sum_x = sum_x + x sum_y = sum_y + y xx = math.pow(x, 2) sum_xx = sum_xx + xx xy = x * y sum_xy = sum_xy + xy n = len(tuples) c = (-sum_x * sum_xy + sum_xx * sum_y) / (n * sum_xx - sum_x * sum_x) b = (-sum_x * sum_y + n * sum_xy) / (n * sum_xx - sum_x * sum_x) # y = b * x + c maxerr = 0 for (x, y) in tuples: err = y - (x * b + c) if err > maxerr: maxerr = err return (b, c, maxerr) def iso_to_unix(tv): "Local Unix time to iso date." return calendar.timegm(time.strptime(tv, "%Y-%m-%dT%H:%M:%S")) def unix_to_iso(tv): "ISO date to UTC Unix time." return time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime(tv)) def graph_history(filename): "Generate a GNUPLOT plot of the leap-second history." raw = fetch_leapsecs(filename) (b, c, e) = leastsquares(zip(range(len(raw)), raw)) e /= (60 * 60 * 24 * 7) dates = map(lambda t: time.strftime("%Y-%m-%d", time.localtime(t)), raw) enddate = time.strftime("%Y-%m-%d", time.localtime(raw[-1]+16416000)) # Adding 190 days to scale fmt = '' fmt += '# Least-squares approximation of Unix time from leapsecond is:\n' fmt += 'lsq(x) = %s * x + %s\n' % (b, c) fmt += '# Maximum residual error is %.2f weeks\n' % e fmt += 'set autoscale\n' fmt += 'set ylabel "GPS-UTC (s)"\n' fmt += 'set yrange [-1:%d]\n' % (len(dates)) fmt += 'set xlabel "Leap second date"\n' fmt += 'set xtics rotate by 300\n' fmt += 'set timefmt "%Y-%m-%d"\n' fmt += 'set xdata time\n' fmt += 'set format x "%Y-%m-%d"\n' fmt += 'set xrange ["%s":"%s"]\n' % ("1979-09-01", enddate) fmt += 'set key left top box\n' fmt += 'plot "-" using 3:1 title "Leap second inserted" with points ;\n' for (i, (r, d)) in enumerate(zip(raw, dates)): fmt += "%d\t%s\t%s\n" % (i, r, d) fmt += 'e\n' print fmt def rfc822_to_unix(tv): "Local Unix time to RFC822 date." return calendar.timegm(time.strptime(tv, "%d %b %Y %H:%M:%S")) def unix_to_rfc822(tv): "RFC822 date to gmt Unix time." return time.strftime("%d %b %Y %H:%M:%S", time.gmtime(tv)) def printnext(val): "Compute Unix time correponsing to a scheduled leap second." if val[:3].lower() not in ("jun", "dec"): print >>sys.stderr, "leapsecond.py: -n argument must begin with "\ "'Jun' or 'Dec'" raise SystemExit, 1 else: month = val[:3].lower() if len(val) != 7: print >>sys.stderr, "leapsecond.py: -n argument must be of "\ "the form {jun|dec}nnnn." raise SystemExit, 1 try: year = int(val[3:]) except ValueError: print >>sys.stderr, "leapsecond.py: -n argument must end "\ "with a 4-digit year." raise SystemExit, 1 # Date looks valid tv = leapbound(year, month) print "%d /* %s */" % (iso_to_unix(tv), tv) def leapbound(year, month): "Return a leap-second date in RFC822 form." # USNO lists JAN and JUL (month following the leap second). # IERS lists DEC. and JUN. (month preceding the leap second). # Note: It is also possible for leap seconds to occur in end-Mar and end-Sep # although none have occurred yet if month.upper()[:3] == "JAN": tv = "%s-12-31T23:59:60" % (int(year) - 1) elif month.upper()[:3] in ("JUN", "JUL"): tv = "%s-06-30T23:59:59" % year elif month.upper()[:3] == "DEC": tv = "%s-12-31T23:59:59" % year return tv # Main part def usage(): print __doc__ raise SystemExit, 0 if __name__ == '__main__': import getopt (options, arguments) = getopt.getopt(sys.argv[1:], "hvf:g:H:i:n:o:I:O:") for (switch, val) in options: if switch == '-h': # help, get usage only usage() elif switch == '-v': # be verbose verbose = 1 elif switch == '-f': # Fetch USNO data to cache locally save_leapseconds(val) raise SystemExit, 0 elif switch == '-g': # Graph the leap_second history graph_history(val) raise SystemExit, 0 elif switch == '-H': # make leapsecond include sys.stdout.write(make_leapsecond_include(val)) raise SystemExit, 0 elif switch == '-i': # Compute Unix time from RFC822 date print rfc822_to_unix(val) raise SystemExit, 0 elif switch == '-n': # Compute possible next leapsecond printnext(val) raise SystemExit, 0 elif switch == '-o': # Compute RFC822 date from Unix time print unix_to_rfc822(float(val)) raise SystemExit, 0 elif switch == '-I': # Compute Unix time from ISO8601 date print isotime(val) raise SystemExit, 0 elif switch == '-O': # Compute ISO8601 date from Unix time print isotime(float(val)) raise SystemExit, 0 # End gpsd-3.15/leapseconds.cache0000664000175000017500000000110412467340617014040 0ustar esresr315532800 # 1979-12-31T23:59:60 362793599 # 1981-06-30T23:59:59 394329599 # 1982-06-30T23:59:59 425865599 # 1983-06-30T23:59:59 489023999 # 1985-06-30T23:59:59 567993600 # 1987-12-31T23:59:60 631152000 # 1989-12-31T23:59:60 662688000 # 1990-12-31T23:59:60 709948799 # 1992-06-30T23:59:59 741484799 # 1993-06-30T23:59:59 773020799 # 1994-06-30T23:59:59 820454400 # 1995-12-31T23:59:60 867715199 # 1997-06-30T23:59:59 915148800 # 1998-12-31T23:59:60 1136073600 # 2005-12-31T23:59:60 1230768000 # 2008-12-31T23:59:60 1341100799 # 2012-06-30T23:59:59 1435708799 # 2015-06-30T23:59:59 gpsd-3.15/libQgpsmm.prl.in0000664000175000017500000000051512461156335013633 0ustar esresrQMAKE_PRO_INPUT = libQgpsmm.pro QMAKE_PRL_TARGET = libQgpsmm.so.@LIBGPSVERSION@ QMAKE_PRL_CONFIG = include_source_dir lex yacc warn_on uic resources qt warn_on release incremental link_prl def_files_disabled exceptions no_mocdepend release stl qt_no_framework create_pc create_prl moc thread dll QMAKE_PRL_VERSION = @LIBGPSVERSION@ gpsd-3.15/libgps.h0000664000175000017500000000314212506324650012201 0ustar esresr/* libgps.h -- prototypes for internals of the libgps library */ /* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef _GPSD_LIBGPS_H_ #define _GPSD_LIBGPS_H_ /* values to poke in the gps_fd member if we get it via something special */ #define SHM_PSEUDO_FD -1 #define DBUS_PSEUDO_FD -2 #include "compiler.h" #ifdef __cplusplus extern "C" { #endif extern int gps_sock_open(const char *, const char *, struct gps_data_t *); extern int gps_sock_close(struct gps_data_t *); extern int gps_sock_send(struct gps_data_t *, const char *); extern int gps_sock_read(struct gps_data_t *); extern bool gps_sock_waiting(const struct gps_data_t *, int); extern int gps_sock_stream(struct gps_data_t *, unsigned int, void *); extern const char *gps_sock_data(const struct gps_data_t *); extern int gps_sock_mainloop(struct gps_data_t *, int, void (*)(struct gps_data_t *)); extern int gps_shm_open(struct gps_data_t *); extern void gps_shm_close(struct gps_data_t *); extern bool gps_shm_waiting(const struct gps_data_t *, int); extern int gps_shm_read(struct gps_data_t *); extern int gps_shm_mainloop(struct gps_data_t *, int, void (*)(struct gps_data_t *)); extern int gps_dbus_open(struct gps_data_t *); extern int gps_dbus_mainloop(struct gps_data_t *, int, void (*)(struct gps_data_t *)); extern int json_ais_read(const char *, char *, size_t, struct ais_t *, const char **); #ifdef __cplusplus } #endif #define PRIVATE(gpsdata) ((struct privdata_t *)(gpsdata)->privdata) #endif /* _GPSD_LIBGPS_H_ */ gpsd-3.15/libgps.pc.in0000664000175000017500000000032012461156335012757 0ustar esresrprefix=@prefix@ exec_prefix=${prefix} libdir=@libdir@ includedir=${prefix}/include Name: GPSD Description: GPS Daemon communication library Version: @VERSION@ Cflags: -I${includedir} Libs: -L${libdir} -lgps gpsd-3.15/libgps.xml0000664000175000017500000003413512520742615012561 0ustar esresr 14 Aug 2004 3 3 The GPSD Project GPSD Documentation libgps C service library for communicating with the GPS daemon C: #include <gps.h> int gps_open char *server char * port struct gps_data_t *gpsdata int gps_send struct gps_data_t *gpsdata char *fmt... int gps_read struct gps_data_t *gpsdata bool gps_waiting const struct gps_data_t *gpsdata int timeout char *gps_data const struct gps_data_t *gpsdata int gps_unpack char *buf struct gps_data_t *gpsdata void gps_close struct gps_data_t *gpsdata int gps_stream struct gps_data_t *gpsdata unsigned intflags void *data const char *gps_errstr int err Python: import gps session = gps.gps(host="localhost", port="2947") session.stream(flags=gps.WATCH_JSON) for report in session: process(report) del session DESCRIPTION libgps is a service library which supports communicating with an instance of the gpsd8; link it with the linker option -lgps. Take care to conditionalize your code on the major and minor API version symbols in gps.h; ideally, force a compilation failure if GPSD_API_MAJOR_VERSION is not a version you recognize. See the GPSD project website for more information on the protocol and API changes. Calling gps_open() initializes a GPS-data structure to hold the data collected by the GPS, and sets up access to gpsd1 via either the socket or shared-memory export. The shared-memory export is faster, but does not carry information about device activation and deactivation events and will not allow you to monitor device packet traffic. gps_open() returns 0 on success, -1 on errors and is re-entrant. errno is set depending on the error returned from the socket or shared-memory interface; see gps.h for values and explanations; also see gps_errstr(). The host address may be a DNS name, an IPv4 dotted quad, an IPV6 address, or the special value GPSD_SHARED_MEMORY referring to the shared-memory export; the library will do the right thing for any of these. gps_close() ends the session. gps_send() writes a command to the daemon. It does nothing when using the shared-memory export. The second argument must be a format string containing elements from the command set documented at gpsd1. It may have % elements as for sprintf3, which will be filled in from any following arguments. This function returns a -1 if there was a Unix-level write error, otherwise 0. Please read the LIMITATIONS section for additional information and cautions. See gps_stream() as a possible alternative. gps_read() accepts a response, or sequence of responses, from the daemon and interprets. This function does either a nonblocking read for data from the daemon or a fetch from shared memory; it returns a count of bytes read for success, -1 with errno set on a Unix-level read error, -1 with errno not set if the socket to the daemon has closed or if the shared-memory segment was unavailable, and 0 if no data is available. gps_waiting() can be used to check whether there is new data from the daemon. The second argument is the maximum amount of time to wait (in microseconds) on input before returning. It returns true if there is input waiting, false on timeout (no data waiting) or error condition. When using the socket export, this function is a convenience wrapper around a select2 call, and zeros errno on entry; you can test errno after exit to get more information about error conditions. Warning: under the shared-memory interface there is a tiny race window between gps_waiting() and a following gps_read(); in that context, beause the latter does not block, it is probably better to write a simple read loop. gps_unpack() parses JSON from the argument buffer into the target of the session structure pointer argument. Included in case your application wishes to manage socket I/O itself. gps_data() returns the contents of the client data buffer (it returns NULL when using the shared-memory export). Use with care; this may fail to be a NUL-terminated string if WATCH_RAW is enabled. gps_stream() asks gpsd to stream the reports it has at you, to be made available when you poll (not available when using the shared-memory export). The second argument is a flag mask that sets various policy bits; see the list below. Calling gps_stream() more than once with different flag masks is allowed. WATCH_DISABLE Disable the reporting modes specified by the other WATCH_ flags. WATCH_ENABLE Disable the reporting modes specified by the other WATCH_ flags. This is the default. WATCH_JSON Enable JSON reporting of data. If WATCH_ENABLE is set, and no other WATCH flags are set, this is the default. WATCH_NMEA Enable generated pseudo-NMEA reporting on binary devices. WATCH_RARE Enable reporting of binary packets in encoded hex. WATCH_RAW Enable literal passthrough of binary packets. WATCH_SCALED When reporting AIS or Subframe data, scale integer quantities to floats if they have a divisor or rendering formula associated with them. WATCH_NEWSTYLE Force issuing a JSON initialization and getting new-style responses. This is the default. WATCH_OLDSTYLE Force issuing a W or R command and getting old-style responses. Warning: this flag (and the capability) will be removed in a future release. WATCH_DEVICE Restrict watching to a specified device, patch given as second argument. gps_errstr() returns an ASCII string (in English) describing the error indicated by a nonzero return value from gps_open(). Consult gps.h to learn more about the data members and associated timestamps. Note that information will accumulate in the session structure over time, and the 'valid' field is not automatically zeroed by each gps_read(). It is up to the client to zero that field when appropriate and to keep an eye on the fix and sentence timestamps. The Python implementation supports the same facilities as the socket-export calls in the C library; there is no shared-memory interface. gps_open() is replaced by the initialization of a gps session object; the other calls are methods of that object, and have the same names as the corresponding C functions. However, it is simpler just to use the session object as an iterator, as in the example given below. Resources within the session object will be properly released when it is garbage-collected. ENVIRONMENT VARIABLES By setting the environment variable GPSD_SHM_KEY, you can control the key value used to create shared-memory segment used for communication with gpsd. This will be useful mainly when isolating test instances of gpsd from production ones. CODE EXAMPLE The following is an excerpted and simplified version of the libgps interface code from cgps1. struct gps_data_t gps_data; ret = gps_open(hostName, hostPort, &gps_data); (void) gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL); /* Put this in a loop with a call to a high resolution sleep () in it. */ if (gps_waiting (&gps_data, 500)) { errno = 0; if (gps_read (&gps_data) == -1) { ... } else { /* Display data from the GPS receiver. */ if (gps_data.set & ... } } /* When you are done... */ (void) gps_stream(&gps_data, WATCH_DISABLE, NULL); (void) gps_close (&gps_data); LIMITATIONS On some systems (those which do not support implicit linking in libraries) you may need to add -lm to your link line when you link libgps. It is always safe to do this. In the C API, incautious use of gps_send() may lead to subtle bugs. In order to not bloat struct gps_data_t with space used by responses that are not expected to be shipped in close sequence with each other, the storage for fields associated with certain responses are combined in a union. The risky set of responses includes VERSION, DEVICELIST, RTCM2, RTCM3, SUBFRAME, AIS, GST, and ERROR; it may not be limited to that set. The logic of the daemon's watcher mode is careful to avoid dangerous sequences, but you should read and understand the layout of struct gps_data_t before using gps_send() to request any of these responses. COMPATIBILITY The gps_query() supported in major versions 1 and 2 of this library has been removed. With the new streaming-oriented wire protocol behind this library, it is extremely unwise to assume that the first transmission from the daemon after a command is shipped to it will be the response to command. If you must send commands to the daemon explicitly, use gps_send() but beware that this ties your code to the GPSD wire protocol. It is not recommended. In earlier versions of the API gps_read() was a blocking call and there was a POLL_NONBLOCK option to make it nonblocking. gps_waiting() was added to reduce the number of wrong ways to code a polling loop. See the comment above the symbol GPSD_API_MAJOR_VERSION in gps.h for recent changes. SEE ALSO gpsd8, gps1, libgpsd3. libgpsmm3. AUTHOR Eric S. Raymond <esr@thyrsus.com>, C sample code Charles Curley <charlescurley@charlescurley.com> gpsd-3.15/libgps_core.c0000664000175000017500000002455012520742615013213 0ustar esresr/* libgps_core.c -- client interface library for the gpsd daemon * * Core portion of client library. Cals helpers to handle different eports. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include "gpsd.h" #include "libgps.h" #include "gps_json.h" #include "strfuncs.h" #ifdef LIBGPS_DEBUG int libgps_debuglevel = 0; static FILE *debugfp; void gps_enable_debug(int level, FILE * fp) /* control the level and destination of debug trace messages */ { libgps_debuglevel = level; debugfp = fp; #if defined(CLIENTDEBUG_ENABLE) && defined(SOCKET_EXPORT_ENABLE) json_enable_debug(level - DEBUG_JSON, fp); #endif } void libgps_trace(int errlevel, const char *fmt, ...) /* assemble command in printf(3) style */ { if (errlevel <= libgps_debuglevel) { char buf[BUFSIZ]; va_list ap; (void)strlcpy(buf, "libgps: ", sizeof(buf)); va_start(ap, fmt); str_vappendf(buf, sizeof(buf), fmt, ap); va_end(ap); (void)fputs(buf, debugfp); } } #endif /* LIBGPS_DEBUG */ #ifdef SOCKET_EXPORT_ENABLE #define CONDITIONALLY_UNUSED #else #define CONDITIONALLY_UNUSED UNUSED #endif /* SOCKET_EXPORT_ENABLE */ int gps_open(const char *host, const char *port CONDITIONALLY_UNUSED, struct gps_data_t *gpsdata) { int status = -1; if (!gpsdata) return -1; #ifdef SHM_EXPORT_ENABLE if (host != NULL && strcmp(host, GPSD_SHARED_MEMORY) == 0) { status = gps_shm_open(gpsdata); if (status == -1) status = SHM_NOSHARED; else if (status == -2) status = SHM_NOATTACH; } #define USES_HOST #endif /* SHM_EXPORT_ENABLE */ #ifdef DBUS_EXPORT_ENABLE if (host != NULL && strcmp(host, GPSD_DBUS_EXPORT) == 0) { status = gps_dbus_open(gpsdata); if (status != 0) status = DBUS_FAILURE; } #define USES_HOST #endif /* DBUS_EXPORT_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE if (status == -1) { status = gps_sock_open(host, port, gpsdata); } #define USES_HOST #endif /* SOCKET_EXPORT_ENABLE */ #ifndef USES_HOST fprintf(stderr, "No methods available for connnecting to %s!\n", host); #endif /* USES_HOST */ #undef USES_HOST gpsdata->set = 0; gpsdata->status = STATUS_NO_FIX; gpsdata->satellites_used = 0; gps_clear_fix(&(gpsdata->fix)); gps_clear_dop(&(gpsdata->dop)); return status; } #if defined(SHM_EXPORT_ENABLE) || defined(SOCKET_EXPORT_ENABLE) #define CONDITIONALLY_UNUSED #else #define CONDITIONALLY_UNUSED UNUSED #endif int gps_close(struct gps_data_t *gpsdata CONDITIONALLY_UNUSED) /* close a gpsd connection */ { int status = -1; libgps_debug_trace((DEBUG_CALLS, "gps_close()\n")); #ifdef SHM_EXPORT_ENABLE if (BAD_SOCKET((intptr_t)(gpsdata->gps_fd))) { gps_shm_close(gpsdata); status = 0; } #endif /* SHM_EXPORT_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE if (status == -1) { status = gps_sock_close(gpsdata); } #endif /* SOCKET_EXPORT_ENABLE */ return status; } int gps_read(struct gps_data_t *gpsdata CONDITIONALLY_UNUSED) /* read from a gpsd connection */ { int status = -1; libgps_debug_trace((DEBUG_CALLS, "gps_read() begins\n")); #ifdef SHM_EXPORT_ENABLE if (BAD_SOCKET((intptr_t)(gpsdata->gps_fd))) { status = gps_shm_read(gpsdata); } #endif /* SHM_EXPORT_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE if (status == -1 && !BAD_SOCKET((intptr_t)(gpsdata->gps_fd))) { status = gps_sock_read(gpsdata); } #endif /* SOCKET_EXPORT_ENABLE */ libgps_debug_trace((DEBUG_CALLS, "gps_read() -> %d (%s)\n", status, gps_maskdump(gpsdata->set))); return status; } int gps_send(struct gps_data_t *gpsdata CONDITIONALLY_UNUSED, const char *fmt CONDITIONALLY_UNUSED, ...) /* send a command to the gpsd instance */ { int status = -1; char buf[BUFSIZ]; va_list ap; va_start(ap, fmt); (void)vsnprintf(buf, sizeof(buf) - 2, fmt, ap); va_end(ap); if (buf[strlen(buf) - 1] != '\n') (void)strlcat(buf, "\n", sizeof(buf)); #ifdef SOCKET_EXPORT_ENABLE status = gps_sock_send(gpsdata, buf); #endif /* SOCKET_EXPORT_ENABLE */ return status; } int gps_stream(struct gps_data_t *gpsdata CONDITIONALLY_UNUSED, unsigned int flags CONDITIONALLY_UNUSED, void *d CONDITIONALLY_UNUSED) { int status = -1; #ifdef SOCKET_EXPORT_ENABLE /* cppcheck-suppress redundantAssignment */ status = gps_sock_stream(gpsdata, flags, d); #endif /* SOCKET_EXPORT_ENABLE */ return status; } const char *gps_data(const struct gps_data_t *gpsdata CONDITIONALLY_UNUSED) /* return the contents of the client data buffer */ { const char *bufp = NULL; #ifdef SOCKET_EXPORT_ENABLE bufp = gps_sock_data(gpsdata); #endif /* SOCKET_EXPORT_ENABLE */ return bufp; } bool gps_waiting(const struct gps_data_t *gpsdata CONDITIONALLY_UNUSED, int timeout CONDITIONALLY_UNUSED) /* is there input waiting from the GPS? */ /* timeout is in uSec */ { /* this is bogus, but I can't think of a better solution yet */ bool waiting = true; #ifdef SHM_EXPORT_ENABLE if ((intptr_t)(gpsdata->gps_fd) == SHM_PSEUDO_FD) waiting = gps_shm_waiting(gpsdata, timeout); #endif /* SHM_EXPORT_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE // cppcheck-suppress pointerPositive if ((intptr_t)(gpsdata->gps_fd) >= 0) waiting = gps_sock_waiting(gpsdata, timeout); #endif /* SOCKET_EXPORT_ENABLE */ return waiting; } int gps_mainloop(struct gps_data_t *gpsdata CONDITIONALLY_UNUSED, int timeout CONDITIONALLY_UNUSED, void (*hook)(struct gps_data_t *gpsdata) CONDITIONALLY_UNUSED) { int status = -1; libgps_debug_trace((DEBUG_CALLS, "gps_mainloop() begins\n")); #ifdef SHM_EXPORT_ENABLE if ((intptr_t)(gpsdata->gps_fd) == SHM_PSEUDO_FD) status = gps_shm_mainloop(gpsdata, timeout, hook); #endif /* SHM_EXPORT_ENABLE */ #ifdef DBUS_EXPORT_ENABLE if ((intptr_t)(gpsdata->gps_fd) == DBUS_PSEUDO_FD) status = gps_dbus_mainloop(gpsdata, timeout, hook); #endif /* DBUS_EXPORT_ENABLE */ #ifdef SOCKET_EXPORT_ENABLE if ((intptr_t)(gpsdata->gps_fd) >= 0) status = gps_sock_mainloop(gpsdata, timeout, hook); #endif /* SOCKET_EXPORT_ENABLE */ libgps_debug_trace((DEBUG_CALLS, "gps_mainloop() -> %d (%s)\n", status, gps_maskdump(gpsdata->set))); return status; } extern const char *gps_errstr(const int err) { /* * We might add our own error codes in the future, e.g for * protocol compatibility checks */ #ifndef USE_QT #ifdef SHM_EXPORT_ENABLE if (err == SHM_NOSHARED) return "no shared-memory segment or daemon not running"; else if (err == SHM_NOATTACH) return "attach failed for unknown reason"; #endif /* SHM_EXPORT_ENABLE */ #ifdef DBUS_EXPORT_ENABLE if (err == DBUS_FAILURE) return "DBUS initialization failure"; #endif /* DBUS_EXPORT_ENABLE */ return netlib_errstr(err); #else static char buf[32]; (void)snprintf(buf, sizeof(buf), "Qt error %d", err); return buf; #endif } #ifdef LIBGPS_DEBUG void libgps_dump_state(struct gps_data_t *collect) { /* no need to dump the entire state, this is a sanity check */ #ifndef USE_QT /* will fail on a 32-bit machine */ (void)fprintf(debugfp, "flags: (0x%04x) %s\n", (unsigned int)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", 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); if (collect->set & SPEED_SET) (void)fprintf(debugfp, "SPEED: %lf\n", collect->fix.speed); if (collect->set & TRACK_SET) (void)fprintf(debugfp, "TRACK: track: %lf\n", collect->fix.track); if (collect->set & CLIMB_SET) (void)fprintf(debugfp, "CLIMB: climb: %lf\n", collect->fix.climb); if (collect->set & STATUS_SET) { const char *status_values[] = { "NO_FIX", "FIX", "DGPS_FIX" }; (void)fprintf(debugfp, "STATUS: status: %d (%s)\n", collect->status, status_values[collect->status]); } if (collect->set & MODE_SET) { const char *mode_values[] = { "", "NO_FIX", "MODE_2D", "MODE_3D" }; (void)fprintf(debugfp, "MODE: mode: %d (%s)\n", 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); if (collect->set & VERSION_SET) (void)fprintf(debugfp, "VERSION: release=%s rev=%s proto=%d.%d\n", collect->version.release, collect->version.rev, 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, split24=%s pps=%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.split24 ? "true" : "false", collect->policy.pps ? "true" : "false", collect->policy.devpath); if (collect->set & SATELLITE_SET) { struct satellite_t *sp; (void)fprintf(debugfp, "SKY: satellites in view: %d\n", collect->satellites_visible); for (sp = collect->skyview; sp < collect->skyview + collect->satellites_visible; sp++) { (void)fprintf(debugfp, " %2.2d: %2.2d %3.3d %3.0f %c\n", sp->PRN, sp->elevation, sp->azimuth, sp->ss, sp->used ? 'Y' : 'N'); } } if (collect->set & DEVICE_SET) (void)fprintf(debugfp, "DEVICE: Device is '%s', driver is '%s'\n", collect->dev.path, collect->dev.driver); if (collect->set & DEVICELIST_SET) { int i; (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, collect->devices.list[i].path, collect->devices.list[i].driver); } } } #endif /* LIBGPS_DEBUG */ // end gpsd-3.15/libgps_dbus.c0000664000175000017500000000722112506330255013211 0ustar esresr#include #include #include #include #include #include #include #include #include #include #include #include "gps.h" #include "gpsd_config.h" #include "libgps.h" #if defined(DBUS_EXPORT_ENABLE) struct privdata_t { void (*handler)(struct gps_data_t *); }; #include /* * Unpleasant that we have to declare a static context pointer here - means * you can't have multiple DBUS sessions open (not that this matters * much in practice). The problem is the DBUS API lacks some hook * arguments that it ought to have. */ static struct gps_data_t *share_gpsdata; static DBusConnection *connection; static DBusHandlerResult handle_gps_fix(DBusMessage * message) { DBusError error; /* this packet format was designed before we split eph */ double eph; const char *gpsd_devname = NULL; dbus_error_init(&error); dbus_message_get_args(message, &error, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.time, DBUS_TYPE_INT32, &share_gpsdata->fix.mode, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.ept, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.latitude, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.longitude, DBUS_TYPE_DOUBLE, &eph, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.altitude, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.epv, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.track, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.epd, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.speed, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.eps, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.climb, DBUS_TYPE_DOUBLE, &share_gpsdata->fix.epc, DBUS_TYPE_STRING, &gpsd_devname, DBUS_TYPE_INVALID); if (share_gpsdata->fix.mode > MODE_NO_FIX ) share_gpsdata->status = STATUS_FIX; else share_gpsdata->status = STATUS_NO_FIX; PRIVATE(share_gpsdata)->handler(share_gpsdata); return DBUS_HANDLER_RESULT_HANDLED; } /* * Message dispatching function * */ static DBusHandlerResult signal_handler(DBusConnection * connection UNUSED, DBusMessage * 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; } int gps_dbus_open(struct gps_data_t *gpsdata) { DBusError error; gpsdata->privdata = (void *)malloc(sizeof(struct privdata_t)); if (gpsdata->privdata == NULL) return -1; 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); return 4; } if (!dbus_connection_add_filter (connection, (DBusHandleMessageFunction) signal_handler, NULL, NULL)) { syslog(LOG_CRIT, "unable to register filter with the connection"); return 5; } #ifndef USE_QT gpsdata->gps_fd = DBUS_PSEUDO_FD; #else gpsdata->gps_fd = (void *)(intptr_t)DBUS_PSEUDO_FD; #endif /* USE_QT */ share_gpsdata = gpsdata; return 0; } int gps_dbus_mainloop(struct gps_data_t *gpsdata, int timeout, void (*hook)(struct gps_data_t *)) /* run a DBUS main loop with a specified handler */ { share_gpsdata = gpsdata; PRIVATE(share_gpsdata)->handler = (void (*)(struct gps_data_t *))hook; for (;;) if (dbus_connection_read_write_dispatch(connection, timeout * 1000) != TRUE) return -1; return 0; } #endif /* defined(DBUS_EXPORT_ENABLE) */ gpsd-3.15/libgps_json.c0000664000175000017500000004643512513107374013241 0ustar esresr/**************************************************************************** NAME libgps_json.c - deserialize gpsd data coming from the server DESCRIPTION This module uses the generic JSON parser to get data from JSON representations to libgps structures. PERMISSIONS Written by Eric S. Raymond, 2009 This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. ***************************************************************************/ #include #include #include #include #include "gpsd.h" #include "strfuncs.h" #ifdef SOCKET_EXPORT_ENABLE #include "gps_json.h" static int json_tpv_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { 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)}, {"time", t_time, .addr.real = &gpsdata->fix.time, .dflt.real = NAN}, {"time", t_real, .addr.real = &gpsdata->fix.time, .dflt.real = NAN}, {"ept", t_real, .addr.real = &gpsdata->fix.ept, .dflt.real = NAN}, {"lon", t_real, .addr.real = &gpsdata->fix.longitude, .dflt.real = NAN}, {"lat", t_real, .addr.real = &gpsdata->fix.latitude, .dflt.real = NAN}, {"alt", t_real, .addr.real = &gpsdata->fix.altitude, .dflt.real = NAN}, {"epx", t_real, .addr.real = &gpsdata->fix.epx, .dflt.real = NAN}, {"epy", t_real, .addr.real = &gpsdata->fix.epy, .dflt.real = NAN}, {"epv", t_real, .addr.real = &gpsdata->fix.epv, .dflt.real = NAN}, {"track", t_real, .addr.real = &gpsdata->fix.track, .dflt.real = NAN}, {"speed", t_real, .addr.real = &gpsdata->fix.speed, .dflt.real = NAN}, {"climb", t_real, .addr.real = &gpsdata->fix.climb, .dflt.real = NAN}, {"epd", t_real, .addr.real = &gpsdata->fix.epd, .dflt.real = NAN}, {"eps", t_real, .addr.real = &gpsdata->fix.eps, .dflt.real = NAN}, {"epc", t_real, .addr.real = &gpsdata->fix.epc, .dflt.real = NAN}, {"mode", t_integer, .addr.integer = &gpsdata->fix.mode, .dflt.integer = MODE_NOT_SEEN}, {NULL}, /* *INDENT-ON* */ }; return json_read_object(buf, json_attrs_1, endptr); } static int json_noise_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { const struct json_attr_t json_attrs_1[] = { /* *INDENT-OFF* */ {"class", t_check, .dflt.check = "GST"}, {"device", t_string, .addr.string = gpsdata->dev.path, .len = sizeof(gpsdata->dev.path)}, {"time", t_time, .addr.real = &gpsdata->gst.utctime, .dflt.real = NAN}, {"time", t_real, .addr.real = &gpsdata->gst.utctime, .dflt.real = NAN}, {"rms", t_real, .addr.real = &gpsdata->gst.rms_deviation, .dflt.real = NAN}, {"major", t_real, .addr.real = &gpsdata->gst.smajor_deviation, .dflt.real = NAN}, {"minor", t_real, .addr.real = &gpsdata->gst.sminor_deviation, .dflt.real = NAN}, {"orient", t_real, .addr.real = &gpsdata->gst.smajor_orientation, .dflt.real = NAN}, {"lat", t_real, .addr.real = &gpsdata->gst.lat_err_deviation, .dflt.real = NAN}, {"lon", t_real, .addr.real = &gpsdata->gst.lon_err_deviation, .dflt.real = NAN}, {"alt", t_real, .addr.real = &gpsdata->gst.alt_err_deviation, .dflt.real = NAN}, {NULL}, /* *INDENT-ON* */ }; return json_read_object(buf, json_attrs_1, endptr); } static int json_sky_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { const struct json_attr_t json_attrs_satellites[] = { /* *INDENT-OFF* */ {"PRN", t_integer, STRUCTOBJECT(struct satellite_t, PRN)}, {"el", t_integer, STRUCTOBJECT(struct satellite_t, elevation)}, {"az", t_integer, STRUCTOBJECT(struct satellite_t, azimuth)}, {"ss", t_real, STRUCTOBJECT(struct satellite_t, ss)}, {"used", t_boolean, STRUCTOBJECT(struct satellite_t, used)}, /* *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)}, {"time", t_time, .addr.real = &gpsdata->skyview_time, .dflt.real = NAN}, {"time", t_real, .addr.real = &gpsdata->skyview_time, .dflt.real = NAN}, {"hdop", t_real, .addr.real = &gpsdata->dop.hdop, .dflt.real = NAN}, {"xdop", t_real, .addr.real = &gpsdata->dop.xdop, .dflt.real = NAN}, {"ydop", t_real, .addr.real = &gpsdata->dop.ydop, .dflt.real = NAN}, {"vdop", t_real, .addr.real = &gpsdata->dop.vdop, .dflt.real = NAN}, {"tdop", t_real, .addr.real = &gpsdata->dop.tdop, .dflt.real = NAN}, {"pdop", t_real, .addr.real = &gpsdata->dop.pdop, .dflt.real = NAN}, {"gdop", t_real, .addr.real = &gpsdata->dop.gdop, .dflt.real = NAN}, {"satellites", t_array, STRUCTARRAY(gpsdata->skyview, json_attrs_satellites, &gpsdata->satellites_visible)}, {NULL}, /* *INDENT-ON* */ }; int status, i, j; for (i = 0; i < MAXCHANNELS; i++) { gpsdata->skyview[i].PRN = 0; gpsdata->skyview[i].used = false; } status = json_read_object(buf, json_attrs_2, endptr); if (status != 0) return status; gpsdata->satellites_used = 0; gpsdata->satellites_visible = 0; for (i = j = 0; i < MAXCHANNELS; i++) { if(gpsdata->skyview[i].PRN > 0) gpsdata->satellites_visible++; if (gpsdata->skyview[i].used) { gpsdata->satellites_used++; } } return 0; } static int json_att_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { 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)}, {"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}, {"dip", t_real, .addr.real = &gpsdata->attitude.dip, .dflt.real = NAN}, {"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* */ }; return json_read_object(buf, json_attrs_1, endptr); } static int json_devicelist_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { 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)}, {"activated", t_time, STRUCTOBJECT(struct devconfig_t, activated)}, {"activated", t_real, STRUCTOBJECT(struct devconfig_t, activated)}, {"flags", t_integer, STRUCTOBJECT(struct devconfig_t, flags)}, {"driver", t_string, STRUCTOBJECT(struct devconfig_t, driver), .len = sizeof(gpsdata->devices.list[0].driver)}, {"subtype", t_string, STRUCTOBJECT(struct devconfig_t, subtype), .len = sizeof(gpsdata->devices.list[0].subtype)}, {"native", t_integer, STRUCTOBJECT(struct devconfig_t, driver_mode), .dflt.integer = -1}, {"bps", t_uinteger, STRUCTOBJECT(struct devconfig_t, baudrate), .dflt.uinteger = DEVDEFAULT_BPS}, {"parity", t_character, STRUCTOBJECT(struct devconfig_t, parity), .dflt.character = DEVDEFAULT_PARITY}, {"stopbits", t_uinteger, STRUCTOBJECT(struct devconfig_t, stopbits), .dflt.integer = DEVDEFAULT_STOPBITS}, {"cycle", t_real, STRUCTOBJECT(struct devconfig_t, cycle), .dflt.real = NAN}, {"mincycle", t_real, STRUCTOBJECT(struct devconfig_t, mincycle), .dflt.real = NAN}, {NULL}, /* *INDENT-ON* */ }; 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)}, {NULL}, }; int status; memset(&gpsdata->devices, '\0', sizeof(gpsdata->devices)); status = json_read_object(buf, json_attrs_devices, endptr); if (status != 0) { return status; } gpsdata->devices.time = timestamp(); return 0; } static int json_version_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { 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)}, {"rev", t_string, .addr.string = gpsdata->version.rev, .len = sizeof(gpsdata->version.rev)}, {"proto_major", t_integer, .addr.integer = &gpsdata->version.proto_major}, {"proto_minor", t_integer, .addr.integer = &gpsdata->version.proto_minor}, {"remote", t_string, .addr.string = gpsdata->version.remote, .len = sizeof(gpsdata->version.remote)}, {NULL}, /* *INDENT-ON* */ }; int status; memset(&gpsdata->version, '\0', sizeof(gpsdata->version)); status = json_read_object(buf, json_attrs_version, endptr); return status; } static int json_error_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { 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* */ }; int status; memset(&gpsdata->error, '\0', sizeof(gpsdata->error)); status = json_read_object(buf, json_attrs_error, endptr); if (status != 0) return status; return status; } int json_toff_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { int real_sec = 0, real_nsec = 0, clock_sec = 0, clock_nsec = 0; const struct json_attr_t json_attrs_toff[] = { /* *INDENT-OFF* */ {"class", t_check, .dflt.check = "TOFF"}, {"device", t_string, .addr.string = gpsdata->dev.path, .len = sizeof(gpsdata->dev.path)}, {"real_sec", t_integer, .addr.integer = &real_sec, .dflt.integer = 0}, {"real_nsec", t_integer, .addr.integer = &real_nsec, .dflt.integer = 0}, {"clock_sec", t_integer, .addr.integer = &clock_sec, .dflt.integer = 0}, {"clock_nsec",t_integer, .addr.integer = &clock_nsec, .dflt.integer = 0}, {NULL}, /* *INDENT-ON* */ }; int status; memset(&gpsdata->toff, '\0', sizeof(gpsdata->toff)); status = json_read_object(buf, json_attrs_toff, endptr); gpsdata->toff.real.tv_sec = (time_t)real_sec; gpsdata->toff.real.tv_nsec = (long)real_nsec; gpsdata->toff.clock.tv_sec = (time_t)clock_sec; gpsdata->toff.clock.tv_nsec = (long)clock_nsec; if (status != 0) return status; return status; } int json_pps_read(const char *buf, struct gps_data_t *gpsdata, const char **endptr) { int real_sec = 0, real_nsec = 0, clock_sec = 0, clock_nsec = 0, precision=0; const struct json_attr_t json_attrs_pps[] = { /* *INDENT-OFF* */ {"class", t_check, .dflt.check = "PPS"}, {"device", t_string, .addr.string = gpsdata->dev.path, .len = sizeof(gpsdata->dev.path)}, {"real_sec", t_integer, .addr.integer = &real_sec, .dflt.integer = 0}, {"real_nsec", t_integer, .addr.integer = &real_nsec, .dflt.integer = 0}, {"clock_sec", t_integer, .addr.integer = &clock_sec, .dflt.integer = 0}, {"clock_nsec",t_integer, .addr.integer = &clock_nsec, .dflt.integer = 0}, {"precision", t_integer, .addr.integer = &precision, .dflt.integer = 0}, {NULL}, /* *INDENT-ON* */ }; int status; memset(&gpsdata->pps, '\0', sizeof(gpsdata->pps)); status = json_read_object(buf, json_attrs_pps, endptr); /* This is good until GPS are more than nanosec accurate */ gpsdata->pps.real.tv_sec = (time_t)real_sec; gpsdata->pps.real.tv_nsec = (long)real_nsec; gpsdata->pps.clock.tv_sec = (time_t)clock_sec; gpsdata->pps.clock.tv_nsec = (long)clock_nsec; /* FIXME! find a place to stash precision */ if (status != 0) return status; /* FIXME: precision is currently parsed but discarded */ return status; } 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; char *classtag = strstr(buf, "\"class\":"); if (classtag == NULL) return -1; if (str_starts_with(classtag, "\"class\":\"TPV\"")) { status = json_tpv_read(buf, gpsdata, end); gpsdata->status = STATUS_FIX; gpsdata->set = STATUS_SET; if (isnan(gpsdata->fix.time) == 0) gpsdata->set |= TIME_SET; if (isnan(gpsdata->fix.ept) == 0) gpsdata->set |= TIMERR_SET; if (isnan(gpsdata->fix.longitude) == 0) 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) gpsdata->set |= HERR_SET; if (isnan(gpsdata->fix.epv) == 0) gpsdata->set |= VERR_SET; if (isnan(gpsdata->fix.track) == 0) gpsdata->set |= TRACK_SET; if (isnan(gpsdata->fix.speed) == 0) gpsdata->set |= SPEED_SET; if (isnan(gpsdata->fix.climb) == 0) gpsdata->set |= CLIMB_SET; if (isnan(gpsdata->fix.epd) == 0) gpsdata->set |= TRACKERR_SET; if (isnan(gpsdata->fix.eps) == 0) gpsdata->set |= SPEEDERR_SET; if (isnan(gpsdata->fix.epc) == 0) gpsdata->set |= CLIMBERR_SET; if (isnan(gpsdata->fix.epc) == 0) gpsdata->set |= CLIMBERR_SET; if (gpsdata->fix.mode != MODE_NOT_SEEN) gpsdata->set |= MODE_SET; return status; } else if (str_starts_with(classtag, "\"class\":\"GST\"")) { status = json_noise_read(buf, gpsdata, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= GST_SET; } return status; } else if (str_starts_with(classtag, "\"class\":\"SKY\"")) { status = json_sky_read(buf, gpsdata, end); if (status == 0) gpsdata->set |= SATELLITE_SET; return status; } else if (str_starts_with(classtag, "\"class\":\"ATT\"")) { status = json_att_read(buf, gpsdata, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= ATTITUDE_SET; } return status; } else if (str_starts_with(classtag, "\"class\":\"DEVICES\"")) { status = json_devicelist_read(buf, gpsdata, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= DEVICELIST_SET; } return status; } else if (str_starts_with(classtag, "\"class\":\"DEVICE\"")) { status = json_device_read(buf, &gpsdata->dev, end); if (status == 0) gpsdata->set |= DEVICE_SET; return status; } else if (str_starts_with(classtag, "\"class\":\"WATCH\"")) { status = json_watch_read(buf, &gpsdata->policy, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= POLICY_SET; } return status; } else if (str_starts_with(classtag, "\"class\":\"VERSION\"")) { status = json_version_read(buf, gpsdata, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= VERSION_SET; } return status; #ifdef RTCM104V2_ENABLE } else if (str_starts_with(classtag, "\"class\":\"RTCM2\"")) { status = json_rtcm2_read(buf, gpsdata->dev.path, sizeof(gpsdata->dev.path), &gpsdata->rtcm2, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= RTCM2_SET; } return status; #endif /* RTCM104V2_ENABLE */ #ifdef RTCM104V3_ENABLE } else if (str_starts_with(classtag, "\"class\":\"RTCM3\"")) { status = json_rtcm3_read(buf, gpsdata->dev.path, sizeof(gpsdata->dev.path), &gpsdata->rtcm3, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= RTCM3_SET; } return status; #endif /* RTCM104V3_ENABLE */ #ifdef AIVDM_ENABLE } else if (str_starts_with(classtag, "\"class\":\"AIS\"")) { status = json_ais_read(buf, gpsdata->dev.path, sizeof(gpsdata->dev.path), &gpsdata->ais, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= AIS_SET; } return status; #endif /* AIVDM_ENABLE */ } else if (str_starts_with(classtag, "\"class\":\"ERROR\"")) { status = json_error_read(buf, gpsdata, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= ERROR_SET; } return status; } else if (str_starts_with(classtag, "\"class\":\"TOFF\"")) { status = json_pps_read(buf, gpsdata, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= TOFF_SET; } return status; } else if (str_starts_with(classtag, "\"class\":\"PPS\"")) { status = json_pps_read(buf, gpsdata, end); if (status == 0) { gpsdata->set &= ~UNION_SET; gpsdata->set |= PPS_SET; } return status; } else return -1; } #endif /* SOCKET_EXPORT_ENABLE */ /* libgps_json.c ends here */ gpsd-3.15/libgps_shm.c0000664000175000017500000001120412533021657013042 0ustar esresr/**************************************************************************** NAME libgps_shm.c - reader access to shared-memory export DESCRIPTION This is a very lightweight alternative to JSON-over-sockets. Clients won't be able to filter by device, and won't get device activation/deactivation notifications. But both client and daemon will avoid all the marshalling and unmarshalling overhead. PERMISSIONS This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. ***************************************************************************/ #include /* for time_t */ #include "gpsd_config.h" #ifdef SHM_EXPORT_ENABLE #include #include #include #include #include #include #include #include "gpsd.h" #include "libgps.h" struct privdata_t { void *shmseg; int tick; }; int gps_shm_open(struct gps_data_t *gpsdata) /* open a shared-memory connection to the daemon */ { int shmid; long shmkey = getenv("GPSD_SHM_KEY") ? strtol(getenv("GPSD_SHM_KEY"), NULL, 0) : GPSD_SHM_KEY; libgps_debug_trace((DEBUG_CALLS, "gps_shm_open()\n")); gpsdata->privdata = NULL; shmid = shmget((key_t)shmkey, sizeof(struct gps_data_t), 0); if (shmid == -1) { /* daemon isn't running or failed to create shared segment */ return -1; } gpsdata->privdata = (void *)malloc(sizeof(struct privdata_t)); if (gpsdata->privdata == NULL) return -1; PRIVATE(gpsdata)->shmseg = shmat(shmid, 0, 0); if (PRIVATE(gpsdata)->shmseg == (void *) -1) { /* attach failed for sume unknown reason */ free(gpsdata->privdata); return -2; } #ifndef USE_QT gpsdata->gps_fd = SHM_PSEUDO_FD; #else gpsdata->gps_fd = (void *)(intptr_t)SHM_PSEUDO_FD; #endif /* USE_QT */ return 0; } bool gps_shm_waiting(const struct gps_data_t *gpsdata, int timeout) /* check to see if new data has been written */ /* timeout is in uSec */ { volatile struct shmexport_t *shared = (struct shmexport_t *)PRIVATE(gpsdata)->shmseg; volatile bool newdata = false; timestamp_t endtime = timestamp() + (((double)timeout)/1000000); /* busy-waiting sucks, but there's not really an alternative */ for (;;) { volatile int bookend1, bookend2; memory_barrier(); bookend1 = shared->bookend1; memory_barrier(); bookend2 = shared->bookend2; memory_barrier(); if (bookend1 == bookend2 && bookend1 > PRIVATE(gpsdata)->tick) newdata = true; if (newdata || (timestamp() >= endtime)) break; } return newdata; } int gps_shm_read(struct gps_data_t *gpsdata) /* read an update from the shared-memory segment */ { if (gpsdata->privdata == NULL) return -1; else { int before, after; void *private_save = gpsdata->privdata; volatile struct shmexport_t *shared = (struct shmexport_t *)PRIVATE(gpsdata)->shmseg; struct gps_data_t noclobber; /* * Following block of instructions must not be reordered, * otherwise havoc will ensue. The memory_barrier() call * should prevent reordering of the data accesses. * * This is a simple optimistic-concurrency technique. We wrote * the second bookend first, then the data, then the first bookend. * Reader copies what it sees in normal order; that way, if we * start to write the segment during the read, the second bookend will * get clobbered first and the data can be detected as bad. */ before = shared->bookend1; memory_barrier(); (void)memcpy((void *)&noclobber, (void *)&shared->gpsdata, sizeof(struct gps_data_t)); memory_barrier(); after = shared->bookend2; if (before != after) return 0; else { (void)memcpy((void *)gpsdata, (void *)&noclobber, sizeof(struct gps_data_t)); gpsdata->privdata = private_save; PRIVATE(gpsdata)->tick = after; if ((gpsdata->set & REPORT_IS)!=0) { if (gpsdata->fix.mode >= 2) gpsdata->status = STATUS_FIX; else gpsdata->status = STATUS_NO_FIX; gpsdata->set = STATUS_SET; } return (int)sizeof(struct gps_data_t); } } } void gps_shm_close(struct gps_data_t *gpsdata) { if (PRIVATE(gpsdata)->shmseg != NULL) (void)shmdt((const void *)PRIVATE(gpsdata)->shmseg); } int gps_shm_mainloop(struct gps_data_t *gpsdata, int timeout UNUSED, void (*hook)(struct gps_data_t *gpsdata)) /* run a shm main loop with a specified handler */ { for (;;) { if (!gps_shm_waiting(gpsdata, timeout)) { return -1; } else { int status = gps_shm_read(gpsdata); if (status == -1) return -1; if (status > 0) (*hook)(gpsdata); } } //return 0; } #endif /* SHM_EXPORT_ENABLE */ /* end */ gpsd-3.15/libgps_sock.c0000664000175000017500000002341512506330426013216 0ustar esresr/* libgps_sock.c -- client interface library for the gpsd daemon * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include /* expected to have a select(2) prototype a la SuS */ #include #include #include #include #include #ifndef USE_QT #include #else #include #endif /* USE_QT */ #include "gps.h" #include "gpsd.h" #include "libgps.h" #include "strfuncs.h" #ifdef SOCKET_EXPORT_ENABLE #include "gps_json.h" struct privdata_t { bool newstyle; /* data buffered from the last read */ ssize_t waiting; char buffer[GPS_JSON_RESPONSE_MAX * 2]; #ifdef LIBGPS_DEBUG int waitcount; #endif /* LIBGPS_DEBUG */ }; int gps_sock_open(const char *host, const char *port, struct gps_data_t *gpsdata) { if (!host) host = "localhost"; if (!port) port = DEFAULT_GPSD_PORT; libgps_debug_trace((DEBUG_CALLS, "gps_sock_open(%s, %s)\n", host, port)); #ifndef USE_QT if ((gpsdata->gps_fd = netlib_connectsock(AF_UNSPEC, host, port, "tcp")) < 0) { errno = gpsdata->gps_fd; libgps_debug_trace((DEBUG_CALLS, "netlib_connectsock() returns error %d\n", errno)); return -1; } else libgps_debug_trace((DEBUG_CALLS, "netlib_connectsock() returns socket on fd %d\n", gpsdata->gps_fd)); #else QTcpSocket *sock = new QTcpSocket(); gpsdata->gps_fd = sock; sock->connectToHost(host, QString(port).toInt()); if (!sock->waitForConnected()) qDebug() << "libgps::connect error: " << sock->errorString(); else qDebug() << "libgps::connected!"; #endif /* USE_QT */ /* set up for line-buffered I/O over the daemon socket */ gpsdata->privdata = (void *)malloc(sizeof(struct privdata_t)); if (gpsdata->privdata == NULL) return -1; PRIVATE(gpsdata)->newstyle = false; PRIVATE(gpsdata)->waiting = 0; #ifdef LIBGPS_DEBUG PRIVATE(gpsdata)->waitcount = 0; #endif /* LIBGPS_DEBUG */ return 0; } bool gps_sock_waiting(const struct gps_data_t *gpsdata, int timeout) /* is there input waiting from the GPS? */ /* timeout is in uSec */ { #ifndef USE_QT fd_set rfds; struct timeval tv; libgps_debug_trace((DEBUG_CALLS, "gps_waiting(%d): %d\n", timeout, PRIVATE(gpsdata)->waitcount++)); if (PRIVATE(gpsdata)->waiting > 0) return true; /* we might want to check for EINTR if this returns false */ errno = 0; FD_ZERO(&rfds); FD_SET(gpsdata->gps_fd, &rfds); tv.tv_sec = timeout / 1000000; tv.tv_usec = timeout % 1000000; /* all error conditions return "not waiting" -- crude but effective */ return (select(gpsdata->gps_fd + 1, &rfds, NULL, NULL, &tv) == 1); #else return ((QTcpSocket *) (gpsdata->gps_fd))->waitForReadyRead(timeout / 1000); #endif } int gps_sock_close(struct gps_data_t *gpsdata) /* close a gpsd connection */ { #ifndef USE_QT int status; free(PRIVATE(gpsdata)); status = close(gpsdata->gps_fd); gpsdata->gps_fd = -1; return status; #else QTcpSocket *sock = (QTcpSocket *) gpsdata->gps_fd; sock->disconnectFromHost(); delete sock; gpsdata->gps_fd = NULL; return 0; #endif } int gps_sock_read(struct gps_data_t *gpsdata) /* wait for and read data being streamed from the daemon */ { char *eol; ssize_t response_length; int status = -1; gpsdata->set &= ~PACKET_SET; for (eol = PRIVATE(gpsdata)->buffer; *eol != '\n' && eol < PRIVATE(gpsdata)->buffer + PRIVATE(gpsdata)->waiting; eol++) continue; if (*eol != '\n') eol = NULL; errno = 0; if (eol == NULL) { #ifndef USE_QT /* read data: return -1 if no data waiting or buffered, 0 otherwise */ status = (int)recv(gpsdata->gps_fd, PRIVATE(gpsdata)->buffer + PRIVATE(gpsdata)->waiting, sizeof(PRIVATE(gpsdata)->buffer) - PRIVATE(gpsdata)->waiting, 0); #else status = ((QTcpSocket *) (gpsdata->gps_fd))->read(PRIVATE(gpsdata)->buffer + PRIVATE(gpsdata)->waiting, sizeof(PRIVATE(gpsdata)->buffer) - PRIVATE(gpsdata)->waiting); #endif /* if we just received data from the socket, it's in the buffer */ if (status > -1) PRIVATE(gpsdata)->waiting += status; /* buffer is empty - implies no data was read */ if (PRIVATE(gpsdata)->waiting == 0) { /* * If we received 0 bytes, other side of socket is closing. * Return -1 as end-of-data indication. */ // cppcheck-suppress duplicateBranch if (status == 0) return -1; #ifndef USE_QT /* count transient errors as success, we'll retry later */ 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 = PRIVATE(gpsdata)->buffer; *eol != '\n' && eol < PRIVATE(gpsdata)->buffer + PRIVATE(gpsdata)->waiting; eol++) continue; if (*eol != '\n') eol = NULL; if (eol == NULL) return 0; } assert(eol != NULL); *eol = '\0'; response_length = eol - PRIVATE(gpsdata)->buffer + 1; gpsdata->online = timestamp(); status = gps_unpack(PRIVATE(gpsdata)->buffer, gpsdata); memmove(PRIVATE(gpsdata)->buffer, PRIVATE(gpsdata)->buffer + response_length, PRIVATE(gpsdata)->waiting - response_length); PRIVATE(gpsdata)->waiting -= response_length; gpsdata->set |= PACKET_SET; return (status == 0) ? (int)response_length : status; } int gps_unpack(char *buf, struct gps_data_t *gpsdata) /* unpack a gpsd response into a status structure, buf must be writeable. * gps_unpack() currently returns 0 in all cases, but should it ever need to * return an error status, it must be < 0. */ { libgps_debug_trace((DEBUG_CALLS, "gps_unpack(%s)\n", buf)); /* detect and process a JSON response */ if (buf[0] == '{') { const char *jp = buf, **next = &jp; while (next != NULL && *next != NULL && next[0][0] != '\0') { libgps_debug_trace((DEBUG_CALLS,"gps_unpack() segment parse '%s'\n", *next)); if (libgps_json_unpack(*next, gpsdata, next) == -1) break; #ifdef LIBGPS_DEBUG if (libgps_debuglevel >= 1) libgps_dump_state(gpsdata); #endif /* LIBGPS_DEBUG */ } } #ifndef USE_QT libgps_debug_trace((DEBUG_CALLS, "final flags: (0x%04x) %s\n", gpsdata->set,gps_maskdump(gpsdata->set))); #endif return 0; } const char *gps_sock_data(const struct gps_data_t *gpsdata) /* return the contents of the client data buffer */ { return PRIVATE(gpsdata)->buffer; } int gps_sock_send(struct gps_data_t *gpsdata, const char *buf) /* send a command to the gpsd instance */ { #ifndef USE_QT if (write(gpsdata->gps_fd, buf, strlen(buf)) == (ssize_t) strlen(buf)) return 0; else return -1; #else QTcpSocket *sock = (QTcpSocket *) gpsdata->gps_fd; sock->write(buf, strlen(buf)); if (sock->waitForBytesWritten()) return 0; else { qDebug() << "libgps::send error: " << sock->errorString(); return -1; } #endif } int gps_sock_stream(struct gps_data_t *gpsdata, unsigned int flags, void *d) /* ask gpsd to stream reports at you, hiding the command details */ { char buf[GPS_JSON_COMMAND_MAX]; if ((flags & (WATCH_JSON | WATCH_NMEA | WATCH_RAW)) == 0) { flags |= WATCH_JSON; } if ((flags & WATCH_DISABLE) != 0) { (void)strlcpy(buf, "?WATCH={\"enable\":false,", sizeof(buf)); if (flags & WATCH_JSON) (void)strlcat(buf, "\"json\":false,", sizeof(buf)); if (flags & WATCH_NMEA) (void)strlcat(buf, "\"nmea\":false,", sizeof(buf)); if (flags & WATCH_RAW) (void)strlcat(buf, "\"raw\":1,", sizeof(buf)); if (flags & WATCH_RARE) (void)strlcat(buf, "\"raw\":0,", sizeof(buf)); if (flags & WATCH_SCALED) (void)strlcat(buf, "\"scaled\":false,", sizeof(buf)); if (flags & WATCH_TIMING) (void)strlcat(buf, "\"timing\":false,", sizeof(buf)); if (flags & WATCH_SPLIT24) (void)strlcat(buf, "\"split24\":false,", sizeof(buf)); if (flags & WATCH_PPS) (void)strlcat(buf, "\"pps\":false,", sizeof(buf)); str_rstrip_char(buf, ','); (void)strlcat(buf, "};", sizeof(buf)); libgps_debug_trace((DEBUG_CALLS, "gps_stream() disable command: %s\n", buf)); return gps_send(gpsdata, buf); } else { /* if ((flags & WATCH_ENABLE) != 0) */ (void)strlcpy(buf, "?WATCH={\"enable\":true,", sizeof(buf)); if (flags & WATCH_JSON) (void)strlcat(buf, "\"json\":true,", sizeof(buf)); if (flags & WATCH_NMEA) (void)strlcat(buf, "\"nmea\":true,", sizeof(buf)); if (flags & WATCH_RARE) (void)strlcat(buf, "\"raw\":1,", sizeof(buf)); if (flags & WATCH_RAW) (void)strlcat(buf, "\"raw\":2,", sizeof(buf)); if (flags & WATCH_SCALED) (void)strlcat(buf, "\"scaled\":true,", sizeof(buf)); if (flags & WATCH_TIMING) (void)strlcat(buf, "\"timing\":true,", sizeof(buf)); if (flags & WATCH_SPLIT24) (void)strlcat(buf, "\"split24\":true,", sizeof(buf)); if (flags & WATCH_PPS) (void)strlcat(buf, "\"pps\":true,", sizeof(buf)); if (flags & WATCH_DEVICE) str_appendf(buf, sizeof(buf), "\"device\":\"%s\",", (char *)d); str_rstrip_char(buf, ','); (void)strlcat(buf, "};", sizeof(buf)); libgps_debug_trace((DEBUG_CALLS, "gps_stream() enable command: %s\n", buf)); return gps_send(gpsdata, buf); } } int gps_sock_mainloop(struct gps_data_t *gpsdata, int timeout, void (*hook)(struct gps_data_t *gpsdata)) /* run a socket main loop with a specified handler */ { for (;;) { if (!gps_waiting(gpsdata, timeout)) { return -1; } else { int status = gps_read(gpsdata); if (status == -1) return -1; if (status > 0) (*hook)(gpsdata); } } //return 0; } #endif /* SOCKET_EXPORT_ENABLE */ /* end */ gpsd-3.15/libgpsd.pc.in0000664000175000017500000000033712460513551013127 0ustar esresrprefix=@prefix@ exec_prefix=${prefix} libdir=${exec_prefix}@libdir@ includedir=${prefix}/include Name: libgpsd Description: Lowlevel GPSD control library Version: @VERSION@ Cflags: -I${includedir} Libs: -L${libdir} -lgpsd gpsd-3.15/libgpsd_core.c0000600000175000017500000015274312532625515013355 0ustar esresr/* libgpsd_core.c -- manage access to sensors * * Access to the driver layer goes through the entry points in this file. * The idea is to present a session as an abstraction from which you get * fixes (and possibly other data updates) by calling gpsd_multipoll(). The * rest is setup and teardown. (For backward compatibility the older gpsd_poll() * entry point has been retained.) * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gpsd.h" #include "matrix.h" #include "strfuncs.h" #if defined(NMEA2000_ENABLE) #include "driver_nmea2000.h" #endif /* defined(NMEA2000_ENABLE) */ ssize_t gpsd_write(struct gps_device_t *session, const char *buf, const size_t len) /* pass low-level data to devices straight through */ { return session->context->serial_write(session, buf, len); } static void basic_report(const char *buf) { (void)fputs(buf, stderr); } void errout_reset(struct gpsd_errout_t *errout) { errout->debug = LOG_SHOUT; errout->report = basic_report; } #if defined(PPS_ENABLE) static pthread_mutex_t report_mutex; void gpsd_acquire_reporting_lock(void) { int err; err = pthread_mutex_lock(&report_mutex); if ( 0 != err ) { /* POSIX says pthread_mutex_lock() should only fail if the thread holding the lock has died. Best for gppsd to just die because things are FUBAR. */ (void) fprintf(stderr,"pthread_mutex_lock() failed: %s\n", strerror(errno)); exit(EXIT_FAILURE); } } void gpsd_release_reporting_lock(void) { int err; err = pthread_mutex_unlock(&report_mutex); if ( 0 != err ) { /* POSIX says pthread_mutex_unlock() should only fail when trying to unlock a lock that does not exist, or is not owned by this thread. This should never happen, so best for gpsd to die because things are FUBAR. */ (void) fprintf(stderr,"pthread_mutex_unlock() failed: %s\n", strerror(errno)); exit(EXIT_FAILURE); } } #endif /* PPS_ENABLE */ #ifndef SQUELCH_ENABLE static void visibilize(char *outbuf, size_t outlen, const char *inbuf, size_t inlen) { const char *sp; outbuf[0] = '\0'; for (sp = inbuf; sp < inbuf + inlen && strlen(outbuf)+6 < outlen; sp++) if (isprint((unsigned char) *sp) || (sp[0] == '\n' && sp[1] == '\0') || (sp[0] == '\r' && sp[2] == '\0')) (void)snprintf(outbuf + strlen(outbuf), 2, "%c", *sp); else (void)snprintf(outbuf + strlen(outbuf), 6, "\\x%02x", 0x00ff & (unsigned)*sp); } #endif /* !SQUELCH_ENABLE */ void gpsd_vlog(const struct gpsd_errout_t *errout, const int errlevel, char *outbuf, size_t outlen, const char *fmt, va_list ap) /* assemble msg in vprintf(3) style, use errout hook or syslog for delivery */ { #ifdef SQUELCH_ENABLE (void)errout; (void)errlevel; (void)fmt; #else if (errout->debug >= errlevel) { char buf[BUFSIZ]; char *err_str; #if defined(PPS_ENABLE) gpsd_acquire_reporting_lock(); #endif /* PPS_ENABLE */ switch ( errlevel ) { case LOG_ERROR: err_str = "ERROR: "; break; case LOG_SHOUT: err_str = "SHOUT: "; break; case LOG_WARN: err_str = "WARN: "; break; case LOG_CLIENT: err_str = "CLIENT: "; break; case LOG_INF: err_str = "INFO: "; break; case LOG_DATA: err_str = "DATA: "; break; case LOG_PROG: err_str = "PROG: "; break; case LOG_IO: err_str = "IO: "; break; case LOG_SPIN: err_str = "SPIN: "; break; case LOG_RAW: err_str = "RAW: "; break; default: err_str = "UNK: "; } assert(errout->label != NULL); (void)strlcpy(buf, errout->label, sizeof(buf)); (void)strlcat(buf, ":", sizeof(buf)); (void)strlcat(buf, err_str, sizeof(buf)); str_vappendf(buf, sizeof(buf), fmt, ap); visibilize(outbuf, outlen, buf, strlen(buf)); if (getpid() == getsid(getpid())) syslog((errlevel <= LOG_SHOUT) ? LOG_ERR : LOG_NOTICE, "%s", outbuf); else if (errout->report != NULL) errout->report(outbuf); else (void)fputs(outbuf, stderr); #if defined(PPS_ENABLE) gpsd_release_reporting_lock(); #endif /* PPS_ENABLE */ } #endif /* !SQUELCH_ENABLE */ } void gpsd_log(const struct gpsd_errout_t *errout, const int errlevel, const char *fmt, ...) /* assemble msg in printf(3) style, use errout hook or syslog for delivery */ { char buf[BUFSIZ]; va_list ap; buf[0] = '\0'; va_start(ap, fmt); gpsd_vlog(errout, errlevel, buf, sizeof(buf), fmt, ap); va_end(ap); } const char *gpsd_prettydump(struct gps_device_t *session) /* dump the current packet in a form optimised for eyeballs */ { return gpsd_packetdump(session->msgbuf, sizeof(session->msgbuf), (char *)session->lexer.outbuffer, session->lexer.outbuflen); } static void gpsd_run_device_hook(struct gpsd_errout_t *errout, char *device_name, char *hook) { struct stat statbuf; if (stat(DEVICEHOOKPATH, &statbuf) == -1) gpsd_log(errout, LOG_PROG, "no %s present, skipped running %s hook\n", DEVICEHOOKPATH, hook); else { /* * We make an exception to the no-malloc rule here because * the pointer will never persist outside this small scope * and can thus never cause a leak or stale-pointer problem. */ size_t bufsize = strlen(DEVICEHOOKPATH) + 1 + strlen(device_name) + 1 + strlen(hook) + 1; char *buf = malloc(bufsize); if (buf == NULL) gpsd_log(errout, LOG_ERROR, "error allocating run-hook buffer\n"); else { int status; (void)snprintf(buf, bufsize, "%s %s %s", DEVICEHOOKPATH, device_name, hook); gpsd_log(errout, LOG_INF, "running %s\n", buf); status = system(buf); if (status == -1) gpsd_log(errout, LOG_ERROR, "error running %s\n", buf); else gpsd_log(errout, LOG_INF, "%s returned %d\n", DEVICEHOOKPATH, WEXITSTATUS(status)); free(buf); } } } int gpsd_switch_driver(struct gps_device_t *session, char *type_name) { const struct gps_type_t **dp; bool first_sync = (session->device_type != NULL); unsigned int i; if (first_sync && strcmp(session->device_type->type_name, type_name) == 0) return 0; gpsd_log(&session->context->errout, LOG_PROG, "switch_driver(%s) called...\n", type_name); for (dp = gpsd_drivers, i = 0; *dp; dp++, i++) if (strcmp((*dp)->type_name, type_name) == 0) { gpsd_log(&session->context->errout, LOG_PROG, "selecting %s driver...\n", (*dp)->type_name); gpsd_assert_sync(session); session->device_type = *dp; session->driver_index = i; #ifdef RECONFIGURE_ENABLE session->gpsdata.dev.mincycle = session->device_type->min_cycle; #endif /* RECONFIGURE_ENABLE */ /* reconfiguration might be required */ if (first_sync && session->device_type->event_hook != NULL) session->device_type->event_hook(session, event_driver_switch); #ifdef RECONFIGURE_ENABLE if (STICKY(*dp)) session->last_controller = *dp; #endif /* RECONFIGURE_ENABLE */ return 1; } gpsd_log(&session->context->errout, LOG_ERROR, "invalid GPS type \"%s\".\n", type_name); return 0; } void gps_context_init(struct gps_context_t *context, const char *label) { (void)memset(context, '\0', sizeof(struct gps_context_t)); //context.readonly = false; #ifdef TIMEHINT_ENABLE context->leap_notify = LEAP_NOWARNING; #endif /* TIMEHINT_ENABLE */ context->serial_write = gpsd_serial_write; errout_reset(&context->errout); context->errout.label = (char *)label; #if defined(PPS_ENABLE) (void)pthread_mutex_init(&report_mutex, NULL); #endif /* defined(PPS_ENABLE) */ } void gpsd_init(struct gps_device_t *session, struct gps_context_t *context, const char *device) /* initialize GPS polling */ { if (device != NULL) (void)strlcpy(session->gpsdata.dev.path, device, sizeof(session->gpsdata.dev.path)); session->device_type = NULL; /* start by hunting packets */ session->observed = 0; session->sourcetype = source_unknown; /* gpsd_open() sets this */ session->servicetype = service_unknown; /* gpsd_open() sets this */ session->context = context; memset( session->subtype, 0, sizeof( session->subtype)); gps_clear_fix(&session->gpsdata.fix); gps_clear_fix(&session->newdata); gps_clear_fix(&session->oldfix); session->gpsdata.set = 0; gps_clear_dop(&session->gpsdata.dop); session->gpsdata.epe = NAN; session->mag_var = NAN; session->gpsdata.dev.cycle = session->gpsdata.dev.mincycle = 1; #ifdef TIMING_ENABLE session->sor = 0.0; session->chars = 0; #endif /* TIMING_ENABLE */ /* tty-level initialization */ gpsd_tty_init(session); /* necessary in case we start reading in the middle of a GPGSV sequence */ gpsd_zero_satellites(&session->gpsdata); /* initialize things for the packet parser */ packet_reset(&session->lexer); } void gpsd_deactivate(struct gps_device_t *session) /* temporarily release the GPS device */ { #ifdef RECONFIGURE_ENABLE if (!session->context->readonly && session->device_type != NULL && 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) session->device_type->mode_switcher(session, 0); } #endif /* RECONFIGURE_ENABLE */ gpsd_log(&session->context->errout, LOG_INF, "closing GPS=%s (%d)\n", session->gpsdata.dev.path, session->gpsdata.gps_fd); #if defined(NMEA2000_ENABLE) if (session->sourcetype == source_can) (void)nmea2000_close(session); else #endif /* of defined(NMEA2000_ENABLE) */ (void)gpsd_close(session); if (session->mode == O_OPTIMIZE) gpsd_run_device_hook(&session->context->errout, session->gpsdata.dev.path, "DEACTIVATE"); #ifdef PPS_ENABLE session->pps_thread.report_hook = NULL; /* tell any PPS-watcher thread to die */ #endif /* PPS_ENABLE */ /* mark it inactivated */ session->gpsdata.online = (timestamp_t)0; } #ifdef PPS_ENABLE static void ppsthread_log(volatile struct pps_thread_t *pps_thread, int loglevel, const char *fmt, ...) /* shim function to decouple PPS monitor code from the session structure */ { struct gps_device_t *device = (struct gps_device_t *)pps_thread->context; char buf[BUFSIZ]; va_list ap; switch (loglevel) { case THREAD_ERROR: loglevel = LOG_ERROR; break; case THREAD_WARN: loglevel = LOG_WARN; break; case THREAD_INF: loglevel = LOG_INF; break; case THREAD_PROG: loglevel = LOG_PROG; break; case THREAD_RAW: loglevel = LOG_RAW; break; } buf[0] = '\0'; va_start(ap, fmt); gpsd_vlog(&device->context->errout, loglevel, buf, sizeof(buf), fmt, ap); va_end(ap); } #endif /* PPS_ENABLE */ void gpsd_clear(struct gps_device_t *session) /* device has been opened - clear its storage for use */ { session->gpsdata.online = timestamp(); lexer_init(&session->lexer); session->lexer.errout = session->context->errout; // session->gpsdata.online = 0; gps_clear_fix(&session->gpsdata.fix); session->gpsdata.status = STATUS_NO_FIX; session->gpsdata.separation = NAN; session->mag_var = NAN; session->releasetime = (time_t)0; session->badcount = 0; /* clear the private data union */ memset( (void *)&session->driver, '\0', sizeof(session->driver)); #ifdef PPS_ENABLE /* set up the context structure for the PPS thread monitor */ memset((void *)&session->pps_thread, 0, sizeof(session->pps_thread)); session->pps_thread.devicefd = session->gpsdata.gps_fd; session->pps_thread.devicename = session->gpsdata.dev.path; session->pps_thread.log_hook = ppsthread_log; session->pps_thread.context = (void *)session; #endif /* PPS_ENABLE */ session->opentime = time(NULL); } int gpsd_open(struct gps_device_t *session) /* open a device for access to its data * * return: the opened file descriptor * PLACEHOLDING_FD - for /dev/ppsX * UNALLOCATED_FD - for open failure * -1 - for open failure */ { #ifdef NETFEED_ENABLE /* 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, session->gpsdata.dev.path); session->sourcetype = source_tcp; gpsd_log(&session->context->errout, LOG_SPIN, "netgnss_uri_open(%s) returns socket on fd %d\n", session->gpsdata.dev.path, session->gpsdata.gps_fd); return session->gpsdata.gps_fd; /* otherwise, could be an TCP data feed */ } else if (str_starts_with(session->gpsdata.dev.path, "tcp://")) { char server[strlen(session->gpsdata.dev.path)+1], *port; socket_t dsock; (void)strlcpy(server, session->gpsdata.dev.path + 6, sizeof(server)); INVALIDATE_SOCKET(session->gpsdata.gps_fd); port = strchr(server, ':'); if (port == NULL) { gpsd_log(&session->context->errout, LOG_ERROR, "Missing colon in TCP feed spec.\n"); return -1; } *port++ = '\0'; gpsd_log(&session->context->errout, LOG_INF, "opening TCP feed at %s, port %s.\n", server, port); if ((dsock = netlib_connectsock(AF_UNSPEC, server, port, "tcp")) < 0) { gpsd_log(&session->context->errout, LOG_ERROR, "TCP device open error %s.\n", netlib_errstr(dsock)); return -1; } else gpsd_log(&session->context->errout, LOG_SPIN, "TCP device opened on fd %d\n", dsock); session->gpsdata.gps_fd = dsock; session->sourcetype = source_tcp; return session->gpsdata.gps_fd; /* or could be UDP */ } else if (str_starts_with(session->gpsdata.dev.path, "udp://")) { char server[strlen(session->gpsdata.dev.path)+1], *port; socket_t dsock; (void)strlcpy(server, session->gpsdata.dev.path + 6, sizeof(server)); INVALIDATE_SOCKET(session->gpsdata.gps_fd); port = strchr(server, ':'); if (port == NULL) { gpsd_log(&session->context->errout, LOG_ERROR, "Missing colon in UDP feed spec.\n"); return -1; } *port++ = '\0'; gpsd_log(&session->context->errout, LOG_INF, "opening UDP feed at %s, port %s.\n", server, port); if ((dsock = netlib_connectsock(AF_UNSPEC, server, port, "udp")) < 0) { gpsd_log(&session->context->errout, LOG_ERROR, "UDP device open error %s.\n", netlib_errstr(dsock)); return -1; } else gpsd_log(&session->context->errout, LOG_SPIN, "UDP device opened on fd %d\n", dsock); session->gpsdata.gps_fd = dsock; session->sourcetype = source_udp; return session->gpsdata.gps_fd; } #endif /* NETFEED_ENABLE */ #ifdef PASSTHROUGH_ENABLE if (str_starts_with(session->gpsdata.dev.path, "gpsd://")) { char server[strlen(session->gpsdata.dev.path)+1], *port; socket_t dsock; (void)strlcpy(server, session->gpsdata.dev.path + 7, sizeof(server)); INVALIDATE_SOCKET(session->gpsdata.gps_fd); if ((port = strchr(server, ':')) == NULL) { port = DEFAULT_GPSD_PORT; } else *port++ = '\0'; gpsd_log(&session->context->errout, LOG_INF, "opening remote gpsd feed at %s, port %s.\n", server, port); if ((dsock = netlib_connectsock(AF_UNSPEC, server, port, "tcp")) < 0) { gpsd_log(&session->context->errout, LOG_ERROR, "remote gpsd device open error %s.\n", netlib_errstr(dsock)); return -1; } else gpsd_log(&session->context->errout, LOG_SPIN, "remote gpsd feed opened on fd %d\n", dsock); /* watch to remote is issued when WATCH is */ session->gpsdata.gps_fd = dsock; session->sourcetype = source_gpsd; return session->gpsdata.gps_fd; } #endif /* PASSTHROUGH_ENABLE */ #if defined(NMEA2000_ENABLE) if (str_starts_with(session->gpsdata.dev.path, "nmea2000://")) { return nmea2000_open(session); } #endif /* defined(NMEA2000_ENABLE) */ /* fall through to plain serial open */ /* could be a naked /dev/ppsX */ return gpsd_serial_open(session); } int gpsd_activate(struct gps_device_t *session, const int mode) /* acquire a connection to the GPS device */ { if (session->mode == O_OPTIMIZE) gpsd_run_device_hook(&session->context->errout, session->gpsdata.dev.path, "ACTIVATE"); session->gpsdata.gps_fd = gpsd_open(session); if (mode != O_CONTINUE) session->mode = mode; // cppcheck-suppress pointerLessThanZero if (session->gpsdata.gps_fd < 0) { /* return could be -1, PLACEHOLDING_FD, of UNALLOCATED_FD */ if ( PLACEHOLDING_FD == session->gpsdata.gps_fd ) { /* it is /dev/ppsX, need to set devicename, etc. */ gpsd_clear(session); } return session->gpsdata.gps_fd; } #ifdef NON_NMEA_ENABLE /* if it's a sensor, it must be probed */ if ((session->servicetype == service_sensor) && (session->sourcetype != source_can)) { const struct gps_type_t **dp; for (dp = gpsd_drivers; *dp; dp++) { if ((*dp)->probe_detect != NULL) { gpsd_log(&session->context->errout, LOG_PROG, "Probing \"%s\" driver...\n", (*dp)->type_name); /* toss stale data */ (void)tcflush(session->gpsdata.gps_fd, TCIOFLUSH); if ((*dp)->probe_detect(session) != 0) { gpsd_log(&session->context->errout, LOG_PROG, "Probe found \"%s\" driver...\n", (*dp)->type_name); session->device_type = *dp; gpsd_assert_sync(session); goto foundit; } else gpsd_log(&session->context->errout, LOG_PROG, "Probe not found \"%s\" driver...\n", (*dp)->type_name); } } gpsd_log(&session->context->errout, LOG_PROG, "no probe matched...\n"); } foundit: #endif /* NON_NMEA_ENABLE */ gpsd_clear(session); gpsd_log(&session->context->errout, LOG_INF, "gpsd_activate(%d): activated GPS (fd %d)\n", session->mode, session->gpsdata.gps_fd); /* * We might know the device's type, but we shouldn't assume it has * retained its settings. A revert hook might well have undone * them on the previous close. Fire a reactivate event so drivers * can do something about this if they choose. */ if (session->device_type != NULL && session->device_type->event_hook != NULL) session->device_type->event_hook(session, event_reactivate); return session->gpsdata.gps_fd; } #ifndef NOFLOATS_ENABLE /***************************************************************************** Carl Carter of SiRF supplied this algorithm for computing DOPs from a list of visible satellites (some typos corrected)... For satellite n, let az(n) = azimuth angle from North and el(n) be elevation. Let: a(k, 1) = sin az(k) * cos el(k) a(k, 2) = cos az(k) * cos el(k) a(k, 3) = sin el(k) Then form the line-of-sight matrix A for satellites used in the solution: | a(1,1) a(1,2) a(1,3) 1 | | a(2,1) a(2,2) a(2,3) 1 | | : : : : | | a(n,1) a(n,2) a(n,3) 1 | And its transpose A~: |a(1, 1) a(2, 1) . . . a(n, 1) | |a(1, 2) a(2, 2) . . . a(n, 2) | |a(1, 3) a(2, 3) . . . a(n, 3) | | 1 1 . . . 1 | Compute the covariance matrix (A~*A)^-1, which is guaranteed symmetric: | s(x)^2 s(x)*s(y) s(x)*s(z) s(x)*s(t) | | s(y)*s(x) s(y)^2 s(y)*s(z) s(y)*s(t) | | s(z)*s(x) s(z)*s(y) s(z)^2 s(z)*s(t) | | s(t)*s(x) s(t)*s(y) s(t)*s(z) s(t)^2 | Then: GDOP = sqrt(s(x)^2 + s(y)^2 + s(z)^2 + s(t)^2) TDOP = sqrt(s(t)^2) PDOP = sqrt(s(x)^2 + s(y)^2 + s(z)^2) HDOP = sqrt(s(x)^2 + s(y)^2) VDOP = sqrt(s(z)^2) Here's how we implement it... First, each compute element P(i,j) of the 4x4 product A~*A. If S(k=1,k=n): f(...) is the sum of f(...) as k varies from 1 to n, then applying the definition of matrix product tells us: P(i,j) = S(k=1,k=n): B(i, k) * A(k, j) But because B is the transpose of A, this reduces to P(i,j) = S(k=1,k=n): A(k, i) * A(k, j) This is not, however, the entire algorithm that SiRF uses. Carl writes: > As you note, with rounding accounted for, most values agree exactly, and > those that don't agree our number is higher. That is because we > deweight some satellites and account for that in the DOP calculation. > If a satellite is not used in a solution at the same weight as others, > it should not contribute to DOP calculation at the same weight. So our > internal algorithm does a compensation for that which you would have no > way to duplicate on the outside since we don't output the weighting > factors. In fact those are not even available to API users. Queried about the deweighting, Carl says: > In the SiRF tracking engine, each satellite track is assigned a quality > value based on the tracker's estimate of that signal. It includes C/No > estimate, ability to hold onto the phase, stability of the I vs. Q phase > angle, etc. The navigation algorithm then ranks all the tracks into > quality order and selects which ones to use in the solution and what > weight to give those used in the solution. The process is actually a > bit of a "trial and error" method -- we initially use all available > tracks in the solution, then we sequentially remove the lowest quality > ones until the solution stabilizes. The weighting is inherent in the > Kalman filter algorithm. Once the solution is stable, the DOP is > computed from those SVs used, and there is an algorithm that looks at > the quality ratings and determines if we need to deweight any. > Likewise, if we use altitude hold mode for a 3-SV solution, we deweight > the phantom satellite at the center of the Earth. So we cannot exactly duplicate what SiRF does internally. We'll leave HDOP alone and use our computed values for VDOP and PDOP. Note, this may have to change in the future if this code is used by a non-SiRF driver. ******************************************************************************/ static gps_mask_t fill_dop(const struct gpsd_errout_t *errout, const struct gps_data_t * gpsdata, struct dop_t * dop) { double prod[4][4]; double inv[4][4]; double satpos[MAXCHANNELS][4]; double xdop, ydop, hdop, vdop, pdop, tdop, gdop; int i, j, k, n; memset(satpos, 0, sizeof(satpos)); gpsd_log(errout, LOG_INF, "Sats used (%d):\n", gpsdata->satellites_used); for (n = k = 0; k < gpsdata->satellites_visible; k++) { if (gpsdata->skyview[k].used && !SBAS_PRN(gpsdata->skyview[k].PRN)) { const struct satellite_t *sp = &gpsdata->skyview[k]; satpos[n][0] = sin(sp->azimuth * DEG_2_RAD) * cos(sp->elevation * DEG_2_RAD); satpos[n][1] = cos(sp->azimuth * DEG_2_RAD) * cos(sp->elevation * DEG_2_RAD); satpos[n][2] = sin(sp->elevation * DEG_2_RAD); satpos[n][3] = 1; gpsd_log(errout, LOG_INF, "PRN=%3d az=%3d el=%2d (%f, %f, %f)\n", gpsdata->skyview[k].PRN, gpsdata->skyview[k].azimuth, gpsdata->skyview[k].elevation, satpos[n][0], satpos[n][1], satpos[n][2]); n++; } } /* If we don't have 4 satellites then we don't have enough information to calculate DOPS */ if (n < 4) { #ifdef __UNUSED__ gpsd_log(errout, LOG_DATA + 2, "Not enough satellites available %d < 4:\n", n); #endif /* __UNUSED__ */ return 0; /* Is this correct return code here? or should it be ERROR_SET */ } memset(prod, 0, sizeof(prod)); memset(inv, 0, sizeof(inv)); #ifdef __UNUSED__ gpsd_log(errout, LOG_INF, "Line-of-sight matrix:\n"); for (k = 0; k < n; k++) { gpsd_log(errout, LOG_INF, "%f %f %f %f\n", satpos[k][0], satpos[k][1], satpos[k][2], satpos[k][3]); } #endif /* __UNUSED__ */ 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]; } } } #ifdef __UNUSED__ gpsd_log(errout, LOG_INF, "product:\n"); for (k = 0; k < 4; k++) { gpsd_log(errout, LOG_INF, "%f %f %f %f\n", prod[k][0], prod[k][1], prod[k][2], prod[k][3]); } #endif /* __UNUSED__ */ if (matrix_invert(prod, inv)) { #ifdef __UNUSED__ /* * Note: this will print garbage unless all the subdeterminants * are computed in the invert() function. */ gpsd_log(errout, LOG_RAW, "inverse:\n"); for (k = 0; k < 4; k++) { gpsd_log(errout, LOG_RAW, "%f %f %f %f\n", inv[k][0], inv[k][1], inv[k][2], inv[k][3]); } #endif /* __UNUSED__ */ } else { #ifndef USE_QT gpsd_log(errout, LOG_DATA, "LOS matrix is singular, can't calculate DOPs - source '%s'\n", gpsdata->dev.path); #endif return 0; } xdop = sqrt(inv[0][0]); ydop = sqrt(inv[1][1]); hdop = sqrt(inv[0][0] + inv[1][1]); vdop = sqrt(inv[2][2]); pdop = sqrt(inv[0][0] + inv[1][1] + inv[2][2]); tdop = sqrt(inv[3][3]); gdop = sqrt(inv[0][0] + inv[1][1] + inv[2][2] + inv[3][3]); #ifndef USE_QT gpsd_log(errout, 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 if (isnan(dop->xdop) != 0) { dop->xdop = xdop; } if (isnan(dop->ydop) != 0) { dop->ydop = ydop; } if (isnan(dop->hdop) != 0) { dop->hdop = hdop; } if (isnan(dop->vdop) != 0) { dop->vdop = vdop; } if (isnan(dop->pdop) != 0) { dop->pdop = pdop; } if (isnan(dop->tdop) != 0) { dop->tdop = tdop; } if (isnan(dop->gdop) != 0) { dop->gdop = gdop; } return DOP_SET; } static void gpsd_error_model(struct gps_device_t *session, struct gps_fix_t *fix, struct gps_fix_t *oldfix) /* compute errors and derived quantities */ { /* * Now we compute derived quantities. This is where the tricky error- * modeling stuff goes. Presently we don't know how to derive * time error. * * Some drivers set the position-error fields. Only the Zodiacs * report speed error. Nobody reports track error or climb error. * * The UERE constants are our assumption about the base error of * GPS fixes in different directions. */ #define H_UERE_NO_DGPS 15.0 /* meters, 95% confidence */ #define H_UERE_WITH_DGPS 3.75 /* meters, 95% confidence */ #define V_UERE_NO_DGPS 23.0 /* meters, 95% confidence */ #define V_UERE_WITH_DGPS 5.75 /* meters, 95% confidence */ #define P_UERE_NO_DGPS 19.0 /* meters, 95% confidence */ #define P_UERE_WITH_DGPS 4.75 /* meters, 95% confidence */ double h_uere, v_uere, p_uere; 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); /* * OK, this is not an error computation, but we're at the right * place in the architecture for it. Compute speed over ground * and climb/sink in the simplest possible way. */ if (fix->mode >= MODE_2D && oldfix->mode >= MODE_2D && isnan(fix->speed) != 0) { if (fix->time == oldfix->time) fix->speed = 0; else fix->speed = earth_distance(fix->latitude, fix->longitude, oldfix->latitude, oldfix->longitude) / (fix->time - oldfix->time); } 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); } } /* * Field reports match the theoretical prediction that * expected time error should be half the resolution of * the GPS clock, so we put the bound of the error * in as a constant pending getting it from each driver. * * In an ideal world, we'd increase this if no leap-second has * been seen and it's less than 750s (one almanac load cycle) from * device powerup. Alas, we have no way to know when device * powerup occurred - depending on the receiver design it could be * when the hardware was first powered up or when it was first * opened. Also, some devices (notably plain NMEA0183 receivers) * never ship an indication of when they have valid leap second. */ if (isnan(fix->time) == 0 && isnan(fix->ept) != 0) fix->ept = 0.005; /* Other error computations depend on having a valid fix */ if (fix->mode >= MODE_2D) { if (isnan(fix->epx) != 0 && isfinite(session->gpsdata.dop.hdop) != 0) fix->epx = session->gpsdata.dop.xdop * h_uere; if (isnan(fix->epy) != 0 && isfinite(session->gpsdata.dop.hdop) != 0) fix->epy = session->gpsdata.dop.ydop * h_uere; if ((fix->mode >= MODE_3D) && isnan(fix->epv) != 0 && isfinite(session->gpsdata.dop.vdop) != 0) fix->epv = session->gpsdata.dop.vdop * v_uere; if (isnan(session->gpsdata.epe) != 0 && isfinite(session->gpsdata.dop.pdop) != 0) session->gpsdata.epe = session->gpsdata.dop.pdop * p_uere; else session->gpsdata.epe = NAN; /* * If we have a current fix and an old fix, and the packet handler * didn't set the speed error and climb error members itself, * try to compute them now. */ 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(fix->time) == 0 && fix->time > oldfix->time) { timestamp_t 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) { if (oldfix->mode >= MODE_3D && fix->mode >= MODE_3D) { timestamp_t t = fix->time - oldfix->time; double e = oldfix->epv + fix->epv; /* if vertical uncertainties are zero this will be too */ fix->epc = e / t; } /* * We compute a track error estimate solely from the * position of this fix and the last one. The maximum * track error, as seen from the position of last fix, is * the angle subtended by the two most extreme possible * error positions of the current fix; the expected track * error is half that. Let the position of the old fix be * A and of the new fix B. We model the view from A as * two right triangles ABC and ABD with BC and BD both * having the length of the new fix's estimated error. * adj = len(AB), opp = len(BC) = len(BD), hyp = len(AC) = * len(AD). This leads to spurious uncertainties * near 180 when we're moving slowly; to avoid reporting * garbage, throw back NaN if the distance from the previous * fix is less than the error estimate. */ 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 opp = EMIX(fix->epx, fix->epy); double hyp = sqrt(adj * adj + opp * opp); fix->epd = RAD_2_DEG * 2 * asin(opp / hyp); } } } } /* save old fix for later error computations */ if (fix->mode >= MODE_2D) *oldfix = *fix; } #endif /* NOFLOATS_ENABLE */ int gpsd_await_data(fd_set *rfds, fd_set *efds, const int maxfd, fd_set *all_fds, struct gpsd_errout_t *errout) /* await data from any socket in the all_fds set */ { int status; FD_ZERO(efds); *rfds = *all_fds; gpsd_log(errout, 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 * the file descriptors in the set goes ready. The point * of tracking maxfd is to keep the set of descriptors that * select(2) has to poll here as small as possible (for * low-clock-rate SBCs and the like). * * pselect() is preferable to vanilla select, to eliminate * the once-per-second wakeup when no sensors are attached. * This cuts power consumption. */ errno = 0; status = pselect(maxfd + 1, rfds, NULL, NULL, NULL, NULL); if (status == -1) { if (errno == EINTR) return AWAIT_NOT_READY; else if (errno == EBADF) { int fd; for (fd = 0; fd < (int)FD_SETSIZE; fd++) /* * All we care about here is a cheap, fast, uninterruptible * way to check if a file descriptor is valid. */ if (FD_ISSET(fd, all_fds) && fcntl(fd, F_GETFL, 0) == -1) { FD_CLR(fd, all_fds); FD_SET(fd, efds); } return AWAIT_NOT_READY; } else { gpsd_log(errout, LOG_ERROR, "select: %s\n", strerror(errno)); return AWAIT_FAILED; } } if (errout->debug >= LOG_SPIN) { int i; char dbuf[BUFSIZ]; dbuf[0] = '\0'; for (i = 0; i < (int)FD_SETSIZE; i++) if (FD_ISSET(i, all_fds)) str_appendf(dbuf, sizeof(dbuf), "%d ", i); str_rstrip_char(dbuf, ' '); (void)strlcat(dbuf, "} -> {", sizeof(dbuf)); for (i = 0; i < (int)FD_SETSIZE; i++) if (FD_ISSET(i, rfds)) str_appendf(dbuf, sizeof(dbuf), " %d ", i); gpsd_log(errout, LOG_SPIN, "select() {%s} at %f (errno %d)\n", dbuf, timestamp(), errno); } return AWAIT_GOT_INPUT; } static bool hunt_failure(struct gps_device_t *session) /* after a bad packet, what should cue us to go to next autobaud setting? */ { /* * We have tried three different tests here. * * The first was session->badcount++>1. This worked very well on * ttys for years and years, but caused failure to sync on TCP/IP * sources, which have I/O boundaries in mid-packet more often * than RS232 ones. There's a test for this at * test/daemon/tcp-torture.log. * * The second was session->badcount++>1 && session->lexer.state==0. * Fail hunt only if we get a second consecutive bad packet * and the lexer is in ground state. We don't want to fail on * a first bad packet because the source might have a burst of * leading garbage after open. We don't want to fail if the * lexer is not in ground state, because that means the read * might have picked up a valid partial packet - better to go * back around the loop and pick up more data. * * The "&& session->lexer.state==0" guard causes an intermittent * hang while autobauding on SiRF IIIs (but not on SiRF-IIs, oddly * enough). Removing this conjunct resurrected the failure * of test/daemon/tcp-torture.log. * * Our third attempt, isatty(session->gpsdata.gps_fd) != 0 * && session->badcount++>1, reverts to the old test that worked * well on ttys for ttys and prevents non-tty devices from *ever* * having hunt failures. This has the cost that non-tty devices * will never get kicked off for presenting bad packets. * * This test may need further revision. */ return isatty(session->gpsdata.gps_fd) != 0 && session->badcount++>1; } gps_mask_t gpsd_poll(struct gps_device_t *session) /* update the stuff in the scoreboard structure */ { ssize_t newlen; bool driver_change = false; gps_clear_fix(&session->newdata); #ifdef TIMING_ENABLE /* * Input just became available from a sensor, but no read from the * device has yet been done. * * What we actually do here is trickier. For latency-timing * purposes, we want to know the time at the start of the current * recording cycle. We rely on the fact that even at 4800bps * there's a quiet time perceptible to the human eye in gpsmon * between when the last character of the last packet in a * 1-second cycle ships and when the next reporting cycle * ships. Because the cycle time is fixed, higher baud rates will * make this gap larger. * * Thus, we look for an inter-character delay much larger than an * average 4800bps sentence time. How should this delay be set? Well, * counting framing bits and erring on the side of caution, it's * about 480 characters per second or 2083 microeconds per character; * that's almost exactly 0.125 seconds per average 60-char sentence. * Doubling this to avoid false positives, we look for an inter-character * delay of greater than 0.250s. * * The above assumes a cycle time of 1 second. To get the minimum size of * the quiet period, we multiply by the device cycle time. * * We can sanity-check these calculation by watching logs. If we have set * MINIMUM_QUIET_TIME correctly, the "transmission pause" message below * will consistently be emitted just before the sentence that shows up * as start-of-cycle in gpsmon, and never emitted at any other point * in the cycle. * * In practice, it seems that edge detection succeeds at 9600bps but * fails at 4800bps. This is not surprising, as previous profiling has * indicated that at 4800bps some devices overrun a 1-second cycle time * with the data they transmit. */ #define MINIMUM_QUIET_TIME 0.25 if (session->lexer.outbuflen == 0) { /* beginning of a new packet */ timestamp_t now = timestamp(); if (session->device_type != NULL && session->lexer.start_time > 0) { #ifdef RECONFIGURE_ENABLE const double min_cycle = session->device_type->min_cycle; #else const double min_cycle = 1; #endif /* RECONFIGURE_ENABLE */ double quiet_time = (MINIMUM_QUIET_TIME * min_cycle); double gap = now - session->lexer.start_time; if (gap > min_cycle) gpsd_log(&session->context->errout, LOG_WARN, "cycle-start detector failed.\n"); else if (gap > quiet_time) { gpsd_log(&session->context->errout, LOG_PROG, "transmission pause of %f\n", gap); session->sor = now; session->lexer.start_char = session->lexer.char_counter; } } session->lexer.start_time = now; } #endif /* TIMING_ENABLE */ if (session->lexer.type >= COMMENT_PACKET) { session->observed |= PACKET_TYPEMASK(session->lexer.type); } /* can we get a full packet from the device? */ if (session->device_type != NULL) { newlen = session->device_type->get_packet(session); /* coverity[deref_ptr] */ gpsd_log(&session->context->errout, LOG_RAW, "%s is known to be %s\n", session->gpsdata.dev.path, session->device_type->type_name); } else { newlen = generic_get(session); } /* update the scoreboard structure from the GPS */ gpsd_log(&session->context->errout, LOG_RAW + 2, "%s sent %zd new characters\n", session->gpsdata.dev.path, newlen); if (newlen < 0) { /* read error */ gpsd_log(&session->context->errout, LOG_INF, "GPS on %s returned error %zd (%lf sec since data)\n", session->gpsdata.dev.path, newlen, timestamp() - session->gpsdata.online); session->gpsdata.online = (timestamp_t)0; return ERROR_SET; } else if (newlen == 0) { /* zero length read, possible EOF */ /* * Multiplier is 2 to avoid edge effects due to sampling at the exact * wrong time... */ if (session->gpsdata.online > 0 && timestamp() - session->gpsdata.online >= session->gpsdata.dev.cycle * 2) { gpsd_log(&session->context->errout, LOG_INF, "GPS on %s is offline (%lf sec since data)\n", session->gpsdata.dev.path, timestamp() - session->gpsdata.online); session->gpsdata.online = (timestamp_t)0; } return NODATA_IS; } else /* (newlen > 0) */ { gpsd_log(&session->context->errout, LOG_RAW, "packet sniff on %s finds type %d\n", session->gpsdata.dev.path, session->lexer.type); if (session->lexer.type == COMMENT_PACKET) { if (strcmp((const char *)session->lexer.outbuffer, "# EOF\n") == 0) { gpsd_log(&session->context->errout, LOG_PROG, "synthetic EOF\n"); return EOF_IS; } else gpsd_log(&session->context->errout, LOG_PROG, "comment, sync lock deferred\n"); /* FALL THROUGH */ } else if (session->lexer.type > COMMENT_PACKET) { if (session->device_type == NULL) driver_change = true; else { int newtype = session->lexer.type; /* * Are we seeing a new packet type? Then we probably * want to change drivers. */ bool new_packet_type = (newtype != session->device_type->packet_type); /* * Possibly the old driver has a mode-switcher method, in * which case we know it can handle NMEA itself and may * want to do special things (like tracking whether a * previous mode switch to binary succeeded in suppressing * NMEA). */ #ifdef RECONFIGURE_ENABLE bool dependent_nmea = (newtype == NMEA_PACKET && session->device_type->mode_switcher!=NULL); #else bool dependent_nmea = false; #endif /* RECONFIGURE_ENABLE */ /* * Compute whether to switch drivers. * If the previous driver type was sticky and this one * isn't, we'll revert after processing the packet. */ driver_change = new_packet_type && !dependent_nmea; } if (driver_change) { const struct gps_type_t **dp; for (dp = gpsd_drivers; *dp; dp++) if (session->lexer.type == (*dp)->packet_type) { gpsd_log(&session->context->errout, LOG_PROG, "switching to match packet type %d: %s\n", session->lexer.type, gpsd_prettydump(session)); (void)gpsd_switch_driver(session, (*dp)->type_name); break; } } session->badcount = 0; session->gpsdata.dev.driver_mode = (session->lexer.type > NMEA_PACKET) ? MODE_BINARY : MODE_NMEA; /* FALL THROUGH */ } else if (hunt_failure(session) && !gpsd_next_hunt_setting(session)) { gpsd_log(&session->context->errout, LOG_INF, "hunt on %s failed (%lf sec since data)\n", session->gpsdata.dev.path, timestamp() - session->gpsdata.online); return ERROR_SET; } } if (session->lexer.outbuflen == 0) { /* got new data, but no packet */ gpsd_log(&session->context->errout, 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; session->gpsdata.online = timestamp(); gpsd_log(&session->context->errout, LOG_RAW + 3, "Accepted packet on %s.\n", session->gpsdata.dev.path); /* track the packet count since achieving sync on the device */ if (driver_change && (session->drivers_identified & (1 << session->driver_index)) == 0) { speed_t speed = gpsd_get_speed(session); /* coverity[var_deref_op] */ gpsd_log(&session->context->errout, LOG_INF, "%s identified as type %s, %ld sec @ %ubps\n", session->gpsdata.dev.path, session->device_type->type_name, (long)(time(NULL) - session->opentime), (unsigned int)speed); /* fire the init_query method */ if (session->device_type != NULL && session->device_type->init_query != NULL) { /* * We can force readonly off knowing this method does * not alter device state. */ bool saved = session->context->readonly; session->context->readonly = false; session->device_type->init_query(session); session->context->readonly = saved; } /* fire the identified hook */ if (session->device_type != NULL && session->device_type->event_hook != NULL) session->device_type->event_hook(session, event_identified); session->lexer.counter = 0; /* let clients know about this. */ received |= DRIVER_IS; /* mark the fact that this driver has been seen */ session->drivers_identified |= (1 << session->driver_index); } else session->lexer.counter++; /* fire the configure hook */ if (session->device_type != NULL && session->device_type->event_hook != NULL) session->device_type->event_hook(session, event_configure); /* * The guard looks superfluous, but it keeps the rather expensive * gpsd_packetdump() function from being called even when the debug * level does not actually require it. */ if (session->context->errout.debug >= LOG_RAW) gpsd_log(&session->context->errout, LOG_RAW, "raw packet of type %d, %zd:%s\n", session->lexer.type, session->lexer.outbuflen, gpsd_prettydump(session)); /* Get data from current packet into the fix structure */ if (session->lexer.type != COMMENT_PACKET) if (session->device_type != NULL && session->device_type->parse_packet != NULL) received |= session->device_type->parse_packet(session); #ifdef RECONFIGURE_ENABLE /* * We may want to revert to the last driver that was marked * sticky. What this accomplishes is that if we've just * processed something like AIVDM, but a driver with control * methods or an event hook had been active before that, we * keep the information about those capabilities. */ if (!STICKY(session->device_type) && session->last_controller != NULL && STICKY(session->last_controller)) { session->device_type = session->last_controller; gpsd_log(&session->context->errout, LOG_PROG, "reverted to %s driver...\n", session->device_type->type_name); } #endif /* RECONFIGURE_ENABLE */ #ifdef TIMING_ENABLE /* are we going to generate a report? if so, count characters */ if ((received & REPORT_IS) != 0) { session->chars = session->lexer.char_counter - session->lexer.start_char; } #endif /* TIMING_ENABLE */ session->gpsdata.set = ONLINE_SET | received; #ifndef NOFLOATS_ENABLE /* * Compute fix-quality data from the satellite positions. * These will not overwrite any DOPs reported from the packet * we just got. */ if ((received & SATELLITE_SET) != 0 && session->gpsdata.satellites_visible > 0) { session->gpsdata.set |= fill_dop(&session->context->errout, &session->gpsdata, &session->gpsdata.dop); session->gpsdata.epe = NAN; } #endif /* NOFLOATS_ENABLE */ /* copy/merge device data into staging buffers */ 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; //gpsd_log(&session->context->errout, LOG_PROG, // "transfer mask: %02x\n", session->gpsdata.set); gps_merge_fix(&session->gpsdata.fix, session->gpsdata.set, &session->newdata); #ifndef NOFLOATS_ENABLE gpsd_error_model(session, &session->gpsdata.fix, &session->oldfix); #endif /* NOFLOATS_ENABLE */ /* * Count good fixes. We used to check * 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 * really want to know is whether the last packet received was a * fix packet AND held a valid fix. We must ignore non-fix packets * AND packets which have fix data but are flagged as invalid. Some * devices output fix packets on a regular basis, even when unable * to derive a good fix. Such packets should set STATUS_NO_FIX. */ if ( 0 != (session->gpsdata.set & LATLON_SET)) { if ( session->gpsdata.status > STATUS_NO_FIX) { session->context->fixcnt++; session->fixcnt++; } else { session->context->fixcnt = 0; session->fixcnt = 0; } } /* * Sanity check. This catches a surprising number of port and * driver errors, including 32-vs.-64-bit problems. */ if ((session->gpsdata.set & TIME_SET) != 0) { if (session->newdata.time > time(NULL) + (60 * 60 * 24 * 365)) gpsd_log(&session->context->errout, LOG_WARN, "date more than a year in the future!\n"); else if (session->newdata.time < 0) gpsd_log(&session->context->errout, LOG_ERROR, "date is negative!\n"); } return session->gpsdata.set; } } int gpsd_multipoll(const bool data_ready, struct gps_device_t *device, void (*handler)(struct gps_device_t *, gps_mask_t), float reawake_time) /* consume and handle packets from a specified device */ { if (data_ready) { int fragments; gpsd_log(&device->context->errout, LOG_RAW + 1, "polling %d\n", device->gpsdata.gps_fd); #ifdef NETFEED_ENABLE /* * Strange special case - the opening transaction on an NTRIP connection * may not yet be completed. Try to ratchet things forward. */ if (device->servicetype == service_ntrip && device->ntrip.conn_state != ntrip_conn_established) { (void)ntrip_open(device, ""); if (device->ntrip.conn_state == ntrip_conn_err) { gpsd_log(&device->context->errout, LOG_WARN, "connection to ntrip server failed\n"); device->ntrip.conn_state = ntrip_conn_init; return DEVICE_ERROR; } else { return DEVICE_READY; } } #endif /* NETFEED_ENABLE */ for (fragments = 0; ; fragments++) { gps_mask_t changed = gpsd_poll(device); if (changed == EOF_IS) { gpsd_log(&device->context->errout, LOG_WARN, "device signed off %s\n", device->gpsdata.dev.path); return DEVICE_EOF; } else if (changed == ERROR_SET) { gpsd_log(&device->context->errout, LOG_WARN, "device read of %s returned error or packet sniffer failed sync (flags %s)\n", device->gpsdata.dev.path, gps_maskdump(changed)); return DEVICE_ERROR; } else if (changed == NODATA_IS) { /* * No data on the first fragment read means the device * fd may have been in an end-of-file condition on select. */ if (fragments == 0) { gpsd_log(&device->context->errout, LOG_DATA, "%s returned zero bytes\n", device->gpsdata.dev.path); if (device->zerokill) { /* failed timeout-and-reawake, kill it */ gpsd_deactivate(device); if (device->ntrip.works) { device->ntrip.works = false; // reset so we try this once only if (gpsd_activate(device, O_CONTINUE) < 0) { gpsd_log(&device->context->errout, LOG_WARN, "reconnect to ntrip server failed\n"); return DEVICE_ERROR; } else { gpsd_log(&device->context->errout, LOG_INFO, "reconnecting to ntrip server\n"); return DEVICE_READY; } } } else if (reawake_time == 0) { return DEVICE_ERROR; } else { /* * Disable listening to this fd for long enough * that the buffer can fill up again. */ gpsd_log(&device->context->errout, LOG_DATA, "%s will be repolled in %f seconds\n", device->gpsdata.dev.path, reawake_time); device->reawake = time(NULL) + reawake_time; return DEVICE_UNREADY; } } /* * No data on later fragment reads just means the * input buffer is empty. In this case break out * of the fragment-processing loop but consider * the device still good. */ break; } /* we got actual data, head off the reawake special case */ device->zerokill = false; device->reawake = (time_t)0; /* must have a full packet to continue */ if ((changed & PACKET_SET) == 0) break; /* conditional prevents mask dumper from eating CPU */ if (device->context->errout.debug >= LOG_DATA) { if (device->lexer.type == BAD_PACKET) gpsd_log(&device->context->errout, LOG_DATA, "packet with bad checksum from %s\n", device->gpsdata.dev.path); else gpsd_log(&device->context->errout, LOG_DATA, "packet type %d from %s with %s\n", device->lexer.type, device->gpsdata.dev.path, gps_maskdump(device->gpsdata.set)); } /* handle data contained in this packet */ if (device->lexer.type != BAD_PACKET) handler(device, changed); #ifdef __future__ /* * Bernd Ocklin suggests: * Exit when a full packet was received and parsed. * This allows other devices to be serviced even if * this device delivers a full packet at every single * read. * Otherwise we can sit here for a long time without * any for-loop exit condition being met. */ if ((changed & PACKET_SET) != 0) break; #endif /* __future__ */ } } else if (device->reawake>0 && time(NULL) >device->reawake) { /* device may have had a zero-length read */ gpsd_log(&device->context->errout, LOG_DATA, "%s reawakened after zero-length read\n", device->gpsdata.dev.path); device->reawake = (time_t)0; device->zerokill = true; return DEVICE_READY; } /* no change in device descriptor state */ return DEVICE_UNCHANGED; } void gpsd_wrap(struct gps_device_t *session) /* end-of-session wrapup */ { if (!BAD_SOCKET(session->gpsdata.gps_fd)) gpsd_deactivate(session); } void gpsd_zero_satellites( struct gps_data_t *out) { (void)memset(out->skyview, '\0', sizeof(out->skyview)); out->satellites_visible = 0; #if 0 /* * We used to clear DOPs here, but this causes misbehavior on some * combined GPS/GLONASS/QZSS receivers like the Telit SL869; the * symptom is that the "satellites_used" field in a struct gps_data_t * filled in by gps_read() is always zero. */ gps_clear_dop(&out->dop); #endif } #ifdef NTP_ENABLE void ntp_latch(struct gps_device_t *device, struct timedelta_t *td) /* latch the fact that we've saved a fix */ { double fix_time, integral, fractional; /* this should be an invariant of the way this function is called */ assert(isnan(device->newdata.time)==0); (void)clock_gettime(CLOCK_REALTIME, &td->clock); fix_time = device->newdata.time; #ifdef TIMEHINT_ENABLE /* assume zero when there's no offset method */ if (device->device_type == NULL || device->device_type->time_offset == NULL) fix_time += 0.0; else fix_time += device->device_type->time_offset(device); #endif /* TIMEHINT_ENABLE */ /* it's ugly but timestamp_t is double */ /* note loss of precision here * td->clock is in nanoSec * fix_time is in microSec * OK since GPS timestamps are millSec or worse */ fractional = modf(fix_time, &integral); td->real.tv_sec = (time_t)integral; td->real.tv_nsec = (long)(fractional * 1e+9); #ifdef PPS_ENABLE /* thread-safe update */ pps_thread_fixin(&device->pps_thread, td); #endif /* PPS_ENABLE */ } #endif /* NTP_ENABLE */ /* end */ gpsd-3.15/libgpsmm.cpp0000664000175000017500000000351512520742615013073 0ustar esresr/* * Copyright (C) 2005 Alfredo Pironti * * This software is distributed under a BSD-style license. See the * file "COPYING" in the top-level directory of the disribution for details. * */ #include #include "libgpsmm.h" #include "gpsd_config.h" struct gps_data_t* gpsmm::gps_inner_open(const char *host, const char *port) { const bool err = (gps_open(host, port, gps_state()) != 0); if ( err ) { to_user = NULL; return NULL; } else { // connection successfully opened to_user= new struct gps_data_t; return backup(); //we return the backup of our internal structure } } struct gps_data_t* gpsmm::stream(int flags) { if (to_user == NULL) return NULL; else if (gps_stream(gps_state(),flags, NULL)==-1) { return NULL; } else { return backup(); } } struct gps_data_t* gpsmm::send(const char *request) { if (gps_send(gps_state(),request)==-1) { return NULL; } else { return backup(); } } struct gps_data_t* gpsmm::read(void) { if (gps_read(gps_state())<=0) { // we return null if there was a read() error, if no // data was ready in POLL_NOBLOCK mode, or if the // connection is closed by gpsd return NULL; } else { return backup(); } } bool gpsmm::waiting(int timeout) { return gps_waiting(gps_state(), timeout); } const char *gpsmm::data(void) { return gps_data(gps_state()); } // cppcheck-suppress unusedFunction void gpsmm::clear_fix(void) { gps_clear_fix(&(gps_state()->fix)); } // cppcheck-suppress unusedFunction void gpsmm::enable_debug(int level, FILE *fp) { #ifdef CLIENTDEBUG_ENABLE gps_enable_debug(level, fp); #endif /* CLIENTDEBUG_ENABLE */ } // cppcheck-suppress unusedFunction bool gpsmm::is_open(void) { return to_user != NULL; } gpsmm::~gpsmm() { if ( to_user != NULL ) { gps_close(gps_state()); delete to_user; } } gpsd-3.15/libgpsmm.h0000664000175000017500000000350512506317037012537 0ustar esresr#ifndef _GPSD_GPSMM_H_ #define _GPSD_GPSMM_H_ /* * Copyright (C) 2005 Alfredo Pironti * * This software is distributed under a BSD-style license. See the * file "COPYING" in the toop-level directory of the distribution for details. * */ #include #include "gps.h" //the C library we are going to wrap #ifndef USE_QT class gpsmm { #else #include #if defined(LIBQGPSMM_LIBRARY) # define LIBQGPSMMSHARED_EXPORT Q_DECL_EXPORT #else # define LIBQGPSMMSHARED_EXPORT Q_DECL_IMPORT #endif class LIBQGPSMMSHARED_EXPORT gpsmm { #endif public: // cppcheck-suppress uninitVar gpsmm(const char *host, const char *port) : to_user(0), _gps_state() { gps_inner_open(host, port); } #ifdef __UNUSED__ // cppcheck-suppress uninitVar gpsmm(void) : to_user(0) { gps_inner_open("localhost", DEFAULT_GPSD_PORT); } #endif virtual ~gpsmm(); struct gps_data_t* send(const char *request); //put a command to gpsd and return the updated struct struct gps_data_t* stream(int); //set watcher and policy flags struct gps_data_t* read(void); //block until gpsd returns new data, then return the updated struct const char *data(void); // return the client data buffer bool waiting(int); // blocking check for data waiting void clear_fix(void); void enable_debug(int, FILE*); bool is_open(void); // check for constructor success private: 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* gps_inner_open(const char *host, const char *port); struct gps_data_t _gps_state; struct gps_data_t * gps_state() { return &_gps_state; } struct gps_data_t* backup(void) { *to_user=*gps_state(); return to_user;}; //return the backup copy }; #endif // _GPSD_GPSMM_H_ gpsd-3.15/libgpsmm.xml0000664000175000017500000000643612461156335013120 0ustar esresr 13 May 2005 libgpsmm 3 The GPSD Project GPSD Documentation libgpsmm libQgpsmm C++ and QT class wrapper for the GPS daemon C++: #include <libgpsmm> struct gps_data_t *open char *host char *port struct gps_data_t *open void struct gps_data_t *send char *request struct gps_data_t *read void struct gps_data_t *waiting int struct gps_data_t *stream unsigned intflags DESCRIPTION libgpsmm and libQgpsmm are mere wrappers over libgps. The important difference between the libraries is that libgpsmm is targeted at C++ applications and contained in libgps, while libQgpsmm is platform independent by using QTcpSocket to connect to gpsd and shipped as an additional library due to the necessary linking to QT. Method names are the same as the analogue C functions. For a detailed description of the functions please read libgps3. open() must be called after class constructor and before any other method (open() is not inside the constructor since it may fail, however constructors have no return value). The analogue of the C function gps_close() is in the destructor. SEE ALSO gpsd8, gps1, libgps3. AUTHOR Alfredo Pironti <alfredio@users.sourceforge.net>. gpsd-3.15/maintainers.txt0000664000175000017500000000136012520742615013624 0ustar esresr= GPSD area maintainers = This file points at responsible submaintainers for various portions of the GPSD code, packaging, and ports. == Modules and drivers == Gary E. Miller :: Garmin driver, NTP interface code Reinhard Arlt :: NMEA 2000 support == Packaging == Bernd Zeimetz :: Debian Miroslav Lichvar :: Red Hat Mike Frysinger :: Gentoo == Ports == Samuel CUELLA :: Android Greg Troxel :: NetBSD, Mac OS X Chris Kuethe :: OpenBSD Matt :: Cygwin (incomplete). Eventually, mingw. // end gpsd-3.15/maskaudit.py.in0000664000175000017500000001125112467430015013510 0ustar esresr#!@PYTHON@ # # @MASTER@ # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # With -p, dump a Python status mask list translated from the C one. # # With -c, generate C code to dump masks for debugging purposes. # # With -t, tabulate usage of defines to find unused ones. Requires -c or -d. import commands import getopt import glob import sys class SourceExtractor: def __init__(self, sourcefile, clientside): self.sourcefile = sourcefile self.clientside = clientside self.daemonfiles = [ "gpsd.c", "libgpsd_core.c", "pseudonmea.c", "drivers.c", "gpsmon.c", "subframe.c" ] + glob.glob("driver_*.c") + glob.glob("monitor_*.c") self.masks = [] self.primitive_masks = [] for line in file(self.sourcefile): if line.startswith("#define") and ("_SET" in line or "_IS" in line): fields = line.split() self.masks.append((fields[1], fields[2])) if fields[2].startswith("(1llu<<") or fields[2].startswith("INTERNAL_SET"): self.primitive_masks.append((fields[1], fields[2])) def in_library(self, 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:], "cdpt") pythonize = tabulate = False clientgen = daemongen = False for (switch, val) in options: if switch == '-p': pythonize = True if switch == '-c': clientgen = True if switch == '-d': daemongen = True if switch == '-t': tabulate = True if not arguments: srcdir = '.' else: srcdir = arguments[0] clientside = SourceExtractor(srcdir + "/gps.h", clientside=True) daemonside = SourceExtractor(srcdir + "/gpsd.h", clientside=False) if clientgen: source = clientside banner = "Library" elif daemongen: source = daemonside banner = "Daemon" if tabulate: print "%-14s %8s" % (" ", banner) for (flag, value) in source.masks: 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 not pythonize and not tabulate: maxout = 0 for (d, v) in source.primitive_masks: if source.relevant(d): stem = d if stem.endswith("_SET"): stem = stem[:-4] if stem.endswith("_IS"): stem = stem[:-3] maxout += len(stem) + 1 print """/* This code is generated. Do not hand-hack it! */ /* * Also, beware that it is something of a CPU hog when called on every packet. * Try to write guards so it is only called at higher log levels. */ #include #include #include \"gpsd.h\" const char *gps_maskdump(gps_mask_t set) { static char buf[%d]; const struct { gps_mask_t mask; const char *name; } *sp, names[] = {""" % (maxout + 3,) for (flag, value) in clientside.primitive_masks + daemonside.primitive_masks: stem = flag if stem.endswith("_SET"): stem = stem[:-4] if stem.endswith("_IS"): stem = stem[:-3] print " {%s,\t\"%s\"}," % (flag, stem) print '''\ }; memset(buf, '\\0', sizeof(buf)); buf[0] = '{'; for (sp = names; sp < names + sizeof(names)/sizeof(names[0]); sp++) if ((set & sp->mask)!=0) { (void)strlcat(buf, sp->name, sizeof(buf)); (void)strlcat(buf, "|", sizeof(buf)); } if (buf[1] != \'\\0\') buf[strlen(buf)-1] = \'\\0\'; (void)strlcat(buf, "}", sizeof(buf)); return buf; } ''' except KeyboardInterrupt: pass # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: gpsd-3.15/matrix.c0000664000175000017500000001157212506325061012223 0ustar esresr/* matrix.c - matrix-algebra code * * This file is Copyright (c)2014 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include "matrix.h" bool matrix_invert(double mat[4][4], double inverse[4][4]) /* selected elements from 4x4 matrox inversion */ { // 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; } #ifdef __UNUSED_ // cppcheck-suppress unusedFunction void matrix_symmetrize(double mat[4][4], double prod[4][4]) /* symmetrize a matrix, multiply it by its transpose */ { int i, j, k; for (i = 0; i < 4; ++i) { //< rows for (j = 0; j < 4; ++j) { //< cols prod[i][j] = 0.0; for (k = 0; k < 4; ++k) { prod[i][j] += mat[k][i] * mat[k][j]; } } } } #endif /* UNUSED */ /* end */ gpsd-3.15/matrix.h0000664000175000017500000000051512506325075012230 0ustar esresr/* * matrix.h - matrix-algebra prototypes * * This file is Copyright (c)2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ extern bool matrix_invert(double mat[4][4], double inverse[4][4]); extern void matrix_symmetrize(double mat[4][4], double inverse[4][4]); /* end */ gpsd-3.15/monitor_garmin.c0000664000175000017500000001762712506325111013746 0ustar esresr/* * Garmin binary object for the GPS packet monitor. * * This file is Copyright (c) 2011 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include "gpsd.h" #include "bits.h" #include "gpsmon.h" #if defined(GARMIN_ENABLE) && defined(BINARY_ENABLE) extern const struct gps_type_t driver_garmin_ser_binary; static WINDOW *miscwin, *mid51win, *mid114win; #define display (void)mvwprintw #define GARMIN_CHANNELS 12 #define GPSD_LE16TOH(x) getles16((char *)(&(x)), 0) #define GPSD_LE32TOH(x) getles32((char *)(&(x)), 0) #pragma pack(1) /* Satellite Data Record */ typedef struct __attribute__((__packed__)) { uint8_t svid; uint16_t snr; uint8_t elev; uint16_t azmth; uint8_t status; } cpo_sat_data; /* Position Record */ typedef struct __attribute__((__packed__)) { float alt; float epe; float eph; float epv; int16_t fix; double gps_tow; double lat; double lon; float lon_vel; float lat_vel; float alt_vel; float msl_hght; int16_t leap_sec; int32_t grmn_days; } cpo_pvt_data; /* Receiver Measurement Record */ typedef struct __attribute__((__packed__)) { // cppcheck-suppress unusedStructMember uint32_t cycles; // cppcheck-suppress unusedStructMember double pr; // cppcheck-suppress unusedStructMember uint16_t phase; // cppcheck-suppress unusedStructMember int8_t slp_dtct; // cppcheck-suppress unusedStructMember uint8_t snr_dbhz; uint8_t svid; // cppcheck-suppress unusedStructMember int8_t valid; } cpo_rcv_sv_data; typedef struct __attribute__((__packed__)) { // cppcheck-suppress unusedStructMember double rcvr_tow; // cppcheck-suppress unusedStructMember int16_t rcvr_wn; // cppcheck-suppress unusedStructMember cpo_rcv_sv_data sv[GARMIN_CHANNELS]; } cpo_rcv_data; /* description of the status */ static char *fixdesc[] = { "no fix", "no fix", "2D", "3D", "2D dif", "3D dif", }; /* check range of an unsigned quantity */ #define CHECK_RANGE(vec, i) ((i) < sizeof(vec)/sizeof(vec[0])) static bool garmin_bin_initialize(void) { unsigned int i; #ifndef CONTROLSEND_ENABLE if(serial) { monitor_complain("Direct mode doesn't supported."); return false; } #endif miscwin = subwin(devicewin, 1, 80, 1, 0); mid51win = subwin(devicewin, 12, 18, 2, 0); mid114win = subwin(devicewin, GARMIN_CHANNELS + 3, 23, 2, 18); if (miscwin == NULL || mid51win == NULL || mid114win == NULL) return false; (void)syncok(miscwin, true); (void)syncok(mid51win, true); (void)syncok(mid114win, true); (void)wattrset(miscwin, A_BOLD); display(miscwin, 0, 0, "Time:"); (void)wattrset(miscwin, A_NORMAL); (void)wborder(mid51win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid51win, A_BOLD); display(mid51win, 0, 4, " Position "); display(mid51win, 1, 2, "Fix:"); display(mid51win, 2, 2, "Lat:"); (void)mvwaddch(mid51win, 2, 16, ACS_DEGREE); display(mid51win, 3, 2, "Lon:"); (void)mvwaddch(mid51win, 3, 16, ACS_DEGREE); display(mid51win, 4, 2, "Alt: m"); display(mid51win, 5, 2, "Speed: m/s"); display(mid51win, 6, 2, "Climb: m/s"); display(mid51win, 7, 2, "Leap: sec"); display(mid51win, 8, 2, "epe: m"); display(mid51win, 9, 2, "eph: m"); display(mid51win, 10, 2, "epv: m"); display(mid51win, 11, 3, " ID 51 (0x33) "); (void)wattrset(mid51win, A_NORMAL); (void)wborder(mid114win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid114win, A_BOLD); display(mid114win, 1, 1, "Ch PRN Az El SNR ST"); for (i = 0; i < GARMIN_CHANNELS; i++) { display(mid114win, (int)i + 2, 1, "%2d", i); } display(mid114win, 0, 5, " Satellite "); display(mid114win, 14, 4, " ID 114 (0x72) "); (void)wattrset(mid114win, A_NORMAL); /* initialize the GPS context's time fields */ gpsd_time_init(session.context, time(NULL)); return true; } static void garmin_bin_update(uint16_t pkt_id, uint32_t pkt_size UNUSED, unsigned char *pkt_data) { int i; cpo_sat_data *sats = NULL; cpo_pvt_data *pvt = NULL; //cpo_rcv_data *rmd = NULL; char tbuf[JSON_DATE_MAX+1]; switch (pkt_id) { case 0x29: /* Receiver Measurement Record */ case 0x34: /* for future use */ //rmd = (cpo_rcv_data *)pkt_data; monitor_log("RMD 0x%02x=", pkt_id); break; case 0x33: /* Position Record */ display(miscwin, 0, 6, "%-24s", unix_to_iso8601(session.gpsdata.fix.time, tbuf, sizeof(tbuf))); pvt = (cpo_pvt_data *)pkt_data; display(mid51win, 1, 7, "%s", (CHECK_RANGE(fixdesc, (uint8_t)GPSD_LE16TOH(pvt->fix)) ? \ fixdesc[GPSD_LE16TOH(pvt->fix)] : "unknown")); display(mid51win, 2, 8, "%3.5f", pvt->lat * RAD_2_DEG); display(mid51win, 3, 8, "%3.5f", pvt->lon * RAD_2_DEG); display(mid51win, 4, 8, "%8.2f", pvt->alt + pvt->msl_hght); display(mid51win, 5, 9, "%5.1f", hypot(pvt->lon_vel, pvt->lat_vel)); display(mid51win, 6, 9, "%5.1f", pvt->alt_vel); display(mid51win, 7, 8, "%d", (int)GPSD_LE16TOH(pvt->leap_sec)); if (GPSD_LE16TOH(pvt->fix) < 2) /* error value is very large when status no fix */ pvt->epe = pvt->eph = pvt->epv = NAN; display(mid51win, 8, 7, "%6.2f", pvt->epe); display(mid51win, 9, 7, "%6.2f", pvt->eph); display(mid51win, 10, 7, "%6.2f", pvt->epv); monitor_log("PVT 0x%02x=", pkt_id); break; case 0x72: /* Satellite Data Record */ sats = (cpo_sat_data *)pkt_data; for (i = 0; i < GARMIN_CHANNELS; i++, sats++) { display(mid114win, i + 2, 3, " %3u %3u %2u %4.1f %2x", sats->svid, GPSD_LE16TOH(sats->azmth), sats->elev, (float)GPSD_LE16TOH(sats->snr) / 100.0, sats->status); } monitor_log("SAT 0x%02x=", pkt_id); break; case 0xff: /* Product Data Record */ monitor_log("PDR 0x%02x=", pkt_id); break; default: monitor_log("UNK 0x%02x=", pkt_id); break; } } static void garmin_bin_ser_update(void) { unsigned char *buf; size_t len; uint16_t pkt_id; uint32_t pkt_size; unsigned char pkt_data[255]; int i, j; unsigned char c; unsigned char chksum; bool pkt_good = false, got_dle = false; buf = session.lexer.outbuffer; len = session.lexer.outbuflen; if (!(buf[0] == (unsigned char)0x10 && /* DLE */ buf[len-2] == (unsigned char)0x10 && /* DLE */ buf[len-1] == (unsigned char)0x03)) /* ETX */ goto end; /* bad pkt */ if (buf[1] == (unsigned char)0x10 && buf[2] != (unsigned char)0x10) goto end; /* bad pkt */ pkt_id = (uint16_t)buf[1]; if (buf[2] == (unsigned char)0x10 && buf[3] != (unsigned char)0x10) goto end; /* bad pkt */ pkt_size = (uint32_t)buf[2]; chksum = buf[1] + buf[2]; /* pkt_id + pkt_size */ j = 0; for (i = 0; i <= 255; i++) { if (pkt_size == (uint32_t)j) break; c = buf[i+3]; if (got_dle) { got_dle = false; if (c != (unsigned char)0x10) goto end; /* bad pkt */ } else { pkt_data[j++] = c; chksum += c; if (c == (unsigned char)0x10) got_dle = true; } } /* check pkt chksum */ if ((unsigned char)(-chksum) == buf[len-3]) pkt_good = true; end: if (pkt_good) { #ifdef CONTROLSEND_ENABLE if(serial) /* good packet, send ACK */ (void)monitor_control_send((unsigned char *)"\x10\x06\x00\xfa\x10\x03", 6); #endif garmin_bin_update(pkt_id, pkt_size, pkt_data); } else { #ifdef CONTROLSEND_ENABLE if(serial) /* bad packet, send NAK */ (void)monitor_control_send((unsigned char *)"\x10\x15\x00\xeb\x10\x03", 6); #endif monitor_log("BAD 0x%02x=", buf[1]); } } static void garmin_bin_wrap(void) { (void)delwin(miscwin); (void)delwin(mid51win); (void)delwin(mid114win); } const struct monitor_object_t garmin_bin_ser_mmt = { .initialize = garmin_bin_initialize, .update = garmin_bin_ser_update, .command = NULL, .wrap = garmin_bin_wrap, .min_y = 16,.min_x = 80, .driver = &driver_garmin_ser_binary, }; #endif /* defined(GARMIN_ENABLE) && defined(BINARY_ENABLE) */ gpsd-3.15/monitor_italk.c0000664000175000017500000001715512506317042013575 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include /* for strlcat() */ #include "gpsd.h" #include "bits.h" #include "gpsmon.h" #ifdef ITRAX_ENABLE #include "driver_italk.h" extern const struct gps_type_t driver_italk; static WINDOW *satwin, *navfixwin; #define display (void)mvwprintw static bool italk_initialize(void) { int i; /* "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; } static void display_itk_navfix(unsigned char *buf, size_t len) { unsigned int tow, tod, d, svlist; unsigned short gps_week, 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; #ifdef __UNUSED__ flags = (unsigned short) getleu16(buf, 7 + 4); */ cflags = (unsigned short) getleu16(buf, 7 + 6); pflags = (unsigned short) getleu16(buf, 7 + 8); #endif /* __UNUSED__ */ #define MAX(a,b) (((a) > (b)) ? (a) : (b)) nsv = (unsigned short) MAX(getleu16(buf, 7 + 12), getleu16(buf, 7 + 14)); svlist = (unsigned int) ((unsigned short) getleu32(buf, 7 + 16) | getleu32(buf, 7 + 24)); hour = (unsigned short) getleu16(buf, 7 + 66); min = (unsigned short) getleu16(buf, 7 + 68); sec = (unsigned short) getleu16(buf, 7 + 70); //nsec = (unsigned short) getleu32(buf, 7 + 72); year = (unsigned short) getleu16(buf, 7 + 76); mon = (unsigned short) getleu16(buf, 7 + 78); day = (unsigned short) getleu16(buf, 7 + 80); gps_week = (unsigned short) getles16(buf, 7 + 82); tow = (unsigned short) getleu32(buf, 7 + 84); epx = (double)(getles32(buf, 7 + 96) / 100.0); epy = (double)(getles32(buf, 7 + 100) / 100.0); epz = (double)(getles32(buf, 7 + 104) / 100.0); evx = (double)(getles32(buf, 7 + 186) / 1000.0); evy = (double)(getles32(buf, 7 + 190) / 1000.0); evz = (double)(getles32(buf, 7 + 194) / 1000.0); latitude = (double)(getles32(buf, 7 + 144) / 1e7); longitude = (double)(getles32(buf, 7 + 148) / 1e7); altitude = (float)(getles32(buf, 7 + 152) / 1e3); climb = (float)(getles32(buf, 7 + 206) / 1e3); speed = (float)(getleu32(buf, 7 + 210) / 1e3); track = (float)(getleu16(buf, 7 + 214) / 1e2); hdop = (float)(getleu16(buf, 7 + 56) / 100.0); gdop = (float)(getleu16(buf, 7 + 58) / 100.0); pdop = (float)(getleu16(buf, 7 + 60) / 100.0); vdop = (float)(getleu16(buf, 7 + 62) / 100.0); tdop = (float)(getleu16(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, sizeof(satlist)); } } (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)getleu16(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)getleu16(buf, off); ss = (unsigned char)getleu16(buf, off + 2) & 0xff; prn = (unsigned char)getleu16(buf, off + 4) & 0xff; el = (unsigned char)getles16(buf, off + 6) & 0xff; az = (unsigned char)getles16(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.lexer.outbuffer; len = session.lexer.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) { return COMMAND_UNKNOWN; } static void italk_wrap(void) { (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 = &driver_italk, }; #endif gpsd-3.15/monitor_nmea0183.c0000664000175000017500000004122612520742615013725 0ustar esresr/* * monitor_nmea0183.c - gpsmon support for NMEA 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. */ #include #include #include #include /* for labs() */ #include #include #include #include "gpsd.h" #include "gpsmon.h" #include "gpsdclient.h" #include "strfuncs.h" #ifdef NMEA_ENABLE extern const struct gps_type_t driver_nmea0183; static WINDOW *cookedwin, *nmeawin, *satwin, *gprmcwin, *gpggawin, *gpgsawin, *gpgstwin; static timestamp_t last_tick, tick_interval; static char sentences[NMEA_MAX * 2]; /***************************************************************************** * * NMEA0183 support * *****************************************************************************/ #define SENTENCELINE 1 /* index of sentences line in the NMEA window */ #define MAXSATS 12 /* max satellites we can display */ static bool nmea_initialize(void) { int i; cookedwin = derwin(devicewin, 3, 80, 0, 0); assert(cookedwin !=NULL); (void)wborder(cookedwin, 0, 0, 0, 0, 0, 0, 0, 0); (void)syncok(cookedwin, true); (void)wattrset(cookedwin, A_BOLD); (void)mvwaddstr(cookedwin, 1, 1, "Time: "); (void)mvwaddstr(cookedwin, 1, 32, "Lat: "); (void)mvwaddstr(cookedwin, 1, 55, "Lon: "); (void)mvwaddstr(cookedwin, 2, 34, " Cooked TPV "); (void)wattrset(cookedwin, A_NORMAL); nmeawin = derwin(devicewin, 3, 80, 3, 0); assert(nmeawin !=NULL); (void)wborder(nmeawin, 0, 0, 0, 0, 0, 0, 0, 0); (void)syncok(nmeawin, true); (void)wattrset(nmeawin, A_BOLD); (void)mvwaddstr(nmeawin, 2, 34, " Sentences "); (void)wattrset(nmeawin, A_NORMAL); satwin = derwin(devicewin, MAXSATS + 3, 20, 6, 0); assert(satwin !=NULL); (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, 14, 7, " GSV "); (void)wattrset(satwin, A_NORMAL); gprmcwin = derwin(devicewin, 9, 30, 6, 20); assert(gprmcwin !=NULL); (void)wborder(gprmcwin, 0, 0, 0, 0, 0, 0, 0, 0), (void)syncok(gprmcwin, true); (void)wattrset(gprmcwin, A_BOLD); (void)mvwprintw(gprmcwin, 1, 1, "Time: "); (void)mvwprintw(gprmcwin, 2, 1, "Latitude: "); (void)mvwprintw(gprmcwin, 3, 1, "Longitude: "); (void)mvwprintw(gprmcwin, 4, 1, "Speed: "); (void)mvwprintw(gprmcwin, 5, 1, "Course: "); (void)mvwprintw(gprmcwin, 6, 1, "Status: FAA: "); (void)mvwprintw(gprmcwin, 7, 1, "MagVar: "); (void)mvwprintw(gprmcwin, 8, 12, " RMC "); (void)wattrset(gprmcwin, A_NORMAL); gpgsawin = derwin(devicewin, 6, 30, 15, 20); assert(gpgsawin !=NULL); (void)wborder(gpgsawin, 0, 0, 0, 0, 0, 0, 0, 0); (void)syncok(gpgsawin, true); (void)wattrset(gpgsawin, A_BOLD); #define MODE_LINE 1 (void)mvwprintw(gpgsawin, MODE_LINE, 1, "Mode: "); #define SATS_LINE 1 #define SATS_COL 10 (void)mvwprintw(gpgsawin, SATS_LINE, SATS_COL, "Sats: "); #define DOP_LINE 2 (void)mvwprintw(gpgsawin, DOP_LINE, 1, "DOP: H= V= P="); #define TOFF_LINE 3 (void)mvwprintw(gpgsawin, TOFF_LINE, 1, "TOFF: "); #ifndef PPS_ENABLE (void)mvwaddstr(gpgsawin, TOFF_LINE, 7, "N/A"); #endif /* PPS_ENABLE */ #define PPS_LINE 4 (void)mvwprintw(gpgsawin, PPS_LINE, 1, "PPS: "); #ifndef PPS_ENABLE (void)mvwaddstr(gpgsawin, PPS_LINE, 6, "N/A"); #endif /* PPS_ENABLE */ (void)mvwprintw(gpgsawin, 5, 9, " GSA + PPS "); (void)wattrset(gpgsawin, A_NORMAL); gpggawin = derwin(devicewin, 9, 30, 6, 50); assert(gpggawin !=NULL); (void)wborder(gpggawin, 0, 0, 0, 0, 0, 0, 0, 0); (void)syncok(gpggawin, true); (void)wattrset(gpggawin, A_BOLD); (void)mvwprintw(gpggawin, 1, 1, "Time: "); (void)mvwprintw(gpggawin, 2, 1, "Latitude: "); (void)mvwprintw(gpggawin, 3, 1, "Longitude: "); (void)mvwprintw(gpggawin, 4, 1, "Altitude: "); (void)mvwprintw(gpggawin, 5, 1, "Quality: Sats: "); (void)mvwprintw(gpggawin, 6, 1, "HDOP: "); (void)mvwprintw(gpggawin, 7, 1, "Geoid: "); (void)mvwprintw(gpggawin, 8, 12, " GGA "); (void)wattrset(gpggawin, A_NORMAL); gpgstwin = derwin(devicewin, 6, 30, 15, 50); assert(gpgstwin !=NULL); (void)wborder(gpgstwin, 0, 0, 0, 0, 0, 0, 0, 0); (void)syncok(gpgstwin, true); (void)wattrset(gpgstwin, A_BOLD); (void)mvwprintw(gpgstwin, 1, 1, "UTC: "); (void)mvwprintw(gpgstwin, 1, 16, "RMS: "); (void)mvwprintw(gpgstwin, 2, 1, "MAJ: "); (void)mvwprintw(gpgstwin, 2, 16, "MIN: "); (void)mvwprintw(gpgstwin, 3, 1, "ORI: "); (void)mvwprintw(gpgstwin, 3, 16, "LAT: "); (void)mvwprintw(gpgstwin, 4, 1, "LON: "); (void)mvwprintw(gpgstwin, 4, 16, "ALT: "); (void)mvwprintw(gpgstwin, 5, 12, " GST "); (void)wattrset(gpgstwin, A_NORMAL); last_tick = timestamp(); sentences[0] = '\0'; return (nmeawin != NULL); } static void cooked_pvt(void) { char scr[128]; 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, "%-24s", scr); 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)), (session.gpsdata.fix.latitude < 0) ? 'S' : 'N'); } else (void)snprintf(scr, sizeof(scr), "n/a"); (void)mvwprintw(cookedwin, 1, 37, "%-17s", scr); 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)), (session.gpsdata.fix.longitude < 0) ? 'W' : 'E'); } else (void)snprintf(scr, sizeof(scr), "n/a"); (void)mvwprintw(cookedwin, 1, 60, "%-17s", scr); } static void monitor_satlist(WINDOW *win, int y, int x) /* display as much as we can of a satlist in a specified window */ { int ymax, xmax; char scr[128]; int i; assert(win != NULL); (void)wmove(win, y, x); (void)wclrtoeol(win); scr[0] = '\0'; for (i = 0; i < MAXCHANNELS; i++) { if (session.gpsdata.skyview[i].used) str_appendf(scr, sizeof(scr), "%d ", session.gpsdata.skyview[i].PRN); } getmaxyx(win, ymax, xmax); assert(ymax != 0); /* suppress compiler warning */ (void)mvwaddnstr(win, y, x, scr, xmax - 2 - x); if (strlen(scr) >= (size_t) (xmax - 2)) { (void)mvwaddch(win, y, xmax - 2 - x, (chtype) '.'); (void)mvwaddch(win, y, xmax - 3 - x, (chtype) '.'); (void)mvwaddch(win, y, xmax - 4 - x, (chtype) '.'); } monitor_fixframe(win); } static void nmea_update(void) { char **fields; assert(cookedwin != NULL); assert(nmeawin != NULL); assert(gpgsawin != NULL); assert(gpggawin != NULL); assert(gprmcwin != NULL); assert(gpgstwin != NULL); /* can be NULL if packet was overlong */ fields = session.nmea.field; if (session.lexer.outbuffer[0] == (unsigned char)'$' && fields != NULL && fields[0] != NULL) { int ymax, xmax; timestamp_t now; getmaxyx(nmeawin, ymax, xmax); assert(ymax > 0); if (strstr(sentences, fields[0]) == NULL) { char *s_end = sentences + strlen(sentences); if ((int)(strlen(sentences) + strlen(fields[0])) < xmax - 2) { *s_end++ = ' '; (void)strlcpy(s_end, fields[0], NMEA_MAX); } else { *--s_end = '.'; *--s_end = '.'; *--s_end = '.'; } (void)mvwaddstr(nmeawin, SENTENCELINE, 1, sentences); } /* * If the interval between this and last update is * the longest we've seen yet, boldify the corresponding * tag. */ now = timestamp(); if (now > last_tick && (now - last_tick) > tick_interval) { char *findme = strstr(sentences, fields[0]); tick_interval = now - last_tick; if (findme != NULL) { (void)mvwchgat(nmeawin, SENTENCELINE, 1, xmax - 13, A_NORMAL, 0, NULL); (void)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) { int i; 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)wprintw(satwin, " %3d %3d%3d %3.0f", session.gpsdata.skyview[i].PRN, session.gpsdata.skyview[i].azimuth, session.gpsdata.skyview[i].elevation, session.gpsdata.skyview[i].ss); } /* add overflow mark to the display */ if (nsats <= MAXSATS) (void)mvwaddch(satwin, MAXSATS + 2, 18, ACS_HLINE); else (void)mvwaddch(satwin, MAXSATS + 2, 18, ACS_DARROW); } 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]); (void)mvwprintw(gprmcwin, 3, 12, "%12s %s", fields[5], fields[6]); (void)mvwaddstr(gprmcwin, 4, 12, fields[7]); (void)mvwaddstr(gprmcwin, 5, 12, fields[8]); /* 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]); cooked_pvt(); /* cooked version of TPV */ } if (strcmp(fields[0], "GPGSA") == 0 || strcmp(fields[0], "GNGSA") == 0 || strcmp(fields[0], "GLGSA") == 0) { (void)mvwprintw(gpgsawin, MODE_LINE, 7, "%1s%s", fields[1], fields[2]); monitor_satlist(gpgsawin, SATS_LINE, SATS_COL+6); (void)mvwprintw(gpgsawin, DOP_LINE, 8, "%-5s", fields[16]); (void)mvwprintw(gpgsawin, DOP_LINE, 16, "%-5s", fields[17]); (void)mvwprintw(gpgsawin, DOP_LINE, 24, "%-5s", fields[15]); monitor_fixframe(gpgsawin); } #ifdef NTP_ENABLE toff_update(gpgsawin, TOFF_LINE, 7); #endif /* NTP_ENABLE */ 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]); (void)mvwprintw(gpggawin, 4, 12, "%-17s", fields[9]); (void)mvwprintw(gpggawin, 5, 12, "%1.1s", fields[6]); (void)mvwprintw(gpggawin, 5, 22, "%2.2s", fields[7]); (void)mvwprintw(gpggawin, 6, 12, "%-5.5s", fields[8]); (void)mvwprintw(gpggawin, 7, 12, "%-5.5s", fields[11]); } if (strcmp(fields[0], "GPGST") == 0) { (void)mvwprintw(gpgstwin, 1, 6, "%-10s", fields[1]); (void)mvwprintw(gpgstwin, 1, 21, "%-8s", fields[2]); (void)mvwprintw(gpgstwin, 2, 6, "%-10s", fields[3]); (void)mvwprintw(gpgstwin, 2, 21, "%-8s", fields[4]); (void)mvwprintw(gpgstwin, 3, 6, "%-10s", fields[5]); (void)mvwprintw(gpgstwin, 3, 21, "%-8s", fields[6]); (void)mvwprintw(gpgstwin, 4, 6, "%-10s", fields[7]); (void)mvwprintw(gpgstwin, 4, 21, "%-8s", fields[8]); } } #ifdef PPS_ENABLE pps_update(gpgsawin, PPS_LINE, 6); #endif /* PPS_ENABLE */ } #undef SENTENCELINE static void nmea_wrap(void) { (void)delwin(nmeawin); (void)delwin(gpgsawin); (void)delwin(gpggawin); (void)delwin(gprmcwin); } const struct monitor_object_t nmea_mmt = { .initialize = nmea_initialize, .update = nmea_update, .command = NULL, .wrap = nmea_wrap, .min_y = 21,.min_x = 80, .driver = &driver_nmea0183, }; /***************************************************************************** * * Extended NMEA support * *****************************************************************************/ #if defined(CONTROLSEND_ENABLE) && defined(ASHTECH_ENABLE) 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_end(ap); (void)monitor_control_send((unsigned char *)buf, strlen(buf)); } #endif /* defined(CONTROLSEND_ENABLE) && defined(ASHTECH_ENABLE) */ /* * Yes, it's OK for most of these to be clones of the generic NMEA monitor * object except for the pointer to the GPSD driver. That pointer makes * a difference, as it will automatically enable stuff like speed-switcher * and mode-switcher commands. It's really only necessary to write a * separate monitor object if you want to change the device-window * display or implement device-specific commands. */ #if defined(GARMIN_ENABLE) && defined(NMEA_ENABLE) extern const struct gps_type_t driver_garmin; const struct monitor_object_t garmin_mmt = { .initialize = nmea_initialize, .update = nmea_update, .command = NULL, .wrap = nmea_wrap, .min_y = 21,.min_x = 80, .driver = &driver_garmin, }; #endif /* GARMIN_ENABLE && NMEA_ENABLE */ #ifdef ASHTECH_ENABLE extern const struct gps_type_t driver_ashtech; #define ASHTECH_SPEED_9600 5 #define ASHTECH_SPEED_57600 8 #ifdef CONTROLSEND_ENABLE 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 */ monitor_nmea_send("$PASHS,NME,ALL,B,OFF"); monitor_nmea_send("$PASHS,NME,GGA,A,ON"); monitor_nmea_send("$PASHS,NME,GSA,A,ON"); monitor_nmea_send("$PASHS,NME,GSV,A,ON"); monitor_nmea_send("$PASHS,NME,RMC,A,ON"); 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 */ break; 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"); monitor_nmea_send("$PASHS,NME,GSV,A,ON"); monitor_nmea_send("$PASHS,NME,RMC,A,ON"); 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 */ monitor_nmea_send("$PASHS,NME,POS,A,ON"); /* Ashtech TPV 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 TPV solution */ monitor_nmea_send("$PASHS,NME,SNV,A,ON,10"); /* Almanac data */ monitor_nmea_send("$PASHS,NME,XMG,A,ON"); /* exception messages */ break; default: return COMMAND_UNKNOWN; } return COMMAND_UNKNOWN; } #endif /* CONTROLSEND_ENABLE */ const struct monitor_object_t ashtech_mmt = { .initialize = nmea_initialize, .update = nmea_update, #ifdef CONTROLSEND_ENABLE .command = ashtech_command, #else .command = NULL, #endif /* CONTROLSEND_ENABLE */ .wrap = nmea_wrap, .min_y = 21,.min_x = 80, .driver = &driver_ashtech, }; #endif /* ASHTECH_ENABLE */ #ifdef FV18_ENABLE extern const struct gps_type_t driver_fv18; const struct monitor_object_t fv18_mmt = { .initialize = nmea_initialize, .update = nmea_update, .command = NULL, .wrap = nmea_wrap, .min_y = 21,.min_x = 80, .driver = &driver_fv18, }; #endif /* FV18_ENABLE */ #ifdef GPSCLOCK_ENABLE extern const struct gps_type_t driver_gpsclock; const struct monitor_object_t gpsclock_mmt = { .initialize = nmea_initialize, .update = nmea_update, .command = NULL, .wrap = nmea_wrap, .min_y = 21,.min_x = 80, .driver = &driver_gpsclock, }; #endif /* GPSCLOCK_ENABLE */ #ifdef MTK3301_ENABLE extern const struct gps_type_t driver_mtk3301; const struct monitor_object_t mtk3301_mmt = { .initialize = nmea_initialize, .update = nmea_update, .command = NULL, .wrap = nmea_wrap, .min_y = 21,.min_x = 80, .driver = &driver_mtk3301, }; #endif /* MTK3301_ENABLE */ #ifdef AIVDM_ENABLE extern const struct gps_type_t driver_aivdm; const struct monitor_object_t aivdm_mmt = { .initialize = nmea_initialize, .update = nmea_update, .command = NULL, .wrap = nmea_wrap, .min_y = 21,.min_x = 80, .driver = &driver_aivdm, }; #endif /* AIVDM_ENABLE */ #endif /* NMEA_ENABLE */ gpsd-3.15/monitor_oncore.c0000664000175000017500000003115412506317042013751 0ustar esresr/* * OnCore object for the GPS packet monitor. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include "gpsd.h" #include "bits.h" #include "gpsmon.h" #if defined(ONCORE_ENABLE) && defined(BINARY_ENABLE) extern const struct gps_type_t driver_oncore; static WINDOW *Ea1win, *Eawin, *Bbwin, *Enwin, *Bowin, *Aywin, *Aswin, *Atwin; static unsigned char EaSVlines[8]; static const char *antenna[] = { "OK (conn)", "OC (short)", "UC (open)", "OU (short)" }; static const char *sv_mode[] = { "srch", "acq", "AGCs", "pacq", "bits", "msgs", "satT", "epha", "avl" }; static const char *pps_ctrl[] = { "off", "on", "on if >= 1 SV", "on if TRAIM ok" }; static const char *pps_sync[] = { "UTC", "GPS" }; static const char *traim_sol[] = { "OK", "ALARM", "UNKNOWN" }; static const char *traim_status[] = { "detect & isolate", "detect", "insufficient" }; static const char *pos_hold_mode[] = { "off", "on", "survey" }; #define ONCTYPE(id2,id3) ((((unsigned int)id2)<<8)|(id3)) #define MAXTRACKSATS 8 /* the most satellites being tracked */ #define MAXVISSATS 12 /* the most satellites with known az/el */ static bool oncore_initialize(void) { unsigned int i; 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); if (Ea1win == NULL || Eawin == NULL || Bbwin == NULL || Enwin == NULL || Bowin == NULL || Aswin == NULL || Atwin == NULL || Aywin == NULL) return false; (void)syncok(Ea1win, true); (void)syncok(Eawin, true); (void)syncok(Bbwin, true); (void)syncok(Enwin, true); (void)syncok(Bowin, true); (void)syncok(Aywin, true); (void)syncok(Aswin, true); (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)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)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)wattrset(Eawin, A_NORMAL); (void)wborder(Bbwin, 0, 0, 0, 0, 0, 0, 0, 0), (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)mvwprintw(Enwin, 1, 1, "Time RAIM: "); (void)mvwprintw(Enwin, 2, 1, "Alarm limit:"); (void)mvwprintw(Enwin, 3, 1, "PPS ctrl:"); (void)mvwprintw(Enwin, 4, 1, "Pulse:"); (void)mvwprintw(Enwin, 5, 1, "PPS sync:"); (void)mvwprintw(Enwin, 6, 1, "TRAIM sol stat:"); (void)mvwprintw(Enwin, 7, 1, "Status:"); (void)mvwprintw(Enwin, 8, 1, "Time sol sigma:"); (void)mvwprintw(Enwin, 9, 4, " @@En "); (void)wattrset(Enwin, A_NORMAL); (void)wborder(Bowin, 0, 0, 0, 0, 0, 0, 0, 0), (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)mvwprintw(Aywin, 1, 1, "PPS offset:"); #ifndef PPS_ENABLE (void)mvwaddstr(Aywin, 1, 13, "N/A"); #endif /* PPS_ENABLE */ (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)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)mvwprintw(Aswin, 1, 1, "Lat:"); (void)mvwprintw(Aswin, 2, 1, "Lon:"); (void)mvwprintw(Aswin, 3, 1, "Alt:"); (void)mvwprintw(Aswin, 4, 4, " @@As "); (void)wattrset(Aswin, A_NORMAL); memset(EaSVlines, 0, sizeof(EaSVlines)); return true; } static void oncore_update(void) { unsigned int i, off; unsigned char *buf; unsigned int type; assert(Eawin != NULL); buf = session.lexer.outbuffer; type = ONCTYPE(buf[2], buf[3]); switch (type) { 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)getbeu16(buf, 6); hour = (unsigned char)getub(buf, 8); min = (unsigned char)getub(buf, 9); sec = (unsigned char)getub(buf, 10); nsec = (unsigned int)getbeu32(buf, 11); lat = (double)getbes32(buf, 15) / 3600000.0; lon = (double)getbes32(buf, 19) / 3600000.0; alt = (double)getbes32(buf, 23) / 100.0; speed = (float)(getbeu16(buf, 31) / 100.0); track = (float)(getbeu16(buf, 33) / 10.0); dop = (float)(getbeu16(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), lon < 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); (void)snprintf(statusbuf, sizeof(statusbuf), "%s%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 " : "", (dopt & 0x20) ? "survey " : ""); (void)mvwprintw(Ea1win, 3, 24, "%-37s", statusbuf); (void)mvwprintw(Ea1win, 2, 10, "%-10s", antenna[dopt >> 6]); (void)mvwprintw(Ea1win, 2, 27, "%s %4.1f", (dopt & 1) ? "hdop" : "pdop", dop); (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); EaSVlines[i] = sv; if (mode <= (unsigned char)8) (void)wprintw(Eawin, " %4s", sv_mode[mode]); else (void)wprintw(Eawin, " -"); (void)wprintw(Eawin, " %3d", sn); (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 */ } 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++) { unsigned int j; off = 5 + 7 * i; sv = (unsigned char)getub(buf, off); for (j = 0; j < 8; j++) if (EaSVlines[j] == sv && !(Bblines_mask & (1 << (j + 2)))) { Bblines[i] = j + 2; Bblines_mask |= 1 << Bblines[i]; } } /* 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)getbes16(buf, off + 1); el = (int)getub(buf, off + 3); az = (int)getbeu16(buf, off + 4); health = (int)getub(buf, off + 6); (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++) if (!(Bblines_mask & (1 << i))) { (void)wmove(Bbwin, (int)i, 1); (void)wprintw(Bbwin, " "); } } 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)(getbeu16(buf, 6) / 10.); ctrl = (unsigned char)getub(buf, 8); pulse = (unsigned char)getub(buf, 19); sync = (unsigned char)getub(buf, 20); sol_stat = (unsigned char)getub(buf, 21); status = (unsigned char)getub(buf, 22); sigma = (float)(getbeu16(buf, 23)); (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 * 0.001); } monitor_log("En ="); break; case ONCTYPE('B', 'o'): { unsigned char utc_offset; 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); } monitor_log("Bo ="); break; case ONCTYPE('A', 'y'): { double pps_offset; /* note this is the GPS calc'ed offset * not a PPS offset gpsmon calculated */ pps_offset = (double)getbes32(buf, 4) / 1000000.0; (void)mvwprintw(Aywin, 2, 2, " %7.3f ms", pps_offset); } monitor_log("Ay ="); break; case ONCTYPE('A', 't'): { unsigned char mode; mode = (unsigned char)getub(buf, 4); (void)mvwprintw(Atwin, 2, 1, "%6s", pos_hold_mode[mode]); } monitor_log("At ="); break; case ONCTYPE('A', 's'): { double lat, lon, alt; lat = (double)getbes32(buf, 4) / 3600000.0; lon = (double)getbes32(buf, 8) / 3600000.0; alt = (double)getbes32(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), lon < 0 ? 'W' : lon > 0 ? 'E' : ' '); (void)mvwprintw(Aswin, 3, 7, "%8.2f m", alt); } monitor_log("As ="); break; default: monitor_log("%c%c =", buf[2], buf[3]); break; } } static int oncore_command(char line[]UNUSED) { return COMMAND_UNKNOWN; } static void oncore_wrap(void) { (void)delwin(Ea1win); (void)delwin(Eawin); (void)delwin(Bbwin); (void)delwin(Enwin); (void)delwin(Bowin); (void)delwin(Aywin); (void)delwin(Atwin); (void)delwin(Aswin); } const struct monitor_object_t oncore_mmt = { .initialize = oncore_initialize, .update = oncore_update, .command = oncore_command, .wrap = oncore_wrap, .min_y = 20,.min_x = 80, /* size of the device window */ .driver = &driver_oncore, }; #endif /* defined(ONCORE_ENABLE) && defined(BINARY_ENABLE) */ gpsd-3.15/monitor_proto.c0000664000175000017500000001327312506330462013632 0ustar esresr/* * Prototype file for a gpsmon monitor object. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include "gpsd.h" #include "bits.h" #include "gpsmon.h" /* * Replace PROTO everywhere with the name of the GPSD driver describing * the device you want to support. * * gpsmon basically sits in a loop reading packets, using the same layer * as gpsd to dispatch on packet type to select an active device driver. * Your monitor object will become the handler for incoming packets whenever * the driver your object points at is selected. * * A comment following the method descriptions explains some available * helper functions. */ extern const struct gps_type_t driver__proto_; static bool PROTO_initialize(void) { /* * This function is called when your monitor object is activated. * * When you enter it, two windows will be accessible to you; (1) * 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 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 * method to send probes to the device, e.g. to elicit a response * telling you firmware rev levels or whatever. */ /* return false if the window allocation failed; gpsmon will abort */ return true; } static void PROTO_update(void) { /* * Called on each packet received. The packet will be accessible in * session.lexer.outbuffer and the length in session.lexer.outbuflen. * If the device is NMEA, session.driver.nmea.fields[] will contain the * array of unconverted field strings, including the tag in slot zero * but not including the checksum or trailing \r\n. * * Use this function to update devicewin. The packet will be echoed to * packetwin immediately after this function is called; you can use this * function to write a prefix on the line. * * Helpers available include (1) toff_update, for throwing the * TOFF data from the last time fix on the screen, and (2) * pps_update, for throwing the PPS data from the last 1PPS event on * the screen, and */ } static int PROTO_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. */ assert(strlen(line)); /* * 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 PROTO_wrap(void) { /* * Deinitialize any windows you created in PROTO_initialize. * This will be called when gpsmon switches drivers due to seeing * a new packet type. */ } /* * 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 PROTO_mmt = { .initialize = PROTO_initialize, .update = PROTO_update, .command = PROTO_command, .wrap = PROTO_wrap, .min_y = 23, .min_x = 80, /* size of the device window */ /* * The gpsd driver type for your device. gpsmon will use the mode_switcher * method for 'n', the speed_switcher for 's', and the control_send method * for 'c'. Additionally, the driver type name will be displayed before * the '>' command prompt in the top line of the display. */ .driver = &PROTO_binary, }; /* * 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'. */ gpsd-3.15/monitor_sirf.c0000664000175000017500000005157412506331407013440 0ustar esresr/* * SiRF object for the GPS packet monitor. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ #include #include #include #include #include /* for labs() */ #include #include #include #include "gpsd.h" #include "bits.h" #include "gpsmon.h" #include "strfuncs.h" #if defined(SIRF_ENABLE) && defined(BINARY_ENABLE) extern const struct gps_type_t driver_sirf; static WINDOW *mid2win, *mid4win, *mid6win, *mid7win, *mid9win, *mid13win; static WINDOW *mid19win, *mid27win; static bool dispmode = false, subframe_enabled = false, ppstime_enabled = false; static int leapseconds; static char *verbpat[] = { "#Time:", "@R Time:", "CSTD: New almanac for", "NOTICE: DOP Q Boost", "RTC not set", "numOfSVs = 0", "rtcaj tow ", NULL }; static char *dgpsvec[] = { "None", "SBAS", "Serial", "Beacon", "Software", }; /* check range of an unsigned quantity */ #define CHECK_RANGE(vec, i) ((i) < sizeof(vec)/sizeof(vec[0])) /***************************************************************************** * * SiRF packet-decoding routines * *****************************************************************************/ #define display (void)mvwprintw #define SIRF_CHANNELS 12 /* max channels allowed in SiRF format */ static bool sirf_initialize(void) { unsigned int i; mid2win = subwin(devicewin, 6, 80, 1, 0); mid4win = subwin(devicewin, SIRF_CHANNELS + 3, 30, 7, 0); mid6win = subwin(devicewin, 3, 50, 7, 30); mid7win = subwin(devicewin, 4, 50, 13, 30); mid9win = subwin(devicewin, 3, 50, 10, 30); mid13win = subwin(devicewin, 3, 50, 17, 30); mid19win = newwin(16, 50, 7, 30); mid27win = subwin(devicewin, 3, 50, 20, 30); if (mid2win == NULL || mid4win == NULL || mid6win == NULL || mid9win == NULL || mid13win == NULL || mid19win == NULL || mid27win == NULL) return false; (void)syncok(mid2win, true); (void)syncok(mid4win, true); (void)syncok(mid6win, true); (void)syncok(mid7win, true); (void)syncok(mid9win, true); (void)syncok(mid13win, true); (void)syncok(mid27win, true); (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, "Time: Leap: Heading: speed m/s"); (void)wmove(mid2win, 4, 1); (void)wprintw(mid2win, "Fix: HDOP: M1: M2: "); display(mid2win, 5, 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); display(mid4win, 1, 1, "Ch PRN Az El Stat C/N ? SF"); for (i = 0; i < SIRF_CHANNELS; i++) { display(mid4win, (int)(i + 2), 1, "%2d", i); } display(mid4win, 0, 1, " Measured Tracker "); 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); display(mid19win, 1, 1, "Alt. hold mode:"); display(mid19win, 2, 1, "Alt. hold source:"); display(mid19win, 3, 1, "Alt. source input:"); display(mid19win, 4, 1, "Degraded timeout:"); display(mid19win, 5, 1, "DR timeout:"); 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, 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); display(mid6win, 0, 1, " Firmware 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, 0, 1, " Clock Status "); display(mid7win, 1, 1, "SVs: "); display(mid7win, 1, 9, "Drift: "); display(mid7win, 1, 23, "Bias: "); display(mid7win, 2, 1, "GPS Time: "); display(mid7win, 2, 23, "PPS: "); #ifndef PPS_ENABLE (void)mvwaddstr(mid7win, 2, 40, "N/A"); #endif /* PPS_ENABLE */ 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, 0, 1, " CPU Throughput "); display(mid9win, 1, 1, "Max: "); display(mid9win, 1, 13, "Lat: "); display(mid9win, 1, 25, "Time: "); display(mid9win, 1, 39, "MS: "); display(mid9win, 2, 8, " Packet type 9 (0x09) "); (void)wattrset(mid9win, A_NORMAL); (void)wborder(mid13win, 0, 0, 0, 0, 0, 0, 0, 0), (void)wattrset(mid13win, A_BOLD); display(mid13win, 0, 1, " Visible List "); 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); display(mid27win, 0, 1, " DGPS Status "); display(mid27win, 2, 8, " Packet type 27 (0x1B) "); (void)wattrset(mid27win, A_NORMAL); #ifdef CONTROLSEND_ENABLE /* probe for version */ (void)monitor_control_send((unsigned char *)"\x84\x00", 2); #endif /* CONTROLSEND_ENABLE */ /* initialize the GPS context's time fields */ gpsd_time_init(session.context, time(NULL)); return true; } static void decode_ecef(double x, double y, double z, double vx, double vy, double vz) { 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; lambda = atan2(y, x); 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); if (heading < 0) heading += 2 * GPS_PI; /* North and East position fields */ (void)wattrset(mid2win, A_UNDERLINE); (void)wmove(mid2win, 1, 40); (void)wprintw(mid2win, "%9.5f %9.5f %9d", (double)(RAD_2_DEG * phi), (double)(RAD_2_DEG * lambda), (int)h); (void)mvwaddch(mid2win, 1, 49, ACS_DEGREE); (void)mvwaddch(mid2win, 1, 59, ACS_DEGREE); /* North and East velocity fields */ (void)wmove(mid2win, 2, 40); (void)wprintw(mid2win, "%9.1f %9.1f %9.1f", vnorth, veast, vup); /* heading and speed fields */ (void)wmove(mid2win, 3, 54); (void)wprintw(mid2win, "%5.1f %9.1f", (double)(RAD_2_DEG * heading), speed); (void)mvwaddch(mid2win, 3, 59, ACS_DEGREE); (void)wattrset(mid2win, A_NORMAL); } static void sirf_update(void) { int i, j, ch, sv; unsigned char *buf; size_t len; uint8_t dgps; char tbuf[JSON_DATE_MAX+1]; buf = session.lexer.outbuffer + 4; len = session.lexer.outbuflen - 8; switch (buf[0]) { case 0x02: /* Measured Navigation Data */ (void)wmove(mid2win, 1, 6); /* ECEF position */ (void)wprintw(mid2win, "%8d %8d %8d", getbes32(buf, 1), getbes32(buf, 5), getbes32(buf, 9)); (void)wmove(mid2win, 2, 6); /* ECEF velocity */ (void)wprintw(mid2win, "%8.1f %8.1f %8.1f", (double)getbes16(buf, 13) / 8, (double)getbes16(buf, 15) / 8, (double)getbes16(buf, 17) / 8); decode_ecef((double)getbes32(buf, 1), (double)getbes32(buf, 5), (double)getbes32(buf, 9), (double)getbes16(buf, 13) / 8, (double)getbes16(buf, 15) / 8, (double)getbes16(buf, 17) / 8); /* line 3 */ (void)wmove(mid2win, 3, 7); (void)wprintw(mid2win, "%-24s", unix_to_iso8601(session.gpsdata.fix.time, tbuf, sizeof(tbuf)) ); (void)wmove(mid2win, 3, 38); (void)wattrset(mid2win, A_UNDERLINE); if (ppstime_enabled) (void)wprintw(mid2win, "%02d", leapseconds); else (void)wprintw(mid2win, "??"); (void)wattrset(mid2win, A_NORMAL); /* line 4 */ /* HDOP */ (void)wmove(mid2win, 4, 59); (void)wprintw(mid2win, "%4.1f", (double)getub(buf, 20) / 5); /* Mode 1 */ (void)wmove(mid2win, 4, 69); (void)wprintw(mid2win, "%02x", getub(buf, 19)); /* Mode 2 */ (void)wmove(mid2win, 4, 77); (void)wprintw(mid2win, "%02x", getub(buf, 21)); /* SVs in fix */ (void)wmove(mid2win, 4, 6); (void)wprintw(mid2win, "%2d = ", (int)getub(buf, 28)); /* SV list */ (void)wmove(mid2win, 4, 10); for (i = 0; i < (int)getub(buf, 28); i++) (void)wprintw(mid2win, " %2d", (int)getub(buf, 29 + i)); monitor_log("MND 0x02="); break; case 0x04: /* Measured Tracking Data */ ch = (int)getub(buf, 7); for (i = 0; i < ch; i++) { int az, el, state, off; double cn; off = 8 + 15 * i; (void)wmove(mid4win, i + 2, 3); sv = (int)getub(buf, off); az = (int)getub(buf, off + 1) * 3 / 2; el = (int)getub(buf, off + 2) / 2; state = (int)getbeu16(buf, off + 3); cn = 0; for (j = 0; j < 10; j++) cn += (int)getub(buf, off + 5 + j); cn /= 10; (void)wprintw(mid4win, " %3d %3d %2d %04x %4.1f %c", sv, az, el, state, cn, state == 0xbf ? 'T' : ' '); } monitor_log("MTD 0x04="); break; #ifdef __UNUSED__ case 0x05: /* raw track data */ for (off = 1; off < len; off += 51) { ch = getbeu32(buf, off); (void)wmove(mid4win, ch + 2, 19); cn = 0; for (j = 0; j < 10; j++) cn += getub(buf, off + 34 + j); printw("%5.1f", (double)cn / 10); printw("%9d%3d%5d", getbeu32(buf, off + 8), (int)getbeu16(buf, off + 12), (int)getbeu16(buf, off + 14)); printw("%8.5f %10.5f", (double)getbeu32(buf, off + 16) / 65536, (double)getbeu32(buf, off + 20) / 1024); } monitor_log("RTD 0x05="); break; #endif /* __UNUSED */ case 0x06: /* firmware version */ display(mid6win, 1, 1, "%s", buf + 1); monitor_log("FV 0x06="); break; case 0x07: /* Response - Clock Status Data */ display(mid7win, 1, 5, "%2d", getub(buf, 7)); /* SVs */ display(mid7win, 1, 16, "%lu", getbeu32(buf, 8)); /* Clock ppstimes */ display(mid7win, 1, 29, "%lu", getbeu32(buf, 12)); /* Clock Bias */ display(mid7win, 2, 11, "%lu", getbeu32(buf, 16)); /* Estimated Time */ monitor_log("CSD 0x07="); break; case 0x08: /* 50 BPS data */ ch = (int)getub(buf, 1); sv = (int)getub(buf, 2); display(mid4win, ch + 2, 27, "%2d", sv); subframe_enabled = true; monitor_log("50B 0x08="); break; case 0x09: /* Throughput */ display(mid9win, 1, 6, "%.3f", (double)getbeu16(buf, 1) / 186); /*SegStatMax */ display(mid9win, 1, 18, "%.3f", (double)getbeu16(buf, 3) / 186); /*SegStatLat */ display(mid9win, 1, 31, "%.3f", (double)getbeu16(buf, 5) / 186); /*SegStatTime */ display(mid9win, 1, 42, "%3d", (int)getbeu16(buf, 7)); /* Last Millisecond */ monitor_log("THR 0x09="); break; case 0x0b: /* Command Acknowledgement */ monitor_log("ACK 0x0b="); break; case 0x0c: /* Command NAcknowledgement */ monitor_log("NAK 0x0c="); break; case 0x0d: /* Visible List */ display(mid13win, 1, 1, "%02d = ", getub(buf, 1)); (void)wmove(mid13win, 1, 5); for (i = 0; i < (int)getub(buf, 1); i++) (void)wprintw(mid13win, " %d", getub(buf, 2 + 5 * i)); monitor_log("VL 0x0d="); break; 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)getbeu16(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)getbeu16(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", getbeu32(buf, 35)); /* LP On Time */ display(mid19win, 3, 42, "%d", getbeu32(buf, 39)); /* LP Interval */ display(mid19win, 4, 42, "%c", YESNO(43)); /* User Tasks enabled */ display(mid19win, 5, 42, "%d", getbeu32(buf, 44)); /* User Task Interval */ display(mid19win, 6, 42, "%c", YESNO(48)); /* LP Power Cycling Enabled */ display(mid19win, 7, 42, "%d", getbeu32(buf, 49)); /* LP Max Acq Search Time */ display(mid19win, 8, 42, "%d", getbeu32(buf, 53)); /* LP Max Off Time */ display(mid19win, 9, 42, "%c", YESNO(57)); /* APM Enabled */ display(mid19win, 10, 42, "%d", (int)getbeu16(buf, 58)); /* # of fixes */ display(mid19win, 11, 42, "%d", (int)getbeu16(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 monitor_log("NP 0x13="); break; case 0x1b: /****************************************************************** Not actually documented in any published materials before the 1.6 version of the SiRF binary protocol manual. Here is what Chris Kuethe got from the SiRF folks, (plus some corrections from the GpsPaSsion forums): Start of message ---------------- Message ID 1 byte 27 Correction Source 1 byte 0=None, 1=SBAS, 2=Serial, 3=Beacon, 4=Software total: 2 bytes Middle part of message varies if using beacon or other: ------------------------------------------------------- If Beacon: Receiver Freq Hz 4 bytes Bit rate BPS 1 byte Status bit map 1 byte 01=Signal Valid, 02=Auto frequency detect 04=Auto bit rate detect Signal Magnitude 4 bytes Note: in internal units Signal Strength dB 2 bytes derived from Signal Magnitude SNR dB 2 bytes total: 14 bytes If Not Beacon: Correction Age[12] 1 byte x 12 Age in seconds in same order as follows Reserved 2 bytes total: 14 bytes End of Message -------------- Repeated 12 times (pad with 0 if less than 12 SV corrections): SVID 1 byte Correction (cm) 2 bytes (signed short) total 3 x 12 = 36 bytes ******************************************************************/ dgps = getub(buf, 1); display(mid27win, 1, 1, "%8s = ", (CHECK_RANGE(dgpsvec, dgps) ? dgpsvec[dgps] : "???")); (void)wmove(mid27win, 1, 11); for (ch = 0; ch < SIRF_CHANNELS; ch++) if (getub(buf, 16 + 3 * ch) != '\0') (void)wprintw(mid27win, " %d", getub(buf, 16 + 3 * ch)); monitor_log("DST 0x1b="); break; case 0x1c: /* NL Measurement Data */ case 0x1d: /* NL DGPS Data */ case 0x1e: /* NL SV State Data */ case 0x1f: /* NL Initialized Data */ subframe_enabled = true; monitor_log("NL 0x%02x=", buf[0]); break; case 0x29: /* Geodetic Navigation Data */ monitor_log("GND 0x29="); break; case 0x32: /* SBAS Parameters */ monitor_log("SBP 0x32="); break; case 0x34: /* PPS Time */ ppstime_enabled = true; leapseconds = (int)getbeu16(buf, 8); monitor_log("PPS 0x34="); break; case 0xff: /* Development Data */ while (len > 0 && buf[len - 1] == '\n') len--; while (len > 0 && buf[len - 1] == ' ') len--; buf[len] = '\0'; j = 1; for (i = 0; verbpat[i] != NULL; i++) if (str_starts_with((char *)(buf + 1), verbpat[i])) { j = 0; break; } if (j != 0) monitor_log("%s\n", buf + 1); monitor_log("DD 0xff="); break; default: monitor_log("UNK 0x%02x=", buf[0]); break; } #ifdef CONTROLSEND_ENABLE /* elicit navigation parameters */ if (dispmode && (time(NULL) % 10 == 0)) { (void)monitor_control_send((unsigned char *)"\x98\x00", 2); } #endif /* CONTROLSEND_ENABLE */ /* clear the 50bps data field every 6 seconds */ if (subframe_enabled && (time(NULL) % 6 == 0)) { for (ch = 0; ch < SIRF_CHANNELS; ch++) display(mid4win, ch + 2, 27, " "); } if (dispmode) { (void)touchwin(mid19win); (void)wnoutrefresh(mid19win); } #ifdef PPS_ENABLE pps_update(mid7win, 2, 32); #endif /* PPS_ENABLE */ } #ifdef CONTROLSEND_ENABLE static int sirf_command(char line[]) { unsigned char buf[BUFSIZ]; int v; switch (line[0]) { case 'A': /* toggle 50bps subframe data */ (void)memset(buf, '\0', sizeof(buf)); putbyte(buf, 0, 0x80); putbyte(buf, 23, 0x0c); putbyte(buf, 24, subframe_enabled ? 0x00 : 0x10); (void)monitor_control_send(buf, 25); /* * The subframe_enabled off because we're counting on receipt of * a subframe packet to turn it on if the command succeeds. */ subframe_enabled = false; return COMMAND_MATCH; case 'M': /* static navigation */ 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); if (v > 30) return COMMAND_MATCH; putbyte(buf, 0, 0xa6); putbyte(buf, 1, 0); putbyte(buf, 2, 4); /* satellite picture */ putbyte(buf, 3, v); putbyte(buf, 4, 0); putbyte(buf, 5, 0); putbyte(buf, 6, 0); putbyte(buf, 7, 0); (void)monitor_control_send(buf, 8); return COMMAND_MATCH; case 'P': /* poll navigation params */ dispmode = !dispmode; if (dispmode) { (void)syncok(mid6win, false); (void)syncok(mid7win, false); (void)syncok(mid9win, false); (void)syncok(mid13win, false); (void)syncok(mid27win, false); } else { (void)syncok(mid6win, true); (void)wsyncup(mid6win); (void)syncok(mid7win, true); (void)wsyncup(mid7win); (void)syncok(mid9win, true); (void)wsyncup(mid9win); (void)syncok(mid13win, true); (void)wsyncup(mid13win); (void)syncok(mid27win, true); (void)wsyncup(mid27win); } return COMMAND_MATCH; } return COMMAND_UNKNOWN; /* no match */ } #endif /* CONTROLSEND_ENABLE */ static void sirf_wrap(void) { (void)delwin(mid2win); (void)delwin(mid4win); (void)delwin(mid6win); (void)delwin(mid7win); (void)delwin(mid9win); (void)delwin(mid13win); (void)delwin(mid19win); (void)delwin(mid27win); } const struct monitor_object_t sirf_mmt = { .initialize = sirf_initialize, .update = sirf_update, #ifdef CONTROLSEND_ENABLE .command = sirf_command, #else .command = NULL, #endif /* CONTROLSEND_ENABLE */ .wrap = sirf_wrap, .min_y = 22,.min_x = 80, .driver = &driver_sirf, }; #endif /* defined(SIRF_ENABLE) && defined(BINARY_ENABLE) */ /* sirfmon.c ends here */ gpsd-3.15/monitor_superstar2.c0000664000175000017500000000463312506325237014605 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include "gpsd.h" #include "bits.h" #include "gpsmon.h" #ifdef SUPERSTAR2_ENABLE #include "driver_superstar2.h" extern const struct gps_type_t driver_superstar2; static WINDOW *satwin; static bool superstar2_initialize(void) { int i; /* "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); 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; if ((porn = (unsigned char)getub(buf, off) & 0x1f) == 0) porn = ((unsigned char)getub(buf, off + 3) >> 1) + 87; ss = (unsigned char)getub(buf, off + 4); el = (char)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); (void)wprintw(satwin, "%3u %3d %2d %02d %02x %c", porn, az, el, ss, fl, ((fl & 0x60) == 0x60) ? 'Y' : ' '); } (void)wnoutrefresh(satwin); return; } static void superstar2_update(void) { unsigned char *buf; size_t len; unsigned char type; buf = session.lexer.outbuffer; len = session.lexer.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) { return COMMAND_UNKNOWN; } static void superstar2_wrap(void) { } const struct monitor_object_t superstar2_mmt = { .initialize = superstar2_initialize, .update = superstar2_update, .command = superstar2_command, .wrap = superstar2_wrap, .min_y = 23,.min_x = 80, /* size of the device window */ .driver = &driver_superstar2, }; #endif gpsd-3.15/monitor_tnt.c0000664000175000017500000001062712506317042013273 0ustar esresr/* * 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 #include "gpsd.h" #include "gpsmon.h" #ifdef TNT_ENABLE extern const struct gps_type_t driver_trueNorth; static WINDOW *thtmwin; static bool tnt_initialize(void) { thtmwin = derwin(devicewin, 6, 80, 0, 0); assert(thtmwin != NULL); (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); return true; } static void tnt_update(void) { /* * We have to do our own field parsing because the way this * gets called, nmea_parse() is never called on the sentence. */ (void)nmea_parse((char *)session.lexer.outbuffer, &session); (void)mvwaddstr(thtmwin, 1, 19, session.nmea.field[1]); (void)mvwaddstr(thtmwin, 2, 19, session.nmea.field[3]); (void)mvwaddstr(thtmwin, 3, 19, session.nmea.field[5]); (void)mvwaddstr(thtmwin, 4, 19, session.nmea.field[7]); (void)mvwaddstr(thtmwin, 1, 61, session.nmea.field[2]); (void)mvwaddstr(thtmwin, 2, 61, session.nmea.field[4]); (void)mvwaddstr(thtmwin, 3, 61, session.nmea.field[6]); (void)mvwaddstr(thtmwin, 4, 61, session.nmea.field[8]); } static int tnt_command(char line[] UNUSED) { /* * 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 = &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'. */ gpsd-3.15/monitor_ubx.c0000664000175000017500000002040012520742615013256 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include /* for labs() */ #include #include "gpsd.h" #include "bits.h" #include "gpsmon.h" #ifdef UBLOX_ENABLE #include "driver_ubx.h" extern const struct gps_type_t driver_ubx; static WINDOW *satwin, *navsolwin, *dopwin, *ppswin; #define display (void)mvwprintw static bool ubx_initialize(void) { int i; /* "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); display(satwin, 1, 1, "Ch PRN Az El S/N Flag U"); for (i = 0; i < 16; i++) display(satwin, (int)(i + 2), 1, "%2d", i); display(satwin, 18, 7, " NAV_SVINFO "); (void)wattrset(satwin, A_NORMAL); /* "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:"); (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); if ((ppswin = derwin(devicewin, 3, 51, 16, 28)) == NULL) return false; (void)wborder(ppswin, 0, 0, 0, 0, 0, 0, 0, 0); (void)wattrset(ppswin, A_BOLD); #define TOFF_LINE 1 #define TOFF_COLUMN 1 (void)mvwaddstr(ppswin, TOFF_LINE, TOFF_COLUMN, "TOFF: "); #ifndef PPS_ENABLE (void)mvwaddstr(ppswin, TOFF_LINE, TOFF_COLUMN + 10, "N/A"); #endif /* PPS_ENABLE */ #define PPS_LINE 1 #define PPS_COLUMN 26 (void)mvwaddstr(ppswin, PPS_LINE, PPS_COLUMN, "PPS: "); #ifndef PPS_ENABLE (void)mvwaddstr(ppswin, PPS_LINE, PPS_COLUMN + 10, "N/A"); #endif /* PPS_ENABLE */ (void)wattrset(ppswin, A_NORMAL); 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)getleu16(buf, off + 2); ss = (unsigned char)getub(buf, off + 4); el = (char)getsb(buf, off + 5); az = (short)getles16(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; } 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; 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)getleu32(buf, 0); gw = (unsigned short)getles16(buf, 8); } epx = (double)(getles32(buf, 12) / 100.0); epy = (double)(getles32(buf, 16) / 100.0); epz = (double)(getles32(buf, 20) / 100.0); evx = (double)(getles32(buf, 28) / 100.0); evy = (double)(getles32(buf, 32) / 100.0); evz = (double)(getles32(buf, 36) / 100.0); ecef_to_wgs84fix(&g.fix, &separation, epx, epy, epz, evx, evy, evz); g.fix.epx = g.fix.epy = (double)(getles32(buf, 24) / 100.0); g.fix.eps = (double)(getles32(buf, 40) / 100.0); g.dop.pdop = (double)(getleu16(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)wattrset(navsolwin, A_UNDERLINE); (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, 38, 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)wattrset(navsolwin, A_NORMAL); (void)wmove(navsolwin, 7, 7); { unsigned int day = tow / 8640000; unsigned int tod = tow % 8640000; unsigned int h = tod / 360000; unsigned int m = tod % 360000; unsigned int s = m % 6000; m = (m - s) / 6000; (void)wattrset(navsolwin, A_UNDERLINE); (void)wprintw(navsolwin, "%u %02u:%02u:%05.2f", day, h, m, (double)s / 100); (void)wattrset(navsolwin, A_NORMAL); } (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 epx and epy are set 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); } 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", getleu16(buf, 12) / 100.0); (void)wmove(dopwin, 1, 18); (void)wprintw(dopwin, "%4.1f", getleu16(buf, 10) / 100.0); (void)wmove(dopwin, 1, 27); (void)wprintw(dopwin, "%4.1f", getleu16(buf, 6) / 100.0); (void)wmove(dopwin, 1, 36); (void)wprintw(dopwin, "%4.1f", getleu16(buf, 8) / 100.0); (void)wmove(dopwin, 1, 45); (void)wprintw(dopwin, "%4.1f", getleu16(buf, 4) / 100.0); (void)wnoutrefresh(dopwin); } static void ubx_update(void) { unsigned char *buf; size_t data_len; unsigned short msgid; buf = session.lexer.outbuffer; msgid = (unsigned short)((buf[2] << 8) | buf[3]); data_len = (size_t) getles16(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; } #ifdef NTP_ENABLE toff_update(ppswin, TOFF_LINE, TOFF_COLUMN + 6); #endif /* NTP_ENABLE */ #ifdef PPS_ENABLE pps_update(ppswin, PPS_LINE, PPS_COLUMN + 5); #endif /* PPS_ENABLE */ } static int ubx_command(char line[]UNUSED) { return COMMAND_UNKNOWN; } static void ubx_wrap(void) { (void)delwin(satwin); return; } const struct monitor_object_t ubx_mmt = { .initialize = ubx_initialize, .update = ubx_update, .command = ubx_command, .wrap = ubx_wrap, .min_y = 19,.min_x = 80, /* size of the device window */ .driver = &driver_ubx, }; #endif gpsd-3.15/net_dgpsip.c0000664000175000017500000000526312506330507013054 0ustar esresr/* net_dgpsip.c -- gather and dispatch DGPS data from DGPSIP servers * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include "gpsd.h" int dgpsip_open(struct gps_device_t *device, const char *dgpsserver) /* open a connection to a DGPSIP server */ { char *colon, *dgpsport = "rtcm-sc104"; int opts; device->dgpsip.reported = false; if ((colon = strchr(dgpsserver, ':')) != NULL) { dgpsport = colon + 1; *colon = '\0'; } if (!getservbyname(dgpsport, "tcp")) dgpsport = DEFAULT_RTCM_PORT; device->gpsdata.gps_fd = netlib_connectsock(AF_UNSPEC, dgpsserver, dgpsport, "tcp"); // cppcheck-suppress pointerPositive if (device->gpsdata.gps_fd >= 0) { char hn[256], buf[BUFSIZ]; gpsd_log(&device->context->errout, 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(device->gpsdata.gps_fd, buf, strlen(buf)) != (ssize_t) strlen(buf)) gpsd_log(&device->context->errout, LOG_ERROR, "hello to DGPS server %s failed\n", dgpsserver); } else gpsd_log(&device->context->errout, LOG_ERROR, "can't connect to DGPS server %s, netlib error %d.\n", dgpsserver, device->gpsdata.gps_fd); opts = fcntl(device->gpsdata.gps_fd, F_GETFL); if (opts >= 0) (void)fcntl(device->gpsdata.gps_fd, F_SETFL, opts | O_NONBLOCK); device->servicetype = service_dgpsip; return device->gpsdata.gps_fd; } void dgpsip_report(struct gps_context_t *context, struct gps_device_t *gps, struct gps_device_t *dgpsip) /* may be time to ship a usage report to the DGPSIP server */ { /* * 10 is an arbitrary number, the point is to have gotten several good * fixes before reporting usage to our DGPSIP server. */ if (context->fixcnt > 10 && !dgpsip->dgpsip.reported) { dgpsip->dgpsip.reported = true; if (dgpsip->gpsdata.gps_fd > -1) { char buf[BUFSIZ]; (void)snprintf(buf, sizeof(buf), "R %0.8f %0.8f %0.2f\r\n", gps->gpsdata.fix.latitude, gps->gpsdata.fix.longitude, gps->gpsdata.fix.altitude); if (write(dgpsip->gpsdata.gps_fd, buf, strlen(buf)) == (ssize_t) strlen(buf)) gpsd_log(&context->errout, LOG_IO, "=> dgps %s\n", buf); else gpsd_log(&context->errout, LOG_IO, "write to dgps FAILED\n"); } } } gpsd-3.15/net_gnss_dispatch.c0000664000175000017500000000326512506330517014420 0ustar esresr/* net_gnss_dispatch.c -- common interface to a number of Network GNSS services * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include "gpsd.h" #include "strfuncs.h" #define NETGNSS_DGPSIP "dgpsip://" #define NETGNSS_NTRIP "ntrip://" bool netgnss_uri_check(char *name) /* is given string a valid URI for GNSS/DGPS service? */ { return str_starts_with(name, NETGNSS_NTRIP) || str_starts_with(name, NETGNSS_DGPSIP); } int netgnss_uri_open(struct gps_device_t *dev, char *netgnss_service) /* open a connection to a DGNSS service */ { #ifdef NTRIP_ENABLE if (str_starts_with(netgnss_service, NETGNSS_NTRIP)) { dev->ntrip.conn_state = ntrip_conn_init; return ntrip_open(dev, netgnss_service + strlen(NETGNSS_NTRIP)); } #endif if (str_starts_with(netgnss_service, NETGNSS_DGPSIP)) return dgpsip_open(dev, netgnss_service + strlen(NETGNSS_DGPSIP)); #ifndef REQUIRE_DGNSS_PROTO return dgpsip_open(dev, netgnss_service); #else gpsd_log(&dev->context.errout, LOG_ERROR, "Unknown or unspecified DGNSS protocol for service %s\n", netgnss_service); return -1; #endif } void netgnss_report(struct gps_context_t *context, struct gps_device_t *gps, struct gps_device_t *dgnss) /* may be time to ship a usage report to the DGNSS service */ { if (dgnss->servicetype == service_dgpsip) dgpsip_report(context, gps, dgnss); #ifdef NTRIP_ENABLE else if (dgnss->servicetype == service_ntrip) ntrip_report(context, gps, dgnss); #endif } /* end */ gpsd-3.15/net_ntrip.c0000664000175000017500000004143512520742615012726 0ustar esresr/* net_ntrip.c -- gather and dispatch DGNSS data from Ntrip broadcasters * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gpsd.h" #include "strfuncs.h" #define NTRIP_SOURCETABLE "SOURCETABLE 200 OK\r\n" #define NTRIP_ENDSOURCETABLE "ENDSOURCETABLE" #define NTRIP_CAS "CAS;" #define NTRIP_NET "NET;" #define NTRIP_STR "STR;" #define NTRIP_BR "\r\n" #define NTRIP_QSC "\";\"" #define NTRIP_ICY "ICY 200 OK" #define NTRIP_UNAUTH "401 Unauthorized" static char *ntrip_field_iterate(char *start, char *prev, const char *eol, const struct gpsd_errout_t *errout) { char *s, *t, *u; if (start) s = start; else { if (!prev) return NULL; s = prev + strlen(prev) + 1; if (s >= eol) return NULL; } /* ignore any quoted ; chars as they are part of the field content */ t = s; while ((u = strstr(t, NTRIP_QSC))) t = u + strlen(NTRIP_QSC); if ((t = strstr(t, ";"))) *t = '\0'; gpsd_log(errout, LOG_RAW, "Next Ntrip source table field %s\n", s); return s; } static void ntrip_str_parse(char *str, size_t len, struct ntrip_stream_t *hold, const struct gpsd_errout_t *errout) { char *s, *eol = str + len; memset(hold, 0, sizeof(*hold)); /* */ if ((s = ntrip_field_iterate(str, NULL, eol, errout))) (void)strlcpy(hold->mountpoint, s, sizeof(hold->mountpoint)); /* */ s = ntrip_field_iterate(NULL, s, eol, errout); /* */ if ((s = ntrip_field_iterate(NULL, s, eol, errout))) { if (strcasecmp("RTCM 2", s) == 0) hold->format = fmt_rtcm2; else if (strcasecmp("RTCM 2.0", s) == 0) hold->format = fmt_rtcm2_0; else if (strcasecmp("RTCM 2.1", s) == 0) hold->format = fmt_rtcm2_1; else if (strcasecmp("RTCM 2.2", s) == 0) hold->format = fmt_rtcm2_2; else if (strcasecmp("RTCM 2.3", s) == 0) hold->format = fmt_rtcm2_3; /* required for the SAPOS derver in Gemany, confirmed as RTCM2.3 */ else if (strcasecmp("RTCM1_", s) == 0) hold->format = fmt_rtcm2_3; else if (strcasecmp("RTCM 3.0", s) == 0) hold->format = fmt_rtcm3; else hold->format = fmt_unknown; } /* */ s = ntrip_field_iterate(NULL, s, eol, errout); /* */ if ((s = ntrip_field_iterate(NULL, s, eol, errout))) hold->carrier = atoi(s); /* */ s = ntrip_field_iterate(NULL, s, eol, errout); /* */ s = ntrip_field_iterate(NULL, s, eol, errout); /* */ s = ntrip_field_iterate(NULL, s, eol, errout); /* */ hold->latitude = NAN; if ((s = ntrip_field_iterate(NULL, s, eol, errout))) hold->latitude = atof(s); /* */ hold->longitude = NAN; if ((s = ntrip_field_iterate(NULL, s, eol, errout))) hold->longitude = atof(s); /* */ if ((s = ntrip_field_iterate(NULL, s, eol, errout))) { hold->nmea = atoi(s); } /* */ s = ntrip_field_iterate(NULL, s, eol, errout); /* */ s = ntrip_field_iterate(NULL, s, eol, errout); /* */ if ((s = ntrip_field_iterate(NULL, s, eol, errout))) { if (strcasecmp("none", s) == 0) hold->compr_encryp = cmp_enc_none; else hold->compr_encryp = cmp_enc_unknown; } /* */ if ((s = ntrip_field_iterate(NULL, s, eol, errout))) { if (strcasecmp("N", s) == 0) hold->authentication = auth_none; else if (strcasecmp("B", s) == 0) hold->authentication = auth_basic; else if (strcasecmp("D", s) == 0) hold->authentication = auth_digest; else hold->authentication = auth_unknown; } /* */ if ((s = ntrip_field_iterate(NULL, s, eol, errout))) { hold->fee = atoi(s); } /* */ if ((s = ntrip_field_iterate(NULL, s, eol, errout))) { hold->bitrate = atoi(s); } /* ... */ while ((s = ntrip_field_iterate(NULL, s, eol, errout))); } static int ntrip_sourcetable_parse(struct gps_device_t *device) { struct ntrip_stream_t hold; ssize_t llen, len = 0; char *line; bool sourcetable = false; bool match = false; char buf[BUFSIZ]; size_t blen = sizeof(buf); int fd = device->gpsdata.gps_fd; for (;;) { char *eol; ssize_t rlen; memset(&buf[len], 0, (size_t) (blen - len)); rlen = read(fd, &buf[len], (size_t) (blen - 1 - len)); if (rlen == -1) { if (errno == EINTR) { continue; } if (sourcetable && !match && errno == EAGAIN) { // we have not yet found a match, but there currently is no more data return 0; } if (match) { return 1; } gpsd_log(&device->context->errout, LOG_ERROR, "ntrip stream read error %d on fd %d\n", errno, fd); return -1; } else if (rlen == 0) { // server closed the connection gpsd_log(&device->context->errout, LOG_ERROR, "ntrip stream unexpected close %d on fd %d during sourcetable read\n", errno, fd); return -1; } line = buf; rlen = len += rlen; gpsd_log(&device->context->errout, LOG_RAW, "Ntrip source table buffer %s\n", buf); sourcetable = device->ntrip.sourcetable_parse; if (!sourcetable) { /* parse SOURCETABLE */ if (str_starts_with(line, NTRIP_SOURCETABLE)) { sourcetable = true; device->ntrip.sourcetable_parse = true; llen = (ssize_t) strlen(NTRIP_SOURCETABLE); line += llen; len -= llen; } else { gpsd_log(&device->context->errout, LOG_WARN, "Received unexpexted Ntrip reply %s.\n", buf); return -1; } } while (len > 0) { /* parse ENDSOURCETABLE */ if (str_starts_with(line, NTRIP_ENDSOURCETABLE)) goto done; /* coverity[string_null] - nul-terminated by previous memset */ if (!(eol = strstr(line, NTRIP_BR))) break; gpsd_log(&device->context->errout, LOG_DATA, "next Ntrip source table line %s\n", line); *eol = '\0'; llen = (ssize_t) (eol - line); /* todo: parse headers */ /* parse STR */ if (str_starts_with(line, NTRIP_STR)) { ntrip_str_parse(line + strlen(NTRIP_STR), (size_t) (llen - strlen(NTRIP_STR)), &hold, &device->context->errout); if (strcmp(device->ntrip.stream.mountpoint, hold.mountpoint) == 0) { /* todo: support for RTCM 3.0, SBAS (WAAS, EGNOS), ... */ if (hold.format == fmt_unknown) { gpsd_log(&device->context->errout, LOG_ERROR, "Ntrip stream %s format not supported\n", line); return -1; } /* todo: support encryption and compression algorithms */ if (hold.compr_encryp != cmp_enc_none) { gpsd_log(&device->context->errout, LOG_ERROR, "Ntrip stream %s compression/encryption algorithm not supported\n", line); return -1; } /* todo: support digest authentication */ if (hold.authentication != auth_none && hold.authentication != auth_basic) { gpsd_log(&device->context->errout, LOG_ERROR, "Ntrip stream %s authentication method not supported\n", line); return -1; } /* no memcpy, so we can keep the other infos */ device->ntrip.stream.format = hold.format; device->ntrip.stream.carrier = hold.carrier; device->ntrip.stream.latitude = hold.latitude; device->ntrip.stream.longitude = hold.longitude; device->ntrip.stream.nmea = hold.nmea; device->ntrip.stream.compr_encryp = hold.compr_encryp; device->ntrip.stream.authentication = hold.authentication; device->ntrip.stream.fee = hold.fee; device->ntrip.stream.bitrate = hold.bitrate; device->ntrip.stream.set = true; match = true; } /* todo: compare stream location to own location to * find nearest stream if user hasn't provided one */ } /* todo: parse CAS */ /* else if (str_starts_with(line, NTRIP_CAS)); */ /* todo: parse NET */ /* else if (str_starts_with(line, NTRIP_NET)); */ llen += strlen(NTRIP_BR); line += llen; len -= llen; gpsd_log(&device->context->errout, LOG_RAW, "Remaining Ntrip source table buffer %zd %s\n", len, line); } /* message too big to fit into buffer */ if ((size_t)len == blen - 1) return -1; if (len > 0) memmove(buf, &buf[rlen - len], (size_t) len); } done: return match ? 1 : -1; } static int ntrip_stream_req_probe(const struct ntrip_stream_t *stream, struct gpsd_errout_t *errout) { int dsock; ssize_t r; char buf[BUFSIZ]; dsock = netlib_connectsock(AF_UNSPEC, stream->url, stream->port, "tcp"); if (dsock < 0) { gpsd_log(errout, LOG_ERROR, "ntrip stream connect error %d in req probe\n", dsock); return -1; } gpsd_log(errout, LOG_SPIN, "ntrip stream for req probe connected on fd %d\n", dsock); (void)snprintf(buf, sizeof(buf), "GET / HTTP/1.1\r\n" "User-Agent: NTRIP gpsd/%s\r\n" "Host: %s\r\n" "Connection: close\r\n" "\r\n", VERSION, stream->url); r = write(dsock, buf, strlen(buf)); if (r != (ssize_t)strlen(buf)) { gpsd_log(errout, LOG_ERROR, "ntrip stream write error %d on fd %d during probe request %zd\n", errno, dsock, r); (void)close(dsock); return -1; } /* coverity[leaked_handle] This is an intentional allocation */ return dsock; } static int ntrip_auth_encode(const struct ntrip_stream_t *stream, const char *auth, char buf[], size_t size) { memset(buf, 0, size); if (stream->authentication == auth_none) return 0; else if (stream->authentication == auth_basic) { char authenc[64]; if (!auth) return -1; memset(authenc, 0, sizeof(authenc)); 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 { /* todo: support digest authentication */ } return 0; } /* *INDENT-ON* */ static int ntrip_stream_get_req(const struct ntrip_stream_t *stream, const struct gpsd_errout_t *errout) { int dsock; char buf[BUFSIZ]; dsock = netlib_connectsock(AF_UNSPEC, stream->url, stream->port, "tcp"); if (BAD_SOCKET(dsock)) { gpsd_log(errout, LOG_ERROR, "ntrip stream connect error %d\n", dsock); return -1; } gpsd_log(errout, LOG_SPIN, "netlib_connectsock() returns socket on fd %d\n", dsock); (void)snprintf(buf, sizeof(buf), "GET /%s HTTP/1.1\r\n" "User-Agent: NTRIP gpsd/%s\r\n" "Host: %s\r\n" "Accept: rtk/rtcm, dgps/rtcm\r\n" "%s" "Connection: close\r\n" "\r\n", stream->mountpoint, VERSION, stream->url, stream->authStr); if (write(dsock, buf, strlen(buf)) != (ssize_t) strlen(buf)) { gpsd_log(errout, LOG_ERROR, "ntrip stream write error %d on fd %d during get request\n", errno, dsock); (void)close(dsock); return -1; } return dsock; } static int ntrip_stream_get_parse(const struct ntrip_stream_t *stream, const int dsock, const struct gpsd_errout_t *errout) { char buf[BUFSIZ]; int opts; memset(buf, 0, sizeof(buf)); while (read(dsock, buf, sizeof(buf) - 1) == -1) { if (errno == EINTR) continue; gpsd_log(errout, LOG_ERROR, "ntrip stream read error %d on fd %d during get rsp\n", errno, dsock); goto close; } /* parse 401 Unauthorized */ /* coverity[string_null] - guaranteed terminated by the memset above */ if (strstr(buf, NTRIP_UNAUTH)!=NULL) { gpsd_log(errout, LOG_ERROR, "not authorized for Ntrip stream %s/%s\n", stream->url, stream->mountpoint); goto close; } /* parse SOURCETABLE */ if (strstr(buf, NTRIP_SOURCETABLE)!=NULL) { gpsd_log(errout, LOG_ERROR, "Broadcaster doesn't recognize Ntrip stream %s:%s/%s\n", stream->url, stream->port, stream->mountpoint); goto close; } /* parse ICY 200 OK */ if (strstr(buf, NTRIP_ICY)==NULL) { gpsd_log(errout, LOG_ERROR, "Unknown reply %s from Ntrip service %s:%s/%s\n", buf, stream->url, stream->port, stream->mountpoint); goto close; } opts = fcntl(dsock, F_GETFL); if (opts >= 0) (void)fcntl(dsock, F_SETFL, opts | O_NONBLOCK); return dsock; close: (void)close(dsock); return -1; } int ntrip_open(struct gps_device_t *device, char *caster) /* open a connection to a Ntrip broadcaster */ { char *amp, *colon, *slash; char *auth = NULL; char *port = NULL; char *stream = NULL; char *url = NULL; int ret = -1; char t[strlen(caster) + 1]; char *tmp = t; switch (device->ntrip.conn_state) { case ntrip_conn_init: /* this has to be done here, because it is needed for multi-stage connection */ device->servicetype = service_ntrip; device->ntrip.works = false; device->ntrip.sourcetable_parse = false; device->ntrip.stream.set = false; (void)strlcpy(tmp, caster, sizeof(t)); if ((amp = strchr(tmp, '@')) != NULL) { if (((colon = strchr(tmp, ':')) != NULL) && colon < amp) { auth = tmp; *amp = '\0'; tmp = amp + 1; url = tmp; } else { gpsd_log(&device->context->errout, LOG_ERROR, "can't extract user-ID and password from %s\n", caster); device->ntrip.conn_state = ntrip_conn_err; return -1; } } if ((slash = strchr(tmp, '/')) != NULL) { *slash = '\0'; stream = slash + 1; } else { /* todo: add autoconnect like in dgpsip.c */ gpsd_log(&device->context->errout, LOG_ERROR, "can't extract Ntrip stream from %s\n", caster); device->ntrip.conn_state = ntrip_conn_err; return -1; } if ((colon = strchr(tmp, ':')) != NULL) { port = colon + 1; *colon = '\0'; } if (!port) { port = "rtcm-sc104"; if (!getservbyname(port, "tcp")) port = DEFAULT_RTCM_PORT; } (void)strlcpy(device->ntrip.stream.mountpoint, stream, sizeof(device->ntrip.stream.mountpoint)); if (auth != NULL) (void)strlcpy(device->ntrip.stream.credentials, auth, sizeof(device->ntrip.stream.credentials)); /* * Semantically url and port ought to be non-NULL by now, * but just in case...this code appeases Coverity. */ if (url != NULL) (void)strlcpy(device->ntrip.stream.url, url, sizeof(device->ntrip.stream.url)); if (port != NULL) (void)strlcpy(device->ntrip.stream.port, port, sizeof(device->ntrip.stream.port)); ret = ntrip_stream_req_probe(&device->ntrip.stream, &device->context->errout); if (ret == -1) { device->ntrip.conn_state = ntrip_conn_err; return -1; } device->gpsdata.gps_fd = ret; device->ntrip.conn_state = ntrip_conn_sent_probe; return ret; case ntrip_conn_sent_probe: ret = ntrip_sourcetable_parse(device); if (ret == -1) { device->ntrip.conn_state = ntrip_conn_err; return -1; } if (ret == 0 && device->ntrip.stream.set == false) { return ret; } (void)close(device->gpsdata.gps_fd); if (ntrip_auth_encode(&device->ntrip.stream, device->ntrip.stream.credentials, device->ntrip.stream.authStr, sizeof(device->ntrip.stream.authStr)) != 0) { device->ntrip.conn_state = ntrip_conn_err; return -1; } ret = ntrip_stream_get_req(&device->ntrip.stream, &device->context->errout); if (ret == -1) { device->ntrip.conn_state = ntrip_conn_err; return -1; } device->gpsdata.gps_fd = ret; device->ntrip.conn_state = ntrip_conn_sent_get; break; case ntrip_conn_sent_get: ret = ntrip_stream_get_parse(&device->ntrip.stream, device->gpsdata.gps_fd, &device->context->errout); if (ret == -1) { device->ntrip.conn_state = ntrip_conn_err; return -1; } device->ntrip.conn_state = ntrip_conn_established; device->ntrip.works = true; // we know, this worked. break; case ntrip_conn_established: case ntrip_conn_err: return -1; } return ret; } void ntrip_report(struct gps_context_t *context, struct gps_device_t *gps, struct gps_device_t *caster) /* may be time to ship a usage report to the Ntrip caster */ { static int count; /* * 10 is an arbitrary number, the point is to have gotten several good * fixes before reporting usage to our Ntrip caster. * * count % 5 is as arbitrary a number as the fixcnt. But some delay * was needed here */ count ++; if (caster->ntrip.stream.nmea != 0 && context->fixcnt > 10 && (count % 5)==0) { if (caster->gpsdata.gps_fd > -1) { char buf[BUFSIZ]; gpsd_position_fix_dump(gps, buf, sizeof(buf)); if (write(caster->gpsdata.gps_fd, buf, strlen(buf)) == (ssize_t) strlen(buf)) { gpsd_log(&context->errout, LOG_IO, "=> dgps %s\n", buf); } else { gpsd_log(&context->errout, LOG_IO, "ntrip report write failed\n"); } } } } gpsd-3.15/netlib.c0000664000175000017500000001173712506330621012175 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #ifndef AF_UNSPEC #include #include #include #endif /* AF_UNSPEC */ #include #ifndef INADDR_ANY #include #endif /* INADDR_ANY */ #include /* for htons() and friends */ #include #include #include "gpsd.h" #include "sockaddr.h" socket_t netlib_connectsock(int af, const char *host, const char *service, const char *protocol) { struct protoent *ppe; struct addrinfo hints; struct addrinfo *result, *rp; int ret, type, proto, one = 1; socket_t s; bool bind_me; INVALIDATE_SOCKET(s); ppe = getprotobyname(protocol); if (strcmp(protocol, "udp") == 0) { type = SOCK_DGRAM; proto = (ppe) ? ppe->p_proto : IPPROTO_UDP; } else { type = SOCK_STREAM; proto = (ppe) ? ppe->p_proto : IPPROTO_TCP; } /* we probably ought to pass this in as an explicit flag argument */ bind_me = (type == SOCK_DGRAM); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = af; hints.ai_socktype = type; hints.ai_protocol = proto; if (bind_me) hints.ai_flags = AI_PASSIVE; if ((ret = getaddrinfo(host, service, &hints, &result))) { return NL_NOHOST; } /* * From getaddrinfo(3): * Normally, the application should try using the addresses in the * order in which they are returned. The sorting function used within * getaddrinfo() is defined in RFC 3484). * From RFC 3484 (Section 10.3): * The default policy table gives IPv6 addresses higher precedence than * IPv4 addresses. * Thus, with the default parameters, we get IPv6 addresses first. */ 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) ret = NL_NOSOCK; else if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)) == -1) { ret = NL_NOSOCKOPT; } else { if (bind_me) { if (bind(s, rp->ai_addr, rp->ai_addrlen) == 0) { ret = 0; break; } } else { if (connect(s, rp->ai_addr, rp->ai_addrlen) == 0) { ret = 0; break; } } } if (!BAD_SOCKET(s)) { (void)close(s); } } freeaddrinfo(result); if (ret != 0 || BAD_SOCKET(s)) return ret; #ifdef IPTOS_LOWDELAY { int opt = IPTOS_LOWDELAY; (void)setsockopt(s, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)); #ifdef IPV6_TCLASS (void)setsockopt(s, IPPROTO_IPV6, IPV6_TCLASS, &opt, sizeof(opt)); #endif } #endif #ifdef TCP_NODELAY /* * This is a good performance enhancement when the socket is going to * be used to pass a lot of short commands. It prevents them from being * delayed by the Nagle algorithm until they can be aggreagated into * a large packet. See http://en.wikipedia.org/wiki/Nagle%27s_algorithm * for discussion. */ if (type == SOCK_STREAM) setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)); #endif /* set socket to noblocking */ (void)fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK); return s; } const char *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"; } } socket_t netlib_localsocket(const char *sockfile, int socktype) /* acquire a connection to an existing Unix-domain socket */ { int sock; if ((sock = socket(AF_UNIX, socktype, 0)) < 0) { return -1; } else { struct sockaddr_un saddr; memset(&saddr, 0, sizeof(struct sockaddr_un)); saddr.sun_family = AF_UNIX; (void)strlcpy(saddr.sun_path, sockfile, sizeof(saddr.sun_path)); if (connect(sock, (struct sockaddr *)&saddr, SUN_LEN(&saddr)) < 0) { (void)close(sock); return -2; } return sock; } } char *netlib_sock2ip(socket_t fd) /* retrieve the IP address corresponding to a socket */ { sockaddr_t fsin; socklen_t alen = (socklen_t) sizeof(fsin); static char ip[INET6_ADDRSTRLEN]; int r; r = getpeername(fd, &(fsin.sa), &alen); if (r == 0) { switch (fsin.sa.sa_family) { case AF_INET: r = !inet_ntop(fsin.sa_in.sin_family, &(fsin.sa_in.sin_addr), ip, sizeof(ip)); break; #ifdef IPV6_ENABLE case AF_INET6: r = !inet_ntop((int)fsin.sa_in6.sin6_family, &(fsin.sa_in6.sin6_addr), ip, sizeof(ip)); break; #endif default: (void)strlcpy(ip, "", sizeof(ip)); return ip; } } if (r != 0) { (void)strlcpy(ip, "", sizeof(ip)); } return ip; } gpsd-3.15/ntpshm.h0000664000175000017500000000455512532614165012245 0ustar esresr/* * This file is Copyright (c) 2015 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef GPSD_NTPSHM_H #define GPSD_NTPSHM_H #include #include #include #include #include #define NTPD_BASE 0x4e545030 /* "NTP0" */ /* * How to read and write fields in an NTP shared segment. * This definition of shmTime is from ntpd source ntpd/refclock_shm.c * * The fields aren't documented there. It appears the only use of * nsamples is internal to the (obsolete and deprecated) EES M201 * receiver refclock. The precision field is nominally log(2) of the * source's jitter in seconds: * -1 is about 100mSec jitter * -10 is about 1 mSec jitter (GR-601W or other USB with 1ms poll interval) * -13 is about 100 uSec * -20 is about 1 uSec (typical for serial PPS) */ 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 */ volatile int count; time_t clockTimeStampSec; int clockTimeStampUSec; time_t receiveTimeStampSec; int receiveTimeStampUSec; int leap; /* not leapsecond offset, a notification code */ int precision; /* log(2) of source jitter */ int nsamples; /* not used */ volatile int valid; unsigned clockTimeStampNSec; /* Unsigned ns timestamps */ unsigned receiveTimeStampNSec; /* Unsigned ns timestamps */ int dummy[8]; }; /* * These types are internal to GPSD */ enum segstat_t {OK, NO_SEGMENT, NOT_READY, BAD_MODE, CLASH}; struct shm_stat_t { enum segstat_t status; struct timespec tvc; /* System time when SHM read, for debug only */ struct timespec tvr; /* System time at GPS time */ struct timespec tvt; /* GPS time */ int precision; int leap; }; #ifndef TIMEDELTA_DEFINED struct timedelta_t { struct timespec real; struct timespec clock; }; #define TIMEDELTA_DEFINED #endif /* TIMEDELTA_DEFINED */ struct shmTime *shm_get(int, bool, bool); extern char *ntp_name(const int); enum segstat_t ntp_read(struct shmTime *, struct shm_stat_t *, const bool); void ntp_write(volatile struct shmTime *, struct timedelta_t *, int, int); #endif /* GPSD_NTPSHM_H */ /* end */ gpsd-3.15/ntpshmmon.c0000664000175000017500000000713712532614165012751 0ustar esresr/* ntpshmmon.c -- monitor the inner end of an ntpshmwrite.connection * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * */ #include #include #include #include #include #include "gpsd_config.h" #include "ntpshm.h" #include "revision.h" #define NTPSEGMENTS 256 /* NTPx for x any byte */ /* difference between timespecs in nanoseconds */ /* int is too small, avoid floats */ /* WARNING! this will overflow if x and y differ by more than a few seconds */ #define timespec_diff_ns(x, y) (long)(((x).tv_sec-(y).tv_sec)*1000000000+(x).tv_nsec-(y).tv_nsec) static struct shmTime *segments[NTPSEGMENTS + 1]; static struct timespec tick[NTPSEGMENTS + 1]; int main(int argc, char **argv) { int option; int i; bool killall = false; bool verbose = false; int nsamples = INT_MAX; time_t timeout = (time_t)INT_MAX, starttime = time(NULL); double cycle = 1.0; #define USAGE "usage: ntpshmmon [-s] [-n max] [-t timeout] [-v] [-h] [-V]\n" while ((option = getopt(argc, argv, "c:hn:st:vV")) != -1) { switch (option) { case 'c': cycle = atof(optarg); break; case 'n': nsamples = atoi(optarg); break; case 's': killall = true; break; case 't': timeout = (time_t)atoi(optarg); break; case 'v': verbose = true; break; case 'V': (void)fprintf(stderr, "%s: version %s (revision %s)\n", argv[0], VERSION, REVISION); exit(EXIT_SUCCESS); case 'h': default: fprintf(stderr, USAGE); break; } } /* grab all segments, keep the non-null ones */ for (i = 0; i < NTPSEGMENTS; i++) { segments[i] = shm_get(i, false, true); if (verbose && segments[i] != NULL) fprintf(stderr, "unit %d opened\n", i); } if (killall) { struct shmTime **pp; for (pp = segments; pp < segments + NTPSEGMENTS; pp++) if (*pp != NULL) (void)shmdt((void *)(*pp)); exit(EXIT_SUCCESS); } (void)printf("ntpshmmon version 1\n"); (void)printf("# Name Seen@ Clock Real L Prec\n"); do { struct shm_stat_t shm_stat; for (i = 0; i < NTPSEGMENTS; i++) { enum segstat_t status = ntp_read(segments[i], &shm_stat, false); if (verbose) fprintf(stderr, "unit %d status %d\n", i, status); switch(status) { case OK: if (timespec_diff_ns(shm_stat.tvc, tick[i]) >= cycle * 1000000000) { printf("sample %s %ld.%09ld %ld.%09ld %ld.%09ld %d %3d\n", ntp_name(i), (long)shm_stat.tvc.tv_sec, shm_stat.tvc.tv_nsec, (long)shm_stat.tvr.tv_sec, shm_stat.tvr.tv_nsec, (long)shm_stat.tvt.tv_sec, shm_stat.tvt.tv_nsec, shm_stat.leap, shm_stat.precision); tick[i] = shm_stat.tvc; --nsamples; } break; case NO_SEGMENT: break; case NOT_READY: /* do nothing, data not ready, wait another cycle */ break; case BAD_MODE: fprintf(stderr, "ntpshmmon: unknown mode %d on segment %s\n", shm_stat.status, ntp_name(i)); break; case CLASH: /* do nothing, data is corrupt, wait another cycle */ break; default: fprintf(stderr, "ntpshmmon: unknown status %d on segment %s\n", status, ntp_name(i)); break; } } /* * Even on a 1 Hz PPS, a sleep(1) may end up * being sleep(1.1) and missing a beat. Since * we're ignoring duplicates via timestamp, polling * at interval < 1 sec shouldn't be a problem. */ (void)usleep((useconds_t)(cycle * 1000)); } while (nsamples != 0 && time(NULL) - starttime < timeout); exit(EXIT_SUCCESS); } /* end */ gpsd-3.15/ntpshmmon.xml0000664000175000017500000001324112532614165013320 0ustar esresr 25 Jan 2015 ntpshmmon 1 The GPSD Project GPSD Documentation ntpshmmon capture samples from GPS or other ntpd refclock sources ntpshmmon -c cycletime -h -n nsamples -s -t seconds -v -V DESCRIPTION This program monitors the shared-memory segments updated by gpsd8 (and possibly other refclock sources) as a way of communicating with ntpd, the Network Time Protocol daemon. It reads these in exactly the way an ntpd instance does. It can be run concurrently with ntpd without interfering with ntpd's normal operation. This program runs forever, or until a termination option is matched, or until interrupted, generating sample reports to standard output. Each line consists of whitespace-separated textual fields. Here is an example of the beginning of a report file: ntpshmmon version 1 # Name Seen@ Clock Real L Prec sample NTP2 1424926256.443030206 1424926256.115869233 1424926256.000000000 0 -1 sample NTP3 1424926256.443060517 1424926255.995430821 1424926256.000000000 0 -20 sample NTP3 1424926256.995747347 1424926256.995422728 1424926257.000000000 0 -20 sample NTP2 1424926257.112433572 1424926257.111936726 1424926257.000000000 0 -1 sample NTP3 1424926257.996221153 1424926257.995410232 1424926258.000000000 0 -20 sample NTP2 1424926258.107769409 1424926258.107451006 1424926258.000000000 0 -1 sample NTP3 1424926258.995647636 1424926258.995406476 1424926259.000000000 0 -20 The output always begins with a header line expressing the version of the output format; the version line begins with "ntpshmmon version" and is followed by a numeric version field. The remainder of the file is either commments or sample lines. A comment line begins with a # and should ignored by programs that interpret this format. This program never generates such lines itself. The fields of a sample line are as follows: The keyword "sample" The NTP unit from which it was collected. Collection time of day, seconds. Receiver time of day, seconds. Clock time of day, seconds. Leap-second notification status. Source precision (log(2) of source jitter). In these fields, "clock time" is the high-precision time measured by the source and "receiver time" is Unix UTC time at the receiver. It is normal for the seconds part of receiver time to coincide with the seconds part of collection time and for the nanoseconds part of receiver time to be zero. -v Enable verbose status messages. -c Device poll interval in fractional seconds - defaults to 1. -n Set maximum number of samples to collect. -s Remove all segments specified by the units argument. This option will normally only be of interest to GPSD developers. -t Set maximum time to collect samples in seconds. -h Display program usage and exit. -V Display program version and exit. SEE ALSO gpsd8, gpsdctl8, gps1, libgps3, libgpsd3, gpsprof1, gpsfake1. AUTHOR Eric S. Raymond esr@thyrsus.com. gpsd-3.15/ntpshmread.c0000664000175000017500000001213012520742615013057 0ustar esresr/* ntpshmread.c -- monitor the inner end of an ntpshmwrite.connection * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. * * Some of this was swiped from the NTPD distribution. */ #define _XOPEN_SOURCE 600 #include #include #include #include #include #include #include #include #include #include #include "ntpshm.h" #include "compiler.h" struct shmTime *shm_get(const int unit, const bool create, const bool forall) /* initialize a SHM segment */ { struct shmTime *p = NULL; int shmid; /* * Big units will give non-ASCII but that's OK * as long as everybody does it the same way. */ shmid = shmget((key_t)(NTPD_BASE + unit), sizeof(struct shmTime), (create ? IPC_CREAT : 0) | (forall ? 0666 : 0600)); if (shmid == -1) { /* error */ return NULL; } p = (struct shmTime *)shmat (shmid, 0, 0); if (p == (struct shmTime *)-1) { /* error */ return NULL; } return p; } char *ntp_name(const int unit) /* return the name of a specified segment */ { static char name[5] = "NTP\0"; name[3] = (char)('0' + unit); return name; } enum segstat_t ntp_read(struct shmTime *shm_in, struct shm_stat_t *shm_stat, const bool consume) /* try to grab a sample from the specified SHM segment */ { volatile struct shmTime shmcopy, *shm = shm_in; volatile int cnt; unsigned int cns_new, rns_new; if (shm == NULL) { shm_stat->status = NO_SEGMENT; return NO_SEGMENT; } shm_stat->tvc.tv_sec = shm_stat->tvc.tv_nsec = 0; clock_gettime(CLOCK_REALTIME, &shm_stat->tvc); /* relying on word access to be atomic here */ if (shm->valid == 0) { shm_stat->status = NOT_READY; return NOT_READY; } cnt = shm->count; /* * This is proof against concurrency issues if either (a) the * memory_barrier() call works on this host, or (b) memset * compiles to an uninterruptible single-instruction bitblt (this * will probably cease to be true if the structure exceeds your VM * page size). */ memory_barrier(); memcpy((void *)&shmcopy, (void *)shm, sizeof(struct shmTime)); /* * An update consumer such as ntpd should zero the valid flag at this point. * A program snooping the updates to collect statistics should not, lest * it make the data unavailable for consumers. */ if (consume) shm->valid = 0; memory_barrier(); /* * Clash detection in case neither (a) nor (b) was true. * Not supported in mode 0, and word access to the count field * must be atomic for this to work. */ if (shmcopy.mode > 0 && cnt != shm->count) { shm_stat->status = CLASH; return shm_stat->status; } shm_stat->status = OK; switch (shmcopy.mode) { case 0: shm_stat->tvr.tv_sec = shmcopy.receiveTimeStampSec; shm_stat->tvr.tv_nsec = shmcopy.receiveTimeStampUSec * 1000; rns_new = shmcopy.receiveTimeStampNSec; shm_stat->tvt.tv_sec = shmcopy.clockTimeStampSec; shm_stat->tvt.tv_nsec = shmcopy.clockTimeStampUSec * 1000; cns_new = shmcopy.clockTimeStampNSec; /* Since the following comparisons are between unsigned ** variables they are always well defined, and any ** (signed) underflow will turn into very large unsigned ** values, well above the 1000 cutoff. ** ** Note: The usecs *must* be a *truncated* ** representation of the nsecs. This code will fail for ** *rounded* usecs, and the logic to deal with ** wrap-arounds in the presence of rounded values is ** much more convoluted. */ if (((cns_new - (unsigned)shm_stat->tvt.tv_nsec) < 1000) && ((rns_new - (unsigned)shm_stat->tvr.tv_nsec) < 1000)) { shm_stat->tvt.tv_nsec = cns_new; shm_stat->tvr.tv_nsec = rns_new; } /* At this point shm_stat->tvr and shm_stat->tvt contain valid ns-level ** timestamps, possibly generated by extending the old ** us-level timestamps */ break; case 1: shm_stat->tvr.tv_sec = shmcopy.receiveTimeStampSec; shm_stat->tvr.tv_nsec = shmcopy.receiveTimeStampUSec * 1000; rns_new = shmcopy.receiveTimeStampNSec; shm_stat->tvt.tv_sec = shmcopy.clockTimeStampSec; shm_stat->tvt.tv_nsec = shmcopy.clockTimeStampUSec * 1000; cns_new = shmcopy.clockTimeStampNSec; /* See the case above for an explanation of the ** following test. */ if (((cns_new - (unsigned)shm_stat->tvt.tv_nsec) < 1000) && ((rns_new - (unsigned)shm_stat->tvr.tv_nsec) < 1000)) { shm_stat->tvt.tv_nsec = cns_new; shm_stat->tvr.tv_nsec = rns_new; } /* At this point shm_stat->tvr and shm_stat->tvt contains valid ns-level ** timestamps, possibly generated by extending the old ** us-level timestamps */ break; default: shm_stat->status = BAD_MODE; break; } /* * leap field is not a leap offset but a leap notification code. * The values are magic numbers used by NTP and set by GPSD, if at all, in * the subframe code. */ shm_stat->leap = shmcopy.leap; shm_stat->precision = shmcopy.precision; return shm_stat->status; } /* end */ gpsd-3.15/ntpshmwrite.c0000664000175000017500000000407312520742615013305 0ustar esresr/* * ntpshmwrite.c - put time information in SHM segment for ntpd * * This file is Copyright (c) 2010 by the GPSD project BSD terms apply: * see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include "ntpshm.h" #include "compiler.h" #define LEAP_NOWARNING 0x0 /* normal, no leap second warning */ void ntp_write(volatile struct shmTime *shmseg, struct timedelta_t *td, int precision, int leap_notify) /* put a received fix time into shared memory for NTP */ { struct tm tm; /* insist that leap seconds only happen in june and december * GPS emits leap pending for 3 months prior to insertion * NTP expects leap pending for only 1 month prior to insertion * Per http://bugs.ntp.org/1090 */ (void)gmtime_r( &(td->real.tv_sec), &tm); if ( 5 != tm.tm_mon && 11 != tm.tm_mon ) { /* Not june, not December, no way */ leap_notify = LEAP_NOWARNING; } /* we use the shmTime mode 1 protocol * * ntpd does this: * * reads valid. * IFF valid is 1 * reads count * reads values * reads count * IFF count unchanged * use values * clear valid * */ shmseg->valid = 0; shmseg->count++; /* We need a memory barrier here to prevent write reordering by * the compiler or CPU cache */ memory_barrier(); shmseg->clockTimeStampSec = (time_t)td->real.tv_sec; shmseg->clockTimeStampUSec = (int)(td->real.tv_nsec/1000); shmseg->clockTimeStampNSec = (unsigned)td->real.tv_nsec; shmseg->receiveTimeStampSec = (time_t)td->clock.tv_sec; shmseg->receiveTimeStampUSec = (int)(td->clock.tv_nsec/1000); shmseg->receiveTimeStampNSec = (unsigned)td->clock.tv_nsec; shmseg->leap = leap_notify; shmseg->precision = precision; memory_barrier(); shmseg->count++; shmseg->valid = 1; } /* end */ gpsd-3.15/packaging/README.PACKAGERS0000664000175000017500000000277312506064430014661 0ustar esresr= Recommendations for distribution integrators = The X11 subdirectory contains icons and a project logo for use in desktop packaging. Usable deb and RPM specifications have their own subdirectories here. Our package files want to set up a hotplug script to notify gpsd when a potential GPS device goes active and should be polled. The goal is zero configuration; users should *never* have to tell gpsd how to set itself up. Bluetooth has a requirement to be able to write to the gpsd control socket from a userland device manager. Accordingly, you probably want to set up a gpsd privilege group and make sure the Bluetooth device manager is in it. To avoid problems with gpsd not starting up properly when devices are hotplugged, make sure the installed gpsd will have read and write permissions on all serial devices that a GPS might be connected to (on Linux, this means at least /dev/ttyS*, /dev/ttyUSB*, and /dev/ttyACM*). The gpsd daemon needs to be started as root for best performance (it wants to nice itself, and needs root access to kernel PPS devices). But very soon after startup it drops privileges. gpsd normally figures out which group it should move to by looking at the ownership of a prototypical tty (look in gpsd.c for this code) but the owning user and group can be compiled in with build-system options. Make *sure* whatever group gpsd lands in after privilege-dropping has dialout access - otherwise your users will see mysterious failures which they will wrongly attribute to GPSD itself. // end gpsd-3.15/packaging/X11/gpsd-logo.png0000664000175000017500000004020612460513551015447 0ustar esresr‰PNG  IHDRi~'Q?bKGDùC» pHYs.#.#x¥?v?£IDATxÚí}yx\Wy÷ΟH3’F»dɒlKÞc;Ž=qB$¡„RH€Ÿ(Žð(mYšŽJ)ô#,% „²’}!qlÇ»-Y’eíÛÌH³Ïܹ÷žóý1‹F¶ãE¶Ò'o=‘5wî9÷üλœw»$|y ÞŠ¿l¢oöÞŠ“ÓÛ œèmÞô6Hoz€·‰oöN‹8Ÿû!ä͞ÑBoN✄ )[ª4AŽSpÎÎsŸýŠ· ':íÏ4¬þAFR<µ3c×&B/”§"fDJ¹ ÿÃ8ì-njêè˜.¯¹À°:ŒáŠú öké„3<°nh÷—’ÓO3œ›(e¬ÿ€ýå‚TÊù߇þ‹²ŠÕ+rBžÅæIʺQ–yßLª}ÓŽäiZ6³ûÇU3CÏ‚dM=M8ã9 8! Œ!¯Ñrì™ÿì/Lá ÍeoörT…s€³üìD©V—awUrQ”ÇT×ÚÕŸØ$‚sØl6Tnžbåmõ晲õ]RS`¹>~¹fÙ׊lŠÏJœ¥ çȖUŽ€k­gªÍ *Ü$ÌÔÁÌüØ%sú ŽŒ©Ÿ;Îóàp€PÂT«Ãpxj2e•éòªötYUWÆémÌZì~96s€þ©ûnOÇbé1§ÿÂawÕåSîÊóýñÐN¯b ”×l‰Óz_G—…ªF_âÀá#VA’šÕ2ŽøLO`vüé®è诧.ÿ]‘@óù¢®%%-=£€bãêlðžèµ‡'v+3S=b":A²š–Ÿ×›Ø/îJ%Iw–Õ€ ëÕÍç'üµkÒO}V±”1*ˆ9æÊ]Ÿ²¹µ]åÓ¯ü²,›XüyL¶Õ‡ÝöU¶Ü6=þ§ìr°ŸWèþÌ@ þœ‚(:((ªS«—'e‹¯ÕHŒ˜vû BSRœš€:O*6œ‹Š¡)éÄ€-2ÝcŸÚjíYÛ#$cA0“¿Y€œ! q€ ÆIʖU4%k[.ŒÔ¶^÷×®ÎØœÕ&Ä90–Ûń€[44` Ov3BÁ åÜðfb‡³Båâ%×\ß圍9ƒÏ<ÒÞpð¹[û“«ZXeãE\’9óÝí.Ÿ~VØùÌ¿MvnüxÆá©7© qBH~\bPA5l®†€ÝÓ¬]|¥žü”5p~Á5ÔóžeìÈV! ‚åŽoXçTÜqÎA“óÌêð$ëZ.œmYþÞHuóÆŽÕ` œõ8!€`è%˜²Ä–ØL¿%Øý¬߃üy)?¥Òku]wÚ/Œê‘±‘™%Ïý惄P2n/Û8䪺dÊ[µ)®Ú7ôœúÙÓ}ßã„Ýé­Ñ*jº4§·1ã­lKy+:Òβ&Íb¯0Qᥛ%†d{$Øí9²ÿa÷¡](Áñý0u„æ ’·H9ÎÉ-ŸáòÖÅZWŒ3žxåûcåÕ+ ATÁr‡ÐÜPP0ŠŠ“ÓöÙ©ýŽñ­Öñ—•™©n1Ÿ"z6 fæP÷}!6;yŠb€çÁ1©švÂyÏÌj×lIžw$¡5E4Ý®1®2Æ@)…*Í­ÈÑz‡ed¥K}m£G}¶Sæ/8X6d2ŸàyÄ:!ZUê‰5—~>ØžôZƒRà‚€ŠmO|œúŇîLRÉy˜ZÎߥ”]ï7R‡®Èÿ™—Z§ç€@zYEÓÈÅ7üûtmÛœs:Çú„{§‡·ÕŒüÈßZ{žgŒzf2šsPB0Bä¥?œÈ|ñáð5“±€“33ÿ$óç¿ .‹¬­­ôîÿP­ûǗXØ/U3ÍwÎ@Ôæt°mféºMµ¯ýˆ®ÚŒr&ŽŸøÈ÷ûŠ‚ÞGÕuq_õªŠÆfëìžm?2±ër7ÓÇÎ9H%µ^~ӏŠÍœ±¢%€gœ;YõÒÃ_¢¡á³ašrÎ!PJö™òÅ_è ï•Ñévm‚c7'?ÊèãàyídSUýúæÀŸ­¶|¹Žk{LÎ T©ŸIÚݍ=²ûŠƒ¢ýÊ1ÉŸÜ»xI­ÉAUEFdv`б~Ï3Ý ‡fâôžøŽ¬€ ¯¿qðò›~ 4_„‚W™ˆœgê÷<ÿïUÏ?øšŒ9ÎØÍ[ì†Üù鞙{¶ŽN·Ìä:(Î!p8PUŠaBÓuaO(ֺߐ6®ô¹ø¡±Uü¥äaâþâ®Æ•wòÚEKËêÜétšèÙ,!­6:19),7b¿§Œ§³qO+2K8³Ú<£›ßý/áêæKÀáÓ:[·ë™où_zøK$«%8=CñV2ŠN%뿏§ŸŽu,Ð1gž›rQڜ$ÊípA èêêĕW^‰ÎÎN8ìÎñÒÐÔÒ/öÎþÇU;)™ïü>]¢œq?Œ~ÑjU2é8ce>ŸÁ`º®CE€k­æÒ²Ó]—S)·Uipõ%Ÿ™jXr g,·ƒ‘ÓAՇ¶ÿÔÿÊãß&†®”rA/ž§».Úmˆ—?8<óGçŒ.ÎYɏ9ï«ÕŠ––\xáf,]º²,‚@Çóƒ£KŸ;žºS§¢•ðÂD–è±'ØØPŸ¿²ét©T šŠÁn·Ãív# BðøÊ÷©Þ@Èi…üO €Âb'Ú.ïÜøIÅÜBQ65ôRåK•dµT©ÕD8qHŽ­IÁMqzù„sp*S7„âIkîÎ%n!ÎQküurcÃöíÛqàÀ$“‰¹ë8Ão&¯ÚŠKWÓü™f¡äeÙáÚéÁGgffUUUH$Ð4 ©T ^¯.—=6ÿUQ*UžuD8³X]£Ýð¯QOåR’—õ ªž™i|þwÿK™ÚéP\BÎ9ôëùÿekžï0QÖVš™ƒŠ9?u8B€À¿‰|i"ž,£Ž 9€šÿ! „¶8ç‡Ã8rä0== Ã0A%é¬!ÉV›|©Kü=eÌ\С—PÎ!ƒ%º•×qIV À (++C8¥†®CtzÜòHÿÎ:’=ÀNр8)'垈!ь쪙@ÓæÜé;Ï®”ÂwdÿƒÖ#=Ï¢ÄÄæyE§²ï7ŠãË›/­ÃºKÞýC[ÓÏqÛÍ&,ô²|(F Ž ÆRÕG/^n"(s¿ûØŠiÂ0 ˜Š V Ÿ@Nœ<Y;ÉÅŠ…êP’ß*õ\Û­Žöo÷–•ƒ1Ó4‡áp8àr¹J¥@U>à ÜšA9U{Rçಪ„ÛVßhPqž«GÉf¢e^ý9LÝà%‹“K ô1fÿ€óüK/MÄ¢HÅãX÷î÷.z¬fùü”úŸ€r“7Ë^oª„ eÑËÖ¹ €¢qP P©±PøîëVØH°Çiß Î;èX¢œ(ÜL.KæŒ1ø|>˜Š Ó4 QVV‡Ý†)oõcT]zª£\'qŽlyUGŽ¢n=òb®pjvÌNíW'‡wÍE”û˜révOýo•$ 8x`?:º–[Í ¯¹õ߄ÀƒÛ‰ízN©H9Çñ7Á„fVëŠY²°s¹À‰9=UdnÍýM„yÿ>ŒŽnˆƒi£ñLÌQ’ß@KXò 9 ¢ˆÉÉIȲ —ËB²Ù,fgfànl.ß%:ßE(N›NÁpàHV֟§)Vßѹmö©áíDKÇæ®Ì‰šˆU¿}w®»bKùìLÑhv»v»™L‰XŒtœëœË tÝó ÓõOQ*UÂçO8¿fLT€å€¡”BX­x<®|.ʜîÉO @Î`ȉ¶œuW__‡Ã`Nw–—1†1Íl*žH@×+&•e²,CŒÃjµÂ4R‘ÙŒ¹oÇ+èœìà‰AÊ[oéòÀvÔý(çPÓ‹.{ä BåGˆçóöU6ŒŒ@–e,^Œ»wï†Ûí†Õj…(Š˜ …PÛÚàšÏÿÌp~Û$‚|Œ‡NŠ”ãžÜßDQÈeEUUDQ*++qÕUW¡ŸŸŸÿüL&pPJÐÙى뮻èëëC<GWWjkk …pÏ=?YÂ+Àsê„ÚT º`€_ B%'7&}à1Ã|û ýP÷t5Ö¯ÁÒeןô]›yæù /L>¿íƒ±­7—éþiÂS0Á ]ã˜/Ç!H—–€  xÁPÞ7TÛþ®eˇ‘Íf‘N§ÑÚڊŸŸ>€Ói,Y²CCCàfF‡cWg&Ÿ^Á³}…èú±cs(Z*+V¬ÀŠ+p×]w᳟ý,ÆÆÆðŸ÷œííí9Q+P8N|úӟÆå—_އ~7Üpn¹å|ó›ßDcc#>÷¹Ï£££Œó*مIÝT4Æå3ñ7æãLØæª¹ã+¯~áÿšŸçŸ¢ž,ÍF©ÓéT5~ûÛQìÞ„Åâ„kó†}ŠïšÜFy}˜Nn݆®DÃó&“ß~q_Íj®Z]ƒP:_®Xü¥Å˺,Û·oGSSl6&''A)…Õj…ÛíÆ®]»ÐÖֆD"ÿŸW~ŒVÈþñuc:ù¿©’hPIÀ%—\‚§Ÿ~÷ß?FGGñƒüŒ1ÔÕÕÀår¢¶®n·~¿ÓÓÓøîw¿‹ééi”••ahh/Ÿø"-jÆúõëPjˆ(m0‹j;ŒQ"VFV_|Û_þjŊ-×6ÜÇ]_KŠR…ÐÿòK’¬ctŒ!™6a³QœÁzŒVuŸ+Iç‰6ljA"à ÖÐø^¡DŠPÏRÑÂAŒR¹ZãĒJ§Q]]ÙÙYŒŽŽb͚5F6›…ÍfƒÓéÄøäR»¶Ÿ|’Ÿ‹2Sç'Qšªª¢p΁ŠiˆÅb8ÔۋŸþ~ÌÎÎB×4d €’iìÚµ“““ËeoE"†ÁÁA(óŸH†œ2˜uÁ1ÀübF ֕5·ÖØT_ž²§Ìý(w~Š{bž"“D]­ ³aàê-ho ‡Ã•OtïS8'XǶ)éÄ'Žxå„B…“L:ŸŒ%ûðL÷»'þôà3³‘DQ„×ëEww7|>öìكrŸ‰ñ‘™-Éѯy¹>΀ž 8TfÄLÃ@<GSS`ÿ:r;ž{Žä>\¿–á+¢ØÜ:‹Ïþéd^¯ …°k×.xœ^@8>FÈŠgܳ`×çЩ ©TÏhòÀ‘#H§Óp9Ø©‹éFV ÷œ<ÞÙeC,–‚Š1LM ¡jtÏ\H„@Mîìzî_,™dˆÂ)8sÌNõVîýó=›çh†¶»Í&$ CCCp¹\ ”B×uŒŽŽbåʕèéîf͇w~¹š?u*¡k@ºŽÝ»wãꫯF×òå Š? cÿSÿ-ëbøð{%|ôƒ">ô>‹+¶!tàžhŠH ë::–bÓæÍˆÅbØ¿ÿqÇÊŠ4cpèv †©ºâé¬rók¯œÆ8Ã0`w8àS„àíJì“-cÛ~R]“Á­·.E<9‰]/þ.ܖ~š4œéxšéä&8! Ì4}۟úWçPÏÓi_õRbºmb`« 1)¢l3”÷Ø®|χŸ|Û_cßÞœøÅ/~—Û —ۍØð0Æ&'áêyæjšüc§äç9o Hxòɧpͻޅ;>òAüñž4û"š®3±€“"P X-"\i Áj¢¶òEÜzµ€6Ÿ ‰zŒï֏ÁçUðØŸžÅžœûŽkêë&£Sjç儝qufzç‡U|aGEÙýWnÙÒŠkúãQF1^žÕz;ҏ<ôêîð5,òx<*ëmJª‡z %ˆR¹Úʌ°ÈÌÌÑó;)H€3ԉ¡êøàNB€˜ W©úÔA*ULbä&!Ò#BàoùUÿûӋZVÂnwa£H°{÷‹øþ÷†+·lÂ+<4z»9yS,ªËªËÛœäÅGÿ> ñ+m›_ÏôTP‰¶ów2uËȟþ§Ç¿ßQ‘ÍfÁM³ŠÍS‡'UÁ²kW׀AÀï9Œk®®BÛ‚Åñ±‡/$‰Ÿ²Œ©î2³c§ŸfË(º•Á²‚À%I€ð:€r'‡ÇÈ ÉGƒe‹ÁãT'ˆvñ‰¶o“°€!¿7‹»82‰\Ðoþ6çM€+_Iãª+Ùo°×wÕž‡pœ¬¢eâüw|e²¹ëœ&ˆp„jZ/ª]<Žá©ûî`,w`‰ Råï=-?pw®jm–$D"d20ÆPYY‰©©)˜îòºý‚ãÊÏ*Í`:ý>Š™•Dɐ$²"a`pýq ·‹Û°ç‘ÿ׿%uøl` PAHÁ•$‚TN%{4©¢ќˆãñŽ(sš ¡š`BR9=Ӌî³øãïè³ ëZãpÒúöêxîyáœ.Eðûý(„åu]ǯ†g>0CåÚ×]ÎA˜ .ɖh熛ú®ýëߏ-Z~“ H„³\t‹3ÄÊkÖdeÕUxZ7ˎ2Ñíٌ†H$‚ŠŠ ’ “„ÃaH’„@M :*nHQÑ}z:©Ž˜ € ÷™‘Š•åë4MÂΝQLMšžåÖzôzÖ#/?å—ÉÐݺåU8Þ?Nå¶H<.Ô©m·xÄò2mäTaâ°ž°$=•1Yâ¡!»ûUx«9œŠHY˜51}8†±a D9ºêSP˜†CLô[1«Áñ#-ìKF©¯¯G[[º»»ñÚk»L&ðêDžóñ÷û?`§ß6X>ȉy•ŠbºnñùS+.üTš®m‹N+Ø\ý8'¢©'琓 gFg*øÀó™Ôõ¢ÕŠF"hš†ªªªâÙ- 5,^yxïðúeÐ+âÉV‰š×¬ €DÀí‰à€Í®¡2P‰ß?4ŒM›*`µNðמ¿?)€Ùå;¢â:Zݰˆ[lvE–ÑqaøÊ'·>Éߛù+sŸp " IÕA)ê;7ÀG£8л¢UAMµ‹GW8H†A–zÒPÜ:ÆFL<¹8<Ó kýy[*ÑB,šˆc×®]0M}}}èêêÂÆ@Ótlߟ ZV'?žœíÒ¥ŸËYº—Š$EÍׄ—®»9ØžôÝÙâg¹–ùg(dOIÌÐ|=;t¢þÌ8Ðb&Ÿ{úp÷×ú Ïc†B‚Á 8çðûýƒíë.Ùóž%,ù'’OŒ9!HWÇ~jœL`fªƒf_Jp❰;Ö$v?‰Ž¶ÍøØmK Jv>ðßäCw)Þ©7w¬–%+V¬Àµ×^‹††LCžÿàö*–ˆ‹­Ó4ræî±ùøÁ A–SšWUx|~ø«–"t ‰©Ñ=X\MÐQG`ópdffƒ@dŠcO°}¯€ia*–^«Û »Ýα{÷npÎ1==C‡¡«« 6›”0F±srfуÕî~Ô+Ý©[å™@ÃEá¶Õ˜­nŸ(#[\` `f1cª°™AX3‰‰šOý³çÀ«¿(-ëáìܜéH…ì‡ÏãŒ! ƒRŠññqšª Ë…1ýÅÓÃSÐúù‰8© ƒÔö;gÓwˆÝé^>Œï.SV]ënûÔ%Ë—ãw<‚phñéÑØÆ‰WŸÂ ( Ô-VŠ®®.¬]» „`ëóÏiuÓCǗ¬œ~ºeÅ(8·EÃ}ΡîÇÕÉáÝ4•—–]R1Q©üÑPü33©ŽÕ¢ª`Š *+ðŽ_ŠÁnã܅öœiøË8R)`v‡Š’åkÎCuk'|º–.CSS²ùŽßíÛ·cddº®cëÖ­*þ 0M‚G5ù–ußàãuÍkÓVç’\ÌpJžG ÜðŽ÷?Wœõ±¯Z†z_0ϒ-ä†,Ó£tφ>ånhÌÌÌ@×õbÌK’$LŒC­iš;0Þ}e¥®ý;ãüø dp– ¶ûuû—mmªJl—-ÿ”ˆEÍ¿©­ýþ Üvۇðƒü–W~ñãåÖôŸî6Œ÷Š©èx÷Wàï|'îœ÷^(ŠÕjÅðorÿÕ5•“‡7_wOFµùÁs›@Z¶áv[$Øëœ|Ù>zø%ËÔÈN1cŠ©ÿ,˜ýÜÛÁÃ0QW_‡ro9‚Á ª–\ˆèx3¶ë‚&(µÁV^ ϒvØŒ~Ô7ÔcãÆóQ_WQÌ=jyyîû_ûÚ× i9%‰D ( ª«kÐÚڊÎÎNt,鹙 >Nó M Üyà*p{<Š€“ÓÖÄìáx84ýç?>yiEe†D#Qœþz|ä֏ ™Lâ™gžE0„§nÜ5`zœ› ‚*IPTímíX¿~=|>_qó|•›oŸûöíCoo/êêêPQQ@ €ÚÚZx<ÈùŒ„cªÐ Ÿµ8°€¢ãþþÝ¿)ÛýÒÈá‰>€àD9ðyB_iÄ~÷ÔôÔõ’Åªšª «Õ ‹Å‚ÉÉI8œNPB‘š¬_9î\ ãÏǀÄ€²ò_Ëg«\n9¡«« ýýý ”¢³³¿ÿýïqß/ïÕ¯Øÿc1'RDpZ³é©ÕkÖŽY,„g#Øþ꫆ڻ{ëôØX*ëŠV.)–’ŽÄ¹ô°üB˜„ˆ)‹=Ž8¬Œ©oC*™D8FMM fgg!jkk0>1Žt*Jç2nÀãp`éÒ¥hkk‡a†®ëÈf³Ð4 ™LšŠáÆo„aP”Ò"wpÎaDæ=9P 0k"2T~xïþ·2=¶¿è‹<É9p΀HŒðâÔè>Ϛ«#³3¹ŠI‚b±"‹fŒÞý»Wi3Wã;Z'ñ|«€]¿f®¯5¬=¿A‘DŒŒŒ ‘HÀápÀn·cïÞœX±bŠŠŠÄ§f&ÿ·UG|O=x“ƒ}ãÕ矪úéȐ;Ñœû`íHϯþšÅê÷(çY¹&_‘—¬»M% /Ž æ-Hî À¢ª°Z,ðù|àœcdd€xm™×‹žéi€ÓiPJa·ÛPSS B(úúúÀ;&å«0ž ¡Ê1›•Ï¥‘B šFÒ13±ÏÛ·çw®þ=¿—fŠ€å«N£‚„pr3Ô83òÐáphµ,+Ê'Ÿ]šœŸ¿ÕHŸ;wîĒ%KH$rI…##æÊC[¿øN» ÅŠe¹AŠvDá@(J’îñ7'ëâ5‹.ŒûkWeìž:]”ì9LÉ1‹XG-øÉ=úóÒ{”r c º®#brr‡`Ϟ=F0²ÝÿÙ^vcÅQ.›QŸ“ËžhíôšÚ až×wÇs‘ðå-Ek.N¥ÊïÂßâ>ž985…x<ŽææfLOOC’$ÌÎ΢œœƒƒƒH¥Rš®­ÃÔ£¿}ôvsòƒf̞²o®Ž (³ÚœqÝÚÿÇ<ÿ-õµ5ðù|p»Ý°ÙlóDVaa .]×!ËòI*·TÜMNNbïÞœ˜˜˜ÀÐІ‡‡ …‘NgÀòG’i·.ixðë5òmŠ®…Κ@;¿Þ…ÐÕÉ*âE àj§ô1fÿ„²æüM“ã㠄`éҥضm!Ë2R©FGG!I››±ýÑ? ßn†ŸfãÆ¬y:“.œ3! ?~°oÉw_;RÌda±šp8ìžõÖ[qûí·Ã4Í¢Â×4 †a€1†x<Žp8Œ@ ËÏ; J)A€(Š(€ýªª UU!ŠŠŠðÌ3Ïàî»ï.&aÎÝC(g ÷öŽ^Ón«ÿô­Ná+`æ©f ûøù5(5¢ND"ç9kî5®lÙîmžcCs3™œ˜¥9åÛÖֆL&ƒC‡aíÚµ!œög/KO|»™kÛN/FT²£ò"v'W¯þVÏØiM&„ •JƒÒ91TWWWÔîI¥RèëëC$ACCC1}Ùb±ÏDG'è3Æ`2™ ÐÝݍd2™×ÿÂŒ$Ë\.ê\Ñ!-+ük÷ä':WÕn_#dþp&EѧC"Ç ‘ªVªŸ|ÞeWxõôÀét¢ªª œœœˆÇãÐuØ»w/<,6Ìçùͅbâ'E d;*J¥À?÷ÍüÝP8RFɜ—Ðë-çO>ù$àñxPQQ¿ßÓ4199‰îînLMMAUUTUU¡ŒŒŠ¢@Ó4ƒALMMavv‰Dét™L©T ±XNÿ755¡®®ÃÃ#(¶?*ö*ˆ¡¹Î+cÑžç®Áè—ÿ³Õ¹×mdO–Ls6Hø›f/t*:3aÍš)¶úªªD—Ó‰={ö`éÒ¥Èd2ˆÅb$ ªª‚ "úžýS÷-,øI7Œ‰ËfÎA)Åý1þ‰öŒÝÌ'…Š3„•hooG2™„Šiðx<𬬄Ífƒ$Ip¹\Eãå‚ .@cc#Œ^/$I*rŽ$IEŠi"‘H  ! !B×u˜Š‰ªª*¬[·¯ŸºÉd‹·¢²²ÑhŽhšç˜e®\f8‘®®ôºS«URÌ*'ŠÖÖ޵µ¡­­ _|1:::Šåö¹‰DåååXŽhQ±Ì€(£²,¥BSSš››QUUY–‘ÉdÍf‹ÅŠž†íÛ·ƒ1¿ß²²2d2d2™îŸûnlÚŽ ²|ÂìÛùôçC¢(šªª‚ÓéÄèè(ü~?†‡‡122R4݉|>’ÉdŸÃÊܘM·×xœ³k­äés©›Ži@)p¯$ƑT{üÈÀ€P13þâ¥Bê¿À9;€ò}‚ð‡¹õ·“ï°Z,š©©Á¡C‡`š&þê¯þ ŸøÄ'Šî×k®eÍÂ;5æª1reü^¯v»ðì³ÏbÙ²exÏ{Þ]×133S<'æÆÊýpƐŠÔuµßö{•³Ä¹éžù®29Ë̎PˆþÍõ4ö„1ãd ö'# AϣѫMÃ@MM ŠŠŠÍfQQQ[n¹å€-*Ü_E,ZŽ«V­Âe—]ŸÏ‡ææfTVV¢©© ©T v»BŸáré÷„c­û5²A8Ãf'¢†Ï cz1“õ ãDB°7K7o›Žt© œN'r•5ïz×»°jÕªy øFQaŒ––477ã•W^ÁŸÿügD£Qd³Ù¢‹*‹{H€qMW^Œf/¿ ‚>@LvNDÞɋÈrOpÜHãi/D®"Pz0˜z_$™²TVT B.//LJ>ô¡z±ßr»ÝXŒx1&''1== MÓÀ9‡Šip8ìÈy"ò‡Ý|€h[8¹&Ñ{®æô†œ?©3ÑÏ¥µG.!p:˜žž\~ùåoÍ[JÑÑÑqÌß³ÙlQgÍQnóöÇÒMŒ6Ós4í7 €|3'úÀtúóq¯ªš0 ‰DV«7ÞxcŸ|ÿÍã¢555A’€ÜŒóÆ4M(Š’_²Ÿ€p:ã<’1Ÿ+#ü ©ÈELZuÿÈìu`&,µ(JÚÚÚpÞyç¯.„$J}h§5Ÿ^2c>ãG—ë°uô¹pŸÊÿ«ôdtƒöЌegÚ¬ãõè ‰p“ ҜәÛfb•@îŒb`ݺuðùÊÀž‘ëUÇ Ý·8_xÔæØ’,^ü„#9¹ßK·ƒÛí.‚T.wf+tj8Ƛ¡/™]lzNÞýqÎA*pQ·.lŒpú]98$IʇV­ZBŒ à ù 9· 'Ûýó"¹‡(ŽJ)~L@1wÞ¡(tÒË]i±Xò¢mNÜÙívd³ZɍJ`åÀ@<]ŸqŸ%AÊë"<<›}ÏX,á™ËçDqAs“!‚PÚ³îx™kó¿Opœ8 Ö蜟¯Ø{sVr˜¹ÿò-AE¡“*è —Ë…h4×âa.Áe®Š}<­Œ2â;Zé w)Pï+¡ø:”D? À$I°Z­(/Ÿóẕ€=),h~څà.9êšޝÇçºzåo žÿ)P¡e$I‚ÓéD$™wMé-cZÖ1¹÷\Šçž“2˜LŠ…‡+øÜœN'dY.ŠÇꑒnZ UâŒÎ_BJ°"ǙCiNöq{i$€lÖȧœ›ðz=ŘÔÑ_+Œšé†˜Ôtù\Xxoœ >÷hŔ¬²²2Ȳ\ ®ñü»–ŽZÁ£îBŽù=/xòïŠ8Öª›?~é"•Ö•¿šÅ-Pcc#&''çåAÌe/寡”rQÀρs蜿‰Œs@E®*đKˆçÏÌ"‹Âëõ"Ê·1à ¹}Sh6x­tLB%0H^ø#)ŠŒ£Ï^9QEŠöÅÜœЧАL$àt:ÑÙ¹ @5zzzŠ Cc(Ô2pœV5Q®H3œ™g=žþ†Œ.NKø)ìqҖÆ@.rp”aÿŸýèêêÊ+džïÑÏòÿ'˜;8žˆæšå Íå¯Íÿ6?JÏŒ†œ9ž­V__?š  µµáð öíۏx<Q`š&ššš000€žžd2ÖùÝ;*©yø˜¶EgÞW˜ Š"gZœïi_jŒâ<—mM"‚aއŠa³YqÁÀ¢Zó H1Ç 'UÌ-|Á¬(˜Ý…PFá RzÅ\š9KÒÐHÅÆ`QüêÞû069ñ± ŒŽŽBÓr%1Œq$“¹Ž6«ÕŠ÷¿ÿFLNMƒ'‰¯uT~¥Žg÷ži¬íxtî9‰I¯óŒ²†Ðª:›†*`‘ Zkê|~ôÃOîù9dIÁ_¹eeeù0EañOÎë-ÈQ\s‚5#„ >;'ñ·0£/£©YÂEÍ <'$0‹çÏoóãWŒ™ùÈmétŸž¬óµ5zâ–>7ᕳÃI…åÑ *+ÊÁ:ç×§ÉþUÍ5 ~UåP»¡Ò/¢xô©mĪU«àñxpf‚œò÷ !8žõŒøÛ¯Ãë ¢Ê„Ó–ÅoŸÒŽæJ€ŽNS&„ ŒŒ öíÇŠŽ)üõÍV¿*bd8¶•sÆÏ6PglÝ勩!T’Ej±9‰Õî"ŠÅÅlÿX•ÿC=ڑ++\Yží€ äÞ+!‹eeÀò%>°…Âç¢øõ¯‹ßüaŒºíÕù÷?jŒ£œ gJ3“£0²YÈ €PduØs!ãap°»va·ŒÃ€ì³fVNþ-i¯œbÁ¯S8±ž# ˶ٖڛŠÊø–O4]²Ñ O†%JzÊŒAkM%…UaEۍ@ÊËV/ËâêQ÷>Æð‹/àƒ7}_ÿú×qýõח85Ï>qÎO$…©ÿ Uܘ0 ÍRr糂ˆSžl7]!ÂçJsÀdƒ£©ñá€ð؂š+8砒,/«ÿ¿»ÕƒŸ²‰c›b€ì^ÎQoãðž)l6€Å·œ²ÄPYIpá=ƒ"þŒ×@?>þñcÿþýøÌg>ƒòòòsÐàà þüòË8²ï˜™k)XU-Ð=H.Žïå$ÏUåN‚›¯’qAW‚ONá&8ÓωŽ?£›Ρy\íû”‘[œÊ ¥¹šÀ¢”'%€@  2wåêPd9‚ú:Wž/¢DÂÔ¬h4Šo~󛨷oŸñoÌ Ä ™ŸN§±cÇ>|™ŽÃ$`z®BŒ1Xg hZЊ[‡IÃ(Ô̞þNçŒ,`Q8š Œc=PU&‚q’7}TU=iêñ©’ªªhmmÁøØ8vŒ¶š hzŽ›æúàP€ŠBçK ̀œ~²*&$q[õôêéïŠ7.úx=µ„Pr&@HÉfÓÎ4;˜ÉŠÐ œ¶«Ÿðö?&`f9<å@g‡ËVXåÜNmjlÂWŸr'ZZÎÎ»Ú !…ÃøÓ“O"™ˆ0ÀM’Ë«( {”†_ŸraA`°YtšêÿÌ¢wN^j{2»Žáý„ÐsԙYwùìÈ^·t:{ïœÿ÷_ÇÈÈ0dQ€]áEIFŸýçž¡(É/ƒ(ÉÀL:âbR…u¡Û댳ŠÍVV3«í6Q" QGóž‘ðœ…E †Ú‚‰#A<ú‹¯Á[Ոæ–e§œx¥‰ÿÝÝÝžûî»qß}÷!™Lƒª(ƒ •§P©XÌ%ÇP˜C:k‡ÇhØ*†&zšK¿`ÙÁ9¡A¿ýê¬0Vã÷ÈgÁ) @8ÓUáXŽX€ߍïýÃçÑ}ðài/c ‡Æ·Ÿõ-\{íµøñŒT*•oéÉaUQä¥Ü˱Žò£Žó.)ˆùÜwÏ©8C,¯ï®8˜þ$3 =:,xY îpúÇÆ­^Œ.I`E3`ᕮùÅ59 pyZ zŸ ŸŒíƒøÐÇ>ƒ«¶lAyyùqÏKœsd³YƒAìÛ·O<ñ{ì1ô÷÷óüæŽViÎä6M@ϟ÷ op™?«’”±<·q0à,—ÍrhYà WŽùqçîØßc|r?!³ðœÏ9²²à³‰›CUQl8;¯R'ÇÅ"û“MސZB°,  ÊGÐ\ÅÑ¿wnÿØÇ°tÙ2¬_¿íííðûý$ ét¡PƒƒƒèééAoo/†‡GN§rã Zò6žB`Q–9D’{÷R†i#çy¥ùi^¹Yå;vå»ï˜Œ#›%Ð4 “fÈ*dÚó°–WÝCæ‹ÝC “Nrz*Öá¹)7käšm0FrAzTT5ïu˜ó¯rÌíªãOœrì8‡™eP—š+£è3°}ûlߟ=×=KóÑRÓ4ŽiQ“æøÑ[U$yN"`œC78Š ĊIŒ(†9rŠz& €’@d†#“¡X¥jxãÓìґÁ‡y:•â gáð ‰ȺŽ ñÉÈp9':6‹œÓM¢È!PZðç€6gÚC)`óù­ JDN Q‘˜pš‘”Jr‰+†qt8:›s9z”ä*šƒqdM Ó䣠ހ a~¶†AÌ‘E($b™:eéÖE£ÂÔÁá‡y&•b„€Ð³—·`8O-ó|µ¿jãç"‘‰–™DÄKhBi ª`B•9…BQE␥ܢ4oƕdœrp^š¿ÊÁ 3 )‚lŠ#‘âà,ŸdŸO2§”æ6CÉkIIÁ?E(8!0óoOf@ÎÄϧa1£È€aæÜBÉ ÑEá àÂ\fyZ·»Òe5kâ~ûÚi š±ÖÁt(H‡D™fˆËÎàq8m€UáP@QQ$ùzN çD(3si3Ñ0Çl„#’$H"o÷ÛÇV–Ùv/²ˆ+daÊ.Òh±Ùc ™TŽ…d†(CÓ4ײ¶8߬É}áLÖÊ2ߌnø %ÙšÉÆT]Ò0cÙsù` sœ§ë‘8ÇØ$Çðފ:eÅÎuüvKhxçü„m=ϔæš.ŠÉŠ…s‚ ’€˜6[uÂn]=¡gšŽdSˆ3³Kf_DĄͪðXŒNä~l€Í HR!‡é€–bA‚CÃۆMÌjå3yk|‰bþÔϳ}"g:)˜À'ÝTys„¹ŸüDÒ%Ùûc.üú©Þ=ŽŸ°;8üÀãÈùe9'B“i`2È16maRû£&ÈßIÑÈŸ“µA;tæ9ÅĶÜÿ3ÍÔh&=à cÀM)Úš@3‚Ó;%–u6qYw4uŞÑТt6f·Ë:ªœ@­— Ò Ø­€LÓb `d’£{‚!ÅíìæŠŠmNÇŸÌ ÃäŒÓY B)Mþµµ ÉܜXk÷>ôµlF’‚ª˜Èh!@€r^Üœ‘„#»Þ¶øŸ‹ÂÚÅLzá}•NwÏ”“NŸ8óËTHV’œS’ŒzŸa^óZ¡Z.΀Z’†®zk¢•ñg*Rñ§ÍŠÎÅâð|tMR|}Tºx •nKŠb•ÌXÒ'K“uª20²¯Ê™ÔgìŽßÿt6èM©žP(yg"¥Å0gìuȞµñ ›¥ÐÜ©P \RBóF¯GoHUÅÉšT¶çÎ2¥Ut õžÆø'û ÿdôÒ1ô&6ÛxSÇ~zÃ*ýÞŠ…ÓÛ œèmÞô6Hoz€·œ Ò[€Þé-@oƒô ·Az ÐÛ œèmÞô6Hoz€·ý†sOªâroX&zTXtCommentxÚs.JM,IMQ(Ï,ÉPÉHUp÷ô Rç#ËepEzTXtSignaturexÚÁÀ0À•4€ÿö!wzz51ùÛò:£Íf.€©3.æ‘Îh©JÝoÔŽ»òhÍ·RPeOIEND®B`‚gpsd-3.15/packaging/X11/xgps.desktop0000664000175000017500000000034612460513551015423 0ustar esresr[Desktop Entry] Encoding=UTF-8 Name=xgps GenericName=GPS information Comment=Display GPS information from a gpsd daemon Exec=xgps Icon=/usr/share/gpsd/gpsd-logo.png Terminal=false Type=Application Categories=Application;Graphics; gpsd-3.15/packaging/X11/xgpsspeed.desktop0000664000175000017500000000035212460513551016441 0ustar esresr[Desktop Entry] Encoding=UTF-8 Name=xgpsspeed GenericName=GPS speedometer Comment=Display GPS speed from a gpsd daemon Exec=xgpsspeed Icon=/usr/share/gpsd/gpsd-logo.png Terminal=false Type=Application Categories=Application;Graphics; gpsd-3.15/packaging/deb/etc_default_gpsd0000664000175000017500000000033312460513551016443 0ustar esresr# Default settings for gpsd. # Please do not edit this file directly - use `dpkg-reconfigure gpsd' to # change the options. START_DAEMON="true" GPSD_OPTIONS="" DEVICES="" USBAUTO="true" GPSD_SOCKET="/var/run/gpsd.sock" gpsd-3.15/packaging/deb/etc_init.d_gpsd0000664000175000017500000000774012460513551016215 0ustar esresr#!/bin/sh ### BEGIN INIT INFO # Provides: gpsd # Required-Start: $remote_fs $syslog $network # Should-Start: bluetooth dbus udev # Required-Stop: $remote_fs $syslog $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # X-Start-Before: ntp # Short-Description: GPS (Global Positioning System) daemon start/stop script # Description: Start/Stop script for the gpsd service daemon, # which is able to monitor one or more GPS devices # connected to a host computer, making all data on # the location and movements of the sensors available # to be queried on TCP port 2947. ### END INIT INFO # Author: Bernd Zeimetz # # Please remove the "Author" lines above and replace them # with your own name if you copy and modify this script. # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="GPS (Global Positioning System) daemon" NAME=gpsd DAEMON=/usr/sbin/$NAME PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME if [ -z "$GPSD_SOCKET" ] && [ -z "$DEVICES" ]; then GPSD_SOCKET=/var/run/gpsd.sock fi if [ -n "$GPSD_SOCKET" ]; then GPSD_OPTIONS="$GPSD_OPTIONS -F $GPSD_SOCKET" fi # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $GPSD_OPTIONS -P $PIDFILE $DEVICES \ || return 2 } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { # # If the daemon can reload its configuration without # restarting (for example, when it is sent a SIGHUP), # then implement that here. # start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME return 0 } case "$1" in start) if [ "$START_DAEMON" = "true" ]; then [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac else [ "$VERBOSE" != no ] && \ log_daemon_msg "Not starting $DESC" "$NAME" && \ log_end_msg 0 fi ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; reload|force-reload) log_daemon_msg "Reloading $DESC" "$NAME" do_reload log_end_msg $? ;; restart) # # If the "reload" option is implemented then remove the # 'force-reload' alias # log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 exit 3 ;; esac : gpsd-3.15/packaging/rpm/gpsd.init0000664000175000017500000000451012460513551015113 0ustar esresr#!/bin/sh # # gpsd Service daemon for mediating access to a GPS # # chkconfig: - 44 66 # description: gpsd is a service daemon that mediates access to a GPS sensor \ # connected to the host computer by serial or USB interface, \ # making its data on the location/course/velocity of the sensor \ # available to be queried on TCP port 2947 of the host computer. # processname: gpsd # pidfile: /var/run/gpsd.pid # http://fedoraproject.org/wiki/FCNewInit/Initscripts ### BEGIN INIT INFO # Provides: gpsd # Required-Start: network # Required-Stop: network # Should-Start: # Should-Stop: # Default-Start: # Default-Stop: # Short-Description: Service daemon for mediating access to a GPS # Description: gpsd is a service daemon that mediates access to a GPS sensor # connected to the host computer by serial or USB interface, making its # data on the location/course/velocity of the sensor available to be # queried on TCP port 2947 of the host computer. ### END INIT INFO # Source function library. . /etc/rc.d/init.d/functions exec="/usr/sbin/gpsd" prog=$(basename $exec) PIDFILE=/var/run/gpsd.pid CONTROL_SOCKET=/var/run/gpsd.sock [ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog lockfile=/var/lock/subsys/$prog start() { [ "$EUID" != "0" ] && exit 4 echo -n $"Starting $prog: " daemon $exec -P $PIDFILE -F $CONTROL_SOCKET $OPTIONS $DEVICE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { [ "$EUID" != "0" ] && exit 4 echo -n $"Stopping $prog: " killproc $prog retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { stop start } case "$1" in start|stop|restart) $1 ;; force-reload) restart ;; status) status $prog ;; try-restart|condrestart) if status $prog >/dev/null ; then restart fi ;; reload) status $prog >/dev/null || exit 7 # If config can be reloaded without restarting, implement it here, # remove the "exit", and add "reload" to the usage message below. action $"Service $prog does not support the reload action: " /bin/false exit 3 ;; *) echo $"Usage: $0 {start|stop|status|restart|try-restart|force-reload}" exit 2 esac gpsd-3.15/packaging/rpm/gpsd.spec.in0000664000175000017500000003722412506166335015524 0ustar esresr%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")} Name: gpsd Version: @VERSION@ Release: 1%{?dist} Summary: Service daemon for mediating access to a GPS Group: System Environment/Daemons License: BSD URL: @MAINPAGE@ Source0: @DOWNLOAD@/%{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: bluez-libs-devel BuildRequires: chrpath BuildRequires: dbus-devel BuildRequires: dbus-glib-devel BuildRequires: desktop-file-utils BuildRequires: gcc-c++ BuildRequires: libXaw-devel BuildRequires: ncurses-devel BuildRequires: python-devel BuildRequires: qt-devel BuildRequires: scons BuildRequires: xmlto %if 0%{?fedora} >= 16 BuildRequires: pps-tools-devel %endif Requires: udev Requires(post): /sbin/ldconfig Requires(post): /sbin/chkconfig Requires(postun): /sbin/ldconfig Requires(preun): initscripts Requires(preun): /sbin/chkconfig %description gpsd is a service daemon that mediates access to a GPS sensor connected to the host computer by serial or USB interface, making its data on the location/course/velocity of the sensor available to be queried on TCP port 2947 of the host computer. With gpsd, multiple GPS client applications (such as navigational and wardriving software) can share access to a GPS without contention or loss of data. Also, gpsd responds to queries with a format that is substantially easier to parse than NMEA 0183. %package devel Summary: Client libraries in C and Python for talking to a running gpsd or GPS Group: Development/Libraries Requires: %{name} = %{version}-%{release} Requires: pkgconfig %description devel This package provides C header files and python modules for the gpsd shared libraries that manage access to a GPS for applications %package -n libQgpsmm Summary: Qt Client libraries for talking to a running gpsd or GPS Group: Development/Libraries Requires: %{name} = %{version}-%{release} Requires: qt Requires: pkgconfig %description -n libQgpsmm This package provides Qt shared libraries that manage access to a GPS for Qt applications %package clients Summary: Clients for gpsd Group: Applications/System Requires: clients-x11 = %{version}-%{release} Requires: clients-cli = %{version}-%{release} %package clients-x11 Summary: Clients for gpsd Group: Applications/System Requires: xorg-x11-xinit %package clients-cli Summary: Clients for gpsd Group: Applications/System %package clients-httpd Summary: Clients for gpsd Group: Applications/System Requires: httpd Requires: perl Requires: perl(Net::GPSD3) Requires: perl(GD::Graph::Polar) Requires: perl(CGI) Requires: perl(CGI::Carp) %description clients Installs X11 and Command Line Interface clients. %description clients-x11 xgps is a simple test client for gpsd with an X interface. It displays current GPS position/time/velocity information and (for GPSes that support the feature) the locations of accessible satellites. xgpsspeed is a speedometer that uses position information from the GPS. It accepts an -h option and optional argument as for gps, or a -v option to dump the package version and exit. Additionally, it accepts -rv (reverse video) and -nc (needle color) options. %description clients-cli cgps resembles xgps, but without the pictorial satellite display. It can run on a serial terminal or terminal emulator. %description clients-httpd pgps is a Perl CGI client for gpsd. It displays current GPS position/time/velocity information and (for GPSes that support the feature) the locations of accessible satellites. This package installs the CGI scripts at http://localhost/gpsd/. %prep %setup -q %build #Note: prefix must be set to / since the current scons build only supports relative paths scons %{_smp_mflags} \ prefix=/ \ bindir=%{_bindir} \ includedir=%{_includedir} \ libdir=%{_libdir} \ sbindir=%{_sbindir} \ mandir=%{_mandir} \ docdir=%{_docdir} \ pkgconfigdir=%{_libdir}/pkgconfig scons build %install rm -rf $RPM_BUILD_ROOT export DESTDIR=$RPM_BUILD_ROOT scons install #Apps need man pages! for MAN in gpsprof xgps xgpsspeed gpscat gpxlogger gegps do cp $RPM_BUILD_ROOT%{_mandir}/man1/gps.1 $RPM_BUILD_ROOT%{_mandir}/man1/$MAN.1 done #httpd client %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_var}/www/html/gpsd %{__install} -p -m 0755 packaging/rpm/httpd/skyview.cgi $RPM_BUILD_ROOT%{_var}/www/html/gpsd %{__install} -p -m 0755 packaging/rpm/httpd/pgps.cgi $RPM_BUILD_ROOT%{_var}/www/html/gpsd %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d %{__install} -p -m 0644 packaging/rpm/httpd/gpsd.conf $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d/gpsd.conf # init scripts %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_sysconfdir}/init.d %{__install} -p -m 0755 packaging/rpm/gpsd.init $RPM_BUILD_ROOT%{_sysconfdir}/init.d/gpsd %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig %{__install} -p -m 0644 packaging/rpm/gpsd.sysconfig $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/gpsd # udev rules %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_sysconfdir}/udev/rules.d %{__install} -p -m 0644 gpsd.rules $RPM_BUILD_ROOT%{_sysconfdir}/udev/rules.d/99-gpsd.rules # hotplug script #%{__install} -d -m 0755 $RPM_BUILD_ROOT/lib/udev #%{__install} -p -m 0755 gpsd.hotplug gpsd.hotplug.wrapper $RPM_BUILD_ROOT/lib/udev # remove .la files #rm -f $RPM_BUILD_ROOT%{_libdir}/libgps*.la # fix non-executable python script #%{__chmod} +x $RPM_BUILD_ROOT%{python_sitearch}/gps/gps.py # Install the .desktop files desktop-file-install --vendor fedora \ --dir $RPM_BUILD_ROOT%{_datadir}/applications \ --add-category X-Fedora \ packaging/X11/xgps.desktop desktop-file-install --vendor fedora \ --dir $RPM_BUILD_ROOT%{_datadir}/applications \ --add-category X-Fedora \ packaging/X11/xgpsspeed.desktop # Install logo icon for .desktop files %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_datadir}/gpsd %{__install} -p -m 0644 packaging/X11/gpsd-logo.png $RPM_BUILD_ROOT%{_datadir}/gpsd/gpsd-logo.png %clean rm -rf $RPM_BUILD_ROOT %post /sbin/ldconfig /sbin/chkconfig --add %{name} %preun if [ $1 = 0 ]; then /sbin/service %{name} stop > /dev/null 2>&1 || true /sbin/chkconfig --del %{name} fi %postun /sbin/ldconfig %files %defattr(-,root,root,-) %doc README INSTALL COPYING %config(noreplace) %{_sysconfdir}/init.d/%{name} %config(noreplace) %{_sysconfdir}/sysconfig/%{name} %config(noreplace) %{_sysconfdir}/udev/rules.d/* %{_sbindir}/gpsd %{_sbindir}/gpsdctl %{_bindir}/gpsprof %{_bindir}/gpsmon %{_bindir}/gpsctl %{_bindir}/gegps %{_bindir}/gps2udp %{_libdir}/libgps*.so.* #/lib/udev/gpsd* %{python_sitearch}/gps* %{_mandir}/man8/gpsd.8* %{_mandir}/man8/gpsdctl.8* %{_mandir}/man8/gpsinit.8.* %{_mandir}/man1/gpsprof.1* %{_mandir}/man1/gpsmon.1* %{_mandir}/man1/gegps.1* %{_mandir}/man1/gps2udp.1* %{_mandir}/man1/gpsctl.1* %{_mandir}/man5/gpsd_json.5* %files devel %defattr(-,root,root,-) %doc TODO %{_bindir}/gpsfake %{_libdir}/libgps*.so %{_libdir}/pkgconfig/*.pc %{python_sitearch}/gps/fake* %{_includedir}/gps.h %{_includedir}/libgpsmm.h %{_mandir}/man1/gpsfake.1* %{_mandir}/man3/libgps.3* %{_mandir}/man3/libgpsmm.3* %{_mandir}/man5/srec.5* %files -n libQgpsmm %defattr(-,root,root,-) %{_qt4_libdir}/libQgpsmm.so* %{_qt4_libdir}/libQgpsmm.prl %{_mandir}/man3/libQgpsmm.3* %files clients %defattr(-,root,root,-) %{_mandir}/man1/gps.1* %files clients-x11 %defattr(-,root,root,-) %{_bindir}/xgps %{_bindir}/xgpsspeed %{_mandir}/man1/xgps.1* %{_mandir}/man1/xgpsspeed.1* %{_datadir}/applications/*.desktop %dir %{_datadir}/gpsd %{_datadir}/gpsd/gpsd-logo.png %files clients-cli %defattr(-,root,root,-) %{_bindir}/cgps %{_bindir}/gpscat %{_bindir}/gpsdecode %{_bindir}/gpspipe %{_bindir}/gpxlogger %{_bindir}/lcdgps %{_mandir}/man1/cgps.1* %{_mandir}/man1/gpscat.1* %{_mandir}/man1/gpsdecode.1* %{_mandir}/man1/gpspipe.1* %{_mandir}/man1/lcdgps.1* %{_mandir}/man1/gpxlogger.1* %files clients-httpd %defattr(-,root,root,-) %config(noreplace) %{_sysconfdir}/httpd/conf.d/gpsd.conf %dir %{_var}/www/html/gpsd/ %attr(0755,root,root) %{_var}/www/html/gpsd/skyview.cgi %attr(0755,root,root) %{_var}/www/html/gpsd/pgps.cgi %changelog * Mon Mar 23 00:11:00 EDT 2015Eric S. Raymond 3.15-1 - We no longer export libgpsd. * Sun Jul 31 2011 Michael R. Davis 3.0-2 - Added gegps, gpsdctl - Dropped hotplug wrapper - Removed tabs to pass rpmlint tests - Updated scons install paths - Updated scons build paths * Sat Jun 25 2011 Eric S. Raymond 3.0-2 - Minor changes from the refactoring of the hotplug system. * Fri May 13 2011 Michael R. Davis 3.0-1 - Added httpd Perl client package - Separated x11 and cli packages * Mon Apr 18 2011 Michael R. Davis 3.0-1 - Updates to support SCons software construction tool - Added httpd Perl client - macro _buildrootdir does not exist in EPEL 4 & 5 * Mon Jul 05 2010 Michael R. Davis - 2.95-3 - Updated to move rpm files to packaging/rpm folder - Renamed gpsd-qt to libQgpsmm * Sun Jul 04 2010 Michael R. Davis - 2.95-2 - missing X11/app-defaults/xgpsspeed * Sat Jul 03 2010 Michael R. Davis - 2.95-1 - back ported spec to gpsd from Fedora 14 - updated to 2.95 - added gpsd-qt package * Thu May 06 2010 Miroslav Lichvar - 2.94-1 - update to 2.94 (#556642) * Tue Mar 02 2010 Miroslav Lichvar - 2.39-7 - don't use deprecated SYSFS{} in udev rules (#569089) - fix init script LSB compliance * Mon Feb 15 2010 Miroslav Lichvar - 2.39-6 - fix linking with --no-add-needed (#564662) - use %%global macro instead of %%define * Wed Aug 12 2009 Marek Mahut - 2.39-5 - RHBZ#505588: gpsd has a broken initscript that fails to launch daemon * Fri Jul 24 2009 Fedora Release Engineering - 2.39-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild * Tue Mar 31 2009 Tom "spot" Callaway - 2.39-3 - some of the gpsd client bits went into gpsdclient.h, but that file wasn't getting installed - specifically, viking needs that header to build. * Wed Mar 25 2009 Douglas E. Warner - 2.39-2 - adding patch to try to fix parallel make errors * Thu Mar 19 2009 Douglas E. Warner - 2.39-1 - updating to 2.39 - fixed potential core dump in C client handling of "K" responses - Made device hotplugging work again; had been broken by changes in udev - Introduced major and minor API version symbols into the public interfaces - The sirfmon utility is gone, replaced by gpsmon which does the same job for multiple GPS types - Fixed a two-year old error in NMEA parsing that nobody noticed because its only effect was to trash VDOP values from GSA sentences, and gpsd computes those with an internal error model when they look wonky - cgpxlogger has been merged into gpxlogger - Speed-setting commands now allow parity and stop-bit setting if the GPS chipset and adaptor can support it - Specfile and other packaging paraphenalia now live in a packaging subdirectory - rtcmdecode becomes gpsdecode and can now de-armor and dump AIDVM packets - The client library now work correctly in locales where the decimal separator is not a period * Mon Mar 16 2009 Douglas E. Warner - 2.38-1 - updating to 2.38 - creating init script and sysconfig files - migrating hotplug rules to udev + hotplug wrapper script from svn r5147 - updating pyexecdir patch - fixing udev rule subsystem match - Regression test load for RoyalTek RGM3800 and Blumax GPS-009 added - Scaling on E error-estimate fields fixed to match O - Listen on localhost only by default to avoid security problems; this can be overridden with the -G command-line option - The packet-state machine can now recognize RTCM3 packets, though support is not yet complete - Added support for ublox5 and mkt-3301 devices - Add a wrapper around gpsd_hexdump to save CPU - Lots of little fixes to various packet parsers - Always keep the device open: "-n" is not optional any more - xgpsspeed no longer depends on Motif - gpsctl can now ship arbitrary payloads to a device; It's possible to send binary through the control channel with the new "&" command - Experimental new driver for Novatel SuperStarII - The 'g' mode switch command now requires, and returns, 'rtcm104v2' rather than 'rtcm104'; this is design forward for when RTCM104v2 is fully working * Tue Feb 24 2009 Fedora Release Engineering - 2.37-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild * Sat Nov 29 2008 Ignacio Vazquez-Abrams - 2.37-3 - Rebuild for Python 2.6 * Wed Mar 19 2008 Douglas E. Warner - 2.37-2 - moving gpspacket.so python lib to main package * Wed Feb 27 2008 Douglas E. Warner - 2.37-1 - update to 2.37 - removed install-gpsd_config.h.patch - installed pkgconfig files in devel package - added patch to install python modules in sitearch - removing rpath from inclucded libtool - moving X11 app-defaults to datadir - using macros for commands in install; using install instead of cp and mkdir - cleaning up spaces/tabs for rpmlint * Tue Feb 19 2008 Fedora Release Engineering - 2.34-9 - Autorebuild for GCC 4.3 * Sun Aug 19 2007 Matthew Truch - 2.34-8 - Patch Makefile to also install gpsd_config.h as needed by libgpsmm.h. Redhat BZ 253433. * Sat Jun 30 2007 Matthew Truch - 2.34-7 - Make sure the logo is actually included (via the spec file). I need to wake up before I try even trivial updates. * Sat Jun 30 2007 Matthew Truch - 2.34-6 - Learn how to use search and replace (aka fix all instances of gpsd-logo.png spelled incorrectly as gspd-logo.png). * Sat Jun 30 2007 Matthew Truch - 2.34-5 - Fix desktop file and logo file name. * Sat Jun 30 2007 Matthew Truch - 2.34-4 - Include icon for .desktop files per BZ 241428 * Tue Mar 20 2007 Michael Schwendt - 2.34-3 - Bump release for FE5 -> Fedora 7 upgrade path. * Tue Feb 27 2007 Matthew Truch - 2.34-2 - BR python-devel instead of python to make it build. * Tue Feb 27 2007 Matthew Truch - 2.34-1 - Upgrade to 2.34. - Get rid of %%makeinstall (which was never needed). - Possibly fix hotplug issuses (BZ 219750). - Use %%python_sitelib for python site-files stuff. * Sat Dec 9 2006 Matthew Truch - 2.33-6 - Rebuild to pull in new version of python. * Tue Sep 26 2006 Matthew Truch - 2.33-5 - Remove openmotif requirment, and switch to lesstif. * Mon Aug 28 2006 Matthew Truch - 2.33-4 - Bump release for rebuild in prep. for FC6. * Thu Jul 20 2006 Matthew Truch - 2.33-3 - Actually, was a missing BR glib-dbus-devel. Ooops. * Thu Jul 20 2006 Matthew Truch - 2.33-2 - Missing BR glib-devel * Thu Jul 20 2006 Matthew Truch - 2.33-1 - Update to version 2.33 * Wed Apr 19 2006 Matthew Truch - 2.32-5 - Don't --enable-tnt in build as it causes some gpses to not work properly with sattelite view mode. See bugzilla bug 189220. * Thu Apr 13 2006 Matthew Truch - 2.32-4 - Add dbus-glib to BuildRequires as needed for build. * Sun Apr 9 2006 Matthew Truch - 2.32-3 - Include xmlto and python in buildrequires so things build right. - Don't package static library file. * Wed Apr 5 2006 Matthew Truch - 2.32-2 - Use ye olde %%{?dist} tag. * Wed Apr 5 2006 Matthew Truch - 2.32-1 - Initial Fedora Extras specfile gpsd-3.15/packaging/rpm/gpsd.sysconfig0000664000175000017500000000006212460513551016152 0ustar esresrOPTIONS="-n" DEVICE="/dev/ttyUSB0" USBAUTO="true" gpsd-3.15/packaging/rpm/httpd/gpsd.conf0000664000175000017500000000026212460513551016220 0ustar esresr DirectoryIndex index.cgi AddHandler cgi-script .cgi AllowOverride None Order Allow,Deny Allow from all Options +ExecCGI gpsd-3.15/packaging/rpm/httpd/pgps.cgi0000775000175000017500000001046012460513551016055 0ustar esresr#!/usr/bin/perl use strict; use warnings; use CGI qw{}; use CGI::Carp qw(fatalsToBrowser); use Net::GPSD3 0.14; =head1 NAME pgps.cgi - Builds a Satellite List and displays GPS data from a POLL request to a GPSD server =head1 COPYRIGHT Copyright (c) 2011 - Michael R. Davis This program is free software licensed under The BSD License. =cut my $cgi=CGI->new; my $host=$cgi->param("host") || undef; my $port=$cgi->param("port") || undef; my $gpsd=Net::GPSD3->new(host=>$host, port=>$port); my $poll=$gpsd->poll; my @param=(); push @param, "host=".$host if defined $host; push @param, "port=".$port if defined $port; my $img=join("?", "skyview.cgi", scalar(@param) ? join(";", @param) : ()); my $content=join "", $cgi->start_html(-title=>"Perl GPSD CGI"), $cgi->table({border=>0, width=>"100%", style=>"BORDER-COLLAPSE: collapse"}, $cgi->Tr( $cgi->td({width=>"30%", valign=>"top"},"Satellite List", $cgi->table({border=>2, width=>"100%", style=>"BORDER-COLLAPSE: collapse"}, $cgi->Tr( $cgi->td([qw{PRN Elev Azim SNR Used}]), ), map { $cgi->Tr([ $cgi->td([$_->prn, $_->el, $_->az, $_->ss, $_->used ? "Y" : "N"])]) } sort {$b->used <=> $a->used or $b->ss <=> $a->ss} $poll->sky->Satellites ), ), $cgi->td({valign=>"top"}, "Skyview", $cgi->table({border=>2, style=>"BORDER-COLLAPSE: collapse"}, $cgi->Tr( $cgi->td( $cgi->img({-src=>$img}), ), ), ), ), ), $cgi->Tr( $cgi->td({-colspan=>2, valign=>"top"}, "GPS data", $cgi->table({border=>2, width=>"100%", style=>"BORDER-COLLAPSE: collapse"}, $cgi->Tr( $cgi->td({align=>"right", width=>"25%"}, "Time:"), $cgi->td({width=>"25%"}, $poll->tpv->timestamp), $cgi->td({align=>"right", width=>"25%"}, "Status:"), $cgi->td({width=>"25%"}, $poll->tpv->mode), ), $cgi->Tr( $cgi->td({align=>"right"}, "Latitude:"), $cgi->td($poll->tpv->lat), $cgi->td({align=>"right"}, "EPX:"), $cgi->td($poll->tpv->epx), ), $cgi->Tr( $cgi->td({align=>"right"}, "Longitude:"), $cgi->td($poll->tpv->lon), $cgi->td({align=>"right"}, "EPY:"), $cgi->td($poll->tpv->epy), ), $cgi->Tr( $cgi->td({align=>"right"}, "Altitude:"), $cgi->td($poll->tpv->alt), $cgi->td({align=>"right"}, "EPV:"), $cgi->td($poll->tpv->epv), ), $cgi->Tr( $cgi->td({align=>"right"}, "Speed:"), $cgi->td($poll->tpv->speed), $cgi->td({align=>"right"}, "EPS:"), $cgi->td($poll->tpv->eps), ), $cgi->Tr( $cgi->td({align=>"right"}, "Climb:"), $cgi->td($poll->tpv->climb), $cgi->td({align=>"right"}, "EPC:"), $cgi->td($poll->tpv->epc), ), $cgi->Tr( $cgi->td({align=>"right"}, "Track:"), $cgi->td($poll->tpv->track), $cgi->td({align=>"right"}, "EPD:"), $cgi->td($poll->tpv->epd), ), ), ), ), ), $cgi->p({align=>"center"}, "Copyright © 2011 - Michael R. Davis, License: BSD"), $cgi->end_html, "\n"; print join "", $cgi->header( -content_length => length($content), -expires => '+5m', -Refresh => '30', #seconds ), $content; gpsd-3.15/packaging/rpm/httpd/skyview.cgi0000775000175000017500000000252712460513551016612 0ustar esresr#!/usr/bin/perl use warnings; use strict; use GD::Graph::Polar; use Net::GPSD3 0.14; use CGI; =head1 NAME skyview.cgi - Builds a Skyview PNG image from a POLL request to a GPSD server =head1 COPYRIGHT Copyright (c) 2011 - Michael R. Davis This program is free software licensed under The BSD License. =cut my $cgi=CGI->new; my $host=$cgi->param("host") || undef; my $port=$cgi->param("port") || undef; my $gpsd=Net::GPSD3->new(host=>$host, port=>$port); my $size=$cgi->param("size") || 380; my $gd=GD::Graph::Polar->new(size=>$size, radius=>90, border=>3, ticks=>9); my $poll; eval '$poll=$gpsd->poll'; my $error=$@; if ($error) { chomp $error; $gd->color([248,8,8]); #red $gd->addString(127=>134.5, $error); } else { foreach my $sat ($poll->sky->Satellites) { if ($sat->ss > 34) { $gd->color([16,240,16]); #green } elsif ($sat->ss >= 30) { $gd->color([240,240,16]); #yellow } elsif ($sat->ss >= 10) { $gd->color([240,16,16]); #red } else { $gd->color([128,128,128]); #gray } $gd->addGeoPoint(90-$sat->el => $sat->az); $gd->color([16,16,16]); $gd->addGeoString(90-$sat->el => $sat->az, $sat->prn); } } $gd->color([210,210,210]); #gray $gd->addGeoString(122 => 227.0, "Copyright (c) 2011 Michael R. Davis"); print "Content-type: image/png\n\n", $gd->draw; gpsd-3.15/packaging/tinfo.pc0000664000175000017500000000035112502505326014133 0ustar esresrprefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include major_version=5 version=5.9.20110404 Name: tinfo Description: ncurses 5.9 add-on library Version: ${version} Requires: Libs: -ltinfo Cflags: gpsd-3.15/packet.c0000664000175000017500000020075212520742615012172 0ustar esresr/**************************************************************************** NAME: packet.c -- a packet-sniffing engine for reading from GPS devices DESCRIPTION: Initial conditions of the problem: 1. We have a file descriptor open for (possibly non-blocking) read. The device on the other end is sending packets at us. 2. It may require more than one read to gather a packet. Reads may span packet boundaries. 3. There may be leading garbage before the first packet. After the first start-of-packet, the input should be well-formed. The problem: how do we recognize which kind of packet we're getting? No need to handle Garmin USB binary, we know that type by the fact we're connected to the Garmin kernel driver. But we need to be able to tell the others apart and distinguish them from baud barf. PERMISSIONS This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. ***************************************************************************/ #include #include #include #include #include #include #include #include /* for htons() */ #include #include "bits.h" #include "gpsd.h" #include "crc24q.h" #include "strfuncs.h" /* * The packet-recognition state machine. This takes an incoming byte stream * and tries to segment it into packets. There are four types of packets: * * 1) Comments. These begin with # and end with \r\n. * * 2) NMEA lines. These begin with $, and with \r\n, and have a checksum. * * 3) Checksummed binary packets. These begin with some fixed leader * character(s), have a length embedded in them, and end with a * checksum (and possibly some fixed trailing bytes). * * 4) ISGPS packets. The input may be a bitstream containing IS-GPS-200 * packets. Each includes a fixed leader byte, a length, and check bits. * In this case, it is not guaranted that packet starts begin on byte * bounaries; the recognizer has to run a separate state machine against * each byte just to achieve synchronization lock with the bitstream. * * 5) Un-checksummed binary packets. Like case 3, but without * a checksum it's much easier to get a false match from garbage. * The packet recognizer gives checksummed types higher priority. * * Adding support for a new GPS protocol typically reqires adding state * transitions to support whatever binary packet structure it has. The * goal is for the lexer to be able to cope with arbitrarily mixed packet * types on the input stream. This is a requirement because (1) sometimes * gpsd wants to switch a device that supports both NMEA and a binary * packet protocol to the latter for more detailed reporting, and (b) in * the presence of device hotplugging, the type of GPS report coming * in is subject to change at any time. * * Caller should consume a packet when it sees one of the *_RECOGNIZED * states. It's good practice to follow the _RECOGNIZED transition * with one that recognizes a leader of the same packet type rather * than dropping back to ground state -- this for example will prevent * the state machine from hopping between recognizing TSIP and * EverMore packets that both start with a DLE. * * Error handling is brutally simple; any time we see an unexpected * character, go to GROUND_STATE and reset the machine (except that a * $ in an NMEA payload only resets back to NMEA_DOLLAR state). Because * another good packet will usually be along in less than a second * repeating the same data, Boyer-Moore-like attempts to do parallel * recognition beyond the headers would make no sense in this * application, they'd just add complexity. * * The NMEA portion of the state machine allows the following talker IDs: * $GP -- Global Positioning System. * $GL -- GLONASS, according to IEIC 61162-1 * $GN -- Mixed GPS and GLONASS data, according to IEIC 61162-1 * $BD -- Beidou * $GB -- Beidou * $QZ -- QZSS GPS augmentation system * $II -- Integrated Instrumentation (Raytheon's SeaTalk system). * $IN -- Integrated Navigation (Garmin uses this). * $WI -- Weather instrument (Airmar PB200, Radio Ocean ROWIND, Vaisala WXT520). * $HC -- Heading/compass (Airmar PB200). * $TI -- Turn indicator (Airmar PB200). * $EC -- Electronic Chart Display & Information System (ECDIS) * $SD -- Depth Sounder * $YX -- Transducer (used by some Airmar equipment including PB100) * $P -- Vendor-specific sentence * * !AB -- NMEA 4.0 Base AIS station * !AD -- MMEA 4.0 Dependent AIS Base Station * !AI -- Mobile AIS station * !AN -- NMEA 4.0 Aid to Navigation AIS station * !AR -- NMEA 4.0 AIS Receiving Station * !AX -- NMEA 4.0 Repeater AIS station * !AS -- NMEA 4.0 Limited Base Station * !AT -- NMEA 4.0 AIS Transmitting Station * !BS -- Base AIS station (deprecated in NMEA 4.0) * !SA -- NMEA 4.0 Physical Shore AIS Station */ enum { #include "packet_states.h" }; static char *state_table[] = { #include "packet_names.h" }; #define SOH (unsigned char)0x01 #define DLE (unsigned char)0x10 #define STX (unsigned char)0x02 #define ETX (unsigned char)0x03 #ifdef ONCORE_ENABLE static size_t oncore_payload_cksum_length(unsigned char id1, unsigned char id2) { size_t l; /* For the packet sniffer to not terminate the message due to * payload data looking like a trailer, the known payload lengths * including the checksum are given. Return -1 for unknown IDs. */ #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 */ case ONCTYPE('A','c'): l = 11; break; /* date */ case ONCTYPE('A','a'): l = 10; break; /* time of day */ case ONCTYPE('A','d'): l = 11; break; /* latitude */ case ONCTYPE('A','e'): l = 11; break; /* longitude */ case ONCTYPE('A','f'): l = 15; break; /* height */ case ONCTYPE('E','a'): l = 76; break; /* position/status/data */ case ONCTYPE('A','g'): l = 8; break; /* satellite mask angle */ case ONCTYPE('B','b'): l = 92; break; /* visible satellites status */ case ONCTYPE('B','j'): l = 8; break; /* leap seconds pending */ case ONCTYPE('A','q'): l = 8; break; /* atmospheric correction mode */ case ONCTYPE('A','p'): l = 25; break; /* set user datum / select datum */ /* Command "Ao" gives "Ap" response (select datum) */ case ONCTYPE('C','h'): l = 9; break; /* almanac input ("Cb" response) */ case ONCTYPE('C','b'): l = 33; break; /* almanac output ("Be" response) */ case ONCTYPE('S','z'): l = 8; break; /* system power-on failure */ case ONCTYPE('C','j'): l = 294; break; /* receiver ID */ case ONCTYPE('F','a'): l = 9; break; /* self-test */ case ONCTYPE('C','f'): l = 7; break; /* set-to-defaults */ case ONCTYPE('E','q'): l = 96; break; /* ASCII position */ case ONCTYPE('A','u'): l = 12; break; /* altitide hold height */ case ONCTYPE('A','v'): l = 8; break; /* altitude hold mode */ case ONCTYPE('A','N'): l = 8; break; /* velocity filter */ case ONCTYPE('A','O'): l = 8; break; /* RTCM report mode */ case ONCTYPE('C','c'): l = 80; break; /* ephemeris data input ("Bf") */ case ONCTYPE('C','k'): l = 7; break; /* pseudorng correction inp. ("Ce")*/ /* Command "Ci" (switch to NMEA, GT versions only) has no response */ case ONCTYPE('B','o'): l = 8; break; /* UTC offset status */ case ONCTYPE('A','z'): l = 11; break; /* 1PPS cable delay */ case ONCTYPE('A','y'): l = 11; break; /* 1PPS offset */ case ONCTYPE('A','P'): l = 8; break; /* pulse mode */ case ONCTYPE('A','s'): l = 20; break; /* position-hold position */ case ONCTYPE('A','t'): l = 8; break; /* position-hold mode */ case ONCTYPE('E','n'): l = 69; break; /* time RAIM setup and status */ default: return 0; } /* *INDENT-ON* */ return l - 6; /* Subtract header and trailer. */ } #endif /* ONCORE_ENABLE */ static bool character_pushback(struct gps_lexer_t *lexer, unsigned int newstate) /* push back the last character grabbed, setting a specified state */ { --lexer->inbufptr; --lexer->char_counter; lexer->state = newstate; if (lexer->errout.debug >= LOG_RAW + 2) { unsigned char c = *lexer->inbufptr; gpsd_log(&lexer->errout, LOG_RAW + 2, "%08ld: character '%c' [%02x] pushed back, state set to %s\n", lexer->char_counter, (isprint((int)c) ? c : '.'), c, state_table[lexer->state]); } return false; } static bool nextstate(struct gps_lexer_t *lexer, unsigned char c) { static int n = 0; #ifdef RTCM104V2_ENABLE enum isgpsstat_t isgpsstat; #endif /* RTCM104V2_ENABLE */ #ifdef SUPERSTAR2_ENABLE static unsigned char ctmp; #endif /* SUPERSTAR2_ENABLE */ n++; switch (lexer->state) { case GROUND_STATE: n = 0; if (c == '#') { lexer->state = COMMENT_BODY; break; } #ifdef NMEA_ENABLE if (c == '$') { lexer->state = NMEA_DOLLAR; break; } if (c == '!') { lexer->state = NMEA_BANG; break; } #endif /* NMEA_ENABLE */ #if defined(TNT_ENABLE) || defined(GARMINTXT_ENABLE) || defined(ONCORE_ENABLE) if (c == '@') { #ifdef RTCM104V2_ENABLE if (rtcm2_decode(lexer, c) == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = AT1_LEADER; break; } #endif #ifdef SIRF_ENABLE if (c == 0xa0) { lexer->state = SIRF_LEADER_1; break; } #endif /* SIRF_ENABLE */ #ifdef SUPERSTAR2_ENABLE if (c == SOH) { lexer->state = SUPERSTAR2_LEADER; break; } #endif /* SUPERSTAR2_ENABLE */ #if defined(TSIP_ENABLE) || defined(EVERMORE_ENABLE) || defined(GARMIN_ENABLE) if (c == DLE) { lexer->state = DLE_LEADER; break; } #endif /* TSIP_ENABLE || EVERMORE_ENABLE || GARMIN_ENABLE */ #ifdef TRIPMATE_ENABLE if (c == 'A') { #ifdef RTCM104V2_ENABLE if (rtcm2_decode(lexer, c) == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = ASTRAL_1; break; } #endif /* TRIPMATE_ENABLE */ #ifdef EARTHMATE_ENABLE if (c == 'E') { #ifdef RTCM104V2_ENABLE if (rtcm2_decode(lexer, c) == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = EARTHA_1; break; } #endif /* EARTHMATE_ENABLE */ #ifdef ZODIAC_ENABLE if (c == 0xff) { lexer->state = ZODIAC_LEADER_1; break; } #endif /* ZODIAC_ENABLE */ #ifdef UBLOX_ENABLE if (c == 0xb5) { lexer->state = UBX_LEADER_1; break; } #endif /* UBLOX_ENABLE */ #ifdef ITRAX_ENABLE if (c == '<') { lexer->state = ITALK_LEADER_1; break; } #endif /* ITRAX_ENABLE */ #ifdef NAVCOM_ENABLE if (c == 0x02) { lexer->state = NAVCOM_LEADER_1; break; } #endif /* NAVCOM_ENABLE */ #ifdef GEOSTAR_ENABLE if (c == 'P') { lexer->state = GEOSTAR_LEADER_1; break; } #endif /* GEOSTAR_ENABLE */ #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ #ifdef RTCM104V3_ENABLE if (c == 0xD3) { lexer->state = RTCM3_LEADER_1; break; } #endif /* RTCM104V3_ENABLE */ #ifdef PASSTHROUGH_ENABLE if (c == '{') return character_pushback(lexer, JSON_LEADER); #endif /* PASSTHROUGH_ENABLE */ break; case COMMENT_BODY: if (c == '\n') lexer->state = COMMENT_RECOGNIZED; else if (!isprint(c)) return character_pushback(lexer, GROUND_STATE); break; #ifdef NMEA_ENABLE case NMEA_DOLLAR: if (c == 'G') lexer->state = NMEA_PUB_LEAD; else if (c == 'P') /* vendor sentence */ lexer->state = NMEA_VENDOR_LEAD; else if (c == 'I') /* Seatalk */ lexer->state = SEATALK_LEAD_1; else if (c == 'W') /* Weather instrument */ lexer->state = WEATHER_LEAD_1; else if (c == 'H') /* Heading/compass */ lexer->state = HEADCOMP_LEAD_1; else if (c == 'T') /* Turn indicator */ lexer->state = TURN_LEAD_1; else if (c == 'A') /* SiRF Ack */ lexer->state = SIRF_ACK_LEAD_1; else if (c == 'E') /* ECDIS */ lexer->state = ECDIS_LEAD_1; else if (c == 'S') lexer->state = SOUNDER_LEAD_1; else if (c == 'Y') lexer->state = TRANSDUCER_LEAD_1; else if (c == 'B') lexer->state = BEIDOU_LEAD_1; else if (c == 'Q') lexer->state = QZSS_LEAD_1; #ifdef OCEANSERVER_ENABLE else if (c == 'C') lexer->state = NMEA_LEADER_END; #endif /* OCEANSERVER_ENABLE */ else (void) character_pushback(lexer, GROUND_STATE); break; case NMEA_PUB_LEAD: /* * $GP == GPS, $GL = GLONASS only, $GN = mixed GPS and GLONASS, * according to NMEA (IEIC 61162-1) DRAFT 02/06/2009. * We have a log from China with a Beidou device using $GB * rather than $BD. */ if (c == 'B' || c == 'P' || c == 'N' || c == 'L') lexer->state = NMEA_LEADER_END; else (void) character_pushback(lexer, GROUND_STATE); break; case NMEA_VENDOR_LEAD: if (c == 'A') lexer->state = NMEA_PASHR_A; else if (isalpha(c)) lexer->state = NMEA_LEADER_END; else (void) character_pushback(lexer, GROUND_STATE); break; /* * Without the following six states, DLE in a $PASHR can fool the * sniffer into thinking it sees a TSIP packet. Hilarity ensues. */ case NMEA_PASHR_A: if (c == 'S') lexer->state = NMEA_PASHR_S; else if (isalpha(c)) lexer->state = NMEA_LEADER_END; else (void) character_pushback(lexer, GROUND_STATE); break; case NMEA_PASHR_S: if (c == 'H') lexer->state = NMEA_PASHR_H; else if (isalpha(c)) lexer->state = NMEA_LEADER_END; else (void) character_pushback(lexer, GROUND_STATE); break; case NMEA_PASHR_H: if (c == 'R') lexer->state = NMEA_BINARY_BODY; else if (isalpha(c)) lexer->state = NMEA_LEADER_END; else (void) character_pushback(lexer, GROUND_STATE); break; case NMEA_BINARY_BODY: if (c == '\r') lexer->state = NMEA_BINARY_CR; break; case NMEA_BINARY_CR: if (c == '\n') lexer->state = NMEA_BINARY_NL; else lexer->state = NMEA_BINARY_BODY; break; case NMEA_BINARY_NL: if (c == '$') (void) character_pushback(lexer, NMEA_RECOGNIZED); else lexer->state = NMEA_BINARY_BODY; break; case NMEA_BANG: if (c == 'A') lexer->state = AIS_LEAD_1; else if (c == 'B') lexer->state = AIS_LEAD_ALT1; else if (c == 'S') lexer->state = AIS_LEAD_ALT3; else return character_pushback(lexer, GROUND_STATE); break; case AIS_LEAD_1: if (strchr("BDINRSTX", c) != NULL) lexer->state = AIS_LEAD_2; else return character_pushback(lexer, GROUND_STATE); break; case AIS_LEAD_2: if (isalpha(c)) lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case AIS_LEAD_ALT1: if (c == 'S') lexer->state = AIS_LEAD_ALT2; else return character_pushback(lexer, GROUND_STATE); break; case AIS_LEAD_ALT2: if (isalpha(c)) lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case AIS_LEAD_ALT3: if (c == 'A') lexer->state = AIS_LEAD_ALT4; else return character_pushback(lexer, GROUND_STATE); break; case AIS_LEAD_ALT4: if (isalpha(c)) lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; #if defined(TNT_ENABLE) || defined(GARMINTXT_ENABLE) || defined(ONCORE_ENABLE) case AT1_LEADER: switch (c) { #ifdef ONCORE_ENABLE case '@': lexer->state = ONCORE_AT2; break; #endif /* ONCORE_ENABLE */ #ifdef TNT_ENABLE case '*': /* * TNT has similar structure to NMEA packet, '*' before * optional checksum ends the packet. Since '*' cannot be * received from GARMIN working in TEXT mode, use this * difference to tell that 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; #endif /* GARMINTXT_ENABLE */ default: if (!isprint(c)) return character_pushback(lexer, GROUND_STATE); } break; #endif /* defined(TNT_ENABLE) || defined(GARMINTXT_ENABLE) || defined(ONCORE_ENABLE) */ case NMEA_LEADER_END: if (c == '\r') lexer->state = NMEA_CR; else if (c == '\n') /* not strictly correct, but helps for interpreting logfiles */ lexer->state = NMEA_RECOGNIZED; else if (c == '$') (void) character_pushback(lexer, GROUND_STATE); else if (!isprint(c)) (void) character_pushback(lexer, GROUND_STATE); break; case NMEA_CR: if (c == '\n') lexer->state = NMEA_RECOGNIZED; /* * There's a GPS called a Jackson Labs Firefly-1a that emits \r\r\n * at the end of each sentence. Don't be confused by this. */ else if (c == '\r') lexer->state = NMEA_CR; else (void) character_pushback(lexer, GROUND_STATE); break; case NMEA_RECOGNIZED: if (c == '#') lexer->state = COMMENT_BODY; else if (c == '$') lexer->state = NMEA_DOLLAR; else if (c == '!') lexer->state = NMEA_BANG; #ifdef UBLOX_ENABLE else if (c == 0xb5) /* LEA-5H can and will output NMEA and UBX back to back */ lexer->state = UBX_LEADER_1; #endif #ifdef PASSTHROUGH_ENABLE else if (c == '{') return character_pushback(lexer, JSON_LEADER); #endif /* PASSTHROUGH_ENABLE */ else return character_pushback(lexer, GROUND_STATE); break; case SEATALK_LEAD_1: if (c == 'I' || c == 'N') /* II or IN are accepted */ lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case WEATHER_LEAD_1: if (c == 'I') /* Weather instrument leader accepted */ lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case HEADCOMP_LEAD_1: if (c == 'C') /* Heading/compass leader accepted */ lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case TURN_LEAD_1: if (c == 'I') /* Turn indicator leader accepted */ lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case ECDIS_LEAD_1: if (c == 'C') /* ECDIS leader accepted */ lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case SOUNDER_LEAD_1: if (c == 'D') /* Depth-sounder leader accepted */ lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case TRANSDUCER_LEAD_1: if (c == 'X') /* Transducer leader accepted */ lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case BEIDOU_LEAD_1: if (c == 'D') /* Beidou leader accepted */ lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; case QZSS_LEAD_1: if (c == 'Z') /* QZSS leader accepted */ lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; #ifdef TRIPMATE_ENABLE case ASTRAL_1: if (c == 'S') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = ASTRAL_2; } else (void) character_pushback(lexer, GROUND_STATE); break; case ASTRAL_2: if (c == 'T') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = ASTRAL_3; } else (void) character_pushback(lexer, GROUND_STATE); break; case ASTRAL_3: if (c == 'R') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = ASTRAL_5; } else (void) character_pushback(lexer, GROUND_STATE); break; case ASTRAL_4: if (c == 'A') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = ASTRAL_2; } else (void) character_pushback(lexer, GROUND_STATE); break; case ASTRAL_5: if (c == 'L') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = NMEA_RECOGNIZED; } else (void) character_pushback(lexer, GROUND_STATE); break; #endif /* TRIPMATE_ENABLE */ #ifdef EARTHMATE_ENABLE case EARTHA_1: if (c == 'A') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = EARTHA_2; } else (void) character_pushback(lexer, GROUND_STATE); break; case EARTHA_2: if (c == 'R') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = EARTHA_3; } else (void) character_pushback(lexer, GROUND_STATE); break; case EARTHA_3: if (c == 'T') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = EARTHA_4; } else (void) character_pushback(lexer, GROUND_STATE); break; case EARTHA_4: if (c == 'H') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = EARTHA_5; } else (void) character_pushback(lexer, GROUND_STATE); break; case EARTHA_5: if (c == 'A') { #ifdef RTCM104V2_ENABLE if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else if (isgpsstat == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } #endif /* RTCM104V2_ENABLE */ lexer->state = NMEA_RECOGNIZED; } else (void) character_pushback(lexer, GROUND_STATE); break; #endif /* EARTHMATE_ENABLE */ case SIRF_ACK_LEAD_1: if (c == 'c') lexer->state = SIRF_ACK_LEAD_2; else if (c == 'I') lexer->state = AIS_LEAD_2; else return character_pushback(lexer, GROUND_STATE); break; case SIRF_ACK_LEAD_2: if (c == 'k') lexer->state = NMEA_LEADER_END; else return character_pushback(lexer, GROUND_STATE); break; #endif /* NMEA_ENABLE */ #ifdef SIRF_ENABLE case SIRF_LEADER_1: if (c == 0xa2) lexer->state = SIRF_LEADER_2; else return character_pushback(lexer, GROUND_STATE); break; case SIRF_LEADER_2: lexer->length = (size_t) (c << 8); lexer->state = SIRF_LENGTH_1; break; case SIRF_LENGTH_1: lexer->length += c + 2; if (lexer->length <= MAX_PACKET_LENGTH) lexer->state = SIRF_PAYLOAD; else return character_pushback(lexer, GROUND_STATE); break; case SIRF_PAYLOAD: if (--lexer->length == 0) lexer->state = SIRF_DELIVERED; break; case SIRF_DELIVERED: if (c == 0xb0) lexer->state = SIRF_TRAILER_1; else return character_pushback(lexer, GROUND_STATE); break; case SIRF_TRAILER_1: if (c == 0xb3) lexer->state = SIRF_RECOGNIZED; else return character_pushback(lexer, GROUND_STATE); break; case SIRF_RECOGNIZED: if (c == 0xa0) lexer->state = SIRF_LEADER_1; else return character_pushback(lexer, GROUND_STATE); break; #endif /* SIRF_ENABLE */ #ifdef SUPERSTAR2_ENABLE case SUPERSTAR2_LEADER: ctmp = c; lexer->state = SUPERSTAR2_ID1; break; case SUPERSTAR2_ID1: if ((ctmp ^ 0xff) == c) lexer->state = SUPERSTAR2_ID2; else return character_pushback(lexer, GROUND_STATE); break; case SUPERSTAR2_ID2: 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 */ break; case SUPERSTAR2_PAYLOAD: if (--lexer->length == 0) lexer->state = SUPERSTAR2_CKSUM1; break; case SUPERSTAR2_CKSUM1: lexer->state = SUPERSTAR2_CKSUM2; break; case SUPERSTAR2_CKSUM2: lexer->state = SUPERSTAR2_RECOGNIZED; break; case SUPERSTAR2_RECOGNIZED: if (c == SOH) lexer->state = SUPERSTAR2_LEADER; else return character_pushback(lexer, GROUND_STATE); break; #endif /* SUPERSTAR2_ENABLE */ #ifdef ONCORE_ENABLE case ONCORE_AT2: if (isupper(c)) { lexer->length = (size_t) c; lexer->state = ONCORE_ID1; } else return character_pushback(lexer, GROUND_STATE); break; case ONCORE_ID1: if (isalpha(c)) { lexer->length = oncore_payload_cksum_length((unsigned char)lexer->length, c); if (lexer->length != 0) { lexer->state = ONCORE_PAYLOAD; break; } } else return character_pushback(lexer, GROUND_STATE); break; case ONCORE_PAYLOAD: if (--lexer->length == 0) lexer->state = ONCORE_CHECKSUM; break; case ONCORE_CHECKSUM: if (c != '\r') return character_pushback(lexer, GROUND_STATE); else lexer->state = ONCORE_CR; break; case ONCORE_CR: if (c == '\n') lexer->state = ONCORE_RECOGNIZED; else lexer->state = ONCORE_PAYLOAD; break; case ONCORE_RECOGNIZED: if (c == '@') lexer->state = AT1_LEADER; else return character_pushback(lexer, GROUND_STATE); break; #endif /* ONCORE_ENABLE */ #if defined(TSIP_ENABLE) || defined(EVERMORE_ENABLE) || defined(GARMIN_ENABLE) case DLE_LEADER: #ifdef EVERMORE_ENABLE if (c == STX) { lexer->state = EVERMORE_LEADER_2; break; } #endif /* EVERMORE_ENABLE */ #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; } // FALL-THRU!!!!! no break here #endif /* TSIP_ENABLE */ #ifdef NAVCOM_ENABLE case NAVCOM_LEADER_1: if (c == 0x99) lexer->state = NAVCOM_LEADER_2; else return character_pushback(lexer, GROUND_STATE); break; case NAVCOM_LEADER_2: if (c == 0x66) lexer->state = NAVCOM_LEADER_3; else return character_pushback(lexer, GROUND_STATE); break; case NAVCOM_LEADER_3: lexer->state = NAVCOM_ID; break; case NAVCOM_ID: lexer->length = (size_t) c - 4; lexer->state = NAVCOM_LENGTH_1; break; case NAVCOM_LENGTH_1: lexer->length += (c << 8); lexer->state = NAVCOM_LENGTH_2; break; case NAVCOM_LENGTH_2: if (--lexer->length == 0) lexer->state = NAVCOM_PAYLOAD; break; case NAVCOM_PAYLOAD: { 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_log(&lexer->errout, LOG_IO, "Navcom packet type 0x%hhx bad checksum 0x%hhx, expecting 0x%x\n", lexer->inbuffer[3], csum, c); lexer->state = GROUND_STATE; break; } } lexer->state = NAVCOM_CSUM; break; case NAVCOM_CSUM: if (c == 0x03) lexer->state = NAVCOM_RECOGNIZED; else return character_pushback(lexer, GROUND_STATE); break; case NAVCOM_RECOGNIZED: if (c == 0x02) lexer->state = NAVCOM_LEADER_1; else return character_pushback(lexer, GROUND_STATE); break; #endif /* NAVCOM_ENABLE */ #endif /* TSIP_ENABLE || EVERMORE_ENABLE || GARMIN_ENABLE */ #ifdef RTCM104V3_ENABLE case RTCM3_LEADER_1: /* high 6 bits must be zero, low 2 bits are MSB of a 10-bit length */ if ((c & 0xFC) == 0) { lexer->length = (size_t) (c << 8); lexer->state = RTCM3_LEADER_2; } else return character_pushback(lexer, GROUND_STATE); break; case RTCM3_LEADER_2: /* third byte is the low 8 bits of the RTCM3 packet length */ lexer->length |= c; lexer->length += 3; /* to get the three checksum bytes */ lexer->state = RTCM3_PAYLOAD; break; case RTCM3_PAYLOAD: if (--lexer->length == 0) lexer->state = RTCM3_RECOGNIZED; break; #endif /* RTCM104V3_ENABLE */ #ifdef ZODIAC_ENABLE case ZODIAC_EXPECTED: case ZODIAC_RECOGNIZED: if (c == 0xff) lexer->state = ZODIAC_LEADER_1; else return character_pushback(lexer, GROUND_STATE); break; case ZODIAC_LEADER_1: if (c == 0x81) lexer->state = ZODIAC_LEADER_2; else return character_pushback(lexer, GROUND_STATE); break; case ZODIAC_LEADER_2: lexer->state = ZODIAC_ID_1; break; case ZODIAC_ID_1: lexer->state = ZODIAC_ID_2; break; case ZODIAC_ID_2: lexer->length = (size_t) c; lexer->state = ZODIAC_LENGTH_1; break; case ZODIAC_LENGTH_1: lexer->length += (c << 8); lexer->state = ZODIAC_LENGTH_2; break; case ZODIAC_LENGTH_2: lexer->state = ZODIAC_FLAGS_1; break; case ZODIAC_FLAGS_1: lexer->state = ZODIAC_FLAGS_2; break; case ZODIAC_FLAGS_2: 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_log(&lexer->errout, LOG_IO, "Zodiac Header checksum 0x%hx expecting 0x%hx\n", sum, getword(4)); lexer->state = GROUND_STATE; break; } } gpsd_log(&lexer->errout, 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 */ /* 10 bytes is the length of the Zodiac header */ if (lexer->length <= MAX_PACKET_LENGTH - 10) lexer->state = ZODIAC_PAYLOAD; else return character_pushback(lexer, GROUND_STATE); break; case ZODIAC_PAYLOAD: if (--lexer->length == 0) lexer->state = ZODIAC_RECOGNIZED; break; #endif /* ZODIAC_ENABLE */ #ifdef UBLOX_ENABLE case UBX_LEADER_1: if (c == 0x62) lexer->state = UBX_LEADER_2; else return character_pushback(lexer, GROUND_STATE); break; case UBX_LEADER_2: lexer->state = UBX_CLASS_ID; break; case UBX_CLASS_ID: lexer->state = UBX_MESSAGE_ID; break; case UBX_MESSAGE_ID: lexer->length = (size_t) c; lexer->state = UBX_LENGTH_1; break; case UBX_LENGTH_1: lexer->length += (c << 8); if (lexer->length <= MAX_PACKET_LENGTH) lexer->state = UBX_LENGTH_2; else return character_pushback(lexer, GROUND_STATE); break; case UBX_LENGTH_2: lexer->state = UBX_PAYLOAD; break; case UBX_PAYLOAD: if (--lexer->length == 0) lexer->state = UBX_CHECKSUM_A; /* else stay in payload state */ break; case UBX_CHECKSUM_A: lexer->state = UBX_RECOGNIZED; break; case UBX_RECOGNIZED: if (c == 0xb5) lexer->state = UBX_LEADER_1; #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 */ #ifdef PASSTHROUGH_ENABLE else if (c == '{') return character_pushback(lexer, JSON_LEADER); #endif /* PASSTHROUGH_ENABLE */ else return character_pushback(lexer, GROUND_STATE); break; #endif /* UBLOX_ENABLE */ #ifdef EVERMORE_ENABLE case EVERMORE_LEADER_1: if (c == STX) lexer->state = EVERMORE_LEADER_2; else return character_pushback(lexer, GROUND_STATE); break; case EVERMORE_LEADER_2: lexer->length = (size_t) c; if (c == DLE) lexer->state = EVERMORE_PAYLOAD_DLE; else lexer->state = EVERMORE_PAYLOAD; break; case EVERMORE_PAYLOAD: if (c == DLE) lexer->state = EVERMORE_PAYLOAD_DLE; else if (--lexer->length == 0) return character_pushback(lexer, GROUND_STATE); 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; } break; case EVERMORE_RECOGNIZED: if (c == DLE) lexer->state = EVERMORE_LEADER_1; else return character_pushback(lexer, GROUND_STATE); break; #endif /* EVERMORE_ENABLE */ #ifdef ITRAX_ENABLE case ITALK_LEADER_1: if (c == '!') lexer->state = ITALK_LEADER_2; else return character_pushback(lexer, GROUND_STATE); break; case ITALK_LEADER_2: lexer->length = (size_t) (lexer->inbuffer[6] & 0xff); lexer->state = ITALK_LENGTH; break; case ITALK_LENGTH: lexer->length += 1; /* fix number of words in payload */ lexer->length *= 2; /* convert to number of bytes */ lexer->length += 3; /* add trailer length */ lexer->state = ITALK_PAYLOAD; break; case ITALK_PAYLOAD: /* lookahead for "') && (lexer->inbufptr[0] == '<') && (lexer->inbufptr[1] == '!')) { lexer->state = ITALK_RECOGNIZED; gpsd_log(&lexer->errout, LOG_IO, "ITALK: trying to process runt packet\n"); break; } else if (--lexer->length == 0) lexer->state = ITALK_DELIVERED; break; case ITALK_DELIVERED: if (c == '>') lexer->state = ITALK_RECOGNIZED; else return character_pushback(lexer, GROUND_STATE); break; case ITALK_RECOGNIZED: if (c == '<') lexer->state = ITALK_LEADER_1; else return character_pushback(lexer, GROUND_STATE); break; #endif /* ITRAX_ENABLE */ #ifdef GEOSTAR_ENABLE case GEOSTAR_LEADER_1: if (c == 'S') lexer->state = GEOSTAR_LEADER_2; else return character_pushback(lexer, GROUND_STATE); break; case GEOSTAR_LEADER_2: if (c == 'G') lexer->state = GEOSTAR_LEADER_3; else return character_pushback(lexer, GROUND_STATE); break; case GEOSTAR_LEADER_3: if (c == 'G') lexer->state = GEOSTAR_LEADER_4; else return character_pushback(lexer, GROUND_STATE); break; case GEOSTAR_LEADER_4: lexer->state = GEOSTAR_MESSAGE_ID_1; break; case GEOSTAR_MESSAGE_ID_1: lexer->state = GEOSTAR_MESSAGE_ID_2; break; case GEOSTAR_MESSAGE_ID_2: lexer->length = (size_t)(c * 4); lexer->state = GEOSTAR_LENGTH_1; break; case GEOSTAR_LENGTH_1: lexer->length += (c << 8) * 4; if (lexer->length <= MAX_PACKET_LENGTH) lexer->state = GEOSTAR_LENGTH_2; else return character_pushback(lexer, GROUND_STATE); break; case GEOSTAR_LENGTH_2: lexer->state = GEOSTAR_PAYLOAD; break; case GEOSTAR_PAYLOAD: if (--lexer->length == 0) lexer->state = GEOSTAR_CHECKSUM_A; /* else stay in payload state */ break; case GEOSTAR_CHECKSUM_A: lexer->state = GEOSTAR_CHECKSUM_B; break; case GEOSTAR_CHECKSUM_B: lexer->state = GEOSTAR_CHECKSUM_C; break; case GEOSTAR_CHECKSUM_C: lexer->state = GEOSTAR_RECOGNIZED; break; case GEOSTAR_RECOGNIZED: if (c == 'P') lexer->state = GEOSTAR_LEADER_1; else return character_pushback(lexer, GROUND_STATE); break; #endif /* GEOSTAR_ENABLE */ #ifdef TSIP_ENABLE case TSIP_LEADER: /* unused case */ if (c >= 0x13) lexer->state = TSIP_PAYLOAD; else return character_pushback(lexer, GROUND_STATE); break; case TSIP_PAYLOAD: if (c == DLE) lexer->state = TSIP_DLE; break; case TSIP_DLE: switch (c) { case ETX: lexer->state = TSIP_RECOGNIZED; break; case DLE: lexer->state = TSIP_PAYLOAD; break; default: lexer->state = GROUND_STATE; break; } break; case TSIP_RECOGNIZED: if (c == DLE) /* * Don't go to TSIP_LEADER state -- TSIP packets aren't * checksummed, so false positives are easy. We might be * looking at another DLE-stuffed protocol like EverMore * or Garmin streaming binary. */ lexer->state = DLE_LEADER; else return character_pushback(lexer, GROUND_STATE); break; #endif /* TSIP_ENABLE */ #ifdef RTCM104V2_ENABLE case RTCM2_SYNC_STATE: case RTCM2_SKIP_STATE: if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_MESSAGE) { lexer->state = RTCM2_RECOGNIZED; break; } else if (isgpsstat == ISGPS_NO_SYNC) lexer->state = GROUND_STATE; break; case RTCM2_RECOGNIZED: if (c == '#') /* * There's a remote possibility this could fire when # = * 0x23 is legitimate in-stream RTCM2 data. No help for * it, the test framework needs this case so it can inject * # EOF and we'll miss a packet. */ return character_pushback(lexer, GROUND_STATE); else if (rtcm2_decode(lexer, c) == ISGPS_SYNC) { lexer->state = RTCM2_SYNC_STATE; break; } else lexer->state = GROUND_STATE; break; #endif /* RTCM104V2_ENABLE */ #ifdef PASSTHROUGH_ENABLE case JSON_LEADER: if (c == '{' || c == '[') { lexer->json_depth++; } else if (c == '}' || c == ']') { if (--lexer->json_depth == 0) lexer->state = JSON_RECOGNIZED; } else if (isspace(c) || c == ',') break; else if (c == '"') { lexer->state = JSON_STRINGLITERAL; lexer->json_after = JSON_END_ATTRIBUTE; } else { gpsd_log(&lexer->errout, LOG_RAW + 2, "%08ld: missing attribute start after header\n", lexer->char_counter); lexer->state = GROUND_STATE; } break; case JSON_STRINGLITERAL: if (c == '\\') lexer->state = JSON_STRING_SOLIDUS; else if (c == '"') lexer->state = lexer->json_after; break; case JSON_STRING_SOLIDUS: lexer->state = JSON_STRINGLITERAL; break; case JSON_END_ATTRIBUTE: if (isspace(c)) break; else if (c == ':') lexer->state = JSON_EXPECT_VALUE; else /* saw something other than value start after colon */ return character_pushback(lexer, GROUND_STATE); break; case JSON_EXPECT_VALUE: if (isspace(c)) break; else if (c == '"') { lexer->state = JSON_STRINGLITERAL; lexer->json_after = JSON_END_VALUE; } else if (c == '{' || c == '[') { return character_pushback(lexer, JSON_LEADER); } else if (strchr("-0123456789", c) != NULL) { lexer->state = JSON_NUMBER; } else if (c == 't' || c == 'f' || c == 'n') /* * This is a bit more permissive than strictly necessary, as * GPSD JSON does not include the null token. Still, it's * futureproofing. */ lexer->state = JSON_SPECIAL; else /* couldn't recognize start of value literal */ return character_pushback(lexer, GROUND_STATE); break; case JSON_NUMBER: /* * Will recognize some ill-formed numeric literals. * Should be OK as we're already three stages deep inside * JSON recognition; odds that we'll actually see an * ill-formed literal are quite low. and the worst * possible result if it happens is our JSON parser will * quietly chuck out the object. */ if (strchr("1234567890.eE+-", c) == NULL) { return character_pushback(lexer, JSON_END_VALUE); } break; case JSON_SPECIAL: if (strchr("truefalsnil", c) == NULL) return character_pushback(lexer, JSON_END_VALUE); break; case JSON_END_VALUE: if (isspace(c)) break; else if (c == ',') lexer->state = JSON_LEADER; else if (c == '}' || c == ']') return character_pushback(lexer, JSON_LEADER); else /* trailing garbage after JSON value */ return character_pushback(lexer, GROUND_STATE); break; #endif /* PASSTHROUGH_ENABLE */ } return true; /* no pushback */ } static void packet_accept(struct gps_lexer_t *lexer, int packet_type) /* packet grab succeeded, move to output buffer */ { 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; if (lexer->errout.debug >= LOG_RAW+1) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; gpsd_log(&lexer->errout, LOG_RAW+1, "Packet type %d accepted %zu = %s\n", packet_type, packetlen, gpsd_packetdump(scratchbuf, sizeof(scratchbuf), (char *)lexer->outbuffer, lexer->outbuflen)); } } else { gpsd_log(&lexer->errout, LOG_ERROR, "Rejected too long packet type %d len %zu\n", packet_type, packetlen); } } static void packet_discard(struct gps_lexer_t *lexer) /* shift the input buffer to discard all data up to current input pointer */ { size_t discard = lexer->inbufptr - lexer->inbuffer; size_t remaining = lexer->inbuflen - discard; lexer->inbufptr = memmove(lexer->inbuffer, lexer->inbufptr, remaining); lexer->inbuflen = remaining; if (lexer->errout.debug >= LOG_RAW+1) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; gpsd_log(&lexer->errout, LOG_RAW + 1, "Packet discard of %zu, chars remaining is %zu = %s\n", discard, remaining, gpsd_packetdump(scratchbuf, sizeof(scratchbuf), (char *)lexer->inbuffer, lexer->inbuflen)); } } static void character_discard(struct gps_lexer_t *lexer) /* shift the input buffer to discard one character and reread data */ { memmove(lexer->inbuffer, lexer->inbuffer + 1, (size_t)-- lexer->inbuflen); lexer->inbufptr = lexer->inbuffer; if (lexer->errout.debug >= LOG_RAW+1) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; gpsd_log(&lexer->errout, LOG_RAW + 1, "Character discarded, buffer %zu chars = %s\n", lexer->inbuflen, gpsd_packetdump(scratchbuf, sizeof(scratchbuf), (char *)lexer->inbuffer, lexer->inbuflen)); } } /* get 0-origin big-endian words relative to start of packet buffer */ #define getword(i) (short)(lexer->inbuffer[2*(i)] | (lexer->inbuffer[2*(i)+1] << 8)) /* entry points begin here */ void lexer_init(struct gps_lexer_t *lexer) { lexer->char_counter = 0; lexer->retry_counter = 0; #ifdef PASSTHROUGH_ENABLE lexer->json_depth = 0; #endif /* PASSTHROUGH_ENABLE */ #ifdef TIMING_ENABLE lexer->start_time = 0.0; #endif /* TIMING_ENABLE */ packet_reset(lexer); errout_reset(&lexer->errout); } void packet_parse(struct gps_lexer_t *lexer) /* grab a packet from the input buffer */ { lexer->outbuflen = 0; while (packet_buffered_input(lexer) > 0) { unsigned char c = *lexer->inbufptr++; unsigned int oldstate = lexer->state; if (!nextstate(lexer, c)) continue; gpsd_log(&lexer->errout, LOG_RAW + 2, "%08ld: character '%c' [%02x], %s -> %s\n", lexer->char_counter, (isprint(c) ? c : '.'), c, state_table[oldstate], state_table[lexer->state]); lexer->char_counter++; if (lexer->state == GROUND_STATE) { character_discard(lexer); } else if (lexer->state == COMMENT_RECOGNIZED) { packet_accept(lexer, COMMENT_PACKET); packet_discard(lexer); lexer->state = GROUND_STATE; break; } #ifdef NMEA_ENABLE else if (lexer->state == NMEA_RECOGNIZED) { /* * $PASHR packets have no checksum. Avoid the possibility * that random garbage might make it look like they do. */ if (!str_starts_with((const char *)lexer->inbuffer, "$PASHR,")) { bool checksum_ok = true; char csum[3] = { '0', '0', '0' }; char *end; /* * 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((unsigned char) *end); end--) continue; while (strchr("0123456789ABCDEF", *end)) --end; if (*end == '*') { unsigned int n, crc = 0; 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((unsigned char) end[1]) && csum[1] == toupper((unsigned char) end[2])); } if (!checksum_ok) { gpsd_log(&lexer->errout, LOG_WARN, "bad checksum in NMEA packet; expected %s.\n", csum); packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; packet_discard(lexer); break; /* exit case */ } } /* checksum passed or not present */ #ifdef AIVDM_ENABLE if (str_starts_with((char *)lexer->inbuffer, "!AIVDM")) packet_accept(lexer, AIVDM_PACKET); else if (str_starts_with((char *)lexer->inbuffer, "!AIVDO")) packet_accept(lexer, AIVDM_PACKET); else if (str_starts_with((char *)lexer->inbuffer, "!BSVDM")) packet_accept(lexer, AIVDM_PACKET); else if (str_starts_with((char *)lexer->inbuffer, "!BSVDO")) packet_accept(lexer, AIVDM_PACKET); else if (str_starts_with((char *)lexer->inbuffer, "!ABVDM")) packet_accept(lexer, AIVDM_PACKET); else if (str_starts_with((char *)lexer->inbuffer, "!ABVDO")) packet_accept(lexer, AIVDM_PACKET); else if (str_starts_with((char *)lexer->inbuffer, "!ANVDM")) packet_accept(lexer, AIVDM_PACKET); else if (str_starts_with((char *)lexer->inbuffer, "!ANVDO")) packet_accept(lexer, AIVDM_PACKET); else if (str_starts_with((char *)lexer->inbuffer, "!SAVDM")) packet_accept(lexer, AIVDM_PACKET); else if (str_starts_with((char *)lexer->inbuffer, "!SAVDO")) packet_accept(lexer, AIVDM_PACKET); else #endif /* AIVDM_ENABLE */ packet_accept(lexer, NMEA_PACKET); packet_discard(lexer); break; } #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 int n, crc = 0; for (n = 4; n < (unsigned)(trailer - lexer->inbuffer); n++) crc += (int)lexer->inbuffer[n]; crc &= 0x7fff; if (checksum == crc) packet_accept(lexer, SIRF_PACKET); else { packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; } packet_discard(lexer); break; } #endif /* SIRF_ENABLE */ #ifdef SUPERSTAR2_ENABLE else if (lexer->state == SUPERSTAR2_RECOGNIZED) { unsigned a = 0, b; size_t n; lexer->length = 4 + (size_t) lexer->inbuffer[3] + 2; for (n = 0; n < lexer->length - 2; n++) a += (unsigned)lexer->inbuffer[n]; b = (unsigned)getleu16(lexer->inbuffer, lexer->length - 2); gpsd_log(&lexer->errout, LOG_IO, "SuperStarII pkt dump: type %u len %u\n", lexer->inbuffer[1], (unsigned int)lexer->length); if (a != b) { gpsd_log(&lexer->errout, LOG_IO, "REJECT SuperStarII packet type 0x%02x" "%zd bad checksum 0x%04x, expecting 0x%04x\n", lexer->inbuffer[1], lexer->length, a, b); packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; } else { packet_accept(lexer, SUPERSTAR2_PACKET); } packet_discard(lexer); break; } #endif /* SUPERSTAR2_ENABLE */ #ifdef ONCORE_ENABLE else if (lexer->state == ONCORE_RECOGNIZED) { char a, b; int i, len; len = lexer->inbufptr - lexer->inbuffer; a = (char)(lexer->inbuffer[len - 3]); b = '\0'; for (i = 2; i < len - 3; i++) b ^= lexer->inbuffer[i]; if (a == b) { gpsd_log(&lexer->errout, LOG_IO, "Accept OnCore packet @@%c%c len %d\n", lexer->inbuffer[2], lexer->inbuffer[3], len); packet_accept(lexer, ONCORE_PACKET); } else { gpsd_log(&lexer->errout, LOG_IO, "REJECT OnCore packet @@%c%c len %d\n", lexer->inbuffer[2], lexer->inbuffer[3], len); packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; } packet_discard(lexer); break; } #endif /* ONCORE_ENABLE */ #if defined(TSIP_ENABLE) || defined(GARMIN_ENABLE) else if (lexer->state == TSIP_RECOGNIZED) { size_t packetlen = lexer->inbufptr - lexer->inbuffer; #ifdef TSIP_ENABLE unsigned int pos, dlecnt; /* don't count stuffed DLEs in the length */ dlecnt = 0; for (pos = 0; pos < (unsigned int)packetlen; pos++) if (lexer->inbuffer[pos] == DLE) dlecnt++; if (dlecnt > 2) { dlecnt -= 2; dlecnt /= 2; gpsd_log(&lexer->errout, LOG_RAW, "Unstuffed %d DLEs\n", dlecnt); packetlen -= dlecnt; } #endif /* TSIP_ENABLE */ if (packetlen < 5) { lexer->state = GROUND_STATE; } else { unsigned int pkt_id; #ifdef GARMIN_ENABLE unsigned int len; size_t n; unsigned int ch, chksum; n = 0; #ifdef TSIP_ENABLE /* shortcut garmin */ if (TSIP_PACKET == lexer->type) goto not_garmin; #endif /* TSIP_ENABLE */ if (lexer->inbuffer[n++] != DLE) goto not_garmin; pkt_id = lexer->inbuffer[n++]; /* packet ID */ len = lexer->inbuffer[n++]; chksum = len + pkt_id; if (len == DLE) { if (lexer->inbuffer[n++] != DLE) goto not_garmin; } for (; len > 0; len--) { chksum += lexer->inbuffer[n]; if (lexer->inbuffer[n++] == DLE) { if (lexer->inbuffer[n++] != DLE) goto not_garmin; } } /* check sum byte */ ch = lexer->inbuffer[n++]; chksum += ch; if (ch == DLE) { if (lexer->inbuffer[n++] != DLE) goto not_garmin; } if (lexer->inbuffer[n++] != DLE) goto not_garmin; /* we used to say n++ here, but scan-build complains */ if (lexer->inbuffer[n] != ETX) goto not_garmin; chksum &= 0xff; if (chksum) { gpsd_log(&lexer->errout, LOG_IO, "Garmin checksum failed: %02x!=0\n", chksum); goto not_garmin; } packet_accept(lexer, GARMIN_PACKET); packet_discard(lexer); break; not_garmin:; gpsd_log(&lexer->errout, LOG_RAW + 1, "Not a Garmin packet\n"); #endif /* GARMIN_ENABLE */ #ifdef TSIP_ENABLE /* check for some common TSIP packet types: * 0x13, TSIP Parsing Error Notification * 0x38, Request SV system data * 0x1c, Hardware/Software Version Information * 0x41, GPS time, data length 10 * 0x42, Single Precision Fix, data length 16 * 0x43, Velocity Fix, data length 20 * 0x45, Software Version Information, data length 10 * 0x46, Health of Receiver, data length 2 * 0x48, GPS System Messages, data length 22 * 0x49, Almanac Health Page, data length 32 * 0x4a, LLA Position, data length 20 * 0x4b, Machine Code Status, data length 3 * 0x4c, Operating Parameters Report, data length 17 * 0x54, One Satellite Bias, data length 4 * 0x56, Velocity Fix (ENU), data length 20 * 0x57, Last Computed Fix Report, data length 8 * 0x5a, Raw Measurements * 0x5b, Satellite Ephemeris Status, data length 16 * 0x5c, Satellite Tracking Status, data length 24 * 0x5e, Additional Fix Status Report * 0x6d, All-In-View Satellite Selection, data length 16+numSV * 0x82, Differential Position Fix Mode, data length 1 * 0x83, Double Precision XYZ, data length 36 * 0x84, Double Precision LLA, data length 36 * 0xbb, GPS Navigation Configuration * 0xbc, Receiver Port Configuration * * [pkt id] [data] * * The best description is in [TSIP], the Trimble Standard * Interface Protocol manual; unless otherwise specified * that is where these type/length notifications are from. * * Note that not all Trimble chips conform perfectly to this * specification, nor does it cover every packet type we * may see on the wire. */ pkt_id = lexer->inbuffer[1]; /* packet ID */ /* *INDENT-OFF* */ if (!((0x13 == pkt_id) || (0x1c == pkt_id) || (0xbb == pkt_id) || (0xbc == pkt_id) || (0x38 == pkt_id)) && ((0x41 > pkt_id) || (0x8f < pkt_id))) { gpsd_log(&lexer->errout, LOG_IO, "Packet ID 0x%02x out of range for TSIP\n", pkt_id); goto not_tsip; } /* *INDENT-ON* */ #define TSIP_ID_AND_LENGTH(id, len) ((id == pkt_id) && (len == packetlen-4)) if ((0x13 == pkt_id) && (1 <= packetlen)) /* pass */ ; /* * Not in [TSIP], Accutime Gold only. Variable length. */ else if ((0x1c == pkt_id) && (11 <= packetlen)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x41, 10)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x42, 16)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x43, 20)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x45, 10)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x46, 2)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x48, 22)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x49, 32)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x4a, 20)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x4b, 3)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x4c, 17)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x54, 12)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x55, 4)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x56, 20)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x57, 8)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x5a, 25)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x5b, 16)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x5c, 24)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x5e, 2)) /* pass */ ; /* * Not in [TSIP]. It's unclear where this test came from or * why it's here; the TSIP driver doesn't use type 0x5f. */ else if (TSIP_ID_AND_LENGTH(0x5f, 66)) /* pass */ ; /* 0x6d is variable length depending on the sat picture */ else if ((0x6d == pkt_id) && ((0x14 <= packetlen) && (0x20 >= packetlen))) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x82, 1)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x83, 36)) /* pass */ ; else if (TSIP_ID_AND_LENGTH(0x84, 36)) /* pass */ ; /* super packets, variable length */ else if ((0x8e == pkt_id) || (0x8f == pkt_id)) /* pass */ ; /* * This is according to [TSIP]. */ else if (TSIP_ID_AND_LENGTH(0xbb, 40)) /* pass */ ; /* * The Accutime Gold ships a version of this packet with a * 43-byte payload. We only use the first 21 bytes, and * parts after byte 27 are padding. */ else if (TSIP_ID_AND_LENGTH(0xbb, 43)) /* pass */ ; else { /* pass */ ; gpsd_log(&lexer->errout, LOG_IO, "TSIP REJECT pkt_id = %#02x, packetlen= %zu\n", pkt_id, packetlen); goto not_tsip; } #undef TSIP_ID_AND_LENGTH /* Debug */ gpsd_log(&lexer->errout, LOG_RAW, "TSIP pkt_id = %#02x, packetlen= %zu\n", pkt_id, packetlen); packet_accept(lexer, TSIP_PACKET); packet_discard(lexer); break; not_tsip: gpsd_log(&lexer->errout, LOG_RAW + 1, "Not a TSIP packet\n"); /* * More attempts to recognize ambiguous TSIP-like * packet types could go here. */ packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; packet_discard(lexer); break; #endif /* TSIP_ENABLE */ } } #endif /* TSIP_ENABLE || GARMIN_ENABLE */ #ifdef RTCM104V3_ENABLE else if (lexer->state == RTCM3_RECOGNIZED) { if (crc24q_check(lexer->inbuffer, lexer->inbufptr - lexer->inbuffer)) { packet_accept(lexer, RTCM3_PACKET); } else { gpsd_log(&lexer->errout, 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]); packet_accept(lexer, BAD_PACKET); } packet_discard(lexer); lexer->state = GROUND_STATE; break; } #endif /* RTCM104V3_ENABLE */ #ifdef ZODIAC_ENABLE else if (lexer->state == ZODIAC_RECOGNIZED) { short len, n, sum; len = getword(2); for (n = sum = 0; n < len; n++) sum += getword(5 + n); sum *= -1; if (len == 0 || sum == getword(5 + len)) { packet_accept(lexer, ZODIAC_PACKET); } else { gpsd_log(&lexer->errout, LOG_IO, "Zodiac data checksum 0x%hx over length %hd, expecting 0x%hx\n", sum, len, getword(5 + len)); packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; } packet_discard(lexer); break; } #endif /* ZODIAC_ENABLE */ #ifdef UBLOX_ENABLE else if (lexer->state == UBX_RECOGNIZED) { /* UBX use a TCP like checksum */ int n, len; unsigned char ck_a = (unsigned char)0; unsigned char ck_b = (unsigned char)0; len = lexer->inbufptr - lexer->inbuffer; gpsd_log(&lexer->errout, LOG_IO, "UBX: len %d\n", len); 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]) packet_accept(lexer, UBX_PACKET); else { gpsd_log(&lexer->errout, LOG_IO, "UBX checksum 0x%02hhx%02hhx over length %d," " 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]); packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; } packet_discard(lexer); break; } #endif /* UBLOX_ENABLE */ #ifdef EVERMORE_ENABLE else if (lexer->state == EVERMORE_RECOGNIZED) { unsigned int n, crc, checksum, len; n = 0; if (lexer->inbuffer[n++] != DLE) goto not_evermore; if (lexer->inbuffer[n++] != STX) goto not_evermore; len = lexer->inbuffer[n++]; if (len == DLE) { if (lexer->inbuffer[n++] != DLE) goto not_evermore; } len -= 2; crc = 0; for (; len > 0; len--) { crc += lexer->inbuffer[n]; if (lexer->inbuffer[n++] == DLE) { if (lexer->inbuffer[n++] != DLE) goto not_evermore; } } checksum = lexer->inbuffer[n++]; if (checksum == DLE) { if (lexer->inbuffer[n++] != DLE) goto not_evermore; } if (lexer->inbuffer[n++] != DLE) goto not_evermore; /* we used to say n++ here, but scan-build complains */ if (lexer->inbuffer[n] != ETX) goto not_evermore; crc &= 0xff; if (crc != checksum) { gpsd_log(&lexer->errout, LOG_IO, "EverMore checksum failed: %02x != %02x\n", crc, checksum); goto not_evermore; } packet_accept(lexer, EVERMORE_PACKET); packet_discard(lexer); break; not_evermore: packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; packet_discard(lexer); break; } #endif /* EVERMORE_ENABLE */ /* XXX CSK */ #ifdef ITRAX_ENABLE #define getib(j) ((uint8_t)lexer->inbuffer[(j)]) #define getiw(i) ((uint16_t)(((uint16_t)getib((i)+1) << 8) | (uint16_t)getib((i)))) else if (lexer->state == ITALK_RECOGNIZED) { volatile uint16_t len, n, csum, xsum; /* number of words */ len = (uint16_t) (lexer->inbuffer[6] & 0xff); /* expected checksum */ xsum = getiw(7 + 2 * len); csum = 0; for (n = 0; n < len; n++) { volatile uint16_t tmpw = getiw(7 + 2 * n); volatile uint32_t tmpdw = (csum + 1) * (tmpw + n); csum ^= (tmpdw & 0xffff) ^ ((tmpdw >> 16) & 0xffff); } if (len == 0 || csum == xsum) packet_accept(lexer, ITALK_PACKET); else { gpsd_log(&lexer->errout, LOG_IO, "ITALK: checksum failed - " "type 0x%02x expected 0x%04x got 0x%04x\n", lexer->inbuffer[4], xsum, csum); packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; } packet_discard(lexer); break; } #undef getiw #undef getib #endif /* ITRAX_ENABLE */ #ifdef NAVCOM_ENABLE else if (lexer->state == NAVCOM_RECOGNIZED) { /* By the time we got here we know checksum is OK */ packet_accept(lexer, NAVCOM_PACKET); packet_discard(lexer); break; } #endif /* NAVCOM_ENABLE */ #ifdef GEOSTAR_ENABLE else if (lexer->state == GEOSTAR_RECOGNIZED) { /* GeoStar uses a XOR 32bit checksum */ int n, len; unsigned int cs = 0L; len = lexer->inbufptr - lexer->inbuffer; /* Calculate checksum */ for (n = 0; n < len; n += 4) { cs ^= getleu32(lexer->inbuffer, n); } if (cs == 0) packet_accept(lexer, GEOSTAR_PACKET); else { gpsd_log(&lexer->errout, LOG_IO, "GeoStar checksum failed 0x%x over length %d\n", cs, len); packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; } packet_discard(lexer); break; } #endif /* GEOSTAR_ENABLE */ #ifdef RTCM104V2_ENABLE else if (lexer->state == RTCM2_RECOGNIZED) { /* * RTCM packets don't have checksums. The six bits of parity * per word and the preamble better be good enough. */ packet_accept(lexer, RTCM2_PACKET); packet_discard(lexer); break; } #endif /* RTCM104V2_ENABLE */ #ifdef GARMINTXT_ENABLE else if (lexer->state == GTXT_RECOGNIZED) { size_t packetlen = lexer->inbufptr - lexer->inbuffer; if (57 <= packetlen) { packet_accept(lexer, GARMINTXT_PACKET); packet_discard(lexer); lexer->state = GROUND_STATE; break; } else { packet_accept(lexer, BAD_PACKET); lexer->state = GROUND_STATE; } } #endif #ifdef PASSTHROUGH_ENABLE else if (lexer->state == JSON_RECOGNIZED) { size_t packetlen = lexer->inbufptr - lexer->inbuffer; if (packetlen >= 11) /* {"class": } */ packet_accept(lexer, JSON_PACKET); else packet_accept(lexer, BAD_PACKET); packet_discard(lexer); lexer->state = GROUND_STATE; break; } #endif /* PASSTHROUGH_ENABLE */ } /* while */ } #undef getword ssize_t packet_get(int fd, struct gps_lexer_t *lexer) /* grab a packet; return -1=>I/O error, 0=>EOF, or a length */ { ssize_t recvd; errno = 0; recvd = read(fd, lexer->inbuffer + lexer->inbuflen, sizeof(lexer->inbuffer) - (lexer->inbuflen)); if (recvd == -1) { if ((errno == EAGAIN) || (errno == EINTR)) { gpsd_log(&lexer->errout, LOG_RAW + 2, "no bytes ready\n"); recvd = 0; /* fall through, input buffer may be nonempty */ } else { gpsd_log(&lexer->errout, LOG_RAW + 2, "errno: %s\n", strerror(errno)); return -1; } } else { if (lexer->errout.debug >= LOG_RAW+1) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; gpsd_log(&lexer->errout, LOG_RAW + 1, "Read %zd chars to buffer offset %zd (total %zd): %s\n", recvd, lexer->inbuflen, lexer->inbuflen + recvd, gpsd_packetdump(scratchbuf, sizeof(scratchbuf), (char *)lexer->inbufptr, (size_t) recvd)); } lexer->inbuflen += recvd; } gpsd_log(&lexer->errout, LOG_SPIN, "packet_get() fd %d -> %zd (%d)\n", fd, recvd, errno); /* * Bail out, indicating no more input, only if we just received * nothing from the device and there is nothing waiting in the * packet input buffer. */ if (recvd <= 0 && packet_buffered_input(lexer) <= 0) return recvd; /* Otherwise, consume from the packet input buffer */ /* coverity[tainted_data] */ packet_parse(lexer); /* if input buffer is full, discard */ if (sizeof(lexer->inbuffer) == (lexer->inbuflen)) { /* coverity[tainted_data] */ packet_discard(lexer); lexer->state = GROUND_STATE; } /* * If we gathered a packet, return its length; it will have been * consumed out of the input buffer and moved to the output * buffer. We don't care whether the read() returned 0 or -1 and * gathered packet data was all buffered or whether it was partly * just physically read. * * Note: this choice greatly simplifies life for callers of * packet_get(), but means that they cannot tell when a nonzero * return means there was a successful physical read. They will * thus credit a data source that drops out with being alive * slightly longer than it actually was. This is unlikely to * matter as long as any policy timeouts are large compared to * the time required to consume the greatest possible amount * of buffered input, but if you hack this code you need to * be aware of the issue. It might also slightly affect * performance profiling. */ if (lexer->outbuflen > 0) return (ssize_t) lexer->outbuflen; else /* * Otherwise recvd is the size of whatever packet fragment we got. * It can still be 0 or -1 at this point even if buffer data * was consumed. */ return recvd; } void packet_reset(struct gps_lexer_t *lexer) /* return the packet machine to the ground state */ { lexer->type = BAD_PACKET; lexer->state = GROUND_STATE; lexer->inbuflen = 0; lexer->inbufptr = lexer->inbuffer; #ifdef BINARY_ENABLE isgps_init(lexer); #endif /* BINARY_ENABLE */ } #ifdef __UNUSED__ void packet_pushback(struct gps_lexer_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); lexer->inbuflen += lexer->outbuflen; lexer->inbufptr += lexer->outbuflen; lexer->outbuflen = 0; } } #endif /* __UNUSED */ gpsd-3.15/packet_states.h0000664000175000017500000002120012506317045013546 0ustar esresr/* edit packet_states.h to add new packet types. */ GROUND_STATE, /* we don't know what packet type to expect */ COMMENT_BODY, /* pound comment for a test load */ COMMENT_RECOGNIZED, /* comment recognized */ #ifdef NMEA_ENABLE NMEA_DOLLAR, /* we've seen first character of NMEA leader */ NMEA_BANG, /* we've seen first character of an AIS message '!' */ NMEA_PUB_LEAD, /* seen second character of NMEA G leader */ NMEA_VENDOR_LEAD, /* seen second character of NMEA P leader */ NMEA_LEADER_END, /* seen end char of NMEA leader, in body */ NMEA_PASHR_A, /* grind through recognizing $PASHR */ NMEA_PASHR_S, /* grind through recognizing $PASHR */ NMEA_PASHR_H, /* grind through recognizing $PASHR */ NMEA_BINARY_BODY, /* Ashtech-style binary packet body, skip until \r\n */ NMEA_BINARY_CR, /* \r on end of Ashtech-style binary packet */ NMEA_BINARY_NL, /* \n on end of Ashtech-style binary packet */ NMEA_CR, /* seen terminating \r of NMEA packet */ NMEA_RECOGNIZED, /* saw trailing \n of NMEA packet */ SIRF_ACK_LEAD_1, /* seen A of possible SiRF Ack */ SIRF_ACK_LEAD_2, /* seen c of possible SiRF Ack */ AIS_LEAD_1, /* seen initial A of possible AIS message */ AIS_LEAD_2, /* seen second I/B/N/X of possible AIS message */ AIS_LEAD_ALT1, /* seen initial B of possible AIS message */ AIS_LEAD_ALT2, /* seen second S of possible AIS message */ AIS_LEAD_ALT3, /* seen initial S of possible AIS message */ AIS_LEAD_ALT4, /* seen second A of possible AIS message */ SEATALK_LEAD_1, /* SeaTalk/Garmin packet leader 'I' */ WEATHER_LEAD_1, /* Weather instrument packet leader 'W' */ HEADCOMP_LEAD_1, /* Heading/compass packet leader 'H' */ TURN_LEAD_1, /* Turn indicator packet leader 'T' */ ECDIS_LEAD_1, /* ECDIS packet leader 'E' */ SOUNDER_LEAD_1, /* Depth sounder packet leader 'S' */ TRANSDUCER_LEAD_1, /* Generic transducer packet leader 'Y' */ BEIDOU_LEAD_1, /* Beidou leader */ QZSS_LEAD_1, /* Quasi-Zenith Satellite System leader */ #endif /* NMEA_ENABLE */ DLE_LEADER, /* we've seen the TSIP/EverMore leader (DLE) */ #ifdef TRIPMATE_ENABLE ASTRAL_1, /* ASTRAL leader A */ ASTRAL_2, /* ASTRAL leader S */ ASTRAL_3, /* ASTRAL leader T */ ASTRAL_4, /* ASTRAL leader R */ ASTRAL_5, /* ASTRAL leader A */ #endif /* TRIPMATE_ENABLE */ #ifdef EARTHMATE_ENABLE EARTHA_1, /* EARTHA leader E */ EARTHA_2, /* EARTHA leader A */ EARTHA_3, /* EARTHA leader R */ EARTHA_4, /* EARTHA leader T */ EARTHA_5, /* EARTHA leader H */ #endif /* EARTHMATE_ENABLE */ #ifdef SIRF_ENABLE SIRF_LEADER_1, /* we've seen first character of SiRF leader */ SIRF_LEADER_2, /* seen second character of SiRF leader */ SIRF_LENGTH_1, /* seen first byte of SiRF length */ SIRF_PAYLOAD, /* we're in a SiRF payload part */ SIRF_DELIVERED, /* saw last byte of SiRF payload/checksum */ SIRF_TRAILER_1, /* saw first byte of SiRF trailer */ SIRF_RECOGNIZED, /* saw second byte of SiRF trailer */ #endif /* SIRF_ENABLE */ #ifdef ZODIAC_ENABLE ZODIAC_EXPECTED, /* expecting Zodiac packet */ ZODIAC_LEADER_1, /* saw leading 0xff */ ZODIAC_LEADER_2, /* saw leading 0x81 */ ZODIAC_ID_1, /* saw first byte of ID */ ZODIAC_ID_2, /* saw second byte of ID */ ZODIAC_LENGTH_1, /* saw first byte of Zodiac packet length */ ZODIAC_LENGTH_2, /* saw second byte of Zodiac packet length */ ZODIAC_FLAGS_1, /* saw first byte of FLAGS */ ZODIAC_FLAGS_2, /* saw second byte of FLAGS */ ZODIAC_HSUM_1, /* saw first byte of Header sum */ ZODIAC_PAYLOAD, /* we're in a Zodiac payload */ ZODIAC_RECOGNIZED, /* found end of the Zodiac packet */ #endif /* ZODIAC_ENABLE */ #if defined(TNT_ENABLE) || defined(GARMINTXT_ENABLE) || defined(ONCORE_ENABLE) AT1_LEADER, /* saw True North status leader '@' */ /* Garmin Simple Text starts with @ leader */ /* Oncore starts with @ leader */ GTXT_RECOGNIZED, /* */ #endif #ifdef EVERMORE_ENABLE EVERMORE_LEADER_1, /* a DLE after having seen EverMore data */ EVERMORE_LEADER_2, /* seen opening STX of EverMore packet */ EVERMORE_PAYLOAD, /* in payload part of EverMore packet */ EVERMORE_PAYLOAD_DLE,/* DLE in payload part of EverMore packet */ EVERMORE_RECOGNIZED, /* found end of EverMore packet */ #endif /* EVERMORE_ENABLE */ #ifdef ITRAX_ENABLE ITALK_LEADER_1, /* saw leading < of iTalk packet */ ITALK_LEADER_2, /* saw leading ! of iTalk packet */ ITALK_LENGTH, /* saw packet length */ ITALK_PAYLOAD, /* in payload part of iTalk Packet */ ITALK_DELIVERED, /* seen end of payload */ ITALK_TRAILER, /* saw iTalk trailer byte */ ITALK_RECOGNIZED, /* found end of the iTalk packet */ #endif /* ITRAX_ENABLE */ #ifdef NAVCOM_ENABLE NAVCOM_EXPECTED, /* expecting Navcom NCT packet */ NAVCOM_LEADER_1, /* saw leading 0x02 */ NAVCOM_LEADER_2, /* saw leading 0x99 */ NAVCOM_LEADER_3, /* saw leading 0x66 */ NAVCOM_ID, /* saw message ID */ NAVCOM_LENGTH_1, /* saw first byte of Navcom packet length */ NAVCOM_LENGTH_2, /* saw second byte of Navcom packet length */ NAVCOM_PAYLOAD, /* we're in a Navcom payload */ NAVCOM_CSUM, /* saw checksum */ NAVCOM_RECOGNIZED, /* found end of the Navcom packet */ #endif /* NAVCOM_ENABLE */ #ifdef UBLOX_ENABLE UBX_LEADER_1, /* first constant leader byte found */ UBX_LEADER_2, /* second constant leader byte found */ UBX_CLASS_ID, /* classid read */ UBX_MESSAGE_ID, /* message id read */ UBX_LENGTH_1, /* first length byte read (le) */ UBX_LENGTH_2, /* second length byte read (le) */ UBX_PAYLOAD, /* payload eating */ UBX_CHECKSUM_A, /* checksum A byte (tcp checksum) */ UBX_RECOGNIZED, /* this is also UBX_CHECKSUM_B */ #endif #ifdef SUPERSTAR2_ENABLE SUPERSTAR2_LEADER, /* leading SOH */ SUPERSTAR2_ID1, /* message type */ SUPERSTAR2_ID2, /* message type xor 0xff */ SUPERSTAR2_PAYLOAD, /* length of the actual packet data */ SUPERSTAR2_CKSUM1, SUPERSTAR2_CKSUM2, SUPERSTAR2_RECOGNIZED, #endif #ifdef ONCORE_ENABLE ONCORE_AT2, /* second @ */ ONCORE_ID1, /* first character of command type */ ONCORE_PAYLOAD, /* payload eating */ ONCORE_CHECKSUM, /* checksum byte */ ONCORE_CR, /* closing CR */ ONCORE_RECOGNIZED, /* closing LF */ #endif #ifdef GEOSTAR_ENABLE GEOSTAR_LEADER_1, /* first constant leader byte found */ GEOSTAR_LEADER_2, /* second constant leader byte found */ GEOSTAR_LEADER_3, /* third constant leader byte found */ GEOSTAR_LEADER_4, /* forth constant leader byte found */ GEOSTAR_MESSAGE_ID_1, /* first message id read */ GEOSTAR_MESSAGE_ID_2, /* second message id read */ GEOSTAR_LENGTH_1, /* first length byte read */ GEOSTAR_LENGTH_2, /* second length byte read */ GEOSTAR_PAYLOAD, /* payload eating */ GEOSTAR_CHECKSUM_A, /* checksum A byte (xor checksum) */ GEOSTAR_CHECKSUM_B, /* checksum B byte (xor checksum) */ GEOSTAR_CHECKSUM_C, /* checksum C byte (xor checksum) */ GEOSTAR_RECOGNIZED, /* this is also GEOSTAR_CHECKSUM_D */ #endif /* * Packet formats without checksums start here. We list them last so * that if a format with a conflicting structure *and* a checksum can * be recognized, that will be preferred. */ #if defined(TSIP_ENABLE) || defined(GARMIN_ENABLE) TSIP_LEADER, /* a DLE after having seen TSIP data */ TSIP_PAYLOAD, /* we're in TSIP payload */ TSIP_DLE, /* we've seen a DLE in TSIP payload */ TSIP_RECOGNIZED, /* found end of the TSIP packet */ GARMIN_RECOGNIZED, /* found end of Garmin packet */ #endif /* TSIP_ENABLE GARMIN_ENABLE */ #ifdef RTCM104V2_ENABLE RTCM2_SYNC_STATE, /* we have sync lock */ RTCM2_SKIP_STATE, /* we have sync lock, but this character is bad */ RTCM2_RECOGNIZED, /* we have an RTCM packet */ #endif /* RTCM104V2_ENABLE */ #ifdef RTCM104V3_ENABLE RTCM3_LEADER_1, /* constant leader byte found */ RTCM3_LEADER_2, /* second leader byte found (high 6 bits zero) */ RTCM3_PAYLOAD, /* gathering payload */ RTCM3_RECOGNIZED, /* RTCM3 packet recognized */ #endif #ifdef PASSTHROUGH_ENABLE JSON_LEADER, /* JSON leading { found */ JSON_STRINGLITERAL, /* start of JSON string literal seen */ JSON_STRING_SOLIDUS, /* backslash in string */ JSON_END_ATTRIBUTE, /* end of JSON attribute */ JSON_EXPECT_VALUE, /* just after colon */ JSON_END_VALUE, /* end of JSON value */ JSON_NUMBER, /* inside a JSON numeric literal */ JSON_SPECIAL, /* inside a JSON special literal (true,false,null) */ JSON_RECOGNIZED, /* JSON packet recognized */ #endif /* end of packet_states.h */ gpsd-3.15/ppsthread.c0000664000175000017500000012261012520742615012711 0ustar esresr/* * ppsthread.c - manage PPS watcher threads * * To enable KPPS, this file needs to be compiled with -DHAVE_SYS_TIMEPPS_H * * If you are not good at threads do not touch this file! * For example: errno is thread safe; strerror() is not. * * It helps to know that there are two PPS measurement methods in * play. One is defined by RFC2783 and typically implemented in the * kernel. It is available on FreeBSD, Linux, and NetBSD. In gpsd it * is referred to as KPPS. KPPS is accessed on Linux via /dev/ppsN * devices. On BSD it is accessed via the same device as the serial * port. This mechanism is preferred as it should provide the smallest * latency and jitter from control line transition to timestamp. * * The other mechanism is user-space PPS, which uses the (not * standardized) TIOCMIWAIT ioctl to wait for PPS transitions on * serial port control lines. It is implemented on Linux and OpenBSD. * * On Linux, RFC2783 PPS requires root permissions for initialization; * user-space PPS does not. User-space PPS loses some functionality * when not initialized as root. In gpsd, user-space PPS is referred * to as "plain PPS". * * On {Free,Net}BSD, RFC2783 PPS should only require access to the * serial port, but details have not yet been tested and documented * here. * * Note that for easy debugging all logging from this file is prefixed * with PPS or KPPS. * * To use the thread manager, you need to first fill in the * devicefd, devicename, and the four hook function members in the thread * context structure. The void *context member is available for your hook * functions to use; the thread-monitor code doesn't touch it. * * After this setup, you can call pps_thread_activate() and the * thread will launch. It is OK to do this before the device is open, * the thread will wait on that. * * WARNING! Loss of precision * UNIX time to nanoSec precision is 62 significant bits * UNIX time to nanoSec precision after 2038 is 63 bits * a double is only 53 significant bits. * * You cannot do PPS math with doubles * * This file is Copyright (c) 2013 by the GPSD project. BSD terms * apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include /* pacifies OpenBSD's compiler */ /* use RFC 2783 PPS API */ /* this needs linux >= 2.6.34 and * CONFIG_PPS=y * CONFIG_PPS_DEBUG=y [optional to kernel log pulses] * CONFIG_PPS_CLIENT_LDISC=y */ #if defined(HAVE_SYS_TIMEPPS_H) // include unistd.h here as it is missing on older pps-tools releases. // 'close' is not defined otherwise. #include #include #include #endif #include "timespec.h" #include "ppsthread.h" /* * Tell GCC that we want thread-safe behavior with _REENTRANT; * in particular, errno must be thread-local. * Tell POSIX-conforming implementations with _POSIX_THREAD_SAFE_FUNCTIONS. * See http://www.unix.org/whitepapers/reentrant.html */ #ifndef _REENTRANT #define _REENTRANT #endif #ifndef _POSIX_THREAD_SAFE_FUNCTIONS #define _POSIX_THREAD_SAFE_FUNCTIONS #endif /* * Warning: This is a potential portability problem. * It's needed so that TIOCMIWAIT will be defined and the plain PPS * code will work, but it's not a SuS/POSIX standard header. We're * going to include it unconditionally here because we expect both * Linux and BSD to have it and we want compilation to break with * an audible snapping sound if it's not present. */ #include #if defined(HAVE_SYS_TIMEPPS_H) #include #include /* needed for open() and friends */ #endif #if defined(TIOCMIWAIT) static int get_edge_tiocmiwait( volatile struct pps_thread_t *, struct timespec *, int *, volatile struct timedelta_t *); #endif /* TIOCMIWAIT */ struct inner_context_t { volatile struct pps_thread_t *pps_thread; bool pps_canwait; /* can RFC2783 wait? */ #if defined(HAVE_SYS_TIMEPPS_H) int pps_caps; /* RFC2783 getcaps() */ pps_handle_t kernelpps_handle; #endif /* defined(HAVE_SYS_TIMEPPS_H) */ }; #if defined(HAVE_SYS_TIMEPPS_H) static int get_edge_rfc2783(struct inner_context_t *, struct timespec *, int *, struct timespec *, int *, volatile struct timedelta_t *); #endif /* defined(HAVE_SYS_TIMEPPS_H) */ static pthread_mutex_t ppslast_mutex = PTHREAD_MUTEX_INITIALIZER; static void thread_lock(volatile struct pps_thread_t *pps_thread) { int pthread_err = pthread_mutex_lock(&ppslast_mutex); if ( 0 != pthread_err ) { char errbuf[BUFSIZ] = "unknown error"; (void)strerror_r(errno, errbuf, sizeof(errbuf)); pps_thread->log_hook(pps_thread, THREAD_ERROR, "PPS:%s pthread_mutex_lock() : %s\n", pps_thread->devicename, errbuf); } } static void thread_unlock(volatile struct pps_thread_t *pps_thread) { int pthread_err = pthread_mutex_unlock(&ppslast_mutex); if ( 0 != pthread_err ) { char errbuf[BUFSIZ] = "unknown error"; (void)strerror_r(errno, errbuf, sizeof(errbuf)); pps_thread->log_hook(pps_thread, THREAD_ERROR, "TPPS:%s pthread_mutex_unlock() : %s\n", pps_thread->devicename, errno, errbuf); } } #if defined(HAVE_SYS_TIMEPPS_H) static int init_kernel_pps(struct inner_context_t *inner_context) /* return handle for kernel pps, or -1; requires root privileges */ { pps_params_t pp; int ret; #ifdef __linux__ /* These variables are only needed by Linux to find /dev/ppsN. */ int ldisc = 18; /* the PPS line discipline */ glob_t globbuf; #endif char path[PATH_MAX] = ""; volatile struct pps_thread_t *pps_thread = inner_context->pps_thread; inner_context->kernelpps_handle = -1; inner_context->pps_canwait = false; /* * This next code block abuses "ret" by storing the filedescriptor * to use for RFC2783 calls. */ #ifndef __clang_analyzer__ ret = -1; /* this ret will not be unneeded when the 'else' part * of the followinng ifdef becomes an #elif */ #endif /* __clang_analyzer__ */ #ifdef __linux__ /* * Some Linuxes, like the RasbPi's, have PPS devices preexisting. * Other OS have no way to automatically determine the proper /dev/ppsX. * Allow user to pass in an explicit PPS device path. * * (We use strncpy() here because this might be compiled where * strlcpy() is not available.) */ if (strncmp(pps_thread->devicename, "/dev/pps", 8) == 0) (void)strncpy(path, pps_thread->devicename, sizeof(path)); else { char pps_num = '\0'; /* /dev/pps[pps_num] is our device */ size_t i; /* to match type of globbuf.gl_pathc */ /* * Otherwise one must make calls to associate a serial port with a * /dev/ppsN device and then grovel in system data to determine * the association. */ /* Attach the line PPS discipline, so no need to ldattach */ /* This activates the magic /dev/pps0 device */ /* Note: this ioctl() requires root, and device is a tty */ if ( 0 > ioctl(pps_thread->devicefd, TIOCSETD, &ldisc)) { char errbuf[BUFSIZ] = "unknown error"; strerror_r(errno, errbuf, sizeof(errbuf)); pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s cannot set PPS line discipline %s\n", pps_thread->devicename, errbuf); return -1; } /* uh, oh, magic file names!, RFC2783 neglects to specify how * to associate the serial device and pps device names */ /* need to look in /sys/devices/virtual/pps/pps?/path * (/sys/class/pps/pps?/path is just a link to that) * to find the /dev/pps? that matches our serial port. * this code fails if there are more then 10 pps devices. * * yes, this could be done with libsysfs, but trying to keep * the number of required libs small, and libsysfs would still * be linux only */ memset( (void *)&globbuf, 0, sizeof(globbuf)); (void)glob("/sys/devices/virtual/pps/pps?/path", 0, NULL, &globbuf); memset( (void *)&path, 0, sizeof(path)); for ( i = 0; i < globbuf.gl_pathc; i++ ) { int fd = open(globbuf.gl_pathv[i], O_RDONLY); if ( 0 <= fd ) { ssize_t r = read( fd, path, sizeof(path) -1); if ( 0 < r ) { path[r - 1] = '\0'; /* remove trailing \x0a */ } (void)close(fd); } pps_thread->log_hook(pps_thread, THREAD_PROG, "KPPS:%s checking %s, %s\n", pps_thread->devicename, globbuf.gl_pathv[i], path); if ( 0 == strncmp( path, pps_thread->devicename, sizeof(path))) { /* this is the pps we are looking for */ /* FIXME, now build the proper pps device path */ pps_num = globbuf.gl_pathv[i][28]; break; } memset( (void *)&path, 0, sizeof(path)); } /* done with blob, clear it */ globfree(&globbuf); if ( 0 == (int)pps_num ) { pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s device not found.\n", pps_thread->devicename); return -1; } /* construct the magic device path */ (void)snprintf(path, sizeof(path), "/dev/pps%c", pps_num); } /* root privs are probably required for this device open * do not bother to check uid, just go for the open() */ ret = open(path, O_RDWR); if ( 0 > ret ) { char errbuf[BUFSIZ] = "unknown error"; (void)strerror_r(errno, errbuf, sizeof(errbuf)); pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s cannot open %s: %s\n", pps_thread->devicename, path, errbuf); return -1; } #else /* not __linux__ */ /* * On BSDs that support RFC2783, one uses the API calls on serial * port file descriptor. * * FIXME! need more specific than 'not linux' */ (void)strlcpy(path, pps_thread->devicename, sizeof(path)); // cppcheck-suppress redundantAssignment ret = pps_thread->devicefd; #endif /* assert(ret >= 0); */ pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s RFC2783 path:%s, fd is %d\n", pps_thread->devicename, path, ret); /* RFC 2783 implies the time_pps_setcap() needs priviledges * * keep root a tad longer just in case */ if ( 0 > time_pps_create(ret, (pps_handle_t *)&inner_context->kernelpps_handle )) { char errbuf[BUFSIZ] = "unknown error"; (void)strerror_r(errno, errbuf, sizeof(errbuf)); pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s time_pps_create(%d) failed: %s\n", pps_thread->devicename, ret, errbuf); return -1; } /* have kernel PPS handle */ /* get RFC2783 features supported */ inner_context->pps_caps = 0; if ( 0 > time_pps_getcap(inner_context->kernelpps_handle, &inner_context->pps_caps)) { char errbuf[BUFSIZ] = "unknown error"; inner_context->pps_caps = 0; (void)strerror_r(errno, errbuf, sizeof(errbuf)); pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s time_pps_getcap() failed: %.100s\n", pps_thread->devicename, errbuf); return -1; } else { pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s pps_caps 0x%02X\n", pps_thread->devicename, inner_context->pps_caps); } /* construct the setparms structure */ memset( (void *)&pp, 0, sizeof(pps_params_t)); pp.api_version = PPS_API_VERS_1; /* version 1 protocol */ if ( 0 == (PPS_TSFMT_TSPEC & inner_context->pps_caps ) ) { /* PPS_TSFMT_TSPEC means return a timespec * mandatory for driver to implement, require it */ pps_thread->log_hook(pps_thread, THREAD_WARN, "KPPS:%s fail, missing mandatory PPS_TSFMT_TSPEC\n", pps_thread->devicename); return -1; } if ( 0 != (PPS_CANWAIT & inner_context->pps_caps ) ) { /* we can wait! so no need for TIOCMIWAIT */ pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s have PPS_CANWAIT\n", pps_thread->devicename); inner_context->pps_canwait = true; } pp.mode = PPS_TSFMT_TSPEC; switch ( (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR) & inner_context->pps_caps ) { case PPS_CAPTUREASSERT: pps_thread->log_hook(pps_thread, THREAD_WARN, "KPPS:%s missing PPS_CAPTURECLEAR, pulse may be offset\n", pps_thread->devicename); pp.mode |= PPS_CAPTUREASSERT; break; case PPS_CAPTURECLEAR: pps_thread->log_hook(pps_thread, THREAD_WARN, "KPPS:%s missing PPS_CAPTUREASSERT, pulse may be offset\n", pps_thread->devicename); pp.mode |= PPS_CAPTURECLEAR; break; case PPS_CAPTUREASSERT | PPS_CAPTURECLEAR: pp.mode |= PPS_CAPTUREASSERT | PPS_CAPTURECLEAR; break; default: /* THREAD_ERR in the calling routine */ pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s missing PPS_CAPTUREASSERT and CLEAR\n", pps_thread->devicename); return -1; } if ( 0 > time_pps_setparams(inner_context->kernelpps_handle, &pp)) { char errbuf[BUFSIZ] = "unknown error"; (void)strerror_r(errno, errbuf, sizeof(errbuf)); pps_thread->log_hook(pps_thread, THREAD_ERROR, "KPPS:%s time_pps_setparams(mode=0x%02X) failed: %s\n", pps_thread->devicename, pp.mode, errbuf); (void)time_pps_destroy(inner_context->kernelpps_handle); return -1; } return 0; } #endif /* defined(HAVE_SYS_TIMEPPS_H) */ #if defined(TIOCMIWAIT) /* wait for, and get, an edge using TIOCMIWAIT * return -1 for error * 0 for OK */ static int get_edge_tiocmiwait( volatile struct pps_thread_t *thread_context, struct timespec *clock_ts, int *state, volatile struct timedelta_t *last_fixtime) { char ts_str[TIMESPEC_LEN]; /* we are lucky to have TIOCMIWAIT, so wait for next edge */ #define PPS_LINE_TIOC (TIOCM_CD|TIOCM_RI|TIOCM_CTS|TIOCM_DSR) /* * DB9 DB25 Name Full name * --- ---- ---- -------------------- * 3 2 TXD --> Transmit Data * 2 3 RXD <-- Receive Data * 7 4 RTS --> Request To Send * 8 5 CTS <-- Clear To Send * 6 6 DSR <-- Data Set Ready * 4 20 DTR --> Data Terminal Ready * 1 8 DCD <-- Data Carrier Detect * 9 22 RI <-- Ring Indicator * 5 7 GND Signal ground * * Wait for status change on any handshake line. Just one edge, * we do not want to be spinning waiting for the trailing edge of * a pulse. The only assumption here is that no GPS lights up more * than one of these pins. By waiting on all of them we remove a * configuration switch. * * Note that it only makes sense to wait on handshake lines * activated from the receive side (DCE->DTE) here; in this * context "DCE" is the GPS. {CD,RI,CTS,DSR} is the * entire set of these. * */ if (ioctl(thread_context->devicefd, TIOCMIWAIT, PPS_LINE_TIOC) != 0) { char errbuf[BUFSIZ] = "unknown error"; (void)strerror_r(errno, errbuf, sizeof(errbuf)); thread_context->log_hook(thread_context, THREAD_WARN, "TPPS:%s ioctl(TIOCMIWAIT) failed: %d %.40s\n", thread_context->devicename, errno, errbuf); return -1;; } /* * Start of time critical section * Only error reporting, not success reporting in critical section */ /* duplicate copy in get_edge_rfc2783 */ /* quick, grab a copy of last_fixtime before it changes */ thread_lock(thread_context); *last_fixtime = thread_context->fix_in; thread_unlock(thread_context); /* end duplicate copy in get_edge_rfc2783 */ /* get the time after we just woke up */ if ( 0 > clock_gettime(CLOCK_REALTIME, clock_ts) ) { /* uh, oh, can not get time! */ char errbuf[BUFSIZ] = "unknown error"; (void)strerror_r(errno, errbuf, sizeof(errbuf)); thread_context->log_hook(thread_context, THREAD_ERROR, "TPPS:%s clock_gettime() failed: %.100s\n", thread_context->devicename, errbuf); return -1;; } /* got the edge, got the time just after the edge, now quickly * get the edge state */ if (ioctl(thread_context->devicefd, (unsigned long)TIOCMGET, state) != 0) { char errbuf[BUFSIZ] = "unknown error"; (void)strerror_r(errno, errbuf, sizeof(errbuf)); thread_context->log_hook(thread_context, THREAD_ERROR, "TPPS:%s ioctl(TIOCMGET) failed: %.100s\n", thread_context->devicename, errbuf); return -1; } /* end of time critical section */ /* mask for monitored lines */ *state &= PPS_LINE_TIOC; timespec_str( clock_ts, ts_str, sizeof(ts_str) ); thread_context->log_hook(thread_context, THREAD_PROG, "TPPS:%s ioctl(TIOCMIWAIT) succeeded, time:%s, state: %d\n", thread_context->devicename, ts_str, *state); return 0; } #endif /* TIOCMIWAIT */ #if defined(HAVE_SYS_TIMEPPS_H) /* wait for, and get, last two edges using RFC2783 * return -1 for error * 0 for OK * 1 no edge found, continue * * on a quad core 2.4GHz Xeon using KPPS timestamp instead of plain * PPS timestamp removes about 20uS of latency, and about +/-5uS * of jitter */ static int get_edge_rfc2783(struct inner_context_t *inner_context, struct timespec *prev_clock_ts, int *prev_edge, struct timespec *clock_ts, int *edge, volatile struct timedelta_t *last_fixtime) { pps_info_t pi; char ts_str1[TIMESPEC_LEN], ts_str2[TIMESPEC_LEN]; struct timespec kernelpps_tv; volatile struct pps_thread_t *thread_context = inner_context->pps_thread; if ( inner_context->pps_canwait ) { /* * RFC2783 specifies that a NULL timeval means to wait, if * PPS_CANWAIT is available. * * since we pps_canwait, we skipped the TIOMCIWAIT * * 3 second time out, some GPS output 0.5Hz and some RFC2783 * can only trigger on one edge * a better and more complex solution would be to wait * for 1/20 second and suffer the cycles */ kernelpps_tv.tv_sec = 3; kernelpps_tv.tv_nsec = 0; } else { /* * We use of a non-NULL zero timespec here, * which means to return immediately with -1 (section * 3.4.3). This is because we know we just got a pulse because * TIOCMIWAIT just woke up. * The timestamp has already been captured in the kernel, and we * are merely fetching it here. */ memset( (void *)&kernelpps_tv, 0, sizeof(kernelpps_tv)); } memset( (void *)&pi, 0, sizeof(pi)); /* paranoia */ if ( 0 > time_pps_fetch(inner_context->kernelpps_handle, PPS_TSFMT_TSPEC , &pi, &kernelpps_tv)) { char errbuf[BUFSIZ] = "unknown error"; (void)strerror_r(errno, errbuf, sizeof(errbuf)); thread_context->log_hook(thread_context, THREAD_ERROR, "KPPS:%s kernel PPS failed %s\n", thread_context->devicename, errbuf); if ( ETIMEDOUT == errno || EINTR == errno ) { /* just a timeout */ return 1; } return 0; } if ( inner_context->pps_canwait ) { /* get_edge_tiocmiwait() got this if !pps_canwait */ /* quick, grab a copy of last fixtime before it changes */ thread_lock(thread_context); *last_fixtime = thread_context->fix_in; thread_unlock(thread_context); } // find the last edge if ( pi.assert_timestamp.tv_sec > pi.clear_timestamp.tv_sec ) { /* assert 1 sec or more after than clear */ *edge = 1; } else if ( pi.assert_timestamp.tv_sec < pi.clear_timestamp.tv_sec ) { /* assert 1 sec or more before than clear */ *edge = 0; } else if ( pi.assert_timestamp.tv_nsec > pi.clear_timestamp.tv_nsec ) { /* assert less than 1 sec after clear */ *edge = 1; } else { /* assert less than 1 sec before clear */ *edge = 0; } if ( 1 == *edge ) { /* assert after clear */ *prev_edge = 0; if ( 0 == pi.clear_timestamp.tv_sec ) { /* brain damaged pps-gpio sometimes never fills in clear * so make it look like an invisible pulse * if clear is the leading edge, then we are off by the * pulse width */ *prev_clock_ts = pi.assert_timestamp; } else { *prev_clock_ts = pi.clear_timestamp; } *clock_ts = pi.assert_timestamp; } else { /* assert before clear */ *prev_edge = 1; *prev_clock_ts = pi.assert_timestamp; *clock_ts = pi.clear_timestamp; } /* * pps_seq_t is uint32_t on NetBSD, so cast to * unsigned long as a wider-or-equal type to * accomodate Linux's type. */ timespec_str( &pi.assert_timestamp, ts_str1, sizeof(ts_str1) ); timespec_str( &pi.clear_timestamp, ts_str2, sizeof(ts_str2) ); thread_context->log_hook(thread_context, THREAD_PROG, "KPPS:%s assert %s, sequence: %lu, " "clear %s, sequence: %lu - using: %.10s\n", thread_context->devicename, ts_str1, (unsigned long) pi.assert_sequence, ts_str2, (unsigned long) pi.clear_sequence, *edge ? "assert" : "clear"); return 0; } #endif /* defined(HAVE_SYS_TIMEPPS_H) */ /* gpsd_ppsmonitor() * * the core loop of the PPS thread. * All else is initialization, cleanup or subroutine */ static void *gpsd_ppsmonitor(void *arg) { char ts_str1[TIMESPEC_LEN], ts_str2[TIMESPEC_LEN]; struct inner_context_t inner_context = *((struct inner_context_t *)arg); volatile struct pps_thread_t *thread_context = inner_context.pps_thread; /* the GPS time and system clock timme, to the nSec, * when the last fix received * using a double would cause loss of precision */ volatile struct timedelta_t last_fixtime = {{0, 0}, {0, 0}}; struct timespec clock_ts = {0, 0}; time_t last_second_used = 0; long cycle = 0, duration = 0; /* state is the last state of the tty control signals */ int state = 0; /* count of how many cycles unchanged data */ int unchanged = 0; /* state_last is previous state */ int state_last = 0; /* edge, used as index into pulse to find previous edges */ int edge = 0; /* 0 = clear edge, 1 = assert edge */ #if defined(TIOCMIWAIT) int edge_tio = 0; long cycle_tio = 0; long duration_tio = 0; int state_tio = 0; int state_last_tio = 0; struct timespec clock_ts_tio = {0, 0}; /* pulse stores the time of the last two edges */ struct timespec pulse_tio[2] = { {0, 0}, {0, 0} }; #endif /* TIOCMIWAIT */ #if defined(HAVE_SYS_TIMEPPS_H) long cycle_kpps = 0, duration_kpps = 0; /* kpps_pulse stores the time of the last two edges */ struct timespec pulse_kpps[2] = { {0, 0}, {0, 0} }; #endif /* defined(HAVE_SYS_TIMEPPS_H) */ bool not_a_tty = false; /* before the loop, figure out how we can detect edges: * TIOMCIWAIT, which is linux specifix * RFC2783, a.k.a kernel PPS (KPPS) * or if KPPS is deficient a combination of the two */ if ( isatty(thread_context->devicefd) == 0 ) { thread_context->log_hook(thread_context, THREAD_INF, "KPPS:%s gps_fd:%d not a tty\n", thread_context->devicename, thread_context->devicefd); /* why do we care the device is a tty? so as not to ioctl(TIO..) * /dev/pps0 is not a tty and we need to use it */ not_a_tty = true; } /* if no TIOCMIWAIT, we hope to have PPS_CANWAIT */ if ( not_a_tty && !inner_context.pps_canwait ) { /* for now, no way to wait for an edge, in the future maybe figure out * a sleep */ } /* * this is the main loop, exit and never any further PPS processing. * * Four stages to the loop, * an unwanted condition at any point and the loop restarts * an error condition and we exit for all time. * * Stage One: wait for the next edge. * If we have KPPS * If we have PPS_CANWAIT * use KPPS and PPS_CANWAIT - this is the most accurate * else * use KPPS and TIOMCIWAIT together - this is pretty accurate * else If we have TIOMCIWAIT * use TIOMCIWAIT - this is the least accurate * else * give up * * Success is we have a good edge, otherwise loop some more * * On a successul stage one, we know this about the exact moment * of current pulse: * GPS (real) time * system (clock) time * edge type: Assert (rising) or Clear (falling) * * From the above 3 items, we can compute: * cycle length - elapsed time from the previous edge of the same type * pulse length (duration) - elapsed time from the previous edge * (the previous edge would be the opposite type) * * Stage Two: Categorize the current edge * Decide if we have 0.5Hz, 1Hz, 5 Hz cycle time * knowing cycle time determine if we have the leading or trailing edge * restart the loop if the edge looks dodgy * * Stage Three: Calculate * Calculate the offset (difference) between the system time * and the GPS time at the pulse moment * restart the loop if the offset looks dodgy * * Stage Four: Tell ntpd, chronyd, or gpsmon what we learned * a few more sanity checks * call the report hook with our PPS report */ while (thread_context->report_hook != NULL) { bool ok = false; char *log = NULL; char *edge_str = ""; if (++unchanged == 10) { /* last ten edges no good, stop spinning, just wait 10 seconds */ unchanged = 0; thread_context->log_hook(thread_context, THREAD_WARN, "PPS:%s unchanged state, ppsmonitor sleeps 10\n", thread_context->devicename); (void)sleep(10); } /* Stage One; wait for the next edge */ #if defined(TIOCMIWAIT) if ( !not_a_tty && !inner_context.pps_canwait ) { int ret; /* we are a tty, so can TIOCMIWAIT */ /* we have no PPS_CANWAIT, so must TIOCMIWAIT */ ret = get_edge_tiocmiwait( thread_context, &clock_ts_tio, &state_tio, &last_fixtime ); if ( 0 != ret ) { thread_context->log_hook(thread_context, THREAD_PROG, "PPS:%s die: TIOCMIWAIT Error\n", thread_context->devicename); break; } edge_tio = (state_tio > state_last_tio) ? 1 : 0; /* three things now known about the current edge: * clock_ts - time of the edge * state - the serial line input states * edge - rising edge (1), falling edge (0) or invisble edge (0) */ /* calculate cycle and duration from previous edges */ cycle_tio = timespec_diff_ns(clock_ts_tio, pulse_tio[edge_tio]); cycle_tio /= 1000; /* nsec to usec */ duration_tio = timespec_diff_ns(clock_ts_tio, pulse_tio[edge_tio ? 0 : 1])/1000; /* save this edge so we know next cycle time */ pulse_tio[edge_tio] = clock_ts_tio; /* use this data */ ok = true; clock_ts = clock_ts_tio; state = edge_tio; edge = edge_tio; edge_str = edge ? "Assert" : "Clear"; cycle = cycle_tio; duration = duration_tio; timespec_str( &clock_ts, ts_str1, sizeof(ts_str1) ); thread_context->log_hook(thread_context, THREAD_PROG, "TPPS:%s %.10s cycle: %d, duration: %d @ %s\n", thread_context->devicename, edge_str, cycle, duration, ts_str1); } #endif /* TIOCMIWAIT */ /* ok and log used by KPPS and TIOCMIWAIT */ log = NULL; #if defined(HAVE_SYS_TIMEPPS_H) if ( 0 <= inner_context.kernelpps_handle ) { int ret; int edge_kpps = 0; /* 0 = clear edge, 1 = assert edge */ /* time of the last edge */ struct timespec clock_ts_kpps = {0, 0}; /* time of the edge before the last edge */ struct timespec prev_clock_ts = {0, 0}; /* direction of next to last edge 1 = assert, 0 = clear */ int prev_edge = 0; /* get last and previsou edges, in order * optionally wait for goood data */ ret = get_edge_rfc2783(&inner_context, &prev_clock_ts, &prev_edge, &clock_ts_kpps, &edge_kpps, &last_fixtime); if ( -1 == ret ) { /* error, so break */ thread_context->log_hook(thread_context, THREAD_ERROR, "PPS:%s die: RFC2783 Error\n", thread_context->devicename); break; } if ( 1 == ret ) { /* no edge found, so continue */ /* maybe use TIOCMIWAIT edge instead?? */ continue; } /* for now, as we have been doing all of gpsd 3.x, just *use the last edge, not the previous edge */ /* compute time from previous saved similar edge */ cycle_kpps = timespec_diff_ns(clock_ts_kpps, pulse_kpps[edge_kpps]); cycle_kpps /= 1000; /* compute time from previous saved dis-similar edge */ duration_kpps = timespec_diff_ns(clock_ts_kpps, prev_clock_ts)/1000; /* save for later */ pulse_kpps[edge_kpps] = clock_ts_kpps; pulse_kpps[edge_kpps ? 0 : 1] = prev_clock_ts; /* sanity checks are later */ /* use this data */ state = edge_kpps; edge = edge_kpps; edge_str = edge ? "Assert" : "Clear"; clock_ts = clock_ts_kpps; cycle = cycle_kpps; duration = duration_kpps; timespec_str( &clock_ts_kpps, ts_str1, sizeof(ts_str1) ); thread_context->log_hook(thread_context, THREAD_PROG, "KPPS:%s %.10s cycle: %7d, duration: %7d @ %s\n", thread_context->devicename, edge_str, cycle_kpps, duration_kpps, ts_str1); } #endif /* defined(HAVE_SYS_TIMEPPS_H) */ if ( not_a_tty && !inner_context.pps_canwait ) { /* uh, oh, no TIOMCIWAIT, nor RFC2783, die */ thread_context->log_hook(thread_context, THREAD_WARN, "PPS:%s die: no TIOMCIWAIT, nor RFC2783 CANWAIT\n", thread_context->devicename); break; } /* * End of Stge One * we now know this about the exact moment of current pulse: * GPS (real) time * system (clock) time * edge type: Assert (rising) or Clear (falling) * * we have computed: * cycle length * pulse length (duration) */ /* * Stage Two: Categorize the current edge * Decide if we have 0.5Hz, 1Hz, 5 Hz cycle time * determine if we have the leading or trailing edge */ /* FIXME! this block duplicates a lot of the next block * of cycle detetion code */ if (state != state_last) { thread_context->log_hook(thread_context, THREAD_RAW, "PPS:%s %.10s pps-detect changed to %d\n", thread_context->devicename, edge_str, state); unchanged = 0; } else if ( (180000 < cycle && 220000 > cycle) /* 5Hz */ || (900000 < cycle && 1100000 > cycle) /* 1Hz */ || (1800000 < cycle && 2200000 > cycle) ) { /* 2Hz */ /* some pulses may be so short that state never changes * and some RFC2783 only can detect one edge */ duration = 0; unchanged = 0; thread_context->log_hook(thread_context, THREAD_RAW, "PPS:%s %.10s pps-detect invisible pulse\n", thread_context->devicename, edge_str); } /* else, unchannged state, and weird cycle time */ state_last = state; timespec_str( &clock_ts, ts_str1, sizeof(ts_str1) ); thread_context->log_hook(thread_context, THREAD_PROG, "PPS:%s %.10s cycle: %7d, duration: %7d @ %s\n", thread_context->devicename, edge_str, cycle, duration, ts_str1); if (unchanged) { // strange, try again continue; } /* * The PPS pulse is normally a short pulse with a frequency of * 1 Hz, and the UTC second is defined by the front edge. But we * don't know the polarity of the pulse (different receivers * emit different polarities). The duration variable is used to * determine which way the pulse is going. When the duration * is less than 1/2 the cycle we are on the trailing edge. * * Some GPSes instead output a square wave that is 0.5 Hz and each * edge denotes the start of a second. * * Some GPSes, like the Globalsat MR-350P, output a 1uS pulse. * The pulse is so short that TIOCMIWAIT sees a state change * but by the time TIOCMGET is called the pulse is gone. gpsd * calls that an invisible pulse. * * A few stupid GPSes, like the Furuno GPSClock, output a 1.0 Hz * square wave where the leading edge is the start of a second * gpsd can only guess the correct edge. * * 5Hz GPS (Garmin 18-5Hz) pulses at 5Hz. Set the pulse length to * 40ms which gives a 160ms pulse before going high. * * You may think that PPS is very accurate, so the cycle time * valid window should be very small. This is not the case, * The Rasberry Pi clock is very coarse when it starts and chronyd * may be doing a fast slew. chronyd by default will slew up * to 8.334%! So the cycle time as measured by the system clock * may be almost +/- 9%. Therefore, gpsd uses a 10% window. * Don't worry, ntpd and chronyd will do further validation. */ log = "Unknown error"; if ( 0 > cycle ) { log = "Rejecting negative cycle\n"; } else if (199000 > cycle) { // too short to even be a 5Hz pulse log = "Too short for 5Hz\n"; } else if (201000 > cycle) { /* 5Hz cycle */ /* looks like 5hz PPS pulse */ if (100000 > duration) { /* BUG: how does the code know to tell ntpd * which 1/5 of a second to use?? */ ok = true; log = "5Hz PPS pulse\n"; } } else if (900000 > cycle) { /* Yes, 10% window. The Rasberry Pi clock is very coarse * when it starts and chronyd may be doing a fast slew. * chronyd by default will slew up to 8.334% ! * Don't worry, ntpd and chronyd will do further sanitizing.*/ log = "Too long for 5Hz, too short for 1Hz\n"; } else if (1100000 > cycle) { /* Yes, 10% window. */ /* looks like PPS pulse or square wave */ if (0 == duration) { ok = true; log = "invisible pulse\n"; } else if (499000 > duration) { /* end of the short "half" of the cycle */ /* aka the trailing edge */ log = "1Hz trailing edge\n"; } else if (501000 > duration) { /* looks like 1.0 Hz square wave, ignore trailing edge */ if (edge == 1) { ok = true; log = "square\n"; } } else { /* end of the long "half" of the cycle */ /* aka the leading edge */ ok = true; log = "1Hz leading edge\n"; } } else if (1999000 > cycle) { 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 = "0.5 Hz square too short duration\n"; } else if (1001000 > duration) { ok = true; log = "0.5 Hz square wave\n"; } else { log = "0.5 Hz square too long duration\n"; } } else { log = "Too long for 0.5Hz\n"; } /* end of Stage two * we now know what type of PPS pulse, and if we have the * leading edge */ /* Stage Three: Calculate * Calculate the offset (difference) between the system time * and the GPS time at the pulse moment */ /* * If there has not yet been any valid in-band time stashed * from the GPS when the PPS event was asserted, we can do * nothing further. gpsd can not tell what second this pulse is * in reference to. * * Some GPSes like Garmin always send a PPS, valid or not. * Other GPSes like some uBlox may only send PPS when time is valid. * It is common to get PPS, and no fixtime, while autobauding. */ if (last_fixtime.real.tv_sec == 0) { /* probably should log computed offset just for grins here */ ok = false; log = "missing last_fixtime\n"; } else if ( ok && last_second_used >= last_fixtime.real.tv_sec ) { /* uh, oh, this second already handled */ ok = false; log = "this second already handled\n"; } if ( !ok ) { /* can not use this pulse, reject and retry */ thread_context->log_hook(thread_context, THREAD_PROG, "PPS:%s %.10s rejected %.100s", thread_context->devicename, edge_str, log); continue; } /* we have validated a goood cycle, mark it */ unchanged = 0; /* offset is the skew from expected to observed pulse time */ struct timespec offset; /* offset as a printable string */ char offset_str[TIMESPEC_LEN]; /* delay after last fix */ struct timespec delay; /* delay as a printable string */ char delay_str[TIMESPEC_LEN]; char *log1 = ""; /* ppstimes.real is the time we think the pulse represents */ struct timedelta_t ppstimes; thread_context->log_hook(thread_context, THREAD_RAW, "PPS:%s %.10s categorized %.100s", thread_context->devicename, edge_str, log); /* FIXME! The GR-601W at 38,400 or faster can send the * serial fix before the interrupt event carrying the PPS * line assertion by about 10 mSec! */ /* * We get the time of the last fix recorded before the PPS came in, * which is for the previous cycle. Only works for integral cycle * times, but more than 1Hz is pointless. */ ppstimes.real.tv_sec = (time_t)last_fixtime.real.tv_sec + 1; ppstimes.real.tv_nsec = 0; /* need to be fixed for 5Hz */ ppstimes.clock = clock_ts; TS_SUB( &offset, &ppstimes.real, &ppstimes.clock); TS_SUB( &delay, &ppstimes.clock, &last_fixtime.clock); timespec_str( &delay, delay_str, sizeof(delay_str) ); /* end Stage Three: now known about the exact edge moment: * UTC time of PPS edge * offset of system time to PS time */ /* Stage Four: Tell ntpd, chronyd, or gpsmon what we learned * a few more sanity checks * call the report hook with our PPS report */ if ( 0> delay.tv_sec || 0 > delay.tv_nsec ) { thread_context->log_hook(thread_context, THREAD_RAW, "PPS:%s %.10s system clock went backwards: %.20s\n", thread_context->devicename, edge_str, delay_str); log1 = "system clock went backwards"; } else if ( ( 2 < delay.tv_sec) || ( 1 == delay.tv_sec && 100000000 > delay.tv_nsec ) ) { /* system clock could be slewing so allow 1.1 sec delay */ thread_context->log_hook(thread_context, THREAD_RAW, "PPS:%s %.10s no current GPS seconds: %.20s\n", thread_context->devicename, edge_str, delay_str); log1 = "timestamp out of range"; } else { last_second_used = last_fixtime.real.tv_sec; if (thread_context->report_hook != NULL) log1 = thread_context->report_hook(thread_context, &ppstimes); else log1 = "no report hook"; thread_lock(thread_context); thread_context->pps_out = ppstimes; thread_context->ppsout_count++; thread_unlock(thread_context); timespec_str( &ppstimes.clock, ts_str1, sizeof(ts_str1) ); timespec_str( &ppstimes.real, ts_str2, sizeof(ts_str2) ); thread_context->log_hook(thread_context, THREAD_INF, "PPS:%s %.10s hooks called clock: %s real: %s: %.20s\n", thread_context->devicename, edge_str, ts_str1, ts_str2, log1); } timespec_str( &clock_ts, ts_str1, sizeof(ts_str1) ); timespec_str( &offset, offset_str, sizeof(offset_str) ); thread_context->log_hook(thread_context, THREAD_PROG, "PPS:%s %.10s %.30s @ %s offset %.20s\n", thread_context->devicename, edge_str, log1, ts_str1, offset_str); /* end Stage four, end of the loop, do it again */ } #if defined(HAVE_SYS_TIMEPPS_H) if (inner_context.kernelpps_handle > 0) { thread_context->log_hook(thread_context, THREAD_PROG, "PPS:%s descriptor cleaned up\n", thread_context->devicename); (void)time_pps_destroy(inner_context.kernelpps_handle); } #endif thread_context->log_hook(thread_context, THREAD_PROG, "PPS:%s gpsd_ppsmonitor exited.\n", thread_context->devicename); return NULL; } /* * Entry points begin here. */ void pps_thread_activate(volatile struct pps_thread_t *pps_thread) /* activate a thread to watch the device's PPS transitions */ { int retval; pthread_t pt; /* * FIXME: this launch code is not itself thread-safe! * It would be if inner_context could be auto, but the monitor * routine gets garbage when we try that. Ideally the body * of this function would be guarded by a separate mutex. * Either that, or this should be an exception to the no-malloc rule. */ static struct inner_context_t inner_context; inner_context.pps_thread = pps_thread; #if defined(HAVE_SYS_TIMEPPS_H) /* some operations in init_kernel_pps() require root privs */ (void)init_kernel_pps(&inner_context); if ( 0 <= inner_context.kernelpps_handle ) { pps_thread->log_hook(pps_thread, THREAD_INF, "KPPS:%s kernel PPS will be used\n", pps_thread->devicename); } else #endif { pps_thread->log_hook(pps_thread, THREAD_WARN, "KPPS:%s kernel PPS unavailable, PPS accuracy will suffer\n", pps_thread->devicename); } memset( &pt, 0, sizeof(pt)); retval = pthread_create(&pt, NULL, gpsd_ppsmonitor, (void *)&inner_context); pps_thread->log_hook(pps_thread, THREAD_PROG, "PPS:%s thread %s\n", pps_thread->devicename, (retval==0) ? "launched" : "FAILED"); } void pps_thread_deactivate(volatile struct pps_thread_t *pps_thread) /* cleanly terminate PPS thread */ { pps_thread->report_hook = NULL; } void pps_thread_fixin(volatile struct pps_thread_t *pps_thread, volatile struct timedelta_t *fix_in) /* thread-safe update of last fix time - only way we pass data in */ { thread_lock(pps_thread); pps_thread->fix_in = *fix_in; thread_unlock(pps_thread); } int pps_thread_ppsout(volatile struct pps_thread_t *pps_thread, volatile struct timedelta_t *td) /* return the delta at the time of the last PPS - only way we pass data out */ { volatile int ret; thread_lock(pps_thread); *td = pps_thread->pps_out; ret = pps_thread->ppsout_count; thread_unlock(pps_thread); return ret; } /* end */ gpsd-3.15/ppsthread.h0000664000175000017500000000412512513107374012715 0ustar esresr/* * This file is Copyright (c) 2015 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef PPSTHREAD_H #define PPSTHREAD_H #include #ifndef TIMEDELTA_DEFINED #define TIMEDELTA_DEFINED struct timedelta_t { struct timespec real; struct timespec clock; }; #endif /* TIMEDELTA_DEFINED */ /* difference between timespecs in nanoseconds */ /* int is too small, avoid floats */ /* WARNING! this will overflow if x and y differ by more than a few seconds */ #define timespec_diff_ns(x, y) (long)(((x).tv_sec-(y).tv_sec)*1000000000+(x).tv_nsec-(y).tv_nsec) /* * Set context, devicefd, and devicename at initialization time, before * you call pps_thread_activate(). The context pointer can be used to * pass data to the hook routines. * * Do not set the fix_in member or read the pps_out member directly, * these accesses need to be mutex-locked and that is what the last * two functions are for. * * The report hook is called when each PPS event is recognized. The log * hook is called to log error and status indications from the thread. */ struct pps_thread_t { void *context; /* PPS thread code leaves this alone */ int devicefd; /* device file descriptor */ char *devicename; /* device path */ char *(*report_hook)(volatile struct pps_thread_t *, struct timedelta_t *); void (*log_hook)(volatile struct pps_thread_t *, int errlevel, const char *fmt, ...); struct timedelta_t fix_in; /* real & clock time when in-band fix received */ struct timedelta_t pps_out; /* real & clock time of last PPS event */ int ppsout_count; }; #define THREAD_ERROR 0 #define THREAD_WARN 1 #define THREAD_INF 2 #define THREAD_PROG 3 #define THREAD_RAW 4 extern void pps_thread_activate(volatile struct pps_thread_t *); extern void pps_thread_deactivate(volatile struct pps_thread_t *); extern void pps_thread_fixin(volatile struct pps_thread_t *, volatile struct timedelta_t *); extern int pps_thread_ppsout(volatile struct pps_thread_t *, volatile struct timedelta_t *); #endif /* PPSTHREAD_H */ gpsd-3.15/pseudoais.c0000664000175000017500000003053012520742615012712 0ustar esresr/* * Encode AIS messages. * * See the file AIVDM.txt on the GPSD website for documentation and references. * * This file is build from driver_ais.c * * This file is Copyright (c) 2013 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include "gpsd.h" #include "bits.h" #include #ifdef AIVDM_ENABLE #define AIS_MSG_PART2_FLAG 0x100 static unsigned char convtab[] = {"0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW`abcdefghijklmnopqrstuvw"}; static unsigned char contab1[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; static void ais_addbits(unsigned char *bits, unsigned int start, unsigned int len, uint64_t data) { unsigned int l; unsigned int pos; uint64_t mask; unsigned int mask1; mask = 0x1; pos = (start+len-1) / 6; mask1 = 0x20; mask1 = mask1 >> ((start+len-1) % 6); if (len == 0) { return; } for(l=0;ltype); ais_addbits(bits, 6, 2, (uint64_t)ais->repeat); ais_addbits(bits, 8, 30, (uint64_t)ais->mmsi); switch (flag | ais->type) { case 1: /* Position Report */ case 2: case 3: ais_addbits(bits, 38, 4, (uint64_t)ais->type1.status); ais_addbits(bits, 42, 8, (uint64_t)ais->type1.turn); ais_addbits(bits, 50, 10, (uint64_t)ais->type1.speed); ais_addbits(bits, 60, 1, (uint64_t)ais->type1.accuracy); ais_addbits(bits, 61, 28, (uint64_t)ais->type1.lon); ais_addbits(bits, 89, 27, (uint64_t)ais->type1.lat); ais_addbits(bits, 116, 12, (uint64_t)ais->type1.course); ais_addbits(bits, 128, 9, (uint64_t)ais->type1.heading); ais_addbits(bits, 137, 6, (uint64_t)ais->type1.second); ais_addbits(bits, 143, 2, (uint64_t)ais->type1.maneuver); /* ais_addbits(bits, 145, 3, (uint64_t)ais->type1.spare); */ ais_addbits(bits, 148, 1, (uint64_t)ais->type1.raim); ais_addbits(bits, 149, 19, (uint64_t)ais->type1.radio); len = 149 + 19; break; case 4: /* Base Station Report */ case 11: /* UTC/Date Response */ ais_addbits(bits, 38, 14, (uint64_t)ais->type4.year); ais_addbits(bits, 52, 4, (uint64_t)ais->type4.month); ais_addbits(bits, 56, 5, (uint64_t)ais->type4.day); ais_addbits(bits, 61, 5, (uint64_t)ais->type4.hour); ais_addbits(bits, 66, 6, (uint64_t)ais->type4.minute); ais_addbits(bits, 72, 6, (uint64_t)ais->type4.second); ais_addbits(bits, 78, 1, (uint64_t)ais->type4.accuracy); ais_addbits(bits, 79, 28, (uint64_t)ais->type4.lon); ais_addbits(bits, 107, 27, (uint64_t)ais->type4.lat); ais_addbits(bits, 134, 4, (uint64_t)ais->type4.epfd); /* ais_addbits(bits, 138, 10, (uint64_t)ais->type4.spare); */ ais_addbits(bits, 148, 1, (uint64_t)ais->type4.raim); ais_addbits(bits, 149, 19, (uint64_t)ais->type4.radio); len = 149 + 19; break; case 5: /* Ship static and voyage related data */ ais_addbits(bits, 38, 2, (uint64_t)ais->type5.ais_version); ais_addbits(bits, 40, 30, (uint64_t)ais->type5.imo); ais_addchar(bits, 70, 7, ais->type5.callsign); ais_addchar(bits, 112, 20, ais->type5.shipname); ais_addbits(bits, 232, 8, (uint64_t)ais->type5.shiptype); ais_addbits(bits, 240, 9, (uint64_t)ais->type5.to_bow); ais_addbits(bits, 249, 9, (uint64_t)ais->type5.to_stern); ais_addbits(bits, 258, 6, (uint64_t)ais->type5.to_port); ais_addbits(bits, 264, 6, (uint64_t)ais->type5.to_starboard); ais_addbits(bits, 270, 4, (uint64_t)ais->type5.epfd); ais_addbits(bits, 274, 4, (uint64_t)ais->type5.month); ais_addbits(bits, 278, 5, (uint64_t)ais->type5.day); ais_addbits(bits, 283, 5, (uint64_t)ais->type5.hour); ais_addbits(bits, 288, 6, (uint64_t)ais->type5.minute); ais_addbits(bits, 294, 8, (uint64_t)ais->type5.draught); ais_addchar(bits, 302, 20, ais->type5.destination); ais_addbits(bits, 422, 1, (uint64_t)ais->type5.dte); /* ais_addbits(bits, 423, 1, (uint64_t)ais->type5.spare); */ len = 423 + 1; break; case 9: /* Standard SAR Aircraft Position Report */ ais_addbits(bits, 38, 12, (uint64_t)ais->type9.alt); ais_addbits(bits, 50, 10, (uint64_t)ais->type9.speed); ais_addbits(bits, 60, 1, (uint64_t)ais->type9.accuracy); ais_addbits(bits, 61, 28, (uint64_t)ais->type9.lon); ais_addbits(bits, 89, 27, (uint64_t)ais->type9.lat); ais_addbits(bits, 116, 12, (uint64_t)ais->type9.course); ais_addbits(bits, 128, 6, (uint64_t)ais->type9.second); ais_addbits(bits, 134, 8, (uint64_t)ais->type9.regional); ais_addbits(bits, 142, 1, (uint64_t)ais->type9.dte); /* ais_addbits(bits, 143, 3, (uint64_t)ais->type9.spare); */ ais_addbits(bits, 146, 1, (uint64_t)ais->type9.assigned); ais_addbits(bits, 147, 1, (uint64_t)ais->type9.raim); ais_addbits(bits, 148, 19, (uint64_t)ais->type9.radio); len = 148 + 19; break; case 18: /* Standard Class B CS Position Report */ ais_addbits(bits, 38, 8, (uint64_t)ais->type18.reserved); ais_addbits(bits, 46, 10, (uint64_t)ais->type18.speed); ais_addbits(bits, 56, 1, (uint64_t)ais->type18.accuracy); ais_addbits(bits, 57, 28, (uint64_t)ais->type18.lon); ais_addbits(bits, 85, 27, (uint64_t)ais->type18.lat); ais_addbits(bits, 112, 12, (uint64_t)ais->type18.course); ais_addbits(bits, 124, 9, (uint64_t)ais->type18.heading); ais_addbits(bits, 133, 6, (uint64_t)ais->type18.second); ais_addbits(bits, 139, 2, (uint64_t)ais->type18.regional); ais_addbits(bits, 141, 1, (uint64_t)ais->type18.cs); ais_addbits(bits, 142, 1, (uint64_t)ais->type18.display); ais_addbits(bits, 143, 1, (uint64_t)ais->type18.dsc); ais_addbits(bits, 144, 1, (uint64_t)ais->type18.band); ais_addbits(bits, 145, 1, (uint64_t)ais->type18.msg22); ais_addbits(bits, 146, 1, (uint64_t)ais->type18.assigned); ais_addbits(bits, 147, 1, (uint64_t)ais->type18.raim); ais_addbits(bits, 148, 20, (uint64_t)ais->type18.radio); len = 148 + 20; break; case 19: /* Extended Class B CS Position Report */ ais_addbits(bits, 38, 8, (uint64_t)ais->type19.reserved); ais_addbits(bits, 46, 10, (uint64_t)ais->type19.speed); ais_addbits(bits, 56, 1, (uint64_t)ais->type19.accuracy); ais_addbits(bits, 57, 28, (uint64_t)ais->type19.lon); ais_addbits(bits, 85, 27, (uint64_t)ais->type19.lat); ais_addbits(bits, 112, 12, (uint64_t)ais->type19.course); ais_addbits(bits, 124, 9, (uint64_t)ais->type19.heading); ais_addbits(bits, 133, 6, (uint64_t)ais->type19.second); ais_addbits(bits, 139, 4, (uint64_t)ais->type19.regional); ais_addchar(bits, 143, 20, ais->type19.shipname); ais_addbits(bits, 263, 8, (uint64_t)ais->type19.shiptype); ais_addbits(bits, 271, 9, (uint64_t)ais->type19.to_bow); ais_addbits(bits, 280, 9, (uint64_t)ais->type19.to_stern); ais_addbits(bits, 289, 6, (uint64_t)ais->type19.to_port); ais_addbits(bits, 295, 6, (uint64_t)ais->type19.to_starboard); ais_addbits(bits, 299, 4, (uint64_t)ais->type19.epfd); ais_addbits(bits, 302, 1, (uint64_t)ais->type19.raim); ais_addbits(bits, 305, 1, (uint64_t)ais->type19.dte); ais_addbits(bits, 306, 1, (uint64_t)ais->type19.assigned); /* ais_addbits(bits, 307, 5, (uint64_t)ais->type19.spare); */ len = 307 + 5; break; case 21: /* Aid-to-Navigation Report */ ais_addbits(bits, 38, 5, (uint64_t)ais->type21.aid_type); ais_addchar(bits, 43, 20, ais->type21.name); ais_addbits(bits, 163, 1, (uint64_t)ais->type21.accuracy); ais_addbits(bits, 164, 28, (uint64_t)ais->type21.lon); ais_addbits(bits, 192, 27, (uint64_t)ais->type21.lat); ais_addbits(bits, 219, 9, (uint64_t)ais->type21.to_bow); ais_addbits(bits, 228, 9, (uint64_t)ais->type21.to_stern); ais_addbits(bits, 237, 6, (uint64_t)ais->type21.to_port); ais_addbits(bits, 243, 6, (uint64_t)ais->type21.to_starboard); ais_addbits(bits, 249, 4, (uint64_t)ais->type21.epfd); ais_addbits(bits, 253, 6, (uint64_t)ais->type21.second); ais_addbits(bits, 259, 1, (uint64_t)ais->type21.off_position); ais_addbits(bits, 260, 8, (uint64_t)ais->type21.regional); ais_addbits(bits, 268, 1, (uint64_t)ais->type21.raim); ais_addbits(bits, 269, 1, (uint64_t)ais->type21.virtual_aid); ais_addbits(bits, 270, 1, (uint64_t)ais->type21.assigned); /* ais_addbits(bits, 271, 1, (uint64_t)ais->type21.spare); */ len = 271 + 1; if (strlen(ais->type21.name) > 20) { unsigned int extralen = (unsigned int)(strlen(ais->type21.name) - 20); ais_addchar(bits, 272, extralen, ais->type21.name + 20); len += extralen * 6; } break; case 24: /* Class B CS Static Data Report Part 1 */ if (ais->type24.part == part_a) { ais_addbits(bits, 38, 2, (uint64_t)0); ais_addchar(bits, 40, 20, ais->type24.shipname); /* ais_addbits(bits, 160, 8, (uint64_t)ais->type24.a.spare); */ len = 160; } break; case 24 | AIS_MSG_PART2_FLAG: /* Class B CS Static Data Report Part 2 */ if ((ais->type24.part == part_b) || (ais->type24.part == both)) { ais_addbits(bits, 38, 2, (uint64_t)1); ais_addbits(bits, 40, 8, (uint64_t)ais->type24.shiptype); ais_addchar(bits, 48, 3, &ais->type24.vendorid[0]); ais_adddata(bits, 66, 3, &ais->type24.vendorid[3]); ais_addchar(bits, 90, 7, ais->type24.callsign); if (AIS_AUXILIARY_MMSI(ais->mmsi)) { ais_addbits(bits, 132, 30, (uint64_t)ais->type24.mothership_mmsi); } else { ais_addbits(bits, 132, 9, (uint64_t)ais->type24.dim.to_bow); ais_addbits(bits, 141, 9, (uint64_t)ais->type24.dim.to_stern); ais_addbits(bits, 150, 6, (uint64_t)ais->type24.dim.to_port); ais_addbits(bits, 156, 6, (uint64_t)ais->type24.dim.to_starboard); } /* ais_addbits(bits, 162, 6, ais->type24.b.spare); */ len = 162 + 6; } break; case 27: /* Long Range AIS Broadcast message */ ais_addbits(bits, 38, 1, (uint64_t)ais->type27.accuracy); ais_addbits(bits, 39, 1, (uint64_t)ais->type27.raim); ais_addbits(bits, 40, 4, (uint64_t)ais->type27.status); ais_addbits(bits, 44, 18, (uint64_t)ais->type27.lon); ais_addbits(bits, 62, 17, (uint64_t)ais->type27.lat); ais_addbits(bits, 79, 6, (uint64_t)ais->type27.speed); ais_addbits(bits, 85, 9, (uint64_t)ais->type27.course); ais_addbits(bits, 94, 1, (uint64_t)ais->type27.gnss); break; } ais_binary_to_ascii(bits, len); return len; } #endif /* AIVDM_ENABLE */ gpsd-3.15/pseudonmea.c0000664000175000017500000003056412520742615013065 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include "gpsd.h" #include "strfuncs.h" /* * Support for generic binary drivers. These functions dump NMEA for passing * to the client in raw mode. They assume that (a) the public gps.h structure * members are in a valid state, (b) that the private members hours, minutes, * and seconds have also been filled in, (c) that if the private member * mag_var is not NAN it is a magnetic variation in degrees that should be * passed on, and (d) if the private member separation does not have the * value NAN, it is a valid WGS84 geoidal separation in meters for the fix. */ static double degtodm(double angle) /* decimal degrees to GPS-style, degrees first followed by minutes */ { double fraction, integer; fraction = modf(angle, &integer); return floor(angle) * 100 + fraction * 60; } void gpsd_position_fix_dump(struct gps_device_t *session, char bufp[], size_t len) { struct tm tm; time_t intfixtime; intfixtime = (time_t) session->gpsdata.fix.time; (void)gmtime_r(&intfixtime, &tm); if (session->gpsdata.fix.mode > MODE_NO_FIX) { (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); if (isnan(session->gpsdata.dop.hdop)) (void)strlcat(bufp, ",", len); else str_appendf(bufp, len, "%.2f,", session->gpsdata.dop.hdop); if (isnan(session->gpsdata.fix.altitude)) (void)strlcat(bufp, ",", len); else str_appendf(bufp, len, "%.2f,M,", session->gpsdata.fix.altitude); if (isnan(session->gpsdata.separation)) (void)strlcat(bufp, ",", len); else str_appendf(bufp, len, "%.3f,M,", session->gpsdata.separation); if (isnan(session->mag_var)) (void)strlcat(bufp, ",", len); else { str_appendf(bufp, len, "%3.2f,", fabs(session->mag_var)); (void)strlcat(bufp, (session->mag_var > 0) ? "E" : "W", len); } nmea_add_checksum(bufp); } } static void gpsd_transit_fix_dump(struct gps_device_t *session, char bufp[], size_t len) { 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; (void)gmtime_r(&intfixtime, &tm); tm.tm_mon++; tm.tm_year %= 100; } #define ZEROIZE(x) (isnan(x)!=0 ? 0.0 : x) (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); #undef ZEROIZE nmea_add_checksum(bufp); } static void gpsd_binary_satellite_dump(struct gps_device_t *session, char bufp[], size_t len) { int i; char *bufp2 = bufp; bufp[0] = '\0'; for (i = 0; i < session->gpsdata.satellites_visible; i++) { if (i % 4 == 0) { bufp2 = bufp + strlen(bufp); str_appendf(bufp, len, "$GPGSV,%d,%d,%02d", ((session->gpsdata.satellites_visible - 1) / 4) + 1, (i / 4) + 1, session->gpsdata.satellites_visible); } if (i < session->gpsdata.satellites_visible) str_appendf(bufp, len, ",%02d,%02d,%03d,%02.0f", session->gpsdata.skyview[i].PRN, session->gpsdata.skyview[i].elevation, session->gpsdata.skyview[i].azimuth, session->gpsdata.skyview[i].ss); if (i % 4 == 3 || i == session->gpsdata.satellites_visible - 1) { nmea_add_checksum(bufp2); } } #ifdef ZODIAC_ENABLE if (session->lexer.type == ZODIAC_PACKET && session->driver.zodiac.Zs[0] != 0) { bufp2 = bufp + strlen(bufp); str_appendf(bufp, len, "$PRWIZCH"); for (i = 0; i < ZODIAC_CHANNELS; i++) { str_appendf(bufp, len, ",%02u,%X", session->driver.zodiac.Zs[i], session->driver.zodiac.Zv[i] & 0x0f); } nmea_add_checksum(bufp2); } #endif /* ZODIAC_ENABLE */ } static void gpsd_binary_quality_dump(struct gps_device_t *session, char bufp[], size_t len) { char *bufp2; bufp[0] = '\0'; if (session->device_type != NULL && (session->gpsdata.set & MODE_SET) != 0) { int i, j; bufp2 = bufp + strlen(bufp); (void)snprintf(bufp, len, "$GPGSA,%c,%d,", 'A', session->gpsdata.fix.mode); j = 0; for (i = 0; i < session->device_type->channels; i++) { if (session->gpsdata.skyview[i].used == true){ str_appendf(bufp, len, "%d,", session->gpsdata.skyview[i].PRN); j++; } } for (i = j; i < session->device_type->channels; i++) { (void)strlcat(bufp, ",", len); } #define ZEROIZE(x) (isnan(x)!=0 ? 0.0 : x) if (session->gpsdata.fix.mode == MODE_NO_FIX) (void)strlcat(bufp, ",,,", len); else str_appendf(bufp, len, "%.1f,%.1f,%.1f*", ZEROIZE(session->gpsdata.dop.pdop), ZEROIZE(session->gpsdata.dop.hdop), ZEROIZE(session->gpsdata.dop.vdop)); nmea_add_checksum(bufp2); } if (isfinite(session->gpsdata.fix.epx)!=0 && isfinite(session->gpsdata.fix.epy)!=0 && isfinite(session->gpsdata.fix.epv)!=0 && isfinite(session->gpsdata.epe)!=0) { struct tm tm; 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; (void)gmtime_r(&intfixtime, &tm); } bufp2 = bufp + strlen(bufp); str_appendf(bufp, len, "$GPGBS,%02d%02d%02d,%.2f,M,%.2f,M,%.2f,M", tm.tm_hour, tm.tm_min, tm.tm_sec, ZEROIZE(session->gpsdata.fix.epx), ZEROIZE(session->gpsdata.fix.epy), ZEROIZE(session->gpsdata.fix.epv)); nmea_add_checksum(bufp2); } #undef ZEROIZE } static void gpsd_binary_time_dump(struct gps_device_t *session, char bufp[], size_t len) { struct tm tm; double integral; time_t integral_time; if (session->newdata.mode > MODE_NO_FIX) { double fractional = modf(session->newdata.time, &integral); integral_time = (time_t) integral; (void)gmtime_r(&integral_time, &tm); /* * We pin this report to the GMT/UTC timezone. This may be technically * incorrect; our sources on ZDA suggest that it should report local * timezone. But no GPS we've ever seen actually does this, because it * would require embedding a location-to-TZ database in the receiver. * And even if we could do that, it would make our regression tests * break any time they were run in a timezone different from the one * where they were generated. */ (void)snprintf(bufp, len, "$GPZDA,%02d%02d%05.2f,%02d,%02d,%04d,00,00", tm.tm_hour, tm.tm_min, (double)tm.tm_sec + fractional, tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900); nmea_add_checksum(bufp); } } static void gpsd_binary_almanac_dump(struct gps_device_t *session, char bufp[], size_t len) { if ( session->gpsdata.subframe.is_almanac ) { (void)snprintf(bufp, len, "$GPALM,1,1,%02d,%04d,%02x,%04x,%02x,%04x,%04x,%05x,%06x,%06x,%06x,%03x,%03x", (int)session->gpsdata.subframe.sub5.almanac.sv, (int)session->context->gps_week % 1024, (unsigned int)session->gpsdata.subframe.sub5.almanac.svh, (unsigned int)session->gpsdata.subframe.sub5.almanac.e, (unsigned int)session->gpsdata.subframe.sub5.almanac.toa, (unsigned int)session->gpsdata.subframe.sub5.almanac.deltai, (unsigned int)session->gpsdata.subframe.sub5.almanac.Omegad, (unsigned int)session->gpsdata.subframe.sub5.almanac.sqrtA, (unsigned int)session->gpsdata.subframe.sub5.almanac.omega, (unsigned int)session->gpsdata.subframe.sub5.almanac.Omega0, (unsigned int)session->gpsdata.subframe.sub5.almanac.M0, (unsigned int)session->gpsdata.subframe.sub5.almanac.af0, (unsigned int)session->gpsdata.subframe.sub5.almanac.af1); nmea_add_checksum(bufp); } } #ifdef AIVDM_ENABLE #define GETLEFT(a) (((a%6) == 0) ? 0 : (6 - (a%6))) static void gpsd_binary_ais_dump(struct gps_device_t *session, char bufp[], size_t len) { char type[8] = "!AIVDM"; unsigned char data[256]; unsigned int msg1, msg2; char numc[4]; char channel; unsigned int left; unsigned int datalen; unsigned int offset; channel = 'A'; if (session->driver.aivdm.ais_channel == 'B') { channel = 'B'; } memset(data, 0, sizeof(data)); datalen = ais_binary_encode(&session->gpsdata.ais, &data[0], 0); if (datalen > 6*60) { static int number1 = 0; msg1 = datalen / (6*60); if ((datalen % (6*60)) != 0) { msg1 += 1; } numc[0] = '0' + (char)(number1 & 0x0f); numc[1] = '\0'; number1 += 1; if (number1 > 9) { number1 = 0; } offset = 0; for (msg2=1;msg2<=msg1;msg2++) { unsigned char old; old = '\0'; if (strlen((char *)&data[(msg2-1)*60]) > 60) { old = data[(msg2-0)*60]; data[(msg2-0)*60] = '\0'; } if (datalen >= (6*60)) { left = 0; datalen -= 6*60; } else { left = GETLEFT(datalen); } (void)snprintf(&bufp[offset], len-offset, "%s,%u,%u,%s,%c,%s,%u", type, msg1, msg2, numc, channel, (char *)&data[(msg2-1)*60], left); nmea_add_checksum(&bufp[offset]); if (old != (unsigned char)'\0') { data[(msg2-0)*60] = old; } offset = (unsigned int) strlen(bufp); } } else if (datalen > 0) { msg1 = 1; msg2 = 1; numc[0] = '\0'; left = GETLEFT(datalen); (void)snprintf(bufp, len, "%s,%u,%u,%s,%c,%s,%u", type, msg1, msg2, numc, channel, (char *)data, left); nmea_add_checksum(bufp); } if (session->gpsdata.ais.type == 24) { msg1 = 1; msg2 = 1; numc[0] = '\0'; memset(data, 0, sizeof(data)); datalen = ais_binary_encode(&session->gpsdata.ais, &data[0], 1); if (datalen > 0) { left = GETLEFT(datalen); offset = (unsigned int)strlen(bufp); (void)snprintf(&bufp[offset], len-offset, "%s,%u,%u,%s,%c,%s,%u", type, msg1, msg2, numc, channel, (char *)data, left); nmea_add_checksum(bufp+offset); } } } #endif /* AIVDM_ENABLE */ /* *INDENT-OFF* */ void nmea_tpv_dump(struct gps_device_t *session, char bufp[], size_t len) { bufp[0] = '\0'; if ((session->gpsdata.set & TIME_SET) != 0) gpsd_binary_time_dump(session, bufp + strlen(bufp), len - strlen(bufp)); if ((session->gpsdata.set & LATLON_SET) != 0) { gpsd_position_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_IS | HERR_SET | VERR_SET)) != 0) gpsd_binary_quality_dump(session, bufp + strlen(bufp), len - strlen(bufp)); } /* *INDENT-ON* */ void nmea_sky_dump(struct gps_device_t *session, 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)); } void nmea_subframe_dump(struct gps_device_t *session, char bufp[], size_t len) { bufp[0] = '\0'; if ((session->gpsdata.set & SUBFRAME_SET) != 0) gpsd_binary_almanac_dump(session, bufp + strlen(bufp), len - strlen(bufp)); } #ifdef AIVDM_ENABLE void nmea_ais_dump(struct gps_device_t *session, char bufp[], size_t len) { bufp[0] = '\0'; if ((session->gpsdata.set & AIS_SET) != 0) gpsd_binary_ais_dump(session, bufp + strlen(bufp), len - strlen(bufp)); } #endif /* AIVDM_ENABLE */ /* pseudonmea.c ends here */ gpsd-3.15/regress-driver0000775000175000017500000001503712513107374013447 0ustar esresr#!/bin/sh # # The regression-test driver script. This used to be explicit in the # makefile before we regrouped the regression tests by stable and unstable # drivers. # Without GNU date extensions, %N won't expand and we only get 1sec precision starttime=`date +"%s * 1000000000 + %N" | sed '/+ N/s///' 2>/dev/null` # We need to have the build directory in $GPSD_HOME to find the new gpsd if [ "`dirname $0`" = "." ]; then GPSD_HOME=`pwd` else GPSD_HOME=`dirname $0` fi # Arrange to call a gpsfake in the source directory without fuss. if [ -z ${PYTHON} ]; then PYTHON="python" fi # Define the directories we ask setup.py to install the # modules/extensions and scripts to. The way chosen here reproduces # the internal behaviour of distutils. Unfortunately distutils does # not export the pre-defined/configured directories, so we have to # define them on our own. For default installations of distutils the # chosen values here will match what distutils uses. py_libdir=`pwd`/build/`${PYTHON} -c 'import distutils.util; import sys; print("lib.%s-%s" %(distutils.util.get_platform(), sys.version[0:3]))'` py_scriptdir=`pwd`/build/`${PYTHON} -c 'import sys; print("scripts-%s" %(sys.version[0:3], ))'` if [ -d ${py_libdir} ] && [ -d ${py_scriptdir} ]; then PYTHONPATH=${py_libdir} export PYTHONPATH PATH=${py_scriptdir}:${PATH} fi export GPSD_HOME PATH # Use a non-default value of the SHM key to avoid colliding with # production instances. Value must be legal for strtol(3); # this is the default key plus one. export GPSD_SHM_KEY=0x47505345 mode=regress testing=daemon opts="" logfile="" help="0" baton=false while getopts cl:sStbuvo:h opt do case $opt in c) testing=clientlib ;; # Can be 'daemon' l) logfile=$OPTARG ;; # Logfile to save diffs to s) mode=regress ;; # Run regression tests S) mode=slowregress ;; # Run regression tests with big delays t) baton=true mode=regress ;; # Run regression tests w/baton b) mode=build ;; # Rebuild regression check files u) opts="$opts -u" ;; # Force UDP v) mode=view ;; # View result of generating a check file o) opts="$opts $OPTARG" ;; # Pass options to gpsfake h) help="1" esac done shift $(($OPTIND - 1)) if [ $help -eq "1" ] then echo echo echo "Regression test driver script" echo "-h - this help" echo "-c - can be 'daemon'" echo "-l - where to log diffs to" echo "-s - run regression tests" echo "-S - run regression tests with realistic timing delays" echo "-t - Run regression tests w/baton" echo "-b - Rebuild regression check files" echo "-u - Force UDP" echo "-v - view result of generating a check file" echo "-o - Pass options to gpsfake" echo exit 0 fi # Enables us to turn debugging up high without screwing up the diff checks # First and Second filter out gpsd log messages. # Third filters out gps.py verbose loggging # Fourth filters out WATCH responses # Fifth filters out DEVICE responses # Sixth filters out VERSION responses # Seventh filters out device fields GPSFILTER="sed -e /^gpsd:/d -e /^gpsfake/d -e /GPS-DATA/d -e /WATCH/d -e /DEVICE/d -e /VERSION/d -e s/,\"device\":[^,}]*//" # Use ALTFILTER to set up custom filtering when a regression test fails # This example filters out altitude and some fields computed by gpsd's error # modeling - these are fragile in the prsence of changes to the fix-buffering # logic. Note that as the last attribute mode needs to be handled differently. #ALTFILTER="-e s/\"alt\":[^,]*,// -e s/\"ep[vhs]\":[-+0-9.]*// -e s/,\"mode\":[^}]*//" TMP=`mktemp -d -t gpsd-test-XXXXXXXXXXXXXX` # Only twirl the baton on a tty, avoids junk in transcripts. if [ -t 0 ] then baton=false fi if [ $baton = true ] then opts="$opts -b" fi if [ $mode = slowregress ] then opts="$opts -S" fi case $mode in regress|slowregress) echo "Testing the $testing..." >&2 errors=0; total=0; notfound=0;error_list=""; for f in $*; do if [ -r $f.chk ] then trap 'rm -f ${TMP}/test-$$.chk; exit $errors' EXIT HUP INT TERM case $testing in daemon) TMPDIR=${TMP} ${PYTHON} ${GPSD_HOME}/gpsfake -s 38400 -1 -p $opts ${f} | ${GPSFILTER} ${ALTFILTER} >${TMP}/test-$$.chk ;; clientlib) ${GPSD_HOME}/test_libgps -b <${f} >${TMP}/test-$$.chk ;; esac if [ "${ALTFILTER}" ] then trap 'rm -f ${TMP}/test-$$.chk ${TMP}/testout-$$.chk ${TMP}/testin-$$.chk ${TMP}/diff-$$; exit $errors' EXIT HUP INT TERM sed -n <${f}.chk >${TMP}/testin-$$.chk ${ALTFILTER} -e 'p'; sed -n <${TMP}/test-$$.chk >${TMP}/testout-$$.chk ${ALTFILTER} -e 'p'; diff -ub ${TMP}/testin-$$.chk ${TMP}/testout-$$.chk >${TMP}/diff-$$; else diff -ub ${f}.chk ${TMP}/test-$$.chk >${TMP}/diff-$$; fi if test -s ${TMP}/diff-$$ ; then errors=`expr $errors + 1`; error_list="$error_list \"${f}\"" if [ -z "$logfile" ] then cat ${TMP}/diff-$$ else cat ${TMP}/diff-$$ >>$logfile fi fi; rm -f ${TMP}/test-$$.chk ${TMP}/testout-$$.chk ${TMP}/testin-$$.chk ${TMP}/diff-$$ else echo "*** No check log $f.chk exists" notfound=`expr $notfound + 1`; fi total=`expr $total + 1`; done; if test $errors -gt 0; then echo "Regression test FAILED: $errors errors in $total tests total ($notfound not found)."; echo "The following test Failed:" echo "================================================================" for err in $error_list do echo $err done echo "================================================================" status=1; else echo "Regression test successful: no errors in $total tests ($notfound not found)."; status=0; fi ;; build) echo "Rebuilding $testing regressions..." >&2 for f in $*; do case $testing in daemon) ${PYTHON} ${GPSD_HOME}/gpsfake -s 38400 -1 -p $opts ${f} | ${GPSFILTER} >${f}.chk;; clientlib) ${GPSD_HOME}/test_libgps -b <${f} >${f}.chk ;; esac done status=0 ;; view) echo "Viewing..." >&2 for f in $*; do case $testing in daemon) ${PYTHON} ${GPSD_HOME}/gpsfake -s 38400 -1 -p $opts ${f} | ${GPSFILTER} ;; clientlib) ${GPSD_HOME}/libgps -b <${f} ;; esac done status=0 ;; esac # See starttime above endtime=`date +"%s * 1000000000 + %N" | sed '/+ N/s///' 2>/dev/null` if [ "$starttime" -a "$endtime" ] then echo -n "Elapsed time: " echo "scale=2; (${endtime} - ${starttime}) / 1000000000" | bc fi rm -fr ${TMP} exit $status gpsd-3.15/repo/README0000664000175000017500000000262612461156335012406 0ustar esresrThe repo directory contains git configuration files and hooks as used at Berlios. Here follows a short description of the files and what they do: description: Description of the project as displayed by gitweb/cgit. config: Repository configuration, including config details for the hooks. hooks/post-receive: This script is run after receive-pack has accepted a pack and the repository has been updated. Currently passes stdin to post-receive-email.sh which mails out commit messages to the commit mailing list. See the head of post-receive-email.sh for a documentation of the config options for the hook. hooks/post-receive-email.sh: see hooks/post-receive hooks/post-update: Runs after the update hook. Executes git update-server-info to update the auxiliary info file to help dumb servers (needed to clone via http) hooks/update-custom: Append to the standard update hook script. Calls ciabot.py, which you must also install. The executable script "upload" can be used to update the repo copies with files from this directory. Give it arguments to upload specified filenames, for example upload config uploads the config file. With no arguments, uploads config and all hook scripts under hooks/ directory. gpsd-3.15/repo/config0000664000175000017500000000107212461156335012710 0ustar esresr# Extra attributes to add to git config if the hosting site allows hacking it. # When the project was hosted on Berlios, this was what it used. # Replace MAILHOST with the mailing list host. [gitweb] owner = esr [hooks] mailinglist = gpsd-commit-watch@MAILHOST announcelist = gpsd-announce@MAILHOST envelopesender = gpsd-dev@MAILHOST emailprefix = "" allowunannotated = true allowdeletebranch = true denycreatebranch = false allowdeletetag = false allowmodifytag = false showrev = "git show -C %s; echo" [ciabot] project = GPSD xmlrpc = true gpsd-3.15/repo/description0000664000175000017500000000003012460513551013753 0ustar esresrProject gpsd at BerliOS gpsd-3.15/repo/hooks/post-receive0000775000175000017500000000063612460513551015177 0ustar esresr#!/bin/sh # # An example hook script for the post-receive event # # This script is run after receive-pack has accepted a pack and the # repository has been updated. It is passed arguments in through stdin # in the form # # For example: # aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master /gitroot/gpsd/hooks/post-receive-email.sh gpsd-3.15/repo/hooks/post-receive-email.sh0000775000175000017500000004547212460513551016704 0ustar esresr#!/bin/sh # # Copyright (c) 2007 Andy Parkins # # An example hook script to mail out commit update information. This hook # sends emails listing new revisions to the repository introduced by the # change being reported. The rule is that (for branch updates) each commit # will appear on one email and one email only. # # This hook is stored in the contrib/hooks directory. Your distribution # will have put this somewhere standard. You should make this script # executable then link to it in the repository you would like to use it in. # For example, on debian the hook is stored in # /usr/share/doc/git-core/contrib/hooks/post-receive-email: # # chmod a+x post-receive-email # cd /path/to/your/repository.git # ln -sf /usr/share/doc/git-core/contrib/hooks/post-receive-email hooks/post-receive # # This hook script assumes it is enabled on the central repository of a # project, with all users pushing only to it and not between each other. It # will still work if you don't operate in that style, but it would become # possible for the email to be from someone other than the person doing the # push. # # Config # ------ # hooks.mailinglist # This is the list that all pushes will go to; leave it blank to not send # emails for every ref update. # hooks.announcelist # This is the list that all pushes of annotated tags will go to. Leave it # blank to default to the mailinglist field. The announce emails lists # the short log summary of the changes since the last annotated tag. # hooks.envelopesender # If set then the -f option is passed to sendmail to allow the envelope # sender address to be set # hooks.emailprefix # All emails have their subjects prefixed with this prefix, or "[SCM]" # if emailprefix is unset, to aid filtering # hooks.showrev # The shell command used to format each revision in the email, with # "%s" replaced with the commit id. Defaults to "git rev-list -1 # --pretty %s", displaying the commit id, author, date and log # message. To list full patches separated by a blank line, you # could set this to "git show -C %s; echo". # # Notes # ----- # All emails include the headers "X-Git-Refname", "X-Git-Oldrev", # "X-Git-Newrev", and "X-Git-Reftype" to enable fine tuned filtering and # give information for debugging. # # ---------------------------- Functions # # Top level email generation function. This decides what type of update # this is and calls the appropriate body-generation routine after outputting # the common header # # Note this function doesn't actually generate any email output, that is # taken care of by the functions it calls: # - generate_email_header # - generate_create_XXXX_email # - generate_update_XXXX_email # - generate_delete_XXXX_email # - generate_email_footer # generate_email() { # --- Arguments oldrev=$(git rev-parse $1) newrev=$(git rev-parse $2) refname="$3" # --- Interpret # 0000->1234 (create) # 1234->2345 (update) # 2345->0000 (delete) if expr "$oldrev" : '0*$' >/dev/null then change_type="create" else if expr "$newrev" : '0*$' >/dev/null then change_type="delete" else change_type="update" fi fi # --- Get the revision types newrev_type=$(git cat-file -t $newrev 2> /dev/null) oldrev_type=$(git cat-file -t "$oldrev" 2> /dev/null) case "$change_type" in create|update) rev="$newrev" rev_type="$newrev_type" ;; delete) rev="$oldrev" rev_type="$oldrev_type" ;; esac # The revision type tells us what type the commit is, combined with # the location of the ref we can decide between # - working branch # - tracking branch # - unannoted tag # - annotated tag case "$refname","$rev_type" in refs/tags/*,commit) # un-annotated tag refname_type="tag" short_refname=${refname##refs/tags/} ;; refs/tags/*,tag) # annotated tag refname_type="annotated tag" short_refname=${refname##refs/tags/} # change recipients if [ -n "$announcerecipients" ]; then recipients="$announcerecipients" fi ;; refs/heads/*,commit) # branch refname_type="branch" short_refname=${refname##refs/heads/} ;; refs/remotes/*,commit) # tracking branch refname_type="tracking branch" short_refname=${refname##refs/remotes/} echo >&2 "*** Push-update of tracking branch, $refname" echo >&2 "*** - no email generated." exit 0 ;; *) # Anything else (is there anything else?) echo >&2 "*** Unknown type of update to $refname ($rev_type)" echo >&2 "*** - no email generated" exit 1 ;; esac # Check if we've got anyone to send to if [ -z "$recipients" ]; then case "$refname_type" in "annotated tag") config_name="hooks.announcelist" ;; *) config_name="hooks.mailinglist" ;; esac echo >&2 "*** $config_name is not set so no email will be sent" echo >&2 "*** for $refname update $oldrev->$newrev" exit 0 fi # Email parameters # The email subject will contain the best description of the ref # that we can build from the parameters describe=$(git describe $rev 2>/dev/null) if [ -z "$describe" ]; then describe=$rev fi generate_email_header # Call the correct body generation function fn_name=general case "$refname_type" in "tracking branch"|branch) fn_name=branch ;; "annotated tag") fn_name=atag ;; esac generate_${change_type}_${fn_name}_email generate_email_footer } generate_email_header() { # --- Email (all stdout will be the email) # Generate header cat <<-EOF To: $recipients Subject: ${emailprefix}$projectdesc $refname_type, $short_refname, ${change_type}d. $describe X-Git-Refname: $refname X-Git-Reftype: $refname_type X-Git-Oldrev: $oldrev X-Git-Newrev: $newrev This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "$projectdesc". The $refname_type, $short_refname has been ${change_type}d EOF } generate_email_footer() { SPACE=" " cat <<-EOF hooks/post-receive --${SPACE} $projectdesc EOF } # --------------- Branches # # Called for the creation of a branch # generate_create_branch_email() { # This is a new branch and so oldrev is not valid echo " at $newrev ($newrev_type)" echo "" echo $LOGBEGIN show_new_revisions echo $LOGEND } # # Called for the change of a pre-existing branch # generate_update_branch_email() { # Consider this: # 1 --- 2 --- O --- X --- 3 --- 4 --- N # # O is $oldrev for $refname # N is $newrev for $refname # X is a revision pointed to by some other ref, for which we may # assume that an email has already been generated. # In this case we want to issue an email containing only revisions # 3, 4, and N. Given (almost) by # # git rev-list N ^O --not --all # # The reason for the "almost", is that the "--not --all" will take # precedence over the "N", and effectively will translate to # # git rev-list N ^O ^X ^N # # So, we need to build up the list more carefully. git rev-parse # will generate a list of revs that may be fed into git rev-list. # We can get it to make the "--not --all" part and then filter out # the "^N" with: # # git rev-parse --not --all | grep -v N # # Then, using the --stdin switch to git rev-list we have effectively # manufactured # # git rev-list N ^O ^X # # This leaves a problem when someone else updates the repository # while this script is running. Their new value of the ref we're # working on would be included in the "--not --all" output; and as # our $newrev would be an ancestor of that commit, it would exclude # all of our commits. What we really want is to exclude the current # value of $refname from the --not list, rather than N itself. So: # # git rev-parse --not --all | grep -v $(git rev-parse $refname) # # Get's us to something pretty safe (apart from the small time # between refname being read, and git rev-parse running - for that, # I give up) # # # Next problem, consider this: # * --- B --- * --- O ($oldrev) # \ # * --- X --- * --- N ($newrev) # # That is to say, there is no guarantee that oldrev is a strict # subset of newrev (it would have required a --force, but that's # allowed). So, we can't simply say rev-list $oldrev..$newrev. # Instead we find the common base of the two revs and list from # there. # # As above, we need to take into account the presence of X; if # another branch is already in the repository and points at some of # the revisions that we are about to output - we don't want them. # The solution is as before: git rev-parse output filtered. # # Finally, tags: 1 --- 2 --- O --- T --- 3 --- 4 --- N # # Tags pushed into the repository generate nice shortlog emails that # summarise the commits between them and the previous tag. However, # those emails don't include the full commit messages that we output # for a branch update. Therefore we still want to output revisions # that have been output on a tag email. # # Luckily, git rev-parse includes just the tool. Instead of using # "--all" we use "--branches"; this has the added benefit that # "remotes/" will be ignored as well. # List all of the revisions that were removed by this update, in a # fast forward update, this list will be empty, because rev-list O # ^N is empty. For a non fast forward, O ^N is the list of removed # revisions fast_forward="" rev="" for rev in $(git rev-list $newrev..$oldrev) do revtype=$(git cat-file -t "$rev") echo " discards $rev ($revtype)" done if [ -z "$rev" ]; then fast_forward=1 fi # List all the revisions from baserev to newrev in a kind of # "table-of-contents"; note this list can include revisions that # have already had notification emails and is present to show the # full detail of the change from rolling back the old revision to # the base revision and then forward to the new revision for rev in $(git rev-list $oldrev..$newrev) do revtype=$(git cat-file -t "$rev") echo " via $rev ($revtype)" done if [ "$fast_forward" ]; then echo " from $oldrev ($oldrev_type)" else # 1. Existing revisions were removed. In this case newrev # is a subset of oldrev - this is the reverse of a # fast-forward, a rewind # 2. New revisions were added on top of an old revision, # this is a rewind and addition. # (1) certainly happened, (2) possibly. When (2) hasn't # happened, we set a flag to indicate that no log printout # is required. echo "" # Find the common ancestor of the old and new revisions and # compare it with newrev baserev=$(git merge-base $oldrev $newrev) rewind_only="" if [ "$baserev" = "$newrev" ]; then echo "This update discarded existing revisions and left the branch pointing at" echo "a previous point in the repository history." echo "" echo " * -- * -- N ($newrev)" echo " \\" echo " O -- O -- O ($oldrev)" echo "" echo "The removed revisions are not necessarilly gone - if another reference" echo "still refers to them they will stay in the repository." rewind_only=1 else echo "This update added new revisions after undoing existing revisions. That is" echo "to say, the old revision is not a strict subset of the new revision. This" echo "situation occurs when you --force push a change and generate a repository" echo "containing something like this:" echo "" echo " * -- * -- B -- O -- O -- O ($oldrev)" echo " \\" echo " N -- N -- N ($newrev)" echo "" echo "When this happens we assume that you've already had alert emails for all" echo "of the O revisions, and so we here report only the revisions in the N" echo "branch from the common base, B." fi fi echo "" if [ -z "$rewind_only" ]; then echo "Those revisions listed above that are new to this repository have" echo "not appeared on any other notification email; so we list those" echo "revisions in full, below." echo "" echo $LOGBEGIN show_new_revisions # XXX: Need a way of detecting whether git rev-list actually # outputted anything, so that we can issue a "no new # revisions added by this update" message echo $LOGEND else echo "No new revisions were added by this update." fi # The diffstat is shown from the old revision to the new revision. # This is to show the truth of what happened in this change. # There's no point showing the stat from the base to the new # revision because the base is effectively a random revision at this # point - the user will be interested in what this revision changed # - including the undoing of previous revisions in the case of # non-fast forward updates. echo "" echo "Summary of changes:" git diff-tree --stat --summary --find-copies-harder $oldrev..$newrev } # # Called for the deletion of a branch # generate_delete_branch_email() { echo " was $oldrev" echo "" echo $LOGEND git show -s --pretty=oneline $oldrev echo $LOGEND } # --------------- Annotated tags # # Called for the creation of an annotated tag # generate_create_atag_email() { echo " at $newrev ($newrev_type)" generate_atag_email } # # Called for the update of an annotated tag (this is probably a rare event # and may not even be allowed) # generate_update_atag_email() { echo " to $newrev ($newrev_type)" echo " from $oldrev (which is now obsolete)" generate_atag_email } # # Called when an annotated tag is created or changed # generate_atag_email() { # Use git for-each-ref to pull out the individual fields from the # tag eval $(git for-each-ref --shell --format=' tagobject=%(*objectname) tagtype=%(*objecttype) tagger=%(taggername) tagged=%(taggerdate)' $refname ) echo " tagging $tagobject ($tagtype)" case "$tagtype" in commit) # If the tagged object is a commit, then we assume this is a # release, and so we calculate which tag this tag is # replacing prevtag=$(git describe --abbrev=0 $newrev^ 2>/dev/null) if [ -n "$prevtag" ]; then echo " replaces $prevtag" fi ;; *) echo " length $(git cat-file -s $tagobject) bytes" ;; esac echo " tagged by $tagger" echo " on $tagged" echo "" echo $LOGBEGIN # Show the content of the tag message; this might contain a change # log or release notes so is worth displaying. git cat-file tag $newrev | sed -e '1,/^$/d' echo "" case "$tagtype" in commit) # Only commit tags make sense to have rev-list operations # performed on them if [ -n "$prevtag" ]; then # Show changes since the previous release git rev-list --pretty=short "$prevtag..$newrev" | git shortlog else # No previous tag, show all the changes since time # began git rev-list --pretty=short $newrev | git shortlog fi ;; *) # XXX: Is there anything useful we can do for non-commit # objects? ;; esac echo $LOGEND } # # Called for the deletion of an annotated tag # generate_delete_atag_email() { echo " was $oldrev" echo "" echo $LOGEND git show -s --pretty=oneline $oldrev echo $LOGEND } # --------------- General references # # Called when any other type of reference is created (most likely a # non-annotated tag) # generate_create_general_email() { echo " at $newrev ($newrev_type)" generate_general_email } # # Called when any other type of reference is updated (most likely a # non-annotated tag) # generate_update_general_email() { echo " to $newrev ($newrev_type)" echo " from $oldrev" generate_general_email } # # Called for creation or update of any other type of reference # generate_general_email() { # Unannotated tags are more about marking a point than releasing a # version; therefore we don't do the shortlog summary that we do for # annotated tags above - we simply show that the point has been # marked, and print the log message for the marked point for # reference purposes # # Note this section also catches any other reference type (although # there aren't any) and deals with them in the same way. echo "" if [ "$newrev_type" = "commit" ]; then echo $LOGBEGIN git show --no-color --root -s --pretty=medium $newrev echo $LOGEND else # What can we do here? The tag marks an object that is not # a commit, so there is no log for us to display. It's # probably not wise to output git cat-file as it could be a # binary blob. We'll just say how big it is echo "$newrev is a $newrev_type, and is $(git cat-file -s $newrev) bytes long." fi } # # Called for the deletion of any other type of reference # generate_delete_general_email() { echo " was $oldrev" echo "" echo $LOGEND git show -s --pretty=oneline $oldrev echo $LOGEND } # --------------- Miscellaneous utilities # # Show new revisions as the user would like to see them in the email. # show_new_revisions() { # This shows all log entries that are not already covered by # another ref - i.e. commits that are now accessible from this # ref that were previously not accessible # (see generate_update_branch_email for the explanation of this # command) # Revision range passed to rev-list differs for new vs. updated # branches. if [ "$change_type" = create ] then # Show all revisions exclusive to this (new) branch. revspec=$newrev else # Branch update; show revisions not part of $oldrev. revspec=$oldrev..$newrev fi git rev-parse --not --branches | grep -v $(git rev-parse $refname) | if [ -z "$custom_showrev" ] then git rev-list --pretty --stdin $revspec else git rev-list --stdin $revspec | while read onerev do eval $(printf "$custom_showrev" $onerev) done fi } send_mail() { if [ -n "$envelopesender" ]; then /usr/sbin/sendmail -t -f "$envelopesender" else /usr/sbin/sendmail -t fi } # ---------------------------- main() # --- Constants LOGBEGIN="- Log -----------------------------------------------------------------" LOGEND="-----------------------------------------------------------------------" # --- Config # Set GIT_DIR either from the working directory, or from the environment # variable. GIT_DIR=$(git rev-parse --git-dir 2>/dev/null) if [ -z "$GIT_DIR" ]; then echo >&2 "fatal: post-receive: GIT_DIR not set" exit 1 fi projectdesc=$(sed -ne '1p' "$GIT_DIR/description") # Check if the description is unchanged from it's default, and shorten it to # a more manageable length if it is if expr "$projectdesc" : "Unnamed repository.*$" >/dev/null then projectdesc="UNNAMED PROJECT" fi recipients=$(git config hooks.mailinglist) announcerecipients=$(git config hooks.announcelist) envelopesender=$(git config hooks.envelopesender) emailprefix=$(git config hooks.emailprefix || echo '[SCM] ') custom_showrev=$(git config hooks.showrev) # --- Main loop # Allow dual mode: run from the command line just like the update hook, or # if no arguments are given then run as a hook script if [ -n "$1" -a -n "$2" -a -n "$3" ]; then # Output to the terminal in command line mode - if someone wanted to # resend an email; they could redirect the output to sendmail # themselves PAGER= generate_email $2 $3 $1 else while read oldrev newrev refname do generate_email $oldrev $newrev $refname | send_mail done fi gpsd-3.15/repo/hooks/post-update0000775000175000017500000000011412460513551015026 0ustar esresr#!/bin/sh # # Custom hook for the GPSD project exec git update-server-info gpsd-3.15/repo/hooks/update-custom0000775000175000017500000000056512461156335015371 0ustar esresr# # Local customizations for git update hook begin here. # We'll need a valid absolute path before ciabot.py. # ciabot.py ${refname} $(git rev-list ${oldrev}..${newrev} | tac) cdto=$(git rev-parse --show-cdup) echo "Path to base directory: $cdto" echo "Files modified:" for filename in `git diff --name-only ${oldrev} ${newrev}` do echo "Source path: $filename" done gpsd-3.15/repo/upload0000775000175000017500000000131012461156335012725 0ustar esresr#!/bin/sh # # Upload git configuration from here to the repo # Please do not introduce bashisms into this script. # # Note: This script does not curently work. It used to, on Berlios. # We leave it here because light modifications will probably work # on may forges. # Get around the usual ssh lockout on a repo host by copying up to # the shell host and doing a local move. Written so the last # move is atomic. copy() { scp $1 $LOGNAME@shell.xyzzy.foo:STAGE ssh $LOGNAME@git.xyzzy.foo "cp -f STAGE /gitroot/gpsd && mv /gitroot/gpsd/STAGE /gitroot/gpsd/$1" } if [ $1 ] then for f in $*; do copy $f ; done else copy config for file in hooks/* do copy $file done fi # End gpsd-3.15/rtcm2_json.c0000664000175000017500000002331612506326034012777 0ustar esresr/**************************************************************************** NAME rtcm2_json.c - deserialize RTCM2 JSON DESCRIPTION This module uses the generic JSON parser to get data from RTCM2 representations to libgps structures. PERMISSIONS This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. ***************************************************************************/ #include #include #include #include #include "gpsd.h" #ifdef SOCKET_EXPORT_ENABLE #include "gps_json.h" /* common fields in every RTCM2 message */ int json_rtcm2_read(const char *buf, char *path, size_t pathlen, struct rtcm2_t *rtcm2, const char **endptr) { static char *stringptrs[NITEMS(rtcm2->words)]; 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}, \ {"device", t_string, .addr.string = path, \ .len = pathlen}, \ {"station_id", t_uinteger, .addr.uinteger = &rtcm2->refstaid}, \ {"zcount", t_real, .addr.real = &rtcm2->zcount, \ .dflt.real = NAN}, \ {"seqnum", t_uinteger, .addr.uinteger = &rtcm2->seqnum}, \ {"length", t_uinteger, .addr.uinteger = &rtcm2->length}, \ {"station_health", t_uinteger, .addr.uinteger = &rtcm2->stathlth}, int status = 0, satcount = 0; const struct json_attr_t rtcm1_satellite[] = { {"ident", t_uinteger, STRUCTOBJECT(struct gps_rangesat_t, ident)}, {"udre", t_uinteger, STRUCTOBJECT(struct gps_rangesat_t, udre)}, {"iod", t_uinteger, STRUCTOBJECT(struct gps_rangesat_t, iod)}, {"prc", t_real, STRUCTOBJECT(struct gps_rangesat_t, prc)}, {"rrc", t_real, STRUCTOBJECT(struct gps_rangesat_t, rrc)}, {NULL}, }; const struct json_attr_t json_rtcm1[] = { RTCM2_HEADER {"satellites", t_array, STRUCTARRAY(rtcm2->gps_ranges.sat, rtcm1_satellite, &satcount)}, {NULL}, }; const struct json_attr_t json_rtcm3[] = { RTCM2_HEADER {"x", t_real, .addr.real = &rtcm2->ecef.x, .dflt.real = NAN}, {"y", t_real, .addr.real = &rtcm2->ecef.y, .dflt.real = NAN}, {"z", t_real, .addr.real = &rtcm2->ecef.z, .dflt.real = NAN}, {NULL}, }; /* * Beware! Needs to stay synchronized with a corresponding * name array in the RTCM2 JSON dump code. This interpretation of * NAVSYSTEM_GALILEO is assumed from RTCM3, it's not actually * documented in RTCM 2.1. */ const struct json_enum_t system_table[] = { {"GPS", 0}, {"GLONASS", 1}, {"GALILEO", 2}, {"UNKNOWN", 3}, {NULL} }; const struct json_attr_t json_rtcm4[] = { RTCM2_HEADER {"valid", t_boolean, .addr.boolean = &rtcm2->reference.valid}, {"system", t_integer, .addr.integer = &rtcm2->reference.system, .map=system_table}, {"sense", t_integer, .addr.integer = &rtcm2->reference.sense}, {"datum", t_string, .addr.string = rtcm2->reference.datum, .len = sizeof(rtcm2->reference.datum)}, {"dx", t_real, .addr.real = &rtcm2->reference.dx, .dflt.real = NAN}, {"dy", t_real, .addr.real = &rtcm2->reference.dy, .dflt.real = NAN}, {"dz", t_real, .addr.real = &rtcm2->reference.dz, .dflt.real = NAN}, {NULL}, }; const struct json_attr_t rtcm5_satellite[] = { {"ident", t_uinteger, STRUCTOBJECT(struct consat_t, ident)}, {"iodl", t_boolean, STRUCTOBJECT(struct consat_t, iodl)}, {"health", t_uinteger, STRUCTOBJECT(struct consat_t, health)}, {"snr", t_integer, STRUCTOBJECT(struct consat_t, snr)}, {"health_en", t_boolean, STRUCTOBJECT(struct consat_t, health_en)}, {"new_data", t_boolean, STRUCTOBJECT(struct consat_t, new_data)}, {"los_warning", t_boolean, STRUCTOBJECT(struct consat_t, los_warning)}, {"tou", t_uinteger, STRUCTOBJECT(struct consat_t, tou)}, {NULL}, }; const struct json_attr_t json_rtcm5[] = { RTCM2_HEADER {"satellites", t_array, STRUCTARRAY(rtcm2->conhealth.sat, rtcm5_satellite, &satcount)}, {NULL}, }; const struct json_attr_t json_rtcm6[] = { RTCM2_HEADER // No-op or keepalive message {NULL}, }; const struct json_attr_t rtcm7_satellite[] = { {"lat", t_real, STRUCTOBJECT(struct station_t, latitude)}, {"lon", t_real, STRUCTOBJECT(struct station_t, longitude)}, {"range", t_uinteger, STRUCTOBJECT(struct station_t, range)}, {"frequency", t_real, STRUCTOBJECT(struct station_t, frequency)}, {"health", t_uinteger, STRUCTOBJECT(struct station_t, health)}, {"station_id", t_uinteger, STRUCTOBJECT(struct station_t, station_id)}, {"bitrate", t_uinteger, STRUCTOBJECT(struct station_t, bitrate)}, {NULL}, }; const struct json_attr_t json_rtcm7[] = { RTCM2_HEADER {"satellites", t_array, STRUCTARRAY(rtcm2->almanac.station, rtcm7_satellite, &satcount)}, {NULL}, }; const struct json_attr_t json_rtcm13[] = { RTCM2_HEADER {"status", t_boolean, .addr.boolean = &rtcm2->xmitter.status}, {"rangeflag", t_boolean, .addr.boolean = &rtcm2->xmitter.rangeflag}, {"lat", t_real, .addr.real = &rtcm2->xmitter.lat, .dflt.real = NAN}, {"lon", t_real, .addr.real = &rtcm2->xmitter.lon, .dflt.real = NAN}, {"range", t_uinteger, .addr.uinteger = &rtcm2->xmitter.range}, {NULL}, }; const struct json_attr_t json_rtcm14[] = { RTCM2_HEADER {"week", t_uinteger, .addr.uinteger = &rtcm2->gpstime.week}, {"hour", t_uinteger, .addr.uinteger = &rtcm2->gpstime.hour}, {"leapsecs", t_uinteger, .addr.uinteger = &rtcm2->gpstime.leapsecs}, {NULL}, }; const struct json_attr_t json_rtcm16[] = { RTCM2_HEADER {"message", t_string, .addr.string = rtcm2->message, .len = sizeof(rtcm2->message)}, {NULL}, }; const struct json_attr_t rtcm31_satellite[] = { {"ident", t_uinteger, STRUCTOBJECT(struct glonass_rangesat_t, ident)}, {"udre", t_uinteger, STRUCTOBJECT(struct glonass_rangesat_t, udre)}, {"change", t_boolean, STRUCTOBJECT(struct glonass_rangesat_t, change)}, {"tod", t_uinteger, STRUCTOBJECT(struct glonass_rangesat_t, tod)}, {"prc", t_real, STRUCTOBJECT(struct glonass_rangesat_t, prc)}, {"rrc", t_real, STRUCTOBJECT(struct glonass_rangesat_t, rrc)}, {NULL}, }; const struct json_attr_t json_rtcm31[] = { RTCM2_HEADER {"satellites", t_array, STRUCTARRAY(rtcm2->glonass_ranges.sat, rtcm31_satellite, &satcount)}, {NULL}, }; const struct json_attr_t json_rtcm2_fallback[] = { RTCM2_HEADER {"data", t_array, .addr.array.element_type = t_string, .addr.array.arr.strings.ptrs = stringptrs, .addr.array.arr.strings.store = stringstore, .addr.array.arr.strings.storelen = sizeof(stringstore), .addr.array.count = &stringcount, .addr.array.maxlen = NITEMS(stringptrs)}, {NULL}, }; #undef RTCM2_HEADER /* *INDENT-ON* */ memset(rtcm2, '\0', sizeof(struct rtcm2_t)); if (strstr(buf, "\"type\":1,") != NULL || strstr(buf, "\"type\":9,") != NULL) { status = json_read_object(buf, json_rtcm1, endptr); if (status == 0) rtcm2->gps_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); } } 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); } else if (strstr(buf, "\"type\":5,") != NULL) { status = json_read_object(buf, json_rtcm5, endptr); if (status == 0) rtcm2->conhealth.nentries = (unsigned)satcount; } else if (strstr(buf, "\"type\":6,") != NULL) { status = json_read_object(buf, json_rtcm6, endptr); } else if (strstr(buf, "\"type\":7,") != NULL) { status = json_read_object(buf, json_rtcm7, endptr); if (status == 0) rtcm2->almanac.nentries = (unsigned)satcount; } else if (strstr(buf, "\"type\":13,") != NULL) { status = json_read_object(buf, json_rtcm13, endptr); } else if (strstr(buf, "\"type\":14,") != NULL) { status = json_read_object(buf, json_rtcm14, endptr); } else if (strstr(buf, "\"type\":16,") != NULL) { status = json_read_object(buf, json_rtcm16, endptr); } else if (strstr(buf, "\"type\":31,") != NULL) { status = json_read_object(buf, json_rtcm31, endptr); if (status == 0) rtcm2->glonass_ranges.nentries = (unsigned)satcount; } else { int n; status = json_read_object(buf, json_rtcm2_fallback, endptr); 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 status; } #endif /* SOCKET_EXPORT_ENABLE */ /* rtcm2_json.c ends here */ gpsd-3.15/rtcm3_json.c0000664000175000017500000002342512506326176013010 0ustar esresr/**************************************************************************** NAME rtcm3_json.c - deserialize RTCM3 JSON DESCRIPTION This module uses the generic JSON parser to get data from RTCM3 representations to libgps structures. PERMISSIONS This file is Copyright (c) 2013 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. ***************************************************************************/ #include #include #include #include #include "gpsd.h" #ifdef SOCKET_EXPORT_ENABLE #include "gps_json.h" int json_rtcm3_read(const char *buf, char *path, size_t pathlen, struct rtcm3_t *rtcm3, const char **endptr) { static char *stringptrs[NITEMS(rtcm3->rtcmtypes.data)]; static char stringstore[sizeof(rtcm3->rtcmtypes.data) * 2]; static int stringcount; /* *INDENT-OFF* */ #define RTCM3_HEADER \ {"class", t_check, .dflt.check = "RTCM3"}, \ {"type", t_uinteger, .addr.uinteger = &rtcm3->type}, \ {"device", t_string, .addr.string = path, .len = pathlen}, \ {"length", t_uinteger, .addr.uinteger = &rtcm3->length}, int status = 0, satcount = 0; #define RTCM3FIELD(type, fld) STRUCTOBJECT(struct rtcm3_ ## type ## _t, fld) const struct json_attr_t rtcm1001_satellite[] = { {"ident", t_uinteger, RTCM3FIELD(1001, ident)}, {"ind", t_uinteger, RTCM3FIELD(1001, L1.indicator)}, {"prange", t_real, RTCM3FIELD(1001, L1.pseudorange)}, {"delta", t_real, RTCM3FIELD(1001, L1.rangediff)}, {"lockt", t_uinteger, RTCM3FIELD(1001, L1.locktime)}, {NULL}, }; const struct json_attr_t rtcm1002_satellite[] = { {"ident", t_uinteger, RTCM3FIELD(1002, ident)}, {"ind", t_uinteger, RTCM3FIELD(1002, L1.indicator)}, {"prange", t_real, RTCM3FIELD(1002, L1.pseudorange)}, {"delta", t_real, RTCM3FIELD(1002, L1.rangediff)}, {"lockt", t_uinteger, RTCM3FIELD(1002, L1.locktime)}, {"amb", t_uinteger, RTCM3FIELD(1002, L1.ambiguity)}, {"CNR", t_real, RTCM3FIELD(1002, L1.CNR)}, {NULL}, }; const struct json_attr_t rtcm1009_satellite[] = { {"ident", t_uinteger, RTCM3FIELD(1009, ident)}, {"ind", t_uinteger, RTCM3FIELD(1009, L1.indicator)}, {"channel", t_uinteger, RTCM3FIELD(1009, L1.channel)}, {"prange", t_real, RTCM3FIELD(1009, L1.pseudorange)}, {"delta", t_real, RTCM3FIELD(1009, L1.rangediff)}, {"lockt", t_uinteger, RTCM3FIELD(1009, L1.locktime)}, {NULL}, }; const struct json_attr_t rtcm1010_satellite[] = { {"ident", t_uinteger, RTCM3FIELD(1010, ident)}, {"ind", t_uinteger, RTCM3FIELD(1010, L1.indicator)}, {"channel", t_uinteger, RTCM3FIELD(1010, L1.channel)}, {"prange", t_real, RTCM3FIELD(1010, L1.pseudorange)}, {"delta", t_real, RTCM3FIELD(1010, L1.rangediff)}, {"lockt", t_uinteger, RTCM3FIELD(1010, L1.locktime)}, {"amb", t_uinteger, RTCM3FIELD(1010, L1.ambiguity)}, {"CNR", t_real, RTCM3FIELD(1010, L1.CNR)}, {NULL}, }; #undef RTCM3FIELD #define R1001 &rtcm3->rtcmtypes.rtcm3_1001.header const struct json_attr_t json_rtcm1001[] = { RTCM3_HEADER {"station_id", t_uinteger, .addr.uinteger = R1001.station_id}, {"tow", t_uinteger, .addr.uinteger = (unsigned int *)R1001.tow}, {"sync", t_boolean, .addr.boolean = R1001.sync}, {"smoothing", t_boolean, .addr.boolean = R1001.smoothing}, {"interval", t_uinteger, .addr.uinteger = R1001.interval}, {"satellites", t_array, STRUCTARRAY(rtcm3->rtcmtypes.rtcm3_1001.rtk_data, rtcm1001_satellite, &satcount)}, {NULL}, }; #undef R1001 #define R1002 &rtcm3->rtcmtypes.rtcm3_1002.header const struct json_attr_t json_rtcm1002[] = { RTCM3_HEADER {"station_id", t_uinteger, .addr.uinteger = R1002.station_id}, {"tow", t_uinteger, .addr.uinteger = (unsigned int *)R1002.tow}, {"sync", t_boolean, .addr.boolean = R1002.sync}, {"smoothing", t_boolean, .addr.boolean = R1002.smoothing}, {"interval", t_uinteger, .addr.uinteger = R1002.interval}, {"satellites", t_array, STRUCTARRAY(rtcm3->rtcmtypes.rtcm3_1002.rtk_data, rtcm1002_satellite, &satcount)}, {NULL}, }; #undef R1002 #define R1007 rtcm3->rtcmtypes.rtcm3_1007 const struct json_attr_t json_rtcm1007[] = { RTCM3_HEADER {"station_id", t_uinteger, .addr.uinteger = &R1007.station_id}, {"desc", t_string, .addr.string = R1007.descriptor, .len = sizeof(R1007.descriptor)}, {"setup_id", t_uinteger, .addr.uinteger = &R1007.setup_id}, {NULL}, }; #undef R1002 #define R1008 rtcm3->rtcmtypes.rtcm3_1008 const struct json_attr_t json_rtcm1008[] = { RTCM3_HEADER {"station_id", t_uinteger, .addr.uinteger = &R1008.station_id}, {"desc", t_string, .addr.string = R1008.descriptor, .len = sizeof(R1008.descriptor)}, {"setup_id", t_uinteger, .addr.uinteger = &R1008.setup_id}, {"serial", t_string, .addr.string = R1008.serial, .len = sizeof(R1008.serial)}, {NULL}, }; #undef R1008 #define R1009 &rtcm3->rtcmtypes.rtcm3_1009.header const struct json_attr_t json_rtcm1009[] = { RTCM3_HEADER {"station_id", t_uinteger, .addr.uinteger = R1009.station_id}, {"tow", t_uinteger, .addr.uinteger = (unsigned int *)R1009.tow}, {"sync", t_boolean, .addr.boolean = R1009.sync}, {"smoothing", t_boolean, .addr.boolean = R1009.smoothing}, {"interval", t_uinteger, .addr.uinteger = R1009.interval}, {"satellites", t_array, STRUCTARRAY(rtcm3->rtcmtypes.rtcm3_1009.rtk_data, rtcm1009_satellite, &satcount)}, {NULL}, }; #undef R1010 #define R1010 &rtcm3->rtcmtypes.rtcm3_1010.header const struct json_attr_t json_rtcm1010[] = { RTCM3_HEADER {"station_id", t_uinteger, .addr.uinteger = R1010.station_id}, {"tow", t_uinteger, .addr.uinteger = (unsigned int *)R1010.tow}, {"sync", t_boolean, .addr.boolean = R1010.sync}, {"smoothing", t_boolean, .addr.boolean = R1010.smoothing}, {"interval", t_uinteger, .addr.uinteger = R1010.interval}, {"satellites", t_array, STRUCTARRAY(rtcm3->rtcmtypes.rtcm3_1010.rtk_data, rtcm1010_satellite, &satcount)}, {NULL}, }; #undef R1010 #define R1014 &rtcm3->rtcmtypes.rtcm3_1014 const struct json_attr_t json_rtcm1014[] = { RTCM3_HEADER {"netid", t_uinteger, .addr.uinteger = R1014.network_id}, {"subnetid", t_uinteger, .addr.uinteger = R1014.subnetwork_id}, {"statcount", t_uinteger, .addr.uinteger = R1014.stationcount}, {"master", t_uinteger, .addr.uinteger = R1014.master_id}, {"aux", t_uinteger, .addr.uinteger = R1014.aux_id}, {"lat", t_real, .addr.real = R1014.d_lat}, {"lon", t_real, .addr.real = R1014.d_lon}, {"alt", t_real, .addr.real = R1014.d_alt}, {NULL}, }; #undef R1014 #define R1033 rtcm3->rtcmtypes.rtcm3_1033 const struct json_attr_t json_rtcm1033[] = { RTCM3_HEADER {"station_id", t_uinteger, .addr.uinteger = &R1033.station_id}, {"desc", t_string, .addr.string = R1033.descriptor, .len = sizeof(R1033.descriptor)}, {"setup_id", t_uinteger, .addr.uinteger = &R1033.setup_id}, {"serial", t_string, .addr.string = R1033.serial, .len = sizeof(R1033.serial)}, {"receiver", t_string, .addr.string = R1033.receiver, .len = sizeof(R1033.receiver)}, {"firmware", t_string, .addr.string = R1033.firmware, .len = sizeof(R1033.firmware)}, {NULL}, }; #undef R1033 const struct json_attr_t json_rtcm3_fallback[] = { RTCM3_HEADER {"data", t_array, .addr.array.element_type = t_string, .addr.array.arr.strings.ptrs = stringptrs, .addr.array.arr.strings.store = stringstore, .addr.array.arr.strings.storelen = sizeof(stringstore), .addr.array.count = &stringcount, .addr.array.maxlen = NITEMS(stringptrs)}, {NULL}, }; #undef RTCM3_HEADER /* *INDENT-ON* */ memset(rtcm3, '\0', sizeof(struct rtcm3_t)); if (strstr(buf, "\"type\":1001,") != NULL) { status = json_read_object(buf, json_rtcm1001, endptr); if (status == 0) rtcm3->rtcmtypes.rtcm3_1001.header.satcount = (unsigned short)satcount; } else if (strstr(buf, "\"type\":1002,") != NULL) { status = json_read_object(buf, json_rtcm1002, endptr); if (status == 0) rtcm3->rtcmtypes.rtcm3_1002.header.satcount = (unsigned short)satcount; } else if (strstr(buf, "\"type\":1007,") != NULL) { status = json_read_object(buf, json_rtcm1007, endptr); } else if (strstr(buf, "\"type\":1008,") != NULL) { status = json_read_object(buf, json_rtcm1008, endptr); } else if (strstr(buf, "\"type\":1009,") != NULL) { status = json_read_object(buf, json_rtcm1009, endptr); } else if (strstr(buf, "\"type\":1010,") != NULL) { status = json_read_object(buf, json_rtcm1010, endptr); } else if (strstr(buf, "\"type\":1014,") != NULL) { status = json_read_object(buf, json_rtcm1014, endptr); } else if (strstr(buf, "\"type\":1033,") != NULL) { status = json_read_object(buf, json_rtcm1033, endptr); } else { int n; status = json_read_object(buf, json_rtcm3_fallback, endptr); for (n = 0; n < NITEMS(rtcm3->rtcmtypes.data); n++) { if (n >= stringcount) { rtcm3->rtcmtypes.data[n] = '\0'; } else { unsigned int u; int fldcount = sscanf(stringptrs[n], "0x%02x\n", &u); if (fldcount != 1) return JSON_ERR_MISC; else rtcm3->rtcmtypes.data[n] = (char)u; } } } return status; } #endif /* SOCKET_EXPORT_ENABLE */ /* rtcm3_json.c ends here */ gpsd-3.15/sd_socket.c0000664000175000017500000000116212506331071012665 0ustar esresr/* * This file is Copyright (c) 2011 by Eckhart Wörner * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include "sd_socket.h" int sd_get_socket_count(void) { unsigned long n; const char* env; env = getenv("LISTEN_PID"); if (!env) return 0; n = strtoul(env, NULL, 10); if (n == ULONG_MAX || (pid_t)n != getpid()) return 0; env = getenv("LISTEN_FDS"); if (!env) return 0; n = strtoul(env, NULL, 10); if (n == ULONG_MAX) return 0; return (int)n; } gpsd-3.15/sd_socket.h0000664000175000017500000000040612506317045012677 0ustar esresr/* * This file is Copyright (c) 2011 by Eckhart Wörner * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef GPSD_SD_SOCKET_H #define GPSD_SD_SOCKET_H #define SD_SOCKET_FDS_START 3 int sd_get_socket_count(void); #endif gpsd-3.15/serial.c0000600000175000017500000005757712532625515012211 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include /* defines BSD */ #include "gpsd_config.h" #ifdef ENABLE_BLUEZ #include #include #include #include #endif /* ENABLE_BLUEZ */ #include "gpsd.h" /* Workaround for HP-UX 11.23, which is missing CRTSCTS */ #ifndef CRTSCTS # ifdef CNEW_RTSCTS # define CRTSCTS CNEW_RTSCTS # else # define CRTSCTS 0 # 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; /* this assumes we won't get UDP from a filesystem socket */ else if (S_ISSOCK(sb.st_mode)) return source_tcp; /* OS-independent check for ptys using Unix98 naming convention */ else if (strncmp(path, "/dev/pts/", 9) == 0) return source_pty; else if (strncmp(path, "/dev/pps", 8) == 0) return source_pps; else if (S_ISCHR(sb.st_mode)) { sourcetype_t devtype = source_rs232; #ifdef __linux__ /* Linux major device numbers live here * * https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/devices.txt * * Note: This code works because Linux major device numbers are * stable and architecture-independent. It is *not* a good model * for other Unixes where either or both assumptions may break. */ int devmajor = major(sb.st_rdev); /* 207 are Freescale i.MX UARTs (ttymxc*) */ if (devmajor == 4 || devmajor == 204 || devmajor == 207) devtype = source_rs232; else if (devmajor == 188 || devmajor == 166) devtype = source_usb; else if (devmajor == 216 || devmajor == 217) devtype = source_bluetooth; else if (devmajor == 3 || (devmajor >= 136 && devmajor <= 143)) devtype = source_pty; #endif /* __linux__ */ /* * See http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system * for discussion how this works. Key graphs: * * Compilers for the old BSD base for these distributions * defined the __bsdi__ macro, but none of these distributions * define it now. This leaves no generic "BSD" macro defined * by the compiler itself, but all UNIX-style OSes provide a * file. On BSD distributions, and only on BSD * distributions, this file defines a BSD macro that's set to * the OS version. Checking for this generic macro is more * robust than looking for known BSD distributions with * __DragonFly__, __FreeBSD__, __NetBSD__, and __OpenBSD__ * macros. * * Apple's OSX for the Mac and iOS for iPhones and iPads are * based in part on a fork of FreeBSD distributed as * Darwin. As such, OSX and iOS also define the BSD macro * within . However, compilers for OSX, iOS, and * Darwin do not define __unix__. To detect all BSD OSes, * including OSX, iOS, and Darwin, use an #if/#endif that * checks for __unix__ along with __APPLE__ and __MACH__ (see * the later section on OSX and iOS). */ #ifdef BSD /* * Hacky check for pty, which is what really matters for avoiding * adaptive delay. */ if (strncmp(path, "/dev/ttyp", 9) == 0 || strncmp(path, "/dev/ttyq", 9) == 0) devtype = source_pty; else if (strncmp(path, "/dev/ttyU", 9) == 0 || strncmp(path, "/dev/dtyU", 9) == 0) devtype = source_usb; /* XXX bluetooth */ #endif /* BSD */ return devtype; } else return source_unknown; } #ifdef __linux__ #include #include static int fusercount(const char *path) /* return true if any process has the specified path open */ { DIR *procd, *fdd; struct dirent *procentry, *fdentry; char procpath[32], fdpath[64], linkpath[64]; int cnt = 0; if ((procd = opendir("/proc")) == NULL) return -1; while ((procentry = readdir(procd)) != NULL) { if (isdigit(procentry->d_name[0])==0) continue; (void)snprintf(procpath, sizeof(procpath), "/proc/%s/fd/", procentry->d_name); if ((fdd = opendir(procpath)) == NULL) continue; while ((fdentry = readdir(fdd)) != NULL) { (void)strlcpy(fdpath, procpath, sizeof(fdpath)); (void)strlcat(fdpath, fdentry->d_name, sizeof(fdpath)); (void)memset(linkpath, '\0', sizeof(linkpath)); if (readlink(fdpath, linkpath, sizeof(linkpath)) == -1) continue; if (strcmp(linkpath, path) == 0) { ++cnt; } } (void)closedir(fdd); } (void)closedir(procd); return cnt; } #endif /* __linux__ */ void gpsd_tty_init(struct gps_device_t *session) /* to be called on allocating a device */ { /* mark GPS fd closed and its baud rate unknown */ session->gpsdata.gps_fd = -1; session->saved_baud = -1; session->zerokill = false; session->reawake = (time_t)0; } #if defined(__CYGWIN__) /* Workaround for Cygwin, which is missing cfmakeraw */ /* 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_oflag &= ~OPOST; termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); termios_p->c_cflag &= ~(CSIZE | PARENB); termios_p->c_cflag |= CS8; } #endif /* defined(__CYGWIN__) */ static speed_t gpsd_get_speed_termios(const struct termios *ttyctl) { speed_t code = cfgetospeed(ttyctl); switch (code) { 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); case B115200: return (115200); case B230400: return (230400); default: /* B0 */ return 0; } } speed_t gpsd_get_speed(const struct gps_device_t *dev) { return gpsd_get_speed_termios(&dev->ttyset); } speed_t gpsd_get_speed_old(const struct gps_device_t *dev) { return gpsd_get_speed_termios(&dev->ttyset_old); } char gpsd_get_parity(const struct gps_device_t *dev) { char parity = 'N'; if ((dev->ttyset.c_cflag & (PARENB | PARODD)) == (PARENB | PARODD)) parity = 'O'; else if ((dev->ttyset.c_cflag & PARENB) == PARENB) parity = 'E'; return parity; } int gpsd_get_stopbits(const struct gps_device_t *dev) { int stopbits = 0; if ((dev->ttyset.c_cflag & CS8) == CS8) stopbits = 1; else if ((dev->ttyset.c_cflag & (CS7 | CSTOPB)) == (CS7 | CSTOPB)) stopbits = 2; return stopbits; } bool gpsd_set_raw(struct gps_device_t * session) { (void)cfmakeraw(&session->ttyset); if (tcsetattr(session->gpsdata.gps_fd, TCIOFLUSH, &session->ttyset) == -1) { gpsd_log(&session->context->errout, LOG_ERROR, "error changing port attributes: %s\n", strerror(errno)); return false; } return true; } void gpsd_set_speed(struct gps_device_t *session, speed_t speed, char parity, unsigned int stopbits) { speed_t rate; /* * Yes, you can set speeds that aren't in the hunt loop. If you * do this, and you aren't on Linux where baud rate is preserved * across port closings, you've screwed yourself. Don't do that! */ if (speed < 300) rate = B0; else if (speed < 1200) rate = B300; else if (speed < 2400) rate = B1200; else if (speed < 4800) rate = B2400; else if (speed < 9600) rate = B4800; else if (speed < 19200) rate = B9600; else if (speed < 38400) rate = B19200; else if (speed < 57600) rate = B38400; else if (speed < 115200) rate = B57600; else if (speed < 230400) rate = B115200; else rate = B230400; 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 * to leave the port speed at whatever it currently is. This leads * to excellent behavior on Linux, which preserves baudrate across * serial device closes - it means that if you've opended this * device before you typically don't have to hunt at all because * it's still at the same speed you left it - you'll typically * get packet lock within 1.5 seconds. Alas, the BSDs and OS X * aren't so nice. */ if (rate != B0) { (void)cfsetispeed(&session->ttyset, rate); (void)cfsetospeed(&session->ttyset, rate); } 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; session->ttyset.c_cflag |= PARENB; break; case 'O': case (char)1: session->ttyset.c_iflag |= INPCK; session->ttyset.c_cflag |= PARENB | PARODD; break; } if (tcsetattr(session->gpsdata.gps_fd, TCSANOW, &session->ttyset) != 0) return; /* * Serious black magic begins here. Getting this code wrong can cause * failures to lock to a correct speed, and not clean reproducible * failures but flukey hardware- and timing-dependent ones. So * be very sure you know what you're doing before hacking it, and * test thoroughly. * * The fundamental problem here is that serial devices take time * to settle into a new baud rate after tcsetattr() is issued. Until * they do so, input will be arbitarily garbled. Normally this * is not a big problem, but in our hunt loop the garbling can trash * a long enough prefix of each sample to prevent detection of a * packet header. We could address the symptom by making the sample * size enough larger that subtracting the maximum length of garble * would still leave a sample longer than the maximum packet size. * But it's better (and more efficient) to address the disease. * * In theory, one might think that not even a tcflush() call would * be needed, with tcsetattr() delaying its return until the device * is in a good state. For simple devices like a 14550 UART that * have fixed response timings this may even work, if the driver * writer was smart enough to delay the return by the right number * 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 * 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 * data in its own FIFO. In this case the expected delay may be * too large and too variable (depending on the details of how the * USB device is integrated with its symbiont hardware) to be put * in the driver. * * So, somehow, we have to introduce a delay after tcsatattr() * returns sufficient to allow *any* device to settle. On the other * hand, a really long delay will make gpsd device registration * unpleasantly laggy. * * The classic way to address this is with a tcflush(), counting * on it to clear the device FIFO. But that call may clear only the * kernel buffers, not the device's hardware FIFO, so it may not * be sufficient by itself. * * flush followed by a 200-millisecond delay followed by flush has * been found to work reliably on the pl2303. It is also known * from testing that a 100-millisec delay is too short, allowing * occasional failure to lock. */ (void)tcflush(session->gpsdata.gps_fd, TCIOFLUSH); (void)usleep(200000); (void)tcflush(session->gpsdata.gps_fd, TCIOFLUSH); } gpsd_log(&session->context->errout, LOG_INF, "speed %lu, %d%c%d\n", (unsigned long)gpsd_get_speed(session), 9 - stopbits, parity, stopbits); session->gpsdata.dev.baudrate = (unsigned int)speed; session->gpsdata.dev.parity = parity; session->gpsdata.dev.stopbits = stopbits; /* * The device might need a wakeup string before it will send data. * If we don't know the device type, ship it every driver's wakeup * in hopes it will respond. But not to USB or Bluetooth, because * shipping probe strings to unknown USB serial adaptors or * Bluetooth devices may spam devices that aren't GPSes at all and * could become confused. */ if (!session->context->readonly && session->sourcetype != source_usb && session->sourcetype != source_bluetooth) { if (isatty(session->gpsdata.gps_fd) != 0 && !session->context->readonly) { if (session->device_type == NULL) { const struct gps_type_t **dp; for (dp = gpsd_drivers; *dp; dp++) if ((*dp)->event_hook != NULL) (*dp)->event_hook(session, event_wakeup); } else if (session->device_type->event_hook != NULL) session->device_type->event_hook(session, event_wakeup); } } packet_reset(&session->lexer); } int gpsd_serial_open(struct gps_device_t *session) /* open a device for access to its data * return: the opened file descriptor * PLACEHOLDING_FD - for /dev/ppsX * UNALLOCATED_FD - for open failure */ { mode_t mode = (mode_t) O_RDWR; session->sourcetype = gpsd_classify(session->gpsdata.dev.path); session->servicetype = service_sensor; /* we may need to hold on to this slot without opening the device */ if (source_pps == session->sourcetype) { (void)gpsd_switch_driver(session, "PPS"); return PLACEHOLDING_FD; } if (session->context->readonly || (session->sourcetype <= source_blockdev)) { mode = (mode_t) O_RDONLY; gpsd_log(&session->context->errout, LOG_INF, "opening read-only GPS data source type %d and at '%s'\n", (int)session->sourcetype, session->gpsdata.dev.path); } else { gpsd_log(&session->context->errout, LOG_INF, "opening GPS data source type %d at '%s'\n", (int)session->sourcetype, session->gpsdata.dev.path); } #ifdef ENABLE_BLUEZ if (bachk(session->gpsdata.dev.path) == 0) { struct sockaddr_rc addr = { 0, *BDADDR_ANY, 0}; session->gpsdata.gps_fd = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); addr.rc_family = AF_BLUETOOTH; addr.rc_channel = (uint8_t) 1; (void) str2ba(session->gpsdata.dev.path, &addr.rc_bdaddr); if (connect(session->gpsdata.gps_fd, (struct sockaddr *) &addr, sizeof (addr)) == -1) { if (errno != EINPROGRESS && errno != EAGAIN) { (void)close(session->gpsdata.gps_fd); gpsd_log(&session->context->errout, LOG_ERROR, "bluetooth socket connect failed: %s\n", strerror(errno)); return UNALLOCATED_FD; } gpsd_log(&session->context->errout, LOG_ERROR, "bluetooth socket connect in progress or again : %s\n", strerror(errno)); } (void)fcntl(session->gpsdata.gps_fd, F_SETFL, (int)mode); gpsd_log(&session->context->errout, LOG_PROG, "bluez device open success: %s %s\n", session->gpsdata.dev.path, strerror(errno)); } else #endif /* BLUEZ */ { /* * We open with O_NONBLOCK because we want to now get hung if * the clocal flag is off, but we don't want to stay in that mode. */ if ((session->gpsdata.gps_fd = open(session->gpsdata.dev.path, (int)(mode | O_NONBLOCK | O_NOCTTY))) == -1) { gpsd_log(&session->context->errout, LOG_ERROR, "device open of %s failed: %s - retrying read-only\n", session->gpsdata.dev.path, strerror(errno)); if ((session->gpsdata.gps_fd = open(session->gpsdata.dev.path, O_RDONLY | O_NONBLOCK | O_NOCTTY)) == -1) { gpsd_log(&session->context->errout, LOG_ERROR, "read-only device open of %s failed: %s\n", session->gpsdata.dev.path, strerror(errno)); return UNALLOCATED_FD; } gpsd_log(&session->context->errout, LOG_PROG, "file device open of %s succeeded: %s\n", session->gpsdata.dev.path, strerror(errno)); } } /* * Ideally we want to exclusion-lock the device before doing any reads. * It would have been best to do this at open(2) time, but O_EXCL * doesn't work without O_CREAT. * * We have to make an exception for ptys, which are intentionally * opened by another process on the master side, otherwise we'll * break all our regression tests. * * We also exclude bluetooth device because the bluetooth daemon opens them. */ if (!(session->sourcetype == source_pty || session->sourcetype == source_bluetooth)) { #ifdef TIOCEXCL /* * Try to block other processes from using this device while we * have it open (later opens should return EBUSY). Won't work * against anything with root privileges, alas. */ (void)ioctl(session->gpsdata.gps_fd, (unsigned long)TIOCEXCL); #endif /* TIOCEXCL */ #ifdef __linux__ /* * Don't touch devices already opened by another process. */ if (fusercount(session->gpsdata.dev.path) > 1) { gpsd_log(&session->context->errout, LOG_ERROR, "%s already opened by another process\n", session->gpsdata.dev.path); (void)close(session->gpsdata.gps_fd); session->gpsdata.gps_fd = UNALLOCATED_FD; return UNALLOCATED_FD; } #endif /* __linux__ */ } #ifdef FIXED_PORT_SPEED session->saved_baud = FIXED_PORT_SPEED; #endif if (session->saved_baud != -1) { (void)cfsetispeed(&session->ttyset, (speed_t)session->saved_baud); (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->lexer.type = BAD_PACKET; if (isatty(session->gpsdata.gps_fd) != 0) { /* Save original terminal parameters */ if (tcgetattr(session->gpsdata.gps_fd, &session->ttyset_old) != 0) return UNALLOCATED_FD; session->ttyset = session->ttyset_old; memset(session->ttyset.c_cc, 0, sizeof(session->ttyset.c_cc)); //session->ttyset.c_cc[VTIME] = 1; /* * Tip from Chris Kuethe: the FIDI chip used in the Trip-Nav * 200 (and possibly other USB GPSes) gets completely hosed * in the presence of flow control. Thus, turn off CRTSCTS. * * This is not ideal. Setting no parity here will mean extra * initialization time for some devices, like certain Trimble * boards, that want 7O2 or other non-8N1 settings. But starting * the hunt loop at 8N1 will minimize the average sync time * over all devices. */ session->ttyset.c_cflag &= ~(PARENB | PARODD | CRTSCTS | CSTOPB); session->ttyset.c_cflag |= CREAD | CLOCAL; session->ttyset.c_iflag = session->ttyset.c_oflag = session->ttyset.c_lflag = (tcflag_t) 0; #ifndef FIXED_PORT_SPEED session->baudindex = 0; #endif /* FIXED_PORT_SPEED */ gpsd_set_speed(session, #ifdef FIXED_PORT_SPEED FIXED_PORT_SPEED, #else gpsd_get_speed_old(session), #endif /* FIXED_PORT_SPEED */ 'N', #ifdef FIXED_STOP_BITS FIXED_STOP_BITS #else 1 #endif /* FIXED_STOP_BITS */ ); } /* Switch back to blocking I/O now that CLOCAL is set. */ { int oldfl = fcntl(session->gpsdata.gps_fd, F_GETFL); if (oldfl != -1) (void)fcntl(session->gpsdata.gps_fd, F_SETFL, oldfl & ~O_NONBLOCK); } /* required so parity field won't be '\0' if saved speed matches */ if (session->sourcetype <= source_blockdev) { session->gpsdata.dev.parity = 'N'; session->gpsdata.dev.stopbits = 1; } gpsd_log(&session->context->errout, LOG_SPIN, "open(%s) -> %d in gpsd_serial_open()\n", session->gpsdata.dev.path, session->gpsdata.gps_fd); return session->gpsdata.gps_fd; } ssize_t gpsd_serial_write(struct gps_device_t * session, const char *buf, const size_t len) { 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); /* extra guard prevents expensive hexdump calls */ if (session->context->errout.debug >= LOG_IO) { char scratchbuf[MAX_PACKET_LENGTH*2+1]; gpsd_log(&session->context->errout, LOG_IO, "=> GPS: %s%s\n", gpsd_packetdump(scratchbuf, sizeof(scratchbuf), (char *)buf, len), ok ? "" : " FAILED"); } return status; } /* * This constant controls how long the packet sniffer will spend looking * for a packet leader before it gives up. It *must* be larger than * MAX_PACKET_LENGTH or we risk never syncing up at all. Large values * will produce annoying startup lag. */ #define SNIFF_RETRIES (MAX_PACKET_LENGTH + 128) bool gpsd_next_hunt_setting(struct gps_device_t * session) /* advance to the next hunt setting */ { /* don't waste time in the hunt loop if this is not actually a tty */ if (isatty(session->gpsdata.gps_fd) == 0) return false; /* ...or if it's nominally a tty but delivers only PPS and no data */ if (session->sourcetype == source_pps) return false; if (session->lexer.retry_counter++ >= SNIFF_RETRIES) { #ifdef FIXED_PORT_SPEED return false; #else /* every rate we're likely to see on a GPS */ static unsigned int rates[] = { 0, 4800, 9600, 19200, 38400, 57600, 115200, 230400}; if (session->baudindex++ >= (unsigned int)(sizeof(rates) / sizeof(rates[0])) - 1) { session->baudindex = 0; #ifdef FIXED_STOP_BITS return false; /* hunt is over, no sync */ #else if (session->gpsdata.dev.stopbits++ >= 2) return false; /* hunt is over, no sync */ #endif /* FIXED_STOP_BITS */ } #endif /* FIXED_PORT_SPEED */ // cppcheck-suppress unreachableCode gpsd_set_speed(session, #ifdef FIXED_PORT_SPEED FIXED_PORT_SPEED, #else rates[session->baudindex], #endif /* FIXED_PORT_SPEED */ session->gpsdata.dev.parity, #ifdef FIXED_STOP_BITS FIXED_STOP_BITS #else session->gpsdata.dev.stopbits #endif /* FIXED_STOP_BITS */ ); session->lexer.retry_counter = 0; } return true; /* keep hunting */ } void gpsd_assert_sync(struct gps_device_t *session) /* to be called when we want to register that we've synced with a device */ { /* * We've achieved first sync with the device. Remember the * baudrate so we can try it first next time this device * is opened. */ if (session->saved_baud == -1) session->saved_baud = (int)cfgetispeed(&session->ttyset); } void gpsd_close(struct gps_device_t *session) { if (!BAD_SOCKET(session->gpsdata.gps_fd)) { #ifdef TIOCNXCL (void)ioctl(session->gpsdata.gps_fd, (unsigned long)TIOCNXCL); #endif /* TIOCNXCL */ (void)tcdrain(session->gpsdata.gps_fd); if (isatty(session->gpsdata.gps_fd) != 0) { /* force hangup on close on systems that don't do HUPCL properly */ (void)cfsetispeed(&session->ttyset, (speed_t) B0); (void)cfsetospeed(&session->ttyset, (speed_t) B0); (void)tcsetattr(session->gpsdata.gps_fd, TCSANOW, &session->ttyset); } /* this is the clean way to do it */ session->ttyset_old.c_cflag |= HUPCL; /* * Don't revert the serial parameters if we didn't have to mess with * them the first time. Economical, and avoids tripping over an * obscure Linux 2.6 kernel bug that disables threaded * ioctl(TIOCMWAIT) on a device after tcsetattr() is called. */ if (cfgetispeed(&session->ttyset_old) != cfgetispeed(&session->ttyset) || (session->ttyset_old.c_cflag & CSTOPB) != (session->ttyset.c_cflag & CSTOPB)) { /* * If we revert, keep the most recent baud rate. * Cuts down on autobaud overhead the next time. */ (void)cfsetispeed(&session->ttyset_old, (speed_t) session->gpsdata.dev.baudrate); (void)cfsetospeed(&session->ttyset_old, (speed_t) session->gpsdata.dev.baudrate); (void)tcsetattr(session->gpsdata.gps_fd, TCSANOW, &session->ttyset_old); } gpsd_log(&session->context->errout, 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; } } gpsd-3.15/shared_json.c0000664000175000017500000001003212506323263013206 0ustar esresr/**************************************************************************** NAME shared_json.c - move data between in-core and JSON structures DESCRIPTION This module uses the generic JSON parser to get data from JSON representations to gps.h structures. These functions are used in both the daemon and the client library. PERMISSIONS Written by Eric S. Raymond, 2009 This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. ***************************************************************************/ #include #include #include /* for time_t */ #include "gpsd.h" #ifdef SOCKET_EXPORT_ENABLE #include "gps_json.h" int json_device_read(const char *buf, struct devconfig_t *dev, const char **endptr) { char tbuf[JSON_DATE_MAX+1]; /* *INDENT-OFF* */ const struct json_attr_t json_attrs_device[] = { {"class", t_check, .dflt.check = "DEVICE"}, {"path", t_string, .addr.string = dev->path, .len = sizeof(dev->path)}, {"activated", t_string, .addr.string = tbuf, .len = sizeof(tbuf)}, {"activated", t_real, .addr.real = &dev->activated}, {"flags", t_integer, .addr.integer = &dev->flags}, {"driver", t_string, .addr.string = dev->driver, .len = sizeof(dev->driver)}, {"subtype", t_string, .addr.string = dev->subtype, .len = sizeof(dev->subtype)}, {"native", t_integer, .addr.integer = &dev->driver_mode, .dflt.integer = DEVDEFAULT_NATIVE}, {"bps", t_uinteger, .addr.uinteger = &dev->baudrate, .dflt.uinteger = DEVDEFAULT_BPS}, {"parity", t_character, .addr.character = &dev->parity, .dflt.character = DEVDEFAULT_PARITY}, {"stopbits", t_uinteger, .addr.uinteger = &dev->stopbits, .dflt.uinteger = DEVDEFAULT_STOPBITS}, {"cycle", t_real, .addr.real = &dev->cycle, .dflt.real = NAN}, {"mincycle", t_real, .addr.real = &dev->mincycle, .dflt.real = NAN}, {NULL}, }; /* *INDENT-ON* */ int status; tbuf[0] = '\0'; status = json_read_object(buf, json_attrs_device, endptr); if (status != 0) return status; if (isnan(dev->activated)!=0) { if (tbuf[0] == '\0') dev->activated = NAN; else dev->activated = iso8601_to_unix(tbuf); } return 0; } int json_watch_read(const char *buf, struct policy_t *ccp, const char **endptr) { bool dummy_pps_flag; /* *INDENT-OFF* */ struct json_attr_t chanconfig_attrs[] = { {"class", t_check, .dflt.check = "WATCH"}, {"enable", t_boolean, .addr.boolean = &ccp->watcher, .dflt.boolean = true}, {"json", t_boolean, .addr.boolean = &ccp->json, .nodefault = true}, {"raw", t_integer, .addr.integer = &ccp->raw, .nodefault = true}, {"nmea", t_boolean, .addr.boolean = &ccp->nmea, .nodefault = true}, {"scaled", t_boolean, .addr.boolean = &ccp->scaled}, {"timing", t_boolean, .addr.boolean = &ccp->timing}, {"split24", t_boolean, .addr.boolean = &ccp->split24}, {"pps", t_boolean, .addr.boolean = &ccp->pps}, {"device", t_string, .addr.string = ccp->devpath, .len = sizeof(ccp->devpath)}, {"remote", t_string, .addr.string = ccp->remote, .len = sizeof(ccp->remote)}, {"pps", t_boolean, .addr.boolean = &dummy_pps_flag, .nodefault = false}, {NULL}, }; /* *INDENT-ON* */ int status; status = json_read_object(buf, chanconfig_attrs, endptr); return status; } #endif /* SOCKET_EXPORT_ENABLE */ /* shared_json.c ends here */ gpsd-3.15/shmexport.c0000664000175000017500000000614712517676436012773 0ustar esresr/**************************************************************************** NAME shmexport.c - shared-memory export from the daemon DESCRIPTION This is a very lightweight alternative to JSON-over-sockets. Clients won't be able to filter by device, and won't get device activation/deactivation notifications. But both client and daemon will avoid all the marshalling and unmarshalling overhead. PERMISSIONS This file is Copyright (c) 2010 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. ***************************************************************************/ #include /* for time_t */ #include "gpsd_config.h" #ifdef SHM_EXPORT_ENABLE #include #include #include #include #include #include #include #include "gpsd.h" #include "libgps.h" /* for SHM_PSEUDO_FD */ bool shm_acquire(struct gps_context_t *context) /* initialize the shared-memory segment to be used for export */ { long shmkey = getenv("GPSD_SHM_KEY") ? strtol(getenv("GPSD_SHM_KEY"), NULL, 0) : GPSD_SHM_KEY; int shmid = shmget((key_t)shmkey, sizeof(struct shmexport_t), (int)(IPC_CREAT|0666)); if (shmid == -1) { gpsd_log(&context->errout, LOG_ERROR, "shmget(0x%lx, %zd, 0666) for SHM export failed: %s\n", shmkey, sizeof(struct shmexport_t), strerror(errno)); return false; } else gpsd_log(&context->errout, LOG_PROG, "shmget(0x%lx, %zd, 0666) for SHM export succeeded\n", shmkey, sizeof(struct shmexport_t)); context->shmexport = (void *)shmat(shmid, 0, 0); if ((int)(long)context->shmexport == -1) { gpsd_log(&context->errout, LOG_ERROR, "shmat failed: %s\n", strerror(errno)); context->shmexport = NULL; return false; } gpsd_log(&context->errout, LOG_PROG, "shmat() for SHM export succeeded, segment %d\n", shmid); return true; } void shm_release(struct gps_context_t *context) /* release the shared-memory segment used for export */ { if (context->shmexport != NULL) (void)shmdt((const void *)context->shmexport); } void shm_update(struct gps_context_t *context, struct gps_data_t *gpsdata) /* export an update to all listeners */ { if (context->shmexport != NULL) { static int tick; volatile struct shmexport_t *shared = (struct shmexport_t *)context->shmexport; ++tick; /* * Following block of instructions must not be reordered, otherwise * havoc will ensue. * * This is a simple optimistic-concurrency technique. We write * the second bookend first, then the data, then the first bookend. * Reader copies what it sees in normal order; that way, if we * start to write the segment during the read, the second bookend will * get clobbered first and the data can be detected as bad. */ shared->bookend2 = tick; memory_barrier(); shared->gpsdata = *gpsdata; memory_barrier(); #ifndef USE_QT shared->gpsdata.gps_fd = SHM_PSEUDO_FD; #else shared->gpsdata.gps_fd = (void *)(intptr_t)SHM_PSEUDO_FD; #endif /* USE_QT */ memory_barrier(); shared->bookend1 = tick; } } #endif /* SHM_EXPORT_ENABLE */ /* end */ gpsd-3.15/sockaddr.h0000664000175000017500000000043012506317045012510 0ustar esresr/* klugey def'n of a socket address struct helps hide IPV4 vs. IPV6 ugliness */ typedef union sockaddr_u { struct sockaddr sa; struct sockaddr_in sa_in; #ifdef IPV6_ENABLE struct sockaddr_in6 sa_in6; #endif /* IPV6_ENABLE */ } sockaddr_t; /* sockaddr.h ends here */ gpsd-3.15/srec.xml0000664000175000017500000002622512520742615012236 0ustar esresr 15 Jul 2005 srec 5 The GPSD Project GPSD Documentation srec Motorola S-record record and file format DESCRIPTION Motorola S-records are a form of simple ASCII encoding for binary data. This format is commonly used for firmware uploads to GPSes, industrial robots, and other kinds of microcontroller-driven hardware. It has several convenient properties, including inspectability, easy editing with any text editor, and checksumming for verification of transmission across noisy serial lines. An S-record file consists of a sequence of specially formatted ASCII character strings. An S-record will be less than or equal to 78 bytes in length. The order of S-records within a file is of no significance and no particular order may be assumed. The general format of an S-record follows: +-------------------//------------------//-----------------------+ | type | count | address | data | checksum | +-------------------//------------------//-----------------------+ type A char[2] field. These characters describe the type of record (S0, S1, S2, S3, S5, S7, S8, or S9). count A char[2] field. These characters when paired and interpreted as a big-endian hexadecimal integer, display the count of remaining character pairs in the record. address A char[4,6, or 8] field. These characters grouped and interpreted as a big-endian hexadecimal integer, display the address at which the data field is to be loaded into memory. The length of the field depends on the number of bytes necessary to hold the address. A 2-byte address uses 4 characters, a 3-byte address uses 6 characters, and a 4-byte address uses 8 characters. data A char [0-64] field. These characters when paired and interpreted as hexadecimal values represent the memory loadable data or descriptive information. checksum A char[2] field. These characters when paired and interpreted as a big-endian hexadecimal integer display the least significant byte of the ones complement of the sum of the byte values represented by the pairs of characters making up the count, the address, and the data fields. Each record is terminated with a line feed. If any additional or different record terminator(s) or delay characters are needed during transmission to the target system it is the responsibility of the transmitting program to provide them. There are 9 record types, as follows: S0 The type of record is 'S0' (0x5330). The address field is unused and will be filled with zeros (0x0000). The header information within the data field is divided into the following subfields. mname is char[20] and is the module name. ver is char[2] and is the version number. rev is char[2] and is the revision number. description is char[0-36] and is a text comment. Each of the subfields is composed of ASCII bytes whose associated characters, when paired, represent one byte hexadecimal values in the case of the version and revision numbers, or represent the hexadecimal values of the ASCII characters comprising the module name and description. S1 The type of record field is 'S1' (0x5331). The address field is interpreted as a 2-byte big-endian address. The data field is composed of memory loadable data. S2 The type of record field is 'S2' (0x5332). The address field is interpreted as a 3-byte big-endian address. The data field is composed of memory loadable data. S3 The type of record field is 'S3' (0x5333). The address field is interpreted as a 4-byte big-endian address. The data field is composed of memory loadable data. S5 The type of record field is 'S5' (0x5335). The address field is interpreted as a 2-byte big-endian value and contains the count of S1, S2, and S3 records previously transmitted. There is no data field. S7 The type of record field is 'S7' (0x5337). The address field contains the starting execution address and is interpreted as a 4-byte big-endian address. There is no data field. S8 The type of record field is 'S8' (0x5338). The address field contains the starting execution address and is interpreted as a 3-byte big-endian address. There is no data field. S9 The type of record field is 'S9' (0x5339). The address field contains the starting execution address and is interpreted as a 2-byte big-endian address. There is no data field. EXAMPLE Shown below is a typical S-record format file. S00600004844521B S1130000285F245F2212226A000424290008237C2A S11300100002000800082629001853812341001813 S113002041E900084E42234300182342000824A952 S107003000144ED492 S5030004F8 S9030000FC The file consists of one S0 record, four S1 records, one S5 record and an S9 record. The S0 record is comprised as follows: S0 S-record type S0, indicating it is a header record. 06 Hexadecimal 06 (decimal 6), indicating that six character pairs (or ASCII bytes) follow. 00 00 Four character 2-byte address field, zeroes in this example. 48 44 52 ASCII H, D, and R - "HDR". 1B The checksum. The first S1 record is comprised as follows: S1 S-record type S1, indicating it is a data record to be loaded at a 2-byte address. 13 Hexadecimal 13 (decimal 19), indicating that nineteen character pairs, representing a 2 byte address, 16 bytes of binary data, and a 1 byte checksum, follow. 00 00 Four character 2-byte address field; hexidecimal address 0x0000, where the data which follows is to be loaded. 28 5F 24 5F 22 12 22 6A 00 04 24 29 00 08 23 7C Sixteen character pairs representing the actual binary data. 2A The checksum. The second and third S1 records each contain 0x13 (19) character pairs and are ended with checksums of 13 and 52, respectively. The fourth S1 record contains 07 character pairs and has a checksum of 92. The S5 record is comprised as follows: S5 S-record type S5, indicating it is a count record indicating the number of S1 records 03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow. 00 04 Hexadecimal 0004 (decimal 4), indicating that there are four data records previous to this record. F8 The checksum. The S9 record is comprised as follows: S9 S-record type S9, indicating it is a termination record. 03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow. 00 00 The address field, hexadecimal 0 (decimal 0) indicating the starting execution address. FC The checksum. NOTES There isn't any evidence that Motorola ever made use of the header information within the data field of the S0 record, as described above. This may have been used by some third party vendors. The Unix manual page on S-records is the only place that a 78-byte limit on total record length or 64-byte limit on data length is documented. These values shouldn't be trusted for the general case. The count field can have values in the range of 0x3 (2 bytes of address + 1 byte checksum = 3, a not very useful record) to 0xff; this is the count of remaining character pairs, including checksum. If you write code to convert S-Records, you should always assume that a record can be as long as 514 (decimal) characters in length (255 * 2 = 510, plus 4 characters for the type and count fields), plus any terminating character(s). That is, in establishing an input buffer in C, you would declare it to be an array of 515 chars, thus leaving room for the terminating null character. SEE ALSO gpsd8, gps1, libgps3, libgpsd3, gpsfake1. gpsprof1. AUTHOR From an anonymous web page, itself claiming to have been derived from an old Unix manual page. Now maintained by the GPSD project, which added endianness clarifications. gpsd-3.15/srecord.c0000664000175000017500000000700112520742615012354 0ustar esresr/* * Copyright (c) 2005 Chris Kuethe * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include "gpsd.h" /* * See srec(5) for a description of this format. * We read and write 4-byte addresses. * S0: Comments * S3: Memory Loadable Data, 4byte address * S5: Count of S1, S2 and S3 Records * S7: starting execution address interpreted as a 4-byte address */ #define MAX_BYTES_PER_RECORD 16 /* * bin2srec: turn a chunk of binary into an S-record * offset: used to specify load address * num: up to MAX_BYTES_PER_RECORD bytes can be encoded at one time * 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; } // cppcheck-suppress unusedFunction int srec_hdr(unsigned int num, unsigned char *bbuf, unsigned char *sbuf) { return bin2srec(0, 0, num, bbuf, sbuf); } // cppcheck-suppress unusedFunction int srec_fin(unsigned int num, unsigned char *sbuf) { unsigned char bbuf[4], sum; 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; } 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; for (i = 0; i < len; i++) { abuf[i * 2] = hc((bbuf[i] & 0xf0) >> 4); abuf[i * 2 + 1] = hc(bbuf[i] & 0x0f); } } 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 sr_sum(unsigned int count, unsigned int addr, unsigned char *bbuf) { int i, j; unsigned char 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++) { unsigned char k = bbuf[i]; sum += k; } return ~sum; } gpsd-3.15/strfuncs.h0000664000175000017500000000211012506323300012551 0ustar esresr/* * strfuncs.h - string functions * * This software is distributed under a BSD-style license. See the * file "COPYING" in the toop-level directory of the distribution for details. */ #ifndef _GPSD_STRFUNCS_H_ #define _GPSD_STRFUNCS_H_ #include #include #include #include #include "compiler.h" static inline bool str_starts_with(const char *str, const char *prefix) { return strncmp(str, prefix, strlen(prefix)) == 0; } PRINTF_FUNC(3, 4) static inline void str_appendf(char *str, size_t alloc_size, const char *format, ...) { va_list ap; va_start(ap, format); (void) vsnprintf(str + strlen(str), alloc_size - strlen(str), format, ap); va_end(ap); } static inline void str_vappendf(char *str, size_t alloc_size, const char *format, va_list ap) { (void) vsnprintf(str + strlen(str), alloc_size - strlen(str), format, ap); } static inline void str_rstrip_char(char *str, char ch) { if (strlen(str) != 0 && str[strlen(str) - 1] == ch) { str[strlen(str) - 1] = '\0'; } } #endif /* _GPSD_STRFUNCS_H_ */ gpsd-3.15/strl.c0000664000175000017500000001051112506317045011676 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include /* for time_t */ #include "gpsd_config.h" /* * These versions use memcpy and strlen() because they are often * heavily optimized down to assembler level. Thus, likely to be * faster even with the function call overhead. */ #ifndef HAVE_STRLCAT /* * Appends src to string dst of size siz (unlike strncat, siz is the * full size of dst, not space left). At most siz-1 characters * will be copied. Always NUL terminates (unless siz <= strlen(dst)). * Returns strlen(src) + MIN(siz, strlen(initial dst)). * If retval >= siz, truncation occurred. */ size_t strlcat(char *dst, const char *src, size_t siz) { size_t slen = strlen(src); size_t dlen = strlen(dst); if (siz != 0) { if (dlen + slen < siz) memcpy(dst + dlen, src, slen + 1); else { memcpy(dst + dlen, src, siz - dlen - 1); dst[siz - 1] = '\0'; } } return dlen + slen; } #ifdef __UNUSED__ /* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */ /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 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; /* 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++; } *d = '\0'; return (dlen + (s - src)); /* count does not include NUL */ } #endif /* __UNUSED__ */ #endif /* HAVE_STRLCAT */ #ifndef HAVE_STRLCPY /* * Copy src to string dst of size siz. At most siz-1 characters * 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 len = strlen(src); if (siz != 0) { if (len >= siz) { memcpy(dst, src, siz - 1); dst[siz - 1] = '\0'; } else memcpy(dst, src, len + 1); } return len; } #ifdef __UNUSED__ /* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ size_t strlcpy(char *dst, const char *src, size_t 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; } } /* 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 */ } #endif /* __UNUSED__ */ #endif /* HAVE_STRLCPY */ gpsd-3.15/subframe.c0000664000175000017500000010032412520742615012521 0ustar esresr/* subframe.c -- interpret satellite subframe data. * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include "gpsd.h" /* convert unsigned to signed */ #define uint2int( u, bit) ( (u & (1<<(bit-1))) ? u - (1<subframe_count++ == 0) { speed_t speed = gpsd_get_speed(session); if (speed < 38400) gpsd_log(&session->context->errout, LOG_WARN, "speed less than 38,400 may cause data lag and loss of functionality\n"); } /* * This function assumes an array of 10 ints, each of which carries * a raw 30-bit GPS word use your favorite search engine to find the * latest version of the specification: IS-GPS-200. * * Each raw 30-bit word is made of 24 data bits and 6 parity bits. The * raw word and transport word are emitted from the GPS MSB-first and * right justified. In other words, masking the raw word against 0x3f * will return just the parity bits. Masking with 0x3fffffff and shifting * 6 bits to the right returns just the 24 data bits. The top two bits * (b31 and b30) are undefined; chipset designers may store copies of * the bits D29* and D30* here to aid parity checking. * * Since bits D29* and D30* are not available in word 0, it is tested for * a known preamble to help check its validity and determine whether the * word is inverted. * */ gpsd_log(&session->context->errout, LOG_DATA, "50B: gpsd_interpret_subframe_raw: " "%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x\n", words[0], words[1], words[2], words[3], words[4], words[5], words[6], words[7], words[8], words[9]); preamble = (uint8_t)((words[0] >> 22) & 0xFF); if (preamble == 0x8b) { /* preamble is inverted */ words[0] ^= 0x3fffffc0; /* invert */ } else if (preamble != 0x74) { /* strangely this is very common, so don't log it */ gpsd_log(&session->context->errout, LOG_DATA, "50B: gpsd_interpret_subframe_raw: bad preamble 0x%x\n", preamble); return 0; } words[0] = (words[0] >> 6) & 0xffffff; for (i = 1; i < 10; i++) { int invert; uint32_t parity; /* D30* says invert */ invert = (words[i] & 0x40000000) ? 1 : 0; /* inverted data, invert it back */ if (invert) { words[i] ^= 0x3fffffc0; } parity = (uint32_t)isgps_parity((isgps30bits_t)words[i]); if (parity != (words[i] & 0x3f)) { gpsd_log(&session->context->errout, LOG_DATA, "50B: gpsd_interpret_subframe_raw parity fail words[%d] 0x%x != 0x%x\n", i, parity, (words[i] & 0x1)); return 0; } words[i] = (words[i] >> 6) & 0xffffff; } return gpsd_interpret_subframe(session, tSVID, words); } /* you can find up to date almanac data for comparision here: * https://gps.afspc.af.mil/gps/Current/current.alm */ static void subframe_almanac(const struct gpsd_errout_t *errout, uint8_t tSVID, uint32_t words[], uint8_t subframe, uint8_t sv, uint8_t data_id, struct almanac_t *almp) { almp->sv = sv; /* ignore the 0 sv problem for now */ almp->e = ( words[2] & 0x00FFFF); almp->d_eccentricity = pow(2.0,-21) * almp->e; /* carefull, each SV can have more than 2 toa's active at the same time * you can not just store one or two almanacs for each sat */ almp->toa = ((words[3] >> 16) & 0x0000FF); almp->l_toa = almp->toa << 12; almp->deltai = ( words[3] & 0x00FFFF); almp->d_deltai = pow(2.0, -19) * almp->deltai; almp->Omegad = ((words[4] >> 8) & 0x00FFFF); almp->d_Omegad = pow(2.0, -38) * almp->Omegad; almp->svh = ( words[4] & 0x0000FF); almp->sqrtA = ( words[5] & 0xFFFFFF); almp->d_sqrtA = pow(2.0,-11) * almp->sqrtA; almp->Omega0 = ( words[6] & 0xFFFFFF); almp->Omega0 = uint2int(almp->Omega0, 24); almp->d_Omega0 = pow(2.0, -23) * almp->Omega0; almp->omega = ( words[7] & 0xFFFFFF); almp->omega = uint2int(almp->omega, 24); almp->d_omega = pow(2.0, -23) * almp->omega; almp->M0 = ( words[8] & 0x00FFFFFF); almp->M0 = uint2int(almp->M0, 24); /* if you want radians, multiply by GPS_PI, but we do semi-circles * to match IS-GPS-200E */ almp->d_M0 = pow(2.0,-23) * almp->M0; almp->af1 = ((words[9] >> 5) & 0x0007FF); almp->af1 = (short)uint2int(almp->af1, 11); almp->d_af1 = pow(2.0,-38) * almp->af1; almp->af0 = ((words[9] >> 16) & 0x0000FF); almp->af0 <<= 3; almp->af0 |= ((words[9] >> 2) & 0x000007); almp->af0 = (short)uint2int(almp->af0, 11); almp->d_af0 = pow(2.0,-20) * almp->af0; gpsd_log(errout, LOG_PROG, "50B: SF:%d SV:%2u TSV:%2u data_id %d e:%g toa:%lu " "deltai:%.10e Omegad:%.5e svh:%u sqrtA:%.10g Omega0:%.10e " "omega:%.10e M0:%.11e af0:%.5e af1:%.5e\n", subframe, almp->sv, tSVID, data_id, almp->d_eccentricity, almp->l_toa, almp->d_deltai, almp->d_Omegad, almp->svh, almp->d_sqrtA, almp->d_Omega0, almp->d_omega, almp->d_M0, almp->d_af0, almp->d_af1); } gps_mask_t gpsd_interpret_subframe(struct gps_device_t *session, unsigned int tSVID, uint32_t words[]) { /* * Heavy black magic begins here! * * A description of how to decode these bits is at * * * We're mostly looking for subframe 4 page 18 word 9, the leap second * correction. This functions assumes an array of words without parity * or inversion (inverted word 0 is OK). It may be called directly by a * driver if the chipset emits acceptable data. * * To date this code has been tested on iTrax, SiRF and ublox. */ /* FIXME!! I really doubt this is Big Endian compatible */ uint8_t preamble; struct subframe_t *subp = &session->gpsdata.subframe; gpsd_log(&session->context->errout, LOG_DATA, "50B: gpsd_interpret_subframe: (%d) " "%06x %06x %06x %06x %06x %06x %06x %06x %06x %06x\n", tSVID, words[0], words[1], words[2], words[3], words[4], words[5], words[6], words[7], words[8], words[9]); preamble = (uint8_t)((words[0] >> 16) & 0x0FF); if (preamble == 0x8b) { /* somehow missed an inversion */ preamble ^= 0xff; words[0] ^= 0xffffff; } if (preamble != 0x74) { gpsd_log(&session->context->errout, LOG_WARN, "50B: gpsd_interpret_subframe bad preamble: 0x%x header 0x%x\n", preamble, words[0]); return 0; } subp->integrity = (bool)((words[0] >> 1) & 0x01); /* The subframe ID is in the Hand Over Word (page 80) */ subp->TOW17 = ((words[1] >> 7) & 0x01FFFF); subp->l_TOW17 = (long)(subp->TOW17 * 6); subp->tSVID = (uint8_t)tSVID; subp->subframe_num = ((words[1] >> 2) & 0x07); subp->alert = (bool)((words[1] >> 6) & 0x01); subp->antispoof = (bool)((words[1] >> 6) & 0x01); gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:%d SV:%2u TOW17:%7lu Alert:%u AS:%u IF:%d\n", subp->subframe_num, subp->tSVID, subp->l_TOW17, (unsigned)subp->alert, (unsigned)subp->antispoof, (unsigned)subp->integrity); /* * Consult the latest revision of IS-GPS-200 for the mapping * between magic SVIDs and pages. */ subp->pageid = (words[2] >> 16) & 0x00003F; /* only in frames 4 & 5 */ subp->data_id = (words[2] >> 22) & 0x3; /* only in frames 4 & 5 */ subp->is_almanac = 0; switch (subp->subframe_num) { case 1: /* subframe 1: clock parameters for transmitting SV */ /* get Week Number (WN) from subframe 1 */ /* * This only extracts 10 bits of GPS week. * 13 bits are available in the extension CNAV message, * which we don't decode yet because we don't know * of any receiver that reports it. */ session->context->gps_week = (unsigned short)((words[2] >> 14) & 0x03ff); subp->sub1.WN = (uint16_t)session->context->gps_week; subp->sub1.l2 = (uint8_t)((words[2] >> 12) & 0x000003); /* L2 Code */ subp->sub1.ura = (unsigned int)((words[2] >> 8) & 0x00000F); /* URA Index */ subp->sub1.hlth = (unsigned int)((words[2] >> 2) & 0x00003F); /* SV health */ subp->sub1.IODC = (words[2] & 0x000003); /* IODC 2 MSB */ subp->sub1.l2p = ((words[3] >> 23) & 0x000001); /* L2 P flag */ subp->sub1.Tgd = (int8_t)( words[6] & 0x0000FF); subp->sub1.d_Tgd = pow(2.0, -31) * (int)subp->sub1.Tgd; subp->sub1.toc = ( words[7] & 0x00FFFF); subp->sub1.l_toc = (long)subp->sub1.toc << 4; subp->sub1.af2 = (int8_t)((words[8] >> 16) & 0x0FF); subp->sub1.d_af2 = pow(2.0, -55) * (int)subp->sub1.af2; subp->sub1.af1 = (int16_t)( words[8] & 0x00FFFF); subp->sub1.d_af1 = pow(2.0, -43) * subp->sub1.af1; subp->sub1.af0 = (int32_t)((words[9] >> 2) & 0x03FFFFF); subp->sub1.af0 = uint2int(subp->sub1.af0, 22); subp->sub1.d_af0 = pow(2.0, -31) * subp->sub1.af0; subp->sub1.IODC <<= 8; subp->sub1.IODC |= ((words[7] >> 16) & 0x00FF); gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:1 SV:%2u WN:%4u IODC:%4u" " L2:%u ura:%u hlth:%u L2P:%u Tgd:%g toc:%lu af2:%.4g" " af1:%.6e af0:%.7e\n", subp->tSVID, subp->sub1.WN, subp->sub1.IODC, subp->sub1.l2, subp->sub1.ura, subp->sub1.hlth, subp->sub1.l2p, subp->sub1.d_Tgd, subp->sub1.l_toc, subp->sub1.d_af2, subp->sub1.d_af1, subp->sub1.d_af0); break; case 2: /* subframe 2: ephemeris for transmitting SV */ subp->sub2.IODE = ((words[2] >> 16) & 0x00FF); subp->sub2.Crs = (int16_t)( words[2] & 0x00FFFF); subp->sub2.d_Crs = pow(2.0,-5) * subp->sub2.Crs; subp->sub2.deltan = (int16_t)((words[3] >> 8) & 0x00FFFF); subp->sub2.d_deltan = pow(2.0,-43) * subp->sub2.deltan; subp->sub2.M0 = (int32_t)( words[3] & 0x0000FF); subp->sub2.M0 <<= 24; subp->sub2.M0 |= ( words[4] & 0x00FFFFFF); subp->sub2.d_M0 = pow(2.0,-31) * subp->sub2.M0 * GPS_PI; subp->sub2.Cuc = (int16_t)((words[5] >> 8) & 0x00FFFF); subp->sub2.d_Cuc = pow(2.0,-29) * subp->sub2.Cuc; subp->sub2.e = ( words[5] & 0x0000FF); subp->sub2.e <<= 24; subp->sub2.e |= ( words[6] & 0x00FFFFFF); subp->sub2.d_eccentricity = pow(2.0,-33) * subp->sub2.e; subp->sub2.Cus = (int16_t)((words[7] >> 8) & 0x00FFFF); subp->sub2.d_Cus = pow(2.0,-29) * subp->sub2.Cus; subp->sub2.sqrtA = ( words[7] & 0x0000FF); subp->sub2.sqrtA <<= 24; subp->sub2.sqrtA |= ( words[8] & 0x00FFFFFF); subp->sub2.d_sqrtA = pow(2.0, -19) * subp->sub2.sqrtA; subp->sub2.toe = ((words[9] >> 8) & 0x00FFFF); subp->sub2.l_toe = (long)(subp->sub2.toe << 4); subp->sub2.fit = ((words[9] >> 7) & 0x000001); subp->sub2.AODO = ((words[9] >> 2) & 0x00001F); subp->sub2.u_AODO = subp->sub2.AODO * 900; gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:2 SV:%2u IODE:%3u Crs:%.6e deltan:%.6e " "M0:%.11e Cuc:%.6e e:%f Cus:%.6e sqrtA:%.11g " "toe:%lu FIT:%u AODO:%5u\n", subp->tSVID, subp->sub2.IODE, subp->sub2.d_Crs, subp->sub2.d_deltan, subp->sub2.d_M0, subp->sub2.d_Cuc, subp->sub2.d_eccentricity, subp->sub2.d_Cus, subp->sub2.d_sqrtA, subp->sub2.l_toe, subp->sub2.fit, subp->sub2.u_AODO); break; case 3: /* subframe 3: ephemeris for transmitting SV */ subp->sub3.Cic = (int16_t)((words[2] >> 8) & 0x00FFFF); subp->sub3.d_Cic = pow(2.0, -29) * subp->sub3.Cic; subp->sub3.Omega0 = (int32_t)(words[2] & 0x0000FF); subp->sub3.Omega0 <<= 24; subp->sub3.Omega0 |= ( words[3] & 0x00FFFFFF); subp->sub3.d_Omega0 = pow(2.0, -31) * subp->sub3.Omega0; subp->sub3.Cis = (int16_t)((words[4] >> 8) & 0x00FFFF); subp->sub3.d_Cis = pow(2.0, -29) * subp->sub3.Cis; subp->sub3.i0 = (int32_t)(words[4] & 0x0000FF); subp->sub3.i0 <<= 24; subp->sub3.i0 |= ( words[5] & 0x00FFFFFF); subp->sub3.d_i0 = pow(2.0, -31) * subp->sub3.i0; subp->sub3.Crc = (int16_t)((words[6] >> 8) & 0x00FFFF); subp->sub3.d_Crc = pow(2.0, -5) * subp->sub3.Crc; subp->sub3.omega = (int32_t)(words[6] & 0x0000FF); subp->sub3.omega <<= 24; subp->sub3.omega |= ( words[7] & 0x00FFFFFF); subp->sub3.d_omega = pow(2.0, -31) * subp->sub3.omega; subp->sub3.Omegad = (int32_t)(words[8] & 0x00FFFFFF); subp->sub3.Omegad = uint2int(subp->sub3.Omegad, 24); subp->sub3.d_Omegad = pow(2.0, -43) * subp->sub3.Omegad; subp->sub3.IODE = ((words[9] >> 16) & 0x0000FF); subp->sub3.IDOT = (int16_t)((words[9] >> 2) & 0x003FFF); subp->sub3.IDOT = uint2int(subp->sub3.IDOT, 14); subp->sub3.d_IDOT = pow(2.0, -43) * subp->sub3.IDOT; gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:3 SV:%2u IODE:%3u I IDOT:%.6g Cic:%.6e Omega0:%.11e " " Cis:%.7g i0:%.11e Crc:%.7g omega:%.11e Omegad:%.6e\n", subp->tSVID, subp->sub3.IODE, subp->sub3.d_IDOT, subp->sub3.d_Cic, subp->sub3.d_Omega0, subp->sub3.d_Cis, subp->sub3.d_i0, subp->sub3.d_Crc, subp->sub3.d_omega, subp->sub3.d_Omegad ); break; case 4: { int i = 0; /* handy loop counter */ int sv = -2; switch (subp->pageid) { case 0: /* almanac for dummy sat 0, which is same as transmitting sat */ sv = 0; break; case 1: case 6: case 11: case 16: case 21: case 57: /* for some inscutable reason these pages are all sent * as page 57, IS-GPS-200E Table 20-V */ break; case 12: case 24: case 62: /* for some inscrutable reason these pages are all sent * as page 62, IS-GPS-200E Table 20-V */ break; case 14: case 53: /* for some inscrutable reason page 14 is sent * as page 53, IS-GPS-200E Table 20-V */ break; case 15: case 54: /* for some inscrutable reason page 15 is sent * as page 54, IS-GPS-200E Table 20-V */ break; case 19: /* for some inscrutable reason page 20 is sent * as page 58, IS-GPS-200E Table 20-V */ /* reserved page */ break; case 20: /* for some inscrutable reason page 20 is sent * as page 59, IS-GPS-200E Table 20-V */ /* reserved page */ break; case 22: case 60: /* for some inscrutable reason page 22 is sent * as page 60, IS-GPS-200E Table 20-V */ /* reserved page */ break; case 23: case 61: /* for some inscrutable reason page 23 is sent * as page 61, IS-GPS-200E Table 20-V */ /* reserved page */ break; /* almanac data for SV 25 through 32 respectively; */ case 2: sv = 25; break; case 3: sv = 26; break; case 4: sv = 27; break; case 5: sv = 28; break; case 7: sv = 29; break; case 8: sv = 30; break; case 9: sv = 31; break; case 10: sv = 32; break; case 13: case 52: /* NMCT */ sv = -1; subp->sub4_13.ai = (unsigned char)((words[2] >> 22) & 0x000003); subp->sub4_13.ERD[1] = (char)((words[2] >> 8) & 0x00003F); subp->sub4_13.ERD[2] = (char)((words[2] >> 2) & 0x00003F); subp->sub4_13.ERD[3] = (char)((words[2] >> 0) & 0x000003); subp->sub4_13.ERD[3] <<= 2; subp->sub4_13.ERD[3] |= (char)((words[3] >> 20) & 0x00000F); subp->sub4_13.ERD[4] = (char)((words[3] >> 14) & 0x00003F); subp->sub4_13.ERD[5] = (char)((words[3] >> 8) & 0x00003F); subp->sub4_13.ERD[6] = (char)((words[3] >> 2) & 0x00003F); subp->sub4_13.ERD[7] = (char)((words[3] >> 0) & 0x000003); subp->sub4_13.ERD[7] <<= 2; subp->sub4_13.ERD[7] |= (char)((words[4] >> 20) & 0x00000F); subp->sub4_13.ERD[8] = (char)((words[4] >> 14) & 0x00003F); subp->sub4_13.ERD[9] = (char)((words[4] >> 8) & 0x00003F); subp->sub4_13.ERD[10] = (char)((words[4] >> 2) & 0x00003F); subp->sub4_13.ERD[11] = (char)((words[4] >> 0) & 0x00000F); subp->sub4_13.ERD[11] <<= 2; subp->sub4_13.ERD[11] |= (char)((words[5] >> 20) & 0x00000F); subp->sub4_13.ERD[12] = (char)((words[5] >> 14) & 0x00003F); subp->sub4_13.ERD[13] = (char)((words[5] >> 8) & 0x00003F); subp->sub4_13.ERD[14] = (char)((words[5] >> 2) & 0x00003F); subp->sub4_13.ERD[15] = (char)((words[5] >> 0) & 0x000003); subp->sub4_13.ERD[15] <<= 2; subp->sub4_13.ERD[15] |= (char)((words[6] >> 20) & 0x00000F); subp->sub4_13.ERD[16] = (char)((words[6] >> 14) & 0x00003F); subp->sub4_13.ERD[17] = (char)((words[6] >> 8) & 0x00003F); subp->sub4_13.ERD[18] = (char)((words[6] >> 2) & 0x00003F); subp->sub4_13.ERD[19] = (char)((words[6] >> 0) & 0x000003); subp->sub4_13.ERD[19] <<= 2; subp->sub4_13.ERD[19] |= (char)((words[7] >> 20) & 0x00000F); subp->sub4_13.ERD[20] = (char)((words[7] >> 14) & 0x00003F); subp->sub4_13.ERD[21] = (char)((words[7] >> 8) & 0x00003F); subp->sub4_13.ERD[22] = (char)((words[7] >> 2) & 0x00003F); subp->sub4_13.ERD[23] = (char)((words[7] >> 0) & 0x000003); subp->sub4_13.ERD[23] <<= 2; subp->sub4_13.ERD[23] |= (char)((words[8] >> 20) & 0x00000F); subp->sub4_13.ERD[24] = (char)((words[8] >> 14) & 0x00003F); subp->sub4_13.ERD[25] = (char)((words[8] >> 8) & 0x00003F); subp->sub4_13.ERD[26] = (char)((words[8] >> 2) & 0x00003F); subp->sub4_13.ERD[27] = (char)((words[8] >> 0) & 0x000003); subp->sub4_13.ERD[27] <<= 2; subp->sub4_13.ERD[27] |= (char)((words[9] >> 20) & 0x00000F); subp->sub4_13.ERD[28] = (char)((words[9] >> 14) & 0x00003F); subp->sub4_13.ERD[29] = (char)((words[9] >> 8) & 0x00003F); subp->sub4_13.ERD[30] = (char)((words[9] >> 2) & 0x00003F); for ( i = 1; i < 31; i++ ) { subp->sub4_13.ERD[i] = uint2int(subp->sub4_13.ERD[i], 6); } gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:4-13 data_id %d ai:%u " "ERD1:%d ERD2:%d ERD3:%d ERD4:%d " "ERD5:%d ERD6:%d ERD7:%d ERD8:%d " "ERD9:%d ERD10:%d ERD11:%d ERD12:%d " "ERD13:%d ERD14:%d ERD15:%d ERD16:%d " "ERD17:%d ERD18:%d ERD19:%d ERD20:%d " "ERD21:%d ERD22:%d ERD23:%d ERD24:%d " "ERD25:%d ERD26:%d ERD27:%d ERD28:%d " "ERD29:%d ERD30:%d\n", subp->data_id, subp->sub4_13.ai, subp->sub4_13.ERD[1], subp->sub4_13.ERD[2], subp->sub4_13.ERD[3], subp->sub4_13.ERD[4], subp->sub4_13.ERD[5], subp->sub4_13.ERD[6], subp->sub4_13.ERD[7], subp->sub4_13.ERD[8], subp->sub4_13.ERD[9], subp->sub4_13.ERD[10], subp->sub4_13.ERD[11], subp->sub4_13.ERD[12], subp->sub4_13.ERD[13], subp->sub4_13.ERD[14], subp->sub4_13.ERD[15], subp->sub4_13.ERD[16], subp->sub4_13.ERD[17], subp->sub4_13.ERD[18], subp->sub4_13.ERD[19], subp->sub4_13.ERD[20], subp->sub4_13.ERD[21], subp->sub4_13.ERD[22], subp->sub4_13.ERD[23], subp->sub4_13.ERD[24], subp->sub4_13.ERD[25], subp->sub4_13.ERD[26], subp->sub4_13.ERD[27], subp->sub4_13.ERD[28], subp->sub4_13.ERD[29], subp->sub4_13.ERD[30]); break; case 25: case 63: /* for some inscrutable reason page 25 is sent * as page 63, IS-GPS-200E Table 20-V */ /* A-S flags/SV configurations for 32 SVs, * plus SV health for SV 25 through 32 */ sv = -1; subp->sub4_25.svf[1] = (unsigned char)((words[2] >> 12) & 0x0F); subp->sub4_25.svf[2] = (unsigned char)((words[2] >> 8) & 0x0F); subp->sub4_25.svf[3] = (unsigned char)((words[2] >> 4) & 0x0F); subp->sub4_25.svf[4] = (unsigned char)((words[2] >> 0) & 0x0F); subp->sub4_25.svf[5] = (unsigned char)((words[3] >> 20) & 0x0F); subp->sub4_25.svf[6] = (unsigned char)((words[3] >> 16) & 0x0F); subp->sub4_25.svf[7] = (unsigned char)((words[3] >> 12) & 0x0F); subp->sub4_25.svf[8] = (unsigned char)((words[3] >> 8) & 0x0F); subp->sub4_25.svf[9] = (unsigned char)((words[3] >> 4) & 0x0F); subp->sub4_25.svf[10] = (unsigned char)((words[3] >> 0) & 0x0F); subp->sub4_25.svf[11] = (unsigned char)((words[4] >> 20) & 0x0F); subp->sub4_25.svf[12] = (unsigned char)((words[4] >> 16) & 0x0F); subp->sub4_25.svf[13] = (unsigned char)((words[4] >> 12) & 0x0F); subp->sub4_25.svf[14] = (unsigned char)((words[4] >> 8) & 0x0F); subp->sub4_25.svf[15] = (unsigned char)((words[4] >> 4) & 0x0F); subp->sub4_25.svf[16] = (unsigned char)((words[4] >> 0) & 0x0F); subp->sub4_25.svf[17] = (unsigned char)((words[5] >> 20) & 0x0F); subp->sub4_25.svf[18] = (unsigned char)((words[5] >> 16) & 0x0F); subp->sub4_25.svf[19] = (unsigned char)((words[5] >> 12) & 0x0F); subp->sub4_25.svf[20] = (unsigned char)((words[5] >> 8) & 0x0F); subp->sub4_25.svf[21] = (unsigned char)((words[5] >> 4) & 0x0F); subp->sub4_25.svf[22] = (unsigned char)((words[5] >> 0) & 0x0F); subp->sub4_25.svf[23] = (unsigned char)((words[6] >> 20) & 0x0F); subp->sub4_25.svf[24] = (unsigned char)((words[6] >> 16) & 0x0F); subp->sub4_25.svf[25] = (unsigned char)((words[6] >> 12) & 0x0F); subp->sub4_25.svf[26] = (unsigned char)((words[6] >> 8) & 0x0F); subp->sub4_25.svf[27] = (unsigned char)((words[6] >> 4) & 0x0F); subp->sub4_25.svf[28] = (unsigned char)((words[6] >> 0) & 0x0F); subp->sub4_25.svf[29] = (unsigned char)((words[7] >> 20) & 0x0F); subp->sub4_25.svf[30] = (unsigned char)((words[7] >> 16) & 0x0F); subp->sub4_25.svf[31] = (unsigned char)((words[7] >> 12) & 0x0F); subp->sub4_25.svf[32] = (unsigned char)((words[7] >> 8) & 0x0F); subp->sub4_25.svhx[0] = ((words[7] >> 0) & 0x00003F); subp->sub4_25.svhx[1] = ((words[8] >> 18) & 0x00003F); subp->sub4_25.svhx[2] = ((words[8] >> 12) & 0x00003F); subp->sub4_25.svhx[3] = ((words[8] >> 6) & 0x00003F); subp->sub4_25.svhx[4] = ((words[8] >> 0) & 0x00003F); subp->sub4_25.svhx[5] = ((words[9] >> 18) & 0x00003F); subp->sub4_25.svhx[6] = ((words[9] >> 12) & 0x00003F); subp->sub4_25.svhx[7] = ((words[9] >> 6) & 0x00003F); gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:4-25 data_id %d " "SV1:%u SV2:%u SV3:%u SV4:%u " "SV5:%u SV6:%u SV7:%u SV8:%u " "SV9:%u SV10:%u SV11:%u SV12:%u " "SV13:%u SV14:%u SV15:%u SV16:%u " "SV17:%u SV18:%u SV19:%u SV20:%u " "SV21:%u SV22:%u SV23:%u SV24:%u " "SV25:%u SV26:%u SV27:%u SV28:%u " "SV29:%u SV30:%u SV31:%u SV32:%u " "SVH25:%u SVH26:%u SVH27:%u SVH28:%u " "SVH29:%u SVH30:%u SVH31:%u SVH32:%u\n", subp->data_id, subp->sub4_25.svf[1], subp->sub4_25.svf[2], subp->sub4_25.svf[3], subp->sub4_25.svf[4], subp->sub4_25.svf[5], subp->sub4_25.svf[6], subp->sub4_25.svf[7], subp->sub4_25.svf[8], subp->sub4_25.svf[9], subp->sub4_25.svf[10], subp->sub4_25.svf[11], subp->sub4_25.svf[12], subp->sub4_25.svf[13], subp->sub4_25.svf[14], subp->sub4_25.svf[15], subp->sub4_25.svf[16], subp->sub4_25.svf[17], subp->sub4_25.svf[18], subp->sub4_25.svf[19], subp->sub4_25.svf[20], subp->sub4_25.svf[21], subp->sub4_25.svf[22], subp->sub4_25.svf[23], subp->sub4_25.svf[24], subp->sub4_25.svf[25], subp->sub4_25.svf[26], subp->sub4_25.svf[27], subp->sub4_25.svf[28], subp->sub4_25.svf[29], subp->sub4_25.svf[30], subp->sub4_25.svf[31], subp->sub4_25.svf[32], subp->sub4_25.svhx[0], subp->sub4_25.svhx[1], subp->sub4_25.svhx[2], subp->sub4_25.svhx[3], subp->sub4_25.svhx[4], subp->sub4_25.svhx[5], subp->sub4_25.svhx[6], subp->sub4_25.svhx[7]); break; case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: case 48: case 49: case 50: /* unassigned */ break; case 51: /* unknown */ break; case 17: case 55: /* for some inscrutable reason page 17 is sent * as page 55, IS-GPS-200E Table 20-V */ sv = -1; /* * "The requisite 176 bits shall occupy bits 9 through 24 * of word TWO, the 24 MSBs of words THREE through EIGHT, * plus the 16 MSBs of word NINE." (word numbers changed * to account for zero-indexing) * Since we've already stripped the low six parity bits, * and shifted the data to a byte boundary, we can just * copy it out. */ i = 0; subp->sub4_17.str[i++] = (words[2] >> 8) & 0xff; subp->sub4_17.str[i++] = (words[2]) & 0xff; subp->sub4_17.str[i++] = (words[3] >> 16) & 0xff; subp->sub4_17.str[i++] = (words[3] >> 8) & 0xff; subp->sub4_17.str[i++] = (words[3]) & 0xff; subp->sub4_17.str[i++] = (words[4] >> 16) & 0xff; subp->sub4_17.str[i++] = (words[4] >> 8) & 0xff; subp->sub4_17.str[i++] = (words[4]) & 0xff; subp->sub4_17.str[i++] = (words[5] >> 16) & 0xff; subp->sub4_17.str[i++] = (words[5] >> 8) & 0xff; subp->sub4_17.str[i++] = (words[5]) & 0xff; subp->sub4_17.str[i++] = (words[6] >> 16) & 0xff; subp->sub4_17.str[i++] = (words[6] >> 8) & 0xff; subp->sub4_17.str[i++] = (words[6]) & 0xff; subp->sub4_17.str[i++] = (words[7] >> 16) & 0xff; subp->sub4_17.str[i++] = (words[7] >> 8) & 0xff; subp->sub4_17.str[i++] = (words[7]) & 0xff; subp->sub4_17.str[i++] = (words[8] >> 16) & 0xff; subp->sub4_17.str[i++] = (words[8] >> 8) & 0xff; subp->sub4_17.str[i++] = (words[8]) & 0xff; subp->sub4_17.str[i++] = (words[9] >> 16) & 0xff; subp->sub4_17.str[i++] = (words[9] >> 8) & 0xff; subp->sub4_17.str[i] = '\0'; gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:4-17 system message: %.24s\n", subp->sub4_17.str); break; case 18: case 56: /* for some inscrutable reason page 18 is sent * as page 56, IS-GPS-200E Table 20-V */ /* ionospheric and UTC data */ sv = -1; /* current leap seconds */ subp->sub4_18.alpha0 = (int8_t)((words[2] >> 8) & 0x0000FF); subp->sub4_18.d_alpha0 = pow(2.0, -30) * (int)subp->sub4_18.alpha0; subp->sub4_18.alpha1 = (int8_t)((words[2] >> 0) & 0x0000FF); subp->sub4_18.d_alpha1 = pow(2.0, -27) * (int)subp->sub4_18.alpha1; subp->sub4_18.alpha2 = (int8_t)((words[3] >> 16) & 0x0000FF); subp->sub4_18.d_alpha2 = pow(2.0, -24) * (int)subp->sub4_18.alpha2; subp->sub4_18.alpha3 = (int8_t)((words[3] >> 8) & 0x0000FF); subp->sub4_18.d_alpha3 = pow(2.0, -24) * (int)subp->sub4_18.alpha3; subp->sub4_18.beta0 = (int8_t)((words[3] >> 0) & 0x0000FF); subp->sub4_18.d_beta0 = pow(2.0, 11) * (int)subp->sub4_18.beta0; subp->sub4_18.beta1 = (int8_t)((words[4] >> 16) & 0x0000FF); subp->sub4_18.d_beta1 = pow(2.0, 14) * (int)subp->sub4_18.beta1; subp->sub4_18.beta2 = (int8_t)((words[4] >> 8) & 0x0000FF); subp->sub4_18.d_beta2 = pow(2.0, 16) * (int)subp->sub4_18.beta2; subp->sub4_18.beta3 = (int8_t)((words[4] >> 0) & 0x0000FF); subp->sub4_18.d_beta3 = pow(2.0, 16) * (int)subp->sub4_18.beta3; subp->sub4_18.A1 = (int32_t)((words[5] >> 0) & 0xFFFFFF); subp->sub4_18.A1 = uint2int(subp->sub4_18.A1, 24); subp->sub4_18.d_A1 = pow(2.0,-50) * subp->sub4_18.A1; subp->sub4_18.A0 = (int32_t)((words[6] >> 0) & 0xFFFFFF); subp->sub4_18.A0 <<= 8; subp->sub4_18.A0 |= ((words[7] >> 16) & 0x0000FF); subp->sub4_18.d_A0 = pow(2.0,-30) * subp->sub4_18.A0; /* careful WN is 10 bits, but WNt is 8 bits! */ /* WNt (Week Number of LSF) */ subp->sub4_18.tot = ((words[7] >> 8) & 0x0000FF); subp->sub4_18.d_tot = pow(2.0,12) * subp->sub4_18.tot; subp->sub4_18.WNt = ((words[7] >> 0) & 0x0000FF); subp->sub4_18.leap = (int8_t)((words[8] >> 16) & 0x0000FF); subp->sub4_18.WNlsf = ((words[8] >> 8) & 0x0000FF); /* DN (Day Number of LSF) */ subp->sub4_18.DN = (words[8] & 0x0000FF); /* leap second future */ subp->sub4_18.lsf = (int8_t)((words[9] >> 16) & 0x0000FF); gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:4-18 a0:%.5g a1:%.5g a2:%.5g a3:%.5g " "b0:%.5g b1:%.5g b2:%.5g b3:%.5g " "A1:%.11e A0:%.11e tot:%.5g WNt:%u " "ls: %d WNlsf:%u DN:%u, lsf:%d\n", subp->sub4_18.d_alpha0, subp->sub4_18.d_alpha1, subp->sub4_18.d_alpha2, subp->sub4_18.d_alpha3, subp->sub4_18.d_beta0, subp->sub4_18.d_beta1, subp->sub4_18.d_beta2, subp->sub4_18.d_beta3, subp->sub4_18.d_A1, subp->sub4_18.d_A0, subp->sub4_18.d_tot, subp->sub4_18.WNt, subp->sub4_18.leap, subp->sub4_18.WNlsf, subp->sub4_18.DN, subp->sub4_18.lsf); #ifdef TIMEHINT_ENABLE /* IS-GPS-200 Revision E, paragraph 20.3.3.5.2.4 */ /* FIXME: only allow LEAPs in June and December */ if (((session->context->gps_week % 256) == (unsigned short)subp->sub4_18.WNlsf) && /* notify the leap seconds correction in the end of current day */ ((double)((subp->sub4_18.DN - 1) * SECS_PER_DAY) < session->context->gps_tow) && ((double)(subp->sub4_18.DN * SECS_PER_DAY) > session->context->gps_tow)) { if ( subp->sub4_18.leap < subp->sub4_18.lsf ) session->context->leap_notify = LEAP_ADDSECOND; else if ( subp->sub4_18.leap > subp->sub4_18.lsf ) session->context->leap_notify = LEAP_DELSECOND; else session->context->leap_notify = LEAP_NOWARNING; } else session->context->leap_notify = LEAP_NOWARNING; #endif /* TIMEHINT_ENABLE */ session->context->leap_seconds = (int)subp->sub4_18.leap; session->context->valid |= LEAP_SECOND_VALID; break; default: ; /* no op */ } if ( -1 < sv ) { subp->is_almanac = 1; subframe_almanac(&session->context->errout, subp->tSVID, words, subp->subframe_num, (uint8_t)sv, subp->data_id, &subp->sub4.almanac); } else if ( -2 == sv ) { /* unknown or secret page */ gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:4-%d data_id %d\n", subp->pageid, subp->data_id); return 0; } /* else, already handled */ } break; case 5: /* Pages 0, dummy almanac for dummy SV 0 * Pages 1 through 24: almanac data for SV 1 through 24 * Page 25: SV health data for SV 1 through 24, the almanac * reference time, the almanac reference week number. */ if ( 25 > subp->pageid ) { subp->is_almanac = 1; subframe_almanac(&session->context->errout, subp->tSVID, words, subp->subframe_num, subp->pageid, subp->data_id, &subp->sub5.almanac); } else if ( 51 == subp->pageid ) { /* for some inscrutable reason page 25 is sent as page 51 * IS-GPS-200E Table 20-V */ subp->sub5_25.toa = ((words[2] >> 8) & 0x0000FF); subp->sub5_25.l_toa <<= 12; subp->sub5_25.WNa = ( words[2] & 0x0000FF); subp->sub5_25.sv[1] = ((words[2] >> 18) & 0x00003F); subp->sub5_25.sv[2] = ((words[2] >> 12) & 0x00003F); subp->sub5_25.sv[3] = ((words[2] >> 6) & 0x00003F); subp->sub5_25.sv[4] = ((words[2] >> 0) & 0x00003F); subp->sub5_25.sv[5] = ((words[3] >> 18) & 0x00003F); subp->sub5_25.sv[6] = ((words[3] >> 12) & 0x00003F); subp->sub5_25.sv[7] = ((words[3] >> 6) & 0x00003F); subp->sub5_25.sv[8] = ((words[3] >> 0) & 0x00003F); subp->sub5_25.sv[9] = ((words[4] >> 18) & 0x00003F); subp->sub5_25.sv[10] = ((words[4] >> 12) & 0x00003F); subp->sub5_25.sv[11] = ((words[4] >> 6) & 0x00003F); subp->sub5_25.sv[12] = ((words[4] >> 0) & 0x00003F); subp->sub5_25.sv[13] = ((words[5] >> 18) & 0x00003F); subp->sub5_25.sv[14] = ((words[5] >> 12) & 0x00003F); subp->sub5_25.sv[15] = ((words[5] >> 6) & 0x00003F); subp->sub5_25.sv[16] = ((words[5] >> 0) & 0x00003F); subp->sub5_25.sv[17] = ((words[6] >> 18) & 0x00003F); subp->sub5_25.sv[18] = ((words[6] >> 12) & 0x00003F); subp->sub5_25.sv[19] = ((words[6] >> 6) & 0x00003F); subp->sub5_25.sv[20] = ((words[6] >> 0) & 0x00003F); subp->sub5_25.sv[21] = ((words[7] >> 18) & 0x00003F); subp->sub5_25.sv[22] = ((words[7] >> 12) & 0x00003F); subp->sub5_25.sv[23] = ((words[7] >> 6) & 0x00003F); subp->sub5_25.sv[24] = ((words[7] >> 0) & 0x00003F); gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:5-25 SV:%2u ID:%u toa:%lu WNa:%u " "SV1:%u SV2:%u SV3:%u SV4:%u " "SV5:%u SV6:%u SV7:%u SV8:%u " "SV9:%u SV10:%u SV11:%u SV12:%u " "SV13:%u SV14:%u SV15:%u SV16:%u " "SV17:%u SV18:%u SV19:%u SV20:%u " "SV21:%u SV22:%u SV23:%u SV24:%u\n", subp->tSVID, subp->data_id, subp->sub5_25.l_toa, subp->sub5_25.WNa, subp->sub5_25.sv[1], subp->sub5_25.sv[2], subp->sub5_25.sv[3], subp->sub5_25.sv[4], subp->sub5_25.sv[5], subp->sub5_25.sv[6], subp->sub5_25.sv[7], subp->sub5_25.sv[8], subp->sub5_25.sv[9], subp->sub5_25.sv[10], subp->sub5_25.sv[11], subp->sub5_25.sv[12], subp->sub5_25.sv[13], subp->sub5_25.sv[14], subp->sub5_25.sv[15], subp->sub5_25.sv[16], subp->sub5_25.sv[17], subp->sub5_25.sv[18], subp->sub5_25.sv[19], subp->sub5_25.sv[20], subp->sub5_25.sv[21], subp->sub5_25.sv[22], subp->sub5_25.sv[23], subp->sub5_25.sv[24]); } else { /* unknown page */ gpsd_log(&session->context->errout, LOG_PROG, "50B: SF:5-%d data_id %d uknown page\n", subp->pageid, subp->data_id); return 0; } break; default: /* unknown/illegal subframe */ return 0; } return SUBFRAME_SET; } gpsd-3.15/systemd/gpsd.service0000664000175000017500000000051612467340617014570 0ustar esresr[Unit] Description=GPS (Global Positioning System) Daemon Requires=gpsd.socket # Needed with chrony SOCK refclock After=chronyd.service [Service] EnvironmentFile=-/etc/default/gpsd EnvironmentFile=-/etc/sysconfig/gpsd ExecStart=/usr/sbin/gpsd -N $GPSD_OPTIONS $OPTIONS $DEVICES [Install] WantedBy=multi-user.target Also=gpsd.socket gpsd-3.15/systemd/gpsd.socket0000664000175000017500000000032312467336022014407 0ustar esresr[Unit] Description=GPS (Global Positioning System) Daemon Sockets [Socket] ListenStream=/var/run/gpsd.sock ListenStream=[::1]:2947 ListenStream=127.0.0.1:2947 SocketMode=0600 [Install] WantedBy=sockets.target gpsd-3.15/systemd/gpsdctl@.service0000664000175000017500000000067012467340617015374 0ustar esresr[Unit] Description=Manage %I for GPS daemon Requires=gpsd.socket BindsTo=dev-%i.device After=dev-%i.device [Service] Type=oneshot Environment="GPSD_SOCKET=/var/run/gpsd.sock" EnvironmentFile=-/etc/default/gpsd EnvironmentFile=-/etc/sysconfig/gpsd RemainAfterExit=yes ExecStart=/bin/sh -c "[ \"$USBAUTO\" = true ] && /usr/sbin/gpsdctl add /dev/%I || :" ExecStop=/bin/sh -c "[ \"$USBAUTO\" = true ] && /usr/sbin/gpsdctl remove /dev/%I || :" gpsd-3.15/test/README0000664000175000017500000000072612461156335012417 0ustar esresrThese are data logs from various weird GPSes. Use them to test assumptions about NMEA formats and cycle regularities, or as regression-test loads for gpsfake -p. Structured headers are as follows: # Name: Product name # Chipset: chipset name # Firmware: firmware revision level # Submitter: who sent it # Date: when it was received (ISO8601 yyyy-mm-dd) # Location: city, state/province, country, approximate lat/lon # Sample-Notes: Notes on how the sample was taken gpsd-3.15/test/clientlib/multipacket.log0000664000175000017500000000064612460513551016526 0ustar esresr# Test the ability to parse multiple packets on the same line {"class":"VERSION","release":"2.90dev","rev":"svn6614","proto_major":3,"proto_minor":1}{"class":"DEVICES","devices":[{"class":"DEVICE","path":"/dev/ttyS0","activated":1259438908.99,"flags":1,"driver":"SiRF binary","native":1,"bps":4800,"parity":"N","stopbits":1,"cycle":1.00}]}{"class":"WATCH","enable":true,"nmea":false,"raw":0,"scaled":false,"timing":false} gpsd-3.15/test/clientlib/multipacket.log.chk0000664000175000017500000000031312467341037017266 0ustar esresrflags: (0x20100000) {DEVICELIST|POLICY} POLICY: watcher=true nmea=false raw=0 scaled=false timing=false, split24=false pps=false, devpath= DEVICELIST:1 devices: 1: path='/dev/ttyS0' driver='SiRF binary' gpsd-3.15/test/daemon/GPSmap-76S.log0000664000175000017500000001564112461156335015213 0ustar esresr# Name: Garmin GPSmap 76S # Description: Garmin handset GPS # Submitter: Brad Skillman # Date: 2011-10-24 # Location: Centreville, VA, 38.9084N, 77.4408W $GPRMC,125106,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*28 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125106,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7F $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,60,317,49,08,34,315,45,11,35,148,45*71 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,50,23,09,182,37*74 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D $GPGLL,3854.5087,N,07726.4523,W,125106,V,S*55 $GPBOD,,T,,M,,*47 $GPBWC,125106,,,,,,T,,M,,N,,S*68 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125108,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*26 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125108,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*71 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,60,317,49,08,34,315,45,11,35,148,45*71 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,50,23,09,182,37*74 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D $GPGLL,3854.5087,N,07726.4523,W,125108,V,S*5B $GPBOD,,T,,M,,*47 $GPBWC,125108,,,,,,T,,M,,N,,S*66 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125110,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2F $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125110,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*78 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,34,315,44,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,51,23,09,182,37*76 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D $GPGLL,3854.5087,N,07726.4523,W,125110,V,S*52 $GPBOD,,T,,M,,*47 $GPBWC,125110,,,,,,T,,M,,N,,S*6F $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125112,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2D $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125112,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7A $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,34,315,44,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,36,28,09,271,36*7E $GPGLL,3854.5087,N,07726.4523,W,125112,V,S*50 $GPBOD,,T,,M,,*47 $GPBWC,125112,,,,,,T,,M,,N,,S*6D $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125114,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2B $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125114,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7C $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,50,23,09,182,37*74 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D $GPGLL,3854.5087,N,07726.4523,W,125114,V,S*56 $GPBOD,,T,,M,,*47 $GPBWC,125114,,,,,,T,,M,,N,,S*6B $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125116,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*29 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125116,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7E $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,50,23,09,182,37*74 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D $GPGLL,3854.5087,N,07726.4523,W,125116,V,S*54 $GPBOD,,T,,M,,*47 $GPBWC,125116,,,,,,T,,M,,N,,S*69 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125118,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*27 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125118,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*70 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,51,23,09,182,37*75 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D $GPGLL,3854.5087,N,07726.4523,W,125118,V,S*5A $GPBOD,,T,,M,,*47 $GPBWC,125118,,,,,,T,,M,,N,,S*67 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125120,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2C $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125120,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7B $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,44,19,72,076,50,23,09,182,37*70 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D $GPGLL,3854.5087,N,07726.4523,W,125120,V,S*51 $GPBOD,,T,,M,,*47 $GPBWC,125120,,,,,,T,,M,,N,,S*6C $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125122,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2E $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125122,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*79 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,35,28,09,271,37*7C $GPGLL,3854.5087,N,07726.4523,W,125122,V,S*53 $GPBOD,,T,,M,,*47 $GPBWC,125122,,,,,,T,,M,,N,,S*6E $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125124,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*28 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125124,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7F $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,35,28,09,271,37*7C $GPGLL,3854.5087,N,07726.4523,W,125124,V,S*55 $GPBOD,,T,,M,,*47 $GPBWC,125124,,,,,,T,,M,,N,,S*68 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125126,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2A $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125126,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7D $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,36,148,45*73 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,36,28,09,271,37*7F $GPGLL,3854.5087,N,07726.4523,W,125126,V,S*57 $GPBOD,,T,,M,,*47 $GPBWC,125126,,,,,,T,,M,,N,,S*6A $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125128,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*24 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125128,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*73 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,36,148,45*73 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,35,28,09,271,37*7C $GPGLL,3854.5087,N,07726.4523,W,125128,V,S*59 gpsd-3.15/test/daemon/GPSmap-76S.log.chk0000664000175000017500000003343312467340617015762 0ustar esresr$GPRMC,125106,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*28 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125106,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7F {"class":"TPV","mode":3,"lat":38.908478333,"lon":-77.440871667,"alt":268.800} $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A {"class":"TPV","mode":3,"lat":38.908478333,"lon":-77.440871667,"alt":268.800,"epv":69.000} $GPGSV,3,1,10,03,41,050,46,07,60,317,49,08,34,315,45,11,35,148,45*71 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,50,23,09,182,37*74 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":60,"az":317,"ss":49,"used":true},{"PRN":8,"el":34,"az":315,"ss":45,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":45,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":36,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125106,V,S*55 $GPBOD,,T,,M,,*47 $GPBWC,125106,,,,,,T,,M,,N,,S*68 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125108,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*26 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125108,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*71 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,60,317,49,08,34,315,45,11,35,148,45*71 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,50,23,09,182,37*74 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":60,"az":317,"ss":49,"used":true},{"PRN":8,"el":34,"az":315,"ss":45,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":45,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":36,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125108,V,S*5B $GPBOD,,T,,M,,*47 $GPBWC,125108,,,,,,T,,M,,N,,S*66 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125110,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2F $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125110,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*78 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,34,315,44,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,51,23,09,182,37*76 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":34,"az":315,"ss":44,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":46,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":51,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":36,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125110,V,S*52 $GPBOD,,T,,M,,*47 $GPBWC,125110,,,,,,T,,M,,N,,S*6F $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125112,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2D $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125112,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7A $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,34,315,44,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,36,28,09,271,36*7E {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":34,"az":315,"ss":44,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":46,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":36,"used":true},{"PRN":28,"el":9,"az":271,"ss":36,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125112,V,S*50 $GPBOD,,T,,M,,*47 $GPBWC,125112,,,,,,T,,M,,N,,S*6D $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125114,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2B $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125114,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7C $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,50,23,09,182,37*74 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":35,"az":315,"ss":45,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":45,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":36,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125114,V,S*56 $GPBOD,,T,,M,,*47 $GPBWC,125114,,,,,,T,,M,,N,,S*6B $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125116,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*29 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125116,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7E $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,50,23,09,182,37*74 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":35,"az":315,"ss":45,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":45,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":36,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125116,V,S*54 $GPBOD,,T,,M,,*47 $GPBWC,125116,,,,,,T,,M,,N,,S*69 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125118,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*27 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125118,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*70 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,45,16,27,068,43,19,72,076,51,23,09,182,37*75 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":35,"az":315,"ss":45,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":45,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":51,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":36,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125118,V,S*5A $GPBOD,,T,,M,,*47 $GPBWC,125118,,,,,,T,,M,,N,,S*67 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125120,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2C $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125120,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7B $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,44,19,72,076,50,23,09,182,37*70 $GPGSV,3,3,10,24,06,166,35,28,09,271,36*7D {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":35,"az":315,"ss":45,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":46,"used":true},{"PRN":16,"el":27,"az":68,"ss":44,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":36,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125120,V,S*51 $GPBOD,,T,,M,,*47 $GPBWC,125120,,,,,,T,,M,,N,,S*6C $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125122,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2E $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125122,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*79 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,35,28,09,271,37*7C {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":35,"az":315,"ss":45,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":46,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":37,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125122,V,S*53 $GPBOD,,T,,M,,*47 $GPBWC,125122,,,,,,T,,M,,N,,S*6E $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125124,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*28 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125124,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7F $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,35,148,45*70 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,35,28,09,271,37*7C {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":35,"az":315,"ss":45,"used":true},{"PRN":11,"el":35,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":46,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":37,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125124,V,S*55 $GPBOD,,T,,M,,*47 $GPBWC,125124,,,,,,T,,M,,N,,S*68 $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125126,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*2A $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125126,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*7D $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,36,148,45*73 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,36,28,09,271,37*7F {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":35,"az":315,"ss":45,"used":true},{"PRN":11,"el":36,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":46,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":36,"used":true},{"PRN":28,"el":9,"az":271,"ss":37,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125126,V,S*57 $GPBOD,,T,,M,,*47 $GPBWC,125126,,,,,,T,,M,,N,,S*6A $GPVTG,0.0,T,10.5,M,0.0,N,0.0,K*7A $GPXTE,V,V,,,N,S*43 $GPRTE,1,1,c,*37 $GPRMC,125128,V,3854.5087,N,07726.4523,W,0.0,0.0,241011,10.5,W,S*24 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,125128,3854.5087,N,07726.4523,W,8,10,2.0,268.8,M,-33.9,M,,*73 $GPGSA,A,3,03,07,08,11,13,16,19,23,24,28,,,3.6,2.0,3.0*3A $GPGSV,3,1,10,03,41,050,46,07,61,316,49,08,35,315,45,11,36,148,45*73 $GPGSV,3,2,10,13,38,213,46,16,27,068,43,19,72,076,50,23,09,182,37*77 $GPGSV,3,3,10,24,06,166,35,28,09,271,37*7C {"class":"SKY","xdop":0.60,"ydop":0.64,"vdop":3.00,"tdop":0.82,"hdop":2.00,"gdop":1.82,"pdop":3.60,"satellites":[{"PRN":3,"el":41,"az":50,"ss":46,"used":true},{"PRN":7,"el":61,"az":316,"ss":49,"used":true},{"PRN":8,"el":35,"az":315,"ss":45,"used":true},{"PRN":11,"el":36,"az":148,"ss":45,"used":true},{"PRN":13,"el":38,"az":213,"ss":46,"used":true},{"PRN":16,"el":27,"az":68,"ss":43,"used":true},{"PRN":19,"el":72,"az":76,"ss":50,"used":true},{"PRN":23,"el":9,"az":182,"ss":37,"used":true},{"PRN":24,"el":6,"az":166,"ss":35,"used":true},{"PRN":28,"el":9,"az":271,"ss":37,"used":true}]} $GPGLL,3854.5087,N,07726.4523,W,125128,V,S*59 gpsd-3.15/test/daemon/ac12.log0000664000175000017500000000643012461156335014231 0ustar esresr# Name: Magellan Professional (formerly Thales/Ashtech) AC12 # Chipset: AC12 # Submitter: Chris Kuethe # Date: 2007-12-23 # Location: Playa del Carmen, Mexico. 20.63N/87.07W # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGGA,193221.00,2037.72792,N,08704.08478,W,1,04,1.7,-30.40,M,-13.9,M,,*7D $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 $GPRMC,193221.00,A,2037.7279,N,08704.0848,W,00.1,201.8,231207,01,W,A*2D $GPZDA,193223.00,23,12,2007,00,00*69 $GPGGA,193222.00,2037.72832,N,08704.08469,W,1,04,1.7,-30.00,M,-13.9,M,,*7F $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 $GPRMC,193222.00,A,2037.7283,N,08704.0847,W,00.0,201.8,231207,01,W,A*25 $GPZDA,193224.00,23,12,2007,00,00*6E $GPGGA,193223.00,2037.72880,N,08704.08455,W,1,04,1.7,-29.55,M,-13.9,M,,*70 $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 $GPRMC,193223.00,A,2037.7288,N,08704.0846,W,00.1,201.8,231207,01,W,A*2F $GPZDA,193225.00,23,12,2007,00,00*6F $GPGGA,193224.00,2037.72912,N,08704.08451,W,1,04,1.7,-29.53,M,-13.9,M,,*7F $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 $GPRMC,193224.00,A,2037.7291,N,08704.0845,W,00.0,201.8,231207,01,W,A*22 $GPZDA,193226.00,23,12,2007,00,00*6C $GPGGA,193225.00,2037.72949,N,08704.08443,W,1,04,1.7,-29.21,M,-13.9,M,,*76 $GPGSA,A,3,10,09,28,13,,,,,,,,,03.4,01.7,03.0*00 $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 $GPRMC,193225.00,A,2037.7295,N,08704.0844,W,00.1,201.8,231207,01,W,A*27 $GPZDA,193227.00,23,12,2007,00,00*6D $GPGGA,193226.00,2037.72992,N,08704.08433,W,1,04,1.7,-28.69,M,-13.9,M,,*79 $GPGSA,A,3,10,09,28,13,,,,,,,,,03.4,01.7,03.0*00 $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 $GPRMC,193226.00,A,2037.7299,N,08704.0843,W,00.1,201.8,231207,01,W,A*2F $GPZDA,193228.00,23,12,2007,00,00*62 $GPGGA,193227.00,2037.73032,N,08704.08423,W,1,04,1.7,-28.28,M,-13.9,M,,*7E $GPGSA,A,3,10,28,09,13,,,,,,,,,03.4,01.7,03.0*00 $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 $GPRMC,193227.00,A,2037.7303,N,08704.0842,W,00.0,201.8,231207,01,W,A*2C gpsd-3.15/test/daemon/ac12.log.chk0000664000175000017500000002253612467340617015006 0ustar esresr$GPGGA,193221.00,2037.72792,N,08704.08478,W,1,04,1.7,-30.40,M,-13.9,M,,*7D {"class":"TPV","mode":3,"lat":20.628798667,"lon":-87.068079667,"alt":-30.400} $GPGSA,A,3,10,28,09,13,,,,,,,,,03.4,01.7,03.0*00 {"class":"TPV","mode":3,"lat":20.628798667,"lon":-87.068079667,"alt":-30.400,"epv":69.000} $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","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":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:21.000Z","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} $GPZDA,193223.00,23,12,2007,00,00*69 $GPGGA,193222.00,2037.72832,N,08704.08469,W,1,04,1.7,-30.00,M,-13.9,M,,*7F $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","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":120,"el":8,"az":96,"ss":39,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:22.000Z","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} $GPZDA,193224.00,23,12,2007,00,00*6E $GPGGA,193223.00,2037.72880,N,08704.08455,W,1,04,1.7,-29.55,M,-13.9,M,,*70 $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","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":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:23.000Z","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} $GPZDA,193225.00,23,12,2007,00,00*6F $GPGGA,193224.00,2037.72912,N,08704.08451,W,1,04,1.7,-29.53,M,-13.9,M,,*7F $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","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":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:24.000Z","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} $GPZDA,193226.00,23,12,2007,00,00*6C $GPGGA,193225.00,2037.72949,N,08704.08443,W,1,04,1.7,-29.21,M,-13.9,M,,*76 $GPGSA,A,3,10,09,28,13,,,,,,,,,03.4,01.7,03.0*00 $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","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":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":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:25.000Z","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} $GPZDA,193227.00,23,12,2007,00,00*6D $GPGGA,193226.00,2037.72992,N,08704.08433,W,1,04,1.7,-28.69,M,-13.9,M,,*79 $GPGSA,A,3,10,09,28,13,,,,,,,,,03.4,01.7,03.0*00 $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","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":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":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:26.000Z","ept":0.005,"lat":20.628831667,"lon":-87.068071667,"alt":-28.690,"epx":11.444,"epy":24.060,"epv":69.000,"track":201.8000,"speed":0.051,"climb":-0.520} $GPZDA,193228.00,23,12,2007,00,00*62 $GPGGA,193227.00,2037.73032,N,08704.08423,W,1,04,1.7,-28.28,M,-13.9,M,,*7E $GPGSA,A,3,10,28,09,13,,,,,,,,,03.4,01.7,03.0*00 $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","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":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":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:27.000Z","ept":0.005,"lat":20.628838333,"lon":-87.068070000,"alt":-28.280,"epx":11.444,"epy":24.060,"epv":69.000,"track":201.8000,"speed":0.000,"climb":-0.410} gpsd-3.15/test/daemon/ac12_binary.log0000664000175000017500000001023212467342657015602 0ustar esresr# Name: Magellan Professional (formerly Thales/Ashtech) AC12 # Chipset: AC12 # Submitter: Chris Kuethe # Date: 2007-12-23 # Location: Playa del Carmen, Mexico. 20.63N/87.07W # Notes: Last cycle is truncated to avoid ending the file with a $PASHR # binary packet, which confusses the test machinery. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPZDA,183531.00,23,12,2007,00,00*6C $GPGGA,183530.00,2037.76012,N,08704.07373,W,1,03,2.2,072.35,M,-13.9,M,,*6B $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,50,02,55,274,50,04,61,358,*70 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 $PASHR,POS,0,03,183530.00,2037.76012,N,08704.07373,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*20 $GPRMC,183530.00,A,2037.7601,N,08704.0737,W,00.0,359.4,231207,01,W,A*26 $PASHR,SAT,03,28,139,38,46,U,10,193,17,50,U,02,274,55,50,U*53 $PASHR,XMG,12,Solution valid*4A $PASHR,MCA,à&E.A_µL1ž„ ?²¹ u2Ø‹'$d€ÖÑ $PASHR,MCA,à `2A[/FWù ?Žp’796<ýÊìd€˜° $PASHR,MCA,à7‰ 2A]FÓÊÅÔ?²@Ú![2ÿ‰z…d’ $PASHR,PBN,ý|????A€ï@&šÁVÀ/Ó1SAA p—:m;z©Z;Ó;·ÛÏI $GPZDA,183532.00,23,12,2007,00,00*6F $GPGGA,183531.00,2037.76011,N,08704.07369,W,1,03,2.2,072.35,M,-13.9,M,,*62 $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,50,02,55,274,50,04,61,358,*70 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 $PASHR,POS,0,03,183531.00,2037.76011,N,08704.07369,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*29 $GPRMC,183531.00,A,2037.7601,N,08704.0737,W,00.0,359.4,231207,01,W,A*27 $PASHR,SAT,03,28,139,38,46,U,10,193,17,50,U,02,274,55,50,U*53 $PASHR,XMG,12,Solution valid*4A $PASHR,MCA,ô&E.A_·Ñd±Gž?²¹(ú°qT‹9¢d€Žû $PASHR,MCA,ô `2A[+Š>ëp¥?Žpj·Ñ;%ýÊî„d€U. $PASHR,MCA,ô7‰ 2A]FaCA\?²8š:ƒsÿ‰‹edÐÒ $PASHR,PBN,ýè????A€ïbÐÓWÁVÀ0$£AA pžT;íÞF;\8<ÊqÛOÓ $GPZDA,183533.00,23,12,2007,00,00*6E $GPGGA,183532.00,2037.76010,N,08704.07366,W,1,03,2.2,072.35,M,-13.9,M,,*6F $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,49,02,55,274,50,04,61,358,*78 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 $PASHR,POS,0,03,183532.00,2037.76010,N,08704.07366,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*24 $GPRMC,183532.00,A,2037.7601,N,08704.0737,W,00.0,359.4,231207,01,W,A*24 $PASHR,SAT,03,28,139,38,46,U,10,193,17,49,U,02,274,55,50,U*5B $PASHR,XMG,12,Solution valid*4A $PASHR,MCA,&E.A_ºZÇøHˆ?²¹D°vó‹Y®d€8§ $PASHR,MCA, `1A[( :Áƒc?ŽpC\o7ýÊýd€PŠ $PASHR,MCA,7‰ 2A]EO#…žÏ?²0dj`éÿ‰§ÎdЬ $PASHR,PBN,ýƒÐ????A€ï°ˆêÁVÀ0Y]7AA p©–#;äî;nNÂ<Ž¢Ûšñ $GPZDA,183534.00,23,12,2007,00,00*69 $GPGGA,183533.00,2037.76009,N,08704.07361,W,1,03,2.2,072.35,M,-13.9,M,,*61 $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,49,02,55,274,50,04,61,358,*78 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 $PASHR,POS,0,03,183533.00,2037.76009,N,08704.07361,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*2A $GPRMC,183533.00,A,2037.7601,N,08704.0736,W,00.0,359.4,231207,01,W,A*24 $PASHR,SAT,03,28,139,38,46,U,10,193,17,49,U,02,274,55,50,U*5B $PASHR,XMG,12,Solution valid*4A $PASHR,MCA,&E.A_Œå ãX?²¹`8l'‹[þd€Œs $PASHR,MCA, `1A[$o42Œ?ŽpûˆÉîýÊí˜d€ÒÝ $PASHR,MCA,7‰ 2A]DVÿ#?²(Qaü,ÿ‰ŠDdx $PASHR,PBN,ý‡ž????A€ï÷s;šÁVÀ0µU÷AA oþ;S:;Œ÷Ñ;Ô/< uÛ_ $GPZDA,183535.00,23,12,2007,00,00*68 $GPGGA,183534.00,2037.76008,N,08704.07358,W,1,03,2.2,072.35,M,-13.9,M,,*6D $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,49,02,55,274,50,04,61,358,*78 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 $PASHR,POS,0,03,183534.00,2037.76008,N,08704.07358,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*26 $GPRMC,183534.00,A,2037.7601,N,08704.0736,W,00.0,359.4,231207,01,W,A*23 gpsd-3.15/test/daemon/ac12_binary.log.chk0000664000175000017500000002002112467342657016343 0ustar esresr$GPZDA,183531.00,23,12,2007,00,00*6C $GPGGA,183530.00,2037.76012,N,08704.07373,W,1,03,2.2,072.35,M,-13.9,M,,*6B {"class":"TPV","mode":3,"time":"2007-12-23T18:35:30.000Z","ept":0.005,"lat":20.629335333,"lon":-87.067895500,"alt":72.350} $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,50,02,55,274,50,04,61,358,*70 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 {"class":"SKY","hdop":2.20,"pdop":2.20,"satellites":[{"PRN":28,"el":38,"az":139,"ss":46,"used":true},{"PRN":10,"el":17,"az":193,"ss":50,"used":true},{"PRN":2,"el":55,"az":274,"ss":50,"used":true},{"PRN":4,"el":61,"az":358,"ss":0,"used":false},{"PRN":17,"el":38,"az":54,"ss":0,"used":false},{"PRN":9,"el":21,"az":281,"ss":0,"used":false},{"PRN":12,"el":10,"az":322,"ss":0,"used":false},{"PRN":20,"el":3,"az":38,"ss":0,"used":false},{"PRN":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"el":45,"az":118,"ss":0,"used":false}]} $PASHR,POS,0,03,183530.00,2037.76012,N,08704.07373,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*20 $GPRMC,183530.00,A,2037.7601,N,08704.0737,W,00.0,359.4,231207,01,W,A*26 {"class":"TPV","mode":3,"time":"2007-12-23T18:35:30.000Z","ept":0.005,"lat":20.629335000,"lon":-87.067895000,"alt":72.350,"track":359.4000,"speed":0.000,"climb":0.000} $PASHR,SAT,03,28,139,38,46,U,10,193,17,50,U,02,274,55,50,U*53 {"class":"SKY","hdop":2.20,"pdop":2.20,"satellites":[{"PRN":28,"el":38,"az":139,"ss":46,"used":true},{"PRN":10,"el":17,"az":193,"ss":50,"used":true},{"PRN":2,"el":55,"az":274,"ss":50,"used":true}]} $PASHR,XMG,12,Solution valid*4A $PASHR,MCA,à&E.A_µL1ž„ ?²¹ u2Ø‹'$d€ÖÑ $PASHR,MCA,à `2A[/FWù ?Žp’796<ýÊìd€˜° $PASHR,MCA,à7‰ 2A]FÓÊÅÔ?²@Ú![2ÿ‰z…d’ $PASHR,PBN,ý|????A€ï@&šÁVÀ/Ó1SAA p—:m;z©Z;Ó;·ÛÏI $GPZDA,183532.00,23,12,2007,00,00*6F $GPGGA,183531.00,2037.76011,N,08704.07369,W,1,03,2.2,072.35,M,-13.9,M,,*62 $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,50,02,55,274,50,04,61,358,*70 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 {"class":"SKY","hdop":2.20,"pdop":2.20,"satellites":[{"PRN":28,"el":38,"az":139,"ss":46,"used":true},{"PRN":10,"el":17,"az":193,"ss":50,"used":true},{"PRN":2,"el":55,"az":274,"ss":50,"used":true},{"PRN":4,"el":61,"az":358,"ss":0,"used":false},{"PRN":17,"el":38,"az":54,"ss":0,"used":false},{"PRN":9,"el":21,"az":281,"ss":0,"used":false},{"PRN":12,"el":10,"az":322,"ss":0,"used":false},{"PRN":20,"el":3,"az":38,"ss":0,"used":false},{"PRN":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"el":45,"az":118,"ss":0,"used":false}]} $PASHR,POS,0,03,183531.00,2037.76011,N,08704.07369,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*29 $GPRMC,183531.00,A,2037.7601,N,08704.0737,W,00.0,359.4,231207,01,W,A*27 {"class":"TPV","mode":3,"time":"2007-12-23T18:35:31.000Z","ept":0.005,"lat":20.629335000,"lon":-87.067895000,"alt":72.350,"track":359.4000,"speed":0.000,"climb":-0.000} $PASHR,SAT,03,28,139,38,46,U,10,193,17,50,U,02,274,55,50,U*53 {"class":"SKY","hdop":2.20,"pdop":2.20,"satellites":[{"PRN":28,"el":38,"az":139,"ss":46,"used":true},{"PRN":10,"el":17,"az":193,"ss":50,"used":true},{"PRN":2,"el":55,"az":274,"ss":50,"used":true}]} $PASHR,XMG,12,Solution valid*4A $PASHR,MCA,ô&E.A_·Ñd±Gž?²¹(ú°qT‹9¢d€Žû $PASHR,MCA,ô `2A[+Š>ëp¥?Žpj·Ñ;%ýÊî„d€U. $PASHR,MCA,ô7‰ 2A]FaCA\?²8š:ƒsÿ‰‹edÐÒ $PASHR,PBN,ýè????A€ïbÐÓWÁVÀ0$£AA pžT;íÞF;\8<ÊqÛOÓ $GPZDA,183533.00,23,12,2007,00,00*6E $GPGGA,183532.00,2037.76010,N,08704.07366,W,1,03,2.2,072.35,M,-13.9,M,,*6F $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,49,02,55,274,50,04,61,358,*78 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 {"class":"SKY","hdop":2.20,"pdop":2.20,"satellites":[{"PRN":28,"el":38,"az":139,"ss":46,"used":true},{"PRN":10,"el":17,"az":193,"ss":49,"used":true},{"PRN":2,"el":55,"az":274,"ss":50,"used":true},{"PRN":4,"el":61,"az":358,"ss":0,"used":false},{"PRN":17,"el":38,"az":54,"ss":0,"used":false},{"PRN":9,"el":21,"az":281,"ss":0,"used":false},{"PRN":12,"el":10,"az":322,"ss":0,"used":false},{"PRN":20,"el":3,"az":38,"ss":0,"used":false},{"PRN":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"el":45,"az":118,"ss":0,"used":false}]} $PASHR,POS,0,03,183532.00,2037.76010,N,08704.07366,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*24 $GPRMC,183532.00,A,2037.7601,N,08704.0737,W,00.0,359.4,231207,01,W,A*24 {"class":"TPV","mode":3,"time":"2007-12-23T18:35:32.000Z","ept":0.005,"lat":20.629335000,"lon":-87.067895000,"alt":72.350,"track":359.4000,"speed":0.000,"climb":-0.000} $PASHR,SAT,03,28,139,38,46,U,10,193,17,49,U,02,274,55,50,U*5B {"class":"SKY","hdop":2.20,"pdop":2.20,"satellites":[{"PRN":28,"el":38,"az":139,"ss":46,"used":true},{"PRN":10,"el":17,"az":193,"ss":49,"used":true},{"PRN":2,"el":55,"az":274,"ss":50,"used":true}]} $PASHR,XMG,12,Solution valid*4A $PASHR,MCA,&E.A_ºZÇøHˆ?²¹D°vó‹Y®d€8§ $PASHR,MCA, `1A[( :Áƒc?ŽpC\o7ýÊýd€PŠ $PASHR,MCA,7‰ 2A]EO#…žÏ?²0dj`éÿ‰§ÎdЬ $PASHR,PBN,ýƒÐ????A€ï°ˆêÁVÀ0Y]7AA p©–#;äî;nNÂ<Ž¢Ûšñ $GPZDA,183534.00,23,12,2007,00,00*69 $GPGGA,183533.00,2037.76009,N,08704.07361,W,1,03,2.2,072.35,M,-13.9,M,,*61 $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,49,02,55,274,50,04,61,358,*78 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 {"class":"SKY","hdop":2.20,"pdop":2.20,"satellites":[{"PRN":28,"el":38,"az":139,"ss":46,"used":true},{"PRN":10,"el":17,"az":193,"ss":49,"used":true},{"PRN":2,"el":55,"az":274,"ss":50,"used":true},{"PRN":4,"el":61,"az":358,"ss":0,"used":false},{"PRN":17,"el":38,"az":54,"ss":0,"used":false},{"PRN":9,"el":21,"az":281,"ss":0,"used":false},{"PRN":12,"el":10,"az":322,"ss":0,"used":false},{"PRN":20,"el":3,"az":38,"ss":0,"used":false},{"PRN":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"el":45,"az":118,"ss":0,"used":false}]} $PASHR,POS,0,03,183533.00,2037.76009,N,08704.07361,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*2A $GPRMC,183533.00,A,2037.7601,N,08704.0736,W,00.0,359.4,231207,01,W,A*24 {"class":"TPV","mode":3,"time":"2007-12-23T18:35:33.000Z","ept":0.005,"lat":20.629335000,"lon":-87.067893333,"alt":72.350,"track":359.4000,"speed":0.000,"climb":-0.000} $PASHR,SAT,03,28,139,38,46,U,10,193,17,49,U,02,274,55,50,U*5B {"class":"SKY","hdop":2.20,"pdop":2.20,"satellites":[{"PRN":28,"el":38,"az":139,"ss":46,"used":true},{"PRN":10,"el":17,"az":193,"ss":49,"used":true},{"PRN":2,"el":55,"az":274,"ss":50,"used":true}]} $PASHR,XMG,12,Solution valid*4A $PASHR,MCA,&E.A_Œå ãX?²¹`8l'‹[þd€Œs $PASHR,MCA, `1A[$o42Œ?ŽpûˆÉîýÊí˜d€ÒÝ $PASHR,MCA,7‰ 2A]DVÿ#?²(Qaü,ÿ‰ŠDdx $PASHR,PBN,ý‡ž????A€ï÷s;šÁVÀ0µU÷AA oþ;S:;Œ÷Ñ;Ô/< uÛ_ $GPZDA,183535.00,23,12,2007,00,00*68 $GPGGA,183534.00,2037.76008,N,08704.07358,W,1,03,2.2,072.35,M,-13.9,M,,*6D $GPGSA,A,2,02,10,28,,,,,,,,,,02.2,02.2,*14 $GPGSV,3,1,10,28,38,139,46,10,17,193,49,02,55,274,50,04,61,358,*78 $GPGSV,3,2,10,17,38,054,,09,21,281,,12,10,322,,20,03,038,*7F $GPGSV,3,3,10,33,08,096,,35,45,118,*70 {"class":"SKY","hdop":2.20,"pdop":2.20,"satellites":[{"PRN":28,"el":38,"az":139,"ss":46,"used":true},{"PRN":10,"el":17,"az":193,"ss":49,"used":true},{"PRN":2,"el":55,"az":274,"ss":50,"used":true},{"PRN":4,"el":61,"az":358,"ss":0,"used":false},{"PRN":17,"el":38,"az":54,"ss":0,"used":false},{"PRN":9,"el":21,"az":281,"ss":0,"used":false},{"PRN":12,"el":10,"az":322,"ss":0,"used":false},{"PRN":20,"el":3,"az":38,"ss":0,"used":false},{"PRN":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"el":45,"az":118,"ss":0,"used":false}]} $PASHR,POS,0,03,183534.00,2037.76008,N,08704.07358,W,058.48,,359.4,000.0,+000.0,2.2,2.2,0.0,1.0,BQ00*26 $GPRMC,183534.00,A,2037.7601,N,08704.0736,W,00.0,359.4,231207,01,W,A*23 {"class":"TPV","mode":3,"time":"2007-12-23T18:35:34.000Z","ept":0.005,"lat":20.629335000,"lon":-87.067893333,"alt":72.350,"track":359.4000,"speed":0.000,"climb":-0.000} gpsd-3.15/test/daemon/ait250.log0000664000175000017500000001655112461156335014514 0ustar esresr# Name: Digital Yacht AIT250 # Chipset: Unknown # Description: Class B Marine AIS receiver # Submitter: Jan Veninga # Date: 2009-07-30 # Location: Enkhuizen, The Netherlands, 52.69997N/5.290465E # # Device is described here: # http://www.yachtronics.com/yachtronics/manuals/DIGITAL%20YACHT%20AIT250%20OPERATION.pdf # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPRMC,194907.00,A,5241.99815,N,00517.56525,E,0.005,,010809,,,A*7B !AIVDO,1,1,,,B3aC3LP00063aj7RNpl03wSUwP06,0*43 !AIVDM,1,1,,B,13njCt031t0DA=lN2:jKmad60l1p,0*12 $GPGBS,194907.00,3.0,1.9,4.2,,,,*4E $GPRMC,194908.00,A,5241.99805,N,00517.56503,E,0.003,,010809,,,A*77 !AIVDO,1,1,,,B3aC3LP00063ai7RNph03wT5wP06,0*23 !AIVDM,1,1,,B,33meMd50000EoJPMvw?:Ubp@0000,0*4F $GPGBS,194908.00,3.0,1.9,4.2,,,,*41 $GPRMC,194909.00,A,5241.99792,N,00517.56477,E,0.004,,010809,,,A*72 !AIVDO,1,1,,,B3aC3LP00063agWRNpd03wTUwP06,0*21 $GPGBS,194909.00,3.0,1.9,4.2,,,,*40 !AIVDM,1,1,,A,B3`gaQ000062PeWRIt403wTUoP06,0*11 !AIVDM,1,1,,A,13b?ED00000E2`dN1S9=oS0@00Sb,0*6E $GPRMC,194910.00,A,5241.99782,N,00517.56453,E,0.006,,010809,,,A*7F !AIVDO,1,1,,,B3aC3LP00063afWRNp`03wU5wP06,0*45 !AIVDM,1,1,,A,D02E3:0Alg6D000000000000001,2*17 $GPGBS,194910.00,3.0,1.9,4.2,,,,*48 !AIVDM,1,1,,A,139QcE7P?w4?wv0PS<,0*5A $GPRMC,194911.00,A,5241.99772,N,00517.56430,E,0.020,229.98,010809,,,A*66 !AIVDM,1,1,,B,402E3:0000HttPGEahN7pi700p6T,0*09 !AIVDM,1,1,,A,14S64>51ASPEeIpN05::v`lF086a,0*3B !AIVDO,1,1,,,B3aC3LP00063aeWRNpV?gwUUwP06,0*4B $GPGBS,194911.00,3.0,1.9,4.2,,,,*49 !AIVDM,1,1,,B,13bf9v00010IaB5OP1S0GmF@N0OLBF?vL00SQ,0*35 $GPRMC,194916.00,A,5241.99726,N,00517.56385,E,0.007,,010809,,,A*7A !AIVDO,1,1,,,B3aC3LP00063ac7RNp@03w`5wP06,0*35 $GPGBS,194916.00,3.0,1.9,4.2,,,,*4E !AIVDM,1,1,,B,100001?P?w4?wp0W3h,0*28 $GPRMC,194917.00,A,5241.99721,N,00517.56389,E,0.003,,010809,,,A*74 !AIVDO,1,1,,,B3aC3LP00063ac7RNp@03w`UwP06,0*55 $GPGBS,194917.00,3.0,1.9,4.2,,,,*4F $GPRMC,194918.00,A,5241.99715,N,00517.56394,E,0.004,,010809,,,A*77 !AIVDO,1,1,,,B3aC3LP00063acWRNp<03wa5wP06,0*28 $GPGBS,194918.00,3.0,1.9,4.2,,,,*40 !AIVDM,2,1,8,B,54S64>02;dlqK8@cL00lDADl0000000000000016;0<:65wj0?hCDm1DQ0C@,0*63 !AIVDM,2,2,8,B,00000000002,2*2D $GPRMC,194919.00,A,5241.99711,N,00517.56399,E,0.004,,010809,,,A*7F !AIVDO,1,1,,,B3aC3LP00063acWRNp<03waUwP06,0*48 $GPGBS,194919.00,3.0,1.9,4.2,,,,*41 $GPRMC,194920.00,A,5241.99711,N,00517.56409,E,0.005,,010809,,,A*7A !AIVDM,1,1,,B,13`g5:0P0`0E9MbN1FgDE?vV06K4,0*45 !AIVDO,1,1,,,B3aC3LP00063ad7RNp<03wb5wP06,0*4C !AIVDM,1,1,,A,13BE3l001n0DJHVN1fQJrHjb00SU,0*35 $GPGBS,194920.00,3.0,1.9,4.2,,,,*4B $GPRMC,194921.00,A,5241.99708,N,00517.56417,E,0.007,,010809,,,A*7E !AIVDM,1,1,,A,13bf9v00010IaApN8IK3uSvd0Hf>428b0D1S,0*43 $GPRMC,194923.00,A,5241.99704,N,00517.56423,E,0.007,,010809,,,A*77 $GPGBS,194923.00,3.0,1.9,4.2,,,,*48 !AIVDO,1,1,,,B3aC3LP00063ae7RNp803wcUwP06,0*28 $GPRMC,194924.00,A,5241.99705,N,00517.56425,E,0.006,,010809,,,A*76 $GPGBS,194924.00,3.0,1.9,4.2,,,,*4F !AIVDO,1,1,,,B3aC3LP00063ae7RNp803wd5wP06,0*4F !AIVDM,1,1,,B,100001?P?w4?wp0PS6,0*11 !AIVDM,1,1,,B,13aC225P130HqQ@N3tfQ5OvfP6K4,0*37 $GPRMC,194925.00,A,5241.99714,N,00517.56429,E,0.002,,010809,,,A*7F $GPGBS,194925.00,3.0,1.9,4.2,,,,*4E !AIVDO,1,1,,,B3aC3LP00063ae7RNp<03wdUwP06,0*2B !AIVDM,1,1,,B,D02E3:1FTg6D000000000000001,2*2A $GPRMC,194926.00,A,5241.99718,N,00517.56440,E,0.010,,010809,,,A*7C $GPGBS,194926.00,3.0,1.9,4.2,,,,*4D !AIVDO,1,1,,,B3aC3LP00063af7RNp<03we5wP06,0*49 $GPRMC,194927.00,A,5241.99723,N,00517.56454,E,0.009,,010809,,,A*78 $GPGBS,194927.00,3.0,1.9,4.2,,,,*4C !AIVDO,1,1,,,B3aC3LP00063afWRNp@03weUsP06,0*31 !AIVDM,1,1,,A,13`p;<0P0`0E8p0N1GU4G?vl@@@G,0*32 $GPRMC,194928.00,A,5241.99730,N,00517.56469,E,0.005,,010809,,,A*77 $GPGBS,194928.00,3.0,1.9,4.2,,,,*43 !AIVDO,1,1,,,B3aC3LP00063ag7RNpD03wf5sP06,0*37 !AIVDM,1,1,,B,100001?P?w4?wp0PS3,0*14 $GPRMC,194929.00,A,5241.99738,N,00517.56482,E,0.002,,010809,,,A*7C $GPGBS,194929.00,3.0,1.9,4.2,,,,*42 !AIVDO,1,1,,,B3aC3LP00063ah7RNpD03wfUsP06,0*58 !AIVDM,1,1,,A,139QcE7P?w4?wv0URP,0*32 $GPRMC,194930.00,A,5241.99745,N,00517.56492,E,0.006,,010809,,,A*7B $GPGBS,194930.00,3.0,1.9,4.2,,,,*4A !AIVDO,1,1,,,B3aC3LP00063ahWRNpH03wg5sP06,0*55 !AIVDM,1,1,,B,402E3:0000HttPGEahN7pi700pBB,0*6B $GPRMC,194931.00,A,5241.99750,N,00517.56500,E,0.002,,010809,,,A*70 $GPGBS,194931.00,3.0,1.9,4.2,,,,*4B !AIVDM,1,1,,B,13bcuF0P000H@F2N:0tLH03wkUoP06,0*00 $GPGBS,194939.00,3.0,1.9,4.2,,,,*43 !AIVDM,1,1,,B,B3`gaQ000062Pc7RIt403wkUoP06,0*4B !AIVDM,1,1,,B,139QcE7P?w4?wv0l08,0*02 !AIVDO,1,1,,,B3aC3LP00063ajWRNph03wkUsP06,0*1B $GPRMC,194940.00,A,5241.99812,N,00517.56549,E,0.005,,010809,,,A*75 gpsd-3.15/test/daemon/ait250.log.chk0000664000175000017500000007657112467340617015274 0ustar esresr$GPRMC,194907.00,A,5241.99815,N,00517.56525,E,0.005,,010809,,,A*7B {"class":"TPV","mode":2,"time":"2009-08-01T19:49:07.000Z","ept":0.005,"lat":52.699969167,"lon":5.292754167,"track":0.0000,"speed":0.003} !AIVDO,1,1,,,B3aC3LP00063aj7RNpl03wSUwP06,0*43 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175652,"lat":31619981,"course":0,"heading":511,"second":7,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} !AIVDM,1,1,,B,13njCt031t0DA=lN2:jKmad60l1p,0*12 {"class":"AIS","type":1,"repeat":0,"mmsi":258774000,"scaled":false,"status":0,"status_text":"Under way using engine","turn":12,"speed":124,"accuracy":false,"lon":2656698,"lat":31492809,"course":3030,"heading":310,"second":3,"maneuver":0,"raim":false,"radio":213112} $GPGBS,194907.00,3.0,1.9,4.2,,,,*4E $GPRMC,194908.00,A,5241.99805,N,00517.56503,E,0.003,,010809,,,A*77 !AIVDO,1,1,,,B3aC3LP00063ai7RNph03wT5wP06,0*23 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175650,"lat":31619980,"course":0,"heading":511,"second":8,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} !AIVDM,1,1,,B,33meMd50000EoJPMvw?:Ubp@0000,0*4F {"class":"AIS","type":3,"repeat":0,"mmsi":257646000,"scaled":false,"status":5,"status_text":"Moored","turn":0,"speed":0,"accuracy":false,"lon":2866000,"lat":31440700,"course":2710,"heading":348,"second":8,"maneuver":0,"raim":false,"radio":0} $GPGBS,194908.00,3.0,1.9,4.2,,,,*41 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:08.000Z","ept":0.005,"lat":52.699967500,"lon":5.292750500,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.002} $GPRMC,194909.00,A,5241.99792,N,00517.56477,E,0.004,,010809,,,A*72 !AIVDO,1,1,,,B3aC3LP00063agWRNpd03wTUwP06,0*21 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175647,"lat":31619979,"course":0,"heading":511,"second":9,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} $GPGBS,194909.00,3.0,1.9,4.2,,,,*40 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:09.000Z","ept":0.005,"lat":52.699965333,"lon":5.292746167,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.002} !AIVDM,1,1,,A,B3`gaQ000062PeWRIt403wTUoP06,0*11 {"class":"AIS","type":18,"repeat":0,"mmsi":244050308,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3166299,"lat":31614913,"course":0,"heading":511,"second":9,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} !AIVDM,1,1,,A,13b?ED00000E2`dN1S9=oS0@00Sb,0*6E {"class":"AIS","type":1,"repeat":0,"mmsi":245618000,"scaled":false,"status":0,"status_text":"Under way using engine","turn":0,"speed":0,"accuracy":false,"lon":2757910,"lat":31482660,"course":3550,"heading":96,"second":8,"maneuver":0,"raim":false,"radio":2282} $GPRMC,194910.00,A,5241.99782,N,00517.56453,E,0.006,,010809,,,A*7F !AIVDO,1,1,,,B3aC3LP00063afWRNp`03wU5wP06,0*45 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175645,"lat":31619978,"course":0,"heading":511,"second":10,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} !AIVDM,1,1,,A,D02E3:0Alg6D000000000000001,2*17 {"class":"AIS","type":20,"repeat":0,"mmsi":2442024,"scaled":false,"offset1":285,"number1":2,"timeout1":7,"increment1":1125,"offset2":0,"number2":0,"timeout2":0,"increment2":0,"offset3":0,"number3":0,"timeout3":0,"increment3":0,"offset4":0,"number4":0,"timeout4":0,"increment4":0} $GPGBS,194910.00,3.0,1.9,4.2,,,,*48 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:10.000Z","ept":0.005,"lat":52.699963667,"lon":5.292742167,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.003} !AIVDM,1,1,,A,139QcE7P?w4?wv0PS<,0*5A {"class":"AIS","type":1,"repeat":0,"mmsi":211315540,"scaled":false,"status":7,"status_text":"Engaged in fishing","turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":63,"maneuver":0,"raim":false,"radio":133324} $GPRMC,194911.00,A,5241.99772,N,00517.56430,E,0.020,229.98,010809,,,A*66 !AIVDM,1,1,,B,402E3:0000HttPGEahN7pi700p6T,0*09 {"class":"AIS","type":4,"repeat":0,"mmsi":2442024,"scaled":false,"timestamp":"0000-00-00T24:60:60Z","accuracy":true,"lon":3059000,"lat":31586500,"epfd":7,"epfd_text":"Surveyed","raim":false,"radio":229796} !AIVDM,1,1,,A,14S64>51ASPEeIpN05::v`lF086a,0*3B {"class":"AIS","type":1,"repeat":0,"mmsi":305235000,"scaled":false,"status":5,"status_text":"Moored","turn":5,"speed":99,"accuracy":true,"lon":2845500,"lat":31458600,"course":2810,"heading":282,"second":11,"maneuver":0,"raim":false,"radio":33193} !AIVDO,1,1,,,B3aC3LP00063aeWRNpV?gwUUwP06,0*4B {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175643,"lat":31619977,"course":2299,"heading":511,"second":11,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} $GPGBS,194911.00,3.0,1.9,4.2,,,,*49 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:11.000Z","ept":0.005,"lat":52.699962000,"lon":5.292738333,"epx":1.900,"epy":3.000,"track":229.9800,"speed":0.010} !AIVDM,1,1,,B,13bf9v00010IaB5OP1S0GmF@N0OLBF?vL00SQ,0*35 {"class":"AIS","type":1,"repeat":0,"mmsi":244010517,"scaled":false,"status":15,"status_text":"Not defined","turn":-128,"speed":99,"accuracy":false,"lon":3123912,"lat":31465329,"course":600,"heading":511,"second":14,"maneuver":0,"raim":false,"radio":2273} $GPRMC,194916.00,A,5241.99726,N,00517.56385,E,0.007,,010809,,,A*7A !AIVDO,1,1,,,B3aC3LP00063ac7RNp@03w`5wP06,0*35 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175638,"lat":31619972,"course":0,"heading":511,"second":16,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} $GPGBS,194916.00,3.0,1.9,4.2,,,,*4E {"class":"TPV","mode":2,"time":"2009-08-01T19:49:16.000Z","ept":0.005,"lat":52.699954333,"lon":5.292730833,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.004} !AIVDM,1,1,,B,100001?P?w4?wp0W3h,0*28 {"class":"AIS","type":1,"repeat":0,"mmsi":4,"scaled":false,"status":15,"status_text":"Not defined","turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":60,"maneuver":0,"raim":false,"radio":159984} $GPRMC,194917.00,A,5241.99721,N,00517.56389,E,0.003,,010809,,,A*74 !AIVDO,1,1,,,B3aC3LP00063ac7RNp@03w`UwP06,0*55 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175638,"lat":31619972,"course":0,"heading":511,"second":17,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} $GPGBS,194917.00,3.0,1.9,4.2,,,,*4F {"class":"TPV","mode":2,"time":"2009-08-01T19:49:17.000Z","ept":0.005,"lat":52.699953500,"lon":5.292731500,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.002} $GPRMC,194918.00,A,5241.99715,N,00517.56394,E,0.004,,010809,,,A*77 !AIVDO,1,1,,,B3aC3LP00063acWRNp<03wa5wP06,0*28 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175639,"lat":31619971,"course":0,"heading":511,"second":18,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} $GPGBS,194918.00,3.0,1.9,4.2,,,,*40 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:18.000Z","ept":0.005,"lat":52.699952500,"lon":5.292732333,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.002} !AIVDM,2,1,8,B,54S64>02;dlqK8@cL00lDADl0000000000000016;0<:65wj0?hCDm1DQ0C@,0*63 !AIVDM,2,2,8,B,00000000002,2*2D {"class":"AIS","type":5,"repeat":0,"mmsi":305235000,"scaled":false,"imo":9155406,"ais_version":0,"callsign":"V2DJ7","shipname":"MEDUM","shiptype":70,"shiptype_text":"Cargo - all ships of this type","to_bow":88,"to_stern":12,"to_port":10,"to_starboard":6,"epfd":1,"epfd_text":"GPS","eta":"07-31T18:00Z","draught":63,"destination":"AMSTERDAM","dte":0} $GPRMC,194919.00,A,5241.99711,N,00517.56399,E,0.004,,010809,,,A*7F !AIVDO,1,1,,,B3aC3LP00063acWRNp<03waUwP06,0*48 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175639,"lat":31619971,"course":0,"heading":511,"second":19,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} $GPGBS,194919.00,3.0,1.9,4.2,,,,*41 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:19.000Z","ept":0.005,"lat":52.699951833,"lon":5.292733167,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.002} $GPRMC,194920.00,A,5241.99711,N,00517.56409,E,0.005,,010809,,,A*7A !AIVDM,1,1,,B,13`g5:0P0`0E9MbN1FgDE?vV06K4,0*45 {"class":"AIS","type":1,"repeat":0,"mmsi":244041000,"scaled":false,"status":0,"status_text":"Under way using engine","turn":-128,"speed":40,"accuracy":false,"lon":2771893,"lat":31479485,"course":1108,"heading":511,"second":19,"maneuver":0,"raim":false,"radio":26308} !AIVDO,1,1,,,B3aC3LP00063ad7RNp<03wb5wP06,0*4C {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175640,"lat":31619971,"course":0,"heading":511,"second":20,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} !AIVDM,1,1,,A,13BE3l001n0DJHVN1fQJrHjb00SU,0*35 {"class":"AIS","type":1,"repeat":0,"mmsi":220546000,"scaled":false,"status":0,"status_text":"Under way using engine","turn":0,"speed":118,"accuracy":false,"lon":2675475,"lat":31485573,"course":2793,"heading":281,"second":21,"maneuver":0,"raim":false,"radio":2277} $GPGBS,194920.00,3.0,1.9,4.2,,,,*4B {"class":"TPV","mode":2,"time":"2009-08-01T19:49:20.000Z","ept":0.005,"lat":52.699951833,"lon":5.292734833,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.003} $GPRMC,194921.00,A,5241.99708,N,00517.56417,E,0.007,,010809,,,A*7E !AIVDM,1,1,,A,13bf9v00010IaApN8IK3uSvd0Hf>428b0D1S,0*43 {"class":"AIS","type":1,"repeat":0,"mmsi":247254200,"scaled":false,"status":1,"status_text":"At anchor","turn":0,"speed":1023,"accuracy":true,"lon":2582900,"lat":31510200,"course":3600,"heading":68,"second":21,"maneuver":0,"raim":false,"radio":82019} $GPRMC,194923.00,A,5241.99704,N,00517.56423,E,0.007,,010809,,,A*77 $GPGBS,194923.00,3.0,1.9,4.2,,,,*48 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:23.000Z","ept":0.005,"lat":52.699950667,"lon":5.292737167,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.004} !AIVDO,1,1,,,B3aC3LP00063ae7RNp803wcUwP06,0*28 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175642,"lat":31619970,"course":0,"heading":511,"second":23,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} $GPRMC,194924.00,A,5241.99705,N,00517.56425,E,0.006,,010809,,,A*76 $GPGBS,194924.00,3.0,1.9,4.2,,,,*4F {"class":"TPV","mode":2,"time":"2009-08-01T19:49:24.000Z","ept":0.005,"lat":52.699950833,"lon":5.292737500,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.003} !AIVDO,1,1,,,B3aC3LP00063ae7RNp803wd5wP06,0*4F {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175642,"lat":31619970,"course":0,"heading":511,"second":24,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} !AIVDM,1,1,,B,100001?P?w4?wp0PS6,0*11 {"class":"AIS","type":1,"repeat":0,"mmsi":4,"scaled":false,"status":15,"status_text":"Not defined","turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":60,"maneuver":0,"raim":false,"radio":133318} !AIVDM,1,1,,B,13aC225P130HqQ@N3tfQ5OvfP6K4,0*37 {"class":"AIS","type":1,"repeat":0,"mmsi":244630024,"scaled":false,"status":5,"status_text":"Moored","turn":-128,"speed":67,"accuracy":false,"lon":3263528,"lat":31521978,"course":277,"heading":511,"second":23,"maneuver":1,"raim":false,"radio":26308} $GPRMC,194925.00,A,5241.99714,N,00517.56429,E,0.002,,010809,,,A*7F $GPGBS,194925.00,3.0,1.9,4.2,,,,*4E {"class":"TPV","mode":2,"time":"2009-08-01T19:49:25.000Z","ept":0.005,"lat":52.699952333,"lon":5.292738167,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.001} !AIVDO,1,1,,,B3aC3LP00063ae7RNp<03wdUwP06,0*2B {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175642,"lat":31619971,"course":0,"heading":511,"second":25,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} !AIVDM,1,1,,B,D02E3:1FTg6D000000000000001,2*2A {"class":"AIS","type":20,"repeat":0,"mmsi":2442024,"scaled":false,"offset1":1385,"number1":2,"timeout1":7,"increment1":1125,"offset2":0,"number2":0,"timeout2":0,"increment2":0,"offset3":0,"number3":0,"timeout3":0,"increment3":0,"offset4":0,"number4":0,"timeout4":0,"increment4":0} $GPRMC,194926.00,A,5241.99718,N,00517.56440,E,0.010,,010809,,,A*7C $GPGBS,194926.00,3.0,1.9,4.2,,,,*4D {"class":"TPV","mode":2,"time":"2009-08-01T19:49:26.000Z","ept":0.005,"lat":52.699953000,"lon":5.292740000,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.005} !AIVDO,1,1,,,B3aC3LP00063af7RNp<03we5wP06,0*49 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175644,"lat":31619971,"course":0,"heading":511,"second":26,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} $GPRMC,194927.00,A,5241.99723,N,00517.56454,E,0.009,,010809,,,A*78 $GPGBS,194927.00,3.0,1.9,4.2,,,,*4C {"class":"TPV","mode":2,"time":"2009-08-01T19:49:27.000Z","ept":0.005,"lat":52.699953833,"lon":5.292742333,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.005} !AIVDO,1,1,,,B3aC3LP00063afWRNp@03weUsP06,0*31 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175645,"lat":31619972,"course":0,"heading":511,"second":27,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":false,"radio":917510} !AIVDM,1,1,,A,13`p;<0P0`0E8p0N1GU4G?vl@@@G,0*32 {"class":"AIS","type":1,"repeat":0,"mmsi":244190000,"scaled":false,"status":0,"status_text":"Under way using engine","turn":-128,"speed":40,"accuracy":false,"lon":2770688,"lat":31479700,"course":1116,"heading":511,"second":26,"maneuver":0,"raim":false,"radio":66583} $GPRMC,194928.00,A,5241.99730,N,00517.56469,E,0.005,,010809,,,A*77 $GPGBS,194928.00,3.0,1.9,4.2,,,,*43 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:28.000Z","ept":0.005,"lat":52.699955000,"lon":5.292744833,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.003} !AIVDO,1,1,,,B3aC3LP00063ag7RNpD03wf5sP06,0*37 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175646,"lat":31619973,"course":0,"heading":511,"second":28,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":false,"radio":917510} !AIVDM,1,1,,B,100001?P?w4?wp0PS3,0*14 {"class":"AIS","type":1,"repeat":0,"mmsi":4,"scaled":false,"status":15,"status_text":"Not defined","turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":60,"maneuver":0,"raim":false,"radio":133315} $GPRMC,194929.00,A,5241.99738,N,00517.56482,E,0.002,,010809,,,A*7C $GPGBS,194929.00,3.0,1.9,4.2,,,,*42 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:29.000Z","ept":0.005,"lat":52.699956333,"lon":5.292747000,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.001} !AIVDO,1,1,,,B3aC3LP00063ah7RNpD03wfUsP06,0*58 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175648,"lat":31619973,"course":0,"heading":511,"second":29,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":false,"radio":917510} !AIVDM,1,1,,A,139QcE7P?w4?wv0URP,0*32 {"class":"AIS","type":1,"repeat":0,"mmsi":211315540,"scaled":false,"status":7,"status_text":"Engaged in fishing","turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":63,"maneuver":0,"raim":false,"radio":153760} $GPRMC,194930.00,A,5241.99745,N,00517.56492,E,0.006,,010809,,,A*7B $GPGBS,194930.00,3.0,1.9,4.2,,,,*4A {"class":"TPV","mode":2,"time":"2009-08-01T19:49:30.000Z","ept":0.005,"lat":52.699957500,"lon":5.292748667,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.003} !AIVDO,1,1,,,B3aC3LP00063ahWRNpH03wg5sP06,0*55 {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175649,"lat":31619974,"course":0,"heading":511,"second":30,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":false,"radio":917510} !AIVDM,1,1,,B,402E3:0000HttPGEahN7pi700pBB,0*6B {"class":"AIS","type":4,"repeat":0,"mmsi":2442024,"scaled":false,"timestamp":"0000-00-00T24:60:60Z","accuracy":true,"lon":3059000,"lat":31586500,"epfd":7,"epfd_text":"Surveyed","raim":false,"radio":230546} $GPRMC,194931.00,A,5241.99750,N,00517.56500,E,0.002,,010809,,,A*70 $GPGBS,194931.00,3.0,1.9,4.2,,,,*4B {"class":"TPV","mode":2,"time":"2009-08-01T19:49:31.000Z","ept":0.005,"lat":52.699958333,"lon":5.292750000,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.001} !AIVDM,1,1,,B,13bcuF0P000H@F2N:0tLH03wkUoP06,0*00 {"class":"AIS","type":18,"repeat":0,"mmsi":244100276,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3179598,"lat":31622374,"course":0,"heading":511,"second":39,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} $GPGBS,194939.00,3.0,1.9,4.2,,,,*43 {"class":"TPV","mode":2,"time":"2009-08-01T19:49:39.000Z","ept":0.005,"lat":52.699968167,"lon":5.292756500,"epx":1.900,"epy":3.000,"track":0.0000,"speed":0.005} !AIVDM,1,1,,B,B3`gaQ000062Pc7RIt403wkUoP06,0*4B {"class":"AIS","type":18,"repeat":0,"mmsi":244050308,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3166294,"lat":31614913,"course":0,"heading":511,"second":39,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510} !AIVDM,1,1,,B,139QcE7P?w4?wv0l08,0*02 {"class":"AIS","type":1,"repeat":0,"mmsi":211315540,"scaled":false,"status":7,"status_text":"Engaged in fishing","turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":63,"maneuver":0,"raim":false,"radio":213000} !AIVDO,1,1,,,B3aC3LP00063ajWRNph03wkUsP06,0*1B {"class":"AIS","type":18,"repeat":0,"mmsi":244630386,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3175653,"lat":31619980,"course":0,"heading":511,"second":39,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":false,"radio":917510} $GPRMC,194940.00,A,5241.99812,N,00517.56549,E,0.005,,010809,,,A*75 gpsd-3.15/test/daemon/beidou-bd.log0000664000175000017500000001124212475052060015325 0ustar esresr# Name: AtlasVI/PrimaII for SiRF-TriG # Chipset = SiRF-TriG # Date = 2015-02-25 # Submitter = Eli Huang # Notes: Contains Beidou and GLONASS sentences. The Beidou sentences use the # BD talker ID, which is mandated by the Chinese standard "Technical # Specification of Communication Protocol for BDS Compatible Positioning # Module" (TSCPB). This standard is not available in English translation. # Use this log to test that Beidou NMEA IDs are being mapped to # the Beidou PRN range and that Beidou GSV sentences are # properly integrated into a combined skyview. $PSRFEPE,074150.799,V,,,,,*23 $GNGGA,074150.799,,,,,0,00,,,M,0.0,M,,0000,*64 $GNGNS,074150.799,,,,,NNNN,00,,,0.0,,0000*63 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $BDGSA,A,1,,,,,,,,,,,,,,,,*23 $GPGSV,7,1,25,01,30,046,22,05,00,000,27,07,00,000,24,08,00,000,27*74 $GPGSV,7,2,25,09,27,171,25,11,00,000,29,12,00,000,42,14,31,261,49*76 $GPGSV,7,3,25,18,00,000,25,21,00,000,24,25,52,244,51,26,00,000,21*70 $GPGSV,7,4,25,28,00,000,27,29,49,174,42,32,14,319,46,31,55,220,*7F $GPGSV,7,5,25,27,43,190,,15,30,319,,17,27,064,,10,24,021,*7F $GPGSV,7,6,25,23,21,343,,02,19,139,,20,15,059,,24,14,014,*74 $GPGSV,7,7,25,04,08,012,*41 $BDGSV,2,1,07,01,00,000,45,02,01,090,35,03,00,000,38,04,00,000,42*6A $BDGSV,2,2,07,05,27,090,,13,19,016,,11,07,147,*5E $GNRMC,074150.799,V,,,,,,,250215,,,N*52 $PSRFEPE,074151.799,V,,,,,*22 $GNGGA,074151.799,,,,,0,00,,,M,0.0,M,,0000,*65 $GNGNS,074151.799,,,,,NNNN,00,,,0.0,,0000*62 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $BDGSA,A,1,,,,,,,,,,,,,,,,*23 $GNRMC,074151.799,V,,,,,,,250215,,,N*53 $PSRFEPE,074152.799,V,,,,,*21 $GNGGA,074152.799,,,,,0,00,,,M,0.0,M,,0000,*66 $GNGNS,074152.799,,,,,NNNN,00,,,0.0,,0000*61 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $BDGSA,A,1,,,,,,,,,,,,,,,,*23 $GNRMC,074152.799,V,,,,,,,250215,,,N*50 $PSRF151,3,1833,28692,0x7EFFFFFF*15 $PSRFEPE,074153.799,V,,,,,*20 $GNGGA,074153.799,,,,,0,00,,,M,0.0,M,,0000,*67 $GNGNS,074153.799,,,,,NNNN,00,,,0.0,,0000*60 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $BDGSA,A,1,,,,,,,,,,,,,,,,*23 $GNRMC,074153.799,V,,,,,,,250215,,,N*51 $PSRFEPE,074154.799,V,,,,,*27 $GNGGA,074154.799,,,,,0,00,,,M,0.0,M,,0000,*60 $GNGNS,074154.799,,,,,NNNN,00,,,0.0,,0000*67 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $BDGSA,A,1,,,,,,,,,,,,,,,,*23 $GNRMC,074154.799,V,,,,,,,250215,,,N*56 $PSRFEPE,074155.799,A,1.3,10.59,52.97,0.6,180.0*16 $GNGGA,074155.799,3114.8770,N,12135.2463,E,1,05,1.3,156.9,M,8.3,M,,0000,4.9*77 $GNGNS,074155.799,3114.8770,N,12135.2463,E,ANNA,05,1.3,156.9,8.3,,0000*52 $GPGSA,A,3,25,32,,,,,,,,,,,5.1,1.3,4.9,3.3*3D $BDGSA,A,3,02,03,04,,,,,,,,,,5.1,1.3,4.9,3.3*2F $GPGSV,5,1,20,25,76,102,50,32,29,284,47,01,02,001,24,07,00,000,23*7A $GPGSV,5,2,20,08,00,000,46,09,19,094,,12,00,000,44,14,68,202,49*7F $GPGSV,5,3,20,18,13,225,27,20,00,000,29,22,16,229,37,26,00,000,24*77 $GPGSV,5,4,20,28,00,000,24,29,35,080,43,31,62,089,,15,42,298,*72 $GPGSV,5,5,20,27,40,094,,30,24,225,,23,22,310,,10,05,340,*77 $BDGSV,3,1,12,02,33,240,35,03,51,201,37,04,35,123,42,01,42,130,45*6B $BDGSV,3,2,12,10,64,323,,07,64,320,,06,55,274,,14,50,284,*66 $BDGSV,3,3,12,09,44,299,,08,14,156,,05,11,258,,13,08,322,*6C $GNRMC,074155.799,A,3114.8770,N,12135.2463,E,0.30,4.94,250215,,,A*76 $PSRFEPE,074156.799,A,1.1,64.94,58.97,0.2,180.0*1B $GNGGA,074156.799,3114.8950,N,12135.2442,E,1,07,1.1,190.7,M,8.3,M,,0000,1.8*7B $GNGNS,074156.799,3114.8950,N,12135.2442,E,ANNA,07,1.1,190.7,8.3,,0000*5A $GPGSA,A,3,25,32,14,12,,,,,,,,,2.1,1.1,1.8,1.2*39 $BDGSA,A,3,02,03,04,,,,,,,,,,2.1,1.1,1.8,1.2*2D $GNRMC,074156.799,A,3114.8950,N,12135.2442,E,0.26,4.94,250215,,,A*7D $PSRFEPE,074157.799,A,1.1,24.65,25.14,0.1,61.5*29 $GNGGA,074157.799,3114.8902,N,12135.2443,E,1,07,1.1,192.9,M,8.3,M,,0000,1.8*70 $GNGNS,074157.799,3114.8902,N,12135.2443,E,ANNA,07,1.1,192.9,8.3,,0000*51 $GPGSA,A,3,25,32,12,14,,,,,,,,,2.1,1.1,1.8,1.2*39 $BDGSA,A,3,02,03,04,,,,,,,,,,2.1,1.1,1.8,1.2*2D $GNRMC,074157.799,A,3114.8902,N,12135.2443,E,0.32,4.94,250215,,,A*7F $PSRFEPE,074158.799,A,1.1,19.32,19.35,0.1,180.0*1D $GNGGA,074158.799,3114.8953,N,12135.2439,E,1,07,1.1,198.5,M,8.3,M,,0000,1.8*70 $GNGNS,074158.799,3114.8953,N,12135.2439,E,ANNA,07,1.1,198.5,8.3,,0000*51 $GPGSA,A,3,25,32,12,14,,,,,,,,,2.1,1.1,1.8,1.2*39 $BDGSA,A,3,02,03,04,,,,,,,,,,2.1,1.1,1.8,1.2*2D $GNRMC,074158.799,A,3114.8953,N,12135.2439,E,0.25,4.94,250215,,,A*7F $PSRFEPE,074159.799,A,1.1,14.86,15.59,0.2,180.0*1B $GNGGA,074159.799,3114.8943,N,12135.2444,E,1,07,1.1,196.4,M,8.3,M,,0000,1.8*75 $GNGNS,074159.799,3114.8943,N,12135.2444,E,ANNA,07,1.1,196.4,8.3,,0000*54 $GPGSA,A,3,25,32,12,14,,,,,,,,,2.1,1.1,1.8,1.2*39 $BDGSA,A,3,02,03,04,,,,,,,,,,2.1,1.1,1.8,1.2*2D $GNRMC,074159.799,A,3114.8943,N,12135.2444,E,0.23,4.94,250215,,,A*73 $PSRF151,3,1833,28693,0x7EFFD7FF*67 gpsd-3.15/test/daemon/beidou-bd.log.chk0000664000175000017500000002377312474342260016110 0ustar esresr$PSRFEPE,074150.799,V,,,,,*23 $GNGGA,074150.799,,,,,0,00,,,M,0.0,M,,0000,*64 $GNGNS,074150.799,,,,,NNNN,00,,,0.0,,0000*63 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1} $BDGSA,A,1,,,,,,,,,,,,,,,,*23 {"class":"TPV","mode":1} $GPGSV,7,1,25,01,30,046,22,05,00,000,27,07,00,000,24,08,00,000,27*74 $GPGSV,7,2,25,09,27,171,25,11,00,000,29,12,00,000,42,14,31,261,49*76 $GPGSV,7,3,25,18,00,000,25,21,00,000,24,25,52,244,51,26,00,000,21*70 $GPGSV,7,4,25,28,00,000,27,29,49,174,42,32,14,319,46,31,55,220,*7F $GPGSV,7,5,25,27,43,190,,15,30,319,,17,27,064,,10,24,021,*7F $GPGSV,7,6,25,23,21,343,,02,19,139,,20,15,059,,24,14,014,*74 $GPGSV,7,7,25,04,08,012,*41 {"class":"SKY","satellites":[{"PRN":1,"el":30,"az":46,"ss":22,"used":false},{"PRN":5,"el":0,"az":0,"ss":27,"used":false},{"PRN":7,"el":0,"az":0,"ss":24,"used":false},{"PRN":8,"el":0,"az":0,"ss":27,"used":false},{"PRN":9,"el":27,"az":171,"ss":25,"used":false},{"PRN":11,"el":0,"az":0,"ss":29,"used":false},{"PRN":12,"el":0,"az":0,"ss":42,"used":false},{"PRN":14,"el":31,"az":261,"ss":49,"used":false},{"PRN":18,"el":0,"az":0,"ss":25,"used":false},{"PRN":21,"el":0,"az":0,"ss":24,"used":false},{"PRN":25,"el":52,"az":244,"ss":51,"used":false},{"PRN":26,"el":0,"az":0,"ss":21,"used":false},{"PRN":28,"el":0,"az":0,"ss":27,"used":false},{"PRN":29,"el":49,"az":174,"ss":42,"used":false},{"PRN":32,"el":14,"az":319,"ss":46,"used":false},{"PRN":31,"el":55,"az":220,"ss":0,"used":false},{"PRN":27,"el":43,"az":190,"ss":0,"used":false},{"PRN":15,"el":30,"az":319,"ss":0,"used":false},{"PRN":17,"el":27,"az":64,"ss":0,"used":false},{"PRN":10,"el":24,"az":21,"ss":0,"used":false},{"PRN":23,"el":21,"az":343,"ss":0,"used":false},{"PRN":2,"el":19,"az":139,"ss":0,"used":false},{"PRN":20,"el":15,"az":59,"ss":0,"used":false},{"PRN":24,"el":14,"az":14,"ss":0,"used":false},{"PRN":4,"el":8,"az":12,"ss":0,"used":false}]} $BDGSV,2,1,07,01,00,000,45,02,01,090,35,03,00,000,38,04,00,000,42*6A $BDGSV,2,2,07,05,27,090,,13,19,016,,11,07,147,*5E {"class":"SKY","satellites":[{"PRN":1,"el":30,"az":46,"ss":22,"used":false},{"PRN":5,"el":0,"az":0,"ss":27,"used":false},{"PRN":7,"el":0,"az":0,"ss":24,"used":false},{"PRN":8,"el":0,"az":0,"ss":27,"used":false},{"PRN":9,"el":27,"az":171,"ss":25,"used":false},{"PRN":11,"el":0,"az":0,"ss":29,"used":false},{"PRN":12,"el":0,"az":0,"ss":42,"used":false},{"PRN":14,"el":31,"az":261,"ss":49,"used":false},{"PRN":18,"el":0,"az":0,"ss":25,"used":false},{"PRN":21,"el":0,"az":0,"ss":24,"used":false},{"PRN":25,"el":52,"az":244,"ss":51,"used":false},{"PRN":26,"el":0,"az":0,"ss":21,"used":false},{"PRN":28,"el":0,"az":0,"ss":27,"used":false},{"PRN":29,"el":49,"az":174,"ss":42,"used":false},{"PRN":32,"el":14,"az":319,"ss":46,"used":false},{"PRN":31,"el":55,"az":220,"ss":0,"used":false},{"PRN":27,"el":43,"az":190,"ss":0,"used":false},{"PRN":15,"el":30,"az":319,"ss":0,"used":false},{"PRN":17,"el":27,"az":64,"ss":0,"used":false},{"PRN":10,"el":24,"az":21,"ss":0,"used":false},{"PRN":23,"el":21,"az":343,"ss":0,"used":false},{"PRN":2,"el":19,"az":139,"ss":0,"used":false},{"PRN":20,"el":15,"az":59,"ss":0,"used":false},{"PRN":24,"el":14,"az":14,"ss":0,"used":false},{"PRN":4,"el":8,"az":12,"ss":0,"used":false},{"PRN":201,"el":0,"az":0,"ss":45,"used":false},{"PRN":202,"el":1,"az":90,"ss":35,"used":false},{"PRN":203,"el":0,"az":0,"ss":38,"used":false},{"PRN":204,"el":0,"az":0,"ss":42,"used":false},{"PRN":205,"el":27,"az":90,"ss":0,"used":false},{"PRN":213,"el":19,"az":16,"ss":0,"used":false},{"PRN":211,"el":7,"az":147,"ss":0,"used":false}]} $GNRMC,074150.799,V,,,,,,,250215,,,N*52 $PSRFEPE,074151.799,V,,,,,*22 $GNGGA,074151.799,,,,,0,00,,,M,0.0,M,,0000,*65 $GNGNS,074151.799,,,,,NNNN,00,,,0.0,,0000*62 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1} $BDGSA,A,1,,,,,,,,,,,,,,,,*23 {"class":"TPV","mode":1} $GNRMC,074151.799,V,,,,,,,250215,,,N*53 $PSRFEPE,074152.799,V,,,,,*21 $GNGGA,074152.799,,,,,0,00,,,M,0.0,M,,0000,*66 $GNGNS,074152.799,,,,,NNNN,00,,,0.0,,0000*61 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1} $BDGSA,A,1,,,,,,,,,,,,,,,,*23 {"class":"TPV","mode":1} $GNRMC,074152.799,V,,,,,,,250215,,,N*50 $PSRF151,3,1833,28692,0x7EFFFFFF*15 $PSRFEPE,074153.799,V,,,,,*20 $GNGGA,074153.799,,,,,0,00,,,M,0.0,M,,0000,*67 $GNGNS,074153.799,,,,,NNNN,00,,,0.0,,0000*60 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1} $BDGSA,A,1,,,,,,,,,,,,,,,,*23 {"class":"TPV","mode":1} $GNRMC,074153.799,V,,,,,,,250215,,,N*51 $PSRFEPE,074154.799,V,,,,,*27 $GNGGA,074154.799,,,,,0,00,,,M,0.0,M,,0000,*60 $GNGNS,074154.799,,,,,NNNN,00,,,0.0,,0000*67 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1} $BDGSA,A,1,,,,,,,,,,,,,,,,*23 {"class":"TPV","mode":1} $GNRMC,074154.799,V,,,,,,,250215,,,N*56 $PSRFEPE,074155.799,A,1.3,10.59,52.97,0.6,180.0*16 $GNGGA,074155.799,3114.8770,N,12135.2463,E,1,05,1.3,156.9,M,8.3,M,,0000,4.9*77 {"class":"TPV","mode":3,"lat":31.247950000,"lon":121.587438333,"alt":156.900} $GNGNS,074155.799,3114.8770,N,12135.2463,E,ANNA,05,1.3,156.9,8.3,,0000*52 $GPGSA,A,3,25,32,,,,,,,,,,,5.1,1.3,4.9,3.3*3D {"class":"TPV","mode":3,"lat":31.247950000,"lon":121.587438333,"alt":156.900,"epv":112.700} $BDGSA,A,3,02,03,04,,,,,,,,,,5.1,1.3,4.9,3.3*2F {"class":"TPV","mode":3,"lat":31.247950000,"lon":121.587438333,"alt":156.900,"epv":112.700} $GPGSV,5,1,20,25,76,102,50,32,29,284,47,01,02,001,24,07,00,000,23*7A $GPGSV,5,2,20,08,00,000,46,09,19,094,,12,00,000,44,14,68,202,49*7F $GPGSV,5,3,20,18,13,225,27,20,00,000,29,22,16,229,37,26,00,000,24*77 $GPGSV,5,4,20,28,00,000,24,29,35,080,43,31,62,089,,15,42,298,*72 $GPGSV,5,5,20,27,40,094,,30,24,225,,23,22,310,,10,05,340,*77 $BDGSV,3,1,12,02,33,240,35,03,51,201,37,04,35,123,42,01,42,130,45*6B $BDGSV,3,2,12,10,64,323,,07,64,320,,06,55,274,,14,50,284,*66 $BDGSV,3,3,12,09,44,299,,08,14,156,,05,11,258,,13,08,322,*6C {"class":"SKY","xdop":0.93,"ydop":75.33,"vdop":4.90,"tdop":5.93,"hdop":1.30,"gdop":90.07,"pdop":5.10,"satellites":[{"PRN":25,"el":76,"az":102,"ss":50,"used":false},{"PRN":32,"el":29,"az":284,"ss":47,"used":false},{"PRN":1,"el":2,"az":1,"ss":24,"used":false},{"PRN":7,"el":0,"az":0,"ss":23,"used":false},{"PRN":8,"el":0,"az":0,"ss":46,"used":false},{"PRN":9,"el":19,"az":94,"ss":0,"used":false},{"PRN":12,"el":0,"az":0,"ss":44,"used":false},{"PRN":14,"el":68,"az":202,"ss":49,"used":false},{"PRN":18,"el":13,"az":225,"ss":27,"used":false},{"PRN":20,"el":0,"az":0,"ss":29,"used":false},{"PRN":22,"el":16,"az":229,"ss":37,"used":false},{"PRN":26,"el":0,"az":0,"ss":24,"used":false},{"PRN":28,"el":0,"az":0,"ss":24,"used":false},{"PRN":29,"el":35,"az":80,"ss":43,"used":false},{"PRN":31,"el":62,"az":89,"ss":0,"used":false},{"PRN":15,"el":42,"az":298,"ss":0,"used":false},{"PRN":27,"el":40,"az":94,"ss":0,"used":false},{"PRN":30,"el":24,"az":225,"ss":0,"used":false},{"PRN":23,"el":22,"az":310,"ss":0,"used":false},{"PRN":10,"el":5,"az":340,"ss":0,"used":false},{"PRN":202,"el":33,"az":240,"ss":35,"used":true},{"PRN":203,"el":51,"az":201,"ss":37,"used":true},{"PRN":204,"el":35,"az":123,"ss":42,"used":true},{"PRN":201,"el":42,"az":130,"ss":45,"used":false},{"PRN":210,"el":64,"az":323,"ss":0,"used":false},{"PRN":207,"el":64,"az":320,"ss":0,"used":false},{"PRN":206,"el":55,"az":274,"ss":0,"used":false},{"PRN":214,"el":50,"az":284,"ss":0,"used":false},{"PRN":209,"el":44,"az":299,"ss":0,"used":false},{"PRN":208,"el":14,"az":156,"ss":0,"used":false},{"PRN":205,"el":11,"az":258,"ss":0,"used":true},{"PRN":213,"el":8,"az":322,"ss":0,"used":false}]} $GNRMC,074155.799,A,3114.8770,N,12135.2463,E,0.30,4.94,250215,,,A*76 {"class":"TPV","mode":3,"time":"2015-02-25T07:41:55.799Z","ept":0.005,"lat":31.247950000,"lon":121.587438333,"alt":156.900,"epx":13.928,"epy":1129.908,"epv":112.700,"track":4.9400,"speed":0.154} $PSRFEPE,074156.799,A,1.1,64.94,58.97,0.2,180.0*1B $GNGGA,074156.799,3114.8950,N,12135.2442,E,1,07,1.1,190.7,M,8.3,M,,0000,1.8*7B $GNGNS,074156.799,3114.8950,N,12135.2442,E,ANNA,07,1.1,190.7,8.3,,0000*5A $GPGSA,A,3,25,32,14,12,,,,,,,,,2.1,1.1,1.8,1.2*39 $BDGSA,A,3,02,03,04,,,,,,,,,,2.1,1.1,1.8,1.2*2D $GNRMC,074156.799,A,3114.8950,N,12135.2442,E,0.26,4.94,250215,,,A*7D {"class":"TPV","mode":3,"time":"2015-02-25T07:41:56.799Z","ept":0.005,"lat":31.248250000,"lon":121.587403333,"alt":190.700,"epx":13.928,"epy":1129.908,"epv":112.700,"track":4.9400,"speed":0.134,"climb":33.800,"eps":2259.82,"epc":225.40} $PSRFEPE,074157.799,A,1.1,24.65,25.14,0.1,61.5*29 $GNGGA,074157.799,3114.8902,N,12135.2443,E,1,07,1.1,192.9,M,8.3,M,,0000,1.8*70 $GNGNS,074157.799,3114.8902,N,12135.2443,E,ANNA,07,1.1,192.9,8.3,,0000*51 $GPGSA,A,3,25,32,12,14,,,,,,,,,2.1,1.1,1.8,1.2*39 $BDGSA,A,3,02,03,04,,,,,,,,,,2.1,1.1,1.8,1.2*2D $GNRMC,074157.799,A,3114.8902,N,12135.2443,E,0.32,4.94,250215,,,A*7F {"class":"TPV","mode":3,"time":"2015-02-25T07:41:57.799Z","ept":0.005,"lat":31.248170000,"lon":121.587405000,"alt":192.900,"epx":13.928,"epy":1129.908,"epv":41.400,"track":4.9400,"speed":0.165,"climb":2.200,"eps":2259.82,"epc":154.10} $PSRFEPE,074158.799,A,1.1,19.32,19.35,0.1,180.0*1D $GNGGA,074158.799,3114.8953,N,12135.2439,E,1,07,1.1,198.5,M,8.3,M,,0000,1.8*70 $GNGNS,074158.799,3114.8953,N,12135.2439,E,ANNA,07,1.1,198.5,8.3,,0000*51 $GPGSA,A,3,25,32,12,14,,,,,,,,,2.1,1.1,1.8,1.2*39 $BDGSA,A,3,02,03,04,,,,,,,,,,2.1,1.1,1.8,1.2*2D $GNRMC,074158.799,A,3114.8953,N,12135.2439,E,0.25,4.94,250215,,,A*7F {"class":"TPV","mode":3,"time":"2015-02-25T07:41:58.799Z","ept":0.005,"lat":31.248255000,"lon":121.587398333,"alt":198.500,"epx":13.928,"epy":1129.908,"epv":41.400,"track":4.9400,"speed":0.129,"climb":5.600,"eps":2259.82,"epc":82.80} $PSRFEPE,074159.799,A,1.1,14.86,15.59,0.2,180.0*1B $GNGGA,074159.799,3114.8943,N,12135.2444,E,1,07,1.1,196.4,M,8.3,M,,0000,1.8*75 $GNGNS,074159.799,3114.8943,N,12135.2444,E,ANNA,07,1.1,196.4,8.3,,0000*54 $GPGSA,A,3,25,32,12,14,,,,,,,,,2.1,1.1,1.8,1.2*39 $BDGSA,A,3,02,03,04,,,,,,,,,,2.1,1.1,1.8,1.2*2D $GNRMC,074159.799,A,3114.8943,N,12135.2444,E,0.23,4.94,250215,,,A*73 {"class":"TPV","mode":3,"time":"2015-02-25T07:41:59.799Z","ept":0.005,"lat":31.248238333,"lon":121.587406667,"alt":196.400,"epx":13.928,"epy":1129.908,"epv":41.400,"track":4.9400,"speed":0.118,"climb":-2.100,"eps":2259.82,"epc":82.80} $PSRF151,3,1833,28693,0x7EFFD7FF*67 gpsd-3.15/test/daemon/beidou-gb.log0000664000175000017500000001030512475052146015334 0ustar esresr# Name: AtlasVI/PrimaII for SiRF-TriG with NMEA 4.00 conformance patch # Chipset = SiRF-Trig # Date = 2015-03-02 # Submitter = Eli Huang # Notes: Contains Beidou and GLONASS sentences; Beidou sentences have the # alternate GB talker ID rather than the BD mandated in the TSCPB # standard. Use this log to test that Beidou NMEA IDs with GB # are being mapped to the Beidou PRN range and that Beidou GSV # sentences with GB are properly integrated into a combined skyview. $PSRFEPE,053229.438,V,,,,,*23 $GPGGA,053229.438,,,,,0,00,,,M,0.0,M,,0000*56 $GNGNS,053229.438,,,,,NNNN,00,,,0.0,,0000*63 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GPGSV,6,1,21,05,00,000,27,06,00,000,24,07,00,000,24,11,00,000,22*7C $GPGSV,6,2,21,12,00,000,50,14,57,107,48,16,00,000,22,18,55,190,50*76 $GPGSV,6,3,21,21,00,000,23,22,57,198,50,24,15,335,42,25,00,000,22*7C $GPGSV,6,4,21,26,00,000,24,28,00,000,22,31,58,140,35,27,56,093,*70 $GPGSV,6,5,21,09,44,071,,15,24,255,,04,18,332,,17,15,022,*7B $GPGSV,6,6,21,23,05,259,*40 $GBGSV,2,1,05,201,00,000,44,202,14,089,35,204,00,000,42,205,27,091,*66 $GBGSV,2,2,05,209,07,033,*62 $GNRMC,053229.438,V,,,,,,,020315,,,N*56 $PSRFEPE,053230.438,V,,,,,*2B $GPGGA,053230.438,,,,,0,00,,,M,0.0,M,,0000*5E $GNGNS,053230.438,,,,,NNNN,00,,,0.0,,0000*6B $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GPGSV,6,1,21,05,00,000,21,06,00,000,24,07,00,000,23,11,00,000,22*7D $GPGSV,6,2,21,12,00,000,49,14,57,107,47,16,00,000,21,18,55,190,50*72 $GPGSV,6,3,21,21,00,000,23,22,57,198,50,24,15,335,42,25,00,000,22*7C $GPGSV,6,4,21,26,00,000,23,28,00,000,22,31,58,140,35,27,56,093,*77 $GPGSV,6,5,21,09,44,071,,15,24,255,,04,18,332,,17,15,022,*7B $GPGSV,6,6,21,23,05,259,*40 $GBGSV,2,1,05,201,00,000,44,202,14,089,35,204,00,000,42,205,27,091,*66 $GBGSV,2,2,05,209,07,033,*62 $GNRMC,053230.438,V,,,,,,,020315,,,N*5E $PSRFEPE,053231.438,V,,,,,*2A $GPGGA,053231.438,,,,,0,00,,,M,0.0,M,,0000*5F $GNGNS,053231.438,,,,,NNNN,00,,,0.0,,0000*6A $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GPGSV,6,1,21,03,00,000,,05,00,000,25,07,00,000,24,11,00,000,22*7D $GPGSV,6,2,21,12,00,000,49,14,57,107,48,16,00,000,22,18,55,190,51*7F $GPGSV,6,3,21,21,00,000,24,22,57,198,49,24,15,335,42,25,00,000,22*73 $GPGSV,6,4,21,26,00,000,22,28,00,000,22,31,58,140,34,27,56,093,*77 $GPGSV,6,5,21,09,44,071,,15,24,255,,04,18,332,,17,15,022,*7B $GPGSV,6,6,21,23,05,259,*40 $GBGSV,2,1,05,201,00,000,44,202,14,089,35,204,00,000,42,205,27,091,*66 $GBGSV,2,2,05,209,07,033,*62 $GNRMC,053231.438,V,,,,,,,020315,,,N*5F $PSRFEPE,053232.438,A,1.2,5.77,12.97,1.2,180.0*21 $GPGGA,053232.438,3114.8789,N,12135.2442,E,1,06,1.2,153.8,M,8.3,M,,0000*6A $GNGNS,053232.438,3114.8789,N,12135.2442,E,ANNA,07,1.2,153.8,8.3,,0000*5F $GNGSA,A,3,22,18,14,12,31,24,,,,,,,2.5,1.2,2.2*23 $GNGSA,A,3,201,,,,,,,,,,,,2.5,1.2,2.2*1B $GPGSV,6,1,21,22,80,039,49,18,50,119,51,14,51,342,48,12,20,061,50*78 $GPGSV,6,2,21,31,51,228,34,24,04,041,43,03,00,000,20,05,00,000,26*77 $GPGSV,6,3,21,06,00,000,26,07,00,000,24,16,00,000,22,21,00,000,24*7E $GPGSV,6,4,21,25,34,142,21,26,00,000,23,28,00,000,22,27,31,036,*71 $GPGSV,6,5,21,15,21,289,,09,14,038,,30,14,180,,11,10,179,*7B $GPGSV,6,6,21,23,06,275,*4D $GBGSV,3,1,11,201,49,147,44,202,23,250,35,204,35,123,42,213,83,243,*6D $GBGSV,3,2,11,210,70,270,,207,70,267,,206,55,311,,203,49,208,*6B $GBGSV,3,3,11,209,36,317,,214,36,147,,205,11,257,*67 $GNRMC,053232.438,A,3114.8789,N,12135.2442,E,0.26,167.42,020315,,,A*70 $PSRFEPE,053233.438,A,1.2,25.61,66.06,0.3,180.0*1E $GPGGA,053233.438,3114.8821,N,12135.2428,E,1,06,1.2,167.2,M,8.3,M,,0000*67 $GNGNS,053233.438,3114.8821,N,12135.2428,E,ANNA,07,1.2,167.2,8.3,,0000*52 $GNGSA,A,3,22,18,14,12,31,24,,,,,,,2.5,1.2,2.2*23 $GNGSA,A,3,201,,,,,,,,,,,,2.5,1.2,2.2*1B $GPGSV,5,1,18,22,73,312,50,18,66,145,51,14,41,330,48,12,34,060,49*7B $GPGSV,5,2,18,31,37,248,34,24,13,042,43,03,00,000,21,06,00,000,27*7E $GPGSV,5,3,18,07,00,000,23,16,00,000,20,21,00,000,24,26,00,000,23*75 $GPGSV,5,4,18,25,44,164,,27,38,028,,09,22,036,,30,14,194,*77 $GPGSV,5,5,18,11,11,192,,15,06,294,*77 $GBGSV,3,1,11,201,49,147,44,202,23,250,35,204,35,123,42,213,83,243,*6D $GBGSV,3,2,11,210,70,270,,207,70,267,,206,55,311,,203,49,208,*6B $GBGSV,3,3,11,209,36,317,,214,36,147,,205,11,257,*67 $GNRMC,053233.438,A,3114.8821,N,12135.2428,E,0.07,167.42,020315,,,A*73 gpsd-3.15/test/daemon/beidou-gb.log.chk0000664000175000017500000003772112475033314016107 0ustar esresr$PSRFEPE,053229.438,V,,,,,*23 $GPGGA,053229.438,,,,,0,00,,,M,0.0,M,,0000*56 $GNGNS,053229.438,,,,,NNNN,00,,,0.0,,0000*63 $GNGSA,A,1,,,,,,,,,,,,,,,*00 {"class":"TPV","mode":1} $GPGSV,6,1,21,05,00,000,27,06,00,000,24,07,00,000,24,11,00,000,22*7C $GPGSV,6,2,21,12,00,000,50,14,57,107,48,16,00,000,22,18,55,190,50*76 $GPGSV,6,3,21,21,00,000,23,22,57,198,50,24,15,335,42,25,00,000,22*7C $GPGSV,6,4,21,26,00,000,24,28,00,000,22,31,58,140,35,27,56,093,*70 $GPGSV,6,5,21,09,44,071,,15,24,255,,04,18,332,,17,15,022,*7B $GPGSV,6,6,21,23,05,259,*40 {"class":"SKY","satellites":[{"PRN":5,"el":0,"az":0,"ss":27,"used":false},{"PRN":6,"el":0,"az":0,"ss":24,"used":false},{"PRN":7,"el":0,"az":0,"ss":24,"used":false},{"PRN":11,"el":0,"az":0,"ss":22,"used":false},{"PRN":12,"el":0,"az":0,"ss":50,"used":false},{"PRN":14,"el":57,"az":107,"ss":48,"used":false},{"PRN":16,"el":0,"az":0,"ss":22,"used":false},{"PRN":18,"el":55,"az":190,"ss":50,"used":false},{"PRN":21,"el":0,"az":0,"ss":23,"used":false},{"PRN":22,"el":57,"az":198,"ss":50,"used":false},{"PRN":24,"el":15,"az":335,"ss":42,"used":false},{"PRN":25,"el":0,"az":0,"ss":22,"used":false},{"PRN":26,"el":0,"az":0,"ss":24,"used":false},{"PRN":28,"el":0,"az":0,"ss":22,"used":false},{"PRN":31,"el":58,"az":140,"ss":35,"used":false},{"PRN":27,"el":56,"az":93,"ss":0,"used":false},{"PRN":9,"el":44,"az":71,"ss":0,"used":false},{"PRN":15,"el":24,"az":255,"ss":0,"used":false},{"PRN":4,"el":18,"az":332,"ss":0,"used":false},{"PRN":17,"el":15,"az":22,"ss":0,"used":false},{"PRN":23,"el":5,"az":259,"ss":0,"used":false}]} $GBGSV,2,1,05,201,00,000,44,202,14,089,35,204,00,000,42,205,27,091,*66 $GBGSV,2,2,05,209,07,033,*62 {"class":"SKY","satellites":[{"PRN":5,"el":0,"az":0,"ss":27,"used":false},{"PRN":6,"el":0,"az":0,"ss":24,"used":false},{"PRN":7,"el":0,"az":0,"ss":24,"used":false},{"PRN":11,"el":0,"az":0,"ss":22,"used":false},{"PRN":12,"el":0,"az":0,"ss":50,"used":false},{"PRN":14,"el":57,"az":107,"ss":48,"used":false},{"PRN":16,"el":0,"az":0,"ss":22,"used":false},{"PRN":18,"el":55,"az":190,"ss":50,"used":false},{"PRN":21,"el":0,"az":0,"ss":23,"used":false},{"PRN":22,"el":57,"az":198,"ss":50,"used":false},{"PRN":24,"el":15,"az":335,"ss":42,"used":false},{"PRN":25,"el":0,"az":0,"ss":22,"used":false},{"PRN":26,"el":0,"az":0,"ss":24,"used":false},{"PRN":28,"el":0,"az":0,"ss":22,"used":false},{"PRN":31,"el":58,"az":140,"ss":35,"used":false},{"PRN":27,"el":56,"az":93,"ss":0,"used":false},{"PRN":9,"el":44,"az":71,"ss":0,"used":false},{"PRN":15,"el":24,"az":255,"ss":0,"used":false},{"PRN":4,"el":18,"az":332,"ss":0,"used":false},{"PRN":17,"el":15,"az":22,"ss":0,"used":false},{"PRN":23,"el":5,"az":259,"ss":0,"used":false},{"PRN":201,"el":0,"az":0,"ss":44,"used":false},{"PRN":202,"el":14,"az":89,"ss":35,"used":false},{"PRN":204,"el":0,"az":0,"ss":42,"used":false},{"PRN":205,"el":27,"az":91,"ss":0,"used":false},{"PRN":209,"el":7,"az":33,"ss":0,"used":false}]} $GNRMC,053229.438,V,,,,,,,020315,,,N*56 $PSRFEPE,053230.438,V,,,,,*2B $GPGGA,053230.438,,,,,0,00,,,M,0.0,M,,0000*5E $GNGNS,053230.438,,,,,NNNN,00,,,0.0,,0000*6B $GNGSA,A,1,,,,,,,,,,,,,,,*00 {"class":"TPV","mode":1} $GPGSV,6,1,21,05,00,000,21,06,00,000,24,07,00,000,23,11,00,000,22*7D $GPGSV,6,2,21,12,00,000,49,14,57,107,47,16,00,000,21,18,55,190,50*72 $GPGSV,6,3,21,21,00,000,23,22,57,198,50,24,15,335,42,25,00,000,22*7C $GPGSV,6,4,21,26,00,000,23,28,00,000,22,31,58,140,35,27,56,093,*77 $GPGSV,6,5,21,09,44,071,,15,24,255,,04,18,332,,17,15,022,*7B $GPGSV,6,6,21,23,05,259,*40 {"class":"SKY","satellites":[{"PRN":5,"el":0,"az":0,"ss":21,"used":false},{"PRN":6,"el":0,"az":0,"ss":24,"used":false},{"PRN":7,"el":0,"az":0,"ss":23,"used":false},{"PRN":11,"el":0,"az":0,"ss":22,"used":false},{"PRN":12,"el":0,"az":0,"ss":49,"used":false},{"PRN":14,"el":57,"az":107,"ss":47,"used":false},{"PRN":16,"el":0,"az":0,"ss":21,"used":false},{"PRN":18,"el":55,"az":190,"ss":50,"used":false},{"PRN":21,"el":0,"az":0,"ss":23,"used":false},{"PRN":22,"el":57,"az":198,"ss":50,"used":false},{"PRN":24,"el":15,"az":335,"ss":42,"used":false},{"PRN":25,"el":0,"az":0,"ss":22,"used":false},{"PRN":26,"el":0,"az":0,"ss":23,"used":false},{"PRN":28,"el":0,"az":0,"ss":22,"used":false},{"PRN":31,"el":58,"az":140,"ss":35,"used":false},{"PRN":27,"el":56,"az":93,"ss":0,"used":false},{"PRN":9,"el":44,"az":71,"ss":0,"used":false},{"PRN":15,"el":24,"az":255,"ss":0,"used":false},{"PRN":4,"el":18,"az":332,"ss":0,"used":false},{"PRN":17,"el":15,"az":22,"ss":0,"used":false},{"PRN":23,"el":5,"az":259,"ss":0,"used":false}]} $GBGSV,2,1,05,201,00,000,44,202,14,089,35,204,00,000,42,205,27,091,*66 $GBGSV,2,2,05,209,07,033,*62 {"class":"SKY","satellites":[{"PRN":5,"el":0,"az":0,"ss":21,"used":false},{"PRN":6,"el":0,"az":0,"ss":24,"used":false},{"PRN":7,"el":0,"az":0,"ss":23,"used":false},{"PRN":11,"el":0,"az":0,"ss":22,"used":false},{"PRN":12,"el":0,"az":0,"ss":49,"used":false},{"PRN":14,"el":57,"az":107,"ss":47,"used":false},{"PRN":16,"el":0,"az":0,"ss":21,"used":false},{"PRN":18,"el":55,"az":190,"ss":50,"used":false},{"PRN":21,"el":0,"az":0,"ss":23,"used":false},{"PRN":22,"el":57,"az":198,"ss":50,"used":false},{"PRN":24,"el":15,"az":335,"ss":42,"used":false},{"PRN":25,"el":0,"az":0,"ss":22,"used":false},{"PRN":26,"el":0,"az":0,"ss":23,"used":false},{"PRN":28,"el":0,"az":0,"ss":22,"used":false},{"PRN":31,"el":58,"az":140,"ss":35,"used":false},{"PRN":27,"el":56,"az":93,"ss":0,"used":false},{"PRN":9,"el":44,"az":71,"ss":0,"used":false},{"PRN":15,"el":24,"az":255,"ss":0,"used":false},{"PRN":4,"el":18,"az":332,"ss":0,"used":false},{"PRN":17,"el":15,"az":22,"ss":0,"used":false},{"PRN":23,"el":5,"az":259,"ss":0,"used":false},{"PRN":201,"el":0,"az":0,"ss":44,"used":false},{"PRN":202,"el":14,"az":89,"ss":35,"used":false},{"PRN":204,"el":0,"az":0,"ss":42,"used":false},{"PRN":205,"el":27,"az":91,"ss":0,"used":false},{"PRN":209,"el":7,"az":33,"ss":0,"used":false}]} $GNRMC,053230.438,V,,,,,,,020315,,,N*5E $PSRFEPE,053231.438,V,,,,,*2A $GPGGA,053231.438,,,,,0,00,,,M,0.0,M,,0000*5F $GNGNS,053231.438,,,,,NNNN,00,,,0.0,,0000*6A $GNGSA,A,1,,,,,,,,,,,,,,,*00 {"class":"TPV","mode":1} $GPGSV,6,1,21,03,00,000,,05,00,000,25,07,00,000,24,11,00,000,22*7D $GPGSV,6,2,21,12,00,000,49,14,57,107,48,16,00,000,22,18,55,190,51*7F $GPGSV,6,3,21,21,00,000,24,22,57,198,49,24,15,335,42,25,00,000,22*73 $GPGSV,6,4,21,26,00,000,22,28,00,000,22,31,58,140,34,27,56,093,*77 $GPGSV,6,5,21,09,44,071,,15,24,255,,04,18,332,,17,15,022,*7B $GPGSV,6,6,21,23,05,259,*40 {"class":"SKY","satellites":[{"PRN":3,"el":0,"az":0,"ss":0,"used":false},{"PRN":5,"el":0,"az":0,"ss":25,"used":false},{"PRN":7,"el":0,"az":0,"ss":24,"used":false},{"PRN":11,"el":0,"az":0,"ss":22,"used":false},{"PRN":12,"el":0,"az":0,"ss":49,"used":false},{"PRN":14,"el":57,"az":107,"ss":48,"used":false},{"PRN":16,"el":0,"az":0,"ss":22,"used":false},{"PRN":18,"el":55,"az":190,"ss":51,"used":false},{"PRN":21,"el":0,"az":0,"ss":24,"used":false},{"PRN":22,"el":57,"az":198,"ss":49,"used":false},{"PRN":24,"el":15,"az":335,"ss":42,"used":false},{"PRN":25,"el":0,"az":0,"ss":22,"used":false},{"PRN":26,"el":0,"az":0,"ss":22,"used":false},{"PRN":28,"el":0,"az":0,"ss":22,"used":false},{"PRN":31,"el":58,"az":140,"ss":34,"used":false},{"PRN":27,"el":56,"az":93,"ss":0,"used":false},{"PRN":9,"el":44,"az":71,"ss":0,"used":false},{"PRN":15,"el":24,"az":255,"ss":0,"used":false},{"PRN":4,"el":18,"az":332,"ss":0,"used":false},{"PRN":17,"el":15,"az":22,"ss":0,"used":false},{"PRN":23,"el":5,"az":259,"ss":0,"used":false}]} $GBGSV,2,1,05,201,00,000,44,202,14,089,35,204,00,000,42,205,27,091,*66 $GBGSV,2,2,05,209,07,033,*62 {"class":"SKY","satellites":[{"PRN":3,"el":0,"az":0,"ss":0,"used":false},{"PRN":5,"el":0,"az":0,"ss":25,"used":false},{"PRN":7,"el":0,"az":0,"ss":24,"used":false},{"PRN":11,"el":0,"az":0,"ss":22,"used":false},{"PRN":12,"el":0,"az":0,"ss":49,"used":false},{"PRN":14,"el":57,"az":107,"ss":48,"used":false},{"PRN":16,"el":0,"az":0,"ss":22,"used":false},{"PRN":18,"el":55,"az":190,"ss":51,"used":false},{"PRN":21,"el":0,"az":0,"ss":24,"used":false},{"PRN":22,"el":57,"az":198,"ss":49,"used":false},{"PRN":24,"el":15,"az":335,"ss":42,"used":false},{"PRN":25,"el":0,"az":0,"ss":22,"used":false},{"PRN":26,"el":0,"az":0,"ss":22,"used":false},{"PRN":28,"el":0,"az":0,"ss":22,"used":false},{"PRN":31,"el":58,"az":140,"ss":34,"used":false},{"PRN":27,"el":56,"az":93,"ss":0,"used":false},{"PRN":9,"el":44,"az":71,"ss":0,"used":false},{"PRN":15,"el":24,"az":255,"ss":0,"used":false},{"PRN":4,"el":18,"az":332,"ss":0,"used":false},{"PRN":17,"el":15,"az":22,"ss":0,"used":false},{"PRN":23,"el":5,"az":259,"ss":0,"used":false},{"PRN":201,"el":0,"az":0,"ss":44,"used":false},{"PRN":202,"el":14,"az":89,"ss":35,"used":false},{"PRN":204,"el":0,"az":0,"ss":42,"used":false},{"PRN":205,"el":27,"az":91,"ss":0,"used":false},{"PRN":209,"el":7,"az":33,"ss":0,"used":false}]} $GNRMC,053231.438,V,,,,,,,020315,,,N*5F $PSRFEPE,053232.438,A,1.2,5.77,12.97,1.2,180.0*21 $GPGGA,053232.438,3114.8789,N,12135.2442,E,1,06,1.2,153.8,M,8.3,M,,0000*6A {"class":"TPV","mode":3,"lat":31.247981667,"lon":121.587403333,"alt":153.800} $GNGNS,053232.438,3114.8789,N,12135.2442,E,ANNA,07,1.2,153.8,8.3,,0000*5F $GNGSA,A,3,22,18,14,12,31,24,,,,,,,2.5,1.2,2.2*23 {"class":"TPV","mode":3,"lat":31.247981667,"lon":121.587403333,"alt":153.800,"epv":50.600} $GNGSA,A,3,201,,,,,,,,,,,,2.5,1.2,2.2*1B {"class":"TPV","mode":3,"lat":31.247981667,"lon":121.587403333,"alt":153.800,"epv":50.600} $GPGSV,6,1,21,22,80,039,49,18,50,119,51,14,51,342,48,12,20,061,50*78 $GPGSV,6,2,21,31,51,228,34,24,04,041,43,03,00,000,20,05,00,000,26*77 $GPGSV,6,3,21,06,00,000,26,07,00,000,24,16,00,000,22,21,00,000,24*7E $GPGSV,6,4,21,25,34,142,21,26,00,000,23,28,00,000,22,27,31,036,*71 $GPGSV,6,5,21,15,21,289,,09,14,038,,30,14,180,,11,10,179,*7B $GPGSV,6,6,21,23,06,275,*4D {"class":"SKY","vdop":2.20,"hdop":1.20,"pdop":2.50,"satellites":[{"PRN":22,"el":80,"az":39,"ss":49,"used":false},{"PRN":18,"el":50,"az":119,"ss":51,"used":false},{"PRN":14,"el":51,"az":342,"ss":48,"used":false},{"PRN":12,"el":20,"az":61,"ss":50,"used":false},{"PRN":31,"el":51,"az":228,"ss":34,"used":false},{"PRN":24,"el":4,"az":41,"ss":43,"used":false},{"PRN":3,"el":0,"az":0,"ss":20,"used":false},{"PRN":5,"el":0,"az":0,"ss":26,"used":false},{"PRN":6,"el":0,"az":0,"ss":26,"used":false},{"PRN":7,"el":0,"az":0,"ss":24,"used":false},{"PRN":16,"el":0,"az":0,"ss":22,"used":false},{"PRN":21,"el":0,"az":0,"ss":24,"used":false},{"PRN":25,"el":34,"az":142,"ss":21,"used":false},{"PRN":26,"el":0,"az":0,"ss":23,"used":false},{"PRN":28,"el":0,"az":0,"ss":22,"used":false},{"PRN":27,"el":31,"az":36,"ss":0,"used":false},{"PRN":15,"el":21,"az":289,"ss":0,"used":false},{"PRN":9,"el":14,"az":38,"ss":0,"used":false},{"PRN":30,"el":14,"az":180,"ss":0,"used":false},{"PRN":11,"el":10,"az":179,"ss":0,"used":false},{"PRN":23,"el":6,"az":275,"ss":0,"used":false}]} $GBGSV,3,1,11,201,49,147,44,202,23,250,35,204,35,123,42,213,83,243,*6D $GBGSV,3,2,11,210,70,270,,207,70,267,,206,55,311,,203,49,208,*6B $GBGSV,3,3,11,209,36,317,,214,36,147,,205,11,257,*67 {"class":"SKY","vdop":2.20,"hdop":1.20,"pdop":2.50,"satellites":[{"PRN":22,"el":80,"az":39,"ss":49,"used":false},{"PRN":18,"el":50,"az":119,"ss":51,"used":false},{"PRN":14,"el":51,"az":342,"ss":48,"used":false},{"PRN":12,"el":20,"az":61,"ss":50,"used":false},{"PRN":31,"el":51,"az":228,"ss":34,"used":false},{"PRN":24,"el":4,"az":41,"ss":43,"used":false},{"PRN":3,"el":0,"az":0,"ss":20,"used":false},{"PRN":5,"el":0,"az":0,"ss":26,"used":false},{"PRN":6,"el":0,"az":0,"ss":26,"used":false},{"PRN":7,"el":0,"az":0,"ss":24,"used":false},{"PRN":16,"el":0,"az":0,"ss":22,"used":false},{"PRN":21,"el":0,"az":0,"ss":24,"used":false},{"PRN":25,"el":34,"az":142,"ss":21,"used":false},{"PRN":26,"el":0,"az":0,"ss":23,"used":false},{"PRN":28,"el":0,"az":0,"ss":22,"used":false},{"PRN":27,"el":31,"az":36,"ss":0,"used":false},{"PRN":15,"el":21,"az":289,"ss":0,"used":false},{"PRN":9,"el":14,"az":38,"ss":0,"used":false},{"PRN":30,"el":14,"az":180,"ss":0,"used":false},{"PRN":11,"el":10,"az":179,"ss":0,"used":false},{"PRN":23,"el":6,"az":275,"ss":0,"used":false},{"PRN":201,"el":49,"az":147,"ss":44,"used":true},{"PRN":202,"el":23,"az":250,"ss":35,"used":false},{"PRN":204,"el":35,"az":123,"ss":42,"used":false},{"PRN":213,"el":83,"az":243,"ss":0,"used":false},{"PRN":210,"el":70,"az":270,"ss":0,"used":false},{"PRN":207,"el":70,"az":267,"ss":0,"used":false},{"PRN":206,"el":55,"az":311,"ss":0,"used":false},{"PRN":203,"el":49,"az":208,"ss":0,"used":false},{"PRN":209,"el":36,"az":317,"ss":0,"used":false},{"PRN":214,"el":36,"az":147,"ss":0,"used":false},{"PRN":205,"el":11,"az":257,"ss":0,"used":false}]} $GNRMC,053232.438,A,3114.8789,N,12135.2442,E,0.26,167.42,020315,,,A*70 {"class":"TPV","mode":3,"time":"2015-03-02T05:32:32.438Z","ept":0.005,"lat":31.247981667,"lon":121.587403333,"alt":153.800,"epv":50.600,"track":167.4200,"speed":0.134} $PSRFEPE,053233.438,A,1.2,25.61,66.06,0.3,180.0*1E $GPGGA,053233.438,3114.8821,N,12135.2428,E,1,06,1.2,167.2,M,8.3,M,,0000*67 $GNGNS,053233.438,3114.8821,N,12135.2428,E,ANNA,07,1.2,167.2,8.3,,0000*52 $GNGSA,A,3,22,18,14,12,31,24,,,,,,,2.5,1.2,2.2*23 $GNGSA,A,3,201,,,,,,,,,,,,2.5,1.2,2.2*1B $GPGSV,5,1,18,22,73,312,50,18,66,145,51,14,41,330,48,12,34,060,49*7B $GPGSV,5,2,18,31,37,248,34,24,13,042,43,03,00,000,21,06,00,000,27*7E $GPGSV,5,3,18,07,00,000,23,16,00,000,20,21,00,000,24,26,00,000,23*75 $GPGSV,5,4,18,25,44,164,,27,38,028,,09,22,036,,30,14,194,*77 $GPGSV,5,5,18,11,11,192,,15,06,294,*77 {"class":"SKY","vdop":2.20,"hdop":1.20,"pdop":2.50,"satellites":[{"PRN":22,"el":73,"az":312,"ss":50,"used":false},{"PRN":18,"el":66,"az":145,"ss":51,"used":false},{"PRN":14,"el":41,"az":330,"ss":48,"used":false},{"PRN":12,"el":34,"az":60,"ss":49,"used":false},{"PRN":31,"el":37,"az":248,"ss":34,"used":false},{"PRN":24,"el":13,"az":42,"ss":43,"used":false},{"PRN":3,"el":0,"az":0,"ss":21,"used":false},{"PRN":6,"el":0,"az":0,"ss":27,"used":false},{"PRN":7,"el":0,"az":0,"ss":23,"used":false},{"PRN":16,"el":0,"az":0,"ss":20,"used":false},{"PRN":21,"el":0,"az":0,"ss":24,"used":false},{"PRN":26,"el":0,"az":0,"ss":23,"used":false},{"PRN":25,"el":44,"az":164,"ss":0,"used":false},{"PRN":27,"el":38,"az":28,"ss":0,"used":false},{"PRN":9,"el":22,"az":36,"ss":0,"used":false},{"PRN":30,"el":14,"az":194,"ss":0,"used":false},{"PRN":11,"el":11,"az":192,"ss":0,"used":false},{"PRN":15,"el":6,"az":294,"ss":0,"used":false}]} $GBGSV,3,1,11,201,49,147,44,202,23,250,35,204,35,123,42,213,83,243,*6D $GBGSV,3,2,11,210,70,270,,207,70,267,,206,55,311,,203,49,208,*6B $GBGSV,3,3,11,209,36,317,,214,36,147,,205,11,257,*67 {"class":"SKY","vdop":2.20,"hdop":1.20,"pdop":2.50,"satellites":[{"PRN":22,"el":73,"az":312,"ss":50,"used":false},{"PRN":18,"el":66,"az":145,"ss":51,"used":false},{"PRN":14,"el":41,"az":330,"ss":48,"used":false},{"PRN":12,"el":34,"az":60,"ss":49,"used":false},{"PRN":31,"el":37,"az":248,"ss":34,"used":false},{"PRN":24,"el":13,"az":42,"ss":43,"used":false},{"PRN":3,"el":0,"az":0,"ss":21,"used":false},{"PRN":6,"el":0,"az":0,"ss":27,"used":false},{"PRN":7,"el":0,"az":0,"ss":23,"used":false},{"PRN":16,"el":0,"az":0,"ss":20,"used":false},{"PRN":21,"el":0,"az":0,"ss":24,"used":false},{"PRN":26,"el":0,"az":0,"ss":23,"used":false},{"PRN":25,"el":44,"az":164,"ss":0,"used":false},{"PRN":27,"el":38,"az":28,"ss":0,"used":false},{"PRN":9,"el":22,"az":36,"ss":0,"used":false},{"PRN":30,"el":14,"az":194,"ss":0,"used":false},{"PRN":11,"el":11,"az":192,"ss":0,"used":false},{"PRN":15,"el":6,"az":294,"ss":0,"used":false},{"PRN":201,"el":49,"az":147,"ss":44,"used":true},{"PRN":202,"el":23,"az":250,"ss":35,"used":false},{"PRN":204,"el":35,"az":123,"ss":42,"used":false},{"PRN":213,"el":83,"az":243,"ss":0,"used":false},{"PRN":210,"el":70,"az":270,"ss":0,"used":false},{"PRN":207,"el":70,"az":267,"ss":0,"used":false},{"PRN":206,"el":55,"az":311,"ss":0,"used":false},{"PRN":203,"el":49,"az":208,"ss":0,"used":false},{"PRN":209,"el":36,"az":317,"ss":0,"used":false},{"PRN":214,"el":36,"az":147,"ss":0,"used":false},{"PRN":205,"el":11,"az":257,"ss":0,"used":false}]} $GNRMC,053233.438,A,3114.8821,N,12135.2428,E,0.07,167.42,020315,,,A*73 {"class":"TPV","mode":3,"time":"2015-03-02T05:32:33.438Z","ept":0.005,"lat":31.248035000,"lon":121.587380000,"alt":167.200,"epv":50.600,"track":167.4200,"speed":0.036,"climb":13.400,"epc":101.20} gpsd-3.15/test/daemon/blumax-gps009.log0000664000175000017500000000760312461156335016016 0ustar esresr# Name: Blumax GPS-009 # Chipset: SiRF Star III (according to data sheet) # Submitter: Hartmut Holzgraefe # Date: 2008-07-18 # Location: Bielefeld, DE, 52=B0 01' N, 08=B0 31' O # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # Following lines are # `cat /dev/ttyACM0` at startup $PSRFTXTVersion GSW3.2.2_3.1.00.12-SDK003P1.01a *78 $PSRFTXTGreat-Well 20061201*33 $PSRFTXTTOW: 484076*30 $PSRFTXTWK: 1488*4C $PSRFTXTPOS: 3889831 583832 5004208*35 $PSRFTXTCLK: 95879*0B $PSRFTXTCHNL: 12*5F $PSRFTXTBaud rate: 57600 *51 $GPGGA,142816.359,,,,,0,00,,,M,0.0,M,,0000*51 $GPGLL,,,,,142816.359,V,N*7D $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,12,48,233,,17,39,066,,15,29,172,,22,19,291,*70 $GPGSV,3,2,12,26,17,161,,09,81,300,,05,32,240,,29,31,171,*70 $GPGSV,3,3,12,18,15,251,,14,14,319,,28,08,059,,30,08,239,*77 $GPRMC,142816.359,V,,,,,,,180708,,,N*4C $GPGGA,142817.299,,,,,0,00,,,M,0.0,M,,0000*5D $GPGLL,,,,,142817.299,V,N*71 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,12,48,233,,17,39,066,,15,29,172,,22,19,291,*70 $GPGSV,3,2,12,26,17,161,28,09,81,300,,05,32,240,,29,31,171,*7A $GPGSV,3,3,12,18,15,251,,14,14,319,,28,08,059,,30,08,239,*77 $GPRMC,142817.299,V,,,,,,,180708,,,N*40 $GPGGA,142818.299,,,,,0,00,,,M,0.0,M,,0000*52 $GPGLL,,,,,142818.299,V,N*7E $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,12,48,233,,17,39,066,,15,29,172,,22,19,291,*70 $GPGSV,3,2,12,26,17,161,29,09,81,300,,05,32,240,21,29,31,171,*78 $GPGSV,3,3,12,18,15,251,,14,14,319,,28,08,059,,30,08,239,*77 $GPRMC,142818.299,V,,,,,,,180708,,,N*4F $GPGGA,142818.899,5201.0687,N,00832.0645,E,0,04,,35.8,M,47.2,M,,0000*47 $GPGLL,5201.0687,N,00832.0645,E,142818.899,V,N*4E $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 $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 $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 $GPRMC,142819.299,A,5201.0809,N,00832.0852,E,0.87,249.59,180708,,,A*60 # ... # # Following lines are # `cat /dev/ttyACM0` stationary $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 $GPGLL,5201.1302,N,00832.1652,E,143054.000,A,A*51 $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 $GPRMC,143054.000,A,5201.1302,N,00832.1652,E,0.06,48.00,180708,,,A*5A $GPZDA,143055.000,18,07,2008,,*54 $GPGGA,143055.000,5201.1302,N,00832.1652,E,1,05,1.2,72.2,M,47.2,M,,0000*65 $GPGLL,5201.1302,N,00832.1652,E,143055.000,A,A*50 $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 $GPRMC,143055.000,A,5201.1302,N,00832.1652,E,0.08,64.91,180708,,,A*53 $GPZDA,143056.000,18,07,2008,,*57 $GPGGA,143056.000,5201.1302,N,00832.1652,E,1,05,1.2,72.3,M,47.2,M,,0000*67 $GPGLL,5201.1302,N,00832.1652,E,143056.000,A,A*53 $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 $GPRMC,143056.000,A,5201.1302,N,00832.1652,E,0.07,45.54,180708,,,A*55 gpsd-3.15/test/daemon/blumax-gps009.log.chk0000664000175000017500000002326312467340617016566 0ustar esresr$PSRFTXTVersion GSW3.2.2_3.1.00.12-SDK003P1.01a *78 $PSRFTXTGreat-Well 20061201*33 $PSRFTXTTOW: 484076*30 $PSRFTXTWK: 1488*4C $PSRFTXTPOS: 3889831 583832 5004208*35 $PSRFTXTCLK: 95879*0B $PSRFTXTCHNL: 12*5F $PSRFTXTBaud rate: 57600 *51 $GPGGA,142816.359,,,,,0,00,,,M,0.0,M,,0000*51 $GPGLL,,,,,142816.359,V,N*7D $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,3,1,12,12,48,233,,17,39,066,,15,29,172,,22,19,291,*70 $GPGSV,3,2,12,26,17,161,,09,81,300,,05,32,240,,29,31,171,*70 $GPGSV,3,3,12,18,15,251,,14,14,319,,28,08,059,,30,08,239,*77 {"class":"SKY","satellites":[{"PRN":12,"el":48,"az":233,"ss":0,"used":false},{"PRN":17,"el":39,"az":66,"ss":0,"used":false},{"PRN":15,"el":29,"az":172,"ss":0,"used":false},{"PRN":22,"el":19,"az":291,"ss":0,"used":false},{"PRN":26,"el":17,"az":161,"ss":0,"used":false},{"PRN":9,"el":81,"az":300,"ss":0,"used":false},{"PRN":5,"el":32,"az":240,"ss":0,"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,142816.359,V,,,,,,,180708,,,N*4C $GPGGA,142817.299,,,,,0,00,,,M,0.0,M,,0000*5D $GPGLL,,,,,142817.299,V,N*71 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,12,48,233,,17,39,066,,15,29,172,,22,19,291,*70 $GPGSV,3,2,12,26,17,161,28,09,81,300,,05,32,240,,29,31,171,*7A $GPGSV,3,3,12,18,15,251,,14,14,319,,28,08,059,,30,08,239,*77 {"class":"SKY","satellites":[{"PRN":12,"el":48,"az":233,"ss":0,"used":false},{"PRN":17,"el":39,"az":66,"ss":0,"used":false},{"PRN":15,"el":29,"az":172,"ss":0,"used":false},{"PRN":22,"el":19,"az":291,"ss":0,"used":false},{"PRN":26,"el":17,"az":161,"ss":28,"used":false},{"PRN":9,"el":81,"az":300,"ss":0,"used":false},{"PRN":5,"el":32,"az":240,"ss":0,"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,142817.299,V,,,,,,,180708,,,N*40 $GPGGA,142818.299,,,,,0,00,,,M,0.0,M,,0000*52 $GPGLL,,,,,142818.299,V,N*7E $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,12,48,233,,17,39,066,,15,29,172,,22,19,291,*70 $GPGSV,3,2,12,26,17,161,29,09,81,300,,05,32,240,21,29,31,171,*78 $GPGSV,3,3,12,18,15,251,,14,14,319,,28,08,059,,30,08,239,*77 {"class":"SKY","satellites":[{"PRN":12,"el":48,"az":233,"ss":0,"used":false},{"PRN":17,"el":39,"az":66,"ss":0,"used":false},{"PRN":15,"el":29,"az":172,"ss":0,"used":false},{"PRN":22,"el":19,"az":291,"ss":0,"used":false},{"PRN":26,"el":17,"az":161,"ss":29,"used":false},{"PRN":9,"el":81,"az":300,"ss":0,"used":false},{"PRN":5,"el":32,"az":240,"ss":21,"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.299,V,,,,,,,180708,,,N*4F $GPGGA,142818.899,5201.0687,N,00832.0645,E,0,04,,35.8,M,47.2,M,,0000*47 $GPGLL,5201.0687,N,00832.0645,E,142818.899,V,N*4E $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","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","mode":3,"lat":52.018015000,"lon":8.534753333,"alt":32.100} $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","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}]} $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 $GPGLL,5201.1302,N,00832.1652,E,143054.000,A,A*51 {"class":"TPV","mode":3,"time":"2008-07-18T14:30:54.000Z","ept":0.005,"lat":52.018836667,"lon":8.536086667,"alt":72.200,"epv":23.000,"speed":0.000,"climb":0.000} $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","xdop":0.80,"ydop":0.87,"vdop":2.60,"tdop":1.40,"hdop":1.20,"gdop":3.11,"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","mode":3,"time":"2008-07-18T14:30:54.000Z","ept":0.005,"lat":52.018836667,"lon":8.536086667,"alt":72.200,"epx":11.944,"epy":13.018,"epv":23.000,"track":48.0000,"speed":0.031,"climb":0.000} $GPZDA,143055.000,18,07,2008,,*54 $GPGGA,143055.000,5201.1302,N,00832.1652,E,1,05,1.2,72.2,M,47.2,M,,0000*65 $GPGLL,5201.1302,N,00832.1652,E,143055.000,A,A*50 {"class":"TPV","mode":3,"time":"2008-07-18T14:30:55.000Z","ept":0.005,"lat":52.018836667,"lon":8.536086667,"alt":72.200,"epx":11.944,"epy":13.018,"epv":59.800,"speed":0.000,"climb":0.000} $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","xdop":0.80,"ydop":0.87,"vdop":2.60,"tdop":1.40,"hdop":1.20,"gdop":3.11,"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","mode":3,"time":"2008-07-18T14:30:55.000Z","ept":0.005,"lat":52.018836667,"lon":8.536086667,"alt":72.200,"epx":11.944,"epy":13.018,"epv":59.800,"track":64.9100,"speed":0.041,"climb":0.000} $GPZDA,143056.000,18,07,2008,,*57 $GPGGA,143056.000,5201.1302,N,00832.1652,E,1,05,1.2,72.3,M,47.2,M,,0000*67 $GPGLL,5201.1302,N,00832.1652,E,143056.000,A,A*53 {"class":"TPV","mode":3,"time":"2008-07-18T14:30:56.000Z","ept":0.005,"lat":52.018836667,"lon":8.536086667,"alt":72.300,"epx":11.944,"epy":13.018,"epv":59.800,"speed":0.000,"climb":0.000} $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","xdop":0.80,"ydop":0.87,"vdop":2.60,"tdop":1.40,"hdop":1.20,"gdop":3.11,"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","mode":3,"time":"2008-07-18T14:30:56.000Z","ept":0.005,"lat":52.018836667,"lon":8.536086667,"alt":72.300,"epx":11.944,"epy":13.018,"epv":59.800,"track":45.5400,"speed":0.036,"climb":0.000} gpsd-3.15/test/daemon/bn-9015.log0000664000175000017500000001115112467342657014504 0ustar esresr# Name: Bluenext BN-9015 # Chipset: Skytraq Venus 6 # Submitter: Andrew Gray # Date: 2010-06-12 # Location: Delft, NL, 52.01N 4.36E # # The sample was taken with the unit stationary on windowsill. # The log starts before the unit was powered on. The log ends # when I walked it about 3 meters from the bluetooth hub is was paired # with. # # (Duplicative leading and trailing sections were later removed # to speed up testiing.) $GPGGA,170958.972,5200.8499,N,00421.7860,E,0,00,0.0,48.8,M,0.0,M,,0000*52 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,,09,28,136,*70 $GPGSV,3,2,11,29,27,200,,02,25,101,,27,23,137,,04,21,055,*77 $GPGSV,3,3,11,31,18,305,,32,06,331,,20,02,354,*40 $GPRMC,170958.972,V,5200.8499,N,00421.7860,E,000.0,000.0,120610,,,N*79 $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02 $GPGGA,170959.972,5200.8499,N,00421.7860,E,0,00,0.0,48.8,M,0.0,M,,0000*53 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 $GPGSV,3,1,11,12,73,067,,30,67,271,38,14,44,267,,09,28,136,*71 $GPGSV,3,2,11,29,27,200,,02,25,101,,27,23,137,,04,21,055,*77 $GPGSV,3,3,11,31,18,305,,32,06,331,,20,02,354,*40 $GPRMC,170959.972,V,5200.8499,N,00421.7860,E,000.0,000.0,120610,,,N*78 $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02 $GPGGA,171000.972,5200.8499,N,00421.7860,E,0,00,0.0,48.8,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,34,09,28,136,*77 $GPGSV,3,2,11,29,27,200,,02,25,101,,27,23,137,,04,21,055,*77 $GPGSV,3,3,11,31,18,305,,32,06,331,,20,02,354,*40 $GPRMC,171000.972,V,5200.8499,N,00421.7860,E,000.0,000.0,120610,,,N*7C $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02 $GPGGA,171001.972,5200.8499,N,00421.7860,E,0,00,0.0,48.8,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,34,09,28,136,*77 $GPGSV,3,2,11,29,27,200,,02,25,101,,27,23,137,,04,21,055,*77 $GPGSV,3,3,11,31,18,305,,32,06,331,,20,02,354,*40 $GPRMC,171001.972,V,5200.8499,N,00421.7860,E,000.0,000.0,120610,,,N*7D $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02 $GPGGA,171002.972,5200.8519,N,00421.7812,E,1,08,1.0,8.8,M,44.8,M,,0000*5D $GPGSA,A,3,14,30,09,29,02,27,04,31,,,,,2.3,1.0,2.0*35 $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,33,09,28,136,26*74 $GPGSV,3,2,11,29,27,200,25,02,25,101,28,27,23,137,28,04,21,055,38*7B $GPGSV,3,3,11,31,18,305,31,32,06,331,,20,02,354,*42 $GPRMC,171002.972,A,5200.8519,N,00421.7812,E,000.0,000.0,120610,,,A*6A $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D $GPGGA,171003.972,5200.8519,N,00421.7819,E,1,08,1.0,8.8,M,44.8,M,,0000*57 $GPGSA,A,3,14,30,09,29,02,27,04,31,,,,,2.3,1.0,2.0*35 $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,34,09,28,136,27*72 $GPGSV,3,2,11,29,27,200,27,02,25,101,28,27,23,137,26,04,21,055,38*77 $GPGSV,3,3,11,31,18,305,30,32,06,331,,20,02,354,*43 $GPRMC,171003.972,A,5200.8519,N,00421.7819,E,000.9,022.1,120610,,,A*68 $GPVTG,022.1,T,,M,000.9,N,001.8,K,A*0C $GPGGA,171004.972,5200.8519,N,00421.7830,E,1,09,0.9,8.8,M,44.8,M,,0000*52 $GPGSA,A,3,14,30,12,09,29,02,27,04,31,,,,1.8,0.9,1.5*30 $GPGSV,3,1,11,12,73,067,32,30,67,271,39,14,44,267,34,09,28,136,26*72 $GPGSV,3,2,11,29,27,200,26,02,25,101,27,27,23,137,27,04,21,055,38*78 $GPGSV,3,3,11,31,18,305,31,32,06,331,,20,02,354,*42 $GPRMC,171004.972,A,5200.8519,N,00421.7830,E,000.0,000.0,120610,,,A*6C $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D $GPGGA,171005.972,5200.8520,N,00421.7842,E,1,09,0.9,8.3,M,44.8,M,,0000*57 $GPGSA,A,3,14,30,12,09,29,02,27,04,31,,,,1.8,0.9,1.5*30 $GPGSV,3,1,11,12,73,067,32,30,67,271,39,14,44,267,34,09,28,136,26*72 $GPGSV,3,2,11,29,27,200,27,02,25,101,28,27,23,137,27,04,21,055,38*76 $GPGSV,3,3,11,31,18,305,30,32,06,331,,20,02,354,*43 $GPRMC,171005.972,A,5200.8520,N,00421.7842,E,000.0,000.0,120610,,,A*62 $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D $GPGGA,171006.972,5200.8513,N,00421.7856,E,1,09,0.9,7.6,M,44.8,M,,0000*5B $GPGSA,A,3,14,30,12,09,29,02,27,04,31,,,,1.8,0.9,1.5*30 $GPGSV,3,1,11,12,73,067,33,30,67,271,38,14,44,267,33,09,28,136,26*75 $GPGSV,3,2,11,29,27,200,26,02,25,101,27,27,23,137,28,04,21,055,37*78 $GPGSV,3,3,11,31,18,305,30,32,06,331,,20,02,354,*43 $GPRMC,171006.972,A,5200.8513,N,00421.7856,E,000.0,000.0,120610,,,A*64 $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D $GPGGA,171007.972,5200.8514,N,00421.7851,E,1,09,0.9,7.7,M,44.8,M,,0000*5B $GPGSA,A,3,14,30,12,09,29,02,27,04,31,,,,1.8,0.9,1.5*30 $GPGSV,3,1,11,12,73,067,33,30,67,271,38,14,44,267,33,09,28,136,26*75 $GPGSV,3,2,11,29,27,200,26,02,25,101,27,27,23,137,28,04,21,055,37*78 $GPGSV,3,3,11,31,18,305,30,32,06,331,,20,02,354,*43 $GPRMC,171007.972,A,5200.8514,N,00421.7851,E,000.0,000.0,120610,,,A*65 $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D gpsd-3.15/test/daemon/bn-9015.log.chk0000664000175000017500000002735412467342657015264 0ustar esresr$GPGGA,170958.972,5200.8499,N,00421.7860,E,0,00,0.0,48.8,M,0.0,M,,0000*52 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 {"class":"TPV","mode":1} $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,,09,28,136,*70 $GPGSV,3,2,11,29,27,200,,02,25,101,,27,23,137,,04,21,055,*77 $GPGSV,3,3,11,31,18,305,,32,06,331,,20,02,354,*40 {"class":"SKY","vdop":0.00,"hdop":0.00,"pdop":0.00,"satellites":[{"PRN":12,"el":73,"az":67,"ss":0,"used":false},{"PRN":30,"el":67,"az":271,"ss":39,"used":false},{"PRN":14,"el":44,"az":267,"ss":0,"used":false},{"PRN":9,"el":28,"az":136,"ss":0,"used":false},{"PRN":29,"el":27,"az":200,"ss":0,"used":false},{"PRN":2,"el":25,"az":101,"ss":0,"used":false},{"PRN":27,"el":23,"az":137,"ss":0,"used":false},{"PRN":4,"el":21,"az":55,"ss":0,"used":false},{"PRN":31,"el":18,"az":305,"ss":0,"used":false},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,170958.972,V,5200.8499,N,00421.7860,E,000.0,000.0,120610,,,N*79 $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02 $GPGGA,170959.972,5200.8499,N,00421.7860,E,0,00,0.0,48.8,M,0.0,M,,0000*53 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 {"class":"TPV","mode":1} $GPGSV,3,1,11,12,73,067,,30,67,271,38,14,44,267,,09,28,136,*71 $GPGSV,3,2,11,29,27,200,,02,25,101,,27,23,137,,04,21,055,*77 $GPGSV,3,3,11,31,18,305,,32,06,331,,20,02,354,*40 {"class":"SKY","vdop":0.00,"hdop":0.00,"pdop":0.00,"satellites":[{"PRN":12,"el":73,"az":67,"ss":0,"used":false},{"PRN":30,"el":67,"az":271,"ss":38,"used":false},{"PRN":14,"el":44,"az":267,"ss":0,"used":false},{"PRN":9,"el":28,"az":136,"ss":0,"used":false},{"PRN":29,"el":27,"az":200,"ss":0,"used":false},{"PRN":2,"el":25,"az":101,"ss":0,"used":false},{"PRN":27,"el":23,"az":137,"ss":0,"used":false},{"PRN":4,"el":21,"az":55,"ss":0,"used":false},{"PRN":31,"el":18,"az":305,"ss":0,"used":false},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,170959.972,V,5200.8499,N,00421.7860,E,000.0,000.0,120610,,,N*78 $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02 $GPGGA,171000.972,5200.8499,N,00421.7860,E,0,00,0.0,48.8,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 {"class":"TPV","mode":1} $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,34,09,28,136,*77 $GPGSV,3,2,11,29,27,200,,02,25,101,,27,23,137,,04,21,055,*77 $GPGSV,3,3,11,31,18,305,,32,06,331,,20,02,354,*40 {"class":"SKY","vdop":0.00,"hdop":0.00,"pdop":0.00,"satellites":[{"PRN":12,"el":73,"az":67,"ss":0,"used":false},{"PRN":30,"el":67,"az":271,"ss":39,"used":false},{"PRN":14,"el":44,"az":267,"ss":34,"used":false},{"PRN":9,"el":28,"az":136,"ss":0,"used":false},{"PRN":29,"el":27,"az":200,"ss":0,"used":false},{"PRN":2,"el":25,"az":101,"ss":0,"used":false},{"PRN":27,"el":23,"az":137,"ss":0,"used":false},{"PRN":4,"el":21,"az":55,"ss":0,"used":false},{"PRN":31,"el":18,"az":305,"ss":0,"used":false},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,171000.972,V,5200.8499,N,00421.7860,E,000.0,000.0,120610,,,N*7C $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02 $GPGGA,171001.972,5200.8499,N,00421.7860,E,0,00,0.0,48.8,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 {"class":"TPV","mode":1} $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,34,09,28,136,*77 $GPGSV,3,2,11,29,27,200,,02,25,101,,27,23,137,,04,21,055,*77 $GPGSV,3,3,11,31,18,305,,32,06,331,,20,02,354,*40 {"class":"SKY","vdop":0.00,"hdop":0.00,"pdop":0.00,"satellites":[{"PRN":12,"el":73,"az":67,"ss":0,"used":false},{"PRN":30,"el":67,"az":271,"ss":39,"used":false},{"PRN":14,"el":44,"az":267,"ss":34,"used":false},{"PRN":9,"el":28,"az":136,"ss":0,"used":false},{"PRN":29,"el":27,"az":200,"ss":0,"used":false},{"PRN":2,"el":25,"az":101,"ss":0,"used":false},{"PRN":27,"el":23,"az":137,"ss":0,"used":false},{"PRN":4,"el":21,"az":55,"ss":0,"used":false},{"PRN":31,"el":18,"az":305,"ss":0,"used":false},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,171001.972,V,5200.8499,N,00421.7860,E,000.0,000.0,120610,,,N*7D $GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02 $GPGGA,171002.972,5200.8519,N,00421.7812,E,1,08,1.0,8.8,M,44.8,M,,0000*5D {"class":"TPV","mode":3,"lat":52.014198333,"lon":4.363020000,"alt":8.800,"epv":0.000} $GPGSA,A,3,14,30,09,29,02,27,04,31,,,,,2.3,1.0,2.0*35 {"class":"TPV","mode":3,"lat":52.014198333,"lon":4.363020000,"alt":8.800,"epv":0.000} $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,33,09,28,136,26*74 $GPGSV,3,2,11,29,27,200,25,02,25,101,28,27,23,137,28,04,21,055,38*7B $GPGSV,3,3,11,31,18,305,31,32,06,331,,20,02,354,*42 {"class":"SKY","xdop":0.61,"ydop":0.74,"vdop":2.00,"tdop":1.10,"hdop":1.00,"gdop":2.52,"pdop":2.30,"satellites":[{"PRN":12,"el":73,"az":67,"ss":0,"used":false},{"PRN":30,"el":67,"az":271,"ss":39,"used":true},{"PRN":14,"el":44,"az":267,"ss":33,"used":true},{"PRN":9,"el":28,"az":136,"ss":26,"used":true},{"PRN":29,"el":27,"az":200,"ss":25,"used":true},{"PRN":2,"el":25,"az":101,"ss":28,"used":true},{"PRN":27,"el":23,"az":137,"ss":28,"used":true},{"PRN":4,"el":21,"az":55,"ss":38,"used":true},{"PRN":31,"el":18,"az":305,"ss":31,"used":true},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,171002.972,A,5200.8519,N,00421.7812,E,000.0,000.0,120610,,,A*6A {"class":"TPV","mode":3,"time":"2010-06-12T17:10:02.972Z","ept":0.005,"lat":52.014198333,"lon":4.363020000,"alt":8.800,"epx":9.170,"epy":11.104,"epv":0.000,"track":0.0000,"speed":0.000} $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D $GPGGA,171003.972,5200.8519,N,00421.7819,E,1,08,1.0,8.8,M,44.8,M,,0000*57 $GPGSA,A,3,14,30,09,29,02,27,04,31,,,,,2.3,1.0,2.0*35 $GPGSV,3,1,11,12,73,067,,30,67,271,39,14,44,267,34,09,28,136,27*72 $GPGSV,3,2,11,29,27,200,27,02,25,101,28,27,23,137,26,04,21,055,38*77 $GPGSV,3,3,11,31,18,305,30,32,06,331,,20,02,354,*43 {"class":"SKY","xdop":0.61,"ydop":0.74,"vdop":2.00,"tdop":1.10,"hdop":1.00,"gdop":2.52,"pdop":2.30,"satellites":[{"PRN":12,"el":73,"az":67,"ss":0,"used":false},{"PRN":30,"el":67,"az":271,"ss":39,"used":true},{"PRN":14,"el":44,"az":267,"ss":34,"used":true},{"PRN":9,"el":28,"az":136,"ss":27,"used":true},{"PRN":29,"el":27,"az":200,"ss":27,"used":true},{"PRN":2,"el":25,"az":101,"ss":28,"used":true},{"PRN":27,"el":23,"az":137,"ss":26,"used":true},{"PRN":4,"el":21,"az":55,"ss":38,"used":true},{"PRN":31,"el":18,"az":305,"ss":30,"used":true},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,171003.972,A,5200.8519,N,00421.7819,E,000.9,022.1,120610,,,A*68 {"class":"TPV","mode":3,"time":"2010-06-12T17:10:03.972Z","ept":0.005,"lat":52.014198333,"lon":4.363031667,"alt":8.800,"epx":9.170,"epy":11.104,"epv":46.000,"track":22.1000,"speed":0.463,"climb":0.000,"eps":22.21,"epc":46.00} $GPVTG,022.1,T,,M,000.9,N,001.8,K,A*0C $GPGGA,171004.972,5200.8519,N,00421.7830,E,1,09,0.9,8.8,M,44.8,M,,0000*52 $GPGSA,A,3,14,30,12,09,29,02,27,04,31,,,,1.8,0.9,1.5*30 $GPGSV,3,1,11,12,73,067,32,30,67,271,39,14,44,267,34,09,28,136,26*72 $GPGSV,3,2,11,29,27,200,26,02,25,101,27,27,23,137,27,04,21,055,38*78 $GPGSV,3,3,11,31,18,305,31,32,06,331,,20,02,354,*42 {"class":"SKY","xdop":0.61,"ydop":0.74,"vdop":1.50,"tdop":1.10,"hdop":0.90,"gdop":2.52,"pdop":1.80,"satellites":[{"PRN":12,"el":73,"az":67,"ss":32,"used":true},{"PRN":30,"el":67,"az":271,"ss":39,"used":true},{"PRN":14,"el":44,"az":267,"ss":34,"used":true},{"PRN":9,"el":28,"az":136,"ss":26,"used":true},{"PRN":29,"el":27,"az":200,"ss":26,"used":true},{"PRN":2,"el":25,"az":101,"ss":27,"used":true},{"PRN":27,"el":23,"az":137,"ss":27,"used":true},{"PRN":4,"el":21,"az":55,"ss":38,"used":true},{"PRN":31,"el":18,"az":305,"ss":31,"used":true},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,171004.972,A,5200.8519,N,00421.7830,E,000.0,000.0,120610,,,A*6C {"class":"TPV","mode":3,"time":"2010-06-12T17:10:04.972Z","ept":0.005,"lat":52.014198333,"lon":4.363050000,"alt":8.800,"epx":9.170,"epy":11.104,"epv":46.000,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.21,"epc":92.00} $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D $GPGGA,171005.972,5200.8520,N,00421.7842,E,1,09,0.9,8.3,M,44.8,M,,0000*57 $GPGSA,A,3,14,30,12,09,29,02,27,04,31,,,,1.8,0.9,1.5*30 $GPGSV,3,1,11,12,73,067,32,30,67,271,39,14,44,267,34,09,28,136,26*72 $GPGSV,3,2,11,29,27,200,27,02,25,101,28,27,23,137,27,04,21,055,38*76 $GPGSV,3,3,11,31,18,305,30,32,06,331,,20,02,354,*43 {"class":"SKY","xdop":0.61,"ydop":0.74,"vdop":1.50,"tdop":1.10,"hdop":0.90,"gdop":2.52,"pdop":1.80,"satellites":[{"PRN":12,"el":73,"az":67,"ss":32,"used":true},{"PRN":30,"el":67,"az":271,"ss":39,"used":true},{"PRN":14,"el":44,"az":267,"ss":34,"used":true},{"PRN":9,"el":28,"az":136,"ss":26,"used":true},{"PRN":29,"el":27,"az":200,"ss":27,"used":true},{"PRN":2,"el":25,"az":101,"ss":28,"used":true},{"PRN":27,"el":23,"az":137,"ss":27,"used":true},{"PRN":4,"el":21,"az":55,"ss":38,"used":true},{"PRN":31,"el":18,"az":305,"ss":30,"used":true},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,171005.972,A,5200.8520,N,00421.7842,E,000.0,000.0,120610,,,A*62 {"class":"TPV","mode":3,"time":"2010-06-12T17:10:05.972Z","ept":0.005,"lat":52.014200000,"lon":4.363070000,"alt":8.300,"epx":9.170,"epy":11.104,"epv":34.500,"track":0.0000,"speed":0.000,"climb":-0.500,"eps":22.21,"epc":80.50} $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D $GPGGA,171006.972,5200.8513,N,00421.7856,E,1,09,0.9,7.6,M,44.8,M,,0000*5B $GPGSA,A,3,14,30,12,09,29,02,27,04,31,,,,1.8,0.9,1.5*30 $GPGSV,3,1,11,12,73,067,33,30,67,271,38,14,44,267,33,09,28,136,26*75 $GPGSV,3,2,11,29,27,200,26,02,25,101,27,27,23,137,28,04,21,055,37*78 $GPGSV,3,3,11,31,18,305,30,32,06,331,,20,02,354,*43 {"class":"SKY","xdop":0.61,"ydop":0.74,"vdop":1.50,"tdop":1.10,"hdop":0.90,"gdop":2.52,"pdop":1.80,"satellites":[{"PRN":12,"el":73,"az":67,"ss":33,"used":true},{"PRN":30,"el":67,"az":271,"ss":38,"used":true},{"PRN":14,"el":44,"az":267,"ss":33,"used":true},{"PRN":9,"el":28,"az":136,"ss":26,"used":true},{"PRN":29,"el":27,"az":200,"ss":26,"used":true},{"PRN":2,"el":25,"az":101,"ss":27,"used":true},{"PRN":27,"el":23,"az":137,"ss":28,"used":true},{"PRN":4,"el":21,"az":55,"ss":37,"used":true},{"PRN":31,"el":18,"az":305,"ss":30,"used":true},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,171006.972,A,5200.8513,N,00421.7856,E,000.0,000.0,120610,,,A*64 {"class":"TPV","mode":3,"time":"2010-06-12T17:10:06.972Z","ept":0.005,"lat":52.014188333,"lon":4.363093333,"alt":7.600,"epx":9.170,"epy":11.104,"epv":34.500,"track":0.0000,"speed":0.000,"climb":-0.700,"eps":22.21,"epc":69.00} $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D $GPGGA,171007.972,5200.8514,N,00421.7851,E,1,09,0.9,7.7,M,44.8,M,,0000*5B $GPGSA,A,3,14,30,12,09,29,02,27,04,31,,,,1.8,0.9,1.5*30 $GPGSV,3,1,11,12,73,067,33,30,67,271,38,14,44,267,33,09,28,136,26*75 $GPGSV,3,2,11,29,27,200,26,02,25,101,27,27,23,137,28,04,21,055,37*78 $GPGSV,3,3,11,31,18,305,30,32,06,331,,20,02,354,*43 {"class":"SKY","xdop":0.61,"ydop":0.74,"vdop":1.50,"tdop":1.10,"hdop":0.90,"gdop":2.52,"pdop":1.80,"satellites":[{"PRN":12,"el":73,"az":67,"ss":33,"used":true},{"PRN":30,"el":67,"az":271,"ss":38,"used":true},{"PRN":14,"el":44,"az":267,"ss":33,"used":true},{"PRN":9,"el":28,"az":136,"ss":26,"used":true},{"PRN":29,"el":27,"az":200,"ss":26,"used":true},{"PRN":2,"el":25,"az":101,"ss":27,"used":true},{"PRN":27,"el":23,"az":137,"ss":28,"used":true},{"PRN":4,"el":21,"az":55,"ss":37,"used":true},{"PRN":31,"el":18,"az":305,"ss":30,"used":true},{"PRN":32,"el":6,"az":331,"ss":0,"used":false},{"PRN":20,"el":2,"az":354,"ss":0,"used":false}]} $GPRMC,171007.972,A,5200.8514,N,00421.7851,E,000.0,000.0,120610,,,A*65 {"class":"TPV","mode":3,"time":"2010-06-12T17:10:07.972Z","ept":0.005,"lat":52.014190000,"lon":4.363085000,"alt":7.700,"epx":9.170,"epy":11.104,"epv":34.500,"track":0.0000,"speed":0.000,"climb":0.100,"eps":22.21,"epc":69.00} $GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D gpsd-3.15/test/daemon/bt-q818.log0000664000175000017500000001053312467342657014620 0ustar esresr# Name: BT-Q818 # Chipset: MTK # Submitter: Jason Komut # Date: 2010-06-03 # Time: 7:53 PST # Location: +34? 1' 58.80", -117? 44' 49.56" # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGGA,145243.000,3401.9764,N,11744.8274,W,2,10,0.87,234.7,M,-33.2,M,0000,0000*5F $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,049,36,24,54,134,38,51,48,161,31*7F $GPGSV,3,2,11,19,36,273,30,06,28,224,27,03,27,237,25,18,25,076,36*70 $GPGSV,3,3,11,31,19,169,29,21,16,136,28,09,11,039,34*48 $GPRMC,145243.000,A,3401.9764,N,11744.8274,W,0.00,119.27,030610,,,D*70 $GPGGA,145244.000,3401.9764,N,11744.8274,W,2,10,0.87,234.7,M,-33.2,M,0000,0000*58 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,36,24,54,134,38,51,48,161,31*77 $GPGSV,3,2,11,19,36,273,30,06,28,224,27,03,27,237,25,18,25,076,36*70 $GPGSV,3,3,11,31,19,169,28,21,16,136,28,09,11,039,34*49 $GPRMC,145244.000,A,3401.9764,N,11744.8274,W,0.00,119.27,030610,,,D*77 $GPGGA,145245.000,3401.9764,N,11744.8274,W,2,10,0.87,234.7,M,-33.2,M,0000,0000*59 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,36,24,54,134,38,51,48,161,31*77 $GPGSV,3,2,11,19,36,273,30,06,28,224,27,03,27,237,25,18,25,076,35*73 $GPGSV,3,3,11,31,19,169,28,21,16,136,27,09,11,039,34*46 $GPRMC,145245.000,A,3401.9764,N,11744.8274,W,0.00,119.27,030610,,,D*76 $GPGGA,145246.000,3401.9765,N,11744.8274,W,2,10,0.87,234.7,M,-33.2,M,0000,0000*5B $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,36,24,53,134,38,51,48,161,31*70 $GPGSV,3,2,11,19,36,273,30,06,28,224,27,03,27,237,25,18,25,076,35*73 $GPGSV,3,3,11,31,19,169,28,21,16,136,27,09,11,039,34*46 $GPRMC,145246.000,A,3401.9765,N,11744.8274,W,0.01,119.27,030610,,,D*75 $GPGGA,145247.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*55 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,40,22,54,050,35,24,53,134,38,51,48,161,30*73 $GPGSV,3,2,11,19,36,273,29,06,28,224,25,03,27,237,25,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,27,21,16,136,26,09,11,039,33*4F $GPRMC,145247.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*75 $GPGGA,145248.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*5A $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,36,24,53,134,38,51,48,161,30*71 $GPGSV,3,2,11,19,36,273,29,06,28,224,26,03,27,237,26,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,27,21,16,136,27,09,11,039,34*49 $GPRMC,145248.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*7A $GPGGA,145249.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*5B $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,42,22,54,050,36,24,53,134,38,51,48,161,30*72 $GPGSV,3,2,11,19,36,273,29,06,28,224,27,03,27,237,27,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,27,21,16,136,28,09,11,039,34*46 $GPRMC,145249.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*7B $GPGGA,145250.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*53 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,42,22,54,050,36,24,53,134,38,51,48,161,30*72 $GPGSV,3,2,11,19,36,273,29,06,28,224,27,03,27,237,27,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,27,21,16,136,28,09,11,039,34*46 $GPRMC,145250.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*73 $GPGGA,145251.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*52 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,42,22,54,050,36,24,53,134,38,51,48,161,30*72 $GPGSV,3,2,11,19,36,273,29,06,28,224,27,03,27,237,27,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,26,21,16,136,28,09,11,039,34*47 $GPRMC,145251.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*72 $GPGGA,145252.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*51 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,35,24,53,134,39,51,48,161,29*7B $GPGSV,3,2,11,19,36,273,28,06,28,224,27,03,27,237,26,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,25,21,16,136,28,09,11,039,33*43 $GPRMC,145252.000,A,3401.9765,N,11744.8274,W,0.01,119.27,030610,,,D*70 gpsd-3.15/test/daemon/bt-q818.log.chk0000664000175000017500000003125712467342657015372 0ustar esresr$GPGGA,145243.000,3401.9764,N,11744.8274,W,2,10,0.87,234.7,M,-33.2,M,0000,0000*5F {"class":"TPV","mode":3,"lat":34.032940000,"lon":-117.747123333,"alt":234.700} $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D {"class":"TPV","mode":3,"lat":34.032940000,"lon":-117.747123333,"alt":234.700,"epv":7.533} $GPGSV,3,1,11,14,86,335,41,22,54,049,36,24,54,134,38,51,48,161,31*7F $GPGSV,3,2,11,19,36,273,30,06,28,224,27,03,27,237,25,18,25,076,36*70 $GPGSV,3,3,11,31,19,169,29,21,16,136,28,09,11,039,34*48 {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":41,"used":true},{"PRN":22,"el":54,"az":49,"ss":36,"used":true},{"PRN":24,"el":54,"az":134,"ss":38,"used":true},{"PRN":138,"el":48,"az":161,"ss":31,"used":false},{"PRN":19,"el":36,"az":273,"ss":30,"used":true},{"PRN":6,"el":28,"az":224,"ss":27,"used":true},{"PRN":3,"el":27,"az":237,"ss":25,"used":true},{"PRN":18,"el":25,"az":76,"ss":36,"used":true},{"PRN":31,"el":19,"az":169,"ss":29,"used":true},{"PRN":21,"el":16,"az":136,"ss":28,"used":true},{"PRN":9,"el":11,"az":39,"ss":34,"used":true}]} $GPRMC,145243.000,A,3401.9764,N,11744.8274,W,0.00,119.27,030610,,,D*70 {"class":"TPV","mode":3,"time":"2010-06-03T14:52:43.000Z","ept":0.005,"lat":34.032940000,"lon":-117.747123333,"alt":234.700,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.000} $GPGGA,145244.000,3401.9764,N,11744.8274,W,2,10,0.87,234.7,M,-33.2,M,0000,0000*58 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,36,24,54,134,38,51,48,161,31*77 $GPGSV,3,2,11,19,36,273,30,06,28,224,27,03,27,237,25,18,25,076,36*70 $GPGSV,3,3,11,31,19,169,28,21,16,136,28,09,11,039,34*49 {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":41,"used":true},{"PRN":22,"el":54,"az":50,"ss":36,"used":true},{"PRN":24,"el":54,"az":134,"ss":38,"used":true},{"PRN":138,"el":48,"az":161,"ss":31,"used":false},{"PRN":19,"el":36,"az":273,"ss":30,"used":true},{"PRN":6,"el":28,"az":224,"ss":27,"used":true},{"PRN":3,"el":27,"az":237,"ss":25,"used":true},{"PRN":18,"el":25,"az":76,"ss":36,"used":true},{"PRN":31,"el":19,"az":169,"ss":28,"used":true},{"PRN":21,"el":16,"az":136,"ss":28,"used":true},{"PRN":9,"el":11,"az":39,"ss":34,"used":true}]} $GPRMC,145244.000,A,3401.9764,N,11744.8274,W,0.00,119.27,030610,,,D*77 {"class":"TPV","mode":3,"time":"2010-06-03T14:52:44.000Z","ept":0.005,"lat":34.032940000,"lon":-117.747123333,"alt":234.700,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.000,"climb":0.000,"eps":4.95,"epc":15.07} $GPGGA,145245.000,3401.9764,N,11744.8274,W,2,10,0.87,234.7,M,-33.2,M,0000,0000*59 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,36,24,54,134,38,51,48,161,31*77 $GPGSV,3,2,11,19,36,273,30,06,28,224,27,03,27,237,25,18,25,076,35*73 $GPGSV,3,3,11,31,19,169,28,21,16,136,27,09,11,039,34*46 {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":41,"used":true},{"PRN":22,"el":54,"az":50,"ss":36,"used":true},{"PRN":24,"el":54,"az":134,"ss":38,"used":true},{"PRN":138,"el":48,"az":161,"ss":31,"used":false},{"PRN":19,"el":36,"az":273,"ss":30,"used":true},{"PRN":6,"el":28,"az":224,"ss":27,"used":true},{"PRN":3,"el":27,"az":237,"ss":25,"used":true},{"PRN":18,"el":25,"az":76,"ss":35,"used":true},{"PRN":31,"el":19,"az":169,"ss":28,"used":true},{"PRN":21,"el":16,"az":136,"ss":27,"used":true},{"PRN":9,"el":11,"az":39,"ss":34,"used":true}]} $GPRMC,145245.000,A,3401.9764,N,11744.8274,W,0.00,119.27,030610,,,D*76 {"class":"TPV","mode":3,"time":"2010-06-03T14:52:45.000Z","ept":0.005,"lat":34.032940000,"lon":-117.747123333,"alt":234.700,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.000,"climb":0.000,"eps":4.95,"epc":15.07} $GPGGA,145246.000,3401.9765,N,11744.8274,W,2,10,0.87,234.7,M,-33.2,M,0000,0000*5B $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,36,24,53,134,38,51,48,161,31*70 $GPGSV,3,2,11,19,36,273,30,06,28,224,27,03,27,237,25,18,25,076,35*73 $GPGSV,3,3,11,31,19,169,28,21,16,136,27,09,11,039,34*46 {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":41,"used":true},{"PRN":22,"el":54,"az":50,"ss":36,"used":true},{"PRN":24,"el":53,"az":134,"ss":38,"used":true},{"PRN":138,"el":48,"az":161,"ss":31,"used":false},{"PRN":19,"el":36,"az":273,"ss":30,"used":true},{"PRN":6,"el":28,"az":224,"ss":27,"used":true},{"PRN":3,"el":27,"az":237,"ss":25,"used":true},{"PRN":18,"el":25,"az":76,"ss":35,"used":true},{"PRN":31,"el":19,"az":169,"ss":28,"used":true},{"PRN":21,"el":16,"az":136,"ss":27,"used":true},{"PRN":9,"el":11,"az":39,"ss":34,"used":true}]} $GPRMC,145246.000,A,3401.9765,N,11744.8274,W,0.01,119.27,030610,,,D*75 {"class":"TPV","mode":3,"time":"2010-06-03T14:52:46.000Z","ept":0.005,"lat":34.032941667,"lon":-117.747123333,"alt":234.700,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.005,"climb":0.000,"eps":4.95,"epc":15.07} $GPGGA,145247.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*55 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,40,22,54,050,35,24,53,134,38,51,48,161,30*73 $GPGSV,3,2,11,19,36,273,29,06,28,224,25,03,27,237,25,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,27,21,16,136,26,09,11,039,33*4F {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":40,"used":true},{"PRN":22,"el":54,"az":50,"ss":35,"used":true},{"PRN":24,"el":53,"az":134,"ss":38,"used":true},{"PRN":138,"el":48,"az":161,"ss":30,"used":false},{"PRN":19,"el":36,"az":273,"ss":29,"used":true},{"PRN":6,"el":28,"az":224,"ss":25,"used":true},{"PRN":3,"el":27,"az":237,"ss":25,"used":true},{"PRN":18,"el":25,"az":76,"ss":34,"used":true},{"PRN":31,"el":19,"az":169,"ss":27,"used":true},{"PRN":21,"el":16,"az":136,"ss":26,"used":true},{"PRN":9,"el":11,"az":39,"ss":33,"used":true}]} $GPRMC,145247.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*75 {"class":"TPV","mode":3,"time":"2010-06-03T14:52:47.000Z","ept":0.005,"lat":34.032941667,"lon":-117.747123333,"alt":234.800,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.000,"climb":0.100,"eps":4.95,"epc":15.07} $GPGGA,145248.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*5A $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,36,24,53,134,38,51,48,161,30*71 $GPGSV,3,2,11,19,36,273,29,06,28,224,26,03,27,237,26,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,27,21,16,136,27,09,11,039,34*49 {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":41,"used":true},{"PRN":22,"el":54,"az":50,"ss":36,"used":true},{"PRN":24,"el":53,"az":134,"ss":38,"used":true},{"PRN":138,"el":48,"az":161,"ss":30,"used":false},{"PRN":19,"el":36,"az":273,"ss":29,"used":true},{"PRN":6,"el":28,"az":224,"ss":26,"used":true},{"PRN":3,"el":27,"az":237,"ss":26,"used":true},{"PRN":18,"el":25,"az":76,"ss":34,"used":true},{"PRN":31,"el":19,"az":169,"ss":27,"used":true},{"PRN":21,"el":16,"az":136,"ss":27,"used":true},{"PRN":9,"el":11,"az":39,"ss":34,"used":true}]} $GPRMC,145248.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*7A {"class":"TPV","mode":3,"time":"2010-06-03T14:52:48.000Z","ept":0.005,"lat":34.032941667,"lon":-117.747123333,"alt":234.800,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.000,"climb":0.000,"eps":4.95,"epc":15.07} $GPGGA,145249.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*5B $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,42,22,54,050,36,24,53,134,38,51,48,161,30*72 $GPGSV,3,2,11,19,36,273,29,06,28,224,27,03,27,237,27,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,27,21,16,136,28,09,11,039,34*46 {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":42,"used":true},{"PRN":22,"el":54,"az":50,"ss":36,"used":true},{"PRN":24,"el":53,"az":134,"ss":38,"used":true},{"PRN":138,"el":48,"az":161,"ss":30,"used":false},{"PRN":19,"el":36,"az":273,"ss":29,"used":true},{"PRN":6,"el":28,"az":224,"ss":27,"used":true},{"PRN":3,"el":27,"az":237,"ss":27,"used":true},{"PRN":18,"el":25,"az":76,"ss":34,"used":true},{"PRN":31,"el":19,"az":169,"ss":27,"used":true},{"PRN":21,"el":16,"az":136,"ss":28,"used":true},{"PRN":9,"el":11,"az":39,"ss":34,"used":true}]} $GPRMC,145249.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*7B {"class":"TPV","mode":3,"time":"2010-06-03T14:52:49.000Z","ept":0.005,"lat":34.032941667,"lon":-117.747123333,"alt":234.800,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.000,"climb":0.000,"eps":4.95,"epc":15.07} $GPGGA,145250.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*53 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,42,22,54,050,36,24,53,134,38,51,48,161,30*72 $GPGSV,3,2,11,19,36,273,29,06,28,224,27,03,27,237,27,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,27,21,16,136,28,09,11,039,34*46 {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":42,"used":true},{"PRN":22,"el":54,"az":50,"ss":36,"used":true},{"PRN":24,"el":53,"az":134,"ss":38,"used":true},{"PRN":138,"el":48,"az":161,"ss":30,"used":false},{"PRN":19,"el":36,"az":273,"ss":29,"used":true},{"PRN":6,"el":28,"az":224,"ss":27,"used":true},{"PRN":3,"el":27,"az":237,"ss":27,"used":true},{"PRN":18,"el":25,"az":76,"ss":34,"used":true},{"PRN":31,"el":19,"az":169,"ss":27,"used":true},{"PRN":21,"el":16,"az":136,"ss":28,"used":true},{"PRN":9,"el":11,"az":39,"ss":34,"used":true}]} $GPRMC,145250.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*73 {"class":"TPV","mode":3,"time":"2010-06-03T14:52:50.000Z","ept":0.005,"lat":34.032941667,"lon":-117.747123333,"alt":234.800,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.000,"climb":0.000,"eps":4.95,"epc":15.07} $GPGGA,145251.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*52 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,42,22,54,050,36,24,53,134,38,51,48,161,30*72 $GPGSV,3,2,11,19,36,273,29,06,28,224,27,03,27,237,27,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,26,21,16,136,28,09,11,039,34*47 {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":42,"used":true},{"PRN":22,"el":54,"az":50,"ss":36,"used":true},{"PRN":24,"el":53,"az":134,"ss":38,"used":true},{"PRN":138,"el":48,"az":161,"ss":30,"used":false},{"PRN":19,"el":36,"az":273,"ss":29,"used":true},{"PRN":6,"el":28,"az":224,"ss":27,"used":true},{"PRN":3,"el":27,"az":237,"ss":27,"used":true},{"PRN":18,"el":25,"az":76,"ss":34,"used":true},{"PRN":31,"el":19,"az":169,"ss":26,"used":true},{"PRN":21,"el":16,"az":136,"ss":28,"used":true},{"PRN":9,"el":11,"az":39,"ss":34,"used":true}]} $GPRMC,145251.000,A,3401.9765,N,11744.8274,W,0.00,119.27,030610,,,D*72 {"class":"TPV","mode":3,"time":"2010-06-03T14:52:51.000Z","ept":0.005,"lat":34.032941667,"lon":-117.747123333,"alt":234.800,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.000,"climb":0.000,"eps":4.95,"epc":15.07} $GPGGA,145252.000,3401.9765,N,11744.8274,W,2,10,0.87,234.8,M,-33.2,M,0000,0000*51 $GPGSA,A,3,14,09,22,18,19,24,06,21,03,31,,,1.58,0.87,1.31*0D $GPGSV,3,1,11,14,86,335,41,22,54,050,35,24,53,134,39,51,48,161,29*7B $GPGSV,3,2,11,19,36,273,28,06,28,224,27,03,27,237,26,18,25,076,34*78 $GPGSV,3,3,11,31,19,169,25,21,16,136,28,09,11,039,33*43 {"class":"SKY","xdop":0.58,"ydop":0.66,"vdop":1.31,"tdop":0.82,"hdop":0.87,"gdop":1.78,"pdop":1.58,"satellites":[{"PRN":14,"el":86,"az":335,"ss":41,"used":true},{"PRN":22,"el":54,"az":50,"ss":35,"used":true},{"PRN":24,"el":53,"az":134,"ss":39,"used":true},{"PRN":138,"el":48,"az":161,"ss":29,"used":false},{"PRN":19,"el":36,"az":273,"ss":28,"used":true},{"PRN":6,"el":28,"az":224,"ss":27,"used":true},{"PRN":3,"el":27,"az":237,"ss":26,"used":true},{"PRN":18,"el":25,"az":76,"ss":34,"used":true},{"PRN":31,"el":19,"az":169,"ss":25,"used":true},{"PRN":21,"el":16,"az":136,"ss":28,"used":true},{"PRN":9,"el":11,"az":39,"ss":33,"used":true}]} $GPRMC,145252.000,A,3401.9765,N,11744.8274,W,0.01,119.27,030610,,,D*70 {"class":"TPV","mode":3,"time":"2010-06-03T14:52:52.000Z","ept":0.005,"lat":34.032941667,"lon":-117.747123333,"alt":234.800,"epx":2.158,"epy":2.473,"epv":7.533,"track":119.2700,"speed":0.005,"climb":0.000,"eps":4.95,"epc":15.07} gpsd-3.15/test/daemon/bt451.log0000664000175000017500000001625712467342657014364 0ustar esresr# Name: BT-451 # Chipset: ANTARIS ATR062x # Submitter: Mindaugas # Date: 2009-12-09 # Location: Lithuania, 55.8N 23.6E # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # No fix, indoors $GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,ANTARIS ATR062x HW 80040001*26 $GPTXT,01,01,02,ROM CORE 5.00 Jan 09 2006 12:00:00*76 $GPTXT,01,01,02,LIC 1EBF-BD07-E83D-6BE1-0F7A*50 $GPTXT,01,01,02,ANTSUPERV=AC SD OD PDoS *0A $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 $GPZDA,,,,,00,00*48 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 $GPZDA,,,,,00,00*48 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 $GPZDA,,,,,00,00*48 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 $GPZDA,,,,,00,00*48 # Stationary $GPGLL,5547.82107,N,02334.14132,E,152504.50,A,A*67 $GPZDA,152504.50,09,12,2009,00,00*65 $GPRMC,152505.00,A,5547.82113,N,02334.14130,E,0.253,,091209,,,A*7A $GPVTG,,T,,M,0.253,N,0.469,K,A*2C $GPGGA,152505.00,5547.82113,N,02334.14130,E,1,04,2.72,37.0,M,26.9,M,,*6B $GPGSA,A,3,26,32,11,14,,,,,,,,,6.25,2.72,5.62*05 $GPGSV,2,1,07,26,34,052,33,19,,,36,32,45,237,42,06,,,34*75 $GPGSV,2,2,07,22,,,40,11,57,277,40,14,51,083,38*7F $GPGLL,5547.82113,N,02334.14130,E,152505.00,A,A*64 $GPZDA,152505.00,09,12,2009,00,00*61 $GPRMC,152505.50,A,5547.82119,N,02334.14124,E,0.265,,091209,,,A*75 $GPVTG,,T,,M,0.265,N,0.491,K,A*2E $GPGGA,152505.50,5547.82119,N,02334.14124,E,1,04,2.72,36.7,M,26.9,M,,*67 $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,34,19,,,36,32,45,237,42,06,,,34*72 $GPGSV,2,2,07,22,,,40,11,57,277,41,14,51,083,38*7E $GPGLL,5547.82119,N,02334.14124,E,152505.50,A,A*6E $GPZDA,152505.50,09,12,2009,00,00*64 $GPRMC,152506.00,A,5547.82126,N,02334.14117,E,0.340,,091209,,,A*79 $GPVTG,,T,,M,0.340,N,0.631,K,A*20 $GPGGA,152506.00,5547.82126,N,02334.14117,E,1,04,2.72,36.5,M,26.9,M,,*6F $GPGSA,A,3,26,32,11,14,,,,,,,,,6.25,2.72,5.62*05 $GPGSV,2,1,07,26,34,052,34,19,,,37,32,45,237,42,06,,,34*73 $GPGSV,2,2,07,22,,,40,11,57,277,41,14,51,083,39*7F $GPGLL,5547.82126,N,02334.14117,E,152506.00,A,A*64 $GPZDA,152506.00,09,12,2009,00,00*62 $GPRMC,152506.50,A,5547.82132,N,02334.14113,E,0.336,,091209,,,A*7C $GPVTG,,T,,M,0.336,N,0.623,K,A*22 $GPGGA,152506.50,5547.82132,N,02334.14113,E,1,04,2.72,36.2,M,26.9,M,,*6C $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,35,19,,,37,32,45,237,43,06,,,35*72 $GPGSV,2,2,07,22,,,41,11,57,277,41,14,51,083,39*7E $GPGLL,5547.82132,N,02334.14113,E,152506.50,A,A*60 $GPZDA,152506.50,09,12,2009,00,00*67 $GPRMC,152507.00,A,5547.82139,N,02334.14105,E,0.371,16.99,091209,,,A*5E $GPVTG,16.99,T,,M,0.371,N,0.687,K,A*06 $GPGGA,152507.00,5547.82139,N,02334.14105,E,1,04,2.72,36.0,M,26.9,M,,*66 $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,35,19,,,37,32,45,237,42,06,,,35*73 $GPGSV,2,2,07,22,,,40,11,57,277,41,14,51,083,39*7F $GPGLL,5547.82139,N,02334.14105,E,152507.00,A,A*68 $GPZDA,152507.00,09,12,2009,00,00*63 $GPRMC,152507.50,A,5547.82145,N,02334.14098,E,0.309,,091209,,,A*73 $GPVTG,,T,,M,0.309,N,0.572,K,A*29 $GPGGA,152507.50,5547.82145,N,02334.14098,E,1,04,2.72,35.7,M,26.9,M,,*69 $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,35,19,,,37,32,45,237,42,06,,,34*72 $GPGSV,2,2,07,22,,,40,11,57,277,41,14,51,083,39*7F $GPGLL,5547.82145,N,02334.14098,E,152507.50,A,A*63 $GPZDA,152507.50,09,12,2009,00,00*66 $GPRMC,152508.00,A,5547.82150,N,02334.14092,E,0.309,,091209,,,A*77 $GPVTG,,T,,M,0.309,N,0.573,K,A*28 $GPGGA,152508.00,5547.82150,N,02334.14092,E,1,04,2.72,35.5,M,26.9,M,,*6F $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,33,19,,,36,32,45,237,41,06,,,33*71 $GPGSV,2,2,07,22,,,39,11,57,277,40,14,51,083,38*71 $GPGLL,5547.82150,N,02334.14092,E,152508.00,A,A*67 $GPZDA,152508.00,09,12,2009,00,00*6C $GPRMC,152508.50,A,5547.82156,N,02334.14086,E,0.296,,091209,,,A*76 $GPVTG,,T,,M,0.296,N,0.549,K,A*26 $GPGGA,152508.50,5547.82156,N,02334.14086,E,1,04,2.73,35.3,M,26.9,M,,*6E $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.73,5.62*05 $GPGSV,3,1,11,26,34,052,32,19,,,34,20,,,29,32,45,237,39*74 $GPGSV,3,2,11,02,,,26,06,,,31,18,,,30,24,,,27*73 $GPGSV,3,3,11,22,,,37,11,57,277,38,14,51,083,36*79 # Moving in car $GPGGA,143306.00,5546.83315,N,02334.72613,E,1,08,1.28,129.9,M,26.9,M,,*5B $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 $GPGLL,5546.83315,N,02334.72613,E,143306.00,A,A*63 $GPZDA,143306.00,09,12,2009,00,00*64 $GPRMC,143306.50,A,5546.82983,N,02334.72123,E,30.324,221.16,091209,,,A*52 $GPVTG,221.16,T,,M,30.324,N,56.191,K,A*37 $GPGGA,143306.50,5546.82983,N,02334.72123,E,1,09,1.26,128.9,M,26.9,M,,*50 $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 $GPGLL,5546.82983,N,02334.72123,E,143306.50,A,A*66 $GPZDA,143306.50,09,12,2009,00,00*61 $GPRMC,143307.00,A,5546.82649,N,02334.71625,E,30.860,221.48,091209,,,A*5D $GPVTG,221.48,T,,M,30.860,N,57.183,K,A*35 $GPGGA,143307.00,5546.82649,N,02334.71625,E,1,09,1.26,128.1,M,26.9,M,,*57 $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 $GPGLL,5546.82649,N,02334.71625,E,143307.00,A,A*69 $GPZDA,143307.00,09,12,2009,00,00*65 $GPRMC,143307.50,A,5546.82314,N,02334.71118,E,31.351,221.51,091209,,,A*5C $GPVTG,221.51,T,,M,31.351,N,58.092,K,A*3B $GPGGA,143307.50,5546.82314,N,02334.71118,E,1,09,1.26,127.5,M,26.9,M,,*5D $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 $GPGLL,5546.82314,N,02334.71118,E,143307.50,A,A*68 $GPZDA,143307.50,09,12,2009,00,00*60 $GPRMC,143308.00,A,5546.81975,N,02334.70604,E,32.000,221.54,091209,,,A*52 $GPVTG,221.54,T,,M,32.000,N,59.295,K,A*3E $GPGGA,143308.00,5546.81975,N,02334.70604,E,1,09,1.26,127.1,M,26.9,M,,*56 $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 $GPGLL,5546.81975,N,02334.70604,E,143308.00,A,A*67 $GPZDA,143308.00,09,12,2009,00,00*6A $GPRMC,143308.50,A,5546.81633,N,02334.70079,E,32.273,221.54,091209,,,A*50 $GPVTG,221.54,T,,M,32.273,N,59.802,K,A*3C gpsd-3.15/test/daemon/bt451.log.chk0000664000175000017500000004204612467342657015123 0ustar esresr$GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,ANTARIS ATR062x HW 80040001*26 $GPTXT,01,01,02,ROM CORE 5.00 Jan 09 2006 12:00:00*76 $GPTXT,01,01,02,LIC 1EBF-BD07-E83D-6BE1-0F7A*50 $GPTXT,01,01,02,ANTSUPERV=AC SD OD PDoS *0A $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 $GPZDA,,,,,00,00*48 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 $GPZDA,,,,,00,00*48 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 $GPZDA,,,,,00,00*48 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,,V,N*64 $GPZDA,,,,,00,00*48 $GPGLL,5547.82107,N,02334.14132,E,152504.50,A,A*67 {"class":"TPV","mode":2,"lat":55.797017833,"lon":23.569022000} $GPZDA,152504.50,09,12,2009,00,00*65 $GPRMC,152505.00,A,5547.82113,N,02334.14130,E,0.253,,091209,,,A*7A $GPVTG,,T,,M,0.253,N,0.469,K,A*2C $GPGGA,152505.00,5547.82113,N,02334.14130,E,1,04,2.72,37.0,M,26.9,M,,*6B $GPGSA,A,3,26,32,11,14,,,,,,,,,6.25,2.72,5.62*05 $GPGSV,2,1,07,26,34,052,33,19,,,36,32,45,237,42,06,,,34*75 $GPGSV,2,2,07,22,,,40,11,57,277,40,14,51,083,38*7F {"class":"SKY","xdop":1.26,"ydop":2.39,"vdop":5.62,"tdop":4.17,"hdop":2.72,"gdop":7.54,"pdop":6.25,"satellites":[{"PRN":26,"el":34,"az":52,"ss":33,"used":true},{"PRN":19,"el":0,"az":0,"ss":36,"used":false},{"PRN":32,"el":45,"az":237,"ss":42,"used":true},{"PRN":6,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":0,"az":0,"ss":40,"used":false},{"PRN":11,"el":57,"az":277,"ss":40,"used":true},{"PRN":14,"el":51,"az":83,"ss":38,"used":true}]} $GPGLL,5547.82113,N,02334.14130,E,152505.00,A,A*64 {"class":"TPV","mode":3,"time":"2009-12-09T15:25:05.000Z","ept":0.005,"lat":55.797018833,"lon":23.569021667,"alt":37.000,"epx":18.961,"epy":35.919,"epv":129.260,"track":0.0000,"speed":0.130,"climb":0.000} $GPZDA,152505.00,09,12,2009,00,00*61 $GPRMC,152505.50,A,5547.82119,N,02334.14124,E,0.265,,091209,,,A*75 $GPVTG,,T,,M,0.265,N,0.491,K,A*2E $GPGGA,152505.50,5547.82119,N,02334.14124,E,1,04,2.72,36.7,M,26.9,M,,*67 $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,34,19,,,36,32,45,237,42,06,,,34*72 $GPGSV,2,2,07,22,,,40,11,57,277,41,14,51,083,38*7E {"class":"SKY","xdop":1.26,"ydop":2.39,"vdop":5.62,"tdop":4.17,"hdop":2.72,"gdop":7.54,"pdop":6.24,"satellites":[{"PRN":26,"el":34,"az":52,"ss":34,"used":true},{"PRN":19,"el":0,"az":0,"ss":36,"used":false},{"PRN":32,"el":45,"az":237,"ss":42,"used":true},{"PRN":6,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":0,"az":0,"ss":40,"used":false},{"PRN":11,"el":57,"az":277,"ss":41,"used":true},{"PRN":14,"el":51,"az":83,"ss":38,"used":true}]} $GPGLL,5547.82119,N,02334.14124,E,152505.50,A,A*6E {"class":"TPV","mode":3,"time":"2009-12-09T15:25:05.500Z","ept":0.005,"lat":55.797019833,"lon":23.569020667,"alt":36.700,"epx":18.961,"epy":35.919,"epv":129.260,"track":0.0000,"speed":0.136,"climb":0.000,"eps":143.68} $GPZDA,152505.50,09,12,2009,00,00*64 $GPRMC,152506.00,A,5547.82126,N,02334.14117,E,0.340,,091209,,,A*79 $GPVTG,,T,,M,0.340,N,0.631,K,A*20 $GPGGA,152506.00,5547.82126,N,02334.14117,E,1,04,2.72,36.5,M,26.9,M,,*6F $GPGSA,A,3,26,32,11,14,,,,,,,,,6.25,2.72,5.62*05 $GPGSV,2,1,07,26,34,052,34,19,,,37,32,45,237,42,06,,,34*73 $GPGSV,2,2,07,22,,,40,11,57,277,41,14,51,083,39*7F {"class":"SKY","xdop":1.26,"ydop":2.39,"vdop":5.62,"tdop":4.17,"hdop":2.72,"gdop":7.54,"pdop":6.25,"satellites":[{"PRN":26,"el":34,"az":52,"ss":34,"used":true},{"PRN":19,"el":0,"az":0,"ss":37,"used":false},{"PRN":32,"el":45,"az":237,"ss":42,"used":true},{"PRN":6,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":0,"az":0,"ss":40,"used":false},{"PRN":11,"el":57,"az":277,"ss":41,"used":true},{"PRN":14,"el":51,"az":83,"ss":39,"used":true}]} $GPGLL,5547.82126,N,02334.14117,E,152506.00,A,A*64 {"class":"TPV","mode":3,"time":"2009-12-09T15:25:06.000Z","ept":0.005,"lat":55.797021000,"lon":23.569019500,"alt":36.500,"epx":18.961,"epy":35.919,"epv":129.260,"track":0.0000,"speed":0.175,"climb":0.000,"eps":143.68} $GPZDA,152506.00,09,12,2009,00,00*62 $GPRMC,152506.50,A,5547.82132,N,02334.14113,E,0.336,,091209,,,A*7C $GPVTG,,T,,M,0.336,N,0.623,K,A*22 $GPGGA,152506.50,5547.82132,N,02334.14113,E,1,04,2.72,36.2,M,26.9,M,,*6C $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,35,19,,,37,32,45,237,43,06,,,35*72 $GPGSV,2,2,07,22,,,41,11,57,277,41,14,51,083,39*7E {"class":"SKY","xdop":1.26,"ydop":2.39,"vdop":5.62,"tdop":4.17,"hdop":2.72,"gdop":7.54,"pdop":6.24,"satellites":[{"PRN":26,"el":34,"az":52,"ss":35,"used":true},{"PRN":19,"el":0,"az":0,"ss":37,"used":false},{"PRN":32,"el":45,"az":237,"ss":43,"used":true},{"PRN":6,"el":0,"az":0,"ss":35,"used":false},{"PRN":22,"el":0,"az":0,"ss":41,"used":false},{"PRN":11,"el":57,"az":277,"ss":41,"used":true},{"PRN":14,"el":51,"az":83,"ss":39,"used":true}]} $GPGLL,5547.82132,N,02334.14113,E,152506.50,A,A*60 {"class":"TPV","mode":3,"time":"2009-12-09T15:25:06.500Z","ept":0.005,"lat":55.797022000,"lon":23.569018833,"alt":36.200,"epx":18.961,"epy":35.919,"epv":129.260,"track":0.0000,"speed":0.173,"climb":0.000,"eps":143.68} $GPZDA,152506.50,09,12,2009,00,00*67 $GPRMC,152507.00,A,5547.82139,N,02334.14105,E,0.371,16.99,091209,,,A*5E $GPVTG,16.99,T,,M,0.371,N,0.687,K,A*06 $GPGGA,152507.00,5547.82139,N,02334.14105,E,1,04,2.72,36.0,M,26.9,M,,*66 $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,35,19,,,37,32,45,237,42,06,,,35*73 $GPGSV,2,2,07,22,,,40,11,57,277,41,14,51,083,39*7F {"class":"SKY","xdop":1.26,"ydop":2.39,"vdop":5.62,"tdop":4.17,"hdop":2.72,"gdop":7.54,"pdop":6.24,"satellites":[{"PRN":26,"el":34,"az":52,"ss":35,"used":true},{"PRN":19,"el":0,"az":0,"ss":37,"used":false},{"PRN":32,"el":45,"az":237,"ss":42,"used":true},{"PRN":6,"el":0,"az":0,"ss":35,"used":false},{"PRN":22,"el":0,"az":0,"ss":40,"used":false},{"PRN":11,"el":57,"az":277,"ss":41,"used":true},{"PRN":14,"el":51,"az":83,"ss":39,"used":true}]} $GPGLL,5547.82139,N,02334.14105,E,152507.00,A,A*68 {"class":"TPV","mode":3,"time":"2009-12-09T15:25:07.000Z","ept":0.005,"lat":55.797023167,"lon":23.569017500,"alt":36.000,"epx":18.961,"epy":35.919,"epv":129.260,"track":16.9900,"speed":0.191,"climb":0.000,"eps":143.68} $GPZDA,152507.00,09,12,2009,00,00*63 $GPRMC,152507.50,A,5547.82145,N,02334.14098,E,0.309,,091209,,,A*73 $GPVTG,,T,,M,0.309,N,0.572,K,A*29 $GPGGA,152507.50,5547.82145,N,02334.14098,E,1,04,2.72,35.7,M,26.9,M,,*69 $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,35,19,,,37,32,45,237,42,06,,,34*72 $GPGSV,2,2,07,22,,,40,11,57,277,41,14,51,083,39*7F {"class":"SKY","xdop":1.26,"ydop":2.39,"vdop":5.62,"tdop":4.17,"hdop":2.72,"gdop":7.54,"pdop":6.24,"satellites":[{"PRN":26,"el":34,"az":52,"ss":35,"used":true},{"PRN":19,"el":0,"az":0,"ss":37,"used":false},{"PRN":32,"el":45,"az":237,"ss":42,"used":true},{"PRN":6,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":0,"az":0,"ss":40,"used":false},{"PRN":11,"el":57,"az":277,"ss":41,"used":true},{"PRN":14,"el":51,"az":83,"ss":39,"used":true}]} $GPGLL,5547.82145,N,02334.14098,E,152507.50,A,A*63 {"class":"TPV","mode":3,"time":"2009-12-09T15:25:07.500Z","ept":0.005,"lat":55.797024167,"lon":23.569016333,"alt":35.700,"epx":18.961,"epy":35.919,"epv":129.260,"track":0.0000,"speed":0.159,"climb":0.000,"eps":143.68} $GPZDA,152507.50,09,12,2009,00,00*66 $GPRMC,152508.00,A,5547.82150,N,02334.14092,E,0.309,,091209,,,A*77 $GPVTG,,T,,M,0.309,N,0.573,K,A*28 $GPGGA,152508.00,5547.82150,N,02334.14092,E,1,04,2.72,35.5,M,26.9,M,,*6F $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.72,5.62*04 $GPGSV,2,1,07,26,34,052,33,19,,,36,32,45,237,41,06,,,33*71 $GPGSV,2,2,07,22,,,39,11,57,277,40,14,51,083,38*71 {"class":"SKY","xdop":1.26,"ydop":2.39,"vdop":5.62,"tdop":4.17,"hdop":2.72,"gdop":7.54,"pdop":6.24,"satellites":[{"PRN":26,"el":34,"az":52,"ss":33,"used":true},{"PRN":19,"el":0,"az":0,"ss":36,"used":false},{"PRN":32,"el":45,"az":237,"ss":41,"used":true},{"PRN":6,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":0,"az":0,"ss":39,"used":false},{"PRN":11,"el":57,"az":277,"ss":40,"used":true},{"PRN":14,"el":51,"az":83,"ss":38,"used":true}]} $GPGLL,5547.82150,N,02334.14092,E,152508.00,A,A*67 {"class":"TPV","mode":3,"time":"2009-12-09T15:25:08.000Z","ept":0.005,"lat":55.797025000,"lon":23.569015333,"alt":35.500,"epx":18.961,"epy":35.919,"epv":129.260,"track":0.0000,"speed":0.159,"climb":0.000,"eps":143.68} $GPZDA,152508.00,09,12,2009,00,00*6C $GPRMC,152508.50,A,5547.82156,N,02334.14086,E,0.296,,091209,,,A*76 $GPVTG,,T,,M,0.296,N,0.549,K,A*26 $GPGGA,152508.50,5547.82156,N,02334.14086,E,1,04,2.73,35.3,M,26.9,M,,*6E $GPGSA,A,3,26,32,11,14,,,,,,,,,6.24,2.73,5.62*05 $GPGSV,3,1,11,26,34,052,32,19,,,34,20,,,29,32,45,237,39*74 $GPGSV,3,2,11,02,,,26,06,,,31,18,,,30,24,,,27*73 $GPGSV,3,3,11,22,,,37,11,57,277,38,14,51,083,36*79 {"class":"SKY","xdop":1.26,"ydop":2.39,"vdop":5.62,"tdop":4.17,"hdop":2.73,"gdop":7.54,"pdop":6.24,"satellites":[{"PRN":26,"el":34,"az":52,"ss":32,"used":true},{"PRN":19,"el":0,"az":0,"ss":34,"used":false},{"PRN":20,"el":0,"az":0,"ss":29,"used":false},{"PRN":32,"el":45,"az":237,"ss":39,"used":true},{"PRN":2,"el":0,"az":0,"ss":26,"used":false},{"PRN":6,"el":0,"az":0,"ss":31,"used":false},{"PRN":18,"el":0,"az":0,"ss":30,"used":false},{"PRN":24,"el":0,"az":0,"ss":27,"used":false},{"PRN":22,"el":0,"az":0,"ss":37,"used":false},{"PRN":11,"el":57,"az":277,"ss":38,"used":true},{"PRN":14,"el":51,"az":83,"ss":36,"used":true}]} $GPGGA,143306.00,5546.83315,N,02334.72613,E,1,08,1.28,129.9,M,26.9,M,,*5B {"class":"TPV","mode":3,"time":"2009-12-10T14:33:06.000Z","ept":0.005,"lat":55.780552500,"lon":23.578768833,"alt":129.900,"epx":18.961,"epy":35.919,"epv":129.260,"speed":0.023,"climb":0.001,"epd":2.1286,"eps":0.00,"epc":0.00} $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","xdop":1.26,"ydop":2.39,"vdop":3.41,"tdop":4.17,"hdop":1.28,"gdop":7.54,"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","mode":3,"time":"2009-12-10T14:33:06.000Z","ept":0.005,"lat":55.780552500,"lon":23.578768833,"alt":129.900,"epx":18.961,"epy":35.919,"epv":129.260,"speed":0.023,"climb":0.001,"epd":2.1286,"eps":0.00,"epc":0.00} $GPZDA,143306.00,09,12,2009,00,00*64 $GPRMC,143306.50,A,5546.82983,N,02334.72123,E,30.324,221.16,091209,,,A*52 $GPVTG,221.16,T,,M,30.324,N,56.191,K,A*37 $GPGGA,143306.50,5546.82983,N,02334.72123,E,1,09,1.26,128.9,M,26.9,M,,*50 {"class":"TPV","mode":3,"time":"2009-12-09T14:33:06.500Z","ept":0.005,"lat":55.780497167,"lon":23.578687167,"alt":128.900,"epx":18.961,"epy":35.919,"epv":78.430,"track":221.1600,"speed":15.600,"eps":143.68} $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","xdop":1.26,"ydop":2.39,"vdop":2.99,"tdop":4.17,"hdop":1.26,"gdop":7.54,"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","mode":3,"time":"2009-12-09T14:33:06.500Z","ept":0.005,"lat":55.780497167,"lon":23.578687167,"alt":128.900,"epx":18.961,"epy":35.919,"epv":78.430,"track":221.1600,"speed":15.600,"climb":0.000,"eps":143.68} $GPZDA,143306.50,09,12,2009,00,00*61 $GPRMC,143307.00,A,5546.82649,N,02334.71625,E,30.860,221.48,091209,,,A*5D $GPVTG,221.48,T,,M,30.860,N,57.183,K,A*35 $GPGGA,143307.00,5546.82649,N,02334.71625,E,1,09,1.26,128.1,M,26.9,M,,*57 {"class":"TPV","mode":3,"time":"2009-12-09T14:33:07.000Z","ept":0.005,"lat":55.780441500,"lon":23.578604167,"alt":128.100,"epx":18.961,"epy":35.919,"epv":68.770,"track":221.4800,"speed":15.876,"eps":143.68} $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","xdop":1.26,"ydop":2.39,"vdop":3.00,"tdop":4.17,"hdop":1.26,"gdop":7.54,"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","mode":3,"time":"2009-12-09T14:33:07.000Z","ept":0.005,"lat":55.780441500,"lon":23.578604167,"alt":128.100,"epx":18.961,"epy":35.919,"epv":68.770,"track":221.4800,"speed":15.876,"climb":0.000,"eps":143.68} $GPZDA,143307.00,09,12,2009,00,00*65 $GPRMC,143307.50,A,5546.82314,N,02334.71118,E,31.351,221.51,091209,,,A*5C $GPVTG,221.51,T,,M,31.351,N,58.092,K,A*3B $GPGGA,143307.50,5546.82314,N,02334.71118,E,1,09,1.26,127.5,M,26.9,M,,*5D {"class":"TPV","mode":3,"time":"2009-12-09T14:33:07.500Z","ept":0.005,"lat":55.780385667,"lon":23.578519667,"alt":127.500,"epx":18.961,"epy":35.919,"epv":69.000,"track":221.5100,"speed":16.128,"eps":143.68} $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","xdop":1.26,"ydop":2.39,"vdop":3.00,"tdop":4.17,"hdop":1.26,"gdop":7.54,"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","mode":3,"time":"2009-12-09T14:33:07.500Z","ept":0.005,"lat":55.780385667,"lon":23.578519667,"alt":127.500,"epx":18.961,"epy":35.919,"epv":69.000,"track":221.5100,"speed":16.128,"climb":0.000,"eps":143.68} $GPZDA,143307.50,09,12,2009,00,00*60 $GPRMC,143308.00,A,5546.81975,N,02334.70604,E,32.000,221.54,091209,,,A*52 $GPVTG,221.54,T,,M,32.000,N,59.295,K,A*3E $GPGGA,143308.00,5546.81975,N,02334.70604,E,1,09,1.26,127.1,M,26.9,M,,*56 {"class":"TPV","mode":3,"time":"2009-12-09T14:33:08.000Z","ept":0.005,"lat":55.780329167,"lon":23.578434000,"alt":127.100,"epx":18.961,"epy":35.919,"epv":69.000,"track":221.5400,"speed":16.462,"eps":143.68} $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","xdop":1.26,"ydop":2.39,"vdop":3.00,"tdop":4.17,"hdop":1.26,"gdop":7.54,"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","mode":3,"time":"2009-12-09T14:33:08.000Z","ept":0.005,"lat":55.780329167,"lon":23.578434000,"alt":127.100,"epx":18.961,"epy":35.919,"epv":69.000,"track":221.5400,"speed":16.462,"climb":0.000,"eps":143.68} $GPZDA,143308.00,09,12,2009,00,00*6A $GPRMC,143308.50,A,5546.81633,N,02334.70079,E,32.273,221.54,091209,,,A*50 $GPVTG,221.54,T,,M,32.273,N,59.802,K,A*3C gpsd-3.15/test/daemon/bu303-climbing.log0000664000175000017500000000733412467342657016137 0ustar esresr# Name: BU-303 (NL202-U) # Chipset: SiRF-II # Submitter: "Andreas Brauchli" # Date: 2005-06-19 # Location: Adelboden, Bern, Switzerland, 46N7E # Comments: Fix, Walking on a stair # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. #  ¢ 2xœ°³ ¢[)0zˆ'·‚Ë|Y“à`-×°³ ¢Œ0Y  ƒ[¯χ¿+,*))***('Hv¿))*)())*)"Ëf¿-+--...,)('Y¿---,+,.-*#,!¿)&&%'((& Éxþ°³ ¢)BŠï×HFB}ÿÿ0Y ¬°³ ¢ ºI °³ ¢4°³ ¢ 2xœ°³ ¢ ,°³ ¢ +°³ ¢[)0zŒ·‚ËdSâ€cqj°³ ¢Œ0Y ƒ[¯χ¿((++***)()Hv¿$(*)))***Ëf¿++-,+--+*)'Y¿$*...-,,,,!¿%%%&&%&)Éx)°³ ¢)BŠï×HFB}ÿÿ0Y°³ ¢ ºF °³ ¢4°³ ¢[)0z÷·‚Ë;L†þ߀W°³ ¢Œ0Ye ƒ[¯"!""!#$"χ¿*++)'(*,.,Hv¿)++)(**+-,Ëf¿))((),....'Y¿+,+*(++,./,!¿)(&!!$)*Éx»°³ ¢)BŠï×HFB}ÿÿ0Ye w°³ ¢ ºJ °³ ¢4°³ ¢ 2xœ°³ ¢[)0z“ß·‚Ë(TàØcذ³ ¢Œ0YÉ ƒ[¿!$$$""χ¿+,)+-,**))Hv¿++*,--**('Ëf¿..,.....-+'Y¿//../.---+,!¿*+,+*))())Éx}°³ ¢)BŠï×HFB}0YÉ ݰ³ ¢ ºK°³ ¢4°³ ¢[)0z—Ç·ü‚Ë&Iƒÿ߀u c°³ ¢Œ0Y- ƒ[¿!!"!!!!"""χ¿)(('&&))((Hv¿'('(()*,,*Ëf¿,,+*))*,,+'Y¿++,,,--,,+,!¿))))))(&''Éx–°³ ¢)BŠï×HFB|ÿÿ0Y- ?°³ ¢ ºK°³ ¢4°³ ¢ 2xœ°³ ¢[)0z›¯·è‚Ë:;uÿ߀…s Ÿ°³ ¢Œ0Y‘ ƒ[¿##""#"""""χ¿(()))(''''Hv¿**,,,+++++Ëf¿+,+,++**)*'Y¿,++--+(''(,!¿$%&&()(''&Éxõ°³ ¢)BŠï×HFB|0Y‘ ¥°³ ¢ ºK°³ ¢4°³ ¢ 2xœ°³ ¢[)0zŸ—·ß‚Ë_5nÿßàJ L°³ ¢Œ0Yõ ƒ[¿"""$$%#$$$χ¿&&&(((''''Hv¿++++,+++++Ëf¿+*++,-++++'Y¿)****++*)*,!¿%%&&'&%%%%ÉzV°³ ¢)BŠï×HFB|0Yõ  °³ ¢ ºN°³ ¢4°³ ¢ 2z¿°³ ¢[)0z£·Ü‚ˉ,fÞÛuu°³ ¢Œ0YY ƒ[¿$%%$%%%%&$χ¿'''((())))Hv¿,--+------Ëf¿+++**+****'Y¿*****++*++,!¿%%%%&&''&'Ézä°³ ¢)BŠï×HFB|0YY n°³ gpsd-3.15/test/daemon/bu303-climbing.log.chk0000664000175000017500000002062212467342657016676 0ustar esresr$GPGSV,2,1,07,10,45,196,10,29,67,310,42,28,59,108,40,26,51,304,44*70 $GPGSV,2,2,07,08,44,058,43,27,16,066,37,21,10,301,00*4A {"class":"SKY","time":"2005-06-19T16:12:25.890Z","xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.48,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":10,"used":true},{"PRN":29,"el":67,"az":310,"ss":42,"used":true},{"PRN":28,"el":59,"az":108,"ss":40,"used":true},{"PRN":26,"el":51,"az":304,"ss":44,"used":true},{"PRN":8,"el":44,"az":58,"ss":43,"used":true},{"PRN":27,"el":16,"az":66,"ss":37,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]} $GPZDA,161225.89,19,06,2005,00,00*6D $GPGGA,161225,4629.8923,N,00734.0837,E,1,06,3.20,1327.69,M,48.183,M,,*7D $GPRMC,161225,A,4629.8923,N,00734.0837,E,0.1673,180.000,190605,,*2A $GPGSA,A,3,10,29,28,26,8,27,,,,,,,3.0,3.2,2.6*0D $GPGBS,161225,15.28,M,16.17,M,58.85,M*02 {"class":"TPV","mode":3,"time":"2005-06-19T16:12:25.890Z","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} $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","time":"2005-06-19T16:12:26.890Z","xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":3.20,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":8,"used":true},{"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}]} $GPZDA,161226.89,19,06,2005,00,00*6E $GPGGA,161226,4629.8923,N,00734.0837,E,1,06,3.20,1327.69,M,48.183,M,,*7E $GPRMC,161226,A,4629.8923,N,00734.0837,E,0.1776,10.380,190605,,*1E $GPGSA,A,3,10,29,28,26,8,27,,,,,,,3.0,3.2,2.6*0D {"class":"TPV","mode":3,"time":"2005-06-19T16:12:26.890Z","ept":0.005,"lat":46.498204497,"lon":7.568061439,"alt":1327.689,"epx":15.279,"epy":16.167,"epv":58.845,"track":10.3797,"speed":0.091,"climb":-0.085,"eps":32.33,"epc":117.69} $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","time":"2005-06-19T16:12:27.890Z","xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":3.20,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":33,"used":true},{"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}]} $GPZDA,161227.89,19,06,2005,00,00*6F $GPGGA,161227,4629.8923,N,00734.0837,E,1,06,1.40,1327.69,M,48.183,M,,*7B $GPRMC,161227,A,4629.8923,N,00734.0837,E,0.1673,180.000,190605,,*28 $GPGSA,A,3,10,29,28,26,8,27,,,,,,,3.0,1.4,2.6*09 {"class":"TPV","mode":3,"time":"2005-06-19T16:12:27.890Z","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":32.33,"epc":117.69} $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","time":"2005-06-19T16:12:28.890Z","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}]} $GPZDA,161228.89,19,06,2005,00,00*60 $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.0000,0.000,190605,,*2D $GPGSA,A,3,10,29,28,26,8,27,,,,,,,3.0,1.4,2.6*09 {"class":"TPV","mode":3,"time":"2005-06-19T16:12:28.890Z","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,"epc":117.69} $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","time":"2005-06-19T16:12:29.890Z","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}]} $GPZDA,161229.89,19,06,2005,00,00*61 $GPGGA,161229,4629.8919,N,00734.0837,E,1,06,1.40,1326.96,M,48.183,M,,*7D $GPRMC,161229,A,4629.8919,N,00734.0837,E,0.1673,180.000,190605,,*2F $GPGSA,A,3,10,29,28,26,8,27,,,,,,,3.0,1.4,2.6*09 {"class":"TPV","mode":3,"time":"2005-06-19T16:12:29.890Z","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,"epc":117.69} $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","time":"2005-06-19T16:12:30.890Z","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}]} $GPZDA,161230.89,19,06,2005,00,00*69 $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.0000,0.000,190605,,*2D $GPGSA,A,3,10,29,28,26,8,27,,,,,,,3.0,1.4,2.6*09 {"class":"TPV","mode":3,"time":"2005-06-19T16:12:30.890Z","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,"epc":117.69} $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","time":"2005-06-19T16:12:31.890Z","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}]} $GPZDA,161231.89,19,06,2005,00,00*68 $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,8,27,,,,,,,3.0,1.4,2.6*09 {"class":"TPV","mode":3,"time":"2005-06-19T16:12:31.890Z","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,"epc":117.69} $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","time":"2005-06-19T16:12:32.890Z","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}]} $GPZDA,161232.89,19,06,2005,00,00*6B $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,8,27,,,,,,,3.0,1.4,2.6*09 {"class":"TPV","mode":3,"time":"2005-06-19T16:12:32.890Z","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,"epc":117.69} gpsd-3.15/test/daemon/bu303-moving.log0000664000175000017500000001212312467342657015642 0ustar esresr# Name: BU-303 (NL202-U) # Chipset: SiRF-II # Submitter: "Andreas Brauchli" # Date: 2005-06-09 # Location: Adelboden, Bern, Switzerland, 46N7E # Comments: Fix, Walking # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. #  ¢)BŠù×FBŽÿÿ ._tŽ Ó°³ ¢ ºD°³ ¢4°³ ¢ 2xœ°³ ¢[).º’󷀂±Õ; u ã3D°³ ¢Œ._u 8 k~„¿-,-,,,,,+-¶ Ëf¿…¿%%%$$$$$$%¡D¿+++**+,,,,3¿++++++++++x™°³ ¢)BŠù×FBÿÿ ._u 9°³ ¢ ºD°³ ¢4°³ ¢ 2xœ°³ ¢[).º–Û·Ù‚±ÇU  ä] F°³ ¢Œ._u| 8 k~„¿-----,,,,,¶ Ëf¿…¿%$%%&%%%%%¡D¿,++++++***3¿++*++**++*xò°³ ¢)BŠø×FBÿÿ ._u| ›°³ ¢ ºD°³ ¢4°³ ¢[).ºšÃ·‚±œf   ã0¶°³ ¢Œ._uà 8 k~„¿,+,,+,,,,,¶ Ëf¿…¿%$$#$"##"$¡D¿**))*****+3¿******++++x(°³ ¢)BŠø×FBÿÿ._uàù°³ ¢ ºE°³ ¢4°³ ¢ 2xœ°³ ¢  °³ ¢[).ºž«·7‚±«n š ä€(N°³ ¢Œ._vD 8 k~„¿++,+,,----¶ Ëf¿ …¿#$$$$%%$%%¡D¿+*+*+*****3¿++++**+***x®°³ ¢)BŠø×FBÿÿ ._vD e°³ ¢ ºH °³ ¢4°³ ¢[).º¢“·i‚±Ÿv ° äàGï°³ ¢Œ._vš 8 k~„¿----------¶ Ëf¿…¿&&&'&&&&&%¡D¿****++++++3¿*)**+*+*++x+°³ ¢)BŠ÷×FB‘ÿÿ ._vš ɰ³ ¢ ºC°³ ¢4°³ ¢ 2xœ°³ ¢[).ºŠ{·•‚±—{ µ äàD °³ ¢Œ._w 8 k~„¿---,--,,--¶ Ëf¿…¿%%%&%%%%#$¡D¿**********3¿******)))*z°³ ¢)BŠ÷×FB‘ÿÿ ._w  .°³ ¢ ºF °³ ¢4°³ ¢[).ºªc·¿‚±‚ Œ â`\·°³ ¢Œ._wp 8 k~„¿-------,--¶ Ëf¿!!!!!!! …¿$$$$#$$$##¡D¿**+++++,++3¿****+*+***z°³ ¢)BŠ÷×FB‘ÿÿ ._wp ’°³ ¢ ºC°³ ¢4°³ ¢ 2z¿°³ ¢[).º®K·ç‚±ƒƒ Œ ã°³ ¢Œ._wÔ 8 k~„¿---,-----,¶ Ëf¿!…¿#$#$$$$$$#¡D¿+*)(((()()3¿)****+***+z8°³ ¢)BŠö×FB’ÿÿ ._wÔ ö°³ ¢ ºD°³ ¢4°³ ¢ 2z¿°³ ¢[).º²3·‚±z~ · ã1/°³ ¢Œ._x8 8 k~„¿,+,-------¶ Ëf¯ …¿$$$%$$$#$%¡D¿)*)*******3¿+*****+***zo°³ ¢)BŠö×FB’ÿÿ._x8T°³ ¢ º>°³ ¢4°³ ¢ 2z¿°³ ¢  °³ ¢[).º¶·#‚±mm § ã@Ng°³ ¢Œ._xœ 8 k~„¿.........-¶ Ëf¿!!!! !!…¿$$$###$%$%¡D¿*+++*****+3¿***+++****z;°³ ¢)BŠö×FB’ÿÿ ._xœ Ÿ°³ ¢ ºH °³ ¢4°³ ¢[).ºº·F‚±]W ‘ äÐcá°³ ¢Œ._y 8 k~„¿-..-......¶ Ëf¿!…¿%%&%&%%$$$¡D¿))*)**)*++3¿*+++++++,,z°³ ¢)BŠõ×FB’ÿÿ ._y "°³ gpsd-3.15/test/daemon/bu303-moving.log.chk0000664000175000017500000003074612467342657016421 0ustar esresr$GPZDA,143446.28,09,06,2005,00,00*64 $GPGGA,143446,4629.8972,N,00734.0447,E,1,00,2.40,1342.40,M,48.183,M,,*78 $GPRMC,143446,A,4629.8972,N,00734.0447,E,0.1776,10.379,090605,,*16 $GPGSA,A,3,,,,,,,,,,,,,0.0,2.4,0.0*34 {"class":"TPV","mode":3,"time":"2005-06-09T14:34:46.280Z","ept":0.005,"lat":46.498287178,"lon":7.567411672,"alt":1342.402,"track":10.3788,"speed":0.091,"climb":-0.085} $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","time":"2005-06-09T14:34:47.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"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}]} $GPZDA,143447.28,09,06,2005,00,00*65 $GPGGA,143447,4629.8976,N,00734.0447,E,1,05,2.40,1343.13,M,48.183,M,,*7F $GPRMC,143447,A,4629.8976,N,00734.0447,E,0.1776,10.379,090605,,*13 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.4*0F {"class":"TPV","mode":3,"time":"2005-06-09T14:34:47.280Z","ept":0.005,"lat":46.498293369,"lon":7.567411672,"alt":1343.127,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:48.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"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}]} $GPZDA,143448.28,09,06,2005,00,00*6A $GPGGA,143448,4629.8980,N,00734.0440,E,1,05,2.40,1342.35,M,48.183,M,,*7B $GPRMC,143448,A,4629.8980,N,00734.0440,E,0.1776,10.379,090605,,*12 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.4*0F {"class":"TPV","mode":3,"time":"2005-06-09T14:34:48.280Z","ept":0.005,"lat":46.498300695,"lon":7.567400477,"alt":1342.354,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:49.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"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}]} $GPZDA,143449.28,09,06,2005,00,00*6B $GPGGA,143449,4629.8984,N,00734.0440,E,1,05,3.20,1343.08,M,48.183,M,,*76 $GPRMC,143449,A,4629.8984,N,00734.0440,E,0.1776,10.379,090605,,*17 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,3.2,3.4*08 {"class":"TPV","mode":3,"time":"2005-06-09T14:34:49.280Z","ept":0.005,"lat":46.498306887,"lon":7.567400477,"alt":1343.079,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:50.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":3.20,"gdop":5.15,"pdop":4.16,"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":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]} $GPZDA,143450.28,09,06,2005,00,00*63 $GPGGA,143450,4629.8984,N,00734.0440,E,1,05,2.40,1343.08,M,48.183,M,,*79 $GPRMC,143450,A,4629.8984,N,00734.0440,E,0.1776,10.379,090605,,*1F $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.4*0F {"class":"TPV","mode":3,"time":"2005-06-09T14:34:50.280Z","ept":0.005,"lat":46.498306887,"lon":7.567400477,"alt":1343.079,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:51.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"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}]} $GPZDA,143451.28,09,06,2005,00,00*62 $GPGGA,143451,4629.8992,N,00734.0441,E,1,05,2.40,1343.12,M,48.183,M,,*75 $GPRMC,143451,A,4629.8992,N,00734.0441,E,0.1776,10.379,090605,,*18 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.4*0F {"class":"TPV","mode":3,"time":"2005-06-09T14:34:51.280Z","ept":0.005,"lat":46.498319545,"lon":7.567402192,"alt":1343.122,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:52.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"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}]} $GPZDA,143452.28,09,06,2005,00,00*61 $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,8,10,4,2,27,,,,,,,,4.2,2.4,3.4*0F {"class":"TPV","mode":3,"time":"2005-06-09T14:34:52.280Z","ept":0.005,"lat":46.498319545,"lon":7.567402192,"alt":1343.122,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:53.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"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}]} $GPZDA,143453.28,09,06,2005,00,00*60 $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,8,10,4,2,27,,,,,,,,4.2,2.4,3.4*0F {"class":"TPV","mode":3,"time":"2005-06-09T14:34:53.280Z","ept":0.005,"lat":46.498319545,"lon":7.567402192,"alt":1343.122,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:54.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"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}]} $GPZDA,143454.28,09,06,2005,00,00*67 $GPGGA,143454,4629.8999,N,00734.0442,E,1,05,2.40,1343.17,M,48.183,M,,*7D $GPRMC,143454,A,4629.8999,N,00734.0442,E,0.1776,10.379,090605,,*15 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.4*0F {"class":"TPV","mode":3,"time":"2005-06-09T14:34:54.280Z","ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:55.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"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}]} $GPZDA,143455.28,09,06,2005,00,00*66 $GPGGA,143455,4629.8999,N,00734.0442,E,1,05,3.20,1343.17,M,48.183,M,,*7B $GPRMC,143455,A,4629.8999,N,00734.0442,E,0.1776,10.379,090605,,*14 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,3.2,3.4*08 {"class":"TPV","mode":3,"time":"2005-06-09T14:34:55.280Z","ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:56.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":3.20,"gdop":5.15,"pdop":4.16,"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":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}]} $GPZDA,143456.28,09,06,2005,00,00*65 $GPGGA,143456,4629.9000,N,00734.0435,E,1,05,2.40,1343.07,M,48.183,M,,*76 $GPRMC,143456,A,4629.9000,N,00734.0435,E,0.1776,10.379,090605,,*1F $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.4*0F {"class":"TPV","mode":3,"time":"2005-06-09T14:34:56.280Z","ept":0.005,"lat":46.498333062,"lon":7.567390997,"alt":1343.075,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} $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","time":"2005-06-09T14:34:57.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"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}]} $GPZDA,143457.28,09,06,2005,00,00*64 $GPGGA,143457,4629.9004,N,00734.0436,E,1,05,2.40,1342.39,M,48.183,M,,*7C $GPRMC,143457,A,4629.9004,N,00734.0436,E,0.1776,10.379,090605,,*19 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.4*0F {"class":"TPV","mode":3,"time":"2005-06-09T14:34:57.280Z","ept":0.005,"lat":46.498339529,"lon":7.567392712,"alt":1342.392,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23} gpsd-3.15/test/daemon/bu303-nofix.log0000664000175000017500000000663712461156335015471 0ustar esresr# Name: BU-303 (NL202-U) # Chipset: SiRF-II # Submitter: "Andreas Brauchli" # Date: 2005-06-09 # Location: Adelboden, Bern, Switzerland, 46N7E # Comments: No fix # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. #  ¢ º ̰³ ¢4°³ ¢ 2xŒ°³ ¢[)šžåF˰³ ¢Œš_J ?())())))))?.....-..//xx°³ ¢)úš_J °³ ¢ º Ͱ³ ¢4°³ ¢ 2xŒ°³ ¢  %°³ ¢[)šžé.·°³ ¢Œš_J„ ?)))())))))?///....../xà°³ ¢)úš_J„ã°³ ¢ º ̰³ ¢4°³ ¢ 2xŒ°³ ¢  %°³ ¢[)šží£°³ ¢Œš_Jè ?))((((((('?//////////xB°³ ¢)úš_JèG°³ ¢ º ̰³ ¢4°³ ¢ 2xŒ°³ ¢[)šžðþް³ ¢Œš_KL ?'''((('''(?////////0/x¡°³ ¢)úš_KL¬°³ ¢ º ̰³ ¢4°³ ¢ 2xŒ°³ ¢  %°³ ¢[)šžôæz°³ ¢Œš_K° ?)(((((((((?/000001000x°³ ¢)úš_K°°³ ¢ º Ͱ³ ¢4°³ ¢ 2xŒ°³ ¢  %°³ ¢[).žøÎí°³ ¢Œ._L ?((''''('''?////0/0///xñ°³ ¢)ú._Lü°³ ¢ §È°³ ¢4°³ ¢ 2xŒ°³ ¢  %°³ ¢[).žü¶Ù°³ ¢Œ._Lx ?('(())(())¿//0000000/xt°³ ¢)ú._Lx`°³ gpsd-3.15/test/daemon/bu303-nofix.log.chk0000664000175000017500000000314012467340617016223 0ustar esresr{"class":"SKY","time":"2002-11-14T14:32:57.280Z"} $GPRMC,143257,V,18000.0000,N,00000.0000,W,0.0000,0.000,141102,,*10 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-14T14:32:57.280Z","ept":0.005} {"class":"SKY","time":"2002-11-14T14:32:58.280Z","hdop":50.00} $GPRMC,143258,V,18000.0000,N,00000.0000,W,0.0000,0.000,141102,,*1F $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-14T14:32:58.280Z","ept":0.005} {"class":"SKY","time":"2002-11-14T14:32:59.280Z","hdop":50.00} $GPRMC,143259,V,18000.0000,N,00000.0000,W,0.0000,0.000,141102,,*1E $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-14T14:32:59.280Z","ept":0.005} {"class":"SKY","time":"2002-11-14T14:33:00.280Z","hdop":50.00} $GPRMC,143300,V,18000.0000,N,00000.0000,W,0.0000,0.000,141102,,*13 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-14T14:33:00.280Z","ept":0.005} {"class":"SKY","time":"2002-11-14T14:33:01.280Z","hdop":50.00} $GPRMC,143301,V,18000.0000,N,00000.0000,W,0.0000,0.000,141102,,*12 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-14T14:33:01.280Z","ept":0.005} {"class":"SKY","time":"2005-06-09T14:33:02.280Z","hdop":50.00} $GPRMC,143302,V,18000.0000,N,00000.0000,W,0.0000,0.000,090605,,*1C $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2005-06-09T14:33:02.280Z","ept":0.005} {"class":"SKY","time":"2005-06-09T14:33:03.280Z","hdop":50.00} $GPRMC,143303,V,18000.0000,N,00000.0000,W,0.0000,0.000,090605,,*1D $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2005-06-09T14:33:03.280Z","ept":0.005} gpsd-3.15/test/daemon/bu303-stillfix.log0000664000175000017500000001211312461156335016166 0ustar esresr# Name: BU-303 (NL202-U) # Chipset: SiRF-II # Submitter: "Andreas Brauchli" # Date: 2005-06-09 # Location: Adelboden, Bern, Switzerland, 46N7E # Comments: Fix, receiver not moving # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. #  ¢Œ._h4 8k~ƒ¿------,-,-¶ Ëe¿&%%%&'%%$$… ¿&%%$$$%$$$¡E¿+++++,++++3¿++++++++++xþ°³ ¢)B‹×FBŠÿÿ ._h4 W°³ ¢ ºG °³ ¢4°³ ¢ 2xœ°³ ¢* MGŸA 12ò"Ç ¡T›°³ ¢[).ºõ·ë‚³»!a› ÿn²°³ ¢Œ._h˜ 8 k~ƒ¿,+++,,+++,¶ Ëe¿$$$$$$$$%%… ¿#####$#$%%¡E¿+,,,------3¿++++++++++xO°³ ¢)B‹×FB‰ÿÿ ._h˜ ž°³ ¢ ºL°³ ¢4°³ ¢[).ºÝ·‚³Ï ü6 õ€$(°³ ¢Œ._hü 8 k~ƒ¿++,---,---¶ Ëe¿%%%&&&&&&&… ¿$$$##"##$#¡E¿----,++,,+3¿*****+++**xŸ°³ ¢)B‹×FB‰ ._hü °³ ¢ ºC°³ ¢4°³ ¢ 2xœ°³ ¢[).ºÅ·=‚³à ž Øì€N­°³ ¢Œ._i` 8 k~ƒ¿--------,,¶ Ëe¿&&&%%&%&%%… ¿##"##"####¡E¿-,-,+,+)))3¿++++*++*++x°³ ¢)B‹×FB‰ÿÿ ._i` °³ ¢ ºB°³ ¢4°³ ¢[).º!­·^‚³è K … ç˜`C°³ ¢Œ._iÄ 8 k~ƒ¿---+++++++¶ Ëe¿&$#"#!#%&&… ¿"#"  !¡E¿('&&'''(((3¿*)))*))))(x°³ ¢)B‹×FBˆÿÿ ._iÄ â°³ ¢ ºG °³ ¢4°³ ¢ 2xœ°³ ¢[).º%•·z‚³ã  D ç2ÿ°³ ¢Œ._j( 8 k~ƒ¿,+-../....¶ Ëe¿&%%$%&''&'… ¿  !"##$$¡E¿(((()****+3¿(())******xÁ°³ ¢)B‹×FBˆÿÿ ._j( F°³ ¢ ºD°³ ¢4°³ ¢ 2xœ°³ ¢[).º)}·•‚³×Ø åšfl°³ ¢Œ._jŒ 8 k~ƒ¿...-.----.¶ Ëe¿&&&%$$$%%&… ¿####$%$%%&¡E¿++++,,++++3¿))**))*)))xJ°³ ¢)B‹×FBˆÿÿ ._jŒ ©°³ ¢ ºE°³ ¢4°³ ¢ 2xœ°³ ¢[).º-e·°‚³Ç· ñ æ°³ ¢Œ._jð 8 k~ƒ¿-..----,,-¶ Ëe¿&&&&%%%%%&… ¿%$$$%$$#$$¡E¿++********3¿******))**xš°³ ¢)B‹×FBˆ ._jð °³ ¢ ºD°³ ¢4°³ ¢[).º1M·Ì‚³µ¢ Üæ`U”°³ ¢Œ._kT 8 k~ƒ¿----------¶ Ëe¿&%&%&&%%$$… ¿$$$$$$%%$%¡E¿**))******3¿**++++++**x°³ ¢)B‹×FBˆ ._kT s°³ ¢ ºC°³ ¢4°³ ¢ 2xœ°³ ¢[).º55·ð‚³ž„ Ÿ åh`e°³ ¢Œ._kž 8 k~ƒ¿...-..-...¶ Ëe¿%%%%%$$$##… ¿$%$$$%%%$%¡E¿*)*)**)))*3¿+++++*****xq°³ ¢)B‹×FBˆÿÿ ._kž Ô°³ ¢ ºD°³ ¢4°³ ¢ 2xœ°³ ¢[).º9·‚³‰i £ æ/–°³ ¢Œ._l 8 k~ƒ¿....-.-...¶ Ëe¿$$%%$$$$%%… ¿%%%%%$%%%%¡E¿********++3¿****+*++++xâ°³ ¢)B‹×FBˆÿÿ ._l 9°³ ¢ ºD°³ ¢4°³ ¢ 2xœ°³ ¢[).º=·D‚³|R Œ åO“°³ gpsd-3.15/test/daemon/bu303-stillfix.log.chk0000664000175000017500000003015412467340617016743 0ustar esresr$GPGSV,2,1,08,23,07,084,00,28,07,160,00,08,65,189,45,29,13,273,00*77 $GPGSV,2,2,08,10,50,304,37,04,16,199,36,02,34,241,43,27,71,076,43*71 {"class":"SKY","time":"2005-06-09T14:34:14.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.35,"gdop":5.23,"pdop":4.21,"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":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":43,"used":true}]} $GPZDA,143414.28,09,06,2005,00,00*63 $GPGGA,143414,4629.8901,N,00734.0471,E,1,05,2.40,1349.51,M,48.183,M,,*70 $GPRMC,143414,A,4629.8901,N,00734.0471,E,0.1776,10.379,090605,,*10 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E $GPGBS,143414,25.19,M,24.69,M,80.26,M*03 {"class":"TPV","mode":3,"time":"2005-06-09T14:34:14.280Z","ept":0.005,"lat":46.498167579,"lon":7.567452213,"alt":1349.507,"epx":25.195,"epy":24.691,"epv":80.261,"track":10.3789,"speed":0.091,"climb":-0.085} $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","time":"2005-06-09T14:34:15.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143415.28,09,06,2005,00,00*62 $GPGGA,143415,4629.8905,N,00734.0473,E,1,05,2.40,1347.42,M,48.183,M,,*7B $GPRMC,143415,A,4629.8905,N,00734.0473,E,0.1776,10.379,090605,,*17 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:15.280Z","ept":0.005,"lat":46.498174322,"lon":7.567455643,"alt":1347.417,"epx":25.195,"epy":24.691,"epv":80.261,"track":10.3789,"speed":0.091,"climb":-0.085,"eps":50.39,"epc":160.52} $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","time":"2005-06-09T14:34:16.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143416.28,09,06,2005,00,00*61 $GPGGA,143416,4629.8908,N,00734.0474,E,1,05,2.40,1346.73,M,48.183,M,,*71 $GPRMC,143416,A,4629.8908,N,00734.0474,E,0.0000,0.000,090605,,*25 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:16.280Z","ept":0.005,"lat":46.498180789,"lon":7.567457358,"alt":1346.734,"epx":25.195,"epy":24.691,"epv":80.261,"track":0.0000,"speed":0.000,"climb":0.000,"eps":50.39,"epc":160.52} $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","time":"2005-06-09T14:34:17.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143417.28,09,06,2005,00,00*60 $GPGGA,143417,4629.8912,N,00734.0475,E,1,05,2.40,1346.05,M,48.183,M,,*7B $GPRMC,143417,A,4629.8912,N,00734.0475,E,0.1776,10.379,090605,,*15 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:17.280Z","ept":0.005,"lat":46.498187256,"lon":7.567459073,"alt":1346.052,"epx":25.195,"epy":24.691,"epv":80.261,"track":10.3789,"speed":0.091,"climb":-0.085,"eps":50.39,"epc":160.52} $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","time":"2005-06-09T14:34:18.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143418.28,09,06,2005,00,00*6F $GPGGA,143418,4629.8909,N,00734.0475,E,1,05,2.40,1345.33,M,48.183,M,,*78 $GPRMC,143418,A,4629.8909,N,00734.0475,E,0.1776,10.379,090605,,*10 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:18.280Z","ept":0.005,"lat":46.498181065,"lon":7.567459073,"alt":1345.327,"epx":25.195,"epy":24.691,"epv":80.261,"track":10.3789,"speed":0.091,"climb":-0.085,"eps":50.39,"epc":160.52} $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","time":"2005-06-09T14:34:19.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143419.28,09,06,2005,00,00*6E $GPGGA,143419,4629.8913,N,00734.0476,E,1,05,2.40,1344.64,M,48.183,M,,*72 $GPRMC,143419,A,4629.8913,N,00734.0476,E,0.1673,180.000,090605,,*28 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:19.280Z","ept":0.005,"lat":46.498187532,"lon":7.567460788,"alt":1344.644,"epx":25.195,"epy":24.691,"epv":80.261,"track":180.0000,"speed":0.086,"climb":-0.091,"eps":50.39,"epc":160.52} $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","time":"2005-06-09T14:34:20.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143420.28,09,06,2005,00,00*64 $GPGGA,143420,4629.8916,N,00734.0478,E,1,05,2.40,1343.96,M,48.183,M,,*79 $GPRMC,143420,A,4629.8916,N,00734.0478,E,0.1776,10.379,090605,,*18 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:20.280Z","ept":0.005,"lat":46.498193999,"lon":7.567462504,"alt":1343.962,"epx":25.195,"epy":24.691,"epv":80.261,"track":10.3789,"speed":0.091,"climb":-0.085,"eps":50.39,"epc":160.52} $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","time":"2005-06-09T14:34:21.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143421.28,09,06,2005,00,00*65 $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.0000,0.000,090605,,*22 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:21.280Z","ept":0.005,"lat":46.498193999,"lon":7.567462504,"alt":1343.962,"epx":25.195,"epy":24.691,"epv":80.261,"track":0.0000,"speed":0.000,"climb":0.000,"eps":50.39,"epc":160.52} $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","time":"2005-06-09T14:34:22.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143422.28,09,06,2005,00,00*66 $GPGGA,143422,4629.8917,N,00734.0470,E,1,05,2.40,1343.87,M,48.183,M,,*72 $GPRMC,143422,A,4629.8917,N,00734.0470,E,0.0000,0.000,090605,,*28 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:22.280Z","ept":0.005,"lat":46.498194858,"lon":7.567449593,"alt":1343.871,"epx":25.195,"epy":24.691,"epv":80.261,"track":0.0000,"speed":0.000,"climb":0.000,"eps":50.39,"epc":160.52} $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","time":"2005-06-09T14:34:23.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143423.28,09,06,2005,00,00*67 $GPGGA,143423,4629.8921,N,00734.0471,E,1,05,2.40,1343.19,M,48.183,M,,*70 $GPRMC,143423,A,4629.8921,N,00734.0471,E,0.1776,10.379,090605,,*16 $GPGSA,A,3,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:23.280Z","ept":0.005,"lat":46.498201325,"lon":7.567451308,"alt":1343.189,"epx":25.195,"epy":24.691,"epv":80.261,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.39,"epc":160.52} $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","time":"2005-06-09T14:34:24.280Z","xdop":1.68,"ydop":1.65,"vdop":3.49,"tdop":3.10,"hdop":2.40,"gdop":5.23,"pdop":4.21,"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}]} $GPZDA,143424.28,09,06,2005,00,00*60 $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,8,10,4,2,27,,,,,,,,4.2,2.4,3.5*0E {"class":"TPV","mode":3,"time":"2005-06-09T14:34:24.280Z","ept":0.005,"lat":46.498201325,"lon":7.567451308,"alt":1343.189,"epx":25.195,"epy":24.691,"epv":80.261,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.39,"epc":160.52} gpsd-3.15/test/daemon/bu303b-nofix.log0000664000175000017500000000620212461156335015617 0ustar esresr# Name: BU303B in SiRF binary mode, SBAS enabled, no fix # Chipset: SiRF-II # Submitter: Eric Raymond # Date: 2005-06-08 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. #  ¢4°³ ¢ 2D°³ ¢  %°³ ¢[)šÄxÿÿøø°³ ¢Œš“¥ û°³ ¢)šÿ·À>E£úš“¥Á°³ ¢ ºŰ³ ¢4°³ ¢ 2D°³ ¢  %°³ ¢[)šÈ`ÿÿøøì°³ ¢Œš” `°³ ¢)šÿ·À>E£úš” &°³ ¢ ºŰ³ ¢4°³ ¢ 2D°³ ¢  %°³ ¢[)šÌHÿÿøøذ³ ¢Œš”m ݳ ¢)šÿ·À>E£úš”mа³ ¢ ºŰ³ ¢4°³ ¢ 2D°³ ¢  %°³ ¢[)šÐ0ÿÿøøݳ ¢Œš”Ñ (°³ ¢)šÿ·À>E£úš”Ñî°³ ¢ ºŰ³ ¢4°³ ¢ 2D°³ ¢  %°³ ¢[)šÔÿÿøø°°³ ¢Œš•5 °³ ¢)šÿ·À>E£úš•5S°³ ¢ ºŰ³ ¢4°³ ¢ 2D°³ ¢  %°³ ¢Œš•5 £°³ ¢[)šØÿÿøøœ°³ ¢Œš•™ û°³ ¢)šÿ·À>E£úš•™·°³ ¢ ºŰ³ gpsd-3.15/test/daemon/bu303b-nofix.log.chk0000664000175000017500000000265712467340617016401 0ustar esresr{"class":"SKY","time":"2002-11-10T00:06:01.970Z"} $GPRMC,000601,V,4002.1027,N,07531.2013,W,0.0000,0.000,101102,,*2E $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-10T00:06:01.970Z","ept":0.005} {"class":"SKY","time":"2002-11-10T00:06:02.970Z","hdop":50.00} $GPRMC,000602,V,4002.1027,N,07531.2013,W,0.0000,0.000,101102,,*2D $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-10T00:06:02.970Z","ept":0.005} {"class":"SKY","time":"2002-11-10T00:06:03.970Z","hdop":50.00} $GPRMC,000603,V,4002.1027,N,07531.2013,W,0.0000,0.000,101102,,*2C $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-10T00:06:03.970Z","ept":0.005} {"class":"SKY","time":"2002-11-10T00:06:04.970Z","hdop":50.00} $GPRMC,000604,V,4002.1027,N,07531.2013,W,0.0000,0.000,101102,,*2B $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-10T00:06:04.970Z","ept":0.005} {"class":"SKY","time":"2002-11-10T00:06:05.970Z","hdop":50.00} $GPRMC,000605,V,4002.1027,N,07531.2013,W,0.0000,0.000,101102,,*2A $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-10T00:06:05.970Z","ept":0.005} {"class":"SKY","time":"2002-11-10T00:06:05.970Z","hdop":50.00} {"class":"SKY","time":"2002-11-10T00:06:06.970Z","hdop":50.00} $GPRMC,000606,V,4002.1027,N,07531.2013,W,0.0000,0.000,101102,,*29 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 {"class":"TPV","mode":1,"time":"2002-11-10T00:06:06.970Z","ept":0.005} gpsd-3.15/test/daemon/bu353-glonass.log0000664000175000017500000001302112467342657016014 0ustar esresr# Name: BU 353 GLONASS # Chipset: SiRF-III # Submitter: Alexander Volkov # Date: 2014-05-23 # Comment: Contains GLONASS sentences (look for GN talker ID) # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081411.000,A,5541.1955,N,03737.2872,E,0.60,301.29,260514,,,A*74 $GPZDA,081411.000,26,05,2014,,*5D $GPGGA,081412.000,5541.1956,N,03737.2877,E,1,5,4.87,66.2,M,14.5,M,,*6A $GNGSA,A,3,03,19,27,13,,,,,,,,,4.97,4.87,1.00*10 $GNGSA,A,3,88,,,,,,,,,,,,4.97,4.87,1.00*1C $GNRMC,081412.000,A,5541.1956,N,03737.2877,E,0.52,301.26,260514,,,A*7F $GPZDA,081412.000,26,05,2014,,*5E $GPGGA,081413.000,5541.1959,N,03737.2894,E,1,5,4.87,66.2,M,14.5,M,,*69 $GNGSA,A,3,03,19,27,13,,,,,,,,,4.98,4.87,1.00*1F $GNGSA,A,3,88,,,,,,,,,,,,4.98,4.87,1.00*13 $GNRMC,081413.000,A,5541.1959,N,03737.2894,E,0.46,308.99,260514,,,A*74 $GPZDA,081413.000,26,05,2014,,*5F $GPGGA,081414.000,5541.1961,N,03737.2908,E,1,6,2.56,66.2,M,14.5,M,,*68 $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081414.000,A,5541.1961,N,03737.2908,E,0.41,320.05,260514,,,A*74 $GPZDA,081414.000,26,05,2014,,*58 $GPGGA,081415.000,5541.1965,N,03737.2923,E,1,6,2.56,66.2,M,14.5,M,,*64 $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081415.000,A,5541.1965,N,03737.2923,E,0.39,332.00,260514,,,A*71 $GPZDA,081415.000,26,05,2014,,*59 $GPGSV,3,1,12,08,88,068,,07,59,081,24,28,41,187,,05,40,260,*7E $GPGSV,3,2,12,26,36,297,,03,27,059,14,19,24,073,16,27,19,040,23*7C $GPGSV,3,3,12,10,19,202,,13,15,129,23,21,06,346,,15,04,307,*7E $GLGSV,3,1,10,79,81,336,,69,50,211,,70,47,307,,78,33,058,*6D $GLGSV,3,2,10,80,30,251,,88,24,068,23,87,19,015,17,68,07,177,*6C $GLGSV,3,3,10,71,06,339,,81,03,117,27*65 $GPGGA,081416.000,5541.1967,N,03737.2926,E,1,6,2.56,66.2,M,14.5,M,,*60 $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081416.000,A,5541.1967,N,03737.2926,E,0.39,333.53,260514,,,A*72 $GPZDA,081416.000,26,05,2014,,*5A $GPGGA,081417.000,5541.1969,N,03737.2928,E,1,6,2.56,66.2,M,14.5,M,,*61 $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081417.000,A,5541.1969,N,03737.2928,E,0.40,336.16,260514,,,A*79 $GPZDA,081417.000,26,05,2014,,*5B $GPGGA,081418.000,5541.1971,N,03737.2934,E,1,6,2.56,66.2,M,14.5,M,,*6A $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081418.000,A,5541.1971,N,03737.2934,E,0.39,345.22,260514,,,A*7F $GPZDA,081418.000,26,05,2014,,*54 $GPGGA,081419.000,5541.1973,N,03737.2934,E,1,6,4.54,66.2,M,14.5,M,,*6D $GNGSA,A,3,03,19,27,13,,,,,,,,,13.09,4.54,12.28*17 $GNGSA,A,3,88,87,,,,,,,,,,,13.09,4.54,12.28*14 $GNRMC,081419.000,A,5541.1973,N,03737.2934,E,0.40,342.94,260514,,,A*78 $GPZDA,081419.000,26,05,2014,,*55 $GPGGA,081420.000,,,,,0,0,,,M,,M,,*47 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081420.000,V,,,,,0.00,340.16,260514,,,N*58 $GPZDA,081420.000,26,05,2014,,*5F $GPGSV,3,1,12,08,88,068,,07,59,081,23,28,41,187,,05,40,260,*79 $GPGSV,3,2,12,26,36,297,,03,27,059,14,19,24,073,14,27,19,040,23*7E $GPGSV,3,3,12,10,19,202,,13,15,129,23,21,06,345,,15,04,307,*7D $GLGSV,3,1,10,79,81,336,,69,50,211,,70,47,307,,78,33,058,*6D $GLGSV,3,2,10,80,30,251,,88,24,068,24,87,19,015,17,68,07,177,*6B $GLGSV,3,3,10,71,06,339,,81,03,117,26*64 $GPGGA,081421.000,,,,,0,0,,,M,,M,,*46 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081421.000,V,,,,,0.00,357.84,260514,,,N*54 $GPZDA,081421.000,26,05,2014,,*5E $GPGGA,081422.000,,,,,0,0,,,M,,M,,*45 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081422.000,V,,,,,0.00,8.60,260514,,,N*54 $GPZDA,081422.000,26,05,2014,,*5D $GPGGA,081423.000,,,,,0,0,,,M,,M,,*44 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081423.000,V,,,,,0.00,8.60,260514,,,N*55 $GPZDA,081423.000,26,05,2014,,*5C $GPGGA,081424.000,,,,,0,0,,,M,,M,,*43 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081424.000,V,,,,,0.00,8.60,260514,,,N*52 $GPZDA,081424.000,26,05,2014,,*5B $GPGGA,081425.000,,,,,0,0,,,M,,M,,*42 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081425.000,V,,,,,0.00,8.60,260514,,,N*53 $GPZDA,081425.000,26,05,2014,,*5A $GPGSV,3,1,12,08,88,068,,07,59,081,23,28,41,187,,05,40,260,*79 $GPGSV,3,2,12,26,37,297,,03,27,059,14,19,24,073,15,27,19,039,22*71 $GPGSV,3,3,12,10,19,202,,13,15,129,23,21,06,345,,15,04,307,*7D $GLGSV,3,1,10,79,81,336,,69,50,211,,70,47,307,,78,33,058,*6D $GLGSV,3,2,10,80,30,251,,88,24,068,25,87,19,015,16,68,07,177,*6B $GLGSV,3,3,10,71,06,339,,81,03,117,27*65 $GPGGA,081426.000,,,,,0,0,,,M,,M,,*41 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081426.000,V,,,,,0.00,8.60,260514,,,N*50 $GPZDA,081426.000,26,05,2014,,*59 $GPGGA,081427.000,,,,,0,0,,,M,,M,,*40 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081427.000,V,,,,,0.00,8.60,260514,,,N*51 $GPZDA,081427.000,26,05,2014,,*58 $GPGGA,081428.000,,,,,0,0,,,M,,M,,*4F $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081428.000,V,,,,,0.00,8.60,260514,,,N*5E $GPZDA,081428.000,26,05,2014,,*57 $GPGGA,081429.000,,,,,0,0,,,M,,M,,*4E $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081429.000,V,,,,,0.00,8.60,260514,,,N*5F $GPZDA,081429.000,26,05,2014,,*56 gpsd-3.15/test/daemon/bu353-glonass.log.chk0000664000175000017500000002547712467342657016602 0ustar esresr$GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 {"class":"TPV","mode":3,"epv":23.000} $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 {"class":"TPV","mode":3,"epv":23.000} $GNRMC,081411.000,A,5541.1955,N,03737.2872,E,0.60,301.29,260514,,,A*74 {"class":"TPV","mode":2,"time":"2014-05-26T08:14:11.000Z","ept":0.005,"lat":55.686591667,"lon":37.621453333,"track":301.2900,"speed":0.309} $GPZDA,081411.000,26,05,2014,,*5D $GPGGA,081412.000,5541.1956,N,03737.2877,E,1,5,4.87,66.2,M,14.5,M,,*6A $GNGSA,A,3,03,19,27,13,,,,,,,,,4.97,4.87,1.00*10 $GNGSA,A,3,88,,,,,,,,,,,,4.97,4.87,1.00*1C $GNRMC,081412.000,A,5541.1956,N,03737.2877,E,0.52,301.26,260514,,,A*7F {"class":"TPV","mode":3,"time":"2014-05-26T08:14:12.000Z","ept":0.005,"lat":55.686593333,"lon":37.621461667,"alt":66.200,"epv":23.000,"track":301.2600,"speed":0.268,"climb":0.000} $GPZDA,081412.000,26,05,2014,,*5E $GPGGA,081413.000,5541.1959,N,03737.2894,E,1,5,4.87,66.2,M,14.5,M,,*69 $GNGSA,A,3,03,19,27,13,,,,,,,,,4.98,4.87,1.00*1F $GNGSA,A,3,88,,,,,,,,,,,,4.98,4.87,1.00*13 $GNRMC,081413.000,A,5541.1959,N,03737.2894,E,0.46,308.99,260514,,,A*74 {"class":"TPV","mode":3,"time":"2014-05-26T08:14:13.000Z","ept":0.005,"lat":55.686598333,"lon":37.621490000,"alt":66.200,"epv":23.000,"track":308.9900,"speed":0.237,"climb":0.000,"epc":46.00} $GPZDA,081413.000,26,05,2014,,*5F $GPGGA,081414.000,5541.1961,N,03737.2908,E,1,6,2.56,66.2,M,14.5,M,,*68 $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081414.000,A,5541.1961,N,03737.2908,E,0.41,320.05,260514,,,A*74 {"class":"TPV","mode":3,"time":"2014-05-26T08:14:14.000Z","ept":0.005,"lat":55.686601667,"lon":37.621513333,"alt":66.200,"epv":23.000,"track":320.0500,"speed":0.211,"climb":0.000,"epc":46.00} $GPZDA,081414.000,26,05,2014,,*58 $GPGGA,081415.000,5541.1965,N,03737.2923,E,1,6,2.56,66.2,M,14.5,M,,*64 $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081415.000,A,5541.1965,N,03737.2923,E,0.39,332.00,260514,,,A*71 {"class":"TPV","mode":3,"time":"2014-05-26T08:14:15.000Z","ept":0.005,"lat":55.686608333,"lon":37.621538333,"alt":66.200,"epv":23.000,"track":332.0000,"speed":0.201,"climb":0.000,"epc":46.00} $GPZDA,081415.000,26,05,2014,,*59 $GPGSV,3,1,12,08,88,068,,07,59,081,24,28,41,187,,05,40,260,*7E $GPGSV,3,2,12,26,36,297,,03,27,059,14,19,24,073,16,27,19,040,23*7C $GPGSV,3,3,12,10,19,202,,13,15,129,23,21,06,346,,15,04,307,*7E {"class":"SKY","vdop":1.00,"hdop":2.56,"pdop":2.75,"satellites":[{"PRN":8,"el":88,"az":68,"ss":0,"used":false},{"PRN":7,"el":59,"az":81,"ss":24,"used":false},{"PRN":28,"el":41,"az":187,"ss":0,"used":false},{"PRN":5,"el":40,"az":260,"ss":0,"used":false},{"PRN":26,"el":36,"az":297,"ss":0,"used":false},{"PRN":3,"el":27,"az":59,"ss":14,"used":false},{"PRN":19,"el":24,"az":73,"ss":16,"used":false},{"PRN":27,"el":19,"az":40,"ss":23,"used":false},{"PRN":10,"el":19,"az":202,"ss":0,"used":false},{"PRN":13,"el":15,"az":129,"ss":23,"used":false},{"PRN":21,"el":6,"az":346,"ss":0,"used":false},{"PRN":15,"el":4,"az":307,"ss":0,"used":false}]} $GLGSV,3,1,10,79,81,336,,69,50,211,,70,47,307,,78,33,058,*6D $GLGSV,3,2,10,80,30,251,,88,24,068,23,87,19,015,17,68,07,177,*6C $GLGSV,3,3,10,71,06,339,,81,03,117,27*65 {"class":"SKY","vdop":1.00,"hdop":2.56,"pdop":2.75,"satellites":[{"PRN":8,"el":88,"az":68,"ss":0,"used":false},{"PRN":7,"el":59,"az":81,"ss":24,"used":false},{"PRN":28,"el":41,"az":187,"ss":0,"used":false},{"PRN":5,"el":40,"az":260,"ss":0,"used":false},{"PRN":26,"el":36,"az":297,"ss":0,"used":false},{"PRN":3,"el":27,"az":59,"ss":14,"used":false},{"PRN":19,"el":24,"az":73,"ss":16,"used":false},{"PRN":27,"el":19,"az":40,"ss":23,"used":false},{"PRN":10,"el":19,"az":202,"ss":0,"used":false},{"PRN":13,"el":15,"az":129,"ss":23,"used":false},{"PRN":21,"el":6,"az":346,"ss":0,"used":false},{"PRN":15,"el":4,"az":307,"ss":0,"used":false},{"PRN":79,"el":81,"az":336,"ss":0,"used":false},{"PRN":69,"el":50,"az":211,"ss":0,"used":false},{"PRN":70,"el":47,"az":307,"ss":0,"used":false},{"PRN":78,"el":33,"az":58,"ss":0,"used":false},{"PRN":80,"el":30,"az":251,"ss":0,"used":false},{"PRN":88,"el":24,"az":68,"ss":23,"used":true},{"PRN":87,"el":19,"az":15,"ss":17,"used":true},{"PRN":68,"el":7,"az":177,"ss":0,"used":false},{"PRN":71,"el":6,"az":339,"ss":0,"used":false},{"PRN":81,"el":3,"az":117,"ss":27,"used":false}]} $GPGGA,081416.000,5541.1967,N,03737.2926,E,1,6,2.56,66.2,M,14.5,M,,*60 $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081416.000,A,5541.1967,N,03737.2926,E,0.39,333.53,260514,,,A*72 {"class":"TPV","mode":3,"time":"2014-05-26T08:14:16.000Z","ept":0.005,"lat":55.686611667,"lon":37.621543333,"alt":66.200,"epv":23.000,"track":333.5300,"speed":0.201,"climb":0.000,"epc":46.00} $GPZDA,081416.000,26,05,2014,,*5A $GPGGA,081417.000,5541.1969,N,03737.2928,E,1,6,2.56,66.2,M,14.5,M,,*61 $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081417.000,A,5541.1969,N,03737.2928,E,0.40,336.16,260514,,,A*79 {"class":"TPV","mode":3,"time":"2014-05-26T08:14:17.000Z","ept":0.005,"lat":55.686615000,"lon":37.621546667,"alt":66.200,"epv":23.000,"track":336.1600,"speed":0.206,"climb":0.000,"epc":46.00} $GPZDA,081417.000,26,05,2014,,*5B $GPGGA,081418.000,5541.1971,N,03737.2934,E,1,6,2.56,66.2,M,14.5,M,,*6A $GNGSA,A,3,03,19,27,13,,,,,,,,,2.75,2.56,1.00*10 $GNGSA,A,3,88,87,,,,,,,,,,,2.75,2.56,1.00*13 $GNRMC,081418.000,A,5541.1971,N,03737.2934,E,0.39,345.22,260514,,,A*7F {"class":"TPV","mode":3,"time":"2014-05-26T08:14:18.000Z","ept":0.005,"lat":55.686618333,"lon":37.621556667,"alt":66.200,"epv":23.000,"track":345.2200,"speed":0.201,"climb":0.000,"epc":46.00} $GPZDA,081418.000,26,05,2014,,*54 $GPGGA,081419.000,5541.1973,N,03737.2934,E,1,6,4.54,66.2,M,14.5,M,,*6D $GNGSA,A,3,03,19,27,13,,,,,,,,,13.09,4.54,12.28*17 $GNGSA,A,3,88,87,,,,,,,,,,,13.09,4.54,12.28*14 $GNRMC,081419.000,A,5541.1973,N,03737.2934,E,0.40,342.94,260514,,,A*78 {"class":"TPV","mode":3,"time":"2014-05-26T08:14:19.000Z","ept":0.005,"lat":55.686621667,"lon":37.621556667,"alt":66.200,"epv":23.000,"track":342.9400,"speed":0.206,"climb":0.000,"epc":46.00} $GPZDA,081419.000,26,05,2014,,*55 $GPGGA,081420.000,,,,,0,0,,,M,,M,,*47 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081420.000,V,,,,,0.00,340.16,260514,,,N*58 $GPZDA,081420.000,26,05,2014,,*5F $GPGSV,3,1,12,08,88,068,,07,59,081,23,28,41,187,,05,40,260,*79 $GPGSV,3,2,12,26,36,297,,03,27,059,14,19,24,073,14,27,19,040,23*7E $GPGSV,3,3,12,10,19,202,,13,15,129,23,21,06,345,,15,04,307,*7D $GLGSV,3,1,10,79,81,336,,69,50,211,,70,47,307,,78,33,058,*6D $GLGSV,3,2,10,80,30,251,,88,24,068,24,87,19,015,17,68,07,177,*6B $GLGSV,3,3,10,71,06,339,,81,03,117,26*64 {"class":"SKY","vdop":12.28,"hdop":4.54,"pdop":13.09,"satellites":[{"PRN":8,"el":88,"az":68,"ss":0,"used":false},{"PRN":7,"el":59,"az":81,"ss":23,"used":false},{"PRN":28,"el":41,"az":187,"ss":0,"used":false},{"PRN":5,"el":40,"az":260,"ss":0,"used":false},{"PRN":26,"el":36,"az":297,"ss":0,"used":false},{"PRN":3,"el":27,"az":59,"ss":14,"used":false},{"PRN":19,"el":24,"az":73,"ss":14,"used":false},{"PRN":27,"el":19,"az":40,"ss":23,"used":false},{"PRN":10,"el":19,"az":202,"ss":0,"used":false},{"PRN":13,"el":15,"az":129,"ss":23,"used":false},{"PRN":21,"el":6,"az":345,"ss":0,"used":false},{"PRN":15,"el":4,"az":307,"ss":0,"used":false},{"PRN":79,"el":81,"az":336,"ss":0,"used":false},{"PRN":69,"el":50,"az":211,"ss":0,"used":false},{"PRN":70,"el":47,"az":307,"ss":0,"used":false},{"PRN":78,"el":33,"az":58,"ss":0,"used":false},{"PRN":80,"el":30,"az":251,"ss":0,"used":false},{"PRN":88,"el":24,"az":68,"ss":24,"used":false},{"PRN":87,"el":19,"az":15,"ss":17,"used":false},{"PRN":68,"el":7,"az":177,"ss":0,"used":false},{"PRN":71,"el":6,"az":339,"ss":0,"used":false},{"PRN":81,"el":3,"az":117,"ss":26,"used":false}]} $GPGGA,081421.000,,,,,0,0,,,M,,M,,*46 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081421.000,V,,,,,0.00,357.84,260514,,,N*54 $GPZDA,081421.000,26,05,2014,,*5E $GPGGA,081422.000,,,,,0,0,,,M,,M,,*45 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081422.000,V,,,,,0.00,8.60,260514,,,N*54 $GPZDA,081422.000,26,05,2014,,*5D $GPGGA,081423.000,,,,,0,0,,,M,,M,,*44 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081423.000,V,,,,,0.00,8.60,260514,,,N*55 $GPZDA,081423.000,26,05,2014,,*5C $GPGGA,081424.000,,,,,0,0,,,M,,M,,*43 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081424.000,V,,,,,0.00,8.60,260514,,,N*52 $GPZDA,081424.000,26,05,2014,,*5B $GPGGA,081425.000,,,,,0,0,,,M,,M,,*42 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081425.000,V,,,,,0.00,8.60,260514,,,N*53 $GPZDA,081425.000,26,05,2014,,*5A $GPGSV,3,1,12,08,88,068,,07,59,081,23,28,41,187,,05,40,260,*79 $GPGSV,3,2,12,26,37,297,,03,27,059,14,19,24,073,15,27,19,039,22*71 $GPGSV,3,3,12,10,19,202,,13,15,129,23,21,06,345,,15,04,307,*7D $GLGSV,3,1,10,79,81,336,,69,50,211,,70,47,307,,78,33,058,*6D $GLGSV,3,2,10,80,30,251,,88,24,068,25,87,19,015,16,68,07,177,*6B $GLGSV,3,3,10,71,06,339,,81,03,117,27*65 {"class":"SKY","vdop":12.28,"hdop":4.54,"pdop":13.09,"satellites":[{"PRN":8,"el":88,"az":68,"ss":0,"used":false},{"PRN":7,"el":59,"az":81,"ss":23,"used":false},{"PRN":28,"el":41,"az":187,"ss":0,"used":false},{"PRN":5,"el":40,"az":260,"ss":0,"used":false},{"PRN":26,"el":37,"az":297,"ss":0,"used":false},{"PRN":3,"el":27,"az":59,"ss":14,"used":false},{"PRN":19,"el":24,"az":73,"ss":15,"used":false},{"PRN":27,"el":19,"az":39,"ss":22,"used":false},{"PRN":10,"el":19,"az":202,"ss":0,"used":false},{"PRN":13,"el":15,"az":129,"ss":23,"used":false},{"PRN":21,"el":6,"az":345,"ss":0,"used":false},{"PRN":15,"el":4,"az":307,"ss":0,"used":false},{"PRN":79,"el":81,"az":336,"ss":0,"used":false},{"PRN":69,"el":50,"az":211,"ss":0,"used":false},{"PRN":70,"el":47,"az":307,"ss":0,"used":false},{"PRN":78,"el":33,"az":58,"ss":0,"used":false},{"PRN":80,"el":30,"az":251,"ss":0,"used":false},{"PRN":88,"el":24,"az":68,"ss":25,"used":false},{"PRN":87,"el":19,"az":15,"ss":16,"used":false},{"PRN":68,"el":7,"az":177,"ss":0,"used":false},{"PRN":71,"el":6,"az":339,"ss":0,"used":false},{"PRN":81,"el":3,"az":117,"ss":27,"used":false}]} $GPGGA,081426.000,,,,,0,0,,,M,,M,,*41 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081426.000,V,,,,,0.00,8.60,260514,,,N*50 $GPZDA,081426.000,26,05,2014,,*59 $GPGGA,081427.000,,,,,0,0,,,M,,M,,*40 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081427.000,V,,,,,0.00,8.60,260514,,,N*51 $GPZDA,081427.000,26,05,2014,,*58 $GPGGA,081428.000,,,,,0,0,,,M,,M,,*4F $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081428.000,V,,,,,0.00,8.60,260514,,,N*5E $GPZDA,081428.000,26,05,2014,,*57 $GPGGA,081429.000,,,,,0,0,,,M,,M,,*4E $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNGSA,A,1,,,,,,,,,,,,,,,*00 $GNRMC,081429.000,V,,,,,0.00,8.60,260514,,,N*5F $GPZDA,081429.000,26,05,2014,,*56 gpsd-3.15/test/daemon/bu353s4.log0000664000175000017500000001410612467341115014610 0ustar esresr# Name: GlobalSat BU-353-S4 # Chipset = SiRF-IV # Firmware = ?-GSD4e_4.0.4-P1_RPATCH.07-GS008-F-GPS-4R-1201128 01/12/2012 012 # Date = 2014-12-31 # Submitter = Paul Beard # Location = Hamilton, Waikato, 37.8S 175.3E $GPGGA,030719.000,3747.0873,S,17518.8938,E,1,08,1.1,59.9,M,23.7,M,,0000*7D $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030719.000,A,3747.0873,S,17518.8938,E,0.69,181.39,311214,,,A*7D $GPGGA,030720.000,3747.0875,S,17518.8938,E,1,08,1.1,59.8,M,23.7,M,,0000*70 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030720.000,A,3747.0875,S,17518.8938,E,1.15,181.39,311214,,,A*7B $GPGGA,030721.000,3747.0876,S,17518.8934,E,1,08,1.1,60.1,M,23.7,M,,0000*7D $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPGSV,3,1,12,17,72,207,32,28,59,095,31,06,35,347,25,01,29,132,23*7B $GPGSV,3,2,12,30,23,011,29,20,17,069,20,26,09,293,23,13,07,304,10*7C $GPGSV,3,3,12,11,12,132,04,08,38,008,,02,35,348,,03,14,091,*73 $GPRMC,030721.000,A,3747.0876,S,17518.8934,E,0.89,181.39,311214,,,A*71 $GPGGA,030722.000,3747.0877,S,17518.8933,E,1,08,1.1,60.1,M,23.7,M,,0000*78 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030722.000,A,3747.0877,S,17518.8933,E,0.12,181.39,311214,,,A*76 $GPGGA,030723.000,3747.0878,S,17518.8935,E,1,08,1.1,60.0,M,23.7,M,,0000*71 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030723.000,A,3747.0878,S,17518.8935,E,0.66,181.39,311214,,,A*7D $GPGGA,030724.000,3747.0878,S,17518.8936,E,1,08,1.1,60.1,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030724.000,A,3747.0878,S,17518.8936,E,0.32,181.39,311214,,,A*78 $GPGGA,030725.000,3747.0878,S,17518.8936,E,1,08,1.1,60.2,M,23.7,M,,0000*76 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030725.000,A,3747.0878,S,17518.8936,E,0.00,181.39,311214,,,A*78 $GPGGA,030726.000,3747.0877,S,17518.8936,E,1,08,1.1,60.6,M,23.7,M,,0000*7E $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPGSV,3,1,12,17,72,207,32,28,59,095,30,06,35,347,25,01,29,132,23*7A $GPGSV,3,2,12,30,23,011,29,20,17,069,20,26,09,293,23,13,07,304,10*7C $GPGSV,3,3,12,11,12,132,04,08,38,008,,02,35,348,,03,14,091,*73 $GPRMC,030726.000,A,3747.0877,S,17518.8936,E,0.59,181.39,311214,,,A*78 $GPGGA,030727.000,3747.0877,S,17518.8938,E,1,08,1.1,60.8,M,23.7,M,,0000*7F $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030727.000,A,3747.0877,S,17518.8938,E,0.29,181.39,311214,,,A*70 $GPGGA,030728.000,3747.0878,S,17518.8940,E,1,08,1.1,60.5,M,23.7,M,,0000*7D $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030728.000,A,3747.0878,S,17518.8940,E,0.52,181.39,311214,,,A*73 $GPGGA,030729.000,3747.0879,S,17518.8942,E,1,08,1.1,60.7,M,23.7,M,,0000*7D $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030729.000,A,3747.0879,S,17518.8942,E,0.48,181.39,311214,,,A*7A $GPGGA,030730.000,3747.0878,S,17518.8942,E,1,07,1.1,60.5,M,23.7,M,,0000*79 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030730.000,A,3747.0878,S,17518.8942,E,0.72,181.39,311214,,,A*7A $GPGGA,030731.000,3747.0877,S,17518.8941,E,1,07,1.1,60.5,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPGSV,3,1,12,17,71,207,32,28,59,095,30,06,36,347,25,01,29,132,23*7A $GPGSV,3,2,12,30,23,011,29,20,17,070,19,26,08,293,24,13,07,305,07*7F $GPGSV,3,3,12,08,38,008,,02,35,348,,03,15,091,,24,12,219,*7A $GPRMC,030731.000,A,3747.0877,S,17518.8941,E,0.47,181.39,311214,,,A*71 $GPGGA,030732.000,3747.0876,S,17518.8940,E,1,07,1.1,60.4,M,23.7,M,,0000*76 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030732.000,A,3747.0876,S,17518.8940,E,0.43,181.39,311214,,,A*76 $GPGGA,030733.000,3747.0876,S,17518.8941,E,1,07,1.1,60.2,M,23.7,M,,0000*70 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030733.000,A,3747.0876,S,17518.8941,E,0.23,181.39,311214,,,A*70 $GPGGA,030734.000,3747.0876,S,17518.8941,E,1,07,1.1,60.0,M,23.7,M,,0000*75 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030734.000,A,3747.0876,S,17518.8941,E,0.51,181.39,311214,,,A*72 $GPGGA,030735.000,3747.0876,S,17518.8941,E,1,07,1.1,60.0,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030735.000,A,3747.0876,S,17518.8941,E,0.00,181.39,311214,,,A*77 $GPGGA,030736.000,3747.0876,S,17518.8941,E,1,07,1.1,60.0,M,23.7,M,,0000*77 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPGSV,3,1,12,17,71,207,32,28,59,095,30,06,36,347,25,01,29,132,23*7A $GPGSV,3,2,12,30,23,011,29,20,17,070,19,26,08,293,24,13,07,305,04*7C $GPGSV,3,3,12,08,38,008,,02,35,348,,03,15,091,,24,12,219,*7A $GPRMC,030736.000,A,3747.0876,S,17518.8941,E,0.00,181.39,311214,,,A*74 $GPGGA,030737.000,3747.0877,S,17518.8942,E,1,07,1.1,60.0,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030737.000,A,3747.0877,S,17518.8942,E,0.25,181.39,311214,,,A*70 $GPGGA,030738.000,3747.0877,S,17518.8942,E,1,07,1.1,60.0,M,23.7,M,,0000*7B $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030738.000,A,3747.0877,S,17518.8942,E,0.00,181.39,311214,,,A*78 $GPGGA,030739.000,3747.0877,S,17518.8942,E,1,07,1.1,60.0,M,23.7,M,,0000*7A $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030739.000,A,3747.0877,S,17518.8942,E,0.00,181.39,311214,,,A*79 $GPGGA,030740.000,3747.0877,S,17518.8942,E,1,07,1.1,60.2,M,23.7,M,,0000*76 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030740.000,A,3747.0877,S,17518.8942,E,0.26,181.39,311214,,,A*73 $GPGGA,030741.000,3747.0877,S,17518.8941,E,1,07,1.1,60.2,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPGSV,3,1,12,17,71,207,31,28,59,095,30,06,36,347,26,01,29,132,23*7A $GPGSV,3,2,12,30,23,011,29,20,17,070,18,26,08,293,24,13,07,305,04*7D $GPGSV,3,3,12,08,38,008,,02,35,348,,03,15,091,,24,12,219,*7A $GPRMC,030741.000,A,3747.0877,S,17518.8941,E,0.00,181.39,311214,,,A*75 $GPGGA,030742.000,3747.0877,S,17518.8941,E,1,07,1.1,60.2,M,23.7,M,,0000*77 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030742.000,A,3747.0877,S,17518.8941,E,0.00,181.39,311214,,,A*76 $GPGGA,030743.000,3747.0877,S,17518.8941,E,1,07,1.1,60.2,M,23.7,M,,0000*76 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030743.000,A,3747.0877,S,17518.8941,E,0.00,181.39,311214,,,A*77 gpsd-3.15/test/daemon/bu353s4.log.chk0000664000175000017500000003560012467341115015356 0ustar esresr$GPGGA,030719.000,3747.0873,S,17518.8938,E,1,08,1.1,59.9,M,23.7,M,,0000*7D {"class":"TPV","mode":3,"lat":-37.784788333,"lon":175.314896667,"alt":59.900} $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 {"class":"TPV","mode":3,"lat":-37.784788333,"lon":175.314896667,"alt":59.900,"epv":34.500} $GPRMC,030719.000,A,3747.0873,S,17518.8938,E,0.69,181.39,311214,,,A*7D {"class":"TPV","mode":3,"time":"2014-12-31T03:07:19.000Z","ept":0.005,"lat":-37.784788333,"lon":175.314896667,"alt":59.900,"epv":34.500,"track":181.3900,"speed":0.355} $GPGGA,030720.000,3747.0875,S,17518.8938,E,1,08,1.1,59.8,M,23.7,M,,0000*70 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030720.000,A,3747.0875,S,17518.8938,E,1.15,181.39,311214,,,A*7B {"class":"TPV","mode":3,"time":"2014-12-31T03:07:20.000Z","ept":0.005,"lat":-37.784791667,"lon":175.314896667,"alt":59.800,"epv":34.500,"track":181.3900,"speed":0.592,"climb":-0.100,"epc":69.00} $GPGGA,030721.000,3747.0876,S,17518.8934,E,1,08,1.1,60.1,M,23.7,M,,0000*7D $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPGSV,3,1,12,17,72,207,32,28,59,095,31,06,35,347,25,01,29,132,23*7B $GPGSV,3,2,12,30,23,011,29,20,17,069,20,26,09,293,23,13,07,304,10*7C $GPGSV,3,3,12,11,12,132,04,08,38,008,,02,35,348,,03,14,091,*73 {"class":"SKY","xdop":0.63,"ydop":0.85,"vdop":1.50,"tdop":0.89,"hdop":1.10,"gdop":2.01,"pdop":1.80,"satellites":[{"PRN":17,"el":72,"az":207,"ss":32,"used":true},{"PRN":28,"el":59,"az":95,"ss":31,"used":true},{"PRN":6,"el":35,"az":347,"ss":25,"used":true},{"PRN":1,"el":29,"az":132,"ss":23,"used":true},{"PRN":30,"el":23,"az":11,"ss":29,"used":true},{"PRN":20,"el":17,"az":69,"ss":20,"used":true},{"PRN":26,"el":9,"az":293,"ss":23,"used":true},{"PRN":13,"el":7,"az":304,"ss":10,"used":true},{"PRN":11,"el":12,"az":132,"ss":4,"used":false},{"PRN":8,"el":38,"az":8,"ss":0,"used":false},{"PRN":2,"el":35,"az":348,"ss":0,"used":false},{"PRN":3,"el":14,"az":91,"ss":0,"used":false}]} $GPRMC,030721.000,A,3747.0876,S,17518.8934,E,0.89,181.39,311214,,,A*71 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:21.000Z","ept":0.005,"lat":-37.784793333,"lon":175.314890000,"alt":60.100,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.458,"climb":0.300,"epc":69.00} $GPGGA,030722.000,3747.0877,S,17518.8933,E,1,08,1.1,60.1,M,23.7,M,,0000*78 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030722.000,A,3747.0877,S,17518.8933,E,0.12,181.39,311214,,,A*76 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:22.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314888333,"alt":60.100,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.062,"climb":0.000,"eps":25.58,"epc":69.00} $GPGGA,030723.000,3747.0878,S,17518.8935,E,1,08,1.1,60.0,M,23.7,M,,0000*71 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030723.000,A,3747.0878,S,17518.8935,E,0.66,181.39,311214,,,A*7D {"class":"TPV","mode":3,"time":"2014-12-31T03:07:23.000Z","ept":0.005,"lat":-37.784796667,"lon":175.314891667,"alt":60.000,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.340,"climb":-0.100,"eps":25.58,"epc":69.00} $GPGGA,030724.000,3747.0878,S,17518.8936,E,1,08,1.1,60.1,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030724.000,A,3747.0878,S,17518.8936,E,0.32,181.39,311214,,,A*78 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:24.000Z","ept":0.005,"lat":-37.784796667,"lon":175.314893333,"alt":60.100,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.165,"climb":0.100,"eps":25.58,"epc":69.00} $GPGGA,030725.000,3747.0878,S,17518.8936,E,1,08,1.1,60.2,M,23.7,M,,0000*76 $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030725.000,A,3747.0878,S,17518.8936,E,0.00,181.39,311214,,,A*78 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:25.000Z","ept":0.005,"lat":-37.784796667,"lon":175.314893333,"alt":60.200,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.000,"climb":0.100,"eps":25.58,"epc":69.00} $GPGGA,030726.000,3747.0877,S,17518.8936,E,1,08,1.1,60.6,M,23.7,M,,0000*7E $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPGSV,3,1,12,17,72,207,32,28,59,095,30,06,35,347,25,01,29,132,23*7A $GPGSV,3,2,12,30,23,011,29,20,17,069,20,26,09,293,23,13,07,304,10*7C $GPGSV,3,3,12,11,12,132,04,08,38,008,,02,35,348,,03,14,091,*73 {"class":"SKY","xdop":0.63,"ydop":0.85,"vdop":1.50,"tdop":0.89,"hdop":1.10,"gdop":2.01,"pdop":1.80,"satellites":[{"PRN":17,"el":72,"az":207,"ss":32,"used":true},{"PRN":28,"el":59,"az":95,"ss":30,"used":true},{"PRN":6,"el":35,"az":347,"ss":25,"used":true},{"PRN":1,"el":29,"az":132,"ss":23,"used":true},{"PRN":30,"el":23,"az":11,"ss":29,"used":true},{"PRN":20,"el":17,"az":69,"ss":20,"used":true},{"PRN":26,"el":9,"az":293,"ss":23,"used":true},{"PRN":13,"el":7,"az":304,"ss":10,"used":true},{"PRN":11,"el":12,"az":132,"ss":4,"used":false},{"PRN":8,"el":38,"az":8,"ss":0,"used":false},{"PRN":2,"el":35,"az":348,"ss":0,"used":false},{"PRN":3,"el":14,"az":91,"ss":0,"used":false}]} $GPRMC,030726.000,A,3747.0877,S,17518.8936,E,0.59,181.39,311214,,,A*78 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:26.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314893333,"alt":60.600,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.304,"climb":0.400,"eps":25.58,"epc":69.00} $GPGGA,030727.000,3747.0877,S,17518.8938,E,1,08,1.1,60.8,M,23.7,M,,0000*7F $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030727.000,A,3747.0877,S,17518.8938,E,0.29,181.39,311214,,,A*70 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:27.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314896667,"alt":60.800,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.149,"climb":0.200,"eps":25.58,"epc":69.00} $GPGGA,030728.000,3747.0878,S,17518.8940,E,1,08,1.1,60.5,M,23.7,M,,0000*7D $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030728.000,A,3747.0878,S,17518.8940,E,0.52,181.39,311214,,,A*73 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:28.000Z","ept":0.005,"lat":-37.784796667,"lon":175.314900000,"alt":60.500,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.268,"climb":-0.300,"eps":25.58,"epc":69.00} $GPGGA,030729.000,3747.0879,S,17518.8942,E,1,08,1.1,60.7,M,23.7,M,,0000*7D $GPGSA,A,3,17,28,06,01,30,20,26,13,,,,,1.8,1.1,1.5*33 $GPRMC,030729.000,A,3747.0879,S,17518.8942,E,0.48,181.39,311214,,,A*7A {"class":"TPV","mode":3,"time":"2014-12-31T03:07:29.000Z","ept":0.005,"lat":-37.784798333,"lon":175.314903333,"alt":60.700,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.247,"climb":0.200,"eps":25.58,"epc":69.00} $GPGGA,030730.000,3747.0878,S,17518.8942,E,1,07,1.1,60.5,M,23.7,M,,0000*79 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030730.000,A,3747.0878,S,17518.8942,E,0.72,181.39,311214,,,A*7A {"class":"TPV","mode":3,"time":"2014-12-31T03:07:30.000Z","ept":0.005,"lat":-37.784796667,"lon":175.314903333,"alt":60.500,"epx":9.484,"epy":12.791,"epv":34.500,"track":181.3900,"speed":0.370,"climb":-0.200,"eps":25.58,"epc":69.00} $GPGGA,030731.000,3747.0877,S,17518.8941,E,1,07,1.1,60.5,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPGSV,3,1,12,17,71,207,32,28,59,095,30,06,36,347,25,01,29,132,23*7A $GPGSV,3,2,12,30,23,011,29,20,17,070,19,26,08,293,24,13,07,305,07*7F $GPGSV,3,3,12,08,38,008,,02,35,348,,03,15,091,,24,12,219,*7A {"class":"SKY","xdop":0.63,"ydop":0.85,"vdop":1.60,"tdop":0.89,"hdop":1.10,"gdop":2.01,"pdop":1.90,"satellites":[{"PRN":17,"el":71,"az":207,"ss":32,"used":true},{"PRN":28,"el":59,"az":95,"ss":30,"used":true},{"PRN":6,"el":36,"az":347,"ss":25,"used":true},{"PRN":1,"el":29,"az":132,"ss":23,"used":true},{"PRN":30,"el":23,"az":11,"ss":29,"used":true},{"PRN":20,"el":17,"az":70,"ss":19,"used":true},{"PRN":26,"el":8,"az":293,"ss":24,"used":true},{"PRN":13,"el":7,"az":305,"ss":7,"used":false},{"PRN":8,"el":38,"az":8,"ss":0,"used":false},{"PRN":2,"el":35,"az":348,"ss":0,"used":false},{"PRN":3,"el":15,"az":91,"ss":0,"used":false},{"PRN":24,"el":12,"az":219,"ss":0,"used":false}]} $GPRMC,030731.000,A,3747.0877,S,17518.8941,E,0.47,181.39,311214,,,A*71 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:31.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314901667,"alt":60.500,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.242,"climb":0.000,"eps":25.58,"epc":71.30} $GPGGA,030732.000,3747.0876,S,17518.8940,E,1,07,1.1,60.4,M,23.7,M,,0000*76 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030732.000,A,3747.0876,S,17518.8940,E,0.43,181.39,311214,,,A*76 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:32.000Z","ept":0.005,"lat":-37.784793333,"lon":175.314900000,"alt":60.400,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.221,"climb":-0.100,"eps":25.58,"epc":73.60} $GPGGA,030733.000,3747.0876,S,17518.8941,E,1,07,1.1,60.2,M,23.7,M,,0000*70 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030733.000,A,3747.0876,S,17518.8941,E,0.23,181.39,311214,,,A*70 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:33.000Z","ept":0.005,"lat":-37.784793333,"lon":175.314901667,"alt":60.200,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.118,"climb":-0.200,"eps":25.58,"epc":73.60} $GPGGA,030734.000,3747.0876,S,17518.8941,E,1,07,1.1,60.0,M,23.7,M,,0000*75 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030734.000,A,3747.0876,S,17518.8941,E,0.51,181.39,311214,,,A*72 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:34.000Z","ept":0.005,"lat":-37.784793333,"lon":175.314901667,"alt":60.000,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.262,"climb":-0.200,"eps":25.58,"epc":73.60} $GPGGA,030735.000,3747.0876,S,17518.8941,E,1,07,1.1,60.0,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030735.000,A,3747.0876,S,17518.8941,E,0.00,181.39,311214,,,A*77 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:35.000Z","ept":0.005,"lat":-37.784793333,"lon":175.314901667,"alt":60.000,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.000,"climb":0.000,"eps":25.58,"epc":73.60} $GPGGA,030736.000,3747.0876,S,17518.8941,E,1,07,1.1,60.0,M,23.7,M,,0000*77 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPGSV,3,1,12,17,71,207,32,28,59,095,30,06,36,347,25,01,29,132,23*7A $GPGSV,3,2,12,30,23,011,29,20,17,070,19,26,08,293,24,13,07,305,04*7C $GPGSV,3,3,12,08,38,008,,02,35,348,,03,15,091,,24,12,219,*7A {"class":"SKY","xdop":0.63,"ydop":0.85,"vdop":1.60,"tdop":0.89,"hdop":1.10,"gdop":2.01,"pdop":1.90,"satellites":[{"PRN":17,"el":71,"az":207,"ss":32,"used":true},{"PRN":28,"el":59,"az":95,"ss":30,"used":true},{"PRN":6,"el":36,"az":347,"ss":25,"used":true},{"PRN":1,"el":29,"az":132,"ss":23,"used":true},{"PRN":30,"el":23,"az":11,"ss":29,"used":true},{"PRN":20,"el":17,"az":70,"ss":19,"used":true},{"PRN":26,"el":8,"az":293,"ss":24,"used":true},{"PRN":13,"el":7,"az":305,"ss":4,"used":false},{"PRN":8,"el":38,"az":8,"ss":0,"used":false},{"PRN":2,"el":35,"az":348,"ss":0,"used":false},{"PRN":3,"el":15,"az":91,"ss":0,"used":false},{"PRN":24,"el":12,"az":219,"ss":0,"used":false}]} $GPRMC,030736.000,A,3747.0876,S,17518.8941,E,0.00,181.39,311214,,,A*74 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:36.000Z","ept":0.005,"lat":-37.784793333,"lon":175.314901667,"alt":60.000,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.000,"climb":0.000,"eps":25.58,"epc":73.60} $GPGGA,030737.000,3747.0877,S,17518.8942,E,1,07,1.1,60.0,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030737.000,A,3747.0877,S,17518.8942,E,0.25,181.39,311214,,,A*70 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:37.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314903333,"alt":60.000,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.129,"climb":0.000,"eps":25.58,"epc":73.60} $GPGGA,030738.000,3747.0877,S,17518.8942,E,1,07,1.1,60.0,M,23.7,M,,0000*7B $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030738.000,A,3747.0877,S,17518.8942,E,0.00,181.39,311214,,,A*78 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:38.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314903333,"alt":60.000,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.000,"climb":0.000,"eps":25.58,"epc":73.60} $GPGGA,030739.000,3747.0877,S,17518.8942,E,1,07,1.1,60.0,M,23.7,M,,0000*7A $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030739.000,A,3747.0877,S,17518.8942,E,0.00,181.39,311214,,,A*79 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:39.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314903333,"alt":60.000,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.000,"climb":0.000,"eps":25.58,"epc":73.60} $GPGGA,030740.000,3747.0877,S,17518.8942,E,1,07,1.1,60.2,M,23.7,M,,0000*76 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030740.000,A,3747.0877,S,17518.8942,E,0.26,181.39,311214,,,A*73 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:40.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314903333,"alt":60.200,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.134,"climb":0.200,"eps":25.58,"epc":73.60} $GPGGA,030741.000,3747.0877,S,17518.8941,E,1,07,1.1,60.2,M,23.7,M,,0000*74 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPGSV,3,1,12,17,71,207,31,28,59,095,30,06,36,347,26,01,29,132,23*7A $GPGSV,3,2,12,30,23,011,29,20,17,070,18,26,08,293,24,13,07,305,04*7D $GPGSV,3,3,12,08,38,008,,02,35,348,,03,15,091,,24,12,219,*7A {"class":"SKY","xdop":0.63,"ydop":0.85,"vdop":1.60,"tdop":0.89,"hdop":1.10,"gdop":2.01,"pdop":1.90,"satellites":[{"PRN":17,"el":71,"az":207,"ss":31,"used":true},{"PRN":28,"el":59,"az":95,"ss":30,"used":true},{"PRN":6,"el":36,"az":347,"ss":26,"used":true},{"PRN":1,"el":29,"az":132,"ss":23,"used":true},{"PRN":30,"el":23,"az":11,"ss":29,"used":true},{"PRN":20,"el":17,"az":70,"ss":18,"used":true},{"PRN":26,"el":8,"az":293,"ss":24,"used":true},{"PRN":13,"el":7,"az":305,"ss":4,"used":false},{"PRN":8,"el":38,"az":8,"ss":0,"used":false},{"PRN":2,"el":35,"az":348,"ss":0,"used":false},{"PRN":3,"el":15,"az":91,"ss":0,"used":false},{"PRN":24,"el":12,"az":219,"ss":0,"used":false}]} $GPRMC,030741.000,A,3747.0877,S,17518.8941,E,0.00,181.39,311214,,,A*75 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:41.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314901667,"alt":60.200,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.000,"climb":0.000,"eps":25.58,"epc":73.60} $GPGGA,030742.000,3747.0877,S,17518.8941,E,1,07,1.1,60.2,M,23.7,M,,0000*77 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030742.000,A,3747.0877,S,17518.8941,E,0.00,181.39,311214,,,A*76 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:42.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314901667,"alt":60.200,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.000,"climb":0.000,"eps":25.58,"epc":73.60} $GPGGA,030743.000,3747.0877,S,17518.8941,E,1,07,1.1,60.2,M,23.7,M,,0000*76 $GPGSA,A,3,17,28,06,01,30,20,26,,,,,,1.9,1.1,1.6*33 $GPRMC,030743.000,A,3747.0877,S,17518.8941,E,0.00,181.39,311214,,,A*77 {"class":"TPV","mode":3,"time":"2014-12-31T03:07:43.000Z","ept":0.005,"lat":-37.784795000,"lon":175.314901667,"alt":60.200,"epx":9.484,"epy":12.791,"epv":36.800,"track":181.3900,"speed":0.000,"climb":0.000,"eps":25.58,"epc":73.60} gpsd-3.15/test/daemon/ch-4701.log0000664000175000017500000001605012467341115014463 0ustar esresr# Name: NAVIOR-24 # Chipset: CH-4701 # Description: single board 24-channel OEM receiver, GLONASS/GPS systems. # Submitter: Viktar Palstsiuk # Date: 2008-05-29 # Location: Minsk, Belarus, 53N 27E $GPGGA,123433.000,5356.21442,N,02734.85952,E,1,04,07.2,251.9,M,26.0,M,,*67 $GPRMC,123434.000,A,5356.21440,N,02734.85946,E,00.00,252.7,290508,,,A*6B $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123434.000,5356.21444,N,02734.85947,E,1,04,07.2,251.9,M,26.0,M,,*62 $GPRMC,123435.000,A,5356.21440,N,02734.85945,E,00.00,252.7,290508,,,A*69 $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123435.000,5356.21444,N,02734.85946,E,1,04,07.2,251.9,M,26.0,M,,*62 $GPRMC,123436.000,A,5356.21439,N,02734.85943,E,00.00,252.7,290508,,,A*62 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123436.000,5356.21444,N,02734.85946,E,1,04,07.2,251.9,M,26.0,M,,*61 $GPRMC,123437.000,A,5356.21443,N,02734.85944,E,00.00,252.7,290508,,,A*69 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123437.000,5356.21447,N,02734.85947,E,1,04,07.2,251.8,M,26.0,M,,*63 $GPRMC,123438.000,A,5356.21444,N,02734.85943,E,00.00,252.7,290508,,,A*66 $PORZD,A,022.9*35 $GPGSV,3,1,11,02,13,248,,03,11,066,,07,76,087,36,13,48,101,50*71 $GPGSV,3,2,11,23,12,106,46,25,56,069,39,27,84,110,31,33,17,229,*7A $GPGSV,3,3,11,37,28,187,,39,28,183,,44,20,137,*44 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123438.000,5356.21448,N,02734.85946,E,1,04,07.2,251.8,M,26.0,M,,*62 $GPRMC,123439.000,A,5356.21445,N,02734.85942,E,00.00,252.7,290508,,,A*67 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123439.000,5356.21450,N,02734.85946,E,1,04,07.2,251.8,M,26.0,M,,*6A $GPRMC,123440.000,A,5356.21447,N,02734.85944,E,00.00,252.7,290508,,,A*6D $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123440.000,5356.21449,N,02734.85945,E,1,04,07.2,251.8,M,26.0,M,,*6F $GPRMC,123441.000,A,5356.21446,N,02734.85940,E,00.00,252.7,290508,,,A*69 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123441.000,5356.21449,N,02734.85942,E,1,04,07.2,251.8,M,26.0,M,,*69 $GPRMC,123442.000,A,5356.21445,N,02734.85940,E,00.00,252.7,290508,,,A*69 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123442.000,5356.21447,N,02734.85942,E,1,04,07.2,251.8,M,26.0,M,,*64 $GPRMC,123443.000,A,5356.21444,N,02734.85939,E,00.00,252.7,290508,,,A*67 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123443.000,5356.21448,N,02734.85942,E,1,04,07.2,251.8,M,26.0,M,,*6A $GPRMC,123444.000,A,5356.21446,N,02734.85940,E,00.00,252.7,290508,,,A*6C $PORZD,A,022.8*34 $GPGSV,3,1,11,02,13,248,,03,11,066,,07,76,087,35,13,48,101,50*72 $GPGSV,3,2,11,23,12,106,47,25,56,069,38,27,84,110,31,33,17,229,*7A $GPGSV,3,3,11,37,28,187,,39,28,183,,44,20,137,*44 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123444.000,5356.21450,N,02734.85942,E,1,04,07.2,251.8,M,26.0,M,,*64 $GPRMC,123445.000,A,5356.21446,N,02734.85938,E,00.00,252.7,290508,,,A*62 $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123445.000,5356.21450,N,02734.85941,E,1,04,07.2,251.8,M,26.0,M,,*66 $GPRMC,123446.000,A,5356.21447,N,02734.85936,E,00.00,252.7,290508,,,A*6E $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123446.000,5356.21451,N,02734.85943,E,1,04,07.2,251.9,M,26.0,M,,*67 $GPRMC,123447.000,A,5356.21448,N,02734.85938,E,00.00,252.7,290508,,,A*6E $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123447.000,5356.21452,N,02734.85942,E,1,04,07.2,251.9,M,26.0,M,,*64 $GPRMC,123448.000,A,5356.21449,N,02734.85942,E,00.00,252.7,290508,,,A*6D $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.7*0E $GPGGA,123448.000,5356.21453,N,02734.85943,E,1,04,07.2,251.9,M,26.0,M,,*6B $GPRMC,123449.000,A,5356.21448,N,02734.85937,E,00.00,252.7,290508,,,A*6F $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.7*0E $GPGGA,123449.000,5356.21453,N,02734.85941,E,1,04,07.2,251.9,M,26.0,M,,*68 $GPRMC,123450.000,A,5356.21449,N,02734.85935,E,00.00,252.7,290508,,,A*64 $PORZD,A,022.9*35 $GPGSV,3,1,11,02,13,248,,03,11,066,,07,76,087,35,13,48,101,51*73 $GPGSV,3,2,11,23,12,106,45,25,56,069,38,27,84,110,31,33,17,229,*78 $GPGSV,3,3,11,37,28,187,,39,28,183,,44,20,137,*44 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.7*0E $GPGGA,123450.000,5356.21454,N,02734.85939,E,1,04,07.2,251.9,M,26.0,M,,*68 $GPRMC,123451.000,A,5356.21452,N,02734.85936,E,00.00,252.7,290508,,,A*6C $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123451.000,5356.21456,N,02734.85939,E,1,04,07.2,251.9,M,26.0,M,,*6B $GPRMC,123452.000,A,5356.21451,N,02734.85935,E,00.00,252.7,290508,,,A*6F $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123452.000,5356.21456,N,02734.85938,E,1,04,07.2,251.9,M,26.0,M,,*69 $GPRMC,123453.000,A,5356.21453,N,02734.85933,E,00.00,252.7,290508,,,A*6A $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123453.000,5356.21458,N,02734.85934,E,1,04,07.2,251.8,M,26.0,M,,*6B $GPRMC,123454.000,A,5356.21455,N,02734.85930,E,00.00,252.7,290508,,,A*68 $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123454.000,5356.21459,N,02734.85931,E,1,04,07.2,251.7,M,26.0,M,,*67 $GPRMC,123455.000,A,5356.21455,N,02734.85927,E,00.00,252.7,290508,,,A*6F $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123455.000,5356.21461,N,02734.85930,E,1,04,07.2,251.6,M,26.0,M,,*6D $GPRMC,123456.000,A,5356.21458,N,02734.85926,E,00.00,252.7,290508,,,A*60 $PORZD,A,022.8*34 $GPGSV,3,1,11,02,13,247,,03,11,065,18,07,76,087,37,13,48,101,51*74 $GPGSV,3,2,11,23,12,106,45,25,55,069,38,27,83,108,32,33,17,229,*76 $GPGSV,3,3,11,37,28,187,,39,28,183,,44,20,137,*44 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123456.000,5356.21463,N,02734.85930,E,1,04,07.2,251.6,M,26.0,M,,*6C $GPRMC,123457.000,A,5356.21458,N,02734.85925,E,00.00,252.7,290508,,,A*62 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123457.000,5356.21464,N,02734.85931,E,1,04,07.2,251.5,M,26.0,M,,*68 $GPRMC,123458.000,A,5356.21463,N,02734.85930,E,00.00,252.7,290508,,,A*61 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123458.000,5356.21469,N,02734.85938,E,1,04,07.2,251.5,M,26.0,M,,*63 $GPRMC,123459.000,A,5356.21465,N,02734.85933,E,00.00,252.7,290508,,,A*65 $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123459.000,5356.21596,N,02734.86645,E,1,05,06.0,255.7,M,26.0,M,,*61 $GPRMC,123500.000,A,5356.21592,N,02734.86643,E,00.00,252.7,290508,,,A*6A $PORZD,A,021.5*3A $GPGSA,A,3,27,23,13,07,25,,,,,,,,,,,,,,,,,,,,07.9,06.0,05.2*0B gpsd-3.15/test/daemon/ch-4701.log.chk0000664000175000017500000003551712467341115015240 0ustar esresr$GPGGA,123433.000,5356.21442,N,02734.85952,E,1,04,07.2,251.9,M,26.0,M,,*67 {"class":"TPV","mode":3,"lat":53.936907000,"lon":27.580992000,"alt":251.900} $GPRMC,123434.000,A,5356.21440,N,02734.85946,E,00.00,252.7,290508,,,A*6B $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123434.000,5356.21444,N,02734.85947,E,1,04,07.2,251.9,M,26.0,M,,*62 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:34.000Z","ept":0.005,"lat":53.936907333,"lon":27.580991167,"alt":251.900,"track":252.7000,"speed":0.000,"climb":0.000} $GPRMC,123435.000,A,5356.21440,N,02734.85945,E,00.00,252.7,290508,,,A*69 $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123435.000,5356.21444,N,02734.85946,E,1,04,07.2,251.9,M,26.0,M,,*62 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:35.000Z","ept":0.005,"lat":53.936907333,"lon":27.580991000,"alt":251.900,"track":252.7000,"speed":0.000,"climb":0.000} $GPRMC,123436.000,A,5356.21439,N,02734.85943,E,00.00,252.7,290508,,,A*62 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123436.000,5356.21444,N,02734.85946,E,1,04,07.2,251.9,M,26.0,M,,*61 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:36.000Z","ept":0.005,"lat":53.936907333,"lon":27.580991000,"alt":251.900,"track":252.7000,"speed":0.000,"climb":0.000} $GPRMC,123437.000,A,5356.21443,N,02734.85944,E,00.00,252.7,290508,,,A*69 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123437.000,5356.21447,N,02734.85947,E,1,04,07.2,251.8,M,26.0,M,,*63 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:37.000Z","ept":0.005,"lat":53.936907833,"lon":27.580991167,"alt":251.800,"track":252.7000,"speed":0.000,"climb":0.000} $GPRMC,123438.000,A,5356.21444,N,02734.85943,E,00.00,252.7,290508,,,A*66 $PORZD,A,022.9*35 $GPGSV,3,1,11,02,13,248,,03,11,066,,07,76,087,36,13,48,101,50*71 $GPGSV,3,2,11,23,12,106,46,25,56,069,39,27,84,110,31,33,17,229,*7A $GPGSV,3,3,11,37,28,187,,39,28,183,,44,20,137,*44 {"class":"SKY","xdop":5.79,"ydop":4.54,"vdop":5.69,"tdop":7.20,"hdop":7.35,"gdop":11.76,"pdop":9.30,"satellites":[{"PRN":2,"el":13,"az":248,"ss":0,"used":false},{"PRN":3,"el":11,"az":66,"ss":0,"used":false},{"PRN":7,"el":76,"az":87,"ss":36,"used":true},{"PRN":13,"el":48,"az":101,"ss":50,"used":true},{"PRN":23,"el":12,"az":106,"ss":46,"used":true},{"PRN":25,"el":56,"az":69,"ss":39,"used":true},{"PRN":27,"el":84,"az":110,"ss":31,"used":false},{"PRN":120,"el":17,"az":229,"ss":0,"used":false},{"PRN":124,"el":28,"az":187,"ss":0,"used":false},{"PRN":126,"el":28,"az":183,"ss":0,"used":false},{"PRN":131,"el":20,"az":137,"ss":0,"used":false}]} $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123438.000,5356.21448,N,02734.85946,E,1,04,07.2,251.8,M,26.0,M,,*62 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:38.000Z","ept":0.005,"lat":53.936908000,"lon":27.580991000,"alt":251.800,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000} $GPRMC,123439.000,A,5356.21445,N,02734.85942,E,00.00,252.7,290508,,,A*67 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123439.000,5356.21450,N,02734.85946,E,1,04,07.2,251.8,M,26.0,M,,*6A {"class":"TPV","mode":3,"time":"2008-05-29T12:34:39.000Z","ept":0.005,"lat":53.936908333,"lon":27.580991000,"alt":251.800,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123440.000,A,5356.21447,N,02734.85944,E,00.00,252.7,290508,,,A*6D $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123440.000,5356.21449,N,02734.85945,E,1,04,07.2,251.8,M,26.0,M,,*6F {"class":"TPV","mode":3,"time":"2008-05-29T12:34:40.000Z","ept":0.005,"lat":53.936908167,"lon":27.580990833,"alt":251.800,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123441.000,A,5356.21446,N,02734.85940,E,00.00,252.7,290508,,,A*69 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123441.000,5356.21449,N,02734.85942,E,1,04,07.2,251.8,M,26.0,M,,*69 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:41.000Z","ept":0.005,"lat":53.936908167,"lon":27.580990333,"alt":251.800,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123442.000,A,5356.21445,N,02734.85940,E,00.00,252.7,290508,,,A*69 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123442.000,5356.21447,N,02734.85942,E,1,04,07.2,251.8,M,26.0,M,,*64 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:42.000Z","ept":0.005,"lat":53.936907833,"lon":27.580990333,"alt":251.800,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123443.000,A,5356.21444,N,02734.85939,E,00.00,252.7,290508,,,A*67 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123443.000,5356.21448,N,02734.85942,E,1,04,07.2,251.8,M,26.0,M,,*6A {"class":"TPV","mode":3,"time":"2008-05-29T12:34:43.000Z","ept":0.005,"lat":53.936908000,"lon":27.580990333,"alt":251.800,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123444.000,A,5356.21446,N,02734.85940,E,00.00,252.7,290508,,,A*6C $PORZD,A,022.8*34 $GPGSV,3,1,11,02,13,248,,03,11,066,,07,76,087,35,13,48,101,50*72 $GPGSV,3,2,11,23,12,106,47,25,56,069,38,27,84,110,31,33,17,229,*7A $GPGSV,3,3,11,37,28,187,,39,28,183,,44,20,137,*44 {"class":"SKY","xdop":5.79,"ydop":4.54,"vdop":5.69,"tdop":7.20,"hdop":7.35,"gdop":11.76,"pdop":9.30,"satellites":[{"PRN":2,"el":13,"az":248,"ss":0,"used":false},{"PRN":3,"el":11,"az":66,"ss":0,"used":false},{"PRN":7,"el":76,"az":87,"ss":35,"used":true},{"PRN":13,"el":48,"az":101,"ss":50,"used":true},{"PRN":23,"el":12,"az":106,"ss":47,"used":true},{"PRN":25,"el":56,"az":69,"ss":38,"used":true},{"PRN":27,"el":84,"az":110,"ss":31,"used":false},{"PRN":120,"el":17,"az":229,"ss":0,"used":false},{"PRN":124,"el":28,"az":187,"ss":0,"used":false},{"PRN":126,"el":28,"az":183,"ss":0,"used":false},{"PRN":131,"el":20,"az":137,"ss":0,"used":false}]} $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123444.000,5356.21450,N,02734.85942,E,1,04,07.2,251.8,M,26.0,M,,*64 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:44.000Z","ept":0.005,"lat":53.936908333,"lon":27.580990333,"alt":251.800,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123445.000,A,5356.21446,N,02734.85938,E,00.00,252.7,290508,,,A*62 $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123445.000,5356.21450,N,02734.85941,E,1,04,07.2,251.8,M,26.0,M,,*66 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:45.000Z","ept":0.005,"lat":53.936908333,"lon":27.580990167,"alt":251.800,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123446.000,A,5356.21447,N,02734.85936,E,00.00,252.7,290508,,,A*6E $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123446.000,5356.21451,N,02734.85943,E,1,04,07.2,251.9,M,26.0,M,,*67 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:46.000Z","ept":0.005,"lat":53.936908500,"lon":27.580990500,"alt":251.900,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123447.000,A,5356.21448,N,02734.85938,E,00.00,252.7,290508,,,A*6E $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.2,07.2,05.7*0D $GPGGA,123447.000,5356.21452,N,02734.85942,E,1,04,07.2,251.9,M,26.0,M,,*64 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:47.000Z","ept":0.005,"lat":53.936908667,"lon":27.580990333,"alt":251.900,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123448.000,A,5356.21449,N,02734.85942,E,00.00,252.7,290508,,,A*6D $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.7*0E $GPGGA,123448.000,5356.21453,N,02734.85943,E,1,04,07.2,251.9,M,26.0,M,,*6B {"class":"TPV","mode":3,"time":"2008-05-29T12:34:48.000Z","ept":0.005,"lat":53.936908833,"lon":27.580990500,"alt":251.900,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123449.000,A,5356.21448,N,02734.85937,E,00.00,252.7,290508,,,A*6F $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.7*0E $GPGGA,123449.000,5356.21453,N,02734.85941,E,1,04,07.2,251.9,M,26.0,M,,*68 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:49.000Z","ept":0.005,"lat":53.936908833,"lon":27.580990167,"alt":251.900,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123450.000,A,5356.21449,N,02734.85935,E,00.00,252.7,290508,,,A*64 $PORZD,A,022.9*35 $GPGSV,3,1,11,02,13,248,,03,11,066,,07,76,087,35,13,48,101,51*73 $GPGSV,3,2,11,23,12,106,45,25,56,069,38,27,84,110,31,33,17,229,*78 $GPGSV,3,3,11,37,28,187,,39,28,183,,44,20,137,*44 {"class":"SKY","xdop":5.79,"ydop":4.54,"vdop":5.69,"tdop":7.20,"hdop":7.35,"gdop":11.76,"pdop":9.30,"satellites":[{"PRN":2,"el":13,"az":248,"ss":0,"used":false},{"PRN":3,"el":11,"az":66,"ss":0,"used":false},{"PRN":7,"el":76,"az":87,"ss":35,"used":true},{"PRN":13,"el":48,"az":101,"ss":51,"used":true},{"PRN":23,"el":12,"az":106,"ss":45,"used":true},{"PRN":25,"el":56,"az":69,"ss":38,"used":true},{"PRN":27,"el":84,"az":110,"ss":31,"used":false},{"PRN":120,"el":17,"az":229,"ss":0,"used":false},{"PRN":124,"el":28,"az":187,"ss":0,"used":false},{"PRN":126,"el":28,"az":183,"ss":0,"used":false},{"PRN":131,"el":20,"az":137,"ss":0,"used":false}]} $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.7*0E $GPGGA,123450.000,5356.21454,N,02734.85939,E,1,04,07.2,251.9,M,26.0,M,,*68 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:50.000Z","ept":0.005,"lat":53.936909000,"lon":27.580989833,"alt":251.900,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123451.000,A,5356.21452,N,02734.85936,E,00.00,252.7,290508,,,A*6C $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123451.000,5356.21456,N,02734.85939,E,1,04,07.2,251.9,M,26.0,M,,*6B {"class":"TPV","mode":3,"time":"2008-05-29T12:34:51.000Z","ept":0.005,"lat":53.936909333,"lon":27.580989833,"alt":251.900,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123452.000,A,5356.21451,N,02734.85935,E,00.00,252.7,290508,,,A*6F $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123452.000,5356.21456,N,02734.85938,E,1,04,07.2,251.9,M,26.0,M,,*69 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:52.000Z","ept":0.005,"lat":53.936909333,"lon":27.580989667,"alt":251.900,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123453.000,A,5356.21453,N,02734.85933,E,00.00,252.7,290508,,,A*6A $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123453.000,5356.21458,N,02734.85934,E,1,04,07.2,251.8,M,26.0,M,,*6B {"class":"TPV","mode":3,"time":"2008-05-29T12:34:53.000Z","ept":0.005,"lat":53.936909667,"lon":27.580989000,"alt":251.800,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123454.000,A,5356.21455,N,02734.85930,E,00.00,252.7,290508,,,A*68 $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123454.000,5356.21459,N,02734.85931,E,1,04,07.2,251.7,M,26.0,M,,*67 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:54.000Z","ept":0.005,"lat":53.936909833,"lon":27.580988500,"alt":251.700,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123455.000,A,5356.21455,N,02734.85927,E,00.00,252.7,290508,,,A*6F $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123455.000,5356.21461,N,02734.85930,E,1,04,07.2,251.6,M,26.0,M,,*6D {"class":"TPV","mode":3,"time":"2008-05-29T12:34:55.000Z","ept":0.005,"lat":53.936910167,"lon":27.580988333,"alt":251.600,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123456.000,A,5356.21458,N,02734.85926,E,00.00,252.7,290508,,,A*60 $PORZD,A,022.8*34 $GPGSV,3,1,11,02,13,247,,03,11,065,18,07,76,087,37,13,48,101,51*74 $GPGSV,3,2,11,23,12,106,45,25,55,069,38,27,83,108,32,33,17,229,*76 $GPGSV,3,3,11,37,28,187,,39,28,183,,44,20,137,*44 {"class":"SKY","xdop":5.79,"ydop":4.54,"vdop":5.69,"tdop":7.20,"hdop":7.35,"gdop":11.76,"pdop":9.30,"satellites":[{"PRN":2,"el":13,"az":247,"ss":0,"used":false},{"PRN":3,"el":11,"az":65,"ss":18,"used":false},{"PRN":7,"el":76,"az":87,"ss":37,"used":true},{"PRN":13,"el":48,"az":101,"ss":51,"used":true},{"PRN":23,"el":12,"az":106,"ss":45,"used":true},{"PRN":25,"el":55,"az":69,"ss":38,"used":true},{"PRN":27,"el":83,"az":108,"ss":32,"used":false},{"PRN":120,"el":17,"az":229,"ss":0,"used":false},{"PRN":124,"el":28,"az":187,"ss":0,"used":false},{"PRN":126,"el":28,"az":183,"ss":0,"used":false},{"PRN":131,"el":20,"az":137,"ss":0,"used":false}]} $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123456.000,5356.21463,N,02734.85930,E,1,04,07.2,251.6,M,26.0,M,,*6C {"class":"TPV","mode":3,"time":"2008-05-29T12:34:56.000Z","ept":0.005,"lat":53.936910500,"lon":27.580988333,"alt":251.600,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123457.000,A,5356.21458,N,02734.85925,E,00.00,252.7,290508,,,A*62 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123457.000,5356.21464,N,02734.85931,E,1,04,07.2,251.5,M,26.0,M,,*68 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:57.000Z","ept":0.005,"lat":53.936910667,"lon":27.580988500,"alt":251.500,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123458.000,A,5356.21463,N,02734.85930,E,00.00,252.7,290508,,,A*61 $PORZD,A,022.9*35 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123458.000,5356.21469,N,02734.85938,E,1,04,07.2,251.5,M,26.0,M,,*63 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:58.000Z","ept":0.005,"lat":53.936911500,"lon":27.580989667,"alt":251.500,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123459.000,A,5356.21465,N,02734.85933,E,00.00,252.7,290508,,,A*65 $PORZD,A,022.8*34 $GPGSA,A,3,23,13,07,25,,,,,,,,,,,,,,,,,,,,,09.1,07.2,05.6*0F $GPGGA,123459.000,5356.21596,N,02734.86645,E,1,05,06.0,255.7,M,26.0,M,,*61 {"class":"TPV","mode":3,"time":"2008-05-29T12:34:59.000Z","ept":0.005,"lat":53.936932667,"lon":27.581107500,"alt":255.700,"epx":86.805,"epy":68.025,"epv":130.958,"track":252.7000,"speed":0.000,"climb":0.000,"eps":173.61} $GPRMC,123500.000,A,5356.21592,N,02734.86643,E,00.00,252.7,290508,,,A*6A $PORZD,A,021.5*3A $GPGSA,A,3,27,23,13,07,25,,,,,,,,,,,,,,,,,,,,07.9,06.0,05.2*0B gpsd-3.15/test/daemon/ch-4711.log0000664000175000017500000001046012467342657014477 0ustar esresr# Name: CH-4711 # Chipset: CH-4706, rev "m4706 03.10 02/06/09 | 12044 | M2002 05.01 02/06/09" # Description: Russian-made GPS mouse emitting GLONASS sentences. # Submitter: walkie@mail.ru # Date: 2009-12-05 # Location = Moscow, Russia, 55.71N 37.41E # Notes: Emits GLONASS sentences. Mostly 2D fixes but it loses # satellite lock near the end and the sentence mix changes. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GNGGA,135651.997,5543.0328,N,03724.7198,E,1,06,01.8,165.6,M,14.6,M,,*73 $GNRMC,135651.997,A,5543.0328,N,03724.7198,E,00.00,129.5,051209,,,A*79 $PORZD,A,024.2*38 $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,135652.997,5543.0328,N,03724.7198,E,1,06,01.8,165.6,M,14.6,M,,*70 $GNRMC,135652.997,A,5543.0328,N,03724.7198,E,00.00,129.5,051209,,,A*7A $PORZD,A,024.5*3F $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,135653.997,5543.0328,N,03724.7198,E,1,06,01.8,165.6,M,14.6,M,,*71 $GNRMC,135653.997,A,5543.0328,N,03724.7198,E,00.00,129.5,051209,,,A*7B $PORZD,A,024.4*3E $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 $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 $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 $GLRMC,135654.997,A,5543.0328,N,03724.7197,E,00.00,129.5,051209,,,A*71 $PORZD,A,027.0*39 $GLGSA,A,2,67,84,83,75,,,,,,,,,02.5,02.3,01.0*1C $GNGGA,135655.997,5543.0328,N,03724.7199,E,1,06,01.8,165.6,M,14.6,M,,*76 $GNRMC,135655.997,A,5543.0328,N,03724.7199,E,00.00,129.5,051209,,,A*7C $PORZD,A,024.5*3F $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,135656.997,5543.0329,N,03724.7201,E,1,06,01.8,165.6,M,14.6,M,,*76 $GNRMC,135656.997,A,5543.0329,N,03724.7201,E,00.00,129.5,051209,,,A*7C $PORZD,A,024.5*3F $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,135657.997,5543.0328,N,03724.7204,E,1,06,01.8,165.6,M,14.6,M,,*73 $GNRMC,135657.997,A,5543.0328,N,03724.7204,E,00.79,159.0,051209,,,A*75 $PORZD,A,025.7*3C $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 $GPGGA,135658.997,5543.0326,N,03724.7205,E,0,,,165.6,M,14.6,M,,*7D $GPRMC,135658.997,V,5543.0326,N,03724.7205,E,00.79,159.0,051209,,,N*73 $PORZD,V,026.0*2F $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135659.997,5543.0324,N,03724.7207,E,0,,,165.6,M,14.6,M,,*7C $GPRMC,135659.997,V,5543.0324,N,03724.7207,E,00.79,159.0,051209,,,N*72 $PORZD,V,029.8*28 $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,,21,16,107,,22,76,109,*70 $GPGSV,4,3,14,26,42,127,,27,13,055,,28,08,344,,33,11,238,*72 $GPGSV,4,4,14,37,25,199,,39,25,194,*7F $GLGSV,2,1,06,66,18,048,,67,72,050,,75,16,358,26,82,47,171,*65 $GLGSV,2,2,06,83,66,291,,84,17,325,22*6C $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGBS,135659.997,,,,,,,*55 $GPGGA,135700.997,5543.0322,N,03724.7208,E,0,,,165.6,M,14.6,M,,*78 $GPRMC,135700.997,V,5543.0322,N,03724.7208,E,00.79,159.0,051209,,,N*76 $PORZD,V,037.1*2E $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135701.997,5543.0320,N,03724.7210,E,0,,,165.6,M,14.6,M,,*72 $GPRMC,135701.997,V,5543.0320,N,03724.7210,E,00.79,159.0,051209,,,N*7C $PORZD,V,048.0*27 $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135702.997,5543.0318,N,03724.7211,E,0,,,165.6,M,14.6,M,,*7B $GPRMC,135702.997,V,5543.0318,N,03724.7211,E,00.79,159.0,051209,,,N*75 $PORZD,V,062.4*2B $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135703.997,5543.0316,N,03724.7212,E,0,,,165.6,M,14.6,M,,*77 $GPRMC,135703.997,V,5543.0316,N,03724.7212,E,00.79,159.0,051209,,,N*79 $PORZD,V,080.3*20 $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135704.997,5543.0314,N,03724.7214,E,0,,,165.6,M,14.6,M,,*74 $GPRMC,135704.997,V,5543.0314,N,03724.7214,E,00.79,159.0,051209,,,N*7A $PORZD,V,101.8*23 $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 gpsd-3.15/test/daemon/ch-4711.log.chk0000664000175000017500000002022212467342657015240 0ustar esresr$GNGGA,135651.997,5543.0328,N,03724.7198,E,1,06,01.8,165.6,M,14.6,M,,*73 {"class":"TPV","mode":3,"lat":55.717213333,"lon":37.411996667,"alt":165.600} $GNRMC,135651.997,A,5543.0328,N,03724.7198,E,00.00,129.5,051209,,,A*79 {"class":"TPV","mode":3,"time":"2009-12-05T13:56:51.997Z","ept":0.005,"lat":55.717213333,"lon":37.411996667,"alt":165.600,"track":129.5000,"speed":0.000} $PORZD,A,024.2*38 $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,135652.997,5543.0328,N,03724.7198,E,1,06,01.8,165.6,M,14.6,M,,*70 $GNRMC,135652.997,A,5543.0328,N,03724.7198,E,00.00,129.5,051209,,,A*7A {"class":"TPV","mode":3,"time":"2009-12-05T13:56:52.997Z","ept":0.005,"lat":55.717213333,"lon":37.411996667,"alt":165.600,"epv":20.700,"track":129.5000,"speed":0.000,"climb":0.000,"epc":41.40} $PORZD,A,024.5*3F $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,135653.997,5543.0328,N,03724.7198,E,1,06,01.8,165.6,M,14.6,M,,*71 $GNRMC,135653.997,A,5543.0328,N,03724.7198,E,00.00,129.5,051209,,,A*7B {"class":"TPV","mode":3,"time":"2009-12-05T13:56:53.997Z","ept":0.005,"lat":55.717213333,"lon":37.411996667,"alt":165.600,"epv":20.700,"track":129.5000,"speed":0.000,"climb":0.000,"epc":41.40} $PORZD,A,024.4*3E $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","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":120,"el":11,"az":238,"ss":0,"used":false},{"PRN":124,"el":25,"az":199,"ss":0,"used":false},{"PRN":126,"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","xdop":5.50,"ydop":23.74,"vdop":0.90,"tdop":30.05,"hdop":1.80,"gdop":47.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":120,"el":11,"az":238,"ss":0,"used":false},{"PRN":124,"el":25,"az":199,"ss":0,"used":false},{"PRN":126,"el":25,"az":194,"ss":0,"used":false},{"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 $GLRMC,135654.997,A,5543.0328,N,03724.7197,E,00.00,129.5,051209,,,A*71 {"class":"TPV","mode":3,"time":"2009-12-05T13:56:54.997Z","ept":0.005,"lat":55.717213333,"lon":37.411995000,"alt":165.600,"epx":82.456,"epy":356.032,"epv":20.700,"track":129.5000,"speed":0.000,"climb":0.000,"eps":712.06,"epc":41.40} $PORZD,A,027.0*39 $GLGSA,A,2,67,84,83,75,,,,,,,,,02.5,02.3,01.0*1C $GNGGA,135655.997,5543.0328,N,03724.7199,E,1,06,01.8,165.6,M,14.6,M,,*76 $GNRMC,135655.997,A,5543.0328,N,03724.7199,E,00.00,129.5,051209,,,A*7C {"class":"TPV","mode":3,"time":"2009-12-05T13:56:55.997Z","ept":0.005,"lat":55.717213333,"lon":37.411998333,"alt":165.600,"epx":82.456,"epy":356.032,"epv":23.000,"track":129.5000,"speed":0.000,"climb":0.000,"eps":712.06,"epc":43.70} $PORZD,A,024.5*3F $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,135656.997,5543.0329,N,03724.7201,E,1,06,01.8,165.6,M,14.6,M,,*76 $GNRMC,135656.997,A,5543.0329,N,03724.7201,E,00.00,129.5,051209,,,A*7C {"class":"TPV","mode":3,"time":"2009-12-05T13:56:56.997Z","ept":0.005,"lat":55.717215000,"lon":37.412001667,"alt":165.600,"epx":82.456,"epy":356.032,"epv":20.700,"track":129.5000,"speed":0.000,"climb":0.000,"eps":712.06,"epc":43.70} $PORZD,A,024.5*3F $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,135657.997,5543.0328,N,03724.7204,E,1,06,01.8,165.6,M,14.6,M,,*73 $GNRMC,135657.997,A,5543.0328,N,03724.7204,E,00.79,159.0,051209,,,A*75 {"class":"TPV","mode":3,"time":"2009-12-05T13:56:57.997Z","ept":0.005,"lat":55.717213333,"lon":37.412006667,"alt":165.600,"epx":82.456,"epy":356.032,"epv":20.700,"track":159.0000,"speed":0.406,"climb":0.000,"eps":712.06,"epc":41.40} $PORZD,A,025.7*3C $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 $GPGGA,135658.997,5543.0326,N,03724.7205,E,0,,,165.6,M,14.6,M,,*7D $GPRMC,135658.997,V,5543.0326,N,03724.7205,E,00.79,159.0,051209,,,N*73 $PORZD,V,026.0*2F $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135659.997,5543.0324,N,03724.7207,E,0,,,165.6,M,14.6,M,,*7C $GPRMC,135659.997,V,5543.0324,N,03724.7207,E,00.79,159.0,051209,,,N*72 $PORZD,V,029.8*28 $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,,21,16,107,,22,76,109,*70 $GPGSV,4,3,14,26,42,127,,27,13,055,,28,08,344,,33,11,238,*72 $GPGSV,4,4,14,37,25,199,,39,25,194,*7F $GLGSV,2,1,06,66,18,048,,67,72,050,,75,16,358,26,82,47,171,*65 $GLGSV,2,2,06,83,66,291,,84,17,325,22*6C {"class":"SKY","xdop":5.50,"ydop":23.74,"vdop":0.00,"tdop":30.05,"hdop":0.00,"gdop":47.46,"pdop":0.00,"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":0,"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":0,"used":false},{"PRN":28,"el":8,"az":344,"ss":0,"used":false},{"PRN":120,"el":11,"az":238,"ss":0,"used":false},{"PRN":124,"el":25,"az":199,"ss":0,"used":false},{"PRN":126,"el":25,"az":194,"ss":0,"used":false},{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":0,"used":false},{"PRN":75,"el":16,"az":358,"ss":26,"used":false},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":291,"ss":0,"used":false},{"PRN":84,"el":17,"az":325,"ss":22,"used":false}]} $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGBS,135659.997,,,,,,,*55 $GPGGA,135700.997,5543.0322,N,03724.7208,E,0,,,165.6,M,14.6,M,,*78 $GPRMC,135700.997,V,5543.0322,N,03724.7208,E,00.79,159.0,051209,,,N*76 $PORZD,V,037.1*2E $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135701.997,5543.0320,N,03724.7210,E,0,,,165.6,M,14.6,M,,*72 $GPRMC,135701.997,V,5543.0320,N,03724.7210,E,00.79,159.0,051209,,,N*7C $PORZD,V,048.0*27 $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135702.997,5543.0318,N,03724.7211,E,0,,,165.6,M,14.6,M,,*7B $GPRMC,135702.997,V,5543.0318,N,03724.7211,E,00.79,159.0,051209,,,N*75 $PORZD,V,062.4*2B $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135703.997,5543.0316,N,03724.7212,E,0,,,165.6,M,14.6,M,,*77 $GPRMC,135703.997,V,5543.0316,N,03724.7212,E,00.79,159.0,051209,,,N*79 $PORZD,V,080.3*20 $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 $GPGGA,135704.997,5543.0314,N,03724.7214,E,0,,,165.6,M,14.6,M,,*74 $GPRMC,135704.997,V,5543.0314,N,03724.7214,E,00.79,159.0,051209,,,N*7A $PORZD,V,101.8*23 $GPGSA,A,1,,,,,,,,,,,,,00.0,00.0,00.0*00 gpsd-3.15/test/daemon/com-1289.log0000664000175000017500000001371712467342657014702 0ustar esresr# Name: Eurotech Com-1289 # Chipset: Fastrax iTrax03 # Submitter: Simon Le Pape # Date: 2007-12-10 # Location: Rennes, Ile-etVilaine, France # Documentation says this chip emits ZDA and RMC in that order. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $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 $GPRMC,143748.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*0A $GPGGA,143748.77,4806.3731,N,00138.6217,W,1,10,1.1,42.2,M,48.5,M,,*4B $PFST,FOM,6*63 $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 $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 $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,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 $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 $PFST,FOM,6*63 $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,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,,110,50,31,60,230,46*4B $GPRMC,143751.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*02 $GPGGA,143751.77,4806.3731,N,00138.6217,W,1,10,1.3,42.2,M,48.5,M,,*41 $PFST,FOM,6*63 $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 $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 $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 $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 $PFST,FOM,3*66 $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 $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 $PFST,FOM,2*67 $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 $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 $PFST,FOM,3*66 $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 $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 $PFST,FOM,3*66 $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 $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 $PFST,FOM,5*60 $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 $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 $PFST,FOM,4*61 $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 $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 $PFST,FOM,4*61 $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 $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 $PFST,FOM,5*60 $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 $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 $PFST,FOM,7*62 gpsd-3.15/test/daemon/com-1289.log.chk0000664000175000017500000004144712467342657015447 0ustar esresr$GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30 {"class":"TPV","mode":3,"epv":27.600} $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","xdop":0.61,"ydop":0.91,"vdop":1.20,"tdop":0.86,"hdop":1.10,"gdop":1.88,"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","mode":2,"time":"2007-10-12T14:37:48.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"epx":9.117,"epy":13.708,"track":266.5000,"speed":0.000} $GPGGA,143748.77,4806.3731,N,00138.6217,W,1,10,1.1,42.2,M,48.5,M,,*4B {"class":"TPV","mode":3,"time":"2007-10-12T14:37:48.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.200,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000} $PFST,FOM,6*63 $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30 {"class":"TPV","mode":3,"time":"2007-10-12T14:37:48.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.200,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000,"climb":0.000} $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","xdop":0.61,"ydop":0.91,"vdop":1.20,"tdop":0.86,"hdop":1.10,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:49.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.200,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000,"eps":27.42} $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,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","xdop":0.61,"ydop":0.91,"vdop":1.20,"tdop":0.86,"hdop":1.10,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:50.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.200,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,6*63 $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,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 $GPRMC,143751.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*02 $GPGGA,143751.77,4806.3731,N,00138.6217,W,1,10,1.3,42.2,M,48.5,M,,*41 {"class":"TPV","mode":3,"time":"2007-10-12T14:37:51.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.200,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,6*63 $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","xdop":0.61,"ydop":0.91,"vdop":1.30,"tdop":0.86,"hdop":1.30,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:52.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":9.117,"epy":13.708,"epv":29.900,"track":266.5000,"speed":0.000,"eps":27.42} $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","xdop":0.61,"ydop":0.91,"vdop":1.20,"tdop":0.86,"hdop":1.10,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:53.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.200,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,3*66 $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","xdop":0.61,"ydop":0.91,"vdop":1.20,"tdop":0.86,"hdop":1.10,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:54.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,2*67 $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","xdop":0.61,"ydop":0.91,"vdop":1.20,"tdop":0.86,"hdop":1.10,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:55.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,3*66 $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","xdop":0.61,"ydop":0.91,"vdop":1.20,"tdop":0.86,"hdop":1.10,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:56.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,3*66 $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","xdop":0.61,"ydop":0.91,"vdop":1.20,"tdop":0.86,"hdop":1.10,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:57.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":9.117,"epy":13.708,"epv":27.600,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,5*60 $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","xdop":0.61,"ydop":0.91,"vdop":1.30,"tdop":0.86,"hdop":1.30,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:58.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":9.117,"epy":13.708,"epv":29.900,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,4*61 $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","xdop":0.61,"ydop":0.91,"vdop":1.30,"tdop":0.86,"hdop":1.30,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:37:59.770Z","ept":0.005,"lat":48.106218333,"lon":-1.643693333,"alt":42.100,"epx":9.117,"epy":13.708,"epv":29.900,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,4*61 $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","xdop":0.61,"ydop":0.91,"vdop":1.70,"tdop":0.86,"hdop":1.30,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:38:00.770Z","ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":9.117,"epy":13.708,"epv":39.100,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,5*60 $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","xdop":0.61,"ydop":0.91,"vdop":1.30,"tdop":0.86,"hdop":1.30,"gdop":1.88,"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","mode":3,"time":"2007-10-12T14:38:01.770Z","ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":9.117,"epy":13.708,"epv":29.900,"track":266.5000,"speed":0.000,"eps":27.42} $PFST,FOM,7*62 gpsd-3.15/test/daemon/eXplorist110.log0000664000175000017500000000613112506064205015706 0ustar esresr# Name: Magellan eXplorist 110 # Firmware Version: 1.62 # Chipset: unknown # Submitter: rickyconnell@gmail.com # Date: 2015-01-06 # Location: Sunnyvale, CA, USA $GPGLL,3728.0549,N,12213.8639,W,014413.076,N,V*50 $GPGGA,014413.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5A $GPRMC,014413.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0A $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014421.076,N,V*51 $GPGGA,014421.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5B $GPRMC,014421.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014422.076,N,V*52 $GPGGA,014422.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*58 $GPRMC,014422.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*08 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014423.076,N,V*53 $GPGGA,014423.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*59 $GPRMC,014423.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*09 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014424.076,N,V*54 $GPGLL,3728.0549,N,12213.8639,W,014426.076,N,V*56 $GPGGA,014426.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5C $GPRMC,014426.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014427.076,N,V*57 $GPGGA,014427.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5D $GPRMC,014427.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0D $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014428.076,N,V*58 $GPGGA,014428.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*52 $GPRMC,014428.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*02 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014429.076,N,V*59 $GPGLL,3728.0549,N,12213.8639,W,014430.076,N,V*51 $GPGGA,014430.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5B $GPRMC,014430.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014431.076,N,V*50 $GPGGA,014431.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5A $GPRMC,014431.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0A $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 gpsd-3.15/test/daemon/eXplorist110.log.chk0000664000175000017500000000572212506064205016457 0ustar esresr$GPGLL,3728.0549,N,12213.8639,W,014413.076,N,V*50 $GPGGA,014413.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5A $GPRMC,014413.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0A $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014421.076,N,V*51 $GPGGA,014421.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5B $GPRMC,014421.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014422.076,N,V*52 $GPGGA,014422.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*58 $GPRMC,014422.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*08 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014423.076,N,V*53 $GPGGA,014423.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*59 $GPRMC,014423.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*09 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014424.076,N,V*54 $GPGLL,3728.0549,N,12213.8639,W,014426.076,N,V*56 $GPGGA,014426.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5C $GPRMC,014426.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014427.076,N,V*57 $GPGGA,014427.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5D $GPRMC,014427.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0D $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014428.076,N,V*58 $GPGGA,014428.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*52 $GPRMC,014428.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*02 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014429.076,N,V*59 $GPGLL,3728.0549,N,12213.8639,W,014430.076,N,V*51 $GPGGA,014430.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5B $GPRMC,014430.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $GPGLL,3728.0549,N,12213.8639,W,014431.076,N,V*50 $GPGGA,014431.08,3728.0549,N,12213.8639,W,0,00,0.0,00019,M,-0028,M,,*5A $GPRMC,014431.76,V,3728.0549,N,12213.8639,W,0.00,0.0,150209,,*0A $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 gpsd-3.15/test/daemon/eXplorist210.log0000664000175000017500000000542512461156335015722 0ustar esresr# Name: Magellan eXplorist 210 # Chipset: unknown # Submitter: "Paul B van den Berg" # Date: 2006-05-20 # Location: Groningen, NL, 53.2N6.6E # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # mode V2.1 GSA # Lines up to but not including the first GPGLL are # `cat /dev/ttyACM0` at startup # Following lines are # `cat /dev/ttyACM0` stationary $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $PMGNST,01.75,3,F,816,11.1,+00000,20*5E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $PMGNST,01.75,3,F,816,11.1,+00000,20*5E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $PMGNST,01.75,3,F,822,11.2,+00000,20*5A $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $PMGNST,01.75,3,F,822,11.2,+00000,20*5A $GPGSV,3,1,12,09,76,287,,17,38,073,36,26,34,163,,05,33,230,*72 $GPGSV,3,2,12,29,27,161,,18,24,256,,22,24,299,,28,11,055,*73 $GPGSV,3,3,12,14,08,319,,11,03,017,,30,02,232,,24,00,084,*71 $PMGNST,01.75,3,F,822,11.2,-00673,20*5E # This device has some strange bug that causes it to emit three-digit # fractional parts on GPGLL timestamps: you can see one in the next line. # These produce spurious start-of-cycle events. $GPGLL,5313.2228,N,00634.4228,E,200619.295,A*35 $GPGGA,200619.30,5313.2228,N,00634.4228,E,1,05,2.6,00000,M,,,,*2C $GPRMC,200619.30,A,5313.2228,N,00634.4228,E,00.0,000.0,200506,00,W*59 $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 $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 $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 $GPGGA,200621.30,5313.2227,N,00634.4228,E,1,05,2.6,00000,M,,,,*28 $GPRMC,200621.30,A,5313.2227,N,00634.4228,E,00.0,000.0,200506,00,W*5D $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 $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 $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 gpsd-3.15/test/daemon/eXplorist210.log.chk0000664000175000017500000001223512467340617016467 0ustar esresr$GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $PMGNST,01.75,3,F,816,11.1,+00000,20*5E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $PMGNST,01.75,3,F,816,11.1,+00000,20*5E $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $PMGNST,01.75,3,F,822,11.2,+00000,20*5A $GPGSV,3,1,00,,,,,,,,,,,,,,,,*7B $GPGSV,3,2,00,,,,,,,,,,,,,,,,*78 $GPGSV,3,3,00,,,,,,,,,,,,,,,,*79 $PMGNST,01.75,3,F,822,11.2,+00000,20*5A $GPGSV,3,1,12,09,76,287,,17,38,073,36,26,34,163,,05,33,230,*72 $GPGSV,3,2,12,29,27,161,,18,24,256,,22,24,299,,28,11,055,*73 $GPGSV,3,3,12,14,08,319,,11,03,017,,30,02,232,,24,00,084,*71 {"class":"SKY","satellites":[{"PRN":9,"el":76,"az":287,"ss":0,"used":false},{"PRN":17,"el":38,"az":73,"ss":36,"used":false},{"PRN":26,"el":34,"az":163,"ss":0,"used":false},{"PRN":5,"el":33,"az":230,"ss":0,"used":false},{"PRN":29,"el":27,"az":161,"ss":0,"used":false},{"PRN":18,"el":24,"az":256,"ss":0,"used":false},{"PRN":22,"el":24,"az":299,"ss":0,"used":false},{"PRN":28,"el":11,"az":55,"ss":0,"used":false},{"PRN":14,"el":8,"az":319,"ss":0,"used":false},{"PRN":11,"el":3,"az":17,"ss":0,"used":false},{"PRN":30,"el":2,"az":232,"ss":0,"used":false},{"PRN":24,"el":0,"az":84,"ss":0,"used":false}]} $PMGNST,01.75,3,F,822,11.2,-00673,20*5E $GPGLL,5313.2228,N,00634.4228,E,200619.295,A*35 {"class":"TPV","mode":2,"lat":53.220380000,"lon":6.573713333} $GPGGA,200619.30,5313.2228,N,00634.4228,E,1,05,2.6,00000,M,,,,*2C {"class":"TPV","mode":3,"lat":53.220380000,"lon":6.573713333,"alt":0.000} $GPRMC,200619.30,A,5313.2228,N,00634.4228,E,00.0,000.0,200506,00,W*59 {"class":"TPV","mode":3,"time":"2006-05-20T20:06:19.300Z","ept":0.005,"lat":53.220380000,"lon":6.573713333,"alt":0.000,"track":0.0000,"speed":0.000} $GPGSA,A,3,26,05,22,09,18,,,,,,,,05.1,02.6,04.4*03 {"class":"TPV","mode":3,"time":"2006-05-20T20:06:19.300Z","ept":0.005,"lat":53.220380000,"lon":6.573713333,"alt":0.000,"epv":101.200,"track":0.0000,"speed":0.000,"climb":0.000} $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","xdop":1.62,"ydop":1.38,"vdop":4.40,"tdop":2.35,"hdop":2.60,"gdop":4.19,"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","mode":3,"time":"2006-05-20T20:06:20.300Z","ept":0.005,"lat":53.220380000,"lon":6.573713333,"alt":0.000,"epx":24.247,"epy":20.724,"epv":101.200,"track":0.0000,"speed":0.000,"climb":0.000,"eps":48.35} $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 $GPGGA,200621.30,5313.2227,N,00634.4228,E,1,05,2.6,00000,M,,,,*28 $GPRMC,200621.30,A,5313.2227,N,00634.4228,E,00.0,000.0,200506,00,W*5D {"class":"TPV","mode":3,"time":"2006-05-20T20:06:21.300Z","ept":0.005,"lat":53.220378333,"lon":6.573713333,"alt":0.000,"epx":24.247,"epy":20.724,"epv":98.900,"track":0.0000,"speed":0.000,"climb":0.000,"eps":48.64} $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","xdop":1.62,"ydop":1.38,"vdop":4.50,"tdop":2.35,"hdop":2.60,"gdop":4.19,"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","mode":3,"time":"2006-05-20T20:06:22.310Z","ept":0.005,"lat":53.220378333,"lon":6.573713333,"alt":0.000,"epx":24.247,"epy":20.724,"epv":103.500,"track":0.0000,"speed":0.000,"climb":0.000,"eps":48.25} $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 gpsd-3.15/test/daemon/et-332.log0000664000175000017500000001614012467342657014431 0ustar esresr# Name: ET-322 engine board from GlobalSat # Chipset: SiRF-III # Submitter: Val Schmidt # Date: 2010-04-25 # Location: Newark, DE # Transport: UDP # # The board lives inside a Gavia AUV , which was # placed in the parking log of a university laboratory for the capture # of this data. It was completely stationary. Also, this sample # contains strings that indicate the date. # # The contents of the Transport header tell the gpsd test framework to # ship the file to the subordinate gpsd via IP datagrams. The source # is passed in as a udp:// URL. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPZDA,153347.000,23,04,2010,,*57 $GPGGA,153347.000,3940.6986,N,07544.9356,W,1,09,1.3,75.2,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153347.000,A,3940.6986,N,07544.9356,W,0.12,87.21,230410,,*29 $GPVTG,87.21,T,,M,0.12,N,0.2,K*5D $GPZDA,153348.000,23,04,2010,,*58 $GPGGA,153348.000,3940.6986,N,07544.9356,W,1,09,1.3,75.0,M,-33.8,M,,0000*5E $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153348.000,A,3940.6986,N,07544.9356,W,0.12,82.56,230410,,*23 $GPVTG,82.56,T,,M,0.12,N,0.2,K*58 $GPZDA,153349.000,23,04,2010,,*59 $GPGGA,153349.000,3940.6986,N,07544.9357,W,1,09,1.3,74.6,M,-33.8,M,,0000*59 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153349.000,A,3940.6986,N,07544.9357,W,0.09,115.18,230410,,*1C $GPVTG,115.18,T,,M,0.09,N,0.2,K*67 $GPZDA,153350.000,23,04,2010,,*51 $GPGGA,153350.000,3940.6986,N,07544.9357,W,1,09,1.3,74.4,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPGSV,3,1,12,26,82,270,40,21,73,256,40,24,66,289,38,18,58,312,45*7E $GPGSV,3,2,12,27,51,116,44,15,47,048,40,09,46,136,40,22,26,291,22*76 $GPGSV,3,3,12,06,13,303,28,03,06,312,,29,06,199,20,05,05,096,25*77 + 6: 28 (.....) + 9: 40 (........) +15: 40 (........) +21: 40 (........) +24: 38 (.......) +26: 40 (........) +27: 44 (........) +29: 20 (....) $GPRMC,153350.000,A,3940.6986,N,07544.9357,W,0.09,87.19,230410,,*2F $GPVTG,87.19,T,,M,0.09,N,0.2,K*5C $GPZDA,153351.000,23,04,2010,,*50 $GPGGA,153351.000,3940.6985,N,07544.9358,W,1,09,1.3,74.1,M,-33.8,M,,0000*5B $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153351.000,A,3940.6985,N,07544.9358,W,0.09,91.11,230410,,*2D $GPVTG,91.11,T,,M,0.09,N,0.2,K*53 $GPZDA,153352.000,23,04,2010,,*53 $GPGGA,153352.000,3940.6985,N,07544.9358,W,1,09,1.3,73.9,M,-33.8,M,,0000*57 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153352.000,A,3940.6985,N,07544.9358,W,0.07,136.11,230410,,*1C $GPVTG,136.11,T,,M,0.07,N,0.1,K*62 $GPZDA,153353.000,23,04,2010,,*52 $GPGGA,153353.000,3940.6985,N,07544.9358,W,1,09,1.3,74.0,M,-33.8,M,,0000*58 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153353.000,A,3940.6985,N,07544.9358,W,0.10,73.57,230410,,*29 $GPVTG,73.57,T,,M,0.10,N,0.2,K*55 $GPZDA,153354.000,23,04,2010,,*55 $GPGGA,153354.000,3940.6985,N,07544.9358,W,1,09,1.3,73.9,M,-33.8,M,,0000*51 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153354.000,A,3940.6985,N,07544.9358,W,0.06,86.02,230410,,*23 $GPVTG,86.02,T,,M,0.06,N,0.1,K*5B $GPZDA,153355.000,23,04,2010,,*54 $GPGGA,153355.000,3940.6985,N,07544.9358,W,1,09,1.3,73.9,M,-33.8,M,,0000*50 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPGSV,3,1,12,26,82,270,40,21,73,256,40,24,66,289,38,18,58,312,45*7E $GPGSV,3,2,12,27,51,116,44,15,47,048,40,09,46,136,40,22,26,291,19*7E $GPGSV,3,3,12,06,13,303,,03,06,312,10,29,06,199,23,05,05,096,25*7F + 3: 10 (..) -( 6: 28 (.....)) 9: 40 (........) 15: 40 (........) 21: 40 (........) 24: 38 (.......) 26: 40 (........) 27: 44 (........) 29: 20 (....) $GPRMC,153355.000,A,3940.6985,N,07544.9358,W,0.11,71.30,230410,,*2D $GPVTG,71.30,T,,M,0.11,N,0.2,K*57 $GPZDA,153356.000,23,04,2010,,*57 $GPGGA,153356.000,3940.6985,N,07544.9358,W,1,09,1.3,73.9,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153356.000,A,3940.6985,N,07544.9358,W,0.04,127.06,230410,,*1D $GPVTG,127.06,T,,M,0.04,N,0.1,K*67 $GPZDA,153357.000,23,04,2010,,*56 $GPGGA,153357.000,3940.6985,N,07544.9358,W,1,09,1.3,73.7,M,-33.8,M,,0000*5C $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153357.000,A,3940.6985,N,07544.9358,W,0.09,191.66,230410,,*1A $GPVTG,191.66,T,,M,0.09,N,0.2,K*62 $GPZDA,153358.000,23,04,2010,,*59 $GPGGA,153358.000,3940.6985,N,07544.9358,W,1,09,1.3,73.7,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153358.000,A,3940.6985,N,07544.9358,W,0.05,118.29,230410,,*13 $GPVTG,118.29,T,,M,0.05,N,0.1,K*67 $GPZDA,153359.000,23,04,2010,,*58 $GPGGA,153359.000,3940.6985,N,07544.9359,W,1,09,1.3,73.2,M,-33.8,M,,0000*56 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153359.000,A,3940.6985,N,07544.9359,W,0.12,206.85,230410,,*1F $GPVTG,206.85,T,,M,0.12,N,0.2,K*68 $GPZDA,153400.000,23,04,2010,,*53 $GPGGA,153400.000,3940.6985,N,07544.9359,W,1,09,1.3,72.9,M,-33.8,M,,0000*57 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPGSV,3,1,12,26,82,270,39,21,73,256,39,24,66,289,39,18,58,312,45*7F $GPGSV,3,2,12,27,51,116,43,15,47,048,30,09,46,136,42,22,26,291,14*71 $GPGSV,3,3,12,06,13,303,27,03,06,312,,29,06,199,22,05,05,096,25*7A -( 3: 10 (..)) + 6: 27 (.....) 9: 40 (........) 15: 40 (........) 21: 40 (........) 24: 38 (.......) 26: 40 (........) 27: 44 (........) 29: 23 (....) $GPRMC,153400.000,A,3940.6985,N,07544.9359,W,0.19,205.81,230410,,*18 $GPVTG,205.81,T,,M,0.19,N,0.3,K*65 $GPZDA,153401.000,23,04,2010,,*52 $GPGGA,153401.000,3940.6985,N,07544.9360,W,1,09,1.3,72.6,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153401.000,A,3940.6985,N,07544.9360,W,0.24,45.90,230410,,*2B $GPVTG,45.90,T,,M,0.24,N,0.4,K*5A $GPZDA,153402.000,23,04,2010,,*51 $GPGGA,153402.000,3940.6985,N,07544.9360,W,1,09,1.3,72.4,M,-33.8,M,,0000*52 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153402.000,A,3940.6985,N,07544.9360,W,0.14,217.87,230410,,*18 $GPVTG,217.87,T,,M,0.14,N,0.3,K*6D $GPZDA,153403.000,23,04,2010,,*50 $GPGGA,153403.000,3940.6985,N,07544.9360,W,1,09,1.3,72.3,M,-33.8,M,,0000*54 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153403.000,A,3940.6985,N,07544.9360,W,0.17,48.77,230410,,*2D $GPVTG,48.77,T,,M,0.17,N,0.3,K*59 $GPZDA,153404.000,23,04,2010,,*57 $GPGGA,153404.000,3940.6985,N,07544.9360,W,1,09,1.3,72.3,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153404.000,A,3940.6985,N,07544.9360,W,0.12,198.25,230410,,*14 $GPVTG,198.25,T,,M,0.12,N,0.2,K*66 $GPZDA,153405.000,23,04,2010,,*56 $GPGGA,153405.000,3940.6985,N,07544.9360,W,1,09,1.3,72.4,M,-33.8,M,,0000*55 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPGSV,3,1,12,26,82,270,39,21,73,256,38,24,66,289,39,18,58,312,44*7F $GPGSV,3,2,12,27,51,116,43,15,47,048,37,09,46,136,41,22,26,291,11*70 $GPGSV,3,3,12,06,13,303,28,03,06,312,,29,06,199,23,05,05,096,25*74 6: 27 (.....) 9: 42 (........) 15: 30 (......) 21: 39 (.......) 24: 39 (.......) 26: 39 (.......) 27: 43 (........) 29: 22 (....) $GPRMC,153405.000,A,3940.6985,N,07544.9360,W,0.21,205.69,230410,,*1A $GPVTG,205.69,T,,M,0.21,N,0.4,K*6F gpsd-3.15/test/daemon/et-332.log.chk0000664000175000017500000003074212467342657015201 0ustar esresr$GPZDA,153347.000,23,04,2010,,*57 $GPGGA,153347.000,3940.6986,N,07544.9356,W,1,09,1.3,75.2,M,-33.8,M,,0000*53 {"class":"TPV","mode":3,"time":"2010-04-23T15:33:47.000Z","ept":0.005,"lat":39.678310000,"lon":-75.748926667,"alt":75.200} $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 {"class":"TPV","mode":3,"time":"2010-04-23T15:33:47.000Z","ept":0.005,"lat":39.678310000,"lon":-75.748926667,"alt":75.200,"epv":32.200,"speed":0.000,"climb":0.000} $GPRMC,153347.000,A,3940.6986,N,07544.9356,W,0.12,87.21,230410,,*29 {"class":"TPV","mode":3,"time":"2010-04-23T15:33:47.000Z","ept":0.005,"lat":39.678310000,"lon":-75.748926667,"alt":75.200,"epv":32.200,"track":87.2100,"speed":0.062,"climb":0.000} $GPVTG,87.21,T,,M,0.12,N,0.2,K*5D $GPZDA,153348.000,23,04,2010,,*58 $GPGGA,153348.000,3940.6986,N,07544.9356,W,1,09,1.3,75.0,M,-33.8,M,,0000*5E $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153348.000,A,3940.6986,N,07544.9356,W,0.12,82.56,230410,,*23 {"class":"TPV","mode":3,"time":"2010-04-23T15:33:48.000Z","ept":0.005,"lat":39.678310000,"lon":-75.748926667,"alt":75.000,"epv":32.200,"track":82.5600,"speed":0.062,"climb":0.000} $GPVTG,82.56,T,,M,0.12,N,0.2,K*58 $GPZDA,153349.000,23,04,2010,,*59 $GPGGA,153349.000,3940.6986,N,07544.9357,W,1,09,1.3,74.6,M,-33.8,M,,0000*59 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153349.000,A,3940.6986,N,07544.9357,W,0.09,115.18,230410,,*1C {"class":"TPV","mode":3,"time":"2010-04-23T15:33:49.000Z","ept":0.005,"lat":39.678310000,"lon":-75.748928333,"alt":74.600,"epv":32.200,"track":115.1800,"speed":0.046,"climb":0.000} $GPVTG,115.18,T,,M,0.09,N,0.2,K*67 $GPZDA,153350.000,23,04,2010,,*51 $GPGGA,153350.000,3940.6986,N,07544.9357,W,1,09,1.3,74.4,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPGSV,3,1,12,26,82,270,40,21,73,256,40,24,66,289,38,18,58,312,45*7E $GPGSV,3,2,12,27,51,116,44,15,47,048,40,09,46,136,40,22,26,291,22*76 $GPGSV,3,3,12,06,13,303,28,03,06,312,,29,06,199,20,05,05,096,25*77 {"class":"SKY","xdop":0.77,"ydop":1.02,"vdop":1.40,"tdop":1.11,"hdop":1.30,"gdop":2.19,"pdop":1.90,"satellites":[{"PRN":26,"el":82,"az":270,"ss":40,"used":true},{"PRN":21,"el":73,"az":256,"ss":40,"used":true},{"PRN":24,"el":66,"az":289,"ss":38,"used":true},{"PRN":18,"el":58,"az":312,"ss":45,"used":true},{"PRN":27,"el":51,"az":116,"ss":44,"used":true},{"PRN":15,"el":47,"az":48,"ss":40,"used":true},{"PRN":9,"el":46,"az":136,"ss":40,"used":true},{"PRN":22,"el":26,"az":291,"ss":22,"used":false},{"PRN":6,"el":13,"az":303,"ss":28,"used":false},{"PRN":3,"el":6,"az":312,"ss":0,"used":false},{"PRN":29,"el":6,"az":199,"ss":20,"used":true},{"PRN":5,"el":5,"az":96,"ss":25,"used":true}]} $GPRMC,153350.000,A,3940.6986,N,07544.9357,W,0.09,87.19,230410,,*2F {"class":"TPV","mode":3,"time":"2010-04-23T15:33:50.000Z","ept":0.005,"lat":39.678310000,"lon":-75.748928333,"alt":74.400,"epx":11.511,"epy":15.333,"epv":32.200,"track":87.1900,"speed":0.046,"climb":0.000} $GPVTG,87.19,T,,M,0.09,N,0.2,K*5C $GPZDA,153351.000,23,04,2010,,*50 $GPGGA,153351.000,3940.6985,N,07544.9358,W,1,09,1.3,74.1,M,-33.8,M,,0000*5B $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153351.000,A,3940.6985,N,07544.9358,W,0.09,91.11,230410,,*2D {"class":"TPV","mode":3,"time":"2010-04-23T15:33:51.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748930000,"alt":74.100,"epx":11.511,"epy":15.333,"epv":32.200,"track":91.1100,"speed":0.046,"climb":0.000} $GPVTG,91.11,T,,M,0.09,N,0.2,K*53 $GPZDA,153352.000,23,04,2010,,*53 $GPGGA,153352.000,3940.6985,N,07544.9358,W,1,09,1.3,73.9,M,-33.8,M,,0000*57 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153352.000,A,3940.6985,N,07544.9358,W,0.07,136.11,230410,,*1C {"class":"TPV","mode":3,"time":"2010-04-23T15:33:52.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748930000,"alt":73.900,"epx":11.511,"epy":15.333,"epv":32.200,"track":136.1100,"speed":0.036,"climb":0.000} $GPVTG,136.11,T,,M,0.07,N,0.1,K*62 $GPZDA,153353.000,23,04,2010,,*52 $GPGGA,153353.000,3940.6985,N,07544.9358,W,1,09,1.3,74.0,M,-33.8,M,,0000*58 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153353.000,A,3940.6985,N,07544.9358,W,0.10,73.57,230410,,*29 {"class":"TPV","mode":3,"time":"2010-04-23T15:33:53.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748930000,"alt":74.000,"epx":11.511,"epy":15.333,"epv":32.200,"track":73.5700,"speed":0.051,"climb":0.000} $GPVTG,73.57,T,,M,0.10,N,0.2,K*55 $GPZDA,153354.000,23,04,2010,,*55 $GPGGA,153354.000,3940.6985,N,07544.9358,W,1,09,1.3,73.9,M,-33.8,M,,0000*51 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153354.000,A,3940.6985,N,07544.9358,W,0.06,86.02,230410,,*23 {"class":"TPV","mode":3,"time":"2010-04-23T15:33:54.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748930000,"alt":73.900,"epx":11.511,"epy":15.333,"epv":32.200,"track":86.0200,"speed":0.031,"climb":0.000} $GPVTG,86.02,T,,M,0.06,N,0.1,K*5B $GPZDA,153355.000,23,04,2010,,*54 $GPGGA,153355.000,3940.6985,N,07544.9358,W,1,09,1.3,73.9,M,-33.8,M,,0000*50 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPGSV,3,1,12,26,82,270,40,21,73,256,40,24,66,289,38,18,58,312,45*7E $GPGSV,3,2,12,27,51,116,44,15,47,048,40,09,46,136,40,22,26,291,19*7E $GPGSV,3,3,12,06,13,303,,03,06,312,10,29,06,199,23,05,05,096,25*7F {"class":"SKY","xdop":0.77,"ydop":1.02,"vdop":1.40,"tdop":1.11,"hdop":1.30,"gdop":2.19,"pdop":1.90,"satellites":[{"PRN":26,"el":82,"az":270,"ss":40,"used":true},{"PRN":21,"el":73,"az":256,"ss":40,"used":true},{"PRN":24,"el":66,"az":289,"ss":38,"used":true},{"PRN":18,"el":58,"az":312,"ss":45,"used":true},{"PRN":27,"el":51,"az":116,"ss":44,"used":true},{"PRN":15,"el":47,"az":48,"ss":40,"used":true},{"PRN":9,"el":46,"az":136,"ss":40,"used":true},{"PRN":22,"el":26,"az":291,"ss":19,"used":false},{"PRN":6,"el":13,"az":303,"ss":0,"used":false},{"PRN":3,"el":6,"az":312,"ss":10,"used":false},{"PRN":29,"el":6,"az":199,"ss":23,"used":true},{"PRN":5,"el":5,"az":96,"ss":25,"used":true}]} $GPRMC,153355.000,A,3940.6985,N,07544.9358,W,0.11,71.30,230410,,*2D {"class":"TPV","mode":3,"time":"2010-04-23T15:33:55.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748930000,"alt":73.900,"epx":11.511,"epy":15.333,"epv":32.200,"track":71.3000,"speed":0.057,"climb":0.000} $GPVTG,71.30,T,,M,0.11,N,0.2,K*57 $GPZDA,153356.000,23,04,2010,,*57 $GPGGA,153356.000,3940.6985,N,07544.9358,W,1,09,1.3,73.9,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153356.000,A,3940.6985,N,07544.9358,W,0.04,127.06,230410,,*1D {"class":"TPV","mode":3,"time":"2010-04-23T15:33:56.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748930000,"alt":73.900,"epx":11.511,"epy":15.333,"epv":32.200,"track":127.0600,"speed":0.021,"climb":0.000} $GPVTG,127.06,T,,M,0.04,N,0.1,K*67 $GPZDA,153357.000,23,04,2010,,*56 $GPGGA,153357.000,3940.6985,N,07544.9358,W,1,09,1.3,73.7,M,-33.8,M,,0000*5C $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153357.000,A,3940.6985,N,07544.9358,W,0.09,191.66,230410,,*1A {"class":"TPV","mode":3,"time":"2010-04-23T15:33:57.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748930000,"alt":73.700,"epx":11.511,"epy":15.333,"epv":32.200,"track":191.6600,"speed":0.046,"climb":0.000} $GPVTG,191.66,T,,M,0.09,N,0.2,K*62 $GPZDA,153358.000,23,04,2010,,*59 $GPGGA,153358.000,3940.6985,N,07544.9358,W,1,09,1.3,73.7,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153358.000,A,3940.6985,N,07544.9358,W,0.05,118.29,230410,,*13 {"class":"TPV","mode":3,"time":"2010-04-23T15:33:58.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748930000,"alt":73.700,"epx":11.511,"epy":15.333,"epv":32.200,"track":118.2900,"speed":0.026,"climb":0.000} $GPVTG,118.29,T,,M,0.05,N,0.1,K*67 $GPZDA,153359.000,23,04,2010,,*58 $GPGGA,153359.000,3940.6985,N,07544.9359,W,1,09,1.3,73.2,M,-33.8,M,,0000*56 $GPRMC,153359.000,A,3940.6985,N,07544.9359,W,0.12,206.85,230410,,*1F {"class":"TPV","mode":3,"time":"2010-04-23T15:33:59.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748931667,"alt":73.200,"epx":11.511,"epy":15.333,"epv":32.200,"track":206.8500,"speed":0.062,"climb":0.000} $GPVTG,206.85,T,,M,0.12,N,0.2,K*68 $GPZDA,153400.000,23,04,2010,,*53 $GPGGA,153400.000,3940.6985,N,07544.9359,W,1,09,1.3,72.9,M,-33.8,M,,0000*57 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPGSV,3,1,12,26,82,270,39,21,73,256,39,24,66,289,39,18,58,312,45*7F $GPGSV,3,2,12,27,51,116,43,15,47,048,30,09,46,136,42,22,26,291,14*71 $GPGSV,3,3,12,06,13,303,27,03,06,312,,29,06,199,22,05,05,096,25*7A {"class":"SKY","xdop":0.77,"ydop":1.02,"vdop":1.40,"tdop":1.11,"hdop":1.30,"gdop":2.19,"pdop":1.90,"satellites":[{"PRN":26,"el":82,"az":270,"ss":39,"used":true},{"PRN":21,"el":73,"az":256,"ss":39,"used":true},{"PRN":24,"el":66,"az":289,"ss":39,"used":true},{"PRN":18,"el":58,"az":312,"ss":45,"used":true},{"PRN":27,"el":51,"az":116,"ss":43,"used":true},{"PRN":15,"el":47,"az":48,"ss":30,"used":true},{"PRN":9,"el":46,"az":136,"ss":42,"used":true},{"PRN":22,"el":26,"az":291,"ss":14,"used":false},{"PRN":6,"el":13,"az":303,"ss":27,"used":false},{"PRN":3,"el":6,"az":312,"ss":0,"used":false},{"PRN":29,"el":6,"az":199,"ss":22,"used":true},{"PRN":5,"el":5,"az":96,"ss":25,"used":true}]} $GPRMC,153400.000,A,3940.6985,N,07544.9359,W,0.19,205.81,230410,,*18 {"class":"TPV","mode":3,"time":"2010-04-23T15:34:00.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748931667,"alt":72.900,"epx":11.511,"epy":15.333,"epv":32.200,"track":205.8100,"speed":0.098,"climb":0.000} $GPVTG,205.81,T,,M,0.19,N,0.3,K*65 $GPZDA,153401.000,23,04,2010,,*52 $GPGGA,153401.000,3940.6985,N,07544.9360,W,1,09,1.3,72.6,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153401.000,A,3940.6985,N,07544.9360,W,0.24,45.90,230410,,*2B {"class":"TPV","mode":3,"time":"2010-04-23T15:34:01.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748933333,"alt":72.600,"epx":11.511,"epy":15.333,"epv":32.200,"track":45.9000,"speed":0.123,"climb":0.000} $GPVTG,45.90,T,,M,0.24,N,0.4,K*5A $GPZDA,153402.000,23,04,2010,,*51 $GPGGA,153402.000,3940.6985,N,07544.9360,W,1,09,1.3,72.4,M,-33.8,M,,0000*52 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153402.000,A,3940.6985,N,07544.9360,W,0.14,217.87,230410,,*18 {"class":"TPV","mode":3,"time":"2010-04-23T15:34:02.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748933333,"alt":72.400,"epx":11.511,"epy":15.333,"epv":32.200,"track":217.8700,"speed":0.072,"climb":0.000} $GPVTG,217.87,T,,M,0.14,N,0.3,K*6D $GPZDA,153403.000,23,04,2010,,*50 $GPGGA,153403.000,3940.6985,N,07544.9360,W,1,09,1.3,72.3,M,-33.8,M,,0000*54 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153403.000,A,3940.6985,N,07544.9360,W,0.17,48.77,230410,,*2D {"class":"TPV","mode":3,"time":"2010-04-23T15:34:03.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748933333,"alt":72.300,"epx":11.511,"epy":15.333,"epv":32.200,"track":48.7700,"speed":0.087,"climb":0.000} $GPVTG,48.77,T,,M,0.17,N,0.3,K*59 $GPZDA,153404.000,23,04,2010,,*57 $GPGGA,153404.000,3940.6985,N,07544.9360,W,1,09,1.3,72.3,M,-33.8,M,,0000*53 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPRMC,153404.000,A,3940.6985,N,07544.9360,W,0.12,198.25,230410,,*14 {"class":"TPV","mode":3,"time":"2010-04-23T15:34:04.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748933333,"alt":72.300,"epx":11.511,"epy":15.333,"epv":32.200,"track":198.2500,"speed":0.062,"climb":0.000} $GPVTG,198.25,T,,M,0.12,N,0.2,K*66 $GPZDA,153405.000,23,04,2010,,*56 $GPGGA,153405.000,3940.6985,N,07544.9360,W,1,09,1.3,72.4,M,-33.8,M,,0000*55 $GPGSA,A,3,26,15,21,27,24,09,18,05,29,,,,1.9,1.3,1.4*33 $GPGSV,3,1,12,26,82,270,39,21,73,256,38,24,66,289,39,18,58,312,44*7F $GPGSV,3,2,12,27,51,116,43,15,47,048,37,09,46,136,41,22,26,291,11*70 $GPGSV,3,3,12,06,13,303,28,03,06,312,,29,06,199,23,05,05,096,25*74 {"class":"SKY","xdop":0.77,"ydop":1.02,"vdop":1.40,"tdop":1.11,"hdop":1.30,"gdop":2.19,"pdop":1.90,"satellites":[{"PRN":26,"el":82,"az":270,"ss":39,"used":true},{"PRN":21,"el":73,"az":256,"ss":38,"used":true},{"PRN":24,"el":66,"az":289,"ss":39,"used":true},{"PRN":18,"el":58,"az":312,"ss":44,"used":true},{"PRN":27,"el":51,"az":116,"ss":43,"used":true},{"PRN":15,"el":47,"az":48,"ss":37,"used":true},{"PRN":9,"el":46,"az":136,"ss":41,"used":true},{"PRN":22,"el":26,"az":291,"ss":11,"used":false},{"PRN":6,"el":13,"az":303,"ss":28,"used":false},{"PRN":3,"el":6,"az":312,"ss":0,"used":false},{"PRN":29,"el":6,"az":199,"ss":23,"used":true},{"PRN":5,"el":5,"az":96,"ss":25,"used":true}]} $GPRMC,153405.000,A,3940.6985,N,07544.9360,W,0.21,205.69,230410,,*1A {"class":"TPV","mode":3,"time":"2010-04-23T15:34:05.000Z","ept":0.005,"lat":39.678308333,"lon":-75.748933333,"alt":72.400,"epx":11.511,"epy":15.333,"epv":32.200,"track":205.6900,"speed":0.108,"climb":0.000} $GPVTG,205.69,T,,M,0.21,N,0.4,K*6F gpsd-3.15/test/daemon/firefly-II.log0000664000175000017500000001012212467342657015445 0ustar esresr# Name: Firefly-IIa # Chipset: UBLOX NEO-5Q # Submitter: Said Jackson # Date: 2010-07-07 # Location: Los Gatos, CA, 170 Knowles Drive $GPGGA,005947.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*54 $GPRMC,005947.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2F $GPZDA,005947.00,08,07,2010,+00,00*4E $GPGGA,005948.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*5B $GPRMC,005948.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*20 $GPZDA,005948.00,08,07,2010,+00,00*41 $GPGGA,005949.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*5A $GPRMC,005949.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*21 $GPZDA,005949.00,08,07,2010,+00,00*40 $GPGGA,005950.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*52 $GPRMC,005950.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*29 $GPZDA,005950.00,08,07,2010,+00,00*48 $GPGGA,005951.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*53 $GPRMC,005951.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*28 $GPZDA,005951.00,08,07,2010,+00,00*49 $GPGGA,005952.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*50 $GPRMC,005952.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2B $GPZDA,005952.00,08,07,2010,+00,00*4A $GPGGA,005953.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*51 $GPRMC,005953.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2A $GPZDA,005953.00,08,07,2010,+00,00*4B $GPGGA,005954.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*56 $GPRMC,005954.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2D $GPZDA,005954.00,08,07,2010,+00,00*4C $GPGGA,005955.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*57 $GPRMC,005955.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2C $GPZDA,005955.00,08,07,2010,+00,00*4D $GPGGA,005956.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*54 $GPRMC,005956.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2F $GPZDA,005956.00,08,07,2010,+00,00*4E $GPGGA,005957.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*55 $GPRMC,005957.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2E $GPZDA,005957.00,08,07,2010,+00,00*4F $GPGGA,005958.00,3715.6616,N,12157.6709,W,,11,0.8,86.0,M,-30.1,M,,*5A $GPRMC,005958.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*21 $GPZDA,005958.00,08,07,2010,+00,00*40 $GPGGA,005959.00,3715.6614,N,12157.6699,W,,11,0.8,85.9,M,-30.1,M,,*5B $GPRMC,005959.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2A $GPZDA,005959.00,08,07,2010,+00,00*41 $GPGGA,010000.00,3715.6614,N,12157.6699,W,,11,0.8,85.7,M,-30.1,M,,*54 $GPRMC,010000.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2B $GPZDA,010000.00,08,07,2010,+00,00*40 $GPGGA,010001.00,3715.6614,N,12157.6699,W,,11,0.8,85.7,M,-30.1,M,,*55 $GPRMC,010001.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2A $GPZDA,010001.00,08,07,2010,+00,00*41 $GPGGA,010002.00,3715.6614,N,12157.6699,W,,11,0.8,85.7,M,-30.1,M,,*56 $GPRMC,010002.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*29 $GPZDA,010002.00,08,07,2010,+00,00*42 $GPGGA,010003.00,3715.6614,N,12157.6699,W,,11,0.8,85.7,M,-30.1,M,,*57 $GPRMC,010003.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*28 $GPZDA,010003.00,08,07,2010,+00,00*43 $GPGGA,010004.00,3715.6614,N,12157.6699,W,,11,0.8,85.7,M,-30.1,M,,*50 $GPRMC,010004.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2F $GPZDA,010004.00,08,07,2010,+00,00*44 $GPGGA,010005.00,3715.6614,N,12157.6699,W,,11,0.8,85.7,M,-30.1,M,,*51 $GPRMC,010005.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2E $GPZDA,010005.00,08,07,2010,+00,00*45 $GPGGA,010006.00,3715.6614,N,12157.6699,W,,11,0.8,85.7,M,-30.1,M,,*52 $GPRMC,010006.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2D $GPZDA,010006.00,08,07,2010,+00,00*46 $GPGGA,010007.00,3715.6614,N,12157.6699,W,,11,0.8,85.7,M,-30.1,M,,*53 $GPRMC,010007.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2C $GPZDA,010007.00,08,07,2010,+00,00*47 $GPGGA,010008.00,3715.6611,N,12157.6699,W,,11,0.8,85.4,M,-30.1,M,,*5A $GPRMC,010008.00,A,3715.6611,N,12157.6699,W,0.0,0.0,080710,,*26 $GPZDA,010008.00,08,07,2010,+00,00*48 $GPGGA,010009.00,3715.6609,N,12157.6699,W,,11,0.8,85.4,M,-30.1,M,,*52 $GPRMC,010009.00,A,3715.6609,N,12157.6699,W,0.0,0.0,080710,,*2E $GPZDA,010009.00,08,07,2010,+00,00*49 gpsd-3.15/test/daemon/firefly-II.log.chk0000664000175000017500000001300312467342657016212 0ustar esresr$GPRMC,005947.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2F {"class":"TPV","mode":2,"time":"2010-07-08T00:59:47.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005947.00,08,07,2010,+00,00*4E $GPRMC,005948.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*20 {"class":"TPV","mode":2,"time":"2010-07-08T00:59:48.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005948.00,08,07,2010,+00,00*41 $GPRMC,005949.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*21 {"class":"TPV","mode":2,"time":"2010-07-08T00:59:49.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005949.00,08,07,2010,+00,00*40 $GPRMC,005950.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*29 {"class":"TPV","mode":2,"time":"2010-07-08T00:59:50.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005950.00,08,07,2010,+00,00*48 $GPRMC,005951.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*28 {"class":"TPV","mode":2,"time":"2010-07-08T00:59:51.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005951.00,08,07,2010,+00,00*49 $GPRMC,005952.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2B {"class":"TPV","mode":2,"time":"2010-07-08T00:59:52.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005952.00,08,07,2010,+00,00*4A $GPRMC,005953.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2A {"class":"TPV","mode":2,"time":"2010-07-08T00:59:53.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005953.00,08,07,2010,+00,00*4B $GPRMC,005954.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2D {"class":"TPV","mode":2,"time":"2010-07-08T00:59:54.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005954.00,08,07,2010,+00,00*4C $GPRMC,005955.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2C {"class":"TPV","mode":2,"time":"2010-07-08T00:59:55.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005955.00,08,07,2010,+00,00*4D $GPRMC,005956.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2F {"class":"TPV","mode":2,"time":"2010-07-08T00:59:56.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005956.00,08,07,2010,+00,00*4E $GPRMC,005957.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*2E {"class":"TPV","mode":2,"time":"2010-07-08T00:59:57.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005957.00,08,07,2010,+00,00*4F $GPRMC,005958.00,A,3715.6616,N,12157.6709,W,0.0,0.0,080710,,*21 {"class":"TPV","mode":2,"time":"2010-07-08T00:59:58.000Z","ept":0.005,"lat":37.261026667,"lon":-121.961181667,"track":0.0000,"speed":0.000} $GPZDA,005958.00,08,07,2010,+00,00*40 $GPRMC,005959.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2A {"class":"TPV","mode":2,"time":"2010-07-08T00:59:59.000Z","ept":0.005,"lat":37.261023333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,005959.00,08,07,2010,+00,00*41 $GPRMC,010000.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2B {"class":"TPV","mode":2,"time":"2010-07-08T01:00:00.000Z","ept":0.005,"lat":37.261023333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010000.00,08,07,2010,+00,00*40 $GPRMC,010001.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2A {"class":"TPV","mode":2,"time":"2010-07-08T01:00:01.000Z","ept":0.005,"lat":37.261023333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010001.00,08,07,2010,+00,00*41 $GPRMC,010002.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*29 {"class":"TPV","mode":2,"time":"2010-07-08T01:00:02.000Z","ept":0.005,"lat":37.261023333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010002.00,08,07,2010,+00,00*42 $GPRMC,010003.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*28 {"class":"TPV","mode":2,"time":"2010-07-08T01:00:03.000Z","ept":0.005,"lat":37.261023333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010003.00,08,07,2010,+00,00*43 $GPRMC,010004.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2F {"class":"TPV","mode":2,"time":"2010-07-08T01:00:04.000Z","ept":0.005,"lat":37.261023333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010004.00,08,07,2010,+00,00*44 $GPRMC,010005.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2E {"class":"TPV","mode":2,"time":"2010-07-08T01:00:05.000Z","ept":0.005,"lat":37.261023333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010005.00,08,07,2010,+00,00*45 $GPRMC,010006.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2D {"class":"TPV","mode":2,"time":"2010-07-08T01:00:06.000Z","ept":0.005,"lat":37.261023333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010006.00,08,07,2010,+00,00*46 $GPRMC,010007.00,A,3715.6614,N,12157.6699,W,0.0,0.0,080710,,*2C {"class":"TPV","mode":2,"time":"2010-07-08T01:00:07.000Z","ept":0.005,"lat":37.261023333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010007.00,08,07,2010,+00,00*47 $GPRMC,010008.00,A,3715.6611,N,12157.6699,W,0.0,0.0,080710,,*26 {"class":"TPV","mode":2,"time":"2010-07-08T01:00:08.000Z","ept":0.005,"lat":37.261018333,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010008.00,08,07,2010,+00,00*48 $GPRMC,010009.00,A,3715.6609,N,12157.6699,W,0.0,0.0,080710,,*2E {"class":"TPV","mode":2,"time":"2010-07-08T01:00:09.000Z","ept":0.005,"lat":37.261015000,"lon":-121.961165000,"track":0.0000,"speed":0.000} $GPZDA,010009.00,08,07,2010,+00,00*49 gpsd-3.15/test/daemon/foretrex-201.log0000664000175000017500000001355512533020157015637 0ustar esresr# Name: Garmin Foretrex 201 # Description: A small GPS meant to be worn like a wristwatch # Submitter: Anders Lund # Date: 2010-08-26 # Location: 55.04N 10.25E, UlbÞlle, Denmark # Notes: The device was just lying in the window, I used # gpscat to sample. The sample was done twice, to get some sentences # including a fix as well. $GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 $GPRMC,,V,,,,,,,260810,1.0,E,N*34 $GPRMB,V,,,,,,,,,,,,A,N*13 $GPGGA,,,,,,0,00,,,M,,M,,*66 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,03,57,171,00,06,46,153,00,08,06,303,00,11,17,274,00*74 $GPGSV,3,2,12,15,02,014,00,18,27,053,00,19,74,257,41,22,56,080,41*72 $GPGSV,3,3,12,24,85,096,00,28,15,328,00,33,23,211,40,37,26,166,00*7F $GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 $GPRMC,,V,,,,,,,260810,1.0,E,N*34 $GPRMB,V,,,,,,,,,,,,A,N*13 $GPGGA,,,,,,0,00,,,M,,M,,*66 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,03,57,171,45,06,46,153,00,08,06,303,00,11,17,274,00*75 $GPGSV,3,2,12,15,02,014,00,18,27,053,00,19,74,257,41,22,56,080,41*72 $GPGSV,3,3,12,24,85,096,00,28,15,328,00,33,23,211,40,37,26,166,00*7F $GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 $GPRMC,,V,,,,,,,260810,1.0,E,N*34 $GPRMB,V,,,,,,,,,,,,A,N*13 $GPGGA,,,,,,0,00,,,M,,M,,*66 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,03,56,170,45,06,46,153,00,08,06,303,00,11,17,274,00*75 $GPGSV,3,2,12,15,02,014,00,18,27,053,00,19,74,257,41,22,56,080,41*72 $GPGSV,3,3,12,24,85,096,00,28,15,328,00,33,23,211,41,37,26,166,00*7E $GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 $GPRMC,,V,,,,,,,260810,1.0,E,N*34 $GPRMB,V,,,,,,,,,,,,A,N*13 $GPGGA,,,,,,0,00,,,M,,M,,*66 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,03,56,170,44,06,46,153,00,08,06,303,00,11,17,274,00*74 $GPGSV,3,2,12,15,02,014,00,18,27,053,00,19,74,257,41,22,56,080,41*72 $GPGSV,3,3,12,24,85,096,00,28,15,328,00,33,23,211,41,37,26,166,00*7E $GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 4.4343,N,01025.5386,E,200002,A,D*48 $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200004,A,5504.4343,N,01025.5386,E,0.0,0.0,260810,1.0,E,D*1E $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200004,5504.4343,N,01025.5386,E,2,03,2.5,-9.1,M,43.9,M,,*62 $GPGSA,A,2,06,,,,,,19,22,,,,,2.7,2.5,1.0*3E $GPGSV,3,1,12,06,43,153,43,08,05,301,00,11,19,274,00,14,18,127,00*77 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,32*78 $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 $GPGLL,5504.4343,N,01025.5386,E,200004,A,D*4E $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200006,A,5504.4343,N,01025.5386,E,0.0,0.0,260810,1.0,E,D*1C $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200006,5504.4343,N,01025.5386,E,2,03,2.5,-9.1,M,43.9,M,,*60 $GPGSA,A,2,06,,,,,,19,22,,,,,2.7,2.5,1.0*3E $GPGSV,3,1,12,06,43,153,43,08,05,301,00,11,19,274,00,14,18,127,00*77 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 $GPGLL,5504.4343,N,01025.5386,E,200006,A,D*4C $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200008,A,5504.4344,N,01025.5385,E,0.0,0.0,260810,1.0,E,D*16 $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200008,5504.4344,N,01025.5385,E,2,03,2.5,-9.1,M,43.9,M,,*6A $GPGSA,A,2,06,,,,,,19,22,,,,,2.7,2.5,1.0*3E $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 $GPGLL,5504.4344,N,01025.5385,E,200008,A,D*46 $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200010,A,5504.4344,N,01025.5385,E,0.0,0.0,260810,1.0,E,D*1F $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200010,5504.4344,N,01025.5385,E,2,00,2.5,-9.1,M,43.9,M,,*60 $GPGSA,A,2,,,,,,,,,,,,,2.7,2.5,1.0*30 $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 $GPGLL,5504.4344,N,01025.5385,E,200010,A,D*4F $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200012,A,5504.4344,N,01025.5385,E,0.0,0.0,260810,1.0,E,D*1D $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200012,5504.4344,N,01025.5385,E,2,00,2.5,-9.1,M,43.9,M,,*62 $GPGSA,A,2,,,,,,,,,,,,,2.7,2.5,1.0*30 $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 $GPGLL,5504.4344,N,01025.5385,E,200012,A,D*4D $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200014,A,5504.4344,N,01025.5384,E,0.0,0.0,260810,1.0,E,D*1A $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200014,5504.4344,N,01025.5384,E,2,00,2.5,-9.1,M,43.9,M,,*65 $GPGSA,A,2,,,,,,,,,,,,,2.7,2.5,1.0*30 $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 $GPGLL,5504.4344,N,01025.5384,E,200014,A,D*4A $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200016,A,5504.4344,N,01025.5384,E,0.0,0.0,260810,1.0,E,D*18 $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200016,5504.4344,N,01025.5384,E,2,00,2.5,-9.1,M,43.9,M,,*67 $GPGSA,A,2,,,,,,,,,,,,,2.7,2.5,1.0*30 $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 gpsd-3.15/test/daemon/foretrex-201.log.chk0000664000175000017500000003306212533020227016374 0ustar esresr$GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 $GPRMC,,V,,,,,,,260810,1.0,E,N*34 $GPRMB,V,,,,,,,,,,,,A,N*13 $GPGGA,,,,,,0,00,,,M,,M,,*66 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,03,57,171,00,06,46,153,00,08,06,303,00,11,17,274,00*74 $GPGSV,3,2,12,15,02,014,00,18,27,053,00,19,74,257,41,22,56,080,41*72 $GPGSV,3,3,12,24,85,096,00,28,15,328,00,33,23,211,40,37,26,166,00*7F {"class":"SKY","satellites":[{"PRN":3,"el":57,"az":171,"ss":0,"used":false},{"PRN":6,"el":46,"az":153,"ss":0,"used":false},{"PRN":8,"el":6,"az":303,"ss":0,"used":false},{"PRN":11,"el":17,"az":274,"ss":0,"used":false},{"PRN":15,"el":2,"az":14,"ss":0,"used":false},{"PRN":18,"el":27,"az":53,"ss":0,"used":false},{"PRN":19,"el":74,"az":257,"ss":41,"used":false},{"PRN":22,"el":56,"az":80,"ss":41,"used":false},{"PRN":24,"el":85,"az":96,"ss":0,"used":false},{"PRN":28,"el":15,"az":328,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":40,"used":false},{"PRN":124,"el":26,"az":166,"ss":0,"used":false}]} $GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 $GPRMC,,V,,,,,,,260810,1.0,E,N*34 $GPRMB,V,,,,,,,,,,,,A,N*13 $GPGGA,,,,,,0,00,,,M,,M,,*66 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,03,57,171,45,06,46,153,00,08,06,303,00,11,17,274,00*75 $GPGSV,3,2,12,15,02,014,00,18,27,053,00,19,74,257,41,22,56,080,41*72 $GPGSV,3,3,12,24,85,096,00,28,15,328,00,33,23,211,40,37,26,166,00*7F {"class":"SKY","satellites":[{"PRN":3,"el":57,"az":171,"ss":45,"used":false},{"PRN":6,"el":46,"az":153,"ss":0,"used":false},{"PRN":8,"el":6,"az":303,"ss":0,"used":false},{"PRN":11,"el":17,"az":274,"ss":0,"used":false},{"PRN":15,"el":2,"az":14,"ss":0,"used":false},{"PRN":18,"el":27,"az":53,"ss":0,"used":false},{"PRN":19,"el":74,"az":257,"ss":41,"used":false},{"PRN":22,"el":56,"az":80,"ss":41,"used":false},{"PRN":24,"el":85,"az":96,"ss":0,"used":false},{"PRN":28,"el":15,"az":328,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":40,"used":false},{"PRN":124,"el":26,"az":166,"ss":0,"used":false}]} $GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 $GPRMC,,V,,,,,,,260810,1.0,E,N*34 $GPRMB,V,,,,,,,,,,,,A,N*13 $GPGGA,,,,,,0,00,,,M,,M,,*66 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,03,56,170,45,06,46,153,00,08,06,303,00,11,17,274,00*75 $GPGSV,3,2,12,15,02,014,00,18,27,053,00,19,74,257,41,22,56,080,41*72 $GPGSV,3,3,12,24,85,096,00,28,15,328,00,33,23,211,41,37,26,166,00*7E {"class":"SKY","satellites":[{"PRN":3,"el":56,"az":170,"ss":45,"used":false},{"PRN":6,"el":46,"az":153,"ss":0,"used":false},{"PRN":8,"el":6,"az":303,"ss":0,"used":false},{"PRN":11,"el":17,"az":274,"ss":0,"used":false},{"PRN":15,"el":2,"az":14,"ss":0,"used":false},{"PRN":18,"el":27,"az":53,"ss":0,"used":false},{"PRN":19,"el":74,"az":257,"ss":41,"used":false},{"PRN":22,"el":56,"az":80,"ss":41,"used":false},{"PRN":24,"el":85,"az":96,"ss":0,"used":false},{"PRN":28,"el":15,"az":328,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":41,"used":false},{"PRN":124,"el":26,"az":166,"ss":0,"used":false}]} $GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 $GPRMC,,V,,,,,,,260810,1.0,E,N*34 $GPRMB,V,,,,,,,,,,,,A,N*13 $GPGGA,,,,,,0,00,,,M,,M,,*66 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,03,56,170,44,06,46,153,00,08,06,303,00,11,17,274,00*74 $GPGSV,3,2,12,15,02,014,00,18,27,053,00,19,74,257,41,22,56,080,41*72 $GPGSV,3,3,12,24,85,096,00,28,15,328,00,33,23,211,41,37,26,166,00*7E {"class":"SKY","satellites":[{"PRN":3,"el":56,"az":170,"ss":44,"used":false},{"PRN":6,"el":46,"az":153,"ss":0,"used":false},{"PRN":8,"el":6,"az":303,"ss":0,"used":false},{"PRN":11,"el":17,"az":274,"ss":0,"used":false},{"PRN":15,"el":2,"az":14,"ss":0,"used":false},{"PRN":18,"el":27,"az":53,"ss":0,"used":false},{"PRN":19,"el":74,"az":257,"ss":41,"used":false},{"PRN":22,"el":56,"az":80,"ss":41,"used":false},{"PRN":24,"el":85,"az":96,"ss":0,"used":false},{"PRN":28,"el":15,"az":328,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":41,"used":false},{"PRN":124,"el":26,"az":166,"ss":0,"used":false}]} $GPGLL,,,,,,V,N*64 $GPBOD,,T,,M,,*47 $PGRME,,M,,M,,M*00 $PGRMZ,,f,1*29 $GPRTE,1,1,c,*37 $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200004,A,5504.4343,N,01025.5386,E,0.0,0.0,260810,1.0,E,D*1E {"class":"TPV","mode":2,"time":"2010-08-26T20:00:04.000Z","ept":0.005,"lat":55.073905000,"lon":10.425643333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200004,5504.4343,N,01025.5386,E,2,03,2.5,-9.1,M,43.9,M,,*62 {"class":"TPV","mode":3,"time":"2010-08-26T20:00:04.000Z","ept":0.005,"lat":55.073905000,"lon":10.425643333,"alt":-9.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,06,,,,,,19,22,,,,,2.7,2.5,1.0*3E $GPGSV,3,1,12,06,43,153,43,08,05,301,00,11,19,274,00,14,18,127,00*77 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,32*78 $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 {"class":"SKY","vdop":1.00,"hdop":2.50,"pdop":2.70,"satellites":[{"PRN":6,"el":43,"az":153,"ss":43,"used":true},{"PRN":8,"el":5,"az":301,"ss":0,"used":false},{"PRN":11,"el":19,"az":274,"ss":0,"used":false},{"PRN":14,"el":18,"az":127,"ss":0,"used":false},{"PRN":15,"el":1,"az":13,"ss":0,"used":false},{"PRN":18,"el":25,"az":53,"ss":0,"used":false},{"PRN":19,"el":75,"az":249,"ss":43,"used":true},{"PRN":22,"el":55,"az":78,"ss":32,"used":true},{"PRN":24,"el":83,"az":92,"ss":0,"used":false},{"PRN":28,"el":17,"az":327,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":42,"used":false},{"PRN":124,"el":26,"az":166,"ss":42,"used":false}]} $GPGLL,5504.4343,N,01025.5386,E,200004,A,D*4E {"class":"TPV","mode":3,"time":"2010-08-26T20:00:04.000Z","ept":0.005,"lat":55.073905000,"lon":10.425643333,"alt":-9.100,"epv":5.750,"track":0.0000,"speed":0.000,"climb":0.000} $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200006,A,5504.4343,N,01025.5386,E,0.0,0.0,260810,1.0,E,D*1C $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200006,5504.4343,N,01025.5386,E,2,03,2.5,-9.1,M,43.9,M,,*60 $GPGSA,A,2,06,,,,,,19,22,,,,,2.7,2.5,1.0*3E $GPGSV,3,1,12,06,43,153,43,08,05,301,00,11,19,274,00,14,18,127,00*77 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 {"class":"SKY","vdop":1.00,"hdop":2.50,"pdop":2.70,"satellites":[{"PRN":6,"el":43,"az":153,"ss":43,"used":true},{"PRN":8,"el":5,"az":301,"ss":0,"used":false},{"PRN":11,"el":19,"az":274,"ss":0,"used":false},{"PRN":14,"el":18,"az":127,"ss":0,"used":false},{"PRN":15,"el":1,"az":13,"ss":0,"used":false},{"PRN":18,"el":25,"az":53,"ss":0,"used":false},{"PRN":19,"el":75,"az":249,"ss":43,"used":true},{"PRN":22,"el":55,"az":78,"ss":31,"used":true},{"PRN":24,"el":83,"az":92,"ss":0,"used":false},{"PRN":28,"el":17,"az":327,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":42,"used":false},{"PRN":124,"el":26,"az":166,"ss":42,"used":false}]} $GPGLL,5504.4343,N,01025.5386,E,200006,A,D*4C {"class":"TPV","mode":3,"time":"2010-08-26T20:00:06.000Z","ept":0.005,"lat":55.073905000,"lon":10.425643333,"alt":-9.100,"epv":5.750,"track":0.0000,"speed":0.000,"climb":0.000} $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200008,A,5504.4344,N,01025.5385,E,0.0,0.0,260810,1.0,E,D*16 $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200008,5504.4344,N,01025.5385,E,2,03,2.5,-9.1,M,43.9,M,,*6A $GPGSA,A,2,06,,,,,,19,22,,,,,2.7,2.5,1.0*3E $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 {"class":"SKY","vdop":1.00,"hdop":2.50,"pdop":2.70,"satellites":[{"PRN":6,"el":43,"az":153,"ss":44,"used":true},{"PRN":8,"el":4,"az":301,"ss":0,"used":false},{"PRN":11,"el":19,"az":274,"ss":0,"used":false},{"PRN":14,"el":18,"az":127,"ss":0,"used":false},{"PRN":15,"el":1,"az":13,"ss":0,"used":false},{"PRN":18,"el":25,"az":53,"ss":0,"used":false},{"PRN":19,"el":75,"az":249,"ss":43,"used":true},{"PRN":22,"el":55,"az":78,"ss":31,"used":true},{"PRN":24,"el":83,"az":92,"ss":0,"used":false},{"PRN":28,"el":17,"az":327,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":42,"used":false},{"PRN":124,"el":26,"az":166,"ss":42,"used":false}]} $GPGLL,5504.4344,N,01025.5385,E,200008,A,D*46 {"class":"TPV","mode":3,"time":"2010-08-26T20:00:08.000Z","ept":0.005,"lat":55.073906667,"lon":10.425641667,"alt":-9.100,"epv":5.750,"track":0.0000,"speed":0.000,"climb":0.000} $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200010,A,5504.4344,N,01025.5385,E,0.0,0.0,260810,1.0,E,D*1F $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200010,5504.4344,N,01025.5385,E,2,00,2.5,-9.1,M,43.9,M,,*60 $GPGSA,A,2,,,,,,,,,,,,,2.7,2.5,1.0*30 $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 {"class":"SKY","vdop":1.00,"hdop":2.50,"pdop":2.70,"satellites":[{"PRN":6,"el":43,"az":153,"ss":44,"used":false},{"PRN":8,"el":4,"az":301,"ss":0,"used":false},{"PRN":11,"el":19,"az":274,"ss":0,"used":false},{"PRN":14,"el":18,"az":127,"ss":0,"used":false},{"PRN":15,"el":1,"az":13,"ss":0,"used":false},{"PRN":18,"el":25,"az":53,"ss":0,"used":false},{"PRN":19,"el":75,"az":249,"ss":43,"used":false},{"PRN":22,"el":55,"az":78,"ss":31,"used":false},{"PRN":24,"el":83,"az":92,"ss":0,"used":false},{"PRN":28,"el":17,"az":327,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":42,"used":false},{"PRN":124,"el":26,"az":166,"ss":42,"used":false}]} $GPGLL,5504.4344,N,01025.5385,E,200010,A,D*4F {"class":"TPV","mode":3,"time":"2010-08-26T20:00:10.000Z","ept":0.005,"lat":55.073906667,"lon":10.425641667,"alt":-9.100,"epv":5.750,"track":0.0000,"speed":0.000,"climb":0.000} $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200012,A,5504.4344,N,01025.5385,E,0.0,0.0,260810,1.0,E,D*1D $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200012,5504.4344,N,01025.5385,E,2,00,2.5,-9.1,M,43.9,M,,*62 $GPGSA,A,2,,,,,,,,,,,,,2.7,2.5,1.0*30 $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 {"class":"SKY","vdop":1.00,"hdop":2.50,"pdop":2.70,"satellites":[{"PRN":6,"el":43,"az":153,"ss":44,"used":false},{"PRN":8,"el":4,"az":301,"ss":0,"used":false},{"PRN":11,"el":19,"az":274,"ss":0,"used":false},{"PRN":14,"el":18,"az":127,"ss":0,"used":false},{"PRN":15,"el":1,"az":13,"ss":0,"used":false},{"PRN":18,"el":25,"az":53,"ss":0,"used":false},{"PRN":19,"el":75,"az":249,"ss":43,"used":false},{"PRN":22,"el":55,"az":78,"ss":31,"used":false},{"PRN":24,"el":83,"az":92,"ss":0,"used":false},{"PRN":28,"el":17,"az":327,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":42,"used":false},{"PRN":124,"el":26,"az":166,"ss":42,"used":false}]} $GPGLL,5504.4344,N,01025.5385,E,200012,A,D*4D {"class":"TPV","mode":3,"time":"2010-08-26T20:00:12.000Z","ept":0.005,"lat":55.073906667,"lon":10.425641667,"alt":-9.100,"epv":5.750,"track":0.0000,"speed":0.000,"climb":0.000} $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200014,A,5504.4344,N,01025.5384,E,0.0,0.0,260810,1.0,E,D*1A $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200014,5504.4344,N,01025.5384,E,2,00,2.5,-9.1,M,43.9,M,,*65 $GPGSA,A,2,,,,,,,,,,,,,2.7,2.5,1.0*30 $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 {"class":"SKY","vdop":1.00,"hdop":2.50,"pdop":2.70,"satellites":[{"PRN":6,"el":43,"az":153,"ss":44,"used":false},{"PRN":8,"el":4,"az":301,"ss":0,"used":false},{"PRN":11,"el":19,"az":274,"ss":0,"used":false},{"PRN":14,"el":18,"az":127,"ss":0,"used":false},{"PRN":15,"el":1,"az":13,"ss":0,"used":false},{"PRN":18,"el":25,"az":53,"ss":0,"used":false},{"PRN":19,"el":75,"az":249,"ss":43,"used":false},{"PRN":22,"el":55,"az":78,"ss":31,"used":false},{"PRN":24,"el":83,"az":92,"ss":0,"used":false},{"PRN":28,"el":17,"az":327,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":42,"used":false},{"PRN":124,"el":26,"az":166,"ss":42,"used":false}]} $GPGLL,5504.4344,N,01025.5384,E,200014,A,D*4A {"class":"TPV","mode":3,"time":"2010-08-26T20:00:14.000Z","ept":0.005,"lat":55.073906667,"lon":10.425640000,"alt":-9.100,"epv":5.750,"track":0.0000,"speed":0.000,"climb":0.000} $GPBOD,,T,,M,,*47 $PGRME,19.9,M,50.0,M,53.8,M*14 $PGRMZ,-30,f,2*04 $GPRTE,1,1,c,*37 $GPRMC,200016,A,5504.4344,N,01025.5384,E,0.0,0.0,260810,1.0,E,D*18 $GPRMB,A,,,,,,,,,,,,A,D*0E $GPGGA,200016,5504.4344,N,01025.5384,E,2,00,2.5,-9.1,M,43.9,M,,*67 $GPGSA,A,2,,,,,,,,,,,,,2.7,2.5,1.0*30 $GPGSV,3,1,12,06,43,153,44,08,04,301,00,11,19,274,00,14,18,127,00*71 $GPGSV,3,2,12,15,01,013,00,18,25,053,00,19,75,249,43,22,55,078,31*7B $GPGSV,3,3,12,24,83,092,00,28,17,327,00,33,23,211,42,37,26,166,42*74 {"class":"SKY","vdop":1.00,"hdop":2.50,"pdop":2.70,"satellites":[{"PRN":6,"el":43,"az":153,"ss":44,"used":false},{"PRN":8,"el":4,"az":301,"ss":0,"used":false},{"PRN":11,"el":19,"az":274,"ss":0,"used":false},{"PRN":14,"el":18,"az":127,"ss":0,"used":false},{"PRN":15,"el":1,"az":13,"ss":0,"used":false},{"PRN":18,"el":25,"az":53,"ss":0,"used":false},{"PRN":19,"el":75,"az":249,"ss":43,"used":false},{"PRN":22,"el":55,"az":78,"ss":31,"used":false},{"PRN":24,"el":83,"az":92,"ss":0,"used":false},{"PRN":28,"el":17,"az":327,"ss":0,"used":false},{"PRN":120,"el":23,"az":211,"ss":42,"used":false},{"PRN":124,"el":26,"az":166,"ss":42,"used":false}]} gpsd-3.15/test/daemon/garmin-10x.log0000664000175000017500000001227212467342657015401 0ustar esresr# Name: Garmin Mobile 10 # Description: Garmin Mobile 10 for laptops # Submitter: David Ludlow # Date: 2010-07-18 # Location: Toledo, OH 41.7 N 83.6 W # # Notes: Device is moved between a marginal, indoors location # with a 3D fix to a location with no view of the sky (inside a grounded # computer case). $GPGGA,165007.000,4143.6058,N,08338.0778,W,1,06,1.5,204.3,M,-33.7,M,,0000*67 $GPGSA,A,3,31,16,29,23,20,32,,,,,,,2.8,1.5,2.4*36 $GPGSV,3,1,10,16,74,173,27,23,42,310,21,31,40,066,23,32,39,218,22*7F $GPGSV,3,2,10,20,38,248,21,13,16,310,,06,15,156,,29,15,048,16*7E $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165007.000,A,4143.6058,N,08338.0778,W,0.55,36.58,180710,,,A*4F $GPGGA,165008.000,4143.6059,N,08338.0786,W,1,06,1.5,204.1,M,-33.7,M,,0000*6A $GPGSA,A,3,31,16,29,23,20,32,,,,,,,2.8,1.5,2.4*36 $GPGSV,3,1,10,16,74,173,27,23,42,310,21,31,40,066,23,32,39,218,22*7F $GPGSV,3,2,10,20,38,248,21,13,16,310,,06,15,156,,29,15,048,16*7E $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165008.000,A,4143.6059,N,08338.0786,W,0.32,172.38,180710,,,A*76 $GPGGA,165009.000,4143.6058,N,08338.0787,W,1,03,7.2,203.9,M,-33.7,M,,0000*60 $GPGSA,A,2,31,16,29,,,,,,,,,,7.3,7.2,1.0*3D $GPGSV,3,1,10,16,74,173,20,23,42,310,17,31,40,066,18,32,39,218,15*71 $GPGSV,3,2,10,20,38,248,17,13,16,310,,06,15,156,,29,15,048,15*78 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165009.000,A,4143.6058,N,08338.0787,W,0.60,231.03,180710,,,A*7C $GPGGA,165010.000,4143.6057,N,08338.0788,W,6,00,50.0,203.8,M,-33.7,M,,0000*5D $GPGSA,A,2,,,,,,,,,,,,,50.0,50.0,50.0*06 $GPGSV,3,1,10,16,74,173,09,23,42,310,07,31,40,066,13,32,39,218,07*73 $GPGSV,3,2,10,20,38,248,09,13,16,310,,06,15,156,,29,15,048,12*70 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165010.000,V,4143.6057,N,08338.0788,W,0.60,231.03,180710,,,E*67 # Some duplicative sentences with 2D fixes were removed here $GPGGA,165019.000,,,,,0,00,,,M,0.0,M,,0000*5C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,16,74,173,,23,42,310,,31,40,066,12,32,39,218,*7B $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165019.000,V,,,,,,,180710,,,N*48 $GPGGA,165020.000,,,,,0,00,,,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,16,74,173,,23,42,310,,31,40,066,12,32,39,218,*7B $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165020.000,V,,,,,,,180710,,,N*42 $GPGGA,165021.000,,,,,0,00,,,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,16,74,173,,23,42,310,,31,40,066,12,32,39,218,*7B $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165021.000,V,,,,,,,180710,,,N*43 $GPGGA,165022.000,,,,,0,00,,,M,0.0,M,,0000*54 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,16,74,173,,23,42,310,,31,40,066,12,32,39,218,*7B $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165022.000,V,,,,,,,180710,,,N*40 # Some duplicative sentences with no fix were removed here $GPGGA,165044.000,4143.5985,N,08338.0820,W,1,03,2.2,204.1,M,-33.7,M,,0000*6B $GPGSA,A,2,31,23,16,,,,,,,,,,2.4,2.2,1.0*30 $GPGSV,3,1,10,16,74,173,26,23,42,310,21,31,40,066,23,32,39,218,*7E $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165044.000,A,4143.5985,N,08338.0820,W,0.00,,180710,,,A*66 $GPGGA,165045.000,4143.6024,N,08338.0864,W,1,04,2.0,183.5,M,-33.7,M,,0000*66 $GPGSA,A,3,31,23,16,20,,,,,,,,,4.6,2.0,4.2*32 $GPGSV,3,1,10,16,74,173,27,23,42,310,19,31,40,066,23,32,39,218,*74 $GPGSV,3,2,10,20,38,248,19,13,16,310,,06,15,156,,29,15,048,*72 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165045.000,A,4143.6024,N,08338.0864,W,2.19,176.03,180710,,,A*71 $GPGGA,165046.000,4143.6110,N,08338.0897,W,1,05,1.5,200.1,M,-33.7,M,,0000*64 $GPGSA,A,3,31,23,16,20,32,,,,,,,,4.0,1.5,3.6*30 $GPGSV,3,1,10,16,74,173,27,23,42,310,21,31,40,066,24,32,39,218,24*7E $GPGSV,3,2,10,20,38,248,19,13,16,310,,06,15,156,,29,15,048,*72 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165046.000,A,4143.6110,N,08338.0897,W,0.44,323.72,180710,,,A*76 $GPGGA,165047.000,4143.6116,N,08338.0889,W,1,05,1.5,219.6,M,-33.7,M,,0000*63 $GPGSA,A,3,31,23,16,20,32,,,,,,,,4.0,1.5,3.6*30 $GPGSV,3,1,10,16,74,173,28,23,42,310,19,31,40,066,25,32,39,218,21*7E $GPGSV,3,2,10,20,38,248,19,13,16,310,,06,15,156,,29,15,048,*72 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165047.000,A,4143.6116,N,08338.0889,W,0.76,13.73,180710,,,A*4E $GPGGA,165048.000,4143.6118,N,08338.0890,W,1,05,1.5,210.3,M,-33.7,M,,0000*66 $GPGSA,A,3,31,23,16,20,32,,,,,,,,4.0,1.5,3.6*30 $GPGSV,3,1,10,16,74,173,27,23,42,310,18,31,40,066,25,32,39,218,23*72 $GPGSV,3,2,10,20,38,248,20,13,16,310,,06,15,156,,29,15,048,*78 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165048.000,A,4143.6118,N,08338.0890,W,0.71,20.56,180710,,,A*47 $GPGGA,165049.000,4143.6110,N,08338.0882,W,1,05,1.5,212.3,M,-33.7,M,,0000*6E $GPGSA,A,3,31,23,16,20,32,,,,,,,,4.0,1.5,3.6*30 $GPGSV,3,1,10,16,74,173,27,23,42,310,19,31,40,066,24,32,39,218,23*72 $GPGSV,3,2,10,20,38,248,20,13,16,310,,06,15,156,,29,15,048,*78 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D $GPRMC,165049.000,A,4143.6110,N,08338.0882,W,0.60,126.88,180710,,,A*79 gpsd-3.15/test/daemon/garmin-10x.log.chk0000664000175000017500000004045112467342657016145 0ustar esresr$GPGGA,165007.000,4143.6058,N,08338.0778,W,1,06,1.5,204.3,M,-33.7,M,,0000*67 {"class":"TPV","mode":3,"lat":41.726763333,"lon":-83.634630000,"alt":204.300} $GPGSA,A,3,31,16,29,23,20,32,,,,,,,2.8,1.5,2.4*36 {"class":"TPV","mode":3,"lat":41.726763333,"lon":-83.634630000,"alt":204.300,"epv":55.200} $GPGSV,3,1,10,16,74,173,27,23,42,310,21,31,40,066,23,32,39,218,22*7F $GPGSV,3,2,10,20,38,248,21,13,16,310,,06,15,156,,29,15,048,16*7E $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":2.40,"tdop":1.58,"hdop":1.50,"gdop":3.21,"pdop":2.80,"satellites":[{"PRN":16,"el":74,"az":173,"ss":27,"used":true},{"PRN":23,"el":42,"az":310,"ss":21,"used":true},{"PRN":31,"el":40,"az":66,"ss":23,"used":true},{"PRN":32,"el":39,"az":218,"ss":22,"used":true},{"PRN":20,"el":38,"az":248,"ss":21,"used":true},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":16,"used":true},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165007.000,A,4143.6058,N,08338.0778,W,0.55,36.58,180710,,,A*4F {"class":"TPV","mode":3,"time":"2010-07-18T16:50:07.000Z","ept":0.005,"lat":41.726763333,"lon":-83.634630000,"alt":204.300,"epx":12.698,"epy":17.990,"epv":55.200,"track":36.5800,"speed":0.283} $GPGGA,165008.000,4143.6059,N,08338.0786,W,1,06,1.5,204.1,M,-33.7,M,,0000*6A $GPGSA,A,3,31,16,29,23,20,32,,,,,,,2.8,1.5,2.4*36 $GPGSV,3,1,10,16,74,173,27,23,42,310,21,31,40,066,23,32,39,218,22*7F $GPGSV,3,2,10,20,38,248,21,13,16,310,,06,15,156,,29,15,048,16*7E $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":2.40,"tdop":1.58,"hdop":1.50,"gdop":3.21,"pdop":2.80,"satellites":[{"PRN":16,"el":74,"az":173,"ss":27,"used":true},{"PRN":23,"el":42,"az":310,"ss":21,"used":true},{"PRN":31,"el":40,"az":66,"ss":23,"used":true},{"PRN":32,"el":39,"az":218,"ss":22,"used":true},{"PRN":20,"el":38,"az":248,"ss":21,"used":true},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":16,"used":true},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165008.000,A,4143.6059,N,08338.0786,W,0.32,172.38,180710,,,A*76 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:08.000Z","ept":0.005,"lat":41.726765000,"lon":-83.634643333,"alt":204.100,"epx":12.698,"epy":17.990,"epv":55.200,"track":172.3800,"speed":0.165,"climb":-0.200,"eps":35.98,"epc":110.40} $GPGGA,165009.000,4143.6058,N,08338.0787,W,1,03,7.2,203.9,M,-33.7,M,,0000*60 $GPGSA,A,2,31,16,29,,,,,,,,,,7.3,7.2,1.0*3D $GPGSV,3,1,10,16,74,173,20,23,42,310,17,31,40,066,18,32,39,218,15*71 $GPGSV,3,2,10,20,38,248,17,13,16,310,,06,15,156,,29,15,048,15*78 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":1.00,"tdop":1.58,"hdop":7.20,"gdop":3.21,"pdop":7.30,"satellites":[{"PRN":16,"el":74,"az":173,"ss":20,"used":true},{"PRN":23,"el":42,"az":310,"ss":17,"used":false},{"PRN":31,"el":40,"az":66,"ss":18,"used":true},{"PRN":32,"el":39,"az":218,"ss":15,"used":false},{"PRN":20,"el":38,"az":248,"ss":17,"used":false},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":15,"used":true},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165009.000,A,4143.6058,N,08338.0787,W,0.60,231.03,180710,,,A*7C {"class":"TPV","mode":3,"time":"2010-07-18T16:50:09.000Z","ept":0.005,"lat":41.726763333,"lon":-83.634645000,"alt":203.900,"epx":12.698,"epy":17.990,"epv":55.200,"track":231.0300,"speed":0.309,"climb":-0.200,"eps":35.98,"epc":110.40} $GPGGA,165010.000,4143.6057,N,08338.0788,W,6,00,50.0,203.8,M,-33.7,M,,0000*5D $GPGSA,A,2,,,,,,,,,,,,,50.0,50.0,50.0*06 $GPGSV,3,1,10,16,74,173,09,23,42,310,07,31,40,066,13,32,39,218,07*73 $GPGSV,3,2,10,20,38,248,09,13,16,310,,06,15,156,,29,15,048,12*70 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":50.00,"tdop":1.58,"hdop":50.00,"gdop":3.21,"pdop":50.00,"satellites":[{"PRN":16,"el":74,"az":173,"ss":9,"used":false},{"PRN":23,"el":42,"az":310,"ss":7,"used":false},{"PRN":31,"el":40,"az":66,"ss":13,"used":false},{"PRN":32,"el":39,"az":218,"ss":7,"used":false},{"PRN":20,"el":38,"az":248,"ss":9,"used":false},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":12,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165010.000,V,4143.6057,N,08338.0788,W,0.60,231.03,180710,,,E*67 $GPGGA,165019.000,,,,,0,00,,,M,0.0,M,,0000*5C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,16,74,173,,23,42,310,,31,40,066,12,32,39,218,*7B $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":50.00,"tdop":1.58,"hdop":50.00,"gdop":3.21,"pdop":50.00,"satellites":[{"PRN":16,"el":74,"az":173,"ss":0,"used":false},{"PRN":23,"el":42,"az":310,"ss":0,"used":false},{"PRN":31,"el":40,"az":66,"ss":12,"used":false},{"PRN":32,"el":39,"az":218,"ss":0,"used":false},{"PRN":20,"el":38,"az":248,"ss":0,"used":false},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165019.000,V,,,,,,,180710,,,N*48 $GPGGA,165020.000,,,,,0,00,,,M,0.0,M,,0000*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,16,74,173,,23,42,310,,31,40,066,12,32,39,218,*7B $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":50.00,"tdop":1.58,"hdop":50.00,"gdop":3.21,"pdop":50.00,"satellites":[{"PRN":16,"el":74,"az":173,"ss":0,"used":false},{"PRN":23,"el":42,"az":310,"ss":0,"used":false},{"PRN":31,"el":40,"az":66,"ss":12,"used":false},{"PRN":32,"el":39,"az":218,"ss":0,"used":false},{"PRN":20,"el":38,"az":248,"ss":0,"used":false},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165020.000,V,,,,,,,180710,,,N*42 $GPGGA,165021.000,,,,,0,00,,,M,0.0,M,,0000*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,16,74,173,,23,42,310,,31,40,066,12,32,39,218,*7B $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":50.00,"tdop":1.58,"hdop":50.00,"gdop":3.21,"pdop":50.00,"satellites":[{"PRN":16,"el":74,"az":173,"ss":0,"used":false},{"PRN":23,"el":42,"az":310,"ss":0,"used":false},{"PRN":31,"el":40,"az":66,"ss":12,"used":false},{"PRN":32,"el":39,"az":218,"ss":0,"used":false},{"PRN":20,"el":38,"az":248,"ss":0,"used":false},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165021.000,V,,,,,,,180710,,,N*43 $GPGGA,165022.000,,,,,0,00,,,M,0.0,M,,0000*54 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,10,16,74,173,,23,42,310,,31,40,066,12,32,39,218,*7B $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":50.00,"tdop":1.58,"hdop":50.00,"gdop":3.21,"pdop":50.00,"satellites":[{"PRN":16,"el":74,"az":173,"ss":0,"used":false},{"PRN":23,"el":42,"az":310,"ss":0,"used":false},{"PRN":31,"el":40,"az":66,"ss":12,"used":false},{"PRN":32,"el":39,"az":218,"ss":0,"used":false},{"PRN":20,"el":38,"az":248,"ss":0,"used":false},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165022.000,V,,,,,,,180710,,,N*40 $GPGGA,165044.000,4143.5985,N,08338.0820,W,1,03,2.2,204.1,M,-33.7,M,,0000*6B {"class":"TPV","mode":3,"time":"2010-07-18T16:50:44.000Z","ept":0.005,"lat":41.726641667,"lon":-83.634700000,"alt":204.100,"epx":12.698,"epy":17.990,"epv":1150.000,"speed":0.413,"climb":0.009,"eps":1.06,"epc":34.50} $GPGSA,A,2,31,23,16,,,,,,,,,,2.4,2.2,1.0*30 $GPGSV,3,1,10,16,74,173,26,23,42,310,21,31,40,066,23,32,39,218,*7E $GPGSV,3,2,10,20,38,248,,13,16,310,,06,15,156,,29,15,048,*7A $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":1.00,"tdop":1.58,"hdop":2.20,"gdop":3.21,"pdop":2.40,"satellites":[{"PRN":16,"el":74,"az":173,"ss":26,"used":true},{"PRN":23,"el":42,"az":310,"ss":21,"used":true},{"PRN":31,"el":40,"az":66,"ss":23,"used":true},{"PRN":32,"el":39,"az":218,"ss":0,"used":false},{"PRN":20,"el":38,"az":248,"ss":0,"used":false},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165044.000,A,4143.5985,N,08338.0820,W,0.00,,180710,,,A*66 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:44.000Z","ept":0.005,"lat":41.726641667,"lon":-83.634700000,"alt":204.100,"epx":12.698,"epy":17.990,"epv":1150.000,"track":0.0000,"speed":0.000,"climb":0.009,"eps":1.06,"epc":34.50} $GPGGA,165045.000,4143.6024,N,08338.0864,W,1,04,2.0,183.5,M,-33.7,M,,0000*66 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:45.000Z","ept":0.005,"lat":41.726706667,"lon":-83.634773333,"alt":183.500,"epx":12.698,"epy":17.990,"epv":23.000,"speed":9.453,"climb":-20.600,"eps":35.98,"epc":1173.00} $GPGSA,A,3,31,23,16,20,,,,,,,,,4.6,2.0,4.2*32 $GPGSV,3,1,10,16,74,173,27,23,42,310,19,31,40,066,23,32,39,218,*74 $GPGSV,3,2,10,20,38,248,19,13,16,310,,06,15,156,,29,15,048,*72 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":4.20,"tdop":1.58,"hdop":2.00,"gdop":3.21,"pdop":4.60,"satellites":[{"PRN":16,"el":74,"az":173,"ss":27,"used":true},{"PRN":23,"el":42,"az":310,"ss":19,"used":true},{"PRN":31,"el":40,"az":66,"ss":23,"used":true},{"PRN":32,"el":39,"az":218,"ss":0,"used":false},{"PRN":20,"el":38,"az":248,"ss":19,"used":true},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165045.000,A,4143.6024,N,08338.0864,W,2.19,176.03,180710,,,A*71 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:45.000Z","ept":0.005,"lat":41.726706667,"lon":-83.634773333,"alt":183.500,"epx":12.698,"epy":17.990,"epv":23.000,"track":176.0300,"speed":1.127,"climb":-20.600,"eps":35.98,"epc":1173.00} $GPGGA,165046.000,4143.6110,N,08338.0897,W,1,05,1.5,200.1,M,-33.7,M,,0000*64 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:46.000Z","ept":0.005,"lat":41.726850000,"lon":-83.634828333,"alt":200.100,"epx":12.698,"epy":17.990,"epv":96.600,"speed":16.564,"climb":16.600,"eps":35.98,"epc":119.60} $GPGSA,A,3,31,23,16,20,32,,,,,,,,4.0,1.5,3.6*30 $GPGSV,3,1,10,16,74,173,27,23,42,310,21,31,40,066,24,32,39,218,24*7E $GPGSV,3,2,10,20,38,248,19,13,16,310,,06,15,156,,29,15,048,*72 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":3.60,"tdop":1.58,"hdop":1.50,"gdop":3.21,"pdop":4.00,"satellites":[{"PRN":16,"el":74,"az":173,"ss":27,"used":true},{"PRN":23,"el":42,"az":310,"ss":21,"used":true},{"PRN":31,"el":40,"az":66,"ss":24,"used":true},{"PRN":32,"el":39,"az":218,"ss":24,"used":true},{"PRN":20,"el":38,"az":248,"ss":19,"used":true},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165046.000,A,4143.6110,N,08338.0897,W,0.44,323.72,180710,,,A*76 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:46.000Z","ept":0.005,"lat":41.726850000,"lon":-83.634828333,"alt":200.100,"epx":12.698,"epy":17.990,"epv":96.600,"track":323.7200,"speed":0.226,"climb":16.600,"eps":35.98,"epc":119.60} $GPGGA,165047.000,4143.6116,N,08338.0889,W,1,05,1.5,219.6,M,-33.7,M,,0000*63 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:47.000Z","ept":0.005,"lat":41.726860000,"lon":-83.634815000,"alt":219.600,"epx":12.698,"epy":17.990,"epv":82.800,"speed":1.570,"climb":19.500,"eps":35.98,"epc":179.40} $GPGSA,A,3,31,23,16,20,32,,,,,,,,4.0,1.5,3.6*30 $GPGSV,3,1,10,16,74,173,28,23,42,310,19,31,40,066,25,32,39,218,21*7E $GPGSV,3,2,10,20,38,248,19,13,16,310,,06,15,156,,29,15,048,*72 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":3.60,"tdop":1.58,"hdop":1.50,"gdop":3.21,"pdop":4.00,"satellites":[{"PRN":16,"el":74,"az":173,"ss":28,"used":true},{"PRN":23,"el":42,"az":310,"ss":19,"used":true},{"PRN":31,"el":40,"az":66,"ss":25,"used":true},{"PRN":32,"el":39,"az":218,"ss":21,"used":true},{"PRN":20,"el":38,"az":248,"ss":19,"used":true},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165047.000,A,4143.6116,N,08338.0889,W,0.76,13.73,180710,,,A*4E {"class":"TPV","mode":3,"time":"2010-07-18T16:50:47.000Z","ept":0.005,"lat":41.726860000,"lon":-83.634815000,"alt":219.600,"epx":12.698,"epy":17.990,"epv":82.800,"track":13.7300,"speed":0.391,"climb":19.500,"eps":35.98,"epc":179.40} $GPGGA,165048.000,4143.6118,N,08338.0890,W,1,05,1.5,210.3,M,-33.7,M,,0000*66 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:48.000Z","ept":0.005,"lat":41.726863333,"lon":-83.634816667,"alt":210.300,"epx":12.698,"epy":17.990,"epv":82.800,"speed":0.395,"climb":-9.300,"eps":35.98,"epc":165.60} $GPGSA,A,3,31,23,16,20,32,,,,,,,,4.0,1.5,3.6*30 $GPGSV,3,1,10,16,74,173,27,23,42,310,18,31,40,066,25,32,39,218,23*72 $GPGSV,3,2,10,20,38,248,20,13,16,310,,06,15,156,,29,15,048,*78 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":3.60,"tdop":1.58,"hdop":1.50,"gdop":3.21,"pdop":4.00,"satellites":[{"PRN":16,"el":74,"az":173,"ss":27,"used":true},{"PRN":23,"el":42,"az":310,"ss":18,"used":true},{"PRN":31,"el":40,"az":66,"ss":25,"used":true},{"PRN":32,"el":39,"az":218,"ss":23,"used":true},{"PRN":20,"el":38,"az":248,"ss":20,"used":true},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165048.000,A,4143.6118,N,08338.0890,W,0.71,20.56,180710,,,A*47 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:48.000Z","ept":0.005,"lat":41.726863333,"lon":-83.634816667,"alt":210.300,"epx":12.698,"epy":17.990,"epv":82.800,"track":20.5600,"speed":0.365,"climb":-9.300,"eps":35.98,"epc":165.60} $GPGGA,165049.000,4143.6110,N,08338.0882,W,1,05,1.5,212.3,M,-33.7,M,,0000*6E {"class":"TPV","mode":3,"time":"2010-07-18T16:50:49.000Z","ept":0.005,"lat":41.726850000,"lon":-83.634803333,"alt":212.300,"epx":12.698,"epy":17.990,"epv":82.800,"speed":1.850,"climb":2.000,"eps":35.98,"epc":165.60} $GPGSA,A,3,31,23,16,20,32,,,,,,,,4.0,1.5,3.6*30 $GPGSV,3,1,10,16,74,173,27,23,42,310,19,31,40,066,24,32,39,218,23*72 $GPGSV,3,2,10,20,38,248,20,13,16,310,,06,15,156,,29,15,048,*78 $GPGSV,3,3,10,03,08,171,,14,06,129,*7D {"class":"SKY","xdop":0.85,"ydop":1.20,"vdop":3.60,"tdop":1.58,"hdop":1.50,"gdop":3.21,"pdop":4.00,"satellites":[{"PRN":16,"el":74,"az":173,"ss":27,"used":true},{"PRN":23,"el":42,"az":310,"ss":19,"used":true},{"PRN":31,"el":40,"az":66,"ss":24,"used":true},{"PRN":32,"el":39,"az":218,"ss":23,"used":true},{"PRN":20,"el":38,"az":248,"ss":20,"used":true},{"PRN":13,"el":16,"az":310,"ss":0,"used":false},{"PRN":6,"el":15,"az":156,"ss":0,"used":false},{"PRN":29,"el":15,"az":48,"ss":0,"used":false},{"PRN":3,"el":8,"az":171,"ss":0,"used":false},{"PRN":14,"el":6,"az":129,"ss":0,"used":false}]} $GPRMC,165049.000,A,4143.6110,N,08338.0882,W,0.60,126.88,180710,,,A*79 {"class":"TPV","mode":3,"time":"2010-07-18T16:50:49.000Z","ept":0.005,"lat":41.726850000,"lon":-83.634803333,"alt":212.300,"epx":12.698,"epy":17.990,"epv":82.800,"track":126.8800,"speed":0.309,"climb":2.000,"eps":35.98,"epc":165.60} gpsd-3.15/test/daemon/garmin-geko201.log0000664000175000017500000002264412461156335016133 0ustar esresr# Name: Garmin Geko 201 # Chipset: Garmin proprietary # Submitter: "Jose Luis Domingo Lopez" # Date: 2005-06-14 # Location: Madrid, Madrid, Spain (ES), 40.39N 03.64E # Comments: This is demo-mode data, with no actual fixes. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPRMC,214350,V,4023.8600,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*21 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214350,4023.8600,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5A $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 $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 $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214352,V,4023.8660,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*25 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214352,4023.8660,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5E $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 $GPGLL,4023.8660,N,00339.1630,W,214352,V,S*53 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214354,V,4023.8720,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*26 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214354,4023.8720,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5D $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 $GPGLL,4023.8720,N,00339.1630,W,214354,V,S*50 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214356,V,4023.8780,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*2E $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214356,4023.8780,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*55 $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 $GPGLL,4023.8780,N,00339.1630,W,214356,V,S*58 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214358,V,4023.8840,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*23 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214358,4023.8840,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*58 $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 $GPGLL,4023.8840,N,00339.1630,W,214358,V,S*55 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214400,V,4023.8900,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*2C $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214400,4023.8900,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*57 $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 $GPGLL,4023.8900,N,00339.1630,W,214400,V,S*5A $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214402,V,4023.8960,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*28 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214402,4023.8960,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*53 $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 $GPGLL,4023.8960,N,00339.1630,W,214402,V,S*5E $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214404,V,4023.9021,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*23 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214404,4023.9021,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*58 $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 $GPGLL,4023.9021,N,00339.1630,W,214404,V,S*55 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214406,V,4023.9081,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*2B $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214406,4023.9081,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*50 $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 $GPGLL,4023.9081,N,00339.1630,W,214406,V,S*5D $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214408,V,4023.9141,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*28 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214408,4023.9141,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*53 $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 $GPGLL,4023.9141,N,00339.1630,W,214408,V,S*5E $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214410,V,4023.9201,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*26 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214410,4023.9201,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5D $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 $GPGLL,4023.9201,N,00339.1630,W,214410,V,S*50 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214412,V,4023.9261,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*22 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214412,4023.9261,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*59 $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 $GPGLL,4023.9261,N,00339.1630,W,214412,V,S*54 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214414,V,4023.9321,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*21 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214414,4023.9321,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5A $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 $GPGLL,4023.9321,N,00339.1630,W,214414,V,S*57 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214416,V,4023.9381,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*29 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214416,4023.9381,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*52 $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 $GPGLL,4023.9381,N,00339.1630,W,214416,V,S*5F $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214418,V,4023.9441,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*2C $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214418,4023.9441,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*57 $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 $GPGLL,4023.9441,N,00339.1630,W,214418,V,S*5A $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214420,V,4023.9501,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*22 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214420,4023.9501,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*59 $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 $GPGLL,4023.9501,N,00339.1630,W,214420,V,S*54 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214422,V,4023.9561,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*26 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214422,4023.9561,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5D $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 $GPGLL,4023.9561,N,00339.1630,W,214422,V,S*50 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214424,V,4023.9621,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*27 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214424,4023.9621,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5C $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 $GPGLL,4023.9621,N,00339.1630,W,214424,V,S*51 $GPBOD,,T,,M,,* gpsd-3.15/test/daemon/garmin-geko201.log.chk0000664000175000017500000004520212467340617016676 0ustar esresr$GPRMC,214350,V,4023.8600,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*21 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214350,4023.8600,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5A {"class":"TPV","mode":3,"lat":40.397666667,"lon":-3.652716667,"alt":695.700} $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A {"class":"TPV","mode":3,"lat":40.397666667,"lon":-3.652716667,"alt":695.700,"epv":69.000} $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","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 $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214352,V,4023.8660,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*25 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214352,4023.8660,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5E $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214354,V,4023.8720,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*26 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214354,4023.8720,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5D $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214356,V,4023.8780,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*2E $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214356,4023.8780,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*55 $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214358,V,4023.8840,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*23 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214358,4023.8840,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*58 $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214400,V,4023.8900,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*2C $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214400,4023.8900,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*57 $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214402,V,4023.8960,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*28 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214402,4023.8960,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*53 $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214404,V,4023.9021,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*23 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214404,4023.9021,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*58 $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214406,V,4023.9081,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*2B $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214406,4023.9081,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*50 $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214408,V,4023.9141,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*28 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214408,4023.9141,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*53 $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214410,V,4023.9201,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*26 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214410,4023.9201,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5D $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214412,V,4023.9261,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*22 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214412,4023.9261,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*59 $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214414,V,4023.9321,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*21 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214414,4023.9321,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5A $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","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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214416,V,4023.9381,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*29 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214416,4023.9381,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*52 $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","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":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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214418,V,4023.9441,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*2C $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214418,4023.9441,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*57 $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","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":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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214420,V,4023.9501,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*22 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214420,4023.9501,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*59 $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","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":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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214422,V,4023.9561,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*26 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214422,4023.9561,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5D $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","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":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 $GPBOD,,T,,M,,*47 $PGRME,15.0,M,22.5,M,27.0,M*1A $PGRMZ,2282,f,3*21 $GPRTE,1,1,c,*37 $GPRMC,214424,V,4023.9621,N,00339.1630,W,10.8,0.0,140605,2.5,W,S*27 $GPRMB,V,,,,,,,,,,,,A,S*0E $GPGGA,214424,4023.9621,N,00339.1630,W,8,09,2.0,695.7,M,51.6,M,,*5C $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","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":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 gpsd-3.15/test/daemon/garmin17n.log0000664000175000017500000000247112461156335015307 0ustar esresr# Name: Garmin 17N # Chipset: # Submitter: Wojciech Kazubski # Comment: Only emits GPRMC when it has a fix. # Date: 2005-03-12 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPRMC,093802,A,5213.1439,N,02100.6511,E,000.0,226.0,160305,004.2,E,D*15 $GPGGA,093802,5213.1439,N,02100.6511,E,2,10,0.9,137.2,M,36.2,M,,*43 $GPGSA,A,3,03,06,15,16,18,19,21,22,,27,29,,1.6,0.9,1.3*34 $GPGSV,3,2,12,18,50,135,50,19,15,291,46,21,59,069,51,22,30,169,49*75 $PGRME,1.7,M,2.4,M,3.0,M*2D $GPGLL,5213.1439,N,02100.6511,E,093802,A,D*48 $GPVTG,226,T,222,M,000.0,N,0000.0,K,D*12 $PGRMV,0.0,0.0,0.0*5C $PGRMF,290,293895,160305,093802,13,5213.1439,N,02100.6511,E,A,2,0,226,2,1*11 $PGRMB,0.0,200,,,,K,,W,W*31 $PGRMM,WGS 84*06 $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 $PGRME,1.7,M,2.4,M,3.0,M*2D $GPGLL,5213.1439,N,02100.6511,E,093803,A,D*49 $GPVTG,226,T,222,M,000.0,N,0000.0,K,D*12 $PGRMV,0.0,0.0,0.0*5C $PGRMF,290,293896,160305,093803,13,5213.1439,N,02100.6511,E,A,2,0,226,2,1*13 $PGRMB,0.0,200,,,,K,,W,W*31 $PGRMM,WGS 84*06 gpsd-3.15/test/daemon/garmin17n.log.chk0000664000175000017500000000461012467340617016054 0ustar esresr$GPRMC,093802,A,5213.1439,N,02100.6511,E,000.0,226.0,160305,004.2,E,D*15 {"class":"TPV","mode":2,"time":"2005-03-16T09:38:02.000Z","ept":0.005,"lat":52.219065000,"lon":21.010851667,"track":226.0000,"speed":0.000} $GPGGA,093802,5213.1439,N,02100.6511,E,2,10,0.9,137.2,M,36.2,M,,*43 {"class":"TPV","mode":3,"time":"2005-03-16T09:38:02.000Z","ept":0.005,"lat":52.219065000,"lon":21.010851667,"alt":137.200,"track":226.0000,"speed":0.000} $GPGSA,A,3,03,06,15,16,18,19,21,22,,27,29,,1.6,0.9,1.3*34 {"class":"TPV","mode":3,"time":"2005-03-16T09:38:02.000Z","ept":0.005,"lat":52.219065000,"lon":21.010851667,"alt":137.200,"epv":7.475,"track":226.0000,"speed":0.000,"climb":0.000} $GPGSV,3,2,12,18,50,135,50,19,15,291,46,21,59,069,51,22,30,169,49*75 $PGRME,1.7,M,2.4,M,3.0,M*2D $GPGLL,5213.1439,N,02100.6511,E,093802,A,D*48 {"class":"TPV","mode":3,"time":"2005-03-16T09:38:02.000Z","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} $GPVTG,226,T,222,M,000.0,N,0000.0,K,D*12 $PGRMV,0.0,0.0,0.0*5C $PGRMF,290,293895,160305,093802,13,5213.1439,N,02100.6511,E,A,2,0,226,2,1*11 $PGRMB,0.0,200,,,,K,,W,W*31 $PGRMM,WGS 84*06 $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","xdop":0.86,"ydop":0.85,"vdop":1.30,"tdop":1.11,"hdop":0.90,"gdop":2.71,"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":131,"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","mode":3,"time":"2005-03-16T09:38:03.000Z","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} $GPVTG,226,T,222,M,000.0,N,0000.0,K,D*12 $PGRMV,0.0,0.0,0.0*5C $PGRMF,290,293896,160305,093803,13,5213.1439,N,02100.6511,E,A,2,0,226,2,1*13 $PGRMB,0.0,200,,,,K,,W,W*31 $PGRMM,WGS 84*06 gpsd-3.15/test/daemon/garmin25lp.log0000664000175000017500000001451612461156335015467 0ustar esresr# Name: Garmin 25LP # Chipset: Garmin proprietary, emits NMEA 2.0 # Submitter: Daniele Giangrazi # Date: 2005-03-22 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPRMC,120316,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*63 $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B $GPRMC,120317,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*62 $GPGGA,120317,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*59 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B $GPRMC,120318,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*6D $GPGGA,120318,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B $GPRMC,120319,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*6C $GPGGA,120319,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B $GPRMC,120320,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*66 $GPGGA,120320,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*5D $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B $GPRMC,120321,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*67 $GPGGA,120321,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*5C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPRMC,120322,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*64 $GPGGA,120322,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPRMC,120323,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*65 $GPGGA,120323,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*5E $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPRMC,120324,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*62 $GPGGA,120324,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*59 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPRMC,120325,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*63 $GPGGA,120325,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*58 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,08,01,10,158,44,03,72,164,42,11,24,279,,14,30,119,48*74 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPRMC,120326,A,4221.3871,N,01322.0800,E,000.0,000.0,150305,001.4,E*77 $GPGGA,120326,4221.3871,N,01322.0800,E,1,00,3.1,746.1,M,44.2,M,,*40 $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPRMC,120327,A,4221.3872,N,01322.0800,E,000.0,000.0,150305,001.4,E*75 $GPGGA,120327,4221.3872,N,01322.0800,E,1,03,3.1,746.1,M,44.2,M,,*41 $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPRMC,120328,A,4221.3873,N,01322.0800,E,000.0,000.0,150305,001.4,E*7B $GPGGA,120328,4221.3873,N,01322.0800,E,1,03,3.1,746.1,M,44.2,M,,*4F $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 $GPRMC,120329,A,4221.3874,N,01322.0805,E,000.0,000.0,150305,001.4,E*78 $GPGGA,120329,4221.3874,N,01322.0805,E,1,03,3.1,746.1,M,44.2,M,,*4C $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 $GPRMC,120330,A,4221.3875,N,01322.0807,E,000.0,000.0,150305,001.4,E*73 $GPGGA,120330,4221.3875,N,01322.0807,E,1,03,3.1,746.1,M,44.2,M,,*47 $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 $GPRMC,120331,A,4221.3880,N,01322.0808,E,000.0,000.0,150305,001.4,E*77 $GPGGA,120331,4221.3880,N,01322.0808,E,1,03,3.1,746.1,M,44.2,M,,*43 $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 $GPRMC,120332,A,4221.3884,N,01322.0802,E,000.0,000.0,150305,001.4,E*7A $GPGGA,120332,4221.3884,N,01322.0802,E,1,03,3.1,746.1,M,44.2,M,,*4E $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 $GPRMC,120333,A,4221.3889,N,01322.0794,E,000.0,000.0,150305,001.4,E*76 $GPGGA,120333,4221.3889,N,01322.0794,E,1,03,3.1,746.1,M,44.2,M,,*42 $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 $GPRMC,120334,A,4221.3893,N,01322.0786,E,000.0,000.0,150305,001.4,E*79 $GPGGA,120334,4221.3893,N,01322.0786,E,1,03,3.1,746.1,M,44.2,M,,*4D $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 $GPRMC,120335,A,4221.3898,N,01322.0780,E,000.0,000.0,150305,001.4,E*75 $GPGGA,120335,4221.3898,N,01322.0780,E,1,03,3.1,746.1,M,44.2,M,,*41 $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 gpsd-3.15/test/daemon/garmin25lp.log.chk0000664000175000017500000004113012467340617016227 0ustar esresr$GPRMC,120316,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*63 $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":false},{"PRN":3,"el":72,"az":164,"ss":41,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":40,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120317,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*62 $GPGGA,120317,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*59 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":false},{"PRN":3,"el":72,"az":164,"ss":41,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":40,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120318,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*6D $GPGGA,120318,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*56 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":false},{"PRN":3,"el":72,"az":164,"ss":41,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":40,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120319,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*6C $GPGGA,120319,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":false},{"PRN":3,"el":72,"az":164,"ss":41,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":40,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120320,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*66 $GPGGA,120320,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*5D $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,40,16,05,184,,18,20,046,,19,73,304,*7B {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":false},{"PRN":3,"el":72,"az":164,"ss":41,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":40,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120321,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*67 $GPGGA,120321,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*5C $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,08,01,10,158,45,03,72,164,41,11,24,279,,14,30,119,48*76 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":false},{"PRN":3,"el":72,"az":164,"ss":41,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120322,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*64 $GPGGA,120322,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":false},{"PRN":3,"el":72,"az":164,"ss":42,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120323,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*65 $GPGGA,120323,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*5E $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":false},{"PRN":3,"el":72,"az":164,"ss":42,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120324,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*62 $GPGGA,120324,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*59 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":false},{"PRN":3,"el":72,"az":164,"ss":42,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120325,V,4221.4394,N,01321.9948,E,000.0,000.0,150305,001.4,E*63 $GPGGA,120325,4221.4394,N,01321.9948,E,0,00,,,M,,M,,*58 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,08,01,10,158,44,03,72,164,42,11,24,279,,14,30,119,48*74 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 {"class":"SKY","satellites":[{"PRN":1,"el":10,"az":158,"ss":44,"used":false},{"PRN":3,"el":72,"az":164,"ss":42,"used":false},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":false},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120326,A,4221.3871,N,01322.0800,E,000.0,000.0,150305,001.4,E*77 {"class":"TPV","mode":2,"time":"2005-03-15T12:03:26.000Z","ept":0.005,"lat":42.356451667,"lon":13.368000000,"track":0.0000,"speed":0.000} $GPGGA,120326,4221.3871,N,01322.0800,E,1,00,3.1,746.1,M,44.2,M,,*40 {"class":"TPV","mode":3,"time":"2005-03-15T12:03:26.000Z","ept":0.005,"lat":42.356451667,"lon":13.368000000,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120327,A,4221.3872,N,01322.0800,E,000.0,000.0,150305,001.4,E*75 $GPGGA,120327,4221.3872,N,01322.0800,E,1,03,3.1,746.1,M,44.2,M,,*41 {"class":"TPV","mode":3,"time":"2005-03-15T12:03:27.000Z","ept":0.005,"lat":42.356453333,"lon":13.368000000,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,2,1,08,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,2,2,08,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false}]} $GPRMC,120328,A,4221.3873,N,01322.0800,E,000.0,000.0,150305,001.4,E*7B $GPGGA,120328,4221.3873,N,01322.0800,E,1,03,3.1,746.1,M,44.2,M,,*4F {"class":"TPV","mode":3,"time":"2005-03-15T12:03:28.000Z","ept":0.005,"lat":42.356455000,"lon":13.368000000,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false},{"PRN":22,"el":50,"az":54,"ss":0,"used":false}]} $GPRMC,120329,A,4221.3874,N,01322.0805,E,000.0,000.0,150305,001.4,E*78 $GPGGA,120329,4221.3874,N,01322.0805,E,1,03,3.1,746.1,M,44.2,M,,*4C {"class":"TPV","mode":3,"time":"2005-03-15T12:03:29.000Z","ept":0.005,"lat":42.356456667,"lon":13.368008333,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,48*75 $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":48,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false},{"PRN":22,"el":50,"az":54,"ss":0,"used":false}]} $GPRMC,120330,A,4221.3875,N,01322.0807,E,000.0,000.0,150305,001.4,E*73 $GPGGA,120330,4221.3875,N,01322.0807,E,1,03,3.1,746.1,M,44.2,M,,*47 {"class":"TPV","mode":3,"time":"2005-03-15T12:03:30.000Z","ept":0.005,"lat":42.356458333,"lon":13.368011667,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":47,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false},{"PRN":22,"el":50,"az":54,"ss":0,"used":false}]} $GPRMC,120331,A,4221.3880,N,01322.0808,E,000.0,000.0,150305,001.4,E*77 $GPGGA,120331,4221.3880,N,01322.0808,E,1,03,3.1,746.1,M,44.2,M,,*43 {"class":"TPV","mode":3,"time":"2005-03-15T12:03:31.000Z","ept":0.005,"lat":42.356466667,"lon":13.368013333,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":47,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false},{"PRN":22,"el":50,"az":54,"ss":0,"used":false}]} $GPRMC,120332,A,4221.3884,N,01322.0802,E,000.0,000.0,150305,001.4,E*7A $GPGGA,120332,4221.3884,N,01322.0802,E,1,03,3.1,746.1,M,44.2,M,,*4E {"class":"TPV","mode":3,"time":"2005-03-15T12:03:32.000Z","ept":0.005,"lat":42.356473333,"lon":13.368003333,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":47,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false},{"PRN":22,"el":50,"az":54,"ss":0,"used":false}]} $GPRMC,120333,A,4221.3889,N,01322.0794,E,000.0,000.0,150305,001.4,E*76 $GPGGA,120333,4221.3889,N,01322.0794,E,1,03,3.1,746.1,M,44.2,M,,*42 {"class":"TPV","mode":3,"time":"2005-03-15T12:03:33.000Z","ept":0.005,"lat":42.356481667,"lon":13.367990000,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":47,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false},{"PRN":22,"el":50,"az":54,"ss":0,"used":false}]} $GPRMC,120334,A,4221.3893,N,01322.0786,E,000.0,000.0,150305,001.4,E*79 $GPGGA,120334,4221.3893,N,01322.0786,E,1,03,3.1,746.1,M,44.2,M,,*4D {"class":"TPV","mode":3,"time":"2005-03-15T12:03:34.000Z","ept":0.005,"lat":42.356488333,"lon":13.367976667,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":47,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false},{"PRN":22,"el":50,"az":54,"ss":0,"used":false}]} $GPRMC,120335,A,4221.3898,N,01322.0780,E,000.0,000.0,150305,001.4,E*75 $GPGGA,120335,4221.3898,N,01322.0780,E,1,03,3.1,746.1,M,44.2,M,,*41 {"class":"TPV","mode":3,"time":"2005-03-15T12:03:35.000Z","ept":0.005,"lat":42.356496667,"lon":13.367966667,"alt":746.100,"track":0.0000,"speed":0.000} $GPGSA,A,2,01,03,,14,,,,,,,,,3.1,3.1,*1A $GPGSV,3,1,09,01,10,158,45,03,72,164,42,11,24,279,,14,30,119,47*7A $GPGSV,3,2,09,15,33,070,39,16,05,184,,18,20,046,,19,73,304,*75 $GPGSV,3,3,09,22,50,054,,,,,,,,,,,,,*44 {"class":"SKY","hdop":3.10,"pdop":3.10,"satellites":[{"PRN":1,"el":10,"az":158,"ss":45,"used":true},{"PRN":3,"el":72,"az":164,"ss":42,"used":true},{"PRN":11,"el":24,"az":279,"ss":0,"used":false},{"PRN":14,"el":30,"az":119,"ss":47,"used":true},{"PRN":15,"el":33,"az":70,"ss":39,"used":false},{"PRN":16,"el":5,"az":184,"ss":0,"used":false},{"PRN":18,"el":20,"az":46,"ss":0,"used":false},{"PRN":19,"el":73,"az":304,"ss":0,"used":false},{"PRN":22,"el":50,"az":54,"ss":0,"used":false}]} gpsd-3.15/test/daemon/garmin38.log0000664000175000017500000000531512461156335015134 0ustar esresr# Name: Garmin 38 # Submitter: "Pascal F. Martin" # Date: 2005-03-18 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $PGRME,19.2,M,28.7,M,34.6,M*18 $GPGLL,3348.452,N,11821.142,W,142214,A*3B $PGRMZ,125,f,3*1D $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142216,A,3348.452,N,11821.143,W,000.0,353.6,081002,013.8,E*66 $GPRMB,A,,,,,,,,,,,,V*71 $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 $PGRME,19.2,M,28.7,M,34.6,M*18 $GPGLL,3348.452,N,11821.143,W,142216,A*38 $PGRMZ,126,f,3*1E $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142218,A,3348.451,N,11821.144,W,000.0,353.6,081002,013.8,E*6C $GPRMB,A,,,,,,,,,,,,V*71 $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 $PGRME,19.2,M,28.7,M,34.6,M*18 $GPGLL,3348.451,N,11821.144,W,142218,A*32 $PGRMZ,126,f,3*1E $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142220,A,3348.451,N,11821.142,W,000.0,353.6,081002,013.8,E*61 $GPRMB,A,,,,,,,,,,,,V*71 $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 $PGRME,19.2,M,28.7,M,34.6,M*18 $GPGLL,3348.451,N,11821.142,W,142220,A*3F $PGRMZ,123,f,3*1B $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142222,A,3348.451,N,11821.143,W,000.0,353.6,081002,013.8,E*62 $GPRMB,A,,,,,,,,,,,,V*71 $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 $PGRME,19.2,M,28.9,M,34.7,M*17 $GPGLL,3348.451,N,11821.143,W,142222,A*3C $PGRMZ,125,f,3*1D $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142224,A,3348.451,N,11821.143,W,000.0,353.6,081002,013.8,E*64 $GPRMB,A,,,,,,,,,,,,V*71 $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 $PGRME,19.2,M,28.9,M,34.7,M*17 $GPGLL,3348.451,N,11821.143,W,142224,A*3A $PGRMZ,125,f,3*1D gpsd-3.15/test/daemon/garmin38.log.chk0000664000175000017500000001402512467340617015702 0ustar esresr$PGRME,19.2,M,28.7,M,34.6,M*18 $GPGLL,3348.452,N,11821.142,W,142214,A*3B {"class":"TPV","mode":2,"lat":33.807533333,"lon":-118.352366667} $PGRMZ,125,f,3*1D $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142216,A,3348.452,N,11821.143,W,000.0,353.6,081002,013.8,E*66 $GPRMB,A,,,,,,,,,,,,V*71 $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","xdop":1.56,"ydop":0.91,"vdop":2.80,"tdop":1.99,"hdop":1.80,"gdop":3.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}]} $PGRME,19.2,M,28.7,M,34.6,M*18 $GPGLL,3348.452,N,11821.143,W,142216,A*38 {"class":"TPV","mode":3,"time":"2002-10-08T14:22:16.000Z","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} $PGRMZ,126,f,3*1E $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142218,A,3348.451,N,11821.144,W,000.0,353.6,081002,013.8,E*6C $GPRMB,A,,,,,,,,,,,,V*71 $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","xdop":1.56,"ydop":0.91,"vdop":2.80,"tdop":1.99,"hdop":1.80,"gdop":3.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}]} $PGRME,19.2,M,28.7,M,34.6,M*18 $GPGLL,3348.451,N,11821.144,W,142218,A*32 {"class":"TPV","mode":3,"time":"2002-10-08T14:22:18.000Z","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":25.77} $PGRMZ,126,f,3*1E $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142220,A,3348.451,N,11821.142,W,000.0,353.6,081002,013.8,E*61 $GPRMB,A,,,,,,,,,,,,V*71 $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","xdop":1.56,"ydop":0.91,"vdop":2.80,"tdop":1.99,"hdop":1.80,"gdop":3.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}]} $PGRME,19.2,M,28.7,M,34.6,M*18 $GPGLL,3348.451,N,11821.142,W,142220,A*3F {"class":"TPV","mode":3,"time":"2002-10-08T14:22:20.000Z","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":25.77} $PGRMZ,123,f,3*1B $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142222,A,3348.451,N,11821.143,W,000.0,353.6,081002,013.8,E*62 $GPRMB,A,,,,,,,,,,,,V*71 $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","xdop":1.56,"ydop":0.91,"vdop":2.80,"tdop":1.99,"hdop":1.80,"gdop":3.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}]} $PGRME,19.2,M,28.9,M,34.7,M*17 $GPGLL,3348.451,N,11821.143,W,142222,A*3C {"class":"TPV","mode":3,"time":"2002-10-08T14:22:22.000Z","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":25.77} $PGRMZ,125,f,3*1D $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,142224,A,3348.451,N,11821.143,W,000.0,353.6,081002,013.8,E*64 $GPRMB,A,,,,,,,,,,,,V*71 $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","xdop":1.56,"ydop":0.91,"vdop":2.80,"tdop":1.99,"hdop":1.80,"gdop":3.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}]} $PGRME,19.2,M,28.9,M,34.7,M*17 $GPGLL,3348.451,N,11821.143,W,142224,A*3A {"class":"TPV","mode":3,"time":"2002-10-08T14:22:24.000Z","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":25.77} $PGRMZ,125,f,3*1D gpsd-3.15/test/daemon/garmin48.log0000664000175000017500000001053012461156335015130 0ustar esresr# Name: Garmin 48 # Chipset: Garmin proprietary # Description: a handheld from about 2000. # # Note that the GPGLL timestamp has a 1-second offset # from the GPRMC and GPGGA timestamps. Appears to take 2 fixes # per cycle, GLL can include a fix update! # # Submitter: Hamish # Date: 2005-03-11 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPRMC,225308,A,4527.458,S,16709.165,E,000.0,094.5,060601,024.1,E*6D $GPRMB,A,,,,,,,,,,,,V*71 $GPGGA,225308,4527.458,S,16709.165,E,1,05,2.1,14.7,M,1.1,M,,*53 $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 $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 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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 $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 $PGRME,9.1,M,15.0,M,12.0,M*21 $GPGLL,4527.458,S,16709.165,E,225311,A*37 $PGRMZ,48,f,3*27 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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 $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 $PGRME,9.2,M,15.0,M,12.6,M*24 $GPGLL,4527.458,S,16709.165,E,225313,A*35 $PGRMZ,48,f,3*27 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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 $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 $PGRME,9.2,M,15.0,M,12.6,M*24 $GPGLL,4527.458,S,16709.165,E,225315,A*33 $PGRMZ,48,f,3*27 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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 $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 $PGRME,9.2,M,15.0,M,12.6,M*24 $GPGLL,4527.458,S,16709.165,E,225317,A*31 $PGRMZ,46,f,3*29 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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 $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 $PGRME,10.3,M,15.2,M,16.7,M*1A $GPGLL,4527.458,S,16709.165,E,225333,A*37 $PGRMZ,41,f,3*2E $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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 $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 $PGRME,10.3,M,15.2,M,16.7,M*1A $GPGLL,4527.458,S,16709.165,E,225335,A*31 $PGRMZ,41,f,3*2E $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 gpsd-3.15/test/daemon/garmin48.log.chk0000664000175000017500000002544412467340617015712 0ustar esresr$GPRMC,225308,A,4527.458,S,16709.165,E,000.0,094.5,060601,024.1,E*6D {"class":"TPV","mode":2,"time":"2001-06-06T22:53:08.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"track":94.5000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPGGA,225308,4527.458,S,16709.165,E,1,05,2.1,14.7,M,1.1,M,,*53 {"class":"TPV","mode":3,"time":"2001-06-06T22:53:08.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.700,"track":94.5000,"speed":0.000} $GPGSA,A,3,01,,,,13,20,22,,,,28,,3.1,2.1,2.0*3A {"class":"TPV","mode":3,"time":"2001-06-06T22:53:08.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.700,"epv":46.000,"track":94.5000,"speed":0.000,"climb":0.000} $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","xdop":1.90,"ydop":1.34,"vdop":2.00,"tdop":2.92,"hdop":2.10,"gdop":5.08,"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 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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","mode":3,"time":"2001-06-06T22:53:10.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.600,"epx":28.498,"epy":20.134,"epv":46.000,"track":94.5000,"speed":0.000,"eps":57.00} $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","xdop":1.90,"ydop":1.34,"vdop":2.00,"tdop":2.92,"hdop":2.10,"gdop":5.08,"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","mode":2,"time":"2001-06-06T22:53:11.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":28.498,"epy":20.134,"speed":0.000,"eps":41.86} $PGRMZ,48,f,3*27 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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","mode":3,"time":"2001-06-06T22:53:12.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.700,"epx":28.498,"epy":20.134,"epv":46.000,"track":94.5000,"speed":0.000,"eps":57.00} $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","xdop":1.90,"ydop":1.34,"vdop":2.10,"tdop":2.92,"hdop":2.20,"gdop":5.08,"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","mode":2,"time":"2001-06-06T22:53:13.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":28.498,"epy":20.134,"speed":0.000,"eps":42.00} $PGRMZ,48,f,3*27 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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","mode":3,"time":"2001-06-06T22:53:14.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.600,"epx":28.498,"epy":20.134,"epv":48.300,"track":94.5000,"speed":0.000,"eps":57.00} $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","xdop":1.90,"ydop":1.34,"vdop":2.10,"tdop":2.92,"hdop":2.20,"gdop":5.08,"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","mode":2,"time":"2001-06-06T22:53:15.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":28.498,"epy":20.134,"speed":0.000,"eps":42.00} $PGRMZ,48,f,3*27 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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","mode":3,"time":"2001-06-06T22:53:16.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.400,"epx":28.498,"epy":20.134,"epv":48.300,"track":94.5000,"speed":0.000,"eps":57.00} $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","xdop":1.90,"ydop":1.34,"vdop":2.10,"tdop":2.92,"hdop":2.20,"gdop":5.08,"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","mode":2,"time":"2001-06-06T22:53:17.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":28.498,"epy":20.134,"speed":0.000,"eps":42.00} $PGRMZ,46,f,3*29 $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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","mode":3,"time":"2001-06-06T22:53:18.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.000,"epx":28.498,"epy":20.134,"epv":48.300,"track":94.5000,"speed":0.000,"eps":57.00} $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,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","xdop":1.90,"ydop":1.34,"vdop":2.10,"tdop":2.92,"hdop":2.20,"gdop":5.08,"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","mode":2,"time":"2001-06-06T22:53:33.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":28.498,"epy":20.134,"speed":0.000,"eps":2.91} $PGRMZ,41,f,3*2E $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $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","mode":3,"time":"2001-06-06T22:53:34.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":12.500,"epx":28.498,"epy":20.134,"epv":48.300,"track":94.5000,"speed":0.000,"eps":57.00} $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","xdop":1.90,"ydop":1.34,"vdop":3.00,"tdop":2.92,"hdop":2.40,"gdop":5.08,"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","mode":2,"time":"2001-06-06T22:53:35.000Z","ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":28.498,"epy":20.134,"speed":0.000,"eps":43.62} $PGRMZ,41,f,3*2E $PGRMM,WGS 84*06 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 gpsd-3.15/test/daemon/geos-1m.log0000664000175000017500000000525012467341115014750 0ustar esresr# Name: GeoS 1M # Description: A combined GPS/GLONASS OEM receiver board, 24 channels # Submitter: Viktar Palstsiuk # Date: 2010-07-09 # Location: Minsk, Belarus, 53N 27E # Notes: NMEA output for a few seconds after power-up # $GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 $GPGSV,1,1,00*79 $GPRMC,000039.00,V,,,,,,,010108,,,N*7F $GPGGA,000040.00,,,,,0,,,,,,,,*4C $GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 $GPGSV,1,1,00*79 $GPRMC,000040.00,V,,,,,,,010108,,,N*71 $GPGGA,000041.00,,,,,0,,,,,,,,*4D $GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 $GPGSV,1,1,00*79 $GPRMC,000041.00,V,,,,,,,010108,,,N*70 $GPGGA,073658.00,,,,,0,,,,,,,,*47 $GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 $GPGSV,1,1,00*79 $GPRMC,073658.00,V,,,,,,,090710,,,N*7D $GPGGA,073659.00,,,,,0,,,,,,,,*46 $GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 $GPGSV,1,1,01,75,16,224,*49 $GPRMC,073659.00,V,,,,,,,090710,,,N*7C $GPGGA,073700.00,,,,,0,,,,,,,,*4B $GPGSA,A,1,13,16,06,23,73,,,,,,,,9.9,9.9,9.9*36 $GPGSV,1,1,01,75,16,224,*49 $GPRMC,073700.00,V,,,,,,,090710,,,N*71 $GPGGA,073701.00,5355.1495,N,02729.9417,E,1,05,1.7,00242.2,M,0023.3,M,,*63 $GPGSA,A,3,13,16,06,23,73,,,,,,,,2.3,1.7,1.6*34 $GPGSV,1,1,01,75,16,224,*49 $GPRMC,073701.00,A,5355.1495,N,02729.9417,E,000.06702,356.9,090710,,,A*53 $GPGGA,073702.00,5355.1508,N,02729.9466,E,1,05,8.3,00244.1,M,0023.3,M,,*6B $GPGSA,A,3,13,16,06,23,73,,,,,,,,9.9,8.3,8.4*33 $GPGSV,1,1,01,75,16,224,*49 $GPRMC,073702.00,A,5355.1508,N,02729.9466,E,000.07498,266.1,090710,,,A*58 $GPGGA,073703.00,5355.1508,N,02729.9466,E,1,05,8.3,00244.1,M,0023.3,M,,*6A $GPGSA,A,3,13,16,06,23,73,,,,,,,,9.9,8.3,8.4*33 $GPGSV,1,1,01,75,16,224,*49 $GPRMC,073703.00,A,5355.1508,N,02729.9466,E,000.07498,266.1,090710,,,A*59 $GPGGA,073705.00,5355.1534,N,02729.9549,E,1,05,1.7,00250.9,M,0023.2,M,,*6E $GPGSA,A,3,13,16,06,23,73,,,,,,,,2.3,1.7,1.6*34 $GPGSV,1,1,02,75,16,224,,81,12,346,*71 $GPRMC,073705.00,A,5355.1534,N,02729.9549,E,000.10468,235.7,090710,,,A*55 $GPGGA,073706.00,5355.1542,N,02729.9565,E,1,05,8.3,00253.6,M,0023.3,M,,*62 $GPGSA,A,3,13,16,06,23,73,,,,,,,,9.9,8.3,8.3*34 $GPGSV,1,1,03,75,16,224,,81,12,346,,82,13,037,*4C $GPRMC,073706.00,A,5355.1542,N,02729.9565,E,000.11095,243.8,090710,,,A*50 $GPGGA,073707.00,5355.1552,N,02729.9598,E,1,05,1.7,00256.1,M,0023.3,M,,*6F $GPGSA,A,3,13,16,06,23,73,,,,,,,,2.3,1.7,1.6*34 $GPGSV,1,1,03,75,16,224,,81,12,346,,82,13,037,*4C $GPRMC,073707.00,A,5355.1552,N,02729.9598,E,000.08909,042.3,090710,,,A*5E $GPGGA,073708.00,5355.1559,N,02729.9626,E,1,05,8.3,00258.9,M,0023.3,M,,*66 $GPGSA,A,3,13,16,06,23,73,,,,,,,,9.9,8.3,8.3*34 $GPGSV,1,1,03,75,16,224,,81,12,346,,82,13,037,*4C $GPRMC,073708.00,A,5355.1559,N,02729.9626,E,000.27917,064.3,090710,,,A*5A gpsd-3.15/test/daemon/geos-1m.log.chk0000664000175000017500000001262612467341115015521 0ustar esresr$GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 {"class":"TPV","mode":1} $GPGSV,1,1,00*79 $GPRMC,000039.00,V,,,,,,,010108,,,N*7F $GPGGA,000040.00,,,,,0,,,,,,,,*4C $GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 {"class":"TPV","mode":1} $GPGSV,1,1,00*79 $GPRMC,000040.00,V,,,,,,,010108,,,N*71 $GPGGA,000041.00,,,,,0,,,,,,,,*4D $GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 {"class":"TPV","mode":1} $GPGSV,1,1,00*79 $GPRMC,000041.00,V,,,,,,,010108,,,N*70 $GPGGA,073658.00,,,,,0,,,,,,,,*47 $GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 {"class":"TPV","mode":1} $GPGSV,1,1,00*79 $GPRMC,073658.00,V,,,,,,,090710,,,N*7D $GPGGA,073659.00,,,,,0,,,,,,,,*46 $GPGSA,A,1,,,,,,,,,,,,,9.9,9.9,9.9*30 {"class":"TPV","mode":1} $GPGSV,1,1,01,75,16,224,*49 {"class":"SKY","vdop":9.90,"hdop":9.90,"pdop":9.90,"satellites":[{"PRN":75,"el":16,"az":224,"ss":0,"used":false}]} $GPRMC,073659.00,V,,,,,,,090710,,,N*7C $GPGGA,073700.00,,,,,0,,,,,,,,*4B $GPGSA,A,1,13,16,06,23,73,,,,,,,,9.9,9.9,9.9*36 {"class":"TPV","mode":1} $GPGSV,1,1,01,75,16,224,*49 {"class":"SKY","vdop":9.90,"hdop":9.90,"pdop":9.90,"satellites":[{"PRN":75,"el":16,"az":224,"ss":0,"used":false}]} $GPRMC,073700.00,V,,,,,,,090710,,,N*71 $GPGGA,073701.00,5355.1495,N,02729.9417,E,1,05,1.7,00242.2,M,0023.3,M,,*63 {"class":"TPV","mode":3,"lat":53.919158333,"lon":27.499028333,"alt":242.200,"epv":227.700} $GPGSA,A,3,13,16,06,23,73,,,,,,,,2.3,1.7,1.6*34 {"class":"TPV","mode":3,"lat":53.919158333,"lon":27.499028333,"alt":242.200,"epv":227.700} $GPGSV,1,1,01,75,16,224,*49 {"class":"SKY","vdop":1.60,"hdop":1.70,"pdop":2.30,"satellites":[{"PRN":75,"el":16,"az":224,"ss":0,"used":false}]} $GPRMC,073701.00,A,5355.1495,N,02729.9417,E,000.06702,356.9,090710,,,A*53 {"class":"TPV","mode":3,"time":"2010-07-09T07:37:01.000Z","ept":0.005,"lat":53.919158333,"lon":27.499028333,"alt":242.200,"epv":227.700,"track":356.9000,"speed":0.034} $GPGGA,073702.00,5355.1508,N,02729.9466,E,1,05,8.3,00244.1,M,0023.3,M,,*6B $GPGSA,A,3,13,16,06,23,73,,,,,,,,9.9,8.3,8.4*33 $GPGSV,1,1,01,75,16,224,*49 {"class":"SKY","vdop":8.40,"hdop":8.30,"pdop":9.90,"satellites":[{"PRN":75,"el":16,"az":224,"ss":0,"used":false}]} $GPRMC,073702.00,A,5355.1508,N,02729.9466,E,000.07498,266.1,090710,,,A*58 {"class":"TPV","mode":3,"time":"2010-07-09T07:37:02.000Z","ept":0.005,"lat":53.919180000,"lon":27.499110000,"alt":244.100,"epv":36.800,"track":266.1000,"speed":0.039,"climb":1.900,"epc":264.50} $GPGGA,073703.00,5355.1508,N,02729.9466,E,1,05,8.3,00244.1,M,0023.3,M,,*6A $GPGSA,A,3,13,16,06,23,73,,,,,,,,9.9,8.3,8.4*33 $GPGSV,1,1,01,75,16,224,*49 {"class":"SKY","vdop":8.40,"hdop":8.30,"pdop":9.90,"satellites":[{"PRN":75,"el":16,"az":224,"ss":0,"used":false}]} $GPRMC,073703.00,A,5355.1508,N,02729.9466,E,000.07498,266.1,090710,,,A*59 {"class":"TPV","mode":3,"time":"2010-07-09T07:37:03.000Z","ept":0.005,"lat":53.919180000,"lon":27.499110000,"alt":244.100,"epv":193.200,"track":266.1000,"speed":0.039,"climb":0.000,"epc":230.00} $GPGGA,073705.00,5355.1534,N,02729.9549,E,1,05,1.7,00250.9,M,0023.2,M,,*6E $GPGSA,A,3,13,16,06,23,73,,,,,,,,2.3,1.7,1.6*34 $GPGSV,1,1,02,75,16,224,,81,12,346,*71 {"class":"SKY","vdop":1.60,"hdop":1.70,"pdop":2.30,"satellites":[{"PRN":75,"el":16,"az":224,"ss":0,"used":false},{"PRN":81,"el":12,"az":346,"ss":0,"used":false}]} $GPRMC,073705.00,A,5355.1534,N,02729.9549,E,000.10468,235.7,090710,,,A*55 {"class":"TPV","mode":3,"time":"2010-07-09T07:37:05.000Z","ept":0.005,"lat":53.919223333,"lon":27.499248333,"alt":250.900,"epv":193.200,"track":235.7000,"speed":0.054,"climb":3.400,"epc":193.20} $GPGGA,073706.00,5355.1542,N,02729.9565,E,1,05,8.3,00253.6,M,0023.3,M,,*62 $GPGSA,A,3,13,16,06,23,73,,,,,,,,9.9,8.3,8.3*34 $GPGSV,1,1,03,75,16,224,,81,12,346,,82,13,037,*4C {"class":"SKY","vdop":8.30,"hdop":8.30,"pdop":9.90,"satellites":[{"PRN":75,"el":16,"az":224,"ss":0,"used":false},{"PRN":81,"el":12,"az":346,"ss":0,"used":false},{"PRN":82,"el":13,"az":37,"ss":0,"used":false}]} $GPRMC,073706.00,A,5355.1542,N,02729.9565,E,000.11095,243.8,090710,,,A*50 {"class":"TPV","mode":3,"time":"2010-07-09T07:37:06.000Z","ept":0.005,"lat":53.919236667,"lon":27.499275000,"alt":253.600,"epv":36.800,"track":243.8000,"speed":0.057,"climb":2.700,"epc":230.00} $GPGGA,073707.00,5355.1552,N,02729.9598,E,1,05,1.7,00256.1,M,0023.3,M,,*6F $GPGSA,A,3,13,16,06,23,73,,,,,,,,2.3,1.7,1.6*34 $GPGSV,1,1,03,75,16,224,,81,12,346,,82,13,037,*4C {"class":"SKY","vdop":1.60,"hdop":1.70,"pdop":2.30,"satellites":[{"PRN":75,"el":16,"az":224,"ss":0,"used":false},{"PRN":81,"el":12,"az":346,"ss":0,"used":false},{"PRN":82,"el":13,"az":37,"ss":0,"used":false}]} $GPRMC,073707.00,A,5355.1552,N,02729.9598,E,000.08909,042.3,090710,,,A*5E {"class":"TPV","mode":3,"time":"2010-07-09T07:37:07.000Z","ept":0.005,"lat":53.919253333,"lon":27.499330000,"alt":256.100,"epv":190.900,"track":42.3000,"speed":0.046,"climb":2.500,"epc":227.70} $GPGGA,073708.00,5355.1559,N,02729.9626,E,1,05,8.3,00258.9,M,0023.3,M,,*66 $GPGSA,A,3,13,16,06,23,73,,,,,,,,9.9,8.3,8.3*34 $GPGSV,1,1,03,75,16,224,,81,12,346,,82,13,037,*4C {"class":"SKY","vdop":8.30,"hdop":8.30,"pdop":9.90,"satellites":[{"PRN":75,"el":16,"az":224,"ss":0,"used":false},{"PRN":81,"el":12,"az":346,"ss":0,"used":false},{"PRN":82,"el":13,"az":37,"ss":0,"used":false}]} $GPRMC,073708.00,A,5355.1559,N,02729.9626,E,000.27917,064.3,090710,,,A*5A {"class":"TPV","mode":3,"time":"2010-07-09T07:37:08.000Z","ept":0.005,"lat":53.919265000,"lon":27.499376667,"alt":258.900,"epv":36.800,"track":64.3000,"speed":0.144,"climb":2.800,"epc":227.70} gpsd-3.15/test/daemon/geostar-geos1m-binary.log0000664000175000017500000002334112467341115017620 0ustar esresr# Name: GeoS 1M in binary mode # Description: A combined GPS/GLONASS OEM receiver board, 24 channels # Submitter: Viktar Palstsiuk # Date: 2010-07-09 # Location: Minsk, Belarus, 53N 27E # PSGGT333GÊ2”A %ü †ôš1êGÌvAªVJ†Ú°‚@"ÿLèsŒÄ'ÔGîtA7ÿgêx†yÀ…üMžÜßP€äßwAT›“°ÿ}@düLÀº;ÉH;Ô}wAVÂLÿˆÀT ü ¬€®CT®Ú¥rA¬q𥡊yÀs0ü èCWäÏ vA-(aàŠÀ*AüM&(Ó¢u©¶±vA™‘“ÝCGg@£Xþ ÓäŠ.XÎfvA¡9rɪ€ÀĈü z–ÖH0Èú{uA|Ù¬à `@l±üM-ucЗer·tA^dÛFð‚À“…@PSGGT ü ®à™ik)ÀtÈb. XBÝø‹Š¿öPSGG"@£Xþ Ó ŒĈü –z%ü ô† À ÿÿ úIÿÿs0ü èšT ü €¬œ/xÿÿ’ ÿÿ"ÿLsèôdüLºÀÅ…üMÜž†*AüM(&§l±üMu-®‘ŽC(ë@Ÿ ÿÿ×*üU!)ÀKŽCŠ t ø@Æýÿÿ@ ’ÿÿ@l¥ÿÿ¢šªQPSGG!$MÕ ž çœKPSGGĈü ®à™ik)ÀtÈb. XBÝø¿÷PSGGs0ü ®à™ik)ÀtÈb. XBÝø¬¶¿öPSGG£Xþ ®à™ik)ÀtÈb. XBÝø|ÞœöPSGG%ü ®à™ik)ÀtÈb. XBÝøú†¿öPSGGTHÊ2”A %ü †ô\ϳôùËvA­ýcç¡°‚@"ÿLès~ŸMîtAԖჄ†yÀ…üMžÜÉø”"ŸŸwA•¬vÉ}@düLÀº™á8Þ}wA0ŒºÖþˆÀT ü ¬€o•8ûߥrAq)̛°ŠyÀs0ü èå,a:Ú vAº ¯> ŠÀ*AüM&(\ÓnޱvAãZMEg@£Xþ ÓrŠÍ)ÕfvAÄ e €ÀĈü z–pëÚ(ù{uA÷Æ¿±I`@l±üM-u =XÐy·tAýNP–Sð‚Ào¥#WPSGG ŽLúûyIA…<é`†:AJÝ®i“SAŒ—Üڇê@ê:á/›v?ªŸqÌYðv¿öš+–¿"Ìq£l¿_@.‡Jiüµð?ÿœ º@ípî+©@€—͇¬@C‰^[wê@òù Yß"@@®ã„AòÀeA¿N\œPSGG "HÊ2”AeºÛå@î?1oUß·Þ?jííìÉq@E7@ §MÕ bEfä[Ç@§ðŽ@‘„‘þù?qïgq#ù?q'|×¶µû?oðP°7Â_@O¡u_„ê@L“l¢sê@=‹f>`Ԑ?JœéPžî @„†&ìPSGGTÍÌÌHÊ2”A %ü †ôäÍFòËvAgñÌb°‚@"ÿLès”ª 4RîtAYlvf†yÀ…üMžÜ|e.žŸwA›gÌå}@düLÀºéå[è}wA4з÷¯þˆÀT ü ¬€ß·OÑä¥rAÈÆpv‰yÀs0ü èX*×ä vAM¡ƒ³ŠÀ*AüM&(AU;á±±vAd5DŠHg@£Xþ Óý²ÛfvAIâŠÞ# €ÀĈü z–‘Àh¢÷{uAƒ˜ŒÍª`@l±üM-uíLë:·tA]Þ©¡ï‚À8óìšPSGGTš™™IÊ2”A %ü †ô¶Yâ•êËvAT6^Z%±‚@"ÿLès-Ì:GWîtACèÆ ‡yÀ…üMžÜ–b²ŸwAõ$/“Ö}@düLÀºa?ò}wAÉ9&¡×þˆÀT ü ¬€G5Íøé¥rAö᧑¿ŠyÀs0ü èÖ; fï vAPüV7pŠÀ*AüM&([BØÌ¯±vA:ØJPFg@£Xþ ÓDüUÓáfvA3@h^ €ÀĈü z–ß}•ö{uAù»T£`@l±üM-ugŸdш·tAÙ¡` ð‚À=8SPSGGTfffJÊ2”A %ü †ô«^ðãËvAÁNª…°‚@"ÿLèsgƒQ\îtAø'ðЇyÀ…üNžÜ°ýŒ¬ŸwA.5#>á}@düLÀº%÷ÃXü}wAžì0¿þˆÀT ü ¬€$$oJï¥rAœÍŽiŠyÀs0ü èÚ>ú vAM¡ƒ³ŠÀ*AüM&(‹ök­±vA1Š©×1Fg@£Xþ Ó†ÝÙzèfvAÎuW+ €ÀĈü z–-Ùcô{uA«×þ`@l±üM-u{:º–·tA0_Nð‚ÀÏeùPSGGT333KÊ2”A %ü †ôÌ@bÈÛËvA8L,°‚@"ÿLès°?smaîtAÕlˆyÀ…üNžÜ;+§ŸwAEŸ ž}@düLÀºxœ[~wAäR+ŠfÿˆÀT ü ¬€TÉ;ô¥rAU†öÐۋyÀs0ü èöJ‡Ë!vA-(aàŠÀ*AüM&(~kô#«±vAšW‘GQGg@£Xþ Ó”\ö¿îfvA]˜ú  €ÀĈü z–§íÛÍò{uAÙ?Å­î`@l±üM-uÁUA嗷tA˜ûì€"ð‚À)Tj±PSGG "ÿLàqœ@Ââ€jӑƒẦô›Í€Ò–1€z€Œ@èœDÀàCƒŸŸÉVPSGG l±üMàqœ@Ââ€jӑ@(>Ô£-ÍÀ0"é@@]~V¡-@([Áæ8€ŸŸ ME PSGG"@£Xþ Ó ’Ĉü –z%ü ô†‘ À ÿÿ úIÿÿs0ü èžT ü €¬Ÿ/xÿÿ’ ÿÿ"ÿLsèôdüLºÀÈ…üNÜž*AüM(&¡l±üMu-œ®‘ŽC(ë@Ÿ ÿÿ×*üU!)¿KŽCŠ t @Æýÿÿ@ ’ÿÿ@l¥ÿÿ¢š!SPSGG!$MÕ ¹ æœKPSGG *AüMàqœ@Ââ€jӑÀÌþՀ†(NÀÃ0=Á÷>€£º0@hBÀ™ߟ‹ÌßPSGG düLàqœ@Ââ€jӑ@VB̀Ӿ€4IAÂÁ;ï@hç„À&@ŸŸMÅËɔPSGG …üNàqœ@Â"€jÓQ@ÒŸ€…±Í@κ‘@ÀæÀ>@èꁌŒÃ@ŸŸäÜŽ±PSGG ×*üUàqœ@Ââ€jӑ€ÿÎÀ³9‹¯ÜÀÀÿ@›%@è(G@úMC@ŸŸMviCÊPSGGTLÊ2”A %ü †ô«efLÔËvAj{á|°‚@"ÿLès3r]}fîtA`t¬æ‰yÀ…üNžÜuÍ8Ä ŸwA†Š?ß0}@düLÀºwÊÿ/~wA#8ÈQ”ÿˆÀT ü ¬€eR Lù¥rA$².ˌyÀs0ü èÎêül!vA®;‹ŠÀ*AüM&(}}š£š±vA}‚†,ö@g@£Xþ Ó4 !EõfvAڈšµT €ÀĈü z–+¢_9ñ{uAà [Þ `@l±üM-u¯mŸ·tA€ë$çcñ‚À•_ôSPSGG Ü5‘ëûyIAâT«Ë`†:A{’!ªi“SAÆ7 —ê@øDãÌòx?pNady¿ÿ™mç¯õ–¿0UŽ{pŸ_@™pB…¶ð?­NôOÚž@Æ=ÓIJ©@žj,P@ÇSœ†ê@ܵ2(~± @€Žã„A ÁeA¥¿÷PSGG "LÊ2”AñÄì@î?,ž^Gß·Þ?ÉÇžH^q@E7@ §MÕ Mop0Ç@~ÎÜ}ÚŽ@øûH6þù?]adÁ #ù?k&ØtÚµû?»B= Á_@›çoda”ê@ÆcüE«ƒê@BÃø‚Wkʑ?jóƒx @'žïôPSGGTÍÌÌLÊ2”A %ü †ô UÍËvAdŽc?y°‚@"ÿLès“˝žkîtA€Ñçàñ‡yÀ…üNžÜÿ›ŸwAÀžþSµ}@düLÀº—‚Åb~wApŒ“þˆÀT ü ¬€Å^˜Nþ¥rA@ŸÑ_‹yÀs0ü èA4!vA·&yŠÀ*AüM&(^ °ÿ¥±vAÂÕÊòôEg@£Xþ Ó/’ûfvA†”KÑ? €ÀĈü z–ˆd_ ï{uAõÇÌÐ`@l±üM-u‰O §·tARì·Gð‚À!6œàPSGGTš™™MÊ2”A %ü †ôG’jÅËvAf>Žï&°‚@"ÿLèsRËÂpîtA. î=_‰yÀ…üNžÜ£ :•ŸwA2ëÒ}@düLÀº[º7$~wARª—ÿÇÿˆÀT ü ¬€Û`ŠrA× .GyÀs0ü èÙ)”$!vA¬æå ŠÀ*AüM&(KÈÈ£±vA¿GG*Ag@£Xþ Ó¿s6gvAìNý®â €ÀĈü z–'æƒî{uA®™ + `@l±üM-u€Ò­•®·tA/øË ñ‚ÀçáG&PSGGTfffNÊ2”A %ü †ôðȹœËvAMÂãÐ$°‚@"ÿLèsñ¯ÞÏuîtA›¢Rh»ˆyÀ…üNžÜ²Ã°+ŸwA’׊!}@düLÀºŠŒP.~wAkz,ÎIÿˆÀT ü ¬€‚ŒghŠrAd®‰²ŒyÀs0ü è߯@/!vAò'` ¬ŠÀ*AüM&(JèT|¡±vA¬ï}‹Cg@£Xþ Ó>øŽ»gvAÇ//õ  €ÀĈü z–+f€fì{uAà [Þ `@l±üM-ulæw ¶·tAxÏË&þï‚ÀƒrPSGGT333OÊ2”A %ü †ôxˆÒV¶ËvA³ZõP[°‚@"ÿLès Ñ÷ÚzîtAŽâ‰yÀ…üNžÜû0W®‰ŸwA!‡Ø>}@düLÀºþÓ/k8~wAVÂLÿˆÀT ü ¬€ŒQ{ ŠrA­cH跌yÀs0ü è‚eÝ9!vA€ŠÀ*AüM&(…=Ÿ±vAŒ_’¶Bg@£Xþ Ó#ägvAUMTËÄ €ÀĈü z–œÄÊê{uAèŽø0Œ `@l±üM-uaU³Óœ·tA¹ä€âð‚ÀՄPSGGT ü ®¥Q(u,•€( XBÝøZÚgTPSGG"@£Xþ Ó ˜Ĉü –z%ü ô† À ÿÿ úIÿÿs0ü èžT ü €¬º/xÿÿ’ ÿÿ"ÿLsèódüLºÀË…üNÜž{*AüM(&œl±üMu-®‘ŽC(ß@Ÿ ÿÿ×*üU!)¿KŽCŠ t þ@Æýÿÿ@ ’ÿÿ@l¥ÿÿ¢š$RPSGG!$MÕ º åœKPSGGĈü ®¥Q(u,•€( XBÝøÊrgUPSGGs0ü ®¥Q(u,•€( XBÝø}ÊgTPSGG£Xþ ®¥Q(u,•€( XBÝø­¢eTPSGG%ü ®¥Q(u,•€( XBÝø+úgTPSGGTPÊ2”A %ü †ôŸsÀ®ËvAg@µ°‚@"ÿLèsmš«ìîtA„Õ‚Ë@‰yÀ…üNžÜf¬†ÖƒŸwAÏ!¹È9}@düLÀºùMž{B~wA!Œ†Ž ÿˆÀT ü ¬€t±ŸÎŠrAwø‰DŒyÀs0ü èìë[D!vASŒ“ÈYŠÀ*AüM&(ކŒªœ±vAPRóVðDg@£Xþ Ó,žŒgvAž3Þ-e €ÀĈü z–JEõé{uA÷Sï `@l±üM-u‡ „WÅ·tA£Êƒ«ð‚ÀŠ^mPSGG òmàûyIAµB×`†:A °q¬i“SA"þ‹û¡šê@6’Ç* 2u?@ì”ëLg¿lCýòS9•¿êAó4ž_@Ë2È ·ð?pFØ;§·@H^ëç6ª@@¡g†@õ4}Šå—ê@†\ªˆŠ @Àºã„A$ÁeAtQ¬šPSGG "PÊ2”AAðbò@î?®-I^ß·Þ?ÿV(Nq@€B7@ §MÕ ÔÔ[Ç@^jwÃŽ@ 2×;Øýù?ñ¯ Ÿ"ù?åæ ýµû?ï™ðòQÀ_@ޑÒ#/€ê@R•¿³“ê@GRåsh?'Güß ° @Xd)ÎPSGGTÍÌÌPÊ2”A %ü †ô šMþŠËvAåE °‚@"ÿLès94…îtA©6Y°}‰yÀ…üNžÜ“€-~ŸwAõ$/“Ö}@düLÀºåÀ•©L~wAŸsŽú8ÿˆÀT ü ¬€?FæŠrA³AÛ;¶yÀs0ü è­)O!vA€ŠÀ*AüM&(lQrš±vAŽ}ê}?@g@£Xþ Óªu.'gvAÇgöš˯‚@"ÿLès2ÕîC”îtA×íÇU“ŠyÀ…üNžÜfnYïlŸwAM{Чd}@düLÀºwMYj~wAL[bî›ÿˆÀT ü ¬€ņ°'ŠrAæYÚªyÀs0ü ÿì‚ýìçn!vAìçæØŠÀ*AüM&(ñ$æM“±vA.«Úñ?g@£Xþ ÓÓӄL/gvAIžœ„% €ÀĈü z–;êÄâ{uAðÈBJ&`@l±üM-u¹Ždã·tAŠ èñ‚ÀBØ?8PSGG"@£Xþ Ó Ĉü –z%ü ô† À ÿÿ úIÿÿs0ü ìÿœT ü €¬·/xÿÿ’ ÿÿ"ÿLsèðdüLºÀÍ…üNÜžw*AüM(&šl±üMu-®‘ŽC(ä@Ÿ ÿÿ×*üT!)ÀKŽCŠ t û@Æýÿÿ@ ’ÿÿ@l¥ÿÿК‚RPSGG!$MÕ » äœKPSGGTTÊ2”A %ü †ôTVíµ‰ËvAoB_º§¯‚@"ÿLèsÌUœ™îtAëQwIƒ‹yÀ…üNžÜ÷ÄÙ.fŸwA€%íÙA}@düLÀº7 äut~wAſ̗ÃÿˆÀT ü ¬€ÞaEt,ŠrAnàÕǎyÀs0ü ÿìlhĝy!vA!’[ ŽŠÀ*AüM&(˜ï¯?‘±vAõ¡7Þ=g@£Xþ ÓîÉÔ5gvA^Z—“ €ÀĈü z–Îq"á{uAëh]å`@l±üM-u€+Pë·tAÆu‚,ñ‚ÀªBÏPSGG ‡ŠÔûyIAשßa†:Aùö·i“SAJô·ê@ؘªKÈæl?¥:‹ùPb?W3ç_‹í‘¿W‡óDŸ_@7%U!•·ð?œ+j w¶@ü×@[Ÿª@ƒ#©Pì@l€9ÌÙŠê@ãV2Z§)!@Áã„A=ÁeAvv5ëPSGG "TÊ2”Aì1ú@î?±ö¢ß·Þ?Zõ¹|Éq@€@7@ §MÕ Bk ׯ@¬ƒ1®Ž@ýñ{œ}ýù?eæ\8"ù?nÛúÅ ¶û?ØX%@¿_@X2÷͵ê@bþ¥ê@LUŒ<?Â1ªƒí@Ä͍PPSGGTÍÌÌTÊ2”A %ü †ô75GäËvA¬Ã> ¯‚@"ÿLès°:œžîtAНYL ŒyÀ…üNžÜ—| `ŸwAH •}@düLÀºÅs6j~~wA×þ8ñ$‰ÀT ü ¬€õk<1ŠrAfÄ%Š yÀs0ü ÿìÞªj?„!vAj>€h}ŠÀ*AüM&(L ±vA¿ÄÛ±z=g@£Xþ ӏ÷ # Date: 2010-10-16 # Notes: This is the chip in normal operation, but with a sat simulator # spoofing it into thinking it is 2019-03-28. The chip is known to have # bugs that result in incorrect time reporting at GPS week 10-bit # rollover boundaries. No such boundary is crossed in this log. # $GPGLL,4808.9985,N,01135.0867,E,164516.99,A,A*6E $GPRMC,164517.99,A,4808.9985,N,01135.0867,E,000.0,000.0,280319,003.0,E,A*31 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164517.99,4808.9985,N,01135.0867,E,1,04,01.3,00463.0,M,0046.2,M,,*5D $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,138,47,09,47,236,18,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0867,E,164517.99,A,A*6F $GPRMC,164518.99,A,4808.9985,N,01135.0867,E,000.0,000.0,280319,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164518.99,4808.9985,N,01135.0867,E,1,04,01.3,00462.9,M,0046.2,M,,*5A $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,12,21,76,138,48,09,47,236,18,04,37,056,*7B $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0867,E,164518.99,A,A*60 $GPRMC,164519.99,A,4808.9985,N,01135.0867,E,000.0,000.0,280319,003.0,E,A*3F $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164519.99,4808.9985,N,01135.0867,E,1,04,01.3,00462.9,M,0046.2,M,,*5B $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,138,48,09,47,236,18,04,37,056,*7A $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,01,00,359,,02,00,204,*73 $GPRMC,164520.99,A,4808.9985,N,01135.0868,E,000.0,000.0,280319,003.0,E,A*3A $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164520.99,4808.9985,N,01135.0868,E,1,04,01.3,00462.8,M,0046.2,M,,*5F $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,14,21,76,137,47,09,47,236,18,04,37,056,*7D $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPZDA,164520.99,28,03,2019,,*61 $GPRMC,164521.99,A,4808.9985,N,01135.0868,E,000.0,000.0,280319,003.0,E,A*3B $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164521.99,4808.9985,N,01135.0868,E,1,04,01.3,00462.8,M,0046.2,M,,*5E $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,15,21,76,137,47,09,47,236,18,04,37,056,*7C $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,01,00,359,,02,00,204,*73 $GPRMC,164522.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*39 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164522.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.8,M,0046.2,M,,*5C $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,16,21,76,137,47,09,47,236,18,04,37,056,*7F $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0869,E,164522.99,A,A*67 $GPRMC,164523.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*38 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164523.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*52 $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,16,21,76,137,47,09,47,236,17,04,37,056,*70 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0869,E,164523.99,A,A*66 $GPRMC,164524.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*3F $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164524.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*55 $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,16,21,76,137,47,09,47,236,17,04,37,056,*70 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,02,00,204,,01,00,359,*73 $GPRMC,164525.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164525.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*54 $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,15,21,76,137,48,09,47,236,17,04,37,056,*7C $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0869,E,164525.99,A,A*60 $GPRMC,164526.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*3D $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164526.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*57 $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,15,21,76,137,47,09,47,236,18,04,37,056,*7C $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0869,E,164526.99,A,A*63 $GPRMC,164527.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*3C $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164527.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*56 $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,14,21,76,137,48,09,47,236,17,04,37,056,*7D $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,48,08,15,173,*7E $GPZDA,164527.99,28,03,2019,,*66 $GPRMC,164528.99,A,4808.9985,N,01135.0870,E,000.0,000.0,280319,003.0,E,A*3B $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164528.99,4808.9985,N,01135.0870,E,1,04,01.3,00462.7,M,0046.2,M,,*51 $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,02,00,204,,01,00,359,*73 $GPRMC,164529.99,A,4808.9985,N,01135.0870,E,000.0,000.0,280319,003.0,E,A*3A $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164529.99,4808.9985,N,01135.0870,E,1,04,01.3,00462.6,M,0046.2,M,,*51 $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0870,E,164529.99,A,A*64 $GPRMC,164530.99,A,4808.9985,N,01135.0870,E,000.0,000.0,280319,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164530.99,4808.9985,N,01135.0870,E,1,04,01.3,00462.6,M,0046.2,M,,*59 $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,01,00,359,,02,00,204,*73 $GPRMC,164531.99,A,4808.9986,N,01135.0871,E,000.0,000.0,280319,003.0,E,A*31 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164531.99,4808.9986,N,01135.0871,E,1,04,01.3,00462.6,M,0046.2,M,,*5A $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,12,21,76,137,47,09,47,236,17,04,37,056,*74 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPZDA,164531.99,28,03,2019,,*61 $GPRMC,164532.99,A,4808.9986,N,01135.0871,E,000.0,000.0,280319,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164532.99,4808.9986,N,01135.0871,E,1,04,01.3,00462.6,M,0046.2,M,,*59 $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,12,21,76,137,47,09,47,236,17,04,37,056,*74 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9986,N,01135.0871,E,164532.99,A,A*6C $GPRMC,164533.99,A,4808.9986,N,01135.0871,E,000.0,000.0,280319,003.0,E,A*33 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164533.99,4808.9986,N,01135.0871,E,1,04,01.3,00462.5,M,0046.2,M,,*5B $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,02.0*0A $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9986,N,01135.0871,E,164533.99,A,A*6D $GPRMC,164534.99,A,4808.9986,N,01135.0871,E,000.0,000.0,280319,003.0,E,A*34 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164534.99,4808.9986,N,01135.0871,E,1,04,01.3,00462.5,M,0046.2,M,,*5C $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,02.0*0A $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,48,18,20,143,48,08,15,173,*71 $GPZDA,164534.99,28,03,2019,,*64 $GPRMC,164535.99,A,4808.9986,N,01135.0872,E,000.0,000.0,280319,003.0,E,A*36 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164535.99,4808.9986,N,01135.0872,E,1,04,01.3,00462.5,M,0046.2,M,,*5E $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,02.0*0A $GPGSV,3,1,12,17,77,041,12,21,76,137,47,09,47,236,17,04,37,056,*74 $GPGSV,3,2,12,12,32,298,,06,29,277,48,18,20,143,48,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,01,00,359,,02,00,204,*73 $GPRMC,164536.99,A,4808.9986,N,01135.0872,E,000.0,000.0,280319,003.0,E,A*35 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164536.99,4808.9986,N,01135.0872,E,1,04,01.3,00462.5,M,0046.2,M,,*5D gpsd-3.15/test/daemon/gp-320fw-2019-03-28.log.chk0000664000175000017500000004314412467340617016563 0ustar esresr$GPGLL,4808.9985,N,01135.0867,E,164516.99,A,A*6E {"class":"TPV","mode":2,"lat":48.149975000,"lon":11.584778333} $GPRMC,164517.99,A,4808.9985,N,01135.0867,E,000.0,000.0,280319,003.0,E,A*31 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164517.99,4808.9985,N,01135.0867,E,1,04,01.3,00463.0,M,0046.2,M,,*5D $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,138,47,09,47,236,18,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0867,E,164517.99,A,A*6F {"class":"TPV","mode":3,"time":"2019-03-28T16:45:17.990Z","ept":0.005,"lat":48.149975000,"lon":11.584778333,"alt":463.000,"epv":43.700,"track":0.0000,"speed":0.000,"climb":0.000} $GPRMC,164518.99,A,4808.9985,N,01135.0867,E,000.0,000.0,280319,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164518.99,4808.9985,N,01135.0867,E,1,04,01.3,00462.9,M,0046.2,M,,*5A $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,12,21,76,138,48,09,47,236,18,04,37,056,*7B $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0867,E,164518.99,A,A*60 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:18.990Z","ept":0.005,"lat":48.149975000,"lon":11.584778333,"alt":462.900,"epv":43.700,"track":0.0000,"speed":0.000,"climb":0.000} $GPRMC,164519.99,A,4808.9985,N,01135.0867,E,000.0,000.0,280319,003.0,E,A*3F $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164519.99,4808.9985,N,01135.0867,E,1,04,01.3,00462.9,M,0046.2,M,,*5B $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,138,48,09,47,236,18,04,37,056,*7A $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,01,00,359,,02,00,204,*73 {"class":"SKY","xdop":0.88,"ydop":0.96,"vdop":1.90,"tdop":1.12,"hdop":1.30,"gdop":2.57,"pdop":2.30,"satellites":[{"PRN":17,"el":77,"az":41,"ss":13,"used":false},{"PRN":21,"el":76,"az":138,"ss":48,"used":true},{"PRN":9,"el":47,"az":236,"ss":18,"used":false},{"PRN":4,"el":37,"az":56,"ss":0,"used":false},{"PRN":12,"el":32,"az":298,"ss":0,"used":false},{"PRN":6,"el":29,"az":277,"ss":47,"used":true},{"PRN":18,"el":20,"az":143,"ss":47,"used":true},{"PRN":8,"el":15,"az":173,"ss":0,"used":false},{"PRN":5,"el":13,"az":37,"ss":47,"used":true},{"PRN":14,"el":6,"az":303,"ss":0,"used":false},{"PRN":1,"el":0,"az":359,"ss":0,"used":false},{"PRN":2,"el":0,"az":204,"ss":0,"used":false}]} $GPRMC,164520.99,A,4808.9985,N,01135.0868,E,000.0,000.0,280319,003.0,E,A*3A $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164520.99,4808.9985,N,01135.0868,E,1,04,01.3,00462.8,M,0046.2,M,,*5F {"class":"TPV","mode":3,"time":"2019-03-28T16:45:20.990Z","ept":0.005,"lat":48.149975000,"lon":11.584780000,"alt":462.800,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,14,21,76,137,47,09,47,236,18,04,37,056,*7D $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPZDA,164520.99,28,03,2019,,*61 $GPRMC,164521.99,A,4808.9985,N,01135.0868,E,000.0,000.0,280319,003.0,E,A*3B $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164521.99,4808.9985,N,01135.0868,E,1,04,01.3,00462.8,M,0046.2,M,,*5E {"class":"TPV","mode":3,"time":"2019-03-28T16:45:21.990Z","ept":0.005,"lat":48.149975000,"lon":11.584780000,"alt":462.800,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,15,21,76,137,47,09,47,236,18,04,37,056,*7C $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,01,00,359,,02,00,204,*73 {"class":"SKY","xdop":0.88,"ydop":0.96,"vdop":1.90,"tdop":1.12,"hdop":1.30,"gdop":2.57,"pdop":2.30,"satellites":[{"PRN":17,"el":77,"az":41,"ss":15,"used":false},{"PRN":21,"el":76,"az":137,"ss":47,"used":true},{"PRN":9,"el":47,"az":236,"ss":18,"used":false},{"PRN":4,"el":37,"az":56,"ss":0,"used":false},{"PRN":12,"el":32,"az":298,"ss":0,"used":false},{"PRN":6,"el":29,"az":277,"ss":47,"used":true},{"PRN":18,"el":20,"az":143,"ss":47,"used":true},{"PRN":8,"el":15,"az":173,"ss":0,"used":false},{"PRN":5,"el":13,"az":37,"ss":47,"used":true},{"PRN":14,"el":6,"az":303,"ss":0,"used":false},{"PRN":1,"el":0,"az":359,"ss":0,"used":false},{"PRN":2,"el":0,"az":204,"ss":0,"used":false}]} $GPRMC,164522.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*39 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164522.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.8,M,0046.2,M,,*5C {"class":"TPV","mode":3,"time":"2019-03-28T16:45:22.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.800,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,16,21,76,137,47,09,47,236,18,04,37,056,*7F $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0869,E,164522.99,A,A*67 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:22.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.800,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"climb":0.000,"eps":28.79} $GPRMC,164523.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*38 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164523.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*52 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:23.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.700,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,16,21,76,137,47,09,47,236,17,04,37,056,*70 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0869,E,164523.99,A,A*66 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:23.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.700,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"climb":0.000,"eps":28.79} $GPRMC,164524.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*3F $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164524.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*55 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:24.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.700,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,16,21,76,137,47,09,47,236,17,04,37,056,*70 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,02,00,204,,01,00,359,*73 {"class":"SKY","xdop":0.88,"ydop":0.96,"vdop":1.90,"tdop":1.12,"hdop":1.30,"gdop":2.57,"pdop":2.30,"satellites":[{"PRN":17,"el":77,"az":41,"ss":16,"used":false},{"PRN":21,"el":76,"az":137,"ss":47,"used":true},{"PRN":9,"el":47,"az":236,"ss":17,"used":false},{"PRN":4,"el":37,"az":56,"ss":0,"used":false},{"PRN":12,"el":32,"az":298,"ss":0,"used":false},{"PRN":6,"el":29,"az":277,"ss":47,"used":true},{"PRN":18,"el":20,"az":143,"ss":47,"used":true},{"PRN":8,"el":15,"az":173,"ss":0,"used":false},{"PRN":5,"el":13,"az":37,"ss":47,"used":true},{"PRN":14,"el":6,"az":303,"ss":0,"used":false},{"PRN":2,"el":0,"az":204,"ss":0,"used":false},{"PRN":1,"el":0,"az":359,"ss":0,"used":false}]} $GPRMC,164525.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164525.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*54 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:25.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.700,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,15,21,76,137,48,09,47,236,17,04,37,056,*7C $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0869,E,164525.99,A,A*60 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:25.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.700,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"climb":0.000,"eps":28.79} $GPRMC,164526.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*3D $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164526.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*57 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:26.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.700,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,15,21,76,137,47,09,47,236,18,04,37,056,*7C $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0869,E,164526.99,A,A*63 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:26.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.700,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"climb":0.000,"eps":28.79} $GPRMC,164527.99,A,4808.9985,N,01135.0869,E,000.0,000.0,280319,003.0,E,A*3C $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164527.99,4808.9985,N,01135.0869,E,1,04,01.3,00462.7,M,0046.2,M,,*56 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:27.990Z","ept":0.005,"lat":48.149975000,"lon":11.584781667,"alt":462.700,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,14,21,76,137,48,09,47,236,17,04,37,056,*7D $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,48,08,15,173,*7E $GPZDA,164527.99,28,03,2019,,*66 $GPRMC,164528.99,A,4808.9985,N,01135.0870,E,000.0,000.0,280319,003.0,E,A*3B $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164528.99,4808.9985,N,01135.0870,E,1,04,01.3,00462.7,M,0046.2,M,,*51 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:28.990Z","ept":0.005,"lat":48.149975000,"lon":11.584783333,"alt":462.700,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,02,00,204,,01,00,359,*73 {"class":"SKY","xdop":0.88,"ydop":0.96,"vdop":1.90,"tdop":1.12,"hdop":1.30,"gdop":2.57,"pdop":2.30,"satellites":[{"PRN":17,"el":77,"az":41,"ss":13,"used":false},{"PRN":21,"el":76,"az":137,"ss":47,"used":true},{"PRN":9,"el":47,"az":236,"ss":17,"used":false},{"PRN":4,"el":37,"az":56,"ss":0,"used":false},{"PRN":12,"el":32,"az":298,"ss":0,"used":false},{"PRN":6,"el":29,"az":277,"ss":47,"used":true},{"PRN":18,"el":20,"az":143,"ss":47,"used":true},{"PRN":8,"el":15,"az":173,"ss":0,"used":false},{"PRN":5,"el":13,"az":37,"ss":47,"used":true},{"PRN":14,"el":6,"az":303,"ss":0,"used":false},{"PRN":2,"el":0,"az":204,"ss":0,"used":false},{"PRN":1,"el":0,"az":359,"ss":0,"used":false}]} $GPRMC,164529.99,A,4808.9985,N,01135.0870,E,000.0,000.0,280319,003.0,E,A*3A $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164529.99,4808.9985,N,01135.0870,E,1,04,01.3,00462.6,M,0046.2,M,,*51 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:29.990Z","ept":0.005,"lat":48.149975000,"lon":11.584783333,"alt":462.600,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9985,N,01135.0870,E,164529.99,A,A*64 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:29.990Z","ept":0.005,"lat":48.149975000,"lon":11.584783333,"alt":462.600,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"climb":0.000,"eps":28.79} $GPRMC,164530.99,A,4808.9985,N,01135.0870,E,000.0,000.0,280319,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164530.99,4808.9985,N,01135.0870,E,1,04,01.3,00462.6,M,0046.2,M,,*59 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:30.990Z","ept":0.005,"lat":48.149975000,"lon":11.584783333,"alt":462.600,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,01,00,359,,02,00,204,*73 {"class":"SKY","xdop":0.88,"ydop":0.96,"vdop":1.90,"tdop":1.12,"hdop":1.30,"gdop":2.57,"pdop":2.30,"satellites":[{"PRN":17,"el":77,"az":41,"ss":13,"used":false},{"PRN":21,"el":76,"az":137,"ss":47,"used":true},{"PRN":9,"el":47,"az":236,"ss":17,"used":false},{"PRN":4,"el":37,"az":56,"ss":0,"used":false},{"PRN":12,"el":32,"az":298,"ss":0,"used":false},{"PRN":6,"el":29,"az":277,"ss":47,"used":true},{"PRN":18,"el":20,"az":143,"ss":47,"used":true},{"PRN":8,"el":15,"az":173,"ss":0,"used":false},{"PRN":5,"el":13,"az":37,"ss":47,"used":true},{"PRN":14,"el":6,"az":303,"ss":0,"used":false},{"PRN":1,"el":0,"az":359,"ss":0,"used":false},{"PRN":2,"el":0,"az":204,"ss":0,"used":false}]} $GPRMC,164531.99,A,4808.9986,N,01135.0871,E,000.0,000.0,280319,003.0,E,A*31 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164531.99,4808.9986,N,01135.0871,E,1,04,01.3,00462.6,M,0046.2,M,,*5A {"class":"TPV","mode":3,"time":"2019-03-28T16:45:31.990Z","ept":0.005,"lat":48.149976667,"lon":11.584785000,"alt":462.600,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,12,21,76,137,47,09,47,236,17,04,37,056,*74 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPZDA,164531.99,28,03,2019,,*61 $GPRMC,164532.99,A,4808.9986,N,01135.0871,E,000.0,000.0,280319,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164532.99,4808.9986,N,01135.0871,E,1,04,01.3,00462.6,M,0046.2,M,,*59 {"class":"TPV","mode":3,"time":"2019-03-28T16:45:32.990Z","ept":0.005,"lat":48.149976667,"lon":11.584785000,"alt":462.600,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,01.9*00 $GPGSV,3,1,12,17,77,041,12,21,76,137,47,09,47,236,17,04,37,056,*74 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9986,N,01135.0871,E,164532.99,A,A*6C {"class":"TPV","mode":3,"time":"2019-03-28T16:45:32.990Z","ept":0.005,"lat":48.149976667,"lon":11.584785000,"alt":462.600,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"climb":0.000,"eps":28.79} $GPRMC,164533.99,A,4808.9986,N,01135.0871,E,000.0,000.0,280319,003.0,E,A*33 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164533.99,4808.9986,N,01135.0871,E,1,04,01.3,00462.5,M,0046.2,M,,*5B {"class":"TPV","mode":3,"time":"2019-03-28T16:45:33.990Z","ept":0.005,"lat":48.149976667,"lon":11.584785000,"alt":462.500,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,02.0*0A $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,47,18,20,143,47,08,15,173,*71 $GPGLL,4808.9986,N,01135.0871,E,164533.99,A,A*6D {"class":"TPV","mode":3,"time":"2019-03-28T16:45:33.990Z","ept":0.005,"lat":48.149976667,"lon":11.584785000,"alt":462.500,"epx":13.246,"epy":14.395,"epv":43.700,"track":0.0000,"speed":0.000,"climb":0.000,"eps":28.79} $GPRMC,164534.99,A,4808.9986,N,01135.0871,E,000.0,000.0,280319,003.0,E,A*34 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164534.99,4808.9986,N,01135.0871,E,1,04,01.3,00462.5,M,0046.2,M,,*5C {"class":"TPV","mode":3,"time":"2019-03-28T16:45:34.990Z","ept":0.005,"lat":48.149976667,"lon":11.584785000,"alt":462.500,"epx":13.246,"epy":14.395,"epv":46.000,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,02.0*0A $GPGSV,3,1,12,17,77,041,13,21,76,137,47,09,47,236,17,04,37,056,*75 $GPGSV,3,2,12,12,32,298,,06,29,277,48,18,20,143,48,08,15,173,*71 $GPZDA,164534.99,28,03,2019,,*64 $GPRMC,164535.99,A,4808.9986,N,01135.0872,E,000.0,000.0,280319,003.0,E,A*36 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164535.99,4808.9986,N,01135.0872,E,1,04,01.3,00462.5,M,0046.2,M,,*5E {"class":"TPV","mode":3,"time":"2019-03-28T16:45:35.990Z","ept":0.005,"lat":48.149976667,"lon":11.584786667,"alt":462.500,"epx":13.246,"epy":14.395,"epv":46.000,"track":0.0000,"speed":0.000,"eps":28.79} $GPGSA,A,3,,21,,,,06,18,,05,,,,02.3,01.3,02.0*0A $GPGSV,3,1,12,17,77,041,12,21,76,137,47,09,47,236,17,04,37,056,*74 $GPGSV,3,2,12,12,32,298,,06,29,277,48,18,20,143,48,08,15,173,*71 $GPGSV,3,3,12,05,13,037,47,14,06,303,,01,00,359,,02,00,204,*73 {"class":"SKY","xdop":0.88,"ydop":0.96,"vdop":2.00,"tdop":1.12,"hdop":1.30,"gdop":2.57,"pdop":2.30,"satellites":[{"PRN":17,"el":77,"az":41,"ss":12,"used":false},{"PRN":21,"el":76,"az":137,"ss":47,"used":true},{"PRN":9,"el":47,"az":236,"ss":17,"used":false},{"PRN":4,"el":37,"az":56,"ss":0,"used":false},{"PRN":12,"el":32,"az":298,"ss":0,"used":false},{"PRN":6,"el":29,"az":277,"ss":48,"used":true},{"PRN":18,"el":20,"az":143,"ss":48,"used":true},{"PRN":8,"el":15,"az":173,"ss":0,"used":false},{"PRN":5,"el":13,"az":37,"ss":47,"used":true},{"PRN":14,"el":6,"az":303,"ss":0,"used":false},{"PRN":1,"el":0,"az":359,"ss":0,"used":false},{"PRN":2,"el":0,"az":204,"ss":0,"used":false}]} $GPRMC,164536.99,A,4808.9986,N,01135.0872,E,000.0,000.0,280319,003.0,E,A*35 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,164536.99,4808.9986,N,01135.0872,E,1,04,01.3,00462.5,M,0046.2,M,,*5D {"class":"TPV","mode":3,"time":"2019-03-28T16:45:36.990Z","ept":0.005,"lat":48.149976667,"lon":11.584786667,"alt":462.500,"epx":13.246,"epy":14.395,"epv":46.000,"track":0.0000,"speed":0.000,"eps":28.79} gpsd-3.15/test/daemon/gp-320fw-2019-04-06-overflow.log0000664000175000017500000002200312461156335017640 0ustar esresr# Name: GPS-320FW # Chipset: SE4100L + PL-6313 # Description: OEM module from RF Solutions, Inc # Submitter: f4eru # Date: 2010-10-16 # Notes: This is the chip in normal operation after warm boot, but # with a sat simulator spoofing it into thinking it is # 2019-06-04, just after a 10-bit GPS week wraparound. # Because the receiver has not been restarted, it displays # a correct time. # $GPGSV,3,2,12,31,27,063,40,13,26,209,40,07,25,309,,04,17,308,40*73 $GPGLL,4808.9977,N,01135.0800,E,235723.02,A,A*63 $GPRMC,235724.02,A,4808.9978,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235724.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5D $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.1*06 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,063,41,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0800,E,235724.02,A,A*6B $GPRMC,235725.02,A,4808.9977,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*30 $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235725.02,4808.9977,N,01135.0800,E,1,04,01.4,00464.5,M,0046.2,M,,*52 $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.1*06 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,063,40,13,26,209,40,07,25,309,,04,17,308,40*73 $GPGLL,4808.9977,N,01135.0800,E,235725.02,A,A*65 $GPRMC,235726.02,A,4808.9978,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*3C $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235726.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.5,M,0046.2,M,,*5E $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.1*06 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,063,40,13,26,209,40,07,25,309,,04,17,308,40*73 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 $GPRMC,235727.02,A,4808.9978,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*3D $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235727.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.5,M,0046.2,M,,*5F $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.1*06 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPZDA,235727.02,06,04,2019,,*6A $GPRMC,235728.02,A,4808.9978,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235728.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*51 $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0800,E,235728.02,A,A*67 $GPRMC,235729.02,A,4808.9978,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235729.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.5,M,0046.2,M,,*51 $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0800,E,235729.02,A,A*66 $GPRMC,235730.02,A,4808.9978,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3A $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235730.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*58 $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0800,E,235730.02,A,A*6E $GPRMC,235731.02,A,4808.9978,N,01135.0801,E,000.1,000.0,060419,003.0,E,A*3A $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235731.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*59 $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 $GPRMC,235732.02,A,4808.9978,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*38 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,235732.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*5A $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0801,E,235732.02,A,A*6D $GPRMC,235733.02,A,4808.9978,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*39 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,235733.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*5B $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0801,E,235733.02,A,A*6C $GPRMC,235734.02,A,4808.9978,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235734.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*5C $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 $GPRMC,235735.02,A,4808.9978,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*3F $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235735.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.4,M,0046.2,M,,*5C $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 $GPRMC,235736.02,A,4808.9979,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*3D $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235736.02,4808.9979,N,01135.0801,E,1,04,01.4,00464.4,M,0046.2,M,,*5E $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 $GPRMC,235737.02,A,4808.9979,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*3C $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235737.02,4808.9979,N,01135.0801,E,1,04,01.4,00464.4,M,0046.2,M,,*5F $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPZDA,235737.02,06,04,2019,,*6B $GPRMC,235738.02,A,4808.9979,N,01135.0801,E,000.1,000.0,060419,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235738.02,4808.9979,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*51 $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 $GPRMC,235739.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235739.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*50 $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 $GPRMC,235740.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3C $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235740.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5E $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,308,,04,17,308,40*73 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 $GPRMC,235741.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3D $GPVTG,000.0,T,357.0,M,000.1,N,0000.2,K,A*11 $GPGGA,235741.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5F $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,308,,04,17,308,40*73 $GPGLL,4808.9979,N,01135.0800,E,235741.02,A,A*69 $GPRMC,235742.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.1,N,0000.2,K,A*11 $GPGGA,235742.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5C $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,308,,04,17,308,40*73 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 $GPRMC,235743.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3F $GPVTG,000.0,T,357.0,M,000.1,N,0000.2,K,A*11 $GPGGA,235743.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5D $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,308,,04,17,308,40*73 gpsd-3.15/test/daemon/gp-320fw-2019-04-06-overflow.log.chk0000664000175000017500000004721012467340617020417 0ustar esresr$GPGSV,3,2,12,31,27,063,40,13,26,209,40,07,25,309,,04,17,308,40*73 $GPGLL,4808.9977,N,01135.0800,E,235723.02,A,A*63 {"class":"TPV","mode":2,"lat":48.149961667,"lon":11.584666667} $GPRMC,235724.02,A,4808.9978,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235724.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5D $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.1*06 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,063,41,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0800,E,235724.02,A,A*6B {"class":"TPV","mode":3,"time":"2019-04-06T23:57:24.020Z","ept":0.005,"lat":48.149963333,"lon":11.584666667,"alt":464.400,"epv":48.300,"track":0.0000,"speed":0.000,"climb":0.000} $GPRMC,235725.02,A,4808.9977,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*30 $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235725.02,4808.9977,N,01135.0800,E,1,04,01.4,00464.5,M,0046.2,M,,*52 $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.1*06 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,063,40,13,26,209,40,07,25,309,,04,17,308,40*73 $GPGLL,4808.9977,N,01135.0800,E,235725.02,A,A*65 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:25.020Z","ept":0.005,"lat":48.149961667,"lon":11.584666667,"alt":464.500,"epv":48.300,"track":0.0000,"speed":0.000,"climb":0.000} $GPRMC,235726.02,A,4808.9978,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*3C $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235726.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.5,M,0046.2,M,,*5E $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.1*06 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,063,40,13,26,209,40,07,25,309,,04,17,308,40*73 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 {"class":"SKY","xdop":0.94,"ydop":0.98,"vdop":2.10,"tdop":1.28,"hdop":1.40,"gdop":2.82,"pdop":2.60,"satellites":[{"PRN":20,"el":78,"az":50,"ss":41,"used":true},{"PRN":11,"el":72,"az":261,"ss":0,"used":false},{"PRN":6,"el":41,"az":278,"ss":0,"used":false},{"PRN":14,"el":38,"az":185,"ss":0,"used":false},{"PRN":31,"el":27,"az":63,"ss":40,"used":true},{"PRN":13,"el":26,"az":209,"ss":40,"used":true},{"PRN":7,"el":25,"az":309,"ss":0,"used":false},{"PRN":4,"el":17,"az":308,"ss":40,"used":true},{"PRN":9,"el":16,"az":99,"ss":0,"used":false},{"PRN":3,"el":14,"az":190,"ss":0,"used":false},{"PRN":8,"el":10,"az":39,"ss":0,"used":false},{"PRN":10,"el":2,"az":65,"ss":0,"used":false}]} $GPRMC,235727.02,A,4808.9978,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*3D $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235727.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.5,M,0046.2,M,,*5F {"class":"TPV","mode":3,"time":"2019-04-06T23:57:27.020Z","ept":0.005,"lat":48.149963333,"lon":11.584666667,"alt":464.500,"epx":14.174,"epy":14.733,"epv":48.300,"track":0.0000,"speed":0.000,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.1*06 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPZDA,235727.02,06,04,2019,,*6A $GPRMC,235728.02,A,4808.9978,N,01135.0800,E,000.0,000.0,060419,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235728.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*51 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:28.020Z","ept":0.005,"lat":48.149963333,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":48.300,"track":0.0000,"speed":0.000,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,41,11,72,261,,06,41,278,,14,38,185,*79 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0800,E,235728.02,A,A*67 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:28.020Z","ept":0.005,"lat":48.149963333,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":48.300,"track":0.0000,"speed":0.000,"climb":0.000,"eps":29.47} $GPRMC,235729.02,A,4808.9978,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235729.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.5,M,0046.2,M,,*51 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:29.020Z","ept":0.005,"lat":48.149963333,"lon":11.584666667,"alt":464.500,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0800,E,235729.02,A,A*66 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:29.020Z","ept":0.005,"lat":48.149963333,"lon":11.584666667,"alt":464.500,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"climb":0.000,"eps":29.47} $GPRMC,235730.02,A,4808.9978,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3A $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235730.02,4808.9978,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*58 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:30.020Z","ept":0.005,"lat":48.149963333,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0800,E,235730.02,A,A*6E {"class":"TPV","mode":3,"time":"2019-04-06T23:57:30.020Z","ept":0.005,"lat":48.149963333,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"climb":0.000,"eps":29.47} $GPRMC,235731.02,A,4808.9978,N,01135.0801,E,000.1,000.0,060419,003.0,E,A*3A $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235731.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*59 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:31.020Z","ept":0.005,"lat":48.149963333,"lon":11.584668333,"alt":464.500,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 {"class":"SKY","xdop":0.94,"ydop":0.98,"vdop":2.20,"tdop":1.28,"hdop":1.40,"gdop":2.82,"pdop":2.60,"satellites":[{"PRN":20,"el":78,"az":50,"ss":40,"used":true},{"PRN":11,"el":72,"az":261,"ss":0,"used":false},{"PRN":6,"el":41,"az":278,"ss":0,"used":false},{"PRN":14,"el":38,"az":185,"ss":0,"used":false},{"PRN":31,"el":27,"az":62,"ss":40,"used":true},{"PRN":13,"el":26,"az":209,"ss":40,"used":true},{"PRN":7,"el":25,"az":309,"ss":0,"used":false},{"PRN":4,"el":17,"az":308,"ss":40,"used":true},{"PRN":9,"el":16,"az":99,"ss":0,"used":false},{"PRN":3,"el":14,"az":190,"ss":0,"used":false},{"PRN":8,"el":10,"az":39,"ss":0,"used":false},{"PRN":10,"el":2,"az":65,"ss":0,"used":false}]} $GPRMC,235732.02,A,4808.9978,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*38 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,235732.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*5A {"class":"TPV","mode":3,"time":"2019-04-06T23:57:32.020Z","ept":0.005,"lat":48.149963333,"lon":11.584668333,"alt":464.500,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.000,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0801,E,235732.02,A,A*6D {"class":"TPV","mode":3,"time":"2019-04-06T23:57:32.020Z","ept":0.005,"lat":48.149963333,"lon":11.584668333,"alt":464.500,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.000,"climb":0.000,"eps":29.47} $GPRMC,235733.02,A,4808.9978,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*39 $GPVTG,000.0,T,357.0,M,000.0,N,0000.0,K,A*12 $GPGGA,235733.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*5B {"class":"TPV","mode":3,"time":"2019-04-06T23:57:33.020Z","ept":0.005,"lat":48.149963333,"lon":11.584668333,"alt":464.500,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.000,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGLL,4808.9978,N,01135.0801,E,235733.02,A,A*6C {"class":"TPV","mode":3,"time":"2019-04-06T23:57:33.020Z","ept":0.005,"lat":48.149963333,"lon":11.584668333,"alt":464.500,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.000,"climb":0.000,"eps":29.47} $GPRMC,235734.02,A,4808.9978,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235734.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*5C {"class":"TPV","mode":3,"time":"2019-04-06T23:57:34.020Z","ept":0.005,"lat":48.149963333,"lon":11.584668333,"alt":464.500,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.000,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 {"class":"SKY","xdop":0.94,"ydop":0.98,"vdop":2.20,"tdop":1.28,"hdop":1.40,"gdop":2.82,"pdop":2.60,"satellites":[{"PRN":20,"el":78,"az":50,"ss":40,"used":true},{"PRN":11,"el":72,"az":261,"ss":0,"used":false},{"PRN":6,"el":41,"az":278,"ss":0,"used":false},{"PRN":14,"el":38,"az":185,"ss":0,"used":false},{"PRN":31,"el":27,"az":62,"ss":40,"used":true},{"PRN":13,"el":26,"az":209,"ss":40,"used":true},{"PRN":7,"el":25,"az":309,"ss":0,"used":false},{"PRN":4,"el":17,"az":308,"ss":40,"used":true},{"PRN":9,"el":16,"az":99,"ss":0,"used":false},{"PRN":3,"el":14,"az":190,"ss":0,"used":false},{"PRN":8,"el":10,"az":39,"ss":0,"used":false},{"PRN":10,"el":2,"az":65,"ss":0,"used":false}]} $GPRMC,235735.02,A,4808.9978,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*3F $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235735.02,4808.9978,N,01135.0801,E,1,04,01.4,00464.4,M,0046.2,M,,*5C {"class":"TPV","mode":3,"time":"2019-04-06T23:57:35.020Z","ept":0.005,"lat":48.149963333,"lon":11.584668333,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.000,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 {"class":"SKY","xdop":0.94,"ydop":0.98,"vdop":2.20,"tdop":1.28,"hdop":1.40,"gdop":2.82,"pdop":2.60,"satellites":[{"PRN":20,"el":78,"az":50,"ss":40,"used":true},{"PRN":11,"el":72,"az":261,"ss":0,"used":false},{"PRN":6,"el":41,"az":278,"ss":0,"used":false},{"PRN":14,"el":38,"az":185,"ss":0,"used":false},{"PRN":31,"el":27,"az":62,"ss":40,"used":true},{"PRN":13,"el":26,"az":209,"ss":40,"used":true},{"PRN":7,"el":25,"az":309,"ss":0,"used":false},{"PRN":4,"el":17,"az":308,"ss":40,"used":true},{"PRN":9,"el":16,"az":99,"ss":0,"used":false},{"PRN":3,"el":14,"az":190,"ss":0,"used":false},{"PRN":8,"el":10,"az":39,"ss":0,"used":false},{"PRN":10,"el":2,"az":65,"ss":0,"used":false}]} $GPRMC,235736.02,A,4808.9979,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*3D $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235736.02,4808.9979,N,01135.0801,E,1,04,01.4,00464.4,M,0046.2,M,,*5E {"class":"TPV","mode":3,"time":"2019-04-06T23:57:36.020Z","ept":0.005,"lat":48.149965000,"lon":11.584668333,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.000,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 {"class":"SKY","xdop":0.94,"ydop":0.98,"vdop":2.20,"tdop":1.28,"hdop":1.40,"gdop":2.82,"pdop":2.60,"satellites":[{"PRN":20,"el":78,"az":50,"ss":40,"used":true},{"PRN":11,"el":72,"az":261,"ss":0,"used":false},{"PRN":6,"el":41,"az":278,"ss":0,"used":false},{"PRN":14,"el":38,"az":185,"ss":0,"used":false},{"PRN":31,"el":27,"az":62,"ss":40,"used":true},{"PRN":13,"el":26,"az":209,"ss":40,"used":true},{"PRN":7,"el":25,"az":309,"ss":0,"used":false},{"PRN":4,"el":17,"az":308,"ss":40,"used":true},{"PRN":9,"el":16,"az":99,"ss":0,"used":false},{"PRN":3,"el":14,"az":190,"ss":0,"used":false},{"PRN":8,"el":10,"az":39,"ss":0,"used":false},{"PRN":10,"el":2,"az":65,"ss":0,"used":false}]} $GPRMC,235737.02,A,4808.9979,N,01135.0801,E,000.0,000.0,060419,003.0,E,A*3C $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,235737.02,4808.9979,N,01135.0801,E,1,04,01.4,00464.4,M,0046.2,M,,*5F {"class":"TPV","mode":3,"time":"2019-04-06T23:57:37.020Z","ept":0.005,"lat":48.149965000,"lon":11.584668333,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.000,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPZDA,235737.02,06,04,2019,,*6B $GPRMC,235738.02,A,4808.9979,N,01135.0801,E,000.1,000.0,060419,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235738.02,4808.9979,N,01135.0801,E,1,04,01.4,00464.5,M,0046.2,M,,*51 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:38.020Z","ept":0.005,"lat":48.149965000,"lon":11.584668333,"alt":464.500,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,278,,14,38,185,*78 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 {"class":"SKY","xdop":0.94,"ydop":0.98,"vdop":2.20,"tdop":1.28,"hdop":1.40,"gdop":2.82,"pdop":2.60,"satellites":[{"PRN":20,"el":78,"az":50,"ss":40,"used":true},{"PRN":11,"el":72,"az":261,"ss":0,"used":false},{"PRN":6,"el":41,"az":278,"ss":0,"used":false},{"PRN":14,"el":38,"az":185,"ss":0,"used":false},{"PRN":31,"el":27,"az":62,"ss":40,"used":true},{"PRN":13,"el":26,"az":209,"ss":40,"used":true},{"PRN":7,"el":25,"az":309,"ss":0,"used":false},{"PRN":4,"el":17,"az":308,"ss":40,"used":true},{"PRN":9,"el":16,"az":99,"ss":0,"used":false},{"PRN":3,"el":14,"az":190,"ss":0,"used":false},{"PRN":8,"el":10,"az":39,"ss":0,"used":false},{"PRN":10,"el":2,"az":65,"ss":0,"used":false}]} $GPRMC,235739.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*32 $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235739.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*50 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:39.020Z","ept":0.005,"lat":48.149965000,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,309,,04,17,308,40*72 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 {"class":"SKY","xdop":0.94,"ydop":0.98,"vdop":2.20,"tdop":1.28,"hdop":1.40,"gdop":2.82,"pdop":2.60,"satellites":[{"PRN":20,"el":78,"az":50,"ss":40,"used":true},{"PRN":11,"el":72,"az":261,"ss":0,"used":false},{"PRN":6,"el":41,"az":277,"ss":0,"used":false},{"PRN":14,"el":38,"az":185,"ss":0,"used":false},{"PRN":31,"el":27,"az":62,"ss":40,"used":true},{"PRN":13,"el":26,"az":209,"ss":40,"used":true},{"PRN":7,"el":25,"az":309,"ss":0,"used":false},{"PRN":4,"el":17,"az":308,"ss":40,"used":true},{"PRN":9,"el":16,"az":99,"ss":0,"used":false},{"PRN":3,"el":14,"az":190,"ss":0,"used":false},{"PRN":8,"el":10,"az":39,"ss":0,"used":false},{"PRN":10,"el":2,"az":65,"ss":0,"used":false}]} $GPRMC,235740.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3C $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,235740.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5E {"class":"TPV","mode":3,"time":"2019-04-06T23:57:40.020Z","ept":0.005,"lat":48.149965000,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,308,,04,17,308,40*73 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 {"class":"SKY","xdop":0.94,"ydop":0.98,"vdop":2.20,"tdop":1.28,"hdop":1.40,"gdop":2.82,"pdop":2.60,"satellites":[{"PRN":20,"el":78,"az":50,"ss":40,"used":true},{"PRN":11,"el":72,"az":261,"ss":0,"used":false},{"PRN":6,"el":41,"az":277,"ss":0,"used":false},{"PRN":14,"el":38,"az":185,"ss":0,"used":false},{"PRN":31,"el":27,"az":62,"ss":40,"used":true},{"PRN":13,"el":26,"az":209,"ss":40,"used":true},{"PRN":7,"el":25,"az":308,"ss":0,"used":false},{"PRN":4,"el":17,"az":308,"ss":40,"used":true},{"PRN":9,"el":16,"az":99,"ss":0,"used":false},{"PRN":3,"el":14,"az":190,"ss":0,"used":false},{"PRN":8,"el":10,"az":39,"ss":0,"used":false},{"PRN":10,"el":2,"az":65,"ss":0,"used":false}]} $GPRMC,235741.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3D $GPVTG,000.0,T,357.0,M,000.1,N,0000.2,K,A*11 $GPGGA,235741.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5F {"class":"TPV","mode":3,"time":"2019-04-06T23:57:41.020Z","ept":0.005,"lat":48.149965000,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,308,,04,17,308,40*73 $GPGLL,4808.9979,N,01135.0800,E,235741.02,A,A*69 {"class":"TPV","mode":3,"time":"2019-04-06T23:57:41.020Z","ept":0.005,"lat":48.149965000,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"climb":0.000,"eps":29.47} $GPRMC,235742.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3E $GPVTG,000.0,T,357.0,M,000.1,N,0000.2,K,A*11 $GPGGA,235742.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5C {"class":"TPV","mode":3,"time":"2019-04-06T23:57:42.020Z","ept":0.005,"lat":48.149965000,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,308,,04,17,308,40*73 $GPGSV,3,3,12,09,16,099,,03,14,190,,08,10,039,,10,02,065,*79 {"class":"SKY","xdop":0.94,"ydop":0.98,"vdop":2.20,"tdop":1.28,"hdop":1.40,"gdop":2.82,"pdop":2.60,"satellites":[{"PRN":20,"el":78,"az":50,"ss":40,"used":true},{"PRN":11,"el":72,"az":261,"ss":0,"used":false},{"PRN":6,"el":41,"az":277,"ss":0,"used":false},{"PRN":14,"el":38,"az":185,"ss":0,"used":false},{"PRN":31,"el":27,"az":62,"ss":40,"used":true},{"PRN":13,"el":26,"az":209,"ss":40,"used":true},{"PRN":7,"el":25,"az":308,"ss":0,"used":false},{"PRN":4,"el":17,"az":308,"ss":40,"used":true},{"PRN":9,"el":16,"az":99,"ss":0,"used":false},{"PRN":3,"el":14,"az":190,"ss":0,"used":false},{"PRN":8,"el":10,"az":39,"ss":0,"used":false},{"PRN":10,"el":2,"az":65,"ss":0,"used":false}]} $GPRMC,235743.02,A,4808.9979,N,01135.0800,E,000.1,000.0,060419,003.0,E,A*3F $GPVTG,000.0,T,357.0,M,000.1,N,0000.2,K,A*11 $GPGGA,235743.02,4808.9979,N,01135.0800,E,1,04,01.4,00464.4,M,0046.2,M,,*5D {"class":"TPV","mode":3,"time":"2019-04-06T23:57:43.020Z","ept":0.005,"lat":48.149965000,"lon":11.584666667,"alt":464.400,"epx":14.174,"epy":14.733,"epv":50.600,"track":0.0000,"speed":0.051,"eps":29.47} $GPGSA,A,3,20,,,,31,13,,04,,,,,02.6,01.4,02.2*05 $GPGSV,3,1,12,20,78,050,40,11,72,261,,06,41,277,,14,38,185,*77 $GPGSV,3,2,12,31,27,062,40,13,26,209,40,07,25,308,,04,17,308,40*73 gpsd-3.15/test/daemon/gp-320fw-2019-04-07-coldboot.log0000664000175000017500000001726312461156335017617 0ustar esresr# Name: GPS-320FW # Chipset: SE4100L + PL-6313 # Description: OEM module from RF Solutions, Inc # Submitter: f4eru # Date: 2010-10-16 # Notes: The chip has been spoofed with a sat simulator into thinking it is # 2019-04-07 (just after a rollover of the 10-bit GPS week calendar) # then restarted. The restart point is indicated by the (undocumented) # $PLCS sentence. The RMC on data line 7 shows what one looks like with # no date. On data line 10 before reboot, see a date of 2019-04-07. On # line 19, just after the reboout, see an RMC with a Void indication and # a garbage date of 2006-12-16. Following this RMCs report garbage # dates for a few more cycles before acquiring lock and shipping a # consistent 220899, which is a GPS week 0 date of 1999-08-22. # $GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,000343.03,4808.9993,N,01135.0798,E,1,04,01.4,00460.0,M,0046.2,M,,*56 $GPGSA,A,3,20,,,,13,31,,04,,,,,02.7,01.4,02.3*05 $GPGSV,3,1,12,20,76,058,40,11,73,252,,06,41,274,,14,41,185,*7D $GPGSV,3,2,12,13,29,210,40,31,27,059,40,07,26,306,,04,20,308,40*75 $GPGLL,4808.9993,N,01135.0798,E,000343.03,A,A*60 $GPRMC,000344.03,A,4808.9992,N,4,02.3*05 $GPGSV,3,1,12,20,76,058,40,11,73,252,,06,41,274,,14,43,12,09,18,096,,03,11,189,,08,09,037,,10,00,066,*72 $GPRMC,000345.03,A,4808.9993,N,01135.0798,E,000.1,000.0,070419,003.0,E,A*33 $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,000345.03,4808.9993,N,01135.0798,E,1,04,01.4,00459.9,M,0046.2,M,,*53 $GPGSA,A,3,20,,,,13,31,,04,,,,,02.7,01.4,02.3*05 $GPGSV,3,1,12,20,76,058,40,11,73,252,,06,41,274,,14,41,185,*7D $GPGSV,3,2,12,13,29,210,41,31,27,059,40,07,26,306,,04,20,308,40*74 $GPGLL,4808.9993,N,01135.0798,E,000345.03,A,A*66 $GPRMC,000346.03,A,4808 $PLCS,REV,PLN012054S07,070312,145743 $GPRMC,235948.00,V,0000.0000,N,00000.0000,E,,,161206,,,N*45 $GPN,00000.0000,E,0,00,0.0,,M,,M,,*5C $GPGSA,A,1,,,,,,,,,,,,,,,*1E$GPRMC,235949.00,V,0000.0000,N,00000.0000,E,,,161206,,,N*44 $GPN,00000.0000,E,0,00,0.0,,M,,M,,*5D $GPGSA,A,1,,,,,,,,,,,,,,,*1E$GPRMC,235950.00,V,0000.0000,N,00000.0000,E,,,161206,,,N*4C $GPN,00000.0000,E,0,00,0.0,,M,,M,,*55 $GPGSA,A,1,,,,,,,,,,,,,,,*1E0,*4E $GPRMC,193515.00,V,0000.0000,N,00000.0000,E,,,300910,,,N*47 $GPN,00000.0000,E,0,00,0.0,,M,,M,,*57 $GPGSA,A,1,,,,,,,,,,,,,,,*1E*43 $GPGGA,235952.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*00.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*51 $GPGSA,A,1,,,,,,,,,,11,03,090,,20,10,090,,07,22,090,,14,20,090,*78 $GPGSV,3,2,12,193,33,090,,31,25,090,,09,58,270,*71 $GPRMC,235955.00,V,0000.0000,,,N*44 $GPGGA,235955.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,,,,,,,,,,*1E $GPRMC,235957.00,V,0000.0000,N,00000.0000,E,,,250910,,,N*46 $GPN,00000.0000,E,0,00,0.0,,M,,M,,*52 $GPGSA,A,1,,,,,,,,,,,,,,,*1E0,,13,68,270,,24,60,270,,04,39,270,40*73 $GPGSV,3,2,11,25,32,097 $GPRMC,235958.00,V,0000.0000,N,00000.0000,E,,,250910,,,N*49 $GP,00,0.0,,M,,M,,*5D $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,235959.00,V,0000.0000,N,00000.0000,E,,,250910,,,N*48 $GP,00,0.0,,M,,M,,*5C $GPGSA,A,1,,,,,,,,,,,,,,,*1E ,,,,,,,,,,,,,*1E $GPGSV,3,1,11,23,87,270,,13,68,270,,24,60,270,$GPRMC,000002.00,V,0000.0000,N,00000.0000,E,,,260910,,,N*48 $GP ,20,10,090,41*70 $GPGSV,3,3,12,06,08,270,,16,01,090,,02,16,270,$GPGGA,000410.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*58 $11,23,87,270,,13,70,270,,24,59,270,,04,40,270,40*7E $GPGSV,3,2,23,87,270,,13,70,270,,24,59,270,,04,40,270,40*7D $GPGSV,3,2,12,0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5A $GPGSA,A,1,,,,,,,,,,,,,N*4C $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000413.00,0000.0000,N,000000.0000,E,0,00,0.0,,M,,M,,*5E $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GP,70,270,,24,59,270,,04,40,270,40*7D $GPGSV,3,2,12,25,31,090,,01,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,2,40,16,00,090,*72 $GPGLL,0000.0000,N,00000.0000,E,000418.00,V,N19.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*51 $GPGSA,A,1,,$GPRMC,000425.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4D $GPN*2C $GPGGA,000425.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,70,,13,70,270,,24,59,270,,04,41,270,40*7D $GPGSV,3,2,12,25,31,0090,*71 $GPGSV,3,3,12,20,09,090,41,06,08,270,,31,26,090,40,16,0GPRMC,000426.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4E $GPV427.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4F $GPVTG,,T,,M,2C $GPGGA,000427.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,27.00,V,N*70 $GPZDA,000427.00,22,08,1999,,*67 $GPRMC,000428.00,,E,,,220899,,,N*40 $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000428.00,00,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPG428.00,22,08,1999,,*68 $GPRMC,000429.00,V,0000.0000,N,00000.000VTG,,T,,M,,N,,K,N*2C $GPGGA,000429.00,0000.0000,N,00000.0000,E,,,M,,M,,*52 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,16,00,090,,31,26,090,40*72 $GPGLL,0000.0000,N,00000.0000,E,000429.00,V,N*7E $GPZDA,000429.00,22,08,1999,,*69 $GPRMC,000430.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*49 $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000430.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5A $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,16,00,090,,31,26,090,40*72 $GPGLL,0000.0000,N,00000.0000,E,000430.00,V,N*76 $GPZDA,000430.00,22,08,1999,,*61 $GPRMC,000431.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*48 $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000431.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,40,16,00,090,*72 $GPGLL,0000.0000,N,00000.0000,E,000431.00,V,N*77 $GPZDA,000431.00,22,08,1999,,*60 $GPRMC,000432.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4B $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000432.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*58 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,41,16,00,090,*73 $GPGLL,0000.0000,N,00000.0000,E,000432.00,V,N*74 $GPZDA,000432.00,22,08,1999,,*63 $GPRMC,000433.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4A $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000433.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*59 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,41,16,00,090,*73 $GPGLL,0000.0000,N,00000.0000,E,000433.00,V,N*75 $GPZDA,000433.00,22,08,1999,,*62 $GPRMC,000434.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4D $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000434.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5E $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,41,16,00,090,*73 $GPGLL,0000.0000,N,00000.0000,E,000434.00,V,N*72 $GPZDA,000434.00,22,08,1999,,*65 $GPRMC,000435.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4C $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000435.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,20,270,40*7E $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,41,16,00,090,*73 gpsd-3.15/test/daemon/gp-320fw-2019-04-07-coldboot.log.chk0000664000175000017500000002362612467340617020367 0ustar esresr$GPVTG,000.0,T,357.0,M,000.0,N,0000.1,K,A*13 $GPGGA,000343.03,4808.9993,N,01135.0798,E,1,04,01.4,00460.0,M,0046.2,M,,*56 {"class":"TPV","mode":3,"lat":48.149988333,"lon":11.584663333,"alt":460.000} $GPGSA,A,3,20,,,,13,31,,04,,,,,02.7,01.4,02.3*05 {"class":"TPV","mode":3,"lat":48.149988333,"lon":11.584663333,"alt":460.000,"epv":52.900} $GPGSV,3,1,12,20,76,058,40,11,73,252,,06,41,274,,14,41,185,*7D $GPGSV,3,2,12,13,29,210,40,31,27,059,40,07,26,306,,04,20,308,40*75 $GPGLL,4808.9993,N,01135.0798,E,000343.03,A,A*60 {"class":"TPV","mode":3,"lat":48.149988333,"lon":11.584663333,"alt":460.000,"epv":52.900} $GPRMC,000345.03,A,4808.9993,N,01135.0798,E,000.1,000.0,070419,003.0,E,A*33 $GPVTG,000.0,T,357.0,M,000.1,N,0000.1,K,A*12 $GPGGA,000345.03,4808.9993,N,01135.0798,E,1,04,01.4,00459.9,M,0046.2,M,,*53 $GPGSA,A,3,20,,,,13,31,,04,,,,,02.7,01.4,02.3*05 $GPGSV,3,1,12,20,76,058,40,11,73,252,,06,41,274,,14,41,185,*7D $GPGSV,3,2,12,13,29,210,41,31,27,059,40,07,26,306,,04,20,308,40*74 $GPGLL,4808.9993,N,01135.0798,E,000345.03,A,A*66 {"class":"TPV","mode":3,"time":"2019-04-07T00:03:45.030Z","ept":0.005,"lat":48.149988333,"lon":11.584663333,"alt":459.900,"epv":52.900,"track":0.0000,"speed":0.051,"climb":0.000} $PLCS,REV,PLN012054S07,070312,145743 $GPRMC,235948.00,V,0000.0000,N,00000.0000,E,,,161206,,,N*45 $GPRMC,235949.00,V,0000.0000,N,00000.0000,E,,,161206,,,N*44 $GPRMC,235950.00,V,0000.0000,N,00000.0000,E,,,161206,,,N*4C $GPRMC,193515.00,V,0000.0000,N,00000.0000,E,,,300910,,,N*47 $GPRMC,235957.00,V,0000.0000,N,00000.0000,E,,,250910,,,N*46 $GPGSV,3,2,11,25,32,097 $GPRMC,235958.00,V,0000.0000,N,00000.0000,E,,,250910,,,N*49 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,235959.00,V,0000.0000,N,00000.0000,E,,,250910,,,N*48 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPRMC,000002.00,V,0000.0000,N,00000.0000,E,,,260910,,,N*48 $GP $GPGGA,000410.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*58 $GPVTG,,T,,M,,N,,K,N*2C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,3,12,2,40,16,00,090,*72 $GPRMC,000425.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4D $GPVTG,,T,,M,2C $GPGGA,000427.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPZDA,000427.00,22,08,1999,,*67 $GPVTG,,T,,M,,N,,K,N*2C $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,16,00,090,,31,26,090,40*72 {"class":"SKY","vdop":2.30,"hdop":1.40,"pdop":2.70,"satellites":[{"PRN":23,"el":86,"az":270,"ss":0,"used":false},{"PRN":13,"el":70,"az":270,"ss":40,"used":false},{"PRN":24,"el":59,"az":270,"ss":0,"used":false},{"PRN":4,"el":41,"az":270,"ss":40,"used":false},{"PRN":25,"el":31,"az":90,"ss":0,"used":false},{"PRN":1,"el":22,"az":90,"ss":0,"used":false},{"PRN":17,"el":13,"az":270,"ss":0,"used":false},{"PRN":5,"el":12,"az":90,"ss":0,"used":false},{"PRN":20,"el":9,"az":90,"ss":40,"used":false},{"PRN":6,"el":8,"az":270,"ss":0,"used":false},{"PRN":16,"el":0,"az":90,"ss":0,"used":false},{"PRN":31,"el":26,"az":90,"ss":40,"used":false}]} $GPGLL,0000.0000,N,00000.0000,E,000429.00,V,N*7E {"class":"TPV","mode":0,"time":"1999-08-22T00:04:29.000Z","ept":0.005} $GPZDA,000429.00,22,08,1999,,*69 $GPRMC,000430.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*49 $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000430.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5A $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,16,00,090,,31,26,090,40*72 {"class":"SKY","vdop":2.30,"hdop":1.40,"pdop":2.70,"satellites":[{"PRN":23,"el":86,"az":270,"ss":0,"used":false},{"PRN":13,"el":70,"az":270,"ss":40,"used":false},{"PRN":24,"el":59,"az":270,"ss":0,"used":false},{"PRN":4,"el":41,"az":270,"ss":40,"used":false},{"PRN":25,"el":31,"az":90,"ss":0,"used":false},{"PRN":1,"el":22,"az":90,"ss":0,"used":false},{"PRN":17,"el":13,"az":270,"ss":0,"used":false},{"PRN":5,"el":12,"az":90,"ss":0,"used":false},{"PRN":20,"el":9,"az":90,"ss":40,"used":false},{"PRN":6,"el":8,"az":270,"ss":0,"used":false},{"PRN":16,"el":0,"az":90,"ss":0,"used":false},{"PRN":31,"el":26,"az":90,"ss":40,"used":false}]} $GPGLL,0000.0000,N,00000.0000,E,000430.00,V,N*76 {"class":"TPV","mode":0,"time":"1999-08-22T00:04:30.000Z","ept":0.005} $GPZDA,000430.00,22,08,1999,,*61 $GPRMC,000431.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*48 $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000431.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5B $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,40,16,00,090,*72 {"class":"SKY","vdop":2.30,"hdop":1.40,"pdop":2.70,"satellites":[{"PRN":23,"el":86,"az":270,"ss":0,"used":false},{"PRN":13,"el":70,"az":270,"ss":40,"used":false},{"PRN":24,"el":59,"az":270,"ss":0,"used":false},{"PRN":4,"el":41,"az":270,"ss":40,"used":false},{"PRN":25,"el":31,"az":90,"ss":0,"used":false},{"PRN":1,"el":22,"az":90,"ss":0,"used":false},{"PRN":17,"el":13,"az":270,"ss":0,"used":false},{"PRN":5,"el":12,"az":90,"ss":0,"used":false},{"PRN":20,"el":9,"az":90,"ss":40,"used":false},{"PRN":6,"el":8,"az":270,"ss":0,"used":false},{"PRN":31,"el":26,"az":90,"ss":40,"used":false},{"PRN":16,"el":0,"az":90,"ss":0,"used":false}]} $GPGLL,0000.0000,N,00000.0000,E,000431.00,V,N*77 {"class":"TPV","mode":0,"time":"1999-08-22T00:04:31.000Z","ept":0.005} $GPZDA,000431.00,22,08,1999,,*60 $GPRMC,000432.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4B $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000432.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*58 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,41,16,00,090,*73 {"class":"SKY","vdop":2.30,"hdop":1.40,"pdop":2.70,"satellites":[{"PRN":23,"el":86,"az":270,"ss":0,"used":false},{"PRN":13,"el":70,"az":270,"ss":40,"used":false},{"PRN":24,"el":59,"az":270,"ss":0,"used":false},{"PRN":4,"el":41,"az":270,"ss":40,"used":false},{"PRN":25,"el":31,"az":90,"ss":0,"used":false},{"PRN":1,"el":22,"az":90,"ss":0,"used":false},{"PRN":17,"el":13,"az":270,"ss":0,"used":false},{"PRN":5,"el":12,"az":90,"ss":0,"used":false},{"PRN":20,"el":9,"az":90,"ss":40,"used":false},{"PRN":6,"el":8,"az":270,"ss":0,"used":false},{"PRN":31,"el":26,"az":90,"ss":41,"used":false},{"PRN":16,"el":0,"az":90,"ss":0,"used":false}]} $GPGLL,0000.0000,N,00000.0000,E,000432.00,V,N*74 {"class":"TPV","mode":0,"time":"1999-08-22T00:04:32.000Z","ept":0.005} $GPZDA,000432.00,22,08,1999,,*63 $GPRMC,000433.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4A $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000433.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*59 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,41,16,00,090,*73 {"class":"SKY","vdop":2.30,"hdop":1.40,"pdop":2.70,"satellites":[{"PRN":23,"el":86,"az":270,"ss":0,"used":false},{"PRN":13,"el":70,"az":270,"ss":40,"used":false},{"PRN":24,"el":59,"az":270,"ss":0,"used":false},{"PRN":4,"el":41,"az":270,"ss":40,"used":false},{"PRN":25,"el":31,"az":90,"ss":0,"used":false},{"PRN":1,"el":22,"az":90,"ss":0,"used":false},{"PRN":17,"el":13,"az":270,"ss":0,"used":false},{"PRN":5,"el":12,"az":90,"ss":0,"used":false},{"PRN":20,"el":9,"az":90,"ss":40,"used":false},{"PRN":6,"el":8,"az":270,"ss":0,"used":false},{"PRN":31,"el":26,"az":90,"ss":41,"used":false},{"PRN":16,"el":0,"az":90,"ss":0,"used":false}]} $GPGLL,0000.0000,N,00000.0000,E,000433.00,V,N*75 {"class":"TPV","mode":0,"time":"1999-08-22T00:04:33.000Z","ept":0.005} $GPZDA,000433.00,22,08,1999,,*62 $GPRMC,000434.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4D $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000434.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5E $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,41,270,40*79 $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,41,16,00,090,*73 {"class":"SKY","vdop":2.30,"hdop":1.40,"pdop":2.70,"satellites":[{"PRN":23,"el":86,"az":270,"ss":0,"used":false},{"PRN":13,"el":70,"az":270,"ss":40,"used":false},{"PRN":24,"el":59,"az":270,"ss":0,"used":false},{"PRN":4,"el":41,"az":270,"ss":40,"used":false},{"PRN":25,"el":31,"az":90,"ss":0,"used":false},{"PRN":1,"el":22,"az":90,"ss":0,"used":false},{"PRN":17,"el":13,"az":270,"ss":0,"used":false},{"PRN":5,"el":12,"az":90,"ss":0,"used":false},{"PRN":20,"el":9,"az":90,"ss":40,"used":false},{"PRN":6,"el":8,"az":270,"ss":0,"used":false},{"PRN":31,"el":26,"az":90,"ss":41,"used":false},{"PRN":16,"el":0,"az":90,"ss":0,"used":false}]} $GPGLL,0000.0000,N,00000.0000,E,000434.00,V,N*72 {"class":"TPV","mode":0,"time":"1999-08-22T00:04:34.000Z","ept":0.005} $GPZDA,000434.00,22,08,1999,,*65 $GPRMC,000435.00,V,0000.0000,N,00000.0000,E,,,220899,,,N*4C $GPVTG,,T,,M,,N,,K,N*2C $GPGGA,000435.00,0000.0000,N,00000.0000,E,0,00,0.0,,M,,M,,*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,23,86,270,,13,70,270,40,24,59,270,,04,20,270,40*7E $GPGSV,3,2,12,25,31,090,,01,22,090,,17,13,270,,05,12,090,*71 $GPGSV,3,3,12,20,09,090,40,06,08,270,,31,26,090,41,16,00,090,*73 {"class":"SKY","vdop":2.30,"hdop":1.40,"pdop":2.70,"satellites":[{"PRN":23,"el":86,"az":270,"ss":0,"used":false},{"PRN":13,"el":70,"az":270,"ss":40,"used":false},{"PRN":24,"el":59,"az":270,"ss":0,"used":false},{"PRN":4,"el":20,"az":270,"ss":40,"used":false},{"PRN":25,"el":31,"az":90,"ss":0,"used":false},{"PRN":1,"el":22,"az":90,"ss":0,"used":false},{"PRN":17,"el":13,"az":270,"ss":0,"used":false},{"PRN":5,"el":12,"az":90,"ss":0,"used":false},{"PRN":20,"el":9,"az":90,"ss":40,"used":false},{"PRN":6,"el":8,"az":270,"ss":0,"used":false},{"PRN":31,"el":26,"az":90,"ss":41,"used":false},{"PRN":16,"el":0,"az":90,"ss":0,"used":false}]} gpsd-3.15/test/daemon/gps-360.log0000664000175000017500000000765212467342657014623 0ustar esresr# Name: Pharos GPS-360 # Chipset: SiRfII # Submitter: "Jeff Fisher" # Date: 2006-07-27 # Location: Regina, Saskatchewan, Canada, 50N104W # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021612.949,A,5029.3800,N,10441.0390,W,0.039560,189.06,280706,,*18 $GPGGA,021613.949,5029.3800,N,10441.0389,W,1,04,12.5,572.4,M,-20.3,M,0.0,0000*7E $GPGLL,5029.3800,N,10441.0389,W,021613.949,A*22 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021613.949,A,5029.3800,N,10441.0389,W,0.009850,267.99,280706,,*19 $GPGGA,021614.949,5029.3800,N,10441.0388,W,1,04,12.5,572.3,M,-20.3,M,0.0,0000*7F $GPGLL,5029.3800,N,10441.0388,W,021614.949,A*24 $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 $GPRMC,021614.949,A,5029.3800,N,10441.0388,W,0.016538,341.48,280706,,*1B $GPGGA,021615.949,5029.3799,N,10441.0387,W,1,04,12.5,572.1,M,-20.3,M,0.0,0000*7C $GPGLL,5029.3799,N,10441.0387,W,021615.949,A*25 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021615.949,A,5029.3799,N,10441.0387,W,0.024470,357.79,280706,,*13 $GPGGA,021616.949,5029.3800,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7B $GPGLL,5029.3800,N,10441.0387,W,021616.949,A*29 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021616.949,A,5029.3800,N,10441.0387,W,0.064679,355.50,280706,,*19 $GPGGA,021617.949,5029.3800,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7A $GPGLL,5029.3800,N,10441.0387,W,021617.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021617.949,A,5029.3800,N,10441.0387,W,0.081945,359.64,280706,,*18 $GPGGA,021618.949,5029.3801,N,10441.0387,W,1,04,12.5,571.8,M,-20.3,M,0.0,0000*75 $GPGLL,5029.3801,N,10441.0387,W,021618.949,A*26 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021618.949,A,5029.3801,N,10441.0387,W,0.123681,359.07,280706,,*1D $GPGGA,021619.949,5029.3802,N,10441.0387,W,1,04,12.5,571.6,M,-20.3,M,0.0,0000*79 $GPGLL,5029.3802,N,10441.0387,W,021619.949,A*24 $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 $GPRMC,021619.949,A,5029.3802,N,10441.0387,W,0.152675,359.28,280706,,*1F $GPGGA,021620.949,5029.3803,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*73 $GPGLL,5029.3803,N,10441.0387,W,021620.949,A*2F $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021620.949,A,5029.3803,N,10441.0387,W,0.149670,359.57,280706,,*13 $GPGGA,021621.949,5029.3805,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7A $GPGLL,5029.3805,N,10441.0387,W,021621.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021621.949,A,5029.3805,N,10441.0387,W,0.139805,358.04,280706,,*18 $GPGGA,021622.949,5029.3806,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*74 $GPGLL,5029.3806,N,10441.0387,W,021622.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021622.949,A,5029.3806,N,10441.0387,W,0.159851,358.60,280706,,*1D $GPGGA,021623.949,5029.3808,N,10441.0387,W,1,04,12.5,571.2,M,-20.3,M,0.0,0000*7E $GPGLL,5029.3808,N,10441.0387,W,021623.949,A*27 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021623.949,A,5029.3808,N,10441.0387,W,0.211601,1.82,280706,,*15 $GPGGA,021624.949,5029.3810,N,10441.0386,W,1,04,12.5,570.7,M,-20.3,M,0.0,0000*75 $GPGLL,5029.3810,N,10441.0386,W,021624.949,A*28 $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 $GPRMC,021624.949,A,5029.3810,N,10441.0386,W,0.200234,356.84,280706,,*1F $GPGGA,021625.949,5029.3812,N,10441.0386,W,1,04,12.5,570.1,M,-20.3,M,0.0,0000*70 $GPGLL,5029.3812,N,10441.0386,W,021625.949,A*2B gpsd-3.15/test/daemon/gps-360.log.chk0000664000175000017500000002020012467342657015347 0ustar esresr$GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 {"class":"TPV","mode":3,"epv":71.300} $GPRMC,021612.949,A,5029.3800,N,10441.0390,W,0.039560,189.06,280706,,*18 {"class":"TPV","mode":2,"time":"2006-07-28T02:16:12.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683983333,"track":189.0600,"speed":0.020} $GPGGA,021613.949,5029.3800,N,10441.0389,W,1,04,12.5,572.4,M,-20.3,M,0.0,0000*7E $GPGLL,5029.3800,N,10441.0389,W,021613.949,A*22 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021613.949,A,5029.3800,N,10441.0389,W,0.009850,267.99,280706,,*19 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:13.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683981667,"alt":572.400,"epv":71.300,"track":267.9900,"speed":0.005,"climb":0.000} $GPGGA,021614.949,5029.3800,N,10441.0388,W,1,04,12.5,572.3,M,-20.3,M,0.0,0000*7F $GPGLL,5029.3800,N,10441.0388,W,021614.949,A*24 $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","xdop":0.81,"ydop":12.16,"vdop":3.10,"tdop":2.04,"hdop":12.50,"gdop":12.75,"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","mode":3,"time":"2006-07-28T02:16:14.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683980000,"alt":572.300,"epx":12.184,"epy":182.343,"epv":71.300,"track":341.4800,"speed":0.009,"climb":-0.100,"epc":142.60} $GPGGA,021615.949,5029.3799,N,10441.0387,W,1,04,12.5,572.1,M,-20.3,M,0.0,0000*7C $GPGLL,5029.3799,N,10441.0387,W,021615.949,A*25 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021615.949,A,5029.3799,N,10441.0387,W,0.024470,357.79,280706,,*13 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:15.949Z","ept":0.005,"lat":50.489665000,"lon":-104.683978333,"alt":572.100,"epx":12.184,"epy":182.343,"epv":71.300,"track":357.7900,"speed":0.013,"climb":-0.200,"eps":364.69,"epc":142.60} $GPGGA,021616.949,5029.3800,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7B $GPGLL,5029.3800,N,10441.0387,W,021616.949,A*29 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021616.949,A,5029.3800,N,10441.0387,W,0.064679,355.50,280706,,*19 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:16.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683978333,"alt":571.900,"epx":12.184,"epy":182.343,"epv":71.300,"track":355.5000,"speed":0.033,"climb":-0.200,"eps":364.69,"epc":142.60} $GPGGA,021617.949,5029.3800,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7A $GPGLL,5029.3800,N,10441.0387,W,021617.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021617.949,A,5029.3800,N,10441.0387,W,0.081945,359.64,280706,,*18 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:17.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683978333,"alt":571.900,"epx":12.184,"epy":182.343,"epv":71.300,"track":359.6400,"speed":0.042,"climb":0.000,"eps":364.69,"epc":142.60} $GPGGA,021618.949,5029.3801,N,10441.0387,W,1,04,12.5,571.8,M,-20.3,M,0.0,0000*75 $GPGLL,5029.3801,N,10441.0387,W,021618.949,A*26 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021618.949,A,5029.3801,N,10441.0387,W,0.123681,359.07,280706,,*1D {"class":"TPV","mode":3,"time":"2006-07-28T02:16:18.949Z","ept":0.005,"lat":50.489668333,"lon":-104.683978333,"alt":571.800,"epx":12.184,"epy":182.343,"epv":71.300,"track":359.0700,"speed":0.064,"climb":-0.100,"eps":364.69,"epc":142.60} $GPGGA,021619.949,5029.3802,N,10441.0387,W,1,04,12.5,571.6,M,-20.3,M,0.0,0000*79 $GPGLL,5029.3802,N,10441.0387,W,021619.949,A*24 $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","xdop":0.81,"ydop":12.16,"vdop":3.10,"tdop":2.04,"hdop":12.50,"gdop":12.75,"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","mode":3,"time":"2006-07-28T02:16:19.949Z","ept":0.005,"lat":50.489670000,"lon":-104.683978333,"alt":571.600,"epx":12.184,"epy":182.343,"epv":71.300,"track":359.2800,"speed":0.079,"climb":-0.200,"eps":364.69,"epc":142.60} $GPGGA,021620.949,5029.3803,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*73 $GPGLL,5029.3803,N,10441.0387,W,021620.949,A*2F $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021620.949,A,5029.3803,N,10441.0387,W,0.149670,359.57,280706,,*13 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:20.949Z","ept":0.005,"lat":50.489671667,"lon":-104.683978333,"alt":571.700,"epx":12.184,"epy":182.343,"epv":71.300,"track":359.5700,"speed":0.077,"climb":0.100,"eps":364.69,"epc":142.60} $GPGGA,021621.949,5029.3805,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7A $GPGLL,5029.3805,N,10441.0387,W,021621.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021621.949,A,5029.3805,N,10441.0387,W,0.139805,358.04,280706,,*18 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:21.949Z","ept":0.005,"lat":50.489675000,"lon":-104.683978333,"alt":571.900,"epx":12.184,"epy":182.343,"epv":71.300,"track":358.0400,"speed":0.072,"climb":0.200,"eps":364.69,"epc":142.60} $GPGGA,021622.949,5029.3806,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*74 $GPGLL,5029.3806,N,10441.0387,W,021622.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021622.949,A,5029.3806,N,10441.0387,W,0.159851,358.60,280706,,*1D {"class":"TPV","mode":3,"time":"2006-07-28T02:16:22.949Z","ept":0.005,"lat":50.489676667,"lon":-104.683978333,"alt":571.700,"epx":12.184,"epy":182.343,"epv":71.300,"track":358.6000,"speed":0.082,"climb":-0.200,"eps":364.69,"epc":142.60} $GPGGA,021623.949,5029.3808,N,10441.0387,W,1,04,12.5,571.2,M,-20.3,M,0.0,0000*7E $GPGLL,5029.3808,N,10441.0387,W,021623.949,A*27 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021623.949,A,5029.3808,N,10441.0387,W,0.211601,1.82,280706,,*15 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:23.949Z","ept":0.005,"lat":50.489680000,"lon":-104.683978333,"alt":571.200,"epx":12.184,"epy":182.343,"epv":71.300,"track":1.8200,"speed":0.109,"climb":-0.500,"eps":364.69,"epc":142.60} $GPGGA,021624.949,5029.3810,N,10441.0386,W,1,04,12.5,570.7,M,-20.3,M,0.0,0000*75 $GPGLL,5029.3810,N,10441.0386,W,021624.949,A*28 $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","xdop":0.81,"ydop":12.16,"vdop":3.10,"tdop":2.04,"hdop":12.50,"gdop":12.75,"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","mode":3,"time":"2006-07-28T02:16:24.949Z","ept":0.005,"lat":50.489683333,"lon":-104.683976667,"alt":570.700,"epx":12.184,"epy":182.343,"epv":71.300,"track":356.8400,"speed":0.103,"climb":-0.500,"eps":364.69,"epc":142.60} $GPGGA,021625.949,5029.3812,N,10441.0386,W,1,04,12.5,570.1,M,-20.3,M,0.0,0000*70 $GPGLL,5029.3812,N,10441.0386,W,021625.949,A*2B gpsd-3.15/test/daemon/gpslim236.log0000664000175000017500000001142712467342657015245 0ustar esresr# Name: Holux GPSlim 236 # Chipset: SiRF-III # Submitter: "Kévin REDON" # Date: 2006-07-22 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGGA,185244.000,4854.2575,N,00219.9816,E,1,05,1.7,124.4,M,47.3,M,,0000*56 $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 $GPRMC,185244.000,A,4854.2575,N,00219.9816,E,0.00,296.61,210706,,,A*6C $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185245.000,4854.2575,N,00219.9815,E,1,05,1.7,124.1,M,47.3,M,,0000*51 $GPRMC,185245.000,A,4854.2575,N,00219.9815,E,0.00,296.61,210706,,,A*6E $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185246.000,4854.2575,N,00219.9814,E,1,05,1.7,124.0,M,47.3,M,,0000*52 $GPRMC,185246.000,A,4854.2575,N,00219.9814,E,0.00,296.61,210706,,,A*6C $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185247.000,4854.2575,N,00219.9814,E,1,05,1.7,124.3,M,47.3,M,,0000*50 $GPRMC,185247.000,A,4854.2575,N,00219.9814,E,0.00,296.61,210706,,,A*6D $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185248.000,4854.2574,N,00219.9812,E,1,05,1.7,123.6,M,47.3,M,,0000*5A $GPRMC,185248.000,A,4854.2574,N,00219.9812,E,0.00,296.61,210706,,,A*65 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185249.000,4854.2572,N,00219.9810,E,1,05,1.7,123.0,M,47.3,M,,0000*59 $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 $GPRMC,185249.000,A,4854.2572,N,00219.9810,E,0.00,296.61,210706,,,A*60 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185250.000,4854.2571,N,00219.9807,E,1,05,1.7,122.0,M,47.3,M,,0000*55 $GPRMC,185250.000,A,4854.2571,N,00219.9807,E,0.00,296.61,210706,,,A*6D $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185251.000,4854.2570,N,00219.9806,E,1,05,1.7,121.8,M,47.3,M,,0000*5F $GPRMC,185251.000,A,4854.2570,N,00219.9806,E,0.00,296.61,210706,,,A*6C $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185252.000,4854.2569,N,00219.9804,E,1,05,1.7,121.2,M,47.3,M,,0000*5C $GPRMC,185252.000,A,4854.2569,N,00219.9804,E,0.00,296.61,210706,,,A*65 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185253.000,4854.2569,N,00219.9803,E,1,05,1.7,121.1,M,47.3,M,,0000*59 $GPRMC,185253.000,A,4854.2569,N,00219.9803,E,0.00,296.61,210706,,,A*63 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185254.000,4854.2565,N,00219.9796,E,1,05,1.7,118.1,M,47.3,M,,0000*5B $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 $GPRMC,185254.000,A,4854.2565,N,00219.9796,E,0.00,296.61,210706,,,A*6B $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185255.000,4854.2562,N,00219.9788,E,1,05,1.7,115.0,M,47.3,M,,0000*5E $GPRMC,185255.000,A,4854.2562,N,00219.9788,E,0.00,296.61,210706,,,A*62 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185256.000,4854.2559,N,00219.9783,E,1,05,1.7,113.0,M,47.3,M,,0000*58 $GPRMC,185256.000,A,4854.2559,N,00219.9783,E,0.00,296.61,210706,,,A*62 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185257.000,4854.2556,N,00219.9777,E,1,05,1.7,110.4,M,47.3,M,,0000*5A $GPRMC,185257.000,A,4854.2556,N,00219.9777,E,0.00,296.61,210706,,,A*67 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185258.000,4854.2554,N,00219.9772,E,1,05,1.7,108.4,M,47.3,M,,0000*5B $GPRMC,185258.000,A,4854.2554,N,00219.9772,E,0.00,296.61,210706,,,A*6F $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185259.000,4854.2550,N,00219.9764,E,1,05,1.7,105.3,M,47.3,M,,0000*53 $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 $GPRMC,185259.000,A,4854.2550,N,00219.9764,E,0.00,296.61,210706,,,A*6D $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185300.000,4854.2547,N,00219.9759,E,1,05,1.7,103.6,M,47.3,M,,0000*55 $GPRMC,185300.000,A,4854.2547,N,00219.9759,E,0.00,296.61,210706,,,A*68 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185301.000,4854.2545,N,00219.9754,E,1,05,1.7,101.5,M,47.3,M,,0000*5A $GPRMC,185301.000,A,4854.2545,N,00219.9754,E,0.00,296.61,210706,,,A*66 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185302.000,4854.2543,N,00219.9751,E,1,05,1.7,100.1,M,47.3,M,,0000*5F $GPRMC,185302.000,A,4854.2543,N,00219.9751,E,0.00,296.61,210706,,,A*66 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185303.000,4854.2543,N,00219.9750,E,1,05,1.7,99.5,M,47.3,M,,0000*6A $GPRMC,185303.000,A,4854.2543,N,00219.9750,E,0.00,296.61,210706,,,A*66 $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 gpsd-3.15/test/daemon/gpslim236.log.chk0000664000175000017500000002727612467342657016022 0ustar esresr$GPGGA,185244.000,4854.2575,N,00219.9816,E,1,05,1.7,124.4,M,47.3,M,,0000*56 {"class":"TPV","mode":3,"lat":48.904291667,"lon":2.333026667,"alt":124.400} $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.8,1.7,2.2*36 {"class":"TPV","mode":3,"lat":48.904291667,"lon":2.333026667,"alt":124.400,"epv":50.600} $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","xdop":1.14,"ydop":1.23,"vdop":2.20,"tdop":1.49,"hdop":1.70,"gdop":3.13,"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","mode":3,"time":"2006-07-21T18:52:44.000Z","ept":0.005,"lat":48.904291667,"lon":2.333026667,"alt":124.400,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185245.000,4854.2575,N,00219.9815,E,1,05,1.7,124.1,M,47.3,M,,0000*51 $GPRMC,185245.000,A,4854.2575,N,00219.9815,E,0.00,296.61,210706,,,A*6E {"class":"TPV","mode":3,"time":"2006-07-21T18:52:45.000Z","ept":0.005,"lat":48.904291667,"lon":2.333025000,"alt":124.100,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.300,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185246.000,4854.2575,N,00219.9814,E,1,05,1.7,124.0,M,47.3,M,,0000*52 $GPRMC,185246.000,A,4854.2575,N,00219.9814,E,0.00,296.61,210706,,,A*6C {"class":"TPV","mode":3,"time":"2006-07-21T18:52:46.000Z","ept":0.005,"lat":48.904291667,"lon":2.333023333,"alt":124.000,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.100,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185247.000,4854.2575,N,00219.9814,E,1,05,1.7,124.3,M,47.3,M,,0000*50 $GPRMC,185247.000,A,4854.2575,N,00219.9814,E,0.00,296.61,210706,,,A*6D {"class":"TPV","mode":3,"time":"2006-07-21T18:52:47.000Z","ept":0.005,"lat":48.904291667,"lon":2.333023333,"alt":124.300,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":0.300,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185248.000,4854.2574,N,00219.9812,E,1,05,1.7,123.6,M,47.3,M,,0000*5A $GPRMC,185248.000,A,4854.2574,N,00219.9812,E,0.00,296.61,210706,,,A*65 {"class":"TPV","mode":3,"time":"2006-07-21T18:52:48.000Z","ept":0.005,"lat":48.904290000,"lon":2.333020000,"alt":123.600,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.700,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185249.000,4854.2572,N,00219.9810,E,1,05,1.7,123.0,M,47.3,M,,0000*59 $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","xdop":1.14,"ydop":1.23,"vdop":2.20,"tdop":1.49,"hdop":1.70,"gdop":3.13,"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","mode":3,"time":"2006-07-21T18:52:49.000Z","ept":0.005,"lat":48.904286667,"lon":2.333016667,"alt":123.000,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.600,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185250.000,4854.2571,N,00219.9807,E,1,05,1.7,122.0,M,47.3,M,,0000*55 $GPRMC,185250.000,A,4854.2571,N,00219.9807,E,0.00,296.61,210706,,,A*6D {"class":"TPV","mode":3,"time":"2006-07-21T18:52:50.000Z","ept":0.005,"lat":48.904285000,"lon":2.333011667,"alt":122.000,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-1.000,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185251.000,4854.2570,N,00219.9806,E,1,05,1.7,121.8,M,47.3,M,,0000*5F $GPRMC,185251.000,A,4854.2570,N,00219.9806,E,0.00,296.61,210706,,,A*6C {"class":"TPV","mode":3,"time":"2006-07-21T18:52:51.000Z","ept":0.005,"lat":48.904283333,"lon":2.333010000,"alt":121.800,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.200,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185252.000,4854.2569,N,00219.9804,E,1,05,1.7,121.2,M,47.3,M,,0000*5C $GPRMC,185252.000,A,4854.2569,N,00219.9804,E,0.00,296.61,210706,,,A*65 {"class":"TPV","mode":3,"time":"2006-07-21T18:52:52.000Z","ept":0.005,"lat":48.904281667,"lon":2.333006667,"alt":121.200,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.600,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185253.000,4854.2569,N,00219.9803,E,1,05,1.7,121.1,M,47.3,M,,0000*59 $GPRMC,185253.000,A,4854.2569,N,00219.9803,E,0.00,296.61,210706,,,A*63 {"class":"TPV","mode":3,"time":"2006-07-21T18:52:53.000Z","ept":0.005,"lat":48.904281667,"lon":2.333005000,"alt":121.100,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.100,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185254.000,4854.2565,N,00219.9796,E,1,05,1.7,118.1,M,47.3,M,,0000*5B $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","xdop":1.14,"ydop":1.23,"vdop":2.20,"tdop":1.49,"hdop":1.70,"gdop":3.13,"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","mode":3,"time":"2006-07-21T18:52:54.000Z","ept":0.005,"lat":48.904275000,"lon":2.332993333,"alt":118.100,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-3.000,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185255.000,4854.2562,N,00219.9788,E,1,05,1.7,115.0,M,47.3,M,,0000*5E $GPRMC,185255.000,A,4854.2562,N,00219.9788,E,0.00,296.61,210706,,,A*62 {"class":"TPV","mode":3,"time":"2006-07-21T18:52:55.000Z","ept":0.005,"lat":48.904270000,"lon":2.332980000,"alt":115.000,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-3.100,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185256.000,4854.2559,N,00219.9783,E,1,05,1.7,113.0,M,47.3,M,,0000*58 $GPRMC,185256.000,A,4854.2559,N,00219.9783,E,0.00,296.61,210706,,,A*62 {"class":"TPV","mode":3,"time":"2006-07-21T18:52:56.000Z","ept":0.005,"lat":48.904265000,"lon":2.332971667,"alt":113.000,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-2.000,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185257.000,4854.2556,N,00219.9777,E,1,05,1.7,110.4,M,47.3,M,,0000*5A $GPRMC,185257.000,A,4854.2556,N,00219.9777,E,0.00,296.61,210706,,,A*67 {"class":"TPV","mode":3,"time":"2006-07-21T18:52:57.000Z","ept":0.005,"lat":48.904260000,"lon":2.332961667,"alt":110.400,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-2.600,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185258.000,4854.2554,N,00219.9772,E,1,05,1.7,108.4,M,47.3,M,,0000*5B $GPRMC,185258.000,A,4854.2554,N,00219.9772,E,0.00,296.61,210706,,,A*6F {"class":"TPV","mode":3,"time":"2006-07-21T18:52:58.000Z","ept":0.005,"lat":48.904256667,"lon":2.332953333,"alt":108.400,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-2.000,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185259.000,4854.2550,N,00219.9764,E,1,05,1.7,105.3,M,47.3,M,,0000*53 $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","xdop":1.14,"ydop":1.23,"vdop":2.20,"tdop":1.49,"hdop":1.70,"gdop":3.13,"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","mode":3,"time":"2006-07-21T18:52:59.000Z","ept":0.005,"lat":48.904250000,"lon":2.332940000,"alt":105.300,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-3.100,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185300.000,4854.2547,N,00219.9759,E,1,05,1.7,103.6,M,47.3,M,,0000*55 $GPRMC,185300.000,A,4854.2547,N,00219.9759,E,0.00,296.61,210706,,,A*68 {"class":"TPV","mode":3,"time":"2006-07-21T18:53:00.000Z","ept":0.005,"lat":48.904245000,"lon":2.332931667,"alt":103.600,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-1.700,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185301.000,4854.2545,N,00219.9754,E,1,05,1.7,101.5,M,47.3,M,,0000*5A $GPRMC,185301.000,A,4854.2545,N,00219.9754,E,0.00,296.61,210706,,,A*66 {"class":"TPV","mode":3,"time":"2006-07-21T18:53:01.000Z","ept":0.005,"lat":48.904241667,"lon":2.332923333,"alt":101.500,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-2.100,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185302.000,4854.2543,N,00219.9751,E,1,05,1.7,100.1,M,47.3,M,,0000*5F $GPRMC,185302.000,A,4854.2543,N,00219.9751,E,0.00,296.61,210706,,,A*66 {"class":"TPV","mode":3,"time":"2006-07-21T18:53:02.000Z","ept":0.005,"lat":48.904238333,"lon":2.332918333,"alt":100.100,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-1.400,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 $GPGGA,185303.000,4854.2543,N,00219.9750,E,1,05,1.7,99.5,M,47.3,M,,0000*6A $GPRMC,185303.000,A,4854.2543,N,00219.9750,E,0.00,296.61,210706,,,A*66 {"class":"TPV","mode":3,"time":"2006-07-21T18:53:03.000Z","ept":0.005,"lat":48.904238333,"lon":2.332916667,"alt":99.500,"epx":17.084,"epy":18.510,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.600,"eps":37.02,"epc":101.20} $GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07 gpsd-3.15/test/daemon/gr601-w.log0000664000175000017500000001103712467336022014604 0ustar esresr# Name: Navisys GR601-W # Chipset: UBLOX 6H # Submitter: Eric S. Raymond # Date: 2013-10-24 # Location: Malvern PA, 40N 75W $GPGSV,3,2,11,09,27,201,18,11,25,054,14,17,55,292,28,20,30,116,15*7B $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,26*44 $GPGLL,4002.10504,N,07531.20566,W,143251.00,A,A*7A $GPRMC,143252.00,A,4002.10513,N,07531.20562,W,0.016,,241013,,,A*60 $GPVTG,,T,,M,0.016,N,0.030,K,A*27 $GPGGA,143252.00,4002.10513,N,07531.20562,W,1,07,1.72,183.8,M,-34.4,M,,*61 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,13,07,06,177,,08,31,196,19*79 $GPGSV,3,2,11,09,27,201,17,11,25,054,14,17,55,292,28,20,30,116,14*75 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 $GPGLL,4002.10513,N,07531.20562,W,143252.00,A,A*7B $GPRMC,143253.00,A,4002.10554,N,07531.20565,W,0.285,,241013,,,A*6D $GPVTG,,T,,M,0.285,N,0.528,K,A*23 $GPGGA,143253.00,4002.10554,N,07531.20565,W,1,07,1.72,183.8,M,-34.4,M,,*64 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,13,07,06,177,,08,31,196,19*79 $GPGSV,3,2,11,09,27,201,17,11,25,054,14,17,55,292,28,20,30,116,14*75 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 $GPGLL,4002.10554,N,07531.20565,W,143253.00,A,A*7E $GPRMC,143254.00,A,4002.10571,N,07531.20555,W,0.420,,241013,,,A*67 $GPVTG,,T,,M,0.420,N,0.778,K,A*2D $GPGGA,143254.00,4002.10571,N,07531.20555,W,1,07,1.72,183.8,M,-34.4,M,,*67 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,18*7F $GPGSV,3,2,11,09,27,201,18,11,25,054,12,17,55,292,28,20,30,116,14*7C $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 $GPGLL,4002.10571,N,07531.20555,W,143254.00,A,A*7D $GPRMC,143255.00,A,4002.10556,N,07531.20541,W,0.260,,241013,,,A*64 $GPVTG,,T,,M,0.260,N,0.482,K,A*29 $GPGGA,143255.00,4002.10556,N,07531.20541,W,1,07,1.72,183.8,M,-34.4,M,,*66 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,18*7F $GPGSV,3,2,11,09,27,201,18,11,25,054,12,17,55,292,27,20,30,116,14*73 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 $GPGLL,4002.10556,N,07531.20541,W,143255.00,A,A*7C $GPRMC,143256.00,A,4002.10529,N,07531.20534,W,0.034,,241013,,,A*6E $GPVTG,,T,,M,0.034,N,0.062,K,A*20 $GPGGA,143256.00,4002.10529,N,07531.20534,W,1,07,1.72,183.7,M,-34.4,M,,*60 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,18*7F $GPGSV,3,2,11,09,27,201,18,11,25,054,14,17,55,292,28,20,30,116,13*7D $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 $GPGLL,4002.10529,N,07531.20534,W,143256.00,A,A*75 $GPRMC,143257.00,A,4002.10525,N,07531.20517,W,0.063,,241013,,,A*60 $GPVTG,,T,,M,0.063,N,0.116,K,A*20 $GPGGA,143257.00,4002.10525,N,07531.20517,W,1,07,1.72,183.6,M,-34.4,M,,*6D $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,17*70 $GPGSV,3,2,11,09,27,201,18,11,25,054,14,17,55,292,27,20,30,116,12*73 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 $GPGLL,4002.10525,N,07531.20517,W,143257.00,A,A*79 $GPRMC,143258.00,A,4002.10528,N,07531.20504,W,0.164,,241013,,,A*66 $GPVTG,,T,,M,0.164,N,0.304,K,A*27 $GPGGA,143258.00,4002.10528,N,07531.20504,W,1,07,1.72,183.5,M,-34.4,M,,*6E $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,19*7E $GPGSV,3,2,11,09,27,201,18,11,25,054,13,17,55,292,27,20,30,116,10*76 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,26*44 $GPGLL,4002.10528,N,07531.20504,W,143258.00,A,A*79 $GPRMC,143259.00,A,4002.10536,N,07531.20515,W,0.237,,241013,,,A*6D $GPVTG,,T,,M,0.237,N,0.440,K,A*25 $GPGGA,143259.00,4002.10536,N,07531.20515,W,1,07,1.72,183.4,M,-34.4,M,,*61 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.38*0D $GPGSV,3,1,11,01,48,051,27,04,20,215,13,07,06,177,,08,31,196,19*79 $GPGSV,3,2,11,09,27,201,18,11,25,054,13,17,55,292,27,20,30,116,13*75 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,26*44 $GPGLL,4002.10536,N,07531.20515,W,143259.00,A,A*77 $GPRMC,143300.00,A,4002.10504,N,07531.20524,W,0.188,,241013,,,A*64 $GPVTG,,T,,M,0.188,N,0.348,K,A*2D $GPGGA,143300.00,4002.10504,N,07531.20524,W,1,07,1.72,183.3,M,-34.4,M,,*68 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.38*0D $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,19*7E $GPGSV,3,2,11,09,27,201,18,11,25,054,13,17,55,292,27,20,30,116,13*75 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,26*44 $GPGLL,4002.10504,N,07531.20524,W,143300.00,A,A*79 gpsd-3.15/test/daemon/gr601-w.log.chk0000664000175000017500000003047512467340617015364 0ustar esresr$GPGSV,3,2,11,09,27,201,18,11,25,054,14,17,55,292,28,20,30,116,15*7B $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,26*44 {"class":"SKY","satellites":[{"PRN":9,"el":27,"az":201,"ss":18,"used":false},{"PRN":11,"el":25,"az":54,"ss":14,"used":false},{"PRN":17,"el":55,"az":292,"ss":28,"used":false},{"PRN":20,"el":30,"az":116,"ss":15,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":false},{"PRN":32,"el":23,"az":78,"ss":26,"used":false}]} $GPGLL,4002.10504,N,07531.20566,W,143251.00,A,A*7A {"class":"TPV","mode":2,"lat":40.035084000,"lon":-75.520094333} $GPRMC,143252.00,A,4002.10513,N,07531.20562,W,0.016,,241013,,,A*60 $GPVTG,,T,,M,0.016,N,0.030,K,A*27 $GPGGA,143252.00,4002.10513,N,07531.20562,W,1,07,1.72,183.8,M,-34.4,M,,*61 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,13,07,06,177,,08,31,196,19*79 $GPGSV,3,2,11,09,27,201,17,11,25,054,14,17,55,292,28,20,30,116,14*75 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 {"class":"SKY","xdop":1.23,"ydop":1.18,"vdop":2.39,"tdop":1.69,"hdop":1.72,"gdop":3.39,"pdop":2.94,"satellites":[{"PRN":1,"el":48,"az":51,"ss":27,"used":true},{"PRN":4,"el":20,"az":215,"ss":13,"used":false},{"PRN":7,"el":6,"az":177,"ss":0,"used":false},{"PRN":8,"el":31,"az":196,"ss":19,"used":true},{"PRN":9,"el":27,"az":201,"ss":17,"used":true},{"PRN":11,"el":25,"az":54,"ss":14,"used":true},{"PRN":17,"el":55,"az":292,"ss":28,"used":true},{"PRN":20,"el":30,"az":116,"ss":14,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":true},{"PRN":32,"el":23,"az":78,"ss":27,"used":true}]} $GPGLL,4002.10513,N,07531.20562,W,143252.00,A,A*7B {"class":"TPV","mode":3,"time":"2013-10-24T14:32:52.000Z","ept":0.005,"lat":40.035085500,"lon":-75.520093667,"alt":183.800,"epx":18.521,"epy":17.648,"epv":54.970,"track":0.0000,"speed":0.008,"climb":0.000} $GPRMC,143253.00,A,4002.10554,N,07531.20565,W,0.285,,241013,,,A*6D $GPVTG,,T,,M,0.285,N,0.528,K,A*23 $GPGGA,143253.00,4002.10554,N,07531.20565,W,1,07,1.72,183.8,M,-34.4,M,,*64 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,13,07,06,177,,08,31,196,19*79 $GPGSV,3,2,11,09,27,201,17,11,25,054,14,17,55,292,28,20,30,116,14*75 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 {"class":"SKY","xdop":1.23,"ydop":1.18,"vdop":2.39,"tdop":1.69,"hdop":1.72,"gdop":3.39,"pdop":2.94,"satellites":[{"PRN":1,"el":48,"az":51,"ss":27,"used":true},{"PRN":4,"el":20,"az":215,"ss":13,"used":false},{"PRN":7,"el":6,"az":177,"ss":0,"used":false},{"PRN":8,"el":31,"az":196,"ss":19,"used":true},{"PRN":9,"el":27,"az":201,"ss":17,"used":true},{"PRN":11,"el":25,"az":54,"ss":14,"used":true},{"PRN":17,"el":55,"az":292,"ss":28,"used":true},{"PRN":20,"el":30,"az":116,"ss":14,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":true},{"PRN":32,"el":23,"az":78,"ss":27,"used":true}]} $GPGLL,4002.10554,N,07531.20565,W,143253.00,A,A*7E {"class":"TPV","mode":3,"time":"2013-10-24T14:32:53.000Z","ept":0.005,"lat":40.035092333,"lon":-75.520094167,"alt":183.800,"epx":18.521,"epy":17.648,"epv":54.970,"track":0.0000,"speed":0.147,"climb":0.000,"eps":37.04} $GPRMC,143254.00,A,4002.10571,N,07531.20555,W,0.420,,241013,,,A*67 $GPVTG,,T,,M,0.420,N,0.778,K,A*2D $GPGGA,143254.00,4002.10571,N,07531.20555,W,1,07,1.72,183.8,M,-34.4,M,,*67 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,18*7F $GPGSV,3,2,11,09,27,201,18,11,25,054,12,17,55,292,28,20,30,116,14*7C $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 {"class":"SKY","xdop":1.23,"ydop":1.18,"vdop":2.39,"tdop":1.69,"hdop":1.72,"gdop":3.39,"pdop":2.94,"satellites":[{"PRN":1,"el":48,"az":51,"ss":27,"used":true},{"PRN":4,"el":20,"az":215,"ss":14,"used":false},{"PRN":7,"el":6,"az":177,"ss":0,"used":false},{"PRN":8,"el":31,"az":196,"ss":18,"used":true},{"PRN":9,"el":27,"az":201,"ss":18,"used":true},{"PRN":11,"el":25,"az":54,"ss":12,"used":true},{"PRN":17,"el":55,"az":292,"ss":28,"used":true},{"PRN":20,"el":30,"az":116,"ss":14,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":true},{"PRN":32,"el":23,"az":78,"ss":27,"used":true}]} $GPGLL,4002.10571,N,07531.20555,W,143254.00,A,A*7D {"class":"TPV","mode":3,"time":"2013-10-24T14:32:54.000Z","ept":0.005,"lat":40.035095167,"lon":-75.520092500,"alt":183.800,"epx":18.521,"epy":17.648,"epv":54.970,"track":0.0000,"speed":0.216,"climb":0.000,"eps":37.04} $GPRMC,143255.00,A,4002.10556,N,07531.20541,W,0.260,,241013,,,A*64 $GPVTG,,T,,M,0.260,N,0.482,K,A*29 $GPGGA,143255.00,4002.10556,N,07531.20541,W,1,07,1.72,183.8,M,-34.4,M,,*66 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,18*7F $GPGSV,3,2,11,09,27,201,18,11,25,054,12,17,55,292,27,20,30,116,14*73 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 {"class":"SKY","xdop":1.23,"ydop":1.18,"vdop":2.39,"tdop":1.69,"hdop":1.72,"gdop":3.39,"pdop":2.94,"satellites":[{"PRN":1,"el":48,"az":51,"ss":27,"used":true},{"PRN":4,"el":20,"az":215,"ss":14,"used":false},{"PRN":7,"el":6,"az":177,"ss":0,"used":false},{"PRN":8,"el":31,"az":196,"ss":18,"used":true},{"PRN":9,"el":27,"az":201,"ss":18,"used":true},{"PRN":11,"el":25,"az":54,"ss":12,"used":true},{"PRN":17,"el":55,"az":292,"ss":27,"used":true},{"PRN":20,"el":30,"az":116,"ss":14,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":true},{"PRN":32,"el":23,"az":78,"ss":27,"used":true}]} $GPGLL,4002.10556,N,07531.20541,W,143255.00,A,A*7C {"class":"TPV","mode":3,"time":"2013-10-24T14:32:55.000Z","ept":0.005,"lat":40.035092667,"lon":-75.520090167,"alt":183.800,"epx":18.521,"epy":17.648,"epv":54.970,"track":0.0000,"speed":0.134,"climb":0.000,"eps":37.04} $GPRMC,143256.00,A,4002.10529,N,07531.20534,W,0.034,,241013,,,A*6E $GPVTG,,T,,M,0.034,N,0.062,K,A*20 $GPGGA,143256.00,4002.10529,N,07531.20534,W,1,07,1.72,183.7,M,-34.4,M,,*60 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,18*7F $GPGSV,3,2,11,09,27,201,18,11,25,054,14,17,55,292,28,20,30,116,13*7D $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 {"class":"SKY","xdop":1.23,"ydop":1.18,"vdop":2.39,"tdop":1.69,"hdop":1.72,"gdop":3.39,"pdop":2.94,"satellites":[{"PRN":1,"el":48,"az":51,"ss":27,"used":true},{"PRN":4,"el":20,"az":215,"ss":14,"used":false},{"PRN":7,"el":6,"az":177,"ss":0,"used":false},{"PRN":8,"el":31,"az":196,"ss":18,"used":true},{"PRN":9,"el":27,"az":201,"ss":18,"used":true},{"PRN":11,"el":25,"az":54,"ss":14,"used":true},{"PRN":17,"el":55,"az":292,"ss":28,"used":true},{"PRN":20,"el":30,"az":116,"ss":13,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":true},{"PRN":32,"el":23,"az":78,"ss":27,"used":true}]} $GPGLL,4002.10529,N,07531.20534,W,143256.00,A,A*75 {"class":"TPV","mode":3,"time":"2013-10-24T14:32:56.000Z","ept":0.005,"lat":40.035088167,"lon":-75.520089000,"alt":183.700,"epx":18.521,"epy":17.648,"epv":54.970,"track":0.0000,"speed":0.017,"climb":0.000,"eps":37.04} $GPRMC,143257.00,A,4002.10525,N,07531.20517,W,0.063,,241013,,,A*60 $GPVTG,,T,,M,0.063,N,0.116,K,A*20 $GPGGA,143257.00,4002.10525,N,07531.20517,W,1,07,1.72,183.6,M,-34.4,M,,*6D $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,17*70 $GPGSV,3,2,11,09,27,201,18,11,25,054,14,17,55,292,27,20,30,116,12*73 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,27*45 {"class":"SKY","xdop":1.23,"ydop":1.18,"vdop":2.39,"tdop":1.69,"hdop":1.72,"gdop":3.39,"pdop":2.94,"satellites":[{"PRN":1,"el":48,"az":51,"ss":27,"used":true},{"PRN":4,"el":20,"az":215,"ss":14,"used":false},{"PRN":7,"el":6,"az":177,"ss":0,"used":false},{"PRN":8,"el":31,"az":196,"ss":17,"used":true},{"PRN":9,"el":27,"az":201,"ss":18,"used":true},{"PRN":11,"el":25,"az":54,"ss":14,"used":true},{"PRN":17,"el":55,"az":292,"ss":27,"used":true},{"PRN":20,"el":30,"az":116,"ss":12,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":true},{"PRN":32,"el":23,"az":78,"ss":27,"used":true}]} $GPGLL,4002.10525,N,07531.20517,W,143257.00,A,A*79 {"class":"TPV","mode":3,"time":"2013-10-24T14:32:57.000Z","ept":0.005,"lat":40.035087500,"lon":-75.520086167,"alt":183.600,"epx":18.521,"epy":17.648,"epv":54.970,"track":0.0000,"speed":0.032,"climb":0.000,"eps":37.04} $GPRMC,143258.00,A,4002.10528,N,07531.20504,W,0.164,,241013,,,A*66 $GPVTG,,T,,M,0.164,N,0.304,K,A*27 $GPGGA,143258.00,4002.10528,N,07531.20504,W,1,07,1.72,183.5,M,-34.4,M,,*6E $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.39*0C $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,19*7E $GPGSV,3,2,11,09,27,201,18,11,25,054,13,17,55,292,27,20,30,116,10*76 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,26*44 {"class":"SKY","xdop":1.23,"ydop":1.18,"vdop":2.39,"tdop":1.69,"hdop":1.72,"gdop":3.39,"pdop":2.94,"satellites":[{"PRN":1,"el":48,"az":51,"ss":27,"used":true},{"PRN":4,"el":20,"az":215,"ss":14,"used":false},{"PRN":7,"el":6,"az":177,"ss":0,"used":false},{"PRN":8,"el":31,"az":196,"ss":19,"used":true},{"PRN":9,"el":27,"az":201,"ss":18,"used":true},{"PRN":11,"el":25,"az":54,"ss":13,"used":true},{"PRN":17,"el":55,"az":292,"ss":27,"used":true},{"PRN":20,"el":30,"az":116,"ss":10,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":true},{"PRN":32,"el":23,"az":78,"ss":26,"used":true}]} $GPGLL,4002.10528,N,07531.20504,W,143258.00,A,A*79 {"class":"TPV","mode":3,"time":"2013-10-24T14:32:58.000Z","ept":0.005,"lat":40.035088000,"lon":-75.520084000,"alt":183.500,"epx":18.521,"epy":17.648,"epv":54.970,"track":0.0000,"speed":0.084,"climb":0.000,"eps":37.04} $GPRMC,143259.00,A,4002.10536,N,07531.20515,W,0.237,,241013,,,A*6D $GPVTG,,T,,M,0.237,N,0.440,K,A*25 $GPGGA,143259.00,4002.10536,N,07531.20515,W,1,07,1.72,183.4,M,-34.4,M,,*61 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.38*0D $GPGSV,3,1,11,01,48,051,27,04,20,215,13,07,06,177,,08,31,196,19*79 $GPGSV,3,2,11,09,27,201,18,11,25,054,13,17,55,292,27,20,30,116,13*75 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,26*44 {"class":"SKY","xdop":1.23,"ydop":1.18,"vdop":2.38,"tdop":1.69,"hdop":1.72,"gdop":3.39,"pdop":2.94,"satellites":[{"PRN":1,"el":48,"az":51,"ss":27,"used":true},{"PRN":4,"el":20,"az":215,"ss":13,"used":false},{"PRN":7,"el":6,"az":177,"ss":0,"used":false},{"PRN":8,"el":31,"az":196,"ss":19,"used":true},{"PRN":9,"el":27,"az":201,"ss":18,"used":true},{"PRN":11,"el":25,"az":54,"ss":13,"used":true},{"PRN":17,"el":55,"az":292,"ss":27,"used":true},{"PRN":20,"el":30,"az":116,"ss":13,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":true},{"PRN":32,"el":23,"az":78,"ss":26,"used":true}]} $GPGLL,4002.10536,N,07531.20515,W,143259.00,A,A*77 {"class":"TPV","mode":3,"time":"2013-10-24T14:32:59.000Z","ept":0.005,"lat":40.035089333,"lon":-75.520085833,"alt":183.400,"epx":18.521,"epy":17.648,"epv":54.970,"track":0.0000,"speed":0.122,"climb":0.000,"eps":37.04} $GPRMC,143300.00,A,4002.10504,N,07531.20524,W,0.188,,241013,,,A*64 $GPVTG,,T,,M,0.188,N,0.348,K,A*2D $GPGGA,143300.00,4002.10504,N,07531.20524,W,1,07,1.72,183.3,M,-34.4,M,,*68 $GPGSA,A,3,28,17,01,08,09,11,32,,,,,,2.94,1.72,2.38*0D $GPGSV,3,1,11,01,48,051,27,04,20,215,14,07,06,177,,08,31,196,19*7E $GPGSV,3,2,11,09,27,201,18,11,25,054,13,17,55,292,27,20,30,116,13*75 $GPGSV,3,3,11,24,05,327,,28,84,072,33,32,23,078,26*44 {"class":"SKY","xdop":1.23,"ydop":1.18,"vdop":2.38,"tdop":1.69,"hdop":1.72,"gdop":3.39,"pdop":2.94,"satellites":[{"PRN":1,"el":48,"az":51,"ss":27,"used":true},{"PRN":4,"el":20,"az":215,"ss":14,"used":false},{"PRN":7,"el":6,"az":177,"ss":0,"used":false},{"PRN":8,"el":31,"az":196,"ss":19,"used":true},{"PRN":9,"el":27,"az":201,"ss":18,"used":true},{"PRN":11,"el":25,"az":54,"ss":13,"used":true},{"PRN":17,"el":55,"az":292,"ss":27,"used":true},{"PRN":20,"el":30,"az":116,"ss":13,"used":false},{"PRN":24,"el":5,"az":327,"ss":0,"used":false},{"PRN":28,"el":84,"az":72,"ss":33,"used":true},{"PRN":32,"el":23,"az":78,"ss":26,"used":true}]} $GPGLL,4002.10504,N,07531.20524,W,143300.00,A,A*79 {"class":"TPV","mode":3,"time":"2013-10-24T14:33:00.000Z","ept":0.005,"lat":40.035084000,"lon":-75.520087333,"alt":183.300,"epx":18.521,"epy":17.648,"epv":54.740,"track":0.0000,"speed":0.097,"climb":0.000,"eps":37.04} gpsd-3.15/test/daemon/haicom-305N.log0000664000175000017500000004677112466450675015413 0ustar esresr# Name: Haicom HI-305N # Chipset: SiRF-II # Date: 2007-04-08 # Location: 153E 27S # Submitted by: "David Findlay" # Description: Starts stationary, then moving 5m due west, 10m due south, then reversing course # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGSV,3,3,12,24,58,220,,26,17,053,,29,20,063,,30,60,311,44*7F $GPRMC,095255.810,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*6E $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095257.809,2712.6404,S,15303.1201,E,0,00,00.0,4.0,M,42.2,M,,*7B $GPRMC,095257.809,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*64 $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095258.809,2712.6404,S,15303.1201,E,0,00,00.0,4.0,M,42.2,M,,*74 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 $GPGSV,3,1,12,2,15,123,,5,45,347,45,6,58,198,,7,45,212,*77 $GPGSV,3,2,12,10,44,132,,12,39,002,45,18,13,332,,21,33,266,*78 $GPGSV,3,3,12,24,58,220,,26,17,053,,29,20,063,,30,60,311,44*7F $GPRMC,095258.809,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*6B $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095300.809,2712.6404,S,15303.1201,E,0,00,00.0,4.0,M,42.2,M,,*78 $GPRMC,095300.809,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*67 $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095301.809,2712.6404,S,15303.1201,E,0,00,00.0,4.0,M,42.2,M,,*79 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 $GPGSV,3,1,12,2,15,123,,5,45,347,45,6,58,198,,7,45,212,*77 $GPGSV,3,2,12,10,44,132,,12,39,002,45,18,13,332,,21,33,266,*78 $GPGSV,3,3,12,24,58,220,,26,17,053,,29,20,063,,30,60,311,44*7F $GPRMC,095301.809,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*66 $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095303.808,2712.6404,S,15303.1201,E,0,00,17.0,4.0,M,42.2,M,,*7C $GPRMC,095303.808,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*65 $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095304.802,2712.6520,S,15303.1397,E,1,00,17.0,3.0,M,42.2,M,,*7E $GPGSA,A,2,05,12,30,,,,,,,,,,17.0,17.0,0.0*36 $GPGSV,3,1,12,2,15,123,,5,45,347,44,6,58,198,,7,45,212,*76 $GPGSV,3,2,12,10,44,132,,12,39,002,43,18,13,332,34,21,33,266,*79 $GPGSV,3,3,12,24,58,220,,26,17,053,,29,20,063,,30,60,311,45*7E $GPRMC,095304.802,A,2712.6520,S,15303.1397,E,0.00,133.96,080407,,,A*78 $GPVTG,133.96,T,,,0.00,N,0.00,K,A*7E $GPGGA,095305.802,2712.6547,S,15303.1350,E,1,04,21.1,3.0,M,42.2,M,,*75 $GPRMC,095305.802,A,2712.6547,S,15303.1350,E,1.93,133.96,080407,,,A*78 $GPVTG,133.96,T,,,1.93,N,3.57,K,A*74 $GPGGA,095306.802,2712.6506,S,15303.1298,E,1,04,21.1,3.0,M,42.2,M,,*76 $GPRMC,095306.802,A,2712.6506,S,15303.1298,E,0.00,279.46,080407,,,A*70 $GPVTG,279.46,T,,,0.00,N,0.00,K,A*7E $GPGGA,095307.801,2712.6486,S,15303.1293,E,1,04,21.1,3.0,M,42.2,M,,*76 $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 $GPRMC,095307.801,A,2712.6486,S,15303.1293,E,1.73,279.46,080407,,,A*75 $GPVTG,279.46,T,,,1.73,N,3.20,K,A*7A $GPGGA,095308.801,2712.6469,S,15303.1278,E,1,04,21.1,3.0,M,42.2,M,,*7D $GPRMC,095308.801,A,2712.6469,S,15303.1278,E,2.40,335.10,080407,,,A*77 $GPVTG,335.10,T,,,2.40,N,4.45,K,A*77 $GPGGA,095309.801,2712.6444,S,15303.1229,E,1,05,07.5,3.0,M,42.2,M,,*76 $GPRMC,095309.801,A,2712.6444,S,15303.1229,E,5.19,299.36,080407,,,A*75 $GPVTG,299.36,T,,,5.19,N,9.60,K,A*75 $GPGGA,095310.801,2712.6428,S,15303.1203,E,1,05,07.5,3.0,M,42.2,M,,*7C $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 $GPRMC,095310.801,A,2712.6428,S,15303.1203,E,0.00,307.41,080407,,,A*74 $GPVTG,307.41,T,,,0.00,N,0.00,K,A*71 $GPGGA,095311.801,2712.6419,S,15303.1214,E,1,05,07.5,4.1,M,42.2,M,,*7F $GPRMC,095311.801,A,2712.6419,S,15303.1214,E,2.16,307.41,080407,,,A*74 $GPVTG,307.41,T,,,2.16,N,4.00,K,A*70 $GPGGA,095312.800,2712.6400,S,15303.1170,E,1,05,07.5,4.5,M,42.2,M,,*70 $GPRMC,095312.800,A,2712.6400,S,15303.1170,E,0.00,312.27,080407,,,A*7E $GPVTG,312.27,T,,,0.00,N,0.00,K,A*75 $GPGGA,095313.800,2712.6402,S,15303.1209,E,1,05,07.5,8.6,M,42.2,M,,*71 $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 $GPRMC,095313.800,A,2712.6402,S,15303.1209,E,3.47,312.27,080407,,,A*70 $GPVTG,312.27,T,,,3.47,N,6.42,K,A*75 $GPGGA,095314.800,2712.6396,S,15303.1200,E,1,05,07.5,10.1,M,42.2,M,,*4B $GPRMC,095314.800,A,2712.6396,S,15303.1200,E,2.01,312.27,080407,,,A*77 $GPVTG,312.27,T,,,2.01,N,3.72,K,A*70 $GPGGA,095315.800,2712.6403,S,15303.1229,E,1,05,07.5,13.7,M,42.2,M,,*4F $GPRMC,095315.800,A,2712.6403,S,15303.1229,E,3.56,92.94,080407,,,A*46 $GPVTG,92.94,T,,,3.56,N,6.58,K,A*4D $GPGGA,095316.799,2712.6400,S,15303.1217,E,1,05,07.5,13.8,M,42.2,M,,*42 $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 $GPRMC,095316.799,A,2712.6400,S,15303.1217,E,1.83,92.94,080407,,,A*4E $GPVTG,92.94,T,,,1.83,N,3.39,K,A*45 $GPGGA,095317.799,2712.6397,S,15303.1210,E,1,05,07.5,13.1,M,42.2,M,,*44 $GPRMC,095317.799,A,2712.6397,S,15303.1210,E,1.78,92.94,080407,,,A*45 $GPVTG,92.94,T,,,1.78,N,3.30,K,A*48 $GPGGA,095318.799,2712.6409,S,15303.1239,E,1,05,07.5,18.1,M,42.2,M,,*4B $GPRMC,095318.799,A,2712.6409,S,15303.1239,E,2.69,129.81,080407,,,A*77 $GPVTG,129.81,T,,,2.69,N,4.97,K,A*74 $GPGGA,095319.799,2712.6420,S,15303.1303,E,1,05,07.5,22.8,M,42.2,M,,*49 $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 $GPRMC,095319.799,A,2712.6420,S,15303.1303,E,5.09,100.78,080407,,,A*79 $GPVTG,100.78,T,,,5.09,N,9.43,K,A*7C $GPGGA,095320.799,2712.6420,S,15303.1290,E,1,05,07.5,19.5,M,42.2,M,,*4D $GPRMC,095320.799,A,2712.6420,S,15303.1290,E,1.55,100.78,080407,,,A*75 $GPVTG,100.78,T,,,1.55,N,2.87,K,A*72 $GPGGA,095321.798,2712.6419,S,15303.1285,E,1,05,07.5,18.2,M,42.2,M,,*45 $GPRMC,095321.798,A,2712.6419,S,15303.1285,E,1.15,100.78,080407,,,A*7F $GPVTG,100.78,T,,,1.15,N,2.13,K,A*7B $GPGGA,095322.798,2712.6419,S,15303.1281,E,1,05,07.5,17.3,M,42.2,M,,*4C $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 $GPRMC,095322.798,A,2712.6419,S,15303.1281,E,0.99,100.78,080407,,,A*7D $GPVTG,100.78,T,,,0.99,N,1.84,K,A*73 $GPGGA,095323.798,2712.6418,S,15303.1278,E,1,05,07.5,17.7,M,42.2,M,,*4E $GPRMC,095323.798,A,2712.6418,S,15303.1278,E,0.00,100.78,080407,,,A*7B $GPVTG,100.78,T,,,0.00,N,0.00,K,A*7E $GPGGA,095324.798,2712.6417,S,15303.1275,E,1,05,07.5,18.0,M,42.2,M,,*43 $GPRMC,095324.798,A,2712.6417,S,15303.1275,E,0.00,100.78,080407,,,A*7E $GPVTG,100.78,T,,,0.00,N,0.00,K,A*7E $GPGGA,095325.797,2712.6416,S,15303.1269,E,1,05,07.5,17.7,M,42.2,M,,*49 $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 $GPRMC,095325.797,A,2712.6416,S,15303.1269,E,0.00,100.78,080407,,,A*7C $GPVTG,100.78,T,,,0.00,N,0.00,K,A*7E $GPGGA,095326.797,2712.6415,S,15303.1253,E,1,05,07.5,15.0,M,42.2,M,,*45 $GPRMC,095326.797,A,2712.6415,S,15303.1253,E,1.10,100.78,080407,,,A*75 $GPVTG,100.78,T,,,1.10,N,2.03,K,A*7F $GPGGA,095327.797,2712.6414,S,15303.1244,E,1,05,07.5,14.2,M,42.2,M,,*40 $GPRMC,095327.797,A,2712.6414,S,15303.1244,E,1.51,100.78,080407,,,A*76 $GPVTG,100.78,T,,,1.51,N,2.80,K,A*71 $GPGGA,095328.797,2712.6413,S,15303.1235,E,1,05,07.5,13.4,M,42.2,M,,*4F $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 $GPRMC,095328.797,A,2712.6413,S,15303.1235,E,1.55,276.34,080407,,,A*76 $GPVTG,276.34,T,,,1.55,N,2.86,K,A*79 $GPGGA,095329.797,2712.6413,S,15303.1226,E,1,05,07.5,12.7,M,42.2,M,,*4E $GPRMC,095329.797,A,2712.6413,S,15303.1226,E,1.67,276.34,080407,,,A*74 $GPVTG,276.34,T,,,1.67,N,3.09,K,A*7E $GPGGA,095330.796,2712.6413,S,15303.1218,E,1,05,07.5,12.4,M,42.2,M,,*49 $GPRMC,095330.796,A,2712.6413,S,15303.1218,E,1.72,276.34,080407,,,A*74 $GPVTG,276.34,T,,,1.72,N,3.19,K,A*7B $GPGGA,095331.796,2712.6414,S,15303.1212,E,1,05,07.5,12.3,M,42.2,M,,*42 $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 $GPRMC,095331.796,A,2712.6414,S,15303.1212,E,1.79,276.34,080407,,,A*73 $GPVTG,276.34,T,,,1.79,N,3.32,K,A*79 $GPGGA,095333.796,2712.6422,S,15303.1205,E,1,05,07.5,11.9,M,42.2,M,,*4A $GPRMC,095333.796,A,2712.6422,S,15303.1205,E,1.87,276.34,080407,,,A*73 $GPVTG,276.34,T,,,1.87,N,3.46,K,A*7B $GPGGA,095334.796,2712.6427,S,15303.1202,E,1,05,07.5,11.6,M,42.2,M,,*40 $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 $GPRMC,095334.796,A,2712.6427,S,15303.1202,E,2.01,276.34,080407,,,A*7B $GPVTG,276.34,T,,,2.01,N,3.72,K,A*71 $GPGGA,095336.795,2712.6439,S,15303.1195,E,1,04,10.4,11.6,M,42.2,M,,*45 $GPRMC,095336.795,A,2712.6439,S,15303.1195,E,2.37,209.25,080407,,,A*75 $GPVTG,209.25,T,,,2.37,N,4.38,K,A*75 $GPGGA,095337.795,2712.6444,S,15303.1189,E,1,06,02.3,11.3,M,42.2,M,,*40 $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 $GPRMC,095337.795,A,2712.6444,S,15303.1189,E,2.31,209.45,080407,,,A*73 $GPVTG,209.45,T,,,2.31,N,4.28,K,A*74 $GPGGA,095338.795,2712.6450,S,15303.1192,E,1,06,02.3,12.4,M,42.2,M,,*44 $GPRMC,095338.795,A,2712.6450,S,15303.1192,E,2.24,203.09,080407,,,A*75 $GPVTG,203.09,T,,,2.24,N,4.14,K,A*7D $GPGGA,095339.794,2712.6456,S,15303.1185,E,1,06,04.1,11.6,M,42.2,M,,*41 $GPRMC,095339.794,A,2712.6456,S,15303.1185,E,2.28,200.03,080407,,,A*70 $GPVTG,200.03,T,,,2.28,N,4.22,K,A*7D $GPGGA,095340.794,2712.6461,S,15303.1180,E,1,07,01.3,10.0,M,42.2,M,,*4F $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 $GPRMC,095340.794,A,2712.6461,S,15303.1180,E,2.23,189.90,080407,,,A*7C $GPVTG,189.90,T,,,2.23,N,4.12,K,A*7D $GPGGA,095341.794,2712.6467,S,15303.1177,E,1,07,01.3,10.0,M,42.2,M,,*40 $GPRMC,095341.794,A,2712.6467,S,15303.1177,E,2.24,191.01,080407,,,A*75 $GPVTG,191.01,T,,,2.24,N,4.15,K,A*7C $GPGGA,095342.794,2712.6472,S,15303.1170,E,1,07,01.3,9.1,M,42.2,M,,*79 $GPRMC,095342.794,A,2712.6472,S,15303.1170,E,2.28,193.30,080407,,,A*79 $GPVTG,193.30,T,,,2.28,N,4.22,K,A*74 $GPGGA,095343.794,2712.6478,S,15303.1166,E,1,07,01.3,8.1,M,42.2,M,,*74 $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 $GPRMC,095343.794,A,2712.6478,S,15303.1166,E,2.18,187.10,080407,,,A*71 $GPVTG,187.10,T,,,2.18,N,4.03,K,A*73 $GPGGA,095344.793,2712.6483,S,15303.1163,E,1,07,01.3,8.4,M,42.2,M,,*70 $GPRMC,095344.793,A,2712.6483,S,15303.1163,E,2.26,192.88,080407,,,A*78 $GPVTG,192.88,T,,,2.26,N,4.18,K,A*71 $GPGGA,095345.793,2712.6489,S,15303.1158,E,1,07,01.3,7.5,M,42.2,M,,*7D $GPRMC,095345.793,A,2712.6489,S,15303.1158,E,2.26,190.81,080407,,,A*70 $GPVTG,190.81,T,,,2.26,N,4.18,K,A*7A $GPGGA,095346.793,2712.6494,S,15303.1153,E,1,07,01.3,7.5,M,42.2,M,,*79 $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 $GPRMC,095346.793,A,2712.6494,S,15303.1153,E,2.22,194.09,080407,,,A*74 $GPVTG,194.09,T,,,2.22,N,4.11,K,A*73 $GPGGA,095347.793,2712.6500,S,15303.1150,E,1,07,01.3,7.5,M,42.2,M,,*77 $GPRMC,095347.793,A,2712.6500,S,15303.1150,E,2.23,191.68,080407,,,A*79 $GPVTG,191.68,T,,,2.23,N,4.13,K,A*72 $GPGGA,095348.792,2712.6505,S,15303.1148,E,1,07,01.3,7.4,M,42.2,M,,*74 $GPRMC,095348.792,A,2712.6505,S,15303.1148,E,2.11,187.45,080407,,,A*72 $GPVTG,187.45,T,,,2.11,N,3.91,K,A*76 $GPGGA,095349.792,2712.6511,S,15303.1147,E,1,07,01.3,7.3,M,42.2,M,,*78 $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 $GPRMC,095349.792,A,2712.6511,S,15303.1147,E,2.04,188.22,080407,,,A*73 $GPVTG,188.22,T,,,2.04,N,3.78,K,A*7B $GPGGA,095350.792,2712.6515,S,15303.1143,E,1,07,01.3,7.0,M,42.2,M,,*73 $GPRMC,095350.792,A,2712.6515,S,15303.1143,E,1.77,194.81,080407,,,A*78 $GPVTG,194.81,T,,,1.77,N,3.28,K,A*7D $GPGGA,095351.792,2712.6515,S,15303.1138,E,1,07,01.3,6.2,M,42.2,M,,*7D $GPRMC,095351.792,A,2712.6515,S,15303.1138,E,0.98,194.81,080407,,,A*75 $GPVTG,194.81,T,,,0.98,N,1.81,K,A*7C $GPGGA,095352.792,2712.6511,S,15303.1137,E,1,06,02.3,5.8,M,42.2,M,,*7E $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 $GPRMC,095352.792,A,2712.6511,S,15303.1137,E,1.39,350.04,080407,,,A*70 $GPVTG,350.04,T,,,1.39,N,2.57,K,A*79 $GPGGA,095353.791,2712.6505,S,15303.1137,E,1,06,02.3,5.9,M,42.2,M,,*78 $GPRMC,095353.791,A,2712.6505,S,15303.1137,E,1.92,359.88,080407,,,A*7B $GPVTG,359.88,T,,,1.92,N,3.56,K,A*75 $GPGGA,095354.791,2712.6500,S,15303.1137,E,1,07,01.3,5.2,M,42.2,M,,*73 $GPRMC,095354.791,A,2712.6500,S,15303.1137,E,2.00,11.44,080407,,,A*4E $GPVTG,11.44,T,,,2.00,N,3.70,K,A*46 $GPGGA,095355.791,2712.6493,S,15303.1137,E,1,07,01.3,4.7,M,42.2,M,,*7D $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 $GPRMC,095355.791,A,2712.6493,S,15303.1137,E,2.13,16.78,080407,,,A*4E $GPVTG,16.78,T,,,2.13,N,3.95,K,A*47 $GPGGA,095356.791,2712.6487,S,15303.1136,E,1,07,01.3,4.3,M,42.2,M,,*7E $GPRMC,095356.791,A,2712.6487,S,15303.1136,E,2.25,13.51,080407,,,A*42 $GPVTG,13.51,T,,,2.25,N,4.16,K,A*40 $GPGGA,095357.791,2712.6480,S,15303.1135,E,1,07,01.3,4.1,M,42.2,M,,*79 $GPRMC,095357.791,A,2712.6480,S,15303.1135,E,2.30,7.49,080407,,,A*7F $GPVTG,7.49,T,,,2.30,N,4.26,K,A*7B $GPGGA,095358.790,2712.6473,S,15303.1133,E,1,08,01.1,3.9,M,42.2,M,,*7F $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 $GPRMC,095358.790,A,2712.6473,S,15303.1133,E,2.34,6.73,080407,,,A*77 $GPVTG,6.73,T,,,2.34,N,4.32,K,A*72 $GPGGA,095400.790,2712.6459,S,15303.1133,E,1,06,01.8,3.5,M,42.2,M,,*76 $GPRMC,095400.790,A,2712.6459,S,15303.1133,E,2.40,7.80,080407,,,A*7B $GPVTG,7.80,T,,,2.40,N,4.44,K,A*7D $GPGGA,095401.790,2712.6453,S,15303.1133,E,1,08,01.1,3.7,M,42.2,M,,*78 $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 $GPRMC,095401.790,A,2712.6453,S,15303.1133,E,2.36,7.77,080407,,,A*79 $GPVTG,7.77,T,,,2.36,N,4.37,K,A*70 $GPGGA,095403.789,2712.6439,S,15303.1137,E,1,08,01.1,3.5,M,42.2,M,,*78 $GPRMC,095403.789,A,2712.6439,S,15303.1137,E,2.48,15.66,080407,,,A*41 $GPVTG,15.66,T,,,2.48,N,4.59,K,A*42 $GPGGA,095404.789,2712.6432,S,15303.1137,E,1,09,01.1,3.3,M,42.2,M,,*73 $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 $GPRMC,095404.789,A,2712.6432,S,15303.1137,E,2.45,12.39,080407,,,A*4D $GPVTG,12.39,T,,,2.45,N,4.54,K,A*4F $GPGGA,095405.789,2712.6425,S,15303.1138,E,1,09,01.1,3.1,M,42.2,M,,*79 $GPRMC,095405.789,A,2712.6425,S,15303.1138,E,2.55,16.50,080407,,,A*4F $GPVTG,16.50,T,,,2.55,N,4.73,K,A*40 $GPGGA,095406.789,2712.6420,S,15303.1142,E,1,09,01.1,2.7,M,42.2,M,,*75 $GPRMC,095406.789,A,2712.6420,S,15303.1142,E,2.35,31.12,080407,,,A*41 $GPVTG,31.12,T,,,2.35,N,4.35,K,A*47 $GPGGA,095407.788,2712.6415,S,15303.1145,E,1,08,01.7,2.5,M,42.2,M,,*71 $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 $GPRMC,095407.788,A,2712.6415,S,15303.1145,E,2.28,40.30,080407,,,A*4A $GPVTG,40.30,T,,,2.28,N,4.23,K,A*4A $GPGGA,095408.788,2712.6411,S,15303.1151,E,1,09,01.1,2.6,M,42.2,M,,*7B $GPRMC,095408.788,A,2712.6411,S,15303.1151,E,2.35,51.76,080407,,,A*4A $GPVTG,51.76,T,,,2.35,N,4.35,K,A*43 $GPGGA,095409.788,2712.6409,S,15303.1158,E,1,09,01.1,2.6,M,42.2,M,,*7A $GPRMC,095409.788,A,2712.6409,S,15303.1158,E,2.41,68.20,080407,,,A*41 $GPVTG,68.20,T,,,2.41,N,4.47,K,A*4C $GPGGA,095410.788,2712.6407,S,15303.1166,E,1,09,01.1,2.9,M,42.2,M,,*7E $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 $GPRMC,095410.788,A,2712.6407,S,15303.1166,E,2.54,74.38,080407,,,A*4A $GPVTG,74.38,T,,,2.54,N,4.71,K,A*49 $GPGGA,095411.787,2712.6405,S,15303.1173,E,1,09,01.1,2.9,M,42.2,M,,*76 $GPRMC,095411.787,A,2712.6405,S,15303.1173,E,2.34,76.68,080407,,,A*43 $GPVTG,76.68,T,,,2.34,N,4.33,K,A*4E $GPGGA,095412.787,2712.6404,S,15303.1180,E,1,09,01.1,3.0,M,42.2,M,,*70 $GPRMC,095412.787,A,2712.6404,S,15303.1180,E,2.33,77.59,080407,,,A*49 $GPVTG,77.59,T,,,2.33,N,4.32,K,A*4B $GPGGA,095413.787,2712.6403,S,15303.1187,E,1,08,01.1,3.1,M,42.2,M,,*71 $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 $GPRMC,095413.787,A,2712.6403,S,15303.1187,E,2.47,79.51,080407,,,A*4D $GPVTG,79.51,T,,,2.47,N,4.57,K,A*4D $GPGGA,095414.787,2712.6403,S,15303.1194,E,1,09,01.1,3.2,M,42.2,M,,*76 $GPRMC,095414.787,A,2712.6403,S,15303.1194,E,2.20,86.03,080407,,,A*4E $GPVTG,86.03,T,,,2.20,N,4.07,K,A*4E $GPGGA,095415.787,2712.6404,S,15303.1200,E,1,06,01.8,3.5,M,42.2,M,,*7F $GPRMC,095415.787,A,2712.6404,S,15303.1200,E,2.11,96.86,080407,,,A*48 gpsd-3.15/test/daemon/haicom-305N.log.chk0000664000175000017500000015061712467340617016145 0ustar esresr$GPGSV,3,3,12,24,58,220,,26,17,053,,29,20,063,,30,60,311,44*7F {"class":"SKY","satellites":[{"PRN":24,"el":58,"az":220,"ss":0,"used":false},{"PRN":26,"el":17,"az":53,"ss":0,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":44,"used":false}]} $GPRMC,095255.810,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*6E $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095257.809,2712.6404,S,15303.1201,E,0,00,00.0,4.0,M,42.2,M,,*7B $GPRMC,095257.809,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*64 $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095258.809,2712.6404,S,15303.1201,E,0,00,00.0,4.0,M,42.2,M,,*74 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 {"class":"TPV","mode":1} $GPGSV,3,1,12,2,15,123,,5,45,347,45,6,58,198,,7,45,212,*77 $GPGSV,3,2,12,10,44,132,,12,39,002,45,18,13,332,,21,33,266,*78 $GPGSV,3,3,12,24,58,220,,26,17,053,,29,20,063,,30,60,311,44*7F {"class":"SKY","vdop":0.00,"hdop":0.00,"pdop":0.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":false},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":0,"used":false},{"PRN":10,"el":44,"az":132,"ss":0,"used":false},{"PRN":12,"el":39,"az":2,"ss":45,"used":false},{"PRN":18,"el":13,"az":332,"ss":0,"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":53,"ss":0,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":44,"used":false}]} $GPRMC,095258.809,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*6B $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095300.809,2712.6404,S,15303.1201,E,0,00,00.0,4.0,M,42.2,M,,*78 $GPRMC,095300.809,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*67 $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095301.809,2712.6404,S,15303.1201,E,0,00,00.0,4.0,M,42.2,M,,*79 $GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30 {"class":"TPV","mode":1} $GPGSV,3,1,12,2,15,123,,5,45,347,45,6,58,198,,7,45,212,*77 $GPGSV,3,2,12,10,44,132,,12,39,002,45,18,13,332,,21,33,266,*78 $GPGSV,3,3,12,24,58,220,,26,17,053,,29,20,063,,30,60,311,44*7F {"class":"SKY","vdop":0.00,"hdop":0.00,"pdop":0.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":false},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":0,"used":false},{"PRN":10,"el":44,"az":132,"ss":0,"used":false},{"PRN":12,"el":39,"az":2,"ss":45,"used":false},{"PRN":18,"el":13,"az":332,"ss":0,"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":53,"ss":0,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":44,"used":false}]} $GPRMC,095301.809,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*66 $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095303.808,2712.6404,S,15303.1201,E,0,00,17.0,4.0,M,42.2,M,,*7C $GPRMC,095303.808,V,2712.6404,S,15303.1201,E,0.00,0.00,080407,,,A*65 $GPVTG,0.00,T,,,0.00,N,0.00,K,A*70 $GPGGA,095304.802,2712.6520,S,15303.1397,E,1,00,17.0,3.0,M,42.2,M,,*7E {"class":"TPV","mode":3,"lat":-27.210866667,"lon":153.052328333,"alt":3.000,"epv":0.000} $GPGSA,A,2,05,12,30,,,,,,,,,,17.0,17.0,0.0*36 $GPGSV,3,1,12,2,15,123,,5,45,347,44,6,58,198,,7,45,212,*76 $GPGSV,3,2,12,10,44,132,,12,39,002,43,18,13,332,34,21,33,266,*79 $GPGSV,3,3,12,24,58,220,,26,17,053,,29,20,063,,30,60,311,45*7E {"class":"SKY","vdop":0.00,"hdop":17.00,"pdop":17.00,"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":0,"used":false},{"PRN":10,"el":44,"az":132,"ss":0,"used":false},{"PRN":12,"el":39,"az":2,"ss":43,"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":53,"ss":0,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":45,"used":true}]} $GPRMC,095304.802,A,2712.6520,S,15303.1397,E,0.00,133.96,080407,,,A*78 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:04.802Z","ept":0.005,"lat":-27.210866667,"lon":153.052328333,"alt":3.000,"epv":0.000,"track":133.9600,"speed":0.000} $GPVTG,133.96,T,,,0.00,N,0.00,K,A*7E $GPGGA,095305.802,2712.6547,S,15303.1350,E,1,04,21.1,3.0,M,42.2,M,,*75 $GPRMC,095305.802,A,2712.6547,S,15303.1350,E,1.93,133.96,080407,,,A*78 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:05.802Z","ept":0.005,"lat":-27.210911667,"lon":153.052250000,"alt":3.000,"epv":0.000,"track":133.9600,"speed":0.993,"climb":0.000,"epc":0.00} $GPVTG,133.96,T,,,1.93,N,3.57,K,A*74 $GPGGA,095306.802,2712.6506,S,15303.1298,E,1,04,21.1,3.0,M,42.2,M,,*76 $GPRMC,095306.802,A,2712.6506,S,15303.1298,E,0.00,279.46,080407,,,A*70 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:06.802Z","ept":0.005,"lat":-27.210843333,"lon":153.052163333,"alt":3.000,"epv":0.000,"track":279.4600,"speed":0.000,"climb":0.000,"epc":0.00} $GPVTG,279.46,T,,,0.00,N,0.00,K,A*7E $GPGGA,095307.801,2712.6486,S,15303.1293,E,1,04,21.1,3.0,M,42.2,M,,*76 $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","xdop":19.17,"ydop":3.90,"vdop":27.60,"tdop":13.12,"hdop":21.10,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:07.801Z","ept":0.005,"lat":-27.210810000,"lon":153.052155000,"alt":3.000,"epx":287.499,"epy":58.512,"epv":0.000,"track":279.4600,"speed":0.890,"climb":0.000,"epc":0.00} $GPVTG,279.46,T,,,1.73,N,3.20,K,A*7A $GPGGA,095308.801,2712.6469,S,15303.1278,E,1,04,21.1,3.0,M,42.2,M,,*7D $GPRMC,095308.801,A,2712.6469,S,15303.1278,E,2.40,335.10,080407,,,A*77 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:08.801Z","ept":0.005,"lat":-27.210781667,"lon":153.052130000,"alt":3.000,"epx":287.499,"epy":58.512,"epv":634.800,"track":335.1000,"speed":1.235,"climb":0.000,"eps":575.00,"epc":634.80} $GPVTG,335.10,T,,,2.40,N,4.45,K,A*77 $GPGGA,095309.801,2712.6444,S,15303.1229,E,1,05,07.5,3.0,M,42.2,M,,*76 $GPRMC,095309.801,A,2712.6444,S,15303.1229,E,5.19,299.36,080407,,,A*75 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:09.801Z","ept":0.005,"lat":-27.210740000,"lon":153.052048333,"alt":3.000,"epx":287.499,"epy":58.512,"epv":634.800,"track":299.3600,"speed":2.670,"climb":0.000,"eps":575.00,"epc":1269.60} $GPVTG,299.36,T,,,5.19,N,9.60,K,A*75 $GPGGA,095310.801,2712.6428,S,15303.1203,E,1,05,07.5,3.0,M,42.2,M,,*7C $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","xdop":19.17,"ydop":3.90,"vdop":9.00,"tdop":13.12,"hdop":7.50,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:10.801Z","ept":0.005,"lat":-27.210713333,"lon":153.052005000,"alt":3.000,"epx":287.499,"epy":58.512,"epv":634.800,"track":307.4100,"speed":0.000,"climb":0.000,"eps":575.00,"epc":1269.60} $GPVTG,307.41,T,,,0.00,N,0.00,K,A*71 $GPGGA,095311.801,2712.6419,S,15303.1214,E,1,05,07.5,4.1,M,42.2,M,,*7F $GPRMC,095311.801,A,2712.6419,S,15303.1214,E,2.16,307.41,080407,,,A*74 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:11.801Z","ept":0.005,"lat":-27.210698333,"lon":153.052023333,"alt":4.100,"epx":287.499,"epy":58.512,"epv":207.000,"track":307.4100,"speed":1.111,"climb":1.100,"eps":575.00,"epc":841.80} $GPVTG,307.41,T,,,2.16,N,4.00,K,A*70 $GPGGA,095312.800,2712.6400,S,15303.1170,E,1,05,07.5,4.5,M,42.2,M,,*70 $GPRMC,095312.800,A,2712.6400,S,15303.1170,E,0.00,312.27,080407,,,A*7E {"class":"TPV","mode":3,"time":"2007-04-08T09:53:12.800Z","ept":0.005,"lat":-27.210666667,"lon":153.051950000,"alt":4.500,"epx":287.499,"epy":58.512,"epv":207.000,"track":312.2700,"speed":0.000,"climb":0.400,"eps":575.57,"epc":414.41} $GPVTG,312.27,T,,,0.00,N,0.00,K,A*75 $GPGGA,095313.800,2712.6402,S,15303.1209,E,1,05,07.5,8.6,M,42.2,M,,*71 $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","xdop":19.17,"ydop":3.90,"vdop":9.00,"tdop":13.12,"hdop":7.50,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:13.800Z","ept":0.005,"lat":-27.210670000,"lon":153.052015000,"alt":8.600,"epx":287.499,"epy":58.512,"epv":207.000,"track":312.2700,"speed":1.785,"climb":4.100,"eps":575.00,"epc":414.00} $GPVTG,312.27,T,,,3.47,N,6.42,K,A*75 $GPGGA,095314.800,2712.6396,S,15303.1200,E,1,05,07.5,10.1,M,42.2,M,,*4B $GPRMC,095314.800,A,2712.6396,S,15303.1200,E,2.01,312.27,080407,,,A*77 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:14.800Z","ept":0.005,"lat":-27.210660000,"lon":153.052000000,"alt":10.100,"epx":287.499,"epy":58.512,"epv":207.000,"track":312.2700,"speed":1.034,"climb":1.500,"eps":575.00,"epc":414.00} $GPVTG,312.27,T,,,2.01,N,3.72,K,A*70 $GPGGA,095315.800,2712.6403,S,15303.1229,E,1,05,07.5,13.7,M,42.2,M,,*4F $GPRMC,095315.800,A,2712.6403,S,15303.1229,E,3.56,92.94,080407,,,A*46 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:15.800Z","ept":0.005,"lat":-27.210671667,"lon":153.052048333,"alt":13.700,"epx":287.499,"epy":58.512,"epv":207.000,"track":92.9400,"speed":1.831,"climb":3.600,"eps":575.00,"epc":414.00} $GPVTG,92.94,T,,,3.56,N,6.58,K,A*4D $GPGGA,095316.799,2712.6400,S,15303.1217,E,1,05,07.5,13.8,M,42.2,M,,*42 $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","xdop":19.17,"ydop":3.90,"vdop":9.00,"tdop":13.12,"hdop":7.50,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:16.799Z","ept":0.005,"lat":-27.210666667,"lon":153.052028333,"alt":13.800,"epx":287.499,"epy":58.512,"epv":207.000,"track":92.9400,"speed":0.941,"climb":0.100,"eps":575.57,"epc":414.41} $GPVTG,92.94,T,,,1.83,N,3.39,K,A*45 $GPGGA,095317.799,2712.6397,S,15303.1210,E,1,05,07.5,13.1,M,42.2,M,,*44 $GPRMC,095317.799,A,2712.6397,S,15303.1210,E,1.78,92.94,080407,,,A*45 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:17.799Z","ept":0.005,"lat":-27.210661667,"lon":153.052016667,"alt":13.100,"epx":287.499,"epy":58.512,"epv":207.000,"track":92.9400,"speed":0.916,"climb":-0.700,"eps":575.00,"epc":414.00} $GPVTG,92.94,T,,,1.78,N,3.30,K,A*48 $GPGGA,095318.799,2712.6409,S,15303.1239,E,1,05,07.5,18.1,M,42.2,M,,*4B $GPRMC,095318.799,A,2712.6409,S,15303.1239,E,2.69,129.81,080407,,,A*77 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:18.799Z","ept":0.005,"lat":-27.210681667,"lon":153.052065000,"alt":18.100,"epx":287.499,"epy":58.512,"epv":207.000,"track":129.8100,"speed":1.384,"climb":5.000,"eps":575.00,"epc":414.00} $GPVTG,129.81,T,,,2.69,N,4.97,K,A*74 $GPGGA,095319.799,2712.6420,S,15303.1303,E,1,05,07.5,22.8,M,42.2,M,,*49 $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","xdop":19.17,"ydop":3.90,"vdop":9.00,"tdop":13.12,"hdop":7.50,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:19.799Z","ept":0.005,"lat":-27.210700000,"lon":153.052171667,"alt":22.800,"epx":287.499,"epy":58.512,"epv":207.000,"track":100.7800,"speed":2.619,"climb":4.700,"eps":575.00,"epc":414.00} $GPVTG,100.78,T,,,5.09,N,9.43,K,A*7C $GPGGA,095320.799,2712.6420,S,15303.1290,E,1,05,07.5,19.5,M,42.2,M,,*4D $GPRMC,095320.799,A,2712.6420,S,15303.1290,E,1.55,100.78,080407,,,A*75 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:20.799Z","ept":0.005,"lat":-27.210700000,"lon":153.052150000,"alt":19.500,"epx":287.499,"epy":58.512,"epv":207.000,"track":100.7800,"speed":0.797,"climb":-3.300,"eps":575.00,"epc":414.00} $GPVTG,100.78,T,,,1.55,N,2.87,K,A*72 $GPGGA,095321.798,2712.6419,S,15303.1285,E,1,05,07.5,18.2,M,42.2,M,,*45 $GPRMC,095321.798,A,2712.6419,S,15303.1285,E,1.15,100.78,080407,,,A*7F {"class":"TPV","mode":3,"time":"2007-04-08T09:53:21.798Z","ept":0.005,"lat":-27.210698333,"lon":153.052141667,"alt":18.200,"epx":287.499,"epy":58.512,"epv":207.000,"track":100.7800,"speed":0.592,"climb":-1.301,"eps":575.57,"epc":414.41} $GPVTG,100.78,T,,,1.15,N,2.13,K,A*7B $GPGGA,095322.798,2712.6419,S,15303.1281,E,1,05,07.5,17.3,M,42.2,M,,*4C $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","xdop":19.17,"ydop":3.90,"vdop":9.00,"tdop":13.12,"hdop":7.50,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:22.798Z","ept":0.005,"lat":-27.210698333,"lon":153.052135000,"alt":17.300,"epx":287.499,"epy":58.512,"epv":207.000,"track":100.7800,"speed":0.509,"climb":-0.900,"eps":575.00,"epc":414.00} $GPVTG,100.78,T,,,0.99,N,1.84,K,A*73 $GPGGA,095323.798,2712.6418,S,15303.1278,E,1,05,07.5,17.7,M,42.2,M,,*4E $GPRMC,095323.798,A,2712.6418,S,15303.1278,E,0.00,100.78,080407,,,A*7B {"class":"TPV","mode":3,"time":"2007-04-08T09:53:23.798Z","ept":0.005,"lat":-27.210696667,"lon":153.052130000,"alt":17.700,"epx":287.499,"epy":58.512,"epv":207.000,"track":100.7800,"speed":0.000,"climb":0.400,"eps":575.00,"epc":414.00} $GPVTG,100.78,T,,,0.00,N,0.00,K,A*7E $GPGGA,095324.798,2712.6417,S,15303.1275,E,1,05,07.5,18.0,M,42.2,M,,*43 $GPRMC,095324.798,A,2712.6417,S,15303.1275,E,0.00,100.78,080407,,,A*7E {"class":"TPV","mode":3,"time":"2007-04-08T09:53:24.798Z","ept":0.005,"lat":-27.210695000,"lon":153.052125000,"alt":18.000,"epx":287.499,"epy":58.512,"epv":207.000,"track":100.7800,"speed":0.000,"climb":0.300,"eps":575.00,"epc":414.00} $GPVTG,100.78,T,,,0.00,N,0.00,K,A*7E $GPGGA,095325.797,2712.6416,S,15303.1269,E,1,05,07.5,17.7,M,42.2,M,,*49 $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","xdop":19.17,"ydop":3.90,"vdop":9.00,"tdop":13.12,"hdop":7.50,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:25.797Z","ept":0.005,"lat":-27.210693333,"lon":153.052115000,"alt":17.700,"epx":287.499,"epy":58.512,"epv":207.000,"track":100.7800,"speed":0.000,"climb":-0.300,"eps":575.57,"epc":414.41} $GPVTG,100.78,T,,,0.00,N,0.00,K,A*7E $GPGGA,095326.797,2712.6415,S,15303.1253,E,1,05,07.5,15.0,M,42.2,M,,*45 $GPRMC,095326.797,A,2712.6415,S,15303.1253,E,1.10,100.78,080407,,,A*75 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:26.797Z","ept":0.005,"lat":-27.210691667,"lon":153.052088333,"alt":15.000,"epx":287.499,"epy":58.512,"epv":207.000,"track":100.7800,"speed":0.566,"climb":-2.700,"eps":575.00,"epc":414.00} $GPVTG,100.78,T,,,1.10,N,2.03,K,A*7F $GPGGA,095327.797,2712.6414,S,15303.1244,E,1,05,07.5,14.2,M,42.2,M,,*40 $GPRMC,095327.797,A,2712.6414,S,15303.1244,E,1.51,100.78,080407,,,A*76 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:27.797Z","ept":0.005,"lat":-27.210690000,"lon":153.052073333,"alt":14.200,"epx":287.499,"epy":58.512,"epv":207.000,"track":100.7800,"speed":0.777,"climb":-0.800,"eps":575.00,"epc":414.00} $GPVTG,100.78,T,,,1.51,N,2.80,K,A*71 $GPGGA,095328.797,2712.6413,S,15303.1235,E,1,05,07.5,13.4,M,42.2,M,,*4F $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","xdop":19.17,"ydop":3.90,"vdop":9.00,"tdop":13.12,"hdop":7.50,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:28.797Z","ept":0.005,"lat":-27.210688333,"lon":153.052058333,"alt":13.400,"epx":287.499,"epy":58.512,"epv":207.000,"track":276.3400,"speed":0.797,"climb":-0.800,"eps":575.00,"epc":414.00} $GPVTG,276.34,T,,,1.55,N,2.86,K,A*79 $GPGGA,095329.797,2712.6413,S,15303.1226,E,1,05,07.5,12.7,M,42.2,M,,*4E $GPRMC,095329.797,A,2712.6413,S,15303.1226,E,1.67,276.34,080407,,,A*74 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:29.797Z","ept":0.005,"lat":-27.210688333,"lon":153.052043333,"alt":12.700,"epx":287.499,"epy":58.512,"epv":207.000,"track":276.3400,"speed":0.859,"climb":-0.700,"eps":575.00,"epc":414.00} $GPVTG,276.34,T,,,1.67,N,3.09,K,A*7E $GPGGA,095330.796,2712.6413,S,15303.1218,E,1,05,07.5,12.4,M,42.2,M,,*49 $GPRMC,095330.796,A,2712.6413,S,15303.1218,E,1.72,276.34,080407,,,A*74 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:30.796Z","ept":0.005,"lat":-27.210688333,"lon":153.052030000,"alt":12.400,"epx":287.499,"epy":58.512,"epv":207.000,"track":276.3400,"speed":0.885,"climb":-0.300,"eps":575.57,"epc":414.41} $GPVTG,276.34,T,,,1.72,N,3.19,K,A*7B $GPGGA,095331.796,2712.6414,S,15303.1212,E,1,05,07.5,12.3,M,42.2,M,,*42 $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","xdop":19.17,"ydop":3.90,"vdop":9.00,"tdop":13.12,"hdop":7.50,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:31.796Z","ept":0.005,"lat":-27.210690000,"lon":153.052020000,"alt":12.300,"epx":287.499,"epy":58.512,"epv":207.000,"track":276.3400,"speed":0.921,"climb":-0.100,"eps":575.00,"epc":414.00} $GPVTG,276.34,T,,,1.79,N,3.32,K,A*79 $GPGGA,095333.796,2712.6422,S,15303.1205,E,1,05,07.5,11.9,M,42.2,M,,*4A $GPRMC,095333.796,A,2712.6422,S,15303.1205,E,1.87,276.34,080407,,,A*73 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:33.796Z","ept":0.005,"lat":-27.210703333,"lon":153.052008333,"alt":11.900,"epx":287.499,"epy":58.512,"epv":207.000,"track":276.3400,"speed":0.962,"climb":-0.200,"eps":287.50,"epc":207.00} $GPVTG,276.34,T,,,1.87,N,3.46,K,A*7B $GPGGA,095334.796,2712.6427,S,15303.1202,E,1,05,07.5,11.6,M,42.2,M,,*40 $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","xdop":19.17,"ydop":3.90,"vdop":9.00,"tdop":13.12,"hdop":7.50,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:34.796Z","ept":0.005,"lat":-27.210711667,"lon":153.052003333,"alt":11.600,"epx":287.499,"epy":58.512,"epv":207.000,"track":276.3400,"speed":1.034,"climb":-0.300,"eps":575.00,"epc":414.00} $GPVTG,276.34,T,,,2.01,N,3.72,K,A*71 $GPGGA,095336.795,2712.6439,S,15303.1195,E,1,04,10.4,11.6,M,42.2,M,,*45 $GPRMC,095336.795,A,2712.6439,S,15303.1195,E,2.37,209.25,080407,,,A*75 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:36.795Z","ept":0.005,"lat":-27.210731667,"lon":153.051991667,"alt":11.600,"epx":287.499,"epy":58.512,"epv":207.000,"track":209.2500,"speed":1.219,"climb":0.000,"eps":287.64,"epc":207.10} $GPVTG,209.25,T,,,2.37,N,4.38,K,A*75 $GPGGA,095337.795,2712.6444,S,15303.1189,E,1,06,02.3,11.3,M,42.2,M,,*40 $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","xdop":19.17,"ydop":3.90,"vdop":4.20,"tdop":13.12,"hdop":2.30,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:37.795Z","ept":0.005,"lat":-27.210740000,"lon":153.051981667,"alt":11.300,"epx":287.499,"epy":58.512,"epv":207.000,"track":209.4500,"speed":1.188,"climb":-0.300,"eps":575.00,"epc":414.00} $GPVTG,209.45,T,,,2.31,N,4.28,K,A*74 $GPGGA,095338.795,2712.6450,S,15303.1192,E,1,06,02.3,12.4,M,42.2,M,,*44 $GPRMC,095338.795,A,2712.6450,S,15303.1192,E,2.24,203.09,080407,,,A*75 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:38.795Z","ept":0.005,"lat":-27.210750000,"lon":153.051986667,"alt":12.400,"epx":287.499,"epy":58.512,"epv":96.600,"track":203.0900,"speed":1.152,"climb":1.100,"eps":575.00,"epc":303.60} $GPVTG,203.09,T,,,2.24,N,4.14,K,A*7D $GPGGA,095339.794,2712.6456,S,15303.1185,E,1,06,04.1,11.6,M,42.2,M,,*41 $GPRMC,095339.794,A,2712.6456,S,15303.1185,E,2.28,200.03,080407,,,A*70 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:39.794Z","ept":0.005,"lat":-27.210760000,"lon":153.051975000,"alt":11.600,"epx":287.499,"epy":58.512,"epv":96.600,"track":200.0300,"speed":1.173,"climb":-0.801,"eps":575.57,"epc":193.39} $GPVTG,200.03,T,,,2.28,N,4.22,K,A*7D $GPGGA,095340.794,2712.6461,S,15303.1180,E,1,07,01.3,10.0,M,42.2,M,,*4F $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","xdop":19.17,"ydop":3.90,"vdop":2.70,"tdop":13.12,"hdop":1.30,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:40.794Z","ept":0.005,"lat":-27.210768333,"lon":153.051966667,"alt":10.000,"epx":287.499,"epy":58.512,"epv":96.600,"track":189.9000,"speed":1.147,"climb":-1.600,"eps":575.00,"epc":193.20} $GPVTG,189.90,T,,,2.23,N,4.12,K,A*7D $GPGGA,095341.794,2712.6467,S,15303.1177,E,1,07,01.3,10.0,M,42.2,M,,*40 $GPRMC,095341.794,A,2712.6467,S,15303.1177,E,2.24,191.01,080407,,,A*75 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:41.794Z","ept":0.005,"lat":-27.210778333,"lon":153.051961667,"alt":10.000,"epx":287.499,"epy":58.512,"epv":62.100,"track":191.0100,"speed":1.152,"climb":0.000,"eps":575.00,"epc":158.70} $GPVTG,191.01,T,,,2.24,N,4.15,K,A*7C $GPGGA,095342.794,2712.6472,S,15303.1170,E,1,07,01.3,9.1,M,42.2,M,,*79 $GPRMC,095342.794,A,2712.6472,S,15303.1170,E,2.28,193.30,080407,,,A*79 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:42.794Z","ept":0.005,"lat":-27.210786667,"lon":153.051950000,"alt":9.100,"epx":287.499,"epy":58.512,"epv":62.100,"track":193.3000,"speed":1.173,"climb":-0.900,"eps":575.00,"epc":124.20} $GPVTG,193.30,T,,,2.28,N,4.22,K,A*74 $GPGGA,095343.794,2712.6478,S,15303.1166,E,1,07,01.3,8.1,M,42.2,M,,*74 $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","xdop":19.17,"ydop":3.90,"vdop":2.70,"tdop":13.12,"hdop":1.30,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:43.794Z","ept":0.005,"lat":-27.210796667,"lon":153.051943333,"alt":8.100,"epx":287.499,"epy":58.512,"epv":62.100,"track":187.1000,"speed":1.121,"climb":-1.000,"eps":575.00,"epc":124.20} $GPVTG,187.10,T,,,2.18,N,4.03,K,A*73 $GPGGA,095344.793,2712.6483,S,15303.1163,E,1,07,01.3,8.4,M,42.2,M,,*70 $GPRMC,095344.793,A,2712.6483,S,15303.1163,E,2.26,192.88,080407,,,A*78 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:44.793Z","ept":0.005,"lat":-27.210805000,"lon":153.051938333,"alt":8.400,"epx":287.499,"epy":58.512,"epv":62.100,"track":192.8800,"speed":1.163,"climb":0.300,"eps":575.57,"epc":124.32} $GPVTG,192.88,T,,,2.26,N,4.18,K,A*71 $GPGGA,095345.793,2712.6489,S,15303.1158,E,1,07,01.3,7.5,M,42.2,M,,*7D $GPRMC,095345.793,A,2712.6489,S,15303.1158,E,2.26,190.81,080407,,,A*70 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:45.793Z","ept":0.005,"lat":-27.210815000,"lon":153.051930000,"alt":7.500,"epx":287.499,"epy":58.512,"epv":62.100,"track":190.8100,"speed":1.163,"climb":-0.900,"eps":575.00,"epc":124.20} $GPVTG,190.81,T,,,2.26,N,4.18,K,A*7A $GPGGA,095346.793,2712.6494,S,15303.1153,E,1,07,01.3,7.5,M,42.2,M,,*79 $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","xdop":19.17,"ydop":3.90,"vdop":2.70,"tdop":13.12,"hdop":1.30,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:46.793Z","ept":0.005,"lat":-27.210823333,"lon":153.051921667,"alt":7.500,"epx":287.499,"epy":58.512,"epv":62.100,"track":194.0900,"speed":1.142,"climb":0.000,"eps":575.00,"epc":124.20} $GPVTG,194.09,T,,,2.22,N,4.11,K,A*73 $GPGGA,095347.793,2712.6500,S,15303.1150,E,1,07,01.3,7.5,M,42.2,M,,*77 $GPRMC,095347.793,A,2712.6500,S,15303.1150,E,2.23,191.68,080407,,,A*79 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:47.793Z","ept":0.005,"lat":-27.210833333,"lon":153.051916667,"alt":7.500,"epx":287.499,"epy":58.512,"epv":62.100,"track":191.6800,"speed":1.147,"climb":0.000,"eps":575.00,"epc":124.20} $GPVTG,191.68,T,,,2.23,N,4.13,K,A*72 $GPGGA,095348.792,2712.6505,S,15303.1148,E,1,07,01.3,7.4,M,42.2,M,,*74 $GPRMC,095348.792,A,2712.6505,S,15303.1148,E,2.11,187.45,080407,,,A*72 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:48.792Z","ept":0.005,"lat":-27.210841667,"lon":153.051913333,"alt":7.400,"epx":287.499,"epy":58.512,"epv":62.100,"track":187.4500,"speed":1.085,"climb":-0.100,"eps":575.57,"epc":124.32} $GPVTG,187.45,T,,,2.11,N,3.91,K,A*76 $GPGGA,095349.792,2712.6511,S,15303.1147,E,1,07,01.3,7.3,M,42.2,M,,*78 $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","xdop":19.17,"ydop":3.90,"vdop":2.70,"tdop":13.12,"hdop":1.30,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:49.792Z","ept":0.005,"lat":-27.210851667,"lon":153.051911667,"alt":7.300,"epx":287.499,"epy":58.512,"epv":62.100,"track":188.2200,"speed":1.049,"climb":-0.100,"eps":575.00,"epc":124.20} $GPVTG,188.22,T,,,2.04,N,3.78,K,A*7B $GPGGA,095350.792,2712.6515,S,15303.1143,E,1,07,01.3,7.0,M,42.2,M,,*73 $GPRMC,095350.792,A,2712.6515,S,15303.1143,E,1.77,194.81,080407,,,A*78 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:50.792Z","ept":0.005,"lat":-27.210858333,"lon":153.051905000,"alt":7.000,"epx":287.499,"epy":58.512,"epv":62.100,"track":194.8100,"speed":0.911,"climb":-0.300,"eps":575.00,"epc":124.20} $GPVTG,194.81,T,,,1.77,N,3.28,K,A*7D $GPGGA,095351.792,2712.6515,S,15303.1138,E,1,07,01.3,6.2,M,42.2,M,,*7D $GPRMC,095351.792,A,2712.6515,S,15303.1138,E,0.98,194.81,080407,,,A*75 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:51.792Z","ept":0.005,"lat":-27.210858333,"lon":153.051896667,"alt":6.200,"epx":287.499,"epy":58.512,"epv":62.100,"track":194.8100,"speed":0.504,"climb":-0.800,"eps":575.00,"epc":124.20} $GPVTG,194.81,T,,,0.98,N,1.81,K,A*7C $GPGGA,095352.792,2712.6511,S,15303.1137,E,1,06,02.3,5.8,M,42.2,M,,*7E $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","xdop":19.17,"ydop":3.90,"vdop":4.20,"tdop":13.12,"hdop":2.30,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:52.792Z","ept":0.005,"lat":-27.210851667,"lon":153.051895000,"alt":5.800,"epx":287.499,"epy":58.512,"epv":62.100,"track":350.0400,"speed":0.715,"climb":-0.400,"eps":575.00,"epc":124.20} $GPVTG,350.04,T,,,1.39,N,2.57,K,A*79 $GPGGA,095353.791,2712.6505,S,15303.1137,E,1,06,02.3,5.9,M,42.2,M,,*78 $GPRMC,095353.791,A,2712.6505,S,15303.1137,E,1.92,359.88,080407,,,A*7B {"class":"TPV","mode":3,"time":"2007-04-08T09:53:53.791Z","ept":0.005,"lat":-27.210841667,"lon":153.051895000,"alt":5.900,"epx":287.499,"epy":58.512,"epv":96.600,"track":359.8800,"speed":0.988,"climb":0.100,"eps":575.57,"epc":158.86} $GPVTG,359.88,T,,,1.92,N,3.56,K,A*75 $GPGGA,095354.791,2712.6500,S,15303.1137,E,1,07,01.3,5.2,M,42.2,M,,*73 $GPRMC,095354.791,A,2712.6500,S,15303.1137,E,2.00,11.44,080407,,,A*4E {"class":"TPV","mode":3,"time":"2007-04-08T09:53:54.791Z","ept":0.005,"lat":-27.210833333,"lon":153.051895000,"alt":5.200,"epx":287.499,"epy":58.512,"epv":96.600,"track":11.4400,"speed":1.029,"climb":-0.700,"eps":575.00,"epc":193.20} $GPVTG,11.44,T,,,2.00,N,3.70,K,A*46 $GPGGA,095355.791,2712.6493,S,15303.1137,E,1,07,01.3,4.7,M,42.2,M,,*7D $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","xdop":19.17,"ydop":3.90,"vdop":2.70,"tdop":13.12,"hdop":1.30,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:55.791Z","ept":0.005,"lat":-27.210821667,"lon":153.051895000,"alt":4.700,"epx":287.499,"epy":58.512,"epv":96.600,"track":16.7800,"speed":1.096,"climb":-0.500,"eps":575.00,"epc":193.20} $GPVTG,16.78,T,,,2.13,N,3.95,K,A*47 $GPGGA,095356.791,2712.6487,S,15303.1136,E,1,07,01.3,4.3,M,42.2,M,,*7E $GPRMC,095356.791,A,2712.6487,S,15303.1136,E,2.25,13.51,080407,,,A*42 {"class":"TPV","mode":3,"time":"2007-04-08T09:53:56.791Z","ept":0.005,"lat":-27.210811667,"lon":153.051893333,"alt":4.300,"epx":287.499,"epy":58.512,"epv":62.100,"track":13.5100,"speed":1.157,"climb":-0.400,"eps":575.00,"epc":158.70} $GPVTG,13.51,T,,,2.25,N,4.16,K,A*40 $GPGGA,095357.791,2712.6480,S,15303.1135,E,1,07,01.3,4.1,M,42.2,M,,*79 $GPRMC,095357.791,A,2712.6480,S,15303.1135,E,2.30,7.49,080407,,,A*7F {"class":"TPV","mode":3,"time":"2007-04-08T09:53:57.791Z","ept":0.005,"lat":-27.210800000,"lon":153.051891667,"alt":4.100,"epx":287.499,"epy":58.512,"epv":62.100,"track":7.4900,"speed":1.183,"climb":-0.200,"eps":575.00,"epc":124.20} $GPVTG,7.49,T,,,2.30,N,4.26,K,A*7B $GPGGA,095358.790,2712.6473,S,15303.1133,E,1,08,01.1,3.9,M,42.2,M,,*7F $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","xdop":19.17,"ydop":3.90,"vdop":2.40,"tdop":13.12,"hdop":1.10,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:53:58.790Z","ept":0.005,"lat":-27.210788333,"lon":153.051888333,"alt":3.900,"epx":287.499,"epy":58.512,"epv":62.100,"track":6.7300,"speed":1.204,"climb":-0.200,"eps":575.57,"epc":124.32} $GPVTG,6.73,T,,,2.34,N,4.32,K,A*72 $GPGGA,095400.790,2712.6459,S,15303.1133,E,1,06,01.8,3.5,M,42.2,M,,*76 $GPRMC,095400.790,A,2712.6459,S,15303.1133,E,2.40,7.80,080407,,,A*7B {"class":"TPV","mode":3,"time":"2007-04-08T09:54:00.790Z","ept":0.005,"lat":-27.210765000,"lon":153.051888333,"alt":3.500,"epx":287.499,"epy":58.512,"epv":55.200,"track":7.8000,"speed":1.235,"climb":-0.200,"eps":287.50,"epc":58.65} $GPVTG,7.80,T,,,2.40,N,4.44,K,A*7D $GPGGA,095401.790,2712.6453,S,15303.1133,E,1,08,01.1,3.7,M,42.2,M,,*78 $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","xdop":19.17,"ydop":3.90,"vdop":2.40,"tdop":13.12,"hdop":1.10,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:54:01.790Z","ept":0.005,"lat":-27.210755000,"lon":153.051888333,"alt":3.700,"epx":287.499,"epy":58.512,"epv":55.200,"track":7.7700,"speed":1.214,"climb":0.200,"eps":575.00,"epc":110.40} $GPVTG,7.77,T,,,2.36,N,4.37,K,A*70 $GPGGA,095403.789,2712.6439,S,15303.1137,E,1,08,01.1,3.5,M,42.2,M,,*78 $GPRMC,095403.789,A,2712.6439,S,15303.1137,E,2.48,15.66,080407,,,A*41 {"class":"TPV","mode":3,"time":"2007-04-08T09:54:03.789Z","ept":0.005,"lat":-27.210731667,"lon":153.051895000,"alt":3.500,"epx":287.499,"epy":58.512,"epv":55.200,"track":15.6600,"speed":1.276,"climb":-0.100,"eps":287.64,"epc":55.23} $GPVTG,15.66,T,,,2.48,N,4.59,K,A*42 $GPGGA,095404.789,2712.6432,S,15303.1137,E,1,09,01.1,3.3,M,42.2,M,,*73 $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","xdop":19.17,"ydop":3.90,"vdop":2.20,"tdop":13.12,"hdop":1.10,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:54:04.789Z","ept":0.005,"lat":-27.210720000,"lon":153.051895000,"alt":3.300,"epx":287.499,"epy":58.512,"epv":55.200,"track":12.3900,"speed":1.260,"climb":-0.200,"eps":575.00,"epc":110.40} $GPVTG,12.39,T,,,2.45,N,4.54,K,A*4F $GPGGA,095405.789,2712.6425,S,15303.1138,E,1,09,01.1,3.1,M,42.2,M,,*79 $GPRMC,095405.789,A,2712.6425,S,15303.1138,E,2.55,16.50,080407,,,A*4F {"class":"TPV","mode":3,"time":"2007-04-08T09:54:05.789Z","ept":0.005,"lat":-27.210708333,"lon":153.051896667,"alt":3.100,"epx":287.499,"epy":58.512,"epv":50.600,"track":16.5000,"speed":1.312,"climb":-0.200,"eps":575.00,"epc":105.80} $GPVTG,16.50,T,,,2.55,N,4.73,K,A*40 $GPGGA,095406.789,2712.6420,S,15303.1142,E,1,09,01.1,2.7,M,42.2,M,,*75 $GPRMC,095406.789,A,2712.6420,S,15303.1142,E,2.35,31.12,080407,,,A*41 {"class":"TPV","mode":3,"time":"2007-04-08T09:54:06.789Z","ept":0.005,"lat":-27.210700000,"lon":153.051903333,"alt":2.700,"epx":287.499,"epy":58.512,"epv":50.600,"track":31.1200,"speed":1.209,"climb":-0.400,"eps":575.00,"epc":101.20} $GPVTG,31.12,T,,,2.35,N,4.35,K,A*47 $GPGGA,095407.788,2712.6415,S,15303.1145,E,1,08,01.7,2.5,M,42.2,M,,*71 $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","xdop":19.17,"ydop":3.90,"vdop":3.40,"tdop":13.12,"hdop":1.70,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:54:07.788Z","ept":0.005,"lat":-27.210691667,"lon":153.051908333,"alt":2.500,"epx":287.499,"epy":58.512,"epv":50.600,"track":40.3000,"speed":1.173,"climb":-0.200,"eps":575.57,"epc":101.30} $GPVTG,40.30,T,,,2.28,N,4.23,K,A*4A $GPGGA,095408.788,2712.6411,S,15303.1151,E,1,09,01.1,2.6,M,42.2,M,,*7B $GPRMC,095408.788,A,2712.6411,S,15303.1151,E,2.35,51.76,080407,,,A*4A {"class":"TPV","mode":3,"time":"2007-04-08T09:54:08.788Z","ept":0.005,"lat":-27.210685000,"lon":153.051918333,"alt":2.600,"epx":287.499,"epy":58.512,"epv":78.200,"track":51.7600,"speed":1.209,"climb":0.100,"eps":575.00,"epc":128.80} $GPVTG,51.76,T,,,2.35,N,4.35,K,A*43 $GPGGA,095409.788,2712.6409,S,15303.1158,E,1,09,01.1,2.6,M,42.2,M,,*7A $GPRMC,095409.788,A,2712.6409,S,15303.1158,E,2.41,68.20,080407,,,A*41 {"class":"TPV","mode":3,"time":"2007-04-08T09:54:09.788Z","ept":0.005,"lat":-27.210681667,"lon":153.051930000,"alt":2.600,"epx":287.499,"epy":58.512,"epv":78.200,"track":68.2000,"speed":1.240,"climb":0.000,"eps":575.00,"epc":156.40} $GPVTG,68.20,T,,,2.41,N,4.47,K,A*4C $GPGGA,095410.788,2712.6407,S,15303.1166,E,1,09,01.1,2.9,M,42.2,M,,*7E $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","xdop":19.17,"ydop":3.90,"vdop":2.20,"tdop":13.12,"hdop":1.10,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:54:10.788Z","ept":0.005,"lat":-27.210678333,"lon":153.051943333,"alt":2.900,"epx":287.499,"epy":58.512,"epv":78.200,"track":74.3800,"speed":1.307,"climb":0.300,"eps":575.00,"epc":156.40} $GPVTG,74.38,T,,,2.54,N,4.71,K,A*49 $GPGGA,095411.787,2712.6405,S,15303.1173,E,1,09,01.1,2.9,M,42.2,M,,*76 $GPRMC,095411.787,A,2712.6405,S,15303.1173,E,2.34,76.68,080407,,,A*43 {"class":"TPV","mode":3,"time":"2007-04-08T09:54:11.787Z","ept":0.005,"lat":-27.210675000,"lon":153.051955000,"alt":2.900,"epx":287.499,"epy":58.512,"epv":50.600,"track":76.6800,"speed":1.204,"climb":0.000,"eps":575.57,"epc":128.93} $GPVTG,76.68,T,,,2.34,N,4.33,K,A*4E $GPGGA,095412.787,2712.6404,S,15303.1180,E,1,09,01.1,3.0,M,42.2,M,,*70 $GPRMC,095412.787,A,2712.6404,S,15303.1180,E,2.33,77.59,080407,,,A*49 {"class":"TPV","mode":3,"time":"2007-04-08T09:54:12.787Z","ept":0.005,"lat":-27.210673333,"lon":153.051966667,"alt":3.000,"epx":287.499,"epy":58.512,"epv":50.600,"track":77.5900,"speed":1.199,"climb":0.100,"eps":575.00,"epc":101.20} $GPVTG,77.59,T,,,2.33,N,4.32,K,A*4B $GPGGA,095413.787,2712.6403,S,15303.1187,E,1,08,01.1,3.1,M,42.2,M,,*71 $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","xdop":19.17,"ydop":3.90,"vdop":2.40,"tdop":13.12,"hdop":1.10,"gdop":34.40,"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","mode":3,"time":"2007-04-08T09:54:13.787Z","ept":0.005,"lat":-27.210671667,"lon":153.051978333,"alt":3.100,"epx":287.499,"epy":58.512,"epv":50.600,"track":79.5100,"speed":1.271,"climb":0.100,"eps":575.00,"epc":101.20} $GPVTG,79.51,T,,,2.47,N,4.57,K,A*4D $GPGGA,095414.787,2712.6403,S,15303.1194,E,1,09,01.1,3.2,M,42.2,M,,*76 $GPRMC,095414.787,A,2712.6403,S,15303.1194,E,2.20,86.03,080407,,,A*4E {"class":"TPV","mode":3,"time":"2007-04-08T09:54:14.787Z","ept":0.005,"lat":-27.210671667,"lon":153.051990000,"alt":3.200,"epx":287.499,"epy":58.512,"epv":55.200,"track":86.0300,"speed":1.132,"climb":0.100,"eps":575.00,"epc":105.80} $GPVTG,86.03,T,,,2.20,N,4.07,K,A*4E $GPGGA,095415.787,2712.6404,S,15303.1200,E,1,06,01.8,3.5,M,42.2,M,,*7F $GPRMC,095415.787,A,2712.6404,S,15303.1200,E,2.11,96.86,080407,,,A*48 {"class":"TPV","mode":3,"time":"2007-04-08T09:54:15.787Z","ept":0.005,"lat":-27.210673333,"lon":153.052000000,"alt":3.500,"epx":287.499,"epy":58.512,"epv":55.200,"track":96.8600,"speed":1.085,"climb":0.300,"eps":575.00,"epc":110.40} gpsd-3.15/test/daemon/holux-gm-210.log0000664000175000017500000000516412461156335015546 0ustar esresr# Name: Holux GM-210 # Chipset: SiRF-II # Submitter: "Patrick L. McGillan" # Date: 2005-04-04 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGGA,012519.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*7D $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,012519.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*14 $GPGGA,012520.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*77 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,09,14,65,034,00,01,55,291,43,25,53,210,37,22,45,125,00*7E $GPGSV,3,2,09,30,29,096,00,11,25,294,32,05,20,056,00,18,14,127,00*73 $GPGSV,3,3,09,15,08,176,00*4C $GPRMC,012520.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1E $GPGGA,012521.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*76 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,012521.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1F $GPGGA,012522.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*75 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,012522.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1C $GPGGA,012523.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*74 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,012523.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1D $GPGGA,012524.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*73 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,012524.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1A $GPGGA,012525.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*72 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,09,14,65,034,00,01,55,291,43,25,53,210,37,22,45,125,00*7E $GPGSV,3,2,09,30,29,096,00,11,25,294,32,05,20,056,00,18,14,127,00*73 $GPGSV,3,3,09,15,08,176,00*4C $GPRMC,012525.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1B $GPGGA,012526.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*71 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,012526.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*18 $GPGGA,012527.562,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*71 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,012527.562,V,4131.7353,N,09336.8150,W,0.00,,050405,,*18 $GPGGA,012528.562,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*7E $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,012528.562,V,4131.7353,N,09336.8150,W,0.00,,050405,,*17 $GPGGA,012529.562,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*7F $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,012529.562,V,4131.7353,N,09336.8150,W,0.00,,050405,,*16 $GPGGA,012530.562,4131.7353,N,09336.8150,W,0,00,50. gpsd-3.15/test/daemon/holux-gm-210.log.chk0000664000175000017500000000717512467340617016322 0ustar esresr$GPGGA,012519.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*7D $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,012519.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*14 $GPGGA,012520.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*77 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPGSV,3,1,09,14,65,034,00,01,55,291,43,25,53,210,37,22,45,125,00*7E $GPGSV,3,2,09,30,29,096,00,11,25,294,32,05,20,056,00,18,14,127,00*73 $GPGSV,3,3,09,15,08,176,00*4C {"class":"SKY","vdop":50.00,"hdop":50.00,"pdop":50.00,"satellites":[{"PRN":14,"el":65,"az":34,"ss":0,"used":false},{"PRN":1,"el":55,"az":291,"ss":43,"used":false},{"PRN":25,"el":53,"az":210,"ss":37,"used":false},{"PRN":22,"el":45,"az":125,"ss":0,"used":false},{"PRN":30,"el":29,"az":96,"ss":0,"used":false},{"PRN":11,"el":25,"az":294,"ss":32,"used":false},{"PRN":5,"el":20,"az":56,"ss":0,"used":false},{"PRN":18,"el":14,"az":127,"ss":0,"used":false},{"PRN":15,"el":8,"az":176,"ss":0,"used":false}]} $GPRMC,012520.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1E $GPGGA,012521.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*76 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,012521.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1F $GPGGA,012522.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*75 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,012522.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1C $GPGGA,012523.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*74 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,012523.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1D $GPGGA,012524.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*73 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,012524.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1A $GPGGA,012525.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*72 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPGSV,3,1,09,14,65,034,00,01,55,291,43,25,53,210,37,22,45,125,00*7E $GPGSV,3,2,09,30,29,096,00,11,25,294,32,05,20,056,00,18,14,127,00*73 $GPGSV,3,3,09,15,08,176,00*4C {"class":"SKY","vdop":50.00,"hdop":50.00,"pdop":50.00,"satellites":[{"PRN":14,"el":65,"az":34,"ss":0,"used":false},{"PRN":1,"el":55,"az":291,"ss":43,"used":false},{"PRN":25,"el":53,"az":210,"ss":37,"used":false},{"PRN":22,"el":45,"az":125,"ss":0,"used":false},{"PRN":30,"el":29,"az":96,"ss":0,"used":false},{"PRN":11,"el":25,"az":294,"ss":32,"used":false},{"PRN":5,"el":20,"az":56,"ss":0,"used":false},{"PRN":18,"el":14,"az":127,"ss":0,"used":false},{"PRN":15,"el":8,"az":176,"ss":0,"used":false}]} $GPRMC,012525.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*1B $GPGGA,012526.563,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*71 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,012526.563,V,4131.7353,N,09336.8150,W,0.00,,050405,,*18 $GPGGA,012527.562,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*71 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,012527.562,V,4131.7353,N,09336.8150,W,0.00,,050405,,*18 $GPGGA,012528.562,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*7E $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,012528.562,V,4131.7353,N,09336.8150,W,0.00,,050405,,*17 $GPGGA,012529.562,4131.7353,N,09336.8150,W,0,00,50.0,280.2,M,-31.6,M,0.0,0000*7F $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,012529.562,V,4131.7353,N,09336.8150,W,0.00,,050405,,*16 $GPGGA,012530.562,4131.7353,N,09336.8150,W,0,00,50. gpsd-3.15/test/daemon/hp58534a.log0000664000175000017500000000171712461156335014667 0ustar esresr# Name: HP (Symmetricom) 58534AGPS # Submitter: aquarat # Date: 2010-10-26 # Notes: shows GPZDA bug in gpsd 2.95 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. $GPGGA,222449,3349.0337,S,01843.9282,E,1,07,02.31,000115.4,M,0033.3,M,, $GPZDA,222449,25,10,2010,+00,00 $GPGSV,3,1,09,07,38,351,00,08,60,306,31,11,73,114,35,17,36,265,46 $GPGSV,3,2,09,19,18,121,38,20,19,049,29,24,31,133,38,28,57,208,32 $GPGSV,3,3,09,32,16,070,00 $GPVTG,318.0,T,341.9,M,000.0,N,0000.1,K,A $PFEC,GPtps,101025222449,3,1,1,090101000000,00,15,101025162124,1607,167104 $GPGGA,222450,3349.0337,S,01843.9282,E,1,07,02.31,000115.4,M,0033.3,M,, $GPGSV,3,1,09,07,38,351,00,08,60,306,31,11,73,114,35,17,36,265,46 $GPGSV,3,2,09,19,18,121,38,20,19,049,29,24,31,133,38,28,57,208,32 $GPGSV,3,3,09,32,16,070,00 $GPVTG,318.0,T,341.9,M,000.0,N,0000.1,K,A $PFEC,GPtps,101025222450,3,1,1,090101000000,00,15,101025162124,1607,167104 gpsd-3.15/test/daemon/hp58534a.log.chk0000664000175000017500000000170012467340617015427 0ustar esresr$GPGGA,222449,3349.0337,S,01843.9282,E,1,07,02.31,000115.4,M,0033.3,M,, {"class":"TPV","mode":3,"lat":-33.817228333,"lon":18.732136667,"alt":115.400} $GPZDA,222449,25,10,2010,+00,00 $GPGSV,3,1,09,07,38,351,00,08,60,306,31,11,73,114,35,17,36,265,46 $GPGSV,3,2,09,19,18,121,38,20,19,049,29,24,31,133,38,28,57,208,32 $GPGSV,3,3,09,32,16,070,00 $GPVTG,318.0,T,341.9,M,000.0,N,0000.1,K,A $PFEC,GPtps,101025222449,3,1,1,090101000000,00,15,101025162124,1607,167104 $GPGGA,222450,3349.0337,S,01843.9282,E,1,07,02.31,000115.4,M,0033.3,M,, {"class":"TPV","mode":3,"time":"2010-10-25T22:24:50.000Z","ept":0.005,"lat":-33.817228333,"lon":18.732136667,"alt":115.400,"speed":0.000,"climb":0.000} $GPGSV,3,1,09,07,38,351,00,08,60,306,31,11,73,114,35,17,36,265,46 $GPGSV,3,2,09,19,18,121,38,20,19,049,29,24,31,133,38,28,57,208,32 $GPGSV,3,3,09,32,16,070,00 $GPVTG,318.0,T,341.9,M,000.0,N,0000.1,K,A $PFEC,GPtps,101025222450,3,1,1,090101000000,00,15,101025162124,1607,167104 gpsd-3.15/test/daemon/humminbird-M37.log0000664000175000017500000000740612467341115016207 0ustar esresr# Name: Humminbird Matrix 37 Fishing System, Humminbird GR16 Receiver # Submitter: "Carl Brown" # Date: 2006-09-16 # Location: Connecticut River, New Hampshire, USA, 44N71W # Comments: Powerboat track with NMEA depth (DPT) and water temperature (MTW) sentences # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $INDPT,2.2,0.0*47 $INRMC,194101,A,4426.1130,N,07140.5596,W,5.2,77.3,160906,15.8,W*60 $INDPT,2.1,0.0*44 $INGLL,4426.1130,N,07140.5579,W,194102,A*2C $INVTG,77.5,T,93.3,M,5.2,N,9.7,K*5B $INMTW,17.9,C*1B $INDPT,2.1,0.0*44 $INRMC,194103,A,4426.1134,N,07140.5558,W,5.3,77.0,160906,15.8,W*66 $INDPT,2.0,0.0*45 $INGGA,194104,4426.1138,N,07140.5536,W,2,10,0.9,267.9,M,,,,*13 $INZDA,194104,16,09,2006,-05,00*73 $INMTW,17.9,C*1B $INDPT,2.1,0.0*44 $INRMC,194105,A,4426.1142,N,07140.5515,W,5.3,76.8,160906,15.8,W*61 $INDPT,2.1,0.0*44 $INGLL,4426.1146,N,07140.5499,W,194106,A*26 $INVTG,76.3,T,92.1,M,5.3,N,9.7,K*5E $INMTW,17.9,C*1B $INDPT,2.2,0.0*47 $INRMC,194107,A,4426.1149,N,07140.5477,W,5.3,76.6,160906,15.8,W*63 $INDPT,2.1,0.0*44 $INGGA,194108,4426.1149,N,07140.5455,W,2,10,0.9,268.0,M,,,,*1B $INZDA,194108,16,09,2006,-05,00*7F $INMTW,17.9,C*1B $INDPT,2.2,0.0*47 $INRMC,194109,A,4426.1153,N,07140.5439,W,5.2,76.5,160906,15.8,W*6E $INDPT,2.3,0.0*46 $INGLL,4426.1157,N,07140.5418,W,194110,A*28 $INVTG,77.2,T,93.0,M,5.2,N,9.7,K*5F $INMTW,17.9,C*1B $INDPT,2.2,0.0*47 $INRMC,194111,A,4426.1161,N,07140.5396,W,5.3,77.6,160906,15.8,W*67 $INDPT,2.3,0.0*46 $INGGA,194112,4426.1165,N,07140.5380,W,2,10,0.9,268.0,M,,,,*11 $INZDA,194112,16,09,2006,-05,00*74 $INMTW,17.9,C*1B $INDPT,2.3,0.0*46 $INRMC,194113,A,4426.1169,N,07140.5358,W,5.2,75.6,160906,15.8,W*6C $INDPT,2.4,0.0*41 $INGLL,4426.1173,N,07140.5337,W,194114,A*20 $INVTG,76.0,T,91.8,M,5.2,N,9.6,K*57 $INMTW,17.9,C*1B $INDPT,2.5,0.0*40 $INRMC,194115,A,4426.1176,N,07140.5321,W,5.2,77.3,160906,15.8,W*6D $INDPT,2.4,0.0*41 $INGGA,194116,4426.1176,N,07140.5299,W,2,10,0.9,268.0,M,,,,*1E $INZDA,194116,16,09,2006,-05,00*70 $INMTW,18.0,C*1D $INDPT,2.4,0.0*41 $INRMC,194117,A,4426.1180,N,07140.5278,W,5.2,76.8,160906,15.8,W*61 $INDPT,2.5,0.0*40 $INGLL,4426.1184,N,07140.5261,W,194118,A*26 $INVTG,76.4,T,92.2,M,5.2,N,9.7,K*5B $INMTW,18.0,C*1D $INDPT,2.6,0.0*43 $INRMC,194119,A,4426.1188,N,07140.5240,W,5.2,77.5,160906,15.8,W*60 $INDPT,2.4,0.0*41 $INGGA,194120,4426.1192,N,07140.5218,W,2,10,0.9,268.2,M,,,,*1A $INZDA,194120,16,09,2006,-05,00*75 $INMTW,17.9,C*1B $INDPT,2.4,0.0*41 $INRMC,194121,A,4426.1192,N,07140.5202,W,5.2,79.3,160906,15.8,W*6E $INDPT,2.4,0.0*41 $INGLL,4426.1196,N,07140.5181,W,194122,A*21 $INVTG,78.6,T,94.4,M,5.3,N,9.7,K*56 $INMTW,18.0,C*1D $INDPT,2.4,0.0*41 $INRMC,194123,A,4426.1200,N,07140.5159,W,5.2,79.0,160906,15.8,W*6A $INDPT,2.4,0.0*41 $INGGA,194124,4426.1200,N,07140.5143,W,2,10,0.9,268.2,M,,,,*1B $INZDA,194124,16,09,2006,-05,00*71 $INMTW,17.9,C*1B $INDPT,2.5,0.0*40 $INRMC,194111,A,4426.1203,N,07140.5121,W,5.2,81.5,160906,15.8,W*65 $INDPT,2.4,0.0*41 $INGLL,4426.1203,N,07140.5100,W,194112,A*24 $INVTG,81.4,T,97.2,M,5.2,N,9.6,K*57 $INMTW,18.0,C*1D $INDPT,2.3,0.0*46 $INRMC,194113,A,4426.1207,N,07140.5084,W,5.2,81.9,160906,15.8,W*61 $INDPT,2.3,0.0*46 $INGGA,194114,4426.1211,N,07140.5062,W,2,10,0.9,268.4,M,,,,*1C $INZDA,194114,16,09,2006,-05,00*72 $INMTW,18.0,C*1D $INDPT,2.4,0.0*41 $INRMC,194115,A,4426.1211,N,07140.5040,W,5.2,83.9,160906,15.8,W*6A $INDPT,2.4,0.0*41 $INGLL,4426.1211,N,07140.5024,W,194116,A*24 $INVTG,83.7,T,99.5,M,5.2,N,9.6,K*5F $INMTW,18.1,C*1C $INDPT,2.4,0.0*41 $INRMC,194117,A,4426.1215,N,07140.5003,W,5.2,83.8,160906,15.8,W*6A $INDPT,2.4,0.0*41 $INGGA,194118,4426.1215,N,07140.4987,W,2,10,0.9,268.5,M,,,,*16 $INZDA,194118,16,09,2006,-05,00*7E $INMTW,18.0,C*1D $INDPT,2.3,0.0*46 $INRMC,194119,A,4426.1219,N,07140.4965,W,5.1,85.4,160906,15.8,W*69 gpsd-3.15/test/daemon/humminbird-M37.log.chk0000664000175000017500000001677212467341115016761 0ustar esresr$INDPT,2.2,0.0*47 $INRMC,194101,A,4426.1130,N,07140.5596,W,5.2,77.3,160906,15.8,W*60 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:01.000Z","ept":0.005,"lat":44.435216667,"lon":-71.675993333,"track":77.3000,"speed":2.675} $INDPT,2.1,0.0*44 $INGLL,4426.1130,N,07140.5579,W,194102,A*2C $INVTG,77.5,T,93.3,M,5.2,N,9.7,K*5B $INMTW,17.9,C*1B $INDPT,2.1,0.0*44 $INRMC,194103,A,4426.1134,N,07140.5558,W,5.3,77.0,160906,15.8,W*66 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:03.000Z","ept":0.005,"lat":44.435223333,"lon":-71.675930000,"track":77.0000,"speed":2.727} $INDPT,2.0,0.0*45 $INGGA,194104,4426.1138,N,07140.5536,W,2,10,0.9,267.9,M,,,,*13 $INZDA,194104,16,09,2006,-05,00*73 $INMTW,17.9,C*1B $INDPT,2.1,0.0*44 $INRMC,194105,A,4426.1142,N,07140.5515,W,5.3,76.8,160906,15.8,W*61 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:05.000Z","ept":0.005,"lat":44.435236667,"lon":-71.675858333,"track":76.8000,"speed":2.727} $INDPT,2.1,0.0*44 $INGLL,4426.1146,N,07140.5499,W,194106,A*26 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:06.000Z","ept":0.005,"lat":44.435243333,"lon":-71.675831667,"speed":2.249} $INVTG,76.3,T,92.1,M,5.3,N,9.7,K*5E $INMTW,17.9,C*1B $INDPT,2.2,0.0*47 $INRMC,194107,A,4426.1149,N,07140.5477,W,5.3,76.6,160906,15.8,W*63 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:07.000Z","ept":0.005,"lat":44.435248333,"lon":-71.675795000,"track":76.6000,"speed":2.727} $INDPT,2.1,0.0*44 $INGGA,194108,4426.1149,N,07140.5455,W,2,10,0.9,268.0,M,,,,*1B {"class":"TPV","mode":3,"time":"2006-09-16T19:41:08.000Z","ept":0.005,"lat":44.435248333,"lon":-71.675758333,"alt":268.000,"speed":2.919} $INZDA,194108,16,09,2006,-05,00*7F $INMTW,17.9,C*1B $INDPT,2.2,0.0*47 $INRMC,194109,A,4426.1153,N,07140.5439,W,5.2,76.5,160906,15.8,W*6E {"class":"TPV","mode":2,"time":"2006-09-16T19:41:09.000Z","ept":0.005,"lat":44.435255000,"lon":-71.675731667,"track":76.5000,"speed":2.675} $INDPT,2.3,0.0*46 $INGLL,4426.1157,N,07140.5418,W,194110,A*28 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:10.000Z","ept":0.005,"lat":44.435261667,"lon":-71.675696667,"speed":2.883} $INVTG,77.2,T,93.0,M,5.2,N,9.7,K*5F $INMTW,17.9,C*1B $INDPT,2.2,0.0*47 $INRMC,194111,A,4426.1161,N,07140.5396,W,5.3,77.6,160906,15.8,W*67 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:11.000Z","ept":0.005,"lat":44.435268333,"lon":-71.675660000,"track":77.6000,"speed":2.727} $INDPT,2.3,0.0*46 $INGGA,194112,4426.1165,N,07140.5380,W,2,10,0.9,268.0,M,,,,*11 {"class":"TPV","mode":3,"time":"2006-09-16T19:41:12.000Z","ept":0.005,"lat":44.435275000,"lon":-71.675633333,"alt":268.000,"speed":2.249} $INZDA,194112,16,09,2006,-05,00*74 $INMTW,17.9,C*1B $INDPT,2.3,0.0*46 $INRMC,194113,A,4426.1169,N,07140.5358,W,5.2,75.6,160906,15.8,W*6C {"class":"TPV","mode":2,"time":"2006-09-16T19:41:13.000Z","ept":0.005,"lat":44.435281667,"lon":-71.675596667,"track":75.6000,"speed":2.675} $INDPT,2.4,0.0*41 $INGLL,4426.1173,N,07140.5337,W,194114,A*20 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:14.000Z","ept":0.005,"lat":44.435288333,"lon":-71.675561667,"speed":2.883} $INVTG,76.0,T,91.8,M,5.2,N,9.6,K*57 $INMTW,17.9,C*1B $INDPT,2.5,0.0*40 $INRMC,194115,A,4426.1176,N,07140.5321,W,5.2,77.3,160906,15.8,W*6D {"class":"TPV","mode":2,"time":"2006-09-16T19:41:15.000Z","ept":0.005,"lat":44.435293333,"lon":-71.675535000,"track":77.3000,"speed":2.675} $INDPT,2.4,0.0*41 $INGGA,194116,4426.1176,N,07140.5299,W,2,10,0.9,268.0,M,,,,*1E {"class":"TPV","mode":3,"time":"2006-09-16T19:41:16.000Z","ept":0.005,"lat":44.435293333,"lon":-71.675498333,"alt":268.000,"speed":2.919} $INZDA,194116,16,09,2006,-05,00*70 $INMTW,18.0,C*1D $INDPT,2.4,0.0*41 $INRMC,194117,A,4426.1180,N,07140.5278,W,5.2,76.8,160906,15.8,W*61 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:17.000Z","ept":0.005,"lat":44.435300000,"lon":-71.675463333,"track":76.8000,"speed":2.675} $INDPT,2.5,0.0*40 $INGLL,4426.1184,N,07140.5261,W,194118,A*26 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:18.000Z","ept":0.005,"lat":44.435306667,"lon":-71.675435000,"speed":2.374} $INVTG,76.4,T,92.2,M,5.2,N,9.7,K*5B $INMTW,18.0,C*1D $INDPT,2.6,0.0*43 $INRMC,194119,A,4426.1188,N,07140.5240,W,5.2,77.5,160906,15.8,W*60 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:19.000Z","ept":0.005,"lat":44.435313333,"lon":-71.675400000,"track":77.5000,"speed":2.675} $INDPT,2.4,0.0*41 $INGGA,194120,4426.1192,N,07140.5218,W,2,10,0.9,268.2,M,,,,*1A {"class":"TPV","mode":3,"time":"2006-09-16T19:41:20.000Z","ept":0.005,"lat":44.435320000,"lon":-71.675363333,"alt":268.200,"speed":3.012} $INZDA,194120,16,09,2006,-05,00*75 $INMTW,17.9,C*1B $INDPT,2.4,0.0*41 $INRMC,194121,A,4426.1192,N,07140.5202,W,5.2,79.3,160906,15.8,W*6E {"class":"TPV","mode":2,"time":"2006-09-16T19:41:21.000Z","ept":0.005,"lat":44.435320000,"lon":-71.675336667,"track":79.3000,"speed":2.675} $INDPT,2.4,0.0*41 $INGLL,4426.1196,N,07140.5181,W,194122,A*21 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:22.000Z","ept":0.005,"lat":44.435326667,"lon":-71.675301667,"speed":2.883} $INVTG,78.6,T,94.4,M,5.3,N,9.7,K*56 $INMTW,18.0,C*1D $INDPT,2.4,0.0*41 $INRMC,194123,A,4426.1200,N,07140.5159,W,5.2,79.0,160906,15.8,W*6A {"class":"TPV","mode":2,"time":"2006-09-16T19:41:23.000Z","ept":0.005,"lat":44.435333333,"lon":-71.675265000,"track":79.0000,"speed":2.675} $INDPT,2.4,0.0*41 $INGGA,194124,4426.1200,N,07140.5143,W,2,10,0.9,268.2,M,,,,*1B {"class":"TPV","mode":3,"time":"2006-09-16T19:41:24.000Z","ept":0.005,"lat":44.435333333,"lon":-71.675238333,"alt":268.200,"speed":2.123} $INZDA,194124,16,09,2006,-05,00*71 $INMTW,17.9,C*1B $INDPT,2.5,0.0*40 $INRMC,194111,A,4426.1203,N,07140.5121,W,5.2,81.5,160906,15.8,W*65 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:11.000Z","ept":0.005,"lat":44.435338333,"lon":-71.675201667,"track":81.5000,"speed":2.675} $INDPT,2.4,0.0*41 $INGLL,4426.1203,N,07140.5100,W,194112,A*24 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:12.000Z","ept":0.005,"lat":44.435338333,"lon":-71.675166667,"speed":2.787} $INVTG,81.4,T,97.2,M,5.2,N,9.6,K*57 $INMTW,18.0,C*1D $INDPT,2.3,0.0*46 $INRMC,194113,A,4426.1207,N,07140.5084,W,5.2,81.9,160906,15.8,W*61 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:13.000Z","ept":0.005,"lat":44.435345000,"lon":-71.675140000,"track":81.9000,"speed":2.675} $INDPT,2.3,0.0*46 $INGGA,194114,4426.1211,N,07140.5062,W,2,10,0.9,268.4,M,,,,*1C {"class":"TPV","mode":3,"time":"2006-09-16T19:41:14.000Z","ept":0.005,"lat":44.435351667,"lon":-71.675103333,"alt":268.400,"speed":3.012} $INZDA,194114,16,09,2006,-05,00*72 $INMTW,18.0,C*1D $INDPT,2.4,0.0*41 $INRMC,194115,A,4426.1211,N,07140.5040,W,5.2,83.9,160906,15.8,W*6A {"class":"TPV","mode":2,"time":"2006-09-16T19:41:15.000Z","ept":0.005,"lat":44.435351667,"lon":-71.675066667,"track":83.9000,"speed":2.675} $INDPT,2.4,0.0*41 $INGLL,4426.1211,N,07140.5024,W,194116,A*24 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:16.000Z","ept":0.005,"lat":44.435351667,"lon":-71.675040000,"speed":2.123} $INVTG,83.7,T,99.5,M,5.2,N,9.6,K*5F $INMTW,18.1,C*1C $INDPT,2.4,0.0*41 $INRMC,194117,A,4426.1215,N,07140.5003,W,5.2,83.8,160906,15.8,W*6A {"class":"TPV","mode":2,"time":"2006-09-16T19:41:17.000Z","ept":0.005,"lat":44.435358333,"lon":-71.675005000,"track":83.8000,"speed":2.675} $INDPT,2.4,0.0*41 $INGGA,194118,4426.1215,N,07140.4987,W,2,10,0.9,268.5,M,,,,*16 {"class":"TPV","mode":3,"time":"2006-09-16T19:41:18.000Z","ept":0.005,"lat":44.435358333,"lon":-71.674978333,"alt":268.500,"speed":2.123} $INZDA,194118,16,09,2006,-05,00*7E $INMTW,18.0,C*1D $INDPT,2.3,0.0*46 $INRMC,194119,A,4426.1219,N,07140.4965,W,5.1,85.4,160906,15.8,W*69 {"class":"TPV","mode":2,"time":"2006-09-16T19:41:19.000Z","ept":0.005,"lat":44.435365000,"lon":-71.674941667,"track":85.4000,"speed":2.624} gpsd-3.15/test/daemon/iTrek.log0000664000175000017500000001540112461156335014557 0ustar esresr# Name: i.Trek M3 # Submitter: "Lance Fetters" # Date: 2005-07-27 # Location: Anpachi, Gifu, JP, 35N136E # Note that this log file is a combination of two separate logs, # one captured without a fix (first three lines) and one with. # This GPS emuits a badly malformed GSA when it has no fix, as # you can see on the first two lines. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPRMC,151605.053,V,,,,,,,260705,,*29 $GPRMC,151606.055,V,,,,,,,260705,,*2C $GPGSA,A,1,,,,*32 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045849.000,A,3519.9048,N,13640.2631,E,0.10,92.17,270705,,*31 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045850.000,A,3519.9047,N,13640.2631,E,0.11,99.12,270705,,*39 $GPGGA,045851.000,3519.9046,N,13640.2631,E,1,04,2.2,80.4,M,,,,0000*39 $GPRMC,045851.000,A,3519.9046,N,13640.2631,E,0.12,114.35,270705,,*0B $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 $GPRMC,045852.000,A,3519.9046,N,13640.2632,E,0.10,104.21,270705,,*0D $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 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045854.000,A,3519.9044,N,13640.2632,E,0.12,108.39,270705,,*0E $GPGGA,045855.000,3519.9043,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,045855.000,A,3519.9043,N,13640.2632,E,0.11,99.16,270705,,*3F $GPGGA,045856.000,3519.9042,N,13640.2632,E,1,04,2.2,80.4,M,,,,0000*39 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $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 $GPRMC,045857.000,A,3519.9040,N,13640.2632,E,0.11,116.49,270705,,*02 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045858.000,A,3519.9039,N,13640.2632,E,0.11,115.53,270705,,*0B $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045859.000,A,3519.9038,N,13640.2632,E,0.10,107.70,270705,,*08 $GPGGA,045900.000,3519.9036,N,13640.2632,E,1,04,2.2,80.8,M,,,,0000*34 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045900.000,A,3519.9036,N,13640.2632,E,0.12,130.75,270705,,*08 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045901.000,A,3519.9035,N,13640.2632,E,0.11,121.44,270705,,*0B $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 $GPRMC,045902.000,A,3519.9034,N,13640.2633,E,0.13,137.85,270705,,*00 $GPGGA,045903.000,3519.9032,N,13640.2633,E,1,04,2.2,81.1,M,,,,0000*3A $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045903.000,A,3519.9032,N,13640.2633,E,0.15,142.32,270705,,*0F $GPGGA,045904.000,3519.9030,N,13640.2633,E,1,04,2.2,80.8,M,,,,0000*37 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045904.000,A,3519.9030,N,13640.2633,E,0.55,168.73,270705,,*03 $GPGGA,045905.000,3519.9028,N,13640.2633,E,1,04,2.2,80.7,M,,,,0000*30 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045905.000,A,3519.9028,N,13640.2633,E,0.11,51.58,270705,,*39 $GPGGA,045906.000,3519.9027,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 $GPRMC,045906.000,A,3519.9027,N,13640.2633,E,0.17,42.56,270705,,*3F $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 $GPRMC,045907.000,A,3519.9026,N,13640.2633,E,0.12,56.07,270705,,*3B $GPGGA,045908.000,3519.9026,N,13640.2633,E,1,04,2.2,80.8,M,,,,0000*3C $GPRMC,045908.000,A,3519.9026,N,13640.2633,E,0.38,14.44,270705,,*3D $GPGGA,045909.000,3519.9026,N,13640.2634,E,1,04,2.2,81.0,M,,,,0000*33 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045909.000,A,3519.9026,N,13640.2634,E,0.35,16.55,270705,,*34 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045910.000,A,3519.9026,N,13640.2634,E,0.18,28.96,270705,,*31 $GPGGA,045911.000,3519.9026,N,13640.2634,E,1,04,2.2,81.3,M,,,,0000*39 $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 $GPRMC,045912.000,A,3519.9026,N,13640.2634,E,0.36,13.64,270705,,*3A $GPGGA,045913.000,3519.9025,N,13640.2634,E,1,04,2.2,81.2,M,,,,0000*39 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045913.000,A,3519.9025,N,13640.2634,E,0.30,15.65,270705,,*39 $GPGGA,045914.000,3519.9024,N,13640.2635,E,1,04,2.2,80.8,M,,,,0000*35 $GPRMC,045914.000,A,3519.9024,N,13640.2635,E,0.30,160.36,270705,,*0B $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045915.000,A,3519.9021,N,13640.2635,E,0.34,165.82,270705,,*01 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $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 $GPRMC,045917.000,A,3519.9017,N,13640.2636,E,0.32,160.37,270705,,*08 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045918.000,A,3519.9017,N,13640.2636,E,0.21,29.38,270705,,*36 $GPGGA,045919.000,3519.9017,N,13640.2637,E,1,04,2.2,78.9,M,,,,0000*3C $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045919.000,A,3519.9017,N,13640.2637,E,0.37,18.86,270705,,*36 $GPGGA,045920.000,3519.9017,N,13640.2637,E,1,04,2.2,78.8,M,,,,0000*37 $GPRMC,045920.000,A,3519.9017,N,13640.2637,E,0.29,165.15,270705,,*02 $GPGGA,045921.000,3519.9015,N,13640.2637,E,1,04,2.2,78.5,M,,,,0000*39 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045921.000,A,3519.9015,N,13640.2637,E,1.17,164.92,270705,,*03 $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 $GPRMC,045922.000,A,3519.9007,N,13640.2636,E,3.35,194.25,270705,,*03 $GPGSA,A,2,,,,,,,,,,,,,50.0,50.0,50.0*06 $GPRMC,045923.000,A,3519.8998,N,13640.2633,E,3.35,194.25,270705,,*09 gpsd-3.15/test/daemon/iTrek.log.chk0000664000175000017500000004127012467340617015332 0ustar esresr$GPRMC,151605.053,V,,,,,,,260705,,*29 $GPRMC,151606.055,V,,,,,,,260705,,*2C $GPGSA,A,1,,,,*32 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C {"class":"TPV","mode":3,"epv":43.700} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C {"class":"TPV","mode":3,"epv":43.700} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C {"class":"TPV","mode":3,"epv":43.700} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C {"class":"TPV","mode":3,"epv":43.700} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C {"class":"TPV","mode":3,"epv":43.700} $GPRMC,045849.000,A,3519.9048,N,13640.2631,E,0.10,92.17,270705,,*31 {"class":"TPV","mode":2,"time":"2005-07-27T04:58:49.000Z","ept":0.005,"lat":35.331746667,"lon":136.671051667,"track":92.1700,"speed":0.051} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C {"class":"TPV","mode":3,"time":"2005-07-27T04:58:49.000Z","ept":0.005,"lat":35.331746667,"lon":136.671051667,"epv":43.700,"track":92.1700,"speed":0.051} $GPRMC,045850.000,A,3519.9047,N,13640.2631,E,0.11,99.12,270705,,*39 {"class":"TPV","mode":2,"time":"2005-07-27T04:58:50.000Z","ept":0.005,"lat":35.331745000,"lon":136.671051667,"track":99.1200,"speed":0.057} $GPGGA,045851.000,3519.9046,N,13640.2631,E,1,04,2.2,80.4,M,,,,0000*39 $GPRMC,045851.000,A,3519.9046,N,13640.2631,E,0.12,114.35,270705,,*0B {"class":"TPV","mode":3,"time":"2005-07-27T04:58:51.000Z","ept":0.005,"lat":35.331743333,"lon":136.671051667,"alt":80.400,"epv":43.700,"track":114.3500,"speed":0.062,"climb":0.000} $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","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}]} $GPRMC,045852.000,A,3519.9046,N,13640.2632,E,0.10,104.21,270705,,*0D {"class":"TPV","mode":2,"time":"2005-07-27T04:58:52.000Z","ept":0.005,"lat":35.331743333,"lon":136.671053333,"track":104.2100,"speed":0.051} $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 {"class":"TPV","mode":3,"time":"2005-07-27T04:58:53.000Z","ept":0.005,"lat":35.331741667,"lon":136.671053333,"alt":80.400,"epv":43.700,"track":97.5100,"speed":0.057,"climb":0.000} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045854.000,A,3519.9044,N,13640.2632,E,0.12,108.39,270705,,*0E {"class":"TPV","mode":2,"time":"2005-07-27T04:58:54.000Z","ept":0.005,"lat":35.331740000,"lon":136.671053333,"track":108.3900,"speed":0.062} $GPGGA,045855.000,3519.9043,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,045855.000,A,3519.9043,N,13640.2632,E,0.11,99.16,270705,,*3F {"class":"TPV","mode":3,"time":"2005-07-27T04:58:55.000Z","ept":0.005,"lat":35.331738333,"lon":136.671053333,"alt":80.400,"epv":43.700,"track":99.1600,"speed":0.057,"climb":0.000} $GPGGA,045856.000,3519.9042,N,13640.2632,E,1,04,2.2,80.4,M,,,,0000*39 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045856.000,A,3519.9042,N,13640.2632,E,0.11,115.12,270705,,*0C {"class":"TPV","mode":3,"time":"2005-07-27T04:58:56.000Z","ept":0.005,"lat":35.331736667,"lon":136.671053333,"alt":80.400,"epv":43.700,"track":115.1200,"speed":0.057,"climb":0.000,"epc":87.40} $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","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","mode":3,"time":"2005-07-27T04:58:57.000Z","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,"epc":87.40} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045858.000,A,3519.9039,N,13640.2632,E,0.11,115.53,270705,,*0B {"class":"TPV","mode":2,"time":"2005-07-27T04:58:58.000Z","ept":0.005,"lat":35.331731667,"lon":136.671053333,"epx":17.960,"epy":28.495,"track":115.5300,"speed":0.057,"eps":56.99} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045859.000,A,3519.9038,N,13640.2632,E,0.10,107.70,270705,,*08 {"class":"TPV","mode":2,"time":"2005-07-27T04:58:59.000Z","ept":0.005,"lat":35.331730000,"lon":136.671053333,"epx":17.960,"epy":28.495,"track":107.7000,"speed":0.051,"eps":56.99} $GPGGA,045900.000,3519.9036,N,13640.2632,E,1,04,2.2,80.8,M,,,,0000*34 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045900.000,A,3519.9036,N,13640.2632,E,0.12,130.75,270705,,*08 {"class":"TPV","mode":3,"time":"2005-07-27T04:59:00.000Z","ept":0.005,"lat":35.331726667,"lon":136.671053333,"alt":80.800,"epx":17.960,"epy":28.495,"epv":43.700,"track":130.7500,"speed":0.062,"climb":0.000,"eps":56.99} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045901.000,A,3519.9035,N,13640.2632,E,0.11,121.44,270705,,*0B {"class":"TPV","mode":2,"time":"2005-07-27T04:59:01.000Z","ept":0.005,"lat":35.331725000,"lon":136.671053333,"epx":17.960,"epy":28.495,"track":121.4400,"speed":0.057,"eps":56.99} $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","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","mode":3,"time":"2005-07-27T04:59:02.000Z","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,"eps":56.99} $GPGGA,045903.000,3519.9032,N,13640.2633,E,1,04,2.2,81.1,M,,,,0000*3A $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045903.000,A,3519.9032,N,13640.2633,E,0.15,142.32,270705,,*0F {"class":"TPV","mode":3,"time":"2005-07-27T04:59:03.000Z","ept":0.005,"lat":35.331720000,"lon":136.671055000,"alt":81.100,"epx":17.960,"epy":28.495,"epv":43.700,"track":142.3200,"speed":0.077,"climb":0.100,"eps":56.99,"epc":87.40} $GPGGA,045904.000,3519.9030,N,13640.2633,E,1,04,2.2,80.8,M,,,,0000*37 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045904.000,A,3519.9030,N,13640.2633,E,0.55,168.73,270705,,*03 {"class":"TPV","mode":3,"time":"2005-07-27T04:59:04.000Z","ept":0.005,"lat":35.331716667,"lon":136.671055000,"alt":80.800,"epx":17.960,"epy":28.495,"epv":43.700,"track":168.7300,"speed":0.283,"climb":-0.300,"eps":56.99,"epc":87.40} $GPGGA,045905.000,3519.9028,N,13640.2633,E,1,04,2.2,80.7,M,,,,0000*30 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045905.000,A,3519.9028,N,13640.2633,E,0.11,51.58,270705,,*39 {"class":"TPV","mode":3,"time":"2005-07-27T04:59:05.000Z","ept":0.005,"lat":35.331713333,"lon":136.671055000,"alt":80.700,"epx":17.960,"epy":28.495,"epv":43.700,"track":51.5800,"speed":0.057,"climb":-0.100,"eps":56.99,"epc":87.40} $GPGGA,045906.000,3519.9027,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 $GPRMC,045906.000,A,3519.9027,N,13640.2633,E,0.17,42.56,270705,,*3F {"class":"TPV","mode":3,"time":"2005-07-27T04:59:06.000Z","ept":0.005,"lat":35.331711667,"lon":136.671055000,"alt":80.600,"epx":17.960,"epy":28.495,"epv":43.700,"track":42.5600,"speed":0.087,"climb":-0.100,"eps":56.99,"epc":87.40} $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","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","mode":3,"time":"2005-07-27T04:59:07.000Z","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,"eps":56.99,"epc":87.40} $GPGGA,045908.000,3519.9026,N,13640.2633,E,1,04,2.2,80.8,M,,,,0000*3C $GPRMC,045908.000,A,3519.9026,N,13640.2633,E,0.38,14.44,270705,,*3D {"class":"TPV","mode":3,"time":"2005-07-27T04:59:08.000Z","ept":0.005,"lat":35.331710000,"lon":136.671055000,"alt":80.800,"epx":17.960,"epy":28.495,"epv":43.700,"track":14.4400,"speed":0.195,"climb":0.200,"eps":56.99,"epc":87.40} $GPGGA,045909.000,3519.9026,N,13640.2634,E,1,04,2.2,81.0,M,,,,0000*33 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045909.000,A,3519.9026,N,13640.2634,E,0.35,16.55,270705,,*34 {"class":"TPV","mode":3,"time":"2005-07-27T04:59:09.000Z","ept":0.005,"lat":35.331710000,"lon":136.671056667,"alt":81.000,"epx":17.960,"epy":28.495,"epv":43.700,"track":16.5500,"speed":0.180,"climb":0.200,"eps":56.99,"epc":87.40} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045910.000,A,3519.9026,N,13640.2634,E,0.18,28.96,270705,,*31 {"class":"TPV","mode":2,"time":"2005-07-27T04:59:10.000Z","ept":0.005,"lat":35.331710000,"lon":136.671056667,"epx":17.960,"epy":28.495,"track":28.9600,"speed":0.093,"eps":56.99} $GPGGA,045911.000,3519.9026,N,13640.2634,E,1,04,2.2,81.3,M,,,,0000*39 $GPRMC,045911.000,A,3519.9026,N,13640.2634,E,0.42,13.19,270705,,*30 {"class":"TPV","mode":3,"time":"2005-07-27T04:59:11.000Z","ept":0.005,"lat":35.331710000,"lon":136.671056667,"alt":81.300,"epx":17.960,"epy":28.495,"epv":43.700,"track":13.1900,"speed":0.216,"climb":0.000,"eps":56.99} $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","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","mode":3,"time":"2005-07-27T04:59:12.000Z","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,"eps":56.99,"epc":87.40} $GPGGA,045913.000,3519.9025,N,13640.2634,E,1,04,2.2,81.2,M,,,,0000*39 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045913.000,A,3519.9025,N,13640.2634,E,0.30,15.65,270705,,*39 {"class":"TPV","mode":3,"time":"2005-07-27T04:59:13.000Z","ept":0.005,"lat":35.331708333,"lon":136.671056667,"alt":81.200,"epx":17.960,"epy":28.495,"epv":43.700,"track":15.6500,"speed":0.154,"climb":-0.100,"eps":56.99,"epc":87.40} $GPGGA,045914.000,3519.9024,N,13640.2635,E,1,04,2.2,80.8,M,,,,0000*35 $GPRMC,045914.000,A,3519.9024,N,13640.2635,E,0.30,160.36,270705,,*0B {"class":"TPV","mode":3,"time":"2005-07-27T04:59:14.000Z","ept":0.005,"lat":35.331706667,"lon":136.671058333,"alt":80.800,"epx":17.960,"epy":28.495,"epv":43.700,"track":160.3600,"speed":0.154,"climb":-0.400,"eps":56.99,"epc":87.40} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045915.000,A,3519.9021,N,13640.2635,E,0.34,165.82,270705,,*01 {"class":"TPV","mode":2,"time":"2005-07-27T04:59:15.000Z","ept":0.005,"lat":35.331701667,"lon":136.671058333,"epx":17.960,"epy":28.495,"track":165.8200,"speed":0.175,"eps":56.99} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045916.000,A,3519.9019,N,13640.2636,E,0.31,160.03,270705,,*03 {"class":"TPV","mode":2,"time":"2005-07-27T04:59:16.000Z","ept":0.005,"lat":35.331698333,"lon":136.671060000,"epx":17.960,"epy":28.495,"track":160.0300,"speed":0.159,"eps":56.99} $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","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","mode":3,"time":"2005-07-27T04:59:17.000Z","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,"eps":56.99} $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045918.000,A,3519.9017,N,13640.2636,E,0.21,29.38,270705,,*36 {"class":"TPV","mode":2,"time":"2005-07-27T04:59:18.000Z","ept":0.005,"lat":35.331695000,"lon":136.671060000,"epx":17.960,"epy":28.495,"track":29.3800,"speed":0.108,"eps":56.99} $GPGGA,045919.000,3519.9017,N,13640.2637,E,1,04,2.2,78.9,M,,,,0000*3C $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045919.000,A,3519.9017,N,13640.2637,E,0.37,18.86,270705,,*36 {"class":"TPV","mode":3,"time":"2005-07-27T04:59:19.000Z","ept":0.005,"lat":35.331695000,"lon":136.671061667,"alt":78.900,"epx":17.960,"epy":28.495,"epv":43.700,"track":18.8600,"speed":0.190,"climb":0.000,"eps":56.99} $GPGGA,045920.000,3519.9017,N,13640.2637,E,1,04,2.2,78.8,M,,,,0000*37 $GPRMC,045920.000,A,3519.9017,N,13640.2637,E,0.29,165.15,270705,,*02 {"class":"TPV","mode":3,"time":"2005-07-27T04:59:20.000Z","ept":0.005,"lat":35.331695000,"lon":136.671061667,"alt":78.800,"epx":17.960,"epy":28.495,"epv":43.700,"track":165.1500,"speed":0.149,"climb":-0.100,"eps":56.99,"epc":87.40} $GPGGA,045921.000,3519.9015,N,13640.2637,E,1,04,2.2,78.5,M,,,,0000*39 $GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C $GPRMC,045921.000,A,3519.9015,N,13640.2637,E,1.17,164.92,270705,,*03 {"class":"TPV","mode":3,"time":"2005-07-27T04:59:21.000Z","ept":0.005,"lat":35.331691667,"lon":136.671061667,"alt":78.500,"epx":17.960,"epy":28.495,"epv":43.700,"track":164.9200,"speed":0.602,"climb":-0.300,"eps":56.99,"epc":87.40} $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","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","mode":3,"time":"2005-07-27T04:59:22.000Z","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,"eps":56.99,"epc":87.40} $GPGSA,A,2,,,,,,,,,,,,,50.0,50.0,50.0*06 $GPRMC,045923.000,A,3519.8998,N,13640.2633,E,3.35,194.25,270705,,*09 {"class":"TPV","mode":2,"time":"2005-07-27T04:59:23.000Z","ept":0.005,"lat":35.331663333,"lon":136.671055000,"epx":17.960,"epy":28.495,"track":194.2500,"speed":1.723,"eps":56.99} gpsd-3.15/test/daemon/italk-binary.log0000664000175000017500000000674512467342657016114 0ustar esresr# Name: Fastrax iTalk chipset (protocol, version 3) in binary mode # Submitter: Chris Kuethe # Date: 2009-08-09 # Location: unknown # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # „A%¿¢uÀEwû¬×$Àðê  '¥ðû ¬×$ Ð/À›(:bj#Ô€&£ £ :bj#Þ>b }ÑŠJ@UU Ê>FØ$Àðê MÉŒôãFØ$ L.&Èw†#uwŒŒŒw†#Ë0>ˆˆô x ‘·¯ŒIlJ Œèû>GNS~ªøL þÿˆˆÛ¥&ÿ÷€ O RNÐO” ñÿˆˆ<àûw€|áV+bÈB è4 "ÿ÷€UððZ Ÿ V úÿˆˆvø×þ> gpsd-3.15/test/daemon/italk-binary.log.chk0000664000175000017500000000710012467342657016642 0ustar esresr$GPZDA,221259.14,06,07,2009,00,00*66 $GPGGA,221259,5333.7947,N,11326.3773,W,1,05,,661.09,M,-19.872,M,,*68 $GPRMC,221259,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*34 $GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 {"class":"TPV","mode":3,"time":"2009-07-06T22:12:59.144Z","ept":0.005,"lat":53.563244879,"lon":-113.439622385,"alt":661.089,"track":0.0000,"speed":0.000,"climb":0.000} $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","time":"2009-07-06T22:12:59.322Z","xdop":2.46,"ydop":6.23,"vdop":14.67,"tdop":9.92,"hdop":6.70,"gdop":18.94,"pdop":16.13,"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}]} $GPZDA,221300.14,06,07,2009,00,00*6B $GPGGA,221300,5333.7947,N,11326.3773,W,1,05,6.70,661.09,M,-19.872,M,,*7A $GPRMC,221300,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*39 $GPGSA,A,3,10,19,8,13,25,,,,,,,,16.1,6.7,14.7*03 $GPGBS,221300,36.95,M,93.52,M,337.46,M*3D {"class":"TPV","mode":3,"time":"2009-07-06T22:13:00.145Z","ept":0.005,"lat":53.563244879,"lon":-113.439622385,"alt":661.089,"epx":36.952,"epy":93.515,"epv":337.463,"track":0.0000,"speed":0.000,"climb":0.000,"eps":186.84,"epc":674.25} $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","time":"2009-07-06T22:13:00.326Z","xdop":2.46,"ydop":6.23,"vdop":14.67,"tdop":9.92,"hdop":6.70,"gdop":18.94,"pdop":16.13,"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}]} $GPZDA,221301.15,06,07,2009,00,00*6B $GPGGA,221301,5333.7947,N,11326.3773,W,1,05,6.70,661.09,M,-19.872,M,,*7B $GPRMC,221301,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*38 $GPGSA,A,3,10,28,25,6,25,,,,,,,,16.1,6.7,14.7*0A $GPGBS,221301,36.95,M,93.52,M,337.46,M*3C {"class":"TPV","mode":3,"time":"2009-07-06T22:13:01.146Z","ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"epx":36.952,"epy":93.515,"epv":337.463,"track":0.0000,"speed":0.000,"climb":0.000,"eps":186.84,"epc":674.25} $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","time":"2009-07-06T22:13:01.334Z","xdop":2.46,"ydop":6.23,"vdop":14.67,"tdop":9.92,"hdop":6.70,"gdop":18.94,"pdop":16.13,"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}]} gpsd-3.15/test/daemon/magellan-ec10.log0000664000175000017500000000652412461156335016015 0ustar esresr# Name: Magellan EC-10X # Submitter: "Gary E. Miller" # Date: 2005-06-09 # Time: 20:52 UTC # Location: Bend, OR 44N121W # # Roof-mounted stationary GPS. This is about as dumb as NMEA gets. # This log records a transition from no fix to 2D fix and then no fix. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205150.00,V,,,,,,,,,,,V*4a $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205152.00,V,,,,,,,,,,,V*48 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205154.00,V,,,,,,,,,,,V*4e $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205156.00,V,,,,,,,,,,,V*4c $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205158.00,V,,,,,,,,,,,V*42 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205200.00,V,,,,,,,,,,,V*4c $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205202.00,V,,,,,,,,,,,V*4e $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205204.00,V,,,,,,,,,,,V*48 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205206.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*49 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205208.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*47 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205210.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4e $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205212.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4c $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205214.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4a $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205216.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*48 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205218.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*46 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205220.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4d $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205222.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4f $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205224.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*49 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205226.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4b $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205228.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*45 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205230.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4c $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205232.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4e $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205234.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*48 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205236.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4a $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205238.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*44 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205240.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4b $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205242.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*49 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205244.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4f $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205246.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4d $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205248.00,V,,,,,,,,,,,V*40 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205250.00,V,,,,,,,,,,,V*49 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205252.00,V,,,,,,,,,,,V*4b $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205254.00,V,,,,,,,,,,,V*4d $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205256.00,V,,,,,,,,,,,V*4f $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205258.00,V,,,,,,,,,,,V*41 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205300.00,V,,,,,,,,,,,V*4d $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205302.00,V,,,,,,,,,,,V*4f $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205304.00,V,,,,,,,,,,,V*49 gpsd-3.15/test/daemon/magellan-ec10.log.chk0000664000175000017500000001350712467340617016564 0ustar esresr$GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205150.00,V,,,,,,,,,,,V*4a $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205152.00,V,,,,,,,,,,,V*48 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205154.00,V,,,,,,,,,,,V*4e $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205156.00,V,,,,,,,,,,,V*4c $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205158.00,V,,,,,,,,,,,V*42 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205200.00,V,,,,,,,,,,,V*4c $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205202.00,V,,,,,,,,,,,V*4e $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205204.00,V,,,,,,,,,,,V*48 $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205206.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*49 {"class":"TPV","mode":2,"time":"2005-06-09T20:52:06.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205208.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*47 {"class":"TPV","mode":2,"time":"2005-06-09T20:52:08.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205210.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4e {"class":"TPV","mode":2,"time":"2005-06-09T20:52:10.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205212.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4c {"class":"TPV","mode":2,"time":"2005-06-09T20:52:12.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205214.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4a {"class":"TPV","mode":2,"time":"2005-06-09T20:52:14.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205216.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*48 {"class":"TPV","mode":2,"time":"2005-06-09T20:52:16.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205218.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*46 {"class":"TPV","mode":2,"time":"2005-06-09T20:52:18.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205220.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4d {"class":"TPV","mode":2,"time":"2005-06-09T20:52:20.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205222.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4f {"class":"TPV","mode":2,"time":"2005-06-09T20:52:22.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205224.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*49 {"class":"TPV","mode":2,"time":"2005-06-09T20:52:24.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205226.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4b {"class":"TPV","mode":2,"time":"2005-06-09T20:52:26.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205228.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*45 {"class":"TPV","mode":2,"time":"2005-06-09T20:52:28.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205230.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4c {"class":"TPV","mode":2,"time":"2005-06-09T20:52:30.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205232.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4e {"class":"TPV","mode":2,"time":"2005-06-09T20:52:32.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205234.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*48 {"class":"TPV","mode":2,"time":"2005-06-09T20:52:34.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205236.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4a {"class":"TPV","mode":2,"time":"2005-06-09T20:52:36.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205238.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*44 {"class":"TPV","mode":2,"time":"2005-06-09T20:52:38.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205240.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4b {"class":"TPV","mode":2,"time":"2005-06-09T20:52:40.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205242.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*49 {"class":"TPV","mode":2,"time":"2005-06-09T20:52:42.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205244.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4f {"class":"TPV","mode":2,"time":"2005-06-09T20:52:44.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205246.00,A,4405.556,N,12118.398,W,000.0,000.0,090605,0.0,E*4d {"class":"TPV","mode":2,"time":"2005-06-09T20:52:46.000Z","ept":0.005,"lat":44.092600000,"lon":-121.306633333,"track":0.0000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $GPRMC,205248.00,V,,,,,,,,,,,V*40 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205250.00,V,,,,,,,,,,,V*49 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205252.00,V,,,,,,,,,,,V*4b $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205254.00,V,,,,,,,,,,,V*4d $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205256.00,V,,,,,,,,,,,V*4f $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205258.00,V,,,,,,,,,,,V*41 $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205300.00,V,,,,,,,,,,,V*4d $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205302.00,V,,,,,,,,,,,V*4f $GPRMB,V,,,,,,,,,,,,V*66 $GPRMC,205304.00,V,,,,,,,,,,,V*49 gpsd-3.15/test/daemon/magellan315.log0000664000175000017500000000276312461156335015521 0ustar esresr# Name: Magellan 315 # Submitter: Ángel Marqués Mateu # Date: 2005-03-12 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGLL,3908.8199,N,00023.0832,W,120824.758,A*22 $GPGGA,120824.76,3908.8199,N,00023.0832,W,1,06,2.1,00176,M,,,,*39 $GPRMC,120824.76,A,3908.8199,N,00023.0832,W,00.0,000.0,130305,01.,W*62 $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 $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 $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 $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 $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 gpsd-3.15/test/daemon/magellan315.log.chk0000664000175000017500000001022712467340617016263 0ustar esresr$GPGLL,3908.8199,N,00023.0832,W,120824.758,A*22 {"class":"TPV","mode":2,"lat":39.146998333,"lon":-0.384720000} $GPGGA,120824.76,3908.8199,N,00023.0832,W,1,06,2.1,00176,M,,,,*39 {"class":"TPV","mode":3,"lat":39.146998333,"lon":-0.384720000,"alt":176.000} $GPRMC,120824.76,A,3908.8199,N,00023.0832,W,00.0,000.0,130305,01.,W*62 {"class":"TPV","mode":3,"time":"2005-03-13T12:08:24.760Z","ept":0.005,"lat":39.146998333,"lon":-0.384720000,"alt":176.000,"track":0.0000,"speed":0.000} $GPGSA,A,3,19,15,03,18,22,11,,,,,,,3.5,2.1,2.7*34 {"class":"TPV","mode":3,"time":"2005-03-13T12:08:24.760Z","ept":0.005,"lat":39.146998333,"lon":-0.384720000,"alt":176.000,"epv":62.100,"track":0.0000,"speed":0.000,"climb":0.000} $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","xdop":0.90,"ydop":2.45,"vdop":2.70,"tdop":1.99,"hdop":2.10,"gdop":4.01,"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","mode":3,"time":"2005-03-13T12:08:27.520Z","ept":0.005,"lat":39.147000000,"lon":-0.384720000,"alt":176.000,"epx":13.523,"epy":36.714,"epv":62.100,"track":0.0000,"speed":0.000,"climb":0.000,"eps":26.58} $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","xdop":0.90,"ydop":2.45,"vdop":2.70,"tdop":1.99,"hdop":2.10,"gdop":4.01,"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 {"class":"TPV","mode":3,"time":"2005-03-13T12:08:29.500Z","ept":0.005,"lat":39.147001667,"lon":-0.384720000,"alt":176.000,"epx":13.523,"epy":36.714,"epv":62.100,"track":0.0000,"speed":0.000,"climb":0.000,"eps":37.08} $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","xdop":0.90,"ydop":2.45,"vdop":2.70,"tdop":1.99,"hdop":2.10,"gdop":4.01,"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}]} gpsd-3.15/test/daemon/motorola-t805.log0000664000175000017500000000665412461156335016045 0ustar esresr# Name: Motorola T805 # Chipset: SiRF III f # Pause-noted: Y # Well-behaved: Y # Submitter: "Olivier Lahaye"=20 # Date: 2007-12-18 # Location: Nozay, 48.66564N2.24812E # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # Lines up to but not including the first GPGLL are # `cat /dev/ttyACM0` at startup=20 # Following lines are # `cat /dev/ttyACM0` stationary $GPGGA,212607.891,,,,,0,00,,,M,0.0,M,,0000*56 $GPRMC,212607.891,V,,,,,,,181207,0,N*5C $GPGGA,212608.879,,,,,0,00,,,M,0.0,M,,0000*5F $GPRMC,212608.879,V,,,,,,,181207,0,N*55 $GPGGA,212609.879,,,,,0,00,,,M,0.0,M,,0000*5E $GPRMC,212609.879,V,,,,,,,181207,0,N*54 $GPGGA,212610.879,,,,,0,00,,,M,0.0,M,,0000*56 $GPRMC,212610.879,V,,,,,,,181207,0,N*5C $GPGGA,212611.879,,,,,0,00,,,M,0.0,M,,0000*57 $GPRMC,212611.879,V,,,,,,,181207,0,N*5D $GPGGA,212612.879,,,,,0,00,,,M,0.0,M,,0000*54 $GPRMC,212612.879,V,,,,,,,181207,0,N*5E $GPGGA,212613.879,,,,,0,00,,,M,0.0,M,,0000*55 $GPRMC,212613.879,V,,,,,,,181207,0,N*5F $GPGGA,212614.879,4839.9488,N,00214.8863,E,1,04,2.2,133.1,M,47.3,M,,0000*55 $GPRMC,212614.879,A,4839.9488,N,00214.8863,E,0.56,344.41,181207,0,A*77 $GPGGA,212615.879,4839.9396,N,00214.8909,E,1,04,2.2,140.3,M,47.3,M,,0000*57 $GPRMC,212615.879,A,4839.9396,N,00214.8909,E,0.78,237.93,181207,0,A*75 $GPGGA,212617.000,4839.9404,N,00214.9022,E,1,04,2.2,158.4,M,47.3,M,,0000*50 $GPRMC,212617.000,A,4839.9404,N,00214.9022,E,1.25,21.04,181207,0,A*4E $GPGGA,212618.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*5F $GPRMC,212618.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*69 $GPGGA,212619.000,,,,,0,00,50.0,,M,0.0,M,,0000*42 $GPRMC,212619.000,V,,,,,,,181207,0,N*53 $GPGGA,212620.000,,,,,0,00,50.0,,M,0.0,M,,0000*48 $GPRMC,212620.000,V,,,,,,,181207,0,N*59 $GPGGA,212621.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*55 $GPRMC,212621.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*63 $GPGGA,212622.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*56 $GPRMC,212622.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*60 $GPGGA,212623.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*57 $GPRMC,212623.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*61 $GPGGA,212624.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*50 $GPRMC,212624.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*66 $GPGGA,212625.000,4839.9411,N,00214.9065,E,1,03,3.1,168.0,M,47.3,M,,0000*54 $GPRMC,212625.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*67 $GPGGA,212626.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*52 $GPRMC,212626.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*64 $GPGGA,212627.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*53 $GPRMC,212627.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*65 $GPGGA,212628.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*5C $GPRMC,212628.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*6A $GPGGA,212629.000,4839.9411,N,00214.9065,E,1,03,3.1,168.0,M,47.3,M,,0000*58 $GPRMC,212629.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*6B $GPGGA,212630.000,4839.9411,N,00214.9065,E,1,03,3.1,168.0,M,47.3,M,,0000*50 $GPRMC,212630.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*63 $GPGGA,212631.000,4839.9411,N,00214.9065,E,1,03,3.1,168.0,M,47.3,M,,0000*51 $GPRMC,212631.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*62 $GPGGA,212632.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*57 $GPRMC,212632.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*61 gpsd-3.15/test/daemon/motorola-t805.log.chk0000664000175000017500000001322412467340617016604 0ustar esresr$GPGGA,212607.891,,,,,0,00,,,M,0.0,M,,0000*56 $GPRMC,212607.891,V,,,,,,,181207,0,N*5C $GPGGA,212608.879,,,,,0,00,,,M,0.0,M,,0000*5F $GPRMC,212608.879,V,,,,,,,181207,0,N*55 $GPGGA,212609.879,,,,,0,00,,,M,0.0,M,,0000*5E $GPRMC,212609.879,V,,,,,,,181207,0,N*54 $GPGGA,212610.879,,,,,0,00,,,M,0.0,M,,0000*56 $GPRMC,212610.879,V,,,,,,,181207,0,N*5C $GPGGA,212611.879,,,,,0,00,,,M,0.0,M,,0000*57 $GPRMC,212611.879,V,,,,,,,181207,0,N*5D $GPGGA,212612.879,,,,,0,00,,,M,0.0,M,,0000*54 $GPRMC,212612.879,V,,,,,,,181207,0,N*5E $GPGGA,212613.879,,,,,0,00,,,M,0.0,M,,0000*55 $GPRMC,212613.879,V,,,,,,,181207,0,N*5F $GPGGA,212614.879,4839.9488,N,00214.8863,E,1,04,2.2,133.1,M,47.3,M,,0000*55 {"class":"TPV","mode":3,"lat":48.665813333,"lon":2.248105000,"alt":133.100} $GPRMC,212614.879,A,4839.9488,N,00214.8863,E,0.56,344.41,181207,0,A*77 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:14.879Z","ept":0.005,"lat":48.665813333,"lon":2.248105000,"alt":133.100,"track":344.4100,"speed":0.288} $GPGGA,212615.879,4839.9396,N,00214.8909,E,1,04,2.2,140.3,M,47.3,M,,0000*57 $GPRMC,212615.879,A,4839.9396,N,00214.8909,E,0.78,237.93,181207,0,A*75 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:15.879Z","ept":0.005,"lat":48.665660000,"lon":2.248181667,"alt":140.300,"track":237.9300,"speed":0.401,"climb":7.200} $GPGGA,212617.000,4839.9404,N,00214.9022,E,1,04,2.2,158.4,M,47.3,M,,0000*50 $GPRMC,212617.000,A,4839.9404,N,00214.9022,E,1.25,21.04,181207,0,A*4E {"class":"TPV","mode":3,"time":"2007-12-18T21:26:17.000Z","ept":0.005,"lat":48.665673333,"lon":2.248370000,"alt":158.400,"track":21.0400,"speed":0.643,"climb":16.146} $GPGGA,212618.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*5F $GPRMC,212618.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*69 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:18.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":9.600} $GPGGA,212619.000,,,,,0,00,50.0,,M,0.0,M,,0000*42 $GPRMC,212619.000,V,,,,,,,181207,0,N*53 $GPGGA,212620.000,,,,,0,00,50.0,,M,0.0,M,,0000*48 $GPRMC,212620.000,V,,,,,,,181207,0,N*59 $GPGGA,212621.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*55 $GPRMC,212621.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*63 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:21.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212622.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*56 $GPRMC,212622.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*60 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:22.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212623.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*57 $GPRMC,212623.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*61 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:23.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212624.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*50 $GPRMC,212624.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*66 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:24.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212625.000,4839.9411,N,00214.9065,E,1,03,3.1,168.0,M,47.3,M,,0000*54 $GPRMC,212625.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*67 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:25.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212626.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*52 $GPRMC,212626.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*64 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:26.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212627.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*53 $GPRMC,212627.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*65 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:27.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212628.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*5C $GPRMC,212628.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*6A {"class":"TPV","mode":3,"time":"2007-12-18T21:26:28.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212629.000,4839.9411,N,00214.9065,E,1,03,3.1,168.0,M,47.3,M,,0000*58 $GPRMC,212629.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*6B {"class":"TPV","mode":3,"time":"2007-12-18T21:26:29.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212630.000,4839.9411,N,00214.9065,E,1,03,3.1,168.0,M,47.3,M,,0000*50 $GPRMC,212630.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*63 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:30.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212631.000,4839.9411,N,00214.9065,E,1,03,3.1,168.0,M,47.3,M,,0000*51 $GPRMC,212631.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*62 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:31.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} $GPGGA,212632.000,4839.9411,N,00214.9065,E,1,04,2.2,168.0,M,47.3,M,,0000*57 $GPRMC,212632.000,A,4839.9411,N,00214.9065,E,0.00,,181207,0,A*61 {"class":"TPV","mode":3,"time":"2007-12-18T21:26:32.000Z","ept":0.005,"lat":48.665685000,"lon":2.248441667,"alt":168.000,"track":0.0000,"speed":0.000,"climb":0.000} gpsd-3.15/test/daemon/mr-350p.log0000664000175000017500000000467412467342657014630 0ustar esresr# Name: GlobalSat MR-350p # Chipset = SiRF-3 # Firmware = unknown # Date = 2012-07-04 # Submitter = Tony Hain # Location = 4744.6977N,12206.7277W # Notes: Mast mounted for stable NTP reference. $GPGGA,051133.000,4744.6977,N,12206.7277,W,1,05,1.9,136.4,M,-17.1,M,18.8,0000*7D $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051134.000,04,07,2012,,*56 $GPGGA,051134.000,4744.6980,N,12206.7275,W,1,05,1.9,135.4,M,-17.1,M,18.8,0000*73 $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051135.000,04,07,2012,,*57 $GPGGA,051135.000,4744.6981,N,12206.7273,W,1,05,1.9,134.7,M,-17.1,M,18.8,0000*77 $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051136.000,04,07,2012,,*54 $GPGGA,051136.000,4744.6980,N,12206.7271,W,1,05,1.9,134.2,M,-17.1,M,18.8,0000*72 $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051137.000,04,07,2012,,*55 $GPGGA,051137.000,4744.6980,N,12206.7274,W,1,05,1.9,134.7,M,-17.1,M,18.8,0000*73 $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051138.000,04,07,2012,,*5A $GPGGA,051138.000,4744.6981,N,12206.7278,W,1,05,1.9,135.6,M,-17.1,M,18.8,0000*71 $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051139.000,04,07,2012,,*5B $GPGGA,051139.000,4744.6981,N,12206.7281,W,1,05,1.9,136.3,M,-17.1,M,18.8,0000*70 $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051140.000,04,07,2012,,*55 $GPGGA,051140.000,4744.6982,N,12206.7285,W,1,05,1.9,137.1,M,-17.1,M,18.8,0000*7A $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051141.000,04,07,2012,,*54 $GPGGA,051141.000,4744.6982,N,12206.7287,W,1,05,1.9,137.7,M,-17.1,M,18.8,0000*7F $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051142.000,04,07,2012,,*57 $GPGGA,051142.000,4744.6982,N,12206.7289,W,1,05,1.9,138.0,M,-17.1,M,18.8,0000*7A $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051143.000,04,07,2012,,*56 $GPGGA,051143.000,4744.6982,N,12206.7290,W,1,05,1.9,138.2,M,-17.1,M,18.8,0000*71 $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051144.000,04,07,2012,,*51 $GPGGA,051144.000,4744.6982,N,12206.7292,W,1,05,1.9,138.8,M,-17.1,M,18.8,0000*7E $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051145.000,04,07,2012,,*50 $GPGGA,051145.000,4744.6983,N,12206.7293,W,1,05,1.9,138.8,M,-17.1,M,18.8,0000*7F $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051146.000,04,07,2012,,*53 $GPGGA,051146.000,4744.6984,N,12206.7294,W,1,05,1.9,138.8,M,-17.1,M,18.8,0000*7C $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051147.000,04,07,2012,,*52 gpsd-3.15/test/daemon/mr-350p.log.chk0000664000175000017500000001102212467342657015355 0ustar esresr$GPGGA,051133.000,4744.6977,N,12206.7277,W,1,05,1.9,136.4,M,-17.1,M,18.8,0000*7D {"class":"TPV","mode":3,"lat":47.744961667,"lon":-122.112128333,"alt":136.400} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 {"class":"TPV","mode":3,"lat":47.744961667,"lon":-122.112128333,"alt":136.400,"epv":41.400} $GPZDA,051134.000,04,07,2012,,*56 $GPGGA,051134.000,4744.6980,N,12206.7275,W,1,05,1.9,135.4,M,-17.1,M,18.8,0000*73 {"class":"TPV","mode":3,"time":"2012-07-04T05:11:34.000Z","ept":0.005,"lat":47.744966667,"lon":-122.112125000,"alt":135.400,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051135.000,04,07,2012,,*57 $GPGGA,051135.000,4744.6981,N,12206.7273,W,1,05,1.9,134.7,M,-17.1,M,18.8,0000*77 {"class":"TPV","mode":3,"time":"2012-07-04T05:11:35.000Z","ept":0.005,"lat":47.744968333,"lon":-122.112121667,"alt":134.700,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051136.000,04,07,2012,,*54 $GPGGA,051136.000,4744.6980,N,12206.7271,W,1,05,1.9,134.2,M,-17.1,M,18.8,0000*72 {"class":"TPV","mode":3,"time":"2012-07-04T05:11:36.000Z","ept":0.005,"lat":47.744966667,"lon":-122.112118333,"alt":134.200,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051137.000,04,07,2012,,*55 $GPGGA,051137.000,4744.6980,N,12206.7274,W,1,05,1.9,134.7,M,-17.1,M,18.8,0000*73 {"class":"TPV","mode":3,"time":"2012-07-04T05:11:37.000Z","ept":0.005,"lat":47.744966667,"lon":-122.112123333,"alt":134.700,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051138.000,04,07,2012,,*5A $GPGGA,051138.000,4744.6981,N,12206.7278,W,1,05,1.9,135.6,M,-17.1,M,18.8,0000*71 {"class":"TPV","mode":3,"time":"2012-07-04T05:11:38.000Z","ept":0.005,"lat":47.744968333,"lon":-122.112130000,"alt":135.600,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051139.000,04,07,2012,,*5B $GPGGA,051139.000,4744.6981,N,12206.7281,W,1,05,1.9,136.3,M,-17.1,M,18.8,0000*70 {"class":"TPV","mode":3,"time":"2012-07-04T05:11:39.000Z","ept":0.005,"lat":47.744968333,"lon":-122.112135000,"alt":136.300,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051140.000,04,07,2012,,*55 $GPGGA,051140.000,4744.6982,N,12206.7285,W,1,05,1.9,137.1,M,-17.1,M,18.8,0000*7A {"class":"TPV","mode":3,"time":"2012-07-04T05:11:40.000Z","ept":0.005,"lat":47.744970000,"lon":-122.112141667,"alt":137.100,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051141.000,04,07,2012,,*54 $GPGGA,051141.000,4744.6982,N,12206.7287,W,1,05,1.9,137.7,M,-17.1,M,18.8,0000*7F {"class":"TPV","mode":3,"time":"2012-07-04T05:11:41.000Z","ept":0.005,"lat":47.744970000,"lon":-122.112145000,"alt":137.700,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051142.000,04,07,2012,,*57 $GPGGA,051142.000,4744.6982,N,12206.7289,W,1,05,1.9,138.0,M,-17.1,M,18.8,0000*7A {"class":"TPV","mode":3,"time":"2012-07-04T05:11:42.000Z","ept":0.005,"lat":47.744970000,"lon":-122.112148333,"alt":138.000,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051143.000,04,07,2012,,*56 $GPGGA,051143.000,4744.6982,N,12206.7290,W,1,05,1.9,138.2,M,-17.1,M,18.8,0000*71 {"class":"TPV","mode":3,"time":"2012-07-04T05:11:43.000Z","ept":0.005,"lat":47.744970000,"lon":-122.112150000,"alt":138.200,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051144.000,04,07,2012,,*51 $GPGGA,051144.000,4744.6982,N,12206.7292,W,1,05,1.9,138.8,M,-17.1,M,18.8,0000*7E {"class":"TPV","mode":3,"time":"2012-07-04T05:11:44.000Z","ept":0.005,"lat":47.744970000,"lon":-122.112153333,"alt":138.800,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051145.000,04,07,2012,,*50 $GPGGA,051145.000,4744.6983,N,12206.7293,W,1,05,1.9,138.8,M,-17.1,M,18.8,0000*7F {"class":"TPV","mode":3,"time":"2012-07-04T05:11:45.000Z","ept":0.005,"lat":47.744971667,"lon":-122.112155000,"alt":138.800,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051146.000,04,07,2012,,*53 $GPGGA,051146.000,4744.6984,N,12206.7294,W,1,05,1.9,138.8,M,-17.1,M,18.8,0000*7C {"class":"TPV","mode":3,"time":"2012-07-04T05:11:46.000Z","ept":0.005,"lat":47.744973333,"lon":-122.112156667,"alt":138.800,"epv":41.400,"speed":0.000,"climb":0.000} $GPGSA,A,3,12,25,21,29,30,,,,,,,,2.6,1.9,1.8*38 $GPZDA,051147.000,04,07,2012,,*52 gpsd-3.15/test/daemon/mt3339.log0000664000175000017500000002146612513107374014450 0ustar esresr# Name: Adafruit Ultimate GPS HAT # Chipset: MT3339 # Description: Raspberry Pi HAT # Submitter: Gary E. Miller # Date: 2015-04-13 # Location: Bend, Oregon USA, 44.04N, 121.18 W # $GPGGA,202640.000,4404.1306,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6C $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202640.000,A,4404.1306,N,12118.8515,W,0.03,225.97,130415,,,D*73 $GPZDA,202640.000,13,04,2015,,*54 $GPGGA,202641.000,4404.1305,N,12118.8515,W,2,11,0.83,1127.7,M,-19.6,M,0000,0000*65 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,05,,1.33,0.83,1.03*09 $GPRMC,202641.000,A,4404.1305,N,12118.8515,W,0.01,201.71,130415,,,D*7D $GPZDA,202641.000,13,04,2015,,*55 $GPGGA,202642.000,4404.1305,N,12118.8515,W,2,11,0.83,1127.7,M,-19.6,M,0000,0000*66 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,05,,1.33,0.83,1.03*09 $GPRMC,202642.000,A,4404.1305,N,12118.8515,W,0.00,0.00,130415,,,D*7A $GPZDA,202642.000,13,04,2015,,*56 $GPGGA,202643.000,4404.1305,N,12118.8515,W,2,11,0.84,1127.7,M,-19.6,M,0000,0000*60 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,05,,1.33,0.84,1.03*0E $GPGSV,3,1,12,09,88,089,31,07,60,281,44,23,55,123,33,10,44,274,32*78 $GPGSV,3,2,12,16,39,051,29,30,30,262,20,20,23,308,30,27,23,093,34*7F $GPGSV,3,3,12,19,13,123,27,03,07,176,19,05,05,328,13,47,,,*41 $GPRMC,202643.000,A,4404.1305,N,12118.8515,W,0.02,171.47,130415,,,D*7D $GPZDA,202643.000,13,04,2015,,*57 $GPGGA,202644.000,4404.1305,N,12118.8515,W,2,11,0.84,1127.7,M,-19.6,M,0000,0000*67 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,05,,1.33,0.84,1.03*0E $GPRMC,202644.000,A,4404.1305,N,12118.8515,W,0.02,193.13,130415,,,D*77 $GPZDA,202644.000,13,04,2015,,*50 $GPGGA,202645.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6A $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202645.000,A,4404.1305,N,12118.8515,W,0.03,173.97,130415,,,D*75 $GPZDA,202645.000,13,04,2015,,*51 $GPGGA,202646.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*69 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202646.000,A,4404.1305,N,12118.8515,W,0.01,207.08,130415,,,D*72 $GPZDA,202646.000,13,04,2015,,*52 $GPGGA,202647.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202647.000,A,4404.1305,N,12118.8515,W,0.02,198.85,130415,,,D*70 $GPZDA,202647.000,13,04,2015,,*53 $GPGGA,202648.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*67 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,32,07,60,281,44,23,55,123,34,10,44,274,31*7F $GPGSV,3,2,12,16,39,051,31,30,30,262,23,20,24,308,30,27,23,093,34*72 $GPGSV,3,3,12,19,13,123,27,03,07,176,22,05,05,328,,49,,,*45 $GPRMC,202648.000,A,4404.1305,N,12118.8515,W,0.00,152.04,130415,,,D*72 $GPZDA,202648.000,13,04,2015,,*5C $GPGGA,202649.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*66 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202649.000,A,4404.1305,N,12118.8515,W,0.04,203.49,130415,,,D*79 $GPZDA,202649.000,13,04,2015,,*5D $GPGGA,202650.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6E $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202650.000,A,4404.1305,N,12118.8515,W,0.04,191.29,130415,,,D*7F $GPZDA,202650.000,13,04,2015,,*55 $GPGGA,202651.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6F $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202651.000,A,4404.1305,N,12118.8515,W,0.04,185.45,130415,,,D*71 $GPZDA,202651.000,13,04,2015,,*54 $GPGGA,202652.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6C $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202652.000,A,4404.1305,N,12118.8515,W,0.05,208.06,130415,,,D*72 $GPZDA,202652.000,13,04,2015,,*57 $GPGGA,202653.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6D $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,31,07,60,281,44,23,54,124,33,10,44,274,31*7D $GPGSV,3,2,12,16,39,051,31,30,30,262,24,20,24,308,31,27,23,093,34*74 $GPGSV,3,3,12,19,13,123,26,03,07,176,19,05,05,328,,49,,,*4C $GPRMC,202653.000,A,4404.1305,N,12118.8515,W,0.04,191.42,130415,,,D*71 $GPZDA,202653.000,13,04,2015,,*56 $GPGGA,202654.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6A $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202654.000,A,4404.1305,N,12118.8515,W,0.01,233.27,130415,,,D*7B $GPZDA,202654.000,13,04,2015,,*51 $GPGGA,202655.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6B $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202655.000,A,4404.1305,N,12118.8515,W,0.03,166.68,130415,,,D*70 $GPZDA,202655.000,13,04,2015,,*50 $GPGGA,202656.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202656.000,A,4404.1305,N,12118.8515,W,0.04,213.40,130415,,,D*7F $GPZDA,202656.000,13,04,2015,,*53 $GPGGA,202657.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202657.000,A,4404.1304,N,12118.8515,W,0.04,206.19,130415,,,D*77 $GPZDA,202657.000,13,04,2015,,*52 $GPGGA,202658.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*67 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,32,07,60,281,44,23,54,124,36,10,44,274,31*7B $GPGSV,3,2,12,16,39,051,31,46,37,146,,30,30,262,24,20,24,308,32*7B $GPGSV,3,3,12,27,23,092,33,19,13,123,26,03,07,176,22,05,05,328,*76 $GPRMC,202658.000,A,4404.1304,N,12118.8515,W,0.03,213.30,130415,,,D*70 $GPZDA,202658.000,13,04,2015,,*5D $GPGGA,202659.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*66 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202659.000,A,4404.1304,N,12118.8515,W,0.04,190.06,130415,,,D*7B $GPZDA,202659.000,13,04,2015,,*5C $GPGGA,202700.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6B $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202700.000,A,4404.1304,N,12118.8515,W,0.04,165.60,130415,,,D*7C $GPZDA,202700.000,13,04,2015,,*51 $GPGGA,202701.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6A $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202701.000,A,4404.1304,N,12118.8515,W,0.04,195.31,130415,,,D*76 $GPZDA,202701.000,13,04,2015,,*50 $GPGGA,202702.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*69 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202702.000,A,4404.1304,N,12118.8515,W,0.01,331.31,130415,,,D*7C $GPZDA,202702.000,13,04,2015,,*53 $GPGGA,202703.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,33,07,60,281,44,23,54,124,37,10,44,274,31*7B $GPGSV,3,2,12,16,39,051,30,46,37,146,,30,30,262,28,20,24,308,30*74 $GPGSV,3,3,12,27,23,092,31,19,13,123,27,03,07,176,20,05,05,328,*77 $GPRMC,202703.000,A,4404.1304,N,12118.8515,W,0.01,202.78,130415,,,D*71 $GPZDA,202703.000,13,04,2015,,*52 $GPGGA,202704.000,4404.1304,N,12118.8514,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6E $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202704.000,A,4404.1304,N,12118.8514,W,0.01,66.20,130415,,,D*4A $GPZDA,202704.000,13,04,2015,,*55 $GPGGA,202705.000,4404.1302,N,12118.8514,W,2,10,0.98,1127.6,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202705.000,A,4404.1302,N,12118.8514,W,0.03,115.82,130415,,,D*72 $GPZDA,202705.000,13,04,2015,,*54 $GPGGA,202706.000,4404.1302,N,12118.8513,W,2,10,0.98,1127.6,M,-19.6,M,0000,0000*6C $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202706.000,A,4404.1302,N,12118.8513,W,0.02,124.23,130415,,,D*7E $GPZDA,202706.000,13,04,2015,,*57 $GPGGA,202707.000,4404.1302,N,12118.8512,W,2,10,0.98,1127.6,M,-19.6,M,0000,0000*6C $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202707.000,A,4404.1302,N,12118.8512,W,0.01,66.30,130415,,,D*48 $GPZDA,202707.000,13,04,2015,,*56 $GPGGA,202708.000,4404.1298,N,12118.8513,W,2,10,0.98,1127.4,M,-19.6,M,0000,0000*62 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,33,07,60,281,44,23,54,124,38,10,44,274,31*74 $GPGSV,3,2,12,16,39,051,31,46,37,146,,30,30,262,29,20,24,308,30*74 $GPGSV,3,3,12,27,23,092,32,19,13,123,25,03,07,176,19,05,05,328,*7C $GPRMC,202708.000,A,4404.1298,N,12118.8513,W,0.06,182.52,130415,,,D*7C $GPZDA,202708.000,13,04,2015,,*59 $GPGGA,202709.000,4404.1297,N,12118.8513,W,2,10,0.98,1127.4,M,-19.6,M,0000,0000*6C $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202709.000,A,4404.1297,N,12118.8513,W,0.03,188.44,130415,,,D*7A $GPZDA,202709.000,13,04,2015,,*58 gpsd-3.15/test/daemon/mt3339.log.chk0000664000175000017500000004664012513107374015215 0ustar esresr$GPGGA,202640.000,4404.1306,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6C {"class":"TPV","mode":3,"lat":44.068843333,"lon":-121.314191667,"alt":1127.700} $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 {"class":"TPV","mode":3,"lat":44.068843333,"lon":-121.314191667,"alt":1127.700,"epv":7.533} $GPRMC,202640.000,A,4404.1306,N,12118.8515,W,0.03,225.97,130415,,,D*73 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:40.000Z","ept":0.005,"lat":44.068843333,"lon":-121.314191667,"alt":1127.700,"epv":7.533,"track":225.9700,"speed":0.015} $GPZDA,202640.000,13,04,2015,,*54 $GPGGA,202641.000,4404.1305,N,12118.8515,W,2,11,0.83,1127.7,M,-19.6,M,0000,0000*65 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,05,,1.33,0.83,1.03*09 $GPRMC,202641.000,A,4404.1305,N,12118.8515,W,0.01,201.71,130415,,,D*7D {"class":"TPV","mode":3,"time":"2015-04-13T20:26:41.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epv":7.533,"track":201.7100,"speed":0.005,"climb":0.000,"epc":15.07} $GPZDA,202641.000,13,04,2015,,*55 $GPGGA,202642.000,4404.1305,N,12118.8515,W,2,11,0.83,1127.7,M,-19.6,M,0000,0000*66 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,05,,1.33,0.83,1.03*09 $GPRMC,202642.000,A,4404.1305,N,12118.8515,W,0.00,0.00,130415,,,D*7A {"class":"TPV","mode":3,"time":"2015-04-13T20:26:42.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epv":5.923,"track":0.0000,"speed":0.000,"climb":0.000,"epc":13.46} $GPZDA,202642.000,13,04,2015,,*56 $GPGGA,202643.000,4404.1305,N,12118.8515,W,2,11,0.84,1127.7,M,-19.6,M,0000,0000*60 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,05,,1.33,0.84,1.03*0E $GPGSV,3,1,12,09,88,089,31,07,60,281,44,23,55,123,33,10,44,274,32*78 $GPGSV,3,2,12,16,39,051,29,30,30,262,20,20,23,308,30,27,23,093,34*7F $GPGSV,3,3,12,19,13,123,27,03,07,176,19,05,05,328,13,47,,,*41 {"class":"SKY","xdop":0.51,"ydop":0.66,"vdop":1.03,"tdop":0.61,"hdop":0.84,"gdop":1.46,"pdop":1.33,"satellites":[{"PRN":9,"el":88,"az":89,"ss":31,"used":true},{"PRN":7,"el":60,"az":281,"ss":44,"used":true},{"PRN":23,"el":55,"az":123,"ss":33,"used":true},{"PRN":10,"el":44,"az":274,"ss":32,"used":true},{"PRN":16,"el":39,"az":51,"ss":29,"used":true},{"PRN":30,"el":30,"az":262,"ss":20,"used":true},{"PRN":20,"el":23,"az":308,"ss":30,"used":true},{"PRN":27,"el":23,"az":93,"ss":34,"used":true},{"PRN":19,"el":13,"az":123,"ss":27,"used":true},{"PRN":3,"el":7,"az":176,"ss":19,"used":true},{"PRN":5,"el":5,"az":328,"ss":13,"used":true},{"PRN":134,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,202643.000,A,4404.1305,N,12118.8515,W,0.02,171.47,130415,,,D*7D {"class":"TPV","mode":3,"time":"2015-04-13T20:26:43.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":5.923,"track":171.4700,"speed":0.010,"climb":0.000,"epc":11.85} $GPZDA,202643.000,13,04,2015,,*57 $GPGGA,202644.000,4404.1305,N,12118.8515,W,2,11,0.84,1127.7,M,-19.6,M,0000,0000*67 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,05,,1.33,0.84,1.03*0E $GPRMC,202644.000,A,4404.1305,N,12118.8515,W,0.02,193.13,130415,,,D*77 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:44.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":5.923,"track":193.1300,"speed":0.010,"climb":0.000,"eps":4.94,"epc":11.85} $GPZDA,202644.000,13,04,2015,,*50 $GPGGA,202645.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6A $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202645.000,A,4404.1305,N,12118.8515,W,0.03,173.97,130415,,,D*75 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:45.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":5.923,"track":173.9700,"speed":0.015,"climb":0.000,"eps":4.94,"epc":11.85} $GPZDA,202645.000,13,04,2015,,*51 $GPGGA,202646.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*69 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202646.000,A,4404.1305,N,12118.8515,W,0.01,207.08,130415,,,D*72 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:46.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":207.0800,"speed":0.005,"climb":0.000,"eps":4.94,"epc":13.46} $GPZDA,202646.000,13,04,2015,,*52 $GPGGA,202647.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202647.000,A,4404.1305,N,12118.8515,W,0.02,198.85,130415,,,D*70 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:47.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":198.8500,"speed":0.010,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202647.000,13,04,2015,,*53 $GPGGA,202648.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*67 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,32,07,60,281,44,23,55,123,34,10,44,274,31*7F $GPGSV,3,2,12,16,39,051,31,30,30,262,23,20,24,308,30,27,23,093,34*72 $GPGSV,3,3,12,19,13,123,27,03,07,176,22,05,05,328,,49,,,*45 {"class":"SKY","xdop":0.51,"ydop":0.66,"vdop":1.31,"tdop":0.61,"hdop":0.98,"gdop":1.46,"pdop":1.64,"satellites":[{"PRN":9,"el":88,"az":89,"ss":32,"used":true},{"PRN":7,"el":60,"az":281,"ss":44,"used":true},{"PRN":23,"el":55,"az":123,"ss":34,"used":true},{"PRN":10,"el":44,"az":274,"ss":31,"used":true},{"PRN":16,"el":39,"az":51,"ss":31,"used":true},{"PRN":30,"el":30,"az":262,"ss":23,"used":true},{"PRN":20,"el":24,"az":308,"ss":30,"used":true},{"PRN":27,"el":23,"az":93,"ss":34,"used":true},{"PRN":19,"el":13,"az":123,"ss":27,"used":true},{"PRN":3,"el":7,"az":176,"ss":22,"used":true},{"PRN":5,"el":5,"az":328,"ss":0,"used":false},{"PRN":136,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,202648.000,A,4404.1305,N,12118.8515,W,0.00,152.04,130415,,,D*72 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:48.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":152.0400,"speed":0.000,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202648.000,13,04,2015,,*5C $GPGGA,202649.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*66 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202649.000,A,4404.1305,N,12118.8515,W,0.04,203.49,130415,,,D*79 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:49.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":203.4900,"speed":0.021,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202649.000,13,04,2015,,*5D $GPGGA,202650.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6E $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202650.000,A,4404.1305,N,12118.8515,W,0.04,191.29,130415,,,D*7F {"class":"TPV","mode":3,"time":"2015-04-13T20:26:50.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":191.2900,"speed":0.021,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202650.000,13,04,2015,,*55 $GPGGA,202651.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6F $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202651.000,A,4404.1305,N,12118.8515,W,0.04,185.45,130415,,,D*71 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:51.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":185.4500,"speed":0.021,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202651.000,13,04,2015,,*54 $GPGGA,202652.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6C $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202652.000,A,4404.1305,N,12118.8515,W,0.05,208.06,130415,,,D*72 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:52.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":208.0600,"speed":0.026,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202652.000,13,04,2015,,*57 $GPGGA,202653.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6D $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,31,07,60,281,44,23,54,124,33,10,44,274,31*7D $GPGSV,3,2,12,16,39,051,31,30,30,262,24,20,24,308,31,27,23,093,34*74 $GPGSV,3,3,12,19,13,123,26,03,07,176,19,05,05,328,,49,,,*4C {"class":"SKY","xdop":0.51,"ydop":0.66,"vdop":1.31,"tdop":0.61,"hdop":0.98,"gdop":1.46,"pdop":1.64,"satellites":[{"PRN":9,"el":88,"az":89,"ss":31,"used":true},{"PRN":7,"el":60,"az":281,"ss":44,"used":true},{"PRN":23,"el":54,"az":124,"ss":33,"used":true},{"PRN":10,"el":44,"az":274,"ss":31,"used":true},{"PRN":16,"el":39,"az":51,"ss":31,"used":true},{"PRN":30,"el":30,"az":262,"ss":24,"used":true},{"PRN":20,"el":24,"az":308,"ss":31,"used":true},{"PRN":27,"el":23,"az":93,"ss":34,"used":true},{"PRN":19,"el":13,"az":123,"ss":26,"used":true},{"PRN":3,"el":7,"az":176,"ss":19,"used":true},{"PRN":5,"el":5,"az":328,"ss":0,"used":false},{"PRN":136,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,202653.000,A,4404.1305,N,12118.8515,W,0.04,191.42,130415,,,D*71 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:53.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":191.4200,"speed":0.021,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202653.000,13,04,2015,,*56 $GPGGA,202654.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6A $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202654.000,A,4404.1305,N,12118.8515,W,0.01,233.27,130415,,,D*7B {"class":"TPV","mode":3,"time":"2015-04-13T20:26:54.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":233.2700,"speed":0.005,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202654.000,13,04,2015,,*51 $GPGGA,202655.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6B $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202655.000,A,4404.1305,N,12118.8515,W,0.03,166.68,130415,,,D*70 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:55.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":166.6800,"speed":0.015,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202655.000,13,04,2015,,*50 $GPGGA,202656.000,4404.1305,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202656.000,A,4404.1305,N,12118.8515,W,0.04,213.40,130415,,,D*7F {"class":"TPV","mode":3,"time":"2015-04-13T20:26:56.000Z","ept":0.005,"lat":44.068841667,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":213.4000,"speed":0.021,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202656.000,13,04,2015,,*53 $GPGGA,202657.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202657.000,A,4404.1304,N,12118.8515,W,0.04,206.19,130415,,,D*77 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:57.000Z","ept":0.005,"lat":44.068840000,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":206.1900,"speed":0.021,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202657.000,13,04,2015,,*52 $GPGGA,202658.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*67 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,32,07,60,281,44,23,54,124,36,10,44,274,31*7B $GPGSV,3,2,12,16,39,051,31,46,37,146,,30,30,262,24,20,24,308,32*7B $GPGSV,3,3,12,27,23,092,33,19,13,123,26,03,07,176,22,05,05,328,*76 {"class":"SKY","xdop":0.51,"ydop":0.66,"vdop":1.31,"tdop":0.61,"hdop":0.98,"gdop":1.46,"pdop":1.64,"satellites":[{"PRN":9,"el":88,"az":89,"ss":32,"used":true},{"PRN":7,"el":60,"az":281,"ss":44,"used":true},{"PRN":23,"el":54,"az":124,"ss":36,"used":true},{"PRN":10,"el":44,"az":274,"ss":31,"used":true},{"PRN":16,"el":39,"az":51,"ss":31,"used":true},{"PRN":133,"el":37,"az":146,"ss":0,"used":false},{"PRN":30,"el":30,"az":262,"ss":24,"used":true},{"PRN":20,"el":24,"az":308,"ss":32,"used":true},{"PRN":27,"el":23,"az":92,"ss":33,"used":true},{"PRN":19,"el":13,"az":123,"ss":26,"used":true},{"PRN":3,"el":7,"az":176,"ss":22,"used":true},{"PRN":5,"el":5,"az":328,"ss":0,"used":false}]} $GPRMC,202658.000,A,4404.1304,N,12118.8515,W,0.03,213.30,130415,,,D*70 {"class":"TPV","mode":3,"time":"2015-04-13T20:26:58.000Z","ept":0.005,"lat":44.068840000,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":213.3000,"speed":0.015,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202658.000,13,04,2015,,*5D $GPGGA,202659.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*66 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202659.000,A,4404.1304,N,12118.8515,W,0.04,190.06,130415,,,D*7B {"class":"TPV","mode":3,"time":"2015-04-13T20:26:59.000Z","ept":0.005,"lat":44.068840000,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":190.0600,"speed":0.021,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202659.000,13,04,2015,,*5C $GPGGA,202700.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6B $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202700.000,A,4404.1304,N,12118.8515,W,0.04,165.60,130415,,,D*7C {"class":"TPV","mode":3,"time":"2015-04-13T20:27:00.000Z","ept":0.005,"lat":44.068840000,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":165.6000,"speed":0.021,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202700.000,13,04,2015,,*51 $GPGGA,202701.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6A $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202701.000,A,4404.1304,N,12118.8515,W,0.04,195.31,130415,,,D*76 {"class":"TPV","mode":3,"time":"2015-04-13T20:27:01.000Z","ept":0.005,"lat":44.068840000,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":195.3100,"speed":0.021,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202701.000,13,04,2015,,*50 $GPGGA,202702.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*69 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202702.000,A,4404.1304,N,12118.8515,W,0.01,331.31,130415,,,D*7C {"class":"TPV","mode":3,"time":"2015-04-13T20:27:02.000Z","ept":0.005,"lat":44.068840000,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":331.3100,"speed":0.005,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202702.000,13,04,2015,,*53 $GPGGA,202703.000,4404.1304,N,12118.8515,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,33,07,60,281,44,23,54,124,37,10,44,274,31*7B $GPGSV,3,2,12,16,39,051,30,46,37,146,,30,30,262,28,20,24,308,30*74 $GPGSV,3,3,12,27,23,092,31,19,13,123,27,03,07,176,20,05,05,328,*77 {"class":"SKY","xdop":0.51,"ydop":0.66,"vdop":1.31,"tdop":0.61,"hdop":0.98,"gdop":1.46,"pdop":1.64,"satellites":[{"PRN":9,"el":88,"az":89,"ss":33,"used":true},{"PRN":7,"el":60,"az":281,"ss":44,"used":true},{"PRN":23,"el":54,"az":124,"ss":37,"used":true},{"PRN":10,"el":44,"az":274,"ss":31,"used":true},{"PRN":16,"el":39,"az":51,"ss":30,"used":true},{"PRN":133,"el":37,"az":146,"ss":0,"used":false},{"PRN":30,"el":30,"az":262,"ss":28,"used":true},{"PRN":20,"el":24,"az":308,"ss":30,"used":true},{"PRN":27,"el":23,"az":92,"ss":31,"used":true},{"PRN":19,"el":13,"az":123,"ss":27,"used":true},{"PRN":3,"el":7,"az":176,"ss":20,"used":true},{"PRN":5,"el":5,"az":328,"ss":0,"used":false}]} $GPRMC,202703.000,A,4404.1304,N,12118.8515,W,0.01,202.78,130415,,,D*71 {"class":"TPV","mode":3,"time":"2015-04-13T20:27:03.000Z","ept":0.005,"lat":44.068840000,"lon":-121.314191667,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":202.7800,"speed":0.005,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202703.000,13,04,2015,,*52 $GPGGA,202704.000,4404.1304,N,12118.8514,W,2,10,0.98,1127.7,M,-19.6,M,0000,0000*6E $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202704.000,A,4404.1304,N,12118.8514,W,0.01,66.20,130415,,,D*4A {"class":"TPV","mode":3,"time":"2015-04-13T20:27:04.000Z","ept":0.005,"lat":44.068840000,"lon":-121.314190000,"alt":1127.700,"epx":1.919,"epy":2.470,"epv":7.533,"track":66.2000,"speed":0.005,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202704.000,13,04,2015,,*55 $GPGGA,202705.000,4404.1302,N,12118.8514,W,2,10,0.98,1127.6,M,-19.6,M,0000,0000*68 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202705.000,A,4404.1302,N,12118.8514,W,0.03,115.82,130415,,,D*72 {"class":"TPV","mode":3,"time":"2015-04-13T20:27:05.000Z","ept":0.005,"lat":44.068836667,"lon":-121.314190000,"alt":1127.600,"epx":1.919,"epy":2.470,"epv":7.533,"track":115.8200,"speed":0.015,"climb":-0.100,"eps":4.94,"epc":15.07} $GPZDA,202705.000,13,04,2015,,*54 $GPGGA,202706.000,4404.1302,N,12118.8513,W,2,10,0.98,1127.6,M,-19.6,M,0000,0000*6C $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202706.000,A,4404.1302,N,12118.8513,W,0.02,124.23,130415,,,D*7E {"class":"TPV","mode":3,"time":"2015-04-13T20:27:06.000Z","ept":0.005,"lat":44.068836667,"lon":-121.314188333,"alt":1127.600,"epx":1.919,"epy":2.470,"epv":7.533,"track":124.2300,"speed":0.010,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202706.000,13,04,2015,,*57 $GPGGA,202707.000,4404.1302,N,12118.8512,W,2,10,0.98,1127.6,M,-19.6,M,0000,0000*6C $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202707.000,A,4404.1302,N,12118.8512,W,0.01,66.30,130415,,,D*48 {"class":"TPV","mode":3,"time":"2015-04-13T20:27:07.000Z","ept":0.005,"lat":44.068836667,"lon":-121.314186667,"alt":1127.600,"epx":1.919,"epy":2.470,"epv":7.533,"track":66.3000,"speed":0.005,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202707.000,13,04,2015,,*56 $GPGGA,202708.000,4404.1298,N,12118.8513,W,2,10,0.98,1127.4,M,-19.6,M,0000,0000*62 $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPGSV,3,1,12,09,88,089,33,07,60,281,44,23,54,124,38,10,44,274,31*74 $GPGSV,3,2,12,16,39,051,31,46,37,146,,30,30,262,29,20,24,308,30*74 $GPGSV,3,3,12,27,23,092,32,19,13,123,25,03,07,176,19,05,05,328,*7C {"class":"SKY","xdop":0.51,"ydop":0.66,"vdop":1.31,"tdop":0.61,"hdop":0.98,"gdop":1.46,"pdop":1.64,"satellites":[{"PRN":9,"el":88,"az":89,"ss":33,"used":true},{"PRN":7,"el":60,"az":281,"ss":44,"used":true},{"PRN":23,"el":54,"az":124,"ss":38,"used":true},{"PRN":10,"el":44,"az":274,"ss":31,"used":true},{"PRN":16,"el":39,"az":51,"ss":31,"used":true},{"PRN":133,"el":37,"az":146,"ss":0,"used":false},{"PRN":30,"el":30,"az":262,"ss":29,"used":true},{"PRN":20,"el":24,"az":308,"ss":30,"used":true},{"PRN":27,"el":23,"az":92,"ss":32,"used":true},{"PRN":19,"el":13,"az":123,"ss":25,"used":true},{"PRN":3,"el":7,"az":176,"ss":19,"used":true},{"PRN":5,"el":5,"az":328,"ss":0,"used":false}]} $GPRMC,202708.000,A,4404.1298,N,12118.8513,W,0.06,182.52,130415,,,D*7C {"class":"TPV","mode":3,"time":"2015-04-13T20:27:08.000Z","ept":0.005,"lat":44.068830000,"lon":-121.314188333,"alt":1127.400,"epx":1.919,"epy":2.470,"epv":7.533,"track":182.5200,"speed":0.031,"climb":-0.200,"eps":4.94,"epc":15.07} $GPZDA,202708.000,13,04,2015,,*59 $GPGGA,202709.000,4404.1297,N,12118.8513,W,2,10,0.98,1127.4,M,-19.6,M,0000,0000*6C $GPGSA,A,3,20,16,09,03,07,10,23,19,27,30,,,1.64,0.98,1.31*05 $GPRMC,202709.000,A,4404.1297,N,12118.8513,W,0.03,188.44,130415,,,D*7A {"class":"TPV","mode":3,"time":"2015-04-13T20:27:09.000Z","ept":0.005,"lat":44.068828333,"lon":-121.314188333,"alt":1127.400,"epx":1.919,"epy":2.470,"epv":7.533,"track":188.4400,"speed":0.015,"climb":0.000,"eps":4.94,"epc":15.07} $GPZDA,202709.000,13,04,2015,,*58 gpsd-3.15/test/daemon/mtk-3301.log0000664000175000017500000001244112461156335014661 0ustar esresr# Name: San Jose Navigation FV-M11 # Chipset: MKT-3301 # Submitter: "Henk Fijnvandraat" # Date: 2008-08-23 # Location: Enschede, NL, 52.21N 6.88E # # NMEA version V3.01 # # Dump made with FTDI TTL-232R-3V3 connected to module serial port # Log created with Kermit logging from /dev/ttyUSB0 at 4800 baud # Log shows entire power up to first fix sequence # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # power up # $PMTK010,001*2E $POLYN,TIME,RESTART_OCCURRED $POLYN,EPH,0,00000000 $POLYN,ALM,0,00000000 $GPGGA,235946.005,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*49 $GPRMC,235946.005,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*47 $PMTKCHN,14001,29001,23001,02001,21001,11001,16001,28001,05001,20001,22001,18001,06001,19001,07001,09001,25001,08001,13001,30001,10001,03001,04001,27001,26001,01001,24001,15001,31001,17001,12001,32001*46 $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,235947.004,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*49 $GPRMC,235947.004,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*47 $PMTKCHN,21312,02001,14001,29001,23001,16001,05001,20001,22001,18001,06001,19001,28031,11282,07001,09001,25001,08001,13001,30001,10001,03001,04001,27001,26001,01001,24001,15001,31001,17001,12001,32001*4D $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,235948.004,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*46 $GPRMC,235948.004,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*48 $PMTKCHN,21412,28492,22001,14001,29001,23001,02001,11001,16001,05001,20001,06031,19001,18031,07001,09001,25001,08001,13001,30001,10001,03001,04001,27001,26001,01001,24001,15001,31001,17001,12001,32001*4E $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,235949.004,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*47 $GPRMC,235949.004,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*49 $PMTKCHN,21422,28502,22242,09282,07432,14001,29001,23001,02001,11001,16001,13031,25031,08031,05001,20001,18001,06001,19001,30001,10001,03001,04001,27001,26001,01001,24001,15001,31001,17001,12001,32001*4E $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,235950.004,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*4F $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,06,21,,,40,28,,,47,25,,,43,07,,,40*71 $GPGSV,2,2,06,08,,,49,10,,,41*7E $GPRMC,235950.004,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*41 $PMTKCHN,21402,28472,14001,25432,07402,08492,29001,10412,23001,02001,11001,03031,04031,27031,16001,05001,20001,22001,18001,06001,19001,09001,13001,30001,26001,01001,24001,15001,31001,17001,12001,32001*49 $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,081433.591,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*43 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,21,,,42,28,,,52,26,,,48,25,,,45*7E $GPGSV,3,2,12,07,,,44,08,,,50,27,,,48,10,,,44*79 $GPGSV,3,3,12,15,,,45,03,,,38,19,,,39,05,,,25*77 $GPRMC,081433.591,V,8960.000000,N,00000.000000,E,0.000,0.00,120180,,,N*4B $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03382,19392,05252,16342,22031,14001,29001,23001,02001,11001,20001,18001,06001,09001,13001,30001,04001,01001,24001,31001,17001,12001,32001*43 $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,081434.590,5212.978993,N,00653.097906,E,0,3,,102.907,M,47.093,M,,*42 $GPRMC,081434.590,V,5212.978993,N,00653.097906,E,0.052,0.00,230808,,,N*46 $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,18031,06031,22252,14001,29001,23001,02001,11001,16001,05001,20001,09001,13001,30001,04001,01001,24001,31001,17001,12001,32001*45 $GPVTG,0.00,T,,M,0.052,N,0.097,K,N*3B $GPGGA,081436.000,5212.982135,N,00653.101394,E,1,3,2.88,102.907,M,47.093,M,,*5F $GPRMC,081436.000,A,5212.982135,N,00653.101394,E,0.039,0.00,230808,,,A*53 $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,13031,06031,09272,14001,29001,23001,02001,11001,16001,05001,20001,22001,18001,30001,04001,01001,24001,31001,17001,12001,32001*47 $GPVTG,0.00,T,,M,0.039,N,0.072,K,A*32 $GPGGA,081437.000,5212.981473,N,00653.102458,E,1,3,2.88,102.907,M,47.093,M,,*5E $GPRMC,081437.000,A,5212.981473,N,00653.102458,E,0.039,0.00,230808,,,A*52 $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,13031,29031,14031,23001,02001,11001,16001,05001,20001,22001,18001,06001,09001,30001,04001,01001,24001,31001,17001,12001,32001*42 $GPVTG,0.00,T,,M,0.039,N,0.073,K,A*33 $GPGGA,081438.000,5212.982641,N,00653.105897,E,1,3,2.88,102.912,M,47.093,M,,*5D $GPRMC,081438.000,A,5212.982641,N,00653.105897,E,0.042,0.00,230808,,,A*59 $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,13342,29031,14342,23001,02001,11001,16001,05001,20001,22001,18001,06001,09001,30001,04001,01001,24001,31001,17001,12001,32001*42 $GPVTG,0.00,T,,M,0.042,N,0.079,K,A*35 $GPGGA,081439.000,5212.981832,N,00653.104686,E,1,3,2.88,102.930,M,47.093,M,,*5A $GPGSA,A,2,21,28,08,,,,,,,,,,3.05,2.88,1.00*07 $GPGSV,3,1,11,08,63,065,50,28,42,144,52,21,13,320,42,26,,,48*44 $GPGSV,3,2,11,25,,,45,07,,,44,27,,,48,10,,,44*71 $GPGSV,3,3,11,15,,,45,03,,,39,19,,,39*77 $GPRMC,081439.000,A,5212.981832,N,00653.104686,E,0.205,0.00,230808,,,A*5F $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,02031,29342,23031,14001,11001,16001,05001,20001,22001,18001,06001,09001,13001,30001,04001,01001,24001,31001,17001,12001,32001*45 $GPVTG,0.00,T,,M,0.205,N,0.379,K,A*37 gpsd-3.15/test/daemon/mtk-3301.log.chk0000664000175000017500000001420112467340617015425 0ustar esresr$PMTK010,001*2E $POLYN,TIME,RESTART_OCCURRED $POLYN,EPH,0,00000000 $POLYN,ALM,0,00000000 $GPGGA,235946.005,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*49 $GPRMC,235946.005,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*47 $PMTKCHN,14001,29001,23001,02001,21001,11001,16001,28001,05001,20001,22001,18001,06001,19001,07001,09001,25001,08001,13001,30001,10001,03001,04001,27001,26001,01001,24001,15001,31001,17001,12001,32001*46 $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,235947.004,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*49 $GPRMC,235947.004,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*47 $PMTKCHN,21312,02001,14001,29001,23001,16001,05001,20001,22001,18001,06001,19001,28031,11282,07001,09001,25001,08001,13001,30001,10001,03001,04001,27001,26001,01001,24001,15001,31001,17001,12001,32001*4D $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,235948.004,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*46 $GPRMC,235948.004,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*48 $PMTKCHN,21412,28492,22001,14001,29001,23001,02001,11001,16001,05001,20001,06031,19001,18031,07001,09001,25001,08001,13001,30001,10001,03001,04001,27001,26001,01001,24001,15001,31001,17001,12001,32001*4E $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,235949.004,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*47 $GPRMC,235949.004,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*49 $PMTKCHN,21422,28502,22242,09282,07432,14001,29001,23001,02001,11001,16001,13031,25031,08031,05001,20001,18001,06001,19001,30001,10001,03001,04001,27001,26001,01001,24001,15001,31001,17001,12001,32001*4E $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,235950.004,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*4F $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,06,21,,,40,28,,,47,25,,,43,07,,,40*71 $GPGSV,2,2,06,08,,,49,10,,,41*7E $GPRMC,235950.004,V,8960.000000,N,00000.000000,E,0.000,0.00,050180,,,N*41 $PMTKCHN,21402,28472,14001,25432,07402,08492,29001,10412,23001,02001,11001,03031,04031,27031,16001,05001,20001,22001,18001,06001,19001,09001,13001,30001,26001,01001,24001,15001,31001,17001,12001,32001*49 $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,081433.591,8960.000000,N,00000.000000,E,0,0,,137.000,M,13.000,M,,*43 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,3,1,12,21,,,42,28,,,52,26,,,48,25,,,45*7E $GPGSV,3,2,12,07,,,44,08,,,50,27,,,48,10,,,44*79 $GPGSV,3,3,12,15,,,45,03,,,38,19,,,39,05,,,25*77 $GPRMC,081433.591,V,8960.000000,N,00000.000000,E,0.000,0.00,120180,,,N*4B $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03382,19392,05252,16342,22031,14001,29001,23001,02001,11001,20001,18001,06001,09001,13001,30001,04001,01001,24001,31001,17001,12001,32001*43 $GPVTG,0.00,T,,M,0.000,N,0.000,K,N*32 $GPGGA,081434.590,5212.978993,N,00653.097906,E,0,3,,102.907,M,47.093,M,,*42 $GPRMC,081434.590,V,5212.978993,N,00653.097906,E,0.052,0.00,230808,,,N*46 $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,18031,06031,22252,14001,29001,23001,02001,11001,16001,05001,20001,09001,13001,30001,04001,01001,24001,31001,17001,12001,32001*45 $GPVTG,0.00,T,,M,0.052,N,0.097,K,N*3B $GPGGA,081436.000,5212.982135,N,00653.101394,E,1,3,2.88,102.907,M,47.093,M,,*5F {"class":"TPV","mode":3,"lat":52.216368917,"lon":6.885023233,"alt":102.907} $GPRMC,081436.000,A,5212.982135,N,00653.101394,E,0.039,0.00,230808,,,A*53 {"class":"TPV","mode":3,"time":"2008-08-23T08:14:36.000Z","ept":0.005,"lat":52.216368917,"lon":6.885023233,"alt":102.907,"track":0.0000,"speed":0.020} $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,13031,06031,09272,14001,29001,23001,02001,11001,16001,05001,20001,22001,18001,30001,04001,01001,24001,31001,17001,12001,32001*47 $GPVTG,0.00,T,,M,0.039,N,0.072,K,A*32 $GPGGA,081437.000,5212.981473,N,00653.102458,E,1,3,2.88,102.907,M,47.093,M,,*5E $GPRMC,081437.000,A,5212.981473,N,00653.102458,E,0.039,0.00,230808,,,A*52 {"class":"TPV","mode":3,"time":"2008-08-23T08:14:37.000Z","ept":0.005,"lat":52.216357883,"lon":6.885040967,"alt":102.907,"track":0.0000,"speed":0.020,"climb":0.000} $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,13031,29031,14031,23001,02001,11001,16001,05001,20001,22001,18001,06001,09001,30001,04001,01001,24001,31001,17001,12001,32001*42 $GPVTG,0.00,T,,M,0.039,N,0.073,K,A*33 $GPGGA,081438.000,5212.982641,N,00653.105897,E,1,3,2.88,102.912,M,47.093,M,,*5D $GPRMC,081438.000,A,5212.982641,N,00653.105897,E,0.042,0.00,230808,,,A*59 {"class":"TPV","mode":3,"time":"2008-08-23T08:14:38.000Z","ept":0.005,"lat":52.216377350,"lon":6.885098283,"alt":102.912,"track":0.0000,"speed":0.022,"climb":0.005} $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,13342,29031,14342,23001,02001,11001,16001,05001,20001,22001,18001,06001,09001,30001,04001,01001,24001,31001,17001,12001,32001*42 $GPVTG,0.00,T,,M,0.042,N,0.079,K,A*35 $GPGGA,081439.000,5212.981832,N,00653.104686,E,1,3,2.88,102.930,M,47.093,M,,*5A $GPGSA,A,2,21,28,08,,,,,,,,,,3.05,2.88,1.00*07 $GPGSV,3,1,11,08,63,065,50,28,42,144,52,21,13,320,42,26,,,48*44 $GPGSV,3,2,11,25,,,45,07,,,44,27,,,48,10,,,44*71 $GPGSV,3,3,11,15,,,45,03,,,39,19,,,39*77 {"class":"SKY","vdop":1.00,"hdop":2.88,"pdop":3.05,"satellites":[{"PRN":8,"el":63,"az":65,"ss":50,"used":true},{"PRN":28,"el":42,"az":144,"ss":52,"used":true},{"PRN":21,"el":13,"az":320,"ss":42,"used":true},{"PRN":26,"el":0,"az":0,"ss":48,"used":false},{"PRN":25,"el":0,"az":0,"ss":45,"used":false},{"PRN":7,"el":0,"az":0,"ss":44,"used":false},{"PRN":27,"el":0,"az":0,"ss":48,"used":false},{"PRN":10,"el":0,"az":0,"ss":44,"used":false},{"PRN":15,"el":0,"az":0,"ss":45,"used":false},{"PRN":3,"el":0,"az":0,"ss":39,"used":false},{"PRN":19,"el":0,"az":0,"ss":39,"used":false}]} $GPRMC,081439.000,A,5212.981832,N,00653.104686,E,0.205,0.00,230808,,,A*5F {"class":"TPV","mode":3,"time":"2008-08-23T08:14:39.000Z","ept":0.005,"lat":52.216363867,"lon":6.885078100,"alt":102.930,"epv":23.000,"track":0.0000,"speed":0.105,"climb":0.018} $PMTKCHN,21422,28522,26482,25452,07442,08502,27482,10442,15452,03392,19392,02031,29342,23031,14001,11001,16001,05001,20001,22001,18001,06001,09001,13001,30001,04001,01001,24001,31001,17001,12001,32001*45 $GPVTG,0.00,T,,M,0.205,N,0.379,K,A*37 gpsd-3.15/test/daemon/mtk-3329.log0000664000175000017500000000344212461156335014674 0ustar esresr# Name: Fastrax IT520U # Chipset: MTK # Description: OEM module # Submitter: Kai Scharwies # Date: 2011-02-21 # Location: Kamp Lintfort, DE, 51deg 29min N, 6deg 32min E # $GPGSV,3,3,10,28,13,265,15,31,08,100,*7E $GPRMC,102127.000,A,5129.0623,N,00632.2911,E,0.33,30.68,210211,,,A*51 $GPGGA,102128.000,5129.0623,N,00632.2910,E,1,4,1.31,29.7,M,47.4,M,,*6D $GPGSA,A,2,20,17,23,14,,,,,,,,,1.62,1.31,0.95*09 $GPGSV,3,1,10,32,86,204,,24,84,113,,11,73,162,,20,54,245,16*7C $GPGSV,3,2,10,17,32,308,33,14,27,045,31,19,15,167,,23,14,188,25*78 $GPGSV,3,3,10,28,13,265,,31,08,100,*7A $PMTK001,604,1*30 $GPRMC,102128.000,A,5129.0623,N,00632.2910,E,0.23,30.68,210211,,,A*5E $GPGGA,102129.000,5129.0620,N,00632.2906,E,1,4,1.31,29.7,M,47.4,M,,*68 $GPGSA,A,2,20,17,23,14,,,,,,,,,1.62,1.31,0.95*09 $GPGSV,3,1,10,32,86,204,,24,84,113,,11,73,162,,20,54,245,15*7F $GPGSV,3,2,10,17,32,308,33,14,27,045,32,19,15,167,,23,14,188,25*7B $GPGSV,3,3,10,28,13,265,,31,08,100,*7A $GPRMC,102129.000,A,5129.0620,N,00632.2906,E,0.20,30.68,210211,,,A*58 $GPGGA,102130.000,5129.0620,N,00632.2905,E,1,4,1.31,29.7,M,47.4,M,,*63 $GPGSA,A,2,20,17,23,14,,,,,,,,,1.62,1.31,0.95*09 $GPGSV,3,1,10,32,86,204,,24,84,113,,11,73,162,,20,54,245,15*7F $GPGSV,3,2,10,17,32,308,33,14,27,045,32,19,15,167,,23,14,188,25*7B $GPGSV,3,3,10,28,13,265,,31,08,100,*7A $PMTK705,AXN_1.30,0145,Fastrax IT500,*67 $GPRMC,102130.000,A,5129.0620,N,00632.2905,E,0.16,30.68,210211,,,A*56 $GPGGA,102131.000,5129.0620,N,00632.2904,E,1,4,1.31,29.7,M,47.4,M,,*63 $GPGSA,A,2,20,17,23,14,,,,,,,,,1.62,1.31,0.95*09 $GPGSV,3,1,10,32,86,204,,24,84,113,,11,73,162,,20,54,245,15*7F $GPGSV,3,2,10,17,32,308,32,14,27,045,32,19,15,167,,23,14,188,25*7A $GPGSV,3,3,10,28,13,265,,31,08,100,*7A $GPRMC,102131.000,A,5129.0620,N,00632.2904,E,0.22,30.68,210211,,,A*51 gpsd-3.15/test/daemon/mtk-3329.log.chk0000664000175000017500000001206112467340617015441 0ustar esresr$GPGSV,3,3,10,28,13,265,15,31,08,100,*7E {"class":"SKY","satellites":[{"PRN":28,"el":13,"az":265,"ss":15,"used":false},{"PRN":31,"el":8,"az":100,"ss":0,"used":false}]} $GPRMC,102127.000,A,5129.0623,N,00632.2911,E,0.33,30.68,210211,,,A*51 {"class":"TPV","mode":2,"time":"2011-02-21T10:21:27.000Z","ept":0.005,"lat":51.484371667,"lon":6.538185000,"track":30.6800,"speed":0.170} $GPGGA,102128.000,5129.0623,N,00632.2910,E,1,4,1.31,29.7,M,47.4,M,,*6D $GPGSA,A,2,20,17,23,14,,,,,,,,,1.62,1.31,0.95*09 $GPGSV,3,1,10,32,86,204,,24,84,113,,11,73,162,,20,54,245,16*7C $GPGSV,3,2,10,17,32,308,33,14,27,045,31,19,15,167,,23,14,188,25*78 $GPGSV,3,3,10,28,13,265,,31,08,100,*7A {"class":"SKY","xdop":1.20,"ydop":0.90,"vdop":0.95,"tdop":1.54,"hdop":1.31,"gdop":3.73,"pdop":1.62,"satellites":[{"PRN":32,"el":86,"az":204,"ss":0,"used":false},{"PRN":24,"el":84,"az":113,"ss":0,"used":false},{"PRN":11,"el":73,"az":162,"ss":0,"used":false},{"PRN":20,"el":54,"az":245,"ss":16,"used":true},{"PRN":17,"el":32,"az":308,"ss":33,"used":true},{"PRN":14,"el":27,"az":45,"ss":31,"used":true},{"PRN":19,"el":15,"az":167,"ss":0,"used":false},{"PRN":23,"el":14,"az":188,"ss":25,"used":true},{"PRN":28,"el":13,"az":265,"ss":0,"used":false},{"PRN":31,"el":8,"az":100,"ss":0,"used":false}]} $PMTK001,604,1*30 $GPRMC,102128.000,A,5129.0623,N,00632.2910,E,0.23,30.68,210211,,,A*5E {"class":"TPV","mode":3,"time":"2011-02-21T10:21:28.000Z","ept":0.005,"lat":51.484371667,"lon":6.538183333,"alt":29.700,"epx":17.984,"epy":13.453,"epv":21.850,"track":30.6800,"speed":0.118,"climb":0.000} $GPGGA,102129.000,5129.0620,N,00632.2906,E,1,4,1.31,29.7,M,47.4,M,,*68 $GPGSA,A,2,20,17,23,14,,,,,,,,,1.62,1.31,0.95*09 $GPGSV,3,1,10,32,86,204,,24,84,113,,11,73,162,,20,54,245,15*7F $GPGSV,3,2,10,17,32,308,33,14,27,045,32,19,15,167,,23,14,188,25*7B $GPGSV,3,3,10,28,13,265,,31,08,100,*7A {"class":"SKY","xdop":1.20,"ydop":0.90,"vdop":0.95,"tdop":1.54,"hdop":1.31,"gdop":3.73,"pdop":1.62,"satellites":[{"PRN":32,"el":86,"az":204,"ss":0,"used":false},{"PRN":24,"el":84,"az":113,"ss":0,"used":false},{"PRN":11,"el":73,"az":162,"ss":0,"used":false},{"PRN":20,"el":54,"az":245,"ss":15,"used":true},{"PRN":17,"el":32,"az":308,"ss":33,"used":true},{"PRN":14,"el":27,"az":45,"ss":32,"used":true},{"PRN":19,"el":15,"az":167,"ss":0,"used":false},{"PRN":23,"el":14,"az":188,"ss":25,"used":true},{"PRN":28,"el":13,"az":265,"ss":0,"used":false},{"PRN":31,"el":8,"az":100,"ss":0,"used":false}]} $GPRMC,102129.000,A,5129.0620,N,00632.2906,E,0.20,30.68,210211,,,A*58 {"class":"TPV","mode":3,"time":"2011-02-21T10:21:29.000Z","ept":0.005,"lat":51.484366667,"lon":6.538176667,"alt":29.700,"epx":17.984,"epy":13.453,"epv":21.850,"track":30.6800,"speed":0.103,"climb":0.000,"eps":35.97,"epc":43.70} $GPGGA,102130.000,5129.0620,N,00632.2905,E,1,4,1.31,29.7,M,47.4,M,,*63 $GPGSA,A,2,20,17,23,14,,,,,,,,,1.62,1.31,0.95*09 $GPGSV,3,1,10,32,86,204,,24,84,113,,11,73,162,,20,54,245,15*7F $GPGSV,3,2,10,17,32,308,33,14,27,045,32,19,15,167,,23,14,188,25*7B $GPGSV,3,3,10,28,13,265,,31,08,100,*7A {"class":"SKY","xdop":1.20,"ydop":0.90,"vdop":0.95,"tdop":1.54,"hdop":1.31,"gdop":3.73,"pdop":1.62,"satellites":[{"PRN":32,"el":86,"az":204,"ss":0,"used":false},{"PRN":24,"el":84,"az":113,"ss":0,"used":false},{"PRN":11,"el":73,"az":162,"ss":0,"used":false},{"PRN":20,"el":54,"az":245,"ss":15,"used":true},{"PRN":17,"el":32,"az":308,"ss":33,"used":true},{"PRN":14,"el":27,"az":45,"ss":32,"used":true},{"PRN":19,"el":15,"az":167,"ss":0,"used":false},{"PRN":23,"el":14,"az":188,"ss":25,"used":true},{"PRN":28,"el":13,"az":265,"ss":0,"used":false},{"PRN":31,"el":8,"az":100,"ss":0,"used":false}]} $PMTK705,AXN_1.30,0145,Fastrax IT500,*67 $GPRMC,102130.000,A,5129.0620,N,00632.2905,E,0.16,30.68,210211,,,A*56 {"class":"TPV","mode":3,"time":"2011-02-21T10:21:30.000Z","ept":0.005,"lat":51.484366667,"lon":6.538175000,"alt":29.700,"epx":17.984,"epy":13.453,"epv":21.850,"track":30.6800,"speed":0.082,"climb":0.000,"eps":35.97,"epc":43.70} $GPGGA,102131.000,5129.0620,N,00632.2904,E,1,4,1.31,29.7,M,47.4,M,,*63 $GPGSA,A,2,20,17,23,14,,,,,,,,,1.62,1.31,0.95*09 $GPGSV,3,1,10,32,86,204,,24,84,113,,11,73,162,,20,54,245,15*7F $GPGSV,3,2,10,17,32,308,32,14,27,045,32,19,15,167,,23,14,188,25*7A $GPGSV,3,3,10,28,13,265,,31,08,100,*7A {"class":"SKY","xdop":1.20,"ydop":0.90,"vdop":0.95,"tdop":1.54,"hdop":1.31,"gdop":3.73,"pdop":1.62,"satellites":[{"PRN":32,"el":86,"az":204,"ss":0,"used":false},{"PRN":24,"el":84,"az":113,"ss":0,"used":false},{"PRN":11,"el":73,"az":162,"ss":0,"used":false},{"PRN":20,"el":54,"az":245,"ss":15,"used":true},{"PRN":17,"el":32,"az":308,"ss":32,"used":true},{"PRN":14,"el":27,"az":45,"ss":32,"used":true},{"PRN":19,"el":15,"az":167,"ss":0,"used":false},{"PRN":23,"el":14,"az":188,"ss":25,"used":true},{"PRN":28,"el":13,"az":265,"ss":0,"used":false},{"PRN":31,"el":8,"az":100,"ss":0,"used":false}]} $GPRMC,102131.000,A,5129.0620,N,00632.2904,E,0.22,30.68,210211,,,A*51 {"class":"TPV","mode":3,"time":"2011-02-21T10:21:31.000Z","ept":0.005,"lat":51.484366667,"lon":6.538173333,"alt":29.700,"epx":17.984,"epy":13.453,"epv":21.850,"track":30.6800,"speed":0.113,"climb":0.000,"eps":35.97,"epc":43.70} gpsd-3.15/test/daemon/myguide-3100.log0000664000175000017500000001411312467341115015522 0ustar esresr# Name: Myguide 3100 # Vendor: Typhoon # Chipset: Unknown # Description: Car-dash GPS # Submitter: Gleb Smirnoff # Date: 2011-03-23 # Notes: Contains initial segement of no fix followed by stationary fix. # The 3100 has been end-of-lifed but is still found in the wild. # No database entry for this yet, we haven'y been able to find # out enough about it. $GPGSA,A,1,29,2,30,,,,,,,,,,3.819,3.727,0.832*01 $GPGSV,5,1,19,1,5,,23,2,28,73,24,4,19,40,24,9,3,137,29*40 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 $GPGGA,105025.80,5612.9999,N,00306.7096,W,,2,60.000,160.002,M,,M,,*56 $GPRMC,105025.80,V,5612.9999,N,00306.7096,W,,,081009,,W,N*05 $GPGSA,A,1,29,30,,,,,,,,,,,60.000,60.000,60.000*0E $GPGSV,5,1,19,1,5,,23,2,28,73,23,4,19,40,24,9,3,137,28*46 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 $GPGGA,105026.80,5612.9999,N,00306.7096,W,,2,60.000,160.002,M,,M,,*55 $GPRMC,105026.80,V,5612.9999,N,00306.7096,W,,,081009,,W,N*06 $GPGSA,A,1,29,30,,,,,,,,,,,60.000,60.000,60.000*0E $GPGSV,5,1,19,1,5,,23,2,28,73,23,4,19,40,24,9,3,137,28*46 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,36,30,80,98,33,31,38,300,*72 $GPGGA,105027.80,5612.9956,N,00306.6983,W,,3,2.506,160.002,M,,M,,*6D $GPRMC,105027.80,V,5612.9956,N,00306.6983,W,,,081009,,W,N*08 $GPGSA,A,1,29,30,9,,,,,,,,,,2.597,2.506,0.681*06 $GPGSV,5,1,19,1,5,,23,2,28,73,22,4,19,40,24,9,3,137,28*47 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,36,30,80,98,33,31,38,300,*72 $GPGGA,105028.80,5612.9948,N,00306.7136,W,,3,2.506,160.002,M,,M,,*6A $GPRMC,105028.80,V,5612.9948,N,00306.7136,W,,,081009,,W,N*0F $GPGSA,A,1,29,30,9,,,,,,,,,,2.597,2.506,0.681*06 $GPGSV,5,1,19,1,5,,22,2,28,73,24,4,19,40,25,9,3,137,28*41 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,36,30,80,98,33,31,38,300,*72 $GPGGA,105029.80,5612.9978,N,00306.7359,W,1,4,17.516,159.072,M,,M,,*6D $GPRMC,105029.80,A,5612.9978,N,00306.7359,W,0.174,318.057,081009,,W,A*14 $GPGSA,A,3,29,2,30,9,,,,,,,,,23.570,17.516,15.771*03 $GPGSV,5,1,19,1,5,,23,2,28,73,25,3,5,,,4,19,40,24*73 $GPGSV,5,2,19,5,5,,,9,3,137,27,12,44,85,,14,32,226,*70 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 $GPGGA,105030.80,5612.9978,N,00306.7310,W,1,4,17.510,159.050,M,,M,,*6E $GPRMC,105030.80,A,5612.9978,N,00306.7310,W,0.265,127.668,081009,,W,A*16 $GPGSA,A,3,29,2,30,9,,,,,,,,,23.559,17.510,15.762*0C $GPGSV,5,1,19,1,5,,23,2,28,73,25,3,5,,,4,19,40,24*73 $GPGSV,5,2,19,5,5,,,9,3,137,27,12,44,85,,14,32,226,*70 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,34,31,38,300,*76 $GPGGA,105031.80,5612.9969,N,00306.7273,W,1,4,17.504,159.024,M,,M,,*6D $GPRMC,105031.80,A,5612.9969,N,00306.7273,W,0.374,132.018,081009,,W,A*17 $GPGSA,A,3,29,2,30,9,,,,,,,,,23.548,17.504,15.752*0A $GPGSV,5,1,19,1,5,,25,2,28,73,24,3,5,,,4,19,40,23*73 $GPGSV,5,2,19,5,5,,,9,3,137,27,12,44,85,,14,32,226,*70 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,34,31,38,300,*76 $GPGGA,105032.80,5612.9977,N,00306.7212,W,1,4,17.498,158.985,M,,M,,*61 $GPRMC,105032.80,A,5612.9977,N,00306.7212,W,0.501,133.315,081009,,W,A*17 $GPGSA,A,3,29,2,30,9,,,,,,,,,23.537,17.498,15.743*06 $GPGSV,5,1,19,1,5,,25,2,28,73,24,3,5,,,4,19,40,23*73 $GPGSV,5,2,19,5,5,,,9,3,137,26,12,44,85,,14,32,226,*71 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 $GPGGA,105033.80,5612.9975,N,00306.7206,W,1,4,17.491,158.982,M,,M,,*69 $GPRMC,105033.80,A,5612.9975,N,00306.7206,W,0.695,131.210,081009,,W,A*19 $GPGSA,A,3,29,2,30,9,,,,,,,,,23.527,17.491,15.734*0E $GPGSV,5,1,19,1,5,,25,2,28,73,24,3,5,,,4,19,40,24*74 $GPGSV,5,2,19,5,5,,,9,3,137,26,12,44,85,,14,32,226,*71 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 $GPGGA,105034.80,5612.9972,N,00306.7198,W,1,4,17.485,159.022,M,,M,,*6A $GPRMC,105034.80,A,5612.9972,N,00306.7198,W,1.157,241.127,081009,,W,A*16 $GPGSA,A,3,29,2,30,9,,,,,,,,,23.516,17.485,15.725*09 $GPGSV,5,1,19,1,5,,26,2,28,73,23,3,5,,,4,19,40,24*70 $GPGSV,5,2,19,5,5,,,9,3,137,25,12,44,85,,14,32,226,*72 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 $GPGGA,105035.80,5612.9962,N,00306.7171,W,1,4,17.479,159.038,M,,M,,*65 $GPRMC,105035.80,A,5612.9962,N,00306.7171,W,0.278,266.820,081009,,W,A*15 $GPGSA,A,3,29,2,30,9,,,,,,,,,23.505,17.479,15.715*0B $GPGSV,3,1,11,2,28,73,25,4,19,40,24,9,3,137,25,12,44,85,*48 $GPGSV,3,2,11,14,32,226,,20,6,332,,24,4,147,,26,17,202,*7E $GPGSV,3,3,11,29,47,187,35,30,80,98,33,31,38,300,*79 $GPGGA,105036.80,5612.9956,N,00306.7155,W,1,4,17.473,159.027,M,,M,,*63 $GPRMC,105036.80,A,5612.9956,N,00306.7155,W,0.198,246.533,081009,,W,A*17 $GPGSA,A,3,29,2,30,9,,,,,,,,,23.494,17.473,15.706*0A $GPGSV,3,1,11,2,28,73,27,4,19,40,24,9,3,137,25,12,44,85,*4A $GPGSV,3,2,11,14,32,226,,20,6,332,,24,4,147,,26,17,202,*7E $GPGSV,3,3,11,29,47,187,36,30,80,98,33,31,38,300,*7A $GPGGA,105037.80,5612.9964,N,00306.7154,W,1,4,17.466,159.026,M,,M,,*67 $GPRMC,105037.80,A,5612.9964,N,00306.7154,W,0.195,197.090,081009,,W,A*18 gpsd-3.15/test/daemon/myguide-3100.log.chk0000664000175000017500000004753112467341115016300 0ustar esresr$GPGSA,A,1,29,2,30,,,,,,,,,,3.819,3.727,0.832*01 {"class":"TPV","mode":1} $GPGSV,5,1,19,1,5,,23,2,28,73,24,4,19,40,24,9,3,137,29*40 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 {"class":"SKY","vdop":0.83,"hdop":3.73,"pdop":3.82,"satellites":[{"PRN":1,"el":5,"az":0,"ss":23,"used":false},{"PRN":2,"el":28,"az":73,"ss":24,"used":true},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":9,"el":3,"az":137,"ss":29,"used":false},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":13,"el":5,"az":0,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":15,"el":5,"az":0,"ss":0,"used":false},{"PRN":16,"el":5,"az":0,"ss":0,"used":false},{"PRN":17,"el":5,"az":0,"ss":0,"used":false},{"PRN":18,"el":5,"az":0,"ss":0,"used":false},{"PRN":19,"el":5,"az":0,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":21,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":35,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105025.80,5612.9999,N,00306.7096,W,,2,60.000,160.002,M,,M,,*56 $GPRMC,105025.80,V,5612.9999,N,00306.7096,W,,,081009,,W,N*05 $GPGSA,A,1,29,30,,,,,,,,,,,60.000,60.000,60.000*0E {"class":"TPV","mode":1} $GPGSV,5,1,19,1,5,,23,2,28,73,23,4,19,40,24,9,3,137,28*46 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 {"class":"SKY","vdop":60.00,"hdop":60.00,"pdop":60.00,"satellites":[{"PRN":1,"el":5,"az":0,"ss":23,"used":false},{"PRN":2,"el":28,"az":73,"ss":23,"used":false},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":9,"el":3,"az":137,"ss":28,"used":false},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":13,"el":5,"az":0,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":15,"el":5,"az":0,"ss":0,"used":false},{"PRN":16,"el":5,"az":0,"ss":0,"used":false},{"PRN":17,"el":5,"az":0,"ss":0,"used":false},{"PRN":18,"el":5,"az":0,"ss":0,"used":false},{"PRN":19,"el":5,"az":0,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":21,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":35,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105026.80,5612.9999,N,00306.7096,W,,2,60.000,160.002,M,,M,,*55 $GPRMC,105026.80,V,5612.9999,N,00306.7096,W,,,081009,,W,N*06 $GPGSA,A,1,29,30,,,,,,,,,,,60.000,60.000,60.000*0E {"class":"TPV","mode":1} $GPGSV,5,1,19,1,5,,23,2,28,73,23,4,19,40,24,9,3,137,28*46 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,36,30,80,98,33,31,38,300,*72 {"class":"SKY","vdop":60.00,"hdop":60.00,"pdop":60.00,"satellites":[{"PRN":1,"el":5,"az":0,"ss":23,"used":false},{"PRN":2,"el":28,"az":73,"ss":23,"used":false},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":9,"el":3,"az":137,"ss":28,"used":false},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":13,"el":5,"az":0,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":15,"el":5,"az":0,"ss":0,"used":false},{"PRN":16,"el":5,"az":0,"ss":0,"used":false},{"PRN":17,"el":5,"az":0,"ss":0,"used":false},{"PRN":18,"el":5,"az":0,"ss":0,"used":false},{"PRN":19,"el":5,"az":0,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":21,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":36,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105027.80,5612.9956,N,00306.6983,W,,3,2.506,160.002,M,,M,,*6D $GPRMC,105027.80,V,5612.9956,N,00306.6983,W,,,081009,,W,N*08 $GPGSA,A,1,29,30,9,,,,,,,,,,2.597,2.506,0.681*06 {"class":"TPV","mode":1} $GPGSV,5,1,19,1,5,,23,2,28,73,22,4,19,40,24,9,3,137,28*47 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,36,30,80,98,33,31,38,300,*72 {"class":"SKY","vdop":0.68,"hdop":2.51,"pdop":2.60,"satellites":[{"PRN":1,"el":5,"az":0,"ss":23,"used":false},{"PRN":2,"el":28,"az":73,"ss":22,"used":false},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":9,"el":3,"az":137,"ss":28,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":13,"el":5,"az":0,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":15,"el":5,"az":0,"ss":0,"used":false},{"PRN":16,"el":5,"az":0,"ss":0,"used":false},{"PRN":17,"el":5,"az":0,"ss":0,"used":false},{"PRN":18,"el":5,"az":0,"ss":0,"used":false},{"PRN":19,"el":5,"az":0,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":21,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":36,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105028.80,5612.9948,N,00306.7136,W,,3,2.506,160.002,M,,M,,*6A $GPRMC,105028.80,V,5612.9948,N,00306.7136,W,,,081009,,W,N*0F $GPGSA,A,1,29,30,9,,,,,,,,,,2.597,2.506,0.681*06 {"class":"TPV","mode":1} $GPGSV,5,1,19,1,5,,22,2,28,73,24,4,19,40,25,9,3,137,28*41 $GPGSV,5,2,19,12,44,85,,13,5,,,14,32,226,,15,5,,*4C $GPGSV,5,3,19,16,5,,,17,5,,,18,5,,,19,5,,*77 $GPGSV,5,4,19,20,6,332,,21,5,,,24,4,147,,26,17,202,*72 $GPGSV,5,5,19,29,47,187,36,30,80,98,33,31,38,300,*72 {"class":"SKY","vdop":0.68,"hdop":2.51,"pdop":2.60,"satellites":[{"PRN":1,"el":5,"az":0,"ss":22,"used":false},{"PRN":2,"el":28,"az":73,"ss":24,"used":false},{"PRN":4,"el":19,"az":40,"ss":25,"used":false},{"PRN":9,"el":3,"az":137,"ss":28,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":13,"el":5,"az":0,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":15,"el":5,"az":0,"ss":0,"used":false},{"PRN":16,"el":5,"az":0,"ss":0,"used":false},{"PRN":17,"el":5,"az":0,"ss":0,"used":false},{"PRN":18,"el":5,"az":0,"ss":0,"used":false},{"PRN":19,"el":5,"az":0,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":21,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":36,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105029.80,5612.9978,N,00306.7359,W,1,4,17.516,159.072,M,,M,,*6D {"class":"TPV","mode":3,"lat":56.216630000,"lon":-3.112265000,"alt":159.072,"epv":15.663} $GPRMC,105029.80,A,5612.9978,N,00306.7359,W,0.174,318.057,081009,,W,A*14 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:29.800Z","ept":0.005,"lat":56.216630000,"lon":-3.112265000,"alt":159.072,"epv":15.663,"track":318.0570,"speed":0.090} $GPGSA,A,3,29,2,30,9,,,,,,,,,23.570,17.516,15.771*03 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:29.800Z","ept":0.005,"lat":56.216630000,"lon":-3.112265000,"alt":159.072,"epv":15.663,"track":318.0570,"speed":0.090,"climb":0.000} $GPGSV,5,1,19,1,5,,23,2,28,73,25,3,5,,,4,19,40,24*73 $GPGSV,5,2,19,5,5,,,9,3,137,27,12,44,85,,14,32,226,*70 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 {"class":"SKY","xdop":13.71,"ydop":9.36,"vdop":15.77,"tdop":16.55,"hdop":17.52,"gdop":27.74,"pdop":23.57,"satellites":[{"PRN":1,"el":5,"az":0,"ss":23,"used":false},{"PRN":2,"el":28,"az":73,"ss":25,"used":true},{"PRN":3,"el":5,"az":0,"ss":0,"used":false},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":5,"el":5,"az":0,"ss":0,"used":false},{"PRN":9,"el":3,"az":137,"ss":27,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":22,"el":5,"az":0,"ss":0,"used":false},{"PRN":23,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":25,"el":5,"az":0,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":27,"el":5,"az":0,"ss":0,"used":false},{"PRN":28,"el":5,"az":0,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":35,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105030.80,5612.9978,N,00306.7310,W,1,4,17.510,159.050,M,,M,,*6E $GPRMC,105030.80,A,5612.9978,N,00306.7310,W,0.265,127.668,081009,,W,A*16 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:30.800Z","ept":0.005,"lat":56.216630000,"lon":-3.112183333,"alt":159.050,"epx":205.670,"epy":140.422,"epv":362.733,"track":127.6680,"speed":0.136,"climb":-0.022,"eps":411.34,"epc":378.40} $GPGSA,A,3,29,2,30,9,,,,,,,,,23.559,17.510,15.762*0C $GPGSV,5,1,19,1,5,,23,2,28,73,25,3,5,,,4,19,40,24*73 $GPGSV,5,2,19,5,5,,,9,3,137,27,12,44,85,,14,32,226,*70 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,34,31,38,300,*76 {"class":"SKY","xdop":13.71,"ydop":9.36,"vdop":15.76,"tdop":16.55,"hdop":17.51,"gdop":27.74,"pdop":23.56,"satellites":[{"PRN":1,"el":5,"az":0,"ss":23,"used":false},{"PRN":2,"el":28,"az":73,"ss":25,"used":true},{"PRN":3,"el":5,"az":0,"ss":0,"used":false},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":5,"el":5,"az":0,"ss":0,"used":false},{"PRN":9,"el":3,"az":137,"ss":27,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":22,"el":5,"az":0,"ss":0,"used":false},{"PRN":23,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":25,"el":5,"az":0,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":27,"el":5,"az":0,"ss":0,"used":false},{"PRN":28,"el":5,"az":0,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":35,"used":true},{"PRN":30,"el":80,"az":98,"ss":34,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105031.80,5612.9969,N,00306.7273,W,1,4,17.504,159.024,M,,M,,*6D $GPRMC,105031.80,A,5612.9969,N,00306.7273,W,0.374,132.018,081009,,W,A*17 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:31.800Z","ept":0.005,"lat":56.216615000,"lon":-3.112121667,"alt":159.024,"epx":205.670,"epy":140.422,"epv":362.526,"track":132.0180,"speed":0.192,"climb":-0.026,"eps":411.34,"epc":725.26} $GPGSA,A,3,29,2,30,9,,,,,,,,,23.548,17.504,15.752*0A $GPGSV,5,1,19,1,5,,25,2,28,73,24,3,5,,,4,19,40,23*73 $GPGSV,5,2,19,5,5,,,9,3,137,27,12,44,85,,14,32,226,*70 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,34,31,38,300,*76 {"class":"SKY","xdop":13.71,"ydop":9.36,"vdop":15.75,"tdop":16.55,"hdop":17.50,"gdop":27.74,"pdop":23.55,"satellites":[{"PRN":1,"el":5,"az":0,"ss":25,"used":false},{"PRN":2,"el":28,"az":73,"ss":24,"used":true},{"PRN":3,"el":5,"az":0,"ss":0,"used":false},{"PRN":4,"el":19,"az":40,"ss":23,"used":false},{"PRN":5,"el":5,"az":0,"ss":0,"used":false},{"PRN":9,"el":3,"az":137,"ss":27,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":22,"el":5,"az":0,"ss":0,"used":false},{"PRN":23,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":25,"el":5,"az":0,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":27,"el":5,"az":0,"ss":0,"used":false},{"PRN":28,"el":5,"az":0,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":35,"used":true},{"PRN":30,"el":80,"az":98,"ss":34,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105032.80,5612.9977,N,00306.7212,W,1,4,17.498,158.985,M,,M,,*61 $GPRMC,105032.80,A,5612.9977,N,00306.7212,W,0.501,133.315,081009,,W,A*17 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:32.800Z","ept":0.005,"lat":56.216628333,"lon":-3.112020000,"alt":158.985,"epx":205.670,"epy":140.422,"epv":362.296,"track":133.3150,"speed":0.258,"climb":-0.039,"eps":411.34,"epc":724.82} $GPGSA,A,3,29,2,30,9,,,,,,,,,23.537,17.498,15.743*06 $GPGSV,5,1,19,1,5,,25,2,28,73,24,3,5,,,4,19,40,23*73 $GPGSV,5,2,19,5,5,,,9,3,137,26,12,44,85,,14,32,226,*71 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 {"class":"SKY","xdop":13.71,"ydop":9.36,"vdop":15.74,"tdop":16.55,"hdop":17.50,"gdop":27.74,"pdop":23.54,"satellites":[{"PRN":1,"el":5,"az":0,"ss":25,"used":false},{"PRN":2,"el":28,"az":73,"ss":24,"used":true},{"PRN":3,"el":5,"az":0,"ss":0,"used":false},{"PRN":4,"el":19,"az":40,"ss":23,"used":false},{"PRN":5,"el":5,"az":0,"ss":0,"used":false},{"PRN":9,"el":3,"az":137,"ss":26,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":22,"el":5,"az":0,"ss":0,"used":false},{"PRN":23,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":25,"el":5,"az":0,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":27,"el":5,"az":0,"ss":0,"used":false},{"PRN":28,"el":5,"az":0,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":35,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105033.80,5612.9975,N,00306.7206,W,1,4,17.491,158.982,M,,M,,*69 $GPRMC,105033.80,A,5612.9975,N,00306.7206,W,0.695,131.210,081009,,W,A*19 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:33.800Z","ept":0.005,"lat":56.216625000,"lon":-3.112010000,"alt":158.982,"epx":205.670,"epy":140.422,"epv":362.089,"track":131.2100,"speed":0.358,"climb":-0.003,"eps":411.34,"epc":724.38} $GPGSA,A,3,29,2,30,9,,,,,,,,,23.527,17.491,15.734*0E $GPGSV,5,1,19,1,5,,25,2,28,73,24,3,5,,,4,19,40,24*74 $GPGSV,5,2,19,5,5,,,9,3,137,26,12,44,85,,14,32,226,*71 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 {"class":"SKY","xdop":13.71,"ydop":9.36,"vdop":15.73,"tdop":16.55,"hdop":17.49,"gdop":27.74,"pdop":23.53,"satellites":[{"PRN":1,"el":5,"az":0,"ss":25,"used":false},{"PRN":2,"el":28,"az":73,"ss":24,"used":true},{"PRN":3,"el":5,"az":0,"ss":0,"used":false},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":5,"el":5,"az":0,"ss":0,"used":false},{"PRN":9,"el":3,"az":137,"ss":26,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":22,"el":5,"az":0,"ss":0,"used":false},{"PRN":23,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":25,"el":5,"az":0,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":27,"el":5,"az":0,"ss":0,"used":false},{"PRN":28,"el":5,"az":0,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":35,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105034.80,5612.9972,N,00306.7198,W,1,4,17.485,159.022,M,,M,,*6A $GPRMC,105034.80,A,5612.9972,N,00306.7198,W,1.157,241.127,081009,,W,A*16 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:34.800Z","ept":0.005,"lat":56.216620000,"lon":-3.111996667,"alt":159.022,"epx":205.670,"epy":140.422,"epv":361.882,"track":241.1270,"speed":0.595,"climb":0.040,"eps":411.34,"epc":723.97} $GPGSA,A,3,29,2,30,9,,,,,,,,,23.516,17.485,15.725*09 $GPGSV,5,1,19,1,5,,26,2,28,73,23,3,5,,,4,19,40,24*70 $GPGSV,5,2,19,5,5,,,9,3,137,25,12,44,85,,14,32,226,*72 $GPGSV,5,3,19,20,6,332,,22,5,,,23,5,,,24,4,147,*70 $GPGSV,5,4,19,25,5,,,26,17,202,,27,5,,,28,5,,*7F $GPGSV,5,5,19,29,47,187,35,30,80,98,33,31,38,300,*71 {"class":"SKY","xdop":13.71,"ydop":9.36,"vdop":15.72,"tdop":16.55,"hdop":17.48,"gdop":27.74,"pdop":23.52,"satellites":[{"PRN":1,"el":5,"az":0,"ss":26,"used":false},{"PRN":2,"el":28,"az":73,"ss":23,"used":true},{"PRN":3,"el":5,"az":0,"ss":0,"used":false},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":5,"el":5,"az":0,"ss":0,"used":false},{"PRN":9,"el":3,"az":137,"ss":25,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":22,"el":5,"az":0,"ss":0,"used":false},{"PRN":23,"el":5,"az":0,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":25,"el":5,"az":0,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":27,"el":5,"az":0,"ss":0,"used":false},{"PRN":28,"el":5,"az":0,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":35,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105035.80,5612.9962,N,00306.7171,W,1,4,17.479,159.038,M,,M,,*65 $GPRMC,105035.80,A,5612.9962,N,00306.7171,W,0.278,266.820,081009,,W,A*15 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:35.800Z","ept":0.005,"lat":56.216603333,"lon":-3.111951667,"alt":159.038,"epx":205.670,"epy":140.422,"epv":361.675,"track":266.8200,"speed":0.143,"climb":0.016,"eps":411.34,"epc":723.56} $GPGSA,A,3,29,2,30,9,,,,,,,,,23.505,17.479,15.715*0B $GPGSV,3,1,11,2,28,73,25,4,19,40,24,9,3,137,25,12,44,85,*48 $GPGSV,3,2,11,14,32,226,,20,6,332,,24,4,147,,26,17,202,*7E $GPGSV,3,3,11,29,47,187,35,30,80,98,33,31,38,300,*79 {"class":"SKY","xdop":13.71,"ydop":9.36,"vdop":15.71,"tdop":16.55,"hdop":17.48,"gdop":27.74,"pdop":23.50,"satellites":[{"PRN":2,"el":28,"az":73,"ss":25,"used":true},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":9,"el":3,"az":137,"ss":25,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":35,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105036.80,5612.9956,N,00306.7155,W,1,4,17.473,159.027,M,,M,,*63 $GPRMC,105036.80,A,5612.9956,N,00306.7155,W,0.198,246.533,081009,,W,A*17 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:36.800Z","ept":0.005,"lat":56.216593333,"lon":-3.111925000,"alt":159.027,"epx":205.670,"epy":140.422,"epv":361.445,"track":246.5330,"speed":0.102,"climb":-0.011,"eps":411.34,"epc":723.12} $GPGSA,A,3,29,2,30,9,,,,,,,,,23.494,17.473,15.706*0A $GPGSV,3,1,11,2,28,73,27,4,19,40,24,9,3,137,25,12,44,85,*4A $GPGSV,3,2,11,14,32,226,,20,6,332,,24,4,147,,26,17,202,*7E $GPGSV,3,3,11,29,47,187,36,30,80,98,33,31,38,300,*7A {"class":"SKY","xdop":13.71,"ydop":9.36,"vdop":15.71,"tdop":16.55,"hdop":17.47,"gdop":27.74,"pdop":23.49,"satellites":[{"PRN":2,"el":28,"az":73,"ss":27,"used":true},{"PRN":4,"el":19,"az":40,"ss":24,"used":false},{"PRN":9,"el":3,"az":137,"ss":25,"used":true},{"PRN":12,"el":44,"az":85,"ss":0,"used":false},{"PRN":14,"el":32,"az":226,"ss":0,"used":false},{"PRN":20,"el":6,"az":332,"ss":0,"used":false},{"PRN":24,"el":4,"az":147,"ss":0,"used":false},{"PRN":26,"el":17,"az":202,"ss":0,"used":false},{"PRN":29,"el":47,"az":187,"ss":36,"used":true},{"PRN":30,"el":80,"az":98,"ss":33,"used":true},{"PRN":31,"el":38,"az":300,"ss":0,"used":false}]} $GPGGA,105037.80,5612.9964,N,00306.7154,W,1,4,17.466,159.026,M,,M,,*67 $GPRMC,105037.80,A,5612.9964,N,00306.7154,W,0.195,197.090,081009,,W,A*18 {"class":"TPV","mode":3,"time":"2009-10-08T10:50:37.800Z","ept":0.005,"lat":56.216606667,"lon":-3.111923333,"alt":159.026,"epx":205.670,"epy":140.422,"epv":361.238,"track":197.0900,"speed":0.100,"climb":-0.001,"eps":411.34,"epc":722.68} gpsd-3.15/test/daemon/naujoks-ntrip.log0000664000175000017500000000265512461156335016314 0ustar esresr# Name: Ntrip caster # Description: RTCM2 data returened by an Ntrip caster # Submitter: Andre Naujoks # Date: 2011-02-22 # GET /EPS_NI HTTP/1.1 User-Agent: NTRIP gpsd/2.96~dev Accept: rtk/rtcm, dgps/rtcm Authorization: Basic xxxxxxxxxxxxx Connection: close ICY 200 OK YFh|bk\_dHpa}pK@@@hFXCB`dpivZ}JhbIXpScg^ziyEYc@B@_haQF`~uuWIBxL@@ETbY~i|XToY^{oB`{hoxSk@ls@zA~_NAHZ{BhpV@PDHLIJ`wK|N`}q}Ws@`~gqZ@ZLz[YK@lu]OPImB`XuGB\Ss@}}Q|`lO@hY}zkSfAWCHToEYTh]v^Mg@|Kedn}QLpiEYfqUCskPrcKiA|[fyWC]TSb[Lpa}pK@@@hFXCB`dpivZ~pW]vgO@@@l\XaE@V@@Fzf\}`W^nYm~uuWIJxP@@ETGfAVCBT_[^eoB`{M@PGlq@lseE~A`TAHZ^@}WOL@PDHi@vu_tCq_gq}Wse_AXN@@ZLz~@ftvu]OPlR}_goGB\sd@}}QY_SprY}zkvYFh|GTsf[Ppa}pnW\XCB`A@@OVlZ~wIhbIXpScg^vK@@FzCc@B@zW^nYH@A@JoWIFxW@@ETGfAVCBT_^\P}_DroxSNSL@ZzA~_k@~weaBhpso{wVIJ@`K|N`XNBhLZ`~gqesEAYC@UJbpovR}_gJx}cL~@}}Q|`lO@hY}zkSfyWC]Tsa[{O^BOtWyg|}_[@@OVIeAH@ShbIXU@@@lyg^vnyEYc@B@_haQfR@A@JJhvqGQ@@ETGfAVCBt@X^~oB`{hoxSk@l{\zA~_k@~weaBhpso{{x@Fw_sMM`KbB@}O`~gqZ@ZLz[YC@pu]OPlR}_goGB\SVBBnf`lO@MfBETIfyWCxktZdJpa}pK@@@hFXCB`dpivZ~wlW]vWqScg^vK@@FzCcBB@VhaQfR@A@JJhvvG_@@ETGfAVCBt`\^GP}_DW@PGlTSD@cE~A`TAHZ^@}WOL@PDDGyH`Lr@r_t]B\`~gIP@ZLz[YC@pu]OPlR}_goGB\sd@}}QY_SprY}zkvYFh|GTkc[Spa}HA@B@hjg|}_~piSeAH@vW]vWT@@@lyg^vnyEYcAB@IhaQfw~uPhvrGD@@ETbY~i|XtPZ^goB`{M@PGlq@l{yE~A`q@~weD@}WOio{{]yH`iMM`n]}wBI`~gIuesEAYC@UJbpovR_gfGB\KKBBnC_caY}zkS gpsd-3.15/test/daemon/naujoks-ntrip.log.chk0000664000175000017500000001607312466117141017054 0ustar esresr{"class":"RTCM2","type":14,"station_id":688,"zcount":841.8,"seqnum":3,"length":1,"station_health":6,"week":600,"hour":63,"leapsecs":15} {"class":"RTCM2","type":31,"station_id":688,"zcount":828.0,"seqnum":4,"length":14,"station_health":6,"satellites":[{"ident":14,"udre":0,"change":false,"tod":0,"prc":142.140,"rrc":0.000},{"ident":5,"udre":0,"change":false,"tod":0,"prc":138.320,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":136.440,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.120,"rrc":0.000},{"ident":13,"udre":0,"change":false,"tod":0,"prc":133.640,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":121.680,"rrc":0.008},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.940,"rrc":0.004},{"ident":20,"udre":0,"change":false,"tod":0,"prc":111.240,"rrc":-0.016}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":843.0,"seqnum":5,"length":19,"station_health":6,"satellites":[{"ident":10,"udre":0,"iod":46,"prc":-2.400,"rrc":0.000},{"ident":13,"udre":0,"iod":94,"prc":-4.420,"rrc":0.000},{"ident":7,"udre":0,"iod":22,"prc":-5.160,"rrc":0.002},{"ident":2,"udre":0,"iod":34,"prc":-6.480,"rrc":0.000},{"ident":4,"udre":0,"iod":47,"prc":-8.860,"rrc":0.000},{"ident":8,"udre":0,"iod":76,"prc":-7.980,"rrc":0.002},{"ident":5,"udre":0,"iod":99,"prc":-8.260,"rrc":0.002},{"ident":23,"udre":0,"iod":81,"prc":-8.060,"rrc":0.000},{"ident":16,"udre":0,"iod":70,"prc":-11.740,"rrc":0.000},{"ident":30,"udre":0,"iod":4,"prc":-18.960,"rrc":-0.006},{"ident":29,"udre":0,"iod":101,"prc":-24.960,"rrc":-0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":829.2,"seqnum":6,"length":14,"station_health":6,"satellites":[{"ident":14,"udre":0,"change":false,"tod":0,"prc":142.140,"rrc":0.000},{"ident":5,"udre":0,"change":false,"tod":0,"prc":138.320,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":136.440,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.120,"rrc":0.000},{"ident":13,"udre":0,"change":false,"tod":0,"prc":133.620,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":121.680,"rrc":0.008},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.940,"rrc":0.004},{"ident":20,"udre":0,"change":false,"tod":0,"prc":111.220,"rrc":-0.016}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":844.2,"seqnum":7,"length":19,"station_health":6,"satellites":[{"ident":10,"udre":0,"iod":46,"prc":-2.400,"rrc":0.000},{"ident":13,"udre":0,"iod":94,"prc":-4.420,"rrc":0.000},{"ident":7,"udre":0,"iod":22,"prc":-5.160,"rrc":0.002},{"ident":2,"udre":0,"iod":34,"prc":-6.480,"rrc":0.000},{"ident":4,"udre":0,"iod":47,"prc":-8.860,"rrc":0.000},{"ident":8,"udre":0,"iod":76,"prc":-7.980,"rrc":0.002},{"ident":5,"udre":0,"iod":99,"prc":-8.260,"rrc":0.002},{"ident":23,"udre":0,"iod":81,"prc":-8.080,"rrc":0.000},{"ident":16,"udre":0,"iod":70,"prc":-11.740,"rrc":0.000},{"ident":30,"udre":0,"iod":4,"prc":-18.960,"rrc":-0.006},{"ident":29,"udre":0,"iod":101,"prc":-24.960,"rrc":-0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":829.8,"seqnum":0,"length":14,"station_health":6,"satellites":[{"ident":14,"udre":0,"change":false,"tod":0,"prc":142.140,"rrc":0.000},{"ident":5,"udre":0,"change":false,"tod":0,"prc":138.320,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":136.440,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.120,"rrc":0.000},{"ident":13,"udre":0,"change":false,"tod":0,"prc":133.620,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":121.680,"rrc":0.008},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.940,"rrc":0.004},{"ident":20,"udre":0,"change":false,"tod":0,"prc":111.200,"rrc":-0.016}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":844.8,"seqnum":1,"length":19,"station_health":6,"satellites":[{"ident":10,"udre":0,"iod":46,"prc":-2.400,"rrc":0.000},{"ident":13,"udre":0,"iod":94,"prc":-4.440,"rrc":0.000},{"ident":7,"udre":0,"iod":22,"prc":-5.160,"rrc":0.002},{"ident":2,"udre":0,"iod":34,"prc":-6.480,"rrc":0.000},{"ident":8,"udre":0,"iod":76,"prc":-7.980,"rrc":0.002},{"ident":4,"udre":0,"iod":47,"prc":-8.860,"rrc":0.000},{"ident":5,"udre":0,"iod":99,"prc":-8.260,"rrc":0.002},{"ident":23,"udre":0,"iod":81,"prc":-8.080,"rrc":0.000},{"ident":16,"udre":0,"iod":70,"prc":-11.740,"rrc":0.000},{"ident":30,"udre":0,"iod":4,"prc":-18.940,"rrc":-0.006},{"ident":29,"udre":0,"iod":101,"prc":-24.960,"rrc":-0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":831.0,"seqnum":2,"length":14,"station_health":6,"satellites":[{"ident":14,"udre":0,"change":false,"tod":0,"prc":142.140,"rrc":0.000},{"ident":5,"udre":0,"change":false,"tod":0,"prc":138.320,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":136.440,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.100,"rrc":0.000},{"ident":13,"udre":0,"change":false,"tod":0,"prc":133.620,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":121.700,"rrc":0.008},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.940,"rrc":0.004},{"ident":20,"udre":0,"change":false,"tod":0,"prc":111.160,"rrc":-0.016}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":846.0,"seqnum":3,"length":19,"station_health":6,"satellites":[{"ident":10,"udre":0,"iod":46,"prc":-2.400,"rrc":0.000},{"ident":13,"udre":0,"iod":94,"prc":-4.440,"rrc":0.000},{"ident":7,"udre":0,"iod":22,"prc":-5.160,"rrc":0.002},{"ident":2,"udre":0,"iod":34,"prc":-6.480,"rrc":0.000},{"ident":8,"udre":0,"iod":76,"prc":-7.980,"rrc":0.002},{"ident":4,"udre":0,"iod":47,"prc":-8.880,"rrc":0.000},{"ident":5,"udre":0,"iod":99,"prc":-8.240,"rrc":0.002},{"ident":23,"udre":0,"iod":81,"prc":-8.080,"rrc":0.000},{"ident":16,"udre":0,"iod":70,"prc":-11.740,"rrc":0.000},{"ident":30,"udre":0,"iod":4,"prc":-18.960,"rrc":-0.006},{"ident":29,"udre":0,"iod":101,"prc":-24.960,"rrc":-0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":832.2,"seqnum":4,"length":14,"station_health":6,"satellites":[{"ident":14,"udre":0,"change":false,"tod":0,"prc":142.160,"rrc":0.002},{"ident":5,"udre":0,"change":false,"tod":0,"prc":138.320,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":136.440,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.100,"rrc":0.000},{"ident":13,"udre":0,"change":false,"tod":0,"prc":133.620,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":121.720,"rrc":0.008},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.940,"rrc":0.004},{"ident":20,"udre":0,"change":false,"tod":0,"prc":111.120,"rrc":-0.016}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":847.2,"seqnum":5,"length":19,"station_health":6,"satellites":[{"ident":10,"udre":0,"iod":46,"prc":-2.400,"rrc":0.000},{"ident":13,"udre":0,"iod":94,"prc":-4.440,"rrc":0.000},{"ident":7,"udre":0,"iod":22,"prc":-5.160,"rrc":0.002},{"ident":2,"udre":0,"iod":34,"prc":-6.480,"rrc":0.000},{"ident":8,"udre":0,"iod":76,"prc":-7.980,"rrc":0.002},{"ident":4,"udre":0,"iod":47,"prc":-8.860,"rrc":0.002},{"ident":5,"udre":0,"iod":99,"prc":-8.240,"rrc":0.002},{"ident":23,"udre":0,"iod":81,"prc":-8.080,"rrc":0.000},{"ident":16,"udre":0,"iod":70,"prc":-11.760,"rrc":0.000},{"ident":30,"udre":0,"iod":4,"prc":-18.980,"rrc":-0.006},{"ident":29,"udre":0,"iod":101,"prc":-24.980,"rrc":-0.002}]} gpsd-3.15/test/daemon/naujoks-rtcm2.log0000664000175000017500000001627112467342657016220 0ustar esresr# Name: RTCM2 test data # Description: Bare RTCM2 data # Submitter: Andre Naujoks # Date: 2011-04-05 # Note: There's an ASCII dump of the first 22 packets in this data in the # test directory as naujoks-rtcm2.dcd # fyWC]jtn_E`bybV@@@|PXIB`\@@Gvgj|_^NWv}UXXbG@s_yyN~BH@Dh`vaMA@BzWQxKgw}teD|~B@aY~i|Xjza_rOAP]F@hCzd@\tjwM`mp~_geoBpmjG~oIEK@cO\M`XHA`Dt_@XC{]qac@eEYapoJDB@RY~h|RjzIYjWbIarXCtZ[QBns@OVzfYNj|LjzE\Qiim|NfyWCxUsS`U`bybsCJXIB`yxI}j~v_^NWv}UXXbG@s_yyN~BH@Dh`vA@~}EhnOtDHBKZ^||B@hY~i|XjFc_@p~obyW|E[cK@UH@r_ROA`XZP}ORU@xAPv@zt\pcr_gw~_{K`g|D@bN^\Z@@zf^OPu{~wmfYFh|bUsT`~_]F]iCogv}_cxIXUA@@l_^NWS@B@jBXbG@V@`FFT~BH@aW_I~e@~}`WQpklw}teD\B@LfAVCBjff_sOAP]F@hCzd@\|vwM`HOA`XoBp]T@xAPv@zt\pcr_gw}_{q_@XC{]qac@eEYapoJDA@REfyWCxUSP`b_]F]L@@@|ugvu_Z@@Gvgj}i_^NgH@B@jgg]xL@`FFqA}w{W_IA^A@B_h^@Tew}teD\~B@ZfAVCgUi_`lOAP]cW|E~@\|SH@r_ROC`XvoBp]T@xAPv@zt\pcr_gw}_{q_@XC{]qac@eEYapoJDAHRYfyWC]j\i_}_]F]iCogvu_xI}j}L`aqXR@B@jBXbG@V@`FFT~BH@aW_IA{@~}Eh^HT\HBKZ{cC}IfAVCBjvd_Op~obyW|E[cC@IH@r_wp|_gloBp]qG~ol@ztyO\M`}w}_{T`gBY@bN^y@e`f^OPPDAHR|YFh|Gj|l_N`bybV@@@|PXIF`bxIXUB@@V`aqXw}UXXbG@s_yyN~AH@~W_IA^A@B_h^DT[HBKZ{S@}uY~i|}UI\`~OAP]F@hCzd@\|vwM`HOC`XSP}ObN@xAPSEK@FpC~_gM|wESh|GbL@HA^TZ@@zf^OPu{~wmfYFh|bU}U`t_]F]iCogvy_]@@Gvgj}i_^NgH@B@jgg]xL@`FFqA~wAh`v~a@~}`Waskxw}teaSA}FfAVCBjNg_jOAP]cW|E~@\|SH@r_ROC`XvoBp]T@xAPv@z|@pC~_gM|wESh|GbL@HA^TZ@@zf^OPu{~mzYFh|Gjbn_W`byRh}CCXIF`G@@GvBU@@@_`aqXw}UXXbG@s_yyN~AH@~W_Ial@~}`WaukYHBKZ{SC}OfAVCBjna_Lp~obyW|E[cC@IH@r_wp|_gloBp]qG~ol@z|eO|A`}uwEDh|Gbiw~aNZ@@_Yapoo{~m_fyWC]jbi_|_]Fmr}CfgvyoF@@GvBU@@@_`aqXw}UXXbG@s_yyN~AH@~W_Ial@~}`WaukYHBKZ{s@}NfAVCBj^d_yOAP]F@hCzd@\|vwM`HOA`XoBp]T@xAPv@zt\pC~_BJ@Hz{WCx]V@HA^q@e`f^OPPDAHR|YFh|GjRm_C`byRM@B@|YXINPexIXU@@@z_^NG_@B@jBXbG@V@`FFT~AH@[h`vnm@~}`Wayk{w}teasAs@fAVCBj~b__p~ob\@hCzAcC@lwM`mp~_geoBp]qG~ol@z|eO|A`}uwEDh|Gbiw~aNZ@@_Yapoo{~wmCfAWCmUAuf]h]v^Mg@|Kedn}QLpiEYfyWC]jrg_b_]FmW@B@||gvqoxI}Z|\`aqxE@B@jgg]xL@`FFqA~wAh`vNz@~}Eh^NT}w}teaK@s^fAVCgU~Q`pOAP]F@hCzd@\|vwM`HOA`XoBp]T@xAPv@z|@pC~_guwEaWCx]sw~ak@eEYapoJDAHRYfyWC]jJ`_y_]Fmr}CfgvqoZ@@GvgZ|y_^NG_@B@jBXbG@V@`FFT~AH@[h`vN_A@B_h^ATJHBKZ^t}L@MfAVCBjAi_dOAP]cW|E~@\|SH@r_ROA`XZP}ObN@xAPSEC@ZpC~_BJ@Hz{WCx}dw~aNZ@@_Yapoo{~wmCfyWCxUU[`Z`byRhCogvqoZ@@GvgZ|y_^NG_@B@jBXbG@V@`FFT~CH@wW_IIj@~}`Wavkiw}teDt|L@~Y~i|}U^R`bOAP]cW|E~@\|SH@r_ROA`XZP}ObN@xAPSEC@ZpC~_BJ@Hz{WCx}dw~aNZ@@_Yapoo{~wmCfyWCxUe]`_`byRhCogv~oH@@GvBeA@@O`aqx`}U}g]tK@`FFqA|wmW_IIOA@BzWarkrw}teakBsIfAVCBjQk_Xp~ob\@hCzAcC@lwM`mp~_geoBp]qG~ol@z|eO|A`}uwEDh|GB[@HA^q@e`f^OPPDAHR|YFh|GjZg_q_]F]iCogv~oH@@GvBeA@@O`aqx`}U}g]tK@`FFqA|wmW_Ii}@~}Eh^CtBHBKZ^T~L@LfAVCBjqn_Np~oBK@hCzd@\|vwM`HOA`XoBp]T@xAPv@z|@pC~_gu}wEMh|GB[@HA^q@e`f^OPPDAHR|YFhsBjFa[`_]FiM@@@|ugVy_xI}Zf_^NcR@@@jngmq[@`FFTnCH@Jh`vEe@~}`Wnv[AHBET@fAVLGjih_}OAPMoW|E~@lGH@r_wP}_gAP}OZD@xAPSEG@dO|A`}m}wE[h|GJJ@HA^TjA@qf^OPuG~wmYfAWLMjiDY[hcg\wMC`v\k|Q`t[ICkYNjsIjiL\{VVRCTfyWLXjfb[r_]FihCogVq_F@@GvBe@@@Y`aq\mUQXR~p_yyNnCH@oW_Iz@~}EhQEdyw}zkY~isxUVT`rOAPMoW|E~@lGH@r_wP}_gAP}OZD@xAPSEG@dO|A`}m}wE[h|GJJ@HA^TjN@cf^OPPxAHRCfyWL}UiYdr_]FihCogVy_Z@@GvgZC`aq\H@@@jKXR~U@`FFT^@D@Th`vyu@~}EhQMdew}zkZfAVLbUfP`Mp~orP@hCzAS@@xwM`Ho~oXAP}OZD@xAPSEG@dO|A`}m}wE[h|GJJ@HA^TjA@qf^OPuG|wmuYFhsBjv`[k_]FiM@@@|ugVy_xI}Zf_^NcR@@@jngmA@O@`FFqawlW_IFJA@BzWnt[{w}zkY~isxUFV`Np~orP@hCzAcO@NH@r_wP}_gAP}OZD@xAPSEG@dO|A`}m}wE[h|GJJ@HA^TjA@qf^OPuG|wmuY~hsWjyEYrW\XcmMC`ScTCnzt[ICNfyWL}UIRdY`byVrCJXiF`@@@GvBEO@g_^NcR@@@jngmq[@`FFT^@H@vW_If]A@B_hQKdaw}zkZfAVLbUz]`jOAPMJ@hCzd@\pTH@r_RoB`X[P}OZaG~oIEG@ApC~_gm}wE~WCxuP@HA^q@U~kf^OPPxCHRoYvkssUzuafutW}Vrkl~m]U_MuYFhsBjNg[p_]FihCogVyhxIXEO@B`aq\H@@@jKXRF@]@`FFT^@D@Th`vYGA@BzWnp[EHBET@fAVLGjen_Up~oruW|E[cO@kwM`mP_gHP}OZD@xAPSEG@dO|A`}m}wE[h|GJJ@HA^TjA@qf^OPuG|wmuYFhsBjna[V`byVrCJXiJ@P@@Gvgz@p}_^Ncw}UXXRF@x_yyN^@D@qW_IVFA@BzWN[PHBETeY~is]jUh_uOAPMoW|E~@\pqwM`HoB`X~oBpe{G~ol@zx[pC~_BRBHzdWCxMZ@HA^q@U~kf^OPPxCHRoYFhsgUa[dy_]FihCogVuJ@@GvBE}O@K`aq\H@B@jggmI@S@`FFT^@H@vW_IVFA@BzWNw[LHBET@fAVLGjUm_Ap~orP@hCzAcO@NH@r_wP}_gAP}OZD@xAPSEG@dO|A`}mwEwWCxMw~ak@U~NYapoJxCHRJfyWL}UA]dz_]FihCogVuJ@@GvBEC@@X`aq\m}U}gmE@T@`FFT^@H@vW_Ivt@~}EhqDdQHBETeY~is]juk_Bp~orP@hCzAcO@NH@r_wP}_gAP}OZD@xAPSEG@dO|A`}m}wE[h|Grew~aNjA@TYapooG|wmPfyWLXjAf[I`byVW@@@|PXiJ@uxI}z|g_^NcR@B@jBXRzk_yyka}weW_IvQA@B_hqLdhw}zkZfAVLbUrP`Vp~oruW|E[cO@kwM`mP}_gdoBpe^@xAPv@zx~O|A`XR@HzmWCxMZ@HA^q@Uqyf^OPuG|wmuYFhsBjAa[b_]FiM@@@|ugVuoxIXEC@@}_^Ncw}UXXRzN@`FFqa}w@h`vIKA@BzWN}[OHBET@fAVLGjmh_Ep~orP@hCzAcO@NH@r_wP}_gAP}OZD@xAPSEG@dO|A`}m}wE[h|Grew~aNjN@FYapoJxCHRJfyWL}U^Zdd_]FiM@@@|ugVu_]@@Gvgz|B`aq\H@B@jggmE@q_yyN^BH@W_Ivt@~}EhqFdNHBET@fAVLGj]l__p~oruW|E[cO@kwM`mP}_gdoBpe^@xAPv@zx~O|A`XRBHzAh|Gr@@HA^TjN@cf^OPPxCHRoYFhsgUn\dD`byVW@@@|PXiF`exIXEC@@}_^Ncw}UXXRzN@`FFqa}w@h`vIKA@BzWNq[mw}zkZfAVLbUBU`cOAPMJ@hCzd@\pTH@r_RoB`X[P}OZaG~oIEG@ApC~_gm}wE~WCxMw~ak@Uq\YapooG|wmPfyWLXjqf[m_]FiM@@@|ugVy_xI}z@pX`aq\m}U}gmE@T@`FFT^AH@`W_IvQC@BsWN~[w}zkY~isxUBP`Wp~oruW|E[cO@kwM`mP}_gdoBpUE@xAPSEG@dO|A`}m}wE[h|Grew~aNjN@FYapoJxCHRJfAWLhUB~fKhcg\Rr@|_l\k|QEKdv|qYFhsBjIh[`_]FYV@@@|PXiN`yxI}zBpt_^NcwUtgmE@T@`FFT^AH@`W_IvQC@BsWNv[cw}zkZfAVLbU|Z`pOAPMoW|E~@\pqwM`Ho@`XRP}OjzG~ol@zx[pC~_BRBHzdWCxMZ@HA^q@Uqyf^OPuG|wmuYFhsBjil[Y`byfiCogVq_F@@GvBE}O@K`aq\H@@@jKXRzk_yyka}weW_IvQC@BsWNr[]HBETeY~is]jcc_iOAPMJ@hCzd@\pTH@r_Ro@`XwoBpU`G~oIEG@ApC~_gm}wE~WCxMw~ak@Uq\YapooG|wmPfyWLXjik[r_]FYsCJXiN`\@@GvgzBpQ`aq\mUQXRzN@`FFqa}w@h`vIKC@BVhqMdGHBET@fAVLGjSf_yOAPMoW|E~@\pqwM`Ho@`XRP}OjzG~ol@zx[pC~_BRBHzdWCxmhw~aNjN@FYapoJxCHRJfyWL}UfPdr_]FYsCJXiN`\@@GvgzBpQ`aq\mUQXRzN@`FFqa}w@h`vqd@|}LhqCDmw}zkZfAVLbUL_`Ep~oRbW|E~@\pqwM`Ho@`XRP}OjzG~ol@zx[pC~_BRBHzdWCxmhw~aNjN@FYapoJxCHRJfyWL}UFVdT`byfiCogVq_F@@GvBE}O@K`aq\H@@@jKXRrw_yyN^BH@W_IN[C@BsWNx[^HBETeY~is]jKd_Qp~oRG@hCzd@\pTH@r_Ro@`XwoBpU`G~oIEG@ApC~_gm}wE~WCxmM@HA^TjN@cf^OPPxCHRoYFhsgUzSdM`byfL@@@|ugVq_cxIXE~O@T`aq\mUQXRrR@`FFT^BH@Zh`vQs@|}iWNp[gw}zkZfAVLbUt\``OAPmxW|E[cO@kwM`mP_gHP}Oj_@xAPv@zx~O|A`XRBHzAh|GRrw~ak@Uq\Yapoo{wmUfyWLXjej[T`byfiCogVq_F@@GvBE~O@q_^NcwUtgm}\@`FFT^BH@Zh`vah@~}`Wv[`w}zkZfAVLbUTX`Yp~oRG@hCzd@\pTH@r_ROC`XvoBpU`G~oIEG@ApC~_gm}wE~WCxmM@HA^TjN@cf^OPPD@HRjYFhsgUjQdq_]FYsCJXiN`\@@GvgzApk_^NcR@@@jngm}y_yyN^@H@Sh`vAZA@B_hIHdCHBET@fAVLGj[a_Fp~oRbW|E~@\xmwM`mp|_gIP}Oj_@xAPv@zx~O|A`XRBHzAh|GRrw~ak@Uq\Yapoo{}wmyYFhsBjUi[e_]FYV@@@|PXiF`exIXE~O@T`aq\mUQXRB@F@`FFqawlW_I~e@~}`Wv{[^HBETeY~is]j{d_uOAPm]@hCzAcG@RH@r_ROC`XvoBpU`G~oIEO@]pC~_BR@HzHh|GRrw~ak@Uq\Yapoo{}wmyYFhsBjum[\`byfiCogVy_Z@@Gvgzx_^Ncw}UXXRB@F@`FFqawlW_IA{@~}EhIBdew}zkZfAVLbUx]`Fp~oRbW|E~@\xmwM`mp|_gIP}Oj_@xAPv@zpbO|A`}mwEwWCxmM@HA^TjN@cf^OPPDBHRFfAWLhUxuf^hcg\wMC`v\k|Q`t[ICkYNjsIjGF\Ziim|NfyWL}UrPdi_]FYV@@@|PXiF`exIXE@@@G`aq\H@B@jggmsD@`FFqawlW_IaIA@BzWvu{tw}zkY~isxUX_`{OAPm]@hCzAcG@RH@r_ROC`XvoBpU`G~oIEO@]pC~_BR@HzHh|GRrw~ak@Uy@YapoJDAHRYfyWLXjmh[z_]FYsCJXiF`@@@GvBE@@@b_^NcR@B@jBXRL@^@`FFT^@H@vW_Ial@~}`Wvu{QHBETeY~is]jge_pOAPm]@hCzAcG@RH@r_ROC`XvoBpU`G~oIEO@]pC~_BR@HzHh|GRrw~ak@Uy@YapoJDBHRcYFhsgUbSd_`byfi gpsd-3.15/test/daemon/naujoks-rtcm2.log.chk0000664000175000017500000014631712467342657016771 0ustar esresr{"class":"RTCM2","type":1,"station_id":688,"zcount":1642.8,"seqnum":6,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.400,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.420,"rrc":0.000},{"ident":20,"udre":0,"iod":72,"prc":-9.900,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.660,"rrc":0.002},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.000}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1629.0,"seqnum":7,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.180,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.500,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.620,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.840,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.380,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.100,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.000,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.780,"rrc":-0.024}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1644.0,"seqnum":0,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.420,"rrc":0.000},{"ident":20,"udre":0,"iod":72,"prc":-9.900,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.660,"rrc":0.002},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1630.2,"seqnum":1,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.180,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.500,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.620,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.840,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.380,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.100,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.020,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.760,"rrc":-0.024}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1645.2,"seqnum":2,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.420,"rrc":0.000},{"ident":20,"udre":0,"iod":72,"prc":-9.900,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.640,"rrc":0.002},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1630.8,"seqnum":3,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.180,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.520,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.620,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.840,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.400,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.100,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.040,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.740,"rrc":-0.024}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1645.8,"seqnum":4,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.420,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.660,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.900,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1632.0,"seqnum":5,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.180,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.520,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.620,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.840,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.400,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.100,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.060,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.700,"rrc":-0.024}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1647.0,"seqnum":6,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.440,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.660,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.900,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.000}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1633.2,"seqnum":7,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.200,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.520,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.600,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.840,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.400,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.080,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.100,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.680,"rrc":-0.024}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1648.2,"seqnum":0,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.440,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.640,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.900,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.000}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1633.8,"seqnum":1,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.200,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.520,"rrc":0.004},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.600,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.840,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.400,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.080,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.100,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.660,"rrc":-0.024}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1648.8,"seqnum":2,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.400,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.420,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.640,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.900,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1635.0,"seqnum":3,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.200,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.540,"rrc":0.004},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.600,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.860,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.400,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.060,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.120,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.620,"rrc":-0.026}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1650.0,"seqnum":4,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.400,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.440,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.640,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.900,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":3,"station_id":688,"zcount":1650.0,"seqnum":5,"length":4,"station_health":6,"x":3842290.92,"y":663782.76,"z":5030690.32} {"class":"RTCM2","type":31,"station_id":688,"zcount":1636.2,"seqnum":6,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.200,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.540,"rrc":0.004},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.580,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.860,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.400,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.040,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.140,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.580,"rrc":-0.026}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1651.2,"seqnum":7,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.400,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.440,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.640,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.900,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1636.8,"seqnum":0,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.200,"rrc":0.002},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.540,"rrc":0.004},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.580,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.860,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.400,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.040,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.160,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.560,"rrc":-0.026}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1651.8,"seqnum":1,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.400,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.440,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.640,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.920,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1638.0,"seqnum":2,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.200,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.540,"rrc":0.004},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.580,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.860,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.600,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.420,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.020,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.180,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.520,"rrc":-0.026}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1653.0,"seqnum":3,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.400,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.440,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.640,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.920,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1639.2,"seqnum":4,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.200,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.560,"rrc":0.004},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.560,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.860,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.580,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.420,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.020,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.220,"rrc":0.020},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.480,"rrc":-0.026}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1654.2,"seqnum":5,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.500,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.400,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.440,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.640,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.920,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":688,"zcount":1639.8,"seqnum":6,"length":15,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.180,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.560,"rrc":0.004},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.560,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":126.860,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.580,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.420,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.000,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":112.240,"rrc":0.022},{"ident":13,"udre":0,"change":false,"tod":0,"prc":113.460,"rrc":-0.026}]} {"class":"RTCM2","type":1,"station_id":688,"zcount":1654.8,"seqnum":7,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.520,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.560,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.400,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.780,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.440,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.620,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.920,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.440,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1642.2,"seqnum":0,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.520,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.780,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.260,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.280,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.460,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1657.2,"seqnum":1,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.480,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.840,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.600,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.760,"rrc":0.002}]} {"class":"RTCM2","type":3,"station_id":652,"zcount":1657.2,"seqnum":2,"length":4,"station_health":6,"x":3878620.92,"y":670281.40,"z":5002093.59} {"class":"RTCM2","type":14,"station_id":652,"zcount":1657.2,"seqnum":3,"length":1,"station_health":6,"week":601,"hour":109,"leapsecs":15} {"class":"RTCM2","type":31,"station_id":652,"zcount":1642.8,"seqnum":4,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.860,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.520,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.780,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.260,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.280,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.480,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1657.8,"seqnum":5,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.480,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.840,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.760,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1644.0,"seqnum":6,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.520,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.780,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.004},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.260,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.500,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1659.0,"seqnum":7,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.480,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":-0.002},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.840,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.600,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1645.2,"seqnum":0,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.520,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.780,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.260,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.540,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1660.2,"seqnum":1,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.840,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.600,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":3,"station_id":652,"zcount":1660.2,"seqnum":2,"length":4,"station_health":6,"x":3878620.92,"y":670281.40,"z":5002093.59} {"class":"RTCM2","type":31,"station_id":652,"zcount":1645.8,"seqnum":3,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.500,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.780,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.240,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.540,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1660.8,"seqnum":4,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.840,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.600,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":16,"station_id":652,"zcount":1660.8,"seqnum":5,"length":3,"station_health":6,"message":"SAPOS_EPS"} {"class":"RTCM2","type":31,"station_id":652,"zcount":1647.0,"seqnum":6,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.000},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.500,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.760,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.004},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.240,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.580,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1662.0,"seqnum":7,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.360,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.840,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.600,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1648.2,"seqnum":0,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.820,"rrc":0.000},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.500,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.760,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.004},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.220,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.600,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1663.2,"seqnum":1,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.600,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1648.8,"seqnum":2,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.820,"rrc":0.000},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.480,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.760,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.220,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.620,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1663.8,"seqnum":3,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.800,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.600,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1650.0,"seqnum":4,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.820,"rrc":0.000},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.500,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.200,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.640,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1665.0,"seqnum":5,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.600,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1651.2,"seqnum":6,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.820,"rrc":0.000},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.500,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.200,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.660,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1666.2,"seqnum":7,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.800,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1651.8,"seqnum":0,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.820,"rrc":0.000},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.500,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.200,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.680,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1666.8,"seqnum":1,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1653.0,"seqnum":2,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.820,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.500,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.200,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.720,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1668.0,"seqnum":3,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1654.2,"seqnum":4,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.500,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.200,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.740,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1669.2,"seqnum":5,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.680,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1654.8,"seqnum":6,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.360,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.500,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.320,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.200,"rrc":-0.002},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.760,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1669.8,"seqnum":7,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.340,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":3,"station_id":652,"zcount":1669.8,"seqnum":0,"length":4,"station_health":6,"x":3878620.92,"y":670281.40,"z":5002093.59} {"class":"RTCM2","type":31,"station_id":652,"zcount":1656.0,"seqnum":1,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.860,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.480,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.320,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.200,"rrc":-0.002},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.780,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1671.0,"seqnum":2,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.360,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1657.2,"seqnum":3,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.860,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.480,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.200,"rrc":-0.002},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.820,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1672.2,"seqnum":4,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.360,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.860,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1657.8,"seqnum":5,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.860,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.480,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.200,"rrc":-0.002},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.820,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1672.8,"seqnum":6,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.460,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.360,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1659.0,"seqnum":7,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.860,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.480,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.740,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.180,"rrc":-0.002},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.840,"rrc":0.016}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1674.0,"seqnum":0,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.480,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.360,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1660.2,"seqnum":1,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.860,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.480,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.720,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.180,"rrc":-0.002},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.880,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1675.2,"seqnum":2,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.480,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.360,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.740,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1660.8,"seqnum":3,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.860,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.460,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.720,"rrc":-0.002},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.160,"rrc":-0.002},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.900,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1675.8,"seqnum":4,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.480,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.360,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.720,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1662.0,"seqnum":5,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.860,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.460,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.720,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.300,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.140,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.920,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1677.0,"seqnum":6,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.480,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.500,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.720,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1663.2,"seqnum":7,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.860,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.460,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.720,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.120,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.940,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1678.2,"seqnum":0,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.480,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.520,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.400,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.780,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.700,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1663.8,"seqnum":1,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.460,"rrc":-0.002},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.000},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.720,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.120,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":113.960,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1678.8,"seqnum":2,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.480,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.520,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.380,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.800,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.700,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1665.0,"seqnum":3,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.440,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.720,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.100,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":114.000,"rrc":0.018}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1680.0,"seqnum":4,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.480,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.520,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.380,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.800,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.620,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.700,"rrc":0.002}]} {"class":"RTCM2","type":3,"station_id":652,"zcount":1680.0,"seqnum":5,"length":4,"station_health":6,"x":3878620.92,"y":670281.40,"z":5002093.59} {"class":"RTCM2","type":14,"station_id":652,"zcount":1680.0,"seqnum":6,"length":1,"station_health":6,"week":601,"hour":109,"leapsecs":15} {"class":"RTCM2","type":31,"station_id":652,"zcount":1666.2,"seqnum":7,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.440,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.700,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.080,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":114.020,"rrc":0.016}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1681.2,"seqnum":0,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.480,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.520,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.380,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.800,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.640,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.680,"rrc":0.002}]} {"class":"RTCM2","type":31,"station_id":652,"zcount":1666.8,"seqnum":1,"length":14,"station_health":6,"satellites":[{"ident":5,"udre":0,"change":false,"tod":0,"prc":132.340,"rrc":0.000},{"ident":15,"udre":0,"change":false,"tod":0,"prc":134.840,"rrc":0.002},{"ident":14,"udre":0,"change":false,"tod":0,"prc":141.440,"rrc":0.000},{"ident":6,"udre":0,"change":false,"tod":0,"prc":127.000,"rrc":0.002},{"ident":21,"udre":0,"change":false,"tod":0,"prc":128.700,"rrc":0.000},{"ident":22,"udre":0,"change":false,"tod":0,"prc":125.280,"rrc":0.002},{"ident":20,"udre":0,"change":false,"tod":0,"prc":117.080,"rrc":-0.004},{"ident":16,"udre":0,"change":false,"tod":17,"prc":114.020,"rrc":0.016}]} {"class":"RTCM2","type":1,"station_id":652,"zcount":1681.8,"seqnum":2,"length":15,"station_health":6,"satellites":[{"ident":13,"udre":0,"iod":92,"prc":-3.480,"rrc":0.000},{"ident":23,"udre":0,"iod":16,"prc":-4.520,"rrc":0.000},{"ident":4,"udre":0,"iod":70,"prc":-5.380,"rrc":0.000},{"ident":10,"udre":0,"iod":120,"prc":-4.700,"rrc":0.000},{"ident":2,"udre":0,"iod":15,"prc":-7.380,"rrc":0.000},{"ident":7,"udre":0,"iod":23,"prc":-8.800,"rrc":0.002},{"ident":20,"udre":0,"iod":72,"prc":-9.880,"rrc":0.000},{"ident":30,"udre":0,"iod":154,"prc":-13.640,"rrc":0.000},{"ident":16,"udre":0,"iod":18,"prc":-14.700,"rrc":0.002}]} gpsd-3.15/test/daemon/navcom.log0000664000175000017500000001474312467342657015006 0ustar esresr# Name: Navcom GPS engine # Submitter: Chris Kuethe # Date: 2007-01-15 # Location: unknown # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # ™f®K”²ŰDAT 060302.1151BootBlockV 0.040@þ.pâç xxx041102.0953-p™f ™fD,‚xà‚à6ÝN‚ýB¡ p»˜ž5olþ# ,“™fD,‚xà‚à‚H›NWýT¡ ²cÂ^YiIžvØ :{™fD,‚xà‚àƒJqNôøý,¡ +5WEЛƒNÿ\§™fD,‚xà‚à„?øNýV¡ qdŒé žÜÎp.2Ž™fD,‚xà‚à…>œNþýU¡~ á.î?øœ– ™fD,‚xà‚à†.ÇNùÞý4¡ )7ͱž31.­Ú:ÿ]}™fD,‚xà‚à‡TãNúåý6¡ º6ÀžðP)g :ÿŠs™fD,‚xà‚àˆPQN-ý^¡ ¥åŸ©oíÍ2’Yóð™fD,‚xà‚à‰ —ÿN!ýP¡ mâ`5I#¬ ™fD,‚xà‚àŠ =#Nºýa¡ ŽŠÚ4ŽÁ+ @™fD,‚xà‚à‹ 5vNààý#¡ ]aåž±CàÄA™fD,‚xà‚àŒ ‰N Sýh¡ Xu€Éà]¯ã÷Z¥™fD,‚xà‚à nN!:ýF¡ õº‹£2õ®Lö3®™fD,‚xà‚àŽ NXýA¡ q¹ôŸ«ìЖ;3Ÿ™fD,‚xà‚àªªªªªªªªªªªªªªªªªªªªªªª%™fD,‚xà‚àËN ¢ýl¡ K9á&Zð²‡>ˆ™fD,‚xà‚à‘N ýM¡ Ÿ9mœ}JÒÄÉw  ™fD,‚xà‚à’?ÈNXýR¡ ›Iœ–YCî(gÞ™fD,‚xà‚à“¯N ¥ýJ¡ ;ÑœØó³ÕÕ7)™fD,‚xà‚à”ˆNýT¡ ŠŽÀ3Šeïj—ýš™fD,‚xà‚à•awNþÏýS¡ ÚePyŠ*$Ïì Ù™fD,‚xà‚à–(NÃýP¡ ˜ÅŒþi±1œ(ì™fD,‚xà‚à—&LNÆý2¡ '¹=Ei~†Œáíò™fD,‚xà‚à˜FäN ¬ýb¡ fNáXýdD $™fD,‚xà‚àjN ÈýF¡ àBˏ;œ1ÿºë™fD,‚xà‚à‘ NûýC¡ Žº !¿ªm*ëóÿf}™fD,‚xà‚àšN ÈýO¡ æáoDŽhŠ f 6 ™fD,‚xà‚àcdN cým¡ w ¥n|ÐzA >™fD,‚xà‚àR7NžýB¡ ¹eßõ^·e—)—D™fD,‚xà‚àN;NBýZ¡ Ì  6ßܬÃþ™fD,‚xà‚à 3#N ëýM¡ ±ãÂׯ±SD­Ÿÿ4k™fD,‚xà‚à ªªªªªªªªªªªªªªªªªªªªªªª ™fD,‚xà‚à8þÿ+ýýÿÿöÿÿÿüN‚Kª©y™fD,‚xà‚à?™™™™™š™ ©™™™™™™ €éÚ™fD,‚xà‚à™3N‚ÀUV¿™f ™fV‚çâe`Ä¢@‘Ì d+Œ÷e€5ÿÂpeZ>Uá°QЧ‚ Ê¡ °Œ€}ÿç5h(#>%µœŽ,ÈÔìÿ¢™eîšä–™fV‚çâm`Ä¢@‘Ì d+Œöm£ÿ6;y‰m':’Æ 5Cì€Y >¡ µ5£27ÞcÓn&8Gž4Ueÿ¥Emî³ä-™fV‚çâV`Ä¢@‘Ì d+ŒûV€ÿ¡:pšVp:Á7‰‡N,û ¡D*€|<6аI &PXžëÞ[ÿŠVïøä™fV ‚çâj`Ä¢@‘Ì d+Œûj€ “ j u-ŸL\6Ý ÚÑ\-”¡ €ÿΏšì2'‘Ñs&k0Ëÿ§©j”䆙fV ‚çâP`Ä¢@‘Ì d+ŒæPá8÷¡Pÿ§3TÊfèÏÿ ¶¿¥+¡ ®ÕáÿŒ…€Ç'*io§É×Úÿ©PI䇙fV‚çâË`Ä¢@‘Ì d+ŒëË€"ÀMËÿ;3mˆ'²ÿ…ÚÑw]¡ š€}ÿô%š''?b2æá5ÖWÿªÚËÜäó™fV‚çâ•`Ä¢@‘Ì d+Œé•€Þžù• £0W…»Œ 'ûyÏ¡ ÷£€u YºXÿ×&ë¹K',–[޹ÿ§î• –äS™fV‚çâµ`Ä¢@‘Ì d+Œçµ€ ùƒµ f2cŒY;ðÂ4Û¢¡ PK€~ÿêe`_‚ÿ–&T³ïŠŠÿªYµö‰äs™fV‚çâ%`‘ Ä¢@‘Ì d+ŒÙ%€>J% ¿2kHµ U‚A”w¡ |G€|'šÑKÿœ&Ò_ 'jœ6Óÿ¥·%  äÙ™fV‚çâJ`‘ Ä¢@‘Ì d+ŒýJ€ zJî-÷–‹ãµo¯}ø¡‚ó€}fÄCP'Pàý3åÿ¬3JíŠäÄ™fV‚çâo`“Ä¢@‘Ì d+Œño€ÿŸ2Òoò–1¿ÓW„Áô^Šô…ƒ¡ ä€ÿjà(Dß ''øtËDjÿ§%o 3ä™fV‚çâ_`‘ Ä¢@‘Ì d+Œï_€ ö`_ÿ­6Ùt+j×ÿšä€ú¡ )¬€~- &Ê{ÿ©&‰fæs6Ñÿ©)_Bä’™fV‚çâ `‘ Ä¢@‘Ì d+Œå €0ÿ{ ó„0£Ü;ÒÁôþ1FÛ¡ ô€}ÿ¹ãÒšx'%9áÆ¥G:ÿšä ð䀙f ™f°¬‚@Z^EÊõñ»žæfóÏÿÜÿC&ÿÿò“ŠŸnbtÿ¹ÿ6ƒµþæó1€obÿ«ÿ‘sãþùôÿ6îo’Yÿ³ÿx³ ÿþåÇštñþÚÿÏóþðöHþOn³ëÿÁÿÓÎÿò×þCær2V¥ÿr fãšÅ zÚÿ,ÿüŸÉÿçúêɍm]ƒÿ¬ÿjKpÿ–œzxy!û1[™f±V‚@Z^d€aypU —»_’þ¯L Î   d#‘r 5d€2aáÿÿÿôÿÿÿÌÿÿÿÚZ™fÓFx >N@àêÎ0@³·Ûg‹RÀíë.Š„Œ@ ¹™f†º‚èâž? ÿµN(Ⱥn·ÿ‚ 'æÒ²nÿƒm$>ʬdÿ„o$õɬn0ÿ…_„ØnVÿ†Ë(AÔ©n,ÿ‡•ŒÁœn4ÿˆe ²ˆd0ÿŠV+8׬d,ˌ% ­¯†n,ƒ ü1xü8™f°¬‚(^^@Êõñçfs¿ÿÃÿ#ÿÿò©i¿n‚ÿØÿ!cÐþæóåÁ€oBÿžÿºóÄþùôôÖîo2kÿÇÿks"ÿþåâΛtÓ%ÿüÿs|þðö® On3áÿÊÿôÿSßÿòׯíårò#ƒÿ.=tãšY¶~zš/ÿMÿôéÿçúœYŽmmÿªÿd›qÿ–œ?öwy1è1i™f±V‚(^^d€aypU —»_÷þ€L „Î ÿÿÿ  d#ºK3d€2aáÿÿÿôÿÿÿÌÿÿÿü™fÓFx >ö@`BÏ0@”ךŒ‹RÀ.Šœ¢œ@ V™f†º‚éâž? ÿµN(Ⱥd×ÿ‚ 'æÒ²dÿƒm$>ʬnÿ„o$õÉ«d0ÿ…_„ØdVÿ†Ë(AÔ©d,ÿ‡•ŒÁœd4ÿˆe ²ˆn0ÿŠV+8׬n,ˌ% ­¯‚d,ƒ ü1xü8a™f°¬‚b^<ÊõñçfÑÿ¹ÿ)ÿÿòjÌ¿nr‰ÿÏÿ6ÓÅþæó( ¥o‚0ÿ¯ÿÀsÎþùôŠïoeÿ¹ÿ‚£ ÿþå'vœt ÿðÿòsˆþðö¢âNnCêÿÅÿ÷ÿCäÿò×Â6årâ1ªÿ%†ãš†~zŠUÿ‰ÿúçú-‰ŽmÍ}ÿ£ÿm[iÿ–œwyç1ý™f±V‚b^d€aypU ˜»_ þ‘L qÎ üÿÿ  d#À…Àã3d€2aáÿÿÿôÿÿÿÌÿÿÿð×™fÓF%x ?@Ž@`zÐ0@šó“/ۋRÀ .ŠïŒ@ D™f†º‚êâž? @ÿµN(Ⱥnóÿ‚ 'æÒ²nÿƒm$>ʬdÿ„o$õɬn0ÿ…_„×nVÿ†Ë(AÔ©n,ÿ‡•ŒÁœn4ÿˆe ²ˆd0ÿŠV+8׬d,Ì% ­¯n,ƒ ü1xü8…™f°¬‚øe^8ÊõñôçfcŸÿ§ÿñÿó1ÿÿò+/Àn²vÿŸÿ ó×þæóGP¥o‚GÿÛÿ׃Îþùô/VïoâmÿÇÿ™³ÿþåGt³öþãÿ݃‰þðöz$Nn“òÿÑÿƒãÿòײär¢FÊÿLmwãšÇJ}z Hÿ‚ÿƟ çúŽžŽmýkÿœÿe»aÿ–œ˜-vyAö1™f±V‚øe^d€aypU —»_þŠL jÎ   d#×ÜÀð3d€2aáÿÿÿôÿÿÿÌÿÿÿã+™f†º‚ëâž? CÿµN(ɺd0ÿ‚ 'æÒ²d2ÿƒm$>ˬn*ÿ„o$õɬd0ÿ…_„ØdVÿ†Ë(AÔ©d,ÿ‡•ŒÁ›d4ÿˆe ²ˆn0ÿŠV+8׬n,Ì% ­°d,ƒ ü1xü8K™fÓF%x ?@Ž@À¢Ñ0@ Ïù‹RÀ2/.Š+lº@ Ÿ™f°¬‚ài^3Êõñçfó¯ÿŠÿðÿÃ'ÿÿòëñÀnrŠÿ×ÿ,cÎþæó¿÷¥oò%ÿÃÿ¯cÓþùô÷õïor]ÿ³ÿp“ÿþå–$žtS×þÍÿ£ãþðöŒÆMnsãÿºÿâÿïÿò×Å(ärBZÊÿ_=xãš.õ|zŠ3ÿtÿ˜O4çúãGm­†ÿŽÿ†Ë\ÿ–œ2©uy1"™f±V‚ài^d€azpU —»_ þŒL kÎ   d#¯ìÀ 2d€2aáÿÿÿôÿÿÿÌÿÿÿ͎™fÓFx ?À­#@ÀåÐ0@—a¯÷bŒRÀWT.Š"›Œ@ G™f†º‚ìâž? ÀÿµN(ɺZaÿ‚ 'æÒ²Zÿƒm$>ˬdÿ„o$õɬZ0ÿ…_„ØZVÿ†Ë(AÔ©Z,ÿ‡•ŒÁšZ4ÿˆe ²ˆd0ÿŠV+8׬d,Ì% ­°Z,ƒ ü1xü8²™f°¬‚Èm^/Êõñ•†çf3Ìÿ ÿ$SÿÿòaTÁnòŒÿÞÿ53Éþæó«>Šo20ÿÔÿµsÖþùôA5ðoÒoÿÎÿ®³ñþþå8˞tóÿ̃£þðöDMnÃÏÿšÿÝÿcãÿò׆qãrRbÕÿU†ãš?|zzLÿ ÿŸ/*çúwmÝwÿŠÿ]Kqÿ–œšÄtyq1p™f±V‚Èm^d€aypU —»_üþ|L \Î   Z#µH¿‘2d€2aáÿÿÿôÿÿÿÌÿÿÿ™fÓFx ?À­#@@2Ð0@޳Ñ̌RÀ||.ŠÈÀŸ@ S™f†º‚íâž? ÀÿµN(ɺd³ÿ‚ 'æÑ²dÿƒm$>ˬnÿ„o$õɬd0ÿ…_„˜dVÿ†Ë(AÔ©d,ÿ‡•ŒÁšd4ÿˆe ²ˆn0ÿŠV+8׬n,ˌ% ­°‹d,ƒ ü1xü8Ô™f°¬‚°q^+Êõñ,ŽçfƒÅÿ™ÿCÿÿò»¶ÁnbÿÝÿRCµþæó……Šo²+ÿØÿ Sãþùô†tðo"lÿÅÿ¡óøþþåñqŸtãÿ Èc¢þðöÂILn3Øÿ¬ÿúÿ“Óÿò×Jºâr¢Hµÿ]mlãšÃˆ{zê_ÿÉÿÎÏ,çúñ¥m]wÿžÿC …ÿ–œÓßsy1™f±V‚°q^d€aypU ˜»_rþ‰L iÎ üÿÿ  d# 5¿ gpsd-3.15/test/daemon/navcom.log.chk0000664000175000017500000001715412467342657015551 0ustar esresr$GPZDA,102008.00,15,01,2007,00,00*6D $GPGGA,102008,3020.5010,N,01213.7241,E,2,00,1.00,627.59,M,31.479,M,,*48 $GPRMC,102008,A,3020.5010,N,01213.7241,E,0.0019,90.000,150107,,*11 $GPGSA,A,3,,,,,,,,,,,,,2.0,1.0,1.8*38 $GPGBS,102008,0.22,M,0.22,M,10.35,M*02 {"class":"TPV","mode":3,"time":"2007-01-15T10:20:08.000Z","ept":3.920,"lat":30.341683155,"lon":12.228735775,"alt":627.588,"epx":0.222,"epy":0.222,"epv":10.350,"track":90.0000,"speed":0.001,"climb":0.006} $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","time":"2007-01-14T00:01:47.624Z","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}]} $GPZDA,102009.00,15,01,2007,00,00*6C $GPGGA,102009,3020.5010,N,01213.7241,E,2,09,1.00,627.58,M,31.479,M,,*41 $GPRMC,102009,A,3020.5010,N,01213.7241,E,31847.9464,0.000,150107,,*27 $GPGSA,A,3,21,31,6,25,30,16,18,3,7,,,,2.0,1.0,1.8*01 $GPGBS,102009,0.22,M,0.22,M,10.35,M*03 {"class":"TPV","mode":3,"time":"2007-01-15T10:20:09.000Z","ept":3.920,"lat":30.341683205,"lon":12.228735818,"alt":627.577,"epx":0.222,"epy":0.222,"epv":10.350,"track":0.0000,"speed":16383.999,"climb":0.008,"eps":0.44,"epc":20.70} $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","time":"2007-01-14T00:01:47.625Z","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}]} $GPZDA,102010.00,15,01,2007,00,00*64 $GPGGA,102010,3020.5010,N,01213.7242,E,2,09,1.00,627.56,M,31.479,M,,*44 $GPRMC,102010,A,3020.5010,N,01213.7242,E,0.0019,90.000,150107,,*1B $GPGSA,A,3,21,31,6,25,30,16,18,3,7,,,,2.0,1.0,1.8*01 $GPGBS,102010,0.22,M,0.22,M,10.35,M*0B {"class":"TPV","mode":3,"time":"2007-01-15T10:20:10.000Z","ept":3.920,"lat":30.341683095,"lon":12.228735894,"alt":627.558,"epx":0.222,"epy":0.222,"epv":10.350,"track":90.0000,"speed":0.001,"climb":16383.996,"eps":0.44,"epc":20.70} $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","time":"2007-01-14T00:01:47.626Z","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}]} $GPZDA,102011.00,15,01,2007,00,00*65 $GPGGA,102011,3020.5010,N,01213.7242,E,2,09,1.00,627.55,M,31.479,M,,*46 $GPRMC,102011,A,3020.5010,N,01213.7242,E,0.0019,90.000,150107,,*1A $GPGSA,A,3,21,31,6,25,30,16,18,3,7,,,,2.0,1.0,1.8*01 $GPGBS,102011,0.22,M,0.22,M,10.35,M*0A {"class":"TPV","mode":3,"time":"2007-01-15T10:20:11.000Z","ept":3.920,"lat":30.341683146,"lon":12.228735886,"alt":627.552,"epx":0.222,"epy":0.222,"epv":10.350,"track":90.0000,"speed":0.001,"climb":0.001,"eps":0.44,"epc":20.70} $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","time":"2007-01-14T00:01:47.627Z","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}]} $GPZDA,102012.00,15,01,2007,00,00*66 $GPGGA,102012,3020.5010,N,01213.7242,E,2,09,1.00,627.55,M,31.480,M,,*43 $GPRMC,102012,A,3020.5010,N,01213.7242,E,0.0019,0.000,150107,,*20 $GPGSA,A,3,21,31,6,25,30,16,18,3,7,,,,2.0,1.0,1.8*01 {"class":"TPV","mode":3,"time":"2007-01-15T10:20:12.000Z","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,"epc":20.70} $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","time":"2007-01-14T00:01:47.628Z","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}]} $GPZDA,102013.00,15,01,2007,00,00*67 $GPGGA,102013,3020.5010,N,01213.7242,E,2,09,1.00,627.54,M,31.479,M,,*45 $GPRMC,102013,A,3020.5010,N,01213.7242,E,0.0019,0.000,150107,,*21 $GPGSA,A,3,21,31,6,25,30,16,18,3,7,,,,2.0,1.0,1.8*01 $GPGBS,102013,0.22,M,0.22,M,10.35,M*08 {"class":"TPV","mode":3,"time":"2007-01-15T10:20:13.000Z","ept":3.920,"lat":30.341683205,"lon":12.228735860,"alt":627.538,"epx":0.222,"epy":0.222,"epv":10.350,"track":0.0000,"speed":0.001,"climb":0.001,"eps":0.44,"epc":20.70} $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","time":"2007-01-14T00:01:47.629Z","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}]} gpsd-3.15/test/daemon/nd-1005.log0000664000175000017500000001225512467342657014503 0ustar esresr# Name: Globalsat ND-1005 # Chipset: SiRF-3 # Description: GPS mouse # Submitter: George E Farmer # Date: 2011-03-14 # Location: Aberdeen, SCOTLAND, 57.16N 2.12W # Notes: Unit stationary. $GPGGA,110518.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*77 $GPGLL,5709.8067,N,00207.2822,W,110518.000,A,A*4A $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110518.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*65 $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110519.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*76 $GPGLL,5709.8067,N,00207.2822,W,110519.000,A,A*4B $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110519.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*64 $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110520.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7C $GPGLL,5709.8067,N,00207.2822,W,110520.000,A,A*41 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPGSV,3,1,12,23,65,147,33,20,59,095,27,04,46,290,20,13,37,191,24*79 $GPGSV,3,2,12,32,32,083,33,17,30,227,20,31,23,042,22,24,16,136,21*73 $GPGSV,3,3,12,10,14,262,,02,11,306,,25,08,,,12,07,321,15*40 $GPRMC,110520.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6E $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110521.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7D $GPGLL,5709.8067,N,00207.2822,W,110521.000,A,A*40 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110521.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6F $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110522.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7E $GPGLL,5709.8067,N,00207.2822,W,110522.000,A,A*43 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110522.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6C $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110523.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7F $GPGLL,5709.8067,N,00207.2822,W,110523.000,A,A*42 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110523.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6D $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110524.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*78 $GPGLL,5709.8067,N,00207.2822,W,110524.000,A,A*45 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110524.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6A $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110525.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*79 $GPGLL,5709.8067,N,00207.2822,W,110525.000,A,A*44 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPGSV,3,1,12,23,65,147,32,20,59,095,27,04,46,290,20,13,37,191,24*78 $GPGSV,3,2,12,32,32,083,32,17,30,227,19,31,23,042,22,24,16,136,20*79 $GPGSV,3,3,12,10,14,262,,02,11,306,,25,08,,,12,07,321,15*40 $GPRMC,110525.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6B $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110526.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7A $GPGLL,5709.8067,N,00207.2822,W,110526.000,A,A*47 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110526.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*68 $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110527.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7B $GPGLL,5709.8067,N,00207.2822,W,110527.000,A,A*46 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110527.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*69 $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110528.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*74 $GPGLL,5709.8067,N,00207.2822,W,110528.000,A,A*49 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110528.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*66 $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110529.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*75 $GPGLL,5709.8067,N,00207.2822,W,110529.000,A,A*48 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110529.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*67 $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110530.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7D $GPGLL,5709.8067,N,00207.2822,W,110530.000,A,A*40 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPGSV,3,1,12,23,65,147,32,20,59,095,26,04,46,290,19,13,37,191,24*73 $GPGSV,3,2,12,32,32,083,32,17,30,227,18,31,23,042,21,24,16,136,19*71 $GPGSV,3,3,12,10,14,262,,02,11,306,,25,08,,,12,07,321,15*40 $GPRMC,110530.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6F $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110531.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7C $GPGLL,5709.8067,N,00207.2822,W,110531.000,A,A*41 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110531.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6E $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110532.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7F $GPGLL,5709.8067,N,00207.2822,W,110532.000,A,A*42 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110532.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6D $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110533.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7E $GPGLL,5709.8067,N,00207.2822,W,110533.000,A,A*43 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110533.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6C $GPVTG,,T,,M,0.00,N,0.0,K,A*13 gpsd-3.15/test/daemon/nd-1005.log.chk0000664000175000017500000002526112467342657015250 0ustar esresr$GPGGA,110518.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*77 {"class":"TPV","mode":3,"lat":57.163445000,"lon":-2.121370000,"alt":59.300} $GPGLL,5709.8067,N,00207.2822,W,110518.000,A,A*4A {"class":"TPV","mode":3,"lat":57.163445000,"lon":-2.121370000,"alt":59.300} $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F {"class":"TPV","mode":3,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epv":41.400} $GPRMC,110518.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*65 {"class":"TPV","mode":3,"time":"2011-03-14T11:05:18.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epv":41.400,"track":0.0000,"speed":0.000} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110519.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*76 $GPGLL,5709.8067,N,00207.2822,W,110519.000,A,A*4B $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110519.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*64 {"class":"TPV","mode":3,"time":"2011-03-14T11:05:19.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110520.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7C $GPGLL,5709.8067,N,00207.2822,W,110520.000,A,A*41 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPGSV,3,1,12,23,65,147,33,20,59,095,27,04,46,290,20,13,37,191,24*79 $GPGSV,3,2,12,32,32,083,33,17,30,227,20,31,23,042,22,24,16,136,21*73 $GPGSV,3,3,12,10,14,262,,02,11,306,,25,08,,,12,07,321,15*40 {"class":"SKY","xdop":0.68,"ydop":0.77,"vdop":1.80,"tdop":1.18,"hdop":1.00,"gdop":2.37,"pdop":2.10,"satellites":[{"PRN":23,"el":65,"az":147,"ss":33,"used":true},{"PRN":20,"el":59,"az":95,"ss":27,"used":true},{"PRN":4,"el":46,"az":290,"ss":20,"used":true},{"PRN":13,"el":37,"az":191,"ss":24,"used":true},{"PRN":32,"el":32,"az":83,"ss":33,"used":true},{"PRN":17,"el":30,"az":227,"ss":20,"used":true},{"PRN":31,"el":23,"az":42,"ss":22,"used":true},{"PRN":24,"el":16,"az":136,"ss":21,"used":true},{"PRN":10,"el":14,"az":262,"ss":0,"used":false},{"PRN":2,"el":11,"az":306,"ss":0,"used":false},{"PRN":25,"el":8,"az":0,"ss":0,"used":false},{"PRN":12,"el":7,"az":321,"ss":15,"used":false}]} $GPRMC,110520.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6E {"class":"TPV","mode":3,"time":"2011-03-14T11:05:20.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110521.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7D $GPGLL,5709.8067,N,00207.2822,W,110521.000,A,A*40 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110521.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6F {"class":"TPV","mode":3,"time":"2011-03-14T11:05:21.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110522.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7E $GPGLL,5709.8067,N,00207.2822,W,110522.000,A,A*43 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110522.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6C {"class":"TPV","mode":3,"time":"2011-03-14T11:05:22.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110523.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7F $GPGLL,5709.8067,N,00207.2822,W,110523.000,A,A*42 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110523.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6D {"class":"TPV","mode":3,"time":"2011-03-14T11:05:23.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110524.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*78 $GPGLL,5709.8067,N,00207.2822,W,110524.000,A,A*45 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110524.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6A {"class":"TPV","mode":3,"time":"2011-03-14T11:05:24.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110525.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*79 $GPGLL,5709.8067,N,00207.2822,W,110525.000,A,A*44 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPGSV,3,1,12,23,65,147,32,20,59,095,27,04,46,290,20,13,37,191,24*78 $GPGSV,3,2,12,32,32,083,32,17,30,227,19,31,23,042,22,24,16,136,20*79 $GPGSV,3,3,12,10,14,262,,02,11,306,,25,08,,,12,07,321,15*40 {"class":"SKY","xdop":0.68,"ydop":0.77,"vdop":1.80,"tdop":1.18,"hdop":1.00,"gdop":2.37,"pdop":2.10,"satellites":[{"PRN":23,"el":65,"az":147,"ss":32,"used":true},{"PRN":20,"el":59,"az":95,"ss":27,"used":true},{"PRN":4,"el":46,"az":290,"ss":20,"used":true},{"PRN":13,"el":37,"az":191,"ss":24,"used":true},{"PRN":32,"el":32,"az":83,"ss":32,"used":true},{"PRN":17,"el":30,"az":227,"ss":19,"used":true},{"PRN":31,"el":23,"az":42,"ss":22,"used":true},{"PRN":24,"el":16,"az":136,"ss":20,"used":true},{"PRN":10,"el":14,"az":262,"ss":0,"used":false},{"PRN":2,"el":11,"az":306,"ss":0,"used":false},{"PRN":25,"el":8,"az":0,"ss":0,"used":false},{"PRN":12,"el":7,"az":321,"ss":15,"used":false}]} $GPRMC,110525.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6B {"class":"TPV","mode":3,"time":"2011-03-14T11:05:25.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110526.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7A $GPGLL,5709.8067,N,00207.2822,W,110526.000,A,A*47 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110526.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*68 {"class":"TPV","mode":3,"time":"2011-03-14T11:05:26.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110527.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7B $GPGLL,5709.8067,N,00207.2822,W,110527.000,A,A*46 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110527.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*69 {"class":"TPV","mode":3,"time":"2011-03-14T11:05:27.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110528.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*74 $GPGLL,5709.8067,N,00207.2822,W,110528.000,A,A*49 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110528.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*66 {"class":"TPV","mode":3,"time":"2011-03-14T11:05:28.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110529.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*75 $GPGLL,5709.8067,N,00207.2822,W,110529.000,A,A*48 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110529.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*67 {"class":"TPV","mode":3,"time":"2011-03-14T11:05:29.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110530.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7D $GPGLL,5709.8067,N,00207.2822,W,110530.000,A,A*40 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPGSV,3,1,12,23,65,147,32,20,59,095,26,04,46,290,19,13,37,191,24*73 $GPGSV,3,2,12,32,32,083,32,17,30,227,18,31,23,042,21,24,16,136,19*71 $GPGSV,3,3,12,10,14,262,,02,11,306,,25,08,,,12,07,321,15*40 {"class":"SKY","xdop":0.68,"ydop":0.77,"vdop":1.80,"tdop":1.18,"hdop":1.00,"gdop":2.37,"pdop":2.10,"satellites":[{"PRN":23,"el":65,"az":147,"ss":32,"used":true},{"PRN":20,"el":59,"az":95,"ss":26,"used":true},{"PRN":4,"el":46,"az":290,"ss":19,"used":true},{"PRN":13,"el":37,"az":191,"ss":24,"used":true},{"PRN":32,"el":32,"az":83,"ss":32,"used":true},{"PRN":17,"el":30,"az":227,"ss":18,"used":true},{"PRN":31,"el":23,"az":42,"ss":21,"used":true},{"PRN":24,"el":16,"az":136,"ss":19,"used":true},{"PRN":10,"el":14,"az":262,"ss":0,"used":false},{"PRN":2,"el":11,"az":306,"ss":0,"used":false},{"PRN":25,"el":8,"az":0,"ss":0,"used":false},{"PRN":12,"el":7,"az":321,"ss":15,"used":false}]} $GPRMC,110530.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6F {"class":"TPV","mode":3,"time":"2011-03-14T11:05:30.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110531.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7C $GPGLL,5709.8067,N,00207.2822,W,110531.000,A,A*41 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110531.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6E {"class":"TPV","mode":3,"time":"2011-03-14T11:05:31.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110532.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7F $GPGLL,5709.8067,N,00207.2822,W,110532.000,A,A*42 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110532.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6D {"class":"TPV","mode":3,"time":"2011-03-14T11:05:32.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 $GPGGA,110533.000,5709.8067,N,00207.2822,W,1,08,1.0,59.3,M,48.2,M,,0000*7E $GPGLL,5709.8067,N,00207.2822,W,110533.000,A,A*43 $GPGSA,A,3,23,04,20,31,32,17,13,24,,,,,2.1,1.0,1.8*3F $GPRMC,110533.000,A,5709.8067,N,00207.2822,W,0.00,,140311,,,A*6C {"class":"TPV","mode":3,"time":"2011-03-14T11:05:33.000Z","ept":0.005,"lat":57.163445000,"lon":-2.121370000,"alt":59.300,"epx":10.256,"epy":11.488,"epv":41.400,"track":0.0000,"speed":0.000,"climb":0.000,"eps":22.98,"epc":82.80} $GPVTG,,T,,M,0.00,N,0.0,K,A*13 gpsd-3.15/test/daemon/neo-m8n.log0000664000175000017500000004150012506064430014753 0ustar esresr# Name: BN-880 # Chipset = ublox NEO-M8N # Date = 2015-03-18 # Submitter = Gary E. Miller # Notes: $GLGSV for GLONASS sats, and $GPGSV for GNSS sats $GLGSV,3,1,10,66,37,078,27,67,62,349,26,68,20,296,25,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,26,78,04,176,19,82,25,245,26*67 $GLGSV,3,3,10,83,27,309,29,84,01,353,*63 $GNGLL,4404.14066,N,12118.85481,W,171925.00,A,A*66 $GNRMC,171926.00,A,4404.14063,N,12118.85478,W,0.117,,180315,,,A*76 $GNVTG,,T,,M,0.117,N,0.216,K,A*3F $GNGGA,171926.00,4404.14063,N,12118.85478,W,1,12,0.91,1147.2,M,-21.3,M,,*44 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.56,0.91,1.27*15 $GNGSA,A,3,67,83,76,82,68,,,,,,,,1.56,0.91,1.27*1D $GPGSV,4,1,13,01,53,280,36,03,29,301,24,04,55,223,37,08,38,166,16*7C $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,30,17,06,324,*74 $GPGSV,4,3,13,22,24,112,25,23,08,249,,25,12,069,22,31,58,133,24*7A $GPGSV,4,4,13,32,76,331,31*48 $GLGSV,3,1,10,66,37,078,26,67,62,349,26,68,20,296,24,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,26,78,04,176,19,82,25,245,25*64 $GLGSV,3,3,10,83,27,309,29,84,01,353,*63 $GNGLL,4404.14063,N,12118.85478,W,171926.00,A,A*66 $GNRMC,171927.00,A,4404.14058,N,12118.85475,W,0.084,,180315,,,A*79 $GNVTG,,T,,M,0.084,N,0.156,K,A*33 $GNGGA,171927.00,4404.14058,N,12118.85475,W,1,12,0.91,1147.0,M,-21.3,M,,*42 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.56,0.91,1.27*15 $GNGSA,A,3,67,83,76,82,68,,,,,,,,1.56,0.91,1.27*1D $GPGSV,4,1,13,01,53,280,36,03,29,301,23,04,55,223,37,08,38,166,15*78 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,,25,12,069,21,31,58,133,23*7F $GPGSV,4,4,13,32,76,331,30*49 $GLGSV,3,1,10,66,37,078,26,67,62,349,26,68,20,296,23,75,04,018,*69 $GLGSV,3,2,10,76,43,057,24,77,43,139,25,78,04,176,18,82,25,245,25*67 $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B $GNGLL,4404.14058,N,12118.85475,W,171927.00,A,A*62 $GNRMC,171928.00,A,4404.14055,N,12118.85469,W,0.116,,180315,,,A*7C $GNVTG,,T,,M,0.116,N,0.215,K,A*3D $GNGGA,171928.00,4404.14055,N,12118.85469,W,1,12,0.91,1146.7,M,-21.3,M,,*4B $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.56,0.91,1.27*15 $GNGSA,A,3,67,83,76,82,68,,,,,,,,1.56,0.91,1.27*1D $GPGSV,4,1,13,01,53,279,36,03,29,301,23,04,55,223,37,08,38,166,15*7E $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,,25,12,069,19,31,58,133,23*74 $GPGSV,4,4,13,32,76,331,30*49 $GLGSV,3,1,10,66,37,078,26,67,62,349,24,68,20,296,23,75,04,018,*6B $GLGSV,3,2,10,76,43,057,24,77,43,139,25,78,04,176,17,82,25,245,25*68 $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B $GNGLL,4404.14055,N,12118.85469,W,171928.00,A,A*6D $GNRMC,171929.00,A,4404.14054,N,12118.85469,W,0.145,,180315,,,A*7A $GNVTG,,T,,M,0.145,N,0.268,K,A*31 $GNGGA,171929.00,4404.14054,N,12118.85469,W,1,12,0.91,1146.8,M,-21.3,M,,*44 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.56,0.91,1.27*15 $GNGSA,A,3,67,83,76,82,68,,,,,,,,1.56,0.91,1.27*1D $GPGSV,4,1,13,01,53,279,36,03,29,301,22,04,55,223,37,08,38,166,15*7F $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,17,25,12,069,19,31,58,133,21*70 $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,24,67,62,349,22,68,20,296,21,75,04,018,*6D $GLGSV,3,2,10,76,43,057,22,77,43,139,24,78,04,176,15,82,25,245,23*6B $GLGSV,3,3,10,83,27,309,29,84,01,353,*63 $GNGLL,4404.14054,N,12118.85469,W,171929.00,A,A*6D $GNRMC,171930.00,A,4404.14047,N,12118.85466,W,0.086,,180315,,,A*71 $GNVTG,,T,,M,0.086,N,0.160,K,A*34 $GNGGA,171930.00,4404.14047,N,12118.85466,W,1,12,1.02,1146.5,M,-21.3,M,,*47 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.02,1.35*11 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.02,1.35*13 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,223,37,08,38,166,17*76 $GPGSV,4,2,13,11,40,245,28,12,05,034,,14,43,055,29,17,06,324,*7D $GPGSV,4,3,13,22,24,112,24,23,08,249,17,25,12,069,19,31,58,133,22*73 $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,22,67,62,349,21,68,20,296,19,75,04,018,*63 $GLGSV,3,2,10,76,43,057,21,77,43,139,22,78,04,176,11,82,25,245,20*69 $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 $GNGLL,4404.14047,N,12118.85466,W,171930.00,A,A*68 $GNRMC,171931.00,A,4404.14038,N,12118.85466,W,0.097,,180315,,,A*78 $GNVTG,,T,,M,0.097,N,0.180,K,A*3A $GNGGA,171931.00,4404.14038,N,12118.85466,W,1,12,1.01,1146.2,M,-21.3,M,,*4A $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,36,03,30,301,23,04,55,222,37,08,38,166,18*7A $GPGSV,4,2,13,11,40,245,28,12,05,034,,14,43,055,29,17,06,324,*7D $GPGSV,4,3,13,22,24,112,24,23,08,249,18,25,12,069,19,31,58,133,23*7D $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,20,77,43,139,21,78,04,176,,82,25,245,*69 $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 $GNGLL,4404.14038,N,12118.85466,W,171931.00,A,A*61 $GNRMC,171932.00,A,4404.14029,N,12118.85458,W,0.028,,180315,,,A*72 $GNVTG,,T,,M,0.028,N,0.052,K,A*30 $GNGGA,171932.00,4404.14029,N,12118.85458,W,1,12,1.01,1145.6,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,36,03,30,301,22,04,55,222,37,08,38,166,20*70 $GPGSV,4,2,13,11,40,245,28,12,05,034,,14,43,055,29,17,06,324,*7D $GPGSV,4,3,13,22,24,112,24,23,08,249,18,25,12,069,18,31,58,133,24*7B $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,22,67,62,349,20,68,20,296,17,75,04,018,*6C $GLGSV,3,2,10,76,43,057,22,77,43,139,20,78,04,176,,82,25,245,*6A $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 $GNGLL,4404.14029,N,12118.85458,W,171932.00,A,A*6F $GNRMC,171933.00,A,4404.14022,N,12118.85448,W,0.138,,180315,,,A*79 $GNVTG,,T,,M,0.138,N,0.256,K,A*36 $GNGGA,171933.00,4404.14022,N,12118.85448,W,1,12,1.01,1145.1,M,-21.3,M,,*4F $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,222,37,08,38,166,20*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,18,25,12,069,18,31,58,133,24*7B $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,23,67,62,349,19,68,20,296,16,75,04,018,*66 $GLGSV,3,2,10,76,43,057,22,77,43,139,20,78,04,176,,82,25,245,06*6C $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 $GNGLL,4404.14022,N,12118.85448,W,171933.00,A,A*64 $GNRMC,171934.00,A,4404.14014,N,12118.85438,W,0.103,,180315,,,A*74 $GNVTG,,T,,M,0.103,N,0.191,K,A*36 $GNGGA,171934.00,4404.14014,N,12118.85438,W,1,12,1.01,1144.7,M,-21.3,M,,*4D $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,222,37,08,38,166,20*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,17,25,12,069,17,31,58,133,24*7B $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,22,67,62,349,19,68,20,296,16,75,04,018,*67 $GLGSV,3,2,10,76,43,057,22,77,43,139,19,78,04,176,,82,25,245,*60 $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 $GNGLL,4404.14014,N,12118.85438,W,171934.00,A,A*61 $GNRMC,171935.00,A,4404.14008,N,12118.85429,W,0.080,,180315,,,A*72 $GNVTG,,T,,M,0.080,N,0.147,K,A*37 $GNGGA,171935.00,4404.14008,N,12118.85429,W,1,12,1.01,1144.2,M,-21.3,M,,*44 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,222,36,08,39,166,20*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,28,17,06,324,*7D $GPGSV,4,3,13,22,24,112,25,23,08,249,18,25,12,069,17,31,58,133,24*75 $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,22,67,62,349,20,68,20,296,16,75,04,018,*6D $GLGSV,3,2,10,76,43,057,23,77,43,139,19,78,04,176,,82,25,245,*61 $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 $GNGLL,4404.14008,N,12118.85429,W,171935.00,A,A*6D $GNRMC,171936.00,A,4404.14003,N,12118.85417,W,0.032,,180315,,,A*7E $GNVTG,,T,,M,0.032,N,0.059,K,A*30 $GNGGA,171936.00,4404.14003,N,12118.85417,W,1,12,1.01,1143.7,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,222,36,08,39,166,20*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,26,23,08,249,17,25,12,069,17,31,58,133,23*7E $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,23,77,43,139,19,78,04,176,,82,25,245,*61 $GLGSV,3,3,10,83,27,309,29,84,01,353,*63 $GNGLL,4404.14003,N,12118.85417,W,171936.00,A,A*68 $GNRMC,171937.00,A,4404.13998,N,12118.85409,W,0.040,,180315,,,A*79 $GNVTG,,T,,M,0.040,N,0.075,K,A*3B $GNGGA,171937.00,4404.13998,N,12118.85409,W,1,12,1.01,1143.5,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,21,04,55,222,36,08,39,166,21*71 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,26,23,08,249,17,25,12,069,17,31,58,133,23*7E $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,21,67,62,349,21,68,20,296,16,75,04,018,*6F $GLGSV,3,2,10,76,43,057,23,77,43,139,19,78,04,176,,82,25,245,*61 $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B $GNGLL,4404.13998,N,12118.85409,W,171937.00,A,A*6A $GNRMC,171938.00,A,4404.13989,N,12118.85402,W,0.056,,180315,,,A*7A $GNVTG,,T,,M,0.056,N,0.103,K,A*3C $GNGGA,171938.00,4404.13989,N,12118.85402,W,1,12,1.01,1143.0,M,-21.3,M,,*42 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,21,04,55,222,37,08,39,166,22*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,26,23,08,249,17,25,12,069,16,31,58,133,24*78 $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,*6D $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B $GNGLL,4404.13989,N,12118.85402,W,171938.00,A,A*6E $GNRMC,171939.00,A,4404.13982,N,12118.85396,W,0.079,,180315,,,A*77 $GNVTG,,T,,M,0.079,N,0.147,K,A*31 $GNGGA,171939.00,4404.13982,N,12118.85396,W,1,12,1.01,1142.6,M,-21.3,M,,*45 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,21,04,55,222,37,08,39,166,22*73 $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,43,055,29,17,06,324,*7B $GPGSV,4,3,13,22,24,112,27,23,08,249,17,25,12,069,15,31,58,133,24*7A $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,08*65 $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B $GNGLL,4404.13982,N,12118.85396,W,171939.00,A,A*6E $GNRMC,171940.00,A,4404.13975,N,12118.85390,W,0.111,,180315,,,A*78 $GNVTG,,T,,M,0.111,N,0.206,K,A*38 $GNGGA,171940.00,4404.13975,N,12118.85390,W,1,12,1.01,1142.3,M,-21.3,M,,*40 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,21,04,55,222,37,08,39,166,23*72 $GPGSV,4,2,13,11,40,245,28,12,05,033,,14,43,055,28,17,06,324,*7B $GPGSV,4,3,13,22,24,112,26,23,08,249,16,25,12,069,15,31,58,133,23*7D $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,21,78,04,176,,82,25,245,12*6F $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B $GNGLL,4404.13975,N,12118.85390,W,171940.00,A,A*6E $GNRMC,171941.00,A,4404.13964,N,12118.85383,W,0.049,,180315,,,A*77 $GNVTG,,T,,M,0.049,N,0.090,K,A*39 $GNGGA,171941.00,4404.13964,N,12118.85383,W,1,12,1.08,1141.9,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.88,1.08,1.54*13 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.88,1.08,1.54*11 $GPGSV,4,1,13,01,53,279,35,03,30,301,20,04,55,222,37,08,39,166,23*73 $GPGSV,4,2,13,11,40,245,28,12,05,033,,14,42,056,28,17,06,324,*79 $GPGSV,4,3,13,22,24,112,26,23,08,249,15,25,12,069,17,31,58,133,22*7D $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,20,67,62,349,20,68,20,296,15,75,04,018,*6C $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,12*6E $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B $GNGLL,4404.13964,N,12118.85383,W,171941.00,A,A*6D $GNRMC,171942.00,A,4404.13951,N,12118.85376,W,0.049,,180315,,,A*78 $GNVTG,,T,,M,0.049,N,0.091,K,A*38 $GNGGA,171942.00,4404.13951,N,12118.85376,W,1,12,1.12,1141.4,M,-21.3,M,,*4A $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.04,1.12,1.70*19 $GNGSA,A,3,67,83,76,,,,,,,,,,2.04,1.12,1.70*15 $GPGSV,4,1,13,01,53,279,35,03,30,301,20,04,55,222,37,08,39,166,23*73 $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,324,*78 $GPGSV,4,3,13,22,24,112,27,23,08,249,12,25,12,069,17,31,58,133,21*78 $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,20,67,62,349,21,68,20,296,,75,04,018,*69 $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,13*6F $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A $GNGLL,4404.13951,N,12118.85376,W,171942.00,A,A*62 $GNRMC,171943.00,A,4404.13941,N,12118.85370,W,0.062,,180315,,,A*77 $GNVTG,,T,,M,0.062,N,0.116,K,A*3F $GNGGA,171943.00,4404.13941,N,12118.85370,W,1,12,1.05,1140.9,M,-21.3,M,,*46 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,20,04,55,222,37,08,39,166,24*74 $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,324,*78 $GPGSV,4,3,13,22,24,112,27,23,08,249,12,25,12,069,17,31,58,133,20*79 $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,20,67,62,349,21,68,20,296,,75,04,018,*69 $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,15*69 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A $GNGLL,4404.13941,N,12118.85370,W,171943.00,A,A*64 $GNRMC,171944.00,A,4404.13933,N,12118.85369,W,0.047,,180315,,,A*7A $GNVTG,,T,,M,0.047,N,0.087,K,A*31 $GNGGA,171944.00,4404.13933,N,12118.85369,W,1,12,1.05,1140.6,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,19,04,55,222,37,08,39,166,25*7F $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,323,*7F $GPGSV,4,3,13,22,24,112,28,23,08,249,09,25,12,069,18,31,58,133,20*73 $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,19,67,62,349,21,68,20,296,,75,04,018,*63 $GLGSV,3,2,10,76,43,057,25,77,43,139,19,78,04,176,,82,25,245,16*60 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A $GNGLL,4404.13933,N,12118.85369,W,171944.00,A,A*6E $GNRMC,171945.00,A,4404.13924,N,12118.85369,W,0.065,,180315,,,A*7D $GNVTG,,T,,M,0.065,N,0.121,K,A*3C $GNGGA,171945.00,4404.13924,N,12118.85369,W,1,12,1.05,1140.3,M,-21.3,M,,*41 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,18,04,55,222,37,08,39,166,26*7D $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,323,*7F $GPGSV,4,3,13,22,24,112,28,23,08,249,,25,12,069,18,31,58,133,20*7A $GPGSV,4,4,13,32,76,331,34*4D $GLGSV,3,1,10,66,37,078,20,67,62,349,22,68,20,296,,75,04,018,*6A $GLGSV,3,2,10,76,43,057,25,77,43,139,19,78,04,176,,82,25,245,15*63 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A $GNGLL,4404.13924,N,12118.85369,W,171945.00,A,A*69 $GNRMC,171946.00,A,4404.13916,N,12118.85369,W,0.065,,180315,,,A*7F $GNVTG,,T,,M,0.065,N,0.120,K,A*3D $GNGGA,171946.00,4404.13916,N,12118.85369,W,1,12,1.05,1140.0,M,-21.3,M,,*40 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,19,04,55,222,37,08,39,166,25*7F $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,29,17,06,323,*7E $GPGSV,4,3,13,22,24,112,28,23,08,249,,25,12,069,17,31,58,133,19*7F $GPGSV,4,4,13,32,76,331,34*4D $GLGSV,3,1,10,66,37,078,20,67,62,349,22,68,20,296,,75,04,018,*6A $GLGSV,3,2,10,76,43,057,26,77,43,139,19,78,04,176,,82,25,245,15*60 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A $GNGLL,4404.13916,N,12118.85369,W,171946.00,A,A*6B $GNRMC,171947.00,A,4404.13910,N,12118.85369,W,0.029,,180315,,,A*70 $GNVTG,,T,,M,0.029,N,0.055,K,A*36 $GNGGA,171947.00,4404.13910,N,12118.85369,W,1,12,1.05,1139.6,M,-21.3,M,,*4F $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,19,04,55,222,37,08,39,166,25*7F $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,323,*7F $GPGSV,4,3,13,22,24,112,29,23,08,249,,25,12,069,17,31,58,133,19*7E $GPGSV,4,4,13,32,76,331,34*4D $GLGSV,3,1,10,66,37,078,19,67,62,349,23,68,20,296,,75,04,018,*61 $GLGSV,3,2,10,76,43,057,26,77,43,139,19,78,04,176,,82,25,245,15*60 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A $GNGLL,4404.13910,N,12118.85369,W,171947.00,A,A*6C $GNRMC,171948.00,A,4404.13902,N,12118.85371,W,0.059,,180315,,,A*72 $GNVTG,,T,,M,0.059,N,0.109,K,A*39 $GNGGA,171948.00,4404.13902,N,12118.85371,W,1,12,1.05,1139.4,M,-21.3,M,,*48 gpsd-3.15/test/daemon/neo-m8n.log.chk0000664000175000017500000014017012506064430015522 0ustar esresr$GPGSV for GNSS sats $GLGSV,3,1,10,66,37,078,27,67,62,349,26,68,20,296,25,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,26,78,04,176,19,82,25,245,26*67 $GLGSV,3,3,10,83,27,309,29,84,01,353,*63 {"class":"SKY","satellites":[{"PRN":66,"el":37,"az":78,"ss":27,"used":false},{"PRN":67,"el":62,"az":349,"ss":26,"used":false},{"PRN":68,"el":20,"az":296,"ss":25,"used":false},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":false},{"PRN":77,"el":43,"az":139,"ss":26,"used":false},{"PRN":78,"el":4,"az":176,"ss":19,"used":false},{"PRN":82,"el":25,"az":245,"ss":26,"used":false},{"PRN":83,"el":27,"az":309,"ss":29,"used":false},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14066,N,12118.85481,W,171925.00,A,A*66 {"class":"TPV","mode":2,"lat":44.069011000,"lon":-121.314246833} $GNRMC,171926.00,A,4404.14063,N,12118.85478,W,0.117,,180315,,,A*76 $GNVTG,,T,,M,0.117,N,0.216,K,A*3F $GNGGA,171926.00,4404.14063,N,12118.85478,W,1,12,0.91,1147.2,M,-21.3,M,,*44 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.56,0.91,1.27*15 $GNGSA,A,3,67,83,76,82,68,,,,,,,,1.56,0.91,1.27*1D $GPGSV,4,1,13,01,53,280,36,03,29,301,24,04,55,223,37,08,38,166,16*7C $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,30,17,06,324,*74 $GPGSV,4,3,13,22,24,112,25,23,08,249,,25,12,069,22,31,58,133,24*7A $GPGSV,4,4,13,32,76,331,31*48 $GLGSV,3,1,10,66,37,078,26,67,62,349,26,68,20,296,24,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,26,78,04,176,19,82,25,245,25*64 $GLGSV,3,3,10,83,27,309,29,84,01,353,*63 {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.27,"tdop":2.25,"hdop":0.91,"gdop":4.43,"pdop":1.56,"satellites":[{"PRN":1,"el":53,"az":280,"ss":36,"used":false},{"PRN":3,"el":29,"az":301,"ss":24,"used":false},{"PRN":4,"el":55,"az":223,"ss":37,"used":false},{"PRN":8,"el":38,"az":166,"ss":16,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":30,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":25,"used":false},{"PRN":23,"el":8,"az":249,"ss":0,"used":false},{"PRN":25,"el":12,"az":69,"ss":22,"used":false},{"PRN":31,"el":58,"az":133,"ss":24,"used":false},{"PRN":32,"el":76,"az":331,"ss":31,"used":false},{"PRN":66,"el":37,"az":78,"ss":26,"used":false},{"PRN":67,"el":62,"az":349,"ss":26,"used":true},{"PRN":68,"el":20,"az":296,"ss":24,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":true},{"PRN":77,"el":43,"az":139,"ss":26,"used":false},{"PRN":78,"el":4,"az":176,"ss":19,"used":false},{"PRN":82,"el":25,"az":245,"ss":25,"used":true},{"PRN":83,"el":27,"az":309,"ss":29,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14063,N,12118.85478,W,171926.00,A,A*66 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:26.000Z","ept":0.005,"lat":44.069010500,"lon":-121.314246333,"alt":1147.200,"epx":17.842,"epy":20.933,"epv":29.210,"track":0.0000,"speed":0.060,"climb":0.000} $GNRMC,171927.00,A,4404.14058,N,12118.85475,W,0.084,,180315,,,A*79 $GNVTG,,T,,M,0.084,N,0.156,K,A*33 $GNGGA,171927.00,4404.14058,N,12118.85475,W,1,12,0.91,1147.0,M,-21.3,M,,*42 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.56,0.91,1.27*15 $GNGSA,A,3,67,83,76,82,68,,,,,,,,1.56,0.91,1.27*1D $GPGSV,4,1,13,01,53,280,36,03,29,301,23,04,55,223,37,08,38,166,15*78 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,,25,12,069,21,31,58,133,23*7F $GPGSV,4,4,13,32,76,331,30*49 $GLGSV,3,1,10,66,37,078,26,67,62,349,26,68,20,296,23,75,04,018,*69 $GLGSV,3,2,10,76,43,057,24,77,43,139,25,78,04,176,18,82,25,245,25*67 $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.27,"tdop":2.25,"hdop":0.91,"gdop":4.43,"pdop":1.56,"satellites":[{"PRN":1,"el":53,"az":280,"ss":36,"used":false},{"PRN":3,"el":29,"az":301,"ss":23,"used":false},{"PRN":4,"el":55,"az":223,"ss":37,"used":false},{"PRN":8,"el":38,"az":166,"ss":15,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":24,"used":false},{"PRN":23,"el":8,"az":249,"ss":0,"used":false},{"PRN":25,"el":12,"az":69,"ss":21,"used":false},{"PRN":31,"el":58,"az":133,"ss":23,"used":false},{"PRN":32,"el":76,"az":331,"ss":30,"used":false},{"PRN":66,"el":37,"az":78,"ss":26,"used":false},{"PRN":67,"el":62,"az":349,"ss":26,"used":true},{"PRN":68,"el":20,"az":296,"ss":23,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":24,"used":true},{"PRN":77,"el":43,"az":139,"ss":25,"used":false},{"PRN":78,"el":4,"az":176,"ss":18,"used":false},{"PRN":82,"el":25,"az":245,"ss":25,"used":true},{"PRN":83,"el":27,"az":309,"ss":30,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14058,N,12118.85475,W,171927.00,A,A*62 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:27.000Z","ept":0.005,"lat":44.069009667,"lon":-121.314245833,"alt":1147.000,"epx":17.842,"epy":20.933,"epv":29.210,"track":0.0000,"speed":0.043,"climb":0.000,"eps":41.87} $GNRMC,171928.00,A,4404.14055,N,12118.85469,W,0.116,,180315,,,A*7C $GNVTG,,T,,M,0.116,N,0.215,K,A*3D $GNGGA,171928.00,4404.14055,N,12118.85469,W,1,12,0.91,1146.7,M,-21.3,M,,*4B $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.56,0.91,1.27*15 $GNGSA,A,3,67,83,76,82,68,,,,,,,,1.56,0.91,1.27*1D $GPGSV,4,1,13,01,53,279,36,03,29,301,23,04,55,223,37,08,38,166,15*7E $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,,25,12,069,19,31,58,133,23*74 $GPGSV,4,4,13,32,76,331,30*49 $GLGSV,3,1,10,66,37,078,26,67,62,349,24,68,20,296,23,75,04,018,*6B $GLGSV,3,2,10,76,43,057,24,77,43,139,25,78,04,176,17,82,25,245,25*68 $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.27,"tdop":2.25,"hdop":0.91,"gdop":4.43,"pdop":1.56,"satellites":[{"PRN":1,"el":53,"az":279,"ss":36,"used":false},{"PRN":3,"el":29,"az":301,"ss":23,"used":false},{"PRN":4,"el":55,"az":223,"ss":37,"used":false},{"PRN":8,"el":38,"az":166,"ss":15,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":24,"used":false},{"PRN":23,"el":8,"az":249,"ss":0,"used":false},{"PRN":25,"el":12,"az":69,"ss":19,"used":false},{"PRN":31,"el":58,"az":133,"ss":23,"used":false},{"PRN":32,"el":76,"az":331,"ss":30,"used":false},{"PRN":66,"el":37,"az":78,"ss":26,"used":false},{"PRN":67,"el":62,"az":349,"ss":24,"used":true},{"PRN":68,"el":20,"az":296,"ss":23,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":24,"used":true},{"PRN":77,"el":43,"az":139,"ss":25,"used":false},{"PRN":78,"el":4,"az":176,"ss":17,"used":false},{"PRN":82,"el":25,"az":245,"ss":25,"used":true},{"PRN":83,"el":27,"az":309,"ss":30,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14055,N,12118.85469,W,171928.00,A,A*6D {"class":"TPV","mode":3,"time":"2015-03-18T17:19:28.000Z","ept":0.005,"lat":44.069009167,"lon":-121.314244833,"alt":1146.700,"epx":17.842,"epy":20.933,"epv":29.210,"track":0.0000,"speed":0.060,"climb":0.000,"eps":41.87} $GNRMC,171929.00,A,4404.14054,N,12118.85469,W,0.145,,180315,,,A*7A $GNVTG,,T,,M,0.145,N,0.268,K,A*31 $GNGGA,171929.00,4404.14054,N,12118.85469,W,1,12,0.91,1146.8,M,-21.3,M,,*44 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.56,0.91,1.27*15 $GNGSA,A,3,67,83,76,82,68,,,,,,,,1.56,0.91,1.27*1D $GPGSV,4,1,13,01,53,279,36,03,29,301,22,04,55,223,37,08,38,166,15*7F $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,17,25,12,069,19,31,58,133,21*70 $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,24,67,62,349,22,68,20,296,21,75,04,018,*6D $GLGSV,3,2,10,76,43,057,22,77,43,139,24,78,04,176,15,82,25,245,23*6B $GLGSV,3,3,10,83,27,309,29,84,01,353,*63 {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.27,"tdop":2.25,"hdop":0.91,"gdop":4.43,"pdop":1.56,"satellites":[{"PRN":1,"el":53,"az":279,"ss":36,"used":false},{"PRN":3,"el":29,"az":301,"ss":22,"used":false},{"PRN":4,"el":55,"az":223,"ss":37,"used":false},{"PRN":8,"el":38,"az":166,"ss":15,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":24,"used":false},{"PRN":23,"el":8,"az":249,"ss":17,"used":false},{"PRN":25,"el":12,"az":69,"ss":19,"used":false},{"PRN":31,"el":58,"az":133,"ss":21,"used":false},{"PRN":32,"el":76,"az":331,"ss":32,"used":false},{"PRN":66,"el":37,"az":78,"ss":24,"used":false},{"PRN":67,"el":62,"az":349,"ss":22,"used":true},{"PRN":68,"el":20,"az":296,"ss":21,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":22,"used":true},{"PRN":77,"el":43,"az":139,"ss":24,"used":false},{"PRN":78,"el":4,"az":176,"ss":15,"used":false},{"PRN":82,"el":25,"az":245,"ss":23,"used":true},{"PRN":83,"el":27,"az":309,"ss":29,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14054,N,12118.85469,W,171929.00,A,A*6D {"class":"TPV","mode":3,"time":"2015-03-18T17:19:29.000Z","ept":0.005,"lat":44.069009000,"lon":-121.314244833,"alt":1146.800,"epx":17.842,"epy":20.933,"epv":29.210,"track":0.0000,"speed":0.075,"climb":0.000,"eps":41.87} $GNRMC,171930.00,A,4404.14047,N,12118.85466,W,0.086,,180315,,,A*71 $GNVTG,,T,,M,0.086,N,0.160,K,A*34 $GNGGA,171930.00,4404.14047,N,12118.85466,W,1,12,1.02,1146.5,M,-21.3,M,,*47 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.02,1.35*11 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.02,1.35*13 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,223,37,08,38,166,17*76 $GPGSV,4,2,13,11,40,245,28,12,05,034,,14,43,055,29,17,06,324,*7D $GPGSV,4,3,13,22,24,112,24,23,08,249,17,25,12,069,19,31,58,133,22*73 $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,22,67,62,349,21,68,20,296,19,75,04,018,*63 $GLGSV,3,2,10,76,43,057,21,77,43,139,22,78,04,176,11,82,25,245,20*69 $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.02,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":22,"used":false},{"PRN":4,"el":55,"az":223,"ss":37,"used":false},{"PRN":8,"el":38,"az":166,"ss":17,"used":false},{"PRN":11,"el":40,"az":245,"ss":28,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":24,"used":false},{"PRN":23,"el":8,"az":249,"ss":17,"used":false},{"PRN":25,"el":12,"az":69,"ss":19,"used":false},{"PRN":31,"el":58,"az":133,"ss":22,"used":false},{"PRN":32,"el":76,"az":331,"ss":32,"used":false},{"PRN":66,"el":37,"az":78,"ss":22,"used":false},{"PRN":67,"el":62,"az":349,"ss":21,"used":true},{"PRN":68,"el":20,"az":296,"ss":19,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":21,"used":true},{"PRN":77,"el":43,"az":139,"ss":22,"used":false},{"PRN":78,"el":4,"az":176,"ss":11,"used":false},{"PRN":82,"el":25,"az":245,"ss":20,"used":false},{"PRN":83,"el":27,"az":309,"ss":28,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14047,N,12118.85466,W,171930.00,A,A*68 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:30.000Z","ept":0.005,"lat":44.069007833,"lon":-121.314244333,"alt":1146.500,"epx":17.842,"epy":20.933,"epv":29.210,"track":0.0000,"speed":0.044,"climb":0.000,"eps":41.87} $GNRMC,171931.00,A,4404.14038,N,12118.85466,W,0.097,,180315,,,A*78 $GNVTG,,T,,M,0.097,N,0.180,K,A*3A $GNGGA,171931.00,4404.14038,N,12118.85466,W,1,12,1.01,1146.2,M,-21.3,M,,*4A $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,36,03,30,301,23,04,55,222,37,08,38,166,18*7A $GPGSV,4,2,13,11,40,245,28,12,05,034,,14,43,055,29,17,06,324,*7D $GPGSV,4,3,13,22,24,112,24,23,08,249,18,25,12,069,19,31,58,133,23*7D $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,20,77,43,139,21,78,04,176,,82,25,245,*69 $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":36,"used":false},{"PRN":3,"el":30,"az":301,"ss":23,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":38,"az":166,"ss":18,"used":false},{"PRN":11,"el":40,"az":245,"ss":28,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":24,"used":false},{"PRN":23,"el":8,"az":249,"ss":18,"used":false},{"PRN":25,"el":12,"az":69,"ss":19,"used":false},{"PRN":31,"el":58,"az":133,"ss":23,"used":false},{"PRN":32,"el":76,"az":331,"ss":32,"used":false},{"PRN":66,"el":37,"az":78,"ss":21,"used":false},{"PRN":67,"el":62,"az":349,"ss":20,"used":true},{"PRN":68,"el":20,"az":296,"ss":16,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":20,"used":true},{"PRN":77,"el":43,"az":139,"ss":21,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":0,"used":false},{"PRN":83,"el":27,"az":309,"ss":28,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14038,N,12118.85466,W,171931.00,A,A*61 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:31.000Z","ept":0.005,"lat":44.069006333,"lon":-121.314244333,"alt":1146.200,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.050,"climb":0.000,"eps":41.87} $GNRMC,171932.00,A,4404.14029,N,12118.85458,W,0.028,,180315,,,A*72 $GNVTG,,T,,M,0.028,N,0.052,K,A*30 $GNGGA,171932.00,4404.14029,N,12118.85458,W,1,12,1.01,1145.6,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,36,03,30,301,22,04,55,222,37,08,38,166,20*70 $GPGSV,4,2,13,11,40,245,28,12,05,034,,14,43,055,29,17,06,324,*7D $GPGSV,4,3,13,22,24,112,24,23,08,249,18,25,12,069,18,31,58,133,24*7B $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,22,67,62,349,20,68,20,296,17,75,04,018,*6C $GLGSV,3,2,10,76,43,057,22,77,43,139,20,78,04,176,,82,25,245,*6A $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":36,"used":false},{"PRN":3,"el":30,"az":301,"ss":22,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":38,"az":166,"ss":20,"used":false},{"PRN":11,"el":40,"az":245,"ss":28,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":24,"used":false},{"PRN":23,"el":8,"az":249,"ss":18,"used":false},{"PRN":25,"el":12,"az":69,"ss":18,"used":false},{"PRN":31,"el":58,"az":133,"ss":24,"used":false},{"PRN":32,"el":76,"az":331,"ss":32,"used":false},{"PRN":66,"el":37,"az":78,"ss":22,"used":false},{"PRN":67,"el":62,"az":349,"ss":20,"used":true},{"PRN":68,"el":20,"az":296,"ss":17,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":22,"used":true},{"PRN":77,"el":43,"az":139,"ss":20,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":0,"used":false},{"PRN":83,"el":27,"az":309,"ss":28,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14029,N,12118.85458,W,171932.00,A,A*6F {"class":"TPV","mode":3,"time":"2015-03-18T17:19:32.000Z","ept":0.005,"lat":44.069004833,"lon":-121.314243000,"alt":1145.600,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.014,"climb":0.000,"eps":41.87} $GNRMC,171933.00,A,4404.14022,N,12118.85448,W,0.138,,180315,,,A*79 $GNVTG,,T,,M,0.138,N,0.256,K,A*36 $GNGGA,171933.00,4404.14022,N,12118.85448,W,1,12,1.01,1145.1,M,-21.3,M,,*4F $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,222,37,08,38,166,20*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,18,25,12,069,18,31,58,133,24*7B $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,23,67,62,349,19,68,20,296,16,75,04,018,*66 $GLGSV,3,2,10,76,43,057,22,77,43,139,20,78,04,176,,82,25,245,06*6C $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":22,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":38,"az":166,"ss":20,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":24,"used":false},{"PRN":23,"el":8,"az":249,"ss":18,"used":false},{"PRN":25,"el":12,"az":69,"ss":18,"used":false},{"PRN":31,"el":58,"az":133,"ss":24,"used":false},{"PRN":32,"el":76,"az":331,"ss":32,"used":false},{"PRN":66,"el":37,"az":78,"ss":23,"used":false},{"PRN":67,"el":62,"az":349,"ss":19,"used":true},{"PRN":68,"el":20,"az":296,"ss":16,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":22,"used":true},{"PRN":77,"el":43,"az":139,"ss":20,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":6,"used":false},{"PRN":83,"el":27,"az":309,"ss":28,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14022,N,12118.85448,W,171933.00,A,A*64 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:33.000Z","ept":0.005,"lat":44.069003667,"lon":-121.314241333,"alt":1145.100,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.071,"climb":0.000,"eps":41.87} $GNRMC,171934.00,A,4404.14014,N,12118.85438,W,0.103,,180315,,,A*74 $GNVTG,,T,,M,0.103,N,0.191,K,A*36 $GNGGA,171934.00,4404.14014,N,12118.85438,W,1,12,1.01,1144.7,M,-21.3,M,,*4D $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,222,37,08,38,166,20*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,24,23,08,249,17,25,12,069,17,31,58,133,24*7B $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,22,67,62,349,19,68,20,296,16,75,04,018,*67 $GLGSV,3,2,10,76,43,057,22,77,43,139,19,78,04,176,,82,25,245,*60 $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":22,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":38,"az":166,"ss":20,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":24,"used":false},{"PRN":23,"el":8,"az":249,"ss":17,"used":false},{"PRN":25,"el":12,"az":69,"ss":17,"used":false},{"PRN":31,"el":58,"az":133,"ss":24,"used":false},{"PRN":32,"el":76,"az":331,"ss":32,"used":false},{"PRN":66,"el":37,"az":78,"ss":22,"used":false},{"PRN":67,"el":62,"az":349,"ss":19,"used":true},{"PRN":68,"el":20,"az":296,"ss":16,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":22,"used":true},{"PRN":77,"el":43,"az":139,"ss":19,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":0,"used":false},{"PRN":83,"el":27,"az":309,"ss":28,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14014,N,12118.85438,W,171934.00,A,A*61 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:34.000Z","ept":0.005,"lat":44.069002333,"lon":-121.314239667,"alt":1144.700,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.053,"climb":0.000,"eps":41.87} $GNRMC,171935.00,A,4404.14008,N,12118.85429,W,0.080,,180315,,,A*72 $GNVTG,,T,,M,0.080,N,0.147,K,A*37 $GNGGA,171935.00,4404.14008,N,12118.85429,W,1,12,1.01,1144.2,M,-21.3,M,,*44 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,222,36,08,39,166,20*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,28,17,06,324,*7D $GPGSV,4,3,13,22,24,112,25,23,08,249,18,25,12,069,17,31,58,133,24*75 $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,22,67,62,349,20,68,20,296,16,75,04,018,*6D $GLGSV,3,2,10,76,43,057,23,77,43,139,19,78,04,176,,82,25,245,*61 $GLGSV,3,3,10,83,27,309,28,84,01,353,*62 {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":22,"used":false},{"PRN":4,"el":55,"az":222,"ss":36,"used":false},{"PRN":8,"el":39,"az":166,"ss":20,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":28,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":25,"used":false},{"PRN":23,"el":8,"az":249,"ss":18,"used":false},{"PRN":25,"el":12,"az":69,"ss":17,"used":false},{"PRN":31,"el":58,"az":133,"ss":24,"used":false},{"PRN":32,"el":76,"az":331,"ss":32,"used":false},{"PRN":66,"el":37,"az":78,"ss":22,"used":false},{"PRN":67,"el":62,"az":349,"ss":20,"used":true},{"PRN":68,"el":20,"az":296,"ss":16,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":23,"used":true},{"PRN":77,"el":43,"az":139,"ss":19,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":0,"used":false},{"PRN":83,"el":27,"az":309,"ss":28,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14008,N,12118.85429,W,171935.00,A,A*6D {"class":"TPV","mode":3,"time":"2015-03-18T17:19:35.000Z","ept":0.005,"lat":44.069001333,"lon":-121.314238167,"alt":1144.200,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.041,"climb":0.000,"eps":41.87} $GNRMC,171936.00,A,4404.14003,N,12118.85417,W,0.032,,180315,,,A*7E $GNVTG,,T,,M,0.032,N,0.059,K,A*30 $GNGGA,171936.00,4404.14003,N,12118.85417,W,1,12,1.01,1143.7,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,22,04,55,222,36,08,39,166,20*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,26,23,08,249,17,25,12,069,17,31,58,133,23*7E $GPGSV,4,4,13,32,76,331,32*4B $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,23,77,43,139,19,78,04,176,,82,25,245,*61 $GLGSV,3,3,10,83,27,309,29,84,01,353,*63 {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":22,"used":false},{"PRN":4,"el":55,"az":222,"ss":36,"used":false},{"PRN":8,"el":39,"az":166,"ss":20,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":26,"used":false},{"PRN":23,"el":8,"az":249,"ss":17,"used":false},{"PRN":25,"el":12,"az":69,"ss":17,"used":false},{"PRN":31,"el":58,"az":133,"ss":23,"used":false},{"PRN":32,"el":76,"az":331,"ss":32,"used":false},{"PRN":66,"el":37,"az":78,"ss":21,"used":false},{"PRN":67,"el":62,"az":349,"ss":20,"used":true},{"PRN":68,"el":20,"az":296,"ss":16,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":23,"used":true},{"PRN":77,"el":43,"az":139,"ss":19,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":0,"used":false},{"PRN":83,"el":27,"az":309,"ss":29,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.14003,N,12118.85417,W,171936.00,A,A*68 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:36.000Z","ept":0.005,"lat":44.069000500,"lon":-121.314236167,"alt":1143.700,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.016,"climb":0.000,"eps":41.87} $GNRMC,171937.00,A,4404.13998,N,12118.85409,W,0.040,,180315,,,A*79 $GNVTG,,T,,M,0.040,N,0.075,K,A*3B $GNGGA,171937.00,4404.13998,N,12118.85409,W,1,12,1.01,1143.5,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,21,04,55,222,36,08,39,166,21*71 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,26,23,08,249,17,25,12,069,17,31,58,133,23*7E $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,21,67,62,349,21,68,20,296,16,75,04,018,*6F $GLGSV,3,2,10,76,43,057,23,77,43,139,19,78,04,176,,82,25,245,*61 $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":21,"used":false},{"PRN":4,"el":55,"az":222,"ss":36,"used":false},{"PRN":8,"el":39,"az":166,"ss":21,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":26,"used":false},{"PRN":23,"el":8,"az":249,"ss":17,"used":false},{"PRN":25,"el":12,"az":69,"ss":17,"used":false},{"PRN":31,"el":58,"az":133,"ss":23,"used":false},{"PRN":32,"el":76,"az":331,"ss":33,"used":false},{"PRN":66,"el":37,"az":78,"ss":21,"used":false},{"PRN":67,"el":62,"az":349,"ss":21,"used":true},{"PRN":68,"el":20,"az":296,"ss":16,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":23,"used":true},{"PRN":77,"el":43,"az":139,"ss":19,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":0,"used":false},{"PRN":83,"el":27,"az":309,"ss":30,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13998,N,12118.85409,W,171937.00,A,A*6A {"class":"TPV","mode":3,"time":"2015-03-18T17:19:37.000Z","ept":0.005,"lat":44.068999667,"lon":-121.314234833,"alt":1143.500,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.021,"climb":0.000,"eps":41.87} $GNRMC,171938.00,A,4404.13989,N,12118.85402,W,0.056,,180315,,,A*7A $GNVTG,,T,,M,0.056,N,0.103,K,A*3C $GNGGA,171938.00,4404.13989,N,12118.85402,W,1,12,1.01,1143.0,M,-21.3,M,,*42 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,21,04,55,222,37,08,39,166,22*73 $GPGSV,4,2,13,11,40,245,29,12,05,034,,14,43,055,29,17,06,324,*7C $GPGSV,4,3,13,22,24,112,26,23,08,249,17,25,12,069,16,31,58,133,24*78 $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,*6D $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":21,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":22,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":34,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":26,"used":false},{"PRN":23,"el":8,"az":249,"ss":17,"used":false},{"PRN":25,"el":12,"az":69,"ss":16,"used":false},{"PRN":31,"el":58,"az":133,"ss":24,"used":false},{"PRN":32,"el":76,"az":331,"ss":33,"used":false},{"PRN":66,"el":37,"az":78,"ss":21,"used":false},{"PRN":67,"el":62,"az":349,"ss":20,"used":true},{"PRN":68,"el":20,"az":296,"ss":16,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":true},{"PRN":77,"el":43,"az":139,"ss":20,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":0,"used":false},{"PRN":83,"el":27,"az":309,"ss":30,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13989,N,12118.85402,W,171938.00,A,A*6E {"class":"TPV","mode":3,"time":"2015-03-18T17:19:38.000Z","ept":0.005,"lat":44.068998167,"lon":-121.314233667,"alt":1143.000,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.029,"climb":0.000,"eps":41.87} $GNRMC,171939.00,A,4404.13982,N,12118.85396,W,0.079,,180315,,,A*77 $GNVTG,,T,,M,0.079,N,0.147,K,A*31 $GNGGA,171939.00,4404.13982,N,12118.85396,W,1,12,1.01,1142.6,M,-21.3,M,,*45 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,21,04,55,222,37,08,39,166,22*73 $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,43,055,29,17,06,324,*7B $GPGSV,4,3,13,22,24,112,27,23,08,249,17,25,12,069,15,31,58,133,24*7A $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,08*65 $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":21,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":22,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":33,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":29,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":27,"used":false},{"PRN":23,"el":8,"az":249,"ss":17,"used":false},{"PRN":25,"el":12,"az":69,"ss":15,"used":false},{"PRN":31,"el":58,"az":133,"ss":24,"used":false},{"PRN":32,"el":76,"az":331,"ss":33,"used":false},{"PRN":66,"el":37,"az":78,"ss":21,"used":false},{"PRN":67,"el":62,"az":349,"ss":20,"used":true},{"PRN":68,"el":20,"az":296,"ss":16,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":true},{"PRN":77,"el":43,"az":139,"ss":20,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":8,"used":false},{"PRN":83,"el":27,"az":309,"ss":30,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13982,N,12118.85396,W,171939.00,A,A*6E {"class":"TPV","mode":3,"time":"2015-03-18T17:19:39.000Z","ept":0.005,"lat":44.068997000,"lon":-121.314232667,"alt":1142.600,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.041,"climb":0.000,"eps":41.87} $GNRMC,171940.00,A,4404.13975,N,12118.85390,W,0.111,,180315,,,A*78 $GNVTG,,T,,M,0.111,N,0.206,K,A*38 $GNGGA,171940.00,4404.13975,N,12118.85390,W,1,12,1.01,1142.3,M,-21.3,M,,*40 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.69,1.01,1.35*12 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.69,1.01,1.35*10 $GPGSV,4,1,13,01,53,279,35,03,30,301,21,04,55,222,37,08,39,166,23*72 $GPGSV,4,2,13,11,40,245,28,12,05,033,,14,43,055,28,17,06,324,*7B $GPGSV,4,3,13,22,24,112,26,23,08,249,16,25,12,069,15,31,58,133,23*7D $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,21,67,62,349,20,68,20,296,16,75,04,018,*6E $GLGSV,3,2,10,76,43,057,25,77,43,139,21,78,04,176,,82,25,245,12*6F $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.35,"tdop":2.25,"hdop":1.01,"gdop":4.43,"pdop":1.69,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":21,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":23,"used":false},{"PRN":11,"el":40,"az":245,"ss":28,"used":false},{"PRN":12,"el":5,"az":33,"ss":0,"used":false},{"PRN":14,"el":43,"az":55,"ss":28,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":26,"used":false},{"PRN":23,"el":8,"az":249,"ss":16,"used":false},{"PRN":25,"el":12,"az":69,"ss":15,"used":false},{"PRN":31,"el":58,"az":133,"ss":23,"used":false},{"PRN":32,"el":76,"az":331,"ss":33,"used":false},{"PRN":66,"el":37,"az":78,"ss":21,"used":false},{"PRN":67,"el":62,"az":349,"ss":20,"used":true},{"PRN":68,"el":20,"az":296,"ss":16,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":true},{"PRN":77,"el":43,"az":139,"ss":21,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":12,"used":false},{"PRN":83,"el":27,"az":309,"ss":30,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13975,N,12118.85390,W,171940.00,A,A*6E {"class":"TPV","mode":3,"time":"2015-03-18T17:19:40.000Z","ept":0.005,"lat":44.068995833,"lon":-121.314231667,"alt":1142.300,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.057,"climb":0.000,"eps":41.87} $GNRMC,171941.00,A,4404.13964,N,12118.85383,W,0.049,,180315,,,A*77 $GNVTG,,T,,M,0.049,N,0.090,K,A*39 $GNGGA,171941.00,4404.13964,N,12118.85383,W,1,12,1.08,1141.9,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,1.88,1.08,1.54*13 $GNGSA,A,3,67,83,76,68,,,,,,,,,1.88,1.08,1.54*11 $GPGSV,4,1,13,01,53,279,35,03,30,301,20,04,55,222,37,08,39,166,23*73 $GPGSV,4,2,13,11,40,245,28,12,05,033,,14,42,056,28,17,06,324,*79 $GPGSV,4,3,13,22,24,112,26,23,08,249,15,25,12,069,17,31,58,133,22*7D $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,20,67,62,349,20,68,20,296,15,75,04,018,*6C $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,12*6E $GLGSV,3,3,10,83,27,309,30,84,01,353,*6B {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.54,"tdop":2.25,"hdop":1.08,"gdop":4.43,"pdop":1.88,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":20,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":23,"used":false},{"PRN":11,"el":40,"az":245,"ss":28,"used":false},{"PRN":12,"el":5,"az":33,"ss":0,"used":false},{"PRN":14,"el":42,"az":56,"ss":28,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":26,"used":false},{"PRN":23,"el":8,"az":249,"ss":15,"used":false},{"PRN":25,"el":12,"az":69,"ss":17,"used":false},{"PRN":31,"el":58,"az":133,"ss":22,"used":false},{"PRN":32,"el":76,"az":331,"ss":33,"used":false},{"PRN":66,"el":37,"az":78,"ss":20,"used":false},{"PRN":67,"el":62,"az":349,"ss":20,"used":true},{"PRN":68,"el":20,"az":296,"ss":15,"used":true},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":true},{"PRN":77,"el":43,"az":139,"ss":20,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":12,"used":false},{"PRN":83,"el":27,"az":309,"ss":30,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13964,N,12118.85383,W,171941.00,A,A*6D {"class":"TPV","mode":3,"time":"2015-03-18T17:19:41.000Z","ept":0.005,"lat":44.068994000,"lon":-121.314230500,"alt":1141.900,"epx":17.842,"epy":20.933,"epv":31.050,"track":0.0000,"speed":0.025,"climb":0.000,"eps":41.87} $GNRMC,171942.00,A,4404.13951,N,12118.85376,W,0.049,,180315,,,A*78 $GNVTG,,T,,M,0.049,N,0.091,K,A*38 $GNGGA,171942.00,4404.13951,N,12118.85376,W,1,12,1.12,1141.4,M,-21.3,M,,*4A $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.04,1.12,1.70*19 $GNGSA,A,3,67,83,76,,,,,,,,,,2.04,1.12,1.70*15 $GPGSV,4,1,13,01,53,279,35,03,30,301,20,04,55,222,37,08,39,166,23*73 $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,324,*78 $GPGSV,4,3,13,22,24,112,27,23,08,249,12,25,12,069,17,31,58,133,21*78 $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,20,67,62,349,21,68,20,296,,75,04,018,*69 $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,13*6F $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.70,"tdop":2.25,"hdop":1.12,"gdop":4.43,"pdop":2.04,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":20,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":23,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":33,"ss":0,"used":false},{"PRN":14,"el":42,"az":56,"ss":28,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":27,"used":false},{"PRN":23,"el":8,"az":249,"ss":12,"used":false},{"PRN":25,"el":12,"az":69,"ss":17,"used":false},{"PRN":31,"el":58,"az":133,"ss":21,"used":false},{"PRN":32,"el":76,"az":331,"ss":33,"used":false},{"PRN":66,"el":37,"az":78,"ss":20,"used":false},{"PRN":67,"el":62,"az":349,"ss":21,"used":true},{"PRN":68,"el":20,"az":296,"ss":0,"used":false},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":true},{"PRN":77,"el":43,"az":139,"ss":20,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":13,"used":false},{"PRN":83,"el":27,"az":309,"ss":31,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13951,N,12118.85376,W,171942.00,A,A*62 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:42.000Z","ept":0.005,"lat":44.068991833,"lon":-121.314229333,"alt":1141.400,"epx":17.842,"epy":20.933,"epv":35.420,"track":0.0000,"speed":0.025,"climb":0.000,"eps":41.87} $GNRMC,171943.00,A,4404.13941,N,12118.85370,W,0.062,,180315,,,A*77 $GNVTG,,T,,M,0.062,N,0.116,K,A*3F $GNGGA,171943.00,4404.13941,N,12118.85370,W,1,12,1.05,1140.9,M,-21.3,M,,*46 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,20,04,55,222,37,08,39,166,24*74 $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,324,*78 $GPGSV,4,3,13,22,24,112,27,23,08,249,12,25,12,069,17,31,58,133,20*79 $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,20,67,62,349,21,68,20,296,,75,04,018,*69 $GLGSV,3,2,10,76,43,057,25,77,43,139,20,78,04,176,,82,25,245,15*69 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.73,"tdop":2.25,"hdop":1.05,"gdop":4.43,"pdop":2.02,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":20,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":24,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":33,"ss":0,"used":false},{"PRN":14,"el":42,"az":56,"ss":28,"used":false},{"PRN":17,"el":6,"az":324,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":27,"used":false},{"PRN":23,"el":8,"az":249,"ss":12,"used":false},{"PRN":25,"el":12,"az":69,"ss":17,"used":false},{"PRN":31,"el":58,"az":133,"ss":20,"used":false},{"PRN":32,"el":76,"az":331,"ss":33,"used":false},{"PRN":66,"el":37,"az":78,"ss":20,"used":false},{"PRN":67,"el":62,"az":349,"ss":21,"used":true},{"PRN":68,"el":20,"az":296,"ss":0,"used":false},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":true},{"PRN":77,"el":43,"az":139,"ss":20,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":15,"used":true},{"PRN":83,"el":27,"az":309,"ss":31,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13941,N,12118.85370,W,171943.00,A,A*64 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:43.000Z","ept":0.005,"lat":44.068990167,"lon":-121.314228333,"alt":1140.900,"epx":17.842,"epy":20.933,"epv":39.100,"track":0.0000,"speed":0.032,"climb":0.000,"eps":41.87} $GNRMC,171944.00,A,4404.13933,N,12118.85369,W,0.047,,180315,,,A*7A $GNVTG,,T,,M,0.047,N,0.087,K,A*31 $GNGGA,171944.00,4404.13933,N,12118.85369,W,1,12,1.05,1140.6,M,-21.3,M,,*43 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,19,04,55,222,37,08,39,166,25*7F $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,323,*7F $GPGSV,4,3,13,22,24,112,28,23,08,249,09,25,12,069,18,31,58,133,20*73 $GPGSV,4,4,13,32,76,331,33*4A $GLGSV,3,1,10,66,37,078,19,67,62,349,21,68,20,296,,75,04,018,*63 $GLGSV,3,2,10,76,43,057,25,77,43,139,19,78,04,176,,82,25,245,16*60 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.73,"tdop":2.25,"hdop":1.05,"gdop":4.43,"pdop":2.02,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":19,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":25,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":33,"ss":0,"used":false},{"PRN":14,"el":42,"az":56,"ss":28,"used":false},{"PRN":17,"el":6,"az":323,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":28,"used":false},{"PRN":23,"el":8,"az":249,"ss":9,"used":false},{"PRN":25,"el":12,"az":69,"ss":18,"used":false},{"PRN":31,"el":58,"az":133,"ss":20,"used":false},{"PRN":32,"el":76,"az":331,"ss":33,"used":false},{"PRN":66,"el":37,"az":78,"ss":19,"used":false},{"PRN":67,"el":62,"az":349,"ss":21,"used":true},{"PRN":68,"el":20,"az":296,"ss":0,"used":false},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":true},{"PRN":77,"el":43,"az":139,"ss":19,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":16,"used":true},{"PRN":83,"el":27,"az":309,"ss":31,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13933,N,12118.85369,W,171944.00,A,A*6E {"class":"TPV","mode":3,"time":"2015-03-18T17:19:44.000Z","ept":0.005,"lat":44.068988833,"lon":-121.314228167,"alt":1140.600,"epx":17.842,"epy":20.933,"epv":39.790,"track":0.0000,"speed":0.024,"climb":0.000,"eps":41.87} $GNRMC,171945.00,A,4404.13924,N,12118.85369,W,0.065,,180315,,,A*7D $GNVTG,,T,,M,0.065,N,0.121,K,A*3C $GNGGA,171945.00,4404.13924,N,12118.85369,W,1,12,1.05,1140.3,M,-21.3,M,,*41 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,18,04,55,222,37,08,39,166,26*7D $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,323,*7F $GPGSV,4,3,13,22,24,112,28,23,08,249,,25,12,069,18,31,58,133,20*7A $GPGSV,4,4,13,32,76,331,34*4D $GLGSV,3,1,10,66,37,078,20,67,62,349,22,68,20,296,,75,04,018,*6A $GLGSV,3,2,10,76,43,057,25,77,43,139,19,78,04,176,,82,25,245,15*63 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.73,"tdop":2.25,"hdop":1.05,"gdop":4.43,"pdop":2.02,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":18,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":26,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":33,"ss":0,"used":false},{"PRN":14,"el":42,"az":56,"ss":28,"used":false},{"PRN":17,"el":6,"az":323,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":28,"used":false},{"PRN":23,"el":8,"az":249,"ss":0,"used":false},{"PRN":25,"el":12,"az":69,"ss":18,"used":false},{"PRN":31,"el":58,"az":133,"ss":20,"used":false},{"PRN":32,"el":76,"az":331,"ss":34,"used":false},{"PRN":66,"el":37,"az":78,"ss":20,"used":false},{"PRN":67,"el":62,"az":349,"ss":22,"used":true},{"PRN":68,"el":20,"az":296,"ss":0,"used":false},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":25,"used":true},{"PRN":77,"el":43,"az":139,"ss":19,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":15,"used":true},{"PRN":83,"el":27,"az":309,"ss":31,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13924,N,12118.85369,W,171945.00,A,A*69 {"class":"TPV","mode":3,"time":"2015-03-18T17:19:45.000Z","ept":0.005,"lat":44.068987333,"lon":-121.314228167,"alt":1140.300,"epx":17.842,"epy":20.933,"epv":39.790,"track":0.0000,"speed":0.033,"climb":0.000,"eps":41.87} $GNRMC,171946.00,A,4404.13916,N,12118.85369,W,0.065,,180315,,,A*7F $GNVTG,,T,,M,0.065,N,0.120,K,A*3D $GNGGA,171946.00,4404.13916,N,12118.85369,W,1,12,1.05,1140.0,M,-21.3,M,,*40 $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,19,04,55,222,37,08,39,166,25*7F $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,29,17,06,323,*7E $GPGSV,4,3,13,22,24,112,28,23,08,249,,25,12,069,17,31,58,133,19*7F $GPGSV,4,4,13,32,76,331,34*4D $GLGSV,3,1,10,66,37,078,20,67,62,349,22,68,20,296,,75,04,018,*6A $GLGSV,3,2,10,76,43,057,26,77,43,139,19,78,04,176,,82,25,245,15*60 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.73,"tdop":2.25,"hdop":1.05,"gdop":4.43,"pdop":2.02,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":19,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":25,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":33,"ss":0,"used":false},{"PRN":14,"el":42,"az":56,"ss":29,"used":false},{"PRN":17,"el":6,"az":323,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":28,"used":false},{"PRN":23,"el":8,"az":249,"ss":0,"used":false},{"PRN":25,"el":12,"az":69,"ss":17,"used":false},{"PRN":31,"el":58,"az":133,"ss":19,"used":false},{"PRN":32,"el":76,"az":331,"ss":34,"used":false},{"PRN":66,"el":37,"az":78,"ss":20,"used":false},{"PRN":67,"el":62,"az":349,"ss":22,"used":true},{"PRN":68,"el":20,"az":296,"ss":0,"used":false},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":26,"used":true},{"PRN":77,"el":43,"az":139,"ss":19,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":15,"used":true},{"PRN":83,"el":27,"az":309,"ss":31,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13916,N,12118.85369,W,171946.00,A,A*6B {"class":"TPV","mode":3,"time":"2015-03-18T17:19:46.000Z","ept":0.005,"lat":44.068986000,"lon":-121.314228167,"alt":1140.000,"epx":17.842,"epy":20.933,"epv":39.790,"track":0.0000,"speed":0.033,"climb":0.000,"eps":41.87} $GNRMC,171947.00,A,4404.13910,N,12118.85369,W,0.029,,180315,,,A*70 $GNVTG,,T,,M,0.029,N,0.055,K,A*36 $GNGGA,171947.00,4404.13910,N,12118.85369,W,1,12,1.05,1139.6,M,-21.3,M,,*4F $GNGSA,A,3,01,11,31,14,22,32,04,25,03,,,,2.02,1.05,1.73*1A $GNGSA,A,3,67,83,76,82,,,,,,,,,2.02,1.05,1.73*1C $GPGSV,4,1,13,01,53,279,35,03,30,301,19,04,55,222,37,08,39,166,25*7F $GPGSV,4,2,13,11,40,245,29,12,05,033,,14,42,056,28,17,06,323,*7F $GPGSV,4,3,13,22,24,112,29,23,08,249,,25,12,069,17,31,58,133,19*7E $GPGSV,4,4,13,32,76,331,34*4D $GLGSV,3,1,10,66,37,078,19,67,62,349,23,68,20,296,,75,04,018,*61 $GLGSV,3,2,10,76,43,057,26,77,43,139,19,78,04,176,,82,25,245,15*60 $GLGSV,3,3,10,83,27,309,31,84,01,353,*6A {"class":"SKY","xdop":1.19,"ydop":1.40,"vdop":1.73,"tdop":2.25,"hdop":1.05,"gdop":4.43,"pdop":2.02,"satellites":[{"PRN":1,"el":53,"az":279,"ss":35,"used":false},{"PRN":3,"el":30,"az":301,"ss":19,"used":false},{"PRN":4,"el":55,"az":222,"ss":37,"used":false},{"PRN":8,"el":39,"az":166,"ss":25,"used":false},{"PRN":11,"el":40,"az":245,"ss":29,"used":false},{"PRN":12,"el":5,"az":33,"ss":0,"used":false},{"PRN":14,"el":42,"az":56,"ss":28,"used":false},{"PRN":17,"el":6,"az":323,"ss":0,"used":false},{"PRN":22,"el":24,"az":112,"ss":29,"used":false},{"PRN":23,"el":8,"az":249,"ss":0,"used":false},{"PRN":25,"el":12,"az":69,"ss":17,"used":false},{"PRN":31,"el":58,"az":133,"ss":19,"used":false},{"PRN":32,"el":76,"az":331,"ss":34,"used":false},{"PRN":66,"el":37,"az":78,"ss":19,"used":false},{"PRN":67,"el":62,"az":349,"ss":23,"used":true},{"PRN":68,"el":20,"az":296,"ss":0,"used":false},{"PRN":75,"el":4,"az":18,"ss":0,"used":false},{"PRN":76,"el":43,"az":57,"ss":26,"used":true},{"PRN":77,"el":43,"az":139,"ss":19,"used":false},{"PRN":78,"el":4,"az":176,"ss":0,"used":false},{"PRN":82,"el":25,"az":245,"ss":15,"used":true},{"PRN":83,"el":27,"az":309,"ss":31,"used":true},{"PRN":84,"el":1,"az":353,"ss":0,"used":false}]} $GNGLL,4404.13910,N,12118.85369,W,171947.00,A,A*6C {"class":"TPV","mode":3,"time":"2015-03-18T17:19:47.000Z","ept":0.005,"lat":44.068985000,"lon":-121.314228167,"alt":1139.600,"epx":17.842,"epy":20.933,"epv":39.790,"track":0.0000,"speed":0.015,"climb":0.000,"eps":41.87} $GNRMC,171948.00,A,4404.13902,N,12118.85371,W,0.059,,180315,,,A*72 $GNVTG,,T,,M,0.059,N,0.109,K,A*39 $GNGGA,171948.00,4404.13902,N,12118.85371,W,1,12,1.05,1139.4,M,-21.3,M,,*48 gpsd-3.15/test/daemon/nl402u.log0000664000175000017500000001153212467342657014540 0ustar esresr# Name: NL-402U USB EmpfÀnger # Chipset: u-blox5 GPS & GALILEO SuperSense® # Submitter: Klaus Plöger k.ploeger@gastradata.de # Date: 2009-07-24 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,HW UBX-G5xxx 00040005 *1B $GPTXT,01,01,02,EXT CORE 5.00 (28483) Jun 6 2008 14:42:32*5F $GPTXT,01,01,02,ROM BASE 4.00*12 $GPTXT,01,01,02,MOD LEA-5H-0*2E $GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20 $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,104706.000,A,5405.6081,N,01049.4791,E,0.24,18.02,240709,,,A*53 $GPVTG,18.02,T,,M,0.24,N,0.4,K,A*34 $GPGGA,104706.000,5405.6081,N,01049.4791,E,1,08,1.1,40.8,M,43.6,M,,0000*61 $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 $GPGLL,5405.6081,N,01049.4791,E,104706.000,A,A*51 $GPRMC,104707.000,A,5405.6083,N,01049.4822,E,0.50,19.27,240709,,,A*52 $GPVTG,19.27,T,,M,0.50,N,0.9,K,A*3C $GPGGA,104707.000,5405.6083,N,01049.4822,E,1,08,1.0,40.6,M,43.6,M,,0000*6A $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 $GPGLL,5405.6083,N,01049.4822,E,104707.000,A,A*55 $GPRMC,104708.000,A,5405.6082,N,01049.4856,E,0.32,19.19,240709,,,A*56 $GPVTG,19.19,T,,M,0.32,N,0.6,K,A*3A $GPGGA,104708.000,5405.6082,N,01049.4856,E,1,08,0.9,40.0,M,43.6,M,,0000*69 $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 $GPGLL,5405.6082,N,01049.4856,E,104708.000,A,A*58 $GPRMC,104709.000,A,5405.6083,N,01049.4868,E,0.37,21.29,240709,,,A*56 $GPVTG,21.29,T,,M,0.37,N,0.7,K,A*36 $GPGGA,104709.000,5405.6083,N,01049.4868,E,1,08,0.9,40.6,M,43.6,M,,0000*62 $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 $GPGLL,5405.6083,N,01049.4868,E,104709.000,A,A*55 $GPRMC,104710.000,A,5405.6081,N,01049.4876,E,0.94,27.15,240709,,,A*53 $GPVTG,27.15,T,,M,0.94,N,1.8,K,A*38 $GPGGA,104710.000,5405.6081,N,01049.4876,E,1,08,0.9,40.4,M,43.6,M,,0000*65 $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 $GPGLL,5405.6081,N,01049.4876,E,104710.000,A,A*50 $GPRMC,104711.000,A,5405.6083,N,01049.4879,E,0.63,28.37,240709,,,A*58 $GPVTG,28.37,T,,M,0.63,N,1.2,K,A*35 $GPGGA,104711.000,5405.6083,N,01049.4879,E,1,08,1.0,39.8,M,43.6,M,,0000*63 $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 $GPGLL,5405.6083,N,01049.4879,E,104711.000,A,A*5C $GPRMC,104712.000,A,5405.6086,N,01049.4879,E,1.23,24.74,240709,,,A*50 $GPVTG,24.74,T,,M,1.23,N,2.3,K,A*39 $GPGGA,104712.000,5405.6086,N,01049.4879,E,1,08,1.0,39.2,M,43.6,M,,0000*6F $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 $GPGLL,5405.6086,N,01049.4879,E,104712.000,A,A*5A $GPRMC,104713.000,A,5405.6087,N,01049.4885,E,0.19,24.74,240709,,,A*5B $GPVTG,24.74,T,,M,0.19,N,0.4,K,A*34 $GPGGA,104713.000,5405.6087,N,01049.4885,E,1,08,1.0,39.0,M,43.6,M,,0000*6E $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 $GPGLL,5405.6087,N,01049.4885,E,104713.000,A,A*59 $GPRMC,104714.000,A,5405.6087,N,01049.4885,E,0.25,14.12,240709,,,A*50 $GPVTG,14.12,T,,M,0.25,N,0.5,K,A*39 $GPGGA,104714.000,5405.6087,N,01049.4885,E,1,08,1.0,38.8,M,43.6,M,,0000*60 $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 $GPGLL,5405.6087,N,01049.4885,E,104714.000,A,A*5E gpsd-3.15/test/daemon/nl402u.log.chk0000664000175000017500000003167212467342657015313 0ustar esresr$GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,HW UBX-G5xxx 00040005 *1B $GPTXT,01,01,02,EXT CORE 5.00 (28483) Jun 6 2008 14:42:32*5F $GPTXT,01,01,02,ROM BASE 4.00*12 $GPTXT,01,01,02,MOD LEA-5H-0*2E $GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20 $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,104706.000,A,5405.6081,N,01049.4791,E,0.24,18.02,240709,,,A*53 {"class":"TPV","mode":2,"time":"2009-07-24T10:47:06.000Z","ept":0.005,"lat":54.093468333,"lon":10.824651667,"track":18.0200,"speed":0.123} $GPVTG,18.02,T,,M,0.24,N,0.4,K,A*34 $GPGGA,104706.000,5405.6081,N,01049.4791,E,1,08,1.1,40.8,M,43.6,M,,0000*61 {"class":"TPV","mode":3,"time":"2009-07-24T10:47:06.000Z","ept":0.005,"lat":54.093468333,"lon":10.824651667,"alt":40.800,"track":18.0200,"speed":0.123} $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.7,1.1,1.3*3C {"class":"TPV","mode":3,"time":"2009-07-24T10:47:06.000Z","ept":0.005,"lat":54.093468333,"lon":10.824651667,"alt":40.800,"epv":29.900,"track":18.0200,"speed":0.123,"climb":0.000} $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","xdop":0.62,"ydop":0.71,"vdop":1.30,"tdop":0.79,"hdop":1.10,"gdop":1.80,"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","mode":3,"time":"2009-07-24T10:47:06.000Z","ept":0.005,"lat":54.093468333,"lon":10.824651667,"alt":40.800,"epx":9.255,"epy":10.588,"epv":29.900,"track":18.0200,"speed":0.123,"climb":0.000} $GPRMC,104707.000,A,5405.6083,N,01049.4822,E,0.50,19.27,240709,,,A*52 $GPVTG,19.27,T,,M,0.50,N,0.9,K,A*3C $GPGGA,104707.000,5405.6083,N,01049.4822,E,1,08,1.0,40.6,M,43.6,M,,0000*6A $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","xdop":0.62,"ydop":0.71,"vdop":1.30,"tdop":0.79,"hdop":1.00,"gdop":1.80,"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","mode":3,"time":"2009-07-24T10:47:07.000Z","ept":0.005,"lat":54.093471667,"lon":10.824703333,"alt":40.600,"epx":9.255,"epy":10.588,"epv":29.900,"track":19.2700,"speed":0.257,"climb":0.000,"eps":21.18} $GPRMC,104708.000,A,5405.6082,N,01049.4856,E,0.32,19.19,240709,,,A*56 $GPVTG,19.19,T,,M,0.32,N,0.6,K,A*3A $GPGGA,104708.000,5405.6082,N,01049.4856,E,1,08,0.9,40.0,M,43.6,M,,0000*69 $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","xdop":0.62,"ydop":0.71,"vdop":1.30,"tdop":0.79,"hdop":0.90,"gdop":1.80,"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","mode":3,"time":"2009-07-24T10:47:08.000Z","ept":0.005,"lat":54.093470000,"lon":10.824760000,"alt":40.000,"epx":9.255,"epy":10.588,"epv":29.900,"track":19.1900,"speed":0.165,"climb":0.000,"eps":21.18} $GPRMC,104709.000,A,5405.6083,N,01049.4868,E,0.37,21.29,240709,,,A*56 $GPVTG,21.29,T,,M,0.37,N,0.7,K,A*36 $GPGGA,104709.000,5405.6083,N,01049.4868,E,1,08,0.9,40.6,M,43.6,M,,0000*62 $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","xdop":0.62,"ydop":0.71,"vdop":1.30,"tdop":0.79,"hdop":0.90,"gdop":1.80,"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","mode":3,"time":"2009-07-24T10:47:09.000Z","ept":0.005,"lat":54.093471667,"lon":10.824780000,"alt":40.600,"epx":9.255,"epy":10.588,"epv":29.900,"track":21.2900,"speed":0.190,"climb":0.000,"eps":21.18} $GPRMC,104710.000,A,5405.6081,N,01049.4876,E,0.94,27.15,240709,,,A*53 $GPVTG,27.15,T,,M,0.94,N,1.8,K,A*38 $GPGGA,104710.000,5405.6081,N,01049.4876,E,1,08,0.9,40.4,M,43.6,M,,0000*65 $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","xdop":0.62,"ydop":0.71,"vdop":1.30,"tdop":0.79,"hdop":0.90,"gdop":1.80,"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","mode":3,"time":"2009-07-24T10:47:10.000Z","ept":0.005,"lat":54.093468333,"lon":10.824793333,"alt":40.400,"epx":9.255,"epy":10.588,"epv":29.900,"track":27.1500,"speed":0.484,"climb":0.000,"eps":21.18} $GPRMC,104711.000,A,5405.6083,N,01049.4879,E,0.63,28.37,240709,,,A*58 $GPVTG,28.37,T,,M,0.63,N,1.2,K,A*35 $GPGGA,104711.000,5405.6083,N,01049.4879,E,1,08,1.0,39.8,M,43.6,M,,0000*63 $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","xdop":0.62,"ydop":0.71,"vdop":1.30,"tdop":0.79,"hdop":1.00,"gdop":1.80,"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","mode":3,"time":"2009-07-24T10:47:11.000Z","ept":0.005,"lat":54.093471667,"lon":10.824798333,"alt":39.800,"epx":9.255,"epy":10.588,"epv":29.900,"track":28.3700,"speed":0.324,"climb":0.000,"eps":21.18} $GPRMC,104712.000,A,5405.6086,N,01049.4879,E,1.23,24.74,240709,,,A*50 $GPVTG,24.74,T,,M,1.23,N,2.3,K,A*39 $GPGGA,104712.000,5405.6086,N,01049.4879,E,1,08,1.0,39.2,M,43.6,M,,0000*6F $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","xdop":0.62,"ydop":0.71,"vdop":1.30,"tdop":0.79,"hdop":1.00,"gdop":1.80,"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","mode":3,"time":"2009-07-24T10:47:12.000Z","ept":0.005,"lat":54.093476667,"lon":10.824798333,"alt":39.200,"epx":9.255,"epy":10.588,"epv":29.900,"track":24.7400,"speed":0.633,"climb":0.000,"eps":21.18} $GPRMC,104713.000,A,5405.6087,N,01049.4885,E,0.19,24.74,240709,,,A*5B $GPVTG,24.74,T,,M,0.19,N,0.4,K,A*34 $GPGGA,104713.000,5405.6087,N,01049.4885,E,1,08,1.0,39.0,M,43.6,M,,0000*6E $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","xdop":0.62,"ydop":0.71,"vdop":1.30,"tdop":0.79,"hdop":1.00,"gdop":1.80,"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","mode":3,"time":"2009-07-24T10:47:13.000Z","ept":0.005,"lat":54.093478333,"lon":10.824808333,"alt":39.000,"epx":9.255,"epy":10.588,"epv":29.900,"track":24.7400,"speed":0.098,"climb":0.000,"eps":21.18} $GPRMC,104714.000,A,5405.6087,N,01049.4885,E,0.25,14.12,240709,,,A*50 $GPVTG,14.12,T,,M,0.25,N,0.5,K,A*39 $GPGGA,104714.000,5405.6087,N,01049.4885,E,1,08,1.0,38.8,M,43.6,M,,0000*60 $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","xdop":0.62,"ydop":0.71,"vdop":1.30,"tdop":0.79,"hdop":1.00,"gdop":1.80,"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","mode":3,"time":"2009-07-24T10:47:14.000Z","ept":0.005,"lat":54.093478333,"lon":10.824808333,"alt":38.800,"epx":9.255,"epy":10.588,"epv":29.900,"track":14.1200,"speed":0.129,"climb":0.000,"eps":21.18} gpsd-3.15/test/daemon/nl551e.log0000664000175000017500000001557312467342657014536 0ustar esresr# Name: Navilock NL-551EUSB ublox5 # Chipset = u-blox5 GPS & GALILEO SuperSense # Firmware = 6.02 # Date = 2012-07-03 # Submitter = Bas van Duijnhoven # Location = Rheden, NL, 52.002N 6.036E $GPRMC,191418.00,V,,,,,,,040712,,,N*79 $GPVTG,,,,,,,,,N*30 $GPGGA,191418.00,,,,,0,00,99.99,,,,,,*62 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,2,1,07,03,,,38,07,,,36,16,,,37,18,,,41*78 $GPGSV,2,2,07,19,,,39,22,,,39,30,,,43*72 $GPGLL,,,,,191418.00,V,N*4E $GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,HW UBX-G50xx 00040005 *53 $GPTXT,01,01,02,EXT CORE 6.02 (36023) Oct 15 2009 16:52:22*47 $GPTXT,01,01,02,ROM BASE 5.00 (28483) Jun 6 2008 14:45:11*4E $GPTXT,01,01,02,MOD LEA-5H-0*2E $GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20 $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,191419.00,V,,,,,,,040712,,,N*78 $GPVTG,,,,,,,,,N*30 $GPGGA,191419.00,,,,,0,00,99.99,,,,,,*63 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,2,1,07,03,,,37,07,,,35,16,,,36,18,,,41*75 $GPGSV,2,2,07,19,,,39,22,,,38,30,,,42*72 $GPGLL,,,,,191419.00,V,N*4F $GPRMC,191420.00,V,,,,,,,040712,,,N*72 $GPVTG,,,,,,,,,N*30 $GPGGA,191420.00,,,,,0,00,99.99,,,,,,*69 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,2,1,07,03,,,35,07,,,32,16,,,33,18,,,39*7A $GPGSV,2,2,07,19,,,36,22,,,35,30,,,40*72 $GPGLL,,,,,191420.00,V,N*45 # Some duplicative sentences removed here $GPRMC,191433.01,A,5200.17080,N,00602.17433,E,0.203,,040712,,,A*72 $GPVTG,,T,,M,0.203,N,0.375,K,A*23 $GPGGA,191433.01,5200.17080,N,00602.17433,E,1,07,1.45,20.7,M,46.1,M,,*6E $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17080,N,00602.17433,E,191433.01,A,A*6A $GPRMC,191434.00,A,5200.17079,N,00602.17433,E,0.044,,040712,,,A*73 $GPVTG,,T,,M,0.044,N,0.082,K,A*29 $GPGGA,191434.00,5200.17079,N,00602.17433,E,1,07,1.45,20.8,M,46.1,M,,*61 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17079,N,00602.17433,E,191434.00,A,A*6A $GPRMC,191435.00,A,5200.17069,N,00602.17412,E,0.064,,040712,,,A*72 $GPVTG,,T,,M,0.064,N,0.118,K,A*29 $GPGGA,191435.00,5200.17069,N,00602.17412,E,1,07,1.45,20.9,M,46.1,M,,*63 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17069,N,00602.17412,E,191435.00,A,A*69 $GPRMC,191436.00,A,5200.17065,N,00602.17411,E,0.066,,040712,,,A*7C $GPVTG,,T,,M,0.066,N,0.122,K,A*22 $GPGGA,191436.00,5200.17065,N,00602.17411,E,1,07,1.45,21.1,M,46.1,M,,*66 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17065,N,00602.17411,E,191436.00,A,A*65 $GPRMC,191437.00,A,5200.17063,N,00602.17412,E,0.084,,040712,,,A*74 $GPVTG,,T,,M,0.084,N,0.155,K,A*2E $GPGGA,191437.00,5200.17063,N,00602.17412,E,1,07,1.45,21.3,M,46.1,M,,*60 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,35,18,43,111,40*7E $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17063,N,00602.17412,E,191437.00,A,A*61 $GPRMC,191438.00,A,5200.17065,N,00602.17414,E,0.066,,040712,,,A*77 $GPVTG,,T,,M,0.066,N,0.121,K,A*21 $GPGGA,191438.00,5200.17065,N,00602.17414,E,1,07,1.45,21.5,M,46.1,M,,*69 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,35,18,43,111,40*7E $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17065,N,00602.17414,E,191438.00,A,A*6E $GPRMC,191439.00,A,5200.17074,N,00602.17422,E,0.013,,040712,,,A*71 $GPVTG,,T,,M,0.013,N,0.024,K,A*27 $GPGGA,191439.00,5200.17074,N,00602.17422,E,1,07,1.45,21.5,M,46.1,M,,*6D $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,35,18,43,111,40*7E $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17074,N,00602.17422,E,191439.00,A,A*6A $GPRMC,191440.00,A,5200.17080,N,00602.17430,E,0.011,,040712,,,A*75 $GPVTG,,T,,M,0.011,N,0.020,K,A*21 $GPGGA,191440.00,5200.17080,N,00602.17430,E,1,07,1.45,21.4,M,46.1,M,,*6A $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17080,N,00602.17430,E,191440.00,A,A*6C $GPRMC,191441.00,A,5200.17084,N,00602.17436,E,0.011,,040712,,,A*76 $GPVTG,,T,,M,0.011,N,0.021,K,A*20 $GPGGA,191441.00,5200.17084,N,00602.17436,E,1,07,1.45,21.2,M,46.1,M,,*6F $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17084,N,00602.17436,E,191441.00,A,A*6F $GPRMC,191442.00,A,5200.17092,N,00602.17444,E,0.011,,040712,,,A*77 $GPVTG,,T,,M,0.011,N,0.021,K,A*20 $GPGGA,191442.00,5200.17092,N,00602.17444,E,1,07,1.45,21.2,M,46.1,M,,*6E $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 $GPGLL,5200.17092,N,00602.17444,E,191442.00,A,A*6E $GPRMC,191443.00,A,5200.17100,N,00602.17451,E,0.009,,040712,,,A*71 $GPVTG,,T,,M,0.009,N,0.017,K,A*2C $GPGGA,191443.00,5200.17100,N,00602.17451,E,1,07,1.45,21.2,M,46.1,M,,*61 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,36,16,68,221,36,18,43,111,40*7E $GPGSV,2,2,07,19,22,279,39,22,24,159,38,30,43,182,42*49 $GPGLL,5200.17100,N,00602.17451,E,191443.00,A,A*61 $GPRMC,191444.00,A,5200.17105,N,00602.17454,E,0.011,,040712,,,A*7F $GPVTG,,T,,M,0.011,N,0.020,K,A*21 $GPGGA,191444.00,5200.17105,N,00602.17454,E,1,07,1.45,21.2,M,46.1,M,,*66 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,36,16,68,221,36,18,43,111,39*70 $GPGSV,2,2,07,19,22,279,39,22,24,159,38,30,43,182,42*49 $GPGLL,5200.17105,N,00602.17454,E,191444.00,A,A*66 $GPRMC,191445.00,A,5200.17109,N,00602.17462,E,0.010,,040712,,,A*76 $GPVTG,,T,,M,0.010,N,0.019,K,A*2A $GPGGA,191445.00,5200.17109,N,00602.17462,E,1,07,1.45,21.2,M,46.1,M,,*6E $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,39*73 $GPGSV,2,2,07,19,22,279,39,22,24,159,38,30,43,182,42*49 $GPGLL,5200.17109,N,00602.17462,E,191445.00,A,A*6E $GPRMC,191446.00,A,5200.17115,N,00602.17470,E,0.009,,040712,,,A*73 $GPVTG,,T,,M,0.009,N,0.016,K,A*2D $GPGGA,191446.00,5200.17115,N,00602.17470,E,1,07,1.45,21.2,M,46.1,M,,*63 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,39*73 $GPGSV,2,2,07,19,22,279,39,22,24,159,38,30,43,182,42*49 $GPGLL,5200.17115,N,00602.17470,E,191446.00,A,A*63 gpsd-3.15/test/daemon/nl551e.log.chk0000664000175000017500000003741712467342657015303 0ustar esresr$GPRMC,191418.00,V,,,,,,,040712,,,N*79 $GPVTG,,,,,,,,,N*30 $GPGGA,191418.00,,,,,0,00,99.99,,,,,,*62 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 {"class":"TPV","mode":1} $GPGSV,2,1,07,03,,,38,07,,,36,16,,,37,18,,,41*78 $GPGSV,2,2,07,19,,,39,22,,,39,30,,,43*72 $GPGLL,,,,,191418.00,V,N*4E $GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,HW UBX-G50xx 00040005 *53 $GPTXT,01,01,02,EXT CORE 6.02 (36023) Oct 15 2009 16:52:22*47 $GPTXT,01,01,02,ROM BASE 5.00 (28483) Jun 6 2008 14:45:11*4E $GPTXT,01,01,02,MOD LEA-5H-0*2E $GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20 $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,191419.00,V,,,,,,,040712,,,N*78 $GPVTG,,,,,,,,,N*30 $GPGGA,191419.00,,,,,0,00,99.99,,,,,,*63 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 {"class":"TPV","mode":1} $GPGSV,2,1,07,03,,,37,07,,,35,16,,,36,18,,,41*75 $GPGSV,2,2,07,19,,,39,22,,,38,30,,,42*72 $GPGLL,,,,,191419.00,V,N*4F $GPRMC,191420.00,V,,,,,,,040712,,,N*72 $GPVTG,,,,,,,,,N*30 $GPGGA,191420.00,,,,,0,00,99.99,,,,,,*69 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,2,1,07,03,,,35,07,,,32,16,,,33,18,,,39*7A $GPGSV,2,2,07,19,,,36,22,,,35,30,,,40*72 $GPGLL,,,,,191420.00,V,N*45 $GPRMC,191433.01,A,5200.17080,N,00602.17433,E,0.203,,040712,,,A*72 $GPVTG,,T,,M,0.203,N,0.375,K,A*23 $GPGGA,191433.01,5200.17080,N,00602.17433,E,1,07,1.45,20.7,M,46.1,M,,*6E $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.31,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17080,N,00602.17433,E,191433.01,A,A*6A {"class":"TPV","mode":3,"time":"2012-07-04T19:14:33.010Z","ept":0.005,"lat":52.002846667,"lon":6.036238833,"alt":20.700,"epx":14.920,"epy":15.950,"epv":2299.770,"track":0.0000,"speed":0.104,"climb":0.000} $GPRMC,191434.00,A,5200.17079,N,00602.17433,E,0.044,,040712,,,A*73 $GPVTG,,T,,M,0.044,N,0.082,K,A*29 $GPGGA,191434.00,5200.17079,N,00602.17433,E,1,07,1.45,20.8,M,46.1,M,,*61 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.31,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17079,N,00602.17433,E,191434.00,A,A*6A {"class":"TPV","mode":3,"time":"2012-07-04T19:14:34.000Z","ept":0.005,"lat":52.002846500,"lon":6.036238833,"alt":20.800,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.023,"climb":0.000,"eps":32.22} $GPRMC,191435.00,A,5200.17069,N,00602.17412,E,0.064,,040712,,,A*72 $GPVTG,,T,,M,0.064,N,0.118,K,A*29 $GPGGA,191435.00,5200.17069,N,00602.17412,E,1,07,1.45,20.9,M,46.1,M,,*63 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.31,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17069,N,00602.17412,E,191435.00,A,A*69 {"class":"TPV","mode":3,"time":"2012-07-04T19:14:35.000Z","ept":0.005,"lat":52.002844833,"lon":6.036235333,"alt":20.900,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.033,"climb":0.000,"eps":31.90} $GPRMC,191436.00,A,5200.17065,N,00602.17411,E,0.066,,040712,,,A*7C $GPVTG,,T,,M,0.066,N,0.122,K,A*22 $GPGGA,191436.00,5200.17065,N,00602.17411,E,1,07,1.45,21.1,M,46.1,M,,*66 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.31,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17065,N,00602.17411,E,191436.00,A,A*65 {"class":"TPV","mode":3,"time":"2012-07-04T19:14:36.000Z","ept":0.005,"lat":52.002844167,"lon":6.036235167,"alt":21.100,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.034,"climb":0.000,"eps":31.90} $GPRMC,191437.00,A,5200.17063,N,00602.17412,E,0.084,,040712,,,A*74 $GPVTG,,T,,M,0.084,N,0.155,K,A*2E $GPGGA,191437.00,5200.17063,N,00602.17412,E,1,07,1.45,21.3,M,46.1,M,,*60 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,35,18,43,111,40*7E $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.31,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":35,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17063,N,00602.17412,E,191437.00,A,A*61 {"class":"TPV","mode":3,"time":"2012-07-04T19:14:37.000Z","ept":0.005,"lat":52.002843833,"lon":6.036235333,"alt":21.300,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.043,"climb":0.000,"eps":31.90} $GPRMC,191438.00,A,5200.17065,N,00602.17414,E,0.066,,040712,,,A*77 $GPVTG,,T,,M,0.066,N,0.121,K,A*21 $GPGGA,191438.00,5200.17065,N,00602.17414,E,1,07,1.45,21.5,M,46.1,M,,*69 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.31,1.45,1.80*0A $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,35,18,43,111,40*7E $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.31,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":35,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17065,N,00602.17414,E,191438.00,A,A*6E {"class":"TPV","mode":3,"time":"2012-07-04T19:14:38.000Z","ept":0.005,"lat":52.002844167,"lon":6.036235667,"alt":21.500,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.034,"climb":0.000,"eps":31.90} $GPRMC,191439.00,A,5200.17074,N,00602.17422,E,0.013,,040712,,,A*71 $GPVTG,,T,,M,0.013,N,0.024,K,A*27 $GPGGA,191439.00,5200.17074,N,00602.17422,E,1,07,1.45,21.5,M,46.1,M,,*6D $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,35,18,43,111,40*7E $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.32,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":35,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17074,N,00602.17422,E,191439.00,A,A*6A {"class":"TPV","mode":3,"time":"2012-07-04T19:14:39.000Z","ept":0.005,"lat":52.002845667,"lon":6.036237000,"alt":21.500,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.007,"climb":0.000,"eps":31.90} $GPRMC,191440.00,A,5200.17080,N,00602.17430,E,0.011,,040712,,,A*75 $GPVTG,,T,,M,0.011,N,0.020,K,A*21 $GPGGA,191440.00,5200.17080,N,00602.17430,E,1,07,1.45,21.4,M,46.1,M,,*6A $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.32,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17080,N,00602.17430,E,191440.00,A,A*6C {"class":"TPV","mode":3,"time":"2012-07-04T19:14:40.000Z","ept":0.005,"lat":52.002846667,"lon":6.036238333,"alt":21.400,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.006,"climb":0.000,"eps":31.90} $GPRMC,191441.00,A,5200.17084,N,00602.17436,E,0.011,,040712,,,A*76 $GPVTG,,T,,M,0.011,N,0.021,K,A*20 $GPGGA,191441.00,5200.17084,N,00602.17436,E,1,07,1.45,21.2,M,46.1,M,,*6F $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.32,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17084,N,00602.17436,E,191441.00,A,A*6F {"class":"TPV","mode":3,"time":"2012-07-04T19:14:41.000Z","ept":0.005,"lat":52.002847333,"lon":6.036239333,"alt":21.200,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.006,"climb":0.000,"eps":31.90} $GPRMC,191442.00,A,5200.17092,N,00602.17444,E,0.011,,040712,,,A*77 $GPVTG,,T,,M,0.011,N,0.021,K,A*20 $GPGGA,191442.00,5200.17092,N,00602.17444,E,1,07,1.45,21.2,M,46.1,M,,*6E $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,40*7D $GPGSV,2,2,07,19,22,279,39,22,24,159,37,30,43,182,42*46 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.32,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":37,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17092,N,00602.17444,E,191442.00,A,A*6E {"class":"TPV","mode":3,"time":"2012-07-04T19:14:42.000Z","ept":0.005,"lat":52.002848667,"lon":6.036240667,"alt":21.200,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.006,"climb":0.000,"eps":31.90} $GPRMC,191443.00,A,5200.17100,N,00602.17451,E,0.009,,040712,,,A*71 $GPVTG,,T,,M,0.009,N,0.017,K,A*2C $GPGGA,191443.00,5200.17100,N,00602.17451,E,1,07,1.45,21.2,M,46.1,M,,*61 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,36,16,68,221,36,18,43,111,40*7E $GPGSV,2,2,07,19,22,279,39,22,24,159,38,30,43,182,42*49 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.32,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":36,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":40,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":38,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17100,N,00602.17451,E,191443.00,A,A*61 {"class":"TPV","mode":3,"time":"2012-07-04T19:14:43.000Z","ept":0.005,"lat":52.002850000,"lon":6.036241833,"alt":21.200,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.005,"climb":0.000,"eps":31.90} $GPRMC,191444.00,A,5200.17105,N,00602.17454,E,0.011,,040712,,,A*7F $GPVTG,,T,,M,0.011,N,0.020,K,A*21 $GPGGA,191444.00,5200.17105,N,00602.17454,E,1,07,1.45,21.2,M,46.1,M,,*66 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,36,16,68,221,36,18,43,111,39*70 $GPGSV,2,2,07,19,22,279,39,22,24,159,38,30,43,182,42*49 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.32,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":36,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":39,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":38,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17105,N,00602.17454,E,191444.00,A,A*66 {"class":"TPV","mode":3,"time":"2012-07-04T19:14:44.000Z","ept":0.005,"lat":52.002850833,"lon":6.036242333,"alt":21.200,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.006,"climb":0.000,"eps":31.90} $GPRMC,191445.00,A,5200.17109,N,00602.17462,E,0.010,,040712,,,A*76 $GPVTG,,T,,M,0.010,N,0.019,K,A*2A $GPGGA,191445.00,5200.17109,N,00602.17462,E,1,07,1.45,21.2,M,46.1,M,,*6E $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,39*73 $GPGSV,2,2,07,19,22,279,39,22,24,159,38,30,43,182,42*49 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.32,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":39,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":38,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17109,N,00602.17462,E,191445.00,A,A*6E {"class":"TPV","mode":3,"time":"2012-07-04T19:14:45.000Z","ept":0.005,"lat":52.002851500,"lon":6.036243667,"alt":21.200,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.005,"climb":0.000,"eps":31.90} $GPRMC,191446.00,A,5200.17115,N,00602.17470,E,0.009,,040712,,,A*73 $GPVTG,,T,,M,0.009,N,0.016,K,A*2D $GPGGA,191446.00,5200.17115,N,00602.17470,E,1,07,1.45,21.2,M,46.1,M,,*63 $GPGSA,A,3,19,16,30,18,22,03,07,,,,,,2.32,1.45,1.80*09 $GPGSV,2,1,07,03,54,286,37,07,18,316,35,16,68,221,36,18,43,111,39*73 $GPGSV,2,2,07,19,22,279,39,22,24,159,38,30,43,182,42*49 {"class":"SKY","xdop":0.99,"ydop":1.06,"vdop":1.80,"tdop":1.18,"hdop":1.45,"gdop":2.59,"pdop":2.32,"satellites":[{"PRN":3,"el":54,"az":286,"ss":37,"used":true},{"PRN":7,"el":18,"az":316,"ss":35,"used":true},{"PRN":16,"el":68,"az":221,"ss":36,"used":true},{"PRN":18,"el":43,"az":111,"ss":39,"used":true},{"PRN":19,"el":22,"az":279,"ss":39,"used":true},{"PRN":22,"el":24,"az":159,"ss":38,"used":true},{"PRN":30,"el":43,"az":182,"ss":42,"used":true}]} $GPGLL,5200.17115,N,00602.17470,E,191446.00,A,A*63 {"class":"TPV","mode":3,"time":"2012-07-04T19:14:46.000Z","ept":0.005,"lat":52.002852500,"lon":6.036245000,"alt":21.200,"epx":14.920,"epy":15.950,"epv":41.400,"track":0.0000,"speed":0.005,"climb":0.000,"eps":31.90} gpsd-3.15/test/daemon/nokia-ld-4w.log0000664000175000017500000001144212467342657015542 0ustar esresr# Name: Nokia LD-4W # Chipset: SiRF-3 # Description: Bluetooth add-on for Nokia mobile phone # Submitter: jussi.kivilinna@mbnet.fi # Date: 2009-12-05 # Location: Oulu, FI, 65N 25E # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGGA,080315.000,6503.0241,N,02528.3627,E,1,07,1.2,9.9,M,21.6,M,,0000*58 $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 $GPRMC,080315.000,A,6503.0241,N,02528.3627,E,0.95,25.69,051209,,,A*50 $GPGGA,080316.000,6503.0241,N,02528.3625,E,1,07,1.2,10.4,M,21.6,M,,0000*6C $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080316.000,A,6503.0241,N,02528.3625,E,0.56,33.07,051209,,,A*51 $GPGGA,080317.000,6503.0239,N,02528.3621,E,1,07,1.2,10.3,M,21.6,M,,0000*61 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080317.000,A,6503.0239,N,02528.3621,E,0.74,18.23,051209,,,A*54 $GPGGA,080318.000,6503.0236,N,02528.3617,E,1,07,1.2,10.2,M,21.6,M,,0000*65 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080318.000,A,6503.0236,N,02528.3617,E,0.36,37.53,051209,,,A*5D $GPGGA,080319.000,6503.0235,N,02528.3611,E,1,07,1.2,10.3,M,21.6,M,,0000*60 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080319.000,A,6503.0235,N,02528.3611,E,0.34,8.27,051209,,,A*64 $GPGGA,080320.000,6503.0233,N,02528.3606,E,1,07,1.2,10.9,M,21.6,M,,0000*60 $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 $GPRMC,080320.000,A,6503.0233,N,02528.3606,E,0.11,349.73,051209,,,A*6E $GPGGA,080321.000,6503.0229,N,02528.3601,E,1,07,1.2,10.2,M,21.6,M,,0000*66 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080321.000,A,6503.0229,N,02528.3601,E,0.17,185.36,051209,,,A*66 $GPGGA,080322.000,6503.0225,N,02528.3596,E,1,07,1.2,9.1,M,21.6,M,,0000*5F $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080322.000,A,6503.0225,N,02528.3596,E,0.15,191.14,051209,,,A*63 $GPGGA,080323.000,6503.0221,N,02528.3588,E,1,07,1.2,8.0,M,21.6,M,,0000*55 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080323.000,A,6503.0221,N,02528.3588,E,0.23,195.46,051209,,,A*6F $GPGGA,080324.000,6503.0219,N,02528.3584,E,1,07,1.2,8.1,M,21.6,M,,0000*54 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080324.000,A,6503.0219,N,02528.3584,E,0.07,83.00,051209,,,A*5D $GPGGA,080325.000,6503.0216,N,02528.3580,E,1,08,1.0,8.0,M,21.6,M,,0000*52 $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 $GPRMC,080325.000,A,6503.0216,N,02528.3580,E,0.12,86.47,051209,,,A*55 $GPGGA,080326.000,6503.0215,N,02528.3576,E,1,06,1.4,8.6,M,21.6,M,,0000*57 $GPGSA,A,3,29,12,30,04,31,16,,,,,,,2.4,1.4,1.9*33 $GPRMC,080326.000,A,6503.0215,N,02528.3576,E,0.06,1.14,051209,,,A*60 $GPGGA,080327.000,6503.0214,N,02528.3571,E,1,08,1.0,8.9,M,21.6,M,,0000*55 $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080327.000,A,6503.0214,N,02528.3571,E,0.32,1.13,051209,,,A*67 $GPGGA,080328.000,6503.0211,N,02528.3568,E,1,08,1.0,7.5,M,21.6,M,,0000*54 $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080328.000,A,6503.0211,N,02528.3568,E,0.19,97.48,051209,,,A*5D $GPGGA,080329.000,6503.0208,N,02528.3565,E,1,08,1.0,6.8,M,21.6,M,,0000*5C $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080329.000,A,6503.0208,N,02528.3565,E,0.25,72.57,051209,,,A*53 $GPGGA,080330.000,6503.0205,N,02528.3561,E,1,08,1.0,5.7,M,21.6,M,,0000*51 $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 $GPRMC,080330.000,A,6503.0205,N,02528.3561,E,0.14,181.62,051209,,,A*6B $GPGGA,080331.000,6503.0202,N,02528.3556,E,1,08,1.0,5.3,M,21.6,M,,0000*57 $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080331.000,A,6503.0202,N,02528.3556,E,0.20,209.92,051209,,,A*62 $GPGGA,080332.000,6503.0200,N,02528.3552,E,1,08,1.0,4.6,M,21.6,M,,0000*56 $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080332.000,A,6503.0200,N,02528.3552,E,0.36,228.63,051209,,,A*6D $GPGGA,080333.000,6503.0196,N,02528.3548,E,1,07,1.2,3.5,M,21.6,M,,0000*59 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080333.000,A,6503.0196,N,02528.3548,E,0.21,93.12,051209,,,A*59 gpsd-3.15/test/daemon/nokia-ld-4w.log.chk0000664000175000017500000002655612467342657016322 0ustar esresr$GPGGA,080315.000,6503.0241,N,02528.3627,E,1,07,1.2,9.9,M,21.6,M,,0000*58 {"class":"TPV","mode":3,"lat":65.050401667,"lon":25.472711667,"alt":9.900} $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 {"class":"TPV","mode":3,"lat":65.050401667,"lon":25.472711667,"alt":9.900,"epv":43.700} $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","xdop":0.71,"ydop":0.95,"vdop":1.90,"tdop":1.04,"hdop":1.20,"gdop":2.46,"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","mode":3,"time":"2009-12-05T08:03:15.000Z","ept":0.005,"lat":65.050401667,"lon":25.472711667,"alt":9.900,"epx":10.674,"epy":14.254,"epv":43.700,"track":25.6900,"speed":0.489} $GPGGA,080316.000,6503.0241,N,02528.3625,E,1,07,1.2,10.4,M,21.6,M,,0000*6C $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080316.000,A,6503.0241,N,02528.3625,E,0.56,33.07,051209,,,A*51 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:16.000Z","ept":0.005,"lat":65.050401667,"lon":25.472708333,"alt":10.400,"epx":10.674,"epy":14.254,"epv":43.700,"track":33.0700,"speed":0.288,"climb":0.500,"eps":28.51,"epc":87.40} $GPGGA,080317.000,6503.0239,N,02528.3621,E,1,07,1.2,10.3,M,21.6,M,,0000*61 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080317.000,A,6503.0239,N,02528.3621,E,0.74,18.23,051209,,,A*54 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:17.000Z","ept":0.005,"lat":65.050398333,"lon":25.472701667,"alt":10.300,"epx":10.674,"epy":14.254,"epv":43.700,"track":18.2300,"speed":0.381,"climb":-0.100,"eps":28.51,"epc":87.40} $GPGGA,080318.000,6503.0236,N,02528.3617,E,1,07,1.2,10.2,M,21.6,M,,0000*65 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080318.000,A,6503.0236,N,02528.3617,E,0.36,37.53,051209,,,A*5D {"class":"TPV","mode":3,"time":"2009-12-05T08:03:18.000Z","ept":0.005,"lat":65.050393333,"lon":25.472695000,"alt":10.200,"epx":10.674,"epy":14.254,"epv":43.700,"track":37.5300,"speed":0.185,"climb":-0.100,"eps":28.51,"epc":87.40} $GPGGA,080319.000,6503.0235,N,02528.3611,E,1,07,1.2,10.3,M,21.6,M,,0000*60 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080319.000,A,6503.0235,N,02528.3611,E,0.34,8.27,051209,,,A*64 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:19.000Z","ept":0.005,"lat":65.050391667,"lon":25.472685000,"alt":10.300,"epx":10.674,"epy":14.254,"epv":43.700,"track":8.2700,"speed":0.175,"climb":0.100,"eps":28.51,"epc":87.40} $GPGGA,080320.000,6503.0233,N,02528.3606,E,1,07,1.2,10.9,M,21.6,M,,0000*60 $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","xdop":0.71,"ydop":0.95,"vdop":1.90,"tdop":1.04,"hdop":1.20,"gdop":2.46,"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","mode":3,"time":"2009-12-05T08:03:20.000Z","ept":0.005,"lat":65.050388333,"lon":25.472676667,"alt":10.900,"epx":10.674,"epy":14.254,"epv":43.700,"track":349.7300,"speed":0.057,"climb":0.600,"eps":28.51,"epc":87.40} $GPGGA,080321.000,6503.0229,N,02528.3601,E,1,07,1.2,10.2,M,21.6,M,,0000*66 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080321.000,A,6503.0229,N,02528.3601,E,0.17,185.36,051209,,,A*66 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:21.000Z","ept":0.005,"lat":65.050381667,"lon":25.472668333,"alt":10.200,"epx":10.674,"epy":14.254,"epv":43.700,"track":185.3600,"speed":0.087,"climb":-0.700,"eps":28.51,"epc":87.40} $GPGGA,080322.000,6503.0225,N,02528.3596,E,1,07,1.2,9.1,M,21.6,M,,0000*5F $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080322.000,A,6503.0225,N,02528.3596,E,0.15,191.14,051209,,,A*63 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:22.000Z","ept":0.005,"lat":65.050375000,"lon":25.472660000,"alt":9.100,"epx":10.674,"epy":14.254,"epv":43.700,"track":191.1400,"speed":0.077,"climb":-1.100,"eps":28.51,"epc":87.40} $GPGGA,080323.000,6503.0221,N,02528.3588,E,1,07,1.2,8.0,M,21.6,M,,0000*55 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080323.000,A,6503.0221,N,02528.3588,E,0.23,195.46,051209,,,A*6F {"class":"TPV","mode":3,"time":"2009-12-05T08:03:23.000Z","ept":0.005,"lat":65.050368333,"lon":25.472646667,"alt":8.000,"epx":10.674,"epy":14.254,"epv":43.700,"track":195.4600,"speed":0.118,"climb":-1.100,"eps":28.51,"epc":87.40} $GPGGA,080324.000,6503.0219,N,02528.3584,E,1,07,1.2,8.1,M,21.6,M,,0000*54 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080324.000,A,6503.0219,N,02528.3584,E,0.07,83.00,051209,,,A*5D {"class":"TPV","mode":3,"time":"2009-12-05T08:03:24.000Z","ept":0.005,"lat":65.050365000,"lon":25.472640000,"alt":8.100,"epx":10.674,"epy":14.254,"epv":43.700,"track":83.0000,"speed":0.036,"climb":0.100,"eps":28.51,"epc":87.40} $GPGGA,080325.000,6503.0216,N,02528.3580,E,1,08,1.0,8.0,M,21.6,M,,0000*52 $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","xdop":0.71,"ydop":0.95,"vdop":1.70,"tdop":1.04,"hdop":1.00,"gdop":2.46,"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","mode":3,"time":"2009-12-05T08:03:25.000Z","ept":0.005,"lat":65.050360000,"lon":25.472633333,"alt":8.000,"epx":10.674,"epy":14.254,"epv":43.700,"track":86.4700,"speed":0.062,"climb":-0.100,"eps":28.51,"epc":87.40} $GPGGA,080326.000,6503.0215,N,02528.3576,E,1,06,1.4,8.6,M,21.6,M,,0000*57 $GPGSA,A,3,29,12,30,04,31,16,,,,,,,2.4,1.4,1.9*33 $GPRMC,080326.000,A,6503.0215,N,02528.3576,E,0.06,1.14,051209,,,A*60 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:26.000Z","ept":0.005,"lat":65.050358333,"lon":25.472626667,"alt":8.600,"epx":10.674,"epy":14.254,"epv":39.100,"track":1.1400,"speed":0.031,"climb":0.600,"eps":28.51,"epc":82.80} $GPGGA,080327.000,6503.0214,N,02528.3571,E,1,08,1.0,8.9,M,21.6,M,,0000*55 $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080327.000,A,6503.0214,N,02528.3571,E,0.32,1.13,051209,,,A*67 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:27.000Z","ept":0.005,"lat":65.050356667,"lon":25.472618333,"alt":8.900,"epx":10.674,"epy":14.254,"epv":43.700,"track":1.1300,"speed":0.165,"climb":0.300,"eps":28.51,"epc":82.80} $GPGGA,080328.000,6503.0211,N,02528.3568,E,1,08,1.0,7.5,M,21.6,M,,0000*54 $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080328.000,A,6503.0211,N,02528.3568,E,0.19,97.48,051209,,,A*5D {"class":"TPV","mode":3,"time":"2009-12-05T08:03:28.000Z","ept":0.005,"lat":65.050351667,"lon":25.472613333,"alt":7.500,"epx":10.674,"epy":14.254,"epv":39.100,"track":97.4800,"speed":0.098,"climb":-1.400,"eps":28.51,"epc":82.80} $GPGGA,080329.000,6503.0208,N,02528.3565,E,1,08,1.0,6.8,M,21.6,M,,0000*5C $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080329.000,A,6503.0208,N,02528.3565,E,0.25,72.57,051209,,,A*53 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:29.000Z","ept":0.005,"lat":65.050346667,"lon":25.472608333,"alt":6.800,"epx":10.674,"epy":14.254,"epv":39.100,"track":72.5700,"speed":0.129,"climb":-0.700,"eps":28.51,"epc":78.20} $GPGGA,080330.000,6503.0205,N,02528.3561,E,1,08,1.0,5.7,M,21.6,M,,0000*51 $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","xdop":0.71,"ydop":0.95,"vdop":1.70,"tdop":1.04,"hdop":1.00,"gdop":2.46,"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","mode":3,"time":"2009-12-05T08:03:30.000Z","ept":0.005,"lat":65.050341667,"lon":25.472601667,"alt":5.700,"epx":10.674,"epy":14.254,"epv":39.100,"track":181.6200,"speed":0.072,"climb":-1.100,"eps":28.51,"epc":78.20} $GPGGA,080331.000,6503.0202,N,02528.3556,E,1,08,1.0,5.3,M,21.6,M,,0000*57 $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080331.000,A,6503.0202,N,02528.3556,E,0.20,209.92,051209,,,A*62 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:31.000Z","ept":0.005,"lat":65.050336667,"lon":25.472593333,"alt":5.300,"epx":10.674,"epy":14.254,"epv":39.100,"track":209.9200,"speed":0.103,"climb":-0.400,"eps":28.51,"epc":78.20} $GPGGA,080332.000,6503.0200,N,02528.3552,E,1,08,1.0,4.6,M,21.6,M,,0000*56 $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E $GPRMC,080332.000,A,6503.0200,N,02528.3552,E,0.36,228.63,051209,,,A*6D {"class":"TPV","mode":3,"time":"2009-12-05T08:03:32.000Z","ept":0.005,"lat":65.050333333,"lon":25.472586667,"alt":4.600,"epx":10.674,"epy":14.254,"epv":39.100,"track":228.6300,"speed":0.185,"climb":-0.700,"eps":28.51,"epc":78.20} $GPGGA,080333.000,6503.0196,N,02528.3548,E,1,07,1.2,3.5,M,21.6,M,,0000*59 $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32 $GPRMC,080333.000,A,6503.0196,N,02528.3548,E,0.21,93.12,051209,,,A*59 {"class":"TPV","mode":3,"time":"2009-12-05T08:03:33.000Z","ept":0.005,"lat":65.050326667,"lon":25.472580000,"alt":3.500,"epx":10.674,"epy":14.254,"epv":39.100,"track":93.1200,"speed":0.108,"climb":-1.100,"eps":28.51,"epc":78.20} gpsd-3.15/test/daemon/oncore.log0000664000175000017500000000537512461156335014777 0ustar esresr# Name: Oncore GT+ # Submitter: Wojciech Kazubski # Date: 2005-04-12 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGSV,3,1,09,02,33,299,27,04,43,242,26,08,12,202,,13,85,356,*70 $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,39,195,15,,,,,,,,,,,,*46 $GPRMC,171244.00,A,5209.7838,N,02048.4818,E,0.6,71.0,080405,3.5,E*63 $GPGGA,171245.00,5209.7838,N,02048.4819,E,1,03,5.3,76.6,M,36.5,M,,*5A $GPGLL,5209.7838,N,02048.4819,E,171245.00,A*00 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,27,04,43,242,26,08,12,202,,13,85,356,*70 $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,39,195,13,,,,,,,,,,,,*40 $GPRMC,171245.00,A,5209.7838,N,02048.4819,E,0.3,41.9,080405,3.5,E*6C $GPGGA,171246.00,5209.7839,N,02048.4824,E,1,03,5.3,76.6,M,36.5,M,,*56 $GPGLL,5209.7839,N,02048.4824,E,171246.00,A*0C $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,27,04,43,242,26,08,12,202,,13,85,356,*70 $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,39,195,16,,,,,,,,,,,,*45 $GPRMC,171246.00,A,5209.7839,N,02048.4824,E,0.5,75.4,080405,3.5,E*6C $GPGGA,171247.00,5209.7838,N,02048.4821,E,1,03,5.3,76.6,M,36.5,M,,*53 $GPGLL,5209.7838,N,02048.4821,E,171247.00,A*09 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,28,04,43,242,26,08,12,202,,13,85,357,*7E $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,40,195,15,,,,,,,,,,,,*48 $GPRMC,171247.00,A,5209.7838,N,02048.4821,E,0.5,269.3,080405,3.5,E*51 $GPGGA,171248.00,5209.7839,N,02048.4824,E,1,03,5.3,76.6,M,36.5,M,,*58 $GPGLL,5209.7839,N,02048.4824,E,171248.00,A*02 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,28,04,43,242,25,08,12,202,,13,85,357,*7D $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,40,195,15,,,,,,,,,,,,*48 $GPRMC,171248.00,A,5209.7839,N,02048.4824,E,0.2,0.0,080405,3.5,E*53 $GPGGA,171249.00,5209.7839,N,02048.4827,E,1,03,5.3,76.6,M,36.5,M,,*5A $GPGLL,5209.7839,N,02048.4827,E,171249.00,A*00 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,27,04,43,242,26,08,12,202,,13,85,357,*71 $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,40,195,15,,,,,,,,,,,,*48 $GPRMC,171249.00,A,5209.7839,N,02048.4827,E,0.3,80.9,080405,3.5,E*61 $GPGGA,171250.00,5209.7839,N,02048.4829,E,1,03,5.3,76.6,M,36.5,M,,*5C $GPGLL,5209.7839,N,02048.4829,E,171250.00,A*06 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,28,04,43,242,26,08,12,202,,13,85,357,*7E $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,40,195,15,,,,,,,,,,,,*48 $GPRMC,171250.00,A,5209.7839,N,02048.4829,E,0.3,77.8,080405,3.5,E*6E gpsd-3.15/test/daemon/oncore.log.chk0000664000175000017500000001555312467340617015546 0ustar esresr$GPGSV,3,1,09,02,33,299,27,04,43,242,26,08,12,202,,13,85,356,*70 $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,39,195,15,,,,,,,,,,,,*46 {"class":"SKY","satellites":[{"PRN":2,"el":33,"az":299,"ss":27,"used":false},{"PRN":4,"el":43,"az":242,"ss":26,"used":false},{"PRN":8,"el":12,"az":202,"ss":0,"used":false},{"PRN":13,"el":85,"az":356,"ss":0,"used":false},{"PRN":16,"el":22,"az":59,"ss":0,"used":false},{"PRN":20,"el":21,"az":131,"ss":0,"used":false},{"PRN":23,"el":54,"az":74,"ss":0,"used":false},{"PRN":24,"el":23,"az":195,"ss":0,"used":false},{"PRN":27,"el":39,"az":195,"ss":15,"used":false}]} $GPRMC,171244.00,A,5209.7838,N,02048.4818,E,0.6,71.0,080405,3.5,E*63 {"class":"TPV","mode":2,"time":"2005-04-08T17:12:44.000Z","ept":0.005,"lat":52.163063333,"lon":20.808030000,"track":71.0000,"speed":0.309} $GPGGA,171245.00,5209.7838,N,02048.4819,E,1,03,5.3,76.6,M,36.5,M,,*5A $GPGLL,5209.7838,N,02048.4819,E,171245.00,A*00 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,27,04,43,242,26,08,12,202,,13,85,356,*70 $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,39,195,13,,,,,,,,,,,,*40 {"class":"SKY","hdop":5.30,"satellites":[{"PRN":2,"el":33,"az":299,"ss":27,"used":true},{"PRN":4,"el":43,"az":242,"ss":26,"used":true},{"PRN":8,"el":12,"az":202,"ss":0,"used":false},{"PRN":13,"el":85,"az":356,"ss":0,"used":false},{"PRN":16,"el":22,"az":59,"ss":0,"used":false},{"PRN":20,"el":21,"az":131,"ss":0,"used":false},{"PRN":23,"el":54,"az":74,"ss":0,"used":false},{"PRN":24,"el":23,"az":195,"ss":0,"used":false},{"PRN":27,"el":39,"az":195,"ss":13,"used":true}]} $GPRMC,171245.00,A,5209.7838,N,02048.4819,E,0.3,41.9,080405,3.5,E*6C {"class":"TPV","mode":3,"time":"2005-04-08T17:12:45.000Z","ept":0.005,"lat":52.163063333,"lon":20.808031667,"alt":76.600,"track":41.9000,"speed":0.154,"climb":0.000} $GPGGA,171246.00,5209.7839,N,02048.4824,E,1,03,5.3,76.6,M,36.5,M,,*56 $GPGLL,5209.7839,N,02048.4824,E,171246.00,A*0C $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,27,04,43,242,26,08,12,202,,13,85,356,*70 $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,39,195,16,,,,,,,,,,,,*45 {"class":"SKY","hdop":5.30,"satellites":[{"PRN":2,"el":33,"az":299,"ss":27,"used":true},{"PRN":4,"el":43,"az":242,"ss":26,"used":true},{"PRN":8,"el":12,"az":202,"ss":0,"used":false},{"PRN":13,"el":85,"az":356,"ss":0,"used":false},{"PRN":16,"el":22,"az":59,"ss":0,"used":false},{"PRN":20,"el":21,"az":131,"ss":0,"used":false},{"PRN":23,"el":54,"az":74,"ss":0,"used":false},{"PRN":24,"el":23,"az":195,"ss":0,"used":false},{"PRN":27,"el":39,"az":195,"ss":16,"used":true}]} $GPRMC,171246.00,A,5209.7839,N,02048.4824,E,0.5,75.4,080405,3.5,E*6C {"class":"TPV","mode":3,"time":"2005-04-08T17:12:46.000Z","ept":0.005,"lat":52.163065000,"lon":20.808040000,"alt":76.600,"track":75.4000,"speed":0.257,"climb":0.000} $GPGGA,171247.00,5209.7838,N,02048.4821,E,1,03,5.3,76.6,M,36.5,M,,*53 $GPGLL,5209.7838,N,02048.4821,E,171247.00,A*09 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,28,04,43,242,26,08,12,202,,13,85,357,*7E $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,40,195,15,,,,,,,,,,,,*48 {"class":"SKY","hdop":5.30,"satellites":[{"PRN":2,"el":33,"az":299,"ss":28,"used":true},{"PRN":4,"el":43,"az":242,"ss":26,"used":true},{"PRN":8,"el":12,"az":202,"ss":0,"used":false},{"PRN":13,"el":85,"az":357,"ss":0,"used":false},{"PRN":16,"el":22,"az":59,"ss":0,"used":false},{"PRN":20,"el":21,"az":131,"ss":0,"used":false},{"PRN":23,"el":54,"az":74,"ss":0,"used":false},{"PRN":24,"el":23,"az":195,"ss":0,"used":false},{"PRN":27,"el":40,"az":195,"ss":15,"used":true}]} $GPRMC,171247.00,A,5209.7838,N,02048.4821,E,0.5,269.3,080405,3.5,E*51 {"class":"TPV","mode":3,"time":"2005-04-08T17:12:47.000Z","ept":0.005,"lat":52.163063333,"lon":20.808035000,"alt":76.600,"track":269.3000,"speed":0.257,"climb":0.000} $GPGGA,171248.00,5209.7839,N,02048.4824,E,1,03,5.3,76.6,M,36.5,M,,*58 $GPGLL,5209.7839,N,02048.4824,E,171248.00,A*02 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,28,04,43,242,25,08,12,202,,13,85,357,*7D $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,40,195,15,,,,,,,,,,,,*48 {"class":"SKY","hdop":5.30,"satellites":[{"PRN":2,"el":33,"az":299,"ss":28,"used":true},{"PRN":4,"el":43,"az":242,"ss":25,"used":true},{"PRN":8,"el":12,"az":202,"ss":0,"used":false},{"PRN":13,"el":85,"az":357,"ss":0,"used":false},{"PRN":16,"el":22,"az":59,"ss":0,"used":false},{"PRN":20,"el":21,"az":131,"ss":0,"used":false},{"PRN":23,"el":54,"az":74,"ss":0,"used":false},{"PRN":24,"el":23,"az":195,"ss":0,"used":false},{"PRN":27,"el":40,"az":195,"ss":15,"used":true}]} $GPRMC,171248.00,A,5209.7839,N,02048.4824,E,0.2,0.0,080405,3.5,E*53 {"class":"TPV","mode":3,"time":"2005-04-08T17:12:48.000Z","ept":0.005,"lat":52.163065000,"lon":20.808040000,"alt":76.600,"track":0.0000,"speed":0.103,"climb":0.000} $GPGGA,171249.00,5209.7839,N,02048.4827,E,1,03,5.3,76.6,M,36.5,M,,*5A $GPGLL,5209.7839,N,02048.4827,E,171249.00,A*00 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,27,04,43,242,26,08,12,202,,13,85,357,*71 $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,40,195,15,,,,,,,,,,,,*48 {"class":"SKY","hdop":5.30,"satellites":[{"PRN":2,"el":33,"az":299,"ss":27,"used":true},{"PRN":4,"el":43,"az":242,"ss":26,"used":true},{"PRN":8,"el":12,"az":202,"ss":0,"used":false},{"PRN":13,"el":85,"az":357,"ss":0,"used":false},{"PRN":16,"el":22,"az":59,"ss":0,"used":false},{"PRN":20,"el":21,"az":131,"ss":0,"used":false},{"PRN":23,"el":54,"az":74,"ss":0,"used":false},{"PRN":24,"el":23,"az":195,"ss":0,"used":false},{"PRN":27,"el":40,"az":195,"ss":15,"used":true}]} $GPRMC,171249.00,A,5209.7839,N,02048.4827,E,0.3,80.9,080405,3.5,E*61 {"class":"TPV","mode":3,"time":"2005-04-08T17:12:49.000Z","ept":0.005,"lat":52.163065000,"lon":20.808045000,"alt":76.600,"track":80.9000,"speed":0.154,"climb":0.000} $GPGGA,171250.00,5209.7839,N,02048.4829,E,1,03,5.3,76.6,M,36.5,M,,*5C $GPGLL,5209.7839,N,02048.4829,E,171250.00,A*06 $GPGSA,A,2,02,04,27,,,,,,,,,,,5.3,*36 $GPGSV,3,1,09,02,33,299,28,04,43,242,26,08,12,202,,13,85,357,*7E $GPGSV,3,2,09,16,22,059,,20,21,131,,23,54,074,,24,23,195,*71 $GPGSV,3,3,09,27,40,195,15,,,,,,,,,,,,*48 {"class":"SKY","hdop":5.30,"satellites":[{"PRN":2,"el":33,"az":299,"ss":28,"used":true},{"PRN":4,"el":43,"az":242,"ss":26,"used":true},{"PRN":8,"el":12,"az":202,"ss":0,"used":false},{"PRN":13,"el":85,"az":357,"ss":0,"used":false},{"PRN":16,"el":22,"az":59,"ss":0,"used":false},{"PRN":20,"el":21,"az":131,"ss":0,"used":false},{"PRN":23,"el":54,"az":74,"ss":0,"used":false},{"PRN":24,"el":23,"az":195,"ss":0,"used":false},{"PRN":27,"el":40,"az":195,"ss":15,"used":true}]} $GPRMC,171250.00,A,5209.7839,N,02048.4829,E,0.3,77.8,080405,3.5,E*6E {"class":"TPV","mode":3,"time":"2005-04-08T17:12:50.000Z","ept":0.005,"lat":52.163065000,"lon":20.808048333,"alt":76.600,"track":77.8000,"speed":0.154,"climb":0.000} gpsd-3.15/test/daemon/passthrough.log0000664000175000017500000000040512461156335016046 0ustar esresr# Name: JSON # Submitter: Eric S. Raymond # Date: 2013-11-07 # Notes: Tests the JSON passthrough feature. # {"class":"XXX","text":"U can't touch dis."} {"class":"YYY","path":"theyellowbrickroad"} {"class":"ZZZ","device":"amireacleofstrange"} gpsd-3.15/test/daemon/passthrough.log.chk0000664000175000017500000000015312466117153016612 0ustar esresr{"class":"XXX","text":"U can't touch dis."} {"class":"YYY","path":"theyellowbrickroad"} {"class":"ZZZ"} gpsd-3.15/test/daemon/pharos-360.log0000664000175000017500000001400612467342657015315 0ustar esresr# Name: Pharos GPS-360 # Chipset: Sirf-II # Submitter: "Jeff Fisher" # Date: 2006-07-27 # Location: Regina, Saskatchewan, Canada, 50N104W # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021612.949,A,5029.3800,N,10441.0390,W,0.039560,189.06,280706,,*18 $GPGGA,021613.949,5029.3800,N,10441.0389,W,1,04,12.5,572.4,M,-20.3,M,0.0,0000*7E $GPGLL,5029.3800,N,10441.0389,W,021613.949,A*22 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021613.949,A,5029.3800,N,10441.0389,W,0.009850,267.99,280706,,*19 $GPGGA,021614.949,5029.3800,N,10441.0388,W,1,04,12.5,572.3,M,-20.3,M,0.0,0000*7F $GPGLL,5029.3800,N,10441.0388,W,021614.949,A*24 $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 $GPRMC,021614.949,A,5029.3800,N,10441.0388,W,0.016538,341.48,280706,,*1B $GPGGA,021615.949,5029.3799,N,10441.0387,W,1,04,12.5,572.1,M,-20.3,M,0.0,0000*7C $GPGLL,5029.3799,N,10441.0387,W,021615.949,A*25 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021615.949,A,5029.3799,N,10441.0387,W,0.024470,357.79,280706,,*13 $GPGGA,021616.949,5029.3800,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7B $GPGLL,5029.3800,N,10441.0387,W,021616.949,A*29 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021616.949,A,5029.3800,N,10441.0387,W,0.064679,355.50,280706,,*19 $GPGGA,021617.949,5029.3800,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7A $GPGLL,5029.3800,N,10441.0387,W,021617.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021617.949,A,5029.3800,N,10441.0387,W,0.081945,359.64,280706,,*18 $GPGGA,021618.949,5029.3801,N,10441.0387,W,1,04,12.5,571.8,M,-20.3,M,0.0,0000*75 $GPGLL,5029.3801,N,10441.0387,W,021618.949,A*26 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021618.949,A,5029.3801,N,10441.0387,W,0.123681,359.07,280706,,*1D $GPGGA,021619.949,5029.3802,N,10441.0387,W,1,04,12.5,571.6,M,-20.3,M,0.0,0000*79 $GPGLL,5029.3802,N,10441.0387,W,021619.949,A*24 $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 $GPRMC,021619.949,A,5029.3802,N,10441.0387,W,0.152675,359.28,280706,,*1F $GPGGA,021620.949,5029.3803,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*73 $GPGLL,5029.3803,N,10441.0387,W,021620.949,A*2F $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021620.949,A,5029.3803,N,10441.0387,W,0.149670,359.57,280706,,*13 $GPGGA,021621.949,5029.3805,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7A $GPGLL,5029.3805,N,10441.0387,W,021621.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021621.949,A,5029.3805,N,10441.0387,W,0.139805,358.04,280706,,*18 $GPGGA,021622.949,5029.3806,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*74 $GPGLL,5029.3806,N,10441.0387,W,021622.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021622.949,A,5029.3806,N,10441.0387,W,0.159851,358.60,280706,,*1D $GPGGA,021623.949,5029.3808,N,10441.0387,W,1,04,12.5,571.2,M,-20.3,M,0.0,0000*7E $GPGLL,5029.3808,N,10441.0387,W,021623.949,A*27 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021623.949,A,5029.3808,N,10441.0387,W,0.211601,1.82,280706,,*15 $GPGGA,021624.949,5029.3810,N,10441.0386,W,1,04,12.5,570.7,M,-20.3,M,0.0,0000*75 $GPGLL,5029.3810,N,10441.0386,W,021624.949,A*28 $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 $GPRMC,021624.949,A,5029.3810,N,10441.0386,W,0.200234,356.84,280706,,*1F $GPGGA,021625.949,5029.3812,N,10441.0386,W,1,04,12.5,570.1,M,-20.3,M,0.0,0000*70 $GPGLL,5029.3812,N,10441.0386,W,021625.949,A*2B $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021625.949,A,5029.3812,N,10441.0386,W,0.222299,359.84,280706,,*14 $GPGGA,021626.949,5029.3814,N,10441.0385,W,1,04,12.5,569.4,M,-20.3,M,0.0,0000*7B $GPGLL,5029.3814,N,10441.0385,W,021626.949,A*2D $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021626.949,A,5029.3814,N,10441.0385,W,0.196906,0.09,280706,,*19 $GPGGA,021627.948,5029.3815,N,10441.0384,W,1,04,12.5,568.8,M,-20.3,M,0.0,0000*76 $GPGLL,5029.3815,N,10441.0384,W,021627.948,A*2D $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021627.948,A,5029.3815,N,10441.0384,W,0.200037,355.83,280706,,*1F $GPGGA,021628.948,5029.3828,N,10441.0382,W,1,05,2.0,567.6,M,-20.3,M,0.0,0000*45 $GPGLL,5029.3828,N,10441.0382,W,021628.948,A*2A $GPGSA,A,3,28,11,26,29,27,,,,,,,,3.6,2.0,3.0*36 $GPRMC,021628.948,A,5029.3828,N,10441.0382,W,0.144151,5.63,280706,,*12 $GPGGA,021629.948,5029.3826,N,10441.0381,W,1,05,2.0,567.0,M,-20.3,M,0.0,0000*4F $GPGLL,5029.3826,N,10441.0381,W,021629.948,A*26 $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 $GPRMC,021629.948,A,5029.3826,N,10441.0381,W,0.066422,8.45,280706,,*17 $GPGGA,021630.948,5029.3826,N,10441.0380,W,1,04,12.5,567.0,M,-20.3,M,0.0,0000*73 $GPGLL,5029.3826,N,10441.0380,W,021630.948,A*2F $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021630.948,A,5029.3826,N,10441.0380,W,0.067726,5.22,280706,,*14 $GPGGA,021631.948,5029.3826,N,10441.0377,W,1,04,12.5,567.2,M,-20.3,M,0.0,0000*78 $GPGLL,5029.3826,N,10441.0377,W,021631.948,A*26 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021631.948,A,5029.3826,N,10441.0377,W,0.050347,4.93,280706,,*11 $GPGGA,021632.948,5029.3826,N,10441.0370,W,1,05,2.0,567.2,M,-20.3,M,0.0,0000*49 $GPGLL,5029.3826,N,10441.0370,W,021632.948,A*22 $GPGSA,A,3,28,11,26,29,27,,,,,,,,3.6,2.0,3.0*36 $GPRMC,021632.948,A,5029.3826,N,10441.0370,W,0.033580,1.77,280706,,*12 $GPGGA,021633.948,5029.3826,N,10441.0370,W,1,04,12.5,566.9,M,-20.3,M,0.0,0000*77 $GPGLL,5029.3826,N,10441.0370,W,021633.948,A*23 gpsd-3.15/test/daemon/pharos-360.log.chk0000664000175000017500000003113312467342657016061 0ustar esresr$GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 {"class":"TPV","mode":3,"epv":71.300} $GPRMC,021612.949,A,5029.3800,N,10441.0390,W,0.039560,189.06,280706,,*18 {"class":"TPV","mode":2,"time":"2006-07-28T02:16:12.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683983333,"track":189.0600,"speed":0.020} $GPGGA,021613.949,5029.3800,N,10441.0389,W,1,04,12.5,572.4,M,-20.3,M,0.0,0000*7E $GPGLL,5029.3800,N,10441.0389,W,021613.949,A*22 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021613.949,A,5029.3800,N,10441.0389,W,0.009850,267.99,280706,,*19 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:13.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683981667,"alt":572.400,"epv":71.300,"track":267.9900,"speed":0.005,"climb":0.000} $GPGGA,021614.949,5029.3800,N,10441.0388,W,1,04,12.5,572.3,M,-20.3,M,0.0,0000*7F $GPGLL,5029.3800,N,10441.0388,W,021614.949,A*24 $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","xdop":0.81,"ydop":12.16,"vdop":3.10,"tdop":2.04,"hdop":12.50,"gdop":12.75,"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","mode":3,"time":"2006-07-28T02:16:14.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683980000,"alt":572.300,"epx":12.184,"epy":182.343,"epv":71.300,"track":341.4800,"speed":0.009,"climb":-0.100,"epc":142.60} $GPGGA,021615.949,5029.3799,N,10441.0387,W,1,04,12.5,572.1,M,-20.3,M,0.0,0000*7C $GPGLL,5029.3799,N,10441.0387,W,021615.949,A*25 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021615.949,A,5029.3799,N,10441.0387,W,0.024470,357.79,280706,,*13 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:15.949Z","ept":0.005,"lat":50.489665000,"lon":-104.683978333,"alt":572.100,"epx":12.184,"epy":182.343,"epv":71.300,"track":357.7900,"speed":0.013,"climb":-0.200,"eps":364.69,"epc":142.60} $GPGGA,021616.949,5029.3800,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7B $GPGLL,5029.3800,N,10441.0387,W,021616.949,A*29 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021616.949,A,5029.3800,N,10441.0387,W,0.064679,355.50,280706,,*19 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:16.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683978333,"alt":571.900,"epx":12.184,"epy":182.343,"epv":71.300,"track":355.5000,"speed":0.033,"climb":-0.200,"eps":364.69,"epc":142.60} $GPGGA,021617.949,5029.3800,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7A $GPGLL,5029.3800,N,10441.0387,W,021617.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021617.949,A,5029.3800,N,10441.0387,W,0.081945,359.64,280706,,*18 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:17.949Z","ept":0.005,"lat":50.489666667,"lon":-104.683978333,"alt":571.900,"epx":12.184,"epy":182.343,"epv":71.300,"track":359.6400,"speed":0.042,"climb":0.000,"eps":364.69,"epc":142.60} $GPGGA,021618.949,5029.3801,N,10441.0387,W,1,04,12.5,571.8,M,-20.3,M,0.0,0000*75 $GPGLL,5029.3801,N,10441.0387,W,021618.949,A*26 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021618.949,A,5029.3801,N,10441.0387,W,0.123681,359.07,280706,,*1D {"class":"TPV","mode":3,"time":"2006-07-28T02:16:18.949Z","ept":0.005,"lat":50.489668333,"lon":-104.683978333,"alt":571.800,"epx":12.184,"epy":182.343,"epv":71.300,"track":359.0700,"speed":0.064,"climb":-0.100,"eps":364.69,"epc":142.60} $GPGGA,021619.949,5029.3802,N,10441.0387,W,1,04,12.5,571.6,M,-20.3,M,0.0,0000*79 $GPGLL,5029.3802,N,10441.0387,W,021619.949,A*24 $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","xdop":0.81,"ydop":12.16,"vdop":3.10,"tdop":2.04,"hdop":12.50,"gdop":12.75,"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","mode":3,"time":"2006-07-28T02:16:19.949Z","ept":0.005,"lat":50.489670000,"lon":-104.683978333,"alt":571.600,"epx":12.184,"epy":182.343,"epv":71.300,"track":359.2800,"speed":0.079,"climb":-0.200,"eps":364.69,"epc":142.60} $GPGGA,021620.949,5029.3803,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*73 $GPGLL,5029.3803,N,10441.0387,W,021620.949,A*2F $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021620.949,A,5029.3803,N,10441.0387,W,0.149670,359.57,280706,,*13 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:20.949Z","ept":0.005,"lat":50.489671667,"lon":-104.683978333,"alt":571.700,"epx":12.184,"epy":182.343,"epv":71.300,"track":359.5700,"speed":0.077,"climb":0.100,"eps":364.69,"epc":142.60} $GPGGA,021621.949,5029.3805,N,10441.0387,W,1,04,12.5,571.9,M,-20.3,M,0.0,0000*7A $GPGLL,5029.3805,N,10441.0387,W,021621.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021621.949,A,5029.3805,N,10441.0387,W,0.139805,358.04,280706,,*18 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:21.949Z","ept":0.005,"lat":50.489675000,"lon":-104.683978333,"alt":571.900,"epx":12.184,"epy":182.343,"epv":71.300,"track":358.0400,"speed":0.072,"climb":0.200,"eps":364.69,"epc":142.60} $GPGGA,021622.949,5029.3806,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*74 $GPGLL,5029.3806,N,10441.0387,W,021622.949,A*28 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021622.949,A,5029.3806,N,10441.0387,W,0.159851,358.60,280706,,*1D {"class":"TPV","mode":3,"time":"2006-07-28T02:16:22.949Z","ept":0.005,"lat":50.489676667,"lon":-104.683978333,"alt":571.700,"epx":12.184,"epy":182.343,"epv":71.300,"track":358.6000,"speed":0.082,"climb":-0.200,"eps":364.69,"epc":142.60} $GPGGA,021623.949,5029.3808,N,10441.0387,W,1,04,12.5,571.2,M,-20.3,M,0.0,0000*7E $GPGLL,5029.3808,N,10441.0387,W,021623.949,A*27 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021623.949,A,5029.3808,N,10441.0387,W,0.211601,1.82,280706,,*15 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:23.949Z","ept":0.005,"lat":50.489680000,"lon":-104.683978333,"alt":571.200,"epx":12.184,"epy":182.343,"epv":71.300,"track":1.8200,"speed":0.109,"climb":-0.500,"eps":364.69,"epc":142.60} $GPGGA,021624.949,5029.3810,N,10441.0386,W,1,04,12.5,570.7,M,-20.3,M,0.0,0000*75 $GPGLL,5029.3810,N,10441.0386,W,021624.949,A*28 $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","xdop":0.81,"ydop":12.16,"vdop":3.10,"tdop":2.04,"hdop":12.50,"gdop":12.75,"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","mode":3,"time":"2006-07-28T02:16:24.949Z","ept":0.005,"lat":50.489683333,"lon":-104.683976667,"alt":570.700,"epx":12.184,"epy":182.343,"epv":71.300,"track":356.8400,"speed":0.103,"climb":-0.500,"eps":364.69,"epc":142.60} $GPGGA,021625.949,5029.3812,N,10441.0386,W,1,04,12.5,570.1,M,-20.3,M,0.0,0000*70 $GPGLL,5029.3812,N,10441.0386,W,021625.949,A*2B $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021625.949,A,5029.3812,N,10441.0386,W,0.222299,359.84,280706,,*14 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:25.949Z","ept":0.005,"lat":50.489686667,"lon":-104.683976667,"alt":570.100,"epx":12.184,"epy":182.343,"epv":71.300,"track":359.8400,"speed":0.114,"climb":-0.600,"eps":364.69,"epc":142.60} $GPGGA,021626.949,5029.3814,N,10441.0385,W,1,04,12.5,569.4,M,-20.3,M,0.0,0000*7B $GPGLL,5029.3814,N,10441.0385,W,021626.949,A*2D $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021626.949,A,5029.3814,N,10441.0385,W,0.196906,0.09,280706,,*19 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:26.949Z","ept":0.005,"lat":50.489690000,"lon":-104.683975000,"alt":569.400,"epx":12.184,"epy":182.343,"epv":71.300,"track":0.0900,"speed":0.101,"climb":-0.700,"eps":364.69,"epc":142.60} $GPGGA,021627.948,5029.3815,N,10441.0384,W,1,04,12.5,568.8,M,-20.3,M,0.0,0000*76 $GPGLL,5029.3815,N,10441.0384,W,021627.948,A*2D $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021627.948,A,5029.3815,N,10441.0384,W,0.200037,355.83,280706,,*1F {"class":"TPV","mode":3,"time":"2006-07-28T02:16:27.948Z","ept":0.005,"lat":50.489691667,"lon":-104.683973333,"alt":568.800,"epx":12.184,"epy":182.343,"epv":71.300,"track":355.8300,"speed":0.103,"climb":-0.601,"eps":365.05,"epc":142.74} $GPGGA,021628.948,5029.3828,N,10441.0382,W,1,05,2.0,567.6,M,-20.3,M,0.0,0000*45 $GPGLL,5029.3828,N,10441.0382,W,021628.948,A*2A $GPGSA,A,3,28,11,26,29,27,,,,,,,,3.6,2.0,3.0*36 $GPRMC,021628.948,A,5029.3828,N,10441.0382,W,0.144151,5.63,280706,,*12 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:28.948Z","ept":0.005,"lat":50.489713333,"lon":-104.683970000,"alt":567.600,"epx":12.184,"epy":182.343,"epv":71.300,"track":5.6300,"speed":0.074,"climb":-1.200,"eps":364.69,"epc":142.60} $GPGGA,021629.948,5029.3826,N,10441.0381,W,1,05,2.0,567.0,M,-20.3,M,0.0,0000*4F $GPGLL,5029.3826,N,10441.0381,W,021629.948,A*26 $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","xdop":0.81,"ydop":12.16,"vdop":3.00,"tdop":2.04,"hdop":2.00,"gdop":12.75,"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","mode":3,"time":"2006-07-28T02:16:29.948Z","ept":0.005,"lat":50.489710000,"lon":-104.683968333,"alt":567.000,"epx":12.184,"epy":182.343,"epv":69.000,"track":8.4500,"speed":0.034,"climb":-0.600,"eps":364.69,"epc":140.30} $GPGGA,021630.948,5029.3826,N,10441.0380,W,1,04,12.5,567.0,M,-20.3,M,0.0,0000*73 $GPGLL,5029.3826,N,10441.0380,W,021630.948,A*2F $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021630.948,A,5029.3826,N,10441.0380,W,0.067726,5.22,280706,,*14 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:30.948Z","ept":0.005,"lat":50.489710000,"lon":-104.683966667,"alt":567.000,"epx":12.184,"epy":182.343,"epv":69.000,"track":5.2200,"speed":0.035,"climb":0.000,"eps":364.69,"epc":138.00} $GPGGA,021631.948,5029.3826,N,10441.0377,W,1,04,12.5,567.2,M,-20.3,M,0.0,0000*78 $GPGLL,5029.3826,N,10441.0377,W,021631.948,A*26 $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39 $GPRMC,021631.948,A,5029.3826,N,10441.0377,W,0.050347,4.93,280706,,*11 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:31.948Z","ept":0.005,"lat":50.489710000,"lon":-104.683961667,"alt":567.200,"epx":12.184,"epy":182.343,"epv":71.300,"track":4.9300,"speed":0.026,"climb":0.200,"eps":364.69,"epc":140.30} $GPGGA,021632.948,5029.3826,N,10441.0370,W,1,05,2.0,567.2,M,-20.3,M,0.0,0000*49 $GPGLL,5029.3826,N,10441.0370,W,021632.948,A*22 $GPGSA,A,3,28,11,26,29,27,,,,,,,,3.6,2.0,3.0*36 $GPRMC,021632.948,A,5029.3826,N,10441.0370,W,0.033580,1.77,280706,,*12 {"class":"TPV","mode":3,"time":"2006-07-28T02:16:32.948Z","ept":0.005,"lat":50.489710000,"lon":-104.683950000,"alt":567.200,"epx":12.184,"epy":182.343,"epv":71.300,"track":1.7700,"speed":0.017,"climb":0.000,"eps":364.69,"epc":142.60} $GPGGA,021633.948,5029.3826,N,10441.0370,W,1,04,12.5,566.9,M,-20.3,M,0.0,0000*77 $GPGLL,5029.3826,N,10441.0370,W,021633.948,A*23 gpsd-3.15/test/daemon/polarx2.log0000664000175000017500000001062012461156335015066 0ustar esresr# Name: Septentrio PolarRx2 # Chipset: PolarRx2 # Description: OEM module # Submitter: José Miguel Gonçalves # Date: 2012-03-22 # Notes: Submitter writes: # While working with a Septentrio PolarRx2 receiver, I've noticed that # I never got 2D fixes with xgps, while the Septentrio proprietary # software told me that it had a fix. I've tracked down the bug to the # GGA processing in the NMEA driver. $GPGST,112257.00,0.387,317.719,3.872,1.791,317.563,10.659,180.746*61 $GPGBS,112257.00,123.204,0.490,75.521,23,0.000,0.000,0.000*53 $GPGGA,112257.00,3844.24011,N,00908.43828,W,1,03,10.5,,,,,,*72 $GPGLL,3844.24011,N,00908.43828,W,112257.00,A,A*70 $GPGNS,112257.00,3844.24011,N,00908.43828,W,AN,03,10.5,,,,*57 $GPRMC,112257.00,A,3844.24011,N,00908.43828,W,0.1,339.1,220312,5.6,E,A*26 $GPVTG,339.1,T,333.5,M,0.1,N,0.1,K,A*2D $GPZDA,112257.00,22,03,2012,,*66 $GPGRS,112257.00,1,-0.1,-0.3,-0.1,,,,,,,,,*4C $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,44,13,62,040,44,17,06,199,*79 $GPGSV,5,3,17,20,11,098,,23,31,049,45,33,45,190,,35,26,238,*77 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 $GPGST,112258.00,0.223,320.494,3.861,1.782,320.339,10.685,182.631*6C $GPGBS,112258.00,155.875,14.949,71.523,13,0.000,0.000,0.000*68 $GPGGA,112258.00,3844.23988,N,00908.43825,W,1,03,10.5,,,,,,*7E $GPGLL,3844.23988,N,00908.43825,W,112258.00,A,A*7C $GPGNS,112258.00,3844.23988,N,00908.43825,W,AN,03,10.5,,,,*5B $GPRMC,112258.00,A,3844.23988,N,00908.43825,W,0.0,,220312,5.6,E,A*0D $GPVTG,,T,,M,0.0,N,0.0,K,A*23 $GPZDA,112258.00,22,03,2012,,*69 $GPGRS,112258.00,1,0.0,-0.1,0.0,,,,,,,,,*41 $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,44,13,62,040,44,17,06,199,*79 $GPGSV,5,3,17,20,11,098,,23,31,049,44,33,45,190,,35,26,238,*76 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 $GPGST,112259.00,0.374,324.240,3.859,1.775,324.084,10.757,184.716*6B $GPGBS,112259.00,98.761,11.743,50.103,13,0.000,0.000,0.000*57 $GPGGA,112259.00,3844.23965,N,00908.43820,W,1,03,10.5,,,,,,*79 $GPGLL,3844.23965,N,00908.43820,W,112259.00,A,A*7B $GPGNS,112259.00,3844.23965,N,00908.43820,W,AN,03,10.5,,,,*5C $GPRMC,112259.00,A,3844.23965,N,00908.43820,W,0.0,,220312,5.6,E,A*0A $GPVTG,,T,,M,0.0,N,0.1,K,A*22 $GPZDA,112259.00,22,03,2012,,*68 $GPGRS,112259.00,1,0.1,-0.3,0.0,,,,,,,,,*43 $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,44,13,62,040,43,17,06,199,*7E $GPGSV,5,3,17,20,11,098,,23,31,049,44,33,45,190,,35,26,238,*76 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 $GPGST,112300.00,0.593,328.088,3.859,1.768,327.932,10.833,186.824*69 $GPGBS,112300.00,76.953,10.529,42.020,13,0.000,0.000,0.000*59 $GPGGA,112300.00,3844.23935,N,00908.43815,W,1,03,10.5,,,,,,*77 $GPGLL,3844.23935,N,00908.43815,W,112300.00,A,A*75 $GPGNS,112300.00,3844.23935,N,00908.43815,W,AN,03,10.5,,,,*52 $GPRMC,112300.00,A,3844.23935,N,00908.43815,W,0.1,339.2,220312,5.6,E,A*20 $GPVTG,339.2,T,333.6,M,0.1,N,0.2,K,A*2E $GPZDA,112300.00,22,03,2012,,*65 $GPGRS,112300.00,1,0.0,-0.5,0.0,,,,,,,,,*49 $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,44,13,62,040,43,17,06,199,*7E $GPGSV,5,3,17,20,11,098,,23,31,049,44,33,45,190,,35,26,238,*76 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 $GPGST,112301.00,0.737,331.967,3.860,1.762,331.810,10.910,188.939*61 $GPGBS,112301.00,64.299,9.828,45.570,13,0.000,0.000,0.000*65 $GPGGA,112301.00,3844.23907,N,00908.43804,W,1,03,10.5,,,,,,*77 $GPGLL,3844.23907,N,00908.43804,W,112301.00,A,A*75 $GPGNS,112301.00,3844.23907,N,00908.43804,W,AN,03,10.5,,,,*52 $GPRMC,112301.00,A,3844.23907,N,00908.43804,W,0.0,,220312,5.6,E,A*04 $GPVTG,,T,,M,0.0,N,0.1,K,A*22 $GPZDA,112301.00,22,03,2012,,*64 $GPGRS,112301.00,1,0.2,-0.6,0.1,,,,,,,,,*48 $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,43,13,62,040,43,17,06,199,*79 $GPGSV,5,3,17,20,11,098,,23,31,049,44,33,45,190,,35,26,238,*76 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 gpsd-3.15/test/daemon/polarx2.log.chk0000664000175000017500000002354212467340617015645 0ustar esresr$GPGST,112257.00,0.387,317.719,3.872,1.791,317.563,10.659,180.746*61 {"class":"GST","time":"1970-01-02T07:10:57.000Z","rms":0.387,"major":317.719,"minor":3.872,"orient":1.791,"lat":317.563,"lon":10.659,"alt":180.746} $GPGBS,112257.00,123.204,0.490,75.521,23,0.000,0.000,0.000*53 $GPGGA,112257.00,3844.24011,N,00908.43828,W,1,03,10.5,,,,,,*72 {"class":"TPV","mode":0} $GPGLL,3844.24011,N,00908.43828,W,112257.00,A,A*70 {"class":"TPV","mode":2,"lat":38.737335167,"lon":-9.140638000} $GPGNS,112257.00,3844.24011,N,00908.43828,W,AN,03,10.5,,,,*57 $GPRMC,112257.00,A,3844.24011,N,00908.43828,W,0.1,339.1,220312,5.6,E,A*26 {"class":"TPV","mode":2,"time":"2012-03-22T11:22:57.000Z","ept":0.005,"lat":38.737335167,"lon":-9.140638000,"track":339.1000,"speed":0.051} $GPVTG,339.1,T,333.5,M,0.1,N,0.1,K,A*2D $GPZDA,112257.00,22,03,2012,,*66 $GPGRS,112257.00,1,-0.1,-0.3,-0.1,,,,,,,,,*4C $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F {"class":"TPV","mode":2,"time":"2012-03-22T11:22:57.000Z","ept":0.005,"lat":38.737335167,"lon":-9.140638000,"track":339.1000,"speed":0.051} $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,44,13,62,040,44,17,06,199,*79 $GPGSV,5,3,17,20,11,098,,23,31,049,45,33,45,190,,35,26,238,*77 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 {"class":"SKY","hdop":10.50,"pdop":10.50,"satellites":[{"PRN":2,"el":46,"az":305,"ss":0,"used":false},{"PRN":4,"el":74,"az":240,"ss":0,"used":false},{"PRN":5,"el":14,"az":290,"ss":0,"used":false},{"PRN":7,"el":46,"az":134,"ss":0,"used":false},{"PRN":8,"el":22,"az":167,"ss":0,"used":false},{"PRN":10,"el":65,"az":329,"ss":44,"used":true},{"PRN":13,"el":62,"az":40,"ss":44,"used":true},{"PRN":17,"el":6,"az":199,"ss":0,"used":false},{"PRN":20,"el":11,"az":98,"ss":0,"used":false},{"PRN":23,"el":31,"az":49,"ss":45,"used":true},{"PRN":120,"el":45,"az":190,"ss":0,"used":false},{"PRN":122,"el":26,"az":238,"ss":0,"used":false},{"PRN":124,"el":16,"az":112,"ss":0,"used":false},{"PRN":126,"el":33,"az":133,"ss":0,"used":false},{"PRN":131,"el":4,"az":101,"ss":0,"used":false},{"PRN":136,"el":33,"az":133,"ss":0,"used":false},{"PRN":137,"el":45,"az":190,"ss":0,"used":false}]} $GPGST,112258.00,0.223,320.494,3.861,1.782,320.339,10.685,182.631*6C {"class":"GST","time":"1970-01-02T07:10:58.000Z","rms":0.223,"major":320.494,"minor":3.861,"orient":1.782,"lat":320.339,"lon":10.685,"alt":182.631} $GPGBS,112258.00,155.875,14.949,71.523,13,0.000,0.000,0.000*68 $GPGGA,112258.00,3844.23988,N,00908.43825,W,1,03,10.5,,,,,,*7E $GPGLL,3844.23988,N,00908.43825,W,112258.00,A,A*7C $GPGNS,112258.00,3844.23988,N,00908.43825,W,AN,03,10.5,,,,*5B $GPRMC,112258.00,A,3844.23988,N,00908.43825,W,0.0,,220312,5.6,E,A*0D {"class":"TPV","mode":2,"time":"2012-03-22T11:22:58.000Z","ept":0.005,"lat":38.737331333,"lon":-9.140637500,"track":0.0000,"speed":0.000} $GPVTG,,T,,M,0.0,N,0.0,K,A*23 $GPZDA,112258.00,22,03,2012,,*69 $GPGRS,112258.00,1,0.0,-0.1,0.0,,,,,,,,,*41 $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,44,13,62,040,44,17,06,199,*79 $GPGSV,5,3,17,20,11,098,,23,31,049,44,33,45,190,,35,26,238,*76 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 {"class":"SKY","hdop":10.50,"pdop":10.50,"satellites":[{"PRN":2,"el":46,"az":305,"ss":0,"used":false},{"PRN":4,"el":74,"az":240,"ss":0,"used":false},{"PRN":5,"el":14,"az":290,"ss":0,"used":false},{"PRN":7,"el":46,"az":134,"ss":0,"used":false},{"PRN":8,"el":22,"az":167,"ss":0,"used":false},{"PRN":10,"el":65,"az":329,"ss":44,"used":true},{"PRN":13,"el":62,"az":40,"ss":44,"used":true},{"PRN":17,"el":6,"az":199,"ss":0,"used":false},{"PRN":20,"el":11,"az":98,"ss":0,"used":false},{"PRN":23,"el":31,"az":49,"ss":44,"used":true},{"PRN":120,"el":45,"az":190,"ss":0,"used":false},{"PRN":122,"el":26,"az":238,"ss":0,"used":false},{"PRN":124,"el":16,"az":112,"ss":0,"used":false},{"PRN":126,"el":33,"az":133,"ss":0,"used":false},{"PRN":131,"el":4,"az":101,"ss":0,"used":false},{"PRN":136,"el":33,"az":133,"ss":0,"used":false},{"PRN":137,"el":45,"az":190,"ss":0,"used":false}]} $GPGST,112259.00,0.374,324.240,3.859,1.775,324.084,10.757,184.716*6B {"class":"GST","time":"1970-01-02T07:10:59.000Z","rms":0.374,"major":324.240,"minor":3.859,"orient":1.775,"lat":324.084,"lon":10.757,"alt":184.716} $GPGBS,112259.00,98.761,11.743,50.103,13,0.000,0.000,0.000*57 $GPGGA,112259.00,3844.23965,N,00908.43820,W,1,03,10.5,,,,,,*79 $GPGLL,3844.23965,N,00908.43820,W,112259.00,A,A*7B $GPGNS,112259.00,3844.23965,N,00908.43820,W,AN,03,10.5,,,,*5C $GPRMC,112259.00,A,3844.23965,N,00908.43820,W,0.0,,220312,5.6,E,A*0A {"class":"TPV","mode":2,"time":"2012-03-22T11:22:59.000Z","ept":0.005,"lat":38.737327500,"lon":-9.140636667,"track":0.0000,"speed":0.000} $GPVTG,,T,,M,0.0,N,0.1,K,A*22 $GPZDA,112259.00,22,03,2012,,*68 $GPGRS,112259.00,1,0.1,-0.3,0.0,,,,,,,,,*43 $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,44,13,62,040,43,17,06,199,*7E $GPGSV,5,3,17,20,11,098,,23,31,049,44,33,45,190,,35,26,238,*76 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 {"class":"SKY","hdop":10.50,"pdop":10.50,"satellites":[{"PRN":2,"el":46,"az":305,"ss":0,"used":false},{"PRN":4,"el":74,"az":240,"ss":0,"used":false},{"PRN":5,"el":14,"az":290,"ss":0,"used":false},{"PRN":7,"el":46,"az":134,"ss":0,"used":false},{"PRN":8,"el":22,"az":167,"ss":0,"used":false},{"PRN":10,"el":65,"az":329,"ss":44,"used":true},{"PRN":13,"el":62,"az":40,"ss":43,"used":true},{"PRN":17,"el":6,"az":199,"ss":0,"used":false},{"PRN":20,"el":11,"az":98,"ss":0,"used":false},{"PRN":23,"el":31,"az":49,"ss":44,"used":true},{"PRN":120,"el":45,"az":190,"ss":0,"used":false},{"PRN":122,"el":26,"az":238,"ss":0,"used":false},{"PRN":124,"el":16,"az":112,"ss":0,"used":false},{"PRN":126,"el":33,"az":133,"ss":0,"used":false},{"PRN":131,"el":4,"az":101,"ss":0,"used":false},{"PRN":136,"el":33,"az":133,"ss":0,"used":false},{"PRN":137,"el":45,"az":190,"ss":0,"used":false}]} $GPGST,112300.00,0.593,328.088,3.859,1.768,327.932,10.833,186.824*69 {"class":"GST","time":"1970-01-02T07:11:40.000Z","rms":0.593,"major":328.088,"minor":3.859,"orient":1.768,"lat":327.932,"lon":10.833,"alt":186.824} $GPGBS,112300.00,76.953,10.529,42.020,13,0.000,0.000,0.000*59 $GPGGA,112300.00,3844.23935,N,00908.43815,W,1,03,10.5,,,,,,*77 $GPGLL,3844.23935,N,00908.43815,W,112300.00,A,A*75 $GPGNS,112300.00,3844.23935,N,00908.43815,W,AN,03,10.5,,,,*52 $GPRMC,112300.00,A,3844.23935,N,00908.43815,W,0.1,339.2,220312,5.6,E,A*20 {"class":"TPV","mode":2,"time":"2012-03-22T11:23:00.000Z","ept":0.005,"lat":38.737322500,"lon":-9.140635833,"track":339.2000,"speed":0.051} $GPVTG,339.2,T,333.6,M,0.1,N,0.2,K,A*2E $GPZDA,112300.00,22,03,2012,,*65 $GPGRS,112300.00,1,0.0,-0.5,0.0,,,,,,,,,*49 $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,44,13,62,040,43,17,06,199,*7E $GPGSV,5,3,17,20,11,098,,23,31,049,44,33,45,190,,35,26,238,*76 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 {"class":"SKY","hdop":10.50,"pdop":10.50,"satellites":[{"PRN":2,"el":46,"az":305,"ss":0,"used":false},{"PRN":4,"el":74,"az":240,"ss":0,"used":false},{"PRN":5,"el":14,"az":290,"ss":0,"used":false},{"PRN":7,"el":46,"az":134,"ss":0,"used":false},{"PRN":8,"el":22,"az":167,"ss":0,"used":false},{"PRN":10,"el":65,"az":329,"ss":44,"used":true},{"PRN":13,"el":62,"az":40,"ss":43,"used":true},{"PRN":17,"el":6,"az":199,"ss":0,"used":false},{"PRN":20,"el":11,"az":98,"ss":0,"used":false},{"PRN":23,"el":31,"az":49,"ss":44,"used":true},{"PRN":120,"el":45,"az":190,"ss":0,"used":false},{"PRN":122,"el":26,"az":238,"ss":0,"used":false},{"PRN":124,"el":16,"az":112,"ss":0,"used":false},{"PRN":126,"el":33,"az":133,"ss":0,"used":false},{"PRN":131,"el":4,"az":101,"ss":0,"used":false},{"PRN":136,"el":33,"az":133,"ss":0,"used":false},{"PRN":137,"el":45,"az":190,"ss":0,"used":false}]} $GPGST,112301.00,0.737,331.967,3.860,1.762,331.810,10.910,188.939*61 {"class":"GST","time":"1970-01-02T07:11:41.000Z","rms":0.737,"major":331.967,"minor":3.860,"orient":1.762,"lat":331.810,"lon":10.910,"alt":188.939} $GPGBS,112301.00,64.299,9.828,45.570,13,0.000,0.000,0.000*65 $GPGGA,112301.00,3844.23907,N,00908.43804,W,1,03,10.5,,,,,,*77 $GPGLL,3844.23907,N,00908.43804,W,112301.00,A,A*75 $GPGNS,112301.00,3844.23907,N,00908.43804,W,AN,03,10.5,,,,*52 $GPRMC,112301.00,A,3844.23907,N,00908.43804,W,0.0,,220312,5.6,E,A*04 {"class":"TPV","mode":2,"time":"2012-03-22T11:23:01.000Z","ept":0.005,"lat":38.737317833,"lon":-9.140634000,"track":0.0000,"speed":0.000} $GPVTG,,T,,M,0.0,N,0.1,K,A*22 $GPZDA,112301.00,22,03,2012,,*64 $GPGRS,112301.00,1,0.2,-0.6,0.1,,,,,,,,,*48 $GPGSA,A,2,10,13,23,,,,,,,,,,10.5,10.5,*1F $GPGSV,5,1,17,02,46,305,,04,74,240,,05,14,290,,07,46,134,*74 $GPGSV,5,2,17,08,22,167,,10,65,329,43,13,62,040,43,17,06,199,*79 $GPGSV,5,3,17,20,11,098,,23,31,049,44,33,45,190,,35,26,238,*76 $GPGSV,5,4,17,37,16,112,,39,33,133,,44,04,101,,49,33,133,*7C $GPGSV,5,5,17,50,45,190,*43 {"class":"SKY","hdop":10.50,"pdop":10.50,"satellites":[{"PRN":2,"el":46,"az":305,"ss":0,"used":false},{"PRN":4,"el":74,"az":240,"ss":0,"used":false},{"PRN":5,"el":14,"az":290,"ss":0,"used":false},{"PRN":7,"el":46,"az":134,"ss":0,"used":false},{"PRN":8,"el":22,"az":167,"ss":0,"used":false},{"PRN":10,"el":65,"az":329,"ss":43,"used":true},{"PRN":13,"el":62,"az":40,"ss":43,"used":true},{"PRN":17,"el":6,"az":199,"ss":0,"used":false},{"PRN":20,"el":11,"az":98,"ss":0,"used":false},{"PRN":23,"el":31,"az":49,"ss":44,"used":true},{"PRN":120,"el":45,"az":190,"ss":0,"used":false},{"PRN":122,"el":26,"az":238,"ss":0,"used":false},{"PRN":124,"el":16,"az":112,"ss":0,"used":false},{"PRN":126,"el":33,"az":133,"ss":0,"used":false},{"PRN":131,"el":4,"az":101,"ss":0,"used":false},{"PRN":136,"el":33,"az":133,"ss":0,"used":false},{"PRN":137,"el":45,"az":190,"ss":0,"used":false}]} gpsd-3.15/test/daemon/rgm3800.log0000664000175000017500000000425612461156335014607 0ustar esresr# Name: Royaltek RGM-3800 # Chipset: Sirf GSC3f/LP ? # Submitter: "Philipp Klenze" # Date: 2008-08-21 # Location: TU Munich, Garching, DE, 48.3N, 11.7E # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # this log has been generated with the format set to 4: # ./rgm3800.py -d /dev/ttyUSB0 format 4 # (the existence of $LOG-lines seem to be correlated with this format) # # Generated by running: # ./rgm3800.py -d /dev/ttyUSB0 gmouse on # cat /dev/ttyUSB0 # # First 15 lines is startup output; remainder is stationary $LOG108,1,100,100,0,0,5,0,4,462*61 $GPGGA,235951.952,0000.0000,N,00000.0000,E,0,00,,0.0,M,0.0,M,,0000*44 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,20,00,000,,10,00,000,,31,00,000,,27,00,000,*7C $GPGSV,3,2,12,19,00,000,,07,00,000,,04,00,000,,24,00,000,*76 $GPGSV,3,3,12,16,00,000,,28,00,000,,26,00,000,,29,00,000,*78 $GPRMC,235951.952,V,0000.0000,N,00000.0000,E,,0.00,050180,,,N*63 $LOG108,1,100,100,0,0,5,0,4,462*61 $GPGGA,235952.953,0000.0000,N,00000.0000,E,0,00,,0.0,M,0.0,M,,0000*46 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,3,1,12,20,00,000,,10,00,000,,31,00,000,,27,00,000,*7C $GPGSV,3,2,12,19,00,000,,07,00,000,,04,00,000,,24,00,000,*76 $GPGSV,3,3,12,16,00,000,,28,00,000,,26,00,000,,29,00,000,*78 $GPRMC,235952.953,V,0000.0000,N,00000.0000,E,,0.00,050180,,,N*61 $GPGGA,102523.342,4815.6883,N,01140.3675,E,1,03,4.1,-47.5,M,47.5,M,,0000*4B $GPGSA,A,2,09,18,15,,,,,,,,,,4.2,4.1,1.0*35 $GPGSV,3,1,11,15,78,236,41,09,30,277,44,18,26,303,36,22,04,332,34*73 $GPGSV,3,2,11,26,64,298,,29,53,146,,28,45,057,25,17,28,119,22*78 $GPGSV,3,3,11,08,13,081,27,12,06,219,22,10,05,190,21*4F $GPRMC,102523.342,A,4815.6883,N,01140.3675,E,0.00,0.00,210808,,,A*61 $LOG108,1,100,100,0,0,5,192,4,474*6C $GPGGA,102524.342,4815.6880,N,01140.3673,E,1,03,4.1,-47.5,M,47.5,M,,0000*49 $GPGSA,A,2,09,18,15,,,,,,,,,,4.2,4.1,1.0*35 $GPGSV,3,1,11,15,78,236,41,09,30,277,44,18,26,303,36,22,04,332,34*73 $GPGSV,3,2,11,26,64,298,,29,53,146,,28,45,057,25,17,28,119,22*78 $GPGSV,3,3,11,08,13,081,28,12,06,219,22,10,05,190,21*40 $GPRMC,102524.342,A,4815.6880,N,01140.3673,E,0.00,0.00,210808,,,A*63 $LOG108,1,100,100,0,0,5,192,4,474*6C gpsd-3.15/test/daemon/rgm3800.log.chk0000664000175000017500000000607212467340617015355 0ustar esresr$GPGGA,235951.952,0000.0000,N,00000.0000,E,0,00,,0.0,M,0.0,M,,0000*44 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,3,1,12,20,00,000,,10,00,000,,31,00,000,,27,00,000,*7C $GPGSV,3,2,12,19,00,000,,07,00,000,,04,00,000,,24,00,000,*76 $GPGSV,3,3,12,16,00,000,,28,00,000,,26,00,000,,29,00,000,*78 $GPRMC,235951.952,V,0000.0000,N,00000.0000,E,,0.00,050180,,,N*63 $GPGGA,235952.953,0000.0000,N,00000.0000,E,0,00,,0.0,M,0.0,M,,0000*46 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,3,1,12,20,00,000,,10,00,000,,31,00,000,,27,00,000,*7C $GPGSV,3,2,12,19,00,000,,07,00,000,,04,00,000,,24,00,000,*76 $GPGSV,3,3,12,16,00,000,,28,00,000,,26,00,000,,29,00,000,*78 $GPRMC,235952.953,V,0000.0000,N,00000.0000,E,,0.00,050180,,,N*61 $GPGGA,102523.342,4815.6883,N,01140.3675,E,1,03,4.1,-47.5,M,47.5,M,,0000*4B {"class":"TPV","mode":3,"lat":48.261471667,"lon":11.672791667,"alt":-47.500} $GPGSA,A,2,09,18,15,,,,,,,,,,4.2,4.1,1.0*35 $GPGSV,3,1,11,15,78,236,41,09,30,277,44,18,26,303,36,22,04,332,34*73 $GPGSV,3,2,11,26,64,298,,29,53,146,,28,45,057,25,17,28,119,22*78 $GPGSV,3,3,11,08,13,081,27,12,06,219,22,10,05,190,21*4F {"class":"SKY","vdop":1.00,"hdop":4.10,"pdop":4.20,"satellites":[{"PRN":15,"el":78,"az":236,"ss":41,"used":true},{"PRN":9,"el":30,"az":277,"ss":44,"used":true},{"PRN":18,"el":26,"az":303,"ss":36,"used":true},{"PRN":22,"el":4,"az":332,"ss":34,"used":false},{"PRN":26,"el":64,"az":298,"ss":0,"used":false},{"PRN":29,"el":53,"az":146,"ss":0,"used":false},{"PRN":28,"el":45,"az":57,"ss":25,"used":false},{"PRN":17,"el":28,"az":119,"ss":22,"used":false},{"PRN":8,"el":13,"az":81,"ss":27,"used":false},{"PRN":12,"el":6,"az":219,"ss":22,"used":false},{"PRN":10,"el":5,"az":190,"ss":21,"used":false}]} $GPRMC,102523.342,A,4815.6883,N,01140.3675,E,0.00,0.00,210808,,,A*61 {"class":"TPV","mode":3,"time":"2008-08-21T10:25:23.342Z","ept":0.005,"lat":48.261471667,"lon":11.672791667,"alt":-47.500,"epv":23.000,"track":0.0000,"speed":0.000} $GPGGA,102524.342,4815.6880,N,01140.3673,E,1,03,4.1,-47.5,M,47.5,M,,0000*49 $GPGSA,A,2,09,18,15,,,,,,,,,,4.2,4.1,1.0*35 $GPGSV,3,1,11,15,78,236,41,09,30,277,44,18,26,303,36,22,04,332,34*73 $GPGSV,3,2,11,26,64,298,,29,53,146,,28,45,057,25,17,28,119,22*78 $GPGSV,3,3,11,08,13,081,28,12,06,219,22,10,05,190,21*40 {"class":"SKY","vdop":1.00,"hdop":4.10,"pdop":4.20,"satellites":[{"PRN":15,"el":78,"az":236,"ss":41,"used":true},{"PRN":9,"el":30,"az":277,"ss":44,"used":true},{"PRN":18,"el":26,"az":303,"ss":36,"used":true},{"PRN":22,"el":4,"az":332,"ss":34,"used":false},{"PRN":26,"el":64,"az":298,"ss":0,"used":false},{"PRN":29,"el":53,"az":146,"ss":0,"used":false},{"PRN":28,"el":45,"az":57,"ss":25,"used":false},{"PRN":17,"el":28,"az":119,"ss":22,"used":false},{"PRN":8,"el":13,"az":81,"ss":28,"used":false},{"PRN":12,"el":6,"az":219,"ss":22,"used":false},{"PRN":10,"el":5,"az":190,"ss":21,"used":false}]} $GPRMC,102524.342,A,4815.6880,N,01140.3673,E,0.00,0.00,210808,,,A*63 {"class":"TPV","mode":3,"time":"2008-08-21T10:25:24.342Z","ept":0.005,"lat":48.261466667,"lon":11.672788333,"alt":-47.500,"epv":23.000,"track":0.0000,"speed":0.000,"climb":0.000,"epc":46.00} gpsd-3.15/test/daemon/rst39.log0000664000175000017500000002603312506064067014470 0ustar esresr# Name: Oxford Technical Solutions GPS with IMU # Chipset = ? # Date = 2015-03-10 # Submitter = Roger Oberholtzer # Notes: PASHR - Proprietary Heading, Pitch, Roll, Heave measurements # http://www.oxts.com/ $PASHR,204132.000,010.51,T,+00.39,-00.79,-00.84,0.151,0.075,0.555,1,0*03 $GPRMC,204132.00,A,4205.733476,N,08802.041110,W,9.415,21.404,190214,,,D*7C $PASHR,204132.040,010.99,T,+00.41,-00.75,-00.84,0.151,0.088,0.569,1,0*0D $PASHR,204132.080,011.49,T,+00.40,-00.73,-00.84,0.151,0.088,0.569,1,0*0A $GPGGA,204132.10,4205.733715,N,08802.040978,W,2,08,1.0,221.921,M,,,3,0138*15 $PASHR,204132.120,011.99,T,+00.40,-00.70,-00.85,0.151,0.088,0.569,1,0*0E $PASHR,204132.160,012.51,T,+00.41,-00.71,-00.85,0.151,0.088,0.569,1,0*0D $GPGGA,204132.20,4205.733946,N,08802.040837,W,2,08,1.0,221.912,M,,,3,0138*14 $PASHR,204132.200,013.04,T,+00.39,-00.73,-00.86,0.151,0.088,0.569,1,0*07 $PASHR,204132.240,013.58,T,+00.41,-00.76,-00.86,0.151,0.088,0.569,1,0*00 $PASHR,204132.280,014.15,T,+00.37,-00.79,-00.87,0.151,0.088,0.569,1,0*0D $GPGGA,204132.30,4205.734170,N,08802.040688,W,2,08,1.0,221.903,M,,,3,0138*15 $PASHR,204132.320,014.71,T,+00.36,-00.80,-00.87,0.151,0.088,0.569,1,0*03 $PASHR,204132.360,015.29,T,+00.32,-00.82,-00.87,0.151,0.088,0.569,1,0*0D $GPGGA,204132.40,4205.734388,N,08802.040528,W,2,08,1.0,221.896,M,,,3,0138*13 $PASHR,204132.400,015.87,T,+00.27,-00.83,-00.88,0.151,0.088,0.569,1,0*02 $PASHR,204132.440,016.46,T,+00.27,-00.83,-00.88,0.151,0.088,0.569,1,0*08 $PASHR,204132.480,017.07,T,+00.21,-00.84,-00.88,0.151,0.088,0.569,1,0*01 $GPGGA,204132.50,4205.734601,N,08802.040359,W,2,08,1.0,221.890,M,,,3,0138*10 $PASHR,204132.520,017.66,T,+00.24,-00.84,-00.89,0.151,0.088,0.569,1,0*09 $PASHR,204132.560,018.28,T,+00.19,-00.84,-00.89,0.151,0.088,0.569,1,0*06 $GPGGA,204132.60,4205.734808,N,08802.040180,W,2,08,1.0,221.886,M,,,4,0138*12 $PASHR,204132.600,018.89,T,+00.23,-00.83,-00.89,0.151,0.088,0.569,1,0*06 $PASHR,204132.640,019.52,T,+00.22,-00.84,-00.90,0.151,0.088,0.569,1,0*0B $PASHR,204132.680,020.15,T,+00.22,-00.84,-00.90,0.151,0.088,0.569,1,0*0E $GPGGA,204132.70,4205.735010,N,08802.039990,W,2,08,1.0,221.877,M,,,4,0138*1A $PASHR,204132.720,020.79,T,+00.27,-00.85,-00.90,0.151,0.088,0.569,1,0*0B $PASHR,204132.760,021.43,T,+00.25,-00.85,-00.91,0.151,0.088,0.569,1,0*04 $GPGGA,204132.80,4205.735207,N,08802.039792,W,2,08,1.0,221.872,M,,,4,0138*18 $PASHR,204132.800,022.09,T,+00.27,-00.85,-00.91,0.151,0.088,0.569,1,0*02 $PASHR,204132.840,022.76,T,+00.24,-00.84,-00.91,0.151,0.088,0.569,1,0*0C $PASHR,204132.880,023.44,T,+00.21,-00.82,-00.92,0.151,0.088,0.569,1,0*00 $GPGGA,204132.90,4205.735398,N,08802.039584,W,2,08,1.0,221.872,M,,,4,0138*1B $PASHR,204132.920,024.13,T,+00.15,-00.78,-00.92,0.151,0.088,0.569,1,0*0C $PASHR,204132.960,024.82,T,+00.12,-00.75,-00.92,0.151,0.088,0.569,1,0*0A $GPGGA,204133.00,4205.735585,N,08802.039368,W,2,08,1.0,221.873,M,,,4,0138*1C $GPHDT,25.50,T*37 $GPZDA,204133.000,19,02,2014,,*5C $PASHR,204133.000,025.50,T,+00.19,-00.74,-00.92,0.151,0.088,0.569,1,0*00 $GPRMC,204133.00,A,4205.735585,N,08802.039368,W,8.904,41.865,190214,,,D*75 $PASHR,204133.040,026.22,T,+00.16,-00.78,-00.93,0.152,0.080,0.598,1,0*05 $PASHR,204133.080,026.90,T,+00.07,-00.78,-00.93,0.152,0.080,0.598,1,0*00 $GPGGA,204133.10,4205.735766,N,08802.039145,W,2,09,0.9,221.871,M,,,4,0138*14 $PASHR,204133.120,027.60,T,+00.05,-00.79,-00.93,0.152,0.080,0.598,1,0*06 $PASHR,204133.160,028.29,T,-00.12,-00.77,-00.93,0.152,0.080,0.598,1,0*0E $GPGGA,204133.20,4205.735941,N,08802.038913,W,2,09,0.9,221.877,M,,,4,0138*10 $PASHR,204133.200,028.98,T,-00.12,-00.71,-00.93,0.152,0.080,0.598,1,0*07 $PASHR,204133.240,029.68,T,-00.27,-00.68,-00.93,0.152,0.080,0.598,1,0*03 $PASHR,204133.280,030.40,T,-00.23,-00.59,-00.93,0.152,0.080,0.598,1,0*0B $GPGGA,204133.30,4205.736110,N,08802.038671,W,2,09,0.9,221.881,M,,,4,0138*1C $PASHR,204133.320,031.11,T,-00.27,-00.59,-00.94,0.152,0.080,0.598,1,0*06 $PASHR,204133.360,031.83,T,-00.27,-00.56,-00.94,0.152,0.080,0.598,1,0*06 $GPGGA,204133.40,4205.736273,N,08802.038422,W,2,09,0.9,221.884,M,,,4,0138*1C $PASHR,204133.400,032.54,T,-00.29,-00.57,-00.94,0.152,0.080,0.598,1,0*01 $PASHR,204133.440,033.26,T,-00.29,-00.53,-00.94,0.152,0.080,0.598,1,0*05 $PASHR,204133.480,033.96,T,-00.29,-00.51,-00.94,0.152,0.080,0.598,1,0*00 $GPGGA,204133.50,4205.736429,N,08802.038168,W,2,09,0.9,221.887,M,,,4,0138*1C $PASHR,204133.520,034.67,T,-00.28,-00.47,-00.94,0.152,0.080,0.598,1,0*04 $PASHR,204133.560,035.38,T,-00.29,-00.47,-00.94,0.152,0.080,0.598,1,0*0A $GPGGA,204133.60,4205.736580,N,08802.037908,W,2,09,0.9,221.885,M,,,5,0138*1F $PASHR,204133.600,036.09,T,-00.27,-00.47,-00.95,0.152,0.080,0.598,1,0*01 $PASHR,204133.640,036.82,T,-00.27,-00.52,-00.95,0.152,0.080,0.598,1,0*02 $PASHR,204133.680,037.54,T,-00.22,-00.54,-00.95,0.152,0.080,0.598,1,0*07 $GPGGA,204133.70,4205.736724,N,08802.037642,W,2,09,0.9,221.882,M,,,5,0138*14 $PASHR,204133.720,038.26,T,-00.19,-00.57,-00.96,0.152,0.080,0.598,1,0*0E $PASHR,204133.760,038.97,T,-00.15,-00.59,-00.96,0.152,0.080,0.598,1,0*02 $GPGGA,204133.80,4205.736862,N,08802.037370,W,2,09,0.9,221.881,M,,,5,0138*11 $PASHR,204133.800,039.69,T,-00.17,-00.60,-00.96,0.152,0.080,0.598,1,0*03 $PASHR,204133.840,040.41,T,-00.19,-00.62,-00.97,0.152,0.080,0.598,1,0*0E $PASHR,204133.880,041.13,T,-00.21,-00.63,-00.97,0.152,0.080,0.598,1,0*0E $GPGGA,204133.90,4205.736994,N,08802.037092,W,2,09,0.9,221.878,M,,,5,0138*11 $PASHR,204133.920,041.86,T,-00.25,-00.65,-00.97,0.152,0.080,0.598,1,0*0B $PASHR,204133.960,042.58,T,-00.28,-00.68,-00.98,0.152,0.080,0.598,1,0*00 $GPGGA,204134.00,4205.737120,N,08802.036809,W,2,09,0.9,221.877,M,,,5,0138*1D $GPHDT,43.31,T*30 $GPZDA,204134.000,19,02,2014,,*5B $PASHR,204134.000,043.31,T,-00.31,-00.70,-00.98,0.145,0.105,0.631,1,0*0D $GPRMC,204134.00,A,4205.737120,N,08802.036809,W,8.946,60.172,190214,,,D*72 $PASHR,204134.040,044.04,T,-00.34,-00.72,-00.98,0.145,0.105,0.631,1,0*0F $PASHR,204134.080,044.76,T,-00.37,-00.72,-00.98,0.145,0.105,0.631,1,0*05 $GPGGA,204134.10,4205.737240,N,08802.036521,W,2,09,0.9,221.880,M,,,3,0138*10 $PASHR,204134.120,045.48,T,-00.36,-00.71,-00.99,0.145,0.105,0.631,1,0*01 $PASHR,204134.160,046.21,T,-00.36,-00.69,-00.99,0.145,0.105,0.631,1,0*00 $GPGGA,204134.20,4205.737354,N,08802.036223,W,2,09,0.9,221.886,M,,,3,0138*14 $PASHR,204134.200,046.93,T,-00.35,-00.66,-00.98,0.145,0.105,0.631,1,0*01 $PASHR,204134.240,047.65,T,-00.32,-00.60,-00.98,0.145,0.105,0.631,1,0*0C $PASHR,204134.280,048.37,T,-00.31,-00.56,-00.98,0.145,0.105,0.631,1,0*0E $GPGGA,204134.30,4205.737462,N,08802.035916,W,2,09,0.9,221.894,M,,,3,0138*1A $PASHR,204134.320,049.11,T,-00.30,-00.51,-00.98,0.145,0.105,0.631,1,0*06 $PASHR,204134.360,049.83,T,-00.24,-00.48,-00.98,0.145,0.105,0.631,1,0*04 $GPGGA,204134.40,4205.737563,N,08802.035602,W,2,09,0.9,221.900,M,,,3,0138*1B $PASHR,204134.400,050.57,T,-00.26,-00.47,-00.98,0.145,0.105,0.631,1,0*09 $PASHR,204134.440,051.31,T,-00.25,-00.45,-00.98,0.145,0.105,0.631,1,0*0D $PASHR,204134.480,052.05,T,-00.27,-00.46,-00.98,0.145,0.105,0.631,1,0*04 $GPGGA,204134.50,4205.737658,N,08802.035283,W,2,09,0.9,221.898,M,,,3,0138*1C $PASHR,204134.520,052.79,T,-00.32,-00.46,-00.99,0.145,0.105,0.631,1,0*01 $PASHR,204134.560,053.52,T,-00.33,-00.46,-00.99,0.145,0.105,0.631,1,0*0C $GPGGA,204134.60,4205.737747,N,08802.034957,W,2,09,0.9,221.895,M,,,4,0138*19 $PASHR,204134.600,054.26,T,-00.38,-00.46,-00.99,0.145,0.105,0.631,1,0*06 $PASHR,204134.640,054.99,T,-00.35,-00.49,-00.99,0.145,0.105,0.631,1,0*04 $PASHR,204134.680,055.72,T,-00.36,-00.51,-01.00,0.145,0.105,0.631,1,0*07 $GPGGA,204134.70,4205.737829,N,08802.034624,W,2,09,0.9,221.889,M,,,4,0138*19 $PASHR,204134.720,056.46,T,-00.35,-00.55,-01.00,0.145,0.105,0.631,1,0*0F $PASHR,204134.760,057.18,T,-00.30,-00.59,-01.01,0.145,0.105,0.631,1,0*09 $GPGGA,204134.80,4205.737907,N,08802.034287,W,2,09,0.9,221.883,M,,,4,0138*1C $PASHR,204134.800,057.90,T,-00.28,-00.63,-01.01,0.145,0.105,0.631,1,0*00 $PASHR,204134.840,058.62,T,-00.28,-00.65,-01.01,0.145,0.105,0.631,1,0*00 $PASHR,204134.880,059.32,T,-00.20,-00.67,-01.01,0.145,0.105,0.631,1,0*02 $GPGGA,204134.90,4205.737979,N,08802.033944,W,2,09,0.9,221.880,M,,,4,0138*14 $PASHR,204134.920,060.05,T,-00.23,-00.70,-01.02,0.145,0.105,0.631,1,0*01 $PASHR,204134.960,060.76,T,-00.22,-00.70,-01.02,0.145,0.105,0.631,1,0*00 $GPGGA,204135.00,4205.738043,N,08802.033593,W,2,09,0.9,221.881,M,,,4,0138*14 $GPHDT,61.49,T*3F $GPZDA,204135.000,19,02,2014,,*5A $PASHR,204135.000,061.49,T,-00.20,-00.72,-01.02,0.128,0.133,0.674,1,0*0C $GPRMC,204135.00,A,4205.738043,N,08802.033593,W,9.609,76.928,190214,,,D*76 $PASHR,204135.040,062.22,T,-00.25,-00.71,-01.02,0.128,0.133,0.674,1,0*00 $PASHR,204135.080,062.94,T,-00.22,-00.69,-01.02,0.128,0.133,0.674,1,0*0F $GPGGA,204135.10,4205.738099,N,08802.033239,W,2,08,1.0,221.882,M,,,4,0138*1F $PASHR,204135.120,063.67,T,-00.31,-00.66,-01.02,0.128,0.133,0.674,1,0*04 $PASHR,204135.160,064.37,T,-00.25,-00.62,-01.02,0.128,0.133,0.674,1,0*03 $GPGGA,204135.20,4205.738151,N,08802.032882,W,2,08,1.0,221.885,M,,,4,0138*15 $PASHR,204135.200,065.07,T,-00.26,-00.58,-01.02,0.128,0.133,0.674,1,0*0E $PASHR,204135.240,065.74,T,-00.24,-00.55,-01.02,0.128,0.133,0.674,1,0*01 $PASHR,204135.280,066.37,T,-00.20,-00.53,-01.01,0.128,0.133,0.674,1,0*08 $GPGGA,204135.30,4205.738201,N,08802.032522,W,2,08,1.0,221.890,M,,,4,0138*11 $PASHR,204135.320,066.99,T,-00.23,-00.52,-01.01,0.128,0.133,0.674,1,0*05 $PASHR,204135.360,067.57,T,-00.17,-00.48,-01.01,0.128,0.133,0.674,1,0*0E $GPGGA,204135.40,4205.738250,N,08802.032159,W,2,08,1.0,221.893,M,,,4,0138*19 $PASHR,204135.400,068.15,T,-00.15,-00.42,-01.01,0.128,0.133,0.674,1,0*0E $PASHR,204135.440,068.68,T,+00.00,-00.36,-01.01,0.128,0.133,0.674,1,0*01 $PASHR,204135.480,069.23,T,+00.11,-00.33,-01.01,0.128,0.133,0.674,1,0*06 $GPGGA,204135.50,4205.738297,N,08802.031793,W,2,08,1.0,221.892,M,,,4,0138*11 $PASHR,204135.520,069.75,T,+00.22,-00.31,-01.01,0.128,0.133,0.674,1,0*0C $PASHR,204135.560,070.25,T,+00.39,-00.32,-01.02,0.128,0.133,0.674,1,0*0F $GPGGA,204135.60,4205.738343,N,08802.031421,W,2,08,1.0,221.889,M,,,5,0138*1B $PASHR,204135.600,070.74,T,+00.41,-00.34,-01.02,0.128,0.133,0.674,1,0*07 $PASHR,204135.640,071.21,T,+00.50,-00.33,-01.02,0.128,0.133,0.674,1,0*05 $PASHR,204135.680,071.67,T,+00.54,-00.34,-01.02,0.128,0.133,0.674,1,0*08 $GPGGA,204135.70,4205.738390,N,08802.031048,W,2,08,1.0,221.889,M,,,5,0138*1F $PASHR,204135.720,072.11,T,+00.51,-00.32,-01.01,0.128,0.133,0.674,1,0*01 $PASHR,204135.760,072.53,T,+00.51,-00.29,-01.01,0.128,0.133,0.674,1,0*09 $GPGGA,204135.80,4205.738437,N,08802.030674,W,2,08,1.0,221.893,M,,,5,0138*19 $PASHR,204135.800,072.93,T,+00.47,-00.25,-01.01,0.128,0.133,0.674,1,0*07 $PASHR,204135.840,073.32,T,+00.43,-00.20,-01.01,0.128,0.133,0.674,1,0*08 $PASHR,204135.880,073.70,T,+00.36,-00.18,-01.01,0.128,0.133,0.674,1,0*0B $GPGGA,204135.90,4205.738483,N,08802.030297,W,2,08,1.0,221.901,M,,,5,0138*14 $PASHR,204135.920,074.06,T,+00.38,-00.13,-01.00,0.128,0.133,0.674,1,0*02 $PASHR,204135.960,074.42,T,+00.29,-00.14,-01.00,0.128,0.133,0.674,1,0*01 $GPGGA,204136.00,4205.738527,N,08802.029914,W,2,08,1.0,221.909,M,,,5,0138*11 $GPHDT,74.79,T*38 $GPZDA,204136.000,19,02,2014,,*59 gpsd-3.15/test/daemon/rst39.log.chk0000664000175000017500000004262012506064067015234 0ustar esresr$PASHR,204132.000,010.51,T,+00.39,-00.79,-00.84,0.151,0.075,0.555,1,0*03 $GPRMC,204132.00,A,4205.733476,N,08802.041110,W,9.415,21.404,190214,,,D*7C {"class":"TPV","mode":2,"time":"2014-02-19T20:41:32.000Z","ept":0.005,"lat":42.095557933,"lon":-88.034018500,"track":21.4040,"speed":4.843} $PASHR,204132.040,010.99,T,+00.41,-00.75,-00.84,0.151,0.088,0.569,1,0*0D $PASHR,204132.080,011.49,T,+00.40,-00.73,-00.84,0.151,0.088,0.569,1,0*0A $GPGGA,204132.10,4205.733715,N,08802.040978,W,2,08,1.0,221.921,M,,,3,0138*15 $PASHR,204132.120,011.99,T,+00.40,-00.70,-00.85,0.151,0.088,0.569,1,0*0E $PASHR,204132.160,012.51,T,+00.41,-00.71,-00.85,0.151,0.088,0.569,1,0*0D $GPGGA,204132.20,4205.733946,N,08802.040837,W,2,08,1.0,221.912,M,,,3,0138*14 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:32.200Z","ept":0.005,"lat":42.095565767,"lon":-88.034013950,"alt":221.912,"speed":4.698,"climb":-0.090} $PASHR,204132.200,013.04,T,+00.39,-00.73,-00.86,0.151,0.088,0.569,1,0*07 $PASHR,204132.240,013.58,T,+00.41,-00.76,-00.86,0.151,0.088,0.569,1,0*00 $PASHR,204132.280,014.15,T,+00.37,-00.79,-00.87,0.151,0.088,0.569,1,0*0D $GPGGA,204132.30,4205.734170,N,08802.040688,W,2,08,1.0,221.903,M,,,3,0138*15 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:32.300Z","ept":0.005,"lat":42.095569500,"lon":-88.034011467,"alt":221.903,"speed":4.628,"climb":-0.090} $PASHR,204132.320,014.71,T,+00.36,-00.80,-00.87,0.151,0.088,0.569,1,0*03 $PASHR,204132.360,015.29,T,+00.32,-00.82,-00.87,0.151,0.088,0.569,1,0*0D $GPGGA,204132.40,4205.734388,N,08802.040528,W,2,08,1.0,221.896,M,,,3,0138*13 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:32.400Z","ept":0.005,"lat":42.095573133,"lon":-88.034008800,"alt":221.896,"speed":4.599,"climb":-0.070} $PASHR,204132.400,015.87,T,+00.27,-00.83,-00.88,0.151,0.088,0.569,1,0*02 $PASHR,204132.440,016.46,T,+00.27,-00.83,-00.88,0.151,0.088,0.569,1,0*08 $PASHR,204132.480,017.07,T,+00.21,-00.84,-00.88,0.151,0.088,0.569,1,0*01 $GPGGA,204132.50,4205.734601,N,08802.040359,W,2,08,1.0,221.890,M,,,3,0138*10 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:32.500Z","ept":0.005,"lat":42.095576683,"lon":-88.034005983,"alt":221.890,"speed":4.580,"climb":-0.060} $PASHR,204132.520,017.66,T,+00.24,-00.84,-00.89,0.151,0.088,0.569,1,0*09 $PASHR,204132.560,018.28,T,+00.19,-00.84,-00.89,0.151,0.088,0.569,1,0*06 $GPGGA,204132.60,4205.734808,N,08802.040180,W,2,08,1.0,221.886,M,,,4,0138*12 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:32.600Z","ept":0.005,"lat":42.095580133,"lon":-88.034003000,"alt":221.886,"speed":4.558,"climb":-0.040} $PASHR,204132.600,018.89,T,+00.23,-00.83,-00.89,0.151,0.088,0.569,1,0*06 $PASHR,204132.640,019.52,T,+00.22,-00.84,-00.90,0.151,0.088,0.569,1,0*0B $PASHR,204132.680,020.15,T,+00.22,-00.84,-00.90,0.151,0.088,0.569,1,0*0E $GPGGA,204132.70,4205.735010,N,08802.039990,W,2,08,1.0,221.877,M,,,4,0138*1A {"class":"TPV","mode":3,"time":"2014-02-19T20:41:32.700Z","ept":0.005,"lat":42.095583500,"lon":-88.033999833,"alt":221.877,"speed":4.566,"climb":-0.090} $PASHR,204132.720,020.79,T,+00.27,-00.85,-00.90,0.151,0.088,0.569,1,0*0B $PASHR,204132.760,021.43,T,+00.25,-00.85,-00.91,0.151,0.088,0.569,1,0*04 $GPGGA,204132.80,4205.735207,N,08802.039792,W,2,08,1.0,221.872,M,,,4,0138*18 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:32.800Z","ept":0.005,"lat":42.095586783,"lon":-88.033996533,"alt":221.872,"speed":4.556,"climb":-0.050} $PASHR,204132.800,022.09,T,+00.27,-00.85,-00.91,0.151,0.088,0.569,1,0*02 $PASHR,204132.840,022.76,T,+00.24,-00.84,-00.91,0.151,0.088,0.569,1,0*0C $PASHR,204132.880,023.44,T,+00.21,-00.82,-00.92,0.151,0.088,0.569,1,0*00 $GPGGA,204132.90,4205.735398,N,08802.039584,W,2,08,1.0,221.872,M,,,4,0138*1B {"class":"TPV","mode":3,"time":"2014-02-19T20:41:32.900Z","ept":0.005,"lat":42.095589967,"lon":-88.033993067,"alt":221.872,"speed":4.553,"climb":0.000} $PASHR,204132.920,024.13,T,+00.15,-00.78,-00.92,0.151,0.088,0.569,1,0*0C $PASHR,204132.960,024.82,T,+00.12,-00.75,-00.92,0.151,0.088,0.569,1,0*0A $GPGGA,204133.00,4205.735585,N,08802.039368,W,2,08,1.0,221.873,M,,,4,0138*1C {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.000Z","ept":0.005,"lat":42.095593083,"lon":-88.033989467,"alt":221.873,"speed":4.567,"climb":0.010} $GPHDT,25.50,T*37 {"class":"ATT","heading":25.50} $GPZDA,204133.000,19,02,2014,,*5C $PASHR,204133.000,025.50,T,+00.19,-00.74,-00.92,0.151,0.088,0.569,1,0*00 $GPRMC,204133.00,A,4205.735585,N,08802.039368,W,8.904,41.865,190214,,,D*75 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.000Z","ept":0.005,"lat":42.095593083,"lon":-88.033989467,"alt":221.873,"track":41.8650,"speed":4.581,"climb":0.010} $PASHR,204133.040,026.22,T,+00.16,-00.78,-00.93,0.152,0.080,0.598,1,0*05 $PASHR,204133.080,026.90,T,+00.07,-00.78,-00.93,0.152,0.080,0.598,1,0*00 $GPGGA,204133.10,4205.735766,N,08802.039145,W,2,09,0.9,221.871,M,,,4,0138*14 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.100Z","ept":0.005,"lat":42.095596100,"lon":-88.033985750,"alt":221.871,"speed":4.548,"climb":-0.020} $PASHR,204133.120,027.60,T,+00.05,-00.79,-00.93,0.152,0.080,0.598,1,0*06 $PASHR,204133.160,028.29,T,-00.12,-00.77,-00.93,0.152,0.080,0.598,1,0*0E $GPGGA,204133.20,4205.735941,N,08802.038913,W,2,09,0.9,221.877,M,,,4,0138*10 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.200Z","ept":0.005,"lat":42.095599017,"lon":-88.033981883,"alt":221.877,"speed":4.553,"climb":0.060} $PASHR,204133.200,028.98,T,-00.12,-00.71,-00.93,0.152,0.080,0.598,1,0*07 $PASHR,204133.240,029.68,T,-00.27,-00.68,-00.93,0.152,0.080,0.598,1,0*03 $PASHR,204133.280,030.40,T,-00.23,-00.59,-00.93,0.152,0.080,0.598,1,0*0B $GPGGA,204133.30,4205.736110,N,08802.038671,W,2,09,0.9,221.881,M,,,4,0138*1C {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.300Z","ept":0.005,"lat":42.095601833,"lon":-88.033977850,"alt":221.881,"speed":4.574,"climb":0.040} $PASHR,204133.320,031.11,T,-00.27,-00.59,-00.94,0.152,0.080,0.598,1,0*06 $PASHR,204133.360,031.83,T,-00.27,-00.56,-00.94,0.152,0.080,0.598,1,0*06 $GPGGA,204133.40,4205.736273,N,08802.038422,W,2,09,0.9,221.884,M,,,4,0138*1C {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.400Z","ept":0.005,"lat":42.095604550,"lon":-88.033973700,"alt":221.884,"speed":4.571,"climb":0.030} $PASHR,204133.400,032.54,T,-00.29,-00.57,-00.94,0.152,0.080,0.598,1,0*01 $PASHR,204133.440,033.26,T,-00.29,-00.53,-00.94,0.152,0.080,0.598,1,0*05 $PASHR,204133.480,033.96,T,-00.29,-00.51,-00.94,0.152,0.080,0.598,1,0*00 $GPGGA,204133.50,4205.736429,N,08802.038168,W,2,09,0.9,221.887,M,,,4,0138*1C {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.500Z","ept":0.005,"lat":42.095607150,"lon":-88.033969467,"alt":221.887,"speed":4.539,"climb":0.030} $PASHR,204133.520,034.67,T,-00.28,-00.47,-00.94,0.152,0.080,0.598,1,0*04 $PASHR,204133.560,035.38,T,-00.29,-00.47,-00.94,0.152,0.080,0.598,1,0*0A $GPGGA,204133.60,4205.736580,N,08802.037908,W,2,09,0.9,221.885,M,,,5,0138*1F {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.600Z","ept":0.005,"lat":42.095609667,"lon":-88.033965133,"alt":221.885,"speed":4.546,"climb":-0.020} $PASHR,204133.600,036.09,T,-00.27,-00.47,-00.95,0.152,0.080,0.598,1,0*01 $PASHR,204133.640,036.82,T,-00.27,-00.52,-00.95,0.152,0.080,0.598,1,0*02 $PASHR,204133.680,037.54,T,-00.22,-00.54,-00.95,0.152,0.080,0.598,1,0*07 $GPGGA,204133.70,4205.736724,N,08802.037642,W,2,09,0.9,221.882,M,,,5,0138*14 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.700Z","ept":0.005,"lat":42.095612067,"lon":-88.033960700,"alt":221.882,"speed":4.534,"climb":-0.030} $PASHR,204133.720,038.26,T,-00.19,-00.57,-00.96,0.152,0.080,0.598,1,0*0E $PASHR,204133.760,038.97,T,-00.15,-00.59,-00.96,0.152,0.080,0.598,1,0*02 $GPGGA,204133.80,4205.736862,N,08802.037370,W,2,09,0.9,221.881,M,,,5,0138*11 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.800Z","ept":0.005,"lat":42.095614367,"lon":-88.033956167,"alt":221.881,"speed":4.538,"climb":-0.010} $PASHR,204133.800,039.69,T,-00.17,-00.60,-00.96,0.152,0.080,0.598,1,0*03 $PASHR,204133.840,040.41,T,-00.19,-00.62,-00.97,0.152,0.080,0.598,1,0*0E $PASHR,204133.880,041.13,T,-00.21,-00.63,-00.97,0.152,0.080,0.598,1,0*0E $GPGGA,204133.90,4205.736994,N,08802.037092,W,2,09,0.9,221.878,M,,,5,0138*11 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:33.900Z","ept":0.005,"lat":42.095616567,"lon":-88.033951533,"alt":221.878,"speed":4.546,"climb":-0.030} $PASHR,204133.920,041.86,T,-00.25,-00.65,-00.97,0.152,0.080,0.598,1,0*0B $PASHR,204133.960,042.58,T,-00.28,-00.68,-00.98,0.152,0.080,0.598,1,0*00 $GPGGA,204134.00,4205.737120,N,08802.036809,W,2,09,0.9,221.877,M,,,5,0138*1D {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.000Z","ept":0.005,"lat":42.095618667,"lon":-88.033946817,"alt":221.877,"speed":4.546,"climb":-0.010} $GPHDT,43.31,T*30 {"class":"ATT","heading":43.31} $GPZDA,204134.000,19,02,2014,,*5B $PASHR,204134.000,043.31,T,-00.31,-00.70,-00.98,0.145,0.105,0.631,1,0*0D $GPRMC,204134.00,A,4205.737120,N,08802.036809,W,8.946,60.172,190214,,,D*72 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.000Z","ept":0.005,"lat":42.095618667,"lon":-88.033946817,"alt":221.877,"track":60.1720,"speed":4.602,"climb":-0.010} $PASHR,204134.040,044.04,T,-00.34,-00.72,-00.98,0.145,0.105,0.631,1,0*0F $PASHR,204134.080,044.76,T,-00.37,-00.72,-00.98,0.145,0.105,0.631,1,0*05 $GPGGA,204134.10,4205.737240,N,08802.036521,W,2,09,0.9,221.880,M,,,3,0138*10 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.100Z","ept":0.005,"lat":42.095620667,"lon":-88.033942017,"alt":221.880,"speed":4.550,"climb":0.030} $PASHR,204134.120,045.48,T,-00.36,-00.71,-00.99,0.145,0.105,0.631,1,0*01 $PASHR,204134.160,046.21,T,-00.36,-00.69,-00.99,0.145,0.105,0.631,1,0*00 $GPGGA,204134.20,4205.737354,N,08802.036223,W,2,09,0.9,221.886,M,,,3,0138*14 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.200Z","ept":0.005,"lat":42.095622567,"lon":-88.033937050,"alt":221.886,"speed":4.619,"climb":0.060} $PASHR,204134.200,046.93,T,-00.35,-00.66,-00.98,0.145,0.105,0.631,1,0*01 $PASHR,204134.240,047.65,T,-00.32,-00.60,-00.98,0.145,0.105,0.631,1,0*0C $PASHR,204134.280,048.37,T,-00.31,-00.56,-00.98,0.145,0.105,0.631,1,0*0E $GPGGA,204134.30,4205.737462,N,08802.035916,W,2,09,0.9,221.894,M,,,3,0138*1A {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.300Z","ept":0.005,"lat":42.095624367,"lon":-88.033931933,"alt":221.894,"speed":4.681,"climb":0.080} $PASHR,204134.320,049.11,T,-00.30,-00.51,-00.98,0.145,0.105,0.631,1,0*06 $PASHR,204134.360,049.83,T,-00.24,-00.48,-00.98,0.145,0.105,0.631,1,0*04 $GPGGA,204134.40,4205.737563,N,08802.035602,W,2,09,0.9,221.900,M,,,3,0138*1B {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.400Z","ept":0.005,"lat":42.095626050,"lon":-88.033926700,"alt":221.900,"speed":4.716,"climb":0.060} $PASHR,204134.400,050.57,T,-00.26,-00.47,-00.98,0.145,0.105,0.631,1,0*09 $PASHR,204134.440,051.31,T,-00.25,-00.45,-00.98,0.145,0.105,0.631,1,0*0D $PASHR,204134.480,052.05,T,-00.27,-00.46,-00.98,0.145,0.105,0.631,1,0*04 $GPGGA,204134.50,4205.737658,N,08802.035283,W,2,09,0.9,221.898,M,,,3,0138*1C {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.500Z","ept":0.005,"lat":42.095627633,"lon":-88.033921383,"alt":221.898,"speed":4.737,"climb":-0.020} $PASHR,204134.520,052.79,T,-00.32,-00.46,-00.99,0.145,0.105,0.631,1,0*01 $PASHR,204134.560,053.52,T,-00.33,-00.46,-00.99,0.145,0.105,0.631,1,0*0C $GPGGA,204134.60,4205.737747,N,08802.034957,W,2,09,0.9,221.895,M,,,4,0138*19 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.600Z","ept":0.005,"lat":42.095629117,"lon":-88.033915950,"alt":221.895,"speed":4.787,"climb":-0.030} $PASHR,204134.600,054.26,T,-00.38,-00.46,-00.99,0.145,0.105,0.631,1,0*06 $PASHR,204134.640,054.99,T,-00.35,-00.49,-00.99,0.145,0.105,0.631,1,0*04 $PASHR,204134.680,055.72,T,-00.36,-00.51,-01.00,0.145,0.105,0.631,1,0*07 $GPGGA,204134.70,4205.737829,N,08802.034624,W,2,09,0.9,221.889,M,,,4,0138*19 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.700Z","ept":0.005,"lat":42.095630483,"lon":-88.033910400,"alt":221.889,"speed":4.836,"climb":-0.060} $PASHR,204134.720,056.46,T,-00.35,-00.55,-01.00,0.145,0.105,0.631,1,0*0F $PASHR,204134.760,057.18,T,-00.30,-00.59,-01.01,0.145,0.105,0.631,1,0*09 $GPGGA,204134.80,4205.737907,N,08802.034287,W,2,09,0.9,221.883,M,,,4,0138*1C {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.800Z","ept":0.005,"lat":42.095631783,"lon":-88.033904783,"alt":221.883,"speed":4.866,"climb":-0.060} $PASHR,204134.800,057.90,T,-00.28,-00.63,-01.01,0.145,0.105,0.631,1,0*00 $PASHR,204134.840,058.62,T,-00.28,-00.65,-01.01,0.145,0.105,0.631,1,0*00 $PASHR,204134.880,059.32,T,-00.20,-00.67,-01.01,0.145,0.105,0.631,1,0*02 $GPGGA,204134.90,4205.737979,N,08802.033944,W,2,09,0.9,221.880,M,,,4,0138*14 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:34.900Z","ept":0.005,"lat":42.095632983,"lon":-88.033899067,"alt":221.880,"speed":4.913,"climb":-0.030} $PASHR,204134.920,060.05,T,-00.23,-00.70,-01.02,0.145,0.105,0.631,1,0*01 $PASHR,204134.960,060.76,T,-00.22,-00.70,-01.02,0.145,0.105,0.631,1,0*00 $GPGGA,204135.00,4205.738043,N,08802.033593,W,2,09,0.9,221.881,M,,,4,0138*14 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.000Z","ept":0.005,"lat":42.095634050,"lon":-88.033893217,"alt":221.881,"speed":4.982,"climb":0.010} $GPHDT,61.49,T*3F {"class":"ATT","heading":61.49} $GPZDA,204135.000,19,02,2014,,*5A $PASHR,204135.000,061.49,T,-00.20,-00.72,-01.02,0.128,0.133,0.674,1,0*0C $GPRMC,204135.00,A,4205.738043,N,08802.033593,W,9.609,76.928,190214,,,D*76 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.000Z","ept":0.005,"lat":42.095634050,"lon":-88.033893217,"alt":221.881,"track":76.9280,"speed":4.943,"climb":0.010} $PASHR,204135.040,062.22,T,-00.25,-00.71,-01.02,0.128,0.133,0.674,1,0*00 $PASHR,204135.080,062.94,T,-00.22,-00.69,-01.02,0.128,0.133,0.674,1,0*0F $GPGGA,204135.10,4205.738099,N,08802.033239,W,2,08,1.0,221.882,M,,,4,0138*1F {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.100Z","ept":0.005,"lat":42.095634983,"lon":-88.033887317,"alt":221.882,"speed":4.990,"climb":0.010} $PASHR,204135.120,063.67,T,-00.31,-00.66,-01.02,0.128,0.133,0.674,1,0*04 $PASHR,204135.160,064.37,T,-00.25,-00.62,-01.02,0.128,0.133,0.674,1,0*03 $GPGGA,204135.20,4205.738151,N,08802.032882,W,2,08,1.0,221.885,M,,,4,0138*15 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.200Z","ept":0.005,"lat":42.095635850,"lon":-88.033881367,"alt":221.885,"speed":5.015,"climb":0.030} $PASHR,204135.200,065.07,T,-00.26,-00.58,-01.02,0.128,0.133,0.674,1,0*0E $PASHR,204135.240,065.74,T,-00.24,-00.55,-01.02,0.128,0.133,0.674,1,0*01 $PASHR,204135.280,066.37,T,-00.20,-00.53,-01.01,0.128,0.133,0.674,1,0*08 $GPGGA,204135.30,4205.738201,N,08802.032522,W,2,08,1.0,221.890,M,,,4,0138*11 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.300Z","ept":0.005,"lat":42.095636683,"lon":-88.033875367,"alt":221.890,"speed":5.049,"climb":0.050} $PASHR,204135.320,066.99,T,-00.23,-00.52,-01.01,0.128,0.133,0.674,1,0*05 $PASHR,204135.360,067.57,T,-00.17,-00.48,-01.01,0.128,0.133,0.674,1,0*0E $GPGGA,204135.40,4205.738250,N,08802.032159,W,2,08,1.0,221.893,M,,,4,0138*19 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.400Z","ept":0.005,"lat":42.095637500,"lon":-88.033869317,"alt":221.893,"speed":5.086,"climb":0.030} $PASHR,204135.400,068.15,T,-00.15,-00.42,-01.01,0.128,0.133,0.674,1,0*0E $PASHR,204135.440,068.68,T,+00.00,-00.36,-01.01,0.128,0.133,0.674,1,0*01 $PASHR,204135.480,069.23,T,+00.11,-00.33,-01.01,0.128,0.133,0.674,1,0*06 $GPGGA,204135.50,4205.738297,N,08802.031793,W,2,08,1.0,221.892,M,,,4,0138*11 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.500Z","ept":0.005,"lat":42.095638283,"lon":-88.033863217,"alt":221.892,"speed":5.121,"climb":-0.010} $PASHR,204135.520,069.75,T,+00.22,-00.31,-01.01,0.128,0.133,0.674,1,0*0C $PASHR,204135.560,070.25,T,+00.39,-00.32,-01.02,0.128,0.133,0.674,1,0*0F $GPGGA,204135.60,4205.738343,N,08802.031421,W,2,08,1.0,221.889,M,,,5,0138*1B {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.600Z","ept":0.005,"lat":42.095639050,"lon":-88.033857017,"alt":221.889,"speed":5.199,"climb":-0.030} $PASHR,204135.600,070.74,T,+00.41,-00.34,-01.02,0.128,0.133,0.674,1,0*07 $PASHR,204135.640,071.21,T,+00.50,-00.33,-01.02,0.128,0.133,0.674,1,0*05 $PASHR,204135.680,071.67,T,+00.54,-00.34,-01.02,0.128,0.133,0.674,1,0*08 $GPGGA,204135.70,4205.738390,N,08802.031048,W,2,08,1.0,221.889,M,,,5,0138*1F {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.700Z","ept":0.005,"lat":42.095639833,"lon":-88.033850800,"alt":221.889,"speed":5.216,"climb":0.000} $PASHR,204135.720,072.11,T,+00.51,-00.32,-01.01,0.128,0.133,0.674,1,0*01 $PASHR,204135.760,072.53,T,+00.51,-00.29,-01.01,0.128,0.133,0.674,1,0*09 $GPGGA,204135.80,4205.738437,N,08802.030674,W,2,08,1.0,221.893,M,,,5,0138*19 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.800Z","ept":0.005,"lat":42.095640617,"lon":-88.033844567,"alt":221.893,"speed":5.230,"climb":0.040} $PASHR,204135.800,072.93,T,+00.47,-00.25,-01.01,0.128,0.133,0.674,1,0*07 $PASHR,204135.840,073.32,T,+00.43,-00.20,-01.01,0.128,0.133,0.674,1,0*08 $PASHR,204135.880,073.70,T,+00.36,-00.18,-01.01,0.128,0.133,0.674,1,0*0B $GPGGA,204135.90,4205.738483,N,08802.030297,W,2,08,1.0,221.901,M,,,5,0138*14 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:35.900Z","ept":0.005,"lat":42.095641383,"lon":-88.033838283,"alt":221.901,"speed":5.267,"climb":0.080} $PASHR,204135.920,074.06,T,+00.38,-00.13,-01.00,0.128,0.133,0.674,1,0*02 $PASHR,204135.960,074.42,T,+00.29,-00.14,-01.00,0.128,0.133,0.674,1,0*01 $GPGGA,204136.00,4205.738527,N,08802.029914,W,2,08,1.0,221.909,M,,,5,0138*11 {"class":"TPV","mode":3,"time":"2014-02-19T20:41:36.000Z","ept":0.005,"lat":42.095642117,"lon":-88.033831900,"alt":221.909,"speed":5.343,"climb":0.080} $GPHDT,74.79,T*38 {"class":"ATT","heading":74.79} $GPZDA,204136.000,19,02,2014,,*59 gpsd-3.15/test/daemon/rtcm2.log0000664000175000017500000000124612461156335014532 0ustar esresr# Name: RTCM-104 source from a DGPSIP server # Type: RTCM # Submitter: Wolfgang Rupprecht # Notes: Has leading garbage, to test parity locking. # This is a truncated version of the sample.rtcm file used to test # gpsdecode. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # YpgA_]qS@oglgyC|~oAxCJxqBHsDzu_FsHEfOXAdbwg@Es~]ywJ@x]Cxv^[_m_xRrLwzyBXQb`Z[@hMmOzbzjOXU}t_UUUEsHEfOXIfByS@oSpG|cBPAFvtGN}wl`xN@KsHEF}gV^]}g@EAx}~ywwWd\uv^{mrAÁðÜ×ðôÈGmÅÁäÞuLwzyBXye@bdWLhO{bz\pkJCE`jjJHsHEF}gZ\]Kl`_XHF|CNPAGvIxqBHSK{w_BsHEfOXUgB|__WSZ[{Iao~aJB`a@dPUrA gpsd-3.15/test/daemon/rtcm2.log.chk0000664000175000017500000000252712466117160015277 0ustar esresr{"class":"RTCM2","type":9,"station_id":268,"zcount":252.0,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.680,"rrc":-0.016},{"ident":7,"udre":0,"iod":15,"prc":25.660,"rrc":0.026},{"ident":26,"udre":0,"iod":128,"prc":12.840,"rrc":0.118}]} {"class":"RTCM2","type":9,"station_id":268,"zcount":252.6,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":13,"udre":0,"iod":3,"prc":-25.940,"rrc":0.066},{"ident":2,"udre":0,"iod":73,"prc":0.920,"rrc":-0.080},{"ident":8,"udre":0,"iod":22,"prc":23.820,"rrc":0.014}]} {"class":"RTCM2","type":9,"station_id":268,"zcount":253.8,"seqnum":5,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-59.520,"rrc":-0.224},{"ident":11,"udre":1,"iod":2,"prc":-39.260,"rrc":0.206}]} {"class":"RTCM2","type":9,"station_id":268,"zcount":255.0,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.700,"rrc":-0.018},{"ident":7,"udre":0,"iod":15,"prc":25.740,"rrc":0.026},{"ident":26,"udre":0,"iod":128,"prc":13.240,"rrc":0.128}]} {"class":"RTCM2","type":9,"station_id":268,"zcount":255.6,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":0.680,"rrc":-0.092},{"ident":13,"udre":0,"iod":3,"prc":-25.680,"rrc":0.084},{"ident":8,"udre":0,"iod":22,"prc":23.880,"rrc":0.000}]} gpsd-3.15/test/daemon/rtcm3.log0000664000175000017500000000061012461156335014525 0ustar esresr# Name: RTCM3 # Description: Sample sentence from the RTCM 3.0 standard # Submitter: Eric S. Raymond # Date: 2011-04-11 # Location: Malvern, PA, USA 40deg 2m N 75deg 30m W # Note: This is the type 1029 example from page 3.71 of the RTCM 3.0 standard, # followed by the type 1005 example from page 4-3 Ó'@P„snUTF-8 прПверка wörterí£; Ó>×Ó˜Þï4Žœb¬ A˜o36 ˜ gpsd-3.15/test/daemon/rtcm3.log.chk0000664000175000017500000000060712466117161015276 0ustar esresr{"class":"RTCM3","type":1029,"length":39,"station_id":23,"mjd":132,"sec":59100,"len":21,"units":30,"msg":"UTF-8 \u00d0\u00bf\u00d1\u0080\u00d0\u00be\u00d0\u00b2\u00d0\u00b5\u00d1\u0080\u00d0\u00ba\u00d0\u00b0 w\u00c3\u00b6rter"} {"class":"RTCM3","type":1005,"length":19,"station_id":2003,"system":["GPS"],"refstation":false,"sro":false,"x":1114104.5999,"y":-4850729.7108,"z":3975521.4643} gpsd-3.15/test/daemon/saab-r4.log0000664000175000017500000001111512467342657014742 0ustar esresr# Name: Saab AIS-GPS R4 Positioning System # Description: product description (optional) # Submitter: vwf@julkor.net # Date: 2011-06-01 !AIVDM,1,1,,B,13aGhtw0R05P8b05`L,0*0B $GPZDA,130721,01,06,2011,01,00*4A $GPGLL,5012.792600,N,00806.879600,W,130721,A,D*54 $GPGGA,130721,5012.792600,N,00806.879600,W,2,,,,,,,*65 $GPVTG,2.2,T,,,0.50,N,,,D*15 $GPRMC,130721.00,A,5012.792600,N,00806.879600,W,0.5,2.2,010611,,A*66 $GPDTM,W84,C*52 $HEHDT,4.1,T*2A $HEROT,0.0,A*2B $PFEC,AIcmd,0,35,A,01062011,130722*05 !AIVDO,1,1,,B,13`kvwO005wJnb2Lfo>@6@8d05`L,0*6E $GPZDA,130722,01,06,2011,01,00*49 $GPGLL,5012.792600,N,00806.879600,W,130722,A,D*57 $GPGGA,130722,5012.792600,N,00806.879600,W,2,,,,,,,*66 $GPVTG,2.5,T,,,0.50,N,,,D*12 $GPRMC,130722.00,A,5012.792600,N,00806.879600,W,0.5,2.5,010611,,A*62 $GPDTM,W84,C*52 $HEHDT,4.1,T*2A $HEROT,0.0,A*2B gpsd-3.15/test/daemon/saab-r4.log.chk0000664000175000017500000002255012467342657015513 0ustar esresr!AIVDM,1,1,,B,13aGhtw0R05P8b05`L,0*0B {"class":"AIS","type":1,"repeat":0,"mmsi":244121341,"scaled":false,"status":15,"status_text":"Not defined","turn":0,"speed":5,"accuracy":true,"lon":-4868799,"lat":30127928,"course":22,"heading":4,"second":21,"maneuver":0,"raim":false,"radio":23068} $GPZDA,130721,01,06,2011,01,00*4A $GPGLL,5012.792600,N,00806.879600,W,130721,A,D*54 $GPGGA,130721,5012.792600,N,00806.879600,W,2,,,,,,,*65 $GPVTG,2.2,T,,,0.50,N,,,D*15 $GPRMC,130721.00,A,5012.792600,N,00806.879600,W,0.5,2.2,010611,,A*66 {"class":"TPV","mode":2,"time":"2011-06-01T13:07:21.000Z","ept":0.005,"lat":50.213210000,"lon":-8.114660000,"track":2.2000,"speed":0.257} $GPDTM,W84,C*52 $PFEC,AIcmd,0,35,A,01062011,130722*05 !AIVDO,1,1,,B,13`kvwO005wJnb2Lfo>@6@8d05`L,0*6E {"class":"AIS","type":1,"repeat":0,"mmsi":244121341,"scaled":false,"status":15,"status_text":"Not defined","turn":0,"speed":5,"accuracy":true,"lon":-4868799,"lat":30127929,"course":25,"heading":4,"second":22,"maneuver":0,"raim":false,"radio":23068} $GPZDA,130722,01,06,2011,01,00*49 $GPGLL,5012.792600,N,00806.879600,W,130722,A,D*57 $GPGGA,130722,5012.792600,N,00806.879600,W,2,,,,,,,*66 $GPVTG,2.5,T,,,0.50,N,,,D*12 $GPRMC,130722.00,A,5012.792600,N,00806.879600,W,0.5,2.5,010611,,A*62 {"class":"TPV","mode":2,"time":"2011-06-01T13:07:22.000Z","ept":0.005,"lat":50.213210000,"lon":-8.114660000,"track":2.5000,"speed":0.257} $GPDTM,W84,C*52 gpsd-3.15/test/daemon/sl869.log0000664000175000017500000002255112474343715014376 0ustar esresr# Name: Telit SL869 # Chipset = STA8088 # Firmware = TELIT SW Version: SL869 v3.1.2.1 -STD -N96 # Date = 2012-11-25 # Submitter = Arn # Location = Sydney, NSW, AU, -33.68 151.29 # type = device # Notes: Contains skyview sentences from QZSS. $GPTXT,TELIT SW Version: SL869 v3.1.2.1 -STD -N96 $GPRMC,102136.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*79 $GPGGA,102136.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*41 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,16,78,51,239,*60 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102137.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*78 $GPGGA,102137.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*40 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,16,78,51,239,*60 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102138.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*77 $GPGGA,102138.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*4F $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,16,78,51,239,*60 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102139.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*76 $GPGGA,102139.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*4E $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,,78,51,239,*67 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102140.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*78 $GPGGA,102140.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*40 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102141.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*79 $GPGGA,102141.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*41 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GPGSV,3,1,10,02,86,086,43,04,40,133,,05,20,023,39,09,36,327,*78 $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,21,24,38,321,*75 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102142.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*7A $GPGGA,102142.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*42 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E $GPGSV,3,1,10,02,86,086,42,04,40,133,,05,20,023,38,09,36,327,*78 $GPGSV,3,2,10,10,31,083,37,12,61,213,,17,07,105,20,24,38,321,*7B $GPGSV,3,3,10,25,25,224,30,29,12,267,34,,,,,,,,*73 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102143.000,A,3340.7732,S,15117.4478,E,6.7,155.1,251112,0.0,W*6E $GPGGA,102143.000,3340.7732,S,15117.4478,E,1,03,4.1,063.76,M,22.4,M,,*7B $GNGSA,A,2,10,17,12,,,,,,,,,,4.2,4.1,1.0*2B $GNGSA,A,2,,,,,,,,,,,,,4.2,4.1,1.0*2F $GNGSA,A,2,,,,,,,,,,,,,4.2,4.1,1.0*2F $GPGSV,3,1,10,02,86,086,42,04,40,133,,05,20,023,38,09,36,327,*78 $GPGSV,3,2,10,10,31,083,37,12,61,213,39,17,07,105,21,24,38,321,*70 $GPGSV,3,3,10,25,25,224,30,29,12,267,34,,,,,,,,*73 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102143.990,A,3340.7753,S,15117.4475,E,6.7,155.8,251112,0.0,W*6D $GPGGA,102143.990,3340.7753,S,15117.4475,E,1,03,99.0,063.79,M,22.4,M,,*4B $GNGSA,A,2,10,17,12,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,2,,,,,,,,,,,,,99.0,99.0,99.0*1D $GNGSA,A,2,,,,,,,,,,,,,99.0,99.0,99.0*1D $GPGSV,3,1,10,02,86,086,42,04,40,133,,05,20,023,38,09,36,327,*78 $GPGSV,3,2,10,10,31,083,37,12,61,213,40,17,07,105,20,24,38,321,*7F $GPGSV,3,3,10,25,25,224,30,29,12,267,34,,,,,,,,*73 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102144.000,A,3340.7753,S,15117.4473,E,6.6,155.8,251112,0.0,W*6D $GPGGA,102144.000,3340.7753,S,15117.4473,E,1,03,99.0,063.79,M,22.4,M,,*4A $GNGSA,A,2,10,17,12,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,2,,,,,,,,,,,,,99.0,99.0,99.0*1D $GNGSA,A,2,,,,,,,,,,,,,99.0,99.0,99.0*1D $GPGSV,3,1,10,02,86,086,42,04,40,133,,05,20,023,38,09,36,327,*78 $GPGSV,3,2,10,10,31,083,37,12,61,213,40,17,07,105,20,24,38,321,*7F $GPGSV,3,3,10,25,25,224,30,29,12,267,34,,,,,,,,*73 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102145.000,A,3340.8097,S,15117.4692,E,0.3,311.5,251112,0.0,W*6D $GPGGA,102145.000,3340.8097,S,15117.4692,E,1,05,2.0,077.22,M,22.4,M,,*79 $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,38,09,36,327,37*74 $GPGSV,3,2,10,10,31,083,36,12,61,213,40,17,07,105,20,24,38,321,37*7A $GPGSV,3,3,10,25,25,224,30,29,12,267,33,,,,,,,,*74 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A $GPRMC,102146.000,A,3340.8150,S,15117.4708,E,0.2,0.0,251112,0.0,W*61 $GPGGA,102146.000,3340.8150,S,15117.4708,E,1,05,2.0,080.46,M,22.4,M,,*78 $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,38,09,36,327,38*7B $GPGSV,3,2,10,10,31,083,36,12,61,213,40,17,07,105,20,24,38,321,37*7A $GPGSV,3,3,10,25,25,224,30,29,12,267,33,,,,,,,,*74 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,14,78,51,239,*62 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,10,143,*69 $QZGSV,1,1,01,193,34,332,36,,,,,,,,,,,,*6F $GPRMC,102147.000,A,3340.8169,S,15117.4716,E,0.1,0.0,251112,0.0,W*66 $GPGGA,102147.000,3340.8169,S,15117.4716,E,1,05,2.0,081.88,M,22.4,M,,*7F $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,38,09,36,327,38*7B $GPGSV,3,2,10,10,31,083,35,12,61,213,40,17,07,105,19,24,38,321,37*73 $GPGSV,3,3,10,25,25,224,29,29,12,267,33,,,,,,,,*7C $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,10,143,*69 $QZGSV,1,1,01,193,34,332,35,,,,,,,,,,,,*6C $GPRMC,102148.020,A,3340.8149,S,15117.4711,E,0.1,0.0,251112,0.0,W*6E $GPGGA,102148.020,3340.8149,S,15117.4711,E,1,05,2.0,082.56,M,22.4,M,,*77 $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,37,09,36,327,37*7B $GPGSV,3,2,10,10,31,083,35,12,61,213,40,17,07,105,18,24,38,321,37*72 $GPGSV,3,3,10,25,25,224,29,29,12,267,33,,,,,,,,*7C $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,10,143,*69 $QZGSV,1,1,01,193,34,332,35,,,,,,,,,,,,*6C $GPRMC,102149.000,A,3340.8139,S,15117.4712,E,0.2,0.0,251112,0.0,W*6A $GPGGA,102149.000,3340.8139,S,15117.4712,E,1,05,2.0,083.12,M,22.4,M,,*71 $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,37,09,36,327,37*7B $GPGSV,3,2,10,10,31,083,34,12,61,213,40,17,07,105,17,24,38,321,37*7C $GPGSV,3,3,10,25,25,224,29,29,12,267,33,,,,,,,,*7C $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,10,143,*69 $QZGSV,1,1,01,193,34,332,35,,,,,,,,,,,,*6C gpsd-3.15/test/daemon/sl869.log.chk0000664000175000017500000012315612474344617015147 0ustar esresr$GPTXT,TELIT SW Version: SL869 v3.1.2.1 -STD -N96 $GPRMC,102136.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*79 $GPGGA,102136.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*41 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false}]} $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,16,78,51,239,*60 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":16,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":16,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102137.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*78 $GPGGA,102137.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*40 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,16,78,51,239,*60 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":16,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":16,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102138.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*77 $GPGGA,102138.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*4F $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,16,78,51,239,*60 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":16,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":16,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102139.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*76 $GPGGA,102139.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*4E $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,,78,51,239,*67 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":0,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":0,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102140.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*78 $GPGGA,102140.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*40 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GPGSV,3,1,10,02,86,086,,04,40,133,,05,20,023,39,09,36,327,*7F $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,20,24,38,321,*74 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":0,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102141.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*79 $GPGGA,102141.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*41 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GPGSV,3,1,10,02,86,086,43,04,40,133,,05,20,023,39,09,36,327,*78 $GPGSV,3,2,10,10,31,083,38,12,61,213,,17,07,105,21,24,38,321,*75 $GPGSV,3,3,10,25,25,224,31,29,12,267,34,,,,,,,,*72 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,153,,71,11,142,*68 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":43,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":21,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":43,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":39,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":38,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":21,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":31,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":153,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102142.000,V,3340.8472,S,15117.3205,E,0.0,0.0,251112,0.0,W*7A $GPGGA,102142.000,3340.8472,S,15117.3205,E,0,02,99.0,064.19,M,22.4,M,,*42 $GNGSA,A,1,10,17,,,,,,,,,,,99.0,99.0,99.0*19 {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GNGSA,A,1,,,,,,,,,,,,,99.0,99.0,99.0*1E {"class":"TPV","mode":1} $GPGSV,3,1,10,02,86,086,42,04,40,133,,05,20,023,38,09,36,327,*78 $GPGSV,3,2,10,10,31,083,37,12,61,213,,17,07,105,20,24,38,321,*7B $GPGSV,3,3,10,25,25,224,30,29,12,267,34,,,,,,,,*73 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":42,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":37,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":42,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":37,"used":false},{"PRN":12,"el":61,"az":213,"ss":0,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102143.000,A,3340.7732,S,15117.4478,E,6.7,155.1,251112,0.0,W*6E {"class":"TPV","mode":2,"time":"2012-11-25T10:21:43.000Z","ept":0.005,"lat":-33.679553333,"lon":151.290796667,"track":155.1000,"speed":3.447} $GPGGA,102143.000,3340.7732,S,15117.4478,E,1,03,4.1,063.76,M,22.4,M,,*7B {"class":"TPV","mode":3,"time":"2012-11-25T10:21:43.000Z","ept":0.005,"lat":-33.679553333,"lon":151.290796667,"alt":63.760,"epv":2277.000,"track":155.1000,"speed":3.447} $GNGSA,A,2,10,17,12,,,,,,,,,,4.2,4.1,1.0*2B $GNGSA,A,2,,,,,,,,,,,,,4.2,4.1,1.0*2F $GNGSA,A,2,,,,,,,,,,,,,4.2,4.1,1.0*2F $GPGSV,3,1,10,02,86,086,42,04,40,133,,05,20,023,38,09,36,327,*78 $GPGSV,3,2,10,10,31,083,37,12,61,213,39,17,07,105,21,24,38,321,*70 $GPGSV,3,3,10,25,25,224,30,29,12,267,34,,,,,,,,*73 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 {"class":"SKY","vdop":1.00,"hdop":4.10,"pdop":4.20,"satellites":[{"PRN":2,"el":86,"az":86,"ss":42,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":37,"used":false},{"PRN":12,"el":61,"az":213,"ss":39,"used":false},{"PRN":17,"el":7,"az":105,"ss":21,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":1.00,"hdop":4.10,"pdop":4.20,"satellites":[{"PRN":2,"el":86,"az":86,"ss":42,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":37,"used":false},{"PRN":12,"el":61,"az":213,"ss":39,"used":false},{"PRN":17,"el":7,"az":105,"ss":21,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102143.990,A,3340.7753,S,15117.4475,E,6.7,155.8,251112,0.0,W*6D $GPGGA,102143.990,3340.7753,S,15117.4475,E,1,03,99.0,063.79,M,22.4,M,,*4B {"class":"TPV","mode":3,"time":"2012-11-25T10:21:43.990Z","ept":0.005,"lat":-33.679588333,"lon":151.290791667,"alt":63.790,"epv":23.000,"track":155.8000,"speed":3.447} $GNGSA,A,2,10,17,12,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,2,,,,,,,,,,,,,99.0,99.0,99.0*1D $GNGSA,A,2,,,,,,,,,,,,,99.0,99.0,99.0*1D $GPGSV,3,1,10,02,86,086,42,04,40,133,,05,20,023,38,09,36,327,*78 $GPGSV,3,2,10,10,31,083,37,12,61,213,40,17,07,105,20,24,38,321,*7F $GPGSV,3,3,10,25,25,224,30,29,12,267,34,,,,,,,,*73 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":42,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":37,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":42,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":37,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102144.000,A,3340.7753,S,15117.4473,E,6.6,155.8,251112,0.0,W*6D $GPGGA,102144.000,3340.7753,S,15117.4473,E,1,03,99.0,063.79,M,22.4,M,,*4A {"class":"TPV","mode":3,"time":"2012-11-25T10:21:44.000Z","ept":0.005,"lat":-33.679588333,"lon":151.290788333,"alt":63.790,"epv":23.000,"track":155.8000,"speed":3.395,"climb":0.000,"epc":4600.00} $GNGSA,A,2,10,17,12,,,,,,,,,,99.0,99.0,99.0*19 $GNGSA,A,2,,,,,,,,,,,,,99.0,99.0,99.0*1D $GNGSA,A,2,,,,,,,,,,,,,99.0,99.0,99.0*1D $GPGSV,3,1,10,02,86,086,42,04,40,133,,05,20,023,38,09,36,327,*78 $GPGSV,3,2,10,10,31,083,37,12,61,213,40,17,07,105,20,24,38,321,*7F $GPGSV,3,3,10,25,25,224,30,29,12,267,34,,,,,,,,*73 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":42,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":37,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":99.00,"hdop":99.00,"pdop":99.00,"satellites":[{"PRN":2,"el":86,"az":86,"ss":42,"used":false},{"PRN":4,"el":40,"az":133,"ss":0,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":0,"used":false},{"PRN":10,"el":31,"az":83,"ss":37,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":0,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":34,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102145.000,A,3340.8097,S,15117.4692,E,0.3,311.5,251112,0.0,W*6D $GPGGA,102145.000,3340.8097,S,15117.4692,E,1,05,2.0,077.22,M,22.4,M,,*79 {"class":"TPV","mode":3,"time":"2012-11-25T10:21:45.000Z","ept":0.005,"lat":-33.680161667,"lon":151.291153333,"alt":77.220,"epv":2277.000,"track":311.5000,"speed":0.154} $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,38,09,36,327,37*74 $GPGSV,3,2,10,10,31,083,36,12,61,213,40,17,07,105,20,24,38,321,37*7A $GPGSV,3,3,10,25,25,224,30,29,12,267,33,,,,,,,,*74 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,11,142,*69 {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":37,"used":false},{"PRN":10,"el":31,"az":83,"ss":36,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,,,,,,,,,,,,,*6A {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":37,"used":false},{"PRN":10,"el":31,"az":83,"ss":36,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":11,"az":142,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102146.000,A,3340.8150,S,15117.4708,E,0.2,0.0,251112,0.0,W*61 $GPGGA,102146.000,3340.8150,S,15117.4708,E,1,05,2.0,080.46,M,22.4,M,,*78 {"class":"TPV","mode":3,"time":"2012-11-25T10:21:46.000Z","ept":0.005,"lat":-33.680250000,"lon":151.291180000,"alt":80.460,"epv":71.300,"track":0.0000,"speed":0.103} $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,38,09,36,327,38*7B $GPGSV,3,2,10,10,31,083,36,12,61,213,40,17,07,105,20,24,38,321,37*7A $GPGSV,3,3,10,25,25,224,30,29,12,267,33,,,,,,,,*74 $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,14,78,51,239,*62 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,10,143,*69 {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":38,"used":false},{"PRN":10,"el":31,"az":83,"ss":36,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":14,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":10,"az":143,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,36,,,,,,,,,,,,*6F {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":38,"used":false},{"PRN":10,"el":31,"az":83,"ss":36,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":20,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":30,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":14,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":10,"az":143,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":36,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102147.000,A,3340.8169,S,15117.4716,E,0.1,0.0,251112,0.0,W*66 $GPGGA,102147.000,3340.8169,S,15117.4716,E,1,05,2.0,081.88,M,22.4,M,,*7F {"class":"TPV","mode":3,"time":"2012-11-25T10:21:47.000Z","ept":0.005,"lat":-33.680281667,"lon":151.291193333,"alt":81.880,"epv":71.300,"track":0.0000,"speed":0.051} $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,38,09,36,327,38*7B $GPGSV,3,2,10,10,31,083,35,12,61,213,40,17,07,105,19,24,38,321,37*73 $GPGSV,3,3,10,25,25,224,29,29,12,267,33,,,,,,,,*7C $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,10,143,*69 {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":38,"used":false},{"PRN":10,"el":31,"az":83,"ss":35,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":19,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":29,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":10,"az":143,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,35,,,,,,,,,,,,*6C {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":38,"used":false},{"PRN":9,"el":36,"az":327,"ss":38,"used":false},{"PRN":10,"el":31,"az":83,"ss":35,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":19,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":29,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":10,"az":143,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":35,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102148.020,A,3340.8149,S,15117.4711,E,0.1,0.0,251112,0.0,W*6E $GPGGA,102148.020,3340.8149,S,15117.4711,E,1,05,2.0,082.56,M,22.4,M,,*77 {"class":"TPV","mode":3,"time":"2012-11-25T10:21:48.020Z","ept":0.005,"lat":-33.680248333,"lon":151.291185000,"alt":82.560,"epv":71.300,"track":0.0000,"speed":0.051} $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,37,09,36,327,37*7B $GPGSV,3,2,10,10,31,083,35,12,61,213,40,17,07,105,18,24,38,321,37*72 $GPGSV,3,3,10,25,25,224,29,29,12,267,33,,,,,,,,*7C $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,10,143,*69 {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":37,"used":false},{"PRN":9,"el":36,"az":327,"ss":37,"used":false},{"PRN":10,"el":31,"az":83,"ss":35,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":18,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":29,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":10,"az":143,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,35,,,,,,,,,,,,*6C {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":37,"used":false},{"PRN":9,"el":36,"az":327,"ss":37,"used":false},{"PRN":10,"el":31,"az":83,"ss":35,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":18,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":29,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":10,"az":143,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":35,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} $GPRMC,102149.000,A,3340.8139,S,15117.4712,E,0.2,0.0,251112,0.0,W*6A $GPGGA,102149.000,3340.8139,S,15117.4712,E,1,05,2.0,083.12,M,22.4,M,,*71 {"class":"TPV","mode":3,"time":"2012-11-25T10:21:49.000Z","ept":0.005,"lat":-33.680231667,"lon":151.291186667,"alt":83.120,"epv":71.300,"track":0.0000,"speed":0.103} $GNGSA,A,3,10,17,12,24,09,,,,,,,,3.7,2.0,3.1*23 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GNGSA,A,3,,,,,,,,,,,,,3.7,2.0,3.1*28 $GPGSV,3,1,10,02,86,086,41,04,40,133,38,05,20,023,37,09,36,327,37*7B $GPGSV,3,2,10,10,31,083,34,12,61,213,40,17,07,105,17,24,38,321,37*7C $GPGSV,3,3,10,25,25,224,29,29,12,267,33,,,,,,,,*7C $GLGSV,2,1,08,76,08,007,,65,10,040,,81,09,277,15,78,51,239,*63 $GLGSV,2,2,08,77,51,333,,88,48,233,,87,41,152,,71,10,143,*69 {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":37,"used":false},{"PRN":9,"el":36,"az":327,"ss":37,"used":false},{"PRN":10,"el":31,"az":83,"ss":34,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":17,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":29,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":10,"az":143,"ss":0,"used":false}]} $QZGSV,1,1,01,193,34,332,35,,,,,,,,,,,,*6C {"class":"SKY","vdop":3.10,"hdop":2.00,"pdop":3.70,"satellites":[{"PRN":2,"el":86,"az":86,"ss":41,"used":false},{"PRN":4,"el":40,"az":133,"ss":38,"used":false},{"PRN":5,"el":20,"az":23,"ss":37,"used":false},{"PRN":9,"el":36,"az":327,"ss":37,"used":false},{"PRN":10,"el":31,"az":83,"ss":34,"used":false},{"PRN":12,"el":61,"az":213,"ss":40,"used":false},{"PRN":17,"el":7,"az":105,"ss":17,"used":false},{"PRN":24,"el":38,"az":321,"ss":37,"used":false},{"PRN":25,"el":25,"az":224,"ss":29,"used":false},{"PRN":29,"el":12,"az":267,"ss":33,"used":false},{"PRN":76,"el":8,"az":7,"ss":0,"used":false},{"PRN":65,"el":10,"az":40,"ss":0,"used":false},{"PRN":81,"el":9,"az":277,"ss":15,"used":false},{"PRN":78,"el":51,"az":239,"ss":0,"used":false},{"PRN":77,"el":51,"az":333,"ss":0,"used":false},{"PRN":88,"el":48,"az":233,"ss":0,"used":false},{"PRN":87,"el":41,"az":152,"ss":0,"used":false},{"PRN":71,"el":10,"az":143,"ss":0,"used":false},{"PRN":193,"el":34,"az":332,"ss":35,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false},{"PRN":193,"el":0,"az":0,"ss":0,"used":false}]} gpsd-3.15/test/daemon/sounder.log0000664000175000017500000002136512461156335015166 0ustar esresr# Name: Generic depth sounder # Description: Generic depth sounder returning NMEA SDDBT # Submitter: John Hawley # Date: 2012-01-19 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.169,E,164326,A,D*52 $SDDBT,7.9,f,2.4,M,1.3,F*0C $ECGLL,5119.881,N,00125.169,E,164328,A,D*5C $SDDBT,7.9,f,2.4,M,1.3,F*0C $ECGLL,5119.881,N,00125.169,E,164330,A,D*55 $SDDBT,7.9,f,2.4,M,1.3,F*0C $ECGLL,5119.881,N,00125.169,E,164332,A,D*57 $SDDBT,7.9,f,2.4,M,1.3,F*0C $ECGLL,5119.881,N,00125.169,E,164334,A,D*51 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.169,E,164336,A,D*53 $SDDBT,7.8,f,2.4,M,1.3,F*0D $ECGLL,5119.881,N,00125.169,E,164338,A,D*5D $SDDBT,7.8,f,2.4,M,1.3,F*0D $ECGLL,5119.881,N,00125.169,E,164340,A,D*52 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.169,E,164342,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164344,A,D*56 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164346,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164348,A,D*5A $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164350,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164352,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164354,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164356,A,D*55 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.169,E,164358,A,D*5B $SDDBT,7.9,f,2.4,M,1.3,F*0C $ECGLL,5119.881,N,00125.169,E,164400,A,D*51 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.169,E,164402,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164404,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164406,A,D*57 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164408,A,D*59 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164410,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164412,A,D*52 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164414,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164416,A,D*56 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164418,A,D*58 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164420,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164422,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164424,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164426,A,D*55 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164428,A,D*5B $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164430,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164432,A,D*50 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.169,E,164434,A,D*56 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164436,A,D*54 $SDDBT,7.8,f,2.4,M,1.3,F*0D $ECGLL,5119.881,N,00125.169,E,164438,A,D*5A $SDDBT,7.8,f,2.4,M,1.3,F*0D $ECGLL,5119.881,N,00125.169,E,164440,A,D*55 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.169,E,164442,A,D*57 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164444,A,D*51 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164446,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164448,A,D*5D $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164450,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164452,A,D*56 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164454,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164456,A,D*52 $SDDBT,7.9,f,2.4,M,1.3,F*0C $ECGLL,5119.881,N,00125.169,E,164458,A,D*5C $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164500,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164502,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164504,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164506,A,D*56 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164508,A,D*58 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164510,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164512,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164514,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164516,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164518,A,D*59 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164520,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164522,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164524,A,D*56 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164526,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164528,A,D*5A $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164530,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164532,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164534,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164536,A,D*55 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.169,E,164538,A,D*5B $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164540,A,D*54 $SDDBT,8.1,f,2.5,M,1.4,F*0D $ECGLL,5119.881,N,00125.169,E,164542,A,D*56 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164544,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164546,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164548,A,D*5C $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164550,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164552,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164554,A,D*51 $SDDBT,7.9,f,2.4,M,1.3,F*0C $ECGLL,5119.881,N,00125.169,E,164556,A,D*53 $SDDBT,7.8,f,2.4,M,1.3,F*0D $ECGLL,5119.881,N,00125.169,E,164558,A,D*5D $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164600,A,D*53 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164602,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164604,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164606,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164608,A,D*5B $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164610,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164612,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164614,A,D*56 $SDDBT,8.1,f,2.5,M,1.4,F*0D $ECGLL,5119.881,N,00125.169,E,164616,A,D*54 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.169,E,164618,A,D*5A $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164620,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.169,E,164622,A,D*53 $SDDBT,7.8,f,2.4,M,1.3,F*0D $ECGLL,5119.881,N,00125.169,E,164624,A,D*55 $SDDBT,7.8,f,2.4,M,1.3,F*0D $ECGLL,5119.881,N,00125.169,E,164626,A,D*57 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.169,E,164628,A,D*59 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.168,E,164630,A,D*51 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.168,E,164632,A,D*53 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.168,E,164634,A,D*55 $SDDBT,7.9,f,2.4,M,1.3,F*0C $ECGLL,5119.881,N,00125.168,E,164636,A,D*57 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.168,E,164638,A,D*59 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.168,E,164640,A,D*56 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.168,E,164642,A,D*54 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.168,E,164644,A,D*52 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.168,E,164646,A,D*50 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.881,N,00125.168,E,164648,A,D*5E $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.168,E,164650,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.168,E,164652,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.168,E,164654,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.168,E,164656,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.168,E,164658,A,D*5F $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.881,N,00125.168,E,164700,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.881,N,00125.168,E,164702,A,D*51 $SDDBT,7.8,f,2.4,M,1.3,F*0D $ECGLL,5119.881,N,00125.168,E,164704,A,D*57 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.882,N,00125.168,E,164706,A,D*56 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.882,N,00125.168,E,164708,A,D*58 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.882,N,00125.168,E,164710,A,D*51 $SDDBT,7.8,f,2.4,M,1.3,F*0D $ECGLL,5119.882,N,00125.168,E,164712,A,D*53 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.882,N,00125.168,E,164714,A,D*55 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.882,N,00125.168,E,164716,A,D*57 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.882,N,00125.168,E,164718,A,D*59 $SDDBT,7.5,f,2.3,M,1.3,F*07 $ECGLL,5119.882,N,00125.168,E,164720,A,D*52 $SDDBT,8.0,f,2.4,M,1.3,F*0A $ECGLL,5119.882,N,00125.168,E,164722,A,D*50 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.882,N,00125.168,E,164724,A,D*56 $SDDBT,7.7,f,2.3,M,1.3,F*05 $ECGLL,5119.882,N,00125.168,E,164726,A,D*54 $SDDBT,7.6,f,2.3,M,1.3,F*04 $ECGLL,5119.882,N,00125.168,E,164728,A,D*5A gpsd-3.15/test/daemon/sounder.log.chk0000664000175000017500000004314312467340617015734 0ustar esresr$SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164326,A,D*52 $SDDBT,7.9,f,2.4,M,1.3,F*0C {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164328,A,D*5C $SDDBT,7.9,f,2.4,M,1.3,F*0C {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164330,A,D*55 $SDDBT,7.9,f,2.4,M,1.3,F*0C {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164332,A,D*57 $SDDBT,7.9,f,2.4,M,1.3,F*0C {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164334,A,D*51 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164336,A,D*53 $SDDBT,7.8,f,2.4,M,1.3,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164338,A,D*5D $SDDBT,7.8,f,2.4,M,1.3,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164340,A,D*52 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164342,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164344,A,D*56 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164346,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164348,A,D*5A $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164350,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164352,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164354,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164356,A,D*55 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164358,A,D*5B $SDDBT,7.9,f,2.4,M,1.3,F*0C {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164400,A,D*51 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164402,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164404,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164406,A,D*57 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164408,A,D*59 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164410,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164412,A,D*52 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164414,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164416,A,D*56 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164418,A,D*58 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164420,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164422,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164424,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164426,A,D*55 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164428,A,D*5B $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164430,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164432,A,D*50 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164434,A,D*56 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164436,A,D*54 $SDDBT,7.8,f,2.4,M,1.3,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164438,A,D*5A $SDDBT,7.8,f,2.4,M,1.3,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164440,A,D*55 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164442,A,D*57 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164444,A,D*51 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164446,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164448,A,D*5D $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164450,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164452,A,D*56 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164454,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164456,A,D*52 $SDDBT,7.9,f,2.4,M,1.3,F*0C {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164458,A,D*5C $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164500,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164502,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164504,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164506,A,D*56 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164508,A,D*58 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164510,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164512,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164514,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164516,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164518,A,D*59 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164520,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164522,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164524,A,D*56 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164526,A,D*54 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164528,A,D*5A $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164530,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164532,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164534,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164536,A,D*55 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164538,A,D*5B $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164540,A,D*54 $SDDBT,8.1,f,2.5,M,1.4,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.500} $ECGLL,5119.881,N,00125.169,E,164542,A,D*56 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164544,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164546,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164548,A,D*5C $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164550,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164552,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164554,A,D*51 $SDDBT,7.9,f,2.4,M,1.3,F*0C {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164556,A,D*53 $SDDBT,7.8,f,2.4,M,1.3,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164558,A,D*5D $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164600,A,D*53 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164602,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164604,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164606,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164608,A,D*5B $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164610,A,D*52 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164612,A,D*50 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164614,A,D*56 $SDDBT,8.1,f,2.5,M,1.4,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.500} $ECGLL,5119.881,N,00125.169,E,164616,A,D*54 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164618,A,D*5A $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164620,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164622,A,D*53 $SDDBT,7.8,f,2.4,M,1.3,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164624,A,D*55 $SDDBT,7.8,f,2.4,M,1.3,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.400} $ECGLL,5119.881,N,00125.169,E,164626,A,D*57 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.169,E,164628,A,D*59 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419483333,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164630,A,D*51 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164632,A,D*53 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164634,A,D*55 $SDDBT,7.9,f,2.4,M,1.3,F*0C {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.400} $ECGLL,5119.881,N,00125.168,E,164636,A,D*57 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164638,A,D*59 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164640,A,D*56 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164642,A,D*54 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164644,A,D*52 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164646,A,D*50 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164648,A,D*5E $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164650,A,D*57 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164652,A,D*55 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164654,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164656,A,D*51 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164658,A,D*5F $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164700,A,D*53 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.881,N,00125.168,E,164702,A,D*51 $SDDBT,7.8,f,2.4,M,1.3,F*0D {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.400} $ECGLL,5119.881,N,00125.168,E,164704,A,D*57 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331350000,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164706,A,D*56 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164708,A,D*58 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164710,A,D*51 $SDDBT,7.8,f,2.4,M,1.3,F*0D {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.400} $ECGLL,5119.882,N,00125.168,E,164712,A,D*53 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164714,A,D*55 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164716,A,D*57 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164718,A,D*59 $SDDBT,7.5,f,2.3,M,1.3,F*07 {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164720,A,D*52 $SDDBT,8.0,f,2.4,M,1.3,F*0A {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.400} $ECGLL,5119.882,N,00125.168,E,164722,A,D*50 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164724,A,D*56 $SDDBT,7.7,f,2.3,M,1.3,F*05 {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164726,A,D*54 $SDDBT,7.6,f,2.3,M,1.3,F*04 {"class":"TPV","mode":3,"lat":51.331366667,"lon":1.419466667,"alt":-2.300} $ECGLL,5119.882,N,00125.168,E,164728,A,D*5A gpsd-3.15/test/daemon/superstar2.log0000664000175000017500000000453112467342657015627 0ustar esresr# Name: Novatel Superstar 2 GPS engine # Submitter: Chris Kuethe # Date: 2009-08-09 # Location: unknown # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # qŽ;'ó.z¿}À@–Z9Rćñ¿Ù2€ èÿÿJ@Øôÿÿ, dló!Þ= aLn2kCÔ2}7'c)?$|% œGßЬdË^± èBÿךÿÿ›v Aœœw;tXº«¹0 Æàü=t¬(‚è Çt¢itlՐ°Ð¿sà>0’DYsŽS0‘HëG2ÀµæÿK@Ù@^{"Pêí?Ÿ!Ò[¥­ÿ¿BóDÊœJAÓeA!¢—qŽ;'óÛ³p> @np iuŠñ¿Ù2ÀVçÿK@…ôÿÿ, dlÔ!Þ= aLn2kCÔ2}7'c)?$|% œGßЬdË^± èBöÿÿv AȬ¢itØÍ¹Ô ȯø=tDîQè z~;tØÐ÷ž00ÿsœè[0“/jsǐHŠ ëG2€}çÿÿK@Ùy† Pêí?àRY^¥­ÿ¿€÷DïvIAÑ-dA!¢)qŽ;'óQÃ%M?ý@†Ú¶ªb…ñ¿Ù2€èÿÿK@âôÿÿ, dl!Þ= aLn2kCÔ2}7'c)?$|% œGßЬdË^± èBÿ›ÿÿŸv AÉs¡it€TÔ É ó=tøŒ!è œÄƒ;tlñCž06Ž¿sˆ–›0’³ysè;ӎH ëG2€ÇæÿL@Ù—÷èPêí?¢o`¥­ÿ¿büD>6HAö‘bA!¢ðqŽ;'ó²QÅfN¡@òx쪱…ñ¿Ù2€hçÿL@ôÿÿ, dlj!Þ= aLn2kCÔ2}7(c)?$|% œGßЬdË^² èB+žÿÿ¡v Aƪ¡it4IïÓ ÇØî=tì‡ñç ž†Š;t°·0¯Š¿s<>Û0’£Šsp¥€HÓëG2ÀŠçÿÿL@ÙùúÏPêí?îKÓb¥­ÿ¿!DˆûFAÿ`A!¢qŽ;'óˆW¬Úãì @Ó¯-GЇñ¿Ù2À+èÿÿL@èôÿÿ, dl*!Þ= aLn2kCÔ2}7(c)?$|$ œGßЬdË^± èBÿe›ÿÿ£v AÇn it ŠÓ Ç4é=t[Áç žÖ;t5ܶ0º—¿sé0‘$šs,vŒHëG2@ÙæÿM@ÙÍ­Pêí?zŠ+f¥­ÿ¿ïD™ÆEAÜt_A!¢6qŽ;'ó¹Ÿí@âÌ.hˆñ¿Ù2@zçÿM@•ôÿÿ, dlå!Þ= aLn2kCÔ2}7'c)?$|% œGßЬdË^± èBwžÿÿ¥v AÈ£ itÔÝ$Ó Èÿä=tÌ=‘ç –;tèk(¶0AŠ¿sÀŸZ0’«s€€G‹H<ëG2ÀçÿÿM@Ù ¯dPêí?ÀÃj¥­ÿ¿ DG—DAúò]A!¢1qŽ;'óÚâ:JuC@`띞-‡ñ¿Ù2À>èÿÿM@ñôÿÿ, dl7!Þ= aLn2kCÔ2}7(c)?$|$ œGßЬdË^± èBÿ¹›ÿÿ§v AÇgŸitHž¿Ò ÇVß=tÔ)aç ŸÕ›;tЬtµ0U{¿sŒ[š0‘ºsŽóŠHß ëG3»ùÿï?Ùû|ö Pêí?txm¥­ÿ¿DemCA#y\A!¢"qŽ;'ó¯vHh @ MB‡ñ¿Ù3Ðãùÿï?Ÿôÿÿ, dlp!Þ= aLn2kCÔ2}7(c)?$|$ œGßЬdË^± èBÿñ˜ÿÿ©v AÇ+žitü—ZÒ ȲÙ=t gpsd-3.15/test/daemon/superstar2.log.chk0000664000175000017500000002452312467342657016376 0ustar esresr$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","xdop":2.10,"ydop":2.37,"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}]} $GPZDA,055055.00,04,07,2009,00,00*6E $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,29,11,1,3,28,,,,,,,,5.2,3.1,3.3*34 $GPGBS,055054,31.47,M,35.54,M,75.90,M*02 {"class":"TPV","mode":3,"time":"2009-07-04T05:50:54.000Z","ept":0.005,"lat":53.563112132,"lon":-113.439571599,"alt":631.801,"epx":31.470,"epy":35.543,"epv":75.900,"track":0.0000,"speed":0.000,"climb":0.000} $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","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}]} $GPZDA,055056.00,04,07,2009,00,00*6D $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,1,11,29,3,28,,,,,,,,5.2,3.1,3.3*34 $GPGBS,055055,31.47,M,35.54,M,75.90,M*03 {"class":"TPV","mode":3,"time":"2009-07-04T05:50:55.000Z","ept":0.005,"lat":53.563111922,"lon":-113.439572138,"alt":631.867,"epx":31.470,"epy":35.543,"epv":75.900,"track":0.0000,"speed":0.000,"climb":0.000,"eps":71.09,"epc":151.80} $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","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}]} $GPZDA,055057.00,04,07,2009,00,00*6C $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,1,11,29,3,28,,,,,,,,5.2,3.1,3.3*34 $GPGBS,055056,31.47,M,35.54,M,75.90,M*00 {"class":"TPV","mode":3,"time":"2009-07-04T05:50:56.000Z","ept":0.005,"lat":53.563111644,"lon":-113.439572583,"alt":631.943,"epx":31.470,"epy":35.543,"epv":75.900,"track":0.0000,"speed":0.000,"climb":0.000,"eps":71.09,"epc":151.80} $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","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}]} $GPZDA,055058.00,04,07,2009,00,00*63 $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,1,11,29,3,28,,,,,,,,5.2,3.1,3.3*34 $GPGBS,055057,31.47,M,35.54,M,75.90,M*01 {"class":"TPV","mode":3,"time":"2009-07-04T05:50:57.000Z","ept":0.005,"lat":53.563111100,"lon":-113.439573094,"alt":632.002,"epx":31.470,"epy":35.543,"epv":75.900,"track":0.0000,"speed":0.000,"climb":0.000,"eps":71.09,"epc":151.80} $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","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}]} $GPZDA,055059.00,04,07,2009,00,00*62 $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,1,11,29,3,28,,,,,,,,5.2,3.1,3.3*34 $GPGBS,055058,31.47,M,35.54,M,75.90,M*0E {"class":"TPV","mode":3,"time":"2009-07-04T05:50:58.000Z","ept":0.005,"lat":53.563110659,"lon":-113.439573808,"alt":632.093,"epx":31.470,"epy":35.543,"epv":75.900,"track":0.0000,"speed":0.000,"climb":0.000,"eps":71.09,"epc":151.80} $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","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}]} $GPZDA,055060.00,04,07,2009,00,00*68 $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,1,11,29,3,28,,,,,,,,5.2,3.1,3.3*34 $GPGBS,055059,31.47,M,35.54,M,75.90,M*0F {"class":"TPV","mode":3,"time":"2009-07-04T05:50:59.000Z","ept":0.005,"lat":53.563110309,"lon":-113.439574638,"alt":632.204,"epx":31.470,"epy":35.543,"epv":75.900,"track":0.0000,"speed":0.000,"climb":0.000,"eps":71.09,"epc":151.80} $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","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}]} $GPZDA,055101.00,04,07,2009,00,00*6E $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,1,11,29,3,28,,,,,,,,5.2,3.1,3.3*34 $GPGBS,055100,31.47,M,35.54,M,75.90,M*02 {"class":"TPV","mode":3,"time":"2009-07-04T05:51:00.000Z","ept":0.005,"lat":53.563109836,"lon":-113.439575270,"alt":632.266,"epx":31.470,"epy":35.543,"epv":75.900,"track":0.0000,"speed":0.000,"climb":0.000,"eps":71.09,"epc":151.80} $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","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}]} gpsd-3.15/test/daemon/tcp-test.log0000664000175000017500000000156712470063376015256 0ustar esresr# Name: Generic NMEA # Submitter: Eric S. Raymond # Date: 2013-11-03 # Transport: TCP # Notes: The most significant thing about this test load is not the content, # but the magic cookie that tells it to feed the daemon over TCP # rather than a pseudo-tty. We include some leading garbage as a # robustness check for the packetizer. There is a UDP test load # that feeds the same content. ,1.7,-30.40,M,-13.9,M,,*7D $GPGGA,193221.00,2037.72792,N,08704.08478,W,1,04,1.7,-30.40,M,-13.9,M,,*7D $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 $GPRMC,193221.00,A,2037.7279,N,08704.0848,W,00.1,201.8,231207,01,W,A*2D $GPZDA,193223.00,23,12,2007,00,00*69 gpsd-3.15/test/daemon/tcp-test.log.chk0000664000175000017500000000270112467340617016013 0ustar esresr$GPGGA,193221.00,2037.72792,N,08704.08478,W,1,04,1.7,-30.40,M,-13.9,M,,*7D {"class":"TPV","mode":3,"lat":20.628798667,"lon":-87.068079667,"alt":-30.400} $GPGSA,A,3,10,28,09,13,,,,,,,,,03.4,01.7,03.0*00 {"class":"TPV","mode":3,"lat":20.628798667,"lon":-87.068079667,"alt":-30.400,"epv":69.000} $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","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":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:21.000Z","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} $GPZDA,193223.00,23,12,2007,00,00*69 gpsd-3.15/test/daemon/tcp-torture.log0000664000175000017500000000157712461156335016002 0ustar esresr# Name: Generic NMEA # Submitter: Eric S. Raymond # Date: 2013-11-03 # Transport: TCP # Notes: A variant of the TCP testload intended to capture the error case # reported in Savannah tracker bug #36409: "GPSD fails to start # get GPS data from tcp://location:port". The delay cookies are # inserted to produce write boundaries that will be visible to the # packetizer. # Delay-Cookie: | 0.01 ,1.7,-30.40,M,-13.9,M,,*7D $GPGGA,|19322|1.00,|2037.|72792,N,08704.08478,W,1,04,1.7,-30.40,M,-13.9,M,,*7D $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 $GPRMC,193221.00,A,2037.7279,N,08704.0848,W,00.1,201.8,231207,01,W,A*2D $GPZDA,193223.00,23,12,2007,00,00*69 gpsd-3.15/test/daemon/tcp-torture.log.chk0000664000175000017500000000270112467340617016540 0ustar esresr$GPGGA,193221.00,2037.72792,N,08704.08478,W,1,04,1.7,-30.40,M,-13.9,M,,*7D {"class":"TPV","mode":3,"lat":20.628798667,"lon":-87.068079667,"alt":-30.400} $GPGSA,A,3,10,28,09,13,,,,,,,,,03.4,01.7,03.0*00 {"class":"TPV","mode":3,"lat":20.628798667,"lon":-87.068079667,"alt":-30.400,"epv":69.000} $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","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":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:21.000Z","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} $GPZDA,193223.00,23,12,2007,00,00*69 gpsd-3.15/test/daemon/tn200-all.log0000664000175000017500000000756712467341115015126 0ustar esresr# Name: Rayming Tripnav TN-200 # Chipset: SiRF-II # Submitter: "Chris Kuethe" # Date: 2005-06-08 # Location: Edmonton, Alberta, CA 53N113W # Comments - Nearby airports include YEG and YXD. This capture was done # at 57600 baud with all SiRF-supported NMEA messages set to 1Hz. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGGA,000452.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*75 $GPGLL,36000.0000,N,72000.0000,E,000452.981,V*10 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000452.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*32 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000453.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*74 $GPGLL,36000.0000,N,72000.0000,E,000453.981,V*11 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000453.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*33 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000454.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73 $GPGLL,36000.0000,N,72000.0000,E,000454.981,V*16 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000454.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*34 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000455.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*72 $GPGLL,36000.0000,N,72000.0000,E,000455.981,V*17 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000455.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*35 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000456.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*71 $GPGLL,36000.0000,N,72000.0000,E,000456.981,V*14 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000456.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*36 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000457.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*70 $GPGLL,36000.0000,N,72000.0000,E,000457.981,V*15 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,01,90,000,00,13,77,000,00,08,71,000,,22,65,000,00*7F $GPGSV,3,2,12,09,65,000,00,26,40,000,,24,33,000,00,04,28,000,00*79 $GPGSV,3,3,12,27,25,000,00,16,23,000,00,15,21,000,00,11,13,000,00*7B $GPRMC,000457.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*37 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000458.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7F $GPGLL,36000.0000,N,72000.0000,E,000458.981,V*1A $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,01,90,000,48,13,77,000,00,08,71,000,,22,65,000,00*73 $GPGSV,3,2,12,09,65,000,00,26,40,000,,24,33,000,00,04,28,000,00*79 $GPGSV,3,3,12,27,25,000,00,16,23,000,00,15,21,000,00,11,13,000,31*79 $GPRMC,000458.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*38 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000459.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7E $GPGLL,36000.0000,N,72000.0000,E,000459.981,V*1B $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,01,90,000,47,13,77,000,00,08,71,000,,22,65,000,00*7C $GPGSV,3,2,12,09,65,000,00,26,40,000,,24,33,000,00,04,28,000,00*79 $GPGSV,3,3,12,27,25,000,00,16,23,000,00,15,21,000,00,11,13,000,31*79 $GPRMC,000459.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*39 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000500.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73 $GPGLL,36000.0000,N,72000.0000,E,000500.981,V*16 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,01,90,000,48,13,77,000,00,08,71,000,,22,65,000,00*73 $GPGSV,3,2,12,09,65,000,00,26,40,000,,24,33,000,00,04,28,000,00*79 $GPGSV,3,3,12,27,25,000,00,16,23,000,00,15,21,000,00,11,13,000,31*79 $GPRMC,000500.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*34 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A gpsd-3.15/test/daemon/tn200-all.log.chk0000664000175000017500000000673312467341115015664 0ustar esresr$GPGGA,000452.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*75 $GPGLL,36000.0000,N,72000.0000,E,000452.981,V*10 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000452.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*32 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000453.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*74 $GPGLL,36000.0000,N,72000.0000,E,000453.981,V*11 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000453.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*33 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000454.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73 $GPGLL,36000.0000,N,72000.0000,E,000454.981,V*16 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000454.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*34 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000455.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*72 $GPGLL,36000.0000,N,72000.0000,E,000455.981,V*17 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000455.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*35 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000456.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*71 $GPGLL,36000.0000,N,72000.0000,E,000456.981,V*14 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000456.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*36 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000457.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*70 $GPGLL,36000.0000,N,72000.0000,E,000457.981,V*15 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,01,90,000,00,13,77,000,00,08,71,000,,22,65,000,00*7F $GPGSV,3,2,12,09,65,000,00,26,40,000,,24,33,000,00,04,28,000,00*79 $GPGSV,3,3,12,27,25,000,00,16,23,000,00,15,21,000,00,11,13,000,00*7B $GPRMC,000457.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*37 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000458.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7F $GPGLL,36000.0000,N,72000.0000,E,000458.981,V*1A $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,01,90,000,48,13,77,000,00,08,71,000,,22,65,000,00*73 $GPGSV,3,2,12,09,65,000,00,26,40,000,,24,33,000,00,04,28,000,00*79 $GPGSV,3,3,12,27,25,000,00,16,23,000,00,15,21,000,00,11,13,000,31*79 $GPRMC,000458.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*38 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000459.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7E $GPGLL,36000.0000,N,72000.0000,E,000459.981,V*1B $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,01,90,000,47,13,77,000,00,08,71,000,,22,65,000,00*7C $GPGSV,3,2,12,09,65,000,00,26,40,000,,24,33,000,00,04,28,000,00*79 $GPGSV,3,3,12,27,25,000,00,16,23,000,00,15,21,000,00,11,13,000,31*79 $GPRMC,000459.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*39 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A $GPGGA,000500.981,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73 $GPGLL,36000.0000,N,72000.0000,E,000500.981,V*16 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,01,90,000,48,13,77,000,00,08,71,000,,22,65,000,00*73 $GPGSV,3,2,12,09,65,000,00,26,40,000,,24,33,000,00,04,28,000,00*79 $GPGSV,3,3,12,27,25,000,00,16,23,000,00,15,21,000,00,11,13,000,31*79 $GPRMC,000500.981,V,36000.0000,N,72000.0000,E,0.000000,,190120,,*34 $GPVTG,,T,,M,0.000000,N,0.000000,K*4E $GPMSS,0,0,0.000000,200,*5A gpsd-3.15/test/daemon/tn200.log0000664000175000017500000001042312467342657014355 0ustar esresr# Name: Rayming Tripnav TN-200 # Chipset: SiRF-II # Submitter: "Chris Kuethe" # Date: 2005-06-08 # Location: Edmonton, Alberta, CA 53N113W # Comments - Nearby airports include YEG and YXD. This capture was done # at 4800 baud with the SiRF default NMEA message set. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPGGA,000416.984,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*70 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000416.984,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3B $GPGGA,000417.984,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*71 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000417.984,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3A $GPGGA,000418.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*79 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000418.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*32 $GPGGA,000419.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*78 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000419.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*33 $GPGGA,000420.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*72 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000420.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*39 $GPGGA,000421.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000421.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*38 $GPGGA,000422.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*70 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000422.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3B $GPGGA,000423.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*71 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000423.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3A $GPGGA,000424.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*76 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000424.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3D $GPGGA,000425.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*77 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000425.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3C $GPGGA,000426.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*74 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,25,89,000,36,27,89,000,00,08,79,000,,26,79,000,00*73 $GPGSV,3,2,12,01,62,000,46,05,57,000,00,22,42,000,00,13,32,000,00*7E $GPGSV,3,3,12,09,20,000,00,24,20,000,00,04,17,000,00,15,12,000,00*70 $GPRMC,000426.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3F $GPGGA,000427.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*75 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000427.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3E $GPGGA,000428.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7A $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000428.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*31 $GPGGA,000429.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7B $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000429.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*30 $GPGGA,000430.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,000430.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*38 $GPGGA,000431.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*72 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPGSV,3,1,12,25,89,000,36,27,89,000,00,08,79,000,,26,79,000,00*73 $GPGSV,3,2,12,01,62,000,45,05,57,000,00,22,42,000,00,13,32,000,00*7D $GPGSV,3,3,12,09,20,000,00,24,20,000,00,04,17,000,00,15,12,000,00*70 $GPRMC,000431.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*39 $GPGGA,204137.079,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7B $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,204137.079,V,36000.0000,N,72000.0000,E,0.000000,,290120,,*3F $GPGGA,204138.079,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*74 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,204138.079,V,36000.0000,N,72000.0000,E,0.000000,,290120,,*30 $GPGGA,204139.079,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*75 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 $GPRMC,204139.079,V,36000.0000,N,72000.0000,E,0.000000,,290120,,*31 gpsd-3.15/test/daemon/tn200.log.chk0000664000175000017500000001052612467342657015125 0ustar esresr$GPGGA,000416.984,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*70 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000416.984,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3B $GPGGA,000417.984,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*71 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000417.984,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3A $GPGGA,000418.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*79 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000418.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*32 $GPGGA,000419.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*78 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000419.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*33 $GPGGA,000420.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*72 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000420.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*39 $GPGGA,000421.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000421.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*38 $GPGGA,000422.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*70 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000422.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3B $GPGGA,000423.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*71 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000423.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3A $GPGGA,000424.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*76 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000424.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3D $GPGGA,000425.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*77 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000425.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3C $GPGGA,000426.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*74 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPGSV,3,1,12,25,89,000,36,27,89,000,00,08,79,000,,26,79,000,00*73 $GPGSV,3,2,12,01,62,000,46,05,57,000,00,22,42,000,00,13,32,000,00*7E $GPGSV,3,3,12,09,20,000,00,24,20,000,00,04,17,000,00,15,12,000,00*70 $GPRMC,000426.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3F $GPGGA,000427.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*75 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000427.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*3E $GPGGA,000428.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7A $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000428.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*31 $GPGGA,000429.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7B $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000429.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*30 $GPGGA,000430.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*73 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,000430.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*38 $GPGGA,000431.983,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*72 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPGSV,3,1,12,25,89,000,36,27,89,000,00,08,79,000,,26,79,000,00*73 $GPGSV,3,2,12,01,62,000,45,05,57,000,00,22,42,000,00,13,32,000,00*7D $GPGSV,3,3,12,09,20,000,00,24,20,000,00,04,17,000,00,15,12,000,00*70 $GPRMC,000431.983,V,36000.0000,N,72000.0000,E,0.000000,,260120,,*39 $GPGGA,204137.079,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*7B $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,204137.079,V,36000.0000,N,72000.0000,E,0.000000,,290120,,*3F $GPGGA,204138.079,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*74 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,204138.079,V,36000.0000,N,72000.0000,E,0.000000,,290120,,*30 $GPGGA,204139.079,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,0.0,M,0.0,0000*75 $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*05 {"class":"TPV","mode":1} $GPRMC,204139.079,V,36000.0000,N,72000.0000,E,0.000000,,290120,,*31 gpsd-3.15/test/daemon/tn204.log0000664000175000017500000000430112461156335014345 0ustar esresr# Name: Rayming TripNav 204 # Chipset: SiRF-II? # Submitter: "Pascal F. Martin" # Date: 2005-03-18 # # The NMEA looks like Garmin. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPRMC,230148,A,3348.605,N,11821.126,W,000.0,209.4,261002,013.8,E*6B $GPRMB,A,,,,,,,,,,,,V*71 $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 $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 $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 $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 $PGRME,17.4,M,40.3,M,43.9,M*15 $GPGLL,3348.607,N,11821.124,W,230151,A*3D $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 $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 $GPGSV,2,1,08,07,43,197,45,08,68,062,42,11,18,089,00,26,24,314,41*71 $GPGSV,2,2,08,27,48,103,46,28,66,323,42,29,33,306,44,31,10,040,00*7F $PGRME,17.4,M,40.3,M,43.9,M*15 $GPGLL,3348.607,N,11821.124,W,230153,A*3F $PGRMZ,161,f,3*1D $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,230154,A,3348.607,N,11821.124,W,000.0,209.4,261002,013.8,E*66 $GPRMB,A,,,,,,,,,,,,V*71 $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 $PGRME,19.2,M,150.0,M,151.2,M*17 $GPGLL,3348.608,N,11821.124,W,230155,A*36 $PGRMZ,161,f,3*1D $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 gpsd-3.15/test/daemon/tn204.log.chk0000664000175000017500000001216512467340617015124 0ustar esresr$GPRMC,230148,A,3348.605,N,11821.126,W,000.0,209.4,261002,013.8,E*6B {"class":"TPV","mode":2,"time":"2002-10-26T23:01:48.000Z","ept":0.005,"lat":33.810083333,"lon":-118.352100000,"track":209.4000,"speed":0.000} $GPRMB,A,,,,,,,,,,,,V*71 $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","xdop":1.21,"ydop":1.17,"vdop":3.80,"tdop":2.91,"hdop":1.70,"gdop":5.05,"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 $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","mode":2,"time":"2002-10-26T23:01:50.000Z","ept":0.005,"lat":33.810100000,"lon":-118.352083333,"epx":18.182,"epy":17.555,"track":209.4000,"speed":0.000,"eps":43.73} $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","xdop":1.21,"ydop":1.17,"vdop":3.80,"tdop":2.91,"hdop":1.70,"gdop":5.05,"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","mode":3,"time":"2002-10-26T23:01:51.000Z","ept":0.005,"lat":33.810116667,"lon":-118.352066667,"alt":49.200,"epx":25.546,"epy":25.546,"epv":83.674,"speed":2.408,"climb":0.000,"eps":36.36} $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","mode":2,"time":"2002-10-26T23:01:52.000Z","ept":0.005,"lat":33.810116667,"lon":-118.352066667,"epx":18.182,"epy":17.555,"track":209.4000,"speed":0.000,"eps":43.73} $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 $GPGSV,2,1,08,07,43,197,45,08,68,062,42,11,18,089,00,26,24,314,41*71 $GPGSV,2,2,08,27,48,103,46,28,66,323,42,29,33,306,44,31,10,040,00*7F {"class":"SKY","xdop":1.21,"ydop":1.17,"vdop":3.80,"tdop":2.91,"hdop":1.70,"gdop":5.05,"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","mode":3,"time":"2002-10-26T23:01:53.000Z","ept":0.005,"lat":33.810116667,"lon":-118.352066667,"alt":49.100,"epx":25.546,"epy":25.546,"epv":83.674,"speed":0.000,"climb":0.000,"eps":36.36} $PGRMZ,161,f,3*1D $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 $GPRMC,230154,A,3348.607,N,11821.124,W,000.0,209.4,261002,013.8,E*66 {"class":"TPV","mode":2,"time":"2002-10-26T23:01:54.000Z","ept":0.005,"lat":33.810116667,"lon":-118.352066667,"epx":18.182,"epy":17.555,"track":209.4000,"speed":0.000,"eps":43.73} $GPRMB,A,,,,,,,,,,,,V*71 $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","xdop":1.21,"ydop":1.17,"vdop":1.00,"tdop":2.91,"hdop":1.90,"gdop":5.05,"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","mode":3,"time":"2002-10-26T23:01:55.000Z","ept":0.005,"lat":33.810133333,"lon":-118.352066667,"alt":49.000,"epx":28.188,"epy":28.188,"epv":311.441,"speed":1.849,"climb":0.000,"eps":36.36} $PGRMZ,161,f,3*1D $PGRMM,NAD83*29 $GPBOD,,T,,M,,*47 $GPRTE,1,1,c,0*07 gpsd-3.15/test/daemon/tnt-revolution.log0000664000175000017500000000636212461156335016520 0ustar esresr# Name: TNT Revolution # Chipset: TNT # Submitter: Eric S. Raymond # Date: 2010-04-10 # 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 gpsd-3.15/test/daemon/tnt-revolution.log.chk0000664000175000017500000002326612467340617017272 0ustar esresr$PTNTHTM,14223,N,169,N,-43,N,13641,2454*15 {"class":"ATT","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} $PTNTHTM,14091,N,171,N,-43,N,13599,2454*11 {"class":"ATT","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} $PTNTHTM,14287,N,172,N,-39,N,13652,2452*18 {"class":"ATT","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} $PTNTHTM,14150,N,171,N,-40,N,13605,2452*1E {"class":"ATT","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} $PTNTHTM,14199,N,171,N,-40,N,13614,2452*1B {"class":"ATT","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} $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 {"class":"ATT","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} $PTNTHTM,14359,N,172,N,-33,N,13647,2450*16 {"class":"ATT","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} $PTNTHTM,14243,N,172,N,-33,N,13608,2450*17 {"class":"ATT","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} $PTNTHTM,14340,N,176,N,-37,N,13616,2451*1B {"class":"ATT","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} $PTNTHTM,14230,N,175,N,-37,N,13597,2451*14 {"class":"ATT","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} $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 {"class":"ATT","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} $PTNTHTM,14156,N,179,N,-42,N,13600,2452*17 {"class":"ATT","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} $PTNTHTM,14157,N,175,N,-42,N,13585,2454*12 {"class":"ATT","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} $PTNTHTM,14159,N,175,N,-42,N,13598,2454*10 {"class":"ATT","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} $PTNTHTM,14159,N,170,N,-40,N,13569,2455*18 {"class":"ATT","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} $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 {"class":"ATT","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} $PTNTHTM,14094,N,167,N,-40,N,13571,2455*17 {"class":"ATT","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} $PTNTHTM,14185,N,167,N,-43,N,13626,2454*15 {"class":"ATT","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} $PTNTHTM,14043,N,169,N,-42,N,13592,2454*1D {"class":"ATT","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} $PTNTHTM,14236,N,169,N,-45,N,13644,2453*15 {"class":"ATT","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} $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 {"class":"ATT","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} $PTNTHTM,14299,N,171,N,-42,N,13652,2450*1A {"class":"ATT","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} $PTNTHTM,14149,N,170,N,-43,N,13605,2450*16 {"class":"ATT","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} $PTNTHTM,14243,N,170,N,-39,N,13622,2450*17 {"class":"ATT","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} $PTNTHTM,14155,N,172,N,-35,N,13611,2449*15 {"class":"ATT","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} $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 {"class":"ATT","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} $PTNTHTM,14239,N,171,N,-33,N,13612,2448*1B {"class":"ATT","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} $PTNTHTM,14182,N,174,N,-34,N,13581,2449*12 {"class":"ATT","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} $PTNTHTM,14256,N,174,N,-37,N,13602,2449*13 {"class":"ATT","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} $PTNTHTM,14139,N,178,N,-38,N,13568,2450*1D {"class":"ATT","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} $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 {"class":"ATT","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} $PTNTHTM,14186,N,174,N,-42,N,13590,2451*1E {"class":"ATT","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} $PTNTHTM,14174,N,174,N,-40,N,13602,2451*19 {"class":"ATT","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} $PTNTHTM,14094,N,172,N,-40,N,13570,2452*15 {"class":"ATT","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} $PTNTHTM,14232,N,169,N,-42,N,13609,2452*1E {"class":"ATT","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} $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 {"class":"ATT","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} $PTNTHTM,14225,N,165,N,-43,N,13632,2452*1D {"class":"ATT","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} $PTNTHTM,14042,N,169,N,-43,N,13588,2451*13 {"class":"ATT","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} $PTNTHTM,14222,N,170,N,-45,N,13646,2451*18 {"class":"ATT","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} $PTNTHTM,14174,N,170,N,-45,N,13640,2450*1F {"class":"ATT","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} $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 {"class":"ATT","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} $PTNTHTM,14132,N,171,N,-42,N,13604,2448*12 {"class":"ATT","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} $PTNTHTM,14265,N,171,N,-38,N,13629,2448*11 {"class":"ATT","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} $PTNTHTM,14145,N,171,N,-38,N,13612,2447*17 {"class":"ATT","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} $PTNTHTM,14198,N,172,N,-38,N,13614,2447*12 {"class":"ATT","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} $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 {"class":"ATT","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} $PTNTHTM,14187,N,174,N,-35,N,13589,2447*10 {"class":"ATT","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} $PTNTHTM,14257,N,174,N,-35,N,13603,2447*1F {"class":"ATT","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} $PTNTHTM,14161,N,178,N,-37,N,13575,2448*1A {"class":"ATT","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} $PTNTHTM,14302,N,177,N,-40,N,13608,2448*1B {"class":"ATT","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} $HCXDR,A,176,D,PITCH,A,-40,D,ROLL,G,388,,MAGX,G,2468,,MAGY,G,-9006,,MAGZ*49 gpsd-3.15/test/daemon/tomtom-mkII.log0000664000175000017500000000660412461156335015654 0ustar esresr# Name: TomTom Mark II # Chipset: SiRF-3 # Submitter: Jose Baars peut@peut.org # Date: 2010-06-20 # Location: Veldhoven, NL $GPGGA,175736,5125.8714,N,00524.2350,E,1,04,3.40,60.28,M,46.999,M,,*79 $GPRMC,175736,A,5125.8714,N,00524.2350,E,3.1865,276.241,200610,,*2A $GPGSA,A,3,14,30,29,31,,,,,,,,,7.6,3.4,6.8*35 $PGRME,0.00,M,0.00,M,29.40,M*21 $GPGGA,175737,5125.8706,N,00524.2332,E,1,04,3.40,61.40,M,46.999,M,,*70 $GPRMC,175737,A,5125.8706,N,00524.2332,E,2.5761,257.043,200610,,*21 $GPGSA,A,3,14,30,29,31,,,,,,,,,7.6,3.4,6.8*35 $PGRME,0.00,M,0.00,M,29.40,M*21 $GPGGA,175738,5125.8703,N,00524.2323,E,1,03,2.20,60.56,M,46.999,M,,*7C $GPRMC,175738,A,5125.8703,N,00524.2323,E,1.5881,253.161,200610,,*2C $GPGSA,A,2,14,30,31,,,,,,,,,,7.6,2.2,6.8*38 $PGRME,0.00,M,0.00,M,29.40,M*21 $GPGGA,175739,5125.8701,N,00524.2297,E,1,03,2.20,59.61,M,46.999,M,,*7F $GPRMC,175739,A,5125.8701,N,00524.2297,E,2.5365,244.610,200610,,*24 $GPGSA,A,2,14,30,31,,,,,,,,,,7.6,2.2,6.8*38 $PGRME,0.00,M,0.00,M,29.40,M*21 $GPRMC,175740,V,5125.8697,N,00524.2288,E,2.5365,244.610,200610,,*3D $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175742,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3D $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175743,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3C $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175744,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3B $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175745,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3A $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175746,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*39 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175747,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*38 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175748,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*37 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175749,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*36 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPGSV,2,1,05,14,20,232,23,30,75,085,00,31,48,297,34,12,40,093,00*7E $GPGSV,2,2,05,29,66,205,17*46 $GPRMC,175750,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3E $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175751,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3F $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175752,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3C $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175753,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3D $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175754,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3A $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175755,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3B $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175756,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*38 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175757,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*39 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175758,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*36 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175759,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*37 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175800,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*34 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175801,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*35 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175802,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*36 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175803,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*37 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 r$GPRMC,175804,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*30 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 gpsd-3.15/test/daemon/tomtom-mkII.log.chk0000664000175000017500000001103612467340617016417 0ustar esresr$GPGGA,175736,5125.8714,N,00524.2350,E,1,04,3.40,60.28,M,46.999,M,,*79 {"class":"TPV","mode":3,"lat":51.431190000,"lon":5.403916667,"alt":60.280} $GPRMC,175736,A,5125.8714,N,00524.2350,E,3.1865,276.241,200610,,*2A {"class":"TPV","mode":3,"time":"2010-06-20T17:57:36.000Z","ept":0.005,"lat":51.431190000,"lon":5.403916667,"alt":60.280,"track":276.2410,"speed":1.639} $GPGSA,A,3,14,30,29,31,,,,,,,,,7.6,3.4,6.8*35 {"class":"TPV","mode":3,"time":"2010-06-20T17:57:36.000Z","ept":0.005,"lat":51.431190000,"lon":5.403916667,"alt":60.280,"epv":156.400,"track":276.2410,"speed":1.639,"climb":0.000} $PGRME,0.00,M,0.00,M,29.40,M*21 $GPGGA,175737,5125.8706,N,00524.2332,E,1,04,3.40,61.40,M,46.999,M,,*70 $GPRMC,175737,A,5125.8706,N,00524.2332,E,2.5761,257.043,200610,,*21 {"class":"TPV","mode":3,"time":"2010-06-20T17:57:37.000Z","ept":0.005,"lat":51.431176667,"lon":5.403886667,"alt":61.400,"epv":156.400,"track":257.0430,"speed":1.325,"climb":1.120,"epc":156.40} $GPGSA,A,3,14,30,29,31,,,,,,,,,7.6,3.4,6.8*35 $PGRME,0.00,M,0.00,M,29.40,M*21 $GPGGA,175738,5125.8703,N,00524.2323,E,1,03,2.20,60.56,M,46.999,M,,*7C $GPRMC,175738,A,5125.8703,N,00524.2323,E,1.5881,253.161,200610,,*2C {"class":"TPV","mode":3,"time":"2010-06-20T17:57:38.000Z","ept":0.005,"lat":51.431171667,"lon":5.403871667,"alt":60.560,"epv":156.400,"track":253.1610,"speed":0.817,"climb":-0.840,"epc":156.40} $GPGSA,A,2,14,30,31,,,,,,,,,,7.6,2.2,6.8*38 $PGRME,0.00,M,0.00,M,29.40,M*21 $GPGGA,175739,5125.8701,N,00524.2297,E,1,03,2.20,59.61,M,46.999,M,,*7F $GPRMC,175739,A,5125.8701,N,00524.2297,E,2.5365,244.610,200610,,*24 {"class":"TPV","mode":3,"time":"2010-06-20T17:57:39.000Z","ept":0.005,"lat":51.431168333,"lon":5.403828333,"alt":59.610,"epv":156.400,"track":244.6100,"speed":1.305,"climb":-0.950,"epc":156.40} $GPGSA,A,2,14,30,31,,,,,,,,,,7.6,2.2,6.8*38 $PGRME,0.00,M,0.00,M,29.40,M*21 $GPRMC,175740,V,5125.8697,N,00524.2288,E,2.5365,244.610,200610,,*3D $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175742,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3D $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175743,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3C $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175744,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3B $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175745,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3A $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175746,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*39 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175747,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*38 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175748,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*37 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175749,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*36 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPGSV,2,1,05,14,20,232,23,30,75,085,00,31,48,297,34,12,40,093,00*7E $GPGSV,2,2,05,29,66,205,17*46 {"class":"SKY","vdop":6.80,"hdop":2.20,"pdop":7.60,"satellites":[{"PRN":14,"el":20,"az":232,"ss":23,"used":false},{"PRN":30,"el":75,"az":85,"ss":0,"used":false},{"PRN":31,"el":48,"az":297,"ss":34,"used":false},{"PRN":12,"el":40,"az":93,"ss":0,"used":false},{"PRN":29,"el":66,"az":205,"ss":17,"used":false}]} $GPRMC,175750,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3E $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175751,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3F $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175752,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3C $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175753,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3D $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175754,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3A $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175755,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*3B $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175756,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*38 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175757,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*39 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175758,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*36 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175759,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*37 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175800,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*34 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175801,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*35 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175802,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*36 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175803,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*37 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 $GPRMC,175804,V,5125.8697,N,00524.2288,E,0.0000,0.000,200610,,*30 $GPGSA,A,1,,,,,,,,,,,,,,,,*32 gpsd-3.15/test/daemon/tr737A+.log0000664000175000017500000000575712467342657014572 0ustar esresr# Name: 737A+ # Chipset: MTK MT3329 # Description: Transystem 737A+ Bluetooth mouse # Submitter: Gary E. Miller # Date: 2011-11-10 # Location: Bend, Oregon 44N, 121W $GPRMC,071732.929,V,8960.0000,N,00000.0000,E,0.00,0.00,111111,,,N*73 $GPGGA,071733.929,8960.0000,N,00000.0000,E,0,0,,137.0,M,13.0,M,,*40 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,05,23,,,36,13,,,34,32,,,43,31,,,31*78 $GPGSV,2,2,05,20,,,41*7B $GPRMC,071733.929,V,8960.0000,N,00000.0000,E,0.00,0.00,111111,,,N*72 $GPGGA,071734.929,4404.1178,N,12118.8608,W,0,4,,1127.8,M,-19.6,M,,*49 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $GPGSV,2,1,05,23,,,37,13,,,34,32,,,43,31,,,31*79 $GPGSV,2,2,05,20,,,41*7B $GPRMC,071734.929,V,4404.1178,N,12118.8608,W,0.10,0.00,111111,,,N*67 $GPGGA,071736.000,4404.1316,N,12118.8445,W,1,4,5.21,1134.4,M,-19.6,M,,*5F $GPGSA,A,3,23,13,32,20,,,,,,,,,5.30,5.21,0.98*03 $GPGSV,2,1,06,20,73,204,41,23,56,298,37,32,54,148,43,48,37,196,*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 $GPRMC,071736.000,A,4404.1316,N,12118.8445,W,0.20,0.00,111111,,,A*7D $GPGGA,071737.000,4404.1258,N,12118.8537,W,1,4,5.20,1131.0,M,-19.6,M,,*51 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,37,32,54,148,43,48,37,196,44*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 $GPRMC,071737.000,A,4404.1258,N,12118.8537,W,0.12,0.00,111111,,,A*72 $GPGGA,071738.000,4404.1279,N,12118.8515,W,1,4,5.20,1137.3,M,-19.6,M,,*58 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,37,32,54,148,43,48,37,196,45*71 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 $GPRMC,071738.000,A,4404.1279,N,12118.8515,W,0.05,0.00,111111,,,A*78 $GPGGA,071739.000,4404.1284,N,12118.8506,W,1,4,5.20,1135.9,M,-19.6,M,,*51 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,37,32,54,148,43,48,37,196,44*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 $GPRMC,071739.000,A,4404.1284,N,12118.8506,W,0.05,0.00,111111,,,A*79 $GPGGA,071740.000,4404.1303,N,12118.8486,W,1,4,5.20,1134.7,M,-19.6,M,,*57 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,36,32,54,148,43,48,37,196,45*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 $GPRMC,071740.000,A,4404.1303,N,12118.8486,W,0.11,0.00,111111,,,A*75 $GPGGA,071741.000,4404.1316,N,12118.8473,W,1,4,5.20,1135.3,M,-19.6,M,,*5D $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,36,32,54,148,43,48,37,196,45*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 $GPRMC,071741.000,A,4404.1316,N,12118.8473,W,0.08,0.00,111111,,,A*72 $GPGGA,071742.000,4404.1314,N,12118.8476,W,1,4,5.20,1134.4,M,-19.6,M,,*5F $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,36,32,54,148,43,48,37,196,45*70 $GPGSV,2,2,06,13,30,282,34,31,,,30*40 $GPRMC,071742.000,A,4404.1314,N,12118.8476,W,0.03,0.00,111111,,,A*7D $GPGGA,071743.000,4404.1312,N,12118.8480,W,1,4,5.20,1134.6,M,-19.6,M,,*53 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,36,32,54,148,43,48,37,196,45*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 gpsd-3.15/test/daemon/tr737A+.log.chk0000664000175000017500000001737512467342657015335 0ustar esresr$GPRMC,071732.929,V,8960.0000,N,00000.0000,E,0.00,0.00,111111,,,N*73 $GPGGA,071733.929,8960.0000,N,00000.0000,E,0,0,,137.0,M,13.0,M,,*40 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,05,23,,,36,13,,,34,32,,,43,31,,,31*78 $GPGSV,2,2,05,20,,,41*7B $GPRMC,071733.929,V,8960.0000,N,00000.0000,E,0.00,0.00,111111,,,N*72 $GPGGA,071734.929,4404.1178,N,12118.8608,W,0,4,,1127.8,M,-19.6,M,,*49 $GPGSA,A,1,,,,,,,,,,,,,,,*1E {"class":"TPV","mode":1} $GPGSV,2,1,05,23,,,37,13,,,34,32,,,43,31,,,31*79 $GPGSV,2,2,05,20,,,41*7B $GPRMC,071734.929,V,4404.1178,N,12118.8608,W,0.10,0.00,111111,,,N*67 $GPGGA,071736.000,4404.1316,N,12118.8445,W,1,4,5.21,1134.4,M,-19.6,M,,*5F {"class":"TPV","mode":3,"lat":44.068860000,"lon":-121.314075000,"alt":1134.400} $GPGSA,A,3,23,13,32,20,,,,,,,,,5.30,5.21,0.98*03 {"class":"TPV","mode":3,"lat":44.068860000,"lon":-121.314075000,"alt":1134.400,"epv":22.540} $GPGSV,2,1,06,20,73,204,41,23,56,298,37,32,54,148,43,48,37,196,*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 {"class":"SKY","xdop":3.96,"ydop":4.59,"vdop":0.98,"tdop":4.62,"hdop":5.21,"gdop":8.87,"pdop":5.30,"satellites":[{"PRN":20,"el":73,"az":204,"ss":41,"used":true},{"PRN":23,"el":56,"az":298,"ss":37,"used":true},{"PRN":32,"el":54,"az":148,"ss":43,"used":true},{"PRN":135,"el":37,"az":196,"ss":0,"used":false},{"PRN":13,"el":30,"az":282,"ss":34,"used":true},{"PRN":31,"el":0,"az":0,"ss":31,"used":false}]} $GPRMC,071736.000,A,4404.1316,N,12118.8445,W,0.20,0.00,111111,,,A*7D {"class":"TPV","mode":3,"time":"2011-11-11T07:17:36.000Z","ept":0.005,"lat":44.068860000,"lon":-121.314075000,"alt":1134.400,"epx":59.364,"epy":68.891,"epv":22.540,"track":0.0000,"speed":0.103} $GPGGA,071737.000,4404.1258,N,12118.8537,W,1,4,5.20,1131.0,M,-19.6,M,,*51 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,37,32,54,148,43,48,37,196,44*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 {"class":"SKY","xdop":3.96,"ydop":4.59,"vdop":0.98,"tdop":4.62,"hdop":5.20,"gdop":8.87,"pdop":5.29,"satellites":[{"PRN":20,"el":73,"az":204,"ss":41,"used":true},{"PRN":23,"el":56,"az":298,"ss":37,"used":true},{"PRN":32,"el":54,"az":148,"ss":43,"used":true},{"PRN":135,"el":37,"az":196,"ss":44,"used":false},{"PRN":13,"el":30,"az":282,"ss":34,"used":true},{"PRN":31,"el":0,"az":0,"ss":31,"used":false}]} $GPRMC,071737.000,A,4404.1258,N,12118.8537,W,0.12,0.00,111111,,,A*72 {"class":"TPV","mode":3,"time":"2011-11-11T07:17:37.000Z","ept":0.005,"lat":44.068763333,"lon":-121.314228333,"alt":1131.000,"epx":59.364,"epy":68.891,"epv":22.540,"track":0.0000,"speed":0.062,"climb":-3.400,"eps":137.78,"epc":45.08} $GPGGA,071738.000,4404.1279,N,12118.8515,W,1,4,5.20,1137.3,M,-19.6,M,,*58 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,37,32,54,148,43,48,37,196,45*71 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 {"class":"SKY","xdop":3.96,"ydop":4.59,"vdop":0.98,"tdop":4.62,"hdop":5.20,"gdop":8.87,"pdop":5.29,"satellites":[{"PRN":20,"el":73,"az":204,"ss":41,"used":true},{"PRN":23,"el":56,"az":298,"ss":37,"used":true},{"PRN":32,"el":54,"az":148,"ss":43,"used":true},{"PRN":135,"el":37,"az":196,"ss":45,"used":false},{"PRN":13,"el":30,"az":282,"ss":34,"used":true},{"PRN":31,"el":0,"az":0,"ss":31,"used":false}]} $GPRMC,071738.000,A,4404.1279,N,12118.8515,W,0.05,0.00,111111,,,A*78 {"class":"TPV","mode":3,"time":"2011-11-11T07:17:38.000Z","ept":0.005,"lat":44.068798333,"lon":-121.314191667,"alt":1137.300,"epx":59.364,"epy":68.891,"epv":22.540,"track":0.0000,"speed":0.026,"climb":6.300,"eps":137.78,"epc":45.08} $GPGGA,071739.000,4404.1284,N,12118.8506,W,1,4,5.20,1135.9,M,-19.6,M,,*51 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,37,32,54,148,43,48,37,196,44*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 {"class":"SKY","xdop":3.96,"ydop":4.59,"vdop":0.98,"tdop":4.62,"hdop":5.20,"gdop":8.87,"pdop":5.29,"satellites":[{"PRN":20,"el":73,"az":204,"ss":41,"used":true},{"PRN":23,"el":56,"az":298,"ss":37,"used":true},{"PRN":32,"el":54,"az":148,"ss":43,"used":true},{"PRN":135,"el":37,"az":196,"ss":44,"used":false},{"PRN":13,"el":30,"az":282,"ss":34,"used":true},{"PRN":31,"el":0,"az":0,"ss":31,"used":false}]} $GPRMC,071739.000,A,4404.1284,N,12118.8506,W,0.05,0.00,111111,,,A*79 {"class":"TPV","mode":3,"time":"2011-11-11T07:17:39.000Z","ept":0.005,"lat":44.068806667,"lon":-121.314176667,"alt":1135.900,"epx":59.364,"epy":68.891,"epv":22.540,"track":0.0000,"speed":0.026,"climb":-1.400,"eps":137.78,"epc":45.08} $GPGGA,071740.000,4404.1303,N,12118.8486,W,1,4,5.20,1134.7,M,-19.6,M,,*57 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,36,32,54,148,43,48,37,196,45*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 {"class":"SKY","xdop":3.96,"ydop":4.59,"vdop":0.98,"tdop":4.62,"hdop":5.20,"gdop":8.87,"pdop":5.29,"satellites":[{"PRN":20,"el":73,"az":204,"ss":41,"used":true},{"PRN":23,"el":56,"az":298,"ss":36,"used":true},{"PRN":32,"el":54,"az":148,"ss":43,"used":true},{"PRN":135,"el":37,"az":196,"ss":45,"used":false},{"PRN":13,"el":30,"az":282,"ss":34,"used":true},{"PRN":31,"el":0,"az":0,"ss":31,"used":false}]} $GPRMC,071740.000,A,4404.1303,N,12118.8486,W,0.11,0.00,111111,,,A*75 {"class":"TPV","mode":3,"time":"2011-11-11T07:17:40.000Z","ept":0.005,"lat":44.068838333,"lon":-121.314143333,"alt":1134.700,"epx":59.364,"epy":68.891,"epv":22.540,"track":0.0000,"speed":0.057,"climb":-1.200,"eps":137.78,"epc":45.08} $GPGGA,071741.000,4404.1316,N,12118.8473,W,1,4,5.20,1135.3,M,-19.6,M,,*5D $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,36,32,54,148,43,48,37,196,45*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 {"class":"SKY","xdop":3.96,"ydop":4.59,"vdop":0.98,"tdop":4.62,"hdop":5.20,"gdop":8.87,"pdop":5.29,"satellites":[{"PRN":20,"el":73,"az":204,"ss":41,"used":true},{"PRN":23,"el":56,"az":298,"ss":36,"used":true},{"PRN":32,"el":54,"az":148,"ss":43,"used":true},{"PRN":135,"el":37,"az":196,"ss":45,"used":false},{"PRN":13,"el":30,"az":282,"ss":34,"used":true},{"PRN":31,"el":0,"az":0,"ss":31,"used":false}]} $GPRMC,071741.000,A,4404.1316,N,12118.8473,W,0.08,0.00,111111,,,A*72 {"class":"TPV","mode":3,"time":"2011-11-11T07:17:41.000Z","ept":0.005,"lat":44.068860000,"lon":-121.314121667,"alt":1135.300,"epx":59.364,"epy":68.891,"epv":22.540,"track":0.0000,"speed":0.041,"climb":0.600,"eps":137.78,"epc":45.08} $GPGGA,071742.000,4404.1314,N,12118.8476,W,1,4,5.20,1134.4,M,-19.6,M,,*5F $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,36,32,54,148,43,48,37,196,45*70 $GPGSV,2,2,06,13,30,282,34,31,,,30*40 {"class":"SKY","xdop":3.96,"ydop":4.59,"vdop":0.98,"tdop":4.62,"hdop":5.20,"gdop":8.87,"pdop":5.29,"satellites":[{"PRN":20,"el":73,"az":204,"ss":41,"used":true},{"PRN":23,"el":56,"az":298,"ss":36,"used":true},{"PRN":32,"el":54,"az":148,"ss":43,"used":true},{"PRN":135,"el":37,"az":196,"ss":45,"used":false},{"PRN":13,"el":30,"az":282,"ss":34,"used":true},{"PRN":31,"el":0,"az":0,"ss":30,"used":false}]} $GPRMC,071742.000,A,4404.1314,N,12118.8476,W,0.03,0.00,111111,,,A*7D {"class":"TPV","mode":3,"time":"2011-11-11T07:17:42.000Z","ept":0.005,"lat":44.068856667,"lon":-121.314126667,"alt":1134.400,"epx":59.364,"epy":68.891,"epv":22.540,"track":0.0000,"speed":0.015,"climb":-0.900,"eps":137.78,"epc":45.08} $GPGGA,071743.000,4404.1312,N,12118.8480,W,1,4,5.20,1134.6,M,-19.6,M,,*53 $GPGSA,A,3,23,13,32,20,,,,,,,,,5.29,5.20,0.98*0A $GPGSV,2,1,06,20,73,204,41,23,56,298,36,32,54,148,43,48,37,196,45*70 $GPGSV,2,2,06,13,30,282,34,31,,,31*41 {"class":"SKY","xdop":3.96,"ydop":4.59,"vdop":0.98,"tdop":4.62,"hdop":5.20,"gdop":8.87,"pdop":5.29,"satellites":[{"PRN":20,"el":73,"az":204,"ss":41,"used":true},{"PRN":23,"el":56,"az":298,"ss":36,"used":true},{"PRN":32,"el":54,"az":148,"ss":43,"used":true},{"PRN":135,"el":37,"az":196,"ss":45,"used":false},{"PRN":13,"el":30,"az":282,"ss":34,"used":true},{"PRN":31,"el":0,"az":0,"ss":31,"used":false}]} gpsd-3.15/test/daemon/trimble-lassen_iq-3dfix.log0000664000175000017500000001654112461156335020134 0ustar esresr# Name: Trimble Lassen iQ # Chipset: TSIP # Description: Sparkfun Lassen iQ Evaluation Kit # Submitter: Chris Kuethe # Date: 2006-11-24 # Location: Edmonton, Alberta, Canada. 53.5N, 113.5W # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # mD@sg«@h|@>•@ ÍK  mD@sg©@h{@>•@ ÍK mT@;‡¯?¶Î|@#¿ ?»ìé  \AèFÃÉ+>èGÝ@‹v\B FÃÉ+>êñ&?ՙb\ AÐFÃÉ+?äo@wØ\ (AèFÃÉ+>Úz<@«£Ø\0AàFÃÉ+> w‹@{Ój\@BFÃÉ+?‚2?Ñg\ HBFÃÉ+>ØÜF?JŠ mT@;|ë?¶Œ@#·ï?»Ù.  AFÃÎô{A`FKZmT@;|ë?¶Œ@#·ï?»Ù.  mT@;i?¶«Þ@#¥À?»œT  mT@;ry?¶ª)@#°ø?»Åý  \AèFÃÕ->çúr@‹p=\BFÃÕ->êŒæ?Õ§|\ AÐFÃÕ-?g@w$n\ (AèFÃÕ->ÚÑ$@« Ä\0AàFÃÕ-> ÊÓ@{ÌJ\@BFÃÕ-?fi?ѝ\ HBFÃÕ->ز[?JkÚFAFÃâé{A`KZmT@CÛe?àS)@ e?°yŽ ‚mT@CÛe?àS)@ e?°yŽ \BFÃã>ê,¯?ÕŽø\ AèFÃã?Rü@w*\ (AÐFÃã>Û$@«Ú\0AàFÃã> %”@{ņ\@BFÃã?K·?Ñ(m\ HBFÃã>Ø[í?J.mD@QS@›à@"1ý?ÅO FmD@Q{Ô@‹Ü@"7ù?ÅR\ mD@Q{Ô@‹Ü@"7ù?ÅR\ mD@Qvt@|F@"=Ä?ÅU  AFÃìí{A`KZ\BFÃí>éë•?ÕŸ\ AðFÃí?vž@w-r\ (AÐFÃí>Û\Û@«›Î\0AàFÃí> µt@{ÀÒ\@BFÃí?9²?Ñ4¯mD@Qk@[k@"Ií?ÅZ§ \BFÃ÷+>éšI?ÕÇ€\ AðFÃ÷+?œ+@w14\ (AÐFÃ÷+>ۗ2@«™ž\0AàFÃ÷+> @ú@{Œ \@BFÃ÷+?' ?ÑA\ HB$FÃ÷+>ØÝ?IðímD@Qe™@K`@"Oç?Å]r mD@Qe™@K`@"Oç?Å]r mD@Q`B@;å@"U¡?Å` KZmD@QZÛ@,@"[…?Åbä \BFÄ>éG?ÕÕn\ AðFÄ?ÒD@w6¢\ (AÐFÄ>Ûëp@«–Ž\0AàFÄ> ˜¶@{µ(\@BFÄ? ?ÑS\ HB FÄ>×ÇÞ?IÃðmD@QUŠ@¥@"a@?Åe” AFÄ"{A`FmD@QUŠ@¥@"a@?Åe” mD@QP @ ›@"g5?Åh^ KZmD@QP @ ›@"g5?Åh^ \BFÄ ">é)?ÕÞ€\ AðFÄ "?öl@w:D\ (AÐFÄ ">Ü#ž@«”¯\0AàFÄ "> (H@{°Œ\@B FÄ "?ú?Ñ^ø\ HBFÄ ">ם¹?I¥êAFÄæ{A`\BFÄ>èÃD?Õè#\ AèFÄ?®@w>\ (AÐFÄ>Ü]®@«’™\0AàFÄ> Žg@{«Î\@B$FÄ?ç–?ÑkO\ HBFÄ>×r=?I‡mD@Q?¢@ܐ@"y?ÅpÚ mD@Q?¢@ܐ@"y?ÅpÚ mD@Q:5@Ì¢@" ?Ås° AFÄÞ{A`KZ\BFÄ>èb'?Õõï\ AàFÄ?QÂ@wCx\ (AÐFÄ>ܱË@«\0AàFÄ> @{€î\@B$FÄ?Ì®?Ñ}:\ HB FÄ>×3?IZ2mD@Q5@œc@"„º?Åvl F Ê8&b7¯J&â \í{RàIí þÿ0ùý  * &b3¯J&å \ñ{RàIí þÿ0ùý AFÄ(ç{A`KZm3@vM•@mÒ?€*@#> \AØFÄ)>æå@‹LŸ\BFÄ)>è!b?Õÿ(\ AÐFÄ)?uÖ@wG\ (AÐFÄ)>Üéä@«‰\0AàFÄ)>›Æ@{ X\@B$FÄ)?ºŒ?щ0\ HB$FÄ)>×â?Iåä±@‹Hë\ AÐFÄ3?›@wJÜ\ (AÐFÄ3>Ý#É@«‹p\0AàFÄ3>'ý@{›š\@B(FÄ3?š4?ѕ\ HB$FÄ3>ÖÝ@?I‰ 45&b¯J&ô ]{RàIí þÿ0ùý m3@vwo@mý[?€*£@#W©  9x&b¯J&ö ] {RàIí þÿ0ùý m3@vwo@mý[?€*£@#W©  êAH&b¯J&ù ]{RàIí þÿ0ùý m3@v„ô@n [?€*§@#j&  ÊE0&b¯J&û ]{RàIí þÿ0ùý F‚\B FÄ<ý>ç}&?Öx\ AÐFÄ<ý?ÑZ@wPT\0AàFÄ<ý>d@{”Ž\@B(FÄ<ý?7?ѧj\ HB FÄ<ý>֝ª?HðŒ BI&b ¯J&ý ]{RàIí þÿ0ùý m3@v’Ç@n¬?€*¬@#}  ºM&b¯J&þ ]{RàIí þÿ0ùý  òPè&b¯J' ]!{IíRà þÿ0ùý m3@v F@n'¥?€*³@#e  TÐ&b¯J' ]%{IíRà þÿ0ùý m3@v®@n5û?€*·@#¢@  úXž&b¯J' ]({IíRà þÿ0ùý F\BFÄG>ç<º?Öž\ AÐFÄG?õE@wSô\ (AÐFÄG>ݯÍ@«†X\0AàFÄG>×@{$\@B$FÄG?{[?ѳB\ HBFÄG>Ös†?Hӏ *\ &aý¯J' ],{IíRà þÿ0ùý  Ú`ˆ&aú¯J' ]/{IíRà þÿ0ùý m3@v»Í@nD%?€*œ@#ŽÖ  "dp&aø¯J' ]2{IíRà þÿ0ùý m3@v»Í@nD%?€*œ@#ŽÖ  šhX&aõ¯J' ]6{IíRà þÿ0ùý m3@vÊØ@nSž?€*Â@#É7  2l@&aó¯J' ]9{IíRà þÿ0ùý KZ‚\AØFÄQ>å1•@‹;Ø\BFÄQ>æùl?Ö).\ AÐFÄQ?Í@wWŒ\ (AÐFÄQ>Ýê @«„8\0AàFÄQ>›E@{‹`\@B FÄQ?h³?Ñ¿£\ HBFÄQ>ÖGt?HŽ5 Òp(&að¯J' ]<{IíRà þÿ0ùý ‚Fm3@v؁@naÜ?€*Æ@#Û¹  Öwø&aì¯J' ]C{IíRà þÿ0ùý m3@væ­@npˆ?€*Î@#îÙ  R{à&aê¯J' ]F{IíRà þÿ0ùý  ZÈ&aè¯J' ]I{IíRà þÿ0ùý KZ‚\AðFÄZþ>æ˜Þ?Ö6ã\ AÐFÄZþ?P§@w]*\ (AÐFÄZþ>Þ=Ž@«*\0AàFÄZþ>ô@{„Š\@B FÄZþ?Mï?ÑÑ`\ HBFÄZþ>Ö"?H‡ém3@vôI@n~Ÿ?€*Ñ@$5  ®‡˜&aã¯J' ]O{IíRà þÿ0ùý m3@wo@nE?€*Ú@$8 ‚ *‹€&aà¯J' ]R{IíRà þÿ0ùý  "h&aÞ¯J' ]U{IíRà þÿ0ùý ‚ “P&aܯJ' ]X{IíRà þÿ0ùý AFÄdè{A`KZ‚ Š—8&aÙ¯J' ][{IíRà þÿ0ùý m3@wN@nª ?€*å@$9š  "› &aׯJ' ]^{IíRà þÿ0ùý m3@wN@nª ?€*å@$9š  *Ÿ&aÔ¯J' ]a{IíRà þÿ0ùý ‚F –¢ð&aÒ¯J' ]c{IíRà þÿ0ùý  >ŠØ&aϯJ' ]f{IíRà þÿ0ùý AFÄnÜ{A`Fm3@w,@nžl?€*ê@$L& \AØFÄo>ä@‹/\AàFÄo>æ ?ÖI0\ AÐFÄo?˜‡@wdn\ (AÐFÄo>Þ¬ï@«}\0AàFÄo>@{{l\@BFÄo?*9?Ñé \ HBFÄo>Õ³€?HLä ºªÀ&aͯJ' ]i{IíRà þÿ0ùý m3@w;†@nÈ^?€*ð@$`¿  ²®š&a˯J' ]l{IíRà þÿ0ùý m3@w;†@nÈ^?€*ð@$`¿  ž²&aȯJ' ]n{IíRà þÿ0ùý m3@wIh@nÖœ?€*ö@$sB  6¶x&aƯJ' ]q{IíRà þÿ0ùý m3@wIh@nÖœ?€*ö@$sB  ²º`&aïJ' ]t{IíRà þÿ0ùý KZ‚\AØFÄx÷>ä2ß@‹)X\AØFÄx÷>åŽj?ÖWV\ AÐFÄx÷?Ð@wj \ (AØFÄx÷>ß@«yè\0AàFÄx÷>h„@{t`\@BFÄx÷?™?ÑûRm# F gpsd-3.15/test/daemon/trimble-lassen_iq-3dfix.log.chk0000664000175000017500000005550512467340617020707 0ustar esresr$GPGSV,3,1,10,00,00,000,00,19,26,250,29,00,00,000,00,18,26,096,37*7C $GPGSV,3,2,10,01,29,221,26,11,24,307,29,03,08,225,28,00,00,000,00*7B $GPGSV,3,3,10,22,65,094,37,09,24,045,37*78 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":2.56,"tdop":1.47,"hdop":1.43,"gdop":3.28,"pdop":2.93,"satellites":[{"PRN":19,"el":26,"az":250,"ss":29,"used":true},{"PRN":18,"el":26,"az":96,"ss":37,"used":true},{"PRN":1,"el":29,"az":221,"ss":26,"used":true},{"PRN":11,"el":24,"az":307,"ss":29,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPGSV,3,1,10,00,00,000,00,19,26,250,29,00,00,000,00,18,26,096,38*73 $GPGSV,3,2,10,01,29,221,29,11,25,307,26,03,08,225,28,00,00,000,00*7A $GPGSV,3,3,10,22,65,094,38,09,24,045,38*78 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":2.51,"tdop":1.38,"hdop":1.75,"gdop":3.36,"pdop":3.06,"satellites":[{"PRN":19,"el":26,"az":250,"ss":29,"used":true},{"PRN":18,"el":26,"az":96,"ss":38,"used":true},{"PRN":1,"el":29,"az":221,"ss":29,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPGSV,3,1,10,00,00,000,00,19,26,250,29,00,00,000,00,18,26,096,39*72 $GPGSV,3,2,10,01,29,221,30,11,25,307,26,03,08,225,28,00,00,000,00*72 $GPGSV,3,3,10,22,65,094,38,09,24,045,41*76 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":2.54,"tdop":1.54,"hdop":2.07,"gdop":3.62,"pdop":3.27,"satellites":[{"PRN":19,"el":26,"az":250,"ss":29,"used":true},{"PRN":18,"el":26,"az":96,"ss":39,"used":true},{"PRN":1,"el":29,"az":221,"ss":30,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPGSV,3,1,10,00,00,000,00,19,26,250,29,00,00,000,00,18,26,096,39*72 $GPGSV,3,2,10,01,29,221,30,11,25,307,26,03,08,225,28,00,00,000,00*72 $GPGSV,3,3,10,22,64,094,39,09,24,045,40*77 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":2.54,"tdop":1.54,"hdop":2.07,"gdop":3.62,"pdop":3.27,"satellites":[{"PRN":19,"el":26,"az":250,"ss":29,"used":true},{"PRN":18,"el":26,"az":96,"ss":39,"used":true},{"PRN":1,"el":29,"az":221,"ss":30,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPGSV,3,1,10,00,00,000,00,19,26,250,29,00,00,000,00,18,26,096,39*72 $GPGSV,3,2,10,01,29,221,30,11,25,307,26,03,08,225,28,00,00,000,00*72 $GPGSV,3,3,10,22,64,094,40,09,24,045,39*77 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":2.54,"tdop":1.54,"hdop":2.06,"gdop":3.62,"pdop":3.27,"satellites":[{"PRN":19,"el":26,"az":250,"ss":29,"used":true},{"PRN":18,"el":26,"az":96,"ss":39,"used":true},{"PRN":1,"el":29,"az":221,"ss":30,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPGSV,3,1,10,00,00,000,00,19,26,250,29,00,00,000,00,18,26,096,39*72 $GPGSV,3,2,10,01,29,221,29,11,25,307,26,03,08,225,28,00,00,000,00*7A $GPGSV,3,3,10,22,64,094,41,09,24,045,38*77 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":2.54,"tdop":1.54,"hdop":2.06,"gdop":3.62,"pdop":3.27,"satellites":[{"PRN":19,"el":26,"az":250,"ss":29,"used":true},{"PRN":18,"el":26,"az":96,"ss":39,"used":true},{"PRN":1,"el":29,"az":221,"ss":29,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPGSV,3,1,10,00,00,000,00,19,26,250,29,00,00,000,00,18,26,096,39*72 $GPGSV,3,2,10,01,29,221,28,11,25,307,26,03,08,225,28,00,00,000,00*7B $GPGSV,3,3,10,22,64,094,41,09,24,045,40*78 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":2.54,"tdop":1.54,"hdop":2.06,"gdop":3.61,"pdop":3.27,"satellites":[{"PRN":19,"el":26,"az":250,"ss":29,"used":true},{"PRN":18,"el":26,"az":96,"ss":39,"used":true},{"PRN":1,"el":29,"az":221,"ss":28,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPZDA,065813.00,26,11,2006,00,00*6F $GPGGA,065813,5332.3091,N,11329.9353,W,1,03,2.06,698.96,M,-19.813,M,,*71 $GPRMC,065813,A,5332.3091,N,11329.9353,W,0.0000,0.000,261106,,*3C $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.3,2.1,2.5*0D {"class":"TPV","mode":2,"time":"2006-11-26T06:58:13.000Z","ept":0.005,"lat":53.538484440,"lon":-113.498921410,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000} $GPZDA,065814.00,26,11,2006,00,00*68 $GPGGA,065814,5332.3090,N,11329.9353,W,1,03,2.06,698.97,M,-19.813,M,,*76 $GPRMC,065814,A,5332.3090,N,11329.9353,W,0.0000,0.000,261106,,*3A $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.3,2.1,2.5*0D {"class":"TPV","mode":2,"time":"2006-11-26T06:58:14.000Z","ept":0.005,"lat":53.538484105,"lon":-113.498921158,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPGSV,3,1,10,00,00,000,00,19,26,249,27,00,00,000,00,18,26,096,38*75 $GPGSV,3,2,10,01,29,221,26,11,25,307,26,03,08,225,28,00,00,000,00*75 $GPGSV,3,3,10,22,64,094,41,09,24,045,41*79 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":1.00,"tdop":2.55,"hdop":3.72,"gdop":4.62,"pdop":3.85,"satellites":[{"PRN":19,"el":26,"az":249,"ss":27,"used":true},{"PRN":18,"el":26,"az":96,"ss":38,"used":true},{"PRN":1,"el":29,"az":221,"ss":26,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPZDA,065815.00,26,11,2006,00,00*69 $GPGGA,065815,5332.3090,N,11329.9353,W,1,03,3.72,698.97,M,-19.813,M,,*75 $GPRMC,065815,A,5332.3090,N,11329.9353,W,0.0000,0.000,261106,,*3B $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.8,3.7,1.0*07 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:15.000Z","ept":0.005,"lat":53.538483769,"lon":-113.498920907,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":45.97} $GPZDA,065816.00,26,11,2006,00,00*6A $GPGGA,065816,5332.3090,N,11329.9352,W,1,03,3.72,698.97,M,-19.813,M,,*77 $GPRMC,065816,A,5332.3090,N,11329.9352,W,0.0000,0.000,261106,,*39 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.8,3.7,1.0*07 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:16.000Z","ept":0.005,"lat":53.538483434,"lon":-113.498920739,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065817.00,26,11,2006,00,00*6B $GPGGA,065817,5332.3090,N,11329.9352,W,1,03,3.72,698.98,M,-19.813,M,,*79 $GPRMC,065817,A,5332.3090,N,11329.9352,W,0.0000,0.000,261106,,*38 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.8,3.7,1.0*07 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:17.000Z","ept":0.005,"lat":53.538483099,"lon":-113.498920488,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065818.00,26,11,2006,00,00*64 $GPGGA,065818,5332.3090,N,11329.9352,W,1,03,3.72,698.98,M,-19.813,M,,*76 $GPRMC,065818,A,5332.3090,N,11329.9352,W,0.0000,0.000,261106,,*37 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.8,3.7,1.0*07 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:18.000Z","ept":0.005,"lat":53.538482764,"lon":-113.498920320,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065819.00,26,11,2006,00,00*65 $GPGGA,065819,5332.3090,N,11329.9352,W,1,03,3.72,698.99,M,-19.813,M,,*76 $GPRMC,065819,A,5332.3090,N,11329.9352,W,0.0000,0.000,261106,,*36 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:19.000Z","ept":0.005,"lat":53.538482512,"lon":-113.498920153,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPGSV,3,1,10,00,00,000,00,19,26,249,27,00,00,000,00,18,26,096,38*75 $GPGSV,3,2,10,01,29,221,26,11,25,307,26,03,08,225,28,00,00,000,00*75 $GPGSV,3,3,10,22,64,094,42,09,24,045,41*7A {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":1.00,"tdop":2.55,"hdop":3.72,"gdop":4.62,"pdop":3.85,"satellites":[{"PRN":19,"el":26,"az":249,"ss":27,"used":true},{"PRN":18,"el":26,"az":96,"ss":38,"used":true},{"PRN":1,"el":29,"az":221,"ss":26,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPZDA,065820.00,26,11,2006,00,00*6F $GPGGA,065820,5332.3089,N,11329.9352,W,1,03,3.72,698.99,M,-19.813,M,,*74 $GPRMC,065820,A,5332.3089,N,11329.9352,W,0.0000,0.000,261106,,*34 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:20.000Z","ept":0.005,"lat":53.538482177,"lon":-113.498919901,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":44.39} $GPZDA,065821.00,26,11,2006,00,00*6E $GPGGA,065821,5332.3089,N,11329.9352,W,1,03,3.72,698.99,M,-19.813,M,,*75 $GPRMC,065821,A,5332.3089,N,11329.9352,W,0.0000,0.000,261106,,*35 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:21.000Z","ept":0.005,"lat":53.538481842,"lon":-113.498919734,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065823.00,26,11,2006,00,00*6C $GPGGA,065823,5332.3089,N,11329.9352,W,1,03,3.72,699.00,M,-19.813,M,,*76 $GPRMC,065823,A,5332.3089,N,11329.9352,W,0.0000,0.000,261106,,*37 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:23.000Z","ept":0.005,"lat":53.538481339,"lon":-113.498919482,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":12.61} $GPZDA,065824.00,26,11,2006,00,00*6B $GPGGA,065824,5332.3089,N,11329.9352,W,1,03,3.72,699.00,M,-19.813,M,,*71 $GPRMC,065824,A,5332.3089,N,11329.9352,W,0.0000,0.000,261106,,*30 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:24.000Z","ept":0.005,"lat":53.538481003,"lon":-113.498919314,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPGSV,3,1,10,00,00,000,00,19,26,249,27,00,00,000,00,18,26,096,35*78 $GPGSV,3,2,10,01,30,221,26,11,25,307,26,03,08,225,28,00,00,000,00*7D $GPGSV,3,3,10,22,64,094,42,09,24,045,40*7B {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":1.00,"tdop":2.55,"hdop":3.72,"gdop":4.62,"pdop":3.85,"satellites":[{"PRN":19,"el":26,"az":249,"ss":27,"used":true},{"PRN":18,"el":26,"az":96,"ss":35,"used":true},{"PRN":1,"el":30,"az":221,"ss":26,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPZDA,065825.00,26,11,2006,00,00*6A $GPGGA,065825,5332.3088,N,11329.9351,W,1,03,3.72,699.01,M,-19.813,M,,*73 $GPRMC,065825,A,5332.3088,N,11329.9351,W,0.0000,0.000,261106,,*33 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:25.000Z","ept":0.005,"lat":53.538480752,"lon":-113.498919147,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065826.00,26,11,2006,00,00*69 $GPGGA,065826,5332.3088,N,11329.9351,W,1,03,3.72,699.01,M,-19.813,M,,*70 $GPRMC,065826,A,5332.3088,N,11329.9351,W,0.0000,0.000,261106,,*30 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:26.000Z","ept":0.005,"lat":53.538480500,"lon":-113.498919063,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065827.00,26,11,2006,00,00*68 $GPGGA,065827,5332.3088,N,11329.9351,W,1,03,3.72,699.01,M,-19.813,M,,*71 $GPRMC,065827,A,5332.3088,N,11329.9351,W,0.0000,0.000,261106,,*31 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:27.000Z","ept":0.005,"lat":53.538480249,"lon":-113.498918895,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065828.00,26,11,2006,00,00*67 $GPGGA,065828,5332.3088,N,11329.9351,W,1,03,3.72,699.02,M,-19.813,M,,*7D $GPRMC,065828,A,5332.3088,N,11329.9351,W,0.0000,0.000,261106,,*3E $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:28.000Z","ept":0.005,"lat":53.538480081,"lon":-113.498918728,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065829.00,26,11,2006,00,00*66 $GPGGA,065829,5332.3088,N,11329.9351,W,1,03,3.72,699.02,M,-19.813,M,,*7C $GPRMC,065829,A,5332.3088,N,11329.9351,W,0.0000,0.000,261106,,*3F $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:29.000Z","ept":0.005,"lat":53.538479830,"lon":-113.498918644,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPGSV,3,1,10,00,00,000,00,19,26,249,27,00,00,000,00,18,26,096,32*7F $GPGSV,3,2,10,01,30,221,26,11,25,307,26,03,08,225,28,00,00,000,00*7D $GPGSV,3,3,10,22,64,094,41,09,24,045,39*76 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":1.00,"tdop":2.56,"hdop":3.72,"gdop":4.63,"pdop":3.85,"satellites":[{"PRN":19,"el":26,"az":249,"ss":27,"used":true},{"PRN":18,"el":26,"az":96,"ss":32,"used":true},{"PRN":1,"el":30,"az":221,"ss":26,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPZDA,065830.00,26,11,2006,00,00*6E $GPGGA,065830,5332.3088,N,11329.9351,W,1,03,3.72,699.03,M,-19.813,M,,*75 $GPRMC,065830,A,5332.3088,N,11329.9351,W,0.0000,0.000,261106,,*37 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:30.000Z","ept":0.005,"lat":53.538479578,"lon":-113.498918476,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065831.00,26,11,2006,00,00*6F $GPGGA,065831,5332.3088,N,11329.9351,W,1,03,3.72,699.03,M,-19.813,M,,*74 $GPRMC,065831,A,5332.3088,N,11329.9351,W,0.0000,0.000,261106,,*36 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:31.000Z","ept":0.005,"lat":53.538479327,"lon":-113.498918309,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065832.00,26,11,2006,00,00*6C $GPGGA,065832,5332.3087,N,11329.9351,W,1,03,3.72,699.03,M,-19.813,M,,*78 $GPRMC,065832,A,5332.3087,N,11329.9351,W,0.0000,0.000,261106,,*3A $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:32.000Z","ept":0.005,"lat":53.538479159,"lon":-113.498918141,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065833.00,26,11,2006,00,00*6D $GPGGA,065833,5332.3087,N,11329.9351,W,1,03,3.72,699.04,M,-19.813,M,,*7E $GPRMC,065833,A,5332.3087,N,11329.9351,W,0.0000,0.000,261106,,*3B $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:33.000Z","ept":0.005,"lat":53.538478908,"lon":-113.498918057,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065834.00,26,11,2006,00,00*6A $GPGGA,065834,5332.3087,N,11329.9351,W,1,03,3.72,699.04,M,-19.813,M,,*79 $GPRMC,065834,A,5332.3087,N,11329.9351,W,0.0000,0.000,261106,,*3C $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:34.000Z","ept":0.005,"lat":53.538478740,"lon":-113.498917890,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPGSV,3,1,10,00,00,000,00,19,26,249,27,00,00,000,00,18,26,096,32*7F $GPGSV,3,2,10,01,30,221,26,11,25,307,26,03,08,225,28,00,00,000,00*7D $GPGSV,3,3,10,22,64,094,40,09,24,045,38*76 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":1.00,"tdop":2.56,"hdop":3.72,"gdop":4.63,"pdop":3.86,"satellites":[{"PRN":19,"el":26,"az":249,"ss":27,"used":true},{"PRN":18,"el":26,"az":96,"ss":32,"used":true},{"PRN":1,"el":30,"az":221,"ss":26,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":8,"az":225,"ss":28,"used":true}]} $GPZDA,065835.00,26,11,2006,00,00*6B $GPGGA,065835,5332.3087,N,11329.9351,W,1,03,3.72,699.04,M,-19.813,M,,*78 $GPRMC,065835,A,5332.3087,N,11329.9351,W,0.0000,0.000,261106,,*3D $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:35.000Z","ept":0.005,"lat":53.538478489,"lon":-113.498917806,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065837.00,26,11,2006,00,00*69 $GPGGA,065837,5332.3087,N,11329.9351,W,1,03,3.72,699.05,M,-19.813,M,,*7B $GPRMC,065837,A,5332.3087,N,11329.9351,W,0.0000,0.000,261106,,*3F $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:37.000Z","ept":0.005,"lat":53.538478154,"lon":-113.498917722,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":12.61} $GPZDA,065838.00,26,11,2006,00,00*66 $GPGGA,065838,5332.3087,N,11329.9351,W,1,03,3.73,699.05,M,-19.813,M,,*75 $GPRMC,065838,A,5332.3087,N,11329.9351,W,0.0000,0.000,261106,,*30 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:38.000Z","ept":0.005,"lat":53.538477986,"lon":-113.498917722,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065839.00,26,11,2006,00,00*67 $GPGGA,065839,5332.3087,N,11329.9351,W,1,03,3.73,699.05,M,-19.813,M,,*74 $GPRMC,065839,A,5332.3087,N,11329.9351,W,0.0000,0.000,261106,,*31 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:39.000Z","ept":0.005,"lat":53.538477818,"lon":-113.498917638,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPGSV,3,1,10,00,00,000,00,19,26,249,27,00,00,000,00,18,26,096,30*7D $GPGSV,3,2,10,01,30,221,26,11,25,307,26,03,07,225,28,00,00,000,00*72 $GPGSV,3,3,10,22,64,094,40,09,24,045,39*77 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":1.00,"tdop":2.56,"hdop":3.73,"gdop":4.63,"pdop":3.86,"satellites":[{"PRN":19,"el":26,"az":249,"ss":27,"used":true},{"PRN":18,"el":26,"az":96,"ss":30,"used":true},{"PRN":1,"el":30,"az":221,"ss":26,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":7,"az":225,"ss":28,"used":true}]} $GPZDA,065841.00,26,11,2006,00,00*68 $GPGGA,065841,5332.3086,N,11329.9350,W,1,03,3.73,699.06,M,-19.813,M,,*78 $GPRMC,065841,A,5332.3086,N,11329.9350,W,0.0000,0.000,261106,,*3E $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:41.000Z","ept":0.005,"lat":53.538477399,"lon":-113.498917470,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":12.61} $GPZDA,065842.00,26,11,2006,00,00*6B $GPGGA,065842,5332.3086,N,11329.9350,W,1,03,3.73,699.06,M,-19.813,M,,*7B $GPRMC,065842,A,5332.3086,N,11329.9350,W,0.0000,0.000,261106,,*3D $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:42.000Z","ept":0.005,"lat":53.538477148,"lon":-113.498917387,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065843.00,26,11,2006,00,00*6A $GPGGA,065843,5332.3086,N,11329.9350,W,1,03,3.73,699.07,M,-19.813,M,,*7B $GPRMC,065843,A,5332.3086,N,11329.9350,W,0.0000,0.000,261106,,*3C $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:43.000Z","ept":0.005,"lat":53.538476980,"lon":-113.498917303,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065844.00,26,11,2006,00,00*6D $GPGGA,065844,5332.3086,N,11329.9350,W,1,03,3.73,699.07,M,-19.813,M,,*7C $GPRMC,065844,A,5332.3086,N,11329.9350,W,0.0000,0.000,261106,,*3B $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:44.000Z","ept":0.005,"lat":53.538476812,"lon":-113.498917219,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065845.00,26,11,2006,00,00*6C $GPGGA,065845,5332.3086,N,11329.9350,W,1,03,3.73,699.07,M,-19.813,M,,*7D $GPRMC,065845,A,5332.3086,N,11329.9350,W,0.0000,0.000,261106,,*3A $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:45.000Z","ept":0.005,"lat":53.538476561,"lon":-113.498917135,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":46.13} $GPZDA,065846.00,26,11,2006,00,00*6F $GPGGA,065846,5332.3086,N,11329.9350,W,1,03,3.73,699.08,M,-19.813,M,,*71 $GPRMC,065846,A,5332.3086,N,11329.9350,W,0.0000,0.000,261106,,*39 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:46.000Z","ept":0.005,"lat":53.538476393,"lon":-113.498917135,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065847.00,26,11,2006,00,00*6E $GPGGA,065847,5332.3086,N,11329.9350,W,1,03,3.73,699.08,M,-19.813,M,,*70 $GPRMC,065847,A,5332.3086,N,11329.9350,W,0.0000,0.000,261106,,*38 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:47.000Z","ept":0.005,"lat":53.538476142,"lon":-113.498917051,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065848.00,26,11,2006,00,00*61 $GPGGA,065848,5332.3086,N,11329.9350,W,1,03,3.73,699.08,M,-19.813,M,,*7F $GPRMC,065848,A,5332.3086,N,11329.9350,W,0.0000,0.000,261106,,*37 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:48.000Z","ept":0.005,"lat":53.538475974,"lon":-113.498916968,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065849.00,26,11,2006,00,00*60 $GPGGA,065849,5332.3085,N,11329.9350,W,1,03,3.73,699.08,M,-19.813,M,,*7D $GPRMC,065849,A,5332.3085,N,11329.9350,W,0.0000,0.000,261106,,*35 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:49.000Z","ept":0.005,"lat":53.538475723,"lon":-113.498916884,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPGSV,3,1,10,00,00,000,00,19,26,249,27,00,00,000,00,18,26,096,28*74 $GPGSV,3,2,10,01,30,221,26,11,25,307,26,03,07,225,28,00,00,000,00*72 $GPGSV,3,3,10,22,64,094,39,09,24,045,37*77 {"class":"SKY","xdop":0.64,"ydop":0.84,"vdop":1.00,"tdop":2.57,"hdop":3.73,"gdop":4.64,"pdop":3.86,"satellites":[{"PRN":19,"el":26,"az":249,"ss":27,"used":true},{"PRN":18,"el":26,"az":96,"ss":28,"used":true},{"PRN":1,"el":30,"az":221,"ss":26,"used":true},{"PRN":11,"el":25,"az":307,"ss":26,"used":true},{"PRN":3,"el":7,"az":225,"ss":28,"used":true}]} $GPZDA,065850.00,26,11,2006,00,00*68 $GPGGA,065850,5332.3085,N,11329.9350,W,1,03,3.73,699.09,M,-19.813,M,,*74 $GPRMC,065850,A,5332.3085,N,11329.9350,W,0.0000,0.000,261106,,*3D $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:50.000Z","ept":0.005,"lat":53.538475555,"lon":-113.498916800,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":44.23} $GPZDA,065851.00,26,11,2006,00,00*69 $GPGGA,065851,5332.3085,N,11329.9350,W,1,03,3.73,699.09,M,-19.813,M,,*75 $GPRMC,065851,A,5332.3085,N,11329.9350,W,0.0000,0.000,261106,,*3C $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:51.000Z","ept":0.005,"lat":53.538475388,"lon":-113.498916800,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065852.00,26,11,2006,00,00*6A $GPGGA,065852,5332.3085,N,11329.9350,W,1,03,3.73,699.09,M,-19.813,M,,*76 $GPRMC,065852,A,5332.3085,N,11329.9350,W,0.0000,0.000,261106,,*3F $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:52.000Z","ept":0.005,"lat":53.538475136,"lon":-113.498916716,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065853.00,26,11,2006,00,00*6B $GPGGA,065853,5332.3085,N,11329.9350,W,1,03,3.73,699.09,M,-19.813,M,,*77 $GPRMC,065853,A,5332.3085,N,11329.9350,W,0.0000,0.000,261106,,*3E $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:53.000Z","ept":0.005,"lat":53.538474968,"lon":-113.498916632,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} $GPZDA,065854.00,26,11,2006,00,00*6C $GPGGA,065854,5332.3085,N,11329.9350,W,1,03,3.73,699.10,M,-19.813,M,,*78 $GPRMC,065854,A,5332.3085,N,11329.9350,W,0.0000,0.000,261106,,*39 $GPGSA,A,2,19,18,1,11,3,22,9,,,,,,3.9,3.7,1.0*06 {"class":"TPV","mode":2,"time":"2006-11-26T06:58:54.000Z","ept":0.005,"lat":53.538474717,"lon":-113.498916548,"epx":9.599,"epy":12.614,"track":0.0000,"speed":0.000,"eps":25.23} gpsd-3.15/test/daemon/trimble-lassen_iq-playacar.log0000664000175000017500000001053212461156335020705 0ustar esresr# Name: Trimble Lassen iQ # Chipset: TSIP # Description: Sparkfun Lassen iQ Evaluation Kit # Submitter: Chris Kuethe # Date: 2006-12-22 # Location: Playa del Carmen, Q. Roo, Mexico. 20.63N 87.07W # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # VBö˜HÚA`mT@9T®@z‘?Û0?Ð"‚„?× Î)0L¿øPXhAä?@)ÈÔ ÀÒÅT^’fHÚA€VBök~HÚA€mT@9T®@z‘?Û0?Ð"‚„?× Î+¢«s¿øPXhVæ@)ÉÁ:àÀÒŠ‚Ä~2dHÚA VBö‚/HÚA mT@9d@ˆ?Û.6?Ð,x‚„?× Î.NŠÛ¿øPXhc]m@)ʲ›šÀ҇±í)ÒbHÚAÀVBöq¥HÚAÀmT@9d@ˆ?Û.6?Ð,x‚„?× Î1V¿øPXhk¯º@)Ë}uÐÀÒháÈÂòaHÚAàVBöx€HÚAàAHÚAñ~A`FKZmT@9q@“‚?Û:ÿ?Ð<‚„?× Î4œä¿øPXhl€ž@)ÌHÀÒJƒÂr_HÚBVBö޵HÚBmT@9q@“‚?Û:ÿ?Ð<‚„?× Î7ˆÏ¿øPXhoxa@)ÌîB(ÀÒ+=þgr^HÚB VBöÚHÚB mT@9~5@Ÿ?ÛGô?ÐKׂ„?× Î7bÕw¿øPXhn‡©@)ÌüQ ÀÒ i9)r]HÚB@VBöƒ9HÚB@mT@9~5@Ÿ?ÛGô?ÐKׂ„?× Î7ºŒý¿øPXhlÍa@)Í ûÐÀÑí˜ï<Ò\HÚB`VBöpàHÚB`mT@9‹H@ª™?ÛTÙ?Ð[€‚„?× Î8hÖ¿øPXhj]@)Í|ÀÑÎÅŒºr[HÚB€VBöyHÚB€AHÚB“~A`FKZmT@9‹H@ª™?ÛTÙ?Ð[€‚„?× Î;Å ¿øPXhPÏ|@)ÍÀèÀѯùi?ZHÚB VBöl±HÚB mT@9‹H@ª™?ÛTÙ?Ð[€‚„?× Î?ZÚ¿øPXh5t”@)ÎSZ`Àё(ÚØ2YHÚBÀVBöƒHÚBÀmT@9š@·?Ûcv?Ðm:‚„?× ÎC;€¿øPXh‹å@)ΜgàÀÑrY CXHÚBàVBö{SHÚBàmT@9š@·?Ûcv?Ðm:‚„?× ÎFåb¯¿øPXh¡Ø@)ÏzÐÀÑS‰×(²WHÚCVBöUHÚCmT@9§(@Ã?Ûp]?Ð|Þ‚„?× ÎJ…x¯¿øPXg婢@)Ï-/ÀÑ4žÓî²VHÚC VBöˆ HÚC AHÚC.~A`FKZmT@9§(@Ã?Ûp]?Ð|Þ‚„?× ÎN 0r¿øPXgàŬ@)Ï"U0ÀÑçáUHÚC@VBöžÁHÚC@mT@9ޚ@Îß?Û}š?Ќñ‚„?× ÎQO(ü¿øPXg݊²@)Îø­˜ÀÐ÷q2’THÚC`VBö¡MHÚC`mT@9ޚ@Îß?Û}š?Ќñ‚„?× ÎyþH„¿øPX`™Œ€@)ÎÅx@ÀÐØï@’SHÚC€V>‘Où>Â:[êB÷ ÃHÚC€mC@œüÅ@œûî=ÛH@Я‚„?× Î{ Ÿe¿øPXaÛ¯@)΃ÛÐÀк4Ž’RHÚC V;zÕ&»¿•œ·Q,Bö RHÚC mC@œüÅ@œûî=ÛH@Я‚„?× ÎSÐÙø¿øPXi~–€@)Íñû@ÀЛj «BQHÚCÀVœ.£œO‰1žèýBö~LHÚCÀAHÚCÎ~A`FKZmC@ŸQy@ŸP£=âs@ÿ‚„?× Ì>ÁFt¿øPX῔^@)Ɖ­`ÀÐ|Š'jPHÚCàVBökŒHÚCàmC@ŸQy@ŸP£=âs@ÿ‚„?× Ë‘/Œ¿øPY 7Á¯@)ÄڀÀÐ]ÉŠºOHÚDVBö’øHÚDmC@Ÿ{z@Ÿz€=é@Ó‚„?× Ë:ÄI¿øPYåw€@)ÂåxÀÐ>öÄnHÚD VBö’3HÚD mC@ŸÀ‚@Ÿ¿¬=÷ñ@Nš‚„?× Ëì"1¿øPY(B•E@)Â,™ØÀÐ §mHÚD@VBö¡HÚD@mC@ŸÀ‚@Ÿ¿¬=÷ñ@Nš‚„?× Êê”á7¿øPY/U]Ç@)Á³7àÀÐH?kHlHÚD`VBö—šHÚD`AHÚDq~A`FKZmC@¿:@¿d=é@ƒ®‚„?× ÊÖ3- ¿øPY4+Ã@)ÁZ»ÐÀÏÄåП@ÖHÚD€VBö–8HÚD€mC@¿:@¿d=é@ƒ®‚„?× ÊÈËì¿øPY7|ÀF@)ÁCÀÀχ5&î°ÕHÚD VBöžÈHÚD mC@¿v¬@¿u×=÷ñ@ÃÊ‚„?× Êœ×¿øPY:açê@)Àâ®xÀÏIAÊ€THÚDÀVBö§ÌHÚDÀmC@¿v¬@¿u×=÷ñ@ÃÊ‚„?× ÊŽKÚÍ¿øPY<žUº@)ÀžðXÀÏ ÛðÜRHÚDàVBöµ&HÚDàmC@¿Ð-@¿ÏW=C@ý[‚„?× Ê¬9Šš¿øPY>£h*@)À”ªèÀÎÎ07"þQHÚEVBö¹ÒHÚEAHÚE~A`FKZmC@¿Ð-@¿ÏW=C@ý[‚„?× ÊŠåj¿øPY@Õ<@)ÀzøÀΐ­¢OHÚE VBö¶NHÚE mC@¿÷u@¿ö =C@‚„?× Ê¢ùпøPYA=Æt@)ÀbW`ÀÎRÏÏÒNHÚE@VBöžÒHÚE@mC@À)Ø@À)=÷ñ@7‚„?× Ê ŽÏy¿øPYB¯)@)ÀOPÀÎ3ÑLHÚE`VBö -HÚE`mC@À)Ø@À)=÷ñ@7‚„?× Ê¥É'Ì¿øPYAe·n@)ÀH¬ÀÍ×VŠÇòJHÚE€VBöˆÕHÚE€mC@À@Àެ=C@xp‚„?× Ê°FŒÌ¿øPY?·ˆÿ@)ÀAÿšÀ͙‹åòIHÚE VBö§SHÚE AHÚE®~A`FKZmC@À@Àެ=C@xp‚„?× ËŸñ]Ÿ¿øPYz¥-@)¿Ç3èÀÍ[Â34òGHÚEÀV>’ˆþ>Åtº:^ïB÷HÚEÀmC@Àìí@Àì=”@ޚ‚„?× Ë»“…D¿øPYÿ¥Œ@)¿í’ ÀÍpWÒFHÚEàVŒô3ûœ:رžÒD€Bö„šHÚEàmC@Àìí@Àì=”@ޚ‚„?× ËÌS¶¿øPY§±]@)À0@ÀÌà^órEHÚFV>/”Ð>e’.:ßBöáJHÚFmC@ÁL6@ÁKb=Œ@ññ‚„?× ËàU<µ¿øPY ðÊ5@)¿¯èÀÌ¢¯[ÜÒCHÚF VBö¢iHÚF mC@ÁL6@ÁKb=Œ@ññ‚„?× Ëû²_†¿øPYUk@)¿«x˜ÀÌdóGBòAHÚF@VBöHÚF@AHÚFN~A`FKZmC@Á±@Á°3="ä@2ò‚„?× ÌÚªo¿øPY#Ž^@)¿©ËxÀÌ'3÷)ò@HÚF`VBö¢]HÚF`mC@Á±@Á°3="ä@2ò‚„?× Ì;“Þ¿øPXüM²@)¿±•€ÀËé gpsd-3.15/test/daemon/trimble-lassen_iq-playacar.log.chk0000664000175000017500000001240012467340617021451 0ustar esresr$GPRMC,000000,V,2037.7075,N,08704.0535,W,0.0000,0.000,000000,,*23 {"class":"TPV","mode":0} $GPRMC,000000,V,2037.7075,N,08704.0535,W,0.0000,0.000,000000,,*23 {"class":"TPV","mode":0} $GPRMC,000000,V,2037.7075,N,08704.0535,W,0.0000,0.000,000000,,*23 {"class":"TPV","mode":0} $GPRMC,000000,V,2037.7075,N,08704.0535,W,0.0000,0.000,000000,,*23 {"class":"TPV","mode":0} $GPRMC,040938,A,2037.7075,N,08704.0535,W,0.0000,0.000,221206,,*37 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:38.000Z","ept":0.005} $GPRMC,040939,A,2037.7075,N,08704.0535,W,0.0000,0.000,221206,,*36 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:39.000Z","ept":0.005} $GPRMC,040940,A,2037.7075,N,08704.0535,W,0.0000,0.000,221206,,*38 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:40.000Z","ept":0.005} $GPRMC,040941,A,2037.7075,N,08704.0535,W,0.0000,0.000,221206,,*39 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:41.000Z","ept":0.005} $GPRMC,040942,A,2037.7075,N,08704.0535,W,0.0000,0.000,221206,,*3A {"class":"TPV","mode":0,"time":"2006-12-22T04:09:42.000Z","ept":0.005} $GPRMC,040943,A,2037.7075,N,08704.0535,W,0.0000,0.000,221206,,*3B {"class":"TPV","mode":0,"time":"2006-12-22T04:09:43.000Z","ept":0.005} $GPRMC,040944,A,2037.7075,N,08704.0535,W,0.0000,0.000,221206,,*3C {"class":"TPV","mode":0,"time":"2006-12-22T04:09:44.000Z","ept":0.005} $GPRMC,040945,A,2037.7075,N,08704.0535,W,0.0000,0.000,221206,,*3D {"class":"TPV","mode":0,"time":"2006-12-22T04:09:45.000Z","ept":0.005} $GPRMC,040946,A,2037.7075,N,08704.0535,W,0.0000,0.000,221206,,*3E {"class":"TPV","mode":0,"time":"2006-12-22T04:09:46.000Z","ept":0.005} $GPRMC,040947,A,2037.7076,N,08704.0535,W,0.0000,0.000,221206,,*3C {"class":"TPV","mode":0,"time":"2006-12-22T04:09:47.000Z","ept":0.005} $GPRMC,040948,A,2037.7076,N,08704.0535,W,0.0000,0.000,221206,,*33 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:48.000Z","ept":0.005} $GPRMC,040949,A,2037.7076,N,08704.0535,W,0.0000,0.000,221206,,*32 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:49.000Z","ept":0.005} $GPRMC,040950,A,2037.7077,N,08704.0534,W,0.0000,0.000,221206,,*3A {"class":"TPV","mode":0,"time":"2006-12-22T04:09:50.000Z","ept":0.005} $GPRMC,040951,A,2037.7077,N,08704.0534,W,0.0000,0.000,221206,,*3B {"class":"TPV","mode":0,"time":"2006-12-22T04:09:51.000Z","ept":0.005} $GPRMC,040952,A,2037.7076,N,08704.0535,W,0.0000,0.000,221206,,*38 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:52.000Z","ept":0.005} $GPRMC,040953,A,2037.7059,N,08704.0550,W,0.0000,0.000,221206,,*37 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:53.000Z","ept":0.005} $GPRMC,040954,A,2037.7053,N,08704.0556,W,0.0000,0.000,221206,,*3C {"class":"TPV","mode":0,"time":"2006-12-22T04:09:54.000Z","ept":0.005} $GPRMC,040955,A,2037.7051,N,08704.0558,W,0.0000,0.000,221206,,*31 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:55.000Z","ept":0.005} $GPRMC,040956,A,2037.7049,N,08704.0559,W,0.0000,0.000,221206,,*3A {"class":"TPV","mode":0,"time":"2006-12-22T04:09:56.000Z","ept":0.005} $GPRMC,040957,A,2037.7048,N,08704.0560,W,0.0000,0.000,221206,,*30 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:57.000Z","ept":0.005} $GPRMC,040958,A,2037.7047,N,08704.0561,W,0.0000,0.000,221206,,*31 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:58.000Z","ept":0.005} $GPRMC,040959,A,2037.7047,N,08704.0561,W,0.0000,0.000,221206,,*30 {"class":"TPV","mode":0,"time":"2006-12-22T04:09:59.000Z","ept":0.005} $GPRMC,041000,A,2037.7046,N,08704.0562,W,0.0000,0.000,221206,,*36 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:00.000Z","ept":0.005} $GPRMC,041001,A,2037.7046,N,08704.0562,W,0.0000,0.000,221206,,*37 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:01.000Z","ept":0.005} $GPRMC,041002,A,2037.7046,N,08704.0562,W,0.0000,0.000,221206,,*34 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:02.000Z","ept":0.005} $GPRMC,041003,A,2037.7046,N,08704.0563,W,0.0000,0.000,221206,,*34 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:03.000Z","ept":0.005} $GPRMC,041004,A,2037.7046,N,08704.0563,W,0.0000,0.000,221206,,*33 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:04.000Z","ept":0.005} $GPRMC,041005,A,2037.7046,N,08704.0563,W,0.0000,0.000,221206,,*32 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:05.000Z","ept":0.005} $GPRMC,041006,A,2037.7046,N,08704.0563,W,0.0000,0.000,221206,,*31 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:06.000Z","ept":0.005} $GPRMC,041007,A,2037.7046,N,08704.0562,W,0.0000,0.000,221206,,*31 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:07.000Z","ept":0.005} $GPRMC,041008,A,2037.7054,N,08704.0557,W,0.0000,0.000,221206,,*3B {"class":"TPV","mode":0,"time":"2006-12-22T04:10:08.000Z","ept":0.005} $GPRMC,041009,A,2037.7055,N,08704.0557,W,0.0000,0.000,221206,,*3B {"class":"TPV","mode":0,"time":"2006-12-22T04:10:09.000Z","ept":0.005} $GPRMC,041010,A,2037.7055,N,08704.0556,W,0.0000,0.000,221206,,*32 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:10.000Z","ept":0.005} $GPRMC,041011,A,2037.7056,N,08704.0556,W,0.0000,0.000,221206,,*30 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:11.000Z","ept":0.005} $GPRMC,041012,A,2037.7057,N,08704.0555,W,0.0000,0.000,221206,,*31 {"class":"TPV","mode":0,"time":"2006-12-22T04:10:12.000Z","ept":0.005} $GPRMC,041013,A,2037.7058,N,08704.0555,W,0.0000,0.000,221206,,*3F {"class":"TPV","mode":0,"time":"2006-12-22T04:10:13.000Z","ept":0.005} gpsd-3.15/test/daemon/trimble-lassen_iq.log0000664000175000017500000001330712467342657017130 0ustar esresr# Name: Trimble Lassen iQ # Chipset: TSIP # Description: Sparkfun Lassen iQ Evaluation Kit # Submitter: Chris Kuethe # Date: 2006-11-24 # Location: Edmonton, Alberta, Canada. 53.5N, 113.5W # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # mT@nñT@#V@.f@ ƒ FKZ‚AEž {A`mT@nۊ@#N@.OÀ@ t! \ AÐEž?¬§6@Ë‹\(AèEž>€Îþ@ :\0BEž>‘‚Å?±NR\8AÐEž?ƒò@­Ð\HAðEž>ÅÎ @còr\ PB$Ež?puç?¢-\XAèEž?1ï @¥ÅÀmT@n×@#Eõ@.Q;@ gq mT@n×@#Eõ@.Q;@ gq AEž³Ž{A`FmT@nÊÐ@#>r@.Gi@ Z€ mT@nÊÐ@#>r@.Gi@ Z€ \EžŒ÷=Ï¥.@,4\BEžŒ÷>xŠ=?«K>\ AÐEžŒ÷?¬§z@Ž¯\0BEžŒ÷>‘?z?±Vk\8AÐEžŒ÷?Šr@°B\HBEžŒ÷>Ņq@cîÎ\ PB$EžŒ÷?p]º?¢J\XAèEžŒ÷?2³@¥ÄÓmT@nŸÑ@#7!@.=Ó@ Mæ mT@n²†@#/¡@.4@ @ô KZmT@n˜®@#ã@.X@ %Ó \BEžü“>w¯9?«Zè\ AÐEžü“?¬§Î@ˆI\(AàEžü“>á@ )“\0BEžü“>Œâ?±f\8AÐEžü“?éq@µ\HBEžü“>Äø¡@cçº\ PB(Ežü“?p.­?¡Þ`\XAèEžü“?2U@¥ÃAEŸí{A`FmT@n˜®@#ã@.X@ %Ó mT@n€m@##@. í@ [ mT@n€m@##@. í@ [ \BEŸ$¶>w7Â?«b~\ AÐEŸ$¶?¬§Þ@rÑ\(AØEŸ$¶>ÎÆ@ $Q\0BEŸ$¶>}»?±m·\8AÐEŸ$¶? Ú@·K\HAðEŸ$¶>ÄŽ†@cäP\ PB(EŸ$¶?pÞ?¡ÅP\XAèEŸ$¶?2u@¥ÂFAEŸS°{A`mT@n[Ñ@"úõ@-î‰@åù mT@n[Ñ@"úõ@-î‰@åù \ AÐEŸTz?¬§à@Rz\(AàEŸTz>‚+ø@ d\0BEŸTz>Š?±y)\8AÐEŸTz?:ª@ºÀ\HBEŸTz>ÄN@cß,\ PB(EŸTz?oõt?¡Ÿ§\XAèEŸTz?2Š@¥ÀǏ 3MÑà&?æ¯K.ÒRï{BjJ‚Ê þÿ0ùý  BMÕÈ&@¯K/IVp{BjJ‚Ê þÿ0ùý mC@šg$@šf(=ÄV@nÝ  ‚MÙ°&@R¯K/¿Yñ{BjJ‚Ê þÿ0ùý mC@šD·@šCº=ÄV@[)  JMݘ&@„¯K0-]:{BjJ‚Ê þÿ0ùý mC@šD·@šCº=ÄV@[) \AðEŸ|?>vÅ?«uÝ\ AÐEŸ|??¬§É@;³\(AØEŸ|?>‚lÂ@ Ð\0BEŸ|?>Û÷?±"\8AÐEŸ|??\é@œ \HBEŸ|?>Ä!@cۂ\ PB(EŸ|??oÝA?¡…s\XAèEŸ|??2É@¥¿Î ºMá€&@ޝK0”`O{BjJ‚Ê þÿ0ùý mC@š=@š@=¶H@0V  rMåh&@â¯K0óc2{BjJ‚Ê þÿ0ùý mC@š=@š@=¶H@0V  bMéP&A ¯K1Fe¿{BjJ‚Ê þÿ0ùý  èMí8&A7¯K1™hK{BjJ‚Ê þÿ0ùý  ¢Mñ &A]¯K1áj‹{BjJ‚Ê þÿ0ùý KZmC@§£•@§¢—=ÄV@öv \EŸ€®=֖Î@ ò\AðEŸ€®>uPn?«d\ AÐEŸ€®?¬§Œ@\(AÐEŸ€®>‚ʺ@ Î\8AÐEŸ€®?Ž(@À›\HBEŸ€®>Þœ@cÖT\ PB(EŸ€®?oºj?¡_Ÿ\XAèEŸ€®?2úw@¥Ÿo xMõ&A¯K2 l‹{BjJ‚Ê þÿ0ùý  êMøð&Aœ¯K2YnT{BjJ‚Ê þÿ0ùý  `MüØ&Aµ¯K2‹oð{BjJ‚Ê þÿ0ùý mC@§r—@§qš=š)@Ø5  žNÀ&A˯K2¹qe{BjJ‚Ê þÿ0ùý mC@§r—@§qš=š)@Ø5  àNš&AÞ¯K2ârž{BjJ‚Ê þÿ0ùý AEŸË™{A`F\EŸÌ?=םY@V\AèEŸÌ?>tÒ€?«‰c\ AÐEŸÌ??¬§O@q\(AÐEŸÌ?>ƒ ê@ @\0B EŸÌ?>9š?±”²\8AÐEŸÌ??°Q@Ã\HBEŸÌ?>ÃW @cÒŒ\ PB,EŸÌ??o¢1?¡Em\XAèEŸÌ??3À@¥œ{ ŠN&Að¯K3 sí{BjJ‚Ê þÿ0ùý  žN x&B¯K3,u {BjJ‚Ê þÿ0ùý mC@ŠöÀ@ŠõÃ=Œ@‰(  NH&B¯K3lvÿ{BjJ‚Ê þÿ0ùý  N0&B&¯K3‰wÞ{BjJ‚Ê þÿ0ùý KZmC@Š¿Ï@ŠŸÑ=š9@f« \EŸô7=ؗQ@ó\AèEŸô7>tZø?«‘\ AÐEŸô7?¬§@€îç\(AÐEŸô7>ƒIø@ ö\0B EŸô7>ŽúW?±œT\8AÐEŸô7?Ð×@ÅT\HBEŸô7>ÃÓ@cÏT\ PB,EŸô7?o‹?¡,‹\XAèEŸô7?3=_@¥Œ‘ ŠN&B0¯K3€x­{BjJ‚Ê þÿ0ùý ‚AEŸü({A`F XN &B8¯K3œyn{BjJ‚Ê þÿ0ùý mC@Š„B@ЃD=š)@@  ˜N#è&B@¯K3Õz"{BjJ‚Ê þÿ0ùý mC@ŠUY@ŠTZ=š)@#Þ  (N'Ð&BH¯K3ìzÊ{BjJ‚Ê þÿ0ùý  N+ž&BO¯K4{h{BjJ‚Ê þÿ0ùý mC@Šc[@Šb\=š)@/Ÿ \E ¡=Ú ô@ý^\AàE ¡>s§¡?«œl\ AÐE ¡?¬Šw@€Î¢\(AÐE ¡>ƒŠö@ ü\0B E ¡>Ž›Œ?±§Å\8AÐE ¡?”@ÈÇ\HAðE ¡>¬’@cÊ8\ PB0E ¡?osÙ?¡„\XAèE ¡?3^9@¥»¥ pN/ &BV¯K4{ü{BjJ‚Ê þÿ0ùý mC@Š‘@Š’=Œ@b  N3ˆ&B\¯K4-|ˆ{BjJ‚Ê þÿ0ùý mC@Š‘@Š’=Œ@b  ÈN7p&Ba¯K4A} {BjJ‚Ê þÿ0ùý mC@¥áÜ@¥àÝ=~@Û-  N;X&Be¯K4U}ˆ{BjJ‚Ê þÿ0ùý  âN?@&Bj¯K4h}ý{BjJ‚Ê þÿ0ùý KZ\E D$=Û”@ø§\AðE D$>s'"?«€\(AÐE D$>ƒé@ öW\0B E D$>ŽWŸ?±¯ú\8AÐE D$?$‚@Ë@\HAðE D$>ÂcH@cƐ\ PB4E D$?oO˜? ì±\XAèE D$?3‘K@¥º4 ³NC(&Bn¯K4z~l{BjJ‚Ê þÿ0ùý  ƒNJø&Bx¯K4:{BjJ‚Ê þÿ0ùý mC@¥xŒ@¥wŒ=~@™{ gpsd-3.15/test/daemon/trimble-lassen_iq.log.chk0000664000175000017500000004373612467342657017705 0ustar esresr$GPGSV,3,1,12,26,06,138,00,24,14,077,34,00,00,000,00,00,00,000,00*74 $GPGSV,3,2,12,06,77,232,26,29,14,126,29,02,16,079,38,21,35,257,26*7B $GPGSV,3,3,12,00,00,000,00,30,22,204,32,10,54,073,41,07,40,297,29*7B {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":2.72,"tdop":2.15,"hdop":2.55,"gdop":4.30,"pdop":3.73,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":34,"used":true},{"PRN":6,"el":77,"az":232,"ss":26,"used":true},{"PRN":29,"el":14,"az":126,"ss":29,"used":true},{"PRN":2,"el":16,"az":79,"ss":38,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPGSV,3,1,12,26,06,138,00,24,14,077,32,00,00,000,00,00,00,000,00*72 $GPGSV,3,2,12,06,77,232,26,29,14,126,28,02,16,079,38,21,35,257,26*7A $GPGSV,3,3,12,00,00,000,00,30,22,204,32,10,54,072,42,07,40,297,29*79 {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":2.72,"tdop":2.14,"hdop":2.55,"gdop":4.30,"pdop":3.73,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":32,"used":true},{"PRN":6,"el":77,"az":232,"ss":26,"used":true},{"PRN":29,"el":14,"az":126,"ss":28,"used":true},{"PRN":2,"el":16,"az":79,"ss":38,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPGSV,3,1,12,26,06,138,00,24,14,077,33,00,00,000,00,00,00,000,00*73 $GPGSV,3,2,12,06,77,232,26,29,15,126,27,02,16,079,37,21,35,257,26*7B $GPGSV,3,3,12,00,00,000,00,30,22,204,30,10,54,072,42,07,40,297,29*7B {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":2.72,"tdop":2.14,"hdop":2.55,"gdop":4.30,"pdop":3.73,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":33,"used":true},{"PRN":6,"el":77,"az":232,"ss":26,"used":true},{"PRN":29,"el":15,"az":126,"ss":27,"used":true},{"PRN":2,"el":16,"az":79,"ss":37,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPGSV,3,1,12,26,06,138,00,24,14,077,33,00,00,000,00,00,00,000,00*73 $GPGSV,3,2,12,06,77,232,26,29,15,126,28,02,16,079,37,21,35,257,26*74 $GPGSV,3,3,12,00,00,000,00,30,22,204,32,10,54,072,42,07,40,297,29*79 {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":2.72,"tdop":2.14,"hdop":2.55,"gdop":4.29,"pdop":3.72,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":33,"used":true},{"PRN":6,"el":77,"az":232,"ss":26,"used":true},{"PRN":29,"el":15,"az":126,"ss":28,"used":true},{"PRN":2,"el":16,"az":79,"ss":37,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPZDA,012446.00,26,11,2006,00,00*63 $GPGGA,012446,5332.2649,N,11329.5955,W,1,04,2.55,958.55,M,-19.816,M,,*77 $GPRMC,012446,A,5332.2649,N,11329.5955,W,0.0000,0.000,261106,,*32 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,3.7,2.5,2.7*0E {"class":"TPV","mode":2,"time":"2006-11-26T01:24:46.000Z","ept":0.005,"lat":53.537748090,"lon":-113.493257926,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000} $GPZDA,012447.00,26,11,2006,00,00*62 $GPGGA,012447,5332.2652,N,11329.5949,W,1,04,2.55,959.45,M,-19.816,M,,*71 $GPRMC,012447,A,5332.2652,N,11329.5949,W,0.0000,0.000,261106,,*34 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,3.7,2.5,2.7*0E {"class":"TPV","mode":2,"time":"2006-11-26T01:24:47.000Z","ept":0.005,"lat":53.537752616,"lon":-113.493247951,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012448.00,26,11,2006,00,00*6D $GPGGA,012448,5332.2654,N,11329.5943,W,1,04,5.26,960.35,M,-19.817,M,,*7D $GPRMC,012448,A,5332.2654,N,11329.5943,W,0.0000,0.000,261106,,*37 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.3,5.3,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:48.000Z","ept":0.005,"lat":53.537757142,"lon":-113.493238060,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012449.00,26,11,2006,00,00*6C $GPGGA,012449,5332.2657,N,11329.5937,W,1,04,5.26,961.19,M,-19.817,M,,*73 $GPRMC,012449,A,5332.2657,N,11329.5937,W,0.0000,0.000,261106,,*36 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.3,5.3,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:49.000Z","ept":0.005,"lat":53.537761333,"lon":-113.493228840,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPGSV,3,1,12,26,06,138,00,24,14,077,30,00,00,000,00,00,00,000,00*70 $GPGSV,3,2,12,06,77,231,26,29,15,126,27,02,16,079,37,21,35,257,26*78 $GPGSV,3,3,12,00,00,000,00,30,22,204,33,10,54,072,42,07,40,297,29*78 {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":0.04,"tdop":2.07,"hdop":5.26,"gdop":5.65,"pdop":5.26,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":30,"used":true},{"PRN":6,"el":77,"az":231,"ss":26,"used":true},{"PRN":29,"el":15,"az":126,"ss":27,"used":true},{"PRN":2,"el":16,"az":79,"ss":37,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPZDA,012450.00,26,11,2006,00,00*64 $GPGGA,012450,5332.2659,N,11329.5932,W,1,04,5.26,961.98,M,-19.817,M,,*79 $GPRMC,012450,A,5332.2659,N,11329.5932,W,0.0000,0.000,261106,,*35 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.3,5.3,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:50.000Z","ept":0.005,"lat":53.537765356,"lon":-113.493220207,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012451.00,26,11,2006,00,00*65 $GPGGA,012451,5332.2662,N,11329.5927,W,1,04,5.25,962.71,M,-19.817,M,,*73 $GPRMC,012451,A,5332.2662,N,11329.5927,W,0.0000,0.000,261106,,*38 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.3,5.3,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:51.000Z","ept":0.005,"lat":53.537769212,"lon":-113.493212244,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012452.00,26,11,2006,00,00*66 $GPGGA,012452,5332.2664,N,11329.5923,W,1,04,5.25,963.37,M,-19.817,M,,*71 $GPRMC,012452,A,5332.2664,N,11329.5923,W,0.0000,0.000,261106,,*39 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.3,5.3,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:52.000Z","ept":0.005,"lat":53.537772733,"lon":-113.493205287,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012453.00,26,11,2006,00,00*67 $GPGGA,012453,5332.2666,N,11329.5919,W,1,04,5.25,964.02,M,-19.817,M,,*7A $GPRMC,012453,A,5332.2666,N,11329.5919,W,0.0000,0.000,261106,,*33 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.3,5.3,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:53.000Z","ept":0.005,"lat":53.537776337,"lon":-113.493198330,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012454.00,26,11,2006,00,00*60 $GPGGA,012454,5332.2668,N,11329.5915,W,1,04,5.25,964.60,M,-19.817,M,,*7B $GPRMC,012454,A,5332.2668,N,11329.5915,W,0.0000,0.000,261106,,*36 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.3,5.3,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:54.000Z","ept":0.005,"lat":53.537779522,"lon":-113.493192295,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPGSV,3,1,12,26,06,138,00,24,14,077,30,00,00,000,00,00,00,000,00*70 $GPGSV,3,2,12,06,77,231,26,29,15,126,26,02,16,079,37,21,35,257,26*79 $GPGSV,3,3,12,00,00,000,00,30,22,204,33,10,54,072,42,07,40,297,29*78 {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":0.04,"tdop":2.06,"hdop":5.24,"gdop":5.63,"pdop":5.24,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":30,"used":true},{"PRN":6,"el":77,"az":231,"ss":26,"used":true},{"PRN":29,"el":15,"az":126,"ss":26,"used":true},{"PRN":2,"el":16,"az":79,"ss":37,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPZDA,012455.00,26,11,2006,00,00*61 $GPGGA,012455,5332.2669,N,11329.5912,W,1,04,5.24,965.11,M,-19.817,M,,*7A $GPRMC,012455,A,5332.2669,N,11329.5912,W,0.0000,0.000,261106,,*31 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:55.000Z","ept":0.005,"lat":53.537782372,"lon":-113.493187015,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012456.00,26,11,2006,00,00*62 $GPGGA,012456,5332.2671,N,11329.5909,W,1,04,5.24,965.56,M,-19.817,M,,*79 $GPRMC,012456,A,5332.2671,N,11329.5909,W,0.0000,0.000,261106,,*31 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:56.000Z","ept":0.005,"lat":53.537784803,"lon":-113.493182237,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012457.00,26,11,2006,00,00*63 $GPGGA,012457,5332.2672,N,11329.5907,W,1,04,5.24,965.98,M,-19.817,M,,*77 $GPRMC,012457,A,5332.2672,N,11329.5907,W,0.0000,0.000,261106,,*3D $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:57.000Z","ept":0.005,"lat":53.537786898,"lon":-113.493178046,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012458.00,26,11,2006,00,00*6C $GPGGA,012458,5332.2673,N,11329.5905,W,1,04,5.23,966.35,M,-19.817,M,,*78 $GPRMC,012458,A,5332.2673,N,11329.5905,W,0.0000,0.000,261106,,*31 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:58.000Z","ept":0.005,"lat":53.537788742,"lon":-113.493174190,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012459.00,26,11,2006,00,00*6D $GPGGA,012459,5332.2674,N,11329.5902,W,1,04,5.23,966.69,M,-19.817,M,,*70 $GPRMC,012459,A,5332.2674,N,11329.5902,W,0.0000,0.000,261106,,*30 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:24:59.000Z","ept":0.005,"lat":53.537790335,"lon":-113.493170754,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPGSV,3,1,12,26,06,138,00,24,14,077,29,00,00,000,00,00,00,000,00*78 $GPGSV,3,2,12,06,77,231,26,29,15,126,26,02,16,079,35,21,35,257,26*7B $GPGSV,3,3,12,00,00,000,00,30,22,204,32,10,54,072,43,07,40,297,29*78 {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":0.04,"tdop":2.06,"hdop":5.23,"gdop":5.62,"pdop":5.23,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":29,"used":true},{"PRN":6,"el":77,"az":231,"ss":26,"used":true},{"PRN":29,"el":15,"az":126,"ss":26,"used":true},{"PRN":2,"el":16,"az":79,"ss":35,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPZDA,012500.00,26,11,2006,00,00*60 $GPGGA,012500,5332.2675,N,11329.5900,W,1,04,5.23,967.00,M,-19.817,M,,*70 $GPRMC,012500,A,5332.2675,N,11329.5900,W,0.0000,0.000,261106,,*3E $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:00.000Z","ept":0.005,"lat":53.537791843,"lon":-113.493167485,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":49.89} $GPZDA,012501.00,26,11,2006,00,00*61 $GPGGA,012501,5332.2676,N,11329.5899,W,1,04,5.23,967.28,M,-19.817,M,,*79 $GPRMC,012501,A,5332.2676,N,11329.5899,W,0.0000,0.000,261106,,*3D $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:01.000Z","ept":0.005,"lat":53.537793184,"lon":-113.493164551,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012503.00,26,11,2006,00,00*63 $GPGGA,012503,5332.2677,N,11329.5896,W,1,04,5.22,967.78,M,-19.817,M,,*71 $GPRMC,012503,A,5332.2677,N,11329.5896,W,0.0000,0.000,261106,,*31 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:03.000Z","ept":0.005,"lat":53.537795448,"lon":-113.493159187,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":13.73} $GPZDA,012504.00,26,11,2006,00,00*64 $GPGGA,012504,5332.2678,N,11329.5894,W,1,04,5.22,968.01,M,-19.817,M,,*7A $GPRMC,012504,A,5332.2678,N,11329.5894,W,0.0000,0.000,261106,,*3B $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:04.000Z","ept":0.005,"lat":53.537796370,"lon":-113.493156756,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPGSV,3,1,12,26,06,138,00,24,14,077,29,00,00,000,00,00,00,000,00*78 $GPGSV,3,2,12,06,77,231,26,29,15,126,26,02,16,080,35,21,35,257,26*7D $GPGSV,3,3,12,00,00,000,00,30,22,204,33,10,54,072,43,07,40,297,29*79 {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":0.04,"tdop":2.05,"hdop":5.21,"gdop":5.60,"pdop":5.21,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":29,"used":true},{"PRN":6,"el":77,"az":231,"ss":26,"used":true},{"PRN":29,"el":15,"az":126,"ss":26,"used":true},{"PRN":2,"el":16,"az":80,"ss":35,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPZDA,012505.00,26,11,2006,00,00*65 $GPGGA,012505,5332.2678,N,11329.5893,W,1,04,5.21,968.21,M,-19.817,M,,*7D $GPRMC,012505,A,5332.2678,N,11329.5893,W,0.0000,0.000,261106,,*3D $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:05.000Z","ept":0.005,"lat":53.537797208,"lon":-113.493154493,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012506.00,26,11,2006,00,00*66 $GPGGA,012506,5332.2679,N,11329.5891,W,1,04,5.21,968.41,M,-19.817,M,,*7B $GPRMC,012506,A,5332.2679,N,11329.5891,W,0.0000,0.000,261106,,*3D $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:06.000Z","ept":0.005,"lat":53.537797878,"lon":-113.493152397,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":57.14} $GPZDA,012507.00,26,11,2006,00,00*67 $GPGGA,012507,5332.2679,N,11329.5890,W,1,04,5.20,968.59,M,-19.817,M,,*73 $GPRMC,012507,A,5332.2679,N,11329.5890,W,0.0000,0.000,261106,,*3D $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:07.000Z","ept":0.005,"lat":53.537798549,"lon":-113.493150386,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012508.00,26,11,2006,00,00*68 $GPGGA,012508,5332.2680,N,11329.5889,W,1,04,5.20,968.75,M,-19.817,M,,*7C $GPRMC,012508,A,5332.2680,N,11329.5889,W,0.0000,0.000,261106,,*3C $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:08.000Z","ept":0.005,"lat":53.537799219,"lon":-113.493148458,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012509.00,26,11,2006,00,00*69 $GPGGA,012509,5332.2680,N,11329.5888,W,1,04,5.20,968.91,M,-19.817,M,,*76 $GPRMC,012509,A,5332.2680,N,11329.5888,W,0.0000,0.000,261106,,*3C $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:09.000Z","ept":0.005,"lat":53.537799806,"lon":-113.493146530,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPGSV,3,1,12,26,06,138,00,24,14,077,28,00,00,000,00,00,00,000,00*79 $GPGSV,3,2,12,06,77,231,26,29,15,126,26,02,16,080,35,21,35,257,26*7D $GPGSV,3,3,12,00,00,000,00,30,22,204,30,10,54,072,44,07,40,297,29*7D {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":0.04,"tdop":2.05,"hdop":5.20,"gdop":5.59,"pdop":5.20,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":28,"used":true},{"PRN":6,"el":77,"az":231,"ss":26,"used":true},{"PRN":29,"el":15,"az":126,"ss":26,"used":true},{"PRN":2,"el":16,"az":80,"ss":35,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPZDA,012510.00,26,11,2006,00,00*61 $GPGGA,012510,5332.2680,N,11329.5887,W,1,04,5.20,969.06,M,-19.817,M,,*7E $GPRMC,012510,A,5332.2680,N,11329.5887,W,0.0000,0.000,261106,,*3B $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:10.000Z","ept":0.005,"lat":53.537800393,"lon":-113.493144770,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012511.00,26,11,2006,00,00*60 $GPGGA,012511,5332.2681,N,11329.5886,W,1,04,5.19,969.20,M,-19.817,M,,*71 $GPRMC,012511,A,5332.2681,N,11329.5886,W,0.0000,0.000,261106,,*3A $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:11.000Z","ept":0.005,"lat":53.537800896,"lon":-113.493143010,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012512.00,26,11,2006,00,00*63 $GPGGA,012512,5332.2681,N,11329.5885,W,1,04,5.19,969.33,M,-19.817,M,,*73 $GPRMC,012512,A,5332.2681,N,11329.5885,W,0.0000,0.000,261106,,*3A $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:12.000Z","ept":0.005,"lat":53.537801315,"lon":-113.493141333,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012513.00,26,11,2006,00,00*62 $GPGGA,012513,5332.2681,N,11329.5884,W,1,04,5.18,969.46,M,-19.817,M,,*70 $GPRMC,012513,A,5332.2681,N,11329.5884,W,0.0000,0.000,261106,,*3A $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:13.000Z","ept":0.005,"lat":53.537801650,"lon":-113.493139657,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012514.00,26,11,2006,00,00*65 $GPGGA,012514,5332.2681,N,11329.5883,W,1,04,5.18,969.57,M,-19.817,M,,*70 $GPRMC,012514,A,5332.2681,N,11329.5883,W,0.0000,0.000,261106,,*3A $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:14.000Z","ept":0.005,"lat":53.537802069,"lon":-113.493138064,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPGSV,3,1,12,26,06,138,00,24,14,077,30,00,00,000,00,00,00,000,00*70 $GPGSV,3,2,12,06,77,231,26,29,15,126,26,02,16,080,35,21,35,257,26*7D $GPGSV,3,3,12,00,00,000,00,30,22,204,30,10,54,072,45,07,40,297,29*7C {"class":"SKY","xdop":0.62,"ydop":0.92,"vdop":0.04,"tdop":2.04,"hdop":5.18,"gdop":5.57,"pdop":5.18,"satellites":[{"PRN":26,"el":6,"az":138,"ss":0,"used":true},{"PRN":24,"el":14,"az":77,"ss":30,"used":true},{"PRN":6,"el":77,"az":231,"ss":26,"used":true},{"PRN":29,"el":15,"az":126,"ss":26,"used":true},{"PRN":2,"el":16,"az":80,"ss":35,"used":true},{"PRN":21,"el":35,"az":257,"ss":26,"used":true}]} $GPZDA,012515.00,26,11,2006,00,00*64 $GPGGA,012515,5332.2681,N,11329.5882,W,1,04,5.18,969.68,M,-19.817,M,,*7C $GPRMC,012515,A,5332.2681,N,11329.5882,W,0.0000,0.000,261106,,*3A $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:15.000Z","ept":0.005,"lat":53.537802405,"lon":-113.493136556,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":27.45} $GPZDA,012517.00,26,11,2006,00,00*66 $GPGGA,012517,5332.2682,N,11329.5880,W,1,04,5.18,969.89,M,-19.817,M,,*70 $GPRMC,012517,A,5332.2682,N,11329.5880,W,0.0000,0.000,261106,,*39 $GPGSA,A,2,26,24,6,29,2,21,30,10,7,,,,5.2,5.2,0.0*08 {"class":"TPV","mode":2,"time":"2006-11-26T01:25:17.000Z","ept":0.005,"lat":53.537803243,"lon":-113.493133622,"epx":9.312,"epy":13.727,"track":0.0000,"speed":0.000,"eps":13.73} gpsd-3.15/test/daemon/triton400.log0000664000175000017500000000374512461156335015254 0ustar esresr# Name: Magellan Triton 400 # Chipset: SirfStar III # Firmware: GSW3.2.4 # Date: 2013-03-31 # Submitter: = James Gerlach # Location: Wellington, FL, USA, 26d39mN 80d15mW # Note: There's a malformed unterminated GGA packet on line 12 $GPGSV,3,1,11,08,75,303,44,07,66,172,51,11,51,055,36,28,39,325,36*76 $GPGSV,3,2,11,17,31,254,51,26,13,295,51,09,12,322,36,19,12,046,51*76 $GPGSV,3,3,11,20,09,138,36,13,04,183,51,32,03,113,44,,,,*44 $GPGLL,2638.1726,N,08011.3892,W,030129.000,A,A*47 $GPGGA,030129.00,2638.1726,N,08011.3892,W,1,06,1.5,00016,M,-0028,M,,*50 $GPRMC,030129.0,A,2638.1726,N,08011.3892,W,0.00,219.6,010413,,*26 $GPGSA,A,3,08,07,11,28,17,26,,,,,,,02.6,01.5,02.1*06 $GPGSV,3,1,11,08,75,303,44,07,66,172,51,11,51,055,36,28,39,325,36*76 $GPGSV,3,2,11,17,31,254,51,26,13,295,51,09,12,322,36,19,12,046,51*76 $GPGSV,3,3,11,20,09,138,36,13,04,183,51,32,03,113,44,,,,*44 $GPGLL,2638.1727,N,08011.3892,W,030130.000,A,A*4E $GPGGA,030130$GPGLL,2638.1728,N,08011.3893,W,030131.000,A,A*41 $GPGGA,030131.00,2638.1728,N,08011.3893,W,1,06,1.5,00016,M,-0028,M,,*56 $GPRMC,030131.0,A,2638.1728,N,08011.3893,W,0.00,219.6,010413,,*20 $GPGSA,A,3,08,07,11,28,17,26,,,,,,,02.6,01.5,02.1*06 $GPGSV,3,1,11,08,75,303,44,07,66,172,51,11,51,055,36,28,39,325,36*76 $GPGSV,3,2,11,17,31,254,51,26,13,295,51,09,12,322,36,19,12,046,51*76 $GPGSV,3,3,11,20,09,138,36,13,04,183,51,32,03,113,44,,,,*44 $GPGLL,2638.1750,N,08011.3902,W,030132.000,A,A*44 $GPGGA,030132.00,2638.1750,N,08011.3902,W,1,06,1.5,00019,M,-0028,M,,*5C $GPRMC,030132.0,A,2638.1750,N,08011.3902,W,0.00,219.6,010413,,*25 $GPGSA,A,3,08,07,11,28,17,26,,,,,,,02.6,01.5,02.1*06 $GPGSV,3,1,11,08,75,303,44,07,66,172,51,11,51,055,36,28,39,325,36*76 $GPGSV,3,2,11,17,31,254,51,26,13,295,51,09,12,322,36,19,12,046,36*77 $GPGSV,3,3,11,20,09,138,36,13,04,183,51,32,03,113,44,,,,*44 $GPGLL,2638.1753,N,08011.3903,W,030133.000,A,A*47 $GPGGA,030133.00,2638.1753,N,08011.3903,W,1,06,1.5,00020,M,-0028,M,,*55 $GPRMC,030133.0,A,2638.1753,N,08011.3903,W,0.00,219.6,010413,,*26 gpsd-3.15/test/daemon/triton400.log.chk0000664000175000017500000001335412467340617016021 0ustar esresr$GPGSV,3,1,11,08,75,303,44,07,66,172,51,11,51,055,36,28,39,325,36*76 $GPGSV,3,2,11,17,31,254,51,26,13,295,51,09,12,322,36,19,12,046,51*76 $GPGSV,3,3,11,20,09,138,36,13,04,183,51,32,03,113,44,,,,*44 {"class":"SKY","satellites":[{"PRN":8,"el":75,"az":303,"ss":44,"used":false},{"PRN":7,"el":66,"az":172,"ss":51,"used":false},{"PRN":11,"el":51,"az":55,"ss":36,"used":false},{"PRN":28,"el":39,"az":325,"ss":36,"used":false},{"PRN":17,"el":31,"az":254,"ss":51,"used":false},{"PRN":26,"el":13,"az":295,"ss":51,"used":false},{"PRN":9,"el":12,"az":322,"ss":36,"used":false},{"PRN":19,"el":12,"az":46,"ss":51,"used":false},{"PRN":20,"el":9,"az":138,"ss":36,"used":false},{"PRN":13,"el":4,"az":183,"ss":51,"used":false},{"PRN":32,"el":3,"az":113,"ss":44,"used":false}]} $GPGLL,2638.1726,N,08011.3892,W,030129.000,A,A*47 {"class":"TPV","mode":2,"lat":26.636210000,"lon":-80.189820000} $GPGGA,030129.00,2638.1726,N,08011.3892,W,1,06,1.5,00016,M,-0028,M,,*50 {"class":"TPV","mode":3,"lat":26.636210000,"lon":-80.189820000,"alt":16.000} $GPRMC,030129.0,A,2638.1726,N,08011.3892,W,0.00,219.6,010413,,*26 {"class":"TPV","mode":3,"time":"2013-04-01T03:01:29.000Z","ept":0.005,"lat":26.636210000,"lon":-80.189820000,"alt":16.000,"track":219.6000,"speed":0.000} $GPGSA,A,3,08,07,11,28,17,26,,,,,,,02.6,01.5,02.1*06 {"class":"TPV","mode":3,"time":"2013-04-01T03:01:29.000Z","ept":0.005,"lat":26.636210000,"lon":-80.189820000,"alt":16.000,"epv":48.300,"track":219.6000,"speed":0.000,"climb":0.000} $GPGSV,3,1,11,08,75,303,44,07,66,172,51,11,51,055,36,28,39,325,36*76 $GPGSV,3,2,11,17,31,254,51,26,13,295,51,09,12,322,36,19,12,046,51*76 $GPGSV,3,3,11,20,09,138,36,13,04,183,51,32,03,113,44,,,,*44 {"class":"SKY","xdop":1.31,"ydop":1.26,"vdop":2.10,"tdop":2.26,"hdop":1.50,"gdop":3.96,"pdop":2.60,"satellites":[{"PRN":8,"el":75,"az":303,"ss":44,"used":true},{"PRN":7,"el":66,"az":172,"ss":51,"used":true},{"PRN":11,"el":51,"az":55,"ss":36,"used":true},{"PRN":28,"el":39,"az":325,"ss":36,"used":true},{"PRN":17,"el":31,"az":254,"ss":51,"used":true},{"PRN":26,"el":13,"az":295,"ss":51,"used":true},{"PRN":9,"el":12,"az":322,"ss":36,"used":false},{"PRN":19,"el":12,"az":46,"ss":51,"used":false},{"PRN":20,"el":9,"az":138,"ss":36,"used":false},{"PRN":13,"el":4,"az":183,"ss":51,"used":false},{"PRN":32,"el":3,"az":113,"ss":44,"used":false}]} $GPGLL,2638.1727,N,08011.3892,W,030130.000,A,A*4E $GPGLL,2638.1728,N,08011.3893,W,030131.000,A,A*41 {"class":"TPV","mode":2,"time":"2013-04-01T03:01:31.000Z","ept":0.005,"lat":26.636213333,"lon":-80.189821667,"epx":19.621,"epy":18.879,"speed":0.248,"eps":39.24} $GPGGA,030131.00,2638.1728,N,08011.3893,W,1,06,1.5,00016,M,-0028,M,,*56 $GPRMC,030131.0,A,2638.1728,N,08011.3893,W,0.00,219.6,010413,,*20 {"class":"TPV","mode":3,"time":"2013-04-01T03:01:31.000Z","ept":0.005,"lat":26.636213333,"lon":-80.189821667,"alt":16.000,"epx":19.621,"epy":18.879,"epv":48.300,"track":219.6000,"speed":0.000,"climb":0.000,"eps":39.24} $GPGSA,A,3,08,07,11,28,17,26,,,,,,,02.6,01.5,02.1*06 $GPGSV,3,1,11,08,75,303,44,07,66,172,51,11,51,055,36,28,39,325,36*76 $GPGSV,3,2,11,17,31,254,51,26,13,295,51,09,12,322,36,19,12,046,51*76 $GPGSV,3,3,11,20,09,138,36,13,04,183,51,32,03,113,44,,,,*44 {"class":"SKY","xdop":1.31,"ydop":1.26,"vdop":2.10,"tdop":2.26,"hdop":1.50,"gdop":3.96,"pdop":2.60,"satellites":[{"PRN":8,"el":75,"az":303,"ss":44,"used":true},{"PRN":7,"el":66,"az":172,"ss":51,"used":true},{"PRN":11,"el":51,"az":55,"ss":36,"used":true},{"PRN":28,"el":39,"az":325,"ss":36,"used":true},{"PRN":17,"el":31,"az":254,"ss":51,"used":true},{"PRN":26,"el":13,"az":295,"ss":51,"used":true},{"PRN":9,"el":12,"az":322,"ss":36,"used":false},{"PRN":19,"el":12,"az":46,"ss":51,"used":false},{"PRN":20,"el":9,"az":138,"ss":36,"used":false},{"PRN":13,"el":4,"az":183,"ss":51,"used":false},{"PRN":32,"el":3,"az":113,"ss":44,"used":false}]} $GPGLL,2638.1750,N,08011.3902,W,030132.000,A,A*44 {"class":"TPV","mode":2,"time":"2013-04-01T03:01:32.000Z","ept":0.005,"lat":26.636250000,"lon":-80.189836667,"epx":19.621,"epy":18.879,"speed":4.328,"eps":39.24} $GPGGA,030132.00,2638.1750,N,08011.3902,W,1,06,1.5,00019,M,-0028,M,,*5C $GPRMC,030132.0,A,2638.1750,N,08011.3902,W,0.00,219.6,010413,,*25 {"class":"TPV","mode":3,"time":"2013-04-01T03:01:32.000Z","ept":0.005,"lat":26.636250000,"lon":-80.189836667,"alt":19.000,"epx":19.621,"epy":18.879,"epv":48.300,"track":219.6000,"speed":0.000,"climb":0.000,"eps":39.24} $GPGSA,A,3,08,07,11,28,17,26,,,,,,,02.6,01.5,02.1*06 $GPGSV,3,1,11,08,75,303,44,07,66,172,51,11,51,055,36,28,39,325,36*76 $GPGSV,3,2,11,17,31,254,51,26,13,295,51,09,12,322,36,19,12,046,36*77 $GPGSV,3,3,11,20,09,138,36,13,04,183,51,32,03,113,44,,,,*44 {"class":"SKY","xdop":1.31,"ydop":1.26,"vdop":2.10,"tdop":2.26,"hdop":1.50,"gdop":3.96,"pdop":2.60,"satellites":[{"PRN":8,"el":75,"az":303,"ss":44,"used":true},{"PRN":7,"el":66,"az":172,"ss":51,"used":true},{"PRN":11,"el":51,"az":55,"ss":36,"used":true},{"PRN":28,"el":39,"az":325,"ss":36,"used":true},{"PRN":17,"el":31,"az":254,"ss":51,"used":true},{"PRN":26,"el":13,"az":295,"ss":51,"used":true},{"PRN":9,"el":12,"az":322,"ss":36,"used":false},{"PRN":19,"el":12,"az":46,"ss":36,"used":false},{"PRN":20,"el":9,"az":138,"ss":36,"used":false},{"PRN":13,"el":4,"az":183,"ss":51,"used":false},{"PRN":32,"el":3,"az":113,"ss":44,"used":false}]} $GPGLL,2638.1753,N,08011.3903,W,030133.000,A,A*47 {"class":"TPV","mode":2,"time":"2013-04-01T03:01:33.000Z","ept":0.005,"lat":26.636255000,"lon":-80.189838333,"epx":19.621,"epy":18.879,"speed":0.578,"eps":39.24} $GPGGA,030133.00,2638.1753,N,08011.3903,W,1,06,1.5,00020,M,-0028,M,,*55 $GPRMC,030133.0,A,2638.1753,N,08011.3903,W,0.00,219.6,010413,,*26 {"class":"TPV","mode":3,"time":"2013-04-01T03:01:33.000Z","ept":0.005,"lat":26.636255000,"lon":-80.189838333,"alt":20.000,"epx":19.621,"epy":18.879,"epv":48.300,"track":219.6000,"speed":0.000,"climb":0.000,"eps":39.24} gpsd-3.15/test/daemon/ublox-aek-4t.log0000664000175000017500000001236512467342657015735 0ustar esresr# Name: Antaris 4 Timing Evaluation Kit (AEK-4T) # Chipset: Antaris 4 # Submitter: Chris Kuethe # Date: 2007-12-23 # Location: Playa del Carmen, Mexico. 20.63N/87.07W # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # µbu-blox ag - www.u-blox.com#<µbANTARIS ATR062x HW 00040001®ëµb+EXT CORE 5.00 May 11 2006 14:40:17äµb+INT EXT0 (RCV) M4T1.2 May 11 2006 14:40:17Õ{µbLIC 85E7-6E21-710B-0272-42DC'&µb BIST: passed µbANTSUPERV=AC SD PDoS ñ̵b ANTSTATUS=OK°“µbÈú³ÀjÀX‡o™A…c+¯i\sA,@E ‚3!|ۜA<µdŠ*÷uA]Ú*Ä!X”ÞVA—4hUvA«ìyÄ2šé«< žA”q;:E‹vAž*Ä(1hC›\âA™Ò[ÜB¿vA¥T®Ä )WWøXAyY?ÔOvA!é'E)©1âpŒÏ§A)æë÷Æ‚A˜;vD‡-ØÛWËãsA—8(E†”µb HáùæS³8µb :ú³3_ãÎòpY2_LÔñ_júòqÙ2p461¥ÿ_?ûò q®2 p 2 _­Œò pÉ2 _Ýò_×äòpC2_Gôò_Žàòpÿ2_IŸò_vŒò_6ò_îøò_Ãò_X,ò_íòptB1_'ôò_fÙòϛ7òqê2_áò Ïäåòx¥ÿy¥ÿz¥ÿ{¥ÿ|¥ÿ}¥ÿ~¥ÿ¥ÿ€¥ÿ¥ÿ‚¥ÿƒ¥ÿ„¥ÿ…¥ÿ†¥ÿ‡vû!Dˆ¥ÿ‰¥ÿŠ_â9ôZàµb4úœüÿÿ³Ÿ#ÒÓsÜÕ]O H Íʵbú$…ȧ˜E3–µbúŸ„F欄µb úœüÿÿ³»ëµb!ú[ºðÿ×  £˜µb"ú$Áðÿýÿÿ\ µb0Èú Bt C¢üÿÿ,XYüüÿÿ2êŽýÿÿ(ÙR )ÉÅ)ÿ›  6 ‡-!ûÃùÿÿ 64 ® z÷õb1žú?B0.   ‡ z •^µb2Žú‡Âÿ'ðÿ-Q òÿ[Âÿ ‡ ìÿՏ'— zÿ®œµb* ‡ÿŸ šÿÀÿ_Àìýÿü_y–@š—ã—Ê€jüᬀµbÈöú³À&›‡fo™AÁH±P\sA-E ‚?¹±†ÛœAZÂ6Ž2÷uAö’+Ä !tÜ4îVAvL#UvAÔCzÄ2šÕï➝A)Í"±R‹vA±9Ä(1È?irâAŸ„rpS¿vA¥œ®Ä )W£ %.A†ã/vA’Ñ'E)©ƒïŸ„ϧAš}øÁ‚AŒ=vD‡-èQ|ßkãsA— (Eõ/µb 0åùµ³£µb :öú³3_ãÎòpY2_LÔñ_júòqÙ2p461¥ÿ_?ûò q®2 p 2 _­Œò pÉ2 _Ýò_×äòpC2_Gôò_Žàòpÿ2_IŸò_vŒò_6ò_îøò_Ãò_X,ò_íòptB1_'ôò_fÙòϛ7òqê2_áò Ïäåòx¥ÿy¥ÿz¥ÿ{¥ÿ|¥ÿ}¥ÿ~¥ÿ¥ÿ€¥ÿ¥ÿ‚¥ÿƒ¥ÿ„¥ÿ…¥ÿ†¥ÿ‡vû!Dˆ¥ÿ‰¥ÿŠ_â9ôEµb4÷úÿÿÿ³Ÿ#ÒÓsÜÔ]O H .€µb÷ú$…ǧ˜Eµb÷úŸ„Föé‚Úµb ÷úÿÿÿ³µb!÷úÎŒðÿ×  mµb"÷ú±Ÿðÿýÿÿ\Œµb0È÷ú Bt CŽüÿÿ,X Yâüÿÿ2ê¹ýÿÿ(Ù )ÉÀ)ÿž  6 ‡-!ûÆùÿÿ 64 ® z÷Õðµb1ž÷ú?B   ‡ z "µb2Ž÷ú‡Àÿðÿ'îÿ-Q [Àÿ ‡ èÿՏ— zÿp€µb* ‡ÿŸÆÿùÿßÿõÿÁ?üøÿÿ¹•ÿa9—»üŠó…äå,¡µbÈÞú³ÀÞ#ºEo™Ab²7\sAòSE!‚ß]b‘ÛœA€ „æ:÷uA|Ö*Ä!!@ÕÖýVAª×)0/UvA"zÄ2šBŠ/žA,“K`‹vA4/Ä(1Lö7ˆâAÑï# d¿vAäy®Ä )W×x1Ac‘tøvAœÐ'E)©ûH }ϧAŠm¡?»‚A ÏuD‡-ЎŽLãsA—\(EZ̵b éùVŽÿÿ³ߢµb :Þú³3_ãÎòpY2_LÔñ_júòqÙ2p461¥ÿ_?ûò q®2 p 2 _­Œò pÉ2 _Ýò_×äòpC2_Gôò_Žàòpÿ2_IŸò_vŒò_6ò_îøò_Ãò_X,ò_íòptB1_'ôò_fÙòϛ7òqê2_áò Ïäåòx¥ÿy¥ÿz¥ÿ{¥ÿ|¥ÿ}¥ÿ~¥ÿ¥ÿ€¥ÿ¥ÿ‚¥ÿƒ¥ÿ„¥ÿ…¥ÿ†¥ÿ‡vû!Dˆ¥ÿ‰¥ÿŠ_â9ô1µb4ßú³Ÿ$ÒÓsÜÒ]O H ‘µbßú$…ǧ˜E ¥µbßúŸ„FÞíZBµb ßú³~Zµb!ßú@¿ðÿ×  fTµb"ßú?ŒðÿŽýÿÿ\Aµb0Èßú Bt!CÁüÿÿ,X!Yƒüÿÿ2êÅýÿÿ(Ù2 )ɹ)ÿd  6 ‡-!ûÕùÿÿ 64 ® z÷_Àµb1žßú?Bt   ‡ z ‚©µb2Žßú‡ßÿîÿ'ìÿ-Q [ßÿ ‡ äÿՏ— zÿ’µb* ‡7hfS Àÿý€ÿ€fQF§ÑÌé.èµbÈÆú³Àrí$o™AË º\sA€&E ‚ÀœÛœAåýûC÷uA Î*Ä !,’w WA|ñ!;UvAhzÄ2š)Ÿ/AžAŒˆì–m‹vA¶/Ä(1फ़âAF žŠt¿vA«®Ä *WF=ڝAO{Ú ðvAÞç'E*©c×ZuϧA~2Ydµ‚AèEvD‡,dK‡:,ãsA—^(E–rµb íùE ³Iµb :Æú³3_ãÎòpY2_LÔñ_júòqÙ2p461¥ÿ_?ûò q®2 p 2 _­Œò pÉ2 _Ýò_×äòpC2_Gôò_Žàòpÿ2_IŸò_vŒò_6ò_îøò_Ãò_X,ò_íòptB1_'ôò_fÙòϛ7òqê2_áò Ïäåòx¥ÿy¥ÿz¥ÿ{¥ÿ|¥ÿ}¥ÿ~¥ÿ¥ÿ€¥ÿ¥ÿ‚¥ÿƒ¥ÿ„¥ÿ…¥ÿ†¥ÿ‡vû!Dˆ¥ÿ‰¥ÿŠ_â9ôµb4Çúô³Ÿ$ÒÓsÜÑ]O H ïK gpsd-3.15/test/daemon/ublox-aek-4t.log.chk0000664000175000017500000000736712467342657016507 0ustar esresr$GPZDA,231122.00,23,12,2007,00,00*60 $GPGGA,231121,2037.7569,N,08704.0845,W,2,07,,75.78,M,-13.865,M,,*58 $GPRMC,231121,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*31 $GPGSA,A,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.0,0.0,0.0*32 {"class":"TPV","mode":3,"time":"2007-12-23T23:11:21.999Z","ept":0.005,"lat":20.629282026,"lon":-87.068075525,"alt":75.777,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.17} $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","xdop":0.79,"ydop":1.64,"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}]} $GPZDA,231125.00,23,12,2007,00,00*67 $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,15,2,30,5,12,18,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*0F {"class":"TPV","mode":3,"time":"2007-12-23T23:11:24.999Z","ept":0.005,"lat":20.629281973,"lon":-87.068075520,"alt":75.764,"epx":2.973,"epy":6.138,"epv":11.500,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.17,"epc":23.00} $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","xdop":0.79,"ydop":1.64,"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}]} $GPZDA,231126.00,23,12,2007,00,00*64 $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,15,2,30,5,12,18,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*0F {"class":"TPV","mode":3,"time":"2007-12-23T23:11:25.999Z","ept":0.005,"lat":20.629281802,"lon":-87.068075424,"alt":75.757,"epx":2.973,"epy":6.138,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.17,"epc":22.94} $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","xdop":0.79,"ydop":1.64,"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}]} $GPZDA,231127.00,23,12,2007,00,00*65 $GPGGA,231126,2037.7569,N,08704.0845,W,2,07,1.67,75.75,M,-13.865,M,,*4C $GPRMC,231126,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*36 $GPGSA,A,3,15,2,30,5,12,18,135,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*0F {"class":"TPV","mode":3,"time":"2007-12-23T23:11:26.999Z","ept":0.005,"lat":20.629281718,"lon":-87.068075424,"alt":75.754,"epx":2.973,"epy":6.138,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.17,"epc":22.89} gpsd-3.15/test/daemon/ublox-lea-4h.log0000664000175000017500000001324112467342657015714 0ustar esresr# Name: u-blox LEA-4H module # Chipset: ANTARIS # Description: u-blox LEA-4H module # Submitter: "Dave Hylands" dhylands@gmail.com # Date: 2006-08-10 # Location: Surrey, British Columbia, Canada, 49.126356N 122.710015W # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPZDA,030807.00,10,08,2006,00,00*67 $GPRMC,030851.00,V,,,,,,,100806,,,N*7D $GPVTG,,,,,,,,,N*30 $GPGGA,030851.00,,,,,0,03,9.93,,,,,,*59 $GPGSA,A,1,28,04,02,,,,,,,,,,9.98,9.93,1.00*06 $GPGSV,1,1,03,28,28,095,33,04,30,150,46,02,07,178,32*4D $GPGLL,,,,,030851.00,V,N*45 $GPZDA,030851.00,10,08,2006,00,00*64 $GPRMC,030852.00,V,,,,,,,100806,,,N*7E $GPVTG,,,,,,,,,N*30 $GPGGA,030852.00,,,,,0,03,9.93,,,,,,*5A $GPGSA,A,1,28,04,02,,,,,,,,,,9.98,9.93,1.00*06 $GPGSV,1,1,03,28,28,095,33,04,30,150,45,02,07,178,33*4F $GPGLL,,,,,030852.00,V,N*46 $GPZDA,030852.00,10,08,2006,00,00*67 $GPRMC,030853.00,V,,,,,,,100806,,,N*7F $GPVTG,,,,,,,,,N*30 $GPGGA,030853.00,,,,,0,03,9.94,,,,,,*5C $GPGSA,A,1,28,04,02,,,,,,,,,,9.99,9.94,1.00*00 $GPGSV,1,1,03,28,28,095,33,04,30,150,45,02,07,178,32*4E $GPGLL,,,,,030853.00,V,N*47 $GPZDA,030853.00,10,08,2006,00,00*66 $GPRMC,030857.00,V,,,,,,,100806,,,N*7B $GPVTG,,,,,,,,,N*30 $GPGGA,030857.00,,,,,0,03,9.96,,,,,,*5A $GPGSA,A,1,28,04,02,,,,,,,,,,10.01,9.96,1.00*3B $GPGSV,1,1,03,28,28,095,33,04,30,150,45,02,07,178,32*4E $GPGLL,,,,,030857.00,V,N*43 $GPZDA,030857.00,10,08,2006,00,00*62 $GPRMC,030858.00,A,4907.85331,N,12243.19743,W,1.049,323.14,100806,,,A*76 $GPVTG,323.14,T,,M,1.049,N,1.943,K,A*39 $GPGGA,030858.00,4907.85331,N,12243.19743,W,1,03,9.97,516.7,M,-16.7,M,,*6C $GPGSA,A,2,28,04,02,,,,,,,,,,10.02,9.97,1.00*3A $GPGSV,1,1,03,28,28,095,33,04,30,150,45,02,07,178,31*4D $GPGLL,4907.85331,N,12243.19743,W,030858.00,A,A*75 $GPZDA,030858.00,10,08,2006,00,00*6D $GPRMC,030859.00,A,4907.85396,N,12243.19848,W,1.321,323.21,100806,,,A*75 $GPVTG,323.21,T,,M,1.321,N,2.448,K,A*37 $GPGGA,030859.00,4907.85396,N,12243.19848,W,1,03,9.97,516.7,M,-16.7,M,,*64 $GPGSA,A,2,28,04,02,,,,,,,,,,10.02,9.97,1.00*3A $GPGSV,1,1,03,28,28,095,32,04,30,150,46,02,07,178,32*4C $GPGLL,4907.85396,N,12243.19848,W,030859.00,A,A*7D $GPZDA,030859.00,10,08,2006,00,00*6C $GPRMC,030900.00,A,4907.85424,N,12243.19882,W,1.324,323.26,100806,,,A*72 $GPVTG,323.26,T,,M,1.324,N,2.454,K,A*38 $GPGGA,030900.00,4907.85424,N,12243.19882,W,1,03,9.98,516.7,M,-16.7,M,,*6E $GPGSA,A,2,28,04,02,,,,,,,,,,10.03,9.98,1.00*34 $GPGSV,1,1,03,28,28,095,33,04,30,150,46,02,07,178,32*4D $GPGLL,4907.85424,N,12243.19882,W,030900.00,A,A*78 $GPZDA,030900.00,10,08,2006,00,00*61 $GPRMC,030901.00,A,4907.85444,N,12243.19906,W,1.458,323.25,100806,,,A*77 $GPVTG,323.25,T,,M,1.458,N,2.702,K,A*37 $GPGGA,030901.00,4907.85444,N,12243.19906,W,1,03,9.99,516.7,M,-16.7,M,,*65 $GPGSA,A,2,28,04,02,,,,,,,,,,10.04,9.99,1.00*32 $GPGSV,1,1,03,28,28,095,32,04,30,150,45,02,07,178,32*4F $GPGLL,4907.85444,N,12243.19906,W,030901.00,A,A*72 $GPZDA,030901.00,10,08,2006,00,00*60 $GPRMC,031007.00,V,,,,,,,100806,,,N*77 $GPVTG,,,,,,,,,N*30 $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 $GPGLL,,,,,031007.00,V,N*4F $GPZDA,031007.00,10,08,2006,00,00*6E $GPRMC,031008.00,A,4907.58133,N,12242.60088,W,2.550,220.86,100806,,,A*72 $GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34 $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 $GPGLL,4907.58133,N,12242.60088,W,031008.00,A,A*76 $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 $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 $GPGLL,4907.58122,N,12242.60101,W,031009.00,A,A*77 $GPZDA,031009.00,10,08,2006,00,00*60 $GPRMC,031516.00,A,4907.56801,N,12242.61073,W,0.084,39.14,100806,,,A*44 $GPVTG,39.14,T,,M,0.084,N,0.155,K,A*0F $GPGGA,031516.00,4907.56801,N,12242.61073,W,1,09,1.13,99.1,M,-16.7,M,,*5C $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 $GPGLL,4907.56801,N,12242.61073,W,031516.00,A,A*7F $GPZDA,031516.00,10,08,2006,00,00*6B $GPRMC,031517.00,A,4907.56809,N,12242.61069,W,0.084,39.37,100806,,,A*47 $GPVTG,39.37,T,,M,0.084,N,0.156,K,A*0D $GPGGA,031517.00,4907.56809,N,12242.61069,W,1,09,1.13,98.8,M,-16.7,M,,*56 $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 $GPGLL,4907.56809,N,12242.61069,W,031517.00,A,A*7D $GPZDA,031517.00,10,08,2006,00,00*6A $GPRMC,031518.00,A,4907.56818,N,12242.61064,W,0.084,39.58,100806,,,A*4C $GPVTG,39.58,T,,M,0.084,N,0.155,K,A*07 $GPGGA,031518.00,4907.56818,N,12242.61064,W,1,09,1.13,98.5,M,-16.7,M,,*59 $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,2.20,1.13,1.89*03 $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 $GPGLL,4907.56818,N,12242.61064,W,031518.00,A,A*7F gpsd-3.15/test/daemon/ublox-lea-4h.log.chk0000664000175000017500000003062212474333117016447 0ustar esresr$GPZDA,030807.00,10,08,2006,00,00*67 $GPRMC,030851.00,V,,,,,,,100806,,,N*7D $GPVTG,,,,,,,,,N*30 $GPGGA,030851.00,,,,,0,03,9.93,,,,,,*59 $GPGSA,A,1,28,04,02,,,,,,,,,,9.98,9.93,1.00*06 {"class":"TPV","mode":1,"time":"2006-08-10T03:08:07.000Z","ept":0.005} $GPGSV,1,1,03,28,28,095,33,04,30,150,46,02,07,178,32*4D {"class":"SKY","vdop":1.00,"hdop":9.93,"pdop":9.98,"satellites":[{"PRN":28,"el":28,"az":95,"ss":33,"used":true},{"PRN":4,"el":30,"az":150,"ss":46,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true}]} $GPGLL,,,,,030851.00,V,N*45 $GPZDA,030851.00,10,08,2006,00,00*64 $GPRMC,030852.00,V,,,,,,,100806,,,N*7E $GPVTG,,,,,,,,,N*30 $GPGGA,030852.00,,,,,0,03,9.93,,,,,,*5A $GPGSA,A,1,28,04,02,,,,,,,,,,9.98,9.93,1.00*06 {"class":"TPV","mode":1,"time":"2006-08-10T03:08:51.000Z","ept":0.005} $GPGSV,1,1,03,28,28,095,33,04,30,150,45,02,07,178,33*4F {"class":"SKY","vdop":1.00,"hdop":9.93,"pdop":9.98,"satellites":[{"PRN":28,"el":28,"az":95,"ss":33,"used":true},{"PRN":4,"el":30,"az":150,"ss":45,"used":true},{"PRN":2,"el":7,"az":178,"ss":33,"used":true}]} $GPGLL,,,,,030852.00,V,N*46 {"class":"TPV","mode":0,"time":"2006-08-10T03:08:52.000Z","ept":0.005} $GPZDA,030852.00,10,08,2006,00,00*67 $GPRMC,030853.00,V,,,,,,,100806,,,N*7F $GPVTG,,,,,,,,,N*30 $GPGGA,030853.00,,,,,0,03,9.94,,,,,,*5C $GPGSA,A,1,28,04,02,,,,,,,,,,9.99,9.94,1.00*00 $GPGSV,1,1,03,28,28,095,33,04,30,150,45,02,07,178,32*4E {"class":"SKY","vdop":1.00,"hdop":9.94,"pdop":9.99,"satellites":[{"PRN":28,"el":28,"az":95,"ss":33,"used":true},{"PRN":4,"el":30,"az":150,"ss":45,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true}]} $GPGLL,,,,,030853.00,V,N*47 {"class":"TPV","mode":0,"time":"2006-08-10T03:08:53.000Z","ept":0.005} $GPZDA,030853.00,10,08,2006,00,00*66 $GPRMC,030857.00,V,,,,,,,100806,,,N*7B $GPVTG,,,,,,,,,N*30 $GPGGA,030857.00,,,,,0,03,9.96,,,,,,*5A $GPGSA,A,1,28,04,02,,,,,,,,,,10.01,9.96,1.00*3B $GPGSV,1,1,03,28,28,095,33,04,30,150,45,02,07,178,32*4E {"class":"SKY","vdop":1.00,"hdop":9.96,"pdop":10.01,"satellites":[{"PRN":28,"el":28,"az":95,"ss":33,"used":true},{"PRN":4,"el":30,"az":150,"ss":45,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true}]} $GPGLL,,,,,030857.00,V,N*43 {"class":"TPV","mode":0,"time":"2006-08-10T03:08:57.000Z","ept":0.005} $GPZDA,030857.00,10,08,2006,00,00*62 $GPRMC,030858.00,A,4907.85331,N,12243.19743,W,1.049,323.14,100806,,,A*76 $GPVTG,323.14,T,,M,1.049,N,1.943,K,A*39 $GPGGA,030858.00,4907.85331,N,12243.19743,W,1,03,9.97,516.7,M,-16.7,M,,*6C $GPGSA,A,2,28,04,02,,,,,,,,,,10.02,9.97,1.00*3A $GPGSV,1,1,03,28,28,095,33,04,30,150,45,02,07,178,31*4D {"class":"SKY","vdop":1.00,"hdop":9.97,"pdop":10.02,"satellites":[{"PRN":28,"el":28,"az":95,"ss":33,"used":true},{"PRN":4,"el":30,"az":150,"ss":45,"used":true},{"PRN":2,"el":7,"az":178,"ss":31,"used":true}]} $GPGLL,4907.85331,N,12243.19743,W,030858.00,A,A*75 {"class":"TPV","mode":3,"time":"2006-08-10T03:08:58.000Z","ept":0.005,"lat":49.130888500,"lon":-122.719957167,"alt":516.700,"epv":23.000,"track":323.1400,"speed":0.540,"climb":0.000} $GPZDA,030858.00,10,08,2006,00,00*6D $GPRMC,030859.00,A,4907.85396,N,12243.19848,W,1.321,323.21,100806,,,A*75 $GPVTG,323.21,T,,M,1.321,N,2.448,K,A*37 $GPGGA,030859.00,4907.85396,N,12243.19848,W,1,03,9.97,516.7,M,-16.7,M,,*64 $GPGSA,A,2,28,04,02,,,,,,,,,,10.02,9.97,1.00*3A $GPGSV,1,1,03,28,28,095,32,04,30,150,46,02,07,178,32*4C {"class":"SKY","vdop":1.00,"hdop":9.97,"pdop":10.02,"satellites":[{"PRN":28,"el":28,"az":95,"ss":32,"used":true},{"PRN":4,"el":30,"az":150,"ss":46,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true}]} $GPGLL,4907.85396,N,12243.19848,W,030859.00,A,A*7D {"class":"TPV","mode":3,"time":"2006-08-10T03:08:59.000Z","ept":0.005,"lat":49.130899333,"lon":-122.719974667,"alt":516.700,"epv":23.000,"track":323.2100,"speed":0.680,"climb":0.000} $GPZDA,030859.00,10,08,2006,00,00*6C $GPRMC,030900.00,A,4907.85424,N,12243.19882,W,1.324,323.26,100806,,,A*72 $GPVTG,323.26,T,,M,1.324,N,2.454,K,A*38 $GPGGA,030900.00,4907.85424,N,12243.19882,W,1,03,9.98,516.7,M,-16.7,M,,*6E $GPGSA,A,2,28,04,02,,,,,,,,,,10.03,9.98,1.00*34 $GPGSV,1,1,03,28,28,095,33,04,30,150,46,02,07,178,32*4D {"class":"SKY","vdop":1.00,"hdop":9.98,"pdop":10.03,"satellites":[{"PRN":28,"el":28,"az":95,"ss":33,"used":true},{"PRN":4,"el":30,"az":150,"ss":46,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true}]} $GPGLL,4907.85424,N,12243.19882,W,030900.00,A,A*78 {"class":"TPV","mode":3,"time":"2006-08-10T03:09:00.000Z","ept":0.005,"lat":49.130904000,"lon":-122.719980333,"alt":516.700,"epv":23.000,"track":323.2600,"speed":0.681,"climb":0.000} $GPZDA,030900.00,10,08,2006,00,00*61 $GPRMC,030901.00,A,4907.85444,N,12243.19906,W,1.458,323.25,100806,,,A*77 $GPVTG,323.25,T,,M,1.458,N,2.702,K,A*37 $GPGGA,030901.00,4907.85444,N,12243.19906,W,1,03,9.99,516.7,M,-16.7,M,,*65 $GPGSA,A,2,28,04,02,,,,,,,,,,10.04,9.99,1.00*32 $GPGSV,1,1,03,28,28,095,32,04,30,150,45,02,07,178,32*4F {"class":"SKY","vdop":1.00,"hdop":9.99,"pdop":10.04,"satellites":[{"PRN":28,"el":28,"az":95,"ss":32,"used":true},{"PRN":4,"el":30,"az":150,"ss":45,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true}]} $GPGLL,4907.85444,N,12243.19906,W,030901.00,A,A*72 {"class":"TPV","mode":3,"time":"2006-08-10T03:09:01.000Z","ept":0.005,"lat":49.130907333,"lon":-122.719984333,"alt":516.700,"epv":23.000,"track":323.2500,"speed":0.750,"climb":0.000} $GPZDA,030901.00,10,08,2006,00,00*60 $GPRMC,031007.00,V,,,,,,,100806,,,N*77 $GPVTG,,,,,,,,,N*30 $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","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","mode":0,"time":"2006-08-10T03:10:07.000Z","ept":0.005} $GPZDA,031007.00,10,08,2006,00,00*6E $GPRMC,031008.00,A,4907.58133,N,12242.60088,W,2.550,220.86,100806,,,A*72 $GPVTG,220.86,T,,M,2.550,N,4.724,K,A*34 $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","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","mode":3,"time":"2006-08-10T03:10:08.000Z","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} $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 $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","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","mode":3,"time":"2006-08-10T03:10:09.000Z","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} $GPZDA,031009.00,10,08,2006,00,00*60 $GPRMC,031516.00,A,4907.56801,N,12242.61073,W,0.084,39.14,100806,,,A*44 $GPVTG,39.14,T,,M,0.084,N,0.155,K,A*0F $GPGGA,031516.00,4907.56801,N,12242.61073,W,1,09,1.13,99.1,M,-16.7,M,,*5C $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","xdop":0.98,"ydop":1.92,"vdop":1.89,"tdop":2.55,"hdop":1.13,"gdop":4.80,"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":138,"el":32,"az":160,"ss":46,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":135,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":122,"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","mode":3,"time":"2006-08-10T03:15:16.000Z","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} $GPZDA,031516.00,10,08,2006,00,00*6B $GPRMC,031517.00,A,4907.56809,N,12242.61069,W,0.084,39.37,100806,,,A*47 $GPVTG,39.37,T,,M,0.084,N,0.156,K,A*0D $GPGGA,031517.00,4907.56809,N,12242.61069,W,1,09,1.13,98.8,M,-16.7,M,,*56 $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","xdop":0.98,"ydop":1.92,"vdop":1.89,"tdop":2.55,"hdop":1.13,"gdop":4.80,"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":138,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":135,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":122,"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","mode":3,"time":"2006-08-10T03:15:17.000Z","ept":0.005,"lat":49.126134833,"lon":-122.710178167,"alt":98.800,"epx":14.642,"epy":28.806,"epv":43.470,"track":39.3700,"speed":0.043,"climb":0.000,"eps":57.61} $GPZDA,031517.00,10,08,2006,00,00*6A $GPRMC,031518.00,A,4907.56818,N,12242.61064,W,0.084,39.58,100806,,,A*4C $GPVTG,39.58,T,,M,0.084,N,0.155,K,A*07 $GPGGA,031518.00,4907.56818,N,12242.61064,W,1,09,1.13,98.5,M,-16.7,M,,*59 $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,2.20,1.13,1.89*03 $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","xdop":0.98,"ydop":1.92,"vdop":1.89,"tdop":2.55,"hdop":1.13,"gdop":4.80,"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":138,"el":32,"az":160,"ss":46,"used":false},{"PRN":134,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":135,"el":33,"az":194,"ss":41,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":122,"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","mode":3,"time":"2006-08-10T03:15:18.000Z","ept":0.005,"lat":49.126136333,"lon":-122.710177333,"alt":98.500,"epx":14.642,"epy":28.806,"epv":43.470,"track":39.5800,"speed":0.043,"climb":0.000,"eps":57.61} gpsd-3.15/test/daemon/ublox-lea-4s.log0000664000175000017500000000337412461156335015723 0ustar esresr# Name: LEA-4S # Chipset: ANTARIS # Submitter: "Ali Utku Selen" # Date: 2006-12-11 # Location: İzmir, TR, 38N27E # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # $GPZDA,175503.00,11,12,2006,00,00*64 $GPRMC,175504.00,A,3825.60966,N,02708.53787,E,0.142,113.02,111206,,,A*6F $GPVTG,113.02,T,,M,0.142,N,0.263,K,A*3C $GPGGA,175504.00,3825.60966,N,02708.53787,E,1,07,1.24,58.1,M,37.7,M,,*61 $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 $GPGLL,3825.60966,N,02708.53787,E,175504.00,A,A*6B $GPZDA,175504.00,11,12,2006,00,00*63 $GPRMC,175505.00,A,3825.60968,N,02708.53789,E,0.106,112.88,111206,,,A*6D $GPVTG,112.88,T,,M,0.106,N,0.196,K,A*36 $GPGGA,175505.00,3825.60968,N,02708.53789,E,1,07,1.24,58.1,M,37.7,M,,*60 $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 $GPGLL,3825.60968,N,02708.53789,E,175505.00,A,A*6A $GPZDA,175505.00,11,12,2006,00,00*62 $GPRMC,175506.00,A,3825.60969,N,02708.53794,E,0.074,112.93,111206,,,A*6D $GPVTG,112.93,T,,M,0.074,N,0.137,K,A*33 $GPGGA,175506.00,3825.60969,N,02708.53794,E,1,07,1.24,58.2,M,37.7,M,,*6D $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 $GPGLL,3825.60969,N,02708.53794,E,175506.00,A,A*64 gpsd-3.15/test/daemon/ublox-lea-4s.log.chk0000664000175000017500000001046012467340617016465 0ustar esresr$GPZDA,175503.00,11,12,2006,00,00*64 $GPRMC,175504.00,A,3825.60966,N,02708.53787,E,0.142,113.02,111206,,,A*6F {"class":"TPV","mode":2,"time":"2006-12-11T17:55:04.000Z","ept":0.005,"lat":38.426827667,"lon":27.142297833,"track":113.0200,"speed":0.073} $GPVTG,113.02,T,,M,0.142,N,0.263,K,A*3C $GPGGA,175504.00,3825.60966,N,02708.53787,E,1,07,1.24,58.1,M,37.7,M,,*61 {"class":"TPV","mode":3,"time":"2006-12-11T17:55:04.000Z","ept":0.005,"lat":38.426827667,"lon":27.142297833,"alt":58.100,"track":113.0200,"speed":0.073} $GPGSA,A,3,19,11,25,14,01,31,22,,,,,,1.99,1.24,1.55*0C {"class":"TPV","mode":3,"time":"2006-12-11T17:55:04.000Z","ept":0.005,"lat":38.426827667,"lon":27.142297833,"alt":58.100,"epv":35.650,"track":113.0200,"speed":0.073,"climb":0.000} $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","xdop":0.94,"ydop":0.79,"vdop":1.55,"tdop":1.11,"hdop":1.24,"gdop":2.27,"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","mode":3,"time":"2006-12-11T17:55:04.000Z","ept":0.005,"lat":38.426827667,"lon":27.142297833,"alt":58.100,"epx":14.047,"epy":11.889,"epv":35.650,"track":113.0200,"speed":0.073,"climb":0.000} $GPZDA,175504.00,11,12,2006,00,00*63 $GPRMC,175505.00,A,3825.60968,N,02708.53789,E,0.106,112.88,111206,,,A*6D $GPVTG,112.88,T,,M,0.106,N,0.196,K,A*36 $GPGGA,175505.00,3825.60968,N,02708.53789,E,1,07,1.24,58.1,M,37.7,M,,*60 $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","xdop":0.94,"ydop":0.79,"vdop":1.55,"tdop":1.11,"hdop":1.24,"gdop":2.27,"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","mode":3,"time":"2006-12-11T17:55:05.000Z","ept":0.005,"lat":38.426828000,"lon":27.142298167,"alt":58.100,"epx":14.047,"epy":11.889,"epv":35.650,"track":112.8800,"speed":0.055,"climb":0.000,"eps":28.09} $GPZDA,175505.00,11,12,2006,00,00*62 $GPRMC,175506.00,A,3825.60969,N,02708.53794,E,0.074,112.93,111206,,,A*6D $GPVTG,112.93,T,,M,0.074,N,0.137,K,A*33 $GPGGA,175506.00,3825.60969,N,02708.53794,E,1,07,1.24,58.2,M,37.7,M,,*6D $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","xdop":0.94,"ydop":0.79,"vdop":1.55,"tdop":1.11,"hdop":1.24,"gdop":2.27,"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","mode":3,"time":"2006-12-11T17:55:06.000Z","ept":0.005,"lat":38.426828167,"lon":27.142299000,"alt":58.200,"epx":14.047,"epy":11.889,"epv":35.650,"track":112.9300,"speed":0.038,"climb":0.000,"eps":28.09} gpsd-3.15/test/daemon/ublox-lea-4t.log0000664000175000017500000000555312467342657015737 0ustar esresr# Name: LEA-4T # Chipset: ANTARIS # Date: 2009-01-28 # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # µbu-blox ag - www.u-blox.com#<µbANTARIS ATR062x HW 00040001®ëµb+EXT CORE 5.00 May 11 2006 14:40:17äµb+INT EXT0 (RCV) M4T1.2 May 11 2006 14:40:17Õ{µbLIC 85E7-6E21-710B-0272-42DC'&µb BIST: passed µbANTSUPERV=AC SD OD PDoS SRNµb ANTSTATUS=OK°“µb±£Þì îYœ3¿™AÕ2Žé™sA„˜IE!/À¶9sšAµ"tA"$ÈB.ŠßšF|•›AãÒX9ÿtAEhE2p8¿ºÐ›Ap:̗,uAá/–E+®²§làšA»+4utAk-E-lú]Ī•›AR N)ÿtA"jÄ"­Œ]ÓœA…5!ÆñuA‘TXD!ÆàÍ¡O~A†æI>svA*)»Ä &nãHÒ}“wA^°EEY×fhSxAßîcE?²©J xAhªDt=µb mÞSŸÿÿì9µb :±£Þì3¥ÿ_bðò_= ò_bÒò_®çòq72p2p$2 _Œëò r82 _%Äò _Šãò _]âò_Ëàòpq(2p2_S¶òpÙ(2_Bîò_-®òpI2qá 2_KÑòq^82_WòpW(2_7ò_,Úòp€(2_¿ôò_ôäò _ù»òx¥ÿy¥ÿz¥ÿ{¥ÿ|¥ÿ}¥ÿ~¥ÿ¥ÿ€¥ÿ¥ÿ‚¥ÿƒ¥ÿ„¥ÿ…¥ÿ†¥ÿ‡¥ÿˆ¥ÿ‰¥ÿŠ¥ÿÉ9µb4±£ÞŒìì@wÿöžš<ëËs(ò’ŽÔµb±£ÞòŒÕsb<ٛµb±£ÞX >€†µb ±£ÞŒìì Dµb!±£Þ Ð.Ù#+ýbµb"±£Þtýÿôúÿÿ nfµb0ȱ£Þ !IS .8^”ÿÿÿ (q ÿÿÿ +(Ùv -(WO "(€€ÿÿÿ !²üÿÿ 7 &8ûÿÿÿ  =   á  $ 7  %7µb1ž±£Þ?B      œµb2 ±£Þ„Jµb™§Þì ÂÇ)¿™A B ‚è˜sAOŸIE / &8sšAl.F×"tA–NÈB.Š“å9B•›AMW> ÛþtAË%hE2žšoЛAV Äså+uAÞ.–E+®~q·@àšA,%utAªy-E-l†íc¹•›AÿÀÑl4ÿtA%jiÄ"­ ɓsӜA”Fy ñuAuXD!Æpyg~A-\3-svAn»Ä 'ÚSÑ¿:“wAOO°E¶Åß[µb0ș§Þ  IU .8^~ÿÿÿ (qúþÿÿ +(ÙG -(W] "(€{ÿÿÿ !Žüÿÿ 7 '8êÿÿÿ  =   á  $ 7  ºQµb1ž™§Þ?B      ü8 gpsd-3.15/test/daemon/ublox-lea-4t.log.chk0000664000175000017500000000512312467342657016474 0ustar esresr$GPZDA,203542.00,28,01,2009,00,00*64 $GPGGA,203542,5333.7954,N,11326.3727,W,1,08,,655.33,M,-19.872,M,,*65 $GPRMC,203542,A,5333.7954,N,11326.3727,W,0.0000,0.000,280109,,*30 $GPGSA,A,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.0,0.0,0.0*32 {"class":"TPV","mode":3,"time":"2009-01-28T20:35:42.001Z","ept":0.005,"lat":53.563256268,"lon":-113.439544853,"alt":655.331,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.18} $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","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}]} $GPZDA,203544.00,28,01,2009,00,00*62 $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,21,24,15,18,26,29,16,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2.4,1.1,2.1*36 $GPGBS,203544,9.05,M,14.66,M,48.99,M*3F {"class":"TPV","mode":3,"time":"2009-01-28T20:35:44.001Z","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":0.18,"epc":97.98} $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","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}]} gpsd-3.15/test/daemon/ublox-lea-5h.log0000664000175000017500000002316612467341115015710 0ustar esresr# Name: U-Blox, EVK-5H-0, ID: 1546:01a5 # Chipset: LEA-5H-0 # Submitter: Stephan Dierick # Date: 2010-08-23 # Location: Rotterdam, NL, 51.9N 4.6E # Notess: Unit was stationary. Part without fix (antenna # shielded) and stationary fix. Sentences with # fix begin at timestamp 085515 # $GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,HW UBX-G50xx 00040005 *53 $GPTXT,01,01,02,EXT CORE 6.00 (33247) May 13 2009 17:35:46*49 $GPTXT,01,01,02,ROM BASE 4.00 (25682) Jan 14 2008 16:29:23*4F $GPTXT,01,01,02,MOD LEA-5H-0*2E $GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20 $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,083723.00,A,5155.55442,N,00434.65873,E,0.211,,210810,,,A*7F $GPVTG,,T,,M,0.211,N,0.391,K,A*2A $GPGGA,083723.00,5155.55442,N,00434.65873,E,1,06,2.51,-4.0,M,46.0,M,,*70 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,37,12,03,212,*75 $GPGSV,3,2,12,15,78,214,34,17,25,106,18,18,32,294,39,22,13,324,20*77 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,36,28,39,055,26*77 $GPGLL,5155.55442,N,00434.65873,E,083723.00,A,A*6E $GPRMC,083724.00,A,5155.55430,N,00434.65878,E,0.392,,210810,,,A*7C $GPVTG,,T,,M,0.392,N,0.727,K,A*29 $GPGGA,083724.00,5155.55430,N,00434.65878,E,1,06,2.51,-4.2,M,46.0,M,,*7B $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,37,12,03,212,*75 $GPGSV,3,2,12,15,78,214,34,17,25,106,18,18,32,294,39,22,13,324,20*77 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,36,28,39,055,26*77 $GPGLL,5155.55430,N,00434.65878,E,083724.00,A,A*67 $GPRMC,083725.00,A,5155.55467,N,00434.65870,E,0.274,,210810,,,A*7E $GPVTG,,T,,M,0.274,N,0.508,K,A*2F $GPGGA,083725.00,5155.55467,N,00434.65870,E,1,06,2.51,-3.2,M,46.0,M,,*77 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,34,12,03,212,*77 $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,37,22,13,324,20*71 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,33,28,39,055,26*72 $GPGLL,5155.55467,N,00434.65870,E,083725.00,A,A*6C $GPRMC,083726.00,A,5155.55458,N,00434.65878,E,0.034,,210810,,,A*7F $GPVTG,,T,,M,0.034,N,0.062,K,A*20 $GPGGA,083726.00,5155.55458,N,00434.65878,E,1,06,2.51,-3.3,M,46.0,M,,*71 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,37,12,03,212,*74 $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,39,22,13,324,20*7F $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,34,28,39,055,26*75 $GPGLL,5155.55458,N,00434.65878,E,083726.00,A,A*6B $GPRMC,083727.00,A,5155.55436,N,00434.65880,E,0.094,,210810,,,A*7B $GPVTG,,T,,M,0.094,N,0.174,K,A*2C $GPGGA,083727.00,5155.55436,N,00434.65880,E,1,06,2.51,-3.6,M,46.0,M,,*7A $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,38,12,03,212,*7A $GPGSV,3,2,12,15,78,214,33,17,25,106,16,18,32,294,40,22,13,324,21*71 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,35,28,39,055,26*74 $GPGLL,5155.55436,N,00434.65880,E,083727.00,A,A*65 $GPRMC,083728.00,A,5155.55420,N,00434.65883,E,0.147,,210810,,,A*7F $GPVTG,,T,,M,0.147,N,0.273,K,A*27 $GPGGA,083728.00,5155.55420,N,00434.65883,E,1,06,2.51,-3.8,M,46.0,M,,*7F $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,38,12,03,212,*7A $GPGSV,3,2,12,15,78,214,34,17,25,106,17,18,32,294,40,22,13,324,22*74 $GPGSV,3,3,12,24,04,342,,26,55,139,25,27,62,276,36,28,39,055,26*76 $GPGLL,5155.55420,N,00434.65883,E,083728.00,A,A*6E $GPRMC,083729.00,A,5155.55404,N,00434.65895,E,0.192,,210810,,,A*77 $GPVTG,,T,,M,0.192,N,0.356,K,A*29 $GPGGA,083729.00,5155.55404,N,00434.65895,E,1,06,2.51,-4.0,M,46.0,M,,*70 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,37,12,03,212,*75 $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,40,22,13,324,22*73 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,35,28,39,055,26*74 $GPGLL,5155.55404,N,00434.65895,E,083729.00,A,A*6E $GPRMC,083730.00,A,5155.55390,N,00434.65909,E,0.045,,210810,,,A*7A $GPVTG,,T,,M,0.045,N,0.084,K,A*2E $GPGGA,083730.00,5155.55390,N,00434.65909,E,1,06,2.51,-4.2,M,46.0,M,,*74 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,37,12,03,212,*74 $GPGSV,3,2,12,15,78,214,33,17,25,106,16,18,32,294,39,22,13,324,21*7F $GPGSV,3,3,12,24,04,342,,26,55,139,25,27,62,276,35,28,39,055,26*75 $GPGLL,5155.55390,N,00434.65909,E,083730.00,A,A*68 $GPRMC,083731.00,A,5155.55368,N,00434.65914,E,0.134,,210810,,,A*77 $GPVTG,,T,,M,0.134,N,0.247,K,A*24 $GPGGA,083731.00,5155.55368,N,00434.65914,E,1,06,2.51,-4.4,M,46.0,M,,*78 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,38,12,03,212,*7B $GPGSV,3,2,12,15,78,214,34,17,25,106,16,18,32,294,40,22,13,324,22*75 $GPGSV,3,3,12,24,04,342,,26,55,139,25,27,62,276,36,28,39,055,27*77 $GPGLL,5155.55368,N,00434.65914,E,083731.00,A,A*62 $GPRMC,083732.00,A,5155.55351,N,00434.65917,E,0.175,,210810,,,A*78 $GPVTG,,T,,M,0.175,N,0.325,K,A*24 $GPGGA,083732.00,5155.55351,N,00434.65917,E,1,06,2.50,-4.5,M,46.0,M,,*72 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.50,2.20*05 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,36,12,03,212,*75 $GPGSV,3,2,12,15,78,214,32,17,25,106,16,18,32,294,40,22,13,324,22*73 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,35,28,39,055,26*74 $GPGLL,5155.55351,N,00434.65917,E,083732.00,A,A*68 $GPRMC,083733.00,A,5155.55334,N,00434.65925,E,0.162,,210810,,,A*7D $GPVTG,,T,,M,0.162,N,0.300,K,A*25 $GPGGA,083733.00,5155.55334,N,00434.65925,E,1,06,2.50,-4.7,M,46.0,M,,*73 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.50,2.20*05 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,37,12,03,212,*74 $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,40,22,13,324,22*73 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,35,28,39,055,27*75 $GPGLL,5155.55334,N,00434.65925,E,083733.00,A,A*6B $GPRMC,083734.00,A,5155.55320,N,00434.65935,E,0.265,,210810,,,A*7A $GPVTG,,T,,M,0.265,N,0.490,K,A*2F $GPGGA,083734.00,5155.55320,N,00434.65935,E,1,06,2.50,-4.9,M,46.0,M,,*7E $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.50,2.20*05 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,37,12,03,212,*74 $GPGSV,3,2,12,15,78,214,33,17,25,106,16,18,32,294,39,22,13,324,22*7C $GPGSV,3,3,12,24,04,342,,26,55,139,23,27,62,276,36,28,39,055,27*71 $GPGLL,5155.55320,N,00434.65935,E,083734.00,A,A*68 $GPRMC,083735.00,A,5155.55307,N,00434.65949,E,0.152,,210810,,,A*72 $GPVTG,,T,,M,0.152,N,0.282,K,A*2D $GPGGA,083735.00,5155.55307,N,00434.65949,E,1,06,2.50,-5.1,M,46.0,M,,*78 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.50,2.20*05 $GPGSV,3,1,12,05,04,187,,08,11,078,26,09,43,270,36,12,03,212,*7B $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,39,22,13,324,21*7E $GPGSV,3,3,12,24,04,342,,26,55,139,23,27,62,276,36,28,39,055,27*71 $GPGLL,5155.55307,N,00434.65949,E,083735.00,A,A*67 $GPRMC,083736.00,A,5155.55296,N,00434.65953,E,0.178,,210810,,,A*7B # # Sentences with fix begin here # $GPVTG,,T,,M,0.037,N,0.069,K,A*28 $GPGGA,085515.00,5155.55359,N,00434.65730,E,1,08,1.00,2.1,M,46.0,M,,*57 $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,17,09,51,276,42,11,01,043,,12,11,214,29*7F $GPGSV,4,2,13,15,73,189,40,17,30,099,25,18,33,285,39,22,17,319,37*7E $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,31*77 $GPGSV,4,4,13,33,28,204,38*4C $GPGLL,5155.55359,N,00434.65730,E,085515.00,A,A*6A $GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,HW UBX-G50xx 00040005 *53 $GPTXT,01,01,02,EXT CORE 6.00 (33247) May 13 2009 17:35:46*49 $GPTXT,01,01,02,ROM BASE 4.00 (25682) Jan 14 2008 16:29:23*4F $GPTXT,01,01,02,MOD LEA-5H-0*2E $GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20 $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,085516.00,A,5155.55350,N,00434.65733,E,0.050,,210810,,,A*75 $GPVTG,,T,,M,0.050,N,0.092,K,A*2D $GPGGA,085516.00,5155.55350,N,00434.65733,E,1,08,1.00,2.0,M,46.0,M,,*5F $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,17,09,51,276,43,11,01,043,,12,11,215,29*7F $GPGSV,4,2,13,15,73,189,40,17,30,099,25,18,33,285,39,22,17,319,38*71 $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,30*76 $GPGSV,4,4,13,33,28,204,38*4C $GPGLL,5155.55350,N,00434.65733,E,085516.00,A,A*63 $GPRMC,085517.00,A,5155.55340,N,00434.65739,E,0.025,,210810,,,A*7D $GPVTG,,T,,M,0.025,N,0.046,K,A*26 $GPGGA,085517.00,5155.55340,N,00434.65739,E,1,08,1.00,1.8,M,46.0,M,,*5E $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,17,09,51,276,43,11,01,043,,12,11,215,29*7F $GPGSV,4,2,13,15,73,189,41,17,30,099,25,18,33,285,39,22,17,319,38*70 $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,30*76 $GPGSV,4,4,13,33,28,204,38*4C $GPGLL,5155.55340,N,00434.65739,E,085517.00,A,A*69 $GPRMC,085518.00,A,5155.55332,N,00434.65744,E,0.017,,210810,,,A*7C $GPVTG,,T,,M,0.017,N,0.032,K,A*24 $GPGGA,085518.00,5155.55332,N,00434.65744,E,1,08,1.00,1.6,M,46.0,M,,*50 $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,17,09,51,276,42,11,01,043,,12,11,215,29*7E $GPGSV,4,2,13,15,73,189,41,17,30,099,27,18,33,285,39,22,17,319,39*73 $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,31*77 $GPGSV,4,4,13,33,28,204,38*4C $GPGLL,5155.55332,N,00434.65744,E,085518.00,A,A*69 $GPRMC,085519.00,A,5155.55322,N,00434.65748,E,0.056,,210810,,,A*75 $GPVTG,,T,,M,0.056,N,0.104,K,A*25 $GPGGA,085519.00,5155.55322,N,00434.65748,E,1,08,1.00,1.5,M,46.0,M,,*5F $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,16,09,51,276,42,11,01,043,,12,11,215,28*7E $GPGSV,4,2,13,15,72,188,41,17,30,099,26,18,33,285,39,22,17,319,38*73 $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,30*76 $GPGSV,4,4,13,33,28,204,38*4C $GPGLL,5155.55322,N,00434.65748,E,085519.00,A,A*65 $GPRMC,085520.00,A,5155.55317,N,00434.65752,E,0.011,,210810,,,A*71 gpsd-3.15/test/daemon/ublox-lea-5h.log.chk0000664000175000017500000006524312467341115016456 0ustar esresr$GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,HW UBX-G50xx 00040005 *53 $GPTXT,01,01,02,EXT CORE 6.00 (33247) May 13 2009 17:35:46*49 $GPTXT,01,01,02,ROM BASE 4.00 (25682) Jan 14 2008 16:29:23*4F $GPTXT,01,01,02,MOD LEA-5H-0*2E $GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20 $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,083723.00,A,5155.55442,N,00434.65873,E,0.211,,210810,,,A*7F {"class":"TPV","mode":2,"time":"2010-08-21T08:37:23.000Z","ept":0.005,"lat":51.925907000,"lon":4.577645500,"track":0.0000,"speed":0.109} $GPVTG,,T,,M,0.211,N,0.391,K,A*2A $GPGGA,083723.00,5155.55442,N,00434.65873,E,1,06,2.51,-4.0,M,46.0,M,,*70 {"class":"TPV","mode":3,"time":"2010-08-21T08:37:23.000Z","ept":0.005,"lat":51.925907000,"lon":4.577645500,"alt":-4.000,"track":0.0000,"speed":0.109} $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 {"class":"TPV","mode":3,"time":"2010-08-21T08:37:23.000Z","ept":0.005,"lat":51.925907000,"lon":4.577645500,"alt":-4.000,"epv":50.600,"track":0.0000,"speed":0.109,"climb":0.000} $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,37,12,03,212,*75 $GPGSV,3,2,12,15,78,214,34,17,25,106,18,18,32,294,39,22,13,324,20*77 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,36,28,39,055,26*77 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.51,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":29,"used":true},{"PRN":9,"el":43,"az":270,"ss":37,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":34,"used":true},{"PRN":17,"el":25,"az":106,"ss":18,"used":false},{"PRN":18,"el":32,"az":294,"ss":39,"used":true},{"PRN":22,"el":13,"az":324,"ss":20,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":24,"used":false},{"PRN":27,"el":62,"az":276,"ss":36,"used":true},{"PRN":28,"el":39,"az":55,"ss":26,"used":true}]} $GPGLL,5155.55442,N,00434.65873,E,083723.00,A,A*6E {"class":"TPV","mode":3,"time":"2010-08-21T08:37:23.000Z","ept":0.005,"lat":51.925907000,"lon":4.577645500,"alt":-4.000,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.109,"climb":0.000} $GPRMC,083724.00,A,5155.55430,N,00434.65878,E,0.392,,210810,,,A*7C $GPVTG,,T,,M,0.392,N,0.727,K,A*29 $GPGGA,083724.00,5155.55430,N,00434.65878,E,1,06,2.51,-4.2,M,46.0,M,,*7B $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,37,12,03,212,*75 $GPGSV,3,2,12,15,78,214,34,17,25,106,18,18,32,294,39,22,13,324,20*77 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,36,28,39,055,26*77 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.51,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":29,"used":true},{"PRN":9,"el":43,"az":270,"ss":37,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":34,"used":true},{"PRN":17,"el":25,"az":106,"ss":18,"used":false},{"PRN":18,"el":32,"az":294,"ss":39,"used":true},{"PRN":22,"el":13,"az":324,"ss":20,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":24,"used":false},{"PRN":27,"el":62,"az":276,"ss":36,"used":true},{"PRN":28,"el":39,"az":55,"ss":26,"used":true}]} $GPGLL,5155.55430,N,00434.65878,E,083724.00,A,A*67 {"class":"TPV","mode":3,"time":"2010-08-21T08:37:24.000Z","ept":0.005,"lat":51.925905000,"lon":4.577646333,"alt":-4.200,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.202,"climb":0.000,"eps":72.09} $GPRMC,083725.00,A,5155.55467,N,00434.65870,E,0.274,,210810,,,A*7E $GPVTG,,T,,M,0.274,N,0.508,K,A*2F $GPGGA,083725.00,5155.55467,N,00434.65870,E,1,06,2.51,-3.2,M,46.0,M,,*77 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,34,12,03,212,*77 $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,37,22,13,324,20*71 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,33,28,39,055,26*72 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.51,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":28,"used":true},{"PRN":9,"el":43,"az":270,"ss":34,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":33,"used":true},{"PRN":17,"el":25,"az":106,"ss":17,"used":false},{"PRN":18,"el":32,"az":294,"ss":37,"used":true},{"PRN":22,"el":13,"az":324,"ss":20,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":24,"used":false},{"PRN":27,"el":62,"az":276,"ss":33,"used":true},{"PRN":28,"el":39,"az":55,"ss":26,"used":true}]} $GPGLL,5155.55467,N,00434.65870,E,083725.00,A,A*6C {"class":"TPV","mode":3,"time":"2010-08-21T08:37:25.000Z","ept":0.005,"lat":51.925911167,"lon":4.577645000,"alt":-3.200,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.141,"climb":0.000,"eps":72.09} $GPRMC,083726.00,A,5155.55458,N,00434.65878,E,0.034,,210810,,,A*7F $GPVTG,,T,,M,0.034,N,0.062,K,A*20 $GPGGA,083726.00,5155.55458,N,00434.65878,E,1,06,2.51,-3.3,M,46.0,M,,*71 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,37,12,03,212,*74 $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,39,22,13,324,20*7F $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,34,28,39,055,26*75 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.51,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":28,"used":true},{"PRN":9,"el":43,"az":270,"ss":37,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":33,"used":true},{"PRN":17,"el":25,"az":106,"ss":17,"used":false},{"PRN":18,"el":32,"az":294,"ss":39,"used":true},{"PRN":22,"el":13,"az":324,"ss":20,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":24,"used":false},{"PRN":27,"el":62,"az":276,"ss":34,"used":true},{"PRN":28,"el":39,"az":55,"ss":26,"used":true}]} $GPGLL,5155.55458,N,00434.65878,E,083726.00,A,A*6B {"class":"TPV","mode":3,"time":"2010-08-21T08:37:26.000Z","ept":0.005,"lat":51.925909667,"lon":4.577646333,"alt":-3.300,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.017,"climb":0.000,"eps":72.09} $GPRMC,083727.00,A,5155.55436,N,00434.65880,E,0.094,,210810,,,A*7B $GPVTG,,T,,M,0.094,N,0.174,K,A*2C $GPGGA,083727.00,5155.55436,N,00434.65880,E,1,06,2.51,-3.6,M,46.0,M,,*7A $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,38,12,03,212,*7A $GPGSV,3,2,12,15,78,214,33,17,25,106,16,18,32,294,40,22,13,324,21*71 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,35,28,39,055,26*74 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.51,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":29,"used":true},{"PRN":9,"el":43,"az":270,"ss":38,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":33,"used":true},{"PRN":17,"el":25,"az":106,"ss":16,"used":false},{"PRN":18,"el":32,"az":294,"ss":40,"used":true},{"PRN":22,"el":13,"az":324,"ss":21,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":24,"used":false},{"PRN":27,"el":62,"az":276,"ss":35,"used":true},{"PRN":28,"el":39,"az":55,"ss":26,"used":true}]} $GPGLL,5155.55436,N,00434.65880,E,083727.00,A,A*65 {"class":"TPV","mode":3,"time":"2010-08-21T08:37:27.000Z","ept":0.005,"lat":51.925906000,"lon":4.577646667,"alt":-3.600,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.048,"climb":0.000,"eps":72.09} $GPRMC,083728.00,A,5155.55420,N,00434.65883,E,0.147,,210810,,,A*7F $GPVTG,,T,,M,0.147,N,0.273,K,A*27 $GPGGA,083728.00,5155.55420,N,00434.65883,E,1,06,2.51,-3.8,M,46.0,M,,*7F $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,38,12,03,212,*7A $GPGSV,3,2,12,15,78,214,34,17,25,106,17,18,32,294,40,22,13,324,22*74 $GPGSV,3,3,12,24,04,342,,26,55,139,25,27,62,276,36,28,39,055,26*76 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.51,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":29,"used":true},{"PRN":9,"el":43,"az":270,"ss":38,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":34,"used":true},{"PRN":17,"el":25,"az":106,"ss":17,"used":false},{"PRN":18,"el":32,"az":294,"ss":40,"used":true},{"PRN":22,"el":13,"az":324,"ss":22,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":25,"used":false},{"PRN":27,"el":62,"az":276,"ss":36,"used":true},{"PRN":28,"el":39,"az":55,"ss":26,"used":true}]} $GPGLL,5155.55420,N,00434.65883,E,083728.00,A,A*6E {"class":"TPV","mode":3,"time":"2010-08-21T08:37:28.000Z","ept":0.005,"lat":51.925903333,"lon":4.577647167,"alt":-3.800,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.076,"climb":0.000,"eps":72.09} $GPRMC,083729.00,A,5155.55404,N,00434.65895,E,0.192,,210810,,,A*77 $GPVTG,,T,,M,0.192,N,0.356,K,A*29 $GPGGA,083729.00,5155.55404,N,00434.65895,E,1,06,2.51,-4.0,M,46.0,M,,*70 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,29,09,43,270,37,12,03,212,*75 $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,40,22,13,324,22*73 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,35,28,39,055,26*74 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.51,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":29,"used":true},{"PRN":9,"el":43,"az":270,"ss":37,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":33,"used":true},{"PRN":17,"el":25,"az":106,"ss":17,"used":false},{"PRN":18,"el":32,"az":294,"ss":40,"used":true},{"PRN":22,"el":13,"az":324,"ss":22,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":24,"used":false},{"PRN":27,"el":62,"az":276,"ss":35,"used":true},{"PRN":28,"el":39,"az":55,"ss":26,"used":true}]} $GPGLL,5155.55404,N,00434.65895,E,083729.00,A,A*6E {"class":"TPV","mode":3,"time":"2010-08-21T08:37:29.000Z","ept":0.005,"lat":51.925900667,"lon":4.577649167,"alt":-4.000,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.099,"climb":0.000,"eps":72.09} $GPRMC,083730.00,A,5155.55390,N,00434.65909,E,0.045,,210810,,,A*7A $GPVTG,,T,,M,0.045,N,0.084,K,A*2E $GPGGA,083730.00,5155.55390,N,00434.65909,E,1,06,2.51,-4.2,M,46.0,M,,*74 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,37,12,03,212,*74 $GPGSV,3,2,12,15,78,214,33,17,25,106,16,18,32,294,39,22,13,324,21*7F $GPGSV,3,3,12,24,04,342,,26,55,139,25,27,62,276,35,28,39,055,26*75 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.51,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":28,"used":true},{"PRN":9,"el":43,"az":270,"ss":37,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":33,"used":true},{"PRN":17,"el":25,"az":106,"ss":16,"used":false},{"PRN":18,"el":32,"az":294,"ss":39,"used":true},{"PRN":22,"el":13,"az":324,"ss":21,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":25,"used":false},{"PRN":27,"el":62,"az":276,"ss":35,"used":true},{"PRN":28,"el":39,"az":55,"ss":26,"used":true}]} $GPGLL,5155.55390,N,00434.65909,E,083730.00,A,A*68 {"class":"TPV","mode":3,"time":"2010-08-21T08:37:30.000Z","ept":0.005,"lat":51.925898333,"lon":4.577651500,"alt":-4.200,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.023,"climb":0.000,"eps":72.09} $GPRMC,083731.00,A,5155.55368,N,00434.65914,E,0.134,,210810,,,A*77 $GPVTG,,T,,M,0.134,N,0.247,K,A*24 $GPGGA,083731.00,5155.55368,N,00434.65914,E,1,06,2.51,-4.4,M,46.0,M,,*78 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.51,2.20*04 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,38,12,03,212,*7B $GPGSV,3,2,12,15,78,214,34,17,25,106,16,18,32,294,40,22,13,324,22*75 $GPGSV,3,3,12,24,04,342,,26,55,139,25,27,62,276,36,28,39,055,27*77 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.51,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":28,"used":true},{"PRN":9,"el":43,"az":270,"ss":38,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":34,"used":true},{"PRN":17,"el":25,"az":106,"ss":16,"used":false},{"PRN":18,"el":32,"az":294,"ss":40,"used":true},{"PRN":22,"el":13,"az":324,"ss":22,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":25,"used":false},{"PRN":27,"el":62,"az":276,"ss":36,"used":true},{"PRN":28,"el":39,"az":55,"ss":27,"used":true}]} $GPGLL,5155.55368,N,00434.65914,E,083731.00,A,A*62 {"class":"TPV","mode":3,"time":"2010-08-21T08:37:31.000Z","ept":0.005,"lat":51.925894667,"lon":4.577652333,"alt":-4.400,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.069,"climb":0.000,"eps":72.09} $GPRMC,083732.00,A,5155.55351,N,00434.65917,E,0.175,,210810,,,A*78 $GPVTG,,T,,M,0.175,N,0.325,K,A*24 $GPGGA,083732.00,5155.55351,N,00434.65917,E,1,06,2.50,-4.5,M,46.0,M,,*72 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.50,2.20*05 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,36,12,03,212,*75 $GPGSV,3,2,12,15,78,214,32,17,25,106,16,18,32,294,40,22,13,324,22*73 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,35,28,39,055,26*74 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.50,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":28,"used":true},{"PRN":9,"el":43,"az":270,"ss":36,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":32,"used":true},{"PRN":17,"el":25,"az":106,"ss":16,"used":false},{"PRN":18,"el":32,"az":294,"ss":40,"used":true},{"PRN":22,"el":13,"az":324,"ss":22,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":24,"used":false},{"PRN":27,"el":62,"az":276,"ss":35,"used":true},{"PRN":28,"el":39,"az":55,"ss":26,"used":true}]} $GPGLL,5155.55351,N,00434.65917,E,083732.00,A,A*68 {"class":"TPV","mode":3,"time":"2010-08-21T08:37:32.000Z","ept":0.005,"lat":51.925891833,"lon":4.577652833,"alt":-4.500,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.090,"climb":0.000,"eps":72.09} $GPRMC,083733.00,A,5155.55334,N,00434.65925,E,0.162,,210810,,,A*7D $GPVTG,,T,,M,0.162,N,0.300,K,A*25 $GPGGA,083733.00,5155.55334,N,00434.65925,E,1,06,2.50,-4.7,M,46.0,M,,*73 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.50,2.20*05 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,37,12,03,212,*74 $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,40,22,13,324,22*73 $GPGSV,3,3,12,24,04,342,,26,55,139,24,27,62,276,35,28,39,055,27*75 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.50,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":28,"used":true},{"PRN":9,"el":43,"az":270,"ss":37,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":33,"used":true},{"PRN":17,"el":25,"az":106,"ss":17,"used":false},{"PRN":18,"el":32,"az":294,"ss":40,"used":true},{"PRN":22,"el":13,"az":324,"ss":22,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":24,"used":false},{"PRN":27,"el":62,"az":276,"ss":35,"used":true},{"PRN":28,"el":39,"az":55,"ss":27,"used":true}]} $GPGLL,5155.55334,N,00434.65925,E,083733.00,A,A*6B {"class":"TPV","mode":3,"time":"2010-08-21T08:37:33.000Z","ept":0.005,"lat":51.925889000,"lon":4.577654167,"alt":-4.700,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.083,"climb":0.000,"eps":72.09} $GPRMC,083734.00,A,5155.55320,N,00434.65935,E,0.265,,210810,,,A*7A $GPVTG,,T,,M,0.265,N,0.490,K,A*2F $GPGGA,083734.00,5155.55320,N,00434.65935,E,1,06,2.50,-4.9,M,46.0,M,,*7E $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.50,2.20*05 $GPGSV,3,1,12,05,04,187,,08,11,078,28,09,43,270,37,12,03,212,*74 $GPGSV,3,2,12,15,78,214,33,17,25,106,16,18,32,294,39,22,13,324,22*7C $GPGSV,3,3,12,24,04,342,,26,55,139,23,27,62,276,36,28,39,055,27*71 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.50,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":28,"used":true},{"PRN":9,"el":43,"az":270,"ss":37,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":33,"used":true},{"PRN":17,"el":25,"az":106,"ss":16,"used":false},{"PRN":18,"el":32,"az":294,"ss":39,"used":true},{"PRN":22,"el":13,"az":324,"ss":22,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":23,"used":false},{"PRN":27,"el":62,"az":276,"ss":36,"used":true},{"PRN":28,"el":39,"az":55,"ss":27,"used":true}]} $GPGLL,5155.55320,N,00434.65935,E,083734.00,A,A*68 {"class":"TPV","mode":3,"time":"2010-08-21T08:37:34.000Z","ept":0.005,"lat":51.925886667,"lon":4.577655833,"alt":-4.900,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.136,"climb":0.000,"eps":72.09} $GPRMC,083735.00,A,5155.55307,N,00434.65949,E,0.152,,210810,,,A*72 $GPVTG,,T,,M,0.152,N,0.282,K,A*2D $GPGGA,083735.00,5155.55307,N,00434.65949,E,1,06,2.50,-5.1,M,46.0,M,,*78 $GPGSA,A,3,27,15,09,28,18,08,,,,,,,3.33,2.50,2.20*05 $GPGSV,3,1,12,05,04,187,,08,11,078,26,09,43,270,36,12,03,212,*7B $GPGSV,3,2,12,15,78,214,33,17,25,106,17,18,32,294,39,22,13,324,21*7E $GPGSV,3,3,12,24,04,342,,26,55,139,23,27,62,276,36,28,39,055,27*71 {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":2.20,"tdop":1.66,"hdop":2.50,"gdop":3.72,"pdop":3.33,"satellites":[{"PRN":5,"el":4,"az":187,"ss":0,"used":false},{"PRN":8,"el":11,"az":78,"ss":26,"used":true},{"PRN":9,"el":43,"az":270,"ss":36,"used":true},{"PRN":12,"el":3,"az":212,"ss":0,"used":false},{"PRN":15,"el":78,"az":214,"ss":33,"used":true},{"PRN":17,"el":25,"az":106,"ss":17,"used":false},{"PRN":18,"el":32,"az":294,"ss":39,"used":true},{"PRN":22,"el":13,"az":324,"ss":21,"used":false},{"PRN":24,"el":4,"az":342,"ss":0,"used":false},{"PRN":26,"el":55,"az":139,"ss":23,"used":false},{"PRN":27,"el":62,"az":276,"ss":36,"used":true},{"PRN":28,"el":39,"az":55,"ss":27,"used":true}]} $GPGLL,5155.55307,N,00434.65949,E,083735.00,A,A*67 {"class":"TPV","mode":3,"time":"2010-08-21T08:37:35.000Z","ept":0.005,"lat":51.925884500,"lon":4.577658167,"alt":-5.100,"epx":10.819,"epy":36.045,"epv":50.600,"track":0.0000,"speed":0.078,"climb":0.000,"eps":72.09} $GPRMC,083736.00,A,5155.55296,N,00434.65953,E,0.178,,210810,,,A*7B $GPVTG,,T,,M,0.037,N,0.069,K,A*28 $GPGGA,085515.00,5155.55359,N,00434.65730,E,1,08,1.00,2.1,M,46.0,M,,*57 $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,17,09,51,276,42,11,01,043,,12,11,214,29*7F $GPGSV,4,2,13,15,73,189,40,17,30,099,25,18,33,285,39,22,17,319,37*7E $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,31*77 $GPGSV,4,4,13,33,28,204,38*4C {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":1.37,"tdop":1.66,"hdop":1.00,"gdop":3.72,"pdop":1.69,"satellites":[{"PRN":8,"el":4,"az":82,"ss":17,"used":false},{"PRN":9,"el":51,"az":276,"ss":42,"used":true},{"PRN":11,"el":1,"az":43,"ss":0,"used":false},{"PRN":12,"el":11,"az":214,"ss":29,"used":true},{"PRN":15,"el":73,"az":189,"ss":40,"used":true},{"PRN":17,"el":30,"az":99,"ss":25,"used":true},{"PRN":18,"el":33,"az":285,"ss":39,"used":true},{"PRN":22,"el":17,"az":319,"ss":37,"used":true},{"PRN":24,"el":3,"az":335,"ss":0,"used":false},{"PRN":26,"el":46,"az":142,"ss":0,"used":false},{"PRN":27,"el":69,"az":284,"ss":44,"used":true},{"PRN":28,"el":32,"az":52,"ss":31,"used":true},{"PRN":120,"el":28,"az":204,"ss":38,"used":false}]} $GPGLL,5155.55359,N,00434.65730,E,085515.00,A,A*6A {"class":"TPV","mode":3,"time":"2010-08-21T08:55:15.000Z","ept":0.005,"lat":51.925893167,"lon":4.577621667,"alt":2.100,"epx":10.819,"epy":36.045,"epv":50.600,"speed":0.003,"climb":0.000,"eps":0.07} $GPTXT,01,01,02,u-blox ag - www.u-blox.com*50 $GPTXT,01,01,02,HW UBX-G50xx 00040005 *53 $GPTXT,01,01,02,EXT CORE 6.00 (33247) May 13 2009 17:35:46*49 $GPTXT,01,01,02,ROM BASE 4.00 (25682) Jan 14 2008 16:29:23*4F $GPTXT,01,01,02,MOD LEA-5H-0*2E $GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20 $GPTXT,01,01,02,ANTSTATUS=OK*3B $GPRMC,085516.00,A,5155.55350,N,00434.65733,E,0.050,,210810,,,A*75 {"class":"TPV","mode":2,"time":"2010-08-21T08:55:16.000Z","ept":0.005,"lat":51.925891667,"lon":4.577622167,"epx":10.819,"epy":36.045,"track":0.0000,"speed":0.026,"eps":72.09} $GPVTG,,T,,M,0.050,N,0.092,K,A*2D $GPGGA,085516.00,5155.55350,N,00434.65733,E,1,08,1.00,2.0,M,46.0,M,,*5F $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,17,09,51,276,43,11,01,043,,12,11,215,29*7F $GPGSV,4,2,13,15,73,189,40,17,30,099,25,18,33,285,39,22,17,319,38*71 $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,30*76 $GPGSV,4,4,13,33,28,204,38*4C {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":1.37,"tdop":1.66,"hdop":1.00,"gdop":3.72,"pdop":1.69,"satellites":[{"PRN":8,"el":4,"az":82,"ss":17,"used":false},{"PRN":9,"el":51,"az":276,"ss":43,"used":true},{"PRN":11,"el":1,"az":43,"ss":0,"used":false},{"PRN":12,"el":11,"az":215,"ss":29,"used":true},{"PRN":15,"el":73,"az":189,"ss":40,"used":true},{"PRN":17,"el":30,"az":99,"ss":25,"used":true},{"PRN":18,"el":33,"az":285,"ss":39,"used":true},{"PRN":22,"el":17,"az":319,"ss":38,"used":true},{"PRN":24,"el":3,"az":335,"ss":0,"used":false},{"PRN":26,"el":46,"az":142,"ss":0,"used":false},{"PRN":27,"el":69,"az":284,"ss":44,"used":true},{"PRN":28,"el":32,"az":52,"ss":30,"used":true},{"PRN":120,"el":28,"az":204,"ss":38,"used":false}]} $GPGLL,5155.55350,N,00434.65733,E,085516.00,A,A*63 {"class":"TPV","mode":3,"time":"2010-08-21T08:55:16.000Z","ept":0.005,"lat":51.925891667,"lon":4.577622167,"alt":2.000,"epx":10.819,"epy":36.045,"epv":31.510,"track":0.0000,"speed":0.026,"climb":0.000,"eps":72.09} $GPRMC,085517.00,A,5155.55340,N,00434.65739,E,0.025,,210810,,,A*7D {"class":"TPV","mode":2,"time":"2010-08-21T08:55:17.000Z","ept":0.005,"lat":51.925890000,"lon":4.577623167,"epx":10.819,"epy":36.045,"track":0.0000,"speed":0.013,"eps":72.09} $GPVTG,,T,,M,0.025,N,0.046,K,A*26 $GPGGA,085517.00,5155.55340,N,00434.65739,E,1,08,1.00,1.8,M,46.0,M,,*5E $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,17,09,51,276,43,11,01,043,,12,11,215,29*7F $GPGSV,4,2,13,15,73,189,41,17,30,099,25,18,33,285,39,22,17,319,38*70 $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,30*76 $GPGSV,4,4,13,33,28,204,38*4C {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":1.37,"tdop":1.66,"hdop":1.00,"gdop":3.72,"pdop":1.69,"satellites":[{"PRN":8,"el":4,"az":82,"ss":17,"used":false},{"PRN":9,"el":51,"az":276,"ss":43,"used":true},{"PRN":11,"el":1,"az":43,"ss":0,"used":false},{"PRN":12,"el":11,"az":215,"ss":29,"used":true},{"PRN":15,"el":73,"az":189,"ss":41,"used":true},{"PRN":17,"el":30,"az":99,"ss":25,"used":true},{"PRN":18,"el":33,"az":285,"ss":39,"used":true},{"PRN":22,"el":17,"az":319,"ss":38,"used":true},{"PRN":24,"el":3,"az":335,"ss":0,"used":false},{"PRN":26,"el":46,"az":142,"ss":0,"used":false},{"PRN":27,"el":69,"az":284,"ss":44,"used":true},{"PRN":28,"el":32,"az":52,"ss":30,"used":true},{"PRN":120,"el":28,"az":204,"ss":38,"used":false}]} $GPGLL,5155.55340,N,00434.65739,E,085517.00,A,A*69 {"class":"TPV","mode":3,"time":"2010-08-21T08:55:17.000Z","ept":0.005,"lat":51.925890000,"lon":4.577623167,"alt":1.800,"epx":10.819,"epy":36.045,"epv":31.510,"track":0.0000,"speed":0.013,"climb":0.000,"eps":72.09} $GPRMC,085518.00,A,5155.55332,N,00434.65744,E,0.017,,210810,,,A*7C {"class":"TPV","mode":2,"time":"2010-08-21T08:55:18.000Z","ept":0.005,"lat":51.925888667,"lon":4.577624000,"epx":10.819,"epy":36.045,"track":0.0000,"speed":0.009,"eps":72.09} $GPVTG,,T,,M,0.017,N,0.032,K,A*24 $GPGGA,085518.00,5155.55332,N,00434.65744,E,1,08,1.00,1.6,M,46.0,M,,*50 $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,17,09,51,276,42,11,01,043,,12,11,215,29*7E $GPGSV,4,2,13,15,73,189,41,17,30,099,27,18,33,285,39,22,17,319,39*73 $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,31*77 $GPGSV,4,4,13,33,28,204,38*4C {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":1.37,"tdop":1.66,"hdop":1.00,"gdop":3.72,"pdop":1.69,"satellites":[{"PRN":8,"el":4,"az":82,"ss":17,"used":false},{"PRN":9,"el":51,"az":276,"ss":42,"used":true},{"PRN":11,"el":1,"az":43,"ss":0,"used":false},{"PRN":12,"el":11,"az":215,"ss":29,"used":true},{"PRN":15,"el":73,"az":189,"ss":41,"used":true},{"PRN":17,"el":30,"az":99,"ss":27,"used":true},{"PRN":18,"el":33,"az":285,"ss":39,"used":true},{"PRN":22,"el":17,"az":319,"ss":39,"used":true},{"PRN":24,"el":3,"az":335,"ss":0,"used":false},{"PRN":26,"el":46,"az":142,"ss":0,"used":false},{"PRN":27,"el":69,"az":284,"ss":44,"used":true},{"PRN":28,"el":32,"az":52,"ss":31,"used":true},{"PRN":120,"el":28,"az":204,"ss":38,"used":false}]} $GPGLL,5155.55332,N,00434.65744,E,085518.00,A,A*69 {"class":"TPV","mode":3,"time":"2010-08-21T08:55:18.000Z","ept":0.005,"lat":51.925888667,"lon":4.577624000,"alt":1.600,"epx":10.819,"epy":36.045,"epv":31.510,"track":0.0000,"speed":0.009,"climb":0.000,"eps":72.09} $GPRMC,085519.00,A,5155.55322,N,00434.65748,E,0.056,,210810,,,A*75 {"class":"TPV","mode":2,"time":"2010-08-21T08:55:19.000Z","ept":0.005,"lat":51.925887000,"lon":4.577624667,"epx":10.819,"epy":36.045,"track":0.0000,"speed":0.029,"eps":72.09} $GPVTG,,T,,M,0.056,N,0.104,K,A*25 $GPGGA,085519.00,5155.55322,N,00434.65748,E,1,08,1.00,1.5,M,46.0,M,,*5F $GPGSA,A,3,15,27,09,28,18,17,22,12,,,,,1.69,1.00,1.37*06 $GPGSV,4,1,13,08,04,082,16,09,51,276,42,11,01,043,,12,11,215,28*7E $GPGSV,4,2,13,15,72,188,41,17,30,099,26,18,33,285,39,22,17,319,38*73 $GPGSV,4,3,13,24,03,335,,26,46,142,,27,69,284,44,28,32,052,30*76 $GPGSV,4,4,13,33,28,204,38*4C {"class":"SKY","xdop":0.72,"ydop":2.40,"vdop":1.37,"tdop":1.66,"hdop":1.00,"gdop":3.72,"pdop":1.69,"satellites":[{"PRN":8,"el":4,"az":82,"ss":16,"used":false},{"PRN":9,"el":51,"az":276,"ss":42,"used":true},{"PRN":11,"el":1,"az":43,"ss":0,"used":false},{"PRN":12,"el":11,"az":215,"ss":28,"used":true},{"PRN":15,"el":72,"az":188,"ss":41,"used":true},{"PRN":17,"el":30,"az":99,"ss":26,"used":true},{"PRN":18,"el":33,"az":285,"ss":39,"used":true},{"PRN":22,"el":17,"az":319,"ss":38,"used":true},{"PRN":24,"el":3,"az":335,"ss":0,"used":false},{"PRN":26,"el":46,"az":142,"ss":0,"used":false},{"PRN":27,"el":69,"az":284,"ss":44,"used":true},{"PRN":28,"el":32,"az":52,"ss":30,"used":true},{"PRN":120,"el":28,"az":204,"ss":38,"used":false}]} $GPGLL,5155.55322,N,00434.65748,E,085519.00,A,A*65 {"class":"TPV","mode":3,"time":"2010-08-21T08:55:19.000Z","ept":0.005,"lat":51.925887000,"lon":4.577624667,"alt":1.500,"epx":10.819,"epy":36.045,"epv":31.510,"track":0.0000,"speed":0.029,"climb":0.000,"eps":72.09} $GPRMC,085520.00,A,5155.55317,N,00434.65752,E,0.011,,210810,,,A*71 {"class":"TPV","mode":2,"time":"2010-08-21T08:55:20.000Z","ept":0.005,"lat":51.925886167,"lon":4.577625333,"epx":10.819,"epy":36.045,"track":0.0000,"speed":0.006,"eps":72.09} gpsd-3.15/test/daemon/ublox-lea-5q.log0000664000175000017500000000442112461156335015714 0ustar esresr# Name: u-blox LEA-5q # Description: OEM module # Submitter: Thomas Sprinkmeier # Date: 2011-02-02 # Location: Adelaide, AU, 34.9S, 138.6E $GPVTG,,,,,,,,,N*30 $GPGGA,001901.00,,,,,0,00,99.99,,,,,,*6F $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001901.00,V,N*43 $GPGST,001901.00,0.0000,,,,304885,304880,62123*5F $GPRMC,001902.00,V,,,,,,,020211,,,N*77 $GPVTG,,,,,,,,,N*30 $GPGGA,001902.00,,,,,0,00,99.99,,,,,,*6C $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001902.00,V,N*40 $GPGST,001902.00,0.0000,,,,305018,305012,62144*52 $GPRMC,001903.00,V,,,,,,,020211,,,N*76 $GPVTG,,,,,,,,,N*30 $GPGGA,001903.00,,,,,0,00,99.99,,,,,,*6D $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001903.00,V,N*41 $GPGST,001903.00,0.0000,,,,305150,305145,62166*5D $GPRMC,001904.00,V,,,,,,,020211,,,N*71 $GPVTG,,,,,,,,,N*30 $GPGGA,001904.00,,,,,0,00,99.99,,,,,,*6A $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001904.00,V,N*46 $GPGST,001904.00,0.0000,,,,305282,305277,62188*54 $GPRMC,001905.00,V,,,,,,,020211,,,N*70 $GPVTG,,,,,,,,,N*30 $GPGGA,001905.00,,,,,0,00,99.99,,,,,,*6B $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001905.00,V,N*47 $GPGST,001905.00,0.0000,,,,305415,305409,62209*58 $GPRMC,001906.00,V,,,,,,,020211,,,N*73 $GPVTG,,,,,,,,,N*30 $GPGGA,001906.00,,,,,0,00,99.99,,,,,,*68 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001906.00,V,N*44 $GPGST,001906.00,0.0000,,,,305547,305542,62231*58 $GPRMC,001907.00,V,,,,,,,020211,,,N*72 $GPVTG,,,,,,,,,N*30 $GPGGA,001907.00,,,,,0,00,99.99,,,,,,*69 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001907.00,V,N*45 $GPGST,001907.00,0.0000,,,,305680,305674,62253*53 $GPRMC,001908.00,V,,,,,,,020211,,,N*7D $GPVTG,,,,,,,,,N*30 $GPGGA,001908.00,,,,,0,00,99.99,,,,,,*66 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001908.00,V,N*4A $GPGST,001908.00,0.0000,,,,305812,305807,62274*56 $GPRMC,001909.00,V,,,,,,,020211,,,N*7C $GPVTG,,,,,,,,,N*30 $GPGGA,001909.00,,,,,0,00,99.99,,,,,,*67 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001909.00,V,N*4B $GPGST,001909.00,0.0000,,,,305944,305939,62296*55 $GPRMC,001910.00,V,,,,,,,020211,,,N*74 gpsd-3.15/test/daemon/ublox-lea-5q.log.chk0000664000175000017500000000654412467340617016474 0ustar esresr$GPVTG,,,,,,,,,N*30 $GPGGA,001901.00,,,,,0,00,99.99,,,,,,*6F $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 {"class":"TPV","mode":1} $GPGSV,1,1,00*79 $GPGLL,,,,,001901.00,V,N*43 $GPGST,001901.00,0.0000,,,,304885,304880,62123*5F {"class":"GST","time":"1970-01-01T00:31:41.000Z","rms":0.000,"lat":304885.000,"lon":304880.000,"alt":62123.000} $GPRMC,001902.00,V,,,,,,,020211,,,N*77 $GPVTG,,,,,,,,,N*30 $GPGGA,001902.00,,,,,0,00,99.99,,,,,,*6C $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 {"class":"TPV","mode":1} $GPGSV,1,1,00*79 $GPGLL,,,,,001902.00,V,N*40 $GPGST,001902.00,0.0000,,,,305018,305012,62144*52 {"class":"TPV","mode":0} {"class":"GST","time":"1970-01-01T00:31:42.000Z","rms":0.000,"lat":305018.000,"lon":305012.000,"alt":62144.000} $GPRMC,001903.00,V,,,,,,,020211,,,N*76 $GPVTG,,,,,,,,,N*30 $GPGGA,001903.00,,,,,0,00,99.99,,,,,,*6D $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001903.00,V,N*41 $GPGST,001903.00,0.0000,,,,305150,305145,62166*5D {"class":"TPV","mode":0} {"class":"GST","time":"1970-01-01T00:31:43.000Z","rms":0.000,"lat":305150.000,"lon":305145.000,"alt":62166.000} $GPRMC,001904.00,V,,,,,,,020211,,,N*71 $GPVTG,,,,,,,,,N*30 $GPGGA,001904.00,,,,,0,00,99.99,,,,,,*6A $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001904.00,V,N*46 $GPGST,001904.00,0.0000,,,,305282,305277,62188*54 {"class":"TPV","mode":0} {"class":"GST","time":"1970-01-01T00:31:44.000Z","rms":0.000,"lat":305282.000,"lon":305277.000,"alt":62188.000} $GPRMC,001905.00,V,,,,,,,020211,,,N*70 $GPVTG,,,,,,,,,N*30 $GPGGA,001905.00,,,,,0,00,99.99,,,,,,*6B $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001905.00,V,N*47 $GPGST,001905.00,0.0000,,,,305415,305409,62209*58 {"class":"TPV","mode":0} {"class":"GST","time":"1970-01-01T00:31:45.000Z","rms":0.000,"lat":305415.000,"lon":305409.000,"alt":62209.000} $GPRMC,001906.00,V,,,,,,,020211,,,N*73 $GPVTG,,,,,,,,,N*30 $GPGGA,001906.00,,,,,0,00,99.99,,,,,,*68 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001906.00,V,N*44 $GPGST,001906.00,0.0000,,,,305547,305542,62231*58 {"class":"TPV","mode":0} {"class":"GST","time":"1970-01-01T00:31:46.000Z","rms":0.000,"lat":305547.000,"lon":305542.000,"alt":62231.000} $GPRMC,001907.00,V,,,,,,,020211,,,N*72 $GPVTG,,,,,,,,,N*30 $GPGGA,001907.00,,,,,0,00,99.99,,,,,,*69 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001907.00,V,N*45 $GPGST,001907.00,0.0000,,,,305680,305674,62253*53 {"class":"TPV","mode":0} {"class":"GST","time":"1970-01-01T00:31:47.000Z","rms":0.000,"lat":305680.000,"lon":305674.000,"alt":62253.000} $GPRMC,001908.00,V,,,,,,,020211,,,N*7D $GPVTG,,,,,,,,,N*30 $GPGGA,001908.00,,,,,0,00,99.99,,,,,,*66 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001908.00,V,N*4A $GPGST,001908.00,0.0000,,,,305812,305807,62274*56 {"class":"TPV","mode":0} {"class":"GST","time":"1970-01-01T00:31:48.000Z","rms":0.000,"lat":305812.000,"lon":305807.000,"alt":62274.000} $GPRMC,001909.00,V,,,,,,,020211,,,N*7C $GPVTG,,,,,,,,,N*30 $GPGGA,001909.00,,,,,0,00,99.99,,,,,,*67 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,00*79 $GPGLL,,,,,001909.00,V,N*4B $GPGST,001909.00,0.0000,,,,305944,305939,62296*55 {"class":"TPV","mode":0} {"class":"GST","time":"1970-01-01T00:31:49.000Z","rms":0.000,"lat":305944.000,"lon":305939.000,"alt":62296.000} $GPRMC,001910.00,V,,,,,,,020211,,,N*74 gpsd-3.15/test/daemon/ublox-sirf1.log0000664000175000017500000000641012467342657015666 0ustar esresr# Name: u-blox (SiRf variant) # Chipset: Sirf-I with u-blox firmware # Submitter: Rob Janssen # Date: 2005-06-11 # Location: Utrecht, Netherlands, 52N5E # No entry for this on our hardware page. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. #  ¢`ÿ#Time: 02074378 Int: 017/074/027 ms: 0661 * 00 BF BF * BF 00 BF * 00 BF 00 * BF BF BF 1000000¹°³ ¢Œ.I k ~g _~¿.......///},¿,-,-,---,-§Š¿-,----,--, šDÆG¿++**++++++Ó.b¿.//...../.7]$¿////.///./<%¿---,,-----ÄV¿///00/0//0,°³ ¢);·÷^ÌLg5 .I k ‡°³ ¢ F’°³ ¢'bjƒNˆÙ|=-©ßBdÕ 6¯  Q°³ ¢°³ ¢`ÿ#Time: 02074379 Int: 019/081/027 ms: 0658 * 00 BF BF * BF 00 BF * 00 BF 00 * BF BF BF 1000000À°³ ¢Œ.I Ï ~g _~¿///../.../},¿---,--,,,,§Š¿,-,------- šDÆG¿++++++++++Ó.b¿..../////.7]$¿////...///<%¿,,,--,-,,,ÄV¿/00//0//0/°³ ¢);·÷^ÌLg5 .I Ï ë°³ ¢ ?—°³ ¢'bjƒMˆÙ|==Ÿä/dÕ :—  Z°³ ¢°³ ¢`ÿ#Time: 02074380 Int: 017/063/027 ms: 0663 * 00 BF BF * BF 00 BF * 00 BF 00 * BF BF BF 1000000²°³ ¢Œ.I 3 ~g _~¿./../////.},¿,----,-,-,§Š¿-,-------- šDÆG¿+++++++++,Ó.b¿////./././7]$¿/./../////<%¿,---,---,,ÄV¿/0000/00//°³ ¢);·÷^ÌLg5 .I 3 P°³ ¢ 0•°³ ¢'bjƒMˆÙ|=N•)=dÕ >  {°³ ¢°³ ¢`ÿ#Time: 02074381 Int: 017/087/027 ms: 0661 * 00 BF BF * BF 00 BF * 00 BF 00 * BF BF BF 1000000·°³ ¢Œ.I — ~g _~¿/././/////},¿,,,,-,-,,,§Š¿-,,,-,--,, šDÆG¿++++,+++++Ó.b¿//..//..//7]$¿././/./...<%¿,,,,-,,,,,ÄV¿00000000//V°³ ¢);·÷^ÌLg5 .I — ް³ ¢ E˜°³ ¢'bjƒMˆÙ|=\÷›zdÕ Bg  ‹°³ ¢°³ ¢`ÿ#Time: 02074382 Int: 030/069/027 ms: 0664 * 00 BF BF * BF 00 BF * 00 BF 00 * BF BF BF 1000000¶°³ ¢ÿCSTD: New almanac for SV 23 S°³ ¢Œ.I û ~g _~¿/////.././},¿-,--,-,-,,§Š¿----,-,--, šDÆG¿+,++++++,+Ó.b¿///.//.///7]$¿.///......<%¿.,-,------ÄV¿//0//////0ð³ ¢);·÷^ÌLg5 .I û °³ ¢ <¢°³ ¢'bjƒMˆÙ|=lEßdÕ FO  ް³ ¢°³ ¢`ÿ#Time: 02074383 Int: 017/090/027 ms: 0674 * 00 BF BF * BF 00 BF * 00 BF 00 * BF BF BF 1000000·°³ ¢Œ.I _ ~g _~¿//..//////},¿,,,,-,,,--§Š¿,,-,,----, šDÆG¿++,,++++,+Ó.b¿.././/////7]$¿./..../...<%¿-,,,-,--,-ÄV¿/00/00///0#°³ ¢);·÷^ÌLg5 .I _ }°³ ¢ I™!°³ ¢'bjƒMˆÙ|=|{7dÕ J7  F°³ ¢°³ ¢`ÿ#Time: 02074384 Int: 031/076/027 ms: 0665 * 00 BF BF * BF 00 BF * 00 BF 00 * BF BF BF 1000000ž°³ ¢Œ.I à ~g _~¿./////////},¿--,,-,,-,,§Š¿,-,--,,,-, šDÆG¿++++,+++++Ó.b¿/.//..////7]$¿......../.<%¿-,,,,,,,,,ÄV¿//00//00//€°³ ¢);·÷^ÌLg5 .I à ᰳ ¢ M œ/°³ ¢'bjƒMˆÙ|=‘wÌdÕ N  ;°³ gpsd-3.15/test/daemon/ublox-sirf1.log.chk0000664000175000017500000002375712467342657016447 0ustar esresr$GPGSV,3,1,12,04,51,189,00,11,63,142,46,23,22,187,45,20,69,250,45*7D $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,45,24,43,294,47*77 {"class":"SKY","time":"2005-06-11T09:06:10.990Z","xdop":0.64,"ydop":0.75,"vdop":1.61,"tdop":1.05,"hdop":0.99,"gdop":2.16,"pdop":1.89,"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":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":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}]} $GPZDA,090610.99,11,06,2005,00,00*69 $GPGGA,090610,5203.7606,N,00508.3161,E,1,08,1.80,33.30,M,46.772,M,,*75 $GPRMC,090610,A,5203.7606,N,00508.3161,E,0.0000,0.000,110605,,*2B $GPGSA,A,3,11,23,20,7,1,14,25,24,,,,,1.9,1.8,1.6*35 $GPGBS,090610,9.63,M,11.27,M,37.03,M*3E {"class":"TPV","mode":3,"time":"2005-06-11T09:06:10.990Z","ept":0.005,"lat":52.062675884,"lon":5.138600900,"alt":33.299,"epx":9.631,"epy":11.267,"epv":37.032,"track":0.0000,"speed":0.000,"climb":0.000} $GPZDA,090614.00,11,06,2005,00,00*6D $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,11,23,20,7,1,14,25,24,,,,,0.8,1.8,1.0*33 $GPGBS,090613,9.63,M,11.27,M,23.00,M*3B {"class":"TPV","mode":3,"time":"2005-06-11T09:06:13.999Z","ept":0.005,"lat":52.062675221,"lon":5.138613239,"alt":34.425,"epx":9.631,"epy":11.267,"epv":23.000,"track":54.4418,"speed":0.023,"climb":0.024,"eps":7.49,"epc":19.95} $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","time":"2005-06-11T09:06:11.990Z","xdop":0.64,"ydop":0.75,"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}]} $GPZDA,090615.00,11,06,2005,00,00*6C $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,11,23,20,7,1,14,25,24,,,,,0.8,1.8,1.0*33 {"class":"TPV","mode":3,"time":"2005-06-11T09:06:14.999Z","ept":0.005,"lat":52.062674648,"lon":5.138613239,"alt":34.441,"epx":9.631,"epy":11.267,"epv":23.000,"track":55.2310,"speed":0.027,"climb":0.027,"eps":22.53,"epc":46.00} $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","time":"2005-06-11T09:06:12.990Z","xdop":0.64,"ydop":0.75,"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}]} $GPZDA,090616.00,11,06,2005,00,00*6F $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,11,23,20,7,1,14,25,24,,,,,0.8,1.8,1.0*33 {"class":"TPV","mode":3,"time":"2005-06-11T09:06:15.999Z","ept":0.005,"lat":52.062674648,"lon":5.138613239,"alt":34.458,"epx":9.631,"epy":11.267,"epv":23.000,"track":53.6641,"speed":0.024,"climb":0.024,"eps":22.53,"epc":46.00} $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","time":"2005-06-11T09:06:13.990Z","xdop":0.64,"ydop":0.75,"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}]} $GPZDA,090617.00,11,06,2005,00,00*6E $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,11,23,20,7,1,14,25,24,,,,,0.8,1.8,1.0*33 {"class":"TPV","mode":3,"time":"2005-06-11T09:06:16.999Z","ept":0.005,"lat":52.062674648,"lon":5.138613239,"alt":34.472,"epx":9.631,"epy":11.267,"epv":23.000,"track":57.3607,"speed":0.027,"climb":0.026,"eps":22.53,"epc":46.00} $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","time":"2005-06-11T09:06:14.990Z","xdop":0.64,"ydop":0.75,"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}]} $GPZDA,090618.00,11,06,2005,00,00*61 $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,11,23,20,7,1,14,25,24,,,,,0.8,1.8,1.0*33 {"class":"TPV","mode":3,"time":"2005-06-11T09:06:17.999Z","ept":0.005,"lat":52.062674648,"lon":5.138613239,"alt":34.488,"epx":9.631,"epy":11.267,"epv":23.000,"track":50.6579,"speed":0.024,"climb":0.025,"eps":22.53,"epc":46.00} $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","time":"2005-06-11T09:06:15.990Z","xdop":0.64,"ydop":0.75,"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}]} $GPZDA,090619.00,11,06,2005,00,00*60 $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,11,23,20,7,1,14,25,24,,,,,0.8,1.8,1.0*33 {"class":"TPV","mode":3,"time":"2005-06-11T09:06:18.999Z","ept":0.005,"lat":52.062674648,"lon":5.138613239,"alt":34.504,"epx":9.631,"epy":11.267,"epv":23.000,"track":58.5200,"speed":0.030,"climb":0.029,"eps":22.53,"epc":46.00} $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","time":"2005-06-11T09:06:16.990Z","xdop":0.64,"ydop":0.75,"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}]} $GPZDA,090620.00,11,06,2005,00,00*6A $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,11,23,20,7,1,14,25,24,,,,,0.8,1.8,1.0*33 {"class":"TPV","mode":3,"time":"2005-06-11T09:06:19.999Z","ept":0.005,"lat":52.062674648,"lon":5.138613239,"alt":34.525,"epx":9.631,"epy":11.267,"epv":23.000,"track":52.5503,"speed":0.027,"climb":0.027,"eps":22.53,"epc":46.00} gpsd-3.15/test/daemon/udp-test.log0000664000175000017500000000156712470063433015252 0ustar esresr# Name: Generic NMEA # Submitter: Eric S. Raymond # Date: 2013-11-03 # Transport: UDP # Notes: The most significant thing about this test load is not the content, # but the magic cookie that tells it to feed the daemon over UDP # rather than a pseudo-tty. We include some leading garbage as a # robustness check for the packetizer. There is a TCP test load # that feeds the same content. ,1.7,-30.40,M,-13.9,M,,*7D $GPGGA,193221.00,2037.72792,N,08704.08478,W,1,04,1.7,-30.40,M,-13.9,M,,*7D $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 $GPRMC,193221.00,A,2037.7279,N,08704.0848,W,00.1,201.8,231207,01,W,A*2D $GPZDA,193223.00,23,12,2007,00,00*69 gpsd-3.15/test/daemon/udp-test.log.chk0000664000175000017500000000270112467340617016015 0ustar esresr$GPGGA,193221.00,2037.72792,N,08704.08478,W,1,04,1.7,-30.40,M,-13.9,M,,*7D {"class":"TPV","mode":3,"lat":20.628798667,"lon":-87.068079667,"alt":-30.400} $GPGSA,A,3,10,28,09,13,,,,,,,,,03.4,01.7,03.0*00 {"class":"TPV","mode":3,"lat":20.628798667,"lon":-87.068079667,"alt":-30.400,"epv":69.000} $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","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":120,"el":8,"az":96,"ss":0,"used":false},{"PRN":122,"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","mode":3,"time":"2007-12-23T19:32:21.000Z","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} $GPZDA,193223.00,23,12,2007,00,00*69 gpsd-3.15/test/daemon/venus634lp.log0000664000175000017500000000617012467342657015447 0ustar esresr# Name: Venus634LP # Submitter: Viktar Palstsiuk # Date: 2010-02-05 # Location: Minsk, Belarus, 53N 27E $SkyTraq,Venus6 $Kernel,v1.4.23,000006FE,19324205,F,16.367667MHz $ver,011023,rev,090210 $GPVTG,287.04,T,,M,0.774,N,1.435,K,A*33 $GPGGA,085032.00,5355.17581,N,02730.04649,E,1,04,17.30,267.5,M,25.0,M,,*65 $GPGSA,A,3,18,21,24,15,,,,,,,,,18.95,17.30,7.74*0E $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,24,14,06,151,*71 $GPGSV,3,2,12,15,15,032,46,16,15,204,,18,55,074,42,19,47,295,20*76 $GPGSV,3,3,12,21,33,087,48,22,67,157,,24,02,084,40,26,18,131,34*7D $GPGLL,5355.17581,N,02730.04649,E,085032.00,A,A*60 $GPRMC,085033.00,A,5355.17512,N,02730.04479,E,0.835,284.07,050210,,,A*6C $GPVTG,284.07,T,,M,0.835,N,1.547,K,A*3D $GPGGA,085033.00,5355.17512,N,02730.04479,E,1,04,17.31,266.9,M,25.0,M,,*63 $GPGSA,A,3,18,21,24,15,,,,,,,,,18.96,17.31,7.74*0C $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,26,14,06,151,*73 $GPGSV,3,2,12,15,15,032,47,16,15,204,,18,55,074,43,19,47,295,19*7C $GPGSV,3,3,12,21,33,087,49,22,67,157,,24,02,084,41,26,18,131,36*7F $GPGLL,5355.17512,N,02730.04479,E,085033.00,A,A*6A $GPRMC,085034.00,A,5355.17453,N,02730.04323,E,0.492,281.09,050210,,,A*6D $GPVTG,281.09,T,,M,0.492,N,0.911,K,A*39 $GPGGA,085034.00,5355.17453,N,02730.04323,E,1,04,17.31,266.2,M,25.0,M,,*63 $GPGSA,A,3,18,21,24,15,,,,,,,,,18.96,17.31,7.74*0C $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,26,14,06,151,*73 $GPGSV,3,2,12,15,15,032,47,16,15,204,,18,55,074,43,19,47,295,18*7D $GPGSV,3,3,12,21,33,087,48,22,67,157,,24,02,084,40,26,18,131,35*7C $GPGLL,5355.17453,N,02730.04323,E,085034.00,A,A*61 $GPRMC,085035.00,A,5355.17396,N,02730.04163,E,0.355,280.76,050210,,,A*61 $GPVTG,280.76,T,,M,0.355,N,0.657,K,A*31 $GPGGA,085035.00,5355.17396,N,02730.04163,E,1,04,17.32,265.6,M,25.0,M,,*6E $GPGSA,A,3,18,21,24,15,,,,,,,,,18.97,17.32,7.74*0E $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,26,14,06,151,*73 $GPGSV,3,2,12,15,15,032,47,16,15,204,,18,55,074,43,19,47,295,16*73 $GPGSV,3,3,12,21,33,087,47,22,67,157,,24,02,084,40,26,18,131,35*73 $GPGLL,5355.17396,N,02730.04163,E,085035.00,A,A*68 $GPRMC,085036.00,A,5355.17332,N,02730.04006,E,0.831,278.54,050210,,,A*60 $GPVTG,278.54,T,,M,0.831,N,1.540,K,A*3B $GPGGA,085036.00,5355.17332,N,02730.04006,E,1,04,17.33,265.3,M,25.0,M,,*65 $GPGSA,A,3,18,21,24,15,,,,,,,,,18.98,17.33,7.74*00 $GPGSV,3,1,12,03,67,251,28,06,72,220,,08,07,331,27,14,06,151,*78 $GPGSV,3,2,12,15,15,032,47,16,15,204,,18,55,074,43,19,47,295,14*71 $GPGSV,3,3,12,21,33,087,47,22,67,157,,24,02,084,41,26,18,131,36*71 $GPGLL,5355.17332,N,02730.04006,E,085036.00,A,A*67 $GPRMC,085037.00,A,5355.17281,N,02730.03900,E,0.252,277.72,050210,,,A*64 $GPVTG,277.72,T,,M,0.252,N,0.467,K,A*3A $GPGGA,085037.00,5355.17281,N,02730.03900,E,1,04,17.34,265.1,M,25.0,M,,*60 $GPGSA,A,3,18,21,24,15,,,,,,,,,18.98,17.34,7.74*07 $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,27,14,06,151,*72 $GPGSV,3,2,12,15,15,032,48,16,15,204,,18,55,074,43,19,47,295,13*79 $GPGSV,3,3,12,21,33,087,47,22,67,157,,24,02,084,41,26,18,131,36*71 $GPGLL,5355.17281,N,02730.03900,E,085037.00,A,A*67 $GPRMC,085038.00,A,5355.17239,N,02730.03826,E,0.115,,050210,,,A*74 gpsd-3.15/test/daemon/venus634lp.log.chk0000664000175000017500000002047012467342657016212 0ustar esresr$GPVTG,287.04,T,,M,0.774,N,1.435,K,A*33 $GPGGA,085032.00,5355.17581,N,02730.04649,E,1,04,17.30,267.5,M,25.0,M,,*65 {"class":"TPV","mode":3,"lat":53.919596833,"lon":27.500774833,"alt":267.500} $GPGSA,A,3,18,21,24,15,,,,,,,,,18.95,17.30,7.74*0E {"class":"TPV","mode":3,"lat":53.919596833,"lon":27.500774833,"alt":267.500,"epv":178.020} $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,24,14,06,151,*71 $GPGSV,3,2,12,15,15,032,46,16,15,204,,18,55,074,42,19,47,295,20*76 $GPGSV,3,3,12,21,33,087,48,22,67,157,,24,02,084,40,26,18,131,34*7D {"class":"SKY","xdop":15.73,"ydop":8.87,"vdop":7.74,"tdop":17.21,"hdop":17.30,"gdop":26.27,"pdop":18.95,"satellites":[{"PRN":3,"el":67,"az":251,"ss":0,"used":false},{"PRN":6,"el":72,"az":220,"ss":0,"used":false},{"PRN":8,"el":7,"az":331,"ss":24,"used":false},{"PRN":14,"el":6,"az":151,"ss":0,"used":false},{"PRN":15,"el":15,"az":32,"ss":46,"used":true},{"PRN":16,"el":15,"az":204,"ss":0,"used":false},{"PRN":18,"el":55,"az":74,"ss":42,"used":true},{"PRN":19,"el":47,"az":295,"ss":20,"used":false},{"PRN":21,"el":33,"az":87,"ss":48,"used":true},{"PRN":22,"el":67,"az":157,"ss":0,"used":false},{"PRN":24,"el":2,"az":84,"ss":40,"used":true},{"PRN":26,"el":18,"az":131,"ss":34,"used":false}]} $GPGLL,5355.17581,N,02730.04649,E,085032.00,A,A*60 {"class":"TPV","mode":3,"lat":53.919596833,"lon":27.500774833,"alt":267.500,"epx":235.985,"epy":133.116,"epv":178.020} $GPRMC,085033.00,A,5355.17512,N,02730.04479,E,0.835,284.07,050210,,,A*6C $GPVTG,284.07,T,,M,0.835,N,1.547,K,A*3D $GPGGA,085033.00,5355.17512,N,02730.04479,E,1,04,17.31,266.9,M,25.0,M,,*63 $GPGSA,A,3,18,21,24,15,,,,,,,,,18.96,17.31,7.74*0C $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,26,14,06,151,*73 $GPGSV,3,2,12,15,15,032,47,16,15,204,,18,55,074,43,19,47,295,19*7C $GPGSV,3,3,12,21,33,087,49,22,67,157,,24,02,084,41,26,18,131,36*7F {"class":"SKY","xdop":15.73,"ydop":8.87,"vdop":7.74,"tdop":17.21,"hdop":17.31,"gdop":26.27,"pdop":18.96,"satellites":[{"PRN":3,"el":67,"az":251,"ss":0,"used":false},{"PRN":6,"el":72,"az":220,"ss":0,"used":false},{"PRN":8,"el":7,"az":331,"ss":26,"used":false},{"PRN":14,"el":6,"az":151,"ss":0,"used":false},{"PRN":15,"el":15,"az":32,"ss":47,"used":true},{"PRN":16,"el":15,"az":204,"ss":0,"used":false},{"PRN":18,"el":55,"az":74,"ss":43,"used":true},{"PRN":19,"el":47,"az":295,"ss":19,"used":false},{"PRN":21,"el":33,"az":87,"ss":49,"used":true},{"PRN":22,"el":67,"az":157,"ss":0,"used":false},{"PRN":24,"el":2,"az":84,"ss":41,"used":true},{"PRN":26,"el":18,"az":131,"ss":36,"used":false}]} $GPGLL,5355.17512,N,02730.04479,E,085033.00,A,A*6A {"class":"TPV","mode":3,"time":"2010-02-05T08:50:33.000Z","ept":0.005,"lat":53.919585333,"lon":27.500746500,"alt":266.900,"epx":235.985,"epy":133.116,"epv":178.020,"track":284.0700,"speed":0.430,"climb":0.000} $GPRMC,085034.00,A,5355.17453,N,02730.04323,E,0.492,281.09,050210,,,A*6D $GPVTG,281.09,T,,M,0.492,N,0.911,K,A*39 $GPGGA,085034.00,5355.17453,N,02730.04323,E,1,04,17.31,266.2,M,25.0,M,,*63 $GPGSA,A,3,18,21,24,15,,,,,,,,,18.96,17.31,7.74*0C $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,26,14,06,151,*73 $GPGSV,3,2,12,15,15,032,47,16,15,204,,18,55,074,43,19,47,295,18*7D $GPGSV,3,3,12,21,33,087,48,22,67,157,,24,02,084,40,26,18,131,35*7C {"class":"SKY","xdop":15.73,"ydop":8.87,"vdop":7.74,"tdop":17.21,"hdop":17.31,"gdop":26.27,"pdop":18.96,"satellites":[{"PRN":3,"el":67,"az":251,"ss":0,"used":false},{"PRN":6,"el":72,"az":220,"ss":0,"used":false},{"PRN":8,"el":7,"az":331,"ss":26,"used":false},{"PRN":14,"el":6,"az":151,"ss":0,"used":false},{"PRN":15,"el":15,"az":32,"ss":47,"used":true},{"PRN":16,"el":15,"az":204,"ss":0,"used":false},{"PRN":18,"el":55,"az":74,"ss":43,"used":true},{"PRN":19,"el":47,"az":295,"ss":18,"used":false},{"PRN":21,"el":33,"az":87,"ss":48,"used":true},{"PRN":22,"el":67,"az":157,"ss":0,"used":false},{"PRN":24,"el":2,"az":84,"ss":40,"used":true},{"PRN":26,"el":18,"az":131,"ss":35,"used":false}]} $GPGLL,5355.17453,N,02730.04323,E,085034.00,A,A*61 {"class":"TPV","mode":3,"time":"2010-02-05T08:50:34.000Z","ept":0.005,"lat":53.919575500,"lon":27.500720500,"alt":266.200,"epx":235.985,"epy":133.116,"epv":178.020,"track":281.0900,"speed":0.253,"climb":0.000,"eps":471.97} $GPRMC,085035.00,A,5355.17396,N,02730.04163,E,0.355,280.76,050210,,,A*61 $GPVTG,280.76,T,,M,0.355,N,0.657,K,A*31 $GPGGA,085035.00,5355.17396,N,02730.04163,E,1,04,17.32,265.6,M,25.0,M,,*6E $GPGSA,A,3,18,21,24,15,,,,,,,,,18.97,17.32,7.74*0E $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,26,14,06,151,*73 $GPGSV,3,2,12,15,15,032,47,16,15,204,,18,55,074,43,19,47,295,16*73 $GPGSV,3,3,12,21,33,087,47,22,67,157,,24,02,084,40,26,18,131,35*73 {"class":"SKY","xdop":15.73,"ydop":8.87,"vdop":7.74,"tdop":17.21,"hdop":17.32,"gdop":26.27,"pdop":18.97,"satellites":[{"PRN":3,"el":67,"az":251,"ss":0,"used":false},{"PRN":6,"el":72,"az":220,"ss":0,"used":false},{"PRN":8,"el":7,"az":331,"ss":26,"used":false},{"PRN":14,"el":6,"az":151,"ss":0,"used":false},{"PRN":15,"el":15,"az":32,"ss":47,"used":true},{"PRN":16,"el":15,"az":204,"ss":0,"used":false},{"PRN":18,"el":55,"az":74,"ss":43,"used":true},{"PRN":19,"el":47,"az":295,"ss":16,"used":false},{"PRN":21,"el":33,"az":87,"ss":47,"used":true},{"PRN":22,"el":67,"az":157,"ss":0,"used":false},{"PRN":24,"el":2,"az":84,"ss":40,"used":true},{"PRN":26,"el":18,"az":131,"ss":35,"used":false}]} $GPGLL,5355.17396,N,02730.04163,E,085035.00,A,A*68 {"class":"TPV","mode":3,"time":"2010-02-05T08:50:35.000Z","ept":0.005,"lat":53.919566000,"lon":27.500693833,"alt":265.600,"epx":235.985,"epy":133.116,"epv":178.020,"track":280.7600,"speed":0.183,"climb":0.000,"eps":471.97} $GPRMC,085036.00,A,5355.17332,N,02730.04006,E,0.831,278.54,050210,,,A*60 $GPVTG,278.54,T,,M,0.831,N,1.540,K,A*3B $GPGGA,085036.00,5355.17332,N,02730.04006,E,1,04,17.33,265.3,M,25.0,M,,*65 $GPGSA,A,3,18,21,24,15,,,,,,,,,18.98,17.33,7.74*00 $GPGSV,3,1,12,03,67,251,28,06,72,220,,08,07,331,27,14,06,151,*78 $GPGSV,3,2,12,15,15,032,47,16,15,204,,18,55,074,43,19,47,295,14*71 $GPGSV,3,3,12,21,33,087,47,22,67,157,,24,02,084,41,26,18,131,36*71 {"class":"SKY","xdop":15.73,"ydop":8.87,"vdop":7.74,"tdop":17.21,"hdop":17.33,"gdop":26.27,"pdop":18.98,"satellites":[{"PRN":3,"el":67,"az":251,"ss":28,"used":false},{"PRN":6,"el":72,"az":220,"ss":0,"used":false},{"PRN":8,"el":7,"az":331,"ss":27,"used":false},{"PRN":14,"el":6,"az":151,"ss":0,"used":false},{"PRN":15,"el":15,"az":32,"ss":47,"used":true},{"PRN":16,"el":15,"az":204,"ss":0,"used":false},{"PRN":18,"el":55,"az":74,"ss":43,"used":true},{"PRN":19,"el":47,"az":295,"ss":14,"used":false},{"PRN":21,"el":33,"az":87,"ss":47,"used":true},{"PRN":22,"el":67,"az":157,"ss":0,"used":false},{"PRN":24,"el":2,"az":84,"ss":41,"used":true},{"PRN":26,"el":18,"az":131,"ss":36,"used":false}]} $GPGLL,5355.17332,N,02730.04006,E,085036.00,A,A*67 {"class":"TPV","mode":3,"time":"2010-02-05T08:50:36.000Z","ept":0.005,"lat":53.919555333,"lon":27.500667667,"alt":265.300,"epx":235.985,"epy":133.116,"epv":178.020,"track":278.5400,"speed":0.428,"climb":0.000,"eps":471.97} $GPRMC,085037.00,A,5355.17281,N,02730.03900,E,0.252,277.72,050210,,,A*64 $GPVTG,277.72,T,,M,0.252,N,0.467,K,A*3A $GPGGA,085037.00,5355.17281,N,02730.03900,E,1,04,17.34,265.1,M,25.0,M,,*60 $GPGSA,A,3,18,21,24,15,,,,,,,,,18.98,17.34,7.74*07 $GPGSV,3,1,12,03,67,251,,06,72,220,,08,07,331,27,14,06,151,*72 $GPGSV,3,2,12,15,15,032,48,16,15,204,,18,55,074,43,19,47,295,13*79 $GPGSV,3,3,12,21,33,087,47,22,67,157,,24,02,084,41,26,18,131,36*71 {"class":"SKY","xdop":15.73,"ydop":8.87,"vdop":7.74,"tdop":17.21,"hdop":17.34,"gdop":26.27,"pdop":18.98,"satellites":[{"PRN":3,"el":67,"az":251,"ss":0,"used":false},{"PRN":6,"el":72,"az":220,"ss":0,"used":false},{"PRN":8,"el":7,"az":331,"ss":27,"used":false},{"PRN":14,"el":6,"az":151,"ss":0,"used":false},{"PRN":15,"el":15,"az":32,"ss":48,"used":true},{"PRN":16,"el":15,"az":204,"ss":0,"used":false},{"PRN":18,"el":55,"az":74,"ss":43,"used":true},{"PRN":19,"el":47,"az":295,"ss":13,"used":false},{"PRN":21,"el":33,"az":87,"ss":47,"used":true},{"PRN":22,"el":67,"az":157,"ss":0,"used":false},{"PRN":24,"el":2,"az":84,"ss":41,"used":true},{"PRN":26,"el":18,"az":131,"ss":36,"used":false}]} $GPGLL,5355.17281,N,02730.03900,E,085037.00,A,A*67 {"class":"TPV","mode":3,"time":"2010-02-05T08:50:37.000Z","ept":0.005,"lat":53.919546833,"lon":27.500650000,"alt":265.100,"epx":235.985,"epy":133.116,"epv":178.020,"track":277.7200,"speed":0.130,"climb":0.000,"eps":471.97} $GPRMC,085038.00,A,5355.17239,N,02730.03826,E,0.115,,050210,,,A*74 gpsd-3.15/test/daemon/zodiac.log0000664000175000017500000001301512461156335014751 0ustar esresr# Name: TU30-D140 OEM module # Chipset: Rockwell Jupiter # Submitter: Rob Janssen # Date: 2005-06-13 # Location: Utrecht, Netherlands, 52N5E # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # Comments: Collected with netcat using gpsd's R=2 mode. ÿTŸy\@À$­t ÿÿ@ ÿè1èy,\@Ã$Ã$/¹t Õ*ÿɚ;ø‚jøØˆŸhbÿÿÿÒÝ¿8€h¿ çÜÿê-êy,\@Ã$Ã$/¹t2,-(/#% 2*ÖÝÿTŸyh\@Á$®t ÿÿÚ ÿè1èy\@Ä$Ä$/ºt Õ*ÿɚ;ø‚jøØˆŸhbÿÒÝ¿8–h¿ gÜÿê-êy\@Ä$Ä$/ºt2,-(/#% 3*nÝÿTŸyÌ\@Â$¯t ÿÿt ÿè1èyô\@Å$Å$/»t Õ*ÿɚ;ø‚jøØˆœhbÿþÿÒÝ¿8¬h¿ êÛÿê-êyô\@Å$Å$/»t2,-(/#% 3*ÝÿTŸy0]@Ã$°t ÿÿ ÿè1èyX]@Æ$Æ$/Œt Õ*ÿɚ;ø‚jøØˆ€hbÿÒÝ¿8Êh¿ UÛÿê-êyX]@Æ$Æ$/Œt2,-(/"% 3*‹ÜÿTŸy”]@Ä$±t ÿÿšÿè1èyŒ]@Ç$Ç$/œt Õ*ÿɚ;ø‚jøØˆ£hbÿÒÝ¿8àh¿ ÜÚÿê-êyŒ]@Ç$Ç$/œt2,-'/"% 3*;ÜÿTŸyø]@Å$²t ÿÿBÿè1èy ^@È$È$/Ÿt Õ*ÿɚ;ø‚jøØˆ¢hbÿÒÝ¿8÷h¿ dÚÿê-êy ^@È$È$/Ÿt2,-'/"$ 3*ÕÛÿTŸy\^@Æ$³t ÿÿÜÿè1èy„^@É$É$/¿t Õ*ÿɚ;ø‚jøØˆ¥hbÿÒÝ¿8i¿ ÙÙÿê-êy„^@É$É$/¿t2,-(."$ 3*nÛÿTŸyÀ^@Ç$Žt ÿÿvÿè1èyè^@Ê$Ê$/Àt Õ*ÿɚ;ø‚jøØˆ€hbÿÒÝ¿8(i¿ XÙÿê-êyé^@Ê$Ê$/Àt2,-'."# 3*ÛÿTŸy$_@È$µt ÿÿÿè1èyL_@Ë$Ë$/Át Õ*ÿɚ;ø‚jøØˆ¥hbÿÒÝ¿8Di¿ ÔØÿê-êyL_@Ë$Ë$/Át2,-'."# 3*¢ÚÿTŸyˆ_@É$¶t ÿÿªÿè1èy°_@Ì$Ì$/Ât Õ*ÿɚ;ø‚jøØˆ€hbÿÿÿÒÝ¿8^i¿ TØÿê-êy°_@Ì$Ì$/Ât2,-'.!# 3*<ÚÿTŸyì_@Ê$·t ÿÿDÿè1èy`@Í$Í$/Ãt Õ*ÿɚ;ø‚jøØˆšhbÿÒÝ¿8{i¿ Å×ÿê-êy`@Í$Í$/Ãt2--'.!# 3*ÓÙÿTŸyP`@Ë$žt ÿÿÞÿè1èyx`@Î$Î$/Ät Õ*ÿɚ;ø‚jøØˆ©hbÿÒÝ¿8–i¿ E×ÿê-êyx`@Î$Î$/Ät2,-'."# 3*mÙÿTŸyŽ`@Ì$¹t ÿÿxÿè1èyÜ`@Ï$Ï$/Åt Õ*ÿɚ;ø‚jøØˆ§hbÿÒÝ¿8ªi¿ ÔÖÿê-êyÜ`@Ï$Ï$/Åt2,-'."$ 3*ÙÿTŸya@Í$ºt ÿÿÿè1èy@a@Ð$Ð$/Æt Õ* ÿɚ;ø‚jøØˆ£hbÿþÿÒÝ¿8Œi¿ cÖÿê-êy@a@Ð$Ð$/Æt2,-'."$ 3*žØÿTŸy|a@Î$»t ÿÿ¬ÿè1èy€a@Ñ$Ñ$/Çt Õ*!ÿɚ;ø‚jøØˆ¥hbÿÒÝ¿8Îi¿ äÕÿê-êy€a@Ñ$Ñ$/Çt2,-'.!$ 3*8ØÿTŸyàa@Ï$Œt ÿÿFÿè1èyb@Ò$Ò$/Èt Õ*"ÿɚ;ø‚jøØˆ£hbÿÿÿÒÝ¿8Ûi¿ yÕÿê-êyb@Ò$Ò$/Èt2,-(."% 3)Ï×ÿTŸyDb@Ð$œt ÿÿàÿè1èylb@Ó$Ó$/Ét Õ*#ÿɚ;ø‚jøØˆ¢hbÿÿÿÒÝ¿8äi¿ Õÿê-êymb@Ó$Ó$/Ét2,-(."% 3*f×ÿTŸyšb@Ñ$Ÿt ÿÿzÿè1èyÐb@Ô$Ô$/Êt Õ*$ÿɚ;ø‚jøØˆ¡hbÿÒÝ¿8ëi¿ Ôÿê-êyÐb@Ô$Ô$/Êt2,,(."% 3*×ÿTŸy c@Ò$¿t ÿÿÿè1èy4c@Õ$Õ$/Ët Õ*%ÿɚ;ø‚jøØˆœhbÿýÿÒÝ¿8ñi¿ 7Ôÿê-êy4c@Õ$Õ$/Ët2,,(."% 3*šÖÿTŸypc@Ó$Àt ÿÿ®ÿè1èy˜c@Ö$Ö$/Ìt Õ*&ÿɚ;ø‚jøØˆšhbÿýÿÒÝ¿8üi¿ ÂÓÿê-êy™c@Ö$Ö$/Ìt2,,(."% 3*2ÖÿTŸyÔc@Ô$Át ÿÿHÿè1èyüc@×$×$/Ít Õ*'ÿɚ;ø‚jøØˆ›hbÿÿÿÒÝ¿8j¿ 7Óÿê-êyüc@×$×$/Ít2,,(."% 3*ŽÕ gpsd-3.15/test/daemon/zodiac.log.chk0000664000175000017500000002512112467340617015522 0ustar esresr$GPZDA,204220.00,13,06,2005,00,00*63 $GPGGA,204220,5203.7576,N,00508.3123,E,1,08,,8.23,M,47.120,M,0.91,W*13 $GPRMC,204220,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*23 $GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 {"class":"TPV","mode":3,"time":"2005-06-13T20:42:20.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.230,"track":0.0000,"speed":0.000,"climb":-0.010} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:20.000Z"} $GPZDA,204221.00,13,06,2005,00,00*62 $GPGGA,204221,5203.7576,N,00508.3123,E,1,08,,8.23,M,47.120,M,0.91,W*12 $GPRMC,204221,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*22 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:21.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.230,"track":0.0000,"speed":0.000,"climb":0.000} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:21.000Z"} $GPZDA,204222.00,13,06,2005,00,00*61 $GPGGA,204222,5203.7576,N,00508.3123,E,1,08,,8.20,M,47.120,M,0.91,W*12 $GPRMC,204222,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*21 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:22.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.200,"track":0.0000,"speed":0.000,"climb":-0.020} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:22.000Z"} $GPZDA,204223.00,13,06,2005,00,00*60 $GPGGA,204223,5203.7576,N,00508.3123,E,1,08,,8.28,M,47.120,M,0.91,W*1B $GPRMC,204223,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*20 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:23.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.280,"track":0.0000,"speed":0.000,"climb":0.050} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:23.000Z"} $GPZDA,204224.00,13,06,2005,00,00*67 $GPGGA,204224,5203.7576,N,00508.3123,E,1,08,,8.27,M,47.120,M,0.91,W*13 $GPRMC,204224,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*27 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:24.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.270,"track":0.0000,"speed":0.000,"climb":0.010} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:24.000Z"} $GPZDA,204225.00,13,06,2005,00,00*66 $GPGGA,204225,5203.7576,N,00508.3123,E,1,08,,8.26,M,47.120,M,0.91,W*13 $GPRMC,204225,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*26 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:25.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.260,"track":0.0000,"speed":0.000,"climb":0.000} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:25.000Z"} $GPZDA,204226.00,13,06,2005,00,00*65 $GPGGA,204226,5203.7576,N,00508.3123,E,1,08,,8.29,M,47.120,M,0.91,W*1F $GPRMC,204226,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*25 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:26.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.290,"track":0.0000,"speed":0.000,"climb":0.030} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:26.000Z"} $GPZDA,204227.00,13,06,2005,00,00*64 $GPGGA,204227,5203.7576,N,00508.3123,E,1,08,,8.28,M,47.120,M,0.91,W*1F $GPRMC,204227,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*24 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:27.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.280,"track":0.0000,"speed":0.000,"climb":0.000} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:27.000Z"} $GPZDA,204228.00,13,06,2005,00,00*6B $GPGGA,204228,5203.7576,N,00508.3123,E,1,08,,8.29,M,47.120,M,0.91,W*11 $GPRMC,204228,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*2B $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:28.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.290,"track":0.0000,"speed":0.000,"climb":0.010} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:28.000Z"} $GPZDA,204229.00,13,06,2005,00,00*6A $GPGGA,204229,5203.7576,N,00508.3123,E,1,08,,8.28,M,47.120,M,0.91,W*11 $GPRMC,204229,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*2A $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:29.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.280,"track":0.0000,"speed":0.000,"climb":-0.010} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:29.000Z"} $GPZDA,204230.00,13,06,2005,00,00*62 $GPGGA,204230,5203.7576,N,00508.3123,E,1,08,,8.32,M,47.120,M,0.91,W*12 $GPRMC,204230,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*22 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:30.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.320,"track":0.0000,"speed":0.000,"climb":0.040} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:30.000Z"} $GPZDA,204231.00,13,06,2005,00,00*63 $GPGGA,204231,5203.7576,N,00508.3123,E,1,08,,8.33,M,47.120,M,0.91,W*12 $GPRMC,204231,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*23 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:31.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.330,"track":0.0000,"speed":0.000,"climb":0.030} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:31.000Z"} $GPZDA,204232.00,13,06,2005,00,00*60 $GPGGA,204232,5203.7576,N,00508.3123,E,1,08,,8.31,M,47.120,M,0.91,W*13 $GPRMC,204232,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*20 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:32.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.310,"track":0.0000,"speed":0.000,"climb":0.000} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:32.000Z"} $GPZDA,204233.00,13,06,2005,00,00*61 $GPGGA,204233,5203.7576,N,00508.3123,E,1,08,,8.27,M,47.120,M,0.91,W*15 $GPRMC,204233,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*21 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:33.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.270,"track":0.0000,"speed":0.000,"climb":-0.020} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:33.000Z"} $GPZDA,204234.00,13,06,2005,00,00*66 $GPGGA,204234,5203.7576,N,00508.3123,E,1,08,,8.29,M,47.120,M,0.91,W*1C $GPRMC,204234,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*26 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:34.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.290,"track":0.0000,"speed":0.000,"climb":0.020} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:34.000Z"} $GPZDA,204235.00,13,06,2005,00,00*67 $GPGGA,204235,5203.7576,N,00508.3123,E,1,08,,8.27,M,47.120,M,0.91,W*13 $GPRMC,204235,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*27 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:35.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.270,"track":0.0000,"speed":0.000,"climb":-0.010} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:35.000Z"} $GPZDA,204236.00,13,06,2005,00,00*64 $GPGGA,204236,5203.7576,N,00508.3123,E,1,08,,8.26,M,47.120,M,0.91,W*11 $GPRMC,204236,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*24 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:36.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.260,"track":0.0000,"speed":0.000,"climb":-0.010} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:36.000Z"} $GPZDA,204237.00,13,06,2005,00,00*65 $GPGGA,204237,5203.7576,N,00508.3123,E,1,08,,8.25,M,47.120,M,0.91,W*13 $GPRMC,204237,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*25 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:37.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.250,"track":0.0000,"speed":0.000,"climb":0.000} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:37.000Z"} $GPZDA,204238.00,13,06,2005,00,00*6A $GPGGA,204238,5203.7576,N,00508.3123,E,1,08,,8.20,M,47.120,M,0.91,W*19 $GPRMC,204238,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*2A $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:38.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.200,"track":0.0000,"speed":0.000,"climb":-0.030} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:38.000Z"} $GPZDA,204239.00,13,06,2005,00,00*6B $GPGGA,204239,5203.7576,N,00508.3123,E,1,08,,8.18,M,47.120,M,0.91,W*13 $GPRMC,204239,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*2B $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:39.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.180,"track":0.0000,"speed":0.000,"climb":-0.030} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:39.000Z"} $GPZDA,204240.00,13,06,2005,00,00*65 $GPGGA,204240,5203.7576,N,00508.3123,E,1,08,,8.19,M,47.120,M,0.91,W*1C $GPRMC,204240,A,5203.7576,N,00508.3123,E,0.0000,0.000,130605,,*25 $GPGSA,A,3,5,4,14,7,30,24,9,22,,,,,0.0,0.0,0.0*3D {"class":"TPV","mode":3,"time":"2005-06-13T20:42:40.000Z","ept":0.005,"lat":52.062625946,"lon":5.138537608,"alt":8.190,"track":0.0000,"speed":0.000,"climb":-0.010} $PRWIZCH,01,2,05,7,04,7,14,7,02,0,07,7,30,7,18,6,24,7,09,7,00,0,22,7*4C {"class":"SKY","time":"2005-06-13T20:42:40.000Z"} gpsd-3.15/test/earthmate0000664000175000017500000000307412460513551013427 0ustar esresrEARTHA EARTHA EARTHA EARTHA EARTHA EARTHA EARTHA EARTHA EARTHA EARTHA EARTHA EARTHA EARTHA EARTHA ÿè1èyt$$#Í{ k§Au2øæòöÀ@ِУá'£áà“ªÿê-êyt$$#Çìÿè1èyØ%%$Í{ k§Au2øæòöÀ@ِУá'£áà“œ©ÿê-êyØ%%$^ìÿè1èy<&&%Í{ k§Au2øæòöÀ@ِУá'£áà“4©ÿê-êy<&&%øëÿè1èy ''&Í{ k§Au2øæòöÀ@ِУá'£áà“Ìšÿê-êy ''&ëÿè1èy(('Í{ k§Au2øæòöÀ@ِУá'£áà“dšÿê-êy(('(ëÿè1èyh))(Í{ k§Au2øæòöÀ@ِУá'£áà“ü§ÿê-êyh))(¿êÿè1èyÌ**)Í{ k§Au2øæòöÀ@ِУá'£áà“”§ÿê-êyÌ**)Vêgpsd-3.15/test/geoid.test.chk0000664000175000017500000000007312460513551014262 0ustar esresr lat= 37.371192 lon= 122.014965 geoid correction= 8.187392 gpsd-3.15/test/naujoks-rtcm2.dcd0000664000175000017500000005156612460513551014716 0ustar esresr# This is an ASCII dump of the first 22 RTCM2 packets in the naujoks-rtcm2.log # file, made by a Windows decoder of unknown provenance. It was used to # eyeball-check the correctness of the GPSD decoder and is kept here for # reference (and because it's only the second suvj dump we've ever found. # # Contains sentence types 1, 3, and 31. Thu Mar 10 17:05:19.661 2011 MT31 Stat 688 Status 6 Sec 1627.2 Seq 3 Frame 15 MT31 SV 45 ZCount 1627.2 FktPRC 0.020 FktRRC 0.0020 PRC 132.180 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1627.2 FktPRC 0.020 FktRRC 0.0020 PRC 126.820 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1627.2 FktPRC 0.020 FktRRC 0.0020 PRC 113.840 RRC -0.0240 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1627.2 FktPRC 0.020 FktRRC 0.0020 PRC 141.640 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1627.2 FktPRC 0.020 FktRRC 0.0020 PRC 134.480 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1627.2 FktPRC 0.020 FktRRC 0.0020 PRC 111.980 RRC 0.0220 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1627.2 FktPRC 0.020 FktRRC 0.0020 PRC 117.120 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1627.2 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1627.2 FktPRC 0.020 FktRRC 0.0020 PRC 125.380 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:19.817 2011 MT01 Stat 688 Status 6 Sec 1642.2 Seq 4 Frame 15 MT01 SV 2 ZCount 1642.2 FktPRC 0.020 FktRRC 0.0020 PRC -7.420 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1642.2 FktPRC 0.020 FktRRC 0.0020 PRC -5.400 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1642.2 FktPRC 0.020 FktRRC 0.0020 PRC -8.660 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1642.2 FktPRC 0.020 FktRRC 0.0020 PRC -4.760 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1642.2 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1642.2 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0020 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1642.2 FktPRC 0.020 FktRRC 0.0020 PRC -9.880 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1642.2 FktPRC 0.020 FktRRC 0.0020 PRC -4.540 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1642.2 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:19.973 2011 MT31 Stat 688 Status 6 Sec 1627.8 Seq 5 Frame 15 MT31 SV 45 ZCount 1627.8 FktPRC 0.020 FktRRC 0.0020 PRC 132.180 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1627.8 FktPRC 0.020 FktRRC 0.0020 PRC 126.820 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1627.8 FktPRC 0.020 FktRRC 0.0020 PRC 113.820 RRC -0.0240 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1627.8 FktPRC 0.020 FktRRC 0.0020 PRC 141.640 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1627.8 FktPRC 0.020 FktRRC 0.0020 PRC 134.480 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1627.8 FktPRC 0.020 FktRRC 0.0020 PRC 111.980 RRC 0.0200 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1627.8 FktPRC 0.020 FktRRC 0.0020 PRC 117.120 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1627.8 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1627.8 FktPRC 0.020 FktRRC 0.0020 PRC 125.380 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:20.129 2011 MT01 Stat 688 Status 6 Sec 1642.8 Seq 6 Frame 15 MT01 SV 2 ZCount 1642.8 FktPRC 0.020 FktRRC 0.0020 PRC -7.420 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1642.8 FktPRC 0.020 FktRRC 0.0020 PRC -5.400 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1642.8 FktPRC 0.020 FktRRC 0.0020 PRC -8.660 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1642.8 FktPRC 0.020 FktRRC 0.0020 PRC -4.780 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1642.8 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1642.8 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0000 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1642.8 FktPRC 0.020 FktRRC 0.0020 PRC -9.900 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1642.8 FktPRC 0.020 FktRRC 0.0020 PRC -4.560 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1642.8 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:20.285 2011 MT31 Stat 688 Status 6 Sec 1629.0 Seq 7 Frame 15 MT31 SV 45 ZCount 1629.0 FktPRC 0.020 FktRRC 0.0020 PRC 132.180 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1629.0 FktPRC 0.020 FktRRC 0.0020 PRC 126.840 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1629.0 FktPRC 0.020 FktRRC 0.0020 PRC 113.780 RRC -0.0240 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1629.0 FktPRC 0.020 FktRRC 0.0020 PRC 141.620 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1629.0 FktPRC 0.020 FktRRC 0.0020 PRC 134.500 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1629.0 FktPRC 0.020 FktRRC 0.0020 PRC 112.000 RRC 0.0200 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1629.0 FktPRC 0.020 FktRRC 0.0020 PRC 117.100 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1629.0 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1629.0 FktPRC 0.020 FktRRC 0.0020 PRC 125.380 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:20.441 2011 MT01 Stat 688 Status 6 Sec 1644.0 Seq 0 Frame 15 MT01 SV 2 ZCount 1644.0 FktPRC 0.020 FktRRC 0.0020 PRC -7.420 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1644.0 FktPRC 0.020 FktRRC 0.0020 PRC -5.380 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1644.0 FktPRC 0.020 FktRRC 0.0020 PRC -8.660 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1644.0 FktPRC 0.020 FktRRC 0.0020 PRC -4.780 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1644.0 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1644.0 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0020 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1644.0 FktPRC 0.020 FktRRC 0.0020 PRC -9.900 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1644.0 FktPRC 0.020 FktRRC 0.0020 PRC -4.560 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1644.0 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:20.613 2011 MT31 Stat 688 Status 6 Sec 1630.2 Seq 1 Frame 15 MT31 SV 45 ZCount 1630.2 FktPRC 0.020 FktRRC 0.0020 PRC 132.180 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1630.2 FktPRC 0.020 FktRRC 0.0020 PRC 126.840 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1630.2 FktPRC 0.020 FktRRC 0.0020 PRC 113.760 RRC -0.0240 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1630.2 FktPRC 0.020 FktRRC 0.0020 PRC 141.620 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1630.2 FktPRC 0.020 FktRRC 0.0020 PRC 134.500 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1630.2 FktPRC 0.020 FktRRC 0.0020 PRC 112.020 RRC 0.0200 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1630.2 FktPRC 0.020 FktRRC 0.0020 PRC 117.100 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1630.2 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1630.2 FktPRC 0.020 FktRRC 0.0020 PRC 125.380 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:20.785 2011 MT01 Stat 688 Status 6 Sec 1645.2 Seq 2 Frame 15 MT01 SV 2 ZCount 1645.2 FktPRC 0.020 FktRRC 0.0020 PRC -7.420 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1645.2 FktPRC 0.020 FktRRC 0.0020 PRC -5.380 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1645.2 FktPRC 0.020 FktRRC 0.0020 PRC -8.640 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1645.2 FktPRC 0.020 FktRRC 0.0020 PRC -4.780 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1645.2 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1645.2 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0020 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1645.2 FktPRC 0.020 FktRRC 0.0020 PRC -9.900 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1645.2 FktPRC 0.020 FktRRC 0.0020 PRC -4.560 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1645.2 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:20.956 2011 MT31 Stat 688 Status 6 Sec 1630.8 Seq 3 Frame 15 MT31 SV 45 ZCount 1630.8 FktPRC 0.020 FktRRC 0.0020 PRC 132.180 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1630.8 FktPRC 0.020 FktRRC 0.0020 PRC 126.840 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1630.8 FktPRC 0.020 FktRRC 0.0020 PRC 113.740 RRC -0.0240 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1630.8 FktPRC 0.020 FktRRC 0.0020 PRC 141.620 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1630.8 FktPRC 0.020 FktRRC 0.0020 PRC 134.520 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1630.8 FktPRC 0.020 FktRRC 0.0020 PRC 112.040 RRC 0.0200 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1630.8 FktPRC 0.020 FktRRC 0.0020 PRC 117.100 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1630.8 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1630.8 FktPRC 0.020 FktRRC 0.0020 PRC 125.400 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:21.143 2011 MT01 Stat 688 Status 6 Sec 1645.8 Seq 4 Frame 15 MT01 SV 2 ZCount 1645.8 FktPRC 0.020 FktRRC 0.0020 PRC -7.420 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1645.8 FktPRC 0.020 FktRRC 0.0020 PRC -5.380 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1645.8 FktPRC 0.020 FktRRC 0.0020 PRC -8.660 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1645.8 FktPRC 0.020 FktRRC 0.0020 PRC -4.780 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1645.8 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1645.8 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0020 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1645.8 FktPRC 0.020 FktRRC 0.0020 PRC -9.900 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1645.8 FktPRC 0.020 FktRRC 0.0020 PRC -4.560 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1645.8 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:21.315 2011 MT31 Stat 688 Status 6 Sec 1632.0 Seq 5 Frame 15 MT31 SV 45 ZCount 1632.0 FktPRC 0.020 FktRRC 0.0020 PRC 132.180 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1632.0 FktPRC 0.020 FktRRC 0.0020 PRC 126.840 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1632.0 FktPRC 0.020 FktRRC 0.0020 PRC 113.700 RRC -0.0240 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1632.0 FktPRC 0.020 FktRRC 0.0020 PRC 141.620 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1632.0 FktPRC 0.020 FktRRC 0.0020 PRC 134.520 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1632.0 FktPRC 0.020 FktRRC 0.0020 PRC 112.060 RRC 0.0200 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1632.0 FktPRC 0.020 FktRRC 0.0020 PRC 117.100 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1632.0 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1632.0 FktPRC 0.020 FktRRC 0.0020 PRC 125.400 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:21.487 2011 MT01 Stat 688 Status 6 Sec 1647.0 Seq 6 Frame 15 MT01 SV 2 ZCount 1647.0 FktPRC 0.020 FktRRC 0.0020 PRC -7.440 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1647.0 FktPRC 0.020 FktRRC 0.0020 PRC -5.380 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1647.0 FktPRC 0.020 FktRRC 0.0020 PRC -8.660 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1647.0 FktPRC 0.020 FktRRC 0.0020 PRC -4.780 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1647.0 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1647.0 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0000 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1647.0 FktPRC 0.020 FktRRC 0.0020 PRC -9.900 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1647.0 FktPRC 0.020 FktRRC 0.0020 PRC -4.560 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1647.0 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:21.658 2011 MT31 Stat 688 Status 6 Sec 1633.2 Seq 7 Frame 15 MT31 SV 45 ZCount 1633.2 FktPRC 0.020 FktRRC 0.0020 PRC 132.200 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1633.2 FktPRC 0.020 FktRRC 0.0020 PRC 126.840 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1633.2 FktPRC 0.020 FktRRC 0.0020 PRC 113.680 RRC -0.0240 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1633.2 FktPRC 0.020 FktRRC 0.0020 PRC 141.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1633.2 FktPRC 0.020 FktRRC 0.0020 PRC 134.520 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1633.2 FktPRC 0.020 FktRRC 0.0020 PRC 112.100 RRC 0.0200 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1633.2 FktPRC 0.020 FktRRC 0.0020 PRC 117.080 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1633.2 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1633.2 FktPRC 0.020 FktRRC 0.0020 PRC 125.400 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:21.830 2011 MT01 Stat 688 Status 6 Sec 1648.2 Seq 0 Frame 15 MT01 SV 2 ZCount 1648.2 FktPRC 0.020 FktRRC 0.0020 PRC -7.440 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1648.2 FktPRC 0.020 FktRRC 0.0020 PRC -5.380 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1648.2 FktPRC 0.020 FktRRC 0.0020 PRC -8.640 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1648.2 FktPRC 0.020 FktRRC 0.0020 PRC -4.780 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1648.2 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1648.2 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0000 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1648.2 FktPRC 0.020 FktRRC 0.0020 PRC -9.900 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1648.2 FktPRC 0.020 FktRRC 0.0020 PRC -4.560 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1648.2 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:22.1 2011 MT31 Stat 688 Status 6 Sec 1633.8 Seq 1 Frame 15 MT31 SV 45 ZCount 1633.8 FktPRC 0.020 FktRRC 0.0020 PRC 132.200 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1633.8 FktPRC 0.020 FktRRC 0.0020 PRC 126.840 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1633.8 FktPRC 0.020 FktRRC 0.0020 PRC 113.660 RRC -0.0240 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1633.8 FktPRC 0.020 FktRRC 0.0020 PRC 141.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1633.8 FktPRC 0.020 FktRRC 0.0020 PRC 134.520 RRC 0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1633.8 FktPRC 0.020 FktRRC 0.0020 PRC 112.100 RRC 0.0200 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1633.8 FktPRC 0.020 FktRRC 0.0020 PRC 117.080 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1633.8 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1633.8 FktPRC 0.020 FktRRC 0.0020 PRC 125.400 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:22.173 2011 MT01 Stat 688 Status 6 Sec 1648.8 Seq 2 Frame 15 MT01 SV 2 ZCount 1648.8 FktPRC 0.020 FktRRC 0.0020 PRC -7.420 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1648.8 FktPRC 0.020 FktRRC 0.0020 PRC -5.400 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1648.8 FktPRC 0.020 FktRRC 0.0020 PRC -8.640 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1648.8 FktPRC 0.020 FktRRC 0.0020 PRC -4.780 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1648.8 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1648.8 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0020 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1648.8 FktPRC 0.020 FktRRC 0.0020 PRC -9.900 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1648.8 FktPRC 0.020 FktRRC 0.0020 PRC -4.560 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1648.8 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:22.345 2011 MT31 Stat 688 Status 6 Sec 1635.0 Seq 3 Frame 15 MT31 SV 45 ZCount 1635.0 FktPRC 0.020 FktRRC 0.0020 PRC 132.200 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1635.0 FktPRC 0.020 FktRRC 0.0020 PRC 126.860 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1635.0 FktPRC 0.020 FktRRC 0.0020 PRC 113.620 RRC -0.0260 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1635.0 FktPRC 0.020 FktRRC 0.0020 PRC 141.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1635.0 FktPRC 0.020 FktRRC 0.0020 PRC 134.540 RRC 0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1635.0 FktPRC 0.020 FktRRC 0.0020 PRC 112.120 RRC 0.0200 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1635.0 FktPRC 0.020 FktRRC 0.0020 PRC 117.060 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1635.0 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1635.0 FktPRC 0.020 FktRRC 0.0020 PRC 125.400 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:22.516 2011 MT01 Stat 688 Status 6 Sec 1650.0 Seq 4 Frame 15 MT01 SV 2 ZCount 1650.0 FktPRC 0.020 FktRRC 0.0020 PRC -7.440 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1650.0 FktPRC 0.020 FktRRC 0.0020 PRC -5.400 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1650.0 FktPRC 0.020 FktRRC 0.0020 PRC -8.640 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1650.0 FktPRC 0.020 FktRRC 0.0020 PRC -4.780 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1650.0 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1650.0 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0020 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1650.0 FktPRC 0.020 FktRRC 0.0020 PRC -9.900 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1650.0 FktPRC 0.020 FktRRC 0.0020 PRC -4.560 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1650.0 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:22.688 2011 MT03 Stat 688 Status 6 Sec 1650.0 Seq 5 Frame 4 MT03 Stat 688 ZCount 1650.0 X 3842290.920 Y 663782.760 Z 5030690.320 Thu Mar 10 17:05:22.735 2011 MT31 Stat 688 Status 6 Sec 1636.2 Seq 6 Frame 15 MT31 SV 45 ZCount 1636.2 FktPRC 0.020 FktRRC 0.0020 PRC 132.200 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 46 ZCount 1636.2 FktPRC 0.020 FktRRC 0.0020 PRC 126.860 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 53 ZCount 1636.2 FktPRC 0.020 FktRRC 0.0020 PRC 113.580 RRC -0.0260 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 54 ZCount 1636.2 FktPRC 0.020 FktRRC 0.0020 PRC 141.580 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 55 ZCount 1636.2 FktPRC 0.020 FktRRC 0.0020 PRC 134.540 RRC 0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 56 ZCount 1636.2 FktPRC 0.020 FktRRC 0.0020 PRC 112.140 RRC 0.0200 CB 0 TOD 510.0 UDRE 0_OSigDErr_<=_1m MT31 SV 60 ZCount 1636.2 FktPRC 0.020 FktRRC 0.0020 PRC 117.040 RRC -0.0040 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 61 ZCount 1636.2 FktPRC 0.020 FktRRC 0.0020 PRC 128.600 RRC 0.0000 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m MT31 SV 62 ZCount 1636.2 FktPRC 0.020 FktRRC 0.0020 PRC 125.400 RRC 0.0020 CB 0 TOD 0.0 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:22.906 2011 MT01 Stat 688 Status 6 Sec 1651.2 Seq 7 Frame 15 MT01 SV 2 ZCount 1651.2 FktPRC 0.020 FktRRC 0.0020 PRC -7.440 RRC 0.0000 IOD 15 UDRE 0_OSigDErr_<=_1m MT01 SV 4 ZCount 1651.2 FktPRC 0.020 FktRRC 0.0020 PRC -5.400 RRC 0.0000 IOD 70 UDRE 0_OSigDErr_<=_1m MT01 SV 7 ZCount 1651.2 FktPRC 0.020 FktRRC 0.0020 PRC -8.640 RRC 0.0020 IOD 23 UDRE 0_OSigDErr_<=_1m MT01 SV 10 ZCount 1651.2 FktPRC 0.020 FktRRC 0.0020 PRC -4.780 RRC 0.0000 IOD 120 UDRE 0_OSigDErr_<=_1m MT01 SV 13 ZCount 1651.2 FktPRC 0.020 FktRRC 0.0020 PRC -3.500 RRC 0.0000 IOD 92 UDRE 0_OSigDErr_<=_1m MT01 SV 16 ZCount 1651.2 FktPRC 0.020 FktRRC 0.0020 PRC -14.680 RRC 0.0020 IOD 18 UDRE 0_OSigDErr_<=_1m MT01 SV 20 ZCount 1651.2 FktPRC 0.020 FktRRC 0.0020 PRC -9.900 RRC 0.0000 IOD 72 UDRE 0_OSigDErr_<=_1m MT01 SV 23 ZCount 1651.2 FktPRC 0.020 FktRRC 0.0020 PRC -4.560 RRC 0.0000 IOD 16 UDRE 0_OSigDErr_<=_1m MT01 SV 30 ZCount 1651.2 FktPRC 0.020 FktRRC 0.0020 PRC -13.440 RRC 0.0000 IOD 154 UDRE 0_OSigDErr_<=_1m Thu Mar 10 17:05:23.62 2011 MT31 Stat 688 Status 6 Sec 1636.8 Seq 0 Frame 15 gpsd-3.15/test/nmea2000/logfile_20140914_365495765_can.log0000664000175000017500000202566512467340711020025 0ustar esresr# Name: NMEA2000 Bus # Chipset: Garmin AIS600, Garmin GPS17x NMEA2000, Garmin GPSMAP 720 # Firmware: various # Date: 2013-09-14 # Submitter: = Reinhard Arlt # Location: Greece, Saronicos, 37d55mN 23d01mE (1410714882.622188) can0 09F80102#36729A16021AB80D (1410714882.697169) can0 09F80202#D0FC00000300FFFF (1410714882.722163) can0 09F80102#36729A16021AB80D (1410714882.822139) can0 09F80102#36729A16021AB80D (1410714882.922053) can0 09F80102#36729A16021AB80D (1410714882.947169) can0 09F80202#D1FC00000300FFFF (1410714883.022029) can0 09F80102#36729A16021AB80D (1410714883.084071) can0 0DF01002#D2F0C73F00E73A24 (1410714883.087123) can0 19FA0302#D2D3490069006400 (1410714883.089961) can0 19FA0402#4093D2FD0C0B7F34 (1410714883.092982) can0 19FA0402#4113C7D812FDFFFF (1410714883.095973) can0 19FA0402#42FFF220673007D4 (1410714883.099177) can0 19FA0402#43C512F0FFFFFFF2 (1410714883.101954) can0 19FA0402#440E7F16B920A211 (1410714883.104975) can0 19FA0402#4506000000F2168B (1410714883.107966) can0 19FA0402#4609FF2CA2111200 (1410714883.111109) can0 19FA0402#470000F20122247C (1410714883.113978) can0 19FA0402#48D9AD13DBFFFFFF (1410714883.116969) can0 19FA0402#49F21BE80A9574FC (1410714883.119990) can0 19FA0402#4A1038000000F217 (1410714883.123164) can0 19FA0402#4BD106208DBB1086 (1410714883.125971) can0 19FA0402#4CFFFFFFF2047314 (1410714883.128962) can0 19FA0402#4DAAD26211EBFFFF (1410714883.131953) can0 19FA0402#4EFFF21F390A674E (1410714883.135096) can0 19FA0402#4F761185000000F2 (1410714883.137965) can0 19FA0402#501C1704C2C7B60D (1410714883.140956) can0 19FA0402#5109000000F21350 (1410714883.143946) can0 19FA0402#521D2C80D6114100 (1410714883.147120) can0 19FA0402#530000F214731465 (1410714883.149958) can0 19FA0402#54B71C112E000000 (1410714883.152979) can0 19FA0402#55F2FFFFFFFFFFFF (1410714883.155940) can0 0DF80502#402FD2C73F00E73A (1410714883.159175) can0 0DF80502#4124C0A424231143 (1410714883.161952) can0 0DF80502#424305809E757091 (1410714883.164942) can0 0DF80502#43B9310385C88F02 (1410714883.167964) can0 0DF80502#440000000013FC0C (1410714883.171137) can0 0DF80502#4549008000AC0D00 (1410714883.173976) can0 0DF80502#460000FFFFFFFFFF (1410714883.176936) can0 09F80102#36729A16021AB80D (1410714883.208003) can0 09F80202#D3FC00000600FFFF (1410714883.232966) can0 09F80102#36729A16021AB80D (1410714883.332942) can0 09F80102#36729A16021AB80D (1410714883.432917) can0 09F80102#36729A16021AB80D (1410714883.442500) can0 19F212B0#2009F3000064FF9C (1410714883.443049) can0 19F212B0#211C0A00FFFFFFFF (1410714883.443598) can0 19F214B0#00EC04C5FF6978F3 (1410714883.457911) can0 09F80202#D4FC00000600FFFF (1410714883.532862) can0 09F80102#36729A16021AB80D (1410714883.632899) can0 09F80102#36729A16021AB80D (1410714883.707850) can0 09F80202#D5FC00000600FFFF (1410714883.732844) can0 09F80102#36729A16021AB80D (1410714883.744379) can0 11F80E01#001B0188F64A0E70 (1410714883.744929) can0 11F80E01#01FCB80D60019A16 (1410714883.745509) can0 11F80E01#0210FFFF000024C0 (1410714883.746088) can0 11F80E01#0308154F000000FE (1410714883.832819) can0 09F80102#36729A16021AB80D (1410714883.932764) can0 09F80102#36729A16021AB80D (1410714883.957850) can0 09F80202#D6FC00000600FFFF (1410714884.032710) can0 09F80102#36729A16021AB80D (1410714884.093195) can0 0DF01002#D7F0C73F100E3B24 (1410714884.095667) can0 19FA0302#D7D3490069006400 (1410714884.098658) can0 19FA0402#6093D7FD0C0B7F34 (1410714884.101801) can0 19FA0402#6113C73012FDFFFF (1410714884.104670) can0 19FA0402#62FFF220673007D4 (1410714884.107661) can0 19FA0402#63EF12EDFFFFFFF2 (1410714884.110651) can0 19FA0402#640E7F16B920F511 (1410714884.113856) can0 19FA0402#65FFFFFFFFF2168B (1410714884.116633) can0 19FA0402#6609FF2C8B110E00 (1410714884.119654) can0 19FA0402#670000F20122247C (1410714884.122645) can0 19FA0402#68D9DF12E3FFFFFF (1410714884.125788) can0 19FA0402#69F21BE80A95742F (1410714884.128657) can0 19FA0402#6A103B000000F217 (1410714884.131648) can0 19FA0402#6BD106208DF51086 (1410714884.134638) can0 19FA0402#6CFFFFFFF2047314 (1410714884.137812) can0 19FA0402#6DAAD2D610FAFFFF (1410714884.140650) can0 19FA0402#6EFFF21F390A674E (1410714884.143641) can0 19FA0402#6F29117D000000F2 (1410714884.145289) can0 11F80F01#801A125C23220EF0 (1410714884.145838) can0 11F80F01#811CB80D60739A16 (1410714884.146418) can0 11F80F01#8210793F00000600 (1410714884.146998) can0 11F80F01#8318FFFF0074FFFF (1410714884.147547) can0 19FA0402#701C1704C2C78A0D (1410714884.149928) can0 19FA0402#7113000000F213A2 (1410714884.152644) can0 19FA0402#721C2C801D123F00 (1410714884.155634) can0 19FA0402#730000F214731465 (1410714884.158656) can0 19FA0402#74B733122E000000 (1410714884.161829) can0 19FA0402#75F2FFFFFFFFFFFF (1410714884.164637) can0 0DF80502#602FD7C73F100E3B (1410714884.167628) can0 0DF80502#6124C0A424231143 (1410714884.170618) can0 0DF80502#624305809E757091 (1410714884.173853) can0 0DF80502#63B9310385C88F02 (1410714884.176722) can0 0DF80502#640000000013FC0C (1410714884.179652) can0 0DF80502#6549008000AC0D00 (1410714884.182673) can0 0DF80502#660000FFFFFFFFFF (1410714884.185786) can0 09F80102#36729A16021AB80D (1410714884.217860) can0 09F80202#D8FC00000300FFFF (1410714884.228724) can0 1DEFFF01#A00AE598B6060404 (1410714884.229304) can0 1DEFFF01#A100000002FFFFFF (1410714884.242640) can0 09F80102#36729A16021AB80D (1410714884.342616) can0 09F80102#36729A16021AB80D (1410714884.442591) can0 09F80102#36729A16021AB80D (1410714884.467616) can0 09F80202#D9FC00000300FFFF (1410714884.542567) can0 09F80102#36729A16021AB80D (1410714884.642542) can0 09F80102#36729A16021AB80D (1410714884.687678) can0 18EEFF11#40E2C1DD00C8A0C0 (1410714884.717860) can0 09F80202#DAFC00000300FFFF (1410714884.742487) can0 09F80102#36729A16021AB80D (1410714884.824793) can0 11F80E01#201B014875520EF0 (1410714884.825343) can0 11F80E01#2102A00DC0A3A616 (1410714884.825892) can0 11F80E01#220C2ACBE301DB80 (1410714884.826472) can0 11F80E01#230065C6000000FE (1410714884.842463) can0 09F80102#36729A16021AB80D (1410714884.942255) can0 19F212B0#400907000064FF9C (1410714884.942774) can0 09F80102#36729A16021AB80D (1410714884.943354) can0 19F212B0#411C0A00FFFFFFFF (1410714884.943934) can0 19F214B0#00ED04C5FF677807 (1410714884.967432) can0 09F80202#DBFC00000300FFFF (1410714885.042384) can0 09F80102#36729A16021AB80D (1410714885.101405) can0 0DF01002#DCF0C73F20353B24 (1410714885.104700) can0 19FA0302#DCD3490069006400 (1410714885.107355) can0 19FA0402#8093DCFD0C0B7F34 (1410714885.110346) can0 19FA0402#8113C73812FCFFFF (1410714885.113337) can0 19FA0402#82FFF220673007D4 (1410714885.116602) can0 19FA0402#838B13E8FFFFFFF2 (1410714885.119318) can0 19FA0402#840E7F16B920EB11 (1410714885.122340) can0 19FA0402#85FDFFFFFFF2168B (1410714885.125330) can0 19FA0402#8609FF2C9B110E00 (1410714885.128535) can0 19FA0402#870000F20122247C (1410714885.131342) can0 19FA0402#88D9C112EBFFFFFF (1410714885.134303) can0 19FA0402#89F21BE80A957458 (1410714885.137324) can0 19FA0402#8A1041000000F217 (1410714885.140498) can0 19FA0402#8BD106208DD0107E (1410714885.143336) can0 19FA0402#8CFFFFFFF2047314 (1410714885.146326) can0 19FA0402#8DAAD20611080000 (1410714885.149317) can0 19FA0402#8E00F21F390A674E (1410714885.152613) can0 19FA0402#8F3F117F000000F2 (1410714885.155329) can0 19FA0402#901C1704C2C7800D (1410714885.158320) can0 19FA0402#911B000000F213A2 (1410714885.161311) can0 19FA0402#921C2C8062124200 (1410714885.164637) can0 19FA0402#930000F214731465 (1410714885.167323) can0 19FA0402#94B7A9102B000000 (1410714885.170344) can0 19FA0402#95F2FFFFFFFFFFFF (1410714885.173334) can0 0DF80502#802FDCC73F20353B (1410714885.176600) can0 0DF80502#8124C0A424231143 (1410714885.179377) can0 0DF80502#824305809E757091 (1410714885.182612) can0 0DF80502#83B9310385C88F02 (1410714885.185328) can0 0DF80502#840000000013FC0C (1410714885.188563) can0 0DF80502#8549008000AC0D00 (1410714885.191340) can0 0DF80502#860000FFFFFFFFFF (1410714885.194300) can0 09F80102#36729A16021AB80D (1410714885.225367) can0 09F80202#DDFC00000400FFFF (1410714885.250330) can0 09F80102#36729A16021AB80D (1410714885.350306) can0 09F80102#36729A16021AB80D (1410714885.450282) can0 09F80102#36729A16021AB80D (1410714885.475306) can0 09F80202#DEFC00000400FFFF (1410714885.550257) can0 09F80102#36729A16021AB80D (1410714885.650263) can0 09F80102#36729A16021AB80D (1410714885.725214) can0 09F80202#DFFC00000400FFFF (1410714885.750208) can0 09F80102#36729A16021AB80D (1410714885.850184) can0 09F80102#36729A16021AB80D (1410714885.950282) can0 09F80102#36729A16021AB80D (1410714885.975184) can0 09F80202#E0FC00000400FFFF (1410714886.050074) can0 09F80102#36729A16021AB80D (1410714886.059748) can0 0DF01002#E1F0C73F305C3B24 (1410714886.062037) can0 19FA0302#E1D3490069006400 (1410714886.065028) can0 19FA0402#A093E1FD0C0B7F34 (1410714886.068049) can0 19FA0402#A113C73E12FCFFFF (1410714886.071192) can0 19FA0402#A2FFF220673007D4 (1410714886.074030) can0 19FA0402#A36E13E9FFFFFFF2 (1410714886.077021) can0 19FA0402#A40E7F16B920E211 (1410714886.080042) can0 19FA0402#A5F5FFFFFFF2168B (1410714886.083155) can0 19FA0402#A609FF2CB9111200 (1410714886.086024) can0 19FA0402#A70000F20122247C (1410714886.089045) can0 19FA0402#A8D9B613E1FFFFFF (1410714886.092036) can0 19FA0402#A9F21BE80A9574AB (1410714886.095118) can0 19FA0402#AA103B000000F217 (1410714886.098017) can0 19FA0402#ABD106208D5B107E (1410714886.101038) can0 19FA0402#ACFFFFFFF2047314 (1410714886.104029) can0 19FA0402#ADAAD2E211F5FFFF (1410714886.107111) can0 19FA0402#AEFFF21F390A674E (1410714886.110072) can0 19FA0402#AF711178000000F2 (1410714886.113032) can0 19FA0402#B01C1704C2C7D90D (1410714886.116022) can0 19FA0402#B10F000000F213A2 (1410714886.119166) can0 19FA0402#B21C2C80D0123D00 (1410714886.122004) can0 19FA0402#B30000F214221513 (1410714886.125025) can0 19FA0402#B4B8B61024000000 (1410714886.128046) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714886.131190) can0 0DF80502#A02FE1C73F305C3B (1410714886.133997) can0 0DF80502#A124C0A424231143 (1410714886.137019) can0 0DF80502#A24305809E757091 (1410714886.140009) can0 0DF80502#A3B9310385C88F02 (1410714886.143214) can0 0DF80502#A40000000013FC0C (1410714886.146021) can0 0DF80502#A549008000AC0D00 (1410714886.149043) can0 0DF80502#A60000FFFFFFFFFF (1410714886.152003) can0 09F80102#36729A16021AB80D (1410714886.184077) can0 09F80202#E2FC00000100FFFF (1410714886.209040) can0 09F80102#36729A16021AB80D (1410714886.308985) can0 09F80102#36729A16021AB80D (1410714886.408991) can0 09F80102#36729A16021AB80D (1410714886.433985) can0 09F80202#E3FC00000100FFFF (1410714886.442286) can0 19F212B0#600916000064FF9B (1410714886.442835) can0 19F212B0#611C0A00FFFFFFFF (1410714886.443385) can0 19F214B0#00ED04C5FF677816 (1410714886.508967) can0 09F80102#36729A16021AB80D (1410714886.608942) can0 09F80102#36729A16021AB80D (1410714886.686427) can0 09F80202#E4FC00000100FFFF (1410714886.690852) can0 0DF50B11#0195030000FFFFFF (1410714886.708918) can0 09F80102#36729A16021AB80D (1410714886.808863) can0 09F80102#36729A16021AB80D (1410714886.908839) can0 09F80102#36729A16021AB80D (1410714886.933894) can0 09F80202#E5FC00000100FFFF (1410714887.008784) can0 09F80102#36729A16021AB80D (1410714887.068934) can0 0DF01002#E6F0C73F40833B24 (1410714887.071711) can0 19FA0302#E6D3490069006400 (1410714887.074702) can0 19FA0402#C093E6FD0C0B7F34 (1410714887.077845) can0 19FA0402#C113C77811FCFFFF (1410714887.080714) can0 19FA0402#C2FFF220673007D4 (1410714887.083704) can0 19FA0402#C37612F4FFFFFFF2 (1410714887.086726) can0 19FA0402#C40E7F16B920EE11 (1410714887.089930) can0 19FA0402#C5EBFFFFFFF2168B (1410714887.092707) can0 19FA0402#C609FF2CD2110E00 (1410714887.095728) can0 19FA0402#C70000F20122247C (1410714887.098719) can0 19FA0402#C8D9DF13DDFFFFFF (1410714887.101832) can0 19FA0402#C9F21BE80A9574AD (1410714887.104731) can0 19FA0402#CA1036000000F217 (1410714887.107691) can0 19FA0402#CBD106208D8E107C (1410714887.110712) can0 19FA0402#CCFFFFFFF2047314 (1410714887.113825) can0 19FA0402#CDAAD29F11E4FFFF (1410714887.116694) can0 19FA0402#CEFFF21F390A674E (1410714887.119715) can0 19FA0402#CFB01173000000F2 (1410714887.122706) can0 19FA0402#D01C1704C2C7CD0D (1410714887.125849) can0 19FA0402#D104000000F213A2 (1410714887.128718) can0 19FA0402#D21C2C80FC123B00 (1410714887.131709) can0 19FA0402#D30000F214221513 (1410714887.134699) can0 19FA0402#D4B80D111B000000 (1410714887.137873) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714887.140711) can0 0DF80502#C02FE6C73F40833B (1410714887.143702) can0 0DF80502#C124C0A424231143 (1410714887.146693) can0 0DF80502#C24305809E757091 (1410714887.149958) can0 0DF80502#C3B9310385C88F02 (1410714887.152705) can0 0DF80502#C40000000013FC0C (1410714887.155695) can0 0DF80502#C549008000AC0D00 (1410714887.158717) can0 0DF80502#C60000FFFFFFFFFF (1410714887.161829) can0 09F80102#36729A16021AB80D (1410714887.193903) can0 09F80202#E7FC00000600FFFF (1410714887.218714) can0 09F80102#36729A16021AB80D (1410714887.318659) can0 09F80102#36729A16021AB80D (1410714887.418665) can0 09F80102#36729A16021AB80D (1410714887.443690) can0 09F80202#E8FC00000600FFFF (1410714887.518641) can0 09F80102#36729A16021AB80D (1410714887.618616) can0 09F80102#36729A16021AB80D (1410714887.692500) can0 0DF50B11#0195030000FFFFFF (1410714887.693903) can0 09F80202#E9FC00000600FFFF (1410714887.718562) can0 09F80102#36729A16021AB80D (1410714887.818537) can0 09F80102#36729A16021AB80D (1410714887.918482) can0 09F80102#36729A16021AB80D (1410714887.942286) can0 19F212B0#800925000064FF95 (1410714887.942866) can0 19F212B0#811C0A00FFFFFFFF (1410714887.943415) can0 19F214B0#00EC04C5FF577825 (1410714887.943995) can0 09F80202#EAFC00000600FFFF (1410714887.944575) can0 11F80E01#401B0348AA2C0E50 (1410714887.945124) can0 11F80E01#41B1F40DE06B8016 (1410714887.945673) can0 11F80E01#421413E5F402611C (1410714887.946253) can0 11F80E01#4303FFFFFF7F00FE (1410714888.018458) can0 09F80102#36729A16021AB80D (1410714888.083338) can0 0DF01002#EBF0C73F50AA3B24 (1410714888.085413) can0 19FA0302#EBD3490069006400 (1410714888.088587) can0 19FA0402#E093EBFD0C0B7F34 (1410714888.091395) can0 19FA0402#E113C77711F7FFFF (1410714888.094416) can0 19FA0402#E2FFF220673007D4 (1410714888.097407) can0 19FA0402#E39512F3FFFFFFF2 (1410714888.100550) can0 19FA0402#E40E7F16B920EC11 (1410714888.103419) can0 19FA0402#E5F1FFFFFFF2168B (1410714888.106379) can0 19FA0402#E609FF2C4F110D00 (1410714888.109400) can0 19FA0402#E70000F20122247C (1410714888.112605) can0 19FA0402#E8D97813E2FFFFFF (1410714888.115382) can0 19FA0402#E9F21BE80A957475 (1410714888.118403) can0 19FA0402#EA1041000000F217 (1410714888.121394) can0 19FA0402#EBD106208DD21079 (1410714888.124689) can0 19FA0402#ECFFFFFFF2047314 (1410714888.127406) can0 19FA0402#EDAAD2E111DDFFFF (1410714888.130396) can0 19FA0402#EEFFF21F390A674E (1410714888.133387) can0 19FA0402#EFBB1168000000F2 (1410714888.136652) can0 19FA0402#F01C1704C2C7720D (1410714888.139399) can0 19FA0402#F10C000000F213A2 (1410714888.142390) can0 19FA0402#F21C2C808D123C00 (1410714888.145380) can0 19FA0402#F30000F214221513 (1410714888.148585) can0 19FA0402#F4B8D61119000000 (1410714888.151423) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714888.154383) can0 0DF80502#E02FEBC73F50AA3B (1410714888.157374) can0 0DF80502#E124C0A424231143 (1410714888.160517) can0 0DF80502#E24305809E757091 (1410714888.163355) can0 0DF80502#E3B9310385C88F02 (1410714888.166376) can0 0DF80502#E40000000013FC0C (1410714888.169398) can0 0DF80502#E549008000AC0D00 (1410714888.172602) can0 0DF80502#E60000FFFFFFFFFF (1410714888.175379) can0 09F80102#36729A16021AB80D (1410714888.207423) can0 09F80202#ECFC00000000FFFF (1410714888.232661) can0 09F80102#36729A16021AB80D (1410714888.291071) can0 11F80E01#601B01985B620EF0 (1410714888.291560) can0 11F80E01#61C5C20D40B99916 (1410714888.292139) can0 11F80E01#6228A5A400004A40 (1410714888.292689) can0 11F80E01#6300FFFFFF7F00FE (1410714888.332636) can0 09F80102#36729A16021AB80D (1410714888.432642) can0 09F80102#36729A16021AB80D (1410714888.457362) can0 09F80202#EDFC00000000FFFF (1410714888.532618) can0 09F80102#36729A16021AB80D (1410714888.632655) can0 09F80102#36729A16021AB80D (1410714888.694025) can0 0DF50B11#0195030000FFFFFF (1410714888.707301) can0 09F80202#EEFC00000000FFFF (1410714888.732630) can0 09F80102#36729A16021AB80D (1410714888.832667) can0 09F80102#36729A16021AB80D (1410714888.932551) can0 09F80102#36729A16021AB80D (1410714888.957209) can0 09F80202#EFFC00000000FFFF (1410714889.032160) can0 09F80102#36729A16021AB80D (1410714889.096735) can0 0DF01002#F0F0C73F60D13B24 (1410714889.099238) can0 19FA0302#F0D3490069006400 (1410714889.102106) can0 19FA0402#0093F0FD0C0B7F34 (1410714889.105097) can0 19FA0402#0113C75111F8FFFF (1410714889.108118) can0 19FA0402#02FFF220673007D4 (1410714889.111262) can0 19FA0402#03F112F0FFFFFFF2 (1410714889.114100) can0 19FA0402#040E7F16B9209011 (1410714889.117091) can0 19FA0402#05FEFFFFFFF2168B (1410714889.120081) can0 19FA0402#0609FF2C6F110A00 (1410714889.123255) can0 19FA0402#070000F20122247C (1410714889.126093) can0 19FA0402#08D9A313E5FFFFFF (1410714889.129084) can0 19FA0402#09F21BE80A957487 (1410714889.132105) can0 19FA0402#0A103D000000F217 (1410714889.135188) can0 19FA0402#0BD106208DC81082 (1410714889.138087) can0 19FA0402#0CFFFFFFF2047314 (1410714889.141077) can0 19FA0402#0DAAD2CF11E5FFFF (1410714889.144099) can0 19FA0402#0EFFF21F390A674E (1410714889.147211) can0 19FA0402#0FC61166000000F2 (1410714889.150111) can0 19FA0402#101C1704C2C78F0D (1410714889.153101) can0 19FA0402#11FBFFFFFFF213A2 (1410714889.156092) can0 19FA0402#121C2C8080123E00 (1410714889.159235) can0 19FA0402#130000F214221513 (1410714889.162104) can0 19FA0402#14B8671118000000 (1410714889.165095) can0 19FA0402#15F2FFFFFFFFFFFF (1410714889.168085) can0 0DF80502#002FF0C73F60D13B (1410714889.171229) can0 0DF80502#0124C0A424231143 (1410714889.174067) can0 0DF80502#024305809E757091 (1410714889.177058) can0 0DF80502#03B9310385C88F02 (1410714889.180109) can0 0DF80502#040000000013FC0C (1410714889.183253) can0 0DF80502#0549008000AC0D00 (1410714889.186152) can0 0DF80502#060000FFFFFFFFFF (1410714889.189051) can0 09F80102#36729A16021AB80D (1410714889.221125) can0 09F80202#F1FC00000500FFFF (1410714889.228419) can0 1DEFFF01#C00AE598B6060404 (1410714889.228968) can0 1DEFFF01#C100000002FFFFFF (1410714889.246088) can0 09F80102#36729A16021AB80D (1410714889.346064) can0 09F80102#36729A16021AB80D (1410714889.442347) can0 19F212B0#A00934000064FF77 (1410714889.442896) can0 19F212B0#A11C0A00FFFFFFFF (1410714889.443446) can0 19F214B0#00ED04C5FF677834 (1410714889.446040) can0 09F80102#36729A16021AB80D (1410714889.471308) can0 09F80202#F2FC00000500FFFF (1410714889.545985) can0 09F80102#36729A16021AB80D (1410714889.645960) can0 09F80102#36729A16021AB80D (1410714889.696284) can0 0DF50B11#0195030000FFFFFF (1410714889.720972) can0 09F80202#F3FC00000500FFFF (1410714889.745936) can0 09F80102#36729A16021AB80D (1410714889.845942) can0 09F80102#36729A16021AB80D (1410714889.945918) can0 09F80102#36729A16021AB80D (1410714889.971247) can0 09F80202#F4FC00000500FFFF (1410714890.045924) can0 09F80102#36729A16021AB80D (1410714890.107417) can0 0DF01002#F5F0C73F70F83B24 (1410714890.110102) can0 19FA0302#F5D3490069006400 (1410714890.112788) can0 19FA0402#2093F5FD0C0B7F34 (1410714890.115778) can0 19FA0402#2113C7A411F9FFFF (1410714890.118769) can0 19FA0402#22FFF220673007D4 (1410714890.121882) can0 19FA0402#233912F7FFFFFFF2 (1410714890.124751) can0 19FA0402#240E7F16B9209611 (1410714890.127772) can0 19FA0402#25F6FFFFFFF2168B (1410714890.130762) can0 19FA0402#2609AD2D7B110800 (1410714890.133875) can0 19FA0402#270000F20122247C (1410714890.136774) can0 19FA0402#28D9B213E4FFFFFF (1410714890.139735) can0 19FA0402#29F21BE80A957492 (1410714890.142786) can0 19FA0402#2A1036000000F217 (1410714890.145869) can0 19FA0402#2BD106208DAD1085 (1410714890.148768) can0 19FA0402#2CFFFFFFF2047314 (1410714890.151759) can0 19FA0402#2DAAD2CB11F1FFFF (1410714890.154749) can0 19FA0402#2EFFF21F390A674E (1410714890.157893) can0 19FA0402#2FBE1167000000F2 (1410714890.160761) can0 19FA0402#301C1704C2C7940D (1410714890.163752) can0 19FA0402#31FEFFFFFFF213A2 (1410714890.166743) can0 19FA0402#321C2C80A0123D00 (1410714890.169978) can0 19FA0402#330000F214221513 (1410714890.172755) can0 19FA0402#34B87B1118000000 (1410714890.175776) can0 19FA0402#35F2FFFFFFFFFFFF (1410714890.178767) can0 0DF80502#202FF5C73F70F83B (1410714890.181849) can0 0DF80502#2124C0A424231143 (1410714890.184748) can0 0DF80502#224305809E757091 (1410714890.185297) can0 11F80E01#801B0108975C0E40 (1410714890.185847) can0 11F80E01#819DC50D80F69816 (1410714890.186396) can0 11F80E01#8229AC5A000067C0 (1410714890.186976) can0 11F80E01#830888AE000000FE (1410714890.187739) can0 0DF80502#23B9310385C88F02 (1410714890.190760) can0 0DF80502#240000000013FC0C (1410714890.193873) can0 0DF80502#2549008000AC0D00 (1410714890.196772) can0 0DF80502#260000FFFFFFFFFF (1410714890.199732) can0 09F80102#36729A16021AB80D (1410714890.231806) can0 09F80202#F6FC00000000FFFF (1410714890.256831) can0 09F80102#36729A16021AB80D (1410714890.356715) can0 09F80102#36729A16021AB80D (1410714890.456721) can0 09F80102#36729A16021AB80D (1410714890.481959) can0 09F80202#F7FC00000000FFFF (1410714890.556696) can0 09F80102#36729A16021AB80D (1410714890.656733) can0 09F80102#36729A16021AB80D (1410714890.699213) can0 0DF50B11#0195030000FFFFFF (1410714890.731654) can0 09F80202#F8FC00000000FFFF (1410714890.756709) can0 09F80102#36729A16021AB80D (1410714890.856715) can0 09F80102#36729A16021AB80D (1410714890.942347) can0 19F212B0#C00943000064FF79 (1410714890.942927) can0 19F212B0#C11C0800FFFFFFFF (1410714890.943476) can0 19F214B0#00EC04C5FF6D7843 (1410714890.956721) can0 09F80102#36729A16021AB80D (1410714890.981867) can0 09F80202#F9FC00000000FFFF (1410714891.056849) can0 09F80102#36729A16021AB80D (1410714891.068049) can0 0DF01002#00F0C73F801F3C24 (1410714891.070460) can0 19FA0302#00D3490069006400 (1410714891.073481) can0 19FA0402#409300FD0C0B7F34 (1410714891.076685) can0 19FA0402#4113C7FA11F5FFFF (1410714891.079462) can0 19FA0402#42FFF220673007D4 (1410714891.082453) can0 19FA0402#43CF12FAFFFFFFF2 (1410714891.085444) can0 19FA0402#440E7F16B920AD11 (1410714891.088618) can0 19FA0402#45F2FFFFFFF2168B (1410714891.091456) can0 19FA0402#4609AD2D4E110F00 (1410714891.094447) can0 19FA0402#470000F20122247C (1410714891.097468) can0 19FA0402#48D9C713E6FFFFFF (1410714891.100550) can0 19FA0402#49F21BE80A957485 (1410714891.103449) can0 19FA0402#4A1038000000F217 (1410714891.106440) can0 19FA0402#4BD106208DC51086 (1410714891.109461) can0 19FA0402#4CFFFFFFF2047314 (1410714891.112635) can0 19FA0402#4DAAD24E11040000 (1410714891.115443) can0 19FA0402#4E00F21F390A674E (1410714891.118464) can0 19FA0402#4FAC116D000000F2 (1410714891.121455) can0 19FA0402#501C1704C2C79E0D (1410714891.124720) can0 19FA0402#51F3FFFFFFF213A2 (1410714891.127436) can0 19FA0402#521C2C80A7124100 (1410714891.130427) can0 19FA0402#530000F214221513 (1410714891.133448) can0 19FA0402#54B8801117000000 (1410714891.136713) can0 19FA0402#55F2FFFFFFFFFFFF (1410714891.139460) can0 0DF80502#402F00C73F801F3C (1410714891.142420) can0 0DF80502#4124C0A424231143 (1410714891.145441) can0 0DF80502#424305809E757091 (1410714891.148615) can0 0DF80502#43B9310385C88F02 (1410714891.151453) can0 0DF80502#440000000013FC0C (1410714891.154444) can0 0DF80502#4549008000AC0D00 (1410714891.157465) can0 0DF80502#460000FFFFFFFFFF (1410714891.160578) can0 09F80102#36729A16021AB80D (1410714891.192683) can0 09F80202#01FC00000300FFFF (1410714891.217463) can0 09F80102#36729A16021AB80D (1410714891.317408) can0 09F80102#36729A16021AB80D (1410714891.417384) can0 09F80102#36729A16021AB80D (1410714891.442408) can0 09F80202#02FC00000300FFFF (1410714891.517359) can0 09F80102#36729A16021AB80D (1410714891.617335) can0 09F80102#36729A16021AB80D (1410714891.692683) can0 09F80202#03FC00000300FFFF (1410714891.700709) can0 0DF50B11#0195030000FFFFFF (1410714891.717310) can0 09F80102#36729A16021AB80D (1410714891.817286) can0 09F80102#36729A16021AB80D (1410714891.917231) can0 09F80102#36729A16021AB80D (1410714891.942286) can0 09F80202#04FC00000300FFFF (1410714892.017207) can0 09F80102#36729A16021AB80D (1410714892.077357) can0 0DF01002#05F0C73F90463C24 (1410714892.080164) can0 19FA0302#05D3490069006400 (1410714892.083308) can0 19FA0402#609305FD0C0B7F34 (1410714892.086146) can0 19FA0402#6113C71512F2FFFF (1410714892.089136) can0 19FA0402#62FFF220673007D4 (1410714892.092127) can0 19FA0402#63B412F5FFFFFFF2 (1410714892.095209) can0 19FA0402#640E7F16B920C711 (1410714892.098139) can0 19FA0402#65F2FFFFFFF2168B (1410714892.101130) can0 19FA0402#6609AD2D65110400 (1410714892.104151) can0 19FA0402#670000F20122247C (1410714892.107233) can0 19FA0402#68D96D13EAFFFFFF (1410714892.110133) can0 19FA0402#69F21BE80A95749E (1410714892.113154) can0 19FA0402#6A1037000000F217 (1410714892.116145) can0 19FA0402#6BD106CE8DD0107D (1410714892.119288) can0 19FA0402#6CFFFFFFF2047314 (1410714892.122126) can0 19FA0402#6DAAD2C711F6FFFF (1410714892.125117) can0 19FA0402#6EFFF21F390A674E (1410714892.128138) can0 19FA0402#6FA91174000000F2 (1410714892.131281) can0 19FA0402#701C1704C2C7D20D (1410714892.134119) can0 19FA0402#71F5FFFFFFF213A2 (1410714892.137110) can0 19FA0402#721C2C8051124100 (1410714892.140131) can0 19FA0402#730000F214221513 (1410714892.143336) can0 19FA0402#74B8A6111A000000 (1410714892.146143) can0 19FA0402#75F2FFFFFFFFFFFF (1410714892.149134) can0 0DF80502#602F05C73F90463C (1410714892.152094) can0 0DF80502#6124C0A424231143 (1410714892.155207) can0 0DF80502#624305809E757091 (1410714892.158106) can0 0DF80502#63B9310385C88F02 (1410714892.161127) can0 0DF80502#640000000013FC0C (1410714892.164118) can0 0DF80502#6549008000AC0D00 (1410714892.167231) can0 0DF80502#660000FFFFFFFFFF (1410714892.170130) can0 09F80102#36729A16021AB80D (1410714892.202174) can0 09F80202#06FC00000400FFFF (1410714892.227259) can0 09F80102#36729A16021AB80D (1410714892.327265) can0 09F80102#36729A16021AB80D (1410714892.427271) can0 09F80102#36729A16021AB80D (1410714892.442622) can0 19F212B0#E00952000064FF79 (1410714892.443171) can0 19F212B0#E11C0A00FFFFFFFF (1410714892.443720) can0 19F214B0#00EC04C5FF6D7852 (1410714892.452082) can0 09F80202#07FC00000400FFFF (1410714892.527247) can0 09F80102#36729A16021AB80D (1410714892.627253) can0 09F80102#36729A16021AB80D (1410714892.637629) can0 11F80E01#A01B01A929C40C80 (1410714892.638178) can0 11F80E01#A133B90D80019A16 (1410714892.638728) can0 11F80E01#A23862020000D460 (1410714892.639307) can0 11F80E01#A30C7CCA000000FE (1410714892.702021) can0 09F80202#08FC00000400FFFF (1410714892.704279) can0 0DF50B11#0195030000FFFFFF (1410714892.727351) can0 09F80102#36729A16021AB80D (1410714892.827265) can0 09F80102#36729A16021AB80D (1410714892.927210) can0 09F80102#36729A16021AB80D (1410714892.951929) can0 09F80202#09FC00000400FFFF (1410714893.027186) can0 09F80102#36729A16021AB80D (1410714893.098200) can0 0DF01002#0AF0C73FA06D3C24 (1410714893.100825) can0 19FA0302#0AD3490069006400 (1410714893.103815) can0 19FA0402#80930AFD0C0B7F34 (1410714893.106806) can0 19FA0402#8113C7A312F4FFFF (1410714893.110041) can0 19FA0402#82FFF220673007D4 (1410714893.112818) can0 19FA0402#839512F9FFFFFFF2 (1410714893.115809) can0 19FA0402#840E7F16B920A411 (1410714893.118830) can0 19FA0402#8501000000F2168B (1410714893.121882) can0 19FA0402#8609AD2D85110200 (1410714893.124812) can0 19FA0402#870000F20122247C (1410714893.127833) can0 19FA0402#88D93113EBFFFFFF (1410714893.130823) can0 19FA0402#89F21BE80A9574A2 (1410714893.133906) can0 19FA0402#8A1034000000F217 (1410714893.136805) can0 19FA0402#8BD106CE8DD31079 (1410714893.139826) can0 19FA0402#8CFFFFFFF2047314 (1410714893.142817) can0 19FA0402#8DAAD26212E7FFFF (1410714893.145899) can0 19FA0402#8EFFF21F390A674E (1410714893.148798) can0 19FA0402#8FB51175000000F2 (1410714893.151789) can0 19FA0402#901C1704C2C73B0E (1410714893.154810) can0 19FA0402#91E7FFFFFFF213A2 (1410714893.157893) can0 19FA0402#921C2C8083124600 (1410714893.160792) can0 19FA0402#930000F214221513 (1410714893.163813) can0 19FA0402#94B878111F000000 (1410714893.166834) can0 19FA0402#95F2FFFFFFFFFFFF (1410714893.170008) can0 0DF80502#802F0AC73FA06D3C (1410714893.172785) can0 0DF80502#8124C0A424231143 (1410714893.175806) can0 0DF80502#824305809E757091 (1410714893.178797) can0 0DF80502#83B9310385C88F02 (1410714893.181910) can0 0DF80502#840000000013FC0C (1410714893.184809) can0 0DF80502#8549008000AC0D00 (1410714893.187830) can0 0DF80502#860000FFFFFFFFFF (1410714893.190791) can0 09F80102#36729A16021AB80D (1410714893.222834) can0 09F80202#0BFC00000200FFFF (1410714893.247797) can0 09F80102#36729A16021AB80D (1410714893.344416) can0 11F80E01#C01B0188F64A0EB0 (1410714893.344965) can0 11F80E01#C1FBB80D60009A16 (1410714893.345545) can0 11F80E01#C238FFFF00000309 (1410714893.346094) can0 11F80E01#C301154F000000FE (1410714893.347773) can0 09F80102#36729A16021AB80D (1410714893.447749) can0 09F80102#36729A16021AB80D (1410714893.472773) can0 09F80202#0CFC00000200FFFF (1410714893.547724) can0 09F80102#36729A16021AB80D (1410714893.647700) can0 09F80102#36729A16021AB80D (1410714893.705775) can0 0DF50B11#0195030000FFFFFF (1410714893.722712) can0 09F80202#0DFC00000200FFFF (1410714893.747675) can0 09F80102#36729A16021AB80D (1410714893.847651) can0 09F80102#36729A16021AB80D (1410714893.942347) can0 19F212B0#000961000064FF79 (1410714893.942927) can0 19F212B0#011C0800FFFFFFFF (1410714893.943476) can0 19F214B0#00EC04C5FF6D7861 (1410714893.947626) can0 09F80102#36729A16021AB80D (1410714893.972712) can0 09F80202#0EFC00000200FFFF (1410714894.047602) can0 09F80102#36729A16021AB80D (1410714894.056788) can0 0DF01002#0FF0C73FB0943C24 (1410714894.059534) can0 19FA0302#0FD3490069006400 (1410714894.062525) can0 19FA0402#A0930FFD0C0B7F34 (1410714894.065516) can0 19FA0402#A113C78311FDFFFF (1410714894.068659) can0 19FA0402#A2FFF220673007D4 (1410714894.071528) can0 19FA0402#A33D12FEFFFFFFF2 (1410714894.074519) can0 19FA0402#A40E7F16B920DD11 (1410714894.077509) can0 19FA0402#A5F7FFFFFFF2168B (1410714894.080592) can0 19FA0402#A609AD2D76110000 (1410714894.083521) can0 19FA0402#A70000F20122247C (1410714894.086512) can0 19FA0402#A8D98913E6FFFFFF (1410714894.089533) can0 19FA0402#A9F21BE80A9574A0 (1410714894.092646) can0 19FA0402#AA1033000000F217 (1410714894.095484) can0 19FA0402#ABD106CE8DC2107D (1410714894.098505) can0 19FA0402#ACFFFFFFF2047314 (1410714894.101496) can0 19FA0402#ADAAD23B12DFFFFF (1410714894.104823) can0 19FA0402#AEFFF21F390A674E (1410714894.107508) can0 19FA0402#AFA81174000000F2 (1410714894.110499) can0 19FA0402#B01C1704C2C7150E (1410714894.113520) can0 19FA0402#B1E9FFFFFFF213A2 (1410714894.116694) can0 19FA0402#B21C2C80D4123F00 (1410714894.119501) can0 19FA0402#B30000F214221513 (1410714894.122492) can0 19FA0402#B4B882111D000000 (1410714894.125513) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714894.128626) can0 0DF80502#A02F0FC73FB0943C (1410714894.131495) can0 0DF80502#A124C0A424231143 (1410714894.134486) can0 0DF80502#A24305809E757091 (1410714894.137476) can0 0DF80502#A3B9310385C88F02 (1410714894.140620) can0 0DF80502#A40000000013FC0C (1410714894.143488) can0 0DF80502#A549008000AC0D00 (1410714894.146510) can0 0DF80502#A60000FFFFFFFFFF (1410714894.149500) can0 09F80102#36729A16021AB80D (1410714894.180659) can0 09F80202#10FC00000200FFFF (1410714894.205500) can0 09F80102#36729A16021AB80D (1410714894.228022) can0 1DEFFF01#E00AE598B6060404 (1410714894.228602) can0 1DEFFF01#E100000002FFFFFF (1410714894.305476) can0 09F80102#36729A16021AB80D (1410714894.405451) can0 09F80102#36729A16021AB80D (1410714894.430476) can0 09F80202#11FC00000200FFFF (1410714894.505427) can0 09F80102#36729A16021AB80D (1410714894.605372) can0 09F80102#36729A16021AB80D (1410714894.680659) can0 09F80202#12FC00000200FFFF (1410714894.705347) can0 09F80102#36729A16021AB80D (1410714894.707240) can0 0DF50B11#0198030000FFFFFF (1410714894.805323) can0 09F80102#36729A16021AB80D (1410714894.905299) can0 09F80102#36729A16021AB80D (1410714894.930323) can0 09F80202#13FC00000200FFFF (1410714894.958094) can0 11F80E01#E01B014875520E30 (1410714894.958643) can0 11F80E01#E1EC9F0D80ADA616 (1410714894.959193) can0 11F80E01#E23C2ACBE3011C40 (1410714894.959742) can0 11F80E01#E30865C6000000FE (1410714895.005244) can0 09F80102#36729A16021AB80D (1410714895.065516) can0 0DF01002#14F0C73FC0BB3C24 (1410714895.068201) can0 19FA0302#14D3490069006400 (1410714895.071314) can0 19FA0402#C09314FD0C0B7F34 (1410714895.074213) can0 19FA0402#C113C76A11050000 (1410714895.077204) can0 19FA0402#C200F220673007D4 (1410714895.080195) can0 19FA0402#C32512FDFFFFFFF2 (1410714895.083369) can0 19FA0402#C40E7F16B920C411 (1410714895.086207) can0 19FA0402#C5FAFFFFFFF2168B (1410714895.089198) can0 19FA0402#C609AD2D23110A00 (1410714895.092188) can0 19FA0402#C70000F20122247C (1410714895.095271) can0 19FA0402#C8D91F13E7FFFFFF (1410714895.098170) can0 19FA0402#C9F21BE80A95749B (1410714895.101191) can0 19FA0402#CA1031000000F217 (1410714895.104182) can0 19FA0402#CBD106CE8DE91085 (1410714895.107264) can0 19FA0402#CCFFFFFFF2047314 (1410714895.110194) can0 19FA0402#CDAAD2FC11E2FFFF (1410714895.113184) can0 19FA0402#CEFFF21F390A674E (1410714895.116206) can0 19FA0402#CFAB1174000000F2 (1410714895.119318) can0 19FA0402#D01C1704C2C7DC0D (1410714895.122187) can0 19FA0402#D1E5FFFFFFF213A2 (1410714895.125178) can0 19FA0402#D21C2C8001124000 (1410714895.128168) can0 19FA0402#D30000F214221513 (1410714895.131342) can0 19FA0402#D4B8C31120000000 (1410714895.134211) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714895.137171) can0 0DF80502#C02F14C73FC0BB3C (1410714895.140162) can0 0DF80502#C124C0A424231143 (1410714895.143397) can0 0DF80502#C24305809E757091 (1410714895.146174) can0 0DF80502#C3B9310385C88F02 (1410714895.149195) can0 0DF80502#C40000000013FC0C (1410714895.152186) can0 0DF80502#C549008000AC0D00 (1410714895.155299) can0 0DF80502#C60000FFFFFFFFFF (1410714895.158167) can0 09F80102#36729A16021AB80D (1410714895.190241) can0 09F80202#15FC00000300FFFF (1410714895.215296) can0 09F80102#36729A16021AB80D (1410714895.315302) can0 09F80102#36729A16021AB80D (1410714895.415308) can0 09F80102#36729A16021AB80D (1410714895.440150) can0 09F80202#16FC00000300FFFF (1410714895.442377) can0 19F212B0#200970000064FF78 (1410714895.442957) can0 19F212B0#211C0A00FFFFFFFF (1410714895.443507) can0 19F214B0#00EC04C5FF6D7870 (1410714895.515314) can0 09F80102#36729A16021AB80D (1410714895.615321) can0 09F80102#36729A16021AB80D (1410714895.690089) can0 09F80202#17FC00000300FFFF (1410714895.715327) can0 09F80102#36729A16021AB80D (1410714895.808802) can0 0DF50B11#0198030000FFFFFF (1410714895.815302) can0 09F80102#36729A16021AB80D (1410714895.915278) can0 09F80102#36729A16021AB80D (1410714895.939997) can0 09F80202#18FC00000300FFFF (1410714896.015253) can0 09F80102#36729A16021AB80D (1410714896.074885) can0 0DF01002#19F0C73FD0E23C24 (1410714896.077937) can0 19FA0302#19D3490069006400 (1410714896.080866) can0 19FA0402#E09319FD0C0B7F34 (1410714896.083887) can0 19FA0402#E113C7E911000000 (1410714896.086878) can0 19FA0402#E200F220673007D4 (1410714896.090022) can0 19FA0402#E37712F7FFFFFFF2 (1410714896.092890) can0 19FA0402#E40E7F16B9207411 (1410714896.095881) can0 19FA0402#E501000000F2168B (1410714896.098872) can0 19FA0402#E609AD2D4D111100 (1410714896.101923) can0 19FA0402#E70000F20122247C (1410714896.104884) can0 19FA0402#E8D93F12E9FFFFFF (1410714896.107874) can0 19FA0402#E9F21BE80A9574CA (1410714896.110865) can0 19FA0402#EA1028000000F217 (1410714896.113917) can0 19FA0402#EBD106CE8D5B1082 (1410714896.116877) can0 19FA0402#ECFFFFFFF2047314 (1410714896.119868) can0 19FA0402#EDAAD2EF11DBFFFF (1410714896.122858) can0 19FA0402#EEFFF21F390A674E (1410714896.125941) can0 19FA0402#EFAA1176000000F2 (1410714896.128901) can0 19FA0402#F01C1704C2C72A0E (1410714896.131892) can0 19FA0402#F1F2FFFFFFF213A2 (1410714896.134852) can0 19FA0402#F21C2C80EE113D00 (1410714896.137934) can0 19FA0402#F30000F214221513 (1410714896.140864) can0 19FA0402#F4B87D1126000000 (1410714896.143885) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714896.146876) can0 0DF80502#E02F19C73FD0E23C (1410714896.150050) can0 0DF80502#E124C0A424231143 (1410714896.152857) can0 0DF80502#E24305809E757091 (1410714896.155848) can0 0DF80502#E3B9310385C88F02 (1410714896.158869) can0 0DF80502#E40000000013FC0C (1410714896.161921) can0 0DF80502#E549008000AC0D00 (1410714896.164881) can0 0DF80502#E60000FFFFFFFFFF (1410714896.167872) can0 09F80102#36729A16021AB80D (1410714896.198908) can0 09F80202#1AFC00000300FFFF (1410714896.223872) can0 09F80102#36729A16021AB80D (1410714896.323847) can0 09F80102#36729A16021AB80D (1410714896.423823) can0 09F80102#36729A16021AB80D (1410714896.448817) can0 09F80202#1BFC00000300FFFF (1410714896.523768) can0 09F80102#36729A16021AB80D (1410714896.623743) can0 09F80102#36729A16021AB80D (1410714896.698756) can0 09F80202#1CFC00000300FFFF (1410714896.723719) can0 09F80102#36729A16021AB80D (1410714896.810206) can0 0DF50B11#0198030000FFFFFF (1410714896.823695) can0 09F80102#36729A16021AB80D (1410714896.923670) can0 09F80102#36729A16021AB80D (1410714896.942438) can0 19F212B0#40097F000064FF76 (1410714896.942988) can0 19F212B0#411C0800FFFFFFFF (1410714896.943537) can0 19F214B0#00ED04C5FF67787F (1410714896.948725) can0 09F80202#1DFC00000300FFFF (1410714897.023646) can0 09F80102#36729A16021AB80D (1410714897.083979) can0 0DF01002#1EF0C73FE0093D24 (1410714897.086573) can0 19FA0302#1ED3490069006400 (1410714897.089564) can0 19FA0402#00931EFD0C0B7F34 (1410714897.092677) can0 19FA0402#0113C7A511FEFFFF (1410714897.095576) can0 19FA0402#02FFF220673007D4 (1410714897.098566) can0 19FA0402#032412F6FFFFFFF2 (1410714897.101557) can0 19FA0402#040E7F16B9206311 (1410714897.104761) can0 19FA0402#05FBFFFFFFF2168B (1410714897.107569) can0 19FA0402#0609AD2D3E111600 (1410714897.110560) can0 19FA0402#070000F20122247C (1410714897.113551) can0 19FA0402#08D91213E1FFFFFF (1410714897.116724) can0 19FA0402#09F21BE80A95741D (1410714897.119563) can0 19FA0402#0A102E000000F217 (1410714897.122553) can0 19FA0402#0BD106CE8D84107F (1410714897.125544) can0 19FA0402#0CFFFFFFF2047314 (1410714897.128657) can0 19FA0402#0DAAD2B911DDFFFF (1410714897.131556) can0 19FA0402#0EFFF21F390A674E (1410714897.134547) can0 19FA0402#0F27117D000000F2 (1410714897.137537) can0 19FA0402#101C1704C2C70D0E (1410714897.140650) can0 19FA0402#11EBFFFFFFF213A2 (1410714897.143549) can0 19FA0402#121C2C8017123E00 (1410714897.146540) can0 19FA0402#130000F214221513 (1410714898.192225) can0 0DF80502#23B9310340DA8F02 (1410714898.195338) can0 0DF80502#240000000013FC0C (1410714898.198237) can0 0DF80502#2549008000AC0D00 (1410714898.201258) can0 0DF80502#260000FFFFFFFFFF (1410714898.204218) can0 09F80102#D6719A16871AB80D (1410714898.236262) can0 09F80202#24FC00000300FFFF (1410714898.261225) can0 09F80102#D6719A16871AB80D (1410714898.361201) can0 09F80102#D6719A16871AB80D (1410714898.442683) can0 19F212B0#60098E000064FF78 (1410714898.443262) can0 19F212B0#611CA104FFFFFFFF (1410714898.443812) can0 19F214B0#00E304C5FF6D788E (1410714898.461146) can0 09F80102#D6719A16871AB80D (1410714898.486201) can0 09F80202#25FC00000300FFFF (1410714898.561121) can0 09F80102#D6719A16871AB80D (1410714898.661097) can0 09F80102#D6719A16871AB80D (1410714898.736109) can0 09F80202#26FC00000300FFFF (1410714898.761073) can0 09F80102#D6719A16871AB80D (1410714898.813166) can0 0DF50B11#0195030000FFFFFF (1410714898.861048) can0 09F80102#D6719A16871AB80D (1410714898.961054) can0 09F80102#D6719A16871AB80D (1410714898.986048) can0 09F80202#27FC00000300FFFF (1410714899.060999) can0 09F80102#D6719A16871AB80D (1410714899.071436) can0 0DF01002#28F0C73F00583D24 (1410714899.073969) can0 19FA0302#28D3490069006400 (1410714899.076960) can0 19FA0402#409328FD0C0B7F34 (1410714899.079951) can0 19FA0402#4113C74F12FCFFFF (1410714899.083399) can0 19FA0402#42FFF220673007D4 (1410714899.085963) can0 19FA0402#43EB12F0FFFFFFF2 (1410714899.088923) can0 19FA0402#440E7F16B9209811 (1410714899.091944) can0 19FA0402#45F8FFFFFFF2168B (1410714899.094935) can0 19FA0402#4609AD2D3F111100 (1410714899.097956) can0 19FA0402#470000F20122247C (1410714899.100947) can0 19FA0402#48D90713DFFFFFFF (1410714899.103907) can0 19FA0402#49F21BE80A957486 (1410714899.106928) can0 19FA0402#4A102B000000F217 (1410714899.110102) can0 19FA0402#4BD106CE8D76107B (1410714899.112940) can0 19FA0402#4CFFFFFFF2047314 (1410714899.115931) can0 19FA0402#4DAAD21F11E5FFFF (1410714899.118922) can0 19FA0402#4EFFF21F390A674E (1410714899.121943) can0 19FA0402#4F891171000000F2 (1410714899.124903) can0 19FA0402#501C1704C2C7250E (1410714899.127924) can0 19FA0402#51EEFFFFFFF213A2 (1410714899.130915) can0 19FA0402#521C2C809D123000 (1410714899.133967) can0 19FA0402#530000F214221513 (1410714899.136927) can0 19FA0402#54B838112B000000 (1410714899.139948) can0 19FA0402#55F2FFFFFFFFFFFF (1410714899.142939) can0 0DF80502#402F28C73F00583D (1410714899.145960) can0 0DF80502#412480CEECD5FA42 (1410714899.148920) can0 0DF80502#4243058090627EB0 (1410714899.151911) can0 0DF80502#43B9310340DA8F02 (1410714899.154932) can0 0DF80502#440000000013FC0C (1410714899.157984) can0 0DF80502#4549008000AC0D00 (1410714899.160944) can0 0DF80502#460000FFFFFFFFFF (1410714899.163905) can0 09F80102#D6719A16871AB80D (1410714899.195277) can0 09F80202#29FC00000200FFFF (1410714899.219904) can0 09F80102#D6719A16871AB80D (1410714899.227717) can0 1DEFFF01#000AE598B6060404 (1410714899.228327) can0 1DEFFF01#0100000002FFFFFF (1410714899.277735) can0 11F80E01#001B01985B620E90 (1410714899.278315) can0 11F80E01#01C5C20D60B99916 (1410714899.278864) can0 11F80E01#0254A5A400004AC0 (1410714899.279414) can0 11F80E01#0308FFFFFF7F00FE (1410714899.319880) can0 09F80102#D6719A16871AB80D (1410714899.419855) can0 09F80102#D6719A16871AB80D (1410714899.444880) can0 09F80202#2AFC00000200FFFF (1410714899.519831) can0 09F80102#D6719A16871AB80D (1410714899.619807) can0 09F80102#D6719A16871AB80D (1410714899.694819) can0 09F80202#2BFC00000200FFFF (1410714899.719752) can0 09F80102#D6719A16871AB80D (1410714899.814997) can0 0DF50B11#0195030000FFFFFF (1410714899.819727) can0 09F80102#D6719A16871AB80D (1410714899.919703) can0 09F80102#D6719A16871AB80D (1410714899.942408) can0 19F212B0#80099D000064FF75 (1410714899.942988) can0 19F212B0#811C0A00FFFFFFFF (1410714899.943568) can0 19F214B0#00ED04C5FF67789D (1410714899.944758) can0 09F80202#2CFC00000200FFFF (1410714900.019709) can0 09F80102#D6719A16871AB80D (1410714900.107447) can0 0DF01002#2DF0C73F107F3D24 (1410714900.110041) can0 19FA0302#2DD3490069006400 (1410714900.112727) can0 19FA0402#60932DFD0C0B7F34 (1410714900.115656) can0 19FA0402#6113C79C11FFFFFF (1410714900.118616) can0 19FA0402#62FFF220673007D4 (1410714900.121912) can0 19FA0402#639512EFFFFFFFF2 (1410714900.124689) can0 19FA0402#640E7F16B9208511 (1410714900.127650) can0 19FA0402#65FFFFFFFFF2168B (1410714900.130610) can0 19FA0402#6609AD2D5C111300 (1410714900.133906) can0 19FA0402#670000F20122247C (1410714900.136774) can0 19FA0402#68D94B13E2FFFFFF (1410714900.139582) can0 19FA0402#69F21B390A9574A9 (1410714900.142603) can0 19FA0402#6A102E000000F217 (1410714900.145594) can0 19FA0402#6BD106CE8DB6106A (1410714900.148707) can0 19FA0402#6CFFFFFFF2047314 (1410714900.151606) can0 19FA0402#6DAAD2DE11E8FFFF (1410714900.154597) can0 19FA0402#6EFFF21F390A674E (1410714900.157587) can0 19FA0402#6F67116D000000F2 (1410714900.160639) can0 19FA0402#701C1704C2C73D0E (1410714900.163599) can0 19FA0402#71EFFFFFFFF213A2 (1410714900.166590) can0 19FA0402#721C2C8085122F00 (1410714900.169581) can0 19FA0402#730000F214221513 (1410714900.172724) can0 19FA0402#74B8FB101D000000 (1410714900.175623) can0 19FA0402#75F2FFFFFFFFFFFF (1410714900.178584) can0 0DF80502#602F2DC73F107F3D (1410714900.181574) can0 0DF80502#612480CEECD5FA42 (1410714900.184779) can0 0DF80502#6243058090627EB0 (1410714900.187586) can0 0DF80502#63B9310340DA8F02 (1410714900.190607) can0 0DF80502#640000000013FC0C (1410714900.193598) can0 0DF80502#6549008000AC0D00 (1410714900.196772) can0 0DF80502#660000FFFFFFFFFF (1410714900.199580) can0 09F80102#D6719A16871AB80D (1410714900.231654) can0 09F80202#2EFC00000800FFFF (1410714900.256800) can0 09F80102#D6719A16871AB80D (1410714900.356776) can0 09F80102#D6719A16871AB80D (1410714900.456782) can0 09F80102#D6719A16871AB80D (1410714900.481562) can0 09F80202#2FFC00000800FFFF (1410714900.556788) can0 09F80102#D6719A16871AB80D (1410714900.656916) can0 09F80102#D6719A16871AB80D (1410714900.731501) can0 09F80202#30FC00000800FFFF (1410714900.756800) can0 09F80102#D6719A16871AB80D (1410714900.816462) can0 0DF50B11#0195030000FFFFFF (1410714900.851160) can0 11F80E01#201B0108975C0E40 (1410714900.851710) can0 11F80E01#219DC50D80F69816 (1410714900.852259) can0 11F80E01#22514F5900003483 (1410714900.852839) can0 11F80E01#230088AE000000FE (1410714900.856806) can0 09F80102#D6719A16871AB80D (1410714900.956782) can0 09F80102#D6719A16871AB80D (1410714900.981409) can0 09F80202#31FC00000800FFFF (1410714901.056788) can0 09F80102#D6719A16871AB80D (1410714901.066431) can0 0DF01002#32F0C73F20A63D24 (1410714901.069300) can0 19FA0302#32D3490069006400 (1410714901.072688) can0 19FA0402#809332FD0C0B7F34 (1410714901.075343) can0 19FA0402#8113C7C911020000 (1410714901.078333) can0 19FA0402#8200F220673007D4 (1410714901.081324) can0 19FA0402#837A12EBFFFFFFF2 (1410714901.084681) can0 19FA0402#840E7F16B920A211 (1410714901.087336) can0 19FA0402#85FDFFFFFFF2168B (1410714901.090327) can0 19FA0402#8609AD2D68110C00 (1410714901.093287) can0 19FA0402#870000F20122247C (1410714901.096735) can0 19FA0402#88D9A213E5FFFFFF (1410714901.099390) can0 19FA0402#89F21B390A957481 (1410714901.102320) can0 19FA0402#8A1037000000F217 (1410714901.105280) can0 19FA0402#8BD106CE8D12115D (1410714901.108698) can0 19FA0402#8CFFFFFFF2047314 (1410714901.111384) can0 19FA0402#8DAAD2BE11EFFFFF (1410714901.114313) can0 19FA0402#8EFFF21F390A674E (1410714901.117274) can0 19FA0402#8F3F1169000000F2 (1410714901.120600) can0 19FA0402#901C1704C2C7420E (1410714901.123499) can0 19FA0402#91E4FFFFFFF213A2 (1410714901.126307) can0 19FA0402#921C2C803C123300 (1410714901.129298) can0 19FA0402#930000F214221513 (1410714901.132685) can0 19FA0402#94B8601119000000 (1410714901.135340) can0 19FA0402#95F2FFFFFFFFFFFF (1410714901.138300) can0 0DF80502#802F32C73F20A63D (1410714901.141291) can0 0DF80502#812480CEECD5FA42 (1410714901.144282) can0 0DF80502#8243058090627EB0 (1410714901.147303) can0 0DF80502#83B9310340DA8F02 (1410714901.150294) can0 0DF80502#840000000013FC0C (1410714901.153284) can0 0DF80502#8549008000AC0D00 (1410714901.156306) can0 0DF80502#860000FFFFFFFFFF (1410714901.159357) can0 09F80102#D6719A16871AB80D (1410714901.190363) can0 09F80202#33FC00000400FFFF (1410714901.215357) can0 09F80102#D6719A16871AB80D (1410714901.315363) can0 09F80102#D6719A16871AB80D (1410714901.415369) can0 09F80102#D6719A16871AB80D (1410714901.440272) can0 09F80202#34FC00000400FFFF (1410714901.442744) can0 19F212B0#A009AC000064FF75 (1410714901.443293) can0 19F212B0#A11CA104FFFFFFFF (1410714901.443842) can0 19F214B0#00E804C5FF6778AC (1410714901.515437) can0 09F80102#D6719A16871AB80D (1410714901.615504) can0 09F80102#D6719A16871AB80D (1410714901.690180) can0 09F80202#35FC00000400FFFF (1410714901.715449) can0 09F80102#D6719A16871AB80D (1410714901.815424) can0 09F80102#D6719A16871AB80D (1410714901.818018) can0 0DF50B11#0195030000FFFFFF (1410714901.915461) can0 09F80102#D6719A16871AB80D (1410714901.940089) can0 09F80202#36FC00000400FFFF (1410714902.015437) can0 09F80102#D6719A16871AB80D (1410714902.074610) can0 0DF01002#37F0C73F30CD3D24 (1410714902.077021) can0 19FA0302#37D3490069006400 (1410714902.079981) can0 19FA0402#A09337FD0C0B7F34 (1410714902.083491) can0 19FA0402#A113C79511FDFFFF (1410714902.085993) can0 19FA0402#A2FFF220673007D4 (1410714902.089045) can0 19FA0402#A38112F2FFFFFFF2 (1410714902.091975) can0 19FA0402#A40E7F16B9208711 (1410714902.095454) can0 19FA0402#A506000000F2168B (1410714902.097987) can0 19FA0402#A609AD2D8E110800 (1410714902.101038) can0 19FA0402#A70000F20122247C (1410714902.103968) can0 19FA0402#A8D98E13E4FFFFFF (1410714902.107294) can0 19FA0402#A9F21B390A95749E (1410714902.110224) can0 19FA0402#AA1036000000F217 (1410714902.113001) can0 19FA0402#ABD106CE8DAF1062 (1410714902.115992) can0 19FA0402#ACFFFFFFF2047314 (1410714902.119379) can0 19FA0402#ADAAD2D411FDFFFF (1410714902.121973) can0 19FA0402#AEFFF21F390A674E (1410714902.125025) can0 19FA0402#AF801166000000F2 (1410714902.127985) can0 19FA0402#B01C1704C2C74C0E (1410714902.131373) can0 19FA0402#B1DFFFFFFFF213A2 (1410714902.133967) can0 19FA0402#B21C2C8058123600 (1410714902.136988) can0 19FA0402#B30000F214221513 (1410714902.139979) can0 19FA0402#B4B8481116000000 (1410714902.143519) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714902.145991) can0 0DF80502#A02F37C73F30CD3D (1410714902.148981) can0 0DF80502#A12480CEECD5FA42 (1410714902.151972) can0 0DF80502#A243058090627EB0 (1410714902.155360) can0 0DF80502#A3B9310340DA8F02 (1410714902.157984) can0 0DF80502#A40000000013FC0C (1410714902.160975) can0 0DF80502#A549008000AC0D00 (1410714902.163996) can0 0DF80502#A60000FFFFFFFFFF (1410714902.166956) can0 09F80102#D6719A16871AB80D (1410714902.199396) can0 09F80202#38FC00000600FFFF (1410714902.223963) can0 09F80102#D6719A16871AB80D (1410714902.323939) can0 09F80102#D6719A16871AB80D (1410714902.423914) can0 09F80102#D6719A16871AB80D (1410714902.448939) can0 09F80202#39FC00000600FFFF (1410714902.523890) can0 09F80102#D6719A16871AB80D (1410714902.623835) can0 09F80102#D6719A16871AB80D (1410714902.698847) can0 09F80202#3AFC00000600FFFF (1410714902.717493) can0 11F80E01#401B01A929C40CA0 (1410714902.718043) can0 11F80E01#4132B90D60019A16 (1410714902.718592) can0 11F80E01#42600DE400007A83 (1410714902.719172) can0 11F80E01#43007CCA000000FE (1410714902.723811) can0 09F80102#D6719A16871AB80D (1410714902.819453) can0 0DF50B11#0195030000FFFFFF (1410714902.823786) can0 09F80102#D6719A16871AB80D (1410714902.923762) can0 09F80102#D6719A16871AB80D (1410714902.942530) can0 19F212B0#C009BB000064FF77 (1410714902.943079) can0 19F212B0#C11C0900FFFFFFFF (1410714902.943629) can0 19F214B0#00E904C5FF6B78BB (1410714902.948786) can0 09F80202#3BFC00000600FFFF (1410714903.023737) can0 09F80102#D6719A16871AB80D (1410714903.086146) can0 0DF01002#3CF0C73F40F43D24 (1410714903.088740) can0 19FA0302#3CD3490069006400 (1410714903.091700) can0 19FA0402#C0933CFD0C0B7F34 (1410714903.094660) can0 19FA0402#C113C7B012EEFFFF (1410714903.097956) can0 19FA0402#C2FFF220673007D4 (1410714903.100672) can0 19FA0402#C31F13F1FFFFFFF2 (1410714903.103693) can0 19FA0402#C40E7F16B9203711 (1410714903.106684) can0 19FA0402#C502000000F2168B (1410714903.110072) can0 19FA0402#C609AD2D95110800 (1410714903.112727) can0 19FA0402#C70000F20122247C (1410714903.115687) can0 19FA0402#C8D98313E9FFFFFF (1410714903.118647) can0 19FA0402#C9F21B390A9574E0 (1410714903.121943) can0 19FA0402#CA102D000000F217 (1410714903.124720) can0 19FA0402#CBD106CE8DAF106C (1410714903.127680) can0 19FA0402#CCFFFFFFF2047314 (1410714903.130671) can0 19FA0402#CDAAD29411F6FFFF (1410714903.133967) can0 19FA0402#CEFFF21F390A674E (1410714903.136744) can0 19FA0402#CFA31160000000F2 (1410714903.139704) can0 19FA0402#D01C1704C2C7EB0D (1410714903.142664) can0 19FA0402#D1E4FFFFFFF213A2 (1410714903.145960) can0 19FA0402#D21C2C8043123400 (1410714903.148737) can0 19FA0402#D30000F214221513 (1410714903.151698) can0 19FA0402#D4B8DF1019000000 (1410714903.154658) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714903.157954) can0 0DF80502#C02F3CC73F40F43D (1410714903.160670) can0 0DF80502#C12480CEECD5FA42 (1410714903.163691) can0 0DF80502#C243058090627EB0 (1410714903.166651) can0 0DF80502#C3B9310340DA8F02 (1410714903.170069) can0 0DF80502#C40000000013FC0C (1410714903.172724) can0 0DF80502#C549008000AC0D00 (1410714903.175715) can0 0DF80502#C60000FFFFFFFFFF (1410714903.178645) can0 09F80102#D6719A16871AB80D (1410714903.210688) can0 09F80202#3DFC00000500FFFF (1410714903.235682) can0 09F80102#D6719A16871AB80D (1410714903.335627) can0 09F80102#D6719A16871AB80D (1410714903.435603) can0 09F80102#D6719A16871AB80D (1410714903.460749) can0 09F80202#3EFC00000500FFFF (1410714903.535548) can0 09F80102#D6719A16871AB80D (1410714903.635523) can0 09F80102#D6719A16871AB80D (1410714903.710535) can0 09F80202#3FFC00000500FFFF (1410714903.735499) can0 09F80102#D6719A16871AB80D (1410714903.770808) can0 11F80E01#601B0188F64A0ED0 (1410714903.771357) can0 11F80E01#61FBB80DA0009A16 (1410714903.771937) can0 11F80E01#6260FFFF00002640 (1410714903.772486) can0 11F80E01#6308154F000000FE (1410714903.820917) can0 0DF50B11#0195030000FFFFFF (1410714903.835474) can0 09F80102#D6719A16871AB80D (1410714903.935450) can0 09F80102#D6719A16871AB80D (1410714903.960749) can0 09F80202#40FC00000500FFFF (1410714904.035456) can0 09F80102#D6719A16871AB80D (1410714904.094904) can0 0DF01002#41F0C73F501B3E24 (1410714904.097376) can0 19FA0302#41D3490069006400 (1410714904.100672) can0 19FA0402#E09341FD0C0B7F34 (1410714904.103541) can0 19FA0402#E113C70812ECFFFF (1410714904.106379) can0 19FA0402#E2FFF220673007D4 (1410714904.109370) can0 19FA0402#E3EF12EFFFFFFFF2 (1410714904.112727) can0 19FA0402#E40E7F16B9206B11 (1410714904.115412) can0 19FA0402#E5EEFFFFFFF2168B (1410714904.118372) can0 19FA0402#E609AD2D6211FDFF (1410714904.121333) can0 19FA0402#E7FFFFF20122247C (1410714904.124720) can0 19FA0402#E8D9AD13EAFFFFFF (1410714904.127344) can0 19FA0402#E9F21B390A95748F (1410714904.130366) can0 19FA0402#EA102B000000F217 (1410714904.133326) can0 19FA0402#EBD106CE8DED1072 (1410714904.136744) can0 19FA0402#ECFFFFFFF2047314 (1410714904.139429) can0 19FA0402#EDAAD29111F7FFFF (1410714904.142359) can0 19FA0402#EEFFF21F390A674E (1410714904.145350) can0 19FA0402#EF801164000000F2 (1410714904.148768) can0 19FA0402#F01C1704C2C7CF0D (1410714904.151423) can0 19FA0402#F1F7FFFFFFF213A2 (1410714904.154353) can0 19FA0402#F21C2C80AF113400 (1410714904.157313) can0 19FA0402#F30000F214221513 (1410714904.160639) can0 19FA0402#F4B88E111D000000 (1410714904.163538) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714904.166376) can0 0DF80502#E02F41C73F501B3E (1410714904.169337) can0 0DF80502#E12480CEECD5FA42 (1410714904.172724) can0 0DF80502#E243058090627EB0 (1410714904.175471) can0 0DF80502#E3B9310340DA8F02 (1410714904.178370) can0 0DF80502#E40000000013FC0C (1410714904.181330) can0 0DF80502#E549008000AC0D00 (1410714904.184779) can0 0DF80502#E60000FFFFFFFFFF (1410714904.187342) can0 09F80102#D6719A16871AB80D (1410714904.219508) can0 09F80202#42FC00000300FFFF (1410714904.227381) can0 1DEFFF01#200AE598B6060404 (1410714904.227961) can0 1DEFFF01#2100000002FFFFFF (1410714904.244746) can0 09F80102#D6719A16871AB80D (1410714904.291285) can0 11F80E01#801B014875520E90 (1410714904.291834) can0 11F80E01#81DC9F0D00B4A616 (1410714904.292384) can0 11F80E01#825CD9CBE301B583 (1410714904.292933) can0 11F80E01#830065C6000000FE (1410714904.344294) can0 09F80102#D6719A16871AB80D (1410714904.442744) can0 19F212B0#E009CA000064FF75 (1410714904.443293) can0 19F212B0#E11C0900FFFFFFFF (1410714904.443842) can0 19F214B0#00ED04C5FF6B78CA (1410714904.444392) can0 09F80102#D6719A16871AB80D (1410714904.469294) can0 09F80202#43FC00000300FFFF (1410714904.544245) can0 09F80102#D6719A16871AB80D (1410714904.644221) can0 09F80102#D6719A16871AB80D (1410714904.719477) can0 09F80202#44FC00000300FFFF (1410714904.744166) can0 09F80102#D6719A16871AB80D (1410714904.822382) can0 0DF50B11#0195030000FFFFFF (1410714904.844141) can0 09F80102#D6719A16871AB80D (1410714904.944117) can0 09F80102#D6719A16871AB80D (1410714904.969141) can0 09F80202#45FC00000300FFFF (1410714905.044062) can0 09F80102#D6719A16871AB80D (1410714905.057642) can0 0DF01002#46F0C73F60423E24 (1410714905.060053) can0 19FA0302#46D3490069006400 (1410714905.063563) can0 19FA0402#009346FD0C0B7F34 (1410714905.066035) can0 19FA0402#0113C71D12EEFFFF (1410714905.069086) can0 19FA0402#02FFF220673007D4 (1410714905.072047) can0 19FA0402#033A13EEFFFFFFF2 (1410714905.075404) can0 19FA0402#040E7F16B9202311 (1410714905.078059) can0 19FA0402#05F3FFFFFFF2168B (1410714905.081080) can0 19FA0402#0609AD2D7011F0FF (1410714905.084040) can0 19FA0402#07FFFFF20122247C (1410714905.087397) can0 19FA0402#08D9F913EDFFFFFF (1410714905.090052) can0 19FA0402#09F21B390A9574A0 (1410714905.093073) can0 19FA0402#0A1022000000F217 (1410714905.096033) can0 19FA0402#0BD106CE8DDA1070 (1410714905.099451) can0 19FA0402#0CFFFFFFF2047314 (1410714905.102015) can0 19FA0402#0DAAD2F511ECFFFF (1410714905.105067) can0 19FA0402#0EFFF21F390A674E (1410714905.108027) can0 19FA0402#0F711169000000F2 (1410714905.111414) can0 19FA0402#101C1704C2C7E10D (1410714905.114039) can0 19FA0402#1102000000F213A2 (1410714905.117060) can0 19FA0402#121C2C8022123300 (1410714905.120020) can0 19FA0402#130000F214221513 (1410714905.123530) can0 19FA0402#14B83B1118000000 (1410714905.126063) can0 19FA0402#15F2FFFFFFFFFFFF (1410714905.129084) can0 0DF80502#002F46C73F60423E (1410714905.132014) can0 0DF80502#012480CEECD5FA42 (1410714905.135462) can0 0DF80502#0243058090627EB0 (1410714905.138026) can0 0DF80502#03B9310340DA8F02 (1410714905.141077) can0 0DF80502#040000000013FC0C (1410714905.144038) can0 0DF80502#0549008000AC0D00 (1410714905.147395) can0 0DF80502#060000FFFFFFFFFF (1410714905.150111) can0 09F80102#D6719A16871AB80D (1410714905.182063) can0 09F80202#47FC00000300FFFF (1410714905.207362) can0 09F80102#D6719A16871AB80D (1410714905.307337) can0 09F80102#D6719A16871AB80D (1410714905.406977) can0 09F80102#D6719A16871AB80D (1410714905.432001) can0 09F80202#48FC00000300FFFF (1410714905.506922) can0 09F80102#D6719A16871AB80D (1410714905.606898) can0 09F80102#D6719A16871AB80D (1410714905.682063) can0 09F80202#49FC00000300FFFF (1410714905.706873) can0 09F80102#D6719A16871AB80D (1410714905.806849) can0 09F80102#D6719A16871AB80D (1410714905.906824) can0 09F80102#D6719A16871AB80D (1410714905.924006) can0 0DF50B11#0195030000FFFFFF (1410714905.931849) can0 09F80202#4AFC00000300FFFF (1410714905.942530) can0 19F212B0#0009D9000064FF51 (1410714905.943079) can0 19F212B0#011C0A00FFFFFFFF (1410714905.943629) can0 19F214B0#00EC04C5FF6D78D9 (1410714906.006770) can0 09F80102#D6719A16871AB80D (1410714906.066248) can0 0DF01002#4BF0C73F70693E24 (1410714906.068842) can0 19FA0302#4BD3490069006400 (1410714906.071772) can0 19FA0402#20934BFD0C0B7F34 (1410714906.074732) can0 19FA0402#2113C7A512E8FFFF (1410714906.078028) can0 19FA0402#22FFF220673007D4 (1410714906.080744) can0 19FA0402#23E412F1FFFFFFF2 (1410714906.083735) can0 19FA0402#240E7F16B9205211 (1410714906.086726) can0 19FA0402#25F9FFFFFFF2168B (1410714906.090083) can0 19FA0402#2609AD2D8411EEFF (1410714906.092768) can0 19FA0402#27FFFFF20122247C (1410714906.095759) can0 19FA0402#28D97213E9FFFFFF (1410714906.098719) can0 19FA0402#29F21B390A9574B5 (1410714906.102015) can0 19FA0402#2A101B000000F217 (1410714906.104823) can0 19FA0402#2BD106CE8DD31077 (1410714906.107752) can0 19FA0402#2CFFFFFFF2047314 (1410714906.110712) can0 19FA0402#2DAAD25012E3FFFF (1410714906.114008) can0 19FA0402#2EFFF21F390A674E (1410714906.116755) can0 19FA0402#2F96116B000000F2 (1410714906.119746) can0 19FA0402#301C1704C2C7E60D (1410714906.122736) can0 19FA0402#31F6FFFFFFF213A2 (1410714906.126032) can0 19FA0402#321C2C8077123200 (1410714906.128809) can0 19FA0402#330000F214221513 (1410714906.131739) can0 19FA0402#34B8421113000000 (1410714906.134730) can0 19FA0402#35F2FFFFFFFFFFFF (1410714906.138026) can0 0DF80502#202F4BC73F70693E (1410714906.140711) can0 0DF80502#212480CEECD5FA42 (1410714906.143732) can0 0DF80502#2243058090627EB0 (1410714906.146693) can0 0DF80502#23B9310340DA8F02 (1410714906.150111) can0 0DF80502#240000000013FC0C (1410714906.152796) can0 0DF80502#2549008000AC0D00 (1410714906.155756) can0 0DF80502#260000FFFFFFFFFF (1410714906.158686) can0 09F80102#D6719A16871AB80D (1410714906.190760) can0 09F80202#4CFC00000200FFFF (1410714906.215754) can0 09F80102#D6719A16871AB80D (1410714906.315699) can0 09F80102#D6719A16871AB80D (1410714906.415644) can0 09F80102#D6719A16871AB80D (1410714906.440760) can0 09F80202#4DFC00000200FFFF (1410714906.515620) can0 09F80102#D6719A16871AB80D (1410714906.615595) can0 09F80102#D6719A16871AB80D (1410714906.690607) can0 09F80202#4EFC00000200FFFF (1410714906.715571) can0 09F80102#D6719A16871AB80D (1410714906.815516) can0 09F80102#D6719A16871AB80D (1410714906.915491) can0 09F80102#D6719A16871AB80D (1410714906.925532) can0 0DF50B11#0195030000FFFFFF (1410714906.940791) can0 09F80202#4FFC00000200FFFF (1410714907.015467) can0 09F80102#D6719A16871AB80D (1410714907.075007) can0 0DF01002#50F0C73F80903E24 (1410714907.077418) can0 19FA0302#50D3490069006400 (1410714907.080714) can0 19FA0402#409350FD0C0B7F34 (1410714907.083552) can0 19FA0402#4113C79011F8FFFF (1410714907.086420) can0 19FA0402#42FFF220673007D4 (1410714907.089411) can0 19FA0402#43B512F9FFFFFFF2 (1410714907.092768) can0 19FA0402#440E7F16B920B511 (1410714907.095454) can0 19FA0402#45F3FFFFFFF2168B (1410714907.098444) can0 19FA0402#4609AD2DB011F0FF (1410714907.101405) can0 19FA0402#47FFFFF20122247C (1410714907.104792) can0 19FA0402#48D9CB13E4FFFFFF (1410714907.107386) can0 19FA0402#49F21B390A957498 (1410714907.110438) can0 19FA0402#4A101C000000F217 (1410714907.113398) can0 19FA0402#4BD106CE8D911085 (1410714907.116785) can0 19FA0402#4CFFFFFFF2047314 (1410714907.119440) can0 19FA0402#4DAAD27012DFFFFF (1410714907.122431) can0 19FA0402#4EFFF21F390A674E (1410714907.125391) can0 19FA0402#4F6A1167000000F2 (1410714907.128809) can0 19FA0402#501C1704C2C7220E (1410714907.131434) can0 19FA0402#51EDFFFFFFF213A2 (1410714907.134425) can0 19FA0402#521C2C808C123300 (1410714907.137385) can0 19FA0402#530000F214221513 (1410714907.140711) can0 19FA0402#54B8391111000000 (1410714907.143580) can0 19FA0402#55F2FFFFFFFFFFFF (1410714907.146418) can0 0DF80502#402F50C73F80903E (1410714907.149378) can0 0DF80502#412480CEECD5FA42 (1410714907.152766) can0 0DF80502#4243058090627EB0 (1410714907.155421) can0 0DF80502#43B9310340DA8F02 (1410714907.158442) can0 0DF80502#440000000013FC0C (1410714907.161402) can0 0DF80502#4549008000AC0D00 (1410714907.164790) can0 0DF80502#460000FFFFFFFFFF (1410714907.167384) can0 09F80102#D6719A16871AB80D (1410714907.171473) can0 11F80E01#A01B0132D74A10B0 (1410714907.172022) can0 11F80E01#A197E30D60409116 (1410714907.172572) can0 11F80E01#A26EF0BD8601A840 (1410714907.173121) can0 11F80E01#A300E5BE000000FE (1410714907.199519) can0 09F80202#51FC00000400FFFF (1410714907.224818) can0 09F80102#D6719A16871AB80D (1410714907.324732) can0 09F80102#D6719A16871AB80D (1410714907.424342) can0 09F80102#D6719A16871AB80D (1410714907.442561) can0 19F212B0#2009E8000064FF51 (1410714907.443140) can0 19F212B0#211C0800FFFFFFFF (1410714907.443690) can0 19F214B0#00EC04C5FF6D78E8 (1410714907.449366) can0 09F80202#52FC00000400FFFF (1410714907.524317) can0 09F80102#D6719A16871AB80D (1410714907.624262) can0 09F80102#D6719A16871AB80D (1410714907.699580) can0 09F80202#53FC00000400FFFF (1410714907.724238) can0 09F80102#D6719A16871AB80D (1410714907.824213) can0 09F80102#D6719A16871AB80D (1410714907.924189) can0 09F80102#D6719A16871AB80D (1410714907.927088) can0 0DF50B11#0198030000FFFFFF (1410714907.949213) can0 09F80202#54FC00000400FFFF (1410714908.024134) can0 09F80102#D6719A16871AB80D (1410714908.086176) can0 0DF01002#55F0C73F90B73E24 (1410714908.089106) can0 19FA0302#55D3490069006400 (1410714908.092097) can0 19FA0402#609355FD0C0B7F34 (1410714908.095454) can0 19FA0402#6113C74C11FCFFFF (1410714908.098078) can0 19FA0402#62FFF220673007D4 (1410714908.101130) can0 19FA0402#636512FFFFFFFFF2 (1410714908.104090) can0 19FA0402#640E7F16B920C311 (1410714908.107386) can0 19FA0402#65E9FFFFFFF2168B (1410714908.110133) can0 19FA0402#6609AD2D9511F0FF (1410714908.113123) can0 19FA0402#67FFFFF20122247C (1410714908.116084) can0 19FA0402#68D9F513E8FFFFFF (1410714908.119440) can0 19FA0402#69F21B390A95749C (1410714908.122095) can0 19FA0402#6A101F000000F217 (1410714908.125086) can0 19FA0402#6BD106CE8DA21080 (1410714908.128077) can0 19FA0402#6CFFFFFFF2047314 (1410714908.131464) can0 19FA0402#6DAAD21812EAFFFF (1410714908.134089) can0 19FA0402#6EFFF21FE80AB84D (1410714908.137110) can0 19FA0402#6F761167000000F2 (1410714908.140070) can0 19FA0402#701C1704C2C75D0E (1410714908.143580) can0 19FA0402#71E6FFFFFFF213A2 (1410714908.146082) can0 19FA0402#721C2C8080123200 (1410714908.149104) can0 19FA0402#730000F214221513 (1410714908.152094) can0 19FA0402#74B8881110000000 (1410714908.155451) can0 19FA0402#75F2FFFFFFFFFFFF (1410714908.158076) can0 0DF80502#602F55C73F90B73E (1410714908.161097) can0 0DF80502#612480CEECD5FA42 (1410714908.164057) can0 0DF80502#6243058090627EB0 (1410714908.167384) can0 0DF80502#63B9310340DA8F02 (1410714908.170130) can0 0DF80502#640000000013FC0C (1410714908.173121) can0 0DF80502#6549008000AC0D00 (1410714908.176081) can0 0DF80502#660000FFFFFFFFFF (1410714908.179713) can0 09F80102#D6719A16871AB80D (1410714908.210169) can0 09F80202#56FC00000000FFFF (1410714908.235468) can0 09F80102#D6719A16871AB80D (1410714908.335474) can0 09F80102#D6719A16871AB80D (1410714908.435023) can0 09F80102#D6719A16871AB80D (1410714908.460017) can0 09F80202#57FC00000000FFFF (1410714908.534968) can0 09F80102#D6719A16871AB80D (1410714908.634943) can0 09F80102#D6719A16871AB80D (1410714908.710169) can0 09F80202#58FC00000000FFFF (1410714908.734919) can0 09F80102#D6719A16871AB80D (1410714908.834895) can0 09F80102#D6719A16871AB80D (1410714908.928553) can0 0DF50B11#0198030000FFFFFF (1410714908.934870) can0 09F80102#D6719A16871AB80D (1410714908.942591) can0 19F212B0#4009F7000064FF50 (1410714908.943171) can0 19F212B0#411C0A00FFFFFFFF (1410714908.943720) can0 19F214B0#00EC04C5FF6D78F7 (1410714908.959864) can0 09F80202#59FC00000000FFFF (1410714909.034815) can0 09F80102#D6719A16871AB80D (1410714909.098933) can0 0DF01002#5AF0C73FA0DE3E24 (1410714909.102045) can0 19FA0302#5AD3490069006400 (1410714909.104792) can0 19FA0402#80935AFD0C0B7F34 (1410714909.107783) can0 19FA0402#8113C77911FEFFFF (1410714909.110773) can0 19FA0402#82FFF220673007D4 (1410714909.114069) can0 19FA0402#831C1206000000F2 (1410714909.116785) can0 19FA0402#840E7F16B920C111 (1410714909.117854) can0 11F80E01#C01B01985B620EA0 (1410714909.118403) can0 11F80E01#C1C5C20D40B99916 (1410714909.118952) can0 11F80E01#C278A5A400004A40 (1410714909.119532) can0 11F80E01#C300FFFFFF7F00FE (1410714909.120081) can0 19FA0402#85EAFFFFFFF2168B (1410714909.122767) can0 19FA0402#8609AD2DE111F2FF (1410714909.126063) can0 19FA0402#87FFFFF20122247C (1410714909.128840) can0 19FA0402#88D94114E6FFFFFF (1410714909.131770) can0 19FA0402#89F21B390A957497 (1410714909.134760) can0 19FA0402#8A101C000000F217 (1410714909.138056) can0 19FA0402#8BD106CE8D78107C (1410714909.140772) can0 19FA0402#8CFFFFFFF2047314 (1410714909.143824) can0 19FA0402#8DAAD22D12F0FFFF (1410714909.146754) can0 19FA0402#8EFFF21FE80AB84D (1410714909.150202) can0 19FA0402#8F7C1166000000F2 (1410714909.152827) can0 19FA0402#901C1704C2C7630E (1410714909.155787) can0 19FA0402#91DCFFFFFFF213A2 (1410714909.158747) can0 19FA0402#921C2C8098113800 (1410714909.162043) can0 19FA0402#930000F214221513 (1410714909.164790) can0 19FA0402#94B86C1113000000 (1410714909.167811) can0 19FA0402#95F2FFFFFFFFFFFF (1410714909.170771) can0 0DF80502#802F5AC73FA0DE3E (1410714909.174067) can0 0DF80502#812480CEECD5FA42 (1410714909.176783) can0 0DF80502#8243058090627EB0 (1410714909.179774) can0 0DF80502#83B9310340DA8F02 (1410714909.182764) can0 0DF80502#840000000013FC0C (1410714909.186060) can0 0DF80502#8549008000AC0D00 (1410714909.188898) can0 0DF80502#860000FFFFFFFFFF (1410714909.191767) can0 09F80102#D6719A16871AB80D (1410714909.223841) can0 09F80202#5BFC00000300FFFF (1410714909.226984) can0 1DEFFF01#400AE598B6060404 (1410714909.227564) can0 1DEFFF01#4100000002FFFFFF (1410714909.248865) can0 09F80102#D6719A16871AB80D (1410714909.348872) can0 09F80102#D6719A16871AB80D (1410714909.448878) can0 09F80102#D6719A16871AB80D (1410714909.473719) can0 09F80202#5CFC00000300FFFF (1410714909.548884) can0 09F80102#D6719A16871AB80D (1410714909.648890) can0 09F80102#D6719A16871AB80D (1410714909.723658) can0 09F80202#5DFC00000300FFFF (1410714909.748896) can0 09F80102#D6719A16871AB80D (1410714909.848902) can0 09F80102#D6719A16871AB80D (1410714909.929896) can0 0DF50B11#0198030000FFFFFF (1410714909.949000) can0 09F80102#D6719A16871AB80D (1410714909.973566) can0 09F80202#5EFC00000300FFFF (1410714910.048884) can0 09F80102#D6719A16871AB80D (1410714910.109003) can0 0DF01002#5FF0C73FB0053F24 (1410714910.111475) can0 19FA0302#5FD3490069006400 (1410714910.114466) can0 19FA0402#A0935FFD0C0B7F34 (1410714910.117457) can0 19FA0402#A113C7DC11FCFFFF (1410714910.120722) can0 19FA0402#A2FFF220673064D5 (1410714910.123591) can0 19FA0402#A3A91200000000F2 (1410714910.126459) can0 19FA0402#A40E7F16B920C611 (1410714910.129450) can0 19FA0402#A5E8FFFFFFF2168B (1410714910.132777) can0 19FA0402#A609AD2DCE11F4FF (1410714910.135493) can0 19FA0402#A7FFFFF20122247C (1410714910.138453) can0 19FA0402#A8D98B13DEFFFFFF (1410714910.141444) can0 19FA0402#A9F21B390A9574A8 (1410714910.144801) can0 19FA0402#AA101A000000F217 (1410714910.147456) can0 19FA0402#ABD106CE8DC00F81 (1410714910.150446) can0 19FA0402#ACFFFFFFF2047314 (1410714910.153437) can0 19FA0402#ADAAD2F911F1FFFF (1410714910.156794) can0 19FA0402#AEFFF21FE80AB84D (1410714910.159479) can0 19FA0402#AF9B1161000000F2 (1410714910.162470) can0 19FA0402#B01C1704C2C7750E (1410714910.165461) can0 19FA0402#B1E2FFFFFFF213A2 (1410714910.168848) can0 19FA0402#B21C2C800B123300 (1410714910.171473) can0 19FA0402#B30000F214221513 (1410714910.174464) can0 19FA0402#B4B8C8101A000000 (1410714910.177454) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714910.180750) can0 0DF80502#A02F5FC73FB0053F (1410714910.183619) can0 0DF80502#A12480CEECD5FA42 (1410714910.186457) can0 0DF80502#A243058090627EB0 (1410714910.189417) can0 0DF80502#A3B9310340DA8F02 (1410714910.192835) can0 0DF80502#A40000000013FC0C (1410714910.195490) can0 0DF80502#A549008000AC0D00 (1410714910.198481) can0 0DF80502#A60000FFFFFFFFFF (1410714910.201411) can0 09F80102#D6719A16871AB80D (1410714910.232844) can0 09F80202#60FC00000300FFFF (1410714910.257441) can0 09F80102#D6719A16871AB80D (1410714910.357417) can0 09F80102#D6719A16871AB80D (1410714910.442591) can0 19F212B0#60090B000064FF50 (1410714910.443171) can0 19F212B0#611C0900FFFFFFFF (1410714910.443720) can0 19F214B0#00E504C5FF6D780B (1410714910.457362) can0 09F80102#D6719A16871AB80D (1410714910.482386) can0 09F80202#61FC00000300FFFF (1410714910.557337) can0 09F80102#D6719A16871AB80D (1410714910.657313) can0 09F80102#D6719A16871AB80D (1410714910.732325) can0 09F80202#62FC00000300FFFF (1410714910.757288) can0 09F80102#D6719A16871AB80D (1410714910.857233) can0 09F80102#D6719A16871AB80D (1410714910.931269) can0 0DF50B11#0198030000FFFFFF (1410714910.957209) can0 09F80102#D6719A16871AB80D (1410714910.982233) can0 09F80202#63FC00000300FFFF (1410714911.057185) can0 09F80102#D6719A16871AB80D (1410714911.075495) can0 0DF01002#64F0C73FC02C3F24 (1410714911.078150) can0 19FA0302#64D3490069006400 (1410714911.081141) can0 19FA0402#C09364FD0C0B7F34 (1410714911.084162) can0 19FA0402#C113C79A11F6FFFF (1410714911.087427) can0 19FA0402#C2FFF220673064D5 (1410714911.090174) can0 19FA0402#C3F912FCFFFFFFF2 (1410714912.637720) can0 09F80102#D6719A16871AB80D (1410714912.712916) can0 09F80202#6CFC00000200FFFF (1410714912.737666) can0 09F80102#D6719A16871AB80D (1410714912.837641) can0 09F80102#D6719A16871AB80D (1410714912.934168) can0 0DF50B11#0195030000FFFFFF (1410714912.937617) can0 09F80102#D6719A16871AB80D (1410714912.962611) can0 09F80202#6DFC00000200FFFF (1410714913.037562) can0 09F80102#D6719A16871AB80D (1410714913.097529) can0 0DF01002#6EF0C73FE07A3F24 (1410714913.100764) can0 19FA0302#6ED3490069006400 (1410714913.103571) can0 19FA0402#00936EFD0C0B7F34 (1410714913.106501) can0 19FA0402#0113C70B12F3FFFF (1410714913.109522) can0 19FA0402#02FFF220673064D5 (1410714913.112849) can0 19FA0402#031013F0FFFFFFF2 (1410714913.115504) can0 19FA0402#040E7F16B9208C11 (1410714913.118525) can0 19FA0402#05ECFFFFFFF2168B (1410714913.121516) can0 19FA0402#0609AD2DA0110400 (1410714913.124842) can0 19FA0402#070000F201D0247C (1410714913.127497) can0 19FA0402#08D9D013D5FFFFFF (1410714913.130488) can0 19FA0402#09F21B390A957467 (1410714913.133509) can0 19FA0402#0A1021000000F217 (1410714913.136896) can0 19FA0402#0BD106CE8D37107D (1410714913.139582) can0 19FA0402#0CFFFFFFF2047314 (1410714913.142512) can0 19FA0402#0DAAD22812F5FFFF (1410714913.145502) can0 19FA0402#0EFFF21FE80AB84D (1410714913.149042) can0 19FA0402#0FC81152000000F2 (1410714913.151484) can0 19FA0402#101C1704C2C7F00D (1410714913.154505) can0 19FA0402#11F6FFFFFFF213A2 (1410714913.157496) can0 19FA0402#121C2C80A1122A00 (1410714913.160761) can0 19FA0402#130000F214221513 (1410714913.163569) can0 19FA0402#14B8FE1028000000 (1410714913.166529) can0 19FA0402#15F2FFFFFFFFFFFF (1410714913.169520) can0 0DF80502#002F6EC73FE07A3F (1410714913.172846) can0 0DF80502#012480CEECD5FA42 (1410714913.175501) can0 0DF80502#0243058090627EB0 (1410714913.178492) can0 0DF80502#03B9310340DA8F02 (1410714913.181513) can0 0DF80502#040000000013FC0C (1410714913.184870) can0 0DF80502#0549008000AC0D00 (1410714913.187525) can0 0DF80502#060000FFFFFFFFFF (1410714913.190485) can0 09F80102#D6719A16871AB80D (1410714913.221552) can0 09F80202#6FFC00000000FFFF (1410714913.246516) can0 09F80102#D6719A16871AB80D (1410714913.346491) can0 09F80102#D6719A16871AB80D (1410714913.442652) can0 19F212B0#A00929000064FF50 (1410714913.443232) can0 19F212B0#A11C0900FFFFFFFF (1410714913.443781) can0 19F214B0#00EC04C5FF667829 (1410714913.446467) can0 09F80102#D6719A16871AB80D (1410714913.471583) can0 09F80202#70FC00000000FFFF (1410714913.546442) can0 09F80102#D6719A16871AB80D (1410714913.646387) can0 09F80102#D6719A16871AB80D (1410714913.721369) can0 09F80202#71FC00000000FFFF (1410714913.746333) can0 09F80102#D6719A16871AB80D (1410714913.846308) can0 09F80102#D6719A16871AB80D (1410714913.935694) can0 0DF50B11#0195030000FFFFFF (1410714913.946284) can0 09F80102#D6719A16871AB80D (1410714913.971552) can0 09F80202#72FC00000000FFFF (1410714914.046229) can0 09F80102#D6719A16871AB80D (1410714914.055811) can0 0DF01002#73F0C73FF0A13F24 (1410714914.058222) can0 19FA0302#73D3490069006400 (1410714914.061213) can0 19FA0402#209373FD0C0B7F34 (1410714914.064204) can0 19FA0402#2113C77211F3FFFF (1410714914.067438) can0 19FA0402#22FFF220673064D5 (1410714914.070216) can0 19FA0402#23F312EBFFFFFFF2 (1410714914.073206) can0 19FA0402#240E7F16B920A511 (1410714914.076228) can0 19FA0402#25F6FFFFFFF2168B (1410714914.079493) can0 19FA0402#2609AD2D82110300 (1410714914.082209) can0 19FA0402#270000F201D0247C (1410714914.085200) can0 19FA0402#28D9D413DAFFFFFF (1410714914.088190) can0 19FA0402#29F21B390A957435 (1410714914.091578) can0 19FA0402#2A102B000000F217 (1410714914.094202) can0 19FA0402#2BD106CE8D30107E (1410714914.097193) can0 19FA0402#2CFFFFFFF2047314 (1410714914.100184) can0 19FA0402#2DAAD2DD11F9FFFF (1410714914.103693) can0 19FA0402#2EFFF21FE80AB84D (1410714914.106196) can0 19FA0402#2FFA115C000000F2 (1410714914.109187) can0 19FA0402#301C1704C2C7D00D (1410714914.112208) can0 19FA0402#31F7FFFFFFF213A2 (1410714914.115473) can0 19FA0402#321C2C800A122B00 (1410714914.118189) can0 19FA0402#330000F214221513 (1410714914.121180) can0 19FA0402#34B87B1124000000 (1410714914.124232) can0 19FA0402#35F2FFFFFFFFFFFF (1410714914.127467) can0 0DF80502#202F73C73FF0A13F (1410714914.130183) can0 0DF80502#212480CEECD5FA42 (1410714914.133173) can0 0DF80502#2243058090627EB0 (1410714914.136164) can0 0DF80502#23B9310340DA8F02 (1410714914.139552) can0 0DF80502#240000000013FC0C (1410714914.142207) can0 0DF80502#2549008000AC0D00 (1410714914.145197) can0 0DF80502#260000FFFFFFFFFF (1410714914.148157) can0 09F80102#D6719A16871AB80D (1410714914.180231) can0 09F80202#74FC00000200FFFF (1410714914.205195) can0 09F80102#D6719A16871AB80D (1410714914.226679) can0 1DEFFF01#600AE598B6060404 (1410714914.227259) can0 1DEFFF01#6100000002FFFFFF (1410714914.305201) can0 09F80102#D6719A16871AB80D (1410714914.405146) can0 09F80102#D6719A16871AB80D (1410714914.430323) can0 09F80202#75FC00000200FFFF (1410714914.505122) can0 09F80102#D6719A16871AB80D (1410714914.531153) can0 11F80E01#001B014875520E90 (1410714914.531702) can0 11F80E01#01CD9F0D40BBA616 (1410714914.532252) can0 11F80E01#0284D9CBE301D460 (1410714914.532832) can0 11F80E01#030C65C6000000FE (1410714914.605067) can0 09F80102#D6719A16871AB80D (1410714914.680079) can0 09F80202#76FC00000200FFFF (1410714914.705042) can0 09F80102#D6719A16871AB80D (1410714914.804987) can0 09F80102#D6719A16871AB80D (1410714914.904963) can0 09F80102#D6719A16871AB80D (1410714914.930231) can0 09F80202#77FC00000200FFFF (1410714914.937251) can0 0DF50B11#0195030000FFFFFF (1410714914.942683) can0 19F212B0#C00938000064FF50 (1410714914.943232) can0 19F212B0#C11C0900FFFFFFFF (1410714914.943781) can0 19F214B0#00EC04C5FF6D7838 (1410714915.004969) can0 09F80102#D6719A16871AB80D (1410714915.064356) can0 0DF01002#78F0C73F00C93F24 (1410714915.066889) can0 19FA0302#78D3490069006400 (1410714915.070277) can0 19FA0402#409378FD0C0B7F34 (1410714915.072932) can0 19FA0402#4113C76411FEFFFF (1410714915.075892) can0 19FA0402#42FFF220673064D5 (1410714915.078883) can0 19FA0402#435B12EFFFFFFFF2 (1410714915.082178) can0 19FA0402#440E7F16B920DB11 (1410714915.084895) can0 19FA0402#45F6FFFFFFF2168B (1410714915.087885) can0 19FA0402#4609AD2DA711FFFF (1410714915.090907) can0 19FA0402#47FFFFF201D0247C (1410714915.094141) can0 19FA0402#48D9CB13E2FFFFFF (1410714915.096857) can0 19FA0402#49F21B390A95745A (1410714915.099909) can0 19FA0402#4A101E000000F217 (1410714915.102869) can0 19FA0402#4BD106CE8D4B107B (1410714915.106135) can0 19FA0402#4CFFFFFFF2047314 (1410714915.108881) can0 19FA0402#4DAAD2DE11F5FFFF (1410714915.111872) can0 19FA0402#4EFFF21FE80AB84D (1410714915.114893) can0 19FA0402#4FF01162000000F2 (1410714915.118128) can0 19FA0402#501C1704C2C7B90D (1410714915.120875) can0 19FA0402#51F6FFFFFFF213A2 (1410714915.123865) can0 19FA0402#521C2C8011122600 (1410714915.126856) can0 19FA0402#530000F214221513 (1410714915.130183) can0 19FA0402#54B8AF1023000000 (1410714915.132899) can0 19FA0402#55F2FFFFFFFFFFFF (1410714915.135859) can0 0DF80502#402F78C73F00C93F (1410714915.138850) can0 0DF80502#412480CEECD5FA42 (1410714915.142207) can0 0DF80502#4243058090627EB0 (1410714915.144862) can0 0DF80502#43B9310340DA8F02 (1410714915.147883) can0 0DF80502#440000000013FC0C (1410714915.150874) can0 0DF80502#4549008000AC0D00 (1410714915.154169) can0 0DF80502#460000FFFFFFFFFF (1410714915.156855) can0 09F80102#D6719A16871AB80D (1410714915.157954) can0 11F80E01#201B0188F64A0E20 (1410714915.158503) can0 11F80E01#21FCB80DA0009A16 (1410714915.159052) can0 11F80E01#228CFFFF00001EC0 (1410714915.159632) can0 11F80E01#2300154F000000FE (1410714915.188898) can0 09F80202#79FC00000200FFFF (1410714915.214167) can0 09F80102#D6719A16871AB80D (1410714915.314173) can0 09F80102#D6719A16871AB80D (1410714915.414149) can0 09F80102#D6719A16871AB80D (1410714915.438837) can0 09F80202#7AFC00000200FFFF (1410714915.514094) can0 09F80102#D6719A16871AB80D (1410714915.613734) can0 09F80102#D6719A16871AB80D (1410714915.688898) can0 09F80202#7BFC00000200FFFF (1410714915.713740) can0 09F80102#D6719A16871AB80D (1410714915.813685) can0 09F80102#D6719A16871AB80D (1410714915.913660) can0 09F80102#D6719A16871AB80D (1410714915.938654) can0 09F80202#7CFC00000200FFFF (1410714916.013605) can0 09F80102#D6719A16871AB80D (1410714916.038844) can0 0DF50B11#0195030000FFFFFF (1410714916.050928) can0 11F80E01#401B0132D74A1030 (1410714916.051478) can0 11F80E01#4188E30D60429116 (1410714916.052027) can0 11F80E01#429202BE86016E05 (1410714916.052576) can0 11F80E01#4308E5BE000000FE (1410714916.074427) can0 0DF01002#7DF0C73F10F03F24 (1410714916.076838) can0 19FA0302#7DD3490069006400 (1410714916.079584) can0 19FA0402#60937DFD0C0B7F34 (1410714916.082575) can0 19FA0402#6113C7D111FDFFFF (1410714916.085566) can0 19FA0402#62FFF220673064D5 (1410714916.088862) can0 19FA0402#63DC12F4FFFFFFF2 (1410714916.091547) can0 19FA0402#640E7F16B920C711 (1410714916.094569) can0 19FA0402#65F1FFFFFFF2168B (1410714916.097559) can0 19FA0402#6609AD2D1211FFFF (1410714916.100825) can0 19FA0402#67FFFFF201D0247C (1410714916.103602) can0 19FA0402#68D91714E1FFFFFF (1410714916.106562) can0 19FA0402#69F21B390A957423 (1410714916.109583) can0 19FA0402#6A1020000000F217 (1410714916.112849) can0 19FA0402#6BD106CE8D681074 (1410714916.115565) can0 19FA0402#6CFFFFFFF2047314 (1410714916.118555) can0 19FA0402#6DAAD20812F3FFFF (1410714916.121546) can0 19FA0402#6EFFF21FE80AB84D (1410714916.124873) can0 19FA0402#6FC41167000000F2 (1410714916.127558) can0 19FA0402#701C1704C2C7A70D (1410714916.130549) can0 19FA0402#71F9FFFFFFF213A2 (1410714916.133540) can0 19FA0402#721C2C8065122500 (1410714916.136866) can0 19FA0402#730000F214221513 (1410714916.139582) can0 19FA0402#74B8EF1020000000 (1410714916.142573) can0 19FA0402#75F2FFFFFFFFFFFF (1410714916.145563) can0 0DF80502#602F7DC73F10F03F (1410714916.148859) can0 0DF80502#612480CEECD5FA42 (1410714916.151545) can0 0DF80502#6243058090627EB0 (1410714916.154536) can0 0DF80502#63B9310340DA8F02 (1410714916.157557) can0 0DF80502#640000000013FC0C (1410714916.160822) can0 0DF80502#6549008000AC0D00 (1410714916.163599) can0 0DF80502#660000FFFFFFFFFF (1410714916.166529) can0 09F80102#D6719A16871AB80D (1410714916.198603) can0 09F80202#7EFC00000100FFFF (1410714916.223627) can0 09F80102#D6719A16871AB80D (1410714916.323603) can0 09F80102#D6719A16871AB80D (1410714916.423640) can0 09F80102#D6719A16871AB80D (1410714916.442683) can0 19F212B0#E00947000064FF50 (1410714916.443262) can0 19F212B0#E11C0800FFFFFFFF (1410714916.443812) can0 19F214B0#00EC04C5FF6D7847 (1410714916.448908) can0 09F80202#7FFC00000100FFFF (1410714916.523615) can0 09F80102#D6719A16871AB80D (1410714916.623621) can0 09F80102#D6719A16871AB80D (1410714916.698450) can0 09F80202#80FC00000100FFFF (1410714916.723597) can0 09F80102#D6719A16871AB80D (1410714916.823756) can0 09F80102#D6719A16871AB80D (1410714916.851130) can0 11F80E01#601B010869210E70 (1410714916.851679) can0 11F80E01#6160110E00FF6E16 (1410714916.852229) can0 11F80E01#62951B6B3A0239C0 (1410714916.852778) can0 11F80E01#6300FFFFFF7F00FE (1410714916.923609) can0 09F80102#D6719A16871AB80D (1410714916.948359) can0 09F80202#81FC00000100FFFF (1410714917.023615) can0 09F80102#D6719A16871AB80D (1410714917.040400) can0 0DF50B11#0192030000FFFFFF (1410714917.083094) can0 0DF01002#82F0C73F20174024 (1410714917.085261) can0 19FA0302#82D3490069006400 (1410714917.088251) can0 19FA0402#809382FD0C0B7F34 (1410714917.091547) can0 19FA0402#8113C70512F9FFFF (1410714917.094263) can0 19FA0402#82FFF220673064D5 (1410714917.097254) can0 19FA0402#838C13EDFFFFFFF2 (1410714917.100245) can0 19FA0402#840E7F16B920C211 (1410714917.103602) can0 19FA0402#85EBFFFFFFF2168B (1410714917.106257) can0 19FA0402#8609AD2D2B110100 (1410714917.109248) can0 19FA0402#870000F201D0247C (1410714917.112269) can0 19FA0402#88D9D613E1FFFFFF (1410714917.115504) can0 19FA0402#89F21B390A9574EB (1410714917.118250) can0 19FA0402#8A0F2A000000F217 (1410714917.121241) can0 19FA0402#8BD106CE8D75106E (1410714917.124262) can0 19FA0402#8CFFFFFFF2047314 (1410714917.127497) can0 19FA0402#8DAAD21A12F0FFFF (1410714917.130244) can0 19FA0402#8EFFF21FE80AB84D (1410714917.133265) can0 19FA0402#8F8E116A000000F2 (1410714917.136225) can0 19FA0402#901C1704C2C7670D (1410714917.139613) can0 19FA0402#9102000000F213A2 (1410714917.142268) can0 19FA0402#921C2C80F2112900 (1410714917.145228) can0 19FA0402#930000F214221513 (1410714917.148219) can0 19FA0402#94B862111D000000 (1410714917.151545) can0 19FA0402#95F2FFFFFFFFFFFF (1410714917.154261) can0 0DF80502#802F82C73F201740 (1410714917.157221) can0 0DF80502#812480CEECD5FA42 (1410714917.160242) can0 0DF80502#8243058090627EB0 (1410714917.163569) can0 0DF80502#83B9310340DA8F02 (1410714917.166254) can0 0DF80502#840000000013FC0C (1410714917.169245) can0 0DF80502#8549008000AC0D00 (1410714917.172236) can0 0DF80502#860000FFFFFFFFFF (1410714917.175532) can0 09F80102#D6719A16871AB80D (1410714917.207575) can0 09F80202#83FC00000300FFFF (1410714917.232233) can0 09F80102#D6719A16871AB80D (1410714917.332209) can0 09F80102#D6719A16871AB80D (1410714917.432185) can0 09F80102#D6719A16871AB80D (1410714917.457209) can0 09F80202#84FC00000300FFFF (1410714917.531092) can0 19FB0201#004B05104E610E4C (1410714917.531641) can0 19FB0201#01DD8B0053564253 (1410714917.532191) can0 09F80102#D6719A16871AB80D (1410714917.532740) can0 19FB0201#0239202041492047 (1410714917.533289) can0 19FB0201#0349414E4E495320 (1410714917.533869) can0 19FB0201#0420202020202020 (1410714917.534449) can0 19FB0201#052020502805F000 (1410714917.534998) can0 19FB0201#0678003804C33F00 (1410714917.535548) can0 19FB0201#077B9A1762024147 (1410714917.536097) can0 19FB0201#082054484F44524F (1410714917.536677) can0 19FB0201#0949202020202020 (1410714917.537226) can0 19FB0201#0A2020202004E0FF (1410714917.632105) can0 09F80102#D6719A16871AB80D (1410714917.707117) can0 09F80202#85FC00000300FFFF (1410714917.732081) can0 09F80102#D6719A16871AB80D (1410714917.832056) can0 09F80102#D6719A16871AB80D (1410714917.932032) can0 09F80102#D6719A16871AB80D (1410714917.942683) can0 19F212B0#000956000064FF50 (1410714917.943232) can0 19F212B0#011C0900FFFFFFFF (1410714917.943781) can0 19F214B0#00EC04C5FF6D7856 (1410714917.957056) can0 09F80202#86FC00000300FFFF (1410714918.031977) can0 09F80102#D6719A16871AB80D (1410714918.042048) can0 0DF50B11#0192030000FFFFFF (1410714918.091547) can0 0DF01002#87F0C73F303E4024 (1410714918.094202) can0 19FA0302#87D3490069006400 (1410714918.096918) can0 19FA0402#A09387FD0C0B7F34 (1410714918.099940) can0 19FA0402#A113C74B12EFFFFF (1410714918.102930) can0 19FA0402#A2FFF220673064D5 (1410714918.106196) can0 19FA0402#A33A13EFFFFFFFF2 (1410714918.108942) can0 19FA0402#A40E7F16B920A111 (1410714918.111933) can0 19FA0402#A5F4FFFFFFF2168B (1410714918.114924) can0 19FA0402#A609AD2D76110400 (1410714918.118189) can0 19FA0402#A70000F201D0247C (1410714918.120936) can0 19FA0402#A8D91113EAFFFFFF (1410714918.123927) can0 19FA0402#A9F21B390A957437 (1410714918.126948) can0 19FA0402#AA1022000000F217 (1410714918.130244) can0 19FA0402#ABD106CE8D0D1073 (1410714918.132929) can0 19FA0402#ACFFFFFFF2047314 (1410714918.135920) can0 19FA0402#ADAAD22012F0FFFF (1410714918.138911) can0 19FA0402#AEFFF21FE80AB84D (1410714918.142237) can0 19FA0402#AF921165000000F2 (1410714918.144923) can0 19FA0402#B01C1704C2C74D0D (1410714918.147913) can0 19FA0402#B11C000000F213A2 (1410714918.150904) can0 19FA0402#B21C2C803F122A00 (1410714918.154169) can0 19FA0402#B30000F214221513 (1410714918.156916) can0 19FA0402#B4B8391118000000 (1410714918.159937) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714918.162928) can0 0DF80502#A02F87C73F303E40 (1410714918.166163) can0 0DF80502#A12480CEECD5FA42 (1410714918.168909) can0 0DF80502#A243058090627EB0 (1410714918.171900) can0 0DF80502#A3B9310340DA8F02 (1410714918.174921) can0 0DF80502#A40000000013FC0C (1410714918.178187) can0 0DF80502#A549008000AC0D00 (1410714918.180933) can0 0DF80502#A60000FFFFFFFFFF (1410714918.183894) can0 09F80102#D6719A16871AB80D (1410714918.215968) can0 09F80202#88FC00000200FFFF (1410714918.240931) can0 09F80102#D6719A16871AB80D (1410714918.340876) can0 09F80102#D6719A16871AB80D (1410714918.440852) can0 09F80102#D6719A16871AB80D (1410714918.466212) can0 09F80202#89FC00000200FFFF (1410714918.540858) can0 09F80102#D6719A16871AB80D (1410714918.640833) can0 09F80102#D6719A16871AB80D (1410714918.715784) can0 09F80202#8AFC00000200FFFF (1410714918.740839) can0 09F80102#D6719A16871AB80D (1410714918.840845) can0 09F80102#D6719A16871AB80D (1410714918.947047) can0 09F80102#D6719A16871AB80D (1410714918.965723) can0 09F80202#8BFC00000200FFFF (1410714919.040827) can0 09F80102#D6719A16871AB80D (1410714919.043513) can0 0DF50B11#0192030000FFFFFF (1410714919.106409) can0 0DF01002#8CF0C73F40654024 (1410714919.108881) can0 19FA0302#8CD3490069006400 (1410714919.111628) can0 19FA0402#C0938CFD0C0B7F34 (1410714919.114619) can0 19FA0402#C113C7A811ECFFFF (1410714919.117609) can0 19FA0402#C2FFF220673064D5 (1410714919.120814) can0 19FA0402#C3FE12F8FFFFFFF2 (1410714919.123652) can0 19FA0402#C40E7F16B9207C11 (1410714919.126612) can0 19FA0402#C5F3FFFFFFF2168B (1410714919.129603) can0 19FA0402#C609AD2D2E111100 (1410714919.132868) can0 19FA0402#C70000F201D0247C (1410714919.135615) can0 19FA0402#C8D94E13EEFFFFFF (1410714919.138605) can0 19FA0402#C9F21B390A95747C (1410714919.141596) can0 19FA0402#CA1027000000F217 (1410714919.144801) can0 19FA0402#CBD106CE8D29106E (1410714919.147608) can0 19FA0402#CCFFFFFFF2047314 (1410714919.150599) can0 19FA0402#CDAAD21312F5FFFF (1410714919.153590) can0 19FA0402#CEFFF21FE80AB84D (1410714919.156886) can0 19FA0402#CFA51159000000F2 (1410714919.159602) can0 19FA0402#D01C1704C2C7EA0C (1410714919.162592) can0 19FA0402#D11E000000F213A2 (1410714919.165583) can0 19FA0402#D21C2C8080122B00 (1410714919.168879) can0 19FA0402#D30000F214221513 (1410714919.171595) can0 19FA0402#D4B829111B000000 (1410714919.174616) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714919.177607) can0 0DF80502#C02F8CC73F406540 (1410714919.180811) can0 0DF80502#C12480CEECD5FA42 (1410714919.183710) can0 0DF80502#C243058090627EB0 (1410714919.186579) can0 0DF80502#C3B9310340DA8F02 (1410714919.189600) can0 0DF80502#C40000000013FC0C (1410714919.192896) can0 0DF80502#C549008000AC0D00 (1410714919.195612) can0 0DF80502#C60000FFFFFFFFFF (1410714919.198573) can0 09F80102#D6719A16871AB80D (1410714919.226374) can0 1DEFFF01#800AE598B6060404 (1410714919.226954) can0 1DEFFF01#8100000002FFFFFF (1410714919.230646) can0 09F80202#8DFC00000300FFFF (1410714919.255579) can0 09F80102#D6719A16871AB80D (1410714919.355585) can0 09F80102#D6719A16871AB80D (1410714919.442957) can0 19F212B0#200965000064FF50 (1410714919.443537) can0 19F212B0#211C0900FFFFFFFF (1410714919.444086) can0 19F214B0#00EB04C5FF6A7865 (1410714919.455622) can0 09F80102#D6719A16871AB80D (1410714919.480860) can0 09F80202#8EFC00000300FFFF (1410714919.517847) can0 11F80E01#801B0108975C0EF0 (1410714919.518397) can0 11F80E01#819DC50DE0F59816 (1410714919.518946) can0 11F80E01#829D5B5B0000F308 (1410714919.519526) can0 11F80E01#830136AF000000FE (1410714919.555598) can0 09F80102#D6719A16871AB80D (1410714919.655604) can0 09F80102#D6719A16871AB80D (1410714919.704127) can0 11F80E01#A01B01985B620E10 (1410714919.704676) can0 11F80E01#A1C6C20D20B99916 (1410714919.705225) can0 11F80E01#A2A4A5A400008B08 (1410714919.705775) can0 11F80E01#A309FFFFFF7F00FE (1410714919.730494) can0 09F80202#8FFC00000300FFFF (1410714919.755579) can0 09F80102#D6719A16871AB80D (1410714919.855646) can0 09F80102#D6719A16871AB80D (1410714919.955592) can0 09F80102#D6719A16871AB80D (1410714919.980402) can0 09F80202#90FC00000300FFFF (1410714920.045222) can0 0DF50B11#0195030000FFFFFF (1410714920.055598) can0 09F80102#D6719A16871AB80D (1410714920.109583) can0 0DF01002#91F0C73F508C4024 (1410714920.112299) can0 19FA0302#91D3490069006400 (1410714920.115565) can0 19FA0402#E09391FD0C0B7F34 (1410714920.118281) can0 19FA0402#E113C77911EBFFFF (1410714920.121302) can0 19FA0402#E2FFF220673064D5 (1410714920.124293) can0 19FA0402#E3EB12F7FFFFFFF2 (1410714920.127558) can0 19FA0402#E40E7F16B9206611 (1410714920.130305) can0 19FA0402#E5EAFFFFFFF2168B (1410714920.133295) can0 19FA0402#E609AD2DE3101400 (1410714920.136286) can0 19FA0402#E70000F201D0247C (1410714920.139582) can0 19FA0402#E8D97A13E9FFFFFF (1410714920.142268) can0 19FA0402#E9F21B390A957472 (1410714920.145289) can0 19FA0402#EA102F000000F217 (1410714920.148280) can0 19FA0402#EBD106CE8DAF1062 (1410714920.151545) can0 19FA0402#ECFFFFFFF2047314 (1410714920.154292) can0 19FA0402#EDAAD2E311000000 (1410714920.157282) can0 19FA0402#EE00F21FE80AB84D (1410714920.160303) can0 19FA0402#EFA21156000000F2 (1410714920.163660) can0 19FA0402#F01C1704C2C7AD0C (1410714920.166285) can0 19FA0402#F110000000F213A2 (1410714920.169276) can0 19FA0402#F21C2C8070122E00 (1410714920.172266) can0 19FA0402#F30000F214221513 (1410714920.175654) can0 19FA0402#F4B813111F000000 (1410714920.178309) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714920.181300) can0 0DF80502#E02F91C73F508C40 (1410714920.184260) can0 0DF80502#E12480CEECD5FA42 (1410714920.187617) can0 0DF80502#E243058090627EB0 (1410714920.190302) can0 0DF80502#E3B9310340DA8F02 (1410714920.193293) can0 0DF80502#E40000000013FC0C (1410714920.196284) can0 0DF80502#E549008000AC0D00 (1410714920.199610) can0 0DF80502#E60000FFFFFFFFFF (1410714920.202265) can0 09F80102#D6719A16871AB80D (1410714920.234309) can0 09F80202#92FC00000300FFFF (1410714920.259608) can0 09F80102#D6719A16871AB80D (1410714920.359583) can0 09F80102#D6719A16871AB80D (1410714920.459589) can0 09F80102#D6719A16871AB80D (1410714920.484248) can0 09F80202#93FC00000300FFFF (1410714920.559565) can0 09F80102#D6719A16871AB80D (1410714920.659602) can0 09F80102#D6719A16871AB80D (1410714920.734248) can0 09F80202#94FC00000300FFFF (1410714920.759119) can0 09F80102#D6719A16871AB80D (1410714920.859095) can0 09F80102#D6719A16871AB80D (1410714920.942744) can0 19F212B0#400974000064FF20 (1410714920.943323) can0 19F212B0#411CA104FFFFFFFF (1410714920.943873) can0 19F214B0#00E604C0FF5A7874 (1410714920.959071) can0 09F80102#D6719A16871AB80D (1410714920.984095) can0 09F80202#95FC00000300FFFF (1410714921.047114) can0 0DF50B11#0195030000FFFFFF (1410714921.059046) can0 09F80102#D6719A16871AB80D (1410714921.070185) can0 0DF01002#96F0C73F60B34024 (1410714921.072993) can0 19FA0302#96D3490069006400 (1410714921.076014) can0 19FA0402#009396FD0C0B7F34 (1410714921.079005) can0 19FA0402#0113C79811F2FFFF (1410714921.082240) can0 19FA0402#02FFF220673064D5 (1410714921.085017) can0 19FA0402#037012FEFFFFFFF2 (1410714921.087977) can0 19FA0402#040E7F16B9206211 (1410714921.090998) can0 19FA0402#05F0FFFFFFF2168B (1410714921.094202) can0 19FA0402#0609AD2DCF101800 (1410714921.097010) can0 19FA0402#070000F201D0247C (1410714921.100001) can0 19FA0402#08D99913E5FFFFFF (1410714921.102961) can0 19FA0402#09F21B390A95746E (1410714921.106226) can0 19FA0402#0A102C000000F217 (1410714921.108973) can0 19FA0402#0BD106CE8DBF1060 (1410714921.111994) can0 19FA0402#0CFFFFFFF2047314 (1410714921.114985) can0 19FA0402#0DAAD22912F7FFFF (1410714921.118189) can0 19FA0402#0EFFF21FE80AB84D (1410714921.120997) can0 19FA0402#0F9C1156000000F2 (1410714921.123957) can0 19FA0402#101C1704C2C7990C (1410714921.127009) can0 19FA0402#11F6FFFFFFF213A2 (1410714921.130213) can0 19FA0402#121C2C8033122B00 (1410714921.132960) can0 19FA0402#130000F214221513 (1410714921.135981) can0 19FA0402#14B800112A000000 (1410714921.139002) can0 19FA0402#15F2FFFFFFFFFFFF (1410714921.142329) can0 0DF80502#002F96C73F60B340 (1410714921.144953) can0 0DF80502#012480CEECD5FA42 (1410714921.147974) can0 0DF80502#0243058090627EB0 (1410714921.150965) can0 0DF80502#03B9310340DA8F02 (1410714921.154230) can0 0DF80502#040000000013FC0C (1410714921.156977) can0 0DF80502#0549008000AC0D00 (1410714921.159998) can0 0DF80502#060000FFFFFFFFFF (1410714921.162959) can0 09F80102#D6719A16871AB80D (1410714921.194239) can0 09F80202#97FC00000200FFFF (1410714921.218958) can0 09F80102#D6719A16871AB80D (1410714921.318934) can0 09F80102#D6719A16871AB80D (1410714921.418909) can0 09F80102#D6719A16871AB80D (1410714921.443964) can0 09F80202#98FC00000200FFFF (1410714921.518885) can0 09F80102#D6719A16871AB80D (1410714921.618861) can0 09F80102#D6719A16871AB80D (1410714921.694178) can0 09F80202#99FC00000200FFFF (1410714921.718836) can0 09F80102#D6719A16871AB80D (1410714921.818781) can0 09F80102#D6719A16871AB80D (1410714921.918757) can0 09F80102#D6719A16871AB80D (1410714921.943964) can0 09F80202#9AFC00000200FFFF (1410714922.018702) can0 09F80102#D6719A16871AB80D (1410714922.048640) can0 0DF50B11#0195030000FFFFFF (1410714922.079890) can0 0DF01002#9BF0C73F70DA4024 (1410714922.082667) can0 19FA0302#9BD3490069006400 (1410714922.085688) can0 19FA0402#20939BFD0C0B7F34 (1410714922.088984) can0 19FA0402#2113C7B711F7FFFF (1410714922.091669) can0 19FA0402#22FFF220673064D5 (1410714922.094691) can0 19FA0402#23D812FFFFFFFFF2 (1410714922.097681) can0 19FA0402#240E7F16B9204211 (1410714922.100886) can0 19FA0402#25FBFFFFFFF2168B (1410714922.103938) can0 19FA0402#2609AD2DDC101100 (1410714922.106684) can0 19FA0402#270000F201D0247C (1410714922.109675) can0 19FA0402#28D9CA13E9FFFFFF (1410714922.113001) can0 19FA0402#29F21B390A95745A (1410714922.115656) can0 19FA0402#2A1025000000F217 (1410714922.118677) can0 19FA0402#2BD106CE8DBE1067 (1410714922.121668) can0 19FA0402#2CFFFFFFF2047314 (1410714922.124873) can0 19FA0402#2DAAD25612E9FFFF (1410714922.127650) can0 19FA0402#2EFFF21FE80AB84D (1410714922.130671) can0 19FA0402#2F6B115E000000F2 (1410714922.133662) can0 19FA0402#301C1704C2C76A0C (1410714922.136927) can0 19FA0402#31E4FFFFFFF213A2 (1410714922.139674) can0 19FA0402#321C2C80F2113700 (1410714922.142664) can0 19FA0402#330000F214221513 (1410714922.145655) can0 19FA0402#34B8E5102F000000 (1410714922.149012) can0 19FA0402#35F2FFFFFFFFFFFF (1410714922.151667) can0 0DF80502#202F9BC73F70DA40 (1410714922.154658) can0 0DF80502#212480CEECD5FA42 (1410714922.157648) can0 0DF80502#2243058090627EB0 (1410714922.160853) can0 0DF80502#23B9310340DA8F02 (1410714922.163721) can0 0DF80502#240000000013FC0C (1410714922.166651) can0 0DF80502#2549008000AC0D00 (1410714922.169672) can0 0DF80502#260000FFFFFFFFFF (1410714922.172907) can0 09F80102#D6719A16871AB80D (1410714922.204920) can0 09F80202#9CFC00000300FFFF (1410714922.229670) can0 09F80102#D6719A16871AB80D (1410714922.251307) can0 19FB0201#204B0518B85D0EE3 (1410714922.251856) can0 19FB0201#216F910053564241 (1410714922.252436) can0 19FB0201#2236202046524553 (1410714922.252985) can0 19FB0201#2320202020202020 (1410714922.253565) can0 19FB0201#2420202020202020 (1410714922.254145) can0 19FB0201#2520205070038C00 (1410714922.254694) can0 19FB0201#2646007602C63F00 (1410714922.255244) can0 19FB0201#2754EA2A12024147 (1410714922.255793) can0 19FB0201#28494F4920544845 (1410714922.256342) can0 19FB0201#294F444F524F4920 (1410714922.256922) can0 19FB0201#2A2020202004E0FF (1410714922.329615) can0 09F80102#D6719A16871AB80D (1410714922.429591) can0 09F80102#D6719A16871AB80D (1410714922.442988) can0 19F212B0#600983000064FF1F (1410714922.443537) can0 19F212B0#611C0A00FFFFFFFF (1410714922.444117) can0 19F214B0#00EB04C2FF677883 (1410714922.454646) can0 09F80202#9DFC00000300FFFF (1410714922.504145) can0 11F80E01#C01B01A929C40CB0 (1410714922.504694) can0 11F80E01#C133B90D40009A16 (1410714922.505244) can0 11F80E01#C2B001DF0000D460 (1410714922.505823) can0 11F80E01#C3047CCA000000FE (1410714922.529566) can0 09F80102#D6719A16871AB80D (1410714922.629542) can0 09F80102#D6719A16871AB80D (1410714922.704859) can0 09F80202#9EFC00000300FFFF (1410714922.729487) can0 09F80102#D6719A16871AB80D (1410714922.829462) can0 09F80102#D6719A16871AB80D (1410714922.929438) can0 09F80102#D6719A16871AB80D (1410714922.954920) can0 09F80202#9FFC00000300FFFF (1410714923.033289) can0 09F80102#D6719A16871AB80D (1410714923.037531) can0 11F80E01#E01B0148AA2C0EC0 (1410714923.038081) can0 11F80E01#E183F40D00C78016 (1410714923.038630) can0 11F80E01#E2A4CDE7030351C0 (1410714923.039210) can0 11F80E01#E300FFFFFF7F00FE (1410714923.050196) can0 0DF50B11#0195030000FFFFFF (1410714923.089686) can0 0DF01002#A0F0C73F80014124 (1410714923.092371) can0 19FA0302#A0D3490069006400 (1410714923.095606) can0 19FA0402#4093A0FD0C0B7F34 (1410714923.098353) can0 19FA0402#4113C7E011F9FFFF (1410714923.101344) can0 19FA0402#42FFF220673064D5 (1410714923.104365) can0 19FA0402#43F81200000000F2 (1410714923.107600) can0 19FA0402#440E7F16B9209211 (1410714923.110346) can0 19FA0402#45F1FFFFFFF2168B (1410714923.113367) can0 19FA0402#4609AD2DE8100C00 (1410714923.116358) can0 19FA0402#470000F201D0247C (1410714923.119563) can0 19FA0402#48D97413F0FFFFFF (1410714923.122340) can0 19FA0402#49F21B390A95746B (1410714923.125361) can0 19FA0402#4A101C000000F217 (1410714923.128321) can0 19FA0402#4BD106CE8DAF106D (1410714923.131617) can0 19FA0402#4CFFFFFFF2047314 (1410714923.134333) can0 19FA0402#4DAAD25C12E7FFFF (1410714923.137354) can0 19FA0402#4EFFF21FE80AB84D (1410714923.140345) can0 19FA0402#4F411166000000F2 (1410714923.143732) can0 19FA0402#501C1704C2C7480C (1410714923.146357) can0 19FA0402#51CEFFFFFFF213A2 (1410714923.149348) can0 19FA0402#521C2C8036123600 (1410714923.152338) can0 19FA0402#530000F214221513 (1410714923.155604) can0 19FA0402#54B81D112C000000 (1410714923.158350) can0 19FA0402#55F2FFFFFFFFFFFF (1410714923.161341) can0 0DF80502#402FA0C73F800141 (1410714923.164332) can0 0DF80502#412480CEECD5FA42 (1410714923.167597) can0 0DF80502#4243058090627EB0 (1410714923.170344) can0 0DF80502#43B9310340DA8F02 (1410714923.171076) can0 11F80E01#001B032401462670 (1410714923.171656) can0 11F80E01#013CC10DA0559716 (1410714923.172205) can0 11F80E01#02AE659600000000 (1410714923.172785) can0 11F80E01#03002BAD0A0001FE (1410714923.173365) can0 0DF80502#440000000013FC0C (1410714923.176325) can0 0DF80502#4549008000AC0D00 (1410714923.179774) can0 0DF80502#460000FFFFFFFFFF (1410714923.182337) can0 09F80102#D6719A16871AB80D (1410714923.214381) can0 09F80202#A1FC00000000FFFF (1410714923.239588) can0 09F80102#D6719A16871AB80D (1410714923.339564) can0 09F80102#D6719A16871AB80D (1410714923.439570) can0 09F80102#D6719A16871AB80D (1410714923.464320) can0 09F80202#A2FC00000000FFFF (1410714923.539545) can0 09F80102#D6719A16871AB80D (1410714923.639521) can0 09F80102#D6719A16871AB80D (1410714923.714289) can0 09F80202#A3FC00000000FFFF (1410714923.717432) can0 11F80E01#201B0188F64A0E50 (1410714923.718012) can0 11F80E01#21FCB80DE0009A16 (1410714923.718592) can0 11F80E01#22B0FFFF0000B386 (1410714923.719141) can0 11F80E01#2308154F000000FE (1410714923.739497) can0 09F80102#D6719A16871AB80D (1410714923.839136) can0 09F80102#D6719A16871AB80D (1410714923.939143) can0 09F80102#D6719A16871AB80D (1410714923.942744) can0 19F212B0#800992000064FF1D (1410714923.943323) can0 19F212B0#811C0A00FFFFFFFF (1410714923.943873) can0 19F214B0#00EC04C5FF6B7892 (1410714923.964136) can0 09F80202#A4FC00000000FFFF (1410714924.039088) can0 09F80102#D6719A16871AB80D (1410714924.051691) can0 0DF50B11#0195030000FFFFFF (1410714924.099757) can0 0DF01002#A5F0C73F90284124 (1410714924.102290) can0 19FA0302#A5D3490069006400 (1410714924.105036) can0 19FA0402#6093A5FD0C0B7F34 (1410714924.108027) can0 19FA0402#6113C7AC11F5FFFF (1410714924.111018) can0 19FA0402#62FFF220673064D5 (1410714924.114252) can0 19FA0402#637013F9FFFFFFF2 (1410714924.117030) can0 19FA0402#640E7F16B9208611 (1410714924.120051) can0 19FA0402#65F4FFFFFFF2168B (1410714924.123011) can0 19FA0402#6609AD2DFE100500 (1410714924.126246) can0 19FA0402#670000F201D0247C (1410714924.129023) can0 19FA0402#68D9C513EAFFFFFF (1410714924.132014) can0 19FA0402#69F21B390A95742A (1410714924.135035) can0 19FA0402#6A101A000000F217 (1410714924.138300) can0 19FA0402#6BD106CE8DC5106E (1410714924.141016) can0 19FA0402#6CFFFFFFF2047314 (1410714924.144007) can0 19FA0402#6DAAD27B12E8FFFF (1410714924.147028) can0 19FA0402#6EFFF21FE80AB84D (1410714924.150263) can0 19FA0402#6F19116F000000F2 (1410714924.153010) can0 19FA0402#701C1704C2C7260C (1410714924.156031) can0 19FA0402#71C1FFFFFFF213A2 (1410714924.159022) can0 19FA0402#721C2C8014123900 (1410714924.162287) can0 19FA0402#730000F214221513 (1410714924.165034) can0 19FA0402#74B8781125000000 (1410714924.168024) can0 19FA0402#75F2FFFFFFFFFFFF (1410714924.171015) can0 0DF80502#602FA5C73F902841 (1410714924.174250) can0 0DF80502#612480CEECD5FA42 (1410714924.177027) can0 0DF80502#6243058090627EB0 (1410714924.180018) can0 0DF80502#63B9310340DA8F02 (1410714924.183039) can0 0DF80502#640000000013FC0C (1410714924.186243) can0 0DF80502#6549008000AC0D00 (1410714924.189143) can0 0DF80502#660000FFFFFFFFFF (1410714924.192011) can0 09F80102#D6719A16871AB80D (1410714924.224055) can0 09F80202#A6FC00000300FFFF (1410714924.225977) can0 1DEFFF01#A00AE598B6060404 (1410714924.226527) can0 1DEFFF01#A100000002FFFFFF (1410714924.249018) can0 09F80102#D6719A16871AB80D (1410714924.349146) can0 09F80102#D6719A16871AB80D (1410714924.449030) can0 09F80102#D6719A16871AB80D (1410714924.474299) can0 09F80202#A7FC00000300FFFF (1410714924.549036) can0 09F80102#D6719A16871AB80D (1410714924.649042) can0 09F80102#D6719A16871AB80D (1410714924.723933) can0 09F80202#A8FC00000300FFFF (1410714924.749049) can0 09F80102#D6719A16871AB80D (1410714924.849024) can0 09F80102#D6719A16871AB80D (1410714924.949030) can0 09F80102#D6719A16871AB80D (1410714924.973811) can0 09F80202#A9FC00000300FFFF (1410714925.052363) can0 09F80102#D6719A16871AB80D (1410714925.053797) can0 0DF50B11#0195030000FFFFFF (1410714925.082301) can0 0DF01002#AAF0C73FA04F4124 (1410714925.084895) can0 19FA0302#AAD3490069006400 (1410714925.087733) can0 19FA0402#8093AAFD0C0B7F34 (1410714925.090723) can0 19FA0402#8113C7B711FAFFFF (1410714925.093714) can0 19FA0402#82FFF220673064D5 (1410714925.096949) can0 19FA0402#832513FDFFFFFFF2 (1410714925.099726) can0 19FA0402#840E7F16B9209B11 (1410714925.102717) can0 19FA0402#85FEFFFFFFF2168B (1410714925.105708) can0 19FA0402#8609AD2D1B110100 (1410714925.109034) can0 19FA0402#870000F201D0247C (1410714925.111719) can0 19FA0402#88D95113E6FFFFFF (1410714925.114710) can0 19FA0402#89F21B390A95745C (1410714925.117701) can0 19FA0402#8A1019000000F217 (1410714925.120875) can0 19FA0402#8BD106CE8DAB1077 (1410714925.123713) can0 19FA0402#8CFFFFFFF2047314 (1410714925.126704) can0 19FA0402#8DAAD21312F6FFFF (1410714925.129725) can0 19FA0402#8EFFF21FE80AB84D (1410714925.132929) can0 19FA0402#8F2D1171000000F2 (1410714925.135706) can0 19FA0402#901C1704C2C7170C (1410714925.138728) can0 19FA0402#91D3FFFFFFF213A2 (1410714925.141718) can0 19FA0402#921C2C8008123D00 (1410714925.144892) can0 19FA0402#930000F214221513 (1410714925.147700) can0 19FA0402#94B80E1120000000 (1410714925.150721) can0 19FA0402#95F2FFFFFFFFFFFF (1410714925.153712) can0 0DF80502#802FAAC73FA04F41 (1410714925.156947) can0 0DF80502#812480CEECD5FA42 (1410714925.159724) can0 0DF80502#8243058090627EB0 (1410714925.162714) can0 0DF80502#83B9310340DA8F02 (1410714925.165705) can0 0DF80502#840000000013FC0C (1410714925.169001) can0 0DF80502#8549008000AC0D00 (1410714925.171717) can0 0DF80502#860000FFFFFFFFFF (1410714925.174677) can0 09F80102#D6719A16871AB80D (1410714925.206751) can0 09F80202#ABFC00000200FFFF (1410714925.231715) can0 09F80102#D6719A16871AB80D (1410714925.331660) can0 09F80102#D6719A16871AB80D (1410714925.431635) can0 09F80102#D6719A16871AB80D (1410714925.442774) can0 19F212B0#A009A1000064FF1C (1410714925.443354) can0 19F212B0#A11C0900FFFFFFFF (1410714925.443903) can0 19F214B0#00EC04C3FF6778A1 (1410714925.457056) can0 09F80202#ACFC00000200FFFF (1410714925.531641) can0 09F80102#D6719A16871AB80D (1410714925.631647) can0 09F80102#D6719A16871AB80D (1410714925.706629) can0 09F80202#ADFC00000200FFFF (1410714925.731654) can0 09F80102#D6719A16871AB80D (1410714925.831660) can0 09F80102#D6719A16871AB80D (1410714925.931696) can0 09F80102#D6719A16871AB80D (1410714925.956507) can0 09F80202#AEFC00000200FFFF (1410714926.031641) can0 09F80102#D6719A16871AB80D (1410714926.090693) can0 0DF01002#AFF0C73FB0764124 (1410714926.093409) can0 19FA0302#AFD3490069006400 (1410714926.096400) can0 19FA0402#A093AFFD0C0B7F34 (1410714926.099573) can0 19FA0402#A113C77711FBFFFF (1410714926.102412) can0 19FA0402#A2FFF220673064D5 (1410714926.105402) can0 19FA0402#A3D51201000000F2 (1410714926.108393) can0 19FA0402#A40E7F16B920B311 (1410714926.111628) can0 19FA0402#A5FAFFFFFFF2168B (1410714926.114405) can0 19FA0402#A609AD2DF4100600 (1410714926.117426) can0 19FA0402#A70000F201D0247C (1410714926.120417) can0 19FA0402#A8D97913E7FFFFFF (1410714926.123713) can0 19FA0402#A9F21B390A957467 (1410714926.126398) can0 19FA0402#AA101C000000F217 (1410714926.129389) can0 19FA0402#ABD106CE8D841084 (1410714926.132410) can0 19FA0402#ACFFFFFFF2047314 (1410714926.135615) can0 19FA0402#ADAAD27312F6FFFF (1410714926.138392) can0 19FA0402#AEFFF21FE80AB84D (1410714926.141413) can0 19FA0402#AF4C1168000000F2 (1410714926.144404) can0 19FA0402#B01C1704C2C7040C (1410714926.147639) can0 19FA0402#B1F7FFFFFFF213A2 (1410714926.150385) can0 19FA0402#B21C2C805E123800 (1410714926.153376) can0 19FA0402#B30000F214221513 (1410714926.155451) can0 0DF50B11#0195030000FFFFFF (1410714926.156397) can0 19FA0402#B4B8031124000000 (1410714926.159602) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714926.162409) can0 0DF80502#A02FAFC73FB07641 (1410714926.165369) can0 0DF80502#A12480CEECD5FA42 (1410714926.168391) can0 0DF80502#A243058090627EB0 (1410714926.171625) can0 0DF80502#A3B9310340DA8F02 (1410714926.174403) can0 0DF80502#A40000000013FC0C (1410714926.177393) can0 0DF80502#A549008000AC0D00 (1410714926.180415) can0 0DF80502#A60000FFFFFFFFFF (1410714926.183741) can0 09F80102#D6719A16871AB80D (1410714926.215693) can0 09F80202#B0FC00000100FFFF (1410714926.240412) can0 09F80102#D6719A16871AB80D (1410714926.340357) can0 09F80102#D6719A16871AB80D (1410714926.440333) can0 09F80102#D6719A16871AB80D (1410714926.465357) can0 09F80202#B1FC00000100FFFF (1410714926.540278) can0 09F80102#D6719A16871AB80D (1410714926.640253) can0 09F80102#D6719A16871AB80D (1410714926.715632) can0 09F80202#B2FC00000100FFFF (1410714926.740229) can0 09F80102#D6719A16871AB80D (1410714926.840205) can0 09F80102#D6719A16871AB80D (1410714926.850947) can0 11F80E01#401B0132D74A1050 (1410714926.851496) can0 11F80E01#4177E30DC0449116 (1410714926.852045) can0 11F80E01#42BA02BE86010307 (1410714926.852625) can0 11F80E01#4300E5BE000000FE (1410714926.940180) can0 09F80102#D6719A16871AB80D (1410714926.942835) can0 19F212B0#C009B0000064FF1C (1410714926.943385) can0 19F212B0#C11C0A00FFFFFFFF (1410714926.943934) can0 19F214B0#00EC04C5FF6D78B0 (1410714926.965205) can0 09F80202#B3FC00000100FFFF (1410714927.040125) can0 09F80102#D6719A16871AB80D (1410714927.106928) can0 0DF01002#B4F0C73FC09D4124 (1410714927.109095) can0 19FA0302#B4D3490069006400 (1410714927.112086) can0 19FA0402#C093B4FD0C0B7F34 (1410714927.115107) can0 19FA0402#C113C79811000000 (1410714927.118311) can0 19FA0402#C200F220673064D5 (1410714927.121088) can0 19FA0402#C3ED12F6FFFFFFF2 (1410714927.124079) can0 19FA0402#C40E7F16B920C411 (1410714927.127100) can0 19FA0402#C5E9FFFFFFF2168B (1410714927.130274) can0 19FA0402#C609AD2DFD100500 (1410714927.133082) can0 19FA0402#C70000F201D0247C (1410714927.136103) can0 19FA0402#C8D9B013E2FFFFFF (1410714927.139063) can0 19FA0402#C9F21B390A957470 (1410714927.142329) can0 19FA0402#CA101D000000F217 (1410714927.145075) can0 19FA0402#CBD106CE8D951081 (1410714927.148066) can0 19FA0402#CCFFFFFFF2047314 (1410714927.151057) can0 19FA0402#CDAAD2C112F1FFFF (1410714927.154261) can0 19FA0402#CEFFF21FE80AB84D (1410714927.157069) can0 19FA0402#CF501161000000F2 (1410714927.157648) can0 0DF50B11#0192030000FFFFFF (1410714927.160059) can0 19FA0402#D01C1704C2C7EB0B (1410714927.163081) can0 19FA0402#D1F5FFFFFFF213A2 (1410714927.166254) can0 19FA0402#D21C2C802A123800 (1410714927.169062) can0 19FA0402#D30000F214221513 (1410714927.172083) can0 19FA0402#D4B8B41032000000 (1410714927.175105) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714927.178339) can0 0DF80502#C02FB4C73FC09D41 (1410714927.181055) can0 0DF80502#C12480CEECD5FA42 (1410714927.184077) can0 0DF80502#C243058090627EB0 (1410714927.187067) can0 0DF80502#C3B9310340DA8F02 (1410714927.190302) can0 0DF80502#C40000000013FC0C (1410714927.193079) can0 0DF80502#C549008000AC0D00 (1410714927.196070) can0 0DF80502#C60000FFFFFFFFFF (1410714927.199061) can0 09F80102#D6719A16871AB80D (1410714927.231104) can0 09F80202#B5FC00000300FFFF (1410714927.256068) can0 09F80102#D6719A16871AB80D (1410714927.356043) can0 09F80102#D6719A16871AB80D (1410714927.456019) can0 09F80102#D6719A16871AB80D (1410714927.481043) can0 09F80202#B6FC00000300FFFF (1410714927.555994) can0 09F80102#D6719A16871AB80D (1410714927.655970) can0 09F80102#D6719A16871AB80D (1410714927.730585) can0 11F80E01#601B01985B620E30 (1410714927.731165) can0 09F80202#B7FC00000300FFFF (1410714927.731715) can0 11F80E01#61C6C20D20B99916 (1410714927.732264) can0 11F80E01#62C4A5A400004A40 (1410714927.732813) can0 11F80E01#6300FFFFFF7F00FE (1410714927.755946) can0 09F80102#D6719A16871AB80D (1410714927.855891) can0 09F80102#D6719A16871AB80D (1410714927.955836) can0 09F80102#D6719A16871AB80D (1410714927.980982) can0 09F80202#B8FC00000300FFFF (1410714928.055811) can0 09F80102#D6719A16871AB80D (1410714928.066676) can0 0DF01002#B9F0C73FD0C44124 (1410714928.069056) can0 19FA0302#B9D3490069006400 (1410714928.071772) can0 19FA0402#E093B9FD0C0B7F34 (1410714928.074793) can0 19FA0402#E113C7C311060000 (1410714928.077784) can0 19FA0402#E200F220673064D5 (1410714928.080927) can0 19FA0402#E30013F5FFFFFFF2 (1410714928.083765) can0 19FA0402#E40E7F16B920DE11 (1410714928.086787) can0 19FA0402#E5ECFFFFFFF2168B (1410714928.089777) can0 19FA0402#E609AD2DDF100A00 (1410714928.092982) can0 19FA0402#E70000F201D0247C (1410714928.095789) can0 19FA0402#E8D9C013E5FFFFFF (1410714928.098780) can0 19FA0402#E9F21B390A95748A (1410714928.101801) can0 19FA0402#EA1018000000F217 (1410714928.104945) can0 19FA0402#EBD106CE8D3B106D (1410714928.107783) can0 19FA0402#ECFFFFFFF2047314 (1410714928.110773) can0 19FA0402#EDAAD2AB12ECFFFF (1410714928.113764) can0 19FA0402#EEFFF21FE80AB84D (1410714928.116999) can0 19FA0402#EF691162000000F2 (1410714928.119776) can0 19FA0402#F01C1704C2C7E60B (1410714928.122767) can0 19FA0402#F1E6FFFFFFF213A2 (1410714928.125758) can0 19FA0402#F21C2C8030123A00 (1410714928.129023) can0 19FA0402#F30000F214221513 (1410714928.131770) can0 19FA0402#F4B8B9103E000000 (1410714928.134791) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714928.137782) can0 0DF80502#E02FB9C73FD0C441 (1410714928.140925) can0 0DF80502#E12480CEECD5FA42 (1410714928.143793) can0 0DF80502#E243058090627EB0 (1410714928.146754) can0 0DF80502#E3B9310340DA8F02 (1410714928.149775) can0 0DF80502#E40000000013FC0C (1410714928.153010) can0 0DF80502#E549008000AC0D00 (1410714928.155787) can0 0DF80502#E60000FFFFFFFFFF (1410714928.158747) can0 09F80102#D6719A16871AB80D (1410714928.159296) can0 0DF50B11#0192030000FFFFFF (1410714928.190791) can0 09F80202#BAFC00000200FFFF (1410714928.215784) can0 09F80102#D6719A16871AB80D (1410714928.315729) can0 09F80102#D6719A16871AB80D (1410714928.415705) can0 09F80102#D6719A16871AB80D (1410714928.441004) can0 09F80202#BBFC00000200FFFF (1410714928.443079) can0 19F212B0#E009BF000064FF1C (1410714928.443659) can0 19F212B0#E11C0A00FFFFFFFF (1410714928.444209) can0 19F214B0#00EC04C5FF6D78BF (1410714928.515681) can0 09F80102#D6719A16871AB80D (1410714928.615687) can0 09F80102#D6719A16871AB80D (1410714928.690668) can0 09F80202#BCFC00000200FFFF (1410714928.715693) can0 09F80102#D6719A16871AB80D (1410714928.815729) can0 09F80102#D6719A16871AB80D (1410714928.915675) can0 09F80102#D6719A16871AB80D (1410714928.940577) can0 09F80202#BDFC00000200FFFF (1410714929.015681) can0 09F80102#D6719A16871AB80D (1410714929.089747) can0 0DF01002#BEF0C73FE0EB4124 (1410714929.092463) can0 19FA0302#BED3490069006400 (1410714929.095667) can0 19FA0402#0093BEFD0C0B7F34 (1410714929.098475) can0 19FA0402#0113C72812010000 (1410714929.101466) can0 19FA0402#0200F220673064D5 (1410714929.104456) can0 19FA0402#031B13F3FFFFFFF2 (1410714929.107661) can0 19FA0402#040E7F16B9209011 (1410714929.110468) can0 19FA0402#05F0FFFFFFF2168B (1410714929.113459) can0 19FA0402#0609AD2DDC100500 (1410714929.116480) can0 19FA0402#070000F201D0247C (1410714929.119654) can0 19FA0402#08D9E013E2FFFFFF (1410714929.122462) can0 19FA0402#09F21B390A957479 (1410714929.125452) can0 19FA0402#0A1019000000F217 (1410714929.128443) can0 19FA0402#0BD106CE8D111076 (1410714929.131739) can0 19FA0402#0CFFFFFFF2047314 (1410714929.134455) can0 19FA0402#0DAAD25612F1FFFF (1410714929.137446) can0 19FA0402#0EFFF21FE80AB84D (1410714929.140437) can0 19FA0402#0F221169000000F2 (1410714929.144007) can0 19FA0402#101C1704C2C7660C (1410714929.146448) can0 19FA0402#11C3FFFFFFF213A2 (1410714929.149439) can0 19FA0402#121C2C803D123200 (1410714929.152430) can0 19FA0402#130000F214221513 (1410714929.155665) can0 19FA0402#14B86D1134000000 (1410714929.158472) can0 19FA0402#15F2FFFFFFFFFFFF (1410714929.161463) can0 0DF80502#002FBEC73FE0EB41 (1410714929.162836) can0 0DF50B11#0195030000FFFFFF (1410714929.164454) can0 0DF80502#012480CEECD5FA42 (1410714929.167658) can0 0DF80502#0243058090627EB0 (1410714929.170435) can0 0DF80502#03B9310340DA8F02 (1410714929.173457) can0 0DF80502#040000000013FC0C (1410714929.176447) can0 0DF80502#0549008000AC0D00 (1410714929.179835) can0 0DF80502#060000FFFFFFFFFF (1410714929.182429) can0 09F80102#D6719A16871AB80D (1410714929.214472) can0 09F80202#BFFC00000300FFFF (1410714929.225672) can0 1DEFFF01#C00AE598B6060404 (1410714929.226221) can0 1DEFFF01#C100000002FFFFFF (1410714929.239649) can0 09F80102#D6719A16871AB80D (1410714929.339625) can0 09F80102#D6719A16871AB80D (1410714929.439631) can0 09F80102#D6719A16871AB80D (1410714929.464411) can0 09F80202#C0FC00000300FFFF (1410714929.539637) can0 09F80102#D6719A16871AB80D (1410714929.639643) can0 09F80102#D6719A16871AB80D (1410714929.714350) can0 09F80202#C1FC00000300FFFF (1410714929.739619) can0 09F80102#D6719A16871AB80D (1410714929.839564) can0 09F80102#D6719A16871AB80D (1410714929.939234) can0 09F80102#D6719A16871AB80D (1410714929.942835) can0 19F212B0#0009CE000064FF1D (1410714929.943385) can0 19F212B0#011CA104FFFFFFFF (1410714929.943934) can0 19F214B0#00E304C5FF6B78CE (1410714929.964228) can0 09F80202#C2FC00000300FFFF (1410714930.039179) can0 09F80102#D6719A16871AB80D (1410714930.115961) can0 0DF01002#C3F0C73FF0124224 (1410714930.118311) can0 19FA0302#C3D3490069006400 (1410714930.121149) can0 19FA0402#2093C3FD0C0B7F34 (1410714930.124140) can0 19FA0402#2113C7CA11060000 (1410714930.127131) can0 19FA0402#2200F220673064D5 (1410714930.130305) can0 19FA0402#232413F2FFFFFFF2 (1410714930.133143) can0 19FA0402#240E7F16B920A011 (1410714930.136134) can0 19FA0402#25F1FFFFFFF2168B (1410714930.139124) can0 19FA0402#2609AD2D20111000 (1410714930.142359) can0 19FA0402#270000F201D0247C (1410714930.145136) can0 19FA0402#28D90413DEFFFFFF (1410714930.148127) can0 19FA0402#29F21B390A9574AC (1410714930.151148) can0 19FA0402#2A1014000000F217 (1410714930.154292) can0 19FA0402#2BD106CE8D1C1078 (1410714930.157130) can0 19FA0402#2CFFFFFFF2047314 (1410714930.160120) can0 19FA0402#2DAAD2EB11FCFFFF (1410714930.163111) can0 19FA0402#2EFFF21FE80AB84D (1410714930.164332) can0 0DF50B11#0195030000FFFFFF (1410714930.166315) can0 19FA0402#2F3F1166000000F2 (1410714930.169123) can0 19FA0402#301C1704C2C7DA0C (1410714930.172144) can0 19FA0402#31CFFFFFFFF213A2 (1410714930.175135) can0 19FA0402#321C2C8056123300 (1410714930.178339) can0 19FA0402#330000F214221513 (1410714930.181116) can0 19FA0402#34B868102F000000 (1410714930.184138) can0 19FA0402#35F2FFFFFFFFFFFF (1410714930.187128) can0 0DF80502#202FC3C73FF01242 (1410714930.190302) can0 0DF80502#212480CEECD5FA42 (1410714930.193110) can0 0DF80502#2243058090627EB0 (1410714930.196101) can0 0DF80502#23B9310340DA8F02 (1410714930.199152) can0 0DF80502#240000000013FC0C (1410714930.202326) can0 0DF80502#2549008000AC0D00 (1410714930.205134) can0 0DF80502#260000FFFFFFFFFF (1410714930.208094) can0 09F80102#D6719A16871AB80D (1410714930.240168) can0 09F80202#C4FC00000400FFFF (1410714930.265131) can0 09F80102#D6719A16871AB80D (1410714930.365107) can0 09F80102#D6719A16871AB80D (1410714930.465052) can0 09F80102#D6719A16871AB80D (1410714930.490382) can0 09F80202#C5FC00000400FFFF (1410714930.565028) can0 09F80102#D6719A16871AB80D (1410714930.664271) can0 11F80E01#801B0108975C0EF0 (1410714930.664820) can0 11F80E01#819DC50DE0F59816 (1410714930.665369) can0 09F80102#D6719A16871AB80D (1410714930.665919) can0 11F80E01#82CD675D00009287 (1410714930.666468) can0 11F80E01#830836AF000000FE (1410714930.740015) can0 09F80202#C6FC00000400FFFF (1410714930.765009) can0 09F80102#D6719A16871AB80D (1410714930.865015) can0 09F80102#D6719A16871AB80D (1410714930.964991) can0 09F80102#D6719A16871AB80D (1410714930.989924) can0 09F80202#C7FC00000400FFFF (1410714931.065028) can0 09F80102#D6719A16871AB80D (1410714931.076289) can0 0DF01002#C8F0C73F003A4224 (1410714931.078822) can0 19FA0302#C8D3490069006400 (1410714931.081843) can0 19FA0402#4093C8FD0C0B7F34 (1410714931.084986) can0 19FA0402#4113C7E511080000 (1410714931.087824) can0 19FA0402#4200F220673064D5 (1410714931.090845) can0 19FA0402#437412F8FFFFFFF2 (1410714931.093836) can0 19FA0402#440E7F16B9206911 (1410714931.097041) can0 19FA0402#45EFFFFFFFF2168B (1410714931.099848) can0 19FA0402#4609AD2D4F110E00 (1410714931.102839) can0 19FA0402#470000F201D0247C (1410714931.105830) can0 19FA0402#48D92213E2FFFFFF (1410714931.109064) can0 19FA0402#49F21B390A957475 (1410714931.111811) can0 19FA0402#4A1011000000F217 (1410714931.114802) can0 19FA0402#4BD106CE8DEC0F6F (1410714931.117823) can0 19FA0402#4CFFFFFFF2047314 (1410714931.120966) can0 19FA0402#4DAAD21812FDFFFF (1410714931.123804) can0 19FA0402#4EFFF21FE80AB84D (1410714931.126826) can0 19FA0402#4F57115D000000F2 (1410714931.129816) can0 19FA0402#501C1704C2C70F0D (1410714931.133021) can0 19FA0402#51D7FFFFFFF213A2 (1410714931.135828) can0 19FA0402#521C2C801C123000 (1410714931.138789) can0 19FA0402#530000F214221513 (1410714931.141840) can0 19FA0402#54B8941023000000 (1410714931.145014) can0 19FA0402#55F2FFFFFFFFFFFF (1410714931.147822) can0 0DF80502#402FC8C73F003A42 (1410714931.150813) can0 0DF80502#412480CEECD5FA42 (1410714931.153803) can0 0DF80502#4243058090627EB0 (1410714931.157008) can0 0DF80502#43B9310340DA8F02 (1410714931.159815) can0 0DF80502#440000000013FC0C (1410714931.162806) can0 0DF80502#4549008000AC0D00 (1410714931.165827) can0 0DF80502#460000FFFFFFFFFF (1410714931.166407) can0 0DF50B11#0195030000FFFFFF (1410714931.169062) can0 09F80102#D6719A16871AB80D (1410714931.201014) can0 09F80202#C9FC00000400FFFF (1410714931.225825) can0 09F80102#D6719A16871AB80D (1410714931.325770) can0 09F80102#D6719A16871AB80D (1410714931.425745) can0 09F80102#D6719A16871AB80D (1410714931.442866) can0 19F212B0#2009DD000064FF1D (1410714931.443415) can0 19F212B0#211C0A00FFFFFFFF (1410714931.443964) can0 19F214B0#00EC04C5FF6D78DD (1410714931.450770) can0 09F80202#CAFC00000400FFFF (1410714931.525721) can0 09F80102#D6719A16871AB80D (1410714931.625697) can0 09F80102#D6719A16871AB80D (1410714931.701014) can0 09F80202#CBFC00000400FFFF (1410714931.704127) can0 11F80E01#A01B03104E610E00 (1410714931.704676) can0 11F80E01#A186BF0D609F9716 (1410714931.705225) can0 11F80E01#A2D089810A000000 (1410714931.705805) can0 11F80E01#A300E5BE000001FE (1410714931.725672) can0 09F80102#D6719A16871AB80D (1410714931.825617) can0 09F80102#D6719A16871AB80D (1410714931.925593) can0 09F80102#D6719A16871AB80D (1410714931.950617) can0 09F80202#CCFC00000400FFFF (1410714932.025568) can0 09F80102#D6719A16871AB80D (1410714932.090327) can0 0DF01002#CDF0C73F10614224 (1410714932.092524) can0 19FA0302#CDD3490069006400 (1410714932.095698) can0 19FA0402#6093CDFD0C0B7F34 (1410714932.098505) can0 19FA0402#6165C6B411070000 (1410714932.101496) can0 19FA0402#6200F220673064D5 (1410714932.104517) can0 19FA0402#63F712F7FFFFFFF2 (1410714932.107691) can0 19FA0402#640E7F16B920DA10 (1410714932.110499) can0 19FA0402#6511000000F2168B (1410714932.113490) can0 19FA0402#6609AD2D1A111000 (1410714932.116511) can0 19FA0402#670000F201D0247C (1410714932.119685) can0 19FA0402#68D9E313E8FFFFFF (1410714932.122492) can0 19FA0402#69F21B390A957473 (1410714932.125513) can0 19FA0402#6A101B000000F217 (1410714932.128474) can0 19FA0402#6BD106CE8D121063 (1410714932.131708) can0 19FA0402#6CFFFFFFF2047314 (1410714932.134486) can0 19FA0402#6DAAD26D12FAFFFF (1410714932.137507) can0 19FA0402#6EFFF21FE80AB84D (1410714932.140498) can0 19FA0402#6F3D115F000000F2 (1410714932.143824) can0 19FA0402#701C1704C2C7FD0C (1410714932.146510) can0 19FA0402#71E1FFFFFFF213A2 (1410714932.149500) can0 19FA0402#721C2C806A122800 (1410714932.152491) can0 19FA0402#730000F214221513 (1410714932.155665) can0 19FA0402#74B83C1117000000 (1410714932.158503) can0 19FA0402#75F2FFFFFFFFFFFF (1410714932.161494) can0 0DF80502#602FCDC73F106142 (1410714932.164484) can0 0DF80502#612480CEECD5FA42 (1410714932.167384) can0 0DF50B11#0192030000FFFFFF (1410714932.167963) can0 0DF80502#6243058090627EB0 (1410714932.170496) can0 0DF80502#63B9310340DA8F02 (1410714932.173518) can0 0DF80502#640000000013FC0C (1410714932.176508) can0 0DF80502#6549008000AC0D00 (1410714932.179865) can0 0DF80502#660000FFFFFFFFFF (1410714932.182490) can0 09F80102#D6719A16871AB80D (1410714932.214533) can0 09F80202#CEFC00000400FFFF (1410714932.239680) can0 09F80102#D6719A16871AB80D (1410714932.339655) can0 09F80102#D6719A16871AB80D (1410714932.439692) can0 09F80102#D6719A16871AB80D (1410714932.464472) can0 09F80202#CFFC00000400FFFF (1410714932.539667) can0 09F80102#D6719A16871AB80D (1410714932.639674) can0 09F80102#D6719A16871AB80D (1410714932.714381) can0 09F80202#D0FC00000400FFFF (1410714932.717493) can0 11F80E01#C01B01A929C40CD0 (1410714932.718012) can0 11F80E01#C133B90D20009A16 (1410714932.718623) can0 11F80E01#C2D8EAC80000D460 (1410714932.719141) can0 11F80E01#C30C7CCA000000FE (1410714932.739649) can0 09F80102#D6719A16871AB80D (1410714932.839625) can0 09F80102#D6719A16871AB80D (1410714932.939600) can0 09F80102#D6719A16871AB80D (1410714932.942866) can0 19F212B0#4009EC000064FF1B (1410714932.943446) can0 19F212B0#411C0A00FFFFFFFF (1410714932.943995) can0 19F214B0#00EC04C5FF6A78EC (1410714932.964320) can0 09F80202#D1FC00000400FFFF (1410714933.048151) can0 09F80102#D6719A16871AB80D (1410714933.141474) can0 0DF01002#D2F0C73F20884224 (1410714933.144190) can0 19FA0302#D2D3490069006400 (1410714933.147181) can0 19FA0402#8093D2FD0C0B7F34 (1410714933.150324) can0 19FA0402#8165C6B211FDFFFF (1410714933.153193) can0 19FA0402#82FFF220673064D5 (1410714933.156184) can0 19FA0402#836B12F1FFFFFFF2 (1410714933.159174) can0 19FA0402#840E7F16B9200F11 (1410714933.162348) can0 19FA0402#8503000000F2168B (1410714933.165186) can0 19FA0402#8609AD2D0B11FFFF (1410714933.168177) can0 19FA0402#87FFFFF201D0247C (1410714933.169245) can0 0DF50B11#0192030000FFFFFF (1410714933.171198) can0 19FA0402#88D9BD13E6FFFFFF (1410714933.174311) can0 19FA0402#89F21B390A95748C (1410714933.177180) can0 19FA0402#8A1012000000F217 (1410714933.180170) can0 19FA0402#8BD106CE8D30105D (1410714933.183192) can0 19FA0402#8CFFFFFFF2047314 (1410714933.186304) can0 19FA0402#8DAAD29412EBFFFF (1410714933.189173) can0 19FA0402#8EFFF21FE80AB84D (1410714933.192164) can0 19FA0402#8F5E1156000000F2 (1410714933.195155) can0 19FA0402#901C1704C2C7DA0C (1410714933.198359) can0 19FA0402#91DFFFFFFFF213A2 (1410714933.201167) can0 19FA0402#921C2C80B5112500 (1410714933.204157) can0 19FA0402#930000F214221513 (1410714933.207178) can0 19FA0402#94B8181108000000 (1410714933.210322) can0 19FA0402#95F2FFFFFFFFFFFF (1410714933.213160) can0 0DF80502#802FD2C73F208842 (1410714933.216151) can0 0DF80502#812480CEECD5FA42 (1410714933.219172) can0 0DF80502#8243058090627EB0 (1410714933.222376) can0 0DF80502#83B9310340DA8F02 (1410714933.225184) can0 0DF80502#840000000013FC0C (1410714933.228175) can0 0DF80502#8549008000AC0D00 (1410714933.231196) can0 0DF80502#860000FFFFFFFFFF (1410714933.234309) can0 09F80102#D6719A16871AB80D (1410714933.266383) can0 09F80202#D3FC00000400FFFF (1410714933.291163) can0 09F80102#D6719A16871AB80D (1410714933.391138) can0 09F80102#D6719A16871AB80D (1410714933.491114) can0 09F80102#D6719A16871AB80D (1410714933.516108) can0 09F80202#D4FC00000400FFFF (1410714933.584193) can0 11F80E01#E01B0188F64A0E10 (1410714933.584772) can0 11F80E01#E1FCB80DA0009A16 (1410714933.585322) can0 11F80E01#E2D8FFFF0000D460 (1410714933.585902) can0 11F80E01#E304154F000000FE (1410714933.591090) can0 09F80102#D6719A16871AB80D (1410714933.691035) can0 09F80102#D6719A16871AB80D (1410714933.766352) can0 09F80202#D5FC00000400FFFF (1410714933.791010) can0 09F80102#D6719A16871AB80D (1410714933.890986) can0 09F80102#D6719A16871AB80D (1410714933.990961) can0 09F80102#D6719A16871AB80D (1410714934.015955) can0 09F80202#D6FC00000400FFFF (1410714934.090907) can0 09F80102#D6719A16871AB80D (1410714934.100001) can0 0DF01002#D7F0C73F30AF4224 (1410714934.102869) can0 19FA0302#D7D3490069006400 (1410714934.105891) can0 19FA0402#A093D7FD0C0B7F34 (1410714934.109248) can0 19FA0402#A165C6A411F5FFFF (1410714934.111872) can0 19FA0402#A2FFF220673064D5 (1410714934.114893) can0 19FA0402#A3DC12F6FFFFFFF2 (1410714934.117884) can0 19FA0402#A40E7F16B9204911 (1410714934.121455) can0 19FA0402#A500000000F2168B (1410714934.123865) can0 19FA0402#A609AD2D3711F8FF (1410714934.126887) can0 19FA0402#A7FFFFF201D0247C (1410714934.129877) can0 19FA0402#A8D9CE13E5FFFFFF (1410714934.133051) can0 19FA0402#A9F21B390A9574AA (1410714934.135889) can0 19FA0402#AA100C000000F217 (1410714934.138880) can0 19FA0402#ABD106CE8D56106B (1410714934.141871) can0 19FA0402#ACFFFFFFF2047314 (1410714934.145045) can0 19FA0402#ADAAD2A412EFFFFF (1410714934.147852) can0 19FA0402#AEFFF21FE80AB84D (1410714934.150874) can0 19FA0402#AF26115B000000F2 (1410714934.153864) can0 19FA0402#B01C1704C2C7790C (1410714934.157069) can0 19FA0402#B10B000000F213A2 (1410714934.159846) can0 19FA0402#B21C2C80EB112300 (1410714934.162836) can0 19FA0402#B30000F214221513 (1410714934.165858) can0 19FA0402#B4B8581017000000 (1410714934.169154) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714934.170740) can0 0DF50B11#0192030000FFFFFF (1410714934.171870) can0 0DF80502#A02FD7C73F30AF42 (1410714934.174860) can0 0DF80502#A12480CEECD5FA42 (1410714934.177851) can0 0DF80502#A243058090627EB0 (1410714934.181025) can0 0DF80502#A3B9310340DA8F02 (1410714934.183863) can0 0DF80502#A40000000013FC0C (1410714934.186854) can0 0DF80502#A549008000AC0D00 (1410714934.189875) can0 0DF80502#A60000FFFFFFFFFF (1410714934.193079) can0 09F80102#D6719A16871AB80D (1410714934.223902) can0 09F80202#D8FC00000300FFFF (1410714934.225306) can0 1DEFFF01#E00AE598B6060404 (1410714934.225855) can0 1DEFFF01#E100000002FFFFFF (1410714934.249171) can0 09F80102#D6719A16871AB80D (1410714934.349177) can0 09F80102#D6719A16871AB80D (1410714934.442896) can0 19F212B0#600900000064FF1B (1410714934.443476) can0 19F212B0#611C0900FFFFFFFF (1410714934.444025) can0 19F214B0#00EC04C5FF6C7800 (1410714934.449152) can0 09F80102#D6719A16871AB80D (1410714934.473811) can0 09F80202#D9FC00000300FFFF (1410714934.549158) can0 09F80102#D6719A16871AB80D (1410714934.649165) can0 09F80102#D6719A16871AB80D (1410714934.723872) can0 09F80202#DAFC00000300FFFF (1410714934.749293) can0 09F80102#D6719A16871AB80D (1410714934.849146) can0 09F80102#D6719A16871AB80D (1410714934.949091) can0 09F80102#D6719A16871AB80D (1410714934.973658) can0 09F80202#DBFC00000300FFFF (1410714935.048609) can0 09F80102#D6719A16871AB80D (1410714935.058955) can0 0DF01002#DCF0C73F40D64224 (1410714935.061579) can0 19FA0302#DCD3490069006400 (1410714935.064570) can0 19FA0402#C093DCFD0C0B7F34 (1410714935.067774) can0 19FA0402#C165C64E12F4FFFF (1410714935.070582) can0 19FA0402#C2FFF220673064D5 (1410714935.073573) can0 19FA0402#C32313FBFFFFFFF2 (1410714935.076563) can0 19FA0402#C40E7F16B9202411 (1410714935.079676) can0 19FA0402#C50A000000F2168B (1410714935.082575) can0 19FA0402#C609AD2D4C110300 (1410714935.085596) can0 19FA0402#C70000F201D0247C (1410714935.088587) can0 19FA0402#C8D98413F2FFFFFF (1410714935.091730) can0 19FA0402#C9F21B390A9574B1 (1410714935.094569) can0 19FA0402#CA1015000000F217 (1410714935.097559) can0 19FA0402#CBD106CE8DB21072 (1410714935.100581) can0 19FA0402#CCFFFFFFF2047314 (1410714935.103846) can0 19FA0402#CDAAD27A12FAFFFF (1410714935.106562) can0 19FA0402#CEFFF21FE80AB84D (1410714935.109583) can0 19FA0402#CF41115F000000F2 (1410714935.112543) can0 19FA0402#D01C1704C2C7710C (1410714935.115748) can0 19FA0402#D102000000F213A2 (1410714935.118647) can0 19FA0402#D21C2C80BC112F00 (1410714935.126459) can0 19FA0402#D30000F214221513 (1410714935.128626) can0 19FA0402#D4B8921026000000 (1410714935.131770) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714935.134577) can0 0DF80502#C02FDCC73F40D642 (1410714935.137568) can0 0DF80502#C12480CEECD5FA42 (1410714935.140559) can0 0DF80502#C243058090627EB0 (1410714935.143854) can0 0DF80502#C3B9310340DA8F02 (1410714935.146601) can0 0DF80502#C40000000013FC0C (1410714935.149592) can0 0DF80502#C549008000AC0D00 (1410714935.152583) can0 0DF80502#C60000FFFFFFFFFF (1410714935.155695) can0 09F80102#D6719A16871AB80D (1410714935.174250) can0 0DF50B11#0192030000FFFFFF (1410714935.183924) can0 09F80202#DDFC00000300FFFF (1410714935.208552) can0 09F80102#D6719A16871AB80D (1410714935.308527) can0 09F80102#D6719A16871AB80D (1410714935.408503) can0 09F80102#D6719A16871AB80D (1410714935.433497) can0 09F80202#DEFC00000300FFFF (1410714935.508448) can0 09F80102#D6719A16871AB80D (1410714935.608424) can0 09F80102#D6719A16871AB80D (1410714935.683863) can0 09F80202#DFFC00000300FFFF (1410714935.708399) can0 09F80102#D6719A16871AB80D (1410714935.808375) can0 09F80102#D6719A16871AB80D (1410714935.908350) can0 09F80102#D6719A16871AB80D (1410714935.933405) can0 09F80202#E0FC00000300FFFF (1410714935.942896) can0 19F212B0#80090F000064FF1E (1410714935.943476) can0 19F212B0#811C0A00FFFFFFFF (1410714935.944025) can0 19F214B0#00EC04C5FF6D780F (1410714936.008295) can0 09F80102#D6719A16871AB80D (1410714936.068262) can0 0DF01002#E1F0C73F50FD4224 (1410714936.071253) can0 19FA0302#E1D3490069006400 (1410714936.074335) can0 19FA0402#E093E1FD0C0B7F34 (1410714936.077265) can0 19FA0402#E165C6E111EFFFFF (1410714936.080256) can0 19FA0402#E2FFF220673064D5 (1410714936.083247) can0 19FA0402#E36613F9FFFFFFF2 (1410714936.086329) can0 19FA0402#E40E7F16B9203211 (1410714936.089259) can0 19FA0402#E504000000F2168B (1410714936.092249) can0 19FA0402#E609AD2D6D11FDFF (1410714936.095271) can0 19FA0402#E7FFFFF201D0247C (1410714936.098383) can0 19FA0402#E8D9C513F5FFFFFF (1410714936.101252) can0 19FA0402#E9F21B390A9574C8 (1410714936.104273) can0 19FA0402#EA101A000000F217 (1410714936.107264) can0 19FA0402#EBD106CE8DAC1078 (1410714936.110346) can0 19FA0402#ECFFFFFFF2047314 (1410714936.113245) can0 19FA0402#EDAAD22612F6FFFF (1410714936.116236) can0 19FA0402#EEFFF21FE80AB84D (1410714936.119257) can0 19FA0402#EF68115B000000F2 (1410714936.122370) can0 19FA0402#F01C1704C2C7770C (1410714936.125239) can0 19FA0402#F1F1FFFFFFF213A2 (1410714936.128230) can0 19FA0402#F21C2C80E7113300 (1410714936.131220) can0 19FA0402#F30000F214221513 (1410714936.134333) can0 19FA0402#F4B8D61020000000 (1410714936.137263) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714936.140223) can0 0DF80502#E02FE1C73F50FD42 (1410714936.143214) can0 0DF80502#E12480CEECD5FA42 (1410714936.146357) can0 0DF80502#E243058090627EB0 (1410714936.149226) can0 0DF80502#E3B9310340DA8F02 (1410714936.152247) can0 0DF80502#E40000000013FC0C (1410714936.155238) can0 0DF80502#E549008000AC0D00 (1410714936.158411) can0 0DF80502#E60000FFFFFFFFFF (1410714936.161219) can0 09F80102#D6719A16871AB80D (1410714936.192286) can0 09F80202#E2FC00000200FFFF (1410714936.217219) can0 09F80102#D6719A16871AB80D (1410714936.275874) can0 0DF50B11#0192030000FFFFFF (1410714936.317225) can0 09F80102#D6719A16871AB80D (1410714936.417170) can0 09F80102#D6719A16871AB80D (1410714936.442469) can0 09F80202#E3FC00000200FFFF (1410714936.517146) can0 09F80102#D6719A16871AB80D (1410714936.617152) can0 09F80102#D6719A16871AB80D (1410714936.692133) can0 09F80202#E4FC00000200FFFF (1410714936.717127) can0 09F80102#D6719A16871AB80D (1410714936.817194) can0 09F80102#D6719A16871AB80D (1410714936.917109) can0 09F80102#D6719A16871AB80D (1410714936.942408) can0 09F80202#E5FC00000200FFFF (1410714937.017146) can0 09F80102#D6719A16871AB80D (1410714937.077204) can0 0DF01002#E6F0C73F60244324 (1410714937.079951) can0 19FA0302#E6D3490069006400 (1410714937.082941) can0 19FA0402#0093E6FD0C0B7F34 (1410714937.085932) can0 19FA0402#0165C68F12EFFFFF (1410714937.089136) can0 19FA0402#02FFF220673064D5 (1410714937.091944) can0 19FA0402#031A13FDFFFFFFF2 (1410714937.094935) can0 19FA0402#040E7F16B920A011 (1410714937.097956) can0 19FA0402#05F4FFFFFFF2168B (1410714937.101038) can0 19FA0402#0609AD2D9211F7FF (1410714937.103938) can0 19FA0402#07FFFFF201D0247C (1410714937.106959) can0 19FA0402#08D93313F9FFFFFF (1410714937.109919) can0 19FA0402#09F21B390A9574F2 (1410714937.113123) can0 19FA0402#0A101C000000F217 (1410714937.115931) can0 19FA0402#0BD106CE8DAB1088 (1410714937.118952) can0 19FA0402#0CFFFFFFF2047314 (1410714937.121943) can0 19FA0402#0DAAD2D411F1FFFF (1410714937.125056) can0 19FA0402#0EFFF21FE80AB84D (1410714937.127924) can0 19FA0402#0F63115D000000F2 (1410714937.130946) can0 19FA0402#101C1704C2C7C60C (1410714937.133936) can0 19FA0402#11FBFFFFFFF213A2 (1410714937.137141) can0 19FA0402#121C2C80A4113300 (1410714937.139918) can0 19FA0402#130000F214221513 (1410714937.142908) can0 19FA0402#14B8D71023000000 (1410714937.145930) can0 19FA0402#15F2FFFFFFFFFFFF (1410714937.149287) can0 0DF80502#002FE6C73F602443 (1410714937.151911) can0 0DF80502#012480CEECD5FA42 (1410714937.154902) can0 0DF80502#0243058090627EB0 (1410714937.157923) can0 0DF80502#03B9310340DA8F02 (1410714937.161066) can0 0DF80502#040000000013FC0C (1410714937.163935) can0 0DF80502#0549008000AC0D00 (1410714937.166956) can0 0DF80502#060000FFFFFFFFFF (1410714937.169917) can0 09F80102#D6719A16871AB80D (1410714937.201105) can0 09F80202#E7FC00000200FFFF (1410714937.225947) can0 09F80102#D6719A16871AB80D (1410714937.277644) can0 0DF50B11#0195030000FFFFFF (1410714937.325892) can0 09F80102#D6719A16871AB80D (1410714937.425867) can0 09F80102#D6719A16871AB80D (1410714937.442957) can0 19F212B0#A0091E000064FFED (1410714937.443537) can0 19F212B0#A11B0A00FFFFFFFF (1410714937.444086) can0 19F214B0#00EC04C5FF51781E (1410714937.450892) can0 09F80202#E8FC00000200FFFF (1410714937.525843) can0 09F80102#D6719A16871AB80D (1410714937.625788) can0 09F80102#D6719A16871AB80D (1410714937.701105) can0 09F80202#E9FC00000200FFFF (1410714937.725764) can0 09F80102#D6719A16871AB80D (1410714937.825739) can0 09F80102#D6719A16871AB80D (1410714937.925715) can0 09F80102#D6719A16871AB80D (1410714937.950770) can0 09F80202#EAFC00000200FFFF (1410714938.025660) can0 09F80102#D6719A16871AB80D (1410714938.099177) can0 0DF01002#EBF0C73F704B4324 (1410714938.101618) can0 19FA0302#EBD3490069006400 (1410714938.104639) can0 19FA0402#2093EBFD0C0B7F34 (1410714938.107813) can0 19FA0402#2165C62411EAFFFF (1410714938.110621) can0 19FA0402#22FFF220673064D5 (1410714938.113612) can0 19FA0402#232813F2FFFFFFF2 (1410714938.116602) can0 19FA0402#240E7F16B9206311 (1410714938.119715) can0 19FA0402#25EEFFFFFFF2168B (1410714938.122614) can0 19FA0402#2609AD2DB011E4FF (1410714938.125636) can0 19FA0402#27FFFFF201D0247C (1410714938.128626) can0 19FA0402#28D95B13F5FFFFFF (1410714938.131739) can0 19FA0402#29F21B390A9574D1 (1410714938.134608) can0 19FA0402#2A101A000000F217 (1410714938.137598) can0 19FA0402#2BD106CE8DB1107D (1410714938.140620) can0 19FA0402#2CFFFFFFF2047314 (1410714938.143885) can0 19FA0402#2DAAD2DE11E4FFFF (1410714938.146601) can0 19FA0402#2EFFF21FE80AB84D (1410714938.149622) can0 19FA0402#2F331159000000F2 (1410714938.152583) can0 19FA0402#301C1704C2C7120D (1410714938.155756) can0 19FA0402#31DDFFFFFFF213A2 (1410714938.158595) can0 19FA0402#321C2C8060122700 (1410714938.161585) can0 19FA0402#330000F214221513 (1410714938.164606) can0 19FA0402#34B82A111D000000 (1410714938.167780) can0 19FA0402#35F2FFFFFFFFFFFF (1410714938.170588) can0 0DF80502#202FEBC73F704B43 (1410714938.173579) can0 0DF80502#2124C0751E3CEB42 (1410714938.176600) can0 0DF80502#22430580F49573C0 (1410714938.179896) can0 0DF80502#23B931038C579302 (1410714938.182612) can0 0DF80502#240000000013FC0C (1410714938.185603) can0 0DF80502#2549008000AC0D00 (1410714938.188624) can0 0DF80502#260000FFFFFFFFFF (1410714938.191737) can0 09F80102#93719A16CC1AB80D (1410714938.223963) can0 09F80202#ECFC00000000FFFF (1410714938.248621) can0 09F80102#93719A16CC1AB80D (1410714938.279078) can0 0DF50B11#0195030000FFFFFF (1410714938.348597) can0 09F80102#93719A16CC1AB80D (1410714938.448542) can0 09F80102#93719A16CC1AB80D (1410714938.473566) can0 09F80202#EDFC00000000FFFF (1410714938.548518) can0 09F80102#93719A16CC1AB80D (1410714938.648493) can0 09F80102#93719A16CC1AB80D (1410714938.723933) can0 09F80202#EEFC00000000FFFF (1410714938.748469) can0 09F80102#93719A16CC1AB80D (1410714938.848414) can0 09F80102#93719A16CC1AB80D (1410714938.942957) can0 19F212B0#C0092D000064FFF4 (1410714938.943507) can0 19F212B0#C11B0800FFFFFFFF (1410714938.944086) can0 19F214B0#00EC04C5FF6D782D (1410714938.948389) can0 09F80102#93719A16CC1AB80D (1410714938.973444) can0 09F80202#EFFC00000000FFFF (1410714939.048334) can0 09F80102#93719A16CC1AB80D (1410714939.060419) can0 0DF01002#F0F0C73F80724324 (1410714939.063319) can0 19FA0302#F0D3490069006400 (1410714939.066370) can0 19FA0402#4093F0FD0C0B7F34 (1410714939.069300) can0 19FA0402#4165C6A111F1FFFF (1410714939.072291) can0 19FA0402#42FFF220673064D5 (1410714939.075312) can0 19FA0402#43D812EFFFFFFFF2 (1410714939.078425) can0 19FA0402#440E7F16B9207C11 (1410714939.081293) can0 19FA0402#45E3FFFFFFF2168B (1410714939.084284) can0 19FA0402#4609AD2DAF11E3FF (1410714939.087305) can0 19FA0402#47FFFFF201D0247C (1410714939.090388) can0 19FA0402#48D9CF13E7FFFFFF (1410714939.093287) can0 19FA0402#49F21B390A9574B0 (1410714939.096308) can0 19FA0402#4A100E000000F217 (1410714939.099299) can0 19FA0402#4BD106CE8DB4106F (1410714939.102442) can0 19FA0402#4CFFFFFFF2047314 (1410714939.105311) can0 19FA0402#4DAAD23412E3FFFF (1410714939.108302) can0 19FA0402#4EFFF21FE80AB84D (1410714939.111292) can0 19FA0402#4F44114C000000F2 (1410714939.114344) can0 19FA0402#501C1704C2C7750D (1410714939.117304) can0 19FA0402#51D1FFFFFFF213A2 (1410714939.120295) can0 19FA0402#521C2C8047122100 (1410714939.123286) can0 19FA0402#530000F214221513 (1410714939.126368) can0 19FA0402#54B8AC111D000000 (1410714939.133479) can0 19FA0402#55F2FFFFFFFFFFFF (1410714939.136286) can0 0DF80502#402FF0C73F807243 (1410714939.139277) can0 0DF80502#4124C0751E3CEB42 (1410714939.142420) can0 0DF80502#42430580F49573C0 (1410714939.145289) can0 0DF80502#43B931038C579302 (1410714939.148310) can0 0DF80502#440000000013FC0C (1410714939.151301) can0 0DF80502#4549008000AC0D00 (1410714939.154383) can0 0DF80502#460000FFFFFFFFFF (1410714939.157282) can0 09F80102#93719A16CC1AB80D (1410714939.184351) can0 09F80202#F1FC00000100FFFF (1410714939.209315) can0 09F80102#93719A16CC1AB80D (1410714939.225001) can0 1DEFFF01#000AE598B6060404 (1410714939.225581) can0 1DEFFF01#0100000002FFFFFF (1410714939.250422) can0 11F80E01#001B01985B620EB0 (1410714939.250971) can0 11F80E01#01C6C20DC0B89916 (1410714939.251521) can0 11F80E01#0204A5A40000D860 (1410714939.252100) can0 11F80E01#030CFFFFFF7F00FE (1410714939.280451) can0 0DF50B11#0192030000FFFFFF (1410714939.309290) can0 09F80102#93719A16CC1AB80D (1410714939.409235) can0 09F80102#93719A16CC1AB80D (1410714939.434443) can0 09F80202#F2FC00000100FFFF (1410714939.509211) can0 09F80102#93719A16CC1AB80D (1410714939.609187) can0 09F80102#93719A16CC1AB80D (1410714939.684168) can0 09F80202#F3FC00000100FFFF (1410714939.709345) can0 09F80102#93719A16CC1AB80D (1410714939.809199) can0 09F80102#93719A16CC1AB80D (1410714939.909235) can0 09F80102#93719A16CC1AB80D (1410714939.934412) can0 09F80202#F4FC00000100FFFF (1410714940.009180) can0 09F80102#93719A16CC1AB80D (1410714940.108332) can0 0DF01002#F5F0C73F90994324 (1410714940.110987) can0 19FA0302#F5D3490069006400 (1410714940.113978) can0 19FA0402#6093F5FD0C0B7F34 (1410714940.117121) can0 19FA0402#6165C6B211F2FFFF (1410714940.119959) can0 19FA0402#62FFF220673064D5 (1410714940.122980) can0 19FA0402#63FF12F0FFFFFFF2 (1410714940.125971) can0 19FA0402#640E7F16B920F911 (1410714940.129176) can0 19FA0402#65DEFFFFFFF2168B (1410714940.131953) can0 19FA0402#6609AD2DDA11E3FF (1410714940.134974) can0 19FA0402#67FFFFF201D0247C (1410714940.137965) can0 19FA0402#68D9A012E3FFFFFF (1410714940.141047) can0 19FA0402#69F21B390A9574C5 (1410714940.143977) can0 19FA0402#6A100B000000F217 (1410714940.146967) can0 19FA0402#6BD106CE8DB31066 (1410714940.149989) can0 19FA0402#6CFFFFFFF2047314 (1410714940.153132) can0 19FA0402#6DAAD20D12E6FFFF (1410714940.155970) can0 19FA0402#6EFFF21FE80AB84D (1410714940.158961) can0 19FA0402#6F75114F000000F2 (1410714940.161951) can0 19FA0402#701C1704C2C7AF0D (1410714940.165064) can0 19FA0402#71DDFFFFFFF213A2 (1410714940.167963) can0 19FA0402#721C2C8015122600 (1410714940.170954) can0 19FA0402#730000F214221513 (1410714940.173975) can0 19FA0402#74B82D1120000000 (1410714940.177210) can0 19FA0402#75F2FFFFFFFFFFFF (1410714940.179957) can0 0DF80502#602FF5C73F909943 (1410714940.182948) can0 0DF80502#6124C0751E3CEB42 (1410714940.185938) can0 0DF80502#62430580F49573C0 (1410714940.189295) can0 0DF80502#63B931038C579302 (1410714940.191981) can0 0DF80502#640000000013FC0C (1410714940.194971) can0 0DF80502#6549008000AC0D00 (1410714940.197993) can0 0DF80502#660000FFFFFFFFFF (1410714940.201044) can0 09F80102#93719A16CC1AB80D (1410714940.233179) can0 09F80202#F6FC00000500FFFF (1410714940.257960) can0 09F80102#93719A16CC1AB80D (1410714940.281947) can0 0DF50B11#0192030000FFFFFF (1410714940.357935) can0 09F80102#93719A16CC1AB80D (1410714940.442988) can0 19F212B0#E0093C000064FFF5 (1410714940.443568) can0 19F212B0#E11B0900FFFFFFFF (1410714940.444117) can0 19F214B0#00EC04C5FF6D783C (1410714940.457911) can0 09F80102#93719A16CC1AB80D (1410714940.482935) can0 09F80202#F7FC00000500FFFF (1410714940.557886) can0 09F80102#93719A16CC1AB80D (1410714940.584345) can0 11F80E01#201B0108975C0E40 (1410714940.584925) can0 11F80E01#219DC50DE0F59816 (1410714940.585474) can0 11F80E01#2205155E0000DA08 (1410714940.586024) can0 11F80E01#230136AF000000FE (1410714940.657832) can0 09F80102#93719A16CC1AB80D (1410714940.733210) can0 09F80202#F8FC00000500FFFF (1410714940.757807) can0 09F80102#93719A16CC1AB80D (1410714940.857783) can0 09F80102#93719A16CC1AB80D (1410714940.957758) can0 09F80102#93719A16CC1AB80D (1410714940.982783) can0 09F80202#F9FC00000500FFFF (1410714941.057734) can0 09F80102#93719A16CC1AB80D (1410714941.073176) can0 0DF01002#00F0C73FA0C04324 (1410714941.075770) can0 19FA0302#00D3490069006400 (1410714941.078699) can0 19FA0402#809300FD0C0B7F34 (1410714941.081690) can0 19FA0402#8165C69511F2FFFF (1410714941.084681) can0 19FA0402#82FFF220673064D5 (1410714941.087763) can0 19FA0402#838612F4FFFFFFF2 (1410714941.090693) can0 19FA0402#840E7F16B9200412 (1410714941.093684) can0 19FA0402#85E3FFFFFFF2168B (1410714941.096674) can0 19FA0402#8609AD2D0312E5FF (1410714941.099726) can0 19FA0402#87FFFFF201D0247C (1410714941.102686) can0 19FA0402#88D9D612E0FFFFFF (1410714941.105646) can0 19FA0402#89F21B390A9574DA (1410714941.108668) can0 19FA0402#8A1005000000F217 (1410714941.111689) can0 19FA0402#8BD106CE8DAB105C (1410714941.114680) can0 19FA0402#8CFFFFFFF2047314 (1410714941.117670) can0 19FA0402#8DAAD2E011E9FFFF (1410714941.120661) can0 19FA0402#8EFFF21FE80AB84D (1410714941.123865) can0 19FA0402#8F841159000000F2 (1410714941.126643) can0 19FA0402#901C1704C2C7B90D (1410714941.129664) can0 19FA0402#91D6FFFFFFF213A2 (1410714941.132655) can0 19FA0402#921C2C803A122300 (1410714941.136256) can0 19FA0402#930000F214221513 (1410714941.138667) can0 19FA0402#94B84C1121000000 (1410714941.141688) can0 19FA0402#95F2FFFFFFFFFFFF (1410714941.144678) can0 0DF80502#802F00C73FA0C043 (1410714941.147822) can0 0DF80502#8124C0751E3CEB42 (1410714941.150660) can0 0DF80502#82430580F49573C0 (1410714941.153651) can0 0DF80502#83B931038C579302 (1410714941.156672) can0 0DF80502#840000000013FC0C (1410714941.159724) can0 0DF80502#8549008000AC0D00 (1410714941.162684) can0 0DF80502#860000FFFFFFFFFF (1410714941.165644) can0 09F80102#93719A16CC1AB80D (1410714941.196711) can0 09F80202#01FC00000300FFFF (1410714941.221674) can0 09F80102#93719A16CC1AB80D (1410714941.283320) can0 0DF50B11#0192030000FFFFFF (1410714941.321619) can0 09F80102#93719A16CC1AB80D (1410714941.421595) can0 09F80102#93719A16CC1AB80D (1410714941.446650) can0 09F80202#02FC00000300FFFF (1410714941.521571) can0 09F80102#93719A16CC1AB80D (1410714941.621546) can0 09F80102#93719A16CC1AB80D (1410714941.696558) can0 09F80202#03FC00000300FFFF (1410714941.721522) can0 09F80102#93719A16CC1AB80D (1410714941.810694) can0 11F80E01#401B01A929C40C00 (1410714941.811243) can0 11F80E01#4133B90D80009A16 (1410714941.811793) can0 11F80E01#420C621400006A80 (1410714941.812373) can0 11F80E01#43007CCA000000FE (1410714941.821467) can0 09F80102#93719A16CC1AB80D (1410714941.921473) can0 09F80102#93719A16CC1AB80D (1410714941.942988) can0 19F212B0#00094B000064FFF5 (1410714941.943568) can0 19F212B0#011B9F04FFFFFFFF (1410714941.944117) can0 19F214B0#00E304C5FF6D784B (1410714941.946467) can0 09F80202#04FC00000300FFFF (1410714942.021448) can0 09F80102#93719A16CC1AB80D (1410714942.081141) can0 0DF01002#05F0C73FB0E74324 (1410714942.083369) can0 19FA0302#05D3490069006400 (1410714942.086420) can0 19FA0402#A09305FD0C0B7F34 (1410714942.089381) can0 19FA0402#A165C65F11000000 (1410714942.092341) can0 19FA0402#A200F220673064D5 (1410714942.095393) can0 19FA0402#A38412FDFFFFFFF2 (1410714942.098536) can0 19FA0402#A40E7F16B9200312 (1410714942.101344) can0 19FA0402#A5F1FFFFFFF2168B (1410714942.104365) can0 19FA0402#A609AD2DE711FCFF (1410714942.107355) can0 19FA0402#A7FFFFF201D0247C (1410714942.110468) can0 19FA0402#A8D92C13E7FFFFFF (1410714942.113337) can0 19FA0402#A9F21B390A9574C8 (1410714942.116358) can0 19FA0402#AA1008000000F217 (1410714942.119349) can0 19FA0402#ABD106CE8D9E106A (1410714942.122462) can0 19FA0402#ACFFFFFFF2047314 (1410714942.125361) can0 19FA0402#ADAAD2DC11FFFFFF (1410714942.128352) can0 19FA0402#AEFFF21FE80AB84D (1410714942.131342) can0 19FA0402#AF831166000000F2 (1410714942.134394) can0 19FA0402#B01C1704C2C7800D (1410714942.137690) can0 19FA0402#B1F5FFFFFFF213A2 (1410714942.140345) can0 19FA0402#B21C2C8068123000 (1410714942.143336) can0 19FA0402#B30000F214221513 (1410714942.146418) can0 19FA0402#B4B8121126000000 (1410714942.149378) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714942.152338) can0 0DF80502#A02F05C73FB0E743 (1410714942.155329) can0 0DF80502#A124C0751E3CEB42 (1410714942.158442) can0 0DF80502#A2430580F49573C0 (1410714942.159144) can0 11F80E01#601B03CBD7E825D0 (1410714942.159663) can0 11F80E01#618AC20D80559616 (1410714942.160242) can0 11F80E01#620CD03600000000 (1410714942.160792) can0 11F80E01#6308C29A000001FE (1410714942.161372) can0 0DF80502#A3B931038C579302 (1410714942.164362) can0 0DF80502#A40000000013FC0C (1410714942.167323) can0 0DF80502#A549008000AC0D00 (1410714942.170496) can0 0DF80502#A60000FFFFFFFFFF (1410714942.173334) can0 09F80102#93719A16CC1AB80D (1410714942.205378) can0 09F80202#06FC00000400FFFF (1410714942.230494) can0 09F80102#93719A16CC1AB80D (1410714942.284754) can0 0DF50B11#0192030000FFFFFF (1410714942.330500) can0 09F80102#93719A16CC1AB80D (1410714942.430506) can0 09F80102#93719A16CC1AB80D (1410714942.455317) can0 09F80202#07FC00000400FFFF (1410714942.530512) can0 09F80102#93719A16CC1AB80D (1410714942.630488) can0 09F80102#93719A16CC1AB80D (1410714942.705225) can0 09F80202#08FC00000400FFFF (1410714942.730555) can0 09F80102#93719A16CC1AB80D (1410714942.830500) can0 09F80102#93719A16CC1AB80D (1410714942.930506) can0 09F80102#93719A16CC1AB80D (1410714942.955134) can0 09F80202#09FC00000400FFFF (1410714943.030482) can0 09F80102#93719A16CC1AB80D (1410714943.089686) can0 0DF01002#0AF0C73FC00E4424 (1410714943.092036) can0 19FA0302#0AD3490069006400 (1410714943.095026) can0 19FA0402#C0930AFD0C0B7F34 (1410714943.098048) can0 19FA0402#C165C63B12000000 (1410714943.101069) can0 19FA0402#C200F220673064D5 (1410714943.104060) can0 19FA0402#C30613F9FFFFFFF2 (1410714943.107050) can0 19FA0402#C40E7F16B9200012 (1410714943.110041) can0 19FA0402#C5F8FFFFFFF2168B (1410714943.113154) can0 19FA0402#C609AD2DF411FEFF (1410714943.134791) can0 19FA0402#C7FFFFF201D0247C (1410714943.137080) can0 19FA0402#C8D93812F3FFFFFF (1410714943.141169) can0 19FA0402#C9F21B390A9574B9 (1410714943.144038) can0 19FA0402#CA100C000000F217 (1410714943.147883) can0 19FA0402#CBD106CE8DA51067 (1410714943.150019) can0 19FA0402#CCFFFFFFF2047314 (1410714943.153315) can0 19FA0402#CDAAD27311F8FFFF (1410714943.156031) can0 19FA0402#CEFFF21FE80AB84D (1410714943.159022) can0 19FA0402#CF8D1163000000F2 (1410714943.162012) can0 19FA0402#D01C1704C2C7E90C (1410714943.165095) can0 19FA0402#D1E9FFFFFFF213A2 (1410714944.449641) can0 09F80102#93719A16CC1AB80D (1410714944.474665) can0 09F80202#11FC00000600FFFF (1410714944.549616) can0 09F80102#93719A16CC1AB80D (1410714944.649592) can0 09F80102#93719A16CC1AB80D (1410714944.724573) can0 09F80202#12FC00000600FFFF (1410714944.749537) can0 09F80102#93719A16CC1AB80D (1410714944.849512) can0 09F80102#93719A16CC1AB80D (1410714944.943018) can0 19F212B0#400969000064FFF5 (1410714944.943568) can0 19F212B0#411B0900FFFFFFFF (1410714944.944117) can0 19F214B0#00EC04C5FF6D7869 (1410714944.949519) can0 09F80102#93719A16CC1AB80D (1410714944.974512) can0 09F80202#13FC00000600FFFF (1410714945.049494) can0 09F80102#93719A16CC1AB80D (1410714945.060328) can0 0DF01002#14F0C73FE05C4424 (1410714945.062495) can0 19FA0302#14D3490069006400 (1410714945.065455) can0 19FA0402#009314FD0C0B7F34 (1410714945.068415) can0 19FA0402#0165C6EE11F4FFFF (1410714945.071741) can0 19FA0402#02FFF220673064D5 (1410714945.074427) can0 19FA0402#03E212E2FFFFFFF2 (1410714945.077448) can0 19FA0402#040E7F16B9205511 (1410714945.080408) can0 19FA0402#05F2FFFFFFF2168B (1410714945.083887) can0 19FA0402#0609AD2D6611EBFF (1410714945.086451) can0 19FA0402#07FFFFF201D0247C (1410714945.089442) can0 19FA0402#08D98C13DBFFFFFF (1410714945.092402) can0 19FA0402#09F21B390A957498 (1410714945.095850) can0 19FA0402#0A1007000000F217 (1410714945.098475) can0 19FA0402#0BD106CE8D991065 (1410714945.101435) can0 19FA0402#0CFFFFFFF2047314 (1410714945.104395) can0 19FA0402#0DAAD28D12EBFFFF (1410714945.107783) can0 19FA0402#0EFFF21FE80AB84D (1410714945.110499) can0 19FA0402#0FB51149000000F2 (1410714945.113398) can0 19FA0402#101C1704C2C7190D (1410714945.116419) can0 19FA0402#11C8FFFFFFF213A2 (1410714945.119410) can0 19FA0402#121C2C8015122900 (1410714945.122462) can0 19FA0402#130000F214221513 (1410714945.125391) can0 19FA0402#14B8141117000000 (1410714945.128413) can0 19FA0402#15F2FFFFFFFFFFFF (1410714945.131403) can0 0DF80502#002F14C73FE05C44 (1410714945.134425) can0 0DF80502#0124C0751E3CEB42 (1410714945.137415) can0 0DF80502#02430580F49573C0 (1410714945.140406) can0 0DF80502#03B931038C579302 (1410714945.143427) can0 0DF80502#040000000013FC0C (1410714945.146448) can0 0DF80502#0549008000AC0D00 (1410714945.149439) can0 0DF80502#060000FFFFFFFFFF (1410714945.152399) can0 09F80102#93719A16CC1AB80D (1410714945.184443) can0 09F80202#15FC00000200FFFF (1410714945.209620) can0 09F80102#93719A16CC1AB80D (1410714945.289332) can0 0DF50B11#018F030000FFFFFF (1410714945.309382) can0 09F80102#93719A16CC1AB80D (1410714945.409357) can0 09F80102#93719A16CC1AB80D (1410714945.434504) can0 09F80202#16FC00000200FFFF (1410714945.509302) can0 09F80102#93719A16CC1AB80D (1410714945.609278) can0 09F80102#93719A16CC1AB80D (1410714945.684290) can0 09F80202#17FC00000200FFFF (1410714945.709254) can0 09F80102#93719A16CC1AB80D (1410714945.809260) can0 09F80102#93719A16CC1AB80D (1410714945.909266) can0 09F80102#93719A16CC1AB80D (1410714945.934504) can0 09F80202#18FC00000200FFFF (1410714946.009241) can0 09F80102#93719A16CC1AB80D (1410714946.069239) can0 0DF01002#19F0C73FF0834424 (1410714946.072138) can0 19FA0302#19D3490069006400 (1410714946.075098) can0 19FA0402#209319FD0C0B7F34 (1410714946.078455) can0 19FA0402#2165C66712FCFFFF (1410714946.081110) can0 19FA0402#22FFF220673064D5 (1410714946.084132) can0 19FA0402#23A512EFFFFFFFF2 (1410714946.087092) can0 19FA0402#240E7F16B9206D11 (1410714946.090540) can0 19FA0402#2505000000F2168B (1410714946.093165) can0 19FA0402#2609AD2D4511F5FF (1410714946.096125) can0 19FA0402#27FFFFF201D0247C (1410714946.099116) can0 19FA0402#28D98A13E6FFFFFF (1410714946.102503) can0 19FA0402#29F21B390A957497 (1410714946.105128) can0 19FA0402#2A100F000000F217 (1410714946.108118) can0 19FA0402#2BD106CE8D9F1072 (1410714946.111109) can0 19FA0402#2CFFFFFFF2047314 (1410714946.114405) can0 19FA0402#2DAAD22312000000 (1410714946.117121) can0 19FA0402#2E00F21FE80AB84D (1410714946.120142) can0 19FA0402#2FE7114D000000F2 (1410714946.123072) can0 19FA0402#301C1704C2C7EF0C (1410714946.126398) can0 19FA0402#31EEFFFFFFF213A2 (1410714946.129206) can0 19FA0402#321C2C80A5113100 (1410714946.132105) can0 19FA0402#330000F214221513 (1410714946.135096) can0 19FA0402#34B82A1129000000 (1410714946.138483) can0 19FA0402#35F2FFFFFFFFFFFF (1410714946.141108) can0 0DF80502#202F19C73FF08344 (1410714946.144068) can0 0DF80502#2124C0751E3CEB42 (1410714946.147059) can0 0DF80502#22430580F49573C0 (1410714946.150446) can0 0DF80502#23B931038C579302 (1410714946.153193) can0 0DF80502#240000000013FC0C (1410714946.156092) can0 0DF80502#2549008000AC0D00 (1410714946.159113) can0 0DF80502#260000FFFFFFFFFF (1410714946.162073) can0 09F80102#93719A16CC1AB80D (1410714946.193232) can0 09F80202#1AFC00000200FFFF (1410714946.218439) can0 09F80102#93719A16CC1AB80D (1410714946.318049) can0 09F80102#93719A16CC1AB80D (1410714946.390955) can0 0DF50B11#018F030000FFFFFF (1410714946.418024) can0 09F80102#93719A16CC1AB80D (1410714946.443049) can0 09F80202#1BFC00000200FFFF (1410714946.443598) can0 19F212B0#600978000064FFEF (1410714946.444178) can0 19F212B0#611B0A00FFFFFFFF (1410714946.444727) can0 19F214B0#00EC04C6FF5C7878 (1410714946.518000) can0 09F80102#93719A16CC1AB80D (1410714946.557612) can0 11F80E01#A01B0132D74A10D0 (1410714946.558161) can0 11F80E01#A154E30DA0489116 (1410714946.558710) can0 11F80E01#A21ADFBD86011C01 (1410714946.559260) can0 11F80E01#A300E5BE000000FE (1410714946.617976) can0 09F80102#93719A16CC1AB80D (1410714946.693232) can0 09F80202#1CFC00000200FFFF (1410714946.717921) can0 09F80102#93719A16CC1AB80D (1410714946.817896) can0 09F80102#93719A16CC1AB80D (1410714946.917872) can0 09F80102#93719A16CC1AB80D (1410714946.942896) can0 09F80202#1DFC00000200FFFF (1410714947.017817) can0 09F80102#93719A16CC1AB80D (1410714947.078638) can0 0DF01002#1EF0C73F00AB4424 (1410714947.081110) can0 19FA0302#1ED3490069006400 (1410714947.083948) can0 19FA0402#40931EFD0C0B7F34 (1410714947.086817) can0 19FA0402#4165C6F211FEFFFF (1410714947.089777) can0 19FA0402#42FFF220673064D5 (1410714947.093165) can0 19FA0402#432513EDFFFFFFF2 (1410714947.095911) can0 19FA0402#440E7F16B920B511 (1410714947.098811) can0 19FA0402#45FDFFFFFFF2168B (1410714947.101771) can0 19FA0402#4609AD2D4C11FFFF (1410714947.105097) can0 19FA0402#47FFFFF201D0247C (1410714947.107874) can0 19FA0402#48D92113EAFFFFFF (1410714947.110804) can0 19FA0402#49F21B390A9574BB (1410714947.113764) can0 19FA0402#4A1009000000F217 (1410714947.117091) can0 19FA0402#4BD106CE8DC21067 (1410714947.119807) can0 19FA0402#4CFFFFFFF2047314 (1410714947.122797) can0 19FA0402#4DAAD27D12010000 (1410714947.125758) can0 19FA0402#4E00F21FE80AB84D (1410714947.129176) can0 19FA0402#4F311249000000F2 (1410714947.131800) can0 19FA0402#501C1704C2C7CD0C (1410714947.134791) can0 19FA0402#51E5FFFFFFF213A2 (1410714947.137751) can0 19FA0402#521C2C8043122A00 (1410714947.141077) can0 19FA0402#530000F214221513 (1410714947.144007) can0 19FA0402#54B8F11023000000 (1410714947.146815) can0 19FA0402#55F2FFFFFFFFFFFF (1410714947.149775) can0 0DF80502#402F1EC73F00AB44 (1410714947.153132) can0 0DF80502#4124C0751E3CEB42 (1410714947.155878) can0 0DF80502#42430580F49573C0 (1410714947.158747) can0 0DF80502#43B931038C579302 (1410714947.161768) can0 0DF80502#440000000013FC0C (1410714947.164759) can0 0DF80502#4549008000AC0D00 (1410714947.167872) can0 0DF80502#460000FFFFFFFFFF (1410714947.170740) can0 09F80102#93719A16CC1AB80D (1410714947.202845) can0 09F80202#1FFC00000200FFFF (1410714947.227930) can0 09F80102#93719A16CC1AB80D (1410714947.327875) can0 09F80102#93719A16CC1AB80D (1410714947.392542) can0 0DF50B11#0192030000FFFFFF (1410714947.427882) can0 09F80102#93719A16CC1AB80D (1410714947.452723) can0 09F80202#20FC00000200FFFF (1410714947.527888) can0 09F80102#93719A16CC1AB80D (1410714947.627894) can0 09F80102#93719A16CC1AB80D (1410714947.702662) can0 09F80202#21FC00000200FFFF (1410714947.727900) can0 09F80102#93719A16CC1AB80D (1410714947.827906) can0 09F80102#93719A16CC1AB80D (1410714947.927912) can0 09F80102#93719A16CC1AB80D (1410714947.943049) can0 19F212B0#800987000064FFF7 (1410714947.943598) can0 19F212B0#811B0A00FFFFFFFF (1410714947.944178) can0 19F214B0#00EC04C5FF6D7887 (1410714947.952601) can0 09F80202#22FC00000200FFFF (1410714948.027949) can0 09F80102#93719A16CC1AB80D (1410714948.091395) can0 0DF01002#23F0C73F10D24424 (1410714948.093500) can0 19FA0302#23D3490069006400 (1410714948.096461) can0 19FA0402#609323FD0C0B7F34 (1410714948.099787) can0 19FA0402#6165C63312030000 (1410714948.102503) can0 19FA0402#6200F220673064D5 (1410714948.105494) can0 19FA0402#63A412F6FFFFFFF2 (1410714948.108454) can0 19FA0402#640E7F16B920A511 (1410714948.111811) can0 19FA0402#65FDFFFFFFF2168B (1410714948.114466) can0 19FA0402#6609AD2D1F110200 (1410714948.117487) can0 19FA0402#670000F201D0247C (1410714948.120478) can0 19FA0402#68D91413EFFFFFFF (1410714948.123927) can0 19FA0402#69F21B390A9574C5 (1410714948.126459) can0 19FA0402#6A1008000000F217 (1410714948.129481) can0 19FA0402#6BD106CE8DF1106A (1410714948.132471) can0 19FA0402#6CFFFFFFF2047314 (1410714948.135920) can0 19FA0402#6DAAD20E12000000 (1410714948.138514) can0 19FA0402#6E00F21FE80AB84D (1410714948.141474) can0 19FA0402#6F2F1245000000F2 (1410714948.144434) can0 19FA0402#701C1704C2C7A80C (1410714948.147822) can0 19FA0402#71E2FFFFFFF213A2 (1410714948.150507) can0 19FA0402#721C7D7FC1112900 (1410714948.153468) can0 19FA0402#730000F214221513 (1410714948.156458) can0 19FA0402#74B89E111E000000 (1410714948.159815) can0 19FA0402#75F2FFFFFFFFFFFF (1410714948.162501) can0 0DF80502#602F23C73F10D244 (1410714948.165461) can0 0DF80502#6124C0751E3CEB42 (1410714948.168421) can0 0DF80502#62430580F49573C0 (1410714948.171778) can0 0DF80502#63B931038C579302 (1410714948.174464) can0 0DF80502#640000000013FC0C (1410714948.177454) can0 0DF80502#6549008000AC0D00 (1410714948.180476) can0 0DF80502#660000FFFFFFFFFF (1410714948.183436) can0 09F80102#93719A16CC1AB80D (1410714948.215968) can0 09F80202#24FC00000300FFFF (1410714948.240443) can0 09F80102#93719A16CC1AB80D (1410714948.290583) can0 11F80E01#C01B01985B620E30 (1410714948.291132) can0 11F80E01#C1C7C20D40B89916 (1410714948.291682) can0 11F80E01#C228A5A400005D01 (1410714948.292261) can0 11F80E01#C300FFFFFF7F00FE (1410714948.340418) can0 09F80102#93719A16CC1AB80D (1410714948.394007) can0 0DF50B11#0192030000FFFFFF (1410714948.440394) can0 09F80102#93719A16CC1AB80D (1410714948.465418) can0 09F80202#25FC00000300FFFF (1410714948.540339) can0 09F80102#93719A16CC1AB80D (1410714948.640314) can0 09F80102#93719A16CC1AB80D (1410714948.715907) can0 09F80202#26FC00000300FFFF (1410714948.740290) can0 09F80102#93719A16CC1AB80D (1410714948.840266) can0 09F80102#93719A16CC1AB80D (1410714948.940211) can0 09F80102#93719A16CC1AB80D (1410714948.965235) can0 09F80202#27FC00000300FFFF (1410714949.040217) can0 09F80102#93719A16CC1AB80D (1410714949.099909) can0 0DF01002#28F0C73F20F94424 (1410714949.102595) can0 19FA0302#28D3490069006400 (1410714949.105128) can0 19FA0402#809328FD0C0B7F34 (1410714949.108179) can0 19FA0402#8165C68812FCFFFF (1410714949.111140) can0 19FA0402#82FFF220673064D5 (1410714949.114466) can0 19FA0402#839E12FBFFFFFFF2 (1410714949.117121) can0 19FA0402#840E7F16B9209211 (1410714949.120173) can0 19FA0402#8506000000F2168B (1410714949.123133) can0 19FA0402#8609AD2DBC100200 (1410714949.126459) can0 19FA0402#870000F201D0247C (1410714949.129237) can0 19FA0402#88D94413EFFFFFFF (1410714949.132166) can0 19FA0402#89F21B390A9574C3 (1410714949.135157) can0 19FA0402#8A100A000000F217 (1410714949.138575) can0 19FA0402#8BD106CE8DDE1076 (1410714949.141138) can0 19FA0402#8CFFFFFFF2047314 (1410714949.144160) can0 19FA0402#8DAAD2E311FEFFFF (1410714949.147120) can0 19FA0402#8EFFF21FE80AB84D (1410714949.150507) can0 19FA0402#8F141247000000F2 (1410714949.153254) can0 19FA0402#901C1704C2C7C90C (1410714949.156153) can0 19FA0402#91EDFFFFFFF213A2 (1410714949.159113) can0 19FA0402#921C7D7F5D122A00 (1410714949.162531) can0 19FA0402#930000F214221513 (1410714949.165125) can0 19FA0402#94B86F1127000000 (1410714949.168177) can0 19FA0402#95F2FFFFFFFFFFFF (1410714949.171137) can0 0DF80502#802F28C73F20F944 (1410714949.174433) can0 0DF80502#8124C0751E3CEB42 (1410714949.177149) can0 0DF80502#82430580F49573C0 (1410714949.180140) can0 0DF80502#83B931038C579302 (1410714949.183131) can0 0DF80502#840000000013FC0C (1410714949.186457) can0 0DF80502#8549008000AC0D00 (1410714949.189265) can0 0DF80502#860000FFFFFFFFFF (1410714949.192133) can0 09F80102#93719A16CC1AB80D (1410714949.224207) can0 09F80202#29FC00000000FFFF (1410714949.224757) can0 1DEFFF01#400AE598B6060404 (1410714949.225336) can0 1DEFFF01#4100000002FFFFFF (1410714949.249293) can0 09F80102#93719A16CC1AB80D (1410714949.349299) can0 09F80102#93719A16CC1AB80D (1410714949.395441) can0 0DF50B11#0192030000FFFFFF (1410714949.443323) can0 19F212B0#A00996000064FFF7 (1410714949.443903) can0 19F212B0#A11B0900FFFFFFFF (1410714949.444453) can0 19F214B0#00EC04C5FF6D7896 (1410714949.449305) can0 09F80102#93719A16CC1AB80D (1410714949.474116) can0 09F80202#2AFC00000000FFFF (1410714949.549281) can0 09F80102#93719A16CC1AB80D (1410714949.649287) can0 09F80102#93719A16CC1AB80D (1410714949.724024) can0 09F80202#2BFC00000000FFFF (1410714949.749293) can0 09F80102#93719A16CC1AB80D (1410714949.810633) can0 11F80E01#E01B03680A5C0E30 (1410714949.811182) can0 11F80E01#E1EAC20D00AA9916 (1410714949.811762) can0 11F80E01#E22841EA00000000 (1410714949.812312) can0 11F80E01#E308F1A2000005FE (1410714949.849268) can0 09F80102#93719A16CC1AB80D (1410714949.949610) can0 09F80102#93719A16CC1AB80D (1410714949.973933) can0 09F80202#2CFC00000000FFFF (1410714950.049281) can0 09F80102#93719A16CC1AB80D (1410714950.109858) can0 0DF01002#2DF0C73F30204524 (1410714950.113154) can0 19FA0302#2DD3490069006400 (1410714950.115931) can0 19FA0402#A0932DFD0C0B7F34 (1410714950.118861) can0 19FA0402#A165C6D511FAFFFF (1410714950.121821) can0 19FA0402#A2FFF220673064D5 (1410714950.125117) can0 19FA0402#A36512F7FFFFFFF2 (1410714950.127894) can0 19FA0402#A40E7F16B920A711 (1410714950.130854) can0 19FA0402#A501000000F2168B (1410714950.133814) can0 19FA0402#A609AD2DBB100A00 (1410714950.137110) can0 19FA0402#A70000F201D0247C (1410714950.139857) can0 19FA0402#A8D94813EDFFFFFF (1410714950.142817) can0 19FA0402#A9F21B390A9574DA (1410714950.145838) can0 19FA0402#AA1006000000F217 (1410714950.149226) can0 19FA0402#ABD106CE8DDA1078 (1410714950.151911) can0 19FA0402#ACFFFFFFF2047314 (1410714950.154841) can0 19FA0402#ADAAD23912ECFFFF (1410714950.157801) can0 19FA0402#AEFFF21FE80AB84D (1410714950.161097) can0 19FA0402#AF0E1244000000F2 (1410714950.163935) can0 19FA0402#B01C1704C2C7F30C (1410714950.166834) can0 19FA0402#B1F8FFFFFFF213A2 (1410714950.169794) can0 19FA0402#B21C7D7F23122900 (1410714950.173121) can0 19FA0402#B30000F214221513 (1410714950.175959) can0 19FA0402#B4B8541125000000 (1410714950.178889) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714950.181788) can0 0DF80502#A02F2DC73F302045 (1410714950.184443) can0 11F80E01#001B0108975C0EA0 (1410714950.184992) can0 11F80E01#019CC50D80F69816 (1410714950.185542) can0 0DF80502#A124C0751E3CEB42 (1410714950.186091) can0 11F80E01#0225725F0000A481 (1410714950.186671) can0 11F80E01#030836AF000000FE (1410714950.187891) can0 0DF80502#A2430580F49573C0 (1410714950.190821) can0 0DF80502#A3B931038C579302 (1410714950.193812) can0 0DF80502#A40000000013FC0C (1410714950.197108) can0 0DF80502#A549008000AC0D00 (1410714950.199854) can0 0DF80502#A60000FFFFFFFFFF (1410714950.202814) can0 09F80102#93719A16CC1AB80D (1410714950.233851) can0 09F80202#2EFC00000300FFFF (1410714950.258845) can0 09F80102#93719A16CC1AB80D (1410714950.358790) can0 09F80102#93719A16CC1AB80D (1410714950.396876) can0 0DF50B11#0192030000FFFFFF (1410714950.458765) can0 09F80102#93719A16CC1AB80D (1410714950.484003) can0 09F80202#2FFC00000300FFFF (1410714950.558710) can0 09F80102#93719A16CC1AB80D (1410714950.658686) can0 09F80102#93719A16CC1AB80D (1410714950.733698) can0 09F80202#30FC00000300FFFF (1410714950.758662) can0 09F80102#93719A16CC1AB80D (1410714950.858637) can0 09F80102#93719A16CC1AB80D (1410714950.943079) can0 19F212B0#C009A5000064FFF8 (1410714950.943659) can0 19F212B0#C11B0A00FFFFFFFF (1410714950.944209) can0 19F214B0#00EC04C5FF6D78A5 (1410714950.958613) can0 09F80102#93719A16CC1AB80D (1410714950.984064) can0 09F80202#31FC00000300FFFF (1410714951.058619) can0 09F80102#93719A16CC1AB80D (1410714951.079340) can0 0DF01002#32F0C73F40474524 (1410714951.081568) can0 19FA0302#32D3490069006400 (1410714951.084528) can0 19FA0402#C09332FD0C0B7F34 (1410714951.087916) can0 19FA0402#C165C65812FBFFFF (1410714951.090571) can0 19FA0402#C2FFF220673064D5 (1410714951.093562) can0 19FA0402#C3451202000000F2 (1410714951.096522) can0 19FA0402#C40E7F16B9208311 (1410714951.099848) can0 19FA0402#C505000000F2168B (1410714951.102595) can0 19FA0402#C609AD2D1C110900 (1410714951.105555) can0 19FA0402#C70000F201D0247C (1410714951.108515) can0 19FA0402#C8D91413F3FFFFFF (1410714951.111903) can0 19FA0402#C9F21B390A9574B8 (1410714951.114497) can0 19FA0402#CA100D000000F217 (1410714951.117518) can0 19FA0402#CBD106CE8DEF1072 (1410714951.120509) can0 19FA0402#CCFFFFFFF2047314 (1410714951.123957) can0 19FA0402#CDAAD24312EFFFFF (1410714951.126490) can0 19FA0402#CEFFF21FE80AB84D (1410714951.129542) can0 19FA0402#CF041249000000F2 (1410714951.132502) can0 19FA0402#D01C1704C2C7500D (1410714951.135950) can0 19FA0402#D1E1FFFFFFF213A2 (1410714951.138544) can0 19FA0402#D21C7D7F5C122D00 (1410714951.141535) can0 19FA0402#D30000F214221513 (1410714951.144495) can0 19FA0402#D4B87E1124000000 (1410714951.147913) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714951.150538) can0 0DF80502#C02F32C73F404745 (1410714951.153529) can0 0DF80502#C124C0751E3CEB42 (1410714951.156489) can0 0DF80502#C2430580F49573C0 (1410714951.159846) can0 0DF80502#C3B931038C579302 (1410714951.162592) can0 0DF80502#C40000000013FC0C (1410714951.165522) can0 0DF80502#C549008000AC0D00 (1410714951.168513) can0 0DF80502#C60000FFFFFFFFFF (1410714951.171870) can0 09F80102#93719A16CC1AB80D (1410714951.204005) can0 09F80202#33FC00000100FFFF (1410714951.228510) can0 09F80102#93719A16CC1AB80D (1410714951.328486) can0 09F80102#93719A16CC1AB80D (1410714951.398371) can0 0DF50B11#018F030000FFFFFF (1410714951.428431) can0 09F80102#93719A16CC1AB80D (1410714951.453486) can0 09F80202#34FC00000100FFFF (1410714951.528407) can0 09F80102#93719A16CC1AB80D (1410714951.628382) can0 09F80102#93719A16CC1AB80D (1410714951.703394) can0 09F80202#35FC00000100FFFF (1410714951.728358) can0 09F80102#93719A16CC1AB80D (1410714951.828303) can0 09F80102#93719A16CC1AB80D (1410714951.928278) can0 09F80102#93719A16CC1AB80D (1410714951.953303) can0 09F80202#36FC00000100FFFF (1410714952.028254) can0 09F80102#93719A16CC1AB80D (1410714952.091914) can0 0DF01002#37F0C73F506E4524 (1410714952.094508) can0 19FA0302#37D3490069006400 (1410714952.097193) can0 19FA0402#E09337FD0C0B7F34 (1410714952.100214) can0 19FA0402#E165C61612FCFFFF (1410714952.103205) can0 19FA0402#E2FFF220673064D5 (1410714952.106501) can0 19FA0402#E39A1207000000F2 (1410714952.109278) can0 19FA0402#E40E7F16B9209F11 (1410714952.112208) can0 19FA0402#E5FEFFFFFFF2168B (1410714952.115168) can0 19FA0402#E609AD2D3D110E00 (1410714952.118555) can0 19FA0402#E70000F201D0247C (1410714952.121180) can0 19FA0402#E8D90A13F8FFFFFF (1410714952.124201) can0 19FA0402#E9F21B390A9574A4 (1410714952.127192) can0 19FA0402#EA1012000000F217 (1410714952.130549) can0 19FA0402#EBD106CE8DEB1072 (1410714952.133204) can0 19FA0402#ECFFFFFFF2047314 (1410714952.136195) can0 19FA0402#EDAAD28511ECFFFF (1410714952.139185) can0 19FA0402#EEFFF21FE80AB84D (1410714952.142634) can0 19FA0402#EF90114C000000F2 (1410714952.145167) can0 19FA0402#F01C1704C2C7850D (1410714952.148219) can0 19FA0402#F1D1FFFFFFF213A2 (1410714952.151179) can0 19FA0402#F21C7D7F5D122D00 (1410714952.154475) can0 19FA0402#F30000F214221513 (1410714952.157191) can0 19FA0402#F4B8751127000000 (1410714952.160242) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714952.163172) can0 0DF80502#E02F37C73F506E45 (1410714952.166468) can0 0DF80502#E124C0751E3CEB42 (1410714952.169245) can0 0DF80502#E2430580F49573C0 (1410714952.172205) can0 0DF80502#E3B931038C579302 (1410714952.175196) can0 0DF80502#E40000000013FC0C (1410714952.178614) can0 0DF80502#E549008000AC0D00 (1410714952.181208) can0 0DF80502#E60000FFFFFFFFFF (1410714952.184199) can0 09F80102#93719A16CC1AB80D (1410714952.216242) can0 09F80202#38FC00000400FFFF (1410714952.241206) can0 09F80102#93719A16CC1AB80D (1410714952.341181) can0 09F80102#93719A16CC1AB80D (1410714952.399866) can0 0DF50B11#018F030000FFFFFF (1410714952.441187) can0 09F80102#93719A16CC1AB80D (1410714952.443415) can0 19F212B0#E009B4000064FFF8 (1410714952.443964) can0 19F212B0#E11B0A00FFFFFFFF (1410714952.444514) can0 19F214B0#00EC04C5FF6D78B4 (1410714952.466151) can0 09F80202#39FC00000400FFFF (1410714952.541193) can0 09F80102#93719A16CC1AB80D (1410714952.637110) can0 11F80E01#201B01A929C40C40 (1410714952.637659) can0 11F80E01#2132B90DE0009A16 (1410714952.638209) can0 11F80E01#22386D2E0000DB08 (1410714952.638758) can0 11F80E01#23097CCA000000FE (1410714952.641199) can0 09F80102#93719A16CC1AB80D (1410714952.716059) can0 09F80202#3AFC00000400FFFF (1410714952.741206) can0 09F80102#93719A16CC1AB80D (1410714952.841212) can0 09F80102#93719A16CC1AB80D (1410714952.941187) can0 09F80102#93719A16CC1AB80D (1410714952.965998) can0 09F80202#3BFC00000400FFFF (1410714953.041193) can0 09F80102#93719A16CC1AB80D (1410714953.100031) can0 0DF01002#3CF0C73F60954524 (1410714953.102930) can0 19FA0302#3CD3490069006400 (1410714953.105891) can0 19FA0402#00933CFD0C0B7F34 (1410714953.109309) can0 19FA0402#0165C6F411FEFFFF (1410714953.111933) can0 19FA0402#02FFF220673064D5 (1410714953.114893) can0 19FA0402#03131209000000F2 (1410714953.117884) can0 19FA0402#040E7F16B9202112 (1410714953.121180) can0 19FA0402#05FFFFFFFFF2168B (1410714953.123988) can0 19FA0402#0609AD2D23110F00 (1410714953.126917) can0 19FA0402#070000F201D0247C (1410714953.129877) can0 19FA0402#08D94113F8FFFFFF (1410714953.133173) can0 19FA0402#09F21B390A9574B7 (1410714953.136134) can0 19FA0402#0A1012000000F217 (1410714953.138880) can0 19FA0402#0BD106CE8DA71084 (1410714953.141871) can0 19FA0402#0CFFFFFFF2047314 (1410714953.145167) can0 19FA0402#0DAAD28811EEFFFF (1410714953.148005) can0 19FA0402#0EFFF21FE80AB84D (1410714953.150904) can0 19FA0402#0F6D1153000000F2 (1410714953.153864) can0 19FA0402#101C1704C2C7570D (1410714953.157160) can0 19FA0402#11E9FFFFFFF213A2 (1410714953.159907) can0 19FA0402#121C7D7F03123200 (1410714953.162897) can0 19FA0402#130000F214221513 (1410714953.165858) can0 19FA0402#14B845112B000000 (1410714953.169276) can0 19FA0402#15F2FFFFFFFFFFFF (1410714953.171931) can0 0DF80502#002F3CC73F609545 (1410714953.174891) can0 0DF80502#0124C0751E3CEB42 (1410714953.177851) can0 0DF80502#02430580F49573C0 (1410714953.181147) can0 0DF80502#03B931038C579302 (1410714953.184046) can0 0DF80502#040000000013FC0C (1410714953.186884) can0 0DF80502#0549008000AC0D00 (1410714953.189875) can0 0DF80502#060000FFFFFFFFFF (1410714953.193140) can0 09F80102#93719A16CC1AB80D (1410714953.224085) can0 09F80202#3DFC00000200FFFF (1410714953.249293) can0 09F80102#93719A16CC1AB80D (1410714953.349268) can0 09F80102#93719A16CC1AB80D (1410714953.401881) can0 0DF50B11#018F030000FFFFFF (1410714953.448817) can0 09F80102#93719A16CC1AB80D (1410714953.473811) can0 09F80202#3EFC00000200FFFF (1410714953.548762) can0 09F80102#93719A16CC1AB80D (1410714953.648737) can0 09F80102#93719A16CC1AB80D (1410714953.724085) can0 09F80202#3FFC00000200FFFF (1410714953.748713) can0 09F80102#93719A16CC1AB80D (1410714953.848688) can0 09F80102#93719A16CC1AB80D (1410714953.943171) can0 19F212B0#0009C3000064FFE1 (1410714953.943720) can0 19F212B0#011B0A00FFFFFFFF (1410714953.944270) can0 19F214B0#00EC04C5FF6878C3 (1410714953.948664) can0 09F80102#93719A16CC1AB80D (1410714953.973658) can0 09F80202#40FC00000200FFFF (1410714954.048609) can0 09F80102#93719A16CC1AB80D (1410714954.078120) can0 0DF01002#41F0C73F70BC4524 (1410714954.080592) can0 19FA0302#41D3490069006400 (1410714954.084010) can0 19FA0402#209341FD0C0B7F34 (1410714954.086573) can0 19FA0402#2165C6C611FBFFFF (1410714954.089594) can0 19FA0402#22FFF220673064D5 (1410714954.092585) can0 19FA0402#237912FFFFFFFFF2 (1410714954.096125) can0 19FA0402#240E7F16B920DE11 (1410714954.098627) can0 19FA0402#25F7FFFFFFF216DC (1410714954.101588) can0 19FA0402#2608AD2DB4100500 (1410714954.104578) can0 19FA0402#270000F201D0247C (1410714954.107996) can0 19FA0402#28D98913EBFFFFFF (1410714954.110560) can0 19FA0402#29F21B390A957477 (1410714954.113581) can0 19FA0402#2A100E000000F217 (1410714954.116541) can0 19FA0402#2BD106CE8D98108D (1410714954.119898) can0 19FA0402#2CFFFFFFF2047314 (1410714954.122614) can0 19FA0402#2DAAD2C411EFFFFF (1410714954.125574) can0 19FA0402#2EFFF21FE80AB84D (1410714954.128565) can0 19FA0402#2F691157000000F2 (1410714954.131953) can0 19FA0402#301C1704C2C74C0D (1410714954.134547) can0 19FA0402#3108000000F213A2 (1410714954.137568) can0 19FA0402#321C7D7FFD113100 (1410714954.140559) can0 19FA0402#330000F214221513 (1410714954.144007) can0 19FA0402#34B85A1129000000 (1410714954.146571) can0 19FA0402#35F2FFFFFFFFFFFF (1410714954.149592) can0 0DF80502#202F41C73F70BC45 (1410714954.152552) can0 0DF80502#2124C0751E3CEB42 (1410714954.155970) can0 0DF80502#22430580F49573C0 (1410714954.158564) can0 0DF80502#23B931038C579302 (1410714954.161616) can0 0DF80502#240000000013FC0C (1410714954.164545) can0 0DF80502#2549008000AC0D00 (1410714954.167963) can0 0DF80502#260000FFFFFFFFFF (1410714954.170588) can0 09F80102#93719A16CC1AB80D (1410714954.202662) can0 09F80202#42FC00000300FFFF (1410714954.223933) can0 1DEFFF01#600AE598B6060404 (1410714954.224512) can0 1DEFFF01#6100000002FFFFFF (1410714954.227961) can0 09F80102#93719A16CC1AB80D (1410714954.327906) can0 09F80102#93719A16CC1AB80D (1410714954.403376) can0 0DF50B11#0192030000FFFFFF (1410714954.427943) can0 09F80102#93719A16CC1AB80D (1410714954.452509) can0 09F80202#43FC00000300FFFF (1410714954.527460) can0 09F80102#93719A16CC1AB80D (1410714954.627436) can0 09F80102#93719A16CC1AB80D (1410714954.702723) can0 09F80202#44FC00000300FFFF (1410714954.727412) can0 09F80102#93719A16CC1AB80D (1410714954.827357) can0 09F80102#93719A16CC1AB80D (1410714954.863642) can0 11F80E01#401B0188F64A0ED0 (1410714954.864222) can0 11F80E01#41FEB80D60069A16 (1410714954.864771) can0 11F80E01#423CFFFF000026C0 (1410714954.865351) can0 11F80E01#4300154F000000FE (1410714954.927332) can0 09F80102#93719A16CC1AB80D (1410714954.952357) can0 09F80202#45FC00000300FFFF (1410714954.957575) can0 11F80E01#601B014875520ED0 (1410714954.958125) can0 11F80E01#617C9F0D60DEA616 (1410714954.958674) can0 11F80E01#62342ACBE3015702 (1410714954.959254) can0 11F80E01#6308B6C5000000FE (1410714955.027308) can0 09F80102#93719A16CC1AB80D (1410714955.087092) can0 0DF01002#46F0C73F80E34524 (1410714955.089289) can0 19FA0302#46D3490069006400 (1410714955.092249) can0 19FA0402#409346FD0C0B7F34 (1410714955.095240) can0 19FA0402#4165C67C12F7FFFF (1410714955.098597) can0 19FA0402#42FFF220673064D5 (1410714955.101252) can0 19FA0402#43AD12FFFFFFFFF2 (1410714955.104243) can0 19FA0402#440E7F16B920E511 (1410714955.107264) can0 19FA0402#45F1FFFFFFF216DC (1410714955.110590) can0 19FA0402#4608AD2D0C110500 (1410714955.113245) can0 19FA0402#470000F201D0247C (1410714955.116267) can0 19FA0402#48D9F712E4FFFFFF (1410714955.119227) can0 19FA0402#49F21B390A95743A (1410714955.122614) can0 19FA0402#4A1015000000F217 (1410714955.125208) can0 19FA0402#4BD106CE8DB7108B (1410714955.128260) can0 19FA0402#4CFFFFFFF2047314 (1410714955.131251) can0 19FA0402#4DAAD20111F1FFFF (1410714955.134516) can0 19FA0402#4EFFF21FE80AB84D (1410714955.137232) can0 19FA0402#4F471160000000F2 (1410714955.140253) can0 19FA0402#501C1704C2C7260D (1410714955.143244) can0 19FA0402#5110000000F213A2 (1410714955.146510) can0 19FA0402#521C7D7FAB113300 (1410714955.149317) can0 19FA0402#530000F214221513 (1410714955.152247) can0 19FA0402#54B8B51126000000 (1410714955.155238) can0 19FA0402#55F2FFFFFFFFFFFF (1410714955.158564) can0 0DF80502#402F46C73F80E345 (1410714955.161219) can0 0DF80502#4124C0751E3CEB42 (1410714955.164240) can0 0DF80502#42430580F49573C0 (1410714955.167231) can0 0DF80502#43B931038C579302 (1410714955.170649) can0 0DF80502#440000000013FC0C (1410714955.173212) can0 0DF80502#4549008000AC0D00 (1410714955.176264) can0 0DF80502#460000FFFFFFFFFF (1410714955.179224) can0 09F80102#93719A16CC1AB80D (1410714955.197321) can0 11F80E01#801B03607DEA1E80 (1410714955.197901) can0 11F80E01#8131BE0D207F9916 (1410714955.198481) can0 11F80E01#823C87DB00000000 (1410714955.199061) can0 11F80E01#83080000000001FE (1410714955.211268) can0 09F80202#47FC00000300FFFF (1410714955.236292) can0 09F80102#93719A16CC1AB80D (1410714955.336237) can0 09F80102#93719A16CC1AB80D (1410714955.405726) can0 0DF50B11#0192030000FFFFFF (1410714955.436213) can0 09F80102#93719A16CC1AB80D (1410714955.443201) can0 19F212B0#2009D2000064FFE2 (1410714955.443751) can0 19F212B0#211B0A00FFFFFFFF (1410714955.444300) can0 19F214B0#00EC04C5FF6878D2 (1410714955.461268) can0 09F80202#48FC00000300FFFF (1410714955.536158) can0 09F80102#93719A16CC1AB80D (1410714955.636103) can0 09F80102#93719A16CC1AB80D (1410714955.711115) can0 09F80202#49FC00000300FFFF (1410714955.736079) can0 09F80102#93719A16CC1AB80D (1410714955.836054) can0 09F80102#93719A16CC1AB80D (1410714955.936060) can0 09F80102#93719A16CC1AB80D (1410714955.961268) can0 09F80202#4AFC00000300FFFF (1410714956.036036) can0 09F80102#93719A16CC1AB80D (1410714956.095393) can0 0DF01002#4BF0C73F900A4624 (1410714956.097926) can0 19FA0302#4BD3490069006400 (1410714956.101221) can0 19FA0402#60934BFD0C0B7F34 (1410714956.104029) can0 19FA0402#6165C61112F7FFFF (1410714956.106928) can0 19FA0402#62FFF220673064D5 (1410714956.109949) can0 19FA0402#63A41204000000F2 (1410714956.113215) can0 19FA0402#640E7F16B9201312 (1410714956.116022) can0 19FA0402#65F3FFFFFFF216DC (1410714956.118922) can0 19FA0402#6608AD2D3E110100 (1410714956.121943) can0 19FA0402#670000F201D0247C (1410714956.125208) can0 19FA0402#68D97B12E8FFFFFF (1410714956.127924) can0 19FA0402#69F21B390A957470 (1410714956.130946) can0 19FA0402#6A1015000000F217 (1410714956.133906) can0 19FA0402#6B7F07CE8DD3106C (1410714956.137202) can0 19FA0402#6CFFFFFFF2047314 (1410714956.139918) can0 19FA0402#6DAAD24C11FBFFFF (1410714956.142939) can0 19FA0402#6EFFF21FE80AB84D (1410714956.145930) can0 19FA0402#6F481161000000F2 (1410714956.149348) can0 19FA0402#701C1704C2C71A0D (1410714956.151972) can0 19FA0402#7114000000F213A2 (1410714956.154932) can0 19FA0402#721C7D7F2B123500 (1410714956.157923) can0 19FA0402#730000F214221513 (1410714956.161219) can0 19FA0402#74B81A1123000000 (1410714956.164027) can0 19FA0402#75F2FFFFFFFFFFFF (1410714956.166926) can0 0DF80502#602F4BC73F900A46 (1410714956.169886) can0 0DF80502#6124C0751E3CEB42 (1410714956.173212) can0 0DF80502#62430580F49573C0 (1410714956.176112) can0 0DF80502#63B931038C579302 (1410714956.178950) can0 0DF80502#640000000013FC0C (1410714956.181910) can0 0DF80502#6549008000AC0D00 (1410714956.185236) can0 0DF80502#660000FFFFFFFFFF (1410714956.188013) can0 09F80102#93719A16CC1AB80D (1410714956.219965) can0 09F80202#4CFC00000500FFFF (1410714956.245234) can0 09F80102#93719A16CC1AB80D (1410714956.345209) can0 09F80102#93719A16CC1AB80D (1410714956.445185) can0 09F80102#93719A16CC1AB80D (1410714956.469904) can0 09F80202#4DFC00000500FFFF (1410714956.507288) can0 0DF50B11#018F030000FFFFFF (1410714956.544855) can0 09F80102#93719A16CC1AB80D (1410714956.644801) can0 09F80102#93719A16CC1AB80D (1410714956.719965) can0 09F80202#4EFC00000500FFFF (1410714956.744776) can0 09F80102#93719A16CC1AB80D (1410714956.844721) can0 09F80102#93719A16CC1AB80D (1410714956.943171) can0 19F212B0#4009E1000064FFE2 (1410714956.943751) can0 19F212B0#411B0A00FFFFFFFF (1410714956.944300) can0 19F214B0#00EB04C5FF6678E1 (1410714956.944819) can0 09F80102#93719A16CC1AB80D (1410714956.969752) can0 09F80202#4FFC00000500FFFF (1410714957.044672) can0 09F80102#93719A16CC1AB80D (1410714957.054530) can0 0DF01002#50F0C73FA0314624 (1410714957.056635) can0 19FA0302#50D3490069006400 (1410714957.059901) can0 19FA0402#809350FD0C0B7F34 (1410714957.062647) can0 19FA0402#8165C6CA11FAFFFF (1410714957.065638) can0 19FA0402#82FFF220673064D5 (1410714957.068659) can0 19FA0402#83D31200000000F2 (1410714957.071955) can0 19FA0402#840E7F16B920F611 (1410714957.074641) can0 19FA0402#85F6FFFFFFF216DC (1410714957.077631) can0 19FA0402#8608AD2D30100000 (1410714957.080622) can0 19FA0402#870000F201D0247C (1410714957.084010) can0 19FA0402#88D95A13E7FFFFFF (1410714957.086604) can0 19FA0402#89F21B390A95748D (1410714957.089625) can0 19FA0402#8A100E000000F217 (1410714957.092615) can0 19FA0402#8B7F07CE8DD3105F (1410714957.096033) can0 19FA0402#8CFFFFFFF2047314 (1410714957.098597) can0 19FA0402#8DAAD2B511000000 (1410714957.101618) can0 19FA0402#8E00F21FE80AB84D (1410714957.104609) can0 19FA0402#8F511163000000F2 (1410714957.107966) can0 19FA0402#901C1704C2C71A0D (1410714957.110621) can0 19FA0402#9100000000F213A2 (1410714957.113612) can0 19FA0402#921C7D7F22123100 (1410714957.116602) can0 19FA0402#930000F214221513 (1410714957.119929) can0 19FA0402#94B8F51120000000 (1410714957.122645) can0 19FA0402#95F2FFFFFFFFFFFF (1410714957.125605) can0 0DF80502#802F50C73FA03146 (1410714957.128596) can0 0DF80502#8124C0751E3CEB42 (1410714957.131953) can0 0DF80502#82430580F49573C0 (1410714957.134608) can0 0DF80502#83B931038C579302 (1410714957.137629) can0 0DF80502#840000000013FC0C (1410714957.140620) can0 0DF80502#8549008000AC0D00 (1410714957.144160) can0 0DF80502#860000FFFFFFFFFF (1410714957.146601) can0 09F80102#93719A16CC1AB80D (1410714957.178645) can0 09F80202#51FC00000300FFFF (1410714957.204035) can0 09F80102#93719A16CC1AB80D (1410714957.304163) can0 09F80102#93719A16CC1AB80D (1410714957.403925) can0 09F80102#93719A16CC1AB80D (1410714957.428584) can0 09F80202#52FC00000300FFFF (1410714957.503901) can0 09F80102#93719A16CC1AB80D (1410714957.508723) can0 0DF50B11#018F030000FFFFFF (1410714957.603510) can0 09F80102#93719A16CC1AB80D (1410714957.678675) can0 09F80202#53FC00000300FFFF (1410714957.703455) can0 09F80102#93719A16CC1AB80D (1410714957.803431) can0 09F80102#93719A16CC1AB80D (1410714957.903407) can0 09F80102#93719A16CC1AB80D (1410714957.928400) can0 09F80202#54FC00000300FFFF (1410714958.003352) can0 09F80102#93719A16CC1AB80D (1410714958.062098) can0 0DF01002#55F0C73FB0584624 (1410714958.064326) can0 19FA0302#55D3490069006400 (1410714958.067316) can0 19FA0402#A09355FD0C0B7F34 (1410714958.070612) can0 19FA0402#A165C6B711000000 (1410714958.073298) can0 19FA0402#A200F220673064D5 (1410714958.076319) can0 19FA0402#A3711200000000F2 (1410714958.079310) can0 19FA0402#A40E7F16B9201512 (1410714958.082728) can0 19FA0402#A5F2FFFFFFF216DC (1410714958.085291) can0 19FA0402#A608AD2D5D10FDFF (1410714958.088313) can0 19FA0402#A7FFFFF201D0247C (1410714958.091303) can0 19FA0402#A8D90D13EDFFFFFF (1410714958.094538) can0 19FA0402#A9F21B390A957497 (1410714958.097315) can0 19FA0402#AA100E000000F217 (1410714958.100306) can0 19FA0402#AB7F07CE8DD91059 (1410714958.103297) can0 19FA0402#ACFFFFFFF2047314 (1410714958.106562) can0 19FA0402#ADAAD29011FFFFFF (1410714958.109461) can0 19FA0402#AEFFF21FE80AB84D (1410714958.112299) can0 19FA0402#AF8A115F000000F2 (1410714958.115290) can0 19FA0402#B01C1704C2C7430D (1410714958.118616) can0 19FA0402#B1F7FFFFFFF213A2 (1410714958.121302) can0 19FA0402#B21C7D7F9E123000 (1410714958.124293) can0 19FA0402#B30000F214221513 (1410714958.127314) can0 19FA0402#B4B8C11120000000 (1410714958.130671) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714958.133295) can0 0DF80502#A02F55C73FB05846 (1410714958.136286) can0 0DF80502#A124C0751E3CEB42 (1410714958.139277) can0 0DF80502#A2430580F49573C0 (1410714958.142725) can0 0DF80502#A3B931038C579302 (1410714958.145319) can0 0DF80502#A40000000013FC0C (1410714958.148280) can0 0DF80502#A549008000AC0D00 (1410714958.151301) can0 0DF80502#A60000FFFFFFFFFF (1410714958.154536) can0 09F80102#93719A16CC1AB80D (1410714958.186610) can0 09F80202#56FC00000200FFFF (1410714958.211298) can0 09F80102#93719A16CC1AB80D (1410714958.311274) can0 09F80102#93719A16CC1AB80D (1410714958.411219) can0 09F80102#93719A16CC1AB80D (1410714958.436274) can0 09F80202#57FC00000200FFFF (1410714958.443476) can0 19F212B0#6009F0000064FFE3 (1410714958.444025) can0 19F212B0#611B0900FFFFFFFF (1410714958.444575) can0 19F214B0#00EC04C5FF6978F0 (1410714958.510279) can0 0DF50B11#018F030000FFFFFF (1410714958.511225) can0 09F80102#93719A16CC1AB80D (1410714958.611170) can0 09F80102#93719A16CC1AB80D (1410714958.686182) can0 09F80202#58FC00000200FFFF (1410714958.711146) can0 09F80102#93719A16CC1AB80D (1410714958.811091) can0 09F80102#93719A16CC1AB80D (1410714958.911066) can0 09F80102#93719A16CC1AB80D (1410714958.936091) can0 09F80202#59FC00000200FFFF (1410714959.011042) can0 09F80102#93719A16CC1AB80D (1410714959.071497) can0 0DF01002#5AF0C73FC07F4624 (1410714959.074000) can0 19FA0302#5AD3490069006400 (1410714959.077235) can0 19FA0402#C0935AFD0C0B7F34 (1410714959.080012) can0 19FA0402#C165C68711FEFFFF (1410714959.083002) can0 19FA0402#C2FFF220673064D5 (1410714959.085993) can0 19FA0402#C38412FAFFFFFFF2 (1410714959.089350) can0 19FA0402#C40E7F16B9202B12 (1410714959.091975) can0 19FA0402#C5EEFFFFFFF216DC (1410714959.094996) can0 19FA0402#C608AD2DCD100500 (1410714959.097987) can0 19FA0402#C70000F201D0247C (1410714959.101221) can0 19FA0402#C8D96313EAFFFFFF (1410714959.103968) can0 19FA0402#C9F21B390A957483 (1410714959.106989) can0 19FA0402#CA1007000000F217 (1410714959.109980) can0 19FA0402#CB7F07CE8DF71058 (1410714959.113245) can0 19FA0402#CCFFFFFFF2047314 (1410714959.116022) can0 19FA0402#CDAAD20A11FEFFFF (1410714959.118983) can0 19FA0402#CEFFF21FE80AB84D (1410714959.121973) can0 19FA0402#CFD91154000000F2 (1410714959.125239) can0 19FA0402#D01C1704C2C7540D (1410714959.127985) can0 19FA0402#D1F6FFFFFFF213A2 (1410714959.130976) can0 19FA0402#D21C7D7F65123100 (1410714959.133967) can0 19FA0402#D30000F214221513 (1410714959.137232) can0 19FA0402#D4B829111B000000 (1410714959.140009) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714959.142969) can0 0DF80502#C02F5AC73FC07F46 (1410714959.145960) can0 0DF80502#C124C0751E3CEB42 (1410714959.149348) can0 0DF80502#C2430580F49573C0 (1410714959.151972) can0 0DF80502#C3B931038C579302 (1410714959.154993) can0 0DF80502#C40000000013FC0C (1410714959.157984) can0 0DF80502#C549008000AC0D00 (1410714959.161250) can0 0DF80502#C60000FFFFFFFFFF (1410714959.163966) can0 09F80102#93719A16CC1AB80D (1410714959.196070) can0 09F80202#5BFC00000100FFFF (1410714959.221278) can0 09F80102#93719A16CC1AB80D (1410714959.223597) can0 1DEFFF01#800AE598B6060404 (1410714959.224177) can0 1DEFFF01#8100000002FFFFFF (1410714959.277033) can0 11F80E01#A01B01985B620EC0 (1410714959.277583) can0 11F80E01#A1C6C20D20B99916 (1410714959.278132) can0 11F80E01#A254A5A40000F982 (1410714959.278712) can0 11F80E01#A308FFFFFF7F00FE (1410714959.321253) can0 09F80102#93719A16CC1AB80D (1410714959.421229) can0 09F80102#93719A16CC1AB80D (1410714959.445948) can0 09F80202#5CFC00000100FFFF (1410714959.511774) can0 0DF50B11#018F030000FFFFFF (1410714959.521204) can0 09F80102#93719A16CC1AB80D (1410714959.620844) can0 09F80102#93719A16CC1AB80D (1410714959.696223) can0 09F80202#5DFC00000100FFFF (1410714959.720820) can0 09F80102#93719A16CC1AB80D (1410714959.820795) can0 09F80102#93719A16CC1AB80D (1410714959.920771) can0 09F80102#93719A16CC1AB80D (1410714959.943262) can0 19F212B0#800904000064FFE6 (1410714959.943812) can0 19F212B0#811B0900FFFFFFFF (1410714959.944361) can0 19F214B0#00EC04C5FF697804 (1410714959.945765) can0 09F80202#5EFC00000100FFFF (1410714960.020716) can0 09F80102#93719A16CC1AB80D (1410714960.109675) can0 0DF01002#5FF0C73FD0A64624 (1410714960.112666) can0 19FA0302#5FD3490069006400 (1410714960.116053) can0 19FA0402#E0935FFD0C0B7F34 (1410714960.118677) can0 19FA0402#E165C6E511FFFFFF (1410714960.121668) can0 19FA0402#E2FFF220673064D5 (1410714960.124659) can0 19FA0402#E33C12F9FFFFFFF2 (1410714960.127985) can0 19FA0402#E40E7F16B9201012 (1410714960.130671) can0 19FA0402#E5ECFFFFFFF216DC (1410714960.133662) can0 19FA0402#E608AD2DDE100600 (1410714960.136652) can0 19FA0402#E70000F201D0247C (1410714960.139948) can0 19FA0402#E8D92713ECFFFFFF (1410714960.142756) can0 19FA0402#E9F21B390A957438 (1410714960.145655) can0 19FA0402#EA1010000000F217 (1410714960.148646) can0 19FA0402#EB7F07CE8DEB105B (1410714960.152003) can0 19FA0402#ECFFFFFFF2047314 (1410714960.154658) can0 19FA0402#EDAAD23911000000 (1410714960.157648) can0 19FA0402#EE00F21FE80AB84D (1410714960.160670) can0 19FA0402#EFD8114B000000F2 (1410714960.163996) can0 19FA0402#F01C1704C2C76A0D (1410714960.166651) can0 19FA0402#F1F0FFFFFFF213A2 (1410714960.169642) can0 19FA0402#F21C7D7F50123200 (1410714960.172633) can0 19FA0402#F30000F214221513 (1410714960.176173) can0 19FA0402#F4B84D1119000000 (1410714960.178736) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714960.181635) can0 0DF80502#E02F5FC73FD0A646 (1410714960.184626) can0 0DF80502#E124C0751E3CEB42 (1410714960.188044) can0 0DF80502#E2430580F49573C0 (1410714960.190638) can0 0DF80502#E3B931038C579302 (1410714960.193659) can0 0DF80502#E40000000013FC0C (1410714960.196650) can0 0DF80502#E549008000AC0D00 (1410714960.199976) can0 0DF80502#E60000FFFFFFFFFF (1410714960.202723) can0 09F80102#93719A16CC1AB80D (1410714960.233698) can0 09F80202#60FC00000300FFFF (1410714960.258662) can0 09F80102#93719A16CC1AB80D (1410714960.358668) can0 09F80102#93719A16CC1AB80D (1410714960.458674) can0 09F80102#93719A16CC1AB80D (1410714960.484003) can0 09F80202#61FC00000300FFFF (1410714960.513239) can0 0DF50B11#018F030000FFFFFF (1410714960.558649) can0 09F80102#93719A16CC1AB80D (1410714960.658717) can0 09F80102#93719A16CC1AB80D (1410714960.733515) can0 09F80202#62FC00000300FFFF (1410714960.758662) can0 09F80102#93719A16CC1AB80D (1410714960.850520) can0 11F80E01#C01B0108975C0EA0 (1410714960.851069) can0 11F80E01#C19CC50D80F69816 (1410714960.851618) can0 11F80E01#C2552C6200006640 (1410714960.852198) can0 11F80E01#C30036AF000000FE (1410714960.858698) can0 09F80102#93719A16CC1AB80D (1410714960.958674) can0 09F80102#93719A16CC1AB80D (1410714960.983454) can0 09F80202#63FC00000300FFFF (1410714961.058680) can0 09F80102#93719A16CC1AB80D (1410714961.068842) can0 0DF01002#64F0C73FE0CD4624 (1410714961.071375) can0 19FA0302#64D3490069006400 (1410714961.074580) can0 19FA0402#009364FD0C0B7F34 (1410714961.077387) can0 19FA0402#0165C60D12000000 (1410714961.080347) can0 19FA0402#0200F220673064D5 (1410714961.083369) can0 19FA0402#03BB12FAFFFFFFF2 (1410714961.086604) can0 19FA0402#040E7F16B9208C11 (1410714961.089381) can0 19FA0402#05F8FFFFFFF216DC (1410714961.092341) can0 19FA0402#0608AD2DCF100400 (1410714961.095362) can0 19FA0402#070000F201D0247C (1410714961.098658) can0 19FA0402#08D97713EDFFFFFF (1410714961.101344) can0 19FA0402#09F21B390A957446 (1410714961.104365) can0 19FA0402#0A1009000000F217 (1410714961.107355) can0 19FA0402#0B7F07CE8DFB105B (1410714961.110651) can0 19FA0402#0CFFFFFFF2047314 (1410714961.113337) can0 19FA0402#0DAAD2D411FAFFFF (1410714961.116358) can0 19FA0402#0EFFF21FE80AB84D (1410714961.119349) can0 19FA0402#0FB91147000000F2 (1410714961.122736) can0 19FA0402#101C1704C2C7510D (1410714961.125361) can0 19FA0402#11FFFFFFFFF213A2 (1410714961.128352) can0 19FA0402#121C7D7F50123000 (1410714961.131342) can0 19FA0402#130000F214221513 (1410714961.134608) can0 19FA0402#14B85C1113000000 (1410714961.137354) can0 19FA0402#15F2FFFFFFFFFFFF (1410714961.140345) can0 0DF80502#002F64C73FE0CD46 (1410714961.143336) can0 0DF80502#0124C0751E3CEB42 (1410714961.146601) can0 0DF80502#02430580F49573C0 (1410714961.149500) can0 0DF80502#03B931038C579302 (1410714961.152369) can0 0DF80502#040000000013FC0C (1410714961.155329) can0 0DF80502#0549008000AC0D00 (1410714961.158686) can0 0DF80502#060000FFFFFFFFFF (1410714961.161341) can0 09F80102#93719A16CC1AB80D (1410714961.193385) can0 09F80202#65FC00000200FFFF (1410714961.218684) can0 09F80102#93719A16CC1AB80D (1410714961.320643) can0 09F80102#93719A16CC1AB80D (1410714961.418665) can0 09F80102#93719A16CC1AB80D (1410714961.443323) can0 09F80202#66FC00000200FFFF (1410714961.443873) can0 19F212B0#A00913000064FFE4 (1410714961.444422) can0 19F212B0#A11B0900FFFFFFFF (1410714961.444971) can0 19F214B0#00EB04C4FF667813 (1410714961.514948) can0 0DF50B11#018F030000FFFFFF (1410714961.518610) can0 09F80102#93719A16CC1AB80D (1410714961.618647) can0 09F80102#93719A16CC1AB80D (1410714961.693323) can0 09F80202#67FC00000200FFFF (1410714961.718195) can0 09F80102#93719A16CC1AB80D (1410714961.818140) can0 09F80102#93719A16CC1AB80D (1410714961.918116) can0 09F80102#93719A16CC1AB80D (1410714961.943140) can0 09F80202#68FC00000200FFFF (1410714962.018092) can0 09F80102#93719A16CC1AB80D (1410714962.083186) can0 0DF01002#69F0C73FF0F44624 (1410714962.086054) can0 19FA0302#69D3490069006400 (1410714962.089381) can0 19FA0402#209369FD0C0B7F34 (1410714962.092036) can0 19FA0402#2165C6F111030000 (1410714962.095057) can0 19FA0402#2200F220673064D5 (1410714962.098048) can0 19FA0402#23EF12F8FFFFFFF2 (1410714962.101252) can0 19FA0402#240E7F16B9209E11 (1410714962.104060) can0 19FA0402#25F9FFFFFFF216DC (1410714962.107050) can0 19FA0402#2608AD2DD4100000 (1410714962.110041) can0 19FA0402#270000F201D0247C (1410714962.113276) can0 19FA0402#28D99213F0FFFFFF (1410714962.116022) can0 19FA0402#29F21B390A957451 (1410714962.119044) can0 19FA0402#2A1009000000F217 (1410714962.122034) can0 19FA0402#2B7F07CE8D20115C (1410714962.125269) can0 19FA0402#2CFFFFFFF2047314 (1410714962.128046) can0 19FA0402#2DAAD2E411FBFFFF (1410714962.131037) can0 19FA0402#2EFFF21FE80AB84D (1410714962.134058) can0 19FA0402#2FC4114A000000F2 (1410714962.137263) can0 19FA0402#301C1704C2C7540D (1410714962.140040) can0 19FA0402#31E8FFFFFFF213A2 (1410714962.143031) can0 19FA0402#321C7D7F63123400 (1410714962.146021) can0 19FA0402#330000F214221513 (1410714962.149378) can0 19FA0402#34B86A110F000000 (1410714962.152033) can0 19FA0402#35F2FFFFFFFFFFFF (1410714962.155024) can0 0DF80502#202F69C73FF0F446 (1410714962.158015) can0 0DF80502#2124C0751E3CEB42 (1410714962.161250) can0 0DF80502#22430580F49573C0 (1410714962.164027) can0 0DF80502#23B931038C579302 (1410714962.167048) can0 0DF80502#240000000013FC0C (1410714962.170039) can0 0DF80502#2549008000AC0D00 (1410714962.173304) can0 0DF80502#260000FFFFFFFFFF (1410714962.176051) can0 09F80102#93719A16CC1AB80D (1410714962.207056) can0 09F80202#6AFC00000400FFFF (1410714962.232050) can0 09F80102#93719A16CC1AB80D (1410714962.332026) can0 09F80102#93719A16CC1AB80D (1410714962.432093) can0 09F80102#93719A16CC1AB80D (1410714962.457301) can0 09F80202#6BFC00000400FFFF (1410714962.516474) can0 0DF50B11#018F030000FFFFFF (1410714962.532038) can0 09F80102#93719A16CC1AB80D (1410714962.632044) can0 09F80102#93719A16CC1AB80D (1410714962.706904) can0 09F80202#6CFC00000400FFFF (1410714962.716975) can0 11F80E01#E01B01A929C40CE0 (1410714962.717493) can0 11F80E01#E131B90D20019A16 (1410714962.718073) can0 11F80E01#E2608B090000D860 (1410714962.718623) can0 11F80E01#E3047CCA000000FE (1410714962.732050) can0 09F80102#93719A16CC1AB80D (1410714962.832056) can0 09F80102#93719A16CC1AB80D (1410714962.932032) can0 09F80102#93719A16CC1AB80D (1410714962.943262) can0 19F212B0#C00922000064FFE4 (1410714962.943812) can0 19F212B0#C11B0900FFFFFFFF (1410714962.944392) can0 19F214B0#00EB04C5FF667822 (1410714962.956843) can0 09F80202#6DFC00000400FFFF (1410714963.032038) can0 09F80102#93719A16CC1AB80D (1410714963.092371) can0 0DF01002#6EF0C73F001C4724 (1410714963.094721) can0 19FA0302#6ED3490069006400 (1410714963.097712) can0 19FA0402#40936EFD0C0B7F34 (1410714963.100733) can0 19FA0402#4165C6BD11050000 (1410714963.104029) can0 19FA0402#4200F220673064D5 (1410714963.106715) can0 19FA0402#43A112F7FFFFFFF2 (1410714963.109705) can0 19FA0402#440E7F16B9207711 (1410714963.112727) can0 19FA0402#45F5FFFFFFF216DC (1410714963.116053) can0 19FA0402#4608AD2DDD10FEFF (1410714963.118739) can0 19FA0402#47FFFFF201D0247C (1410714963.121729) can0 19FA0402#48D92D13EEFFFFFF (1410714963.124689) can0 19FA0402#49F21B390A957465 (1410714963.128016) can0 19FA0402#4A100C000000F217 (1410714963.130701) can0 19FA0402#4B7F07CE8D311166 (1410714963.133723) can0 19FA0402#4CFFFFFFF2047314 (1410714963.136713) can0 19FA0402#4DAAD2CF11F8FFFF (1410714963.139948) can0 19FA0402#4EFFF21FE80AB84D (1410714963.142817) can0 19FA0402#4FB31148000000F2 (1410714963.145716) can0 19FA0402#501C1704C2C7820D (1410714963.148707) can0 19FA0402#51D5FFFFFFF213A2 (1410714963.152003) can0 19FA0402#521C7D7FC3122B00 (1410714963.154688) can0 19FA0402#530000F214221513 (1410714963.157709) can0 19FA0402#54B854110C000000 (1410714963.160731) can0 19FA0402#55F2FFFFFFFFFFFF (1410714963.163996) can0 0DF80502#402F6EC73F001C47 (1410714963.166682) can0 0DF80502#4124C0751E3CEB42 (1410714963.169703) can0 0DF80502#42430580F49573C0 (1410714963.172694) can0 0DF80502#43B931038C579302 (1410714963.176112) can0 0DF80502#440000000013FC0C (1410714963.178706) can0 0DF80502#4549008000AC0D00 (1410714963.181727) can0 0DF80502#460000FFFFFFFFFF (1410714963.184687) can0 09F80102#93719A16CC1AB80D (1410714963.216761) can0 09F80202#6FFC00000600FFFF (1410714963.241694) can0 09F80102#93719A16CC1AB80D (1410714963.341700) can0 09F80102#93719A16CC1AB80D (1410714963.441676) can0 09F80102#93719A16CC1AB80D (1410714963.466700) can0 09F80202#70FC00000600FFFF (1410714963.518519) can0 0DF50B11#018F030000FFFFFF (1410714963.541651) can0 09F80102#93719A16CC1AB80D (1410714963.641596) can0 09F80102#93719A16CC1AB80D (1410714963.716578) can0 09F80202#71FC00000600FFFF (1410714963.741541) can0 09F80102#93719A16CC1AB80D (1410714963.770289) can0 11F80E01#001B0188F64A0E50 (1410714963.770869) can0 11F80E01#01FDB80DC0029A16 (1410714963.771448) can0 11F80E01#0260FFFF0000C703 (1410714963.771998) can0 11F80E01#0308154F000000FE (1410714963.841517) can0 09F80102#93719A16CC1AB80D (1410714963.941492) can0 09F80102#93719A16CC1AB80D (1410714963.966730) can0 09F80202#72FC00000600FFFF (1410714964.041438) can0 09F80102#93719A16CC1AB80D (1410714964.065363) can0 0DF01002#73F0C73F10434724 (1410714964.068415) can0 19FA0302#73D3490069006400 (1410714964.071406) can0 19FA0402#609373FD0C0B7F34 (1410714964.074671) can0 19FA0402#6165C61C12FBFFFF (1410714964.077418) can0 19FA0402#62FFF220673064D5 (1410714964.080408) can0 19FA0402#637812FAFFFFFFF2 (1410714964.083399) can0 19FA0402#640E7F16B9207811 (1410714964.086634) can0 19FA0402#6500000000F216DC (1410714964.089411) can0 19FA0402#6608AD2DF9100100 (1410714964.092402) can0 19FA0402#670000F201D0247C (1410714964.095423) can0 19FA0402#68D98412FBFFFFFF (1410714964.098688) can0 19FA0402#69F21B390A957465 (1410714964.101405) can0 19FA0402#6A1012000000F217 (1410714964.104395) can0 19FA0402#6B7F07CE8D2B1174 (1410714964.107417) can0 19FA0402#6CFFFFFFF2047314 (1410714964.110712) can0 19FA0402#6DAAD2DE0FF8FFFF (1410714964.113398) can0 19FA0402#6EFFF21FE80AB84D (1410714964.116389) can0 19FA0402#6F2E1148000000F2 (1410714964.119410) can0 19FA0402#701C1704C2C7620D (1410714964.122797) can0 19FA0402#71D8FFFFFFF213A2 (1410714964.125391) can0 19FA0402#721C7D7F51122A00 (1410714964.128382) can0 19FA0402#730000F214221513 (1410714964.131403) can0 19FA0402#74B8E41114000000 (1410714964.134699) can0 19FA0402#75F2FFFFFFFFFFFF (1410714964.137385) can0 0DF80502#602F73C73F104347 (1410714964.140406) can0 0DF80502#6124C0751E3CEB42 (1410714964.143397) can0 0DF80502#62430580F49573C0 (1410714964.146632) can0 0DF80502#63B931038C579302 (1410714964.149439) can0 0DF80502#640000000013FC0C (1410714964.152399) can0 0DF80502#6549008000AC0D00 (1410714964.155421) can0 0DF80502#660000FFFFFFFFFF (1410714964.158656) can0 09F80102#93719A16CC1AB80D (1410714964.189600) can0 09F80202#74FC00000500FFFF (1410714964.214716) can0 09F80102#93719A16CC1AB80D (1410714964.223231) can0 1DEFFF01#A00AE598B6060404 (1410714964.223811) can0 1DEFFF01#A100000002FFFFFF (1410714964.290797) can0 11F80E01#201B014875520EE0 (1410714964.291346) can0 11F80E01#216D9F0DE0E4A616 (1410714964.291895) can0 11F80E01#22602ACBE3011B40 (1410714964.292445) can0 11F80E01#2300B6C5000000FE (1410714964.314722) can0 09F80102#93719A16CC1AB80D (1410714964.414729) can0 09F80102#93719A16CC1AB80D (1410714964.439356) can0 09F80202#75FC00000500FFFF (1410714964.443293) can0 19F212B0#E00931000064FFE5 (1410714964.443873) can0 19F212B0#E11B0900FFFFFFFF (1410714964.444422) can0 19F214B0#00DE04C6FF667831 (1410714964.514704) can0 09F80102#93719A16CC1AB80D (1410714964.520045) can0 0DF50B11#018F030000FFFFFF (1410714964.614649) can0 09F80102#93719A16CC1AB80D (1410714964.689448) can0 09F80202#76FC00000500FFFF (1410714964.714228) can0 09F80102#93719A16CC1AB80D (1410714964.814204) can0 09F80102#93719A16CC1AB80D (1410714964.914179) can0 09F80102#93719A16CC1AB80D (1410714964.939204) can0 09F80202#77FC00000500FFFF (1410714965.014155) can0 09F80102#93719A16CC1AB80D (1410714965.074854) can0 0DF01002#78F0C73F206A4724 (1410714965.077296) can0 19FA0302#78D3490069006400 (1410714965.080103) can0 19FA0402#809378FD0C0B7F34 (1410714965.083094) can0 19FA0402#8165C65D12F0FFFF (1410714965.086085) can0 19FA0402#82FFF220673064D5 (1410714965.089411) can0 19FA0402#83E212FAFFFFFFF2 (1410714965.092097) can0 19FA0402#840E7F16B9206311 (1410714965.095087) can0 19FA0402#85FEFFFFFFF216DC (1410714965.098078) can0 19FA0402#8608AD2D0F10F6FF (1410714965.101313) can0 19FA0402#87FFFFF201D0247C (1410714965.104090) can0 19FA0402#88D96913F8FFFFFF (1410714965.107081) can0 19FA0402#89F21B390A95748E (1410714965.110072) can0 19FA0402#8A100D000000F217 (1410714965.113306) can0 19FA0402#8B7F07CE8D301172 (1410714965.116084) can0 19FA0402#8CFFFFFFF2047314 (1410714965.119105) can0 19FA0402#8DAAD25011F9FFFF (1410714965.122065) can0 19FA0402#8EFFF21FE80AB84D (1410714965.125300) can0 19FA0402#8F44114A000000F2 (1410714965.128077) can0 19FA0402#901C1704C2C7170D (1410714965.131068) can0 19FA0402#91EDFFFFFFF213A2 (1410714965.134089) can0 19FA0402#921C7D7F58122900 (1410714965.137293) can0 19FA0402#930000F214221513 (1410714965.140101) can0 19FA0402#94B8D71013000000 (1410714965.143092) can0 19FA0402#95F2FFFFFFFFFFFF (1410714965.146082) can0 0DF80502#802F78C73F206A47 (1410714965.149531) can0 0DF80502#8124C0751E3CEB42 (1410714965.152064) can0 0DF80502#82430580F49573C0 (1410714965.155054) can0 0DF80502#83B931038C579302 (1410714965.158076) can0 0DF80502#840000000013FC0C (1410714965.161311) can0 0DF80502#8549008000AC0D00 (1410714965.164088) can0 0DF80502#860000FFFFFFFFFF (1410714965.167048) can0 09F80102#93719A16CC1AB80D (1410714965.199122) can0 09F80202#79FC00000500FFFF (1410714965.224085) can0 09F80102#93719A16CC1AB80D (1410714965.324061) can0 09F80102#93719A16CC1AB80D (1410714965.424097) can0 09F80102#93719A16CC1AB80D (1410714965.449488) can0 09F80202#7AFC00000500FFFF (1410714965.524042) can0 09F80102#93719A16CC1AB80D (1410714965.524622) can0 0DF50B11#018F030000FFFFFF (1410714965.624110) can0 09F80102#93719A16CC1AB80D (1410714965.698939) can0 09F80202#7BFC00000500FFFF (1410714965.724055) can0 09F80102#93719A16CC1AB80D (1410714965.824061) can0 09F80102#93719A16CC1AB80D (1410714965.924067) can0 09F80102#93719A16CC1AB80D (1410714965.943262) can0 19F212B0#000940000064FFE9 (1410714965.943842) can0 19F212B0#011B0900FFFFFFFF (1410714965.944392) can0 19F214B0#00EC04C5FF6B7840 (1410714965.948878) can0 09F80202#7CFC00000500FFFF (1410714966.024073) can0 09F80102#93719A16CC1AB80D (1410714966.083002) can0 0DF01002#7DF0C73F30914724 (1410714966.085780) can0 19FA0302#7DD3490069006400 (1410714966.088801) can0 19FA0402#A0937DFD0C0B7F34 (1410714966.092005) can0 19FA0402#A165C64D12EBFFFF (1410714966.094782) can0 19FA0402#A2FFF220673064D5 (1410714966.097803) can0 19FA0402#A31813F5FFFFFFF2 (1410714966.100764) can0 19FA0402#A40E7F16B9205711 (1410714966.104090) can0 19FA0402#A5FCFFFFFFF216DC (1410714966.106776) can0 19FA0402#A608AD2DC60FFEFF (1410714966.109797) can0 19FA0402#A7FFFFF201D0247C (1410714966.112757) can0 19FA0402#A8D9E513F6FFFFFF (1410714966.115992) can0 19FA0402#A9F21B390A9574EE (1410714966.118769) can0 19FA0402#AA100D000000F217 (1410714966.121760) can0 19FA0402#AB7F07CE8D171179 (1410714966.124781) can0 19FA0402#ACFFFFFFF2047314 (1410714966.128016) can0 19FA0402#ADAAD28711F8FFFF (1410714966.130762) can0 19FA0402#AEFFF21FE80AB84D (1410714966.133753) can0 19FA0402#AF061151000000F2 (1410714966.136774) can0 19FA0402#B01C170413C7EC0C (1410714966.139979) can0 19FA0402#B1E7FFFFFFF213A2 (1410714966.142847) can0 19FA0402#B21C7D7FA1122600 (1410714966.145747) can0 19FA0402#B30000F214221513 (1410714966.148768) can0 19FA0402#B4B8971014000000 (1410714966.152064) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714966.154749) can0 0DF80502#A02F7DC73F309147 (1410714966.157740) can0 0DF80502#A124C0751E3CEB42 (1410714966.160731) can0 0DF80502#A2430580F49573C0 (1410714966.164027) can0 0DF80502#A3B931038C579302 (1410714966.166773) can0 0DF80502#A40000000013FC0C (1410714966.169764) can0 0DF80502#A549008000AC0D00 (1410714966.172785) can0 0DF80502#A60000FFFFFFFFFF (1410714966.176020) can0 09F80102#93719A16CC1AB80D (1410714966.208063) can0 09F80202#7EFC00000500FFFF (1410714966.232752) can0 09F80102#93719A16CC1AB80D (1410714966.332728) can0 09F80102#93719A16CC1AB80D (1410714966.432703) can0 09F80102#93719A16CC1AB80D (1410714966.457758) can0 09F80202#7FFC00000500FFFF (1410714966.532679) can0 09F80102#93719A16CC1AB80D (1410714966.626765) can0 0DF50B11#0192030000FFFFFF (1410714966.632655) can0 09F80102#93719A16CC1AB80D (1410714966.707667) can0 09F80202#80FC00000500FFFF (1410714966.732600) can0 09F80102#93719A16CC1AB80D (1410714966.832575) can0 09F80102#93719A16CC1AB80D (1410714966.932551) can0 09F80102#93719A16CC1AB80D (1410714966.957575) can0 09F80202#81FC00000500FFFF (1410714967.032496) can0 09F80102#93719A16CC1AB80D (1410714967.092066) can0 0DF01002#82F0C73F40B84724 (1410714967.094752) can0 19FA0302#82D3490069006400 (1410714967.097468) can0 19FA0402#C09382FD0C0B7F34 (1410714967.100459) can0 19FA0402#C165C67212F1FFFF (1410714967.103449) can0 19FA0402#C2FFF220673064D5 (1410714967.106684) can0 19FA0402#C38112FAFFFFFFF2 (1410714967.109461) can0 19FA0402#C40E7F16B9207511 (1410714967.112452) can0 19FA0402#C5F9FFFFFFF216DC (1410714967.115443) can0 19FA0402#C608AD2D86100000 (1410714967.118739) can0 19FA0402#C70000F201D0247C (1410714967.121455) can0 19FA0402#C8D92D13F9FFFFFF (1410714967.124445) can0 19FA0402#C9F21B390A957454 (1410714967.127436) can0 19FA0402#CA1007000000F217 (1410714967.130732) can0 19FA0402#CB7F07CE8D0D1178 (1410714967.133448) can0 19FA0402#CCFFFFFFF2047314 (1410714967.136439) can0 19FA0402#CDAAD2E610010000 (1410714967.139429) can0 19FA0402#CE00F21FE80AB84D (1410714967.142878) can0 19FA0402#CFFC1057000000F2 (1410714967.145441) can0 19FA0402#D01C170413C7CC0C (1410714967.148432) can0 19FA0402#D1E1FFFFFFF213A2 (1410714967.151423) can0 19FA0402#D21C7D7F8A122500 (1410714967.154719) can0 19FA0402#D30000F214221513 (1410714967.157435) can0 19FA0402#D4B8E2101B000000 (1410714967.160456) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714967.163447) can0 0DF80502#C02F82C73F40B847 (1410714967.166651) can0 0DF80502#C124C0751E3CEB42 (1410714967.169428) can0 0DF80502#C2430580F49573C0 (1410714967.172419) can0 0DF80502#C3B931038C579302 (1410714967.175471) can0 0DF80502#C40000000013FC0C (1410714967.178736) can0 0DF80502#C549008000AC0D00 (1410714967.181452) can0 0DF80502#C60000FFFFFFFFFF (1410714967.184412) can0 09F80102#93719A16CC1AB80D (1410714967.216486) can0 09F80202#83FC00000100FFFF (1410714967.241450) can0 09F80102#93719A16CC1AB80D (1410714967.341425) can0 09F80102#93719A16CC1AB80D (1410714967.441370) can0 09F80102#93719A16CC1AB80D (1410714967.443568) can0 19F212B0#20094F000064FFE1 (1410714967.444147) can0 19F212B0#211B0600FFFFFFFF (1410714967.444697) can0 19F214B0#00EC04C5FF5E784F (1410714967.466761) can0 09F80202#84FC00000100FFFF (1410714967.541346) can0 09F80102#93719A16CC1AB80D (1410714967.628291) can0 0DF50B11#0192030000FFFFFF (1410714967.641352) can0 09F80102#93719A16CC1AB80D (1410714967.716334) can0 09F80202#85FC00000100FFFF (1410714967.741358) can0 09F80102#93719A16CC1AB80D (1410714967.841334) can0 09F80102#93719A16CC1AB80D (1410714967.941340) can0 09F80102#93719A16CC1AB80D (1410714967.966242) can0 09F80202#86FC00000100FFFF (1410714968.041346) can0 09F80102#93719A16CC1AB80D (1410714968.058222) can0 0DF01002#87F0C73F50DF4724 (1410714968.061335) can0 19FA0302#87D3490069006400 (1410714968.064143) can0 19FA0402#E09387FD0C0B7F34 (1410714968.067164) can0 19FA0402#E165C61812FBFFFF (1410714968.070155) can0 19FA0402#E2FFF220673064D5 (1410714968.073359) can0 19FA0402#E32D12FEFFFFFFF2 (1410714968.076136) can0 19FA0402#E40E7F16B9203E11 (1410714968.079157) can0 19FA0402#E501000000F216DC (1410714968.082148) can0 19FA0402#E608AD2D2D110300 (1410714968.085322) can0 19FA0402#E70000F201D0247C (1410714968.088160) can0 19FA0402#E8D9AC13F6FFFFFF (1410714968.091151) can0 19FA0402#E9F21B390A957460 (1410714968.094141) can0 19FA0402#EA100C000000F217 (1410714968.097315) can0 19FA0402#EB7F07CE8D20117C (1410714968.100153) can0 19FA0402#ECFFFFFFF2047314 (1410714968.103144) can0 19FA0402#EDAAD24F11030000 (1410714968.106135) can0 19FA0402#EE00F21FE80AB84D (1410714968.109461) can0 19FA0402#EF261151000000F2 (1410714968.112147) can0 19FA0402#F01C170413C7B80C (1410714968.115137) can0 19FA0402#F1EAFFFFFFF213A2 (1410714968.118128) can0 19FA0402#F21C7D7F54122700 (1410714968.121333) can0 19FA0402#F30000F214221513 (1410714968.124140) can0 19FA0402#F4B8D9101F000000 (1410714968.127161) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714968.130152) can0 0DF80502#E02F87C73F50DF47 (1410714968.133326) can0 0DF80502#E124C0751E3CEB42 (1410714968.136134) can0 0DF80502#E2430580F49573C0 (1410714968.139124) can0 0DF80502#E3B931038C579302 (1410714968.142146) can0 0DF80502#E40000000013FC0C (1410714968.145319) can0 0DF80502#E549008000AC0D00 (1410714968.148157) can0 0DF80502#E60000FFFFFFFFFF (1410714968.151118) can0 09F80102#93719A16CC1AB80D (1410714968.182154) can0 09F80202#88FC00000300FFFF (1410714968.207148) can0 09F80102#93719A16CC1AB80D (1410714968.307093) can0 09F80102#93719A16CC1AB80D (1410714968.407069) can0 09F80102#93719A16CC1AB80D (1410714968.432093) can0 09F80202#89FC00000300FFFF (1410714968.507075) can0 09F80102#93719A16CC1AB80D (1410714968.607050) can0 09F80102#93719A16CC1AB80D (1410714968.629847) can0 0DF50B11#0192030000FFFFFF (1410714968.682001) can0 09F80202#8AFC00000300FFFF (1410714968.707026) can0 09F80102#93719A16CC1AB80D (1410714968.806940) can0 09F80102#93719A16CC1AB80D (1410714968.906916) can0 09F80102#93719A16CC1AB80D (1410714968.932093) can0 09F80202#8BFC00000300FFFF (1410714968.943324) can0 19F212B0#40095E000064FFEF (1410714968.943873) can0 19F212B0#411B0A00FFFFFFFF (1410714968.944422) can0 19F214B0#00ED04C5FF5C785E (1410714969.006892) can0 09F80102#93719A16CC1AB80D (1410714969.067500) can0 0DF01002#8CF0C73F60064824 (1410714969.069849) can0 19FA0302#8CD3490069006400 (1410714969.072840) can0 19FA0402#00938CFD0C0B7F34 (1410714969.076075) can0 19FA0402#0165C62412F9FFFF (1410714969.078852) can0 19FA0402#02FFF220673064D5 (1410714969.081843) can0 19FA0402#03AD12FEFFFFFFF2 (1410714969.084834) can0 19FA0402#040E7F16B9208911 (1410714969.088038) can0 19FA0402#050B000000F216DC (1410714969.090815) can0 19FA0402#0608AD2DCA100B00 (1410714969.093836) can0 19FA0402#070000F201D0247C (1410714969.096827) can0 19FA0402#08D97F13F6FFFFFF (1410714969.099970) can0 19FA0402#09F21B390A957490 (1410714969.102900) can0 19FA0402#0A1008000000F217 (1410714969.105830) can0 19FA0402#0B7F07CE8D1D118B (1410714969.108820) can0 19FA0402#0CFFFFFFF2047314 (1410714969.112055) can0 19FA0402#0DAAD2D111F8FFFF (1410714969.114832) can0 19FA0402#0EFFF21FE80AB84D (1410714969.117670) can0 11F80E01#401B01985B620EC0 (1410714969.118250) can0 11F80E01#41C6C20DC0B99916 (1410714969.118769) can0 11F80E01#4278A5A400006A04 (1410714969.119349) can0 11F80E01#4300FFFFFF7F00FE (1410714969.119929) can0 19FA0402#0F451154000000F2 (1410714969.120814) can0 19FA0402#101C170413C78C0C (1410714969.124049) can0 19FA0402#1101000000F213A2 (1410714969.126826) can0 19FA0402#121C7D7F51122C00 (1410714969.129816) can0 19FA0402#130000F214221513 (1410714969.132838) can0 19FA0402#14B8E41029000000 (1410714969.136164) can0 19FA0402#15F2FFFFFFFFFFFF (1410714969.138850) can0 0DF80502#002F8CC73F600648 (1410714969.141810) can0 0DF80502#0124C0751E3CEB42 (1410714969.144801) can0 0DF80502#02430580F49573C0 (1410714969.148096) can0 0DF80502#03B931038C579302 (1410714969.150843) can0 0DF80502#040000000013FC0C (1410714969.153803) can0 0DF80502#0549008000AC0D00 (1410714969.156824) can0 0DF80502#060000FFFFFFFFFF (1410714969.160090) can0 09F80102#93719A16CC1AB80D (1410714969.192133) can0 09F80202#8DFC00000400FFFF (1410714969.216822) can0 09F80102#93719A16CC1AB80D (1410714969.222895) can0 1DEFFF01#C00AE598B6060404 (1410714969.223475) can0 1DEFFF01#C100000002FFFFFF (1410714969.316798) can0 09F80102#93719A16CC1AB80D (1410714969.416773) can0 09F80102#93719A16CC1AB80D (1410714969.441798) can0 09F80202#8EFC00000400FFFF (1410714969.516718) can0 09F80102#93719A16CC1AB80D (1410714969.616694) can0 09F80102#93719A16CC1AB80D (1410714969.631678) can0 0DF50B11#0192030000FFFFFF (1410714969.692072) can0 09F80202#8FFC00000400FFFF (1410714969.716669) can0 09F80102#93719A16CC1AB80D (1410714969.816645) can0 09F80102#93719A16CC1AB80D (1410714969.916590) can0 09F80102#93719A16CC1AB80D (1410714969.941615) can0 09F80202#90FC00000400FFFF (1410714970.016566) can0 09F80102#93719A16CC1AB80D (1410714970.111079) can0 0DF01002#91F0C73F702D4824 (1410714970.113520) can0 19FA0302#91D3490069006400 (1410714970.116511) can0 19FA0402#209391FD0C0B7F34 (1410714970.119501) can0 19FA0402#2165C65111FFFFFF (1410714970.122858) can0 19FA0402#22FFF220673064D5 (1410714970.125513) can0 19FA0402#23D212F9FFFFFFF2 (1410714970.128504) can0 19FA0402#240E7F16B9202F11 (1410714970.131525) can0 19FA0402#25FFFFFFFFF216DC (1410714970.134760) can0 19FA0402#2608AD2D3C100500 (1410714970.137507) can0 19FA0402#270000F201D0247C (1410714970.140498) can0 19FA0402#28D99713F2FFFFFF (1410714970.143488) can0 19FA0402#29F21B390A9574BA (1410714970.146723) can0 19FA0402#2A1008000000F217 (1410714970.149470) can0 19FA0402#2B7F07CE8DA11089 (1410714970.152491) can0 19FA0402#2CFFFFFFF2047314 (1410714970.155482) can0 19FA0402#2DAAD22E12F1FFFF (1410714970.158778) can0 19FA0402#2EFFF21FE80AB84D (1410714970.161494) can0 19FA0402#2F511157000000F2 (1410714970.164484) can0 19FA0402#301C170413C7B00C (1410714970.167506) can0 19FA0402#31FCFFFFFFF213A2 (1410714970.170771) can0 19FA0402#321C7D7FC0122500 (1410714970.173487) can0 19FA0402#330000F214221513 (1410714970.176508) can0 19FA0402#34B820112A000000 (1410714970.179530) can0 19FA0402#35F2FFFFFFFFFFFF (1410714970.182917) can0 0DF80502#202F91C73F702D48 (1410714970.185450) can0 0DF80502#2124C0751E3CEB42 (1410714970.188471) can0 0DF80502#22430580F49573C0 (1410714970.191462) can0 0DF80502#23B931038C579302 (1410714970.194788) can0 0DF80502#240000000013FC0C (1410714970.197474) can0 0DF80502#2549008000AC0D00 (1410714970.200526) can0 0DF80502#260000FFFFFFFFFF (1410714970.203455) can0 09F80102#93719A16CC1AB80D (1410714970.235529) can0 09F80202#92FC00000100FFFF (1410714970.260493) can0 09F80102#93719A16CC1AB80D (1410714970.360468) can0 09F80102#93719A16CC1AB80D (1410714970.443598) can0 19F212B0#60096D000064FFF5 (1410714970.444147) can0 19F212B0#611B0800FFFFFFFF (1410714970.444697) can0 19F214B0#00ED04C5FF6D786D (1410714970.460444) can0 09F80102#93719A16CC1AB80D (1410714970.485468) can0 09F80202#93FC00000100FFFF (1410714970.557246) can0 11F80E01#601B0108975C0EF0 (1410714970.557764) can0 11F80E01#619BC50DE0F59816 (1410714970.558344) can0 11F80E01#627DF2660000A004 (1410714970.558894) can0 11F80E01#630836AF000000FE (1410714970.560419) can0 09F80102#93719A16CC1AB80D (1410714970.633204) can0 0DF50B11#018F030000FFFFFF (1410714970.660395) can0 09F80102#93719A16CC1AB80D (1410714970.735377) can0 09F80202#94FC00000100FFFF (1410714970.760371) can0 09F80102#93719A16CC1AB80D (1410714970.860316) can0 09F80102#93719A16CC1AB80D (1410714970.960291) can0 09F80102#93719A16CC1AB80D (1410714970.985407) can0 09F80202#95FC00000100FFFF (1410714971.060236) can0 09F80102#93719A16CC1AB80D (1410714971.070795) can0 0DF01002#96F0C73F80544824 (1410714971.073359) can0 19FA0302#96D3490069006400 (1410714971.076197) can0 19FA0402#409396FD0C0B7F34 (1410714971.079218) can0 19FA0402#4165C6CB11FDFFFF (1410714971.082209) can0 19FA0402#42FFF220673064D5 (1410714971.085352) can0 19FA0402#43C212FBFFFFFFF2 (1410714971.088190) can0 19FA0402#440E7F16B9204F11 (1410714971.091212) can0 19FA0402#45FEFFFFFFF216DC (1410714971.094172) can0 19FA0402#4608AD2D74100D00 (1410714971.097346) can0 19FA0402#470000F201D0247C (1410714971.100214) can0 19FA0402#48D97913F0FFFFFF (1410714971.103175) can0 19FA0402#49F21B390A9574B5 (1410714971.106196) can0 19FA0402#4A100B000000F217 (1410714971.109461) can0 19FA0402#4B7F07CE8DE41089 (1410714971.112208) can0 19FA0402#4CFFFFFFF2047314 (1410714971.115198) can0 19FA0402#4DAAD27C11F0FFFF (1410714971.118189) can0 19FA0402#4EFFF21FE80AB84D (1410714971.121363) can0 19FA0402#4F581158000000F2 (1410714971.124201) can0 19FA0402#501C170413C74C0C (1410714971.127192) can0 19FA0402#51FCFFFFFFF213A2 (1410714971.130183) can0 19FA0402#521C7D7F2C122A00 (1410714971.133326) can0 19FA0402#530000F214221513 (1410714971.136164) can0 19FA0402#54B8161127000000 (1410714971.139185) can0 19FA0402#55F2FFFFFFFFFFFF (1410714971.142176) can0 0DF80502#402F96C73F805448 (1410714971.145319) can0 0DF80502#4124C0751E3CEB42 (1410714971.148157) can0 0DF80502#42430580F49573C0 (1410714971.151179) can0 0DF80502#43B931038C579302 (1410714971.154200) can0 0DF80502#440000000013FC0C (1410714971.157343) can0 0DF80502#4549008000AC0D00 (1410714971.160212) can0 0DF80502#460000FFFFFFFFFF (1410714971.163172) can0 09F80102#93719A16CC1AB80D (1410714971.195246) can0 09F80202#97FC00000200FFFF (1410714971.220179) can0 09F80102#93719A16CC1AB80D (1410714971.320155) can0 09F80102#93719A16CC1AB80D (1410714971.420130) can0 09F80102#93719A16CC1AB80D (1410714971.445399) can0 09F80202#98FC00000200FFFF (1410714971.520075) can0 09F80102#93719A16CC1AB80D (1410714971.620051) can0 09F80102#93719A16CC1AB80D (1410714971.634730) can0 0DF50B11#018F030000FFFFFF (1410714971.695094) can0 09F80202#99FC00000200FFFF (1410714971.720057) can0 09F80102#93719A16CC1AB80D (1410714971.820063) can0 09F80102#93719A16CC1AB80D (1410714971.920069) can0 09F80102#93719A16CC1AB80D (1410714971.943385) can0 19F212B0#80097C000064FFF6 (1410714971.943934) can0 19F212B0#811B0A00FFFFFFFF (1410714971.944514) can0 19F214B0#00ED04C5FF6C787C (1410714971.945094) can0 09F80202#9AFC00000200FFFF (1410714972.020075) can0 09F80102#93719A16CC1AB80D (1410714972.092921) can0 0DF01002#9BF0C73F907B4824 (1410714972.096094) can0 19FA0302#9BD3490069006400 (1410714972.098872) can0 19FA0402#60939BFD0C0B7F34 (1410714972.101862) can0 19FA0402#6165C68512F9FFFF (1410714972.103938) can0 11F80E01#801B01A929C40CD0 (1410714972.104487) can0 11F80E01#8131B90D20019A16 (1410714972.105036) can0 11F80E01#8284CDE40000DA04 (1410714972.105616) can0 11F80E01#83087CCA000000FE (1410714972.106165) can0 19FA0402#62FFF220673064D5 (1410714972.108088) can0 19FA0402#63E312FDFFFFFFF2 (1410714972.110865) can0 19FA0402#640E7F16B9209B11 (1410714972.113886) can0 19FA0402#65FBFFFFFFF216DC (1410714972.116877) can0 19FA0402#6608AD2DD5100600 (1410714972.120051) can0 19FA0402#670000F201D0247C (1410714972.122889) can0 19FA0402#68D92513F6FFFFFF (1410714972.125849) can0 19FA0402#69F21B390A957441 (1410714972.128870) can0 19FA0402#6A100E000000F217 (1410714972.132075) can0 19FA0402#6B7F07CE8D40117D (1410714972.134882) can0 19FA0402#6CFFFFFFF2047314 (1410714972.137873) can0 19FA0402#6DAAD2FA10EEFFFF (1410714972.140864) can0 19FA0402#6EFFF21FE80AB84D (1410714972.144099) can0 19FA0402#6F621159000000F2 (1410714972.146876) can0 19FA0402#701C170413C7AA0C (1410714972.149866) can0 19FA0402#7101000000F213A2 (1410714972.152857) can0 19FA0402#721C7D7F4C122F00 (1410714972.156062) can0 19FA0402#730000F214221513 (1410714972.158869) can0 19FA0402#74B83D112C000000 (1410714972.161890) can0 19FA0402#75F2FFFFFFFFFFFF (1410714972.164851) can0 0DF80502#602F9BC73F907B48 (1410714972.168085) can0 0DF80502#6124C0751E3CEB42 (1410714972.170863) can0 0DF80502#62430580F49573C0 (1410714972.173853) can0 0DF80502#63B931038C579302 (1410714972.176875) can0 0DF80502#640000000013FC0C (1410714972.180262) can0 0DF80502#6549008000AC0D00 (1410714972.183131) can0 0DF80502#660000FFFFFFFFFF (1410714972.185847) can0 09F80102#93719A16CC1AB80D (1410714972.216914) can0 09F80202#9CFC00000100FFFF (1410714972.241846) can0 09F80102#93719A16CC1AB80D (1410714972.341822) can0 09F80102#93719A16CC1AB80D (1410714972.441798) can0 09F80102#93719A16CC1AB80D (1410714972.466822) can0 09F80202#9DFC00000100FFFF (1410714972.541773) can0 09F80102#93719A16CC1AB80D (1410714972.636195) can0 0DF50B11#018F030000FFFFFF (1410714972.641779) can0 09F80102#93719A16CC1AB80D (1410714972.716730) can0 09F80202#9EFC00000100FFFF (1410714972.741724) can0 09F80102#93719A16CC1AB80D (1410714972.841700) can0 09F80102#93719A16CC1AB80D (1410714972.941645) can0 09F80102#93719A16CC1AB80D (1410714972.966853) can0 09F80202#9FFC00000100FFFF (1410714973.041590) can0 09F80102#93719A16CC1AB80D (1410714973.100672) can0 0DF01002#A0F0C73FA0A24824 (1410714973.103571) can0 19FA0302#A0D3490069006400 (1410714973.106806) can0 19FA0402#8093A0FD0C0B7F34 (1410714973.109553) can0 19FA0402#8165C6EE11FEFFFF (1410714973.112543) can0 19FA0402#82FFF220673064D5 (1410714973.115565) can0 19FA0402#83A51203000000F2 (1410714973.118769) can0 19FA0402#840E7F16B920AC11 (1410714973.121546) can0 19FA0402#85F1FFFFFFF216DC (1410714973.124567) can0 19FA0402#8608AD2DDC10F6FF (1410714973.127558) can0 19FA0402#87FFFFF201D0247C (1410714973.130854) can0 19FA0402#88D93013FCFFFFFF (1410714973.133540) can0 19FA0402#89F21B390A957471 (1410714973.136561) can0 19FA0402#8A1019000000F217 (1410714973.139552) can0 19FA0402#8B7F07CE8DAC1170 (1410714973.143122) can0 19FA0402#8CFFFFFFF2047314 (1410714973.145533) can0 19FA0402#8DAAD21212EEFFFF (1410714973.148554) can0 19FA0402#8EFFF21FE80AB84D (1410714973.151545) can0 19FA0402#8F71115C000000F2 (1410714973.154780) can0 19FA0402#901C170413C7C60C (1410714973.157557) can0 19FA0402#91FCFFFFFFF213A2 (1410714973.160548) can0 19FA0402#921C7D7FA6122800 (1410714973.163538) can0 19FA0402#930000F214221513 (1410714973.166773) can0 19FA0402#94B8B4102E000000 (1410714973.169550) can0 19FA0402#95F2FFFFFFFFFFFF (1410714973.172541) can0 0DF80502#802FA0C73FA0A248 (1410714973.175532) can0 0DF80502#8124C0751E3CEB42 (1410714973.178797) can0 0DF80502#82430580F49573C0 (1410714973.181544) can0 0DF80502#83B931038C579302 (1410714973.184534) can0 0DF80502#840000000013FC0C (1410714973.187525) can0 0DF80502#8549008000AC0D00 (1410714973.190821) can0 0DF80502#860000FFFFFFFFFF (1410714973.193537) can0 09F80102#93719A16CC1AB80D (1410714973.224604) can0 09F80202#A1FC00000700FFFF (1410714973.249567) can0 09F80102#93719A16CC1AB80D (1410714973.349543) can0 09F80102#93719A16CC1AB80D (1410714973.443415) can0 19F212B0#A0098B000064FFF6 (1410714973.443964) can0 19F212B0#A11B0A00FFFFFFFF (1410714973.444514) can0 19F214B0#00ED04C5FF6E788B (1410714973.449549) can0 09F80102#93719A16CC1AB80D (1410714973.474818) can0 09F80202#A2FC00000700FFFF (1410714973.549555) can0 09F80102#93719A16CC1AB80D (1410714973.637659) can0 0DF50B11#018F030000FFFFFF (1410714973.649561) can0 09F80102#93719A16CC1AB80D (1410714973.724451) can0 09F80202#A3FC00000700FFFF (1410714973.749567) can0 09F80102#93719A16CC1AB80D (1410714973.849573) can0 09F80102#93719A16CC1AB80D (1410714973.949854) can0 09F80102#93719A16CC1AB80D (1410714973.974360) can0 09F80202#A4FC00000700FFFF (1410714974.049494) can0 09F80102#93719A16CC1AB80D (1410714974.060786) can0 0DF01002#A5F0C73FB0C94824 (1410714974.063258) can0 19FA0302#A5D3490069006400 (1410714974.066248) can0 19FA0402#A093A5FD0C0B7F34 (1410714974.069453) can0 19FA0402#A165C6E411020000 (1410714974.072260) can0 19FA0402#A200F220673013D6 (1410714974.075251) can0 19FA0402#A36512FFFFFFFFF2 (1410714974.078242) can0 19FA0402#A40E7F16B920B911 (1410714974.081385) can0 19FA0402#A5F0FFFFFFF216DC (1410714974.084254) can0 19FA0402#A608AD2DC610EFFF (1410714974.087244) can0 19FA0402#A7FFFFF201D0247C (1410714974.090266) can0 19FA0402#A8D98A13F9FFFFFF (1410714974.093378) can0 19FA0402#A9F21B390A95749F (1410714974.096247) can0 19FA0402#AA1014000000F217 (1410714974.099238) can0 19FA0402#AB7F07CE8D5D1174 (1410714974.102259) can0 19FA0402#ACFFFFFFF2047314 (1410714974.105372) can0 19FA0402#ADAAD26512F5FFFF (1410714974.108240) can0 19FA0402#AEFFF21FE80AB84D (1410714974.111262) can0 19FA0402#AF5F1159000000F2 (1410714974.114252) can0 19FA0402#B01C170413C7DE0C (1410714974.117396) can0 19FA0402#B1FAFFFFFFF213A2 (1410714974.120234) can0 19FA0402#B21C7D7F97122800 (1410714974.123225) can0 19FA0402#B30000F214221513 (1410714974.126246) can0 19FA0402#B4B82D1126000000 (1410714974.129481) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714974.132227) can0 0DF80502#A02FA5C73FB0C948 (1410714974.135218) can0 0DF80502#A124C0751E3CEB42 (1410714974.138209) can0 0DF80502#A2430580F49573C0 (1410714974.141383) can0 0DF80502#A3B931038C579302 (1410714974.144251) can0 0DF80502#A40000000013FC0C (1410714974.147242) can0 0DF80502#A549008000AC0D00 (1410714974.150263) can0 0DF80502#A60000FFFFFFFFFF (1410714974.153376) can0 09F80102#93719A16CC1AB80D (1410714974.185450) can0 09F80202#A6FC00000100FFFF (1410714974.210261) can0 09F80102#93719A16CC1AB80D (1410714974.222590) can0 1DEFFF01#E00AE598B6060404 (1410714974.223170) can0 1DEFFF01#E100000002FFFFFF (1410714974.310206) can0 09F80102#93719A16CC1AB80D (1410714974.410181) can0 09F80102#93719A16CC1AB80D (1410714974.435206) can0 09F80202#A7FC00000100FFFF (1410714974.510157) can0 09F80102#93719A16CC1AB80D (1410714974.530817) can0 11F80E01#A01B014875520E60 (1410714974.531367) can0 11F80E01#A1589F0D00EEA616 (1410714974.531916) can0 11F80E01#A2802ACBE301F508 (1410714974.532465) can0 11F80E01#A309B6C5000000FE (1410714974.610133) can0 09F80102#93719A16CC1AB80D (1410714974.639185) can0 0DF50B11#018F030000FFFFFF (1410714974.685450) can0 09F80202#A8FC00000100FFFF (1410714974.710078) can0 09F80102#93719A16CC1AB80D (1410714974.810053) can0 09F80102#93719A16CC1AB80D (1410714974.910029) can0 09F80102#93719A16CC1AB80D (1410714974.935053) can0 09F80202#A9FC00000100FFFF (1410714974.943385) can0 19F212B0#C0099A000064FFF7 (1410714974.943964) can0 19F212B0#C11B0900FFFFFFFF (1410714974.944514) can0 19F214B0#00E304C5FF6C789A (1410714975.009974) can0 09F80102#93719A16CC1AB80D (1410714975.071070) can0 0DF01002#AAF0C73FC0F04824 (1410714975.073939) can0 19FA0302#AAD3490069006400 (1410714975.076929) can0 19FA0402#C093AAFD0C0B7F34 (1410714975.080073) can0 19FA0402#C165C68311010000 (1410714975.082941) can0 19FA0402#C200F220673013D6 (1410714975.085932) can0 19FA0402#C3A212F8FFFFFFF2 (1410714975.088923) can0 19FA0402#C40E7F16B920E711 (1410714975.092127) can0 19FA0402#C5F7FFFFFFF216DC (1410714975.094935) can0 19FA0402#C608AD2DD810EDFF (1410714975.097926) can0 19FA0402#C7FFFFF201D0247C (1410714975.100947) can0 19FA0402#C8D97B13F2FFFFFF (1410714975.104151) can0 19FA0402#C9F21B390A9574CE (1410714975.106928) can0 19FA0402#CA1008000000F217 (1410714975.109919) can0 19FA0402#CB7F07CE8D48117A (1410714975.112940) can0 19FA0402#CCFFFFFFF2047314 (1410714975.116114) can0 19FA0402#CDAAD24A12F4FFFF (1410714975.118922) can0 19FA0402#CEFFF21FE80AB84D (1410714975.121912) can0 19FA0402#CF491156000000F2 (1410714975.124934) can0 19FA0402#D01C170413C7D20C (1410714975.128107) can0 19FA0402#D1FFFFFFFFF213A2 (1410714975.130915) can0 19FA0402#D21C7D7F52122700 (1410714975.133906) can0 19FA0402#D30000F214221513 (1410714975.136927) can0 19FA0402#D4B8F20F2B000000 (1410714975.140101) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714975.142939) can0 0DF80502#C02FAAC73FC0F048 (1410714975.145899) can0 0DF80502#C124C0751E3CEB42 (1410714975.148920) can0 0DF80502#C2430580F49573C0 (1410714975.152125) can0 0DF80502#C3B931038C579302 (1410714975.154932) can0 0DF80502#C40000000013FC0C (1410714975.157191) can0 11F80E01#C01B0188F64A0E90 (1410714975.157740) can0 11F80E01#C1FDB80D20029A16 (1410714975.158320) can0 0DF80502#C549008000AC0D00 (1410714975.158869) can0 11F80E01#C28CFFFF00007285 (1410714975.159449) can0 11F80E01#C300154F000000FE (1410714975.160944) can0 0DF80502#C60000FFFFFFFFFF (1410714975.164118) can0 09F80102#93719A16CC1AB80D (1410714975.194941) can0 09F80202#ABFC00000200FFFF (1410714975.220087) can0 09F80102#93719A16CC1AB80D (1410714975.320094) can0 09F80102#93719A16CC1AB80D (1410714975.420100) can0 09F80102#93719A16CC1AB80D (1410714975.444880) can0 09F80202#ACFC00000200FFFF (1410714975.520106) can0 09F80102#93719A16CC1AB80D (1410714975.620112) can0 09F80102#93719A16CC1AB80D (1410714975.640711) can0 0DF50B11#018F030000FFFFFF (1410714975.694941) can0 09F80202#ADFC00000200FFFF (1410714975.720087) can0 09F80102#93719A16CC1AB80D (1410714975.820032) can0 09F80102#93719A16CC1AB80D (1410714975.920008) can0 09F80102#93719A16CC1AB80D (1410714975.944697) can0 09F80202#AEFC00000200FFFF (1410714976.019678) can0 09F80102#93719A16CC1AB80D (1410714976.050196) can0 11F80E01#E01B0132D74A10E0 (1410714976.050715) can0 11F80E01#E121E30DC04D9116 (1410714976.051264) can0 11F80E01#E28EF0BD8601A6C0 (1410714976.051813) can0 11F80E01#E308E5BE000000FE (1410714976.081538) can0 0DF01002#AFF0C73FD0174924 (1410714976.083613) can0 19FA0302#AFD3490069006400 (1410714976.086817) can0 19FA0402#E093AFFD0C0B7F34 (1410714976.089625) can0 19FA0402#E165C6FF11050000 (1410714976.092615) can0 19FA0402#E200F220673013D6 (1410714976.095637) can0 19FA0402#E39D12FCFFFFFFF2 (1410714976.098811) can0 19FA0402#E40E7F16B920B811 (1410714976.101618) can0 19FA0402#E5FAFFFFFFF216DC (1410714976.104609) can0 19FA0402#E608AD2DFC10F5FF (1410714976.107630) can0 19FA0402#E7FFFFF201D0247C (1410714976.110804) can0 19FA0402#E8D96813F3FFFFFF (1410714976.113581) can0 19FA0402#E9F21B390A9574B6 (1410714976.116633) can0 19FA0402#EA100A000000F217 (1410714976.119593) can0 19FA0402#EB7F07CE8D611178 (1410714976.122919) can0 19FA0402#ECFFFFFFF2047314 (1410714976.125605) can0 19FA0402#EDAAD2F711F2FFFF (1410714976.128626) can0 19FA0402#EEFFF21FE80AB84D (1410714976.131617) can0 19FA0402#EF401153000000F2 (1410714976.134821) can0 19FA0402#F01C170413C7A20C (1410714976.137598) can0 19FA0402#F103000000F213A2 (1410714976.140620) can0 19FA0402#F21C7D7F9A122700 (1410714976.143580) can0 19FA0402#F30000F214221513 (1410714976.146815) can0 19FA0402#F4B861102B000000 (1410714976.149622) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714976.152613) can0 0DF80502#E02FAFC73FD01749 (1410714976.155573) can0 0DF80502#E124C0751E3CEB42 (1410714976.158808) can0 0DF80502#E2430580F49573C0 (1410714976.161585) can0 0DF80502#E3B931038C579302 (1410714976.164606) can0 0DF80502#E40000000013FC0C (1410714976.167597) can0 0DF80502#E549008000AC0D00 (1410714976.170893) can0 0DF80502#E60000FFFFFFFFFF (1410714976.173579) can0 09F80102#93719A16CC1AB80D (1410714976.205653) can0 09F80202#B0FC00000100FFFF (1410714976.230830) can0 09F80102#93719A16CC1AB80D (1410714976.330897) can0 09F80102#93719A16CC1AB80D (1410714976.430842) can0 09F80102#93719A16CC1AB80D (1410714976.443659) can0 19F212B0#E009A9000064FFF7 (1410714976.444209) can0 19F212B0#E11B0A00FFFFFFFF (1410714976.444788) can0 19F214B0#00ED04C5FF6578A9 (1410714976.455561) can0 09F80202#B1FC00000100FFFF (1410714976.530848) can0 09F80102#93719A16CC1AB80D (1410714976.630823) can0 09F80102#93719A16CC1AB80D (1410714976.705469) can0 09F80202#B2FC00000100FFFF (1410714976.730830) can0 09F80102#93719A16CC1AB80D (1410714976.742548) can0 0DF50B11#018C030000FFFFFF (1410714976.830775) can0 09F80102#93719A16CC1AB80D (1410714976.930750) can0 09F80102#93719A16CC1AB80D (1410714976.955408) can0 09F80202#B3FC00000100FFFF (1410714977.030329) can0 09F80102#93719A16CC1AB80D (1410714977.090266) can0 0DF01002#B4F0C73FE03E4924 (1410714977.093439) can0 19FA0302#B4D3490069006400 (1410714977.096308) can0 19FA0402#0093B4FD0C0B7F34 (1410714977.099299) can0 19FA0402#0165C67612010000 (1410714977.102290) can0 19FA0402#0200F220673013D6 (1410714977.105433) can0 19FA0402#03F512F9FFFFFFF2 (1410714977.108302) can0 19FA0402#040E7F16B920BF11 (1410714977.111292) can0 19FA0402#05F2FFFFFFF216DC (1410714977.114283) can0 19FA0402#0608AD2D1E11FAFF (1410714977.117426) can0 19FA0402#07FFFFF201D0247C (1410714977.120295) can0 19FA0402#08D91A13F4FFFFFF (1410714977.123286) can0 19FA0402#09F21B390A95747A (1410714977.126307) can0 19FA0402#0A100B000000F217 (1410714977.129481) can0 19FA0402#0B7F07CE8DB81170 (1410714977.132288) can0 19FA0402#0CFFFFFFF2047314 (1410714977.135279) can0 19FA0402#0DAAD23012F3FFFF (1410714977.138270) can0 19FA0402#0EFFF21FE80AB84D (1410714977.141413) can0 19FA0402#0F011156000000F2 (1410714977.144282) can0 19FA0402#101C170413C7860C (1410714977.147303) can0 19FA0402#11F4FFFFFFF213A2 (1410714977.150294) can0 19FA0402#121C7D7F26122B00 (1410714977.153437) can0 19FA0402#130000F214221513 (1410714977.156306) can0 19FA0402#14B8DE1021000000 (1410714977.159296) can0 19FA0402#15F2FFFFFFFFFFFF (1410714977.162287) can0 0DF80502#002FB4C73FE03E49 (1410714977.165400) can0 0DF80502#0124C0751E3CEB42 (1410714977.168269) can0 0DF80502#02430580F49573C0 (1410714977.171259) can0 0DF80502#03B931038C579302 (1410714977.174281) can0 0DF80502#040000000013FC0C (1410714977.177424) can0 0DF80502#0549008000AC0D00 (1410714977.180292) can0 0DF80502#060000FFFFFFFFFF (1410714977.183253) can0 09F80102#93719A16CC1AB80D (1410714977.214320) can0 09F80202#B5FC00000800FFFF (1410714977.239283) can0 09F80102#93719A16CC1AB80D (1410714977.330134) can0 11F80E01#001B0148AA2C0EB0 (1410714977.330683) can0 11F80E01#015CF40D40568116 (1410714977.331263) can0 11F80E01#028841ED0D035440 (1410714977.331812) can0 11F80E01#0308FFFFFF7F00FE (1410714977.339259) can0 09F80102#93719A16CC1AB80D (1410714977.439234) can0 09F80102#93719A16CC1AB80D (1410714977.464259) can0 09F80202#B6FC00000800FFFF (1410714977.539179) can0 09F80102#93719A16CC1AB80D (1410714977.639185) can0 09F80102#93719A16CC1AB80D (1410714977.714167) can0 09F80202#B7FC00000800FFFF (1410714977.739161) can0 09F80102#93719A16CC1AB80D (1410714977.744105) can0 0DF50B11#018C030000FFFFFF (1410714977.839136) can0 09F80102#93719A16CC1AB80D (1410714977.939082) can0 09F80102#93719A16CC1AB80D (1410714977.943476) can0 19F212B0#0009B8000064FFF7 (1410714977.944025) can0 19F212B0#011B0A00FFFFFFFF (1410714977.944605) can0 19F214B0#00ED04C5FF6C78B8 (1410714977.964228) can0 09F80202#B8FC00000800FFFF (1410714978.023341) can0 11F80E01#201B01985B620EC0 (1410714978.023890) can0 11F80E01#21C6C20DC0B99916 (1410714978.024439) can0 11F80E01#229CA5A400004CC0 (1410714978.025019) can0 11F80E01#2308FFFFFF7F00FE (1410714978.039027) can0 09F80102#93719A16CC1AB80D (1410714978.065913) can0 0DF01002#B9F0C73FF0654924 (1410714978.068171) can0 19FA0302#B9D3490069006400 (1410714978.070979) can0 19FA0402#2093B9FD0C0B7F34 (1410714978.074000) can0 19FA0402#2165C6C811000000 (1410714978.076990) can0 19FA0402#2200F220673013D6 (1410714978.080103) can0 19FA0402#233613F1FFFFFFF2 (1410714978.082972) can0 19FA0402#240E7F16B9209C11 (1410714978.085993) can0 19FA0402#25F8FFFFFFF216DC (1410714978.088984) can0 19FA0402#2608AD2DBD10FCFF (1410714978.092158) can0 19FA0402#27FFFFF201D0247C (1410714978.094996) can0 19FA0402#28D96F13F3FFFFFF (1410714978.097987) can0 19FA0402#29F21B390A9574A3 (1410714978.101008) can0 19FA0402#2A100A000000F217 (1410714978.104243) can0 19FA0402#2B7F07CE8DF11077 (1410714978.106989) can0 19FA0402#2CFFFFFFF2047314 (1410714978.109980) can0 19FA0402#2DAAD21B12F7FFFF (1410714978.112971) can0 19FA0402#2EFFF21FE80AB84D (1410714978.116175) can0 19FA0402#2F261156000000F2 (1410714978.118983) can0 19FA0402#301C170413C7910C (1410714978.121973) can0 19FA0402#31EDFFFFFFF213A2 (1410714978.124964) can0 19FA0402#321C7D7F09132700 (1410714978.128138) can0 19FA0402#330000F214221513 (1410714978.130976) can0 19FA0402#34B8021121000000 (1410714978.133997) can0 19FA0402#35F2FFFFFFFFFFFF (1410714978.136988) can0 0DF80502#202FB9C73FF06549 (1410714978.140101) can0 0DF80502#212400A7950AE242 (1410714978.142969) can0 0DF80502#22430520335FCAD0 (1410714978.145960) can0 0DF80502#23B93103127E9502 (1410714978.149012) can0 0DF80502#240000000013FC0C (1410714978.152186) can0 0DF80502#2549008000AC0D00 (1410714978.154993) can0 0DF80502#260000FFFFFFFFFF (1410714978.157954) can0 09F80102#6C719A16121BB80D (1410714978.189997) can0 09F80202#BAFC00000200FFFF (1410714978.214960) can0 09F80102#6C719A16121BB80D (1410714978.314936) can0 09F80102#6C719A16121BB80D (1410714978.414912) can0 09F80102#6C719A16121BB80D (1410714978.440150) can0 09F80202#BBFC00000200FFFF (1410714978.514887) can0 09F80102#6C719A16121BB80D (1410714978.614863) can0 09F80102#6C719A16121BB80D (1410714978.689875) can0 09F80202#BCFC00000200FFFF (1410714978.714869) can0 09F80102#6C719A16121BB80D (1410714978.745692) can0 0DF50B11#018C030000FFFFFF (1410714978.814875) can0 09F80102#6C719A16121BB80D (1410714978.914851) can0 09F80102#6C719A16121BB80D (1410714978.940089) can0 09F80202#BDFC00000200FFFF (1410714979.014857) can0 09F80102#6C719A16121BB80D (1410714979.075404) can0 0DF01002#BEF0C73F008D4924 (1410714979.077692) can0 19FA0302#BED3490069006400 (1410714979.080683) can0 19FA0402#4093BEFD0C0B7F34 (1410714979.083674) can0 19FA0402#4165C6DD11070000 (1410714979.086817) can0 19FA0402#4200F220673013D6 (1410714979.089686) can0 19FA0402#430113F3FFFFFFF2 (1410714979.092677) can0 19FA0402#440E7F16B920BE11 (1410714979.095667) can0 19FA0402#45F5FFFFFFF216DC (1410714979.098811) can0 19FA0402#4608AD2DCA10FAFF (1410714979.101679) can0 19FA0402#47FFFFF201D0247C (1410714979.104670) can0 19FA0402#48D97F1302000000 (1410714979.107661) can0 19FA0402#49F21B390A9574C6 (1410714979.110834) can0 19FA0402#4A1001000000F217 (1410714979.113642) can0 19FA0402#4B7F07CE8D2F1175 (1410714979.116663) can0 19FA0402#4CFFFFFFF2047314 (1410714979.119654) can0 19FA0402#4DAAD2FF11F1FFFF (1410714979.122858) can0 19FA0402#4EFFF21FE80AB84D (1410714979.125666) can0 19FA0402#4FFD1050000000F2 (1410714979.128657) can0 19FA0402#501C170413C7860C (1410714979.131678) can0 19FA0402#51FBFFFFFFF213A2 (1410714979.134821) can0 19FA0402#521C7D7FA7122700 (1410714979.137629) can0 19FA0402#530000F214221513 (1410714979.140650) can0 19FA0402#54B84F1120000000 (1410714979.143671) can0 19FA0402#55F2FFFFFFFFFFFF (1410714979.146815) can0 0DF80502#402FBEC73F008D49 (1410714979.149653) can0 0DF80502#412400A7950AE242 (1410714979.152644) can0 0DF80502#42430520335FCAD0 (1410714979.155634) can0 0DF80502#43B93103127E9502 (1410714979.158839) can0 0DF80502#440000000013FC0C (1410714979.161646) can0 0DF80502#4549008000AC0D00 (1410714979.164667) can0 0DF80502#460000FFFFFFFFFF (1410714979.167628) can0 09F80102#6C719A16121BB80D (1410714979.199702) can0 09F80202#BFFC00000100FFFF (1410714979.223750) can0 11F80E01#401B017C60290E00 (1410714979.224329) can0 11F80E01#41E4070E202EA016 (1410714979.224879) can0 09F80102#6C719A16121BB80D (1410714979.225428) can0 11F80E01#42A359B8E801E505 (1410714979.225977) can0 11F80E01#4308FFFFFF7F00FE (1410714979.226557) can0 1DEFFF01#000AE598B6060404 (1410714979.227137) can0 1DEFFF01#0100000002FFFFFF (1410714979.324641) can0 09F80102#6C719A16121BB80D (1410714979.424616) can0 09F80102#6C719A16121BB80D (1410714979.443476) can0 19F212B0#2009C7000064FFF8 (1410714979.444025) can0 19F212B0#211BA004FFFFFFFF (1410714979.444575) can0 19F214B0#00E704C5FF6D78C7 (1410714979.449610) can0 09F80202#C0FC00000100FFFF (1410714979.524561) can0 09F80102#6C719A16121BB80D (1410714979.624537) can0 09F80102#6C719A16121BB80D (1410714979.699549) can0 09F80202#C1FC00000100FFFF (1410714979.724543) can0 09F80102#6C719A16121BB80D (1410714979.747187) can0 0DF50B11#018C030000FFFFFF (1410714979.824519) can0 09F80102#6C719A16121BB80D (1410714979.924464) can0 09F80102#6C719A16121BB80D (1410714979.949732) can0 09F80202#C2FC00000100FFFF (1410714980.024409) can0 09F80102#6C719A16121BB80D (1410714980.111475) can0 0DF01002#C3F0C73F10B44924 (1410714980.114344) can0 19FA0302#C3D3490069006400 (1410714980.117457) can0 19FA0402#6093C3FD0C0B7F34 (1410714980.120386) can0 19FA0402#6165C66812FAFFFF (1410714980.123347) can0 19FA0402#62FFF220673013D6 (1410714980.126337) can0 19FA0402#63DE12F4FFFFFFF2 (1410714980.129511) can0 19FA0402#640E7F16B920E111 (1410714980.132349) can0 19FA0402#65F7FFFFFFF216DC (1410714980.135340) can0 19FA0402#6608AD2DE710F7FF (1410714980.138361) can0 19FA0402#67FFFFF201D0247C (1410714980.141535) can0 19FA0402#68D99413FCFFFFFF (1410714980.144312) can0 19FA0402#69F21B390A9574B2 (1410714980.147334) can0 19FA0402#6A1000000000F217 (1410714980.150324) can0 19FA0402#6B7F07CE8D94116E (1410714980.153468) can0 19FA0402#6CFFFFFFF2047314 (1410714980.156336) can0 19FA0402#6DAAD23F11F9FFFF (1410714980.159327) can0 19FA0402#6EFFF21FE80AB84D (1410714980.162348) can0 19FA0402#6F0F1152000000F2 (1410714980.165461) can0 19FA0402#701C170413C7690C (1410714980.168330) can0 19FA0402#7105000000F213A2 (1410714980.171320) can0 19FA0402#721C7D7F3F122900 (1410714980.174311) can0 19FA0402#730000F214221513 (1410714980.177485) can0 19FA0402#74B8C21025000000 (1410714980.180354) can0 19FA0402#75F2FFFFFFFFFFFF (1410714980.183314) can0 0DF80502#602FC3C73F10B449 (1410714980.186304) can0 0DF80502#612400A7950AE242 (1410714980.189600) can0 0DF80502#62430520335FCAD0 (1410714980.192316) can0 0DF80502#63B93103127E9502 (1410714980.195338) can0 0DF80502#640000000013FC0C (1410714980.198328) can0 0DF80502#6549008000AC0D00 (1410714980.201533) can0 0DF80502#660000FFFFFFFFFF (1410714980.204310) can0 09F80102#6C719A16121BB80D (1410714980.235346) can0 09F80202#C4FC00000100FFFF (1410714980.260340) can0 09F80102#6C719A16121BB80D (1410714980.360316) can0 09F80102#6C719A16121BB80D (1410714980.460261) can0 09F80102#6C719A16121BB80D (1410714980.485529) can0 09F80202#C5FC00000100FFFF (1410714980.560236) can0 09F80102#6C719A16121BB80D (1410714980.610346) can0 11F80E01#601B0108975C0EF0 (1410714980.610896) can0 11F80E01#619BC50D80F49816 (1410714980.611445) can0 11F80E01#62A5C36D00006540 (1410714980.612025) can0 11F80E01#6300E5AF000000FE (1410714980.660212) can0 09F80102#6C719A16121BB80D (1410714980.735224) can0 09F80202#C6FC00000100FFFF (1410714980.748591) can0 0DF50B11#018F030000FFFFFF (1410714980.760188) can0 09F80102#6C719A16121BB80D (1410714980.860163) can0 09F80102#6C719A16121BB80D (1410714980.943446) can0 19F212B0#4009D6000064FFF9 (1410714980.944025) can0 19F212B0#411B0900FFFFFFFF (1410714980.944575) can0 19F214B0#00EA04C5FF6D78D6 (1410714980.960169) can0 09F80102#6C719A16121BB80D (1410714980.985468) can0 09F80202#C7FC00000100FFFF (1410714981.060175) can0 09F80102#6C719A16121BB80D (1410714981.071528) can0 0DF01002#C8F0C73F20DB4924 (1410714981.074030) can0 19FA0302#C8D3490069006400 (1410714981.077052) can0 19FA0402#8093C8FD0C0B7F34 (1410714981.080134) can0 19FA0402#8165C6B411F2FFFF (1410714981.083033) can0 19FA0402#82FFF220673013D6 (1410714981.086054) can0 19FA0402#83F312F5FFFFFFF2 (1410714981.089045) can0 19FA0402#840E7F16B920C211 (1410714981.092188) can0 19FA0402#85F5FFFFFFF216DC (1410714981.095026) can0 19FA0402#8608AD2DEF10F2FF (1410714981.098048) can0 19FA0402#87FFFFF201D0247C (1410714981.101038) can0 19FA0402#88D9B713F5FFFFFF (1410714981.104182) can0 19FA0402#89F21B390A957488 (1410714981.107050) can0 19FA0402#8A100A000000F217 (1410714981.110011) can0 19FA0402#8B7F07CE8DAB116B (1410714981.113032) can0 19FA0402#8CFFFFFFF2047314 (1410714981.116175) can0 19FA0402#8DAAD2AF11010000 (1410714981.119013) can0 19FA0402#8E00F21FE80AB84D (1410714981.122034) can0 19FA0402#8F20114D000000F2 (1410714981.125025) can0 19FA0402#901C170413C77F0C (1410714981.128168) can0 19FA0402#9113000000F213A2 (1410714981.131037) can0 19FA0402#921C7D7FDC122000 (1410714981.134028) can0 19FA0402#930000F214221513 (1410714981.137049) can0 19FA0402#94B8BE102D000000 (1410714981.140162) can0 19FA0402#95F2FFFFFFFFFFFF (1410714981.143031) can0 0DF80502#802FC8C73F20DB49 (1410714981.146021) can0 0DF80502#812400A7950AE242 (1410714981.149012) can0 0DF80502#82430520335FCAD0 (1410714981.152247) can0 0DF80502#83B93103127E9502 (1410714981.155024) can0 0DF80502#840000000013FC0C (1410714981.158015) can0 0DF80502#8549008000AC0D00 (1410714981.161036) can0 0DF80502#860000FFFFFFFFFF (1410714981.164179) can0 09F80102#6C719A16121BB80D (1410714981.196253) can0 09F80202#C9FC00000300FFFF (1410714981.221033) can0 09F80102#6C719A16121BB80D (1410714981.321009) can0 09F80102#6C719A16121BB80D (1410714981.420954) can0 09F80102#6C719A16121BB80D (1410714981.445979) can0 09F80202#CAFC00000300FFFF (1410714981.520930) can0 09F80102#6C719A16121BB80D (1410714981.620905) can0 09F80102#6C719A16121BB80D (1410714981.696253) can0 09F80202#CBFC00000300FFFF (1410714981.720881) can0 09F80102#6C719A16121BB80D (1410714981.750147) can0 0DF50B11#018F030000FFFFFF (1410714981.820856) can0 09F80102#6C719A16121BB80D (1410714981.920802) can0 09F80102#6C719A16121BB80D (1410714981.945856) can0 09F80202#CCFC00000300FFFF (1410714982.020777) can0 09F80102#6C719A16121BB80D (1410714982.086176) can0 0DF01002#CDF0C73F30024A24 (1410714982.088709) can0 19FA0302#CDD3490069006400 (1410714982.091730) can0 19FA0402#A093CDFD0C0B7F34 (1410714982.094904) can0 19FA0402#A165C60512F2FFFF (1410714982.097712) can0 19FA0402#A2FFF220673013D6 (1410714982.100733) can0 19FA0402#A3CC12F4FFFFFFF2 (1410714982.103693) can0 19FA0402#A40E7F16B920CD11 (1410714982.106928) can0 19FA0402#A5F4FFFFFFF216DC (1410714982.109705) can0 19FA0402#A608AD2DDD10EEFF (1410714982.112727) can0 19FA0402#A7FFFFF201D0247C (1410714982.115717) can0 19FA0402#A8D9CA13FAFFFFFF (1410714982.118830) can0 19FA0402#A9F21B390A95747B (1410714982.121729) can0 19FA0402#AA1006000000F217 (1410714982.124689) can0 19FA0402#AB7F07CE8D9C116A (1410714982.127711) can0 19FA0402#ACFFFFFFF2047314 (1410714982.130854) can0 19FA0402#ADAAD28B11040000 (1410714982.133692) can0 19FA0402#AE00F21FE80AB84D (1410714982.136683) can0 19FA0402#AF151155000000F2 (1410714982.139704) can0 19FA0402#B01C170413C7520C (1410714982.142908) can0 19FA0402#B10B000000F213A2 (1410714982.145686) can0 19FA0402#B21C7D7FCF112000 (1410714982.148707) can0 19FA0402#B30000F214221513 (1410714982.151698) can0 19FA0402#B4B8C31034000000 (1410714982.154871) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714982.157709) can0 0DF80502#A02FCDC73F30024A (1410714982.160700) can0 0DF80502#A12400A7950AE242 (1410714982.163691) can0 0DF80502#A2430520335FCAD0 (1410714982.166834) can0 0DF80502#A3B93103127E9502 (1410714982.169733) can0 0DF80502#A40000000013FC0C (1410714982.172694) can0 0DF80502#A549008000AC0D00 (1410714982.175715) can0 0DF80502#A60000FFFFFFFFFF (1410714982.178858) can0 09F80102#6C719A16121BB80D (1410714982.210902) can0 09F80202#CEFC00000400FFFF (1410714982.235712) can0 09F80102#6C719A16121BB80D (1410714982.335657) can0 09F80102#6C719A16121BB80D (1410714982.435664) can0 09F80102#6C719A16121BB80D (1410714982.443507) can0 19F212B0#6009E5000064FFF8 (1410714982.444056) can0 19F212B0#611B0A00FFFFFFFF (1410714982.444605) can0 19F214B0#00EC04C4FF6C78E5 (1410714982.460657) can0 09F80202#CFFC00000400FFFF (1410714982.503413) can0 11F80E01#801B01A929C40CE0 (1410714982.503962) can0 11F80E01#8131B90D20019A16 (1410714982.504511) can0 11F80E01#82B0A2100000E508 (1410714982.505091) can0 11F80E01#83017CCA000000FE (1410714982.535609) can0 09F80102#6C719A16121BB80D (1410714982.635584) can0 09F80102#6C719A16121BB80D (1410714982.710902) can0 09F80202#D0FC00000400FFFF (1410714982.735560) can0 09F80102#6C719A16121BB80D (1410714982.751643) can0 0DF50B11#018F030000FFFFFF (1410714982.835505) can0 09F80102#6C719A16121BB80D (1410714982.935480) can0 09F80102#6C719A16121BB80D (1410714982.960535) can0 09F80202#D1FC00000400FFFF (1410714983.035456) can0 09F80102#6C719A16121BB80D (1410714983.101008) can0 0DF01002#D2F0C73F40294A24 (1410714983.103388) can0 19FA0302#D2D3490068006400 (1410714983.106409) can0 19FA0402#C093D2FD0C0B7F34 (1410714983.109583) can0 19FA0402#C165C64912F4FFFF (1410714983.112391) can0 19FA0402#C2FFF220673013D6 (1410714983.115412) can0 19FA0402#C3F812F6FFFFFFF2 (1410714983.118403) can0 19FA0402#C40E7F16B920A711 (1410714983.121577) can0 19FA0402#C5FEFFFFFFF216DC (1410714983.124384) can0 19FA0402#C608AD2DC310EEFF (1410714983.127406) can0 19FA0402#C7FFFFF201D0247C (1410714983.130396) can0 19FA0402#C8D95513FBFFFFFF (1410714983.133509) can0 19FA0402#C9F21B390A957498 (1410714983.136408) can0 19FA0402#CA1000000000F217 (1410714983.139399) can0 19FA0402#CB7F07CE8D6C116E (1410714983.142390) can0 19FA0402#CCFFFFFFF2047314 (1410714983.145502) can0 19FA0402#CDAAD22712040000 (1410714983.148371) can0 19FA0402#CE00F21FE80AB84D (1410714983.151392) can0 19FA0402#CF0F1156000000F2 (1410714983.154383) can0 19FA0402#D01C170413C73C0C (1410714983.157557) can0 19FA0402#D1F2FFFFFFF213A2 (1410714983.160365) can0 19FA0402#D21C7D7FDE112200 (1410714983.163386) can0 19FA0402#D30000F214221513 (1410714983.166376) can0 19FA0402#D4B8E71035000000 (1410714983.169581) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714983.172388) can0 0DF80502#C02FD2C73F40294A (1410714983.175379) can0 0DF80502#C12400A7950AE242 (1410714983.178370) can0 0DF80502#C2430520335FCAD0 (1410714983.181574) can0 0DF80502#C3B93103127E9502 (1410714983.184382) can0 0DF80502#C40000000013FC0C (1410714983.187373) can0 0DF80502#C549008000AC0D00 (1410714983.190394) can0 0DF80502#C60000FFFFFFFFFF (1410714983.193507) can0 09F80102#6C719A16121BB80D (1410714983.225581) can0 09F80202#D3FC00000300FFFF (1410714983.250391) can0 09F80102#6C719A16121BB80D (1410714983.350367) can0 09F80102#6C719A16121BB80D (1410714983.450312) can0 09F80102#6C719A16121BB80D (1410714983.481898) can0 09F80202#D4FC00000300FFFF (1410714983.550318) can0 09F80102#6C719A16121BB80D (1410714983.650263) can0 09F80102#6C719A16121BB80D (1410714983.716578) can0 11F80E01#A01B0188F64A0E70 (1410714983.717127) can0 11F80E01#A1FDB80DE0019A16 (1410714983.717707) can0 11F80E01#A2B0FFFF00002140 (1410714983.718256) can0 11F80E01#A308154F000000FE (1410714983.725581) can0 09F80202#D5FC00000300FFFF (1410714983.750239) can0 09F80102#6C719A16121BB80D (1410714983.753291) can0 0DF50B11#018F030000FFFFFF (1410714983.850184) can0 09F80102#6C719A16121BB80D (1410714983.943537) can0 19F212B0#8009F4000064FFF8 (1410714983.944086) can0 19F212B0#811B0800FFFFFFFF (1410714983.944636) can0 19F214B0#00EC04C5FF6D78F4 (1410714983.950159) can0 09F80102#6C719A16121BB80D (1410714983.975214) can0 09F80202#D6FC00000300FFFF (1410714984.050135) can0 09F80102#6C719A16121BB80D (1410714984.060450) can0 0DF01002#D7F0C73F50504A24 (1410714984.063105) can0 19FA0302#D7D3490068006400 (1410714984.066096) can0 19FA0402#E093D7FD0C0B7F34 (1410714984.069086) can0 19FA0402#E165C6C511FAFFFF (1410714984.072199) can0 19FA0402#E2FFF220673013D6 (1410714984.075098) can0 19FA0402#E3EE12F9FFFFFFF2 (1410714984.078089) can0 19FA0402#E40E7F16B9209C11 (1410714984.081110) can0 19FA0402#E5F4FFFFFFF216DC (1410714984.084193) can0 19FA0402#E608AD2DB510EDFF (1410714984.087092) can0 19FA0402#E7FFFFF201D0247C (1410714984.090083) can0 19FA0402#E8D9D213F0FFFFFF (1410714984.093073) can0 19FA0402#E9F21B390A9574AC (1410714984.096217) can0 19FA0402#EA1002000000F217 (1410714984.099085) can0 19FA0402#EB7F07CE8D66116A (1410714984.102076) can0 19FA0402#ECFFFFFFF2047314 (1410714984.105097) can0 19FA0402#EDAAD2FF11030000 (1410714984.108210) can0 19FA0402#EE00F21FE80AB84D (1410714984.111079) can0 19FA0402#EF561151000000F2 (1410714984.114069) can0 19FA0402#F01C170413C7560C (1410714984.117091) can0 19FA0402#F1FBFFFFFFF213A2 (1410714984.120142) can0 19FA0402#F21C7D7F6B121F00 (1410714984.123072) can0 19FA0402#F30000F214221513 (1410714984.126093) can0 19FA0402#F4B8D61032000000 (1410714984.129115) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714984.132197) can0 0DF80502#E02FD7C73F50504A (1410714984.135065) can0 0DF80502#E12400A7950AE242 (1410714984.138056) can0 0DF80502#E2430520335FCAD0 (1410714984.141047) can0 0DF80502#E3B93103127E9502 (1410714984.144221) can0 0DF80502#E40000000013FC0C (1410714984.147089) can0 0DF80502#E549008000AC0D00 (1410714984.150111) can0 0DF80502#E60000FFFFFFFFFF (1410714984.153071) can0 09F80102#6C719A16121BB80D (1410714984.185114) can0 09F80202#D8FC00000200FFFF (1410714984.210078) can0 09F80102#6C719A16121BB80D (1410714984.221918) can0 1DEFFF01#200AE598B6060404 (1410714984.222498) can0 1DEFFF01#2100000002FFFFFF (1410714984.310053) can0 09F80102#6C719A16121BB80D (1410714984.410029) can0 09F80102#6C719A16121BB80D (1410714984.435023) can0 09F80202#D9FC00000200FFFF (1410714984.509974) can0 09F80102#6C719A16121BB80D (1410714984.609949) can0 09F80102#6C719A16121BB80D (1410714984.684962) can0 09F80202#DAFC00000200FFFF (1410714984.709925) can0 09F80102#6C719A16121BB80D (1410714984.755305) can0 0DF50B11#018F030000FFFFFF (1410714984.809931) can0 09F80102#6C719A16121BB80D (1410714984.909907) can0 09F80102#6C719A16121BB80D (1410714984.934931) can0 09F80202#DBFC00000200FFFF (1410714984.956293) can0 11F80E01#C01B03B449112080 (1410714984.956843) can0 11F80E01#C1B2B90D60149916 (1410714984.957423) can0 11F80E01#C2B0F1A20F000000 (1410714984.957972) can0 11F80E01#C30807E3000001FE (1410714985.009852) can0 09F80102#6C719A16121BB80D (1410714985.070094) can0 0DF01002#DCF0C73F60774A24 (1410714985.072779) can0 19FA0302#DCD3490068006400 (1410714985.075770) can0 19FA0402#0093DCFD0C0B7F34 (1410714985.078822) can0 19FA0402#0165C6A612F8FFFF (1410714985.081782) can0 19FA0402#02FFF220673013D6 (1410714985.084772) can0 19FA0402#03FF12FCFFFFFFF2 (1410714985.087763) can0 19FA0402#040E7F16B9209011 (1410714985.090876) can0 19FA0402#05F8FFFFFFF216DC (1410714985.093775) can0 19FA0402#0608AD2DD110F3FF (1410714985.096796) can0 19FA0402#07FFFFF201D0247C (1410714985.099787) can0 19FA0402#08D93013F1FFFFFF (1410714985.102930) can0 19FA0402#09F21B390A9574B7 (1410714985.105769) can0 19FA0402#0A1001000000F217 (1410714985.108759) can0 19FA0402#0B7F07CE8D7E1169 (1410714985.111781) can0 19FA0402#0CFFFFFFF2047314 (1410714985.114863) can0 19FA0402#0DAAD2E811FCFFFF (1410714985.117762) can0 19FA0402#0EFFF21FE80AB84D (1410714985.120783) can0 19FA0402#0F7B1057000000F2 (1410714985.123774) can0 19FA0402#101C170413C7F00B (1410714985.126887) can0 19FA0402#1101000000F213A2 (1410714985.129755) can0 19FA0402#121C7D7F3C121D00 (1410714985.132746) can0 19FA0402#130000F214221513 (1410714985.135767) can0 19FA0402#14B8F01038000000 (1410714985.138850) can0 19FA0402#15F2FFFFFFFFFFFF (1410714985.141779) can0 0DF80502#002FDCC73F60774A (1410714985.144770) can0 0DF80502#012400A7950AE242 (1410714985.147761) can0 0DF80502#02430520335FCAD0 (1410714985.150874) can0 0DF80502#03B93103127E9502 (1410714985.153773) can0 0DF80502#040000000013FC0C (1410714985.156763) can0 0DF80502#0549008000AC0D00 (1410714985.159785) can0 0DF80502#060000FFFFFFFFFF (1410714985.162928) can0 09F80102#6C719A16121BB80D (1410714985.194941) can0 09F80202#DDFC00000400FFFF (1410714985.219782) can0 09F80102#6C719A16121BB80D (1410714985.319727) can0 09F80102#6C719A16121BB80D (1410714985.410273) can0 11F80E01#E01B014875520EA0 (1410714985.410822) can0 11F80E01#E1419F0DC0F7A616 (1410714985.411372) can0 11F80E01#E2B02ACBE301CD86 (1410714985.411951) can0 11F80E01#E30065C6000000FE (1410714985.419703) can0 09F80102#6C719A16121BB80D (1410714985.443781) can0 19F212B0#A00908000064FF03 (1410714985.444361) can0 19F212B0#A11C0900FFFFFFFF (1410714985.444941) can0 09F80202#DEFC00000400FFFF (1410714985.445490) can0 19F214B0#00E704C5FF6D7808 (1410714985.519678) can0 09F80102#6C719A16121BB80D (1410714985.619654) can0 09F80102#6C719A16121BB80D (1410714985.694941) can0 09F80202#DFFC00000400FFFF (1410714985.719599) can0 09F80102#6C719A16121BB80D (1410714985.756800) can0 0DF50B11#018F030000FFFFFF (1410714985.819575) can0 09F80102#6C719A16121BB80D (1410714985.919550) can0 09F80102#6C719A16121BB80D (1410714985.944605) can0 09F80202#E0FC00000400FFFF (1410714986.019495) can0 09F80102#6C719A16121BB80D (1410714986.081904) can0 0DF01002#E1F0C73F709E4A24 (1410714986.084467) can0 19FA0302#E1D3490068006400 (1410714986.087458) can0 19FA0402#2093E1FD0C0B7F34 (1410714986.090449) can0 19FA0402#2165C61712F2FFFF (1410714986.093531) can0 19FA0402#22FFF220673013D6 (1410714986.096461) can0 19FA0402#230E13FBFFFFFFF2 (1410714986.099451) can0 19FA0402#240E7F16B920B511 (1410714986.102473) can0 19FA0402#25FFFFFFFFF216DC (1410714986.105524) can0 19FA0402#2608AD2DBA10F4FF (1410714986.108454) can0 19FA0402#27FFFFF201D0247C (1410714986.111475) can0 19FA0402#28D95013F9FFFFFF (1410714986.114436) can0 19FA0402#29F21B390A9574B2 (1410714986.117609) can0 19FA0402#2A1002000000F217 (1410714986.120448) can0 19FA0402#2B7F07CE8D1C1165 (1410714986.123438) can0 19FA0402#2CFFFFFFF2047314 (1410714986.126459) can0 19FA0402#2DAAD28E11F7FFFF (1410714986.129603) can0 19FA0402#2EFFF21FE80AB84D (1410714986.132441) can0 19FA0402#2F8E105B000000F2 (1410714986.135462) can0 19FA0402#301C170413C7D40B (1410714986.138453) can0 19FA0402#31F8FFFFFFF213A2 (1410714986.141596) can0 19FA0402#321C7D7F4A122400 (1410714986.144434) can0 19FA0402#330000F214221513 (1410714986.147456) can0 19FA0402#34B8891044000000 (1410714986.150477) can0 19FA0402#35F2FFFFFFFFFFFF (1410714986.153559) can0 0DF80502#202FE1C73F709E4A (1410714986.156428) can0 0DF80502#212400A7950AE242 (1410714986.159449) can0 0DF80502#22430520335FCAD0 (1410714986.162440) can0 0DF80502#23B93103127E9502 (1410714986.165552) can0 0DF80502#240000000013FC0C (1410714986.168452) can0 0DF80502#2549008000AC0D00 (1410714986.171442) can0 0DF80502#260000FFFFFFFFFF (1410714986.174433) can0 09F80102#6C719A16121BB80D (1410714986.206477) can0 09F80202#E2FC00000400FFFF (1410714986.231440) can0 09F80102#6C719A16121BB80D (1410714986.331416) can0 09F80102#6C719A16121BB80D (1410714986.431391) can0 09F80102#6C719A16121BB80D (1410714986.456416) can0 09F80202#E3FC00000400FFFF (1410714986.531336) can0 09F80102#6C719A16121BB80D (1410714986.631312) can0 09F80102#6C719A16121BB80D (1410714986.706324) can0 09F80202#E4FC00000400FFFF (1410714986.731287) can0 09F80102#6C719A16121BB80D (1410714986.831263) can0 09F80102#6C719A16121BB80D (1410714986.858546) can0 0DF50B11#018F030000FFFFFF (1410714986.931269) can0 09F80102#6C719A16121BB80D (1410714986.943568) can0 19F212B0#C00917000064FF03 (1410714986.944147) can0 19F212B0#C11C0A00FFFFFFFF (1410714986.944697) can0 19F214B0#00EC04C5FF6D7817 (1410714986.956263) can0 09F80202#E5FC00000400FFFF (1410714987.031214) can0 09F80102#6C719A16121BB80D (1410714987.091212) can0 0DF01002#E6F0C73F80C54A24 (1410714987.094141) can0 19FA0302#E6D3490068006400 (1410714987.097132) can0 19FA0402#4093E6FD0C0B7F34 (1410714987.100184) can0 19FA0402#4165C61E12F2FFFF (1410714987.103144) can0 19FA0402#42FFF220673013D6 (1410714987.106135) can0 19FA0402#430E1300000000F2 (1410714987.109125) can0 19FA0402#440E7F16B9207D11 (1410714987.112238) can0 19FA0402#4500000000F216DC (1410714987.115137) can0 19FA0402#4608AD2D5C10F3FF (1410714987.118128) can0 19FA0402#47FFFFF201D0247C (1410714987.121119) can0 19FA0402#48D93C13FAFFFFFF (1410714987.124171) can0 19FA0402#49F21B390A9574C5 (1410714987.127131) can0 19FA0402#4A1007000000F217 (1410714987.130122) can0 19FA0402#4B7F07CE8D3C1165 (1410714987.133112) can0 19FA0402#4CFFFFFFF2047314 (1410714987.136256) can0 19FA0402#4DAAD21C12FFFFFF (1410714987.139124) can0 19FA0402#4EFFF21FE80AB84D (1410714987.142115) can0 19FA0402#4FC4105B000000F2 (1410714987.145106) can0 19FA0402#501C170413C74A0C (1410714987.148249) can0 19FA0402#51DDFFFFFFF213A2 (1410714987.151118) can0 19FA0402#521C7D7FBD122000 (1410714987.154108) can0 19FA0402#530000F214221513 (1410714987.157130) can0 19FA0402#54B8E31042000000 (1410714987.160212) can0 19FA0402#55F2FFFFFFFFFFFF (1410714987.163111) can0 0DF80502#402FE6C73F80C54A (1410714987.166132) can0 0DF80502#412400A7950AE242 (1410714987.169123) can0 0DF80502#42430520335FCAD0 (1410714987.172236) can0 0DF80502#43B93103127E9502 (1410714987.175135) can0 0DF80502#440000000013FC0C (1410714987.178126) can0 0DF80502#4549008000AC0D00 (1410714987.181147) can0 0DF80502#460000FFFFFFFFFF (1410714987.184168) can0 09F80102#6C719A16121BB80D (1410714987.215174) can0 09F80202#E7FC00000100FFFF (1410714987.240229) can0 09F80102#6C719A16121BB80D (1410714987.340205) can0 09F80102#6C719A16121BB80D (1410714987.440211) can0 09F80102#6C719A16121BB80D (1410714987.465083) can0 09F80202#E8FC00000100FFFF (1410714987.540217) can0 09F80102#6C719A16121BB80D (1410714987.640223) can0 09F80102#6C719A16121BB80D (1410714987.714991) can0 09F80202#E9FC00000100FFFF (1410714987.730036) can0 11F80E01#001B01985B620EC0 (1410714987.730585) can0 11F80E01#01C6C20D80B99916 (1410714987.731165) can0 11F80E01#02C4A5A400002407 (1410714987.731745) can0 11F80E01#0300FFFFFF7F00FE (1410714987.740229) can0 09F80102#6C719A16121BB80D (1410714987.840235) can0 09F80102#6C719A16121BB80D (1410714987.860041) can0 0DF50B11#018F030000FFFFFF (1410714987.940211) can0 09F80102#6C719A16121BB80D (1410714987.964899) can0 09F80202#EAFC00000100FFFF (1410714988.040186) can0 09F80102#6C719A16121BB80D (1410714988.054194) can0 0DF01002#EBF0C73F90EC4A24 (1410714988.056849) can0 19FA0302#EBD3490068006400 (1410714988.060145) can0 19FA0402#6093EBFD0C0B7F34 (1410714988.063044) can0 19FA0402#6165C6EA11FCFFFF (1410714988.065852) can0 19FA0402#62FFF220673013D6 (1410714988.068842) can0 19FA0402#63D41200000000F2 (1410714988.072199) can0 19FA0402#640E7F16B9207511 (1410714988.074915) can0 19FA0402#65F8FFFFFFF216DC (1410714988.077814) can0 19FA0402#6608AD2D8D10F4FF (1410714988.080836) can0 19FA0402#67FFFFF201D0247C (1410714988.083826) can0 19FA0402#68D94913F4FFFFFF (1410714988.086878) can0 19FA0402#69F21B390A9574D9 (1410714988.089838) can0 19FA0402#6A100D000000F217 (1410714988.092799) can0 19FA0402#6B7F07CE8D67116E (1410714988.095820) can0 19FA0402#6CFFFFFFF2047314 (1410714988.098841) can0 19FA0402#6DAAD24212F8FFFF (1410714988.101832) can0 19FA0402#6EFFF21FE80AB84D (1410714988.104823) can0 19FA0402#6F0C115A000000F2 (1410714988.107813) can0 19FA0402#701C170413C7560C (1410714988.110926) can0 19FA0402#71EEFFFFFFF213A2 (1410714988.113825) can0 19FA0402#721C7D7F9A122200 (1410714988.116816) can0 19FA0402#730000F214221513 (1410714988.119807) can0 19FA0402#74B8421144000000 (1410714988.123011) can0 19FA0402#75F2FFFFFFFFFFFF (1410714988.125819) can0 0DF80502#602FEBC73F90EC4A (1410714988.128809) can0 0DF80502#612400A7950AE242 (1410714988.131800) can0 0DF80502#62430520335FCAD0 (1410714988.134913) can0 0DF80502#63B93103127E9502 (1410714988.137812) can0 0DF80502#640000000013FC0C (1410714988.140803) can0 0DF80502#6549008000AC0D00 (1410714988.143824) can0 0DF80502#660000FFFFFFFFFF (1410714988.146906) can0 09F80102#6C719A16121BB80D (1410714988.178919) can0 09F80202#ECFC00000400FFFF (1410714988.204127) can0 09F80102#6C719A16121BB80D (1410714988.303797) can0 09F80102#6C719A16121BB80D (1410714988.403773) can0 09F80102#6C719A16121BB80D (1410714988.428767) can0 09F80202#EDFC00000400FFFF (1410714988.443842) can0 19F212B0#E00926000064FF03 (1410714988.444422) can0 19F212B0#E11C0800FFFFFFFF (1410714988.444971) can0 19F214B0#00EC04C4FF6D7826 (1410714988.503718) can0 09F80102#6C719A16121BB80D (1410714988.603693) can0 09F80102#6C719A16121BB80D (1410714988.678919) can0 09F80202#EEFC00000400FFFF (1410714988.703669) can0 09F80102#6C719A16121BB80D (1410714988.803645) can0 09F80102#6C719A16121BB80D (1410714988.861567) can0 0DF50B11#018C030000FFFFFF (1410714988.903590) can0 09F80102#6C719A16121BB80D (1410714988.928645) can0 09F80202#EFFC00000400FFFF (1410714989.003565) can0 09F80102#6C719A16121BB80D (1410714989.063593) can0 0DF01002#F0F0C73FA0134B24 (1410714989.066889) can0 19FA0302#F0D3490068006400 (1410714989.069575) can0 19FA0402#8093F0FD0C0B7F34 (1410714989.072535) can0 19FA0402#8165C60012020000 (1410714989.075495) can0 19FA0402#8200F220673013D6 (1410714989.078822) can0 19FA0402#839B12FFFFFFFFF2 (1410714989.081599) can0 19FA0402#840E7F16B920A711 (1410714989.084528) can0 19FA0402#85E8FFFFFFF216DC (1410714989.087489) can0 19FA0402#8608AD2DC110EEFF (1410714989.090876) can0 19FA0402#87FFFFF201D0247C (1410714989.093562) can0 19FA0402#88D95A13ECFFFFFF (1410714989.096491) can0 19FA0402#89F21B390A9574E0 (1410714989.099512) can0 19FA0402#8A1013000000F217 (1410714989.102503) can0 19FA0402#8B7F07CE8D891179 (1410714989.105555) can0 19FA0402#8CFFFFFFF2047314 (1410714989.108485) can0 19FA0402#8DAAD26111FFFFFF (1410714989.111506) can0 19FA0402#8EFFF21FE80AB84D (1410714989.114497) can0 19FA0402#8F1B114E000000F2 (1410714989.117609) can0 19FA0402#901C170413C7540C (1410714989.120509) can0 19FA0402#9108000000F213A2 (1410714989.123499) can0 19FA0402#921C7D7F33122A00 (1410714989.126490) can0 19FA0402#930000F214221513 (1410714989.129572) can0 19FA0402#94B8D4103E000000 (1410714989.132502) can0 19FA0402#95F2FFFFFFFFFFFF (1410714989.135493) can0 0DF80502#802FF0C73FA0134B (1410714989.138483) can0 0DF80502#812400A7950AE242 (1410714989.141657) can0 0DF80502#82430520335FCAD0 (1410714989.144495) can0 0DF80502#83B93103127E9502 (1410714989.147517) can0 0DF80502#840000000013FC0C (1410714989.150507) can0 0DF80502#8549008000AC0D00 (1410714989.153590) can0 0DF80502#860000FFFFFFFFFF (1410714989.156489) can0 09F80102#6C719A16121BB80D (1410714989.187525) can0 09F80202#F1FC00000300FFFF (1410714989.212519) can0 09F80102#6C719A16121BB80D (1410714989.221522) can0 1DEFFF01#400AE598B6060404 (1410714989.222102) can0 1DEFFF01#4100000002FFFFFF (1410714989.312464) can0 09F80102#6C719A16121BB80D (1410714989.412440) can0 09F80102#6C719A16121BB80D (1410714989.437678) can0 09F80202#F2FC00000300FFFF (1410714989.512415) can0 09F80102#6C719A16121BB80D (1410714989.612391) can0 09F80102#6C719A16121BB80D (1410714989.623377) can0 11F80E01#201B0148AA2C0E20 (1410714989.623927) can0 11F80E01#2156F40DE0768116 (1410714989.624506) can0 11F80E01#22B84DEF0D0355C0 (1410714989.625056) can0 11F80E01#2308FFFFFF7F00FE (1410714989.687373) can0 09F80202#F3FC00000300FFFF (1410714989.712366) can0 09F80102#6C719A16121BB80D (1410714989.812312) can0 09F80102#6C719A16121BB80D (1410714989.836939) can0 11F80E01#401B017C60290EB0 (1410714989.837489) can0 11F80E01#41CB070E602EA016 (1410714989.838038) can0 11F80E01#42CBABBAED017307 (1410714989.838618) can0 11F80E01#4300FFFFFF7F00FE (1410714989.863062) can0 0DF50B11#018C030000FFFFFF (1410714989.912318) can0 09F80102#6C719A16121BB80D (1410714989.937739) can0 09F80202#F4FC00000300FFFF (1410714989.943629) can0 19F212B0#000935000064FF02 (1410714989.944178) can0 19F212B0#011C0A00FFFFFFFF (1410714989.944727) can0 19F214B0#00EC04C4FF6C7835 (1410714990.012293) can0 09F80102#6C719A16121BB80D (1410714990.112788) can0 0DF01002#F5F0C73FB03A4B24 (1410714990.115198) can0 19FA0302#F5D3490068006400 (1410714990.118189) can0 19FA0402#A093F5FD0C0B7F34 (1410714990.121180) can0 19FA0402#A165C6B611040000 (1410714990.124232) can0 19FA0402#A200F220673013D6 (1410714990.127192) can0 19FA0402#A3D312F8FFFFFFF2 (1410714990.130152) can0 19FA0402#A40E7F16B9202611 (1410714990.133173) can0 19FA0402#A5EEFFFFFFF216DC (1410714990.136286) can0 19FA0402#A608AD2D4D10E3FF (1410714990.139185) can0 19FA0402#A7FFFFF201D0247C (1410714990.142176) can0 19FA0402#A8D97F13F2FFFFFF (1410714990.145167) can0 19FA0402#A9F21B390A9574DD (1410714990.148341) can0 19FA0402#AA100F000000F217 (1410714990.151179) can0 19FA0402#AB7F07CE8D891178 (1410714990.154169) can0 19FA0402#ACFFFFFFF2047314 (1410714990.157160) can0 19FA0402#ADAAD2F311000000 (1410714990.160242) can0 19FA0402#AE00F21FE80AB84D (1410714990.163172) can0 19FA0402#AF42114D000000F2 (1410714990.166163) can0 19FA0402#B01C170413C7A90C (1410714990.169154) can0 19FA0402#B101000000F213A2 (1410714990.172266) can0 19FA0402#B21C7D7FB7122400 (1410714990.175166) can0 19FA0402#B30000F214221513 (1410714990.178156) can0 19FA0402#B4B8BE1039000000 (1410714990.181177) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714990.184229) can0 0DF80502#A02FF5C73FB03A4B (1410714990.187159) can0 0DF80502#A12400A7950AE242 (1410714990.190150) can0 0DF80502#A2430520335FCAD0 (1410714990.193171) can0 0DF80502#A3B93103127E9502 (1410714990.196284) can0 0DF80502#A40000000013FC0C (1410714990.199183) can0 0DF80502#A549008000AC0D00 (1410714990.202174) can0 0DF80502#A60000FFFFFFFFFF (1410714990.205134) can0 09F80102#6C719A16121BB80D (1410714990.237208) can0 09F80202#F6FC00000500FFFF (1410714990.262171) can0 09F80102#6C719A16121BB80D (1410714990.362147) can0 09F80102#6C719A16121BB80D (1410714990.462122) can0 09F80102#6C719A16121BB80D (1410714990.487116) can0 09F80202#F7FC00000500FFFF (1410714990.562434) can0 09F80102#6C719A16121BB80D (1410714990.662043) can0 09F80102#6C719A16121BB80D (1410714990.663691) can0 11F80E01#601B0108975C0E50 (1410714990.664240) can0 11F80E01#619BC50DE0F39816 (1410714990.664790) can0 11F80E01#62CD156D0000D860 (1410714990.665339) can0 11F80E01#630CE5AF000000FE (1410714990.737055) can0 09F80202#F8FC00000500FFFF (1410714990.762019) can0 09F80102#6C719A16121BB80D (1410714990.861994) can0 09F80102#6C719A16121BB80D (1410714990.864710) can0 0DF50B11#018C030000FFFFFF (1410714990.961970) can0 09F80102#6C719A16121BB80D (1410714990.986994) can0 09F80202#F9FC00000500FFFF (1410714991.061945) can0 09F80102#6C719A16121BB80D (1410714991.072688) can0 0DF01002#00F0C73FC0614B24 (1410714991.074946) can0 19FA0302#00D3490068006400 (1410714991.077906) can0 19FA0402#C09300FD0C0B7F34 (1410714991.080897) can0 19FA0402#C165C69F11050000 (1410714991.084193) can0 19FA0402#C200F220673013D6 (1410714991.086939) can0 19FA0402#C3F712F6FFFFFFF2 (1410714991.089899) can0 19FA0402#C40E7F16B9203011 (1410714991.092890) can0 19FA0402#C5EAFFFFFFF216DC (1410714991.096247) can0 19FA0402#C608AD2D5310E7FF (1410714991.098872) can0 19FA0402#C7FFFFF201D0247C (1410714991.101923) can0 19FA0402#C8D98713F9FFFFFF (1410714991.104853) can0 19FA0402#C9F21B390A9574C1 (1410714991.108332) can0 19FA0402#CA100C000000F217 (1410714991.110926) can0 19FA0402#CB7F07CE8DAB117F (1410714991.113917) can0 19FA0402#CCFFFFFFF2047314 (1410714991.116877) can0 19FA0402#CDAAD2B511030000 (1410714991.120203) can0 19FA0402#CE00F21FE80AB84D (1410714991.123042) can0 19FA0402#CF431148000000F2 (1410714991.125880) can0 19FA0402#D01C170413C7D00C (1410714991.128870) can0 19FA0402#D115000000F213A2 (1410714991.132227) can0 19FA0402#D21C7D7FE4112600 (1410714991.134943) can0 19FA0402#D30000F214221513 (1410714991.137873) can0 19FA0402#D4B8C6103B000000 (1410714991.140894) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714991.144190) can0 0DF80502#C02F00C73FC0614B (1410714991.146937) can0 0DF80502#C12400A7950AE242 (1410714991.149836) can0 0DF80502#C2430520335FCAD0 (1410714991.152857) can0 0DF80502#C3B93103127E9502 (1410714991.155878) can0 0DF80502#C40000000013FC0C (1410714991.158900) can0 0DF80502#C549008000AC0D00 (1410714991.161890) can0 0DF80502#C60000FFFFFFFFFF (1410714991.164851) can0 09F80102#6C719A16121BB80D (1410714991.196925) can0 09F80202#01FC00000300FFFF (1410714991.221888) can0 09F80102#6C719A16121BB80D (1410714991.321833) can0 09F80102#6C719A16121BB80D (1410714991.421809) can0 09F80102#6C719A16121BB80D (1410714991.443873) can0 19F212B0#200944000064FF02 (1410714991.444422) can0 19F212B0#211C0A00FFFFFFFF (1410714991.445002) can0 19F214B0#00EE04C3FF6D7844 (1410714991.447016) can0 09F80202#02FC00000300FFFF (1410714991.521784) can0 09F80102#6C719A16121BB80D (1410714991.621760) can0 09F80102#6C719A16121BB80D (1410714991.696741) can0 09F80202#03FC00000300FFFF (1410714991.721705) can0 09F80102#6C719A16121BB80D (1410714991.821680) can0 09F80102#6C719A16121BB80D (1410714991.866236) can0 0DF50B11#018C030000FFFFFF (1410714991.921656) can0 09F80102#6C719A16121BB80D (1410714991.947016) can0 09F80202#04FC00000300FFFF (1410714992.021754) can0 09F80102#6C719A16121BB80D (1410714992.082178) can0 0DF01002#05F0C73FD0884B24 (1410714992.084620) can0 19FA0302#05D3490068006400 (1410714992.087550) can0 19FA0402#E09305FD0C0B7F34 (1410714992.090937) can0 19FA0402#E165C6FA11030000 (1410714992.093562) can0 19FA0402#E200F220673013D6 (1410714992.096583) can0 19FA0402#E3B312F3FFFFFFF2 (1410714992.099543) can0 19FA0402#E40E7F16B9204E11 (1410714992.103052) can0 19FA0402#E5E2FFFFFFF216DC (1410714992.105555) can0 19FA0402#E608AD2D4B10E5FF (1410714992.108607) can0 19FA0402#E7FFFFF201D0247C (1410714992.111567) can0 19FA0402#E8D9D112F7FFFFFF (1410714992.114893) can0 19FA0402#E9F21B390A9574BA (1410714992.117640) can0 19FA0402#EA1011000000F217 (1410714992.120570) can0 19FA0402#EB7F07CE8D561180 (1410714992.123560) can0 19FA0402#ECFFFFFFF2047314 (1410714992.126917) can0 19FA0402#EDAAD2DA11050000 (1410714992.129603) can0 19FA0402#EE00F21FE80AB84D (1410714992.132594) can0 19FA0402#EF5E1140000000F2 (1410714992.135554) can0 19FA0402#F01C170413C71C0D (1410714992.138850) can0 19FA0402#F111000000F213A2 (1410714992.141627) can0 19FA0402#F21C7D7F32122900 (1410714992.144526) can0 19FA0402#F30000F214221513 (1410714992.147547) can0 19FA0402#F4B8D81035000000 (1410714992.150935) can0 19FA0402#F5F2FFFFFFFFFFFF (1410714992.153590) can0 0DF80502#E02F05C73FD0884B (1410714992.156519) can0 0DF80502#E12400A7950AE242 (1410714992.159541) can0 0DF80502#E2430520335FCAD0 (1410714992.162989) can0 0DF80502#E3B93103127E9502 (1410714992.165583) can0 0DF80502#E40000000013FC0C (1410714992.168543) can0 0DF80502#E549008000AC0D00 (1410714992.171564) can0 0DF80502#E60000FFFFFFFFFF (1410714992.174525) can0 09F80102#6C719A16121BB80D (1410714992.206965) can0 09F80202#06FC00000100FFFF (1410714992.231562) can0 09F80102#6C719A16121BB80D (1410714992.331507) can0 09F80102#6C719A16121BB80D (1410714992.431483) can0 09F80102#6C719A16121BB80D (1410714992.456507) can0 09F80202#07FC00000100FFFF (1410714992.531458) can0 09F80102#6C719A16121BB80D (1410714992.631434) can0 09F80102#6C719A16121BB80D (1410714992.706416) can0 09F80202#08FC00000100FFFF (1410714992.716608) can0 11F80E01#801B01A929C40C00 (1410714992.717158) can0 11F80E01#8132B90D20019A16 (1410714992.717738) can0 11F80E01#82D87A000000D408 (1410714992.718317) can0 11F80E01#83097CCA000000FE (1410714992.731379) can0 09F80102#6C719A16121BB80D (1410714992.831355) can0 09F80102#6C719A16121BB80D (1410714992.867793) can0 0DF50B11#018C030000FFFFFF (1410714992.931330) can0 09F80102#6C719A16121BB80D (1410714992.943659) can0 19F212B0#400953000064FF01 (1410714992.944209) can0 19F212B0#411C0A00FFFFFFFF (1410714992.944788) can0 19F214B0#00ED04C4FF6D7853 (1410714992.956355) can0 09F80202#09FC00000100FFFF (1410714993.031336) can0 09F80102#6C719A16121BB80D (1410714993.091334) can0 0DF01002#0AF0C73FE0AF4B24 (1410714993.094263) can0 19FA0302#0AD3490068006400 (1410714993.097620) can0 19FA0402#00930AFD0C0B7F34 (1410714993.100245) can0 19FA0402#0165C663110C0000 (1410714993.103266) can0 19FA0402#0200F220673013D6 (1410714993.106257) can0 19FA0402#037912F7FFFFFFF2 (1410714993.109583) can0 19FA0402#040E7F16B9208C11 (1410714993.112299) can0 19FA0402#05DFFFFFFFF216DC (1410714993.115260) can0 19FA0402#0608AD2D5010E3FF (1410714993.118250) can0 19FA0402#07FFFFF201D0247C (1410714993.121638) can0 19FA0402#08D94C13FFFFFFFF (1410714993.124232) can0 19FA0402#09F21B390A9574B3 (1410714993.127283) can0 19FA0402#0A100A000000F217 (1410714993.130244) can0 19FA0402#0B7F07CE8D70117E (1410714993.133570) can0 19FA0402#0CFFFFFFF2047314 (1410714993.136378) can0 19FA0402#0DAAD27111FDFFFF (1410714993.139246) can0 19FA0402#0EFFF21FE80AB84D (1410714993.142237) can0 19FA0402#0F8A1142000000F2 (1410714993.145564) can0 19FA0402#101C170413C7650D (1410714993.148493) can0 19FA0402#1101000000F213A2 (1410714993.151240) can0 19FA0402#121C7D7FE3122500 (1410714993.154230) can0 19FA0402#130000F214221513 (1410714993.157618) can0 19FA0402#14B8DC102D000000 (1410714993.160273) can0 19FA0402#15F2FFFFFFFFFFFF (1410714993.163264) can0 0DF80502#002F0AC73FE0AF4B (1410714993.166224) can0 0DF80502#012400A7950AE242 (1410714993.169550) can0 0DF80502#02430520335FCAD0 (1410714993.172297) can0 0DF80502#03B93103127E9502 (1410714993.175288) can0 0DF80502#040000000013FC0C (1410714993.178217) can0 0DF80502#0549008000AC0D00 (1410714993.181635) can0 0DF80502#060000FFFFFFFFFF (1410714993.184229) can0 09F80102#6C719A16121BB80D (1410714993.215296) can0 09F80202#0BFC00000400FFFF (1410714993.240290) can0 09F80102#6C719A16121BB80D (1410714993.340266) can0 09F80102#6C719A16121BB80D (1410714993.440272) can0 09F80102#6C719A16121BB80D (1410714993.465174) can0 09F80202#0CFC00000400FFFF (1410714993.540278) can0 09F80102#6C719A16121BB80D (1410714993.583277) can0 11F80E01#A01B0188F64A0E50 (1410714993.583826) can0 11F80E01#A1FEB80D80039A16 (1410714993.584406) can0 11F80E01#A2D8FFFF0000EF08 (1410714993.584956) can0 11F80E01#A301154F000000FE (1410714993.640314) can0 09F80102#6C719A16121BB80D (1410714993.715113) can0 09F80202#0DFC00000400FFFF (1410714993.740290) can0 09F80102#6C719A16121BB80D (1410714993.840296) can0 09F80102#6C719A16121BB80D (1410714993.869746) can0 0DF50B11#018C030000FFFFFF (1410714993.940272) can0 09F80102#6C719A16121BB80D (1410714993.965022) can0 09F80202#0EFC00000400FFFF (1410714994.040278) can0 09F80102#6C719A16121BB80D (1410714994.060480) can0 0DF01002#0FF0C73FF0D64B24 (1410714994.063136) can0 19FA0302#0FD3490068006400 (1410714994.065974) can0 19FA0402#20930FFD0C0B7F34 (1410714994.068934) can0 19FA0402#2165C6A2110A0000 (1410714994.072291) can0 19FA0402#2200F220673013D6 (1410714994.074976) can0 19FA0402#23AB12F7FFFFFFF2 (1410714994.077967) can0 19FA0402#240E7F16B9208611 (1410714994.080958) can0 19FA0402#25EDFFFFFFF216DC (1410714994.084223) can0 19FA0402#2608AD2D7210ECFF (1410714994.087000) can0 19FA0402#27FFFFF201D0247C (1410714994.089960) can0 19FA0402#28D9AF1301000000 (1410714994.092921) can0 19FA0402#29F21B390A9574C6 (1410714994.096369) can0 19FA0402#2A1007000000F217 (1410714994.098902) can0 19FA0402#2B7F07CE8DB51179 (1410714994.101954) can0 19FA0402#2CFFFFFFF2047314 (1410714994.104914) can0 19FA0402#2DAAD2FE10000000 (1410714994.108454) can0 19FA0402#2E00F21FE80AB84D (1410714994.110987) can0 19FA0402#2F7E113A000000F2 (1410714994.113947) can0 19FA0402#301C170413C74E0D (1410714994.116938) can0 19FA0402#3107000000F213A2 (1410714994.120234) can0 19FA0402#321C7D7F42122D00 (1410714994.123072) can0 19FA0402#330000F214221513 (1410714994.125971) can0 19FA0402#34B833112A000000 (1410714994.128931) can0 19FA0402#35F2FFFFFFFFFFFF (1410714994.132288) can0 0DF80502#202F0FC73FF0D64B (1410714994.135188) can0 0DF80502#212400A7950AE242 (1410714994.137934) can0 0DF80502#22430520335FCAD0 (1410714994.140925) can0 0DF80502#23B93103127E9502 (1410714994.144251) can0 0DF80502#240000000013FC0C (1410714994.146998) can0 0DF80502#2549008000AC0D00 (1410714994.149989) can0 0DF80502#260000FFFFFFFFFF (1410714994.152888) can0 09F80102#6C719A16121BB80D (1410714994.184962) can0 09F80202#10FC00000200FFFF (1410714994.209956) can0 09F80102#6C719A16121BB80D (1410714994.221217) can0 1DEFFF01#600AE598B6060404 (1410714994.221796) can0 1DEFFF01#6100000002FFFFFF (1410714994.309931) can0 09F80102#6C719A16121BB80D (1410714994.409876) can0 09F80102#6C719A16121BB80D (1410714994.435053) can0 09F80202#11FC00000200FFFF (1410714994.443873) can0 19F212B0#600962000064FF01 (1410714994.444453) can0 19F212B0#611C0900FFFFFFFF (1410714994.445002) can0 19F214B0#00EC04C5FF6D7862 (1410714994.509821) can0 09F80102#6C719A16121BB80D (1410714994.609797) can0 09F80102#6C719A16121BB80D (1410714994.684809) can0 09F80202#12FC00000200FFFF (1410714994.709772) can0 09F80102#6C719A16121BB80D (1410714994.809718) can0 09F80102#6C719A16121BB80D (1410714994.871210) can0 0DF50B11#018C030000FFFFFF (1410714994.909693) can0 09F80102#6C719A16121BB80D (1410714994.935023) can0 09F80202#13FC00000200FFFF (1410714995.009669) can0 09F80102#6C719A16121BB80D (1410714995.070490) can0 0DF01002#14F0C73F00FE4B24 (1410714995.072657) can0 19FA0302#14D3490068006400 (1410714995.075617) can0 19FA0402#409314FD0C0B7F34 (1410714995.078944) can0 19FA0402#4165C65612010000 (1410714995.081660) can0 19FA0402#4200F220673013D6 (1410714995.084650) can0 19FA0402#43F812F9FFFFFFF2 (1410714995.087611) can0 19FA0402#440E7F16B920A111 (1410714995.090998) can0 19FA0402#45EFFFFFFFF216DC (1410714995.093592) can0 19FA0402#4608AD2D1610ECFF (1410714995.096644) can0 19FA0402#47FFFFF201D0247C (1410714995.099635) can0 19FA0402#48D9861301000000 (1410714995.103114) can0 19FA0402#49F21B390A957499 (1410714995.105616) can0 19FA0402#4A1009000000F217 (1410714995.108637) can0 19FA0402#4B7F07CE8D9B1182 (1410714995.111628) can0 19FA0402#4CFFFFFFF2047314 (1410714995.114985) can0 19FA0402#4DAAD27711F9FFFF (1410714995.117670) can0 19FA0402#4EFFF21FE80AB84D (1410714995.120631) can0 19FA0402#4FA5113A000000F2 (1410714995.123621) can0 19FA0402#501C170413C7350D (1410714995.126978) can0 19FA0402#510E000000F213A2 (1410714995.129603) can0 19FA0402#521C7D7F78123200 (1410714995.132624) can0 19FA0402#530000F214221513 (1410714995.135584) can0 19FA0402#54B8461127000000 (1410714995.138941) can0 19FA0402#55F2FFFFFFFFFFFF (1410714995.141657) can0 0DF80502#402F14C73F00FE4B (1410714995.144617) can0 0DF80502#412400A7950AE242 (1410714995.147578) can0 0DF80502#42430520335FCAD0 (1410714995.150965) can0 0DF80502#43B93103127E9502 (1410714995.153620) can0 0DF80502#440000000013FC0C (1410714995.156611) can0 0DF80502#4549008000AC0D00 (1410714995.159602) can0 0DF80502#460000FFFFFFFFFF (1410714995.163050) can0 09F80102#6C719A16121BB80D (1410714995.195002) can0 09F80202#15FC00000200FFFF (1410714995.219599) can0 09F80102#6C719A16121BB80D (1410714995.319575) can0 09F80102#6C719A16121BB80D (1410714995.419550) can0 09F80102#6C719A16121BB80D (1410714995.444575) can0 09F80202#16FC00000200FFFF (1410714995.519526) can0 09F80102#6C719A16121BB80D (1410714995.619471) can0 09F80102#6C719A16121BB80D (1410714995.694483) can0 09F80202#17FC00000200FFFF (1410714995.719447) can0 09F80102#6C719A16121BB80D (1410714995.819422) can0 09F80102#6C719A16121BB80D (1410714995.872675) can0 0DF50B11#018F030000FFFFFF (1410714995.919398) can0 09F80102#6C719A16121BB80D (1410714995.943659) can0 19F212B0#800971000064FFFF (1410714995.944209) can0 19F212B0#811B0900FFFFFFFF (1410714995.944788) can0 09F80202#18FC00000200FFFF (1410714995.945338) can0 19F214B0#00EC04C5FF6B7871 (1410714996.019343) can0 09F80102#6C719A16121BB80D (1410714996.079859) can0 0DF01002#19F0C73F10254C24 (1410714996.082301) can0 19FA0302#19D3490068006400 (1410714996.085596) can0 19FA0402#609319FD0C0B2D35 (1410714996.088374) can0 19FA0402#6108C5BF11F4FFFF (1410714996.091334) can0 19FA0402#62FFF220673013D6 (1410714996.094294) can0 19FA0402#639F12F4FFFFFFF2 (1410714996.097651) can0 19FA0402#640E7F16B9208511 (1410714996.100306) can0 19FA0402#65DFFFFFFFF216DC (1410714996.103327) can0 19FA0402#6608AD2DE00FE5FF (1410714996.106318) can0 19FA0402#67FFFFF201D0247C (1410714996.109614) can0 19FA0402#68D98A13F8FFFFFF (1410714996.112330) can0 19FA0402#69F21B390A9574B1 (1410714996.115321) can0 19FA0402#6A10FFFFFFFFF217 (1410714996.118281) can0 19FA0402#6B7F07CE8DA4117B (1410714996.121638) can0 19FA0402#6CFFFFFFF2047314 (1410714996.124293) can0 19FA0402#6DAAD28E11E8FFFF (1410714996.127314) can0 19FA0402#6EFFF21FE80AB84D (1410714996.130274) can0 19FA0402#6FAF112C000000F2 (1410714996.133601) can0 19FA0402#701C170413C73E0D (1410714996.136347) can0 19FA0402#710C000000F213A2 (1410714996.139307) can0 19FA0402#721C7D7FFB122500 (1410714996.142268) can0 19FA0402#730000F214221513 (1410714996.145594) can0 19FA0402#74B87A111A000000 (1410714996.148432) can0 19FA0402#75F2FFFFFFFFFFFF (1410714996.151301) can0 0DF80502#602F19C73F10254C (1410714996.154261) can0 0DF80502#612400A7950AE242 (1410714996.157069) can0 11F80E01#C01B0132D74A1020 (1410714996.157618) can0 11F80E01#C1FFE20D80529116 (1410714996.158167) can0 0DF80502#62430520335FCAD0 (1410714996.158717) can0 11F80E01#C2DE59BE86016008 (1410714996.159266) can0 11F80E01#C30993BF000000FE (1410714996.160303) can0 0DF80502#63B93103127E9502 (1410714996.163325) can0 0DF80502#640000000013FC0C (1410714996.166285) can0 0DF80502#6549008000AC0D00 (1410714996.169611) can0 0DF80502#660000FFFFFFFFFF (1410714996.172327) can0 09F80102#6C719A16121BB80D (1410714996.204340) can0 09F80202#1AFC00000300FFFF (1410714996.229639) can0 09F80102#6C719A16121BB80D (1410714996.329584) can0 09F80102#6C719A16121BB80D (1410714996.429224) can0 09F80102#6C719A16121BB80D (1410714996.454249) can0 09F80202#1BFC00000300FFFF (1410714996.529200) can0 09F80102#6C719A16121BB80D (1410714996.543818) can0 19FB0201#404B0578C9EF14D8 (1410714996.544367) can0 19FB0201#41C58D003345454F (1410714996.544917) can0 19FB0201#4232202047415A20 (1410714996.545466) can0 19FB0201#43494E5445524345 (1410714996.546015) can0 19FB0201#4450544F52202020 (1410714996.546564) can0 19FB0201#45202050A604B400 (1410714996.547144) can0 19FB0201#461E00C003C53F00 (1410714996.547694) can0 19FB0201#4753531DB8014147 (1410714996.548212) can0 19FB0201#48494F4920544845 (1410714996.548762) can0 19FB0201#494F444F524F4920 (1410714996.549342) can0 19FB0201#4A2020202004E1FF (1410714996.629176) can0 09F80102#6C719A16121BB80D (1410714996.704371) can0 09F80202#1CFC00000300FFFF (1410714996.729121) can0 09F80102#6C719A16121BB80D (1410714996.829096) can0 09F80102#6C719A16121BB80D (1410714996.929072) can0 09F80102#6C719A16121BB80D (1410714996.954066) can0 09F80202#1DFC00000300FFFF (1410714996.974329) can0 0DF50B11#018F030000FFFFFF (1410714997.029017) can0 09F80102#6C719A16121BB80D (1410714997.088465) can0 0DF01002#1EF0C73F204C4C24 (1410714997.091029) can0 19FA0302#1ED3490068006400 (1410714997.093989) can0 19FA0402#80931EFD0C0B2D35 (1410714997.096979) can0 19FA0402#8108C56111F8FFFF (1410714997.100306) can0 19FA0402#82FFF220673013D6 (1410714997.103144) can0 19FA0402#83B912F8FFFFFFF2 (1410714997.105982) can0 19FA0402#840E7F16B920EE11 (1410714997.108973) can0 19FA0402#85E2FFFFFFF216DC (1410714997.112360) can0 19FA0402#8608AD2D1A10E8FF (1410714997.115015) can0 19FA0402#87FFFFF201D0247C (1410714997.118006) can0 19FA0402#88D95D13FBFFFFFF (1410714997.120966) can0 19FA0402#89F21B390A9574CC (1410714997.124323) can0 19FA0402#8A10FEFFFFFFF217 (1410714997.127009) can0 19FA0402#8B7F07CE8D9E117B (1410714997.130030) can0 19FA0402#8CFFFFFFF2047314 (1410714997.132960) can0 19FA0402#8DAAD27210F8FFFF (1410714997.136408) can0 19FA0402#8EFFF21FE80AB84D (1410714997.138972) can0 19FA0402#8FD61124000000F2 (1410714997.141993) can0 19FA0402#901C170413C7760D (1410714997.144953) can0 19FA0402#91FCFFFFFFF213A2 (1410714997.148524) can0 19FA0402#921C7D7F6E122300 (1410714997.150996) can0 19FA0402#930000F214221513 (1410714997.153986) can0 19FA0402#94B89C111B000000 (1410714997.156977) can0 19FA0402#95F2FFFFFFFFFFFF (1410714997.160303) can0 0DF80502#802F1EC73F204C4C (1410714997.163111) can0 0DF80502#812400A7950AE242 (1410714997.165980) can0 0DF80502#82430520335FCAD0 (1410714997.168970) can0 0DF80502#83B93103127E9502 (1410714997.172358) can0 0DF80502#840000000013FC0C (1410714997.175013) can0 0DF80502#8549008000AC0D00 (1410714997.178004) can0 0DF80502#860000FFFFFFFFFF (1410714997.180933) can0 09F80102#6C719A16121BB80D (1410714997.212397) can0 09F80202#1FFC00000100FFFF (1410714997.236994) can0 09F80102#6C719A16121BB80D (1410714997.336939) can0 09F80102#6C719A16121BB80D (1410714997.436915) can0 09F80102#6C719A16121BB80D (1410714997.443690) can0 19F212B0#A00980000064FF01 (1410714997.444270) can0 19F212B0#A11C0900FFFFFFFF (1410714997.444819) can0 19F214B0#00EC04C4FF6D7880 (1410714997.461939) can0 09F80202#20FC00000100FFFF (1410714997.536890) can0 09F80102#6C719A16121BB80D (1410714997.636866) can0 09F80102#6C719A16121BB80D (1410714997.711848) can0 09F80202#21FC00000100FFFF (1410714997.736811) can0 09F80102#6C719A16121BB80D (1410714997.836787) can0 09F80102#6C719A16121BB80D (1410714997.936762) can0 09F80102#6C719A16121BB80D (1410714997.961756) can0 09F80202#22FC00000100FFFF (1410714997.975764) can0 0DF50B11#018F030000FFFFFF (1410714998.036707) can0 09F80102#6C719A16121BB80D (1410714998.055354) can0 0DF01002#23F0C73F30734C24 (1410714998.057703) can0 19FA0302#23D3490068006400 (1410714998.060664) can0 19FA0402#A09323FD0C0B2D35 (1410714998.063654) can0 19FA0402#A108C5C511F2FFFF (1410714998.067011) can0 19FA0402#A2FFF220673013D6 (1410714998.069697) can0 19FA0402#A31D13F7FFFFFFF2 (1410714998.072657) can0 19FA0402#A40E7F16B9207011 (1410714998.075678) can0 19FA0402#A5F2FFFFFFF216DC (1410714998.078944) can0 19FA0402#A608AD2D3910ECFF (1410714998.081690) can0 19FA0402#A7FFFFF201D0247C (1410714998.084681) can0 19FA0402#A8D95C13F0FFFFFF (1410714998.087641) can0 19FA0402#A9F21B390A9574D4 (1410714998.090968) can0 19FA0402#AA10FBFFFFFFF217 (1410714998.093653) can0 19FA0402#AB7F07CE8DBF1176 (1410714998.096674) can0 19FA0402#ACFFFFFFF2047314 (1410714998.099665) can0 19FA0402#ADAAD2B5100A0000 (1410714998.103327) can0 19FA0402#AE00F21FE80AB84D (1410714998.105677) can0 19FA0402#AFD41128000000F2 (1410714998.108668) can0 19FA0402#B01C170413C7980D (1410714998.111658) can0 19FA0402#B104000000F213A2 (1410714998.114985) can0 19FA0402#B21C7D7FEA121C00 (1410714998.117670) can0 19FA0402#B30000F214221513 (1410714998.120692) can0 19FA0402#B4B844111B000000 (1410714998.123682) can0 19FA0402#B5F2FFFFFFFFFFFF (1410714998.127009) can0 0DF80502#A02F23C73F30734C (1410714999.088435) can0 19FA0402#C608AD2D4510EFFF (1410714999.091364) can0 19FA0402#C7FFFFF201D0247C (1410714999.094324) can0 19FA0402#C8D9EB12ECFFFFFF (1410714999.097681) can0 19FA0402#C9F21B390A9574D2 (1410714999.100367) can0 19FA0402#CA10F7FFFFFFF217 (1410714999.103358) can0 19FA0402#CB7F07CE8DD4116D (1410714999.106348) can0 19FA0402#CCFFFFFFF2047314 (1410714999.109705) can0 19FA0402#CDAAD27611040000 (1410714999.112391) can0 19FA0402#CE00F21FE80AB84D (1410714999.115351) can0 19FA0402#CFF21131000000F2 (1410714999.118342) can0 19FA0402#D01C170413C7C50D (1410714999.121668) can0 19FA0402#D105000000F213A2 (1410714999.124323) can0 19FA0402#D21C7D7F8C121E00 (1410714999.127344) can0 19FA0402#D30000F214221513 (1410714999.130335) can0 19FA0402#D4B8961121000000 (1410714999.133662) can0 19FA0402#D5F2FFFFFFFFFFFF (1410714999.136408) can0 0DF80502#C02F28C73F409A4C (1410714999.139368) can0 0DF80502#C12400A7950AE242 (1410714999.142329) can0 0DF80502#C2430520335FCAD0 (1410714999.145777) can0 0DF80502#C3B93103127E9502 (1410714999.148463) can0 0DF80502#C40000000013FC0C (1410714999.151362) can0 0DF80502#C549008000AC0D00 (1410714999.154353) can0 0DF80502#C60000FFFFFFFFFF (1410714999.157679) can0 09F80102#6C719A16121BB80D (1410714999.188532) can0 09F80202#29FC00000100FFFF (1410714999.213648) can0 09F80102#6C719A16121BB80D (1410714999.220881) can0 1DEFFF01#800AE598B6060404 (1410714999.221461) can0 1DEFFF01#8100000002FFFFFF (1410714999.249781) can0 11F80E01#E01B01985B620E90 (1410714999.250330) can0 11F80E01#E1C6C20D80B99916 (1410714999.250880) can0 11F80E01#E204A5A40000D908 (1410714999.251459) can0 11F80E01#E309FFFFFF7F00FE (1410714999.313624) can0 09F80102#6C719A16121BB80D (1410714999.413569) can0 09F80102#6C719A16121BB80D (1410714999.438319) can0 09F80202#2AFC00000100FFFF (1410714999.513239) can0 09F80102#6C719A16121BB80D (1410714999.613215) can0 09F80102#6C719A16121BB80D (1410714999.688502) can0 09F80202#2BFC00000100FFFF (1410714999.713190) can0 09F80102#6C719A16121BB80D (1410714999.813166) can0 09F80102#6C719A16121BB80D (1410714999.913111) can0 09F80102#6C719A16121BB80D (1410714999.938136) can0 09F80202#2CFC00000100FFFF (1410714999.978693) can0 0DF50B11#018F030000FFFFFF (1410715000.013087) can0 09F80102#6C719A16121BB80D (1410715000.111414) can0 0DF01002#2DF0C73F50C14C24 (1410715000.114039) can0 19FA0302#2DD3490068006400 (1410715000.116999) can0 19FA0402#E0932DFD0C0B2D35 (1410715000.120356) can0 19FA0402#E108C52612F1FFFF (1410715000.123133) can0 19FA0402#E2FFF220673013D6 (1410715000.126032) can0 19FA0402#E3CD12FDFFFFFFF2 (1410715000.129023) can0 19FA0402#E40E7F16B920AB11 (1410715000.132410) can0 19FA0402#E5E8FFFFFFF216DC (1410715000.135004) can0 19FA0402#E608AD2DDD0FF1FF (1410715000.138056) can0 19FA0402#E7FFFFF201D0247C (1410715000.141016) can0 19FA0402#E8D98613E3FFFFFF (1410715000.144343) can0 19FA0402#E9F21B390A9574A7 (1410715000.147028) can0 19FA0402#EA10FDFFFFFFF217 (1410715000.150019) can0 19FA0402#EB7F07CE8DB7116A (1410715000.153010) can0 19FA0402#ECFFFFFFF2047314 (1410715000.156397) can0 19FA0402#EDAAD26911F9FFFF (1410715000.159022) can0 19FA0402#EEFFF21FE80AB84D (1410715000.162043) can0 19FA0402#EFE81135000000F2 (1410715000.165003) can0 19FA0402#F01C170413C7C80D (1410715000.168452) can0 19FA0402#F1F7FFFFFFF213A2 (1410715000.170985) can0 19FA0402#F21C7D7FBB121900 (1410715000.174036) can0 19FA0402#F30000F214221513 (1410715000.176997) can0 19FA0402#F4B8021124000000 (1410715000.180567) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715000.183375) can0 0DF80502#E02F2DC73F50C14C (1410715000.186030) can0 0DF80502#E12400A7950AE242 (1410715000.188990) can0 0DF80502#E2430520335FCAD0 (1410715000.192438) can0 0DF80502#E3B93103127E9502 (1410715000.195032) can0 0DF80502#E40000000013FC0C (1410715000.198023) can0 0DF80502#E549008000AC0D00 (1410715000.201014) can0 0DF80502#E60000FFFFFFFFFF (1410715000.204340) can0 09F80102#6C719A16121BB80D (1410715000.236475) can0 09F80202#2EFC00000300FFFF (1410715000.261011) can0 09F80102#6C719A16121BB80D (1410715000.360987) can0 09F80102#6C719A16121BB80D (1410715000.443781) can0 19F212B0#E0099E000064FF00 (1410715000.444331) can0 19F212B0#E11C0A00FFFFFFFF (1410715000.444849) can0 19F214B0#00EC04C5FF6D789E (1410715000.460963) can0 09F80102#6C719A16121BB80D (1410715000.485987) can0 09F80202#2FFC00000300FFFF (1410715000.560908) can0 09F80102#6C719A16121BB80D (1410715000.660883) can0 09F80102#6C719A16121BB80D (1410715000.735896) can0 09F80202#30FC00000300FFFF (1410715000.760859) can0 09F80102#6C719A16121BB80D (1410715000.860834) can0 09F80102#6C719A16121BB80D (1410715000.960780) can0 09F80102#6C719A16121BB80D (1410715000.980189) can0 0DF50B11#018F030000FFFFFF (1410715000.985804) can0 09F80202#31FC00000300FFFF (1410715001.009974) can0 11F80E01#001B0108975C0E50 (1410715001.010523) can0 11F80E01#019BC50DE0F39816 (1410715001.011073) can0 11F80E01#0205726E00004C00 (1410715001.011652) can0 11F80E01#0300E5AF000000FE (1410715001.060755) can0 09F80102#6C719A16121BB80D (1410715001.072474) can0 0DF01002#32F0C73F60E84C24 (1410715001.075007) can0 19FA0302#32D3490068006400 (1410715001.077723) can0 19FA0402#009332FD0C0B2D35 (1410715001.080714) can0 19FA0402#0108C51412F6FFFF (1410715001.083704) can0 19FA0402#02FFF220673013D6 (1410715001.087031) can0 19FA0402#03CC12FDFFFFFFF2 (1410715001.089716) can0 19FA0402#040E7F16B920D811 (1410715001.092707) can0 19FA0402#05F1FFFFFFF216DC (1410715001.095728) can0 19FA0402#0608AD2DF20FEFFF (1410715001.098994) can0 19FA0402#07FFFFF201D0247C (1410715001.101710) can0 19FA0402#08D9CF12F1FFFFFF (1410715001.104700) can0 19FA0402#09F21B390A9574C0 (1410715001.107722) can0 19FA0402#0A10FAFFFFFFF217 (1410715001.110987) can0 19FA0402#0B7F07CE8DCD1164 (1410715001.113703) can0 19FA0402#0CFFFFFFF2047314 (1410715001.116694) can0 19FA0402#0DAAD23D11E9FFFF (1410715001.119715) can0 19FA0402#0EFFF21FE80AB84D (1410715001.123164) can0 19FA0402#0F8A1135000000F2 (1410715001.125697) can0 19FA0402#101C170413C7AE0D (1410715001.128718) can0 19FA0402#11FDFFFFFFF213A2 (1410715001.131709) can0 19FA0402#121C7D7F1F121A00 (1410715001.135096) can0 19FA0402#130000F214221513 (1410715001.137751) can0 19FA0402#14B8B6112D000000 (1410715001.140742) can0 19FA0402#15F2FFFFFFFFFFFF (1410715001.143702) can0 0DF80502#002F32C73F60E84C (1410715001.147089) can0 0DF80502#012400A7950AE242 (1410715001.150050) can0 0DF80502#02430520335FCAD0 (1410715001.152705) can0 0DF80502#03B93103127E9502 (1410715001.155726) can0 0DF80502#040000000013FC0C (1410715001.158991) can0 0DF80502#0549008000AC0D00 (1410715001.161707) can0 0DF80502#060000FFFFFFFFFF (1410715001.164698) can0 09F80102#6C719A16121BB80D (1410715001.196772) can0 09F80202#33FC00000200FFFF (1410715001.221735) can0 09F80102#6C719A16121BB80D (1410715001.321741) can0 09F80102#6C719A16121BB80D (1410715001.421748) can0 09F80102#6C719A16121BB80D (1410715001.447047) can0 09F80202#34FC00000200FFFF (1410715001.521723) can0 09F80102#6C719A16121BB80D (1410715001.621821) can0 09F80102#6C719A16121BB80D (1410715001.696589) can0 09F80202#35FC00000200FFFF (1410715001.721735) can0 09F80102#6C719A16121BB80D (1410715001.809656) can0 11F80E01#201B01A929C40CE0 (1410715001.810206) can0 11F80E01#2131B90D40019A16 (1410715001.810755) can0 11F80E01#220CAE0C0000DC60 (1410715001.811335) can0 11F80E01#23047CCA000000FE (1410715001.821741) can0 09F80102#6C719A16121BB80D (1410715001.921748) can0 09F80102#6C719A16121BB80D (1410715001.943751) can0 19F212B0#0009AD000064FF08 (1410715001.944331) can0 19F212B0#011C0900FFFFFFFF (1410715001.944880) can0 19F214B0#00EC04C5FF6D78AD (1410715001.946497) can0 09F80202#36FC00000200FFFF (1410715001.981684) can0 0DF50B11#018F030000FFFFFF (1410715002.021754) can0 09F80102#6C719A16121BB80D (1410715002.080531) can0 0DF01002#37F0C73F700F4D24 (1410715002.083399) can0 19FA0302#37D3490068006400 (1410715002.086390) can0 19FA0402#209337FD0C0B2D35 (1410715002.089777) can0 19FA0402#2108C54012F5FFFF (1410715002.092402) can0 19FA0402#22FFF220673013D6 (1410715002.095393) can0 19FA0402#23D41201000000F2 (1410715002.098414) can0 19FA0402#240E7F160B20E411 (1410715002.101771) can0 19FA0402#25F3FFFFFFF216DC (1410715002.104395) can0 19FA0402#2608AD2DF10FF0FF (1410715002.107417) can0 19FA0402#27FFFFF201D0247C (1410715002.110407) can0 19FA0402#28D92313EFFFFFFF (1410715002.113642) can0 19FA0402#29F21B390A9574CB (1410715002.116419) can0 19FA0402#2A10F8FFFFFFF217 (1410715002.119379) can0 19FA0402#2B7F07CE8DD21167 (1410715002.122401) can0 19FA0402#2CFFFFFFF2047314 (1410715002.125636) can0 19FA0402#2DAAD23011EDFFFF (1410715002.128474) can0 19FA0402#2EFFF21FE80AB84D (1410715002.131373) can0 19FA0402#2F7E1139000000F2 (1410715002.134394) can0 19FA0402#301C170413C7900D (1410715002.137720) can0 19FA0402#3102000000F213A2 (1410715002.140375) can0 19FA0402#321C7D7F3D121B00 (1410715002.143366) can0 19FA0402#330000F214221513 (1410715002.146387) can0 19FA0402#34B8A6112B000000 (1410715002.149744) can0 19FA0402#35F2FFFFFFFFFFFF (1410715002.152430) can0 0DF80502#202F37C73F700F4D (1410715002.155360) can0 0DF80502#212400A7950AE242 (1410715002.158381) can0 0DF80502#22430520335FCAD0 (1410715002.161677) can0 0DF80502#23B93103127E9502 (1410715002.164393) can0 0DF80502#240000000013FC0C (1410715002.167384) can0 0DF80502#2549008000AC0D00 (1410715002.170405) can0 0DF80502#260000FFFFFFFFFF (1410715002.173640) can0 09F80102#6C719A16121BB80D (1410715002.205714) can0 09F80202#38FC00000200FFFF (1410715002.229761) can0 09F80102#6C719A16121BB80D (1410715002.329707) can0 09F80102#6C719A16121BB80D (1410715002.429682) can0 09F80102#6C719A16121BB80D (1410715002.454340) can0 09F80202#39FC00000200FFFF (1410715002.529292) can0 09F80102#6C719A16121BB80D (1410715002.629267) can0 09F80102#6C719A16121BB80D (1410715002.704432) can0 09F80202#3AFC00000200FFFF (1410715002.729243) can0 09F80102#6C719A16121BB80D (1410715002.829188) can0 09F80102#6C719A16121BB80D (1410715002.929163) can0 09F80102#6C719A16121BB80D (1410715002.954188) can0 09F80202#3BFC00000200FFFF (1410715002.983179) can0 0DF50B11#018F030000FFFFFF (1410715003.029139) can0 09F80102#6C719A16121BB80D (1410715003.089777) can0 0DF01002#3CF0C73F80364D24 (1410715003.092432) can0 19FA0302#3CD3490068006400 (1410715003.095087) can0 19FA0402#40933CFD0C0B2D35 (1410715003.098078) can0 19FA0402#4108C5A111F5FFFF (1410715003.101099) can0 19FA0402#42FFF220673013D6 (1410715003.104395) can0 19FA0402#43B11200000000F2 (1410715003.107081) can0 19FA0402#440E7F160B20C711 (1410715003.110072) can0 19FA0402#45F0FFFFFFF216DC (1410715003.113062) can0 19FA0402#4608AD2DE10FF7FF (1410715003.116450) can0 19FA0402#47FFFFF201D0247C (1410715003.119074) can0 19FA0402#48D90213EEFFFFFF (1410715003.122065) can0 19FA0402#49F21B390A9574F6 (1410715003.125086) can0 19FA0402#4A10F7FFFFFFF217 (1410715003.128474) can0 19FA0402#4B7F07CE8D8C1169 (1410715003.131068) can0 19FA0402#4CFFFFFFF2047314 (1410715003.134058) can0 19FA0402#4DAAD2AC11F7FFFF (1410715003.137049) can0 19FA0402#4EFFF21FE80AB84D (1410715003.140375) can0 19FA0402#4FAD1130000000F2 (1410715003.143183) can0 19FA0402#501C170413C7870D (1410715003.146052) can0 19FA0402#5105000000F213A2 (1410715003.149073) can0 19FA0402#521C7D7F95121C00 (1410715003.152796) can0 19FA0402#530000F214221513 (1410715003.155054) can0 19FA0402#54B8791124000000 (1410715003.158076) can0 19FA0402#55F2FFFFFFFFFFFF (1410715003.161066) can0 0DF80502#402F3CC73F80364D (1410715003.164362) can0 0DF80502#412400A7950AE242 (1410715003.167048) can0 0DF80502#42430520335FCAD0 (1410715003.170069) can0 0DF80502#43B93103127E9502 (1410715003.173060) can0 0DF80502#440000000013FC0C (1410715003.176447) can0 0DF80502#4549008000AC0D00 (1410715003.179102) can0 0DF80502#460000FFFFFFFFFF (1410715003.182063) can0 09F80102#6C719A16121BB80D (1410715003.214136) can0 09F80202#3DFC00000300FFFF (1410715003.239069) can0 09F80102#6C719A16121BB80D (1410715003.339045) can0 09F80102#6C719A16121BB80D (1410715003.439051) can0 09F80102#6C719A16121BB80D (1410715003.443781) can0 19F212B0#2009BC000064FF08 (1410715003.444331) can0 19F212B0#211C0A00FFFFFFFF (1410715003.444880) can0 19F214B0#00EC04C5FF6978BC (1410715003.464381) can0 09F80202#3EFC00000300FFFF (1410715003.539057) can0 09F80102#6C719A16121BB80D (1410715003.655543) can0 09F80102#6C719A16121BB80D (1410715003.715205) can0 09F80202#3FFC00000300FFFF (1410715003.739039) can0 09F80102#6C719A16121BB80D (1410715003.743311) can0 11F80E01#401B0188F64A0E60 (1410715003.743861) can0 11F80E01#41FFB80D60069A16 (1410715003.744440) can0 11F80E01#4210FFFF0000DC60 (1410715003.744990) can0 11F80E01#430C154F000000FE (1410715003.839045) can0 09F80102#6C719A16121BB80D (1410715003.939051) can0 09F80102#6C719A16121BB80D (1410715003.963862) can0 09F80202#40FC00000300FFFF (1410715003.984705) can0 0DF50B11#018F030000FFFFFF (1410715004.039057) can0 09F80102#6C719A16121BB80D (1410715004.067072) can0 0DF01002#41F0C73F905D4D24 (1410715004.069788) can0 19FA0302#41D3490068006400 (1410715004.072779) can0 19FA0402#609341FD0C0B2D35 (1410715004.075770) can0 19FA0402#6108C5D611F3FFFF (1410715004.079035) can0 19FA0402#62FFF220673013D6 (1410715004.081782) can0 19FA0402#63B212FBFFFFFFF2 (1410715004.084772) can0 19FA0402#640E7F160B20D611 (1410715004.087763) can0 19FA0402#65EDFFFFFFF216DC (1410715004.090998) can0 19FA0402#6608AD2D0210FFFF (1410715004.093775) can0 19FA0402#67FFFFF201D0247C (1410715004.096766) can0 19FA0402#68D97412F6FFFFFF (1410715004.099757) can0 19FA0402#69F21B390A9574FF (1410715004.103205) can0 19FA0402#6A10F6FFFFFFF217 (1410715004.105769) can0 19FA0402#6B7F07CE8D8C1166 (1410715004.108759) can0 19FA0402#6CFFFFFFF2047314 (1410715004.111750) can0 19FA0402#6DAAD24410180000 (1410715004.115046) can0 19FA0402#6E00F21FE80AB84D (1410715004.117762) can0 19FA0402#6FB91128000000F2 (1410715004.120753) can0 19FA0402#701C170413C7600D (1410715004.123743) can0 19FA0402#71EEFFFFFFF213A2 (1410715004.127070) can0 19FA0402#721C7D7FCA121C00 (1410715004.129755) can0 19FA0402#730000F214221513 (1410715004.132777) can0 19FA0402#74B8FB111F000000 (1410715004.135767) can0 19FA0402#75F2FFFFFFFFFFFF (1410715004.139033) can0 0DF80502#602F41C73F905D4D (1410715004.141718) can0 0DF80502#612400A7950AE242 (1410715004.144740) can0 0DF80502#62430520335FCAD0 (1410715005.200495) can0 09F80202#47FC00000100FFFF (1410715005.225733) can0 09F80102#6C719A16121BB80D (1410715005.325709) can0 09F80102#6C719A16121BB80D (1410715005.425684) can0 09F80102#6C719A16121BB80D (1410715005.450404) can0 09F80202#48FC00000100FFFF (1410715005.525660) can0 09F80102#6C719A16121BB80D (1410715005.625330) can0 09F80102#6C719A16121BB80D (1410715005.700465) can0 09F80202#49FC00000100FFFF (1410715005.725306) can0 09F80102#6C719A16121BB80D (1410715005.825251) can0 09F80102#6C719A16121BB80D (1410715005.876582) can0 19FB1101#2019185C23220E00 (1410715005.877161) can0 19FB1101#2100000000000000 (1410715005.877741) can0 19FB1101#2200000000000000 (1410715005.878321) can0 19FB1101#230000000000FFFF (1410715005.925227) can0 09F80102#6C719A16121BB80D (1410715005.950220) can0 09F80202#4AFC00000100FFFF (1410715005.988154) can0 0DF50B11#018C030000FFFFFF (1410715006.009241) can0 19FB1201#6021185C23220E00 (1410715006.009791) can0 19FB1201#614741524D494E00 (1410715006.010401) can0 19FB1201#6200000000000000 (1410715006.010950) can0 19FB1201#63FFFFFFFFFFFFFF (1410715006.011530) can0 19FB1201#64FFFFFFFFFF03FF (1410715006.025202) can0 09F80102#6C719A16121BB80D (1410715006.085078) can0 0DF01002#4BF0C73FB0AB4D24 (1410715006.088496) can0 19FA0302#4BD3490068006400 (1410715006.091120) can0 19FA0402#A0934BFD0C0B2D35 (1410715006.094141) can0 19FA0402#A108C51C12FDFFFF (1410715006.097132) can0 19FA0402#A2FFF220673013D6 (1410715006.100397) can0 19FA0402#A3CC12F8FFFFFFF2 (1410715006.103449) can0 19FA0402#A40E7F160B20C611 (1410715006.106135) can0 19FA0402#A5EEFFFFFFF216DC (1410715006.109126) can0 19FA0402#A608AD2DF20FF4FF (1410715006.112513) can0 19FA0402#A7FFFFF201D0247C (1410715006.115137) can0 19FA0402#A8D9F212E7FFFFFF (1410715006.118098) can0 19FA0402#A9F21B390A9574E7 (1410715006.121119) can0 19FA0402#AA10FBFFFFFFF217 (1410715006.124384) can0 19FA0402#AB7F07CE8D4B1167 (1410715006.127131) can0 19FA0402#ACFFFFFFF2047314 (1410715006.130122) can0 19FA0402#ADAAD29D10070000 (1410715006.133112) can0 19FA0402#AE00F21FE80AB84D (1410715006.136439) can0 19FA0402#AF981122000000F2 (1410715006.139124) can0 19FA0402#B01C170413C71A0D (1410715006.142115) can0 19FA0402#B11D000000F213A2 (1410715006.145106) can0 19FA0402#B21C7D7F7D122400 (1410715006.148493) can0 19FA0402#B30000F214221513 (1410715006.151118) can0 19FA0402#B4B8811129000000 (1410715006.154139) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715006.157099) can0 0DF80502#A02F4BC73FB0AB4D (1410715006.160395) can0 0DF80502#A12400A7950AE242 (1410715006.163203) can0 0DF80502#A2430520335FCAD0 (1410715006.166102) can0 0DF80502#A3B93103127E9502 (1410715006.169123) can0 0DF80502#A40000000013FC0C (1410715006.172449) can0 0DF80502#A549008000AC0D00 (1410715006.175196) can0 0DF80502#A60000FFFFFFFFFF (1410715006.178126) can0 09F80102#6C719A16121BB80D (1410715006.209162) can0 09F80202#4CFC00000200FFFF (1410715006.234156) can0 09F80102#6C719A16121BB80D (1410715006.334101) can0 09F80102#6C719A16121BB80D (1410715006.434077) can0 09F80102#6C719A16121BB80D (1410715006.443812) can0 19F212B0#6009DA000064FF07 (1410715006.444392) can0 19F212B0#611C0900FFFFFFFF (1410715006.444941) can0 19F214B0#00DE04C5FF6878DA (1410715006.459101) can0 09F80202#4DFC00000200FFFF (1410715006.534052) can0 09F80102#6C719A16121BB80D (1410715006.556849) can0 11F80E01#601B0132D74A1010 (1410715006.557398) can0 11F80E01#61ECE20D20559116 (1410715006.557948) can0 11F80E01#621A6BBE8601A4C0 (1410715006.558497) can0 11F80E01#630093BF000000FE (1410715006.633997) can0 09F80102#6C719A16121BB80D (1410715006.709010) can0 09F80202#4EFC00000200FFFF (1410715006.733973) can0 09F80102#6C719A16121BB80D (1410715006.833918) can0 09F80102#6C719A16121BB80D (1410715006.933894) can0 09F80102#6C719A16121BB80D (1410715006.959101) can0 09F80202#4FFC00000200FFFF (1410715007.033869) can0 09F80102#6C719A16121BB80D (1410715007.089747) can0 0DF50B11#018F030000FFFFFF (1410715007.094294) can0 0DF01002#50F0C73FC0D24D24 (1410715007.096827) can0 19FA0302#50D3490068006400 (1410715007.099818) can0 19FA0402#C09350FD0C0B2D35 (1410715007.103175) can0 19FA0402#C108C5B812F7FFFF (1410715007.105799) can0 19FA0402#C2FFF220673013D6 (1410715007.108820) can0 19FA0402#C3AB12F8FFFFFFF2 (1410715007.111811) can0 19FA0402#C40E7F160B20CC11 (1410715007.115137) can0 19FA0402#C5E7FFFFFFF216DC (1410715007.117792) can0 19FA0402#C608AD2D0A10E6FF (1410715007.120814) can0 19FA0402#C7FFFFF201D0247C (1410715007.123804) can0 19FA0402#C8D99812E9FFFFFF (1410715007.127100) can0 19FA0402#C9F21B390A9574E6 (1410715007.129816) can0 19FA0402#CA10FBFFFFFFF217 (1410715007.132807) can0 19FA0402#CB7F07CE8D391173 (1410715007.135798) can0 19FA0402#CCFFFFFFF2047314 (1410715007.139033) can0 19FA0402#CDAAD21111FBFFFF (1410715007.141840) can0 19FA0402#CEFFF21FE80AB84D (1410715007.144801) can0 19FA0402#CF8D1121000000F2 (1410715007.147791) can0 19FA0402#D01C170413C7710D (1410715007.151057) can0 19FA0402#D108000000F213A2 (1410715007.153803) can0 19FA0402#D21C7D7F80122600 (1410715007.156794) can0 19FA0402#D30000F214221513 (1410715007.159815) can0 19FA0402#D4B80A122A000000 (1410715007.163172) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715007.165797) can0 0DF80502#C02F50C73FC0D24D (1410715007.168787) can0 0DF80502#C12400A7950AE242 (1410715007.171778) can0 0DF80502#C2430520335FCAD0 (1410715007.175166) can0 0DF80502#C3B93103127E9502 (1410715007.177790) can0 0DF80502#C40000000013FC0C (1410715007.180781) can0 0DF80502#C549008000AC0D00 (1410715007.183802) can0 0DF80502#C60000FFFFFFFFFF (1410715007.187098) can0 09F80102#6C719A16121BB80D (1410715007.219111) can0 09F80202#51FC00000600FFFF (1410715007.243800) can0 09F80102#6C719A16121BB80D (1410715007.343775) can0 09F80102#6C719A16121BB80D (1410715007.443751) can0 09F80102#6C719A16121BB80D (1410715007.468806) can0 09F80202#52FC00000600FFFF (1410715007.543726) can0 09F80102#6C719A16121BB80D (1410715007.643671) can0 09F80102#6C719A16121BB80D (1410715007.718684) can0 09F80202#53FC00000600FFFF (1410715007.746638) can0 09F80102#6C719A16121BB80D (1410715007.843623) can0 09F80102#6C719A16121BB80D (1410715007.943598) can0 09F80102#6C719A16121BB80D (1410715007.944147) can0 19F212B0#8009E9000064FF07 (1410715007.944727) can0 19F212B0#811C9F04FFFFFFFF (1410715007.945277) can0 19F214B0#00E704C5FF6778E9 (1410715007.968592) can0 09F80202#54FC00000600FFFF (1410715008.043543) can0 09F80102#6C719A16121BB80D (1410715008.059718) can0 0DF01002#55F0C73FD0F94D24 (1410715008.062525) can0 19FA0302#55D3490068006400 (1410715008.065699) can0 19FA0402#E09355FD0C0B2D35 (1410715008.068537) can0 19FA0402#E108C501120A0000 (1410715008.071497) can0 19FA0402#E200F220673013D6 (1410715008.074519) can0 19FA0402#E3761200000000F2 (1410715008.077753) can0 19FA0402#E40E7F160B20A911 (1410715008.080500) can0 19FA0402#E5ECFFFFFFF216DC (1410715008.083491) can0 19FA0402#E608AD2D1410F3FF (1410715008.086512) can0 19FA0402#E7FFFFF201D0247C (1410715008.089777) can0 19FA0402#E8D9D712FEFFFFFF (1410715008.091151) can0 0DF50B11#018F030000FFFFFF (1410715008.092493) can0 19FA0402#E9F21B390A9574E6 (1410715008.095484) can0 19FA0402#EA1007000000F217 (1410715008.098505) can0 19FA0402#EB7F07CE8D361182 (1410715008.101832) can0 19FA0402#ECFFFFFFF2047314 (1410715008.104487) can0 19FA0402#EDAAD23211FDFFFF (1410715008.107508) can0 19FA0402#EEFFF21FE80AB84D (1410715008.110499) can0 19FA0402#EF581127000000F2 (1410715008.113734) can0 19FA0402#F01C170413C75F0D (1410715008.116480) can0 19FA0402#F112000000F213A2 (1410715008.119501) can0 19FA0402#F21C7D7F21123600 (1410715008.122492) can0 19FA0402#F30000F214221513 (1410715008.125727) can0 19FA0402#F4B8D2112E000000 (1410715008.128535) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715008.131495) can0 0DF80502#E02F55C73FD0F94D (1410715008.134486) can0 0DF80502#E12400A7950AE242 (1410715008.137782) can0 0DF80502#E2430520335FCAD0 (1410715008.140498) can0 0DF80502#E3B93103127E9502 (1410715008.143488) can0 0DF80502#E40000000013FC0C (1410715008.146479) can0 0DF80502#E549008000AC0D00 (1410715008.149805) can0 0DF80502#E60000FFFFFFFFFF (1410715008.152460) can0 09F80102#6C719A16121BB80D (1410715008.184534) can0 09F80202#56FC00000200FFFF (1410715008.209834) can0 09F80102#6C719A16121BB80D (1410715008.289790) can0 11F80E01#801B01985B620E80 (1410715008.290339) can0 11F80E01#81C6C20D80B99916 (1410715008.290888) can0 11F80E01#8228A5A400004EC0 (1410715008.291468) can0 11F80E01#8300FFFFFF7F00FE (1410715008.309840) can0 09F80102#6C719A16121BB80D (1410715008.409815) can0 09F80102#6C719A16121BB80D (1410715008.434443) can0 09F80202#57FC00000200FFFF (1410715008.509791) can0 09F80102#6C719A16121BB80D (1410715008.609736) can0 09F80102#6C719A16121BB80D (1410715008.684473) can0 09F80202#58FC00000200FFFF (1410715008.709345) can0 09F80102#6C719A16121BB80D (1410715008.809321) can0 09F80102#6C719A16121BB80D (1410715008.909266) can0 09F80102#6C719A16121BB80D (1410715008.934290) can0 09F80202#59FC00000200FFFF (1410715009.009241) can0 09F80102#6C719A16121BB80D (1410715009.068751) can0 0DF01002#5AF0C73FE0204E24 (1410715009.071192) can0 19FA0302#5AD3490068006400 (1410715009.074183) can0 19FA0402#00935AFD0C0B2D35 (1410715009.077204) can0 19FA0402#0108C5B511120000 (1410715009.080408) can0 19FA0402#0200F220673013D6 (1410715009.083186) can0 19FA0402#03C71200000000F2 (1410715009.086176) can0 19FA0402#040E7F160B208F11 (1410715009.089198) can0 19FA0402#05F1FFFFFFF216DC (1410715009.092463) can0 19FA0402#0608AD2D0A10F5FF (1410715009.093012) can0 0DF50B11#018F030000FFFFFF (1410715009.095209) can0 19FA0402#07FFFFF201D0247C (1410715009.098200) can0 19FA0402#08D91D1301000000 (1410715009.101160) can0 19FA0402#09F21B390A9574E9 (1410715009.104426) can0 19FA0402#0A1009000000F217 (1410715009.107172) can0 19FA0402#0B7F07CE8D4E1182 (1410715009.110194) can0 19FA0402#0CFFFFFFF2047314 (1410715009.113184) can0 19FA0402#0DAAD22D11F9FFFF (1410715009.116419) can0 19FA0402#0EFFF21FE80AB84D (1410715009.119166) can0 19FA0402#0F66112D000000F2 (1410715009.122187) can0 19FA0402#101C170413C7910D (1410715009.125178) can0 19FA0402#1124000000F213A2 (1410715009.128535) can0 19FA0402#121C7D7FF7123000 (1410715009.131159) can0 19FA0402#130000F214221513 (1410715009.134180) can0 19FA0402#14B8EA112A000000 (1410715009.137202) can0 19FA0402#15F2FFFFFFFFFFFF (1410715009.140406) can0 0DF80502#002F5AC73FE0204E (1410715009.143336) can0 0DF80502#012400A7950AE242 (1410715009.146174) can0 0DF80502#02430520335FCAD0 (1410715009.149165) can0 0DF80502#03B93103127E9502 (1410715009.152552) can0 0DF80502#040000000013FC0C (1410715009.155177) can0 0DF80502#0549008000AC0D00 (1410715009.158198) can0 0DF80502#060000FFFFFFFFFF (1410715009.161158) can0 09F80102#6C719A16121BB80D (1410715009.193201) can0 09F80202#5BFC00000200FFFF (1410715009.218165) can0 09F80102#6C719A16121BB80D (1410715009.220179) can0 1DEFFF01#C00AE598B6060404 (1410715009.220728) can0 1DEFFF01#C100000002FFFFFF (1410715009.318171) can0 09F80102#6C719A16121BB80D (1410715009.418146) can0 09F80102#6C719A16121BB80D (1410715009.443262) can0 09F80202#5CFC00000200FFFF (1410715009.444147) can0 19F212B0#A009F8000064FF07 (1410715009.444697) can0 19F212B0#A11C0900FFFFFFFF (1410715009.445246) can0 19F214B0#00EA04C5FF6778F8 (1410715009.518122) can0 09F80102#6C719A16121BB80D (1410715009.618098) can0 09F80102#6C719A16121BB80D (1410715009.693049) can0 09F80202#5DFC00000200FFFF (1410715009.718012) can0 09F80102#6C719A16121BB80D (1410715009.817988) can0 09F80102#6C719A16121BB80D (1410715009.917963) can0 09F80102#6C719A16121BB80D (1410715009.943354) can0 09F80202#5EFC00000200FFFF (1410715010.017939) can0 09F80102#6C719A16121BB80D (1410715010.094141) can0 0DF50B11#018C030000FFFFFF (1410715010.112788) can0 0DF01002#5FF0C73FF0474E24 (1410715010.115198) can0 19FA0302#5FD3490068006400 (1410715010.117854) can0 19FA0402#20935FFD0C0B2D35 (1410715010.120844) can0 19FA0402#2108C5E0110E0000 (1410715010.123865) can0 19FA0402#2200F220673013D6 (1410715010.127131) can0 19FA0402#234A1200000000F2 (1410715010.129877) can0 19FA0402#240E7F160B209511 (1410715010.132868) can0 19FA0402#25EBFFFFFFF216DC (1410715010.135859) can0 19FA0402#2608AD2D0410F6FF (1410715010.139094) can0 19FA0402#27FFFFF201D0247C (1410715010.141871) can0 19FA0402#28D9E11200000000 (1410715010.144831) can0 19FA0402#29F21B390A957409 (1410715010.147852) can0 19FA0402#2A1105000000F217 (1410715010.151087) can0 19FA0402#2B7F07CE8D73118B (1410715010.153864) can0 19FA0402#2CFFFFFFF2047314 (1410715010.156855) can0 19FA0402#2DAAD27C10020000 (1410715010.159846) can0 19FA0402#2E00F21FE80AB84D (1410715010.163203) can0 19FA0402#2F621136000000F2 (1410715010.165858) can0 19FA0402#301C170413C7860D (1410715010.168848) can0 19FA0402#3115000000F213A2 (1410715010.171870) can0 19FA0402#321C7D7F04123600 (1410715010.175196) can0 19FA0402#330000F214221513 (1410715010.177851) can0 19FA0402#34B8BC1128000000 (1410715010.180872) can0 19FA0402#35F2FFFFFFFFFFFF (1410715010.183863) can0 0DF80502#202F5FC73FF0474E (1410715010.184412) can0 11F80E01#A01B0108975C0EF0 (1410715010.184962) can0 11F80E01#A19BC50DE0F39816 (1410715010.185511) can0 11F80E01#A22D726E0000DC60 (1410715010.186060) can0 11F80E01#A30CE5AF000000FE (1410715010.187128) can0 0DF80502#212400A7950AE242 (1410715010.189844) can0 0DF80502#22430520335FCAD0 (1410715010.192835) can0 0DF80502#23B93103127E9502 (1410715010.195856) can0 0DF80502#240000000013FC0C (1410715010.199091) can0 0DF80502#2549008000AC0D00 (1410715010.201868) can0 0DF80502#260000FFFFFFFFFF (1410715010.204829) can0 09F80102#6C719A16121BB80D (1410715010.236903) can0 09F80202#60FC00000500FFFF (1410715010.261988) can0 09F80102#6C719A16121BB80D (1410715010.361872) can0 09F80102#6C719A16121BB80D (1410715010.461909) can0 09F80102#6C719A16121BB80D (1410715010.487177) can0 09F80202#61FC00000500FFFF (1410715010.561884) can0 09F80102#6C719A16121BB80D (1410715010.661890) can0 09F80102#6C719A16121BB80D (1410715010.736719) can0 09F80202#62FC00000500FFFF (1410715010.761896) can0 09F80102#6C719A16121BB80D (1410715010.861903) can0 09F80102#6C719A16121BB80D (1410715010.943873) can0 19F212B0#C0090C000064FF08 (1410715010.944422) can0 19F212B0#C11C0900FFFFFFFF (1410715010.945002) can0 19F214B0#00EC04C5FF67780C (1410715010.961909) can0 09F80102#6C719A16121BB80D (1410715010.986658) can0 09F80202#63FC00000500FFFF (1410715011.062037) can0 09F80102#6C719A16121BB80D (1410715011.072016) can0 0DF01002#64F0C73F006F4E24 (1410715011.074580) can0 19FA0302#64D3490068006400 (1410715011.077814) can0 19FA0402#409364FD0C0B2D35 (1410715011.080561) can0 19FA0402#4108C55111040000 (1410715011.083552) can0 19FA0402#4200F220673013D6 (1410715011.086542) can0 19FA0402#43571201000000F2 (1410715011.089838) can0 19FA0402#440E7F160B209811 (1410715011.092554) can0 19FA0402#45E8FFFFFFF216DC (1410715011.095545) can0 19FA0402#4608AD2DFC0FF8FF (1410715011.097559) can0 0DF50B11#018C030000FFFFFF (1410715011.098597) can0 19FA0402#47FFFFF201D0247C (1410715011.101893) can0 19FA0402#48D98C12FDFFFFFF (1410715011.104548) can0 19FA0402#49F21B390A95749A (1410715011.107539) can0 19FA0402#4A10FAFFFFFFF217 (1410715011.110560) can0 19FA0402#4B7F07CE8D6E118F (1410715011.113764) can0 19FA0402#4CFFFFFFF2047314 (1410715011.116541) can0 19FA0402#4DAAD2CD100A0000 (1410715011.119532) can0 19FA0402#4E00F21FE80AB84D (1410715011.122553) can0 19FA0402#4F8E1138000000F2 (1410715011.125758) can0 19FA0402#501C170413C7790D (1410715011.128535) can0 19FA0402#5113000000F213A2 (1410715011.131525) can0 19FA0402#521C7D7F5A123900 (1410715011.134516) can0 19FA0402#530000F214221513 (1410715011.137812) can0 19FA0402#54B87D112F000000 (1410715011.140559) can0 19FA0402#55F2FFFFFFFFFFFF (1410715011.143549) can0 0DF80502#402F64C73F006F4E (1410715011.146540) can0 0DF80502#412400A7950AE242 (1410715011.149805) can0 0DF80502#42430520335FCAD0 (1410715011.152521) can0 0DF80502#43B93103127E9502 (1410715011.155543) can0 0DF80502#440000000013FC0C (1410715011.158533) can0 0DF80502#4549008000AC0D00 (1410715011.161890) can0 0DF80502#460000FFFFFFFFFF (1410715011.164515) can0 09F80102#6C719A16121BB80D (1410715011.196589) can0 09F80202#65FC00000200FFFF (1410715011.222041) can0 09F80102#6C719A16121BB80D (1410715011.321894) can0 09F80102#6C719A16121BB80D (1410715011.421931) can0 09F80102#6C719A16121BB80D (1410715011.446497) can0 09F80202#66FC00000200FFFF (1410715011.521845) can0 09F80102#6C719A16121BB80D (1410715011.621851) can0 09F80102#6C719A16121BB80D (1410715011.696528) can0 09F80202#67FC00000200FFFF (1410715011.721796) can0 09F80102#6C719A16121BB80D (1410715011.821345) can0 09F80102#6C719A16121BB80D (1410715011.921320) can0 09F80102#6C719A16121BB80D (1410715011.946345) can0 09F80202#68FC00000200FFFF (1410715012.021296) can0 09F80102#6C719A16121BB80D (1410715012.081110) can0 0DF01002#69F0C73F10964E24 (1410715012.083247) can0 19FA0302#69D3490068006400 (1410715012.086237) can0 19FA0402#609369FD0C0B2D35 (1410715012.089228) can0 19FA0402#6108C59B11040000 (1410715012.092493) can0 19FA0402#6200F220673013D6 (1410715012.095240) can0 19FA0402#63A91203000000F2 (1410715012.098231) can0 19FA0402#640E7F160B205A11 (1410715012.099299) can0 0DF50B11#018C030000FFFFFF (1410715012.101252) can0 19FA0402#65F3FFFFFFF216DC (1410715012.104426) can0 19FA0402#6608AD2DDD0FF9FF (1410715012.107233) can0 19FA0402#67FFFFF201D0247C (1410715012.110224) can0 19FA0402#68D91C1301000000 (1410715012.113215) can0 19FA0402#69F21B390A9574A4 (1410715012.116450) can0 19FA0402#6A10FCFFFFFFF217 (1410715012.119227) can0 19FA0402#6B7F07CE8D251194 (1410715012.122218) can0 19FA0402#6CFFFFFFF2047314 (1410715012.125208) can0 19FA0402#6DAAD2A310080000 (1410715012.128535) can0 19FA0402#6E00F21FE80AB84D (1410715012.131220) can0 19FA0402#6F8A113C000000F2 (1410715012.134211) can0 19FA0402#701C170413C7740D (1410715012.137232) can0 19FA0402#711B000000F213F3 (1410715012.140437) can0 19FA0402#721B7D7F0D133300 (1410715012.143244) can0 19FA0402#730000F214221513 (1410715012.146204) can0 19FA0402#74B8511230000000 (1410715012.149226) can0 19FA0402#75F2FFFFFFFFFFFF (1410715012.152491) can0 0DF80502#602F69C73F10964E (1410715012.155207) can0 0DF80502#612400A7950AE242 (1410715012.158198) can0 0DF80502#62430520335FCAD0 (1410715012.161219) can0 0DF80502#63B93103127E9502 (1410715012.164454) can0 0DF80502#640000000013FC0C (1410715012.167231) can0 0DF80502#6549008000AC0D00 (1410715012.170252) can0 0DF80502#660000FFFFFFFFFF (1410715012.173212) can0 09F80102#6C719A16121BB80D (1410715012.205256) can0 09F80202#6AFC00000400FFFF (1410715012.230250) can0 09F80102#6C719A16121BB80D (1410715012.330195) can0 09F80102#6C719A16121BB80D (1410715012.430201) can0 09F80102#6C719A16121BB80D (1410715012.444147) can0 19F212B0#E0091B000064FF08 (1410715012.444697) can0 19F212B0#E11C0A00FFFFFFFF (1410715012.445277) can0 19F214B0#00EC04C5FF67781B (1410715012.455317) can0 09F80202#6BFC00000400FFFF (1410715012.530177) can0 09F80102#6C719A16121BB80D (1410715012.630122) can0 09F80102#6C719A16121BB80D (1410715012.705103) can0 09F80202#6CFC00000400FFFF (1410715012.730097) can0 09F80102#6C719A16121BB80D (1410715012.830042) can0 09F80102#6C719A16121BB80D (1410715012.930018) can0 09F80102#6C719A16121BB80D (1410715012.955286) can0 09F80202#6DFC00000400FFFF (1410715013.029963) can0 09F80102#6C719A16121BB80D (1410715013.089564) can0 11F80E01#C01B01A929C40CB0 (1410715013.090113) can0 0DF01002#6EF0C73F20BD4E24 (1410715013.090662) can0 11F80E01#C132B90D20019A16 (1410715013.091242) can0 11F80E01#C23858EE000034C0 (1410715013.091792) can0 11F80E01#C3087CCA000000FE (1410715013.092921) can0 19FA0302#6ED3490068006400 (1410715013.095911) can0 19FA0402#80936EFD0C0B2D35 (1410715013.099146) can0 19FA0402#8108C57811030000 (1410715013.100855) can0 0DF50B11#018C030000FFFFFF (1410715013.101984) can0 19FA0402#8200F220673013D6 (1410715013.104914) can0 19FA0402#837E1206000000F2 (1410715013.107905) can0 19FA0402#840E7F160B208D11 (1410715013.111140) can0 19FA0402#85F3FFFFFFF216DC (1410715013.113917) can0 19FA0402#8608AD2DDD0FFFFF (1410715013.116907) can0 19FA0402#87FFFFF201D0247C (1410715013.119929) can0 19FA0402#88D9D512F9FFFFFF (1410715013.123225) can0 19FA0402#89F21B390A9574F8 (1410715013.125910) can0 19FA0402#8A10F2FFFFFFF217 (1410715013.128901) can0 19FA0402#8B7F07CE8D181194 (1410715013.131922) can0 19FA0402#8CFFFFFFF2047314 (1410715013.135340) can0 19FA0402#8DAAD27B100C0000 (1410715013.137904) can0 19FA0402#8E00F21FE80AB84D (1410715013.140925) can0 19FA0402#8F521141000000F2 (1410715013.143916) can0 19FA0402#901C170413C7620D (1410715013.147242) can0 19FA0402#91FDFFFFFFF213F3 (1410715013.149897) can0 19FA0402#921B7D7F6F123500 (1410715013.152888) can0 19FA0402#930000F214221513 (1410715013.155909) can0 19FA0402#94B8B1113E000000 (1410715013.159144) can0 19FA0402#95F2FFFFFFFFFFFF (1410715013.161890) can0 0DF80502#802F6EC73F20BD4E (1410715013.164881) can0 0DF80502#812400A7950AE242 (1410715013.167902) can0 0DF80502#82430520335FCAD0 (1410715013.171137) can0 0DF80502#83B93103127E9502 (1410715013.173914) can0 0DF80502#840000000013FC0C (1410715013.176905) can0 0DF80502#8549008000AC0D00 (1410715013.179926) can0 0DF80502#860000FFFFFFFFFF (1410715013.183253) can0 09F80102#6C719A16121BB80D (1410715013.213953) can0 09F80202#6FFC00000300FFFF (1410715013.239161) can0 09F80102#6C719A16121BB80D (1410715013.339167) can0 09F80102#6C719A16121BB80D (1410715013.439173) can0 09F80102#6C719A16121BB80D (1410715013.463862) can0 09F80202#70FC00000300FFFF (1410715013.539149) can0 09F80102#6C719A16121BB80D (1410715013.639124) can0 09F80102#6C719A16121BB80D (1410715013.713831) can0 09F80202#71FC00000300FFFF (1410715013.742335) can0 09F80102#6C719A16121BB80D (1410715013.838709) can0 09F80102#6C719A16121BB80D (1410715013.938685) can0 09F80102#6C719A16121BB80D (1410715013.943873) can0 19F212B0#00092A000064FF09 (1410715013.944453) can0 19F212B0#011C0A00FFFFFFFF (1410715013.945002) can0 19F214B0#00E004C5FF67782A (1410715013.963709) can0 09F80202#72FC00000300FFFF (1410715014.038660) can0 09F80102#6C719A16121BB80D (1410715014.102412) can0 0DF50B11#018C030000FFFFFF (1410715014.105738) can0 0DF01002#73F0C73F30E44E24 (1410715014.108698) can0 19FA0302#73D3490068006400 (1410715014.111597) can0 19FA0402#A09373FD0C0B2D35 (1410715014.114588) can0 19FA0402#A108C5C611FEFFFF (1410715014.117823) can0 19FA0402#A2FFF220673013D6 (1410715014.120600) can0 19FA0402#A38A1206000000F2 (1410715014.123591) can0 19FA0402#A40E7F160B203011 (1410715014.126612) can0 19FA0402#A5EFFFFFFFF216DC (1410715014.129847) can0 19FA0402#A608AD2DFC0FFDFF (1410715014.132594) can0 19FA0402#A7FFFFF201D0247C (1410715014.135584) can0 19FA0402#A8D9F612F1FFFFFF (1410715014.138575) can0 19FA0402#A9F21B390A9574F8 (1410715014.141901) can0 19FA0402#AA10F3FFFFFFF217 (1410715014.144587) can0 19FA0402#AB7F07CE8D38118D (1410715014.147578) can0 19FA0402#ACFFFFFFF2047314 (1410715014.150599) can0 19FA0402#ADAAD23411080000 (1410715014.153773) can0 19FA0402#AE00F21FE80AB84D (1410715014.156611) can0 19FA0402#AF48113C000000F2 (1410715014.159571) can0 19FA0402#B01C170413C79B0D (1410715014.162592) can0 19FA0402#B101000000F213F3 (1410715014.165766) can0 19FA0402#B21B7D7F80123600 (1410715014.168574) can0 19FA0402#B30000F2142215C2 (1410715014.171564) can0 19FA0402#B4B8311147000000 (1410715014.174616) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715014.177821) can0 0DF80502#A02F73C73F30E44E (1410715014.180628) can0 0DF80502#A12400A7950AE242 (1410715014.183558) can0 0DF80502#A2430520335FCAD0 (1410715014.186579) can0 0DF80502#A3B93103127E9502 (1410715014.189844) can0 0DF80502#A40000000013FC0C (1410715014.192591) can0 0DF80502#A549008000AC0D00 (1410715014.195582) can0 0DF80502#A60000FFFFFFFFFF (1410715014.198573) can0 09F80102#6C719A16121BB80D (1410715014.219843) can0 1DEFFF01#E00AE598B6060404 (1410715014.220423) can0 1DEFFF01#E100000002FFFFFF (1410715014.229914) can0 09F80202#74FC00000100FFFF (1410715014.254603) can0 09F80102#6C719A16121BB80D (1410715014.354548) can0 09F80102#6C719A16121BB80D (1410715014.454523) can0 09F80102#6C719A16121BB80D (1410715014.479548) can0 09F80202#75FC00000100FFFF (1410715014.554499) can0 09F80102#6C719A16121BB80D (1410715014.654475) can0 09F80102#6C719A16121BB80D (1410715014.729884) can0 09F80202#76FC00000100FFFF (1410715014.754420) can0 09F80102#6C719A16121BB80D (1410715014.854395) can0 09F80102#6C719A16121BB80D (1410715014.863245) can0 11F80E01#E01B0188F64A0E50 (1410715014.863795) can0 11F80E01#E1FDB80D00039A16 (1410715014.864344) can0 11F80E01#E23CFFFF00007982 (1410715014.864924) can0 11F80E01#E300154F000000FE (1410715014.954371) can0 09F80102#6C719A16121BB80D (1410715014.979395) can0 09F80202#77FC00000100FFFF (1410715015.054346) can0 09F80102#6C719A16121BB80D (1410715015.064417) can0 0DF01002#78F0C73F400B4F24 (1410715015.067286) can0 19FA0302#78D3490068006400 (1410715015.070307) can0 19FA0402#C09378FD0C0B2D35 (1410715015.073298) can0 19FA0402#C108C50B12FCFFFF (1410715015.076441) can0 19FA0402#C2FFF220673013D6 (1410715015.079310) can0 19FA0402#C3C41204000000F2 (1410715015.082301) can0 19FA0402#C40E7F160B205111 (1410715015.085291) can0 19FA0402#C5F1FFFFFFF216DC (1410715015.088526) can0 19FA0402#C608AD2D0210E9FF (1410715015.091303) can0 19FA0402#C7FFFFF201D0247C (1410715015.094294) can0 19FA0402#C8D9B512F0FFFFFF (1410715015.097285) can0 19FA0402#C9F21B390A95740A (1410715015.100459) can0 19FA0402#CA11F2FFFFFFF217 (1410715015.103297) can0 19FA0402#CB7F07CE8D1A1187 (1410715015.104273) can0 0DF50B11#018C030000FFFFFF (1410715015.106287) can0 19FA0402#CCFFFFFFF2047314 (1410715015.109278) can0 19FA0402#CDAAD21E11FDFFFF (1410715015.112452) can0 19FA0402#CEFFF21FE80AB84D (1410715015.115260) can0 19FA0402#CF621143000000F2 (1410715015.118281) can0 19FA0402#D01C170413C7E40D (1410715015.121271) can0 19FA0402#D1F6FFFFFFF213F3 (1410715015.124445) can0 19FA0402#D21B7D7F71122B00 (1410715015.127283) can0 19FA0402#D30000F2142215C2 (1410715015.130274) can0 19FA0402#D4B8721145000000 (1410715015.133295) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715015.136439) can0 0DF80502#C02F78C73F400B4F (1410715015.139277) can0 0DF80502#C12400A7950AE242 (1410715015.142268) can0 0DF80502#C2430520335FCAD0 (1410715015.145258) can0 0DF80502#C3B93103127E9502 (1410715015.148585) can0 0DF80502#C40000000013FC0C (1410715015.151270) can0 0DF80502#C549008000AC0D00 (1410715015.154292) can0 0DF80502#C60000FFFFFFFFFF (1410715015.157252) can0 09F80102#6C719A16121BB80D (1410715015.188624) can0 09F80202#79FC00000300FFFF (1410715015.213282) can0 09F80102#6C719A16121BB80D (1410715015.313258) can0 09F80102#6C719A16121BB80D (1410715015.413203) can0 09F80102#6C719A16121BB80D (1410715015.438227) can0 09F80202#7AFC00000300FFFF (1410715015.443934) can0 19F212B0#200939000064FF09 (1410715015.444514) can0 19F212B0#211C0900FFFFFFFF (1410715015.445063) can0 19F214B0#00EB04C5FF677839 (1410715015.513178) can0 09F80102#6C719A16121BB80D (1410715015.613154) can0 09F80102#6C719A16121BB80D (1410715015.688563) can0 09F80202#7BFC00000300FFFF (1410715015.713129) can0 09F80102#6C719A16121BB80D (1410715015.813105) can0 09F80102#6C719A16121BB80D (1410715015.913050) can0 09F80102#6C719A16121BB80D (1410715015.938074) can0 09F80202#7CFC00000300FFFF (1410715016.013026) can0 09F80102#6C719A16121BB80D (1410715016.074763) can0 0DF01002#7DF0C73F50324F24 (1410715016.076990) can0 19FA0302#7DD3490068006400 (1410715016.079981) can0 19FA0402#E0937DFD0C0B2D35 (1410715016.083216) can0 19FA0402#E108C5B111F8FFFF (1410715016.085963) can0 19FA0402#E2FFF220673013D6 (1410715016.088984) can0 19FA0402#E3CC1206000000F2 (1410715016.091975) can0 19FA0402#E40E7F160B208711 (1410715016.095301) can0 19FA0402#E5F8FFFFFFF216DC (1410715016.097956) can0 19FA0402#E608AD2D0810EAFF (1410715016.100977) can0 19FA0402#E7FFFFF201D0247C (1410715016.103968) can0 19FA0402#E8D9D312F0FFFFFF (1410715016.105738) can0 0DF50B11#018C030000FFFFFF (1410715016.107203) can0 19FA0402#E9F21B390A957423 (1410715016.109980) can0 19FA0402#EA11F5FFFFFFF217 (1410715016.112971) can0 19FA0402#EB7F07CE8D571189 (1410715016.115961) can0 19FA0402#ECFFFFFFF2047314 (1410715016.119166) can0 19FA0402#EDAAD2DF10FDFFFF (1410715016.121973) can0 19FA0402#EEFFF21FE80AB84D (1410715016.124964) can0 19FA0402#EF6E1149000000F2 (1410715016.127955) can0 19FA0402#F01C170413C7290E (1410715016.131220) can0 19FA0402#F1F1FFFFFFF213F3 (1410715016.133936) can0 19FA0402#F21B7D7F42122C00 (1410715016.136958) can0 19FA0402#F30000F2142215C2 (1410715016.139948) can0 19FA0402#F4B8AD1142000000 (1410715016.143244) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715016.145960) can0 0DF80502#E02F7DC73F50324F (1410715016.148951) can0 0DF80502#E12400A7950AE242 (1410715016.151942) can0 0DF80502#E2430520335FCAD0 (1410715016.155238) can0 0DF80502#E3B93103127E9502 (1410715016.157954) can0 0DF80502#E40000000013FC0C (1410715016.160975) can0 0DF80502#E549008000AC0D00 (1410715016.163966) can0 0DF80502#E60000FFFFFFFFFF (1410715016.167200) can0 09F80102#6C719A16121BB80D (1410715016.199244) can0 09F80202#7EFC00000800FFFF (1410715016.223963) can0 09F80102#6C719A16121BB80D (1410715016.323939) can0 09F80102#6C719A16121BB80D (1410715016.423914) can0 09F80102#6C719A16121BB80D (1410715016.448939) can0 09F80202#7FFC00000800FFFF (1410715016.523859) can0 09F80102#6C719A16121BB80D (1410715016.623835) can0 09F80102#6C719A16121BB80D (1410715016.699183) can0 09F80202#80FC00000800FFFF (1410715016.723811) can0 09F80102#6C719A16121BB80D (1410715016.823786) can0 09F80102#6C719A16121BB80D (1410715016.923731) can0 09F80102#6C719A16121BB80D (1410715016.943934) can0 19F212B0#400948000064FF14 (1410715016.944514) can0 19F212B0#411C0A00FFFFFFFF (1410715016.945063) can0 19F214B0#00EB04C5FF5F7848 (1410715016.948878) can0 09F80202#81FC00000800FFFF (1410715017.023707) can0 09F80102#6C719A16121BB80D (1410715017.083796) can0 0DF01002#82F0C73F60594F24 (1410715017.086665) can0 19FA0302#82D3490068006400 (1410715017.089899) can0 19FA0402#009382FD0C0B2D35 (1410715017.092677) can0 19FA0402#0108C51C11FBFFFF (1410715017.095667) can0 19FA0402#02FFF220673013D6 (1410715017.098658) can0 19FA0402#03AC1204000000F2 (1410715017.101984) can0 19FA0402#040E7F160B209211 (1410715017.104670) can0 19FA0402#05F1FFFFFFF216DC (1410715017.107661) can0 19FA0402#0608AD2DAE0FE9FF (1410715017.110682) can0 19FA0402#07FFFFF201D0247C (1410715017.113825) can0 19FA0402#08D95313EFFFFFFF (1410715017.116633) can0 19FA0402#09F21B390A95743E (1410715017.119654) can0 19FA0402#0A11F5FFFFFFF217 (1410715017.122645) can0 19FA0402#0B7F07CE8D55118D (1410715017.125819) can0 19FA0402#0CFFFFFFF2047314 (1410715017.128657) can0 19FA0402#0DAAD2F510080000 (1410715017.131647) can0 19FA0402#0E00F21FE80AB84D (1410715017.134638) can0 19FA0402#0F911144000000F2 (1410715017.137934) can0 19FA0402#101C170413C7270E (1410715017.140650) can0 19FA0402#11FEFFFFFFF213F3 (1410715017.143641) can0 19FA0402#121B7D7FE7122600 (1410715017.146632) can0 19FA0402#130000F2142215C2 (1410715017.149866) can0 19FA0402#14B87F1135000000 (1410715017.152644) can0 19FA0402#15F2FFFFFFFFFFFF (1410715017.155634) can0 0DF80502#002F82C73F60594F (1410715017.158625) can0 0DF80502#012400A7950AE242 (1410715017.161951) can0 0DF80502#02430520335FCAD0 (1410715017.164637) can0 0DF80502#03B93103127E9502 (1410715017.167658) can0 0DF80502#040000000013FC0C (1410715017.170649) can0 0DF80502#0549008000AC0D00 (1410715017.173853) can0 0DF80502#060000FFFFFFFFFF (1410715017.176630) can0 09F80102#6C719A16121BB80D (1410715017.207331) can0 0DF50B11#018C030000FFFFFF (1410715017.207911) can0 09F80202#83FC00000400FFFF (1410715017.232661) can0 09F80102#6C719A16121BB80D (1410715017.332606) can0 09F80102#6C719A16121BB80D (1410715017.432581) can0 09F80102#6C719A16121BB80D (1410715017.457972) can0 09F80202#84FC00000400FFFF (1410715017.532557) can0 09F80102#6C719A16121BB80D (1410715017.632502) can0 09F80102#6C719A16121BB80D (1410715017.707545) can0 09F80202#85FC00000400FFFF (1410715017.732508) can0 09F80102#6C719A16121BB80D (1410715017.832514) can0 09F80102#6C719A16121BB80D (1410715017.932490) can0 09F80102#6C719A16121BB80D (1410715017.957453) can0 09F80202#86FC00000400FFFF (1410715018.032496) can0 09F80102#6C719A16121BB80D (1410715018.102564) can0 0DF01002#87F0C73F70804F24 (1410715018.105341) can0 19FA0302#87D3490068006400 (1410715018.108698) can0 19FA0402#209387FD0C0B2D35 (1410715018.111353) can0 19FA0402#2108C56011040000 (1410715018.114313) can0 19FA0402#2200F220673013D6 (1410715018.117335) can0 19FA0402#236C1202000000F2 (1410715018.120478) can0 19FA0402#240E7F160B207D11 (1410715018.123347) can0 19FA0402#25EBFFFFFFF216DC (1410715018.126337) can0 19FA0402#2608AD2DF30FE4FF (1410715018.129328) can0 19FA0402#27FFFFF201D0247C (1410715018.132471) can0 19FA0402#28D90613F4FFFFFF (1410715018.135310) can0 19FA0402#29F21B390A957447 (1410715018.138331) can0 19FA0402#2A11EFFFFFFFF217 (1410715018.141322) can0 19FA0402#2B7F07CE8D491186 (1410715018.144465) can0 19FA0402#2CFFFFFFF2047314 (1410715018.147334) can0 19FA0402#2DAAD27A110C0000 (1410715018.150324) can0 19FA0402#2E00F21FE80AB84D (1410715018.153345) can0 19FA0402#2FBB113E000000F2 (1410715018.156458) can0 19FA0402#301C170413C72F0E (1410715018.159357) can0 19FA0402#3106000000F213F3 (1410715018.162318) can0 19FA0402#321B7D7FA1122500 (1410715018.165308) can0 19FA0402#330000F2142215C2 (1410715018.168574) can0 19FA0402#34B8AD112C000000 (1410715018.171351) can0 19FA0402#35F2FFFFFFFFFFFF (1410715018.174342) can0 0DF80502#202F87C73F70804F (1410715018.177302) can0 0DF80502#212480EF4162E342 (1410715018.180659) can0 0DF80502#22430580294BBAD9 (1410715018.183314) can0 0DF80502#23B931031D9A9D02 (1410715018.186335) can0 0DF80502#240000000013FC0C (1410715018.189326) can0 0DF80502#2549008000AC0D00 (1410715018.192500) can0 0DF80502#260000FFFFFFFFFF (1410715018.195307) can0 09F80102#72719A16381BB80D (1410715018.208735) can0 0DF50B11#018C030000FFFFFF (1410715018.227351) can0 09F80202#88FC00000000FFFF (1410715018.252497) can0 09F80102#72719A16381BB80D (1410715018.352503) can0 09F80102#72719A16381BB80D (1410715018.444209) can0 19F212B0#600957000064FF14 (1410715018.444758) can0 19F212B0#611C0A00FFFFFFFF (1410715018.445307) can0 19F214B0#00ED04C5FF667857 (1410715018.452509) can0 09F80102#72719A16381BB80D (1410715018.477290) can0 09F80202#89FC00000000FFFF (1410715018.552515) can0 09F80102#72719A16381BB80D (1410715018.652491) can0 09F80102#72719A16381BB80D (1410715018.727320) can0 09F80202#8AFC00000000FFFF (1410715018.752467) can0 09F80102#72719A16381BB80D (1410715018.852442) can0 09F80102#72719A16381BB80D (1410715018.952113) can0 09F80102#72719A16381BB80D (1410715018.977137) can0 09F80202#8BFC00000000FFFF (1410715019.052058) can0 09F80102#72719A16381BB80D (1410715019.061396) can0 0DF01002#8CF0C73F80A74F24 (1410715019.064051) can0 19FA0302#8CD3490068006400 (1410715019.067316) can0 19FA0402#40938CFD0C0B2D35 (1410715019.070032) can0 19FA0402#4108C50613FDFFFF (1410715019.073023) can0 19FA0402#42FFF220673013D6 (1410715019.076014) can0 19FA0402#43791203000000F2 (1410715019.079188) can0 19FA0402#440E7F160B209E11 (1410715019.082026) can0 19FA0402#45E9FFFFFFF216DC (1410715019.085017) can0 19FA0402#4608AD2D1C10EEFF (1410715019.088038) can0 19FA0402#47FFFFF201D0247C (1410715019.091242) can0 19FA0402#48D90A12FFFFFFFF (1410715019.094019) can0 19FA0402#49F21B390A957458 (1410715019.097010) can0 19FA0402#4A11E9FFFFFFF217 (1410715019.100031) can0 19FA0402#4B7F07CE8D6C1185 (1410715019.103266) can0 19FA0402#4CFFFFFFF2047314 (1410715019.106013) can0 19FA0402#4DAAD22311060000 (1410715019.109003) can0 19FA0402#4E00F21FE80AB84D (1410715019.112025) can0 19FA0402#4F391139000000F2 (1410715019.115290) can0 19FA0402#501C170413C70A0E (1410715019.118037) can0 19FA0402#5100000000F213F3 (1410715019.121027) can0 19FA0402#521B7D7F8C122300 (1410715019.124018) can0 19FA0402#530000F2142215C2 (1410715019.127253) can0 19FA0402#54B8A31135000000 (1410715019.130030) can0 19FA0402#55F2FFFFFFFFFFFF (1410715019.133021) can0 0DF80502#402F8CC73F80A74F (1410715019.136011) can0 0DF80502#412480EF4162E342 (1410715019.139185) can0 0DF80502#42430580294BBAD9 (1410715019.141993) can0 0DF80502#43B931031D9A9D02 (1410715019.145014) can0 0DF80502#440000000013FC0C (1410715019.148005) can0 0DF80502#4549008000AC0D00 (1410715019.151301) can0 0DF80502#460000FFFFFFFFFF (1410715019.153986) can0 09F80102#72719A16381BB80D (1410715019.186060) can0 09F80202#8DFC00000500FFFF (1410715019.210261) can0 0DF50B11#018C030000FFFFFF (1410715019.211390) can0 09F80102#72719A16381BB80D (1410715019.219477) can0 1DEFFF01#000AE598B6060404 (1410715019.220057) can0 1DEFFF01#0100000002FFFFFF (1410715019.276423) can0 11F80E01#001B01985B620E90 (1410715019.276972) can0 11F80E01#01C6C20D80B99916 (1410715019.277521) can0 11F80E01#0254A5A40000DC60 (1410715019.278101) can0 11F80E01#030CFFFFFF7F00FE (1410715019.311304) can0 09F80102#72719A16381BB80D (1410715019.411280) can0 09F80102#72719A16381BB80D (1410715019.435969) can0 09F80202#8EFC00000500FFFF (1410715019.511286) can0 09F80102#72719A16381BB80D (1410715019.611292) can0 09F80102#72719A16381BB80D (1410715019.685908) can0 09F80202#8FFC00000500FFFF (1410715019.711329) can0 09F80102#72719A16381BB80D (1410715019.811213) can0 09F80102#72719A16381BB80D (1410715019.910792) can0 09F80102#72719A16381BB80D (1410715019.935816) can0 09F80202#90FC00000500FFFF (1410715019.943964) can0 19F212B0#800966000064FF13 (1410715019.944514) can0 19F212B0#811C0900FFFFFFFF (1410715019.945063) can0 19F214B0#00EB04C5FF667866 (1410715020.010767) can0 09F80102#72719A16381BB80D (1410715020.112635) can0 0DF01002#91F0C73F90CE4F24 (1410715020.114710) can0 19FA0302#91D3490068006400 (1410715020.117884) can0 19FA0402#609391FD0C0B2D35 (1410715020.120692) can0 19FA0402#6108C5FD11FCFFFF (1410715020.123682) can0 19FA0402#62FFF220673013D6 (1410715020.126704) can0 19FA0402#63A51200000000F2 (1410715020.129908) can0 19FA0402#640E7F160B209D11 (1410715020.132685) can0 19FA0402#65EDFFFFFFF216DC (1410715020.135676) can0 19FA0402#6608AD2D1610F9FF (1410715020.138697) can0 19FA0402#67FFFFF201D0247C (1410715020.142023) can0 19FA0402#68D97D12FFFFFFFF (1410715020.144678) can0 19FA0402#69F21B390A95744F (1410715020.147700) can0 19FA0402#6A11EEFFFFFFF217 (1410715020.150690) can0 19FA0402#6B7F07CE8D731184 (1410715020.153834) can0 19FA0402#6CFFFFFFF2047314 (1410715020.156672) can0 19FA0402#6DAAD251110B0000 (1410715020.159693) can0 19FA0402#6E00F21FE80AB84D (1410715020.162684) can0 19FA0402#6F5C112E000000F2 (1410715020.165827) can0 19FA0402#701C170413C70C0E (1410715020.168696) can0 19FA0402#71FCFFFFFFF213F3 (1410715020.171687) can0 19FA0402#721B7D7F79122B00 (1410715020.174677) can0 19FA0402#730000F2142215C2 (1410715020.177943) can0 19FA0402#74B86F1139000000 (1410715020.180720) can0 19FA0402#75F2FFFFFFFFFFFF (1410715020.183680) can0 0DF80502#602F91C73F90CE4F (1410715020.186671) can0 0DF80502#612480EF4162E342 (1410715020.189906) can0 0DF80502#62430580294BBAD9 (1410715020.192652) can0 0DF80502#63B931031D9A9D02 (1410715020.195704) can0 0DF80502#640000000013FC0C (1410715020.198695) can0 0DF80502#6549008000AC0D00 (1410715020.202021) can0 0DF80502#660000FFFFFFFFFF (1410715020.204676) can0 09F80102#72719A16381BB80D (1410715020.211787) can0 0DF50B11#018C030000FFFFFF (1410715020.236719) can0 09F80202#92FC00000600FFFF (1410715020.262080) can0 09F80102#72719A16381BB80D (1410715020.362025) can0 09F80102#72719A16381BB80D (1410715020.462061) can0 09F80102#72719A16381BB80D (1410715020.486658) can0 09F80202#93FC00000600FFFF (1410715020.562037) can0 09F80102#72719A16381BB80D (1410715020.662257) can0 09F80102#72719A16381BB80D (1410715020.736567) can0 09F80202#94FC00000600FFFF (1410715020.761988) can0 09F80102#72719A16381BB80D (1410715020.849726) can0 11F80E01#201B0108975C0EF0 (1410715020.850306) can0 11F80E01#219BC50DE0F39816 (1410715020.850855) can0 11F80E01#2255C36D05003403 (1410715020.851435) can0 11F80E01#2300E5AF000000FE (1410715020.861994) can0 09F80102#72719A16381BB80D (1410715020.929713) can0 11F80E01#401B017C60290EC0 (1410715020.930262) can0 11F80E01#4188070E8036A016 (1410715020.930811) can0 11F80E01#4257B0C1F2013783 (1410715020.931391) can0 11F80E01#4308FFFFFF7F00FE (1410715020.961481) can0 09F80102#72719A16381BB80D (1410715020.986475) can0 09F80202#95FC00000600FFFF (1410715021.061427) can0 09F80102#72719A16381BB80D (1410715021.072504) can0 0DF01002#96F0C73FA0F54F24 (1410715021.075404) can0 19FA0302#96D3490068006400 (1410715021.078394) can0 19FA0402#809396FD0C0B2D35 (1410715021.081416) can0 19FA0402#8108C5AC12FEFFFF (1410715021.084528) can0 19FA0402#82FFF220673013D6 (1410715021.087397) can0 19FA0402#83D712FAFFFFFFF2 (1410715021.090388) can0 19FA0402#840E7F160B209811 (1410715021.093409) can0 19FA0402#85DEFFFFFFF216DC (1410715021.096522) can0 19FA0402#8608AD2D9B0F0700 (1410715021.099390) can0 19FA0402#870000F201D0247C (1410715021.102381) can0 19FA0402#88D9E712F7FFFFFF (1410715021.105372) can0 19FA0402#89F21B390A957454 (1410715021.108637) can0 19FA0402#8A11F4FFFFFFF217 (1410715021.111384) can0 19FA0402#8B7F07CE8D721186 (1410715021.114375) can0 19FA0402#8CFFFFFFF2047314 (1410715021.117365) can0 19FA0402#8DAAD2A0110C0000 (1410715021.120509) can0 19FA0402#8E00F21FE80AB84D (1410715021.123377) can0 19FA0402#8F771130000000F2 (1410715021.126368) can0 19FA0402#901C170413C7F50D (1410715021.129389) can0 19FA0402#9103000000F213F3 (1410715021.132532) can0 19FA0402#921B7D7FC5122700 (1410715021.135432) can0 19FA0402#930000F2142215C2 (1410715021.138392) can0 19FA0402#94B80A113C000000 (1410715021.141413) can0 19FA0402#95F2FFFFFFFFFFFF (1410715021.144556) can0 0DF80502#802F96C73FA0F54F (1410715021.147364) can0 0DF80502#812480EF4162E342 (1410715021.150385) can0 0DF80502#82430580294BBAD9 (1410715021.153376) can0 0DF80502#83B931031D9A9D02 (1410715021.156550) can0 0DF80502#840000000013FC0C (1410715021.159388) can0 0DF80502#8549008000AC0D00 (1410715021.162409) can0 0DF80502#860000FFFFFFFFFF (1410715021.165369) can0 09F80102#72719A16381BB80D (1410715021.196589) can0 09F80202#97FC00000100FFFF (1410715021.213251) can0 0DF50B11#018C030000FFFFFF (1410715021.221400) can0 09F80102#72719A16381BB80D (1410715021.321345) can0 09F80102#72719A16381BB80D (1410715021.421320) can0 09F80102#72719A16381BB80D (1410715021.443995) can0 19F212B0#A00975000064FF14 (1410715021.444544) can0 19F212B0#A11C0A00FFFFFFFF (1410715021.445094) can0 19F214B0#00EB04C5FF667875 (1410715021.446345) can0 09F80202#98FC00000100FFFF (1410715021.521296) can0 09F80102#72719A16381BB80D (1410715021.621271) can0 09F80102#72719A16381BB80D (1410715021.696558) can0 09F80202#99FC00000100FFFF (1410715021.721217) can0 09F80102#72719A16381BB80D (1410715021.821192) can0 09F80102#72719A16381BB80D (1410715021.921168) can0 09F80102#72719A16381BB80D (1410715021.946192) can0 09F80202#9AFC00000100FFFF (1410715022.021113) can0 09F80102#72719A16381BB80D (1410715022.080561) can0 0DF01002#9BF0C73FB01C5024 (1410715022.083277) can0 19FA0302#9BD3490068006400 (1410715022.086085) can0 19FA0402#A0939BFD0C0B2D35 (1410715022.089075) can0 19FA0402#A108C56B12FBFFFF (1410715022.092066) can0 19FA0402#A2FFF220673013D6 (1410715022.095454) can0 19FA0402#A32513EFFFFFFFF2 (1410715022.098078) can0 19FA0402#A40E7F160B207011 (1410715022.101069) can0 19FA0402#A5D7FFFFFFF216DC (1410715022.104060) can0 19FA0402#A608AD2D990F0A00 (1410715022.107355) can0 19FA0402#A70000F201D0247C (1410715022.110072) can0 19FA0402#A8D9D812F1FFFFFF (1410715022.113062) can0 19FA0402#A9F21B390A957451 (1410715022.116084) can0 19FA0402#AA11F9FFFFFFF217 (1410715022.119196) can0 19FA0402#AB7F07CE8D3D1185 (1410715022.122065) can0 19FA0402#ACFFFFFFF2047314 (1410715022.125056) can0 19FA0402#ADAAD2C311030000 (1410715022.128046) can0 19FA0402#AE00F21FE80AB84D (1410715022.131251) can0 19FA0402#AFA6112F000000F2 (1410715022.134058) can0 19FA0402#B01C170413C7F20D (1410715022.137049) can0 19FA0402#B10D000000F213F3 (1410715022.140070) can0 19FA0402#B21B7D7F76122800 (1410715022.143275) can0 19FA0402#B30000F2142215C2 (1410715022.146052) can0 19FA0402#B4B8911137000000 (1410715022.149073) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715022.152064) can0 0DF80502#A02F9BC73FB01C50 (1410715022.155299) can0 0DF80502#A12480EF4162E342 (1410715022.158045) can0 0DF80502#A2430580294BBAD9 (1410715022.161036) can0 0DF80502#A3B931031D9A9D02 (1410715022.164057) can0 0DF80502#A40000000013FC0C (1410715022.167261) can0 0DF80502#A549008000AC0D00 (1410715022.170069) can0 0DF80502#A60000FFFFFFFFFF (1410715022.173029) can0 09F80102#72719A16381BB80D (1410715022.205103) can0 09F80202#9CFC00000300FFFF (1410715022.214808) can0 0DF50B11#018F030000FFFFFF (1410715022.230067) can0 09F80102#72719A16381BB80D (1410715022.330042) can0 09F80102#72719A16381BB80D (1410715022.430018) can0 09F80102#72719A16381BB80D (1410715022.455408) can0 09F80202#9DFC00000300FFFF (1410715022.529963) can0 09F80102#72719A16381BB80D (1410715022.629969) can0 09F80102#72719A16381BB80D (1410715022.704981) can0 09F80202#9EFC00000300FFFF (1410715022.716242) can0 11F80E01#601B01A929C40C50 (1410715022.716792) can0 11F80E01#6133B90D20019A16 (1410715022.717341) can0 11F80E01#6260C5160000BF08 (1410715022.717921) can0 11F80E01#63017CCA000000FE (1410715022.730036) can0 09F80102#72719A16381BB80D (1410715022.829951) can0 09F80102#72719A16381BB80D (1410715022.929987) can0 09F80102#72719A16381BB80D (1410715022.943995) can0 19F212B0#C00984000064FF13 (1410715022.944544) can0 19F212B0#C11C0900FFFFFFFF (1410715022.945094) can0 19F214B0#00EC04C5FF667884 (1410715022.954859) can0 09F80202#9FFC00000300FFFF (1410715023.029963) can0 09F80102#72719A16381BB80D (1410715023.089991) can0 0DF01002#A0F0C73FC0435024 (1410715023.092768) can0 19FA0302#A0D3490068006400 (1410715023.095759) can0 19FA0402#C093A0FD0C0B2D35 (1410715023.098750) can0 19FA0402#C108C5E612F5FFFF (1410715023.102045) can0 19FA0402#C2FFF220673013D6 (1410715023.104761) can0 19FA0402#C34613EAFFFFFFF2 (1410715023.107752) can0 19FA0402#C40E7F160B206B11 (1410715023.110743) can0 19FA0402#C5DAFFFFFFF216DC (1410715023.113886) can0 19FA0402#C608AD2D8C0FFFFF (1410715023.116755) can0 19FA0402#C7FFFFF201D0247C (1410715023.119746) can0 19FA0402#C8D92312F9FFFFFF (1410715023.122736) can0 19FA0402#C9F21B390A957461 (1410715023.125880) can0 19FA0402#CA11FCFFFFFFF217 (1410715023.128748) can0 19FA0402#CB7F07CE8D73118D (1410715023.131739) can0 19FA0402#CCFFFFFFF2047314 (1410715023.134760) can0 19FA0402#CDAAD2F110030000 (1410715023.137934) can0 19FA0402#CE00F21FE80AB84D (1410715023.140772) can0 19FA0402#CFAE112D000000F2 (1410715023.143732) can0 19FA0402#D01C170413C7C90D (1410715023.146754) can0 19FA0402#D10D000000F213F3 (1410715023.149927) can0 19FA0402#D21B7D7F61122800 (1410715023.152735) can0 19FA0402#D30000F2142215C2 (1410715023.155726) can0 19FA0402#D4B891112F000000 (1410715023.158778) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715023.162012) can0 0DF80502#C02FA0C73FC04350 (1410715023.164729) can0 0DF80502#C12480EF4162E342 (1410715023.167719) can0 0DF80502#C2430580294BBAD9 (1410715023.170710) can0 0DF80502#C3B931031D9A9D02 (1410715023.173884) can0 0DF80502#C40000000013FC0C (1410715023.176722) can0 0DF80502#C549008000AC0D00 (1410715023.179774) can0 0DF80502#C60000FFFFFFFFFF (1410715023.182734) can0 09F80102#72719A16381BB80D (1410715023.213953) can0 09F80202#A1FC00000200FFFF (1410715023.216212) can0 0DF50B11#018F030000FFFFFF (1410715023.238764) can0 09F80102#72719A16381BB80D (1410715023.262751) can0 19FB0201#804B05A929C40CCA (1410715023.263300) can0 19FB0201#817589004552574D (1410715023.263850) can0 19FB0201#8200000048454C53 (1410715023.264429) can0 19FB0201#8345000000000000 (1410715023.265009) can0 19FB0201#8400000000000000 (1410715023.265589) can0 19FB0201#8500004634036E00 (1410715023.266138) can0 19FB0201#863200E402C53F00 (1410715023.266688) can0 19FB0201#87D94F1318014B41 (1410715023.267237) can0 19FB0201#884C414D414B4920 (1410715023.267786) can0 19FB0201#8920475245434345 (1410715023.268336) can0 19FB0201#8A0000000004E0FF (1410715023.338709) can0 09F80102#72719A16381BB80D (1410715023.438685) can0 09F80102#72719A16381BB80D (1410715023.463709) can0 09F80202#A2FC00000200FFFF (1410715023.538660) can0 09F80102#72719A16381BB80D (1410715023.638636) can0 09F80102#72719A16381BB80D (1410715023.713953) can0 09F80202#A3FC00000200FFFF (1410715023.738581) can0 09F80102#72719A16381BB80D (1410715023.769617) can0 11F80E01#801B0188F64A0EF0 (1410715023.770167) can0 11F80E01#81FBB80D60009A16 (1410715023.770747) can0 11F80E01#8260FFFF000023C0 (1410715023.771296) can0 11F80E01#8308154F000000FE (1410715023.838557) can0 09F80102#72719A16381BB80D (1410715023.938532) can0 09F80102#72719A16381BB80D (1410715023.963557) can0 09F80202#A4FC00000200FFFF (1410715024.038477) can0 09F80102#72719A16381BB80D (1410715024.083491) can0 0DF01002#A5F0C73FD06A5024 (1410715024.086451) can0 19FA0302#A5D3490068006400 (1410715024.089442) can0 19FA0402#E093A5FD0C0B2D35 (1410715024.092554) can0 19FA0402#E108C5B411F9FFFF (1410715024.095454) can0 19FA0402#E2FFF220673013D6 (1410715024.098444) can0 19FA0402#E3EA12EAFFFFFFF2 (1410715024.101435) can0 19FA0402#E40E7F160B204E11 (1410715024.104548) can0 19FA0402#E5DBFFFFFFF216DC (1410715024.107447) can0 19FA0402#E608AD2DAB0FEEFF (1410715024.110468) can0 19FA0402#E7FFFFF201D0247C (1410715024.113428) can0 19FA0402#E8D951120D000000 (1410715024.116511) can0 19FA0402#E9F21B390A957476 (1410715024.119440) can0 19FA0402#EA1102000000F217 (1410715024.122431) can0 19FA0402#EB7F07CE8D911195 (1410715024.125422) can0 19FA0402#ECFFFFFFF2047314 (1410715024.128626) can0 19FA0402#EDAAD28711F8FFFF (1410715024.131434) can0 19FA0402#EEFFF21FE80AB84D (1410715024.134425) can0 19FA0402#EFE7112B000000F2 (1410715024.137415) can0 19FA0402#F01C170413C7B60D (1410715024.140559) can0 19FA0402#F108000000F213F3 (1410715024.143427) can0 19FA0402#F21B7D7FA7122B00 (1410715024.146418) can0 19FA0402#F30000F2142215C2 (1410715024.149439) can0 19FA0402#F4B8CE1128000000 (1410715024.152583) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715024.155421) can0 0DF80502#E02FA5C73FD06A50 (1410715024.158411) can0 0DF80502#E12480EF4162E342 (1410715024.161402) can0 0DF80502#E2430580294BBAD9 (1410715024.164545) can0 0DF80502#E3B931031D9A9D02 (1410715024.167445) can0 0DF80502#E40000000013FC0C (1410715024.170435) can0 0DF80502#E549008000AC0D00 (1410715024.173457) can0 0DF80502#E60000FFFFFFFFFF (1410715024.176539) can0 09F80102#72719A16381BB80D (1410715024.207453) can0 09F80202#A6FC00000700FFFF (1410715024.217677) can0 0DF50B11#018F030000FFFFFF (1410715024.219141) can0 1DEFFF01#200AE598B6060404 (1410715024.219721) can0 1DEFFF01#2100000002FFFFFF (1410715024.232569) can0 09F80102#72719A16381BB80D (1410715024.332575) can0 09F80102#72719A16381BB80D (1410715024.432581) can0 09F80102#72719A16381BB80D (1410715024.444025) can0 19F212B0#E00993000064FF13 (1410715024.444605) can0 19F212B0#E11C0A00FFFFFFFF (1410715024.445124) can0 19F214B0#00EC04C5FF667893 (1410715024.457392) can0 09F80202#A7FC00000700FFFF (1410715024.532587) can0 09F80102#72719A16381BB80D (1410715024.632594) can0 09F80102#72719A16381BB80D (1410715024.707362) can0 09F80202#A8FC00000700FFFF (1410715024.732569) can0 09F80102#72719A16381BB80D (1410715024.832545) can0 09F80102#72719A16381BB80D (1410715024.932520) can0 09F80102#72719A16381BB80D (1410715024.957209) can0 09F80202#A9FC00000700FFFF (1410715025.032191) can0 09F80102#72719A16381BB80D (1410715025.097041) can0 0DF01002#AAF0C73FE0915024 (1410715025.099238) can0 19FA0302#AAD3490068006400 (1410715025.102106) can0 19FA0402#0093AAFD0C0B2D35 (1410715025.105128) can0 19FA0402#0108C53712FCFFFF (1410715025.108118) can0 19FA0402#02FFF220673013D6 (1410715025.111323) can0 19FA0402#03C912EFFFFFFFF2 (1410715025.114130) can0 19FA0402#040E7F160B206111 (1410715025.117121) can0 19FA0402#05DFFFFFFFF216DC (1410715025.120112) can0 19FA0402#0608AD2DCC0FF0FF (1410715025.123316) can0 19FA0402#07FFFFF201D0247C (1410715025.126124) can0 19FA0402#08D9FC110C000000 (1410715025.129115) can0 19FA0402#09F21B390A95747D (1410715025.132136) can0 19FA0402#0A11FEFFFFFFF217 (1410715025.135462) can0 19FA0402#0B7F07CE8DB51195 (1410715025.138117) can0 19FA0402#0CFFFFFFF2047314 (1410715025.141108) can0 19FA0402#0DAAD23C11F8FFFF (1410715025.144099) can0 19FA0402#0EFFF21FE80AB84D (1410715025.147364) can0 19FA0402#0FD5112D000000F2 (1410715025.150111) can0 19FA0402#101C170413C7CE0D (1410715025.153101) can0 19FA0402#1119000000F213F3 (1410715025.156123) can0 19FA0402#121B7D7FC7122E00 (1410715025.159235) can0 19FA0402#130000F2142215C2 (1410715025.162104) can0 19FA0402#14B8541130000000 (1410715025.165125) can0 19FA0402#15F2FFFFFFFFFFFF (1410715025.168116) can0 0DF80502#002FAAC73FE09150 (1410715025.171290) can0 0DF80502#012480EF4162E342 (1410715025.174097) can0 0DF80502#02430580294BBAD9 (1410715025.177088) can0 0DF80502#03B931031D9A9D02 (1410715025.180140) can0 0DF80502#040000000013FC0C (1410715025.183314) can0 0DF80502#0549008000AC0D00 (1410715025.186121) can0 0DF80502#060000FFFFFFFFFF (1410715025.189082) can0 09F80102#72719A16381BB80D (1410715025.219386) can0 0DF50B11#018C030000FFFFFF (1410715025.221156) can0 09F80202#ABFC00000500FFFF (1410715025.246119) can0 09F80102#72719A16381BB80D (1410715025.346094) can0 09F80102#72719A16381BB80D (1410715025.446040) can0 09F80102#72719A16381BB80D (1410715025.471400) can0 09F80202#ACFC00000500FFFF (1410715025.546015) can0 09F80102#72719A16381BB80D (1410715025.645991) can0 09F80102#72719A16381BB80D (1410715025.721003) can0 09F80202#ADFC00000500FFFF (1410715025.745966) can0 09F80102#72719A16381BB80D (1410715025.845942) can0 09F80102#72719A16381BB80D (1410715025.944025) can0 19F212B0#0009A2000064FF0B (1410715025.944605) can0 19F212B0#011C0500FFFFFFFF (1410715025.945155) can0 19F214B0#00ED04C5FF6178A2 (1410715025.946040) can0 09F80102#72719A16381BB80D (1410715025.971308) can0 09F80202#AEFC00000500FFFF (1410715026.045924) can0 09F80102#72719A16381BB80D (1410715026.062067) can0 0DF01002#AFF0C73FF0B85024 (1410715026.064814) can0 19FA0302#AFD3490068006400 (1410715026.067835) can0 19FA0402#2093AFFD0C0B2D35 (1410715026.070826) can0 19FA0402#2108C5BB11000000 (1410715026.073969) can0 19FA0402#2200F220673013D6 (1410715026.076838) can0 19FA0402#23E412F2FFFFFFF2 (1410715026.079829) can0 19FA0402#240E7F160B207D11 (1410715026.082819) can0 19FA0402#25D9FFFFFFF216DC (1410715026.085902) can0 19FA0402#2608AD2DC90FEDFF (1410715026.088831) can0 19FA0402#27FFFFF201D0247C (1410715026.091822) can0 19FA0402#28D9941203000000 (1410715026.094782) can0 19FA0402#29F21B390A95748F (1410715026.098017) can0 19FA0402#2A11FAFFFFFFF217 (1410715026.100794) can0 19FA0402#2B7F07CE8DA61197 (1410715026.103815) can0 19FA0402#2CFFFFFFF2047314 (1410715026.106806) can0 19FA0402#2DAAD2C711F6FFFF (1410715026.109980) can0 19FA0402#2EFFF21FE80AB84D (1410715026.112818) can0 19FA0402#2FB8112B000000F2 (1410715026.115809) can0 19FA0402#301C170413C7D60D (1410715026.118800) can0 19FA0402#310B000000F213F3 (1410715026.122065) can0 19FA0402#321B7D7FE6123000 (1410715026.124812) can0 19FA0402#330000F2142215C2 (1410715026.127802) can0 19FA0402#34B8B71136000000 (1410715026.130823) can0 19FA0402#35F2FFFFFFFFFFFF (1410715026.133997) can0 0DF80502#202FAFC73FF0B850 (1410715026.136774) can0 0DF80502#212480EF4162E342 (1410715026.139796) can0 0DF80502#22430580294BBAD9 (1410715026.142786) can0 0DF80502#23B931031D9A9D02 (1410715026.145930) can0 0DF80502#240000000013FC0C (1410715026.148798) can0 0DF80502#2549008000AC0D00 (1410715026.151820) can0 0DF80502#260000FFFFFFFFFF (1410715026.154780) can0 09F80102#72719A16381BB80D (1410715026.185969) can0 09F80202#B0FC00000200FFFF (1410715026.210810) can0 09F80102#72719A16381BB80D (1410715026.220942) can0 0DF50B11#018C030000FFFFFF (1410715026.310786) can0 09F80102#72719A16381BB80D (1410715026.410761) can0 09F80102#72719A16381BB80D (1410715026.435755) can0 09F80202#B1FC00000200FFFF (1410715026.510706) can0 09F80102#72719A16381BB80D (1410715026.610682) can0 09F80102#72719A16381BB80D (1410715026.685969) can0 09F80202#B2FC00000200FFFF (1410715026.689509) can0 11F80E01#A01B03E0BBEA1E70 (1410715026.690058) can0 11F80E01#A135BE0DE0579916 (1410715026.690638) can0 11F80E01#A26EFCA400000000 (1410715026.691218) can0 11F80E01#A308FFFFFF7F05FE (1410715026.710657) can0 09F80102#72719A16381BB80D (1410715026.810633) can0 09F80102#72719A16381BB80D (1410715026.910578) can0 09F80102#72719A16381BB80D (1410715026.935633) can0 09F80202#B3FC00000200FFFF (1410715027.010554) can0 09F80102#72719A16381BB80D (1410715027.070826) can0 0DF01002#B4F0C73F00E05024 (1410715027.073511) can0 19FA0302#B4D3490068006400 (1410715027.076594) can0 19FA0402#4093B4FD0C0B2D35 (1410715027.079493) can0 19FA0402#4108C58512F6FFFF (1410715027.082514) can0 19FA0402#42FFF220673013D6 (1410715027.085505) can0 19FA0402#43E712F5FFFFFFF2 (1410715027.088679) can0 19FA0402#440E7F160B209B11 (1410715027.091486) can0 19FA0402#45DEFFFFFFF216DC (1410715027.094508) can0 19FA0402#4608AD2DC20FF1FF (1410715027.097498) can0 19FA0402#47FFFFF201D0247C (1410715027.100581) can0 19FA0402#48D9F61103000000 (1410715027.103480) can0 19FA0402#49F21B390A957496 (1410715027.106501) can0 19FA0402#4A11FBFFFFFFF217 (1410715027.109492) can0 19FA0402#4B7F07CE8DA71194 (1410715027.112574) can0 19FA0402#4CFFFFFFF2047314 (1410715027.115473) can0 19FA0402#4DAAD25111FFFFFF (1410715027.118494) can0 19FA0402#4EFFF21FE80AB84D (1410715027.121485) can0 19FA0402#4FA1112E000000F2 (1410715027.124567) can0 19FA0402#501C170413C79C0D (1410715027.127497) can0 19FA0402#511C000000F213F3 (1410715027.130488) can0 19FA0402#521B7D7F08133200 (1410715027.133479) can0 19FA0402#530000F2142215C2 (1410715027.136561) can0 19FA0402#54B8E4113A000000 (1410715027.139490) can0 19FA0402#55F2FFFFFFFFFFFF (1410715027.142481) can0 0DF80502#402FB4C73F00E050 (1410715027.145472) can0 0DF80502#412480EF4162E342 (1410715027.148676) can0 0DF80502#42430580294BBAD9 (1410715027.151453) can0 0DF80502#43B931031D9A9D02 (1410715027.154475) can0 0DF80502#440000000013FC0C (1410715027.157465) can0 0DF80502#4549008000AC0D00 (1410715027.160609) can0 0DF80502#460000FFFFFFFFFF (1410715027.163477) can0 09F80102#72719A16381BB80D (1410715027.169917) can0 11F80E01#C01B0132D74A1070 (1410715027.170435) can0 11F80E01#C1C9E20DA0599116 (1410715027.170985) can0 11F80E01#C26A59BE8601A4C0 (1410715027.171564) can0 11F80E01#C300E5BE000000FE (1410715027.195521) can0 09F80202#B5FC00000300FFFF (1410715027.220637) can0 09F80102#72719A16381BB80D (1410715027.320612) can0 09F80102#72719A16381BB80D (1410715027.322840) can0 0DF50B11#018C030000FFFFFF (1410715027.420618) can0 09F80102#72719A16381BB80D (1410715027.444056) can0 19F212B0#2009B1000064FF06 (1410715027.444636) can0 19F212B0#211C0900FFFFFFFF (1410715027.445155) can0 19F214B0#00EB04C4FF5278B1 (1410715027.445734) can0 09F80202#B6FC00000300FFFF (1410715027.520625) can0 09F80102#72719A16381BB80D (1410715027.620631) can0 09F80102#72719A16381BB80D (1410715027.695429) can0 09F80202#B7FC00000300FFFF (1410715027.720637) can0 09F80102#72719A16381BB80D (1410715027.820612) can0 09F80102#72719A16381BB80D (1410715027.920618) can0 09F80102#72719A16381BB80D (1410715027.945277) can0 09F80202#B8FC00000300FFFF (1410715028.020563) can0 09F80102#72719A16381BB80D (1410715028.079951) can0 0DF01002#B9F0C73F10075124 (1410715028.082178) can0 19FA0302#B9D3490068006400 (1410715028.085169) can0 19FA0402#6093B9FD0C0B2D35 (1410715028.088160) can0 19FA0402#6108C55412F6FFFF (1410715028.091303) can0 19FA0402#62FFF220673013D6 (1410715028.094172) can0 19FA0402#638812FFFFFFFFF2 (1410715028.097163) can0 19FA0402#640E7F160B207411 (1410715028.100184) can0 19FA0402#65DEFFFFFFF216DC (1410715028.103327) can0 19FA0402#6608AD2DC30FEBFF (1410715028.106196) can0 19FA0402#67FFFFF201D0247C (1410715028.109187) can0 19FA0402#68D9531205000000 (1410715028.112177) can0 19FA0402#69F21B8B0995749B (1410715028.115321) can0 19FA0402#6A11F8FFFFFFF217 (1410715028.118159) can0 19FA0402#6B7F07CE8DBC118D (1410715028.121180) can0 19FA0402#6CFFFFFFF2047314 (1410715028.124171) can0 19FA0402#6DAAD24F11FDFFFF (1410715028.127314) can0 19FA0402#6EFFF21FE80AB84D (1410715028.130183) can0 19FA0402#6FAD1130000000F2 (1410715028.133143) can0 19FA0402#701C170413C7990D (1410715028.136164) can0 19FA0402#7112000000F213F3 (1410715028.139246) can0 19FA0402#721B7D7FB2123300 (1410715028.142146) can0 19FA0402#730000F2142215C2 (1410715028.145167) can0 19FA0402#74B8F8113E000000 (1410715028.148188) can0 19FA0402#75F2FFFFFFFFFFFF (1410715028.151331) can0 0DF80502#602FB9C73F100751 (1410715028.154139) can0 0DF80502#612480EF4162E342 (1410715028.157160) can0 0DF80502#62430580294BBAD9 (1410715028.160151) can0 0DF80502#63B931031D9A9D02 (1410715028.163325) can0 0DF80502#640000000013FC0C (1410715028.166163) can0 0DF80502#6549008000AC0D00 (1410715028.169184) can0 0DF80502#660000FFFFFFFFFF (1410715028.172144) can0 09F80102#72719A16381BB80D (1410715028.204188) can0 09F80202#BAFC00000700FFFF (1410715028.229182) can0 09F80102#72719A16381BB80D (1410715028.324427) can0 0DF50B11#018C030000FFFFFF (1410715028.329157) can0 09F80102#72719A16381BB80D (1410715028.429102) can0 09F80102#72719A16381BB80D (1410715028.454127) can0 09F80202#BBFC00000700FFFF (1410715028.529078) can0 09F80102#72719A16381BB80D (1410715028.629053) can0 09F80102#72719A16381BB80D (1410715028.704066) can0 09F80202#BCFC00000700FFFF (1410715028.728999) can0 09F80102#72719A16381BB80D (1410715028.829005) can0 09F80102#72719A16381BB80D (1410715028.928980) can0 09F80102#72719A16381BB80D (1410715028.944086) can0 19F212B0#4009C0000064FF12 (1410715028.944666) can0 19F212B0#411C0A00FFFFFFFF (1410715028.945216) can0 19F214B0#00ED04C4FF6678C0 (1410715028.954066) can0 09F80202#BDFC00000700FFFF (1410715029.028956) can0 09F80102#72719A16381BB80D (1410715029.088221) can0 0DF01002#BEF0C73F202E5124 (1410715029.090876) can0 19FA0302#BED3490068006400 (1410715029.094019) can0 19FA0402#8093BEFD0C0B2D35 (1410715029.096857) can0 19FA0402#8108C5D211F9FFFF (1410715029.099848) can0 19FA0402#82FFF220673013D6 (1410715029.102869) can0 19FA0402#83911203000000F2 (1410715029.105921) can0 19FA0402#840E7F160B209811 (1410715029.108851) can0 19FA0402#85D9FFFFFFF216DC (1410715029.111842) can0 19FA0402#8608AD2D730F0000 (1410715029.114863) can0 19FA0402#870000F201D0247C (1410715029.116755) can0 11F80E01#E01B01985B620E80 (1410715029.117304) can0 11F80E01#E1C6C20D60B99916 (1410715029.117884) can0 11F80E01#E278A5A4000050C0 (1410715029.118433) can0 11F80E01#E300FFFFFF7F00FE (1410715029.119013) can0 19FA0402#88D91F1200000000 (1410715029.120844) can0 19FA0402#89F21B8B09957494 (1410715029.123865) can0 19FA0402#8A11F4FFFFFFF217 (1410715029.126826) can0 19FA0402#8B7F07CE8D5B118F (1410715029.130061) can0 19FA0402#8CFFFFFFF2047314 (1410715029.132838) can0 19FA0402#8DAAD2A011F9FFFF (1410715029.135828) can0 19FA0402#8EFFF21FE80AB84D (1410715029.138850) can0 19FA0402#8FB01131000000F2 (1410715029.142329) can0 19FA0402#901C170413C7CB0D (1410715029.144831) can0 19FA0402#9121000000F213F3 (1410715029.147852) can0 19FA0402#921B7D7F24133300 (1410715029.150843) can0 19FA0402#930000F2142215C2 (1410715029.153986) can0 19FA0402#94B856114B000000 (1410715029.156855) can0 19FA0402#95F2FFFFFFFFFFFF (1410715029.159846) can0 0DF80502#802FBEC73F202E51 (1410715029.162836) can0 0DF80502#812480EF4162E342 (1410715029.165949) can0 0DF80502#82430580294BBAD9 (1410715029.168848) can0 0DF80502#83B931031D9A9D02 (1410715029.171870) can0 0DF80502#840000000013FC0C (1410715029.174860) can0 0DF80502#8549008000AC0D00 (1410715029.178034) can0 0DF80502#860000FFFFFFFFFF (1410715029.180811) can0 09F80102#72719A16381BB80D (1410715029.212885) can0 09F80202#BFFC00000300FFFF (1410715029.218775) can0 1DEFFF01#400AE598B6060404 (1410715029.219355) can0 1DEFFF01#4100000002FFFFFF (1410715029.238032) can0 09F80102#72719A16381BB80D (1410715029.276453) can0 11F80E01#001B032C4F112040 (1410715029.277003) can0 11F80E01#01B6C20D00759916 (1410715029.277552) can0 11F80E01#027779210000FA4C (1410715029.278132) can0 11F80E01#0301C29A000005FE (1410715029.325953) can0 0DF50B11#018C030000FFFFFF (1410715029.338038) can0 09F80102#72719A16381BB80D (1410715029.438044) can0 09F80102#72719A16381BB80D (1410715029.462794) can0 09F80202#C0FC00000300FFFF (1410715029.538050) can0 09F80102#72719A16381BB80D (1410715029.638056) can0 09F80102#72719A16381BB80D (1410715029.712733) can0 09F80202#C1FC00000300FFFF (1410715029.738032) can0 09F80102#72719A16381BB80D (1410715029.838038) can0 09F80102#72719A16381BB80D (1410715029.940546) can0 09F80102#72719A16381BB80D (1410715029.962641) can0 09F80202#C2FC00000300FFFF (1410715030.037989) can0 09F80102#72719A16381BB80D (1410715030.121241) can0 0DF01002#C3F0C73F30555124 (1410715030.123530) can0 19FA0302#C3D3490068006400 (1410715030.126551) can0 19FA0402#A093C3FD0C0B2D35 (1410715030.129542) can0 19FA0402#A108C50D12FDFFFF (1410715030.132594) can0 19FA0402#A2FFF220673013D6 (1410715030.135523) can0 19FA0402#A3131205000000F2 (1410715030.138544) can0 19FA0402#A40E7F160B209811 (1410715030.141535) can0 19FA0402#A5DEFFFFFFF216DC (1410715030.144587) can0 19FA0402#A608AD2D7B0F0000 (1410715030.147547) can0 19FA0402#A70000F201D0247C (1410715030.150538) can0 19FA0402#A8D93012FEFFFFFF (1410715030.153498) can0 19FA0402#A9F21B8B0995749A (1410715030.156611) can0 19FA0402#AA11F1FFFFFFF217 (1410715030.159510) can0 19FA0402#AB7F07CE8D7E119A (1410715030.162531) can0 19FA0402#ACFFFFFFF2047314 (1410715030.165522) can0 19FA0402#ADAAD2FB10130000 (1410715030.168696) can0 19FA0402#AE00F21FE80AB84D (1410715030.171534) can0 19FA0402#AF381134000000F2 (1410715030.174525) can0 19FA0402#B01C680313C7C10D (1410715030.177515) can0 19FA0402#B11A000000F213F3 (1410715030.180781) can0 19FA0402#B21B7D7F9A123200 (1410715030.183527) can0 19FA0402#B30000F2142215C2 (1410715030.186518) can0 19FA0402#B4B813124D000000 (1410715030.189539) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715030.192591) can0 0DF80502#A02FC3C73F305551 (1410715030.195490) can0 0DF80502#A12480EF4162E342 (1410715030.198511) can0 0DF80502#A2430580294BBAD9 (1410715030.201502) can0 0DF80502#A3B931031D9A9D02 (1410715030.204615) can0 0DF80502#A40000000013FC0C (1410715030.207514) can0 0DF80502#A549008000AC0D00 (1410715030.210535) can0 0DF80502#A60000FFFFFFFFFF (1410715030.213496) can0 09F80102#72719A16381BB80D (1410715030.245570) can0 09F80202#C4FC00000300FFFF (1410715030.270533) can0 09F80102#72719A16381BB80D (1410715030.327509) can0 0DF50B11#018C030000FFFFFF (1410715030.370509) can0 09F80102#72719A16381BB80D (1410715030.444361) can0 19F212B0#6009CF000064FF12 (1410715030.444941) can0 19F212B0#611C0A00FFFFFFFF (1410715030.445490) can0 19F214B0#00EC04C5FF6678CF (1410715030.470454) can0 09F80102#72719A16381BB80D (1410715030.495478) can0 09F80202#C5FC00000300FFFF (1410715030.556483) can0 11F80E01#201B0108975C0EF0 (1410715030.557032) can0 11F80E01#219BC50D40F39816 (1410715030.557581) can0 11F80E01#227D726E050066C0 (1410715030.558161) can0 11F80E01#230894B0000000FE (1410715030.570429) can0 09F80102#72719A16381BB80D (1410715030.670405) can0 09F80102#72719A16381BB80D (1410715030.745386) can0 09F80202#C6FC00000300FFFF (1410715030.770380) can0 09F80102#72719A16381BB80D (1410715030.870356) can0 09F80102#72719A16381BB80D (1410715030.970332) can0 09F80102#72719A16381BB80D (1410715030.995386) can0 09F80202#C7FC00000300FFFF (1410715031.070307) can0 09F80102#72719A16381BB80D (1410715031.080653) can0 0DF01002#C8F0C73F407C5124 (1410715031.083338) can0 19FA0302#C8D3490068006400 (1410715031.086237) can0 19FA0402#C093C8FD0C0B2D35 (1410715031.089259) can0 19FA0402#C108C54212FCFFFF (1410715031.092219) can0 19FA0402#C2FFF220673013D6 (1410715031.095332) can0 19FA0402#C3821206000000F2 (1410715031.098231) can0 19FA0402#C40E7F160B20A011 (1410715031.101221) can0 19FA0402#C5DBFFFFFFF216DC (1410715031.104212) can0 19FA0402#C608AD2D6D0F0200 (1410715031.107325) can0 19FA0402#C70000F201D0247C (1410715031.110224) can0 19FA0402#C8D9831105000000 (1410715031.113215) can0 19FA0402#C9F21B8B09957482 (1410715031.116206) can0 19FA0402#CA11EDFFFFFFF217 (1410715031.119257) can0 19FA0402#CB7F07CE8DA0119B (1410715031.122218) can0 19FA0402#CCFFFFFFF2047314 (1410715031.125208) can0 19FA0402#CDAAD2FF10280000 (1410715031.128199) can0 19FA0402#CE00F21FE80AB84D (1410715031.131342) can0 19FA0402#CF3E113A000000F2 (1410715031.134211) can0 19FA0402#D01C680313C7B30D (1410715031.137232) can0 19FA0402#D110000000F213F3 (1410715031.140192) can0 19FA0402#D21B7D7FBD122F00 (1410715031.143336) can0 19FA0402#D30000F2142215C2 (1410715031.146235) can0 19FA0402#D4B8191242000000 (1410715031.149226) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715031.152216) can0 0DF80502#C02FC8C73F407C51 (1410715031.155299) can0 0DF80502#C12480EF4162E342 (1410715031.158198) can0 0DF80502#C2430580294BBAD9 (1410715031.161188) can0 0DF80502#C3B931031D9A9D02 (1410715031.164210) can0 0DF80502#C40000000013FC0C (1410715031.167323) can0 0DF80502#C549008000AC0D00 (1410715031.170252) can0 0DF80502#C60000FFFFFFFFFF (1410715031.173212) can0 09F80102#72719A16381BB80D (1410715031.204249) can0 09F80202#C9FC00000600FFFF (1410715031.229212) can0 09F80102#72719A16381BB80D (1410715031.329035) can0 0DF50B11#018C030000FFFFFF (1410715031.329615) can0 09F80102#72719A16381BB80D (1410715031.429163) can0 09F80102#72719A16381BB80D (1410715031.454188) can0 09F80202#CAFC00000600FFFF (1410715031.529139) can0 09F80102#72719A16381BB80D (1410715031.629084) can0 09F80102#72719A16381BB80D (1410715031.704096) can0 09F80202#CBFC00000600FFFF (1410715031.729060) can0 09F80102#72719A16381BB80D (1410715031.829066) can0 09F80102#72719A16381BB80D (1410715031.929041) can0 09F80102#72719A16381BB80D (1410715031.944117) can0 19F212B0#8009DE000064FF12 (1410715031.944666) can0 19F212B0#811C0900FFFFFFFF (1410715031.945216) can0 19F214B0#00EB04C4FF6778DE (1410715031.954096) can0 09F80202#CCFC00000600FFFF (1410715032.028986) can0 09F80102#72719A16381BB80D (1410715032.049525) can0 11F80E01#401B03C01AD20CF0 (1410715032.050074) can0 11F80E01#41AAC20D807E9916 (1410715032.050654) can0 11F80E01#427C4A4600000000 (1410715032.051203) can0 11F80E01#4308AB96000005FE (1410715032.094416) can0 0DF01002#CDF0C73F50A35124 (1410715032.096918) can0 19FA0302#CDD3490068006400 (1410715032.099909) can0 19FA0402#E093CDFD0C0B2D35 (1410715032.102900) can0 19FA0402#E108C51912FBFFFF (1410715032.103449) can0 11F80E01#601B01A929C40C30 (1410715032.103999) can0 11F80E01#6134B90DE0009A16 (1410715032.104578) can0 11F80E01#6284BA02000034C0 (1410715032.105128) can0 11F80E01#63087CCA000000FE (1410715032.106165) can0 19FA0402#E2FFF220673013D6 (1410715032.108912) can0 19FA0402#E370120A000000F2 (1410715032.111903) can0 19FA0402#E40E7F160B209411 (1410715032.114924) can0 19FA0402#E5DEFFFFFFF216DC (1410715032.118067) can0 19FA0402#E608AD2D5F0F0400 (1410715032.120905) can0 19FA0402#E70000F201D0247C (1410715032.123896) can0 19FA0402#E8D93912FCFFFFFF (1410715032.126887) can0 19FA0402#E9F21B8B0995748A (1410715032.130061) can0 19FA0402#EA11EDFFFFFFF217 (1410715032.132899) can0 19FA0402#EB7F07CE8DB11197 (1410715032.135889) can0 19FA0402#ECFFFFFFF2047314 (1410715032.138911) can0 19FA0402#EDAAD24A11230000 (1410715032.142176) can0 19FA0402#EE00F21FE80AB84D (1410715032.144892) can0 19FA0402#EF7E1133000000F2 (1410715032.147883) can0 19FA0402#F01C680313C71F0E (1410715032.150904) can0 19FA0402#F113000000F213F3 (1410715032.154047) can0 19FA0402#F21B7D7F70122E00 (1410715032.156886) can0 19FA0402#F30000F2142215C2 (1410715032.159907) can0 19FA0402#F4B8AA1140000000 (1410715032.162897) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715032.166041) can0 0DF80502#E02FCDC73F50A351 (1410715032.168879) can0 0DF80502#E12480EF4162E342 (1410715032.171870) can0 0DF80502#E2430580294BBAD9 (1410715032.174860) can0 0DF80502#E3B931031D9A9D02 (1410715032.178126) can0 0DF80502#E40000000013FC0C (1410715032.180903) can0 0DF80502#E549008000AC0D00 (1410715032.183924) can0 0DF80502#E60000FFFFFFFFFF (1410715032.186884) can0 09F80102#72719A16381BB80D (1410715032.218928) can0 09F80202#CEFC00000200FFFF (1410715032.243891) can0 09F80102#72719A16381BB80D (1410715032.331507) can0 0DF50B11#018F030000FFFFFF (1410715032.343867) can0 09F80102#72719A16381BB80D (1410715032.443842) can0 09F80102#72719A16381BB80D (1410715032.468867) can0 09F80202#CFFC00000200FFFF (1410715032.543787) can0 09F80102#72719A16381BB80D (1410715032.643763) can0 09F80102#72719A16381BB80D (1410715032.718775) can0 09F80202#D0FC00000200FFFF (1410715032.743739) can0 09F80102#72719A16381BB80D (1410715032.769770) can0 11F80E01#801B0320E74E0E80 (1410715032.770319) can0 11F80E01#8121100EE07CA916 (1410715032.770869) can0 11F80E01#8287272E7600D00E (1410715032.771418) can0 11F80E01#83097CAC000000FE (1410715032.843745) can0 09F80102#72719A16381BB80D (1410715032.943720) can0 09F80102#72719A16381BB80D (1410715032.968775) can0 09F80202#D1FC00000200FFFF (1410715033.043665) can0 09F80102#72719A16381BB80D (1410715033.053187) can0 0DF01002#D2F0C73F60CA5124 (1410715033.055598) can0 19FA0302#D2D3490068006400 (1410715033.058619) can0 19FA0402#0093D2FD0C0B2D35 (1410715033.061610) can0 19FA0402#0108C51E12F8FFFF (1410715033.064631) can0 19FA0402#02FFF220673013D6 (1410715033.067622) can0 19FA0402#0379120B000000F2 (1410715033.070612) can0 19FA0402#040E7F160B20A011 (1410715033.073603) can0 19FA0402#05DDFFFFFFF216DC (1410715033.076655) can0 19FA0402#0608AD2D300F0000 (1410715033.079615) can0 19FA0402#070000F201D0247C (1410715033.082606) can0 19FA0402#08D9C61103000000 (1410715033.085596) can0 19FA0402#09F21B8B09957489 (1410715033.088770) can0 19FA0402#0A11EFFFFFFFF217 (1410715033.091608) can0 19FA0402#0B7F07CE8DA31192 (1410715033.094599) can0 19FA0402#0CFFFFFFF2047314 (1410715033.097590) can0 19FA0402#0DAAD21D11130000 (1410715033.100642) can0 19FA0402#0E00F21FE80AB84D (1410715033.103602) can0 19FA0402#0F92112C000000F2 (1410715033.106593) can0 19FA0402#101C680313C7340E (1410715033.109614) can0 19FA0402#1102000000F213F3 (1410715033.112635) can0 19FA0402#121B7D7FE1122300 (1410715033.115595) can0 19FA0402#130000F2142215C2 (1410715033.118586) can0 19FA0402#14B8EC113B000000 (1410715033.121607) can0 19FA0402#15F2FFFFFFFFFFFF (1410715033.124628) can0 0DF80502#002FD2C73F60CA51 (1410715033.127589) can0 0DF80502#012480EF4162E342 (1410715033.130579) can0 0DF80502#02430580294BBAD9 (1410715033.133570) can0 0DF80502#03B931031D9A9D02 (1410715033.136652) can0 0DF80502#040000000013FC0C (1410715033.139582) can0 0DF80502#0549008000AC0D00 (1410715033.142603) can0 0DF80502#060000FFFFFFFFFF (1410715033.145563) can0 09F80102#72719A16381BB80D (1410715033.178034) can0 09F80202#D3FC00000600FFFF (1410715033.183192) can0 19FB0201#A04B0532D74A10A2 (1410715033.183741) can0 19FB0201#A16B870055455253 (1410715033.184290) can0 19FB0201#A2000000204F4D53 (1410715033.184840) can0 19FB0201#A34B495920203134 (1410715033.185419) can0 19FB0201#A400000000000000 (1410715033.185999) can0 19FB0201#A50000464204A000 (1410715033.186549) can0 19FB0201#A628007A03C73F00 (1410715033.187128) can0 19FB0201#A7F6342F68014B41 (1410715033.187647) can0 19FB0201#A84C414D414B4900 (1410715033.188258) can0 19FB0201#A900000000000000 (1410715033.188807) can0 19FB0201#AA0000000004E0FF (1410715033.202601) can0 09F80102#72719A16381BB80D (1410715033.302576) can0 09F80102#72719A16381BB80D (1410715033.332941) can0 0DF50B11#018F030000FFFFFF (1410715033.402521) can0 09F80102#72719A16381BB80D (1410715033.427546) can0 09F80202#D4FC00000600FFFF (1410715033.444392) can0 19F212B0#A009ED000064FF1D (1410715033.444941) can0 19F212B0#A11C0A00FFFFFFFF (1410715033.445490) can0 19F214B0#00EB04C4FF6678ED (1410715033.502497) can0 09F80102#72719A16381BB80D (1410715033.602473) can0 09F80102#72719A16381BB80D (1410715033.677485) can0 09F80202#D5FC00000600FFFF (1410715033.702448) can0 09F80102#72719A16381BB80D (1410715033.802393) can0 09F80102#72719A16381BB80D (1410715033.915827) can0 09F80102#72719A16381BB80D (1410715033.928889) can0 09F80202#D6FC00000600FFFF (1410715034.002375) can0 09F80102#72719A16381BB80D (1410715034.078822) can0 0DF01002#D7F0C73F70F15124 (1410715034.081293) can0 19FA0302#D7D3490068006400 (1410715034.084589) can0 19FA0402#2093D7FD0C0B2D35 (1410715034.087305) can0 19FA0402#2108C50312FAFFFF (1410715034.090327) can0 19FA0402#22FFF220673013D6 (1410715034.093287) can0 19FA0402#23611208000000F2 (1410715034.096613) can0 19FA0402#240E7F160B20A811 (1410715034.099299) can0 19FA0402#25D9FFFFFFF216DC (1410715034.102412) can0 19FA0402#2608AD2D6B0FF8FF (1410715034.105280) can0 19FA0402#27FFFFF201D0247C (1410715034.108302) can0 19FA0402#28D91012FDFFFFFF (1410715034.111384) can0 19FA0402#29F21B8B0995745C (1410715034.114283) can0 19FA0402#2A11F1FFFFFFF217 (1410715034.117274) can0 19FA0402#2B7F07CE8DB91191 (1410715034.120295) can0 19FA0402#2CFFFFFFF2047314 (1410715034.123347) can0 19FA0402#2DAAD24D11040000 (1410715034.126276) can0 19FA0402#2E00F21FE80AB84D (1410715034.129298) can0 19FA0402#2F8B1126000000F2 (1410715034.132258) can0 19FA0402#301C680313C7570E (1410715034.135340) can0 19FA0402#310F000000F213F3 (1410715034.138270) can0 19FA0402#321B7D7F03122800 (1410715034.141261) can0 19FA0402#330000F2142215C2 (1410715034.144282) can0 19FA0402#34B8261237000000 (1410715034.147334) can0 19FA0402#35F2FFFFFFFFFFFF (1410715034.150263) can0 0DF80502#202FD7C73F70F151 (1410715034.153254) can0 0DF80502#212480EF4162E342 (1410715034.156245) can0 0DF80502#22430580294BBAD9 (1410715034.159266) can0 0DF80502#23B931031D9A9D02 (1410715034.162287) can0 0DF80502#240000000013FC0C (1410715034.165278) can0 0DF80502#2549008000AC0D00 (1410715034.168299) can0 0DF80502#260000FFFFFFFFFF (1410715034.171320) can0 09F80102#72719A16381BB80D (1410715034.203394) can0 09F80202#D8FC00000300FFFF (1410715034.218470) can0 1DEFFF01#600AE598B6060404 (1410715034.219050) can0 1DEFFF01#6100000002FFFFFF (1410715034.228724) can0 09F80102#72719A16381BB80D (1410715034.328242) can0 09F80102#72719A16381BB80D (1410715034.334437) can0 0DF50B11#018F030000FFFFFF (1410715034.428217) can0 09F80102#72719A16381BB80D (1410715034.453211) can0 09F80202#D9FC00000300FFFF (1410715034.528162) can0 09F80102#72719A16381BB80D (1410715034.628138) can0 09F80102#72719A16381BB80D (1410715034.703425) can0 09F80202#DAFC00000300FFFF (1410715034.728114) can0 09F80102#72719A16381BB80D (1410715034.828089) can0 09F80102#72719A16381BB80D (1410715034.928034) can0 09F80102#72719A16381BB80D (1410715034.944147) can0 19F212B0#C00901000064FF1C (1410715034.944727) can0 19F212B0#C11C0800FFFFFFFF (1410715034.945277) can0 19F214B0#00EB04C4FF667801 (1410715034.953089) can0 09F80202#DBFC00000300FFFF (1410715035.028010) can0 09F80102#72719A16381BB80D (1410715035.090052) can0 0DF01002#DCF0C73F80185224 (1410715035.092982) can0 19FA0302#DCD3490068006400 (1410715035.095942) can0 19FA0402#4093DCFD0C0B2D35 (1410715035.099268) can0 19FA0402#4108C5FA12FAFFFF (1410715035.102198) can0 19FA0402#42FFF220673013D6 (1410715035.105006) can0 19FA0402#436A120C000000F2 (1410715035.107966) can0 19FA0402#440E7F160B20B011 (1410715035.111323) can0 19FA0402#45D9FFFFFFF216DC (1410715035.114069) can0 19FA0402#4608AD2D1D0FF5FF (1410715035.116969) can0 19FA0402#47FFFFF201D0247C (1410715035.119959) can0 19FA0402#48D9CC1104000000 (1410715035.122950) can0 19FA0402#49F21B8B0995749D (1410715035.126093) can0 19FA0402#4A11EFFFFFFFF217 (1410715035.128962) can0 19FA0402#4B7F07CE8D981194 (1410715035.131953) can0 19FA0402#4CFFFFFFF2047314 (1410715035.134943) can0 19FA0402#4DAAD2FA10030000 (1410715035.138087) can0 19FA0402#4E00F21FE80AB84D (1410715035.140955) can0 19FA0402#4F921121000000F2 (1410715035.143916) can0 19FA0402#501C680313C7650E (1410715035.146937) can0 19FA0402#5108000000F213F3 (1410715035.150080) can0 19FA0402#521B7D7FBE122200 (1410715035.152949) can0 19FA0402#530000F2142215C2 (1410715035.155939) can0 19FA0402#54B8381237000000 (1410715035.156641) can0 11F80E01#A01B0188F64A0E90 (1410715035.157191) can0 11F80E01#A1FBB80D40FF9916 (1410715035.157771) can0 11F80E01#A28CFFFF00002040 (1410715035.158350) can0 11F80E01#A300154F000000FE (1410715035.159357) can0 19FA0402#55F2FFFFFFFFFFFF (1410715035.162165) can0 0DF80502#402FDCC73F801852 (1410715035.164942) can0 0DF80502#412480EF4162E342 (1410715035.167933) can0 0DF80502#42430580294BBAD9 (1410715035.170924) can0 0DF80502#43B931031D9A9D02 (1410715035.174097) can0 0DF80502#440000000013FC0C (1410715035.176936) can0 0DF80502#4549008000AC0D00 (1410715035.179957) can0 0DF80502#460000FFFFFFFFFF (1410715035.182917) can0 09F80102#72719A16381BB80D (1410715035.214198) can0 09F80202#DDFC00000400FFFF (1410715035.239252) can0 09F80102#72719A16381BB80D (1410715035.336542) can0 0DF50B11#018C030000FFFFFF (1410715035.338923) can0 09F80102#72719A16381BB80D (1410715035.438898) can0 09F80102#72719A16381BB80D (1410715035.463892) can0 09F80202#DEFC00000400FFFF (1410715035.538844) can0 09F80102#72719A16381BB80D (1410715035.638819) can0 09F80102#72719A16381BB80D (1410715035.676386) can0 11F80E01#C01B014875520E20 (1410715035.676966) can0 11F80E01#C1E79E0D801FA716 (1410715035.677515) can0 11F80E01#C288D9CBE3011CC0 (1410715035.678065) can0 11F80E01#C30865C6000000FE (1410715035.714136) can0 09F80202#DFFC00000400FFFF (1410715035.738795) can0 09F80102#72719A16381BB80D (1410715035.838770) can0 09F80102#72719A16381BB80D (1410715035.938715) can0 09F80102#72719A16381BB80D (1410715035.963801) can0 09F80202#E0FC00000400FFFF (1410715036.038691) can0 09F80102#72719A16381BB80D (1410715036.065150) can0 0DF01002#E1F0C73F903F5224 (1410715036.067683) can0 19FA0302#E1D3490068006400 (1410715036.070643) can0 19FA0402#6093E1FD0C0B2D35 (1410715036.074030) can0 19FA0402#6108C56012F8FFFF (1410715036.076655) can0 19FA0402#62FFF220673013D6 (1410715036.079707) can0 19FA0402#638D1206000000F2 (1410715036.082636) can0 19FA0402#640E7F160B20D911 (1410715036.086024) can0 19FA0402#65DDFFFFFFF216DC (1410715036.088740) can0 19FA0402#6608AD2D610F0200 (1410715036.091700) can0 19FA0402#670000F201D0247C (1410715036.094660) can0 19FA0402#68D99A110C000000 (1410715036.098017) can0 19FA0402#69F21B8B099574A4 (1410715036.100672) can0 19FA0402#6A11ECFFFFFFF217 (1410715036.103663) can0 19FA0402#6B7F07CE8DAF1191 (1410715036.106654) can0 19FA0402#6CFFFFFFF2047314 (1410715036.110041) can0 19FA0402#6DAAD2EA10160000 (1410715036.112666) can0 19FA0402#6E00F21FE80A0A4D (1410715036.115687) can0 19FA0402#6F941123000000F2 (1410715036.118616) can0 19FA0402#701C680313C7770E (1410715036.122126) can0 19FA0402#7115000000F213F3 (1410715036.124659) can0 19FA0402#721B7D7F7F122600 (1410715036.127619) can0 19FA0402#730000F2142215C2 (1410715036.130640) can0 19FA0402#74B8521237000000 (1410715036.133662) can0 19FA0402#75F2FFFFFFFFFFFF (1410715036.136683) can0 0DF80502#602FE1C73F903F52 (1410715036.139643) can0 0DF80502#612480EF4162E342 (1410715036.142634) can0 0DF80502#62430580294BBAD9 (1410715036.145625) can0 0DF80502#63B931031D9A9D02 (1410715036.148798) can0 0DF80502#640000000013FC0C (1410715036.151636) can0 0DF80502#6549008000AC0D00 (1410715036.154658) can0 0DF80502#660000FFFFFFFFFF (1410715036.157618) can0 09F80102#72719A16381BB80D (1410715036.190058) can0 09F80202#E2FC00000600FFFF (1410715036.214655) can0 09F80102#72719A16381BB80D (1410715036.314600) can0 09F80102#72719A16381BB80D (1410715036.338007) can0 0DF50B11#018C030000FFFFFF (1410715036.414576) can0 09F80102#72719A16381BB80D (1410715036.439600) can0 09F80202#E3FC00000600FFFF (1410715036.444422) can0 19F212B0#E00910000064FF1C (1410715036.445002) can0 19F212B0#E11C0A00FFFFFFFF (1410715036.445551) can0 19F214B0#00EC04C4FF677810 (1410715036.514552) can0 09F80102#72719A16381BB80D (1410715036.614527) can0 09F80102#72719A16381BB80D (1410715036.689509) can0 09F80202#E4FC00000600FFFF (1410715036.714503) can0 09F80102#72719A16381BB80D (1410715036.814448) can0 09F80102#72719A16381BB80D (1410715036.914423) can0 09F80102#72719A16381BB80D (1410715036.939417) can0 09F80202#E5FC00000600FFFF (1410715037.014429) can0 09F80102#72719A16381BB80D (1410715037.074610) can0 0DF01002#E6F0C73FA0665224 (1410715037.077326) can0 19FA0302#E6D3490068006400 (1410715037.080653) can0 19FA0402#8093E6FD0C0B2D35 (1410715037.083399) can0 19FA0402#8108C55912F7FFFF (1410715037.086359) can0 19FA0402#82FFF220673013D6 (1410715037.089350) can0 19FA0402#83AD12FFFFFFFFF2 (1410715037.092646) can0 19FA0402#840E7F160B20B811 (1410715037.095393) can0 19FA0402#85E5FFFFFFF216DC (1410715037.098353) can0 19FA0402#8608AD2D900FF8FF (1410715037.101344) can0 19FA0402#87FFFFF201D0247C (1410715037.104639) can0 19FA0402#88D9311204000000 (1410715037.107325) can0 19FA0402#89F21B8B099574C1 (1410715037.110346) can0 19FA0402#8A11ECFFFFFFF217 (1410715037.113306) can0 19FA0402#8B7F07CE8DAF118F (1410715037.116633) can0 19FA0402#8CFFFFFFF2047314 (1410715037.119349) can0 19FA0402#8DAAD2EC10200000 (1410715037.122340) can0 19FA0402#8E00F21FE80A0A4D (1410715037.125330) can0 19FA0402#8F5F1121000000F2 (1410715037.128718) can0 19FA0402#901C680313C7600E (1410715037.131403) can0 19FA0402#9116000000F213F3 (1410715037.134333) can0 19FA0402#921B7D7F85122600 (1410715037.137324) can0 19FA0402#930000F2142215C2 (1410715037.140620) can0 19FA0402#94B8E71137000000 (1410715037.143488) can0 19FA0402#95F2FFFFFFFFFFFF (1410715037.146357) can0 0DF80502#802FE6C73FA06652 (1410715037.149317) can0 0DF80502#812480EF4162E342 (1410715037.152613) can0 0DF80502#82430580294BBAD9 (1410715037.155390) can0 0DF80502#83B931031D9A9D02 (1410715037.158320) can0 0DF80502#840000000013FC0C (1410715037.161311) can0 0DF80502#8549008000AC0D00 (1410715037.164332) can0 0DF80502#860000FFFFFFFFFF (1410715037.167323) can0 09F80102#72719A16381BB80D (1410715037.199396) can0 09F80202#E7FC00000500FFFF (1410715037.224635) can0 09F80102#72719A16381BB80D (1410715037.324305) can0 09F80102#72719A16381BB80D (1410715037.329890) can0 11F80E01#E01B0148AA2C0EB0 (1410715037.330439) can0 11F80E01#E15CF40D00F98116 (1410715037.330988) can0 11F80E01#E288C504FE029E05 (1410715037.331568) can0 11F80E01#E308FFFFFF7F00FE (1410715037.424250) can0 09F80102#72719A16381BB80D (1410715037.439661) can0 0DF50B11#018C030000FFFFFF (1410715037.449305) can0 09F80202#E8FC00000500FFFF (1410715037.524226) can0 09F80102#72719A16381BB80D (1410715037.624201) can0 09F80102#72719A16381BB80D (1410715037.699396) can0 09F80202#E9FC00000500FFFF (1410715037.724177) can0 09F80102#72719A16381BB80D (1410715037.824122) can0 09F80102#72719A16381BB80D (1410715037.924097) can0 09F80102#72719A16381BB80D (1410715037.944178) can0 19F212B0#00091F000064FF1B (1410715037.944758) can0 19F212B0#011C0900FFFFFFFF (1410715037.945338) can0 19F214B0#00EB04C4FF66781F (1410715037.949183) can0 09F80202#EAFC00000500FFFF (1410715038.022730) can0 11F80E01#001B01985B620E80 (1410715038.023280) can0 11F80E01#01C6C20D60B99916 (1410715038.023829) can0 11F80E01#029CA5A40000B885 (1410715038.024378) can0 09F80102#72719A16381BB80D (1410715038.024958) can0 11F80E01#0308FFFFFF7F00FE (1410715038.084010) can0 0DF01002#EBF0C73FB08D5224 (1410715038.087336) can0 19FA0302#EBD3490068006400 (1410715038.090174) can0 19FA0402#A093EBFD0C0B2D35 (1410715038.093043) can0 19FA0402#A108C58212F9FFFF (1410715038.096003) can0 19FA0402#A2FFF220673070D7 (1410715038.099329) can0 19FA0402#A3D512FEFFFFFFF2 (1410715038.102442) can0 19FA0402#A40E7F160B207811 (1410715038.105036) can0 19FA0402#A5E1FFFFFFF216DC (1410715038.108027) can0 19FA0402#A608AD2DD40FFDFF (1410715038.111445) can0 19FA0402#A7FFFFF201D0247C (1410715038.114100) can0 19FA0402#A8D9A91107000000 (1410715038.117030) can0 19FA0402#A9F21B8B099574AA (1410715038.120020) can0 19FA0402#AA11EDFFFFFFF217 (1410715038.123377) can0 19FA0402#AB7F07CE8D8A118B (1410715038.126093) can0 19FA0402#ACFFFFFFF2047314 (1410715038.129023) can0 19FA0402#ADAAD25411160000 (1410715038.131983) can0 19FA0402#AE00F21FE80A0A4D (1410715038.135432) can0 19FA0402#AF811122000000F2 (1410715038.138087) can0 19FA0402#B01C680313C7900E (1410715038.141047) can0 19FA0402#B106000000F213F3 (1410715038.143977) can0 19FA0402#B21B7D7FB9122400 (1410715038.147303) can0 19FA0402#B30000F2142215C2 (1410715038.150080) can0 19FA0402#B4B8201236000000 (1410715038.153040) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715038.156000) can0 0DF80502#A02FEBC73FB08D52 (1410715038.159296) can0 0DF80502#A12480EF4162E342 (1410715038.162165) can0 0DF80502#A2430580294BBAD9 (1410715038.164973) can0 0DF80502#A3B931031D9A9D02 (1410715038.167994) can0 0DF80502#A40000000013FC0C (1410715038.171351) can0 0DF80502#A549008000AC0D00 (1410715038.174128) can0 0DF80502#A60000FFFFFFFFFF (1410715038.176966) can0 09F80102#72719A16381BB80D (1410715038.208033) can0 09F80202#ECFC00000300FFFF (1410715038.233027) can0 09F80102#72719A16381BB80D (1410715038.332972) can0 09F80102#72719A16381BB80D (1410715038.432948) can0 09F80102#72719A16381BB80D (1410715038.441218) can0 0DF50B11#018C030000FFFFFF (1410715038.458186) can0 09F80202#EDFC00000300FFFF (1410715038.532923) can0 09F80102#72719A16381BB80D (1410715038.632868) can0 09F80102#72719A16381BB80D (1410715038.707880) can0 09F80202#EEFC00000300FFFF (1410715038.732844) can0 09F80102#72719A16381BB80D (1410715038.832819) can0 09F80102#72719A16381BB80D (1410715038.932764) can0 09F80102#72719A16381BB80D (1410715038.958155) can0 09F80202#EFFC00000300FFFF (1410715039.032740) can0 09F80102#72719A16381BB80D (1410715039.093378) can0 0DF01002#F0F0C73FC0B45224 (1410715039.095728) can0 19FA0302#F0D3490068006400 (1410715039.098719) can0 19FA0402#C093F0FD0C0B2D35 (1410715039.102198) can0 19FA0402#C108C5DA12FAFFFF (1410715039.104700) can0 19FA0402#C2FFF220673070D7 (1410715039.107722) can0 19FA0402#C3E412F7FFFFFFF2 (1410715039.110682) can0 19FA0402#C40E7F160B20A111 (1410715039.114069) can0 19FA0402#C5D5FFFFFFF216DC (1410715039.116663) can0 19FA0402#C608AD2D790F0100 (1410715039.119746) can0 19FA0402#C70000F201D0247C (1410715039.122675) can0 19FA0402#C8D9221204000000 (1410715039.126063) can0 19FA0402#C9F21B8B099574C9 (1410715039.128779) can0 19FA0402#CA11E8FFFFFFF217 (1410715039.131709) can0 19FA0402#CB7F07CE8DC7118C (1410715039.134699) can0 19FA0402#CCFFFFFFF2047314 (1410715039.138087) can0 19FA0402#CDAAD2CD100C0000 (1410715039.140681) can0 19FA0402#CE00F21FE80A0A4D (1410715039.143732) can0 19FA0402#CFFA1022000000F2 (1410715039.146662) can0 19FA0402#D01C680313C7720E (1410715039.150080) can0 19FA0402#D108000000F213F3 (1410715039.152674) can0 19FA0402#D21B7D7F9A122500 (1410715039.155695) can0 19FA0402#D30000F2142215C2 (1410715039.158686) can0 19FA0402#D4B8551233000000 (1410715039.162196) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715039.164698) can0 0DF80502#C02FF0C73FC0B452 (1410715039.167689) can0 0DF80502#C12480EF4162E342 (1410715039.170679) can0 0DF80502#C2430580294BBAD9 (1410715039.174067) can0 0DF80502#C3B931031D9A9D02 (1410715039.176691) can0 0DF80502#C40000000013FC0C (1410715039.179713) can0 0DF80502#C549008000AC0D00 (1410715039.182703) can0 0DF80502#C60000FFFFFFFFFF (1410715039.186060) can0 09F80102#72719A16381BB80D (1410715039.218104) can0 1DEFFF01#800AE598B6060404 (1410715039.218684) can0 09F80202#F1FC00000700FFFF (1410715039.219263) can0 1DEFFF01#8100000002FFFFFF (1410715039.242670) can0 09F80102#72719A16381BB80D (1410715039.342646) can0 09F80102#72719A16381BB80D (1410715039.442622) can0 0DF50B11#018C030000FFFFFF (1410715039.443171) can0 09F80102#72719A16381BB80D (1410715039.444453) can0 19F212B0#20092E000064FF1B (1410715039.445002) can0 19F212B0#211C0A00FFFFFFFF (1410715039.445551) can0 19F214B0#00EB04C4FF67782E (1410715039.467646) can0 09F80202#F2FC00000700FFFF (1410715039.542597) can0 09F80102#72719A16381BB80D (1410715039.642542) can0 09F80102#72719A16381BB80D (1410715039.717554) can0 09F80202#F3FC00000700FFFF (1410715039.742518) can0 09F80102#72719A16381BB80D (1410715039.842493) can0 09F80102#72719A16381BB80D (1410715039.942469) can0 09F80102#72719A16381BB80D (1410715039.967463) can0 09F80202#F4FC00000700FFFF (1410715040.042445) can0 09F80102#72719A16381BB80D (1410715040.128168) can0 0DF01002#F5F0C73FD0DB5224 (1410715040.130396) can0 19FA0302#F5D3490068006400 (1410715040.133356) can0 19FA0402#E093F5FD0C0B2D35 (1410715040.136683) can0 19FA0402#E108C5C811FDFFFF (1410715040.139368) can0 19FA0402#E2FFF220673070D7 (1410715040.142390) can0 19FA0402#E3D912F6FFFFFFF2 (1410715040.145350) can0 19FA0402#E40E7F160B209211 (1410715040.148798) can0 19FA0402#E5D8FFFFFFF216DC (1410715040.151423) can0 19FA0402#E608AD2DBC0FF4FF (1410715040.154383) can0 19FA0402#E7FFFFF2017F257C (1410715040.157374) can0 19FA0402#E8D90E120C000000 (1410715040.160670) can0 19FA0402#E9F21B8B099574B8 (1410715040.163416) can0 19FA0402#EA11EAFFFFFFF217 (1410715040.166376) can0 19FA0402#EB7F07CE8D7A1198 (1410715040.169367) can0 19FA0402#ECFFFFFFF2047314 (1410715040.172663) can0 19FA0402#EDAAD24911020000 (1410715040.175471) can0 19FA0402#EE00F21FE80A0A4D (1410715040.178400) can0 19FA0402#EF101125000000F2 (1410715040.181330) can0 19FA0402#F01C680313C7780E (1410715040.184687) can0 19FA0402#F10C000000F213F3 (1410715040.187342) can0 19FA0402#F21B7D7FD4122800 (1410715040.190363) can0 19FA0402#F30000F2142215C2 (1410715040.193354) can0 19FA0402#F4B84F1233000000 (1410715040.196680) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715040.199335) can0 0DF80502#E02FF5C73FD0DB52 (1410715040.202357) can0 0DF80502#E12480EF4162E342 (1410715040.205347) can0 0DF80502#E2430580294BBAD9 (1410715040.208765) can0 0DF80502#E3B931031D9A9D02 (1410715040.211420) can0 0DF80502#E40000000013FC0C (1410715040.214381) can0 0DF80502#E549008000AC0D00 (1410715040.217371) can0 0DF80502#E60000FFFFFFFFFF (1410715040.220667) can0 09F80102#72719A16381BB80D (1410715040.252711) can0 09F80202#F6FC00000500FFFF (1410715040.277369) can0 09F80102#72719A16381BB80D (1410715040.377344) can0 09F80102#72719A16381BB80D (1410715040.444575) can0 0DF50B11#018C030000FFFFFF (1410715040.477320) can0 09F80102#72719A16381BB80D (1410715040.502497) can0 09F80202#F7FC00000500FFFF (1410715040.577265) can0 09F80102#72719A16381BB80D (1410715040.609522) can0 11F80E01#201B0108975C0EF0 (1410715040.610072) can0 11F80E01#219BC50D40F39816 (1410715040.610621) can0 11F80E01#22A1156D05001906 (1410715040.611201) can0 11F80E01#230094B0000000FE (1410715040.677241) can0 09F80102#72719A16381BB80D (1410715040.752253) can0 09F80202#F8FC00000500FFFF (1410715040.777216) can0 09F80102#72719A16381BB80D (1410715040.877161) can0 09F80102#72719A16381BB80D (1410715040.944239) can0 19F212B0#40093D000064FF1A (1410715040.944819) can0 19F212B0#411C0A00FFFFFFFF (1410715040.945368) can0 19F214B0#00EB04C3FF67783D (1410715040.977137) can0 09F80102#72719A16381BB80D (1410715041.002283) can0 09F80202#F9FC00000500FFFF (1410715041.077143) can0 09F80102#72719A16381BB80D (1410715041.087885) can0 0DF01002#00F0C73FE0025324 (1410715041.090144) can0 19FA0302#00D3490068006400 (1410715041.093104) can0 19FA0402#009300FD0C0B2D35 (1410715041.096064) can0 19FA0402#0108C5D811000000 (1410715041.099360) can0 19FA0402#0200F220673070D7 (1410715041.102259) can0 19FA0402#034C12FDFFFFFFF2 (1410715041.105097) can0 19FA0402#040E7F160B20B711 (1410715041.108057) can0 19FA0402#05D8FFFFFFF216DC (1410715041.111414) can0 19FA0402#0608AD2D7F10E8FF (1410715041.114130) can0 19FA0402#07FFFFF2017F257C (1410715041.117091) can0 19FA0402#08D9781204000000 (1410715041.120051) can0 19FA0402#09F21B8B099574C6 (1410715041.123408) can0 19FA0402#0A11EEFFFFFFF217 (1410715041.126093) can0 19FA0402#0B7F07CE8D5D1199 (1410715041.129084) can0 19FA0402#0CFFFFFFF2047314 (1410715041.132044) can0 19FA0402#0DAAD29210020000 (1410715041.135462) can0 19FA0402#0E00F21FE80A0A4D (1410715041.138178) can0 19FA0402#0F4B1127000000F2 (1410715041.141077) can0 19FA0402#101C680313C7780E (1410715041.144068) can0 19FA0402#110F000000F213F3 (1410715041.147334) can0 19FA0402#121B7D7F2B132600 (1410715041.150111) can0 19FA0402#130000F2142215C2 (1410715041.153071) can0 19FA0402#14B8E81136000000 (1410715041.156062) can0 19FA0402#15F2FFFFFFFFFFFF (1410715041.159357) can0 0DF80502#002F00C73FE00253 (1410715041.162196) can0 0DF80502#012480EF4162E342 (1410715041.165064) can0 0DF80502#02430580294BBAD9 (1410715041.168024) can0 0DF80502#03B931031D9A9D02 (1410715041.171412) can0 0DF80502#040000000013FC0C (1410715041.174128) can0 0DF80502#0549008000AC0D00 (1410715041.177088) can0 0DF80502#060000FFFFFFFFFF (1410715041.180048) can0 09F80102#72719A16381BB80D (1410715041.212092) can0 09F80202#01FC00000500FFFF (1410715041.237086) can0 09F80102#72719A16381BB80D (1410715041.337061) can0 09F80102#72719A16381BB80D (1410715041.436976) can0 09F80102#72719A16381BB80D (1410715041.446009) can0 0DF50B11#018C030000FFFFFF (1410715041.462519) can0 09F80202#02FC00000500FFFF (1410715041.536951) can0 09F80102#72719A16381BB80D (1410715041.636927) can0 09F80102#72719A16381BB80D (1410715041.711939) can0 09F80202#03FC00000500FFFF (1410715041.736903) can0 09F80102#72719A16381BB80D (1410715041.836878) can0 09F80102#72719A16381BB80D (1410715041.936915) can0 09F80102#72719A16381BB80D (1410715041.962275) can0 09F80202#04FC00000500FFFF (1410715042.036829) can0 09F80102#72719A16381BB80D (1410715042.104761) can0 0DF01002#05F0C73FF0295324 (1410715042.107783) can0 19FA0302#05D3490068006400 (1410715042.110743) can0 19FA0402#209305FD0C0B2D35 (1410715042.114130) can0 19FA0402#2108C53812FDFFFF (1410715042.116785) can0 19FA0402#22FFF220673070D7 (1410715042.119776) can0 19FA0402#235512FCFFFFFFF2 (1410715042.122736) can0 19FA0402#240E7F160B20C111 (1410715042.126093) can0 19FA0402#25D4FFFFFFF216DC (1410715042.128840) can0 19FA0402#2608AD2D5810E8FF (1410715042.131800) can0 19FA0402#27FFFFF2017F257C (1410715042.134730) can0 19FA0402#28D90F1204000000 (1410715042.138056) can0 19FA0402#29F21B8B09957400 (1410715042.140772) can0 19FA0402#2A12F1FFFFFFF217 (1410715042.143763) can0 19FA0402#2B7F07CE8D411199 (1410715042.146723) can0 19FA0402#2CFFFFFFF2047314 (1410715042.150111) can0 19FA0402#2DAAD240101D0000 (1410715042.152735) can0 19FA0402#2E00F21FE80A0A4D (1410715042.155787) can0 19FA0402#2F431125000000F2 (1410715042.158717) can0 19FA0402#301C680313C7590E (1410715042.162196) can0 19FA0402#3119000000F213F3 (1410715042.164729) can0 19FA0402#321B7D7F56122800 (1410715042.167750) can0 19FA0402#330000F2142215C2 (1410715042.170710) can0 19FA0402#34B809123D000000 (1410715042.174128) can0 19FA0402#35F2FFFFFFFFFFFF (1410715042.176813) can0 0DF80502#202F05C73FF02953 (1410715042.179743) can0 0DF80502#212480EF4162E342 (1410715042.182703) can0 0DF80502#22430580294BBAD9 (1410715042.186091) can0 0DF80502#23B931031D9A9D02 (1410715042.188898) can0 0DF80502#240000000013FC0C (1410715042.191767) can0 0DF80502#2549008000AC0D00 (1410715042.194758) can0 0DF80502#260000FFFFFFFFFF (1410715042.198023) can0 09F80102#72719A16381BB80D (1410715042.228938) can0 09F80202#06FC00000700FFFF (1410715042.254176) can0 09F80102#72719A16381BB80D (1410715042.354060) can0 09F80102#72719A16381BB80D (1410715042.444453) can0 19F212B0#60094C000064FF19 (1410715042.445032) can0 19F212B0#611C0900FFFFFFFF (1410715042.445582) can0 19F214B0#00EC04C4FF67784C (1410715042.447474) can0 0DF50B11#018C030000FFFFFF (1410715042.453669) can0 09F80102#72719A16381BB80D (1410715042.478693) can0 09F80202#07FC00000700FFFF (1410715042.529810) can0 11F80E01#401B037074D50EF0 (1410715042.530390) can0 11F80E01#41EEC40D00E89816 (1410715042.530939) can0 11F80E01#42B0378B00000000 (1410715042.531489) can0 11F80E01#4308B7A7000001FE (1410715042.553645) can0 09F80102#72719A16381BB80D (1410715042.653620) can0 09F80102#72719A16381BB80D (1410715042.728907) can0 09F80202#08FC00000700FFFF (1410715042.753565) can0 09F80102#72719A16381BB80D (1410715042.853541) can0 09F80102#72719A16381BB80D (1410715042.953516) can0 09F80102#72719A16381BB80D (1410715042.978541) can0 09F80202#09FC00000700FFFF (1410715043.053492) can0 09F80102#72719A16381BB80D (1410715043.063776) can0 0DF01002#0AF0C73F00515324 (1410715043.066462) can0 19FA0302#0AD3490068006400 (1410715043.069422) can0 19FA0402#40930AFD0C0B2D35 (1410715043.072749) can0 19FA0402#4108C5A411FFFFFF (1410715043.075434) can0 19FA0402#42FFF220673070D7 (1410715043.078455) can0 19FA0402#433E12FBFFFFFFF2 (1410715043.081416) can0 19FA0402#440E7F160B20B611 (1410715043.084742) can0 19FA0402#45CFFFFFFFF216DC (1410715043.087427) can0 19FA0402#4608AD2D7310E1FF (1410715043.090449) can0 19FA0402#47FFFFF2017F257C (1410715043.093439) can0 19FA0402#48D96D12FFFFFFFF (1410715043.096796) can0 19FA0402#49F21B8B099574FF (1410715043.099451) can0 19FA0402#4A11F4FFFFFFF217 (1410715043.102442) can0 19FA0402#4B7F07CE8D641199 (1410715043.105433) can0 19FA0402#4CFFFFFFF2047314 (1410715043.108881) can0 19FA0402#4DAAD2BC101B0000 (1410715043.111445) can0 19FA0402#4E00F21FE80A0A4D (1410715043.114436) can0 19FA0402#4F42112B000000F2 (1410715043.117426) can0 19FA0402#501C680313C75F0E (1410715043.120753) can0 19FA0402#5121000000F213F3 (1410715043.123438) can0 19FA0402#521B7D7F92122800 (1410715043.126429) can0 19FA0402#530000F2142215C2 (1410715043.129420) can0 19FA0402#54B88B1143000000 (1410715043.132777) can0 19FA0402#55F2FFFFFFFFFFFF (1410715043.135432) can0 0DF80502#402F0AC73F005153 (1410715043.138453) can0 0DF80502#412480EF4162E342 (1410715043.141413) can0 0DF80502#42430580294BBAD9 (1410715043.144740) can0 0DF80502#43B931031D9A9D02 (1410715043.147425) can0 0DF80502#440000000013FC0C (1410715043.150446) can0 0DF80502#4549008000AC0D00 (1410715043.153437) can0 0DF80502#460000FFFFFFFFFF (1410715043.156794) can0 09F80102#72719A16381BB80D (1410715043.188929) can0 09F80202#0BFC00000500FFFF (1410715043.213435) can0 09F80102#72719A16381BB80D (1410715043.222742) can0 11F80E01#601B01A929C40CA0 (1410715043.223292) can0 11F80E01#6134B90D00009A16 (1410715043.223841) can0 11F80E01#62B0A21600003440 (1410715043.224421) can0 11F80E01#63007CCA000000FE (1410715043.313410) can0 09F80102#72719A16381BB80D (1410715043.413355) can0 09F80102#72719A16381BB80D (1410715043.438410) can0 09F80202#0CFC00000500FFFF (1410715043.448939) can0 0DF50B11#018C030000FFFFFF (1410715043.513331) can0 09F80102#72719A16381BB80D (1410715043.613306) can0 09F80102#72719A16381BB80D (1410715043.688319) can0 09F80202#0DFC00000500FFFF (1410715043.713282) can0 09F80102#72719A16381BB80D (1410715043.716059) can0 11F80E01#801B0188F64A0ED0 (1410715043.716639) can0 11F80E01#81FFB80D80089A16 (1410715043.717219) can0 11F80E01#82B0FFFF0000B306 (1410715043.717768) can0 11F80E01#8308154F000000FE (1410715043.813227) can0 09F80102#72719A16381BB80D (1410715043.913203) can0 09F80102#72719A16381BB80D (1410715043.938227) can0 09F80202#0EFC00000500FFFF (1410715043.944239) can0 19F212B0#80095B000064FF18 (1410715043.944788) can0 19F212B0#811C0900FFFFFFFF (1410715043.945368) can0 19F214B0#00EC04C4FF67785B (1410715044.013178) can0 09F80102#72719A16381BB80D (1410715044.115900) can0 0DF01002#0FF0C73F10785324 (1410715044.118128) can0 19FA0302#0FD3490068006400 (1410715044.121119) can0 19FA0402#60930FFD0C0B2D35 (1410715044.124110) can0 19FA0402#6108C5A111FFFFFF (1410715044.127406) can0 19FA0402#62FFF220673070D7 (1410715044.130152) can0 19FA0402#635D1200000000F2 (1410715044.133112) can0 19FA0402#640E7F160B20A011 (1410715044.136103) can0 19FA0402#65D3FFFFFFF216DC (1410715044.139368) can0 19FA0402#6608AD2D1B10E0FF (1410715044.142298) can0 19FA0402#67FFFFF2017F257C (1410715044.145106) can0 19FA0402#68D9B8110A000000 (1410715044.148096) can0 19FA0402#69F21B8B09957400 (1410715044.151453) can0 19FA0402#6A12F1FFFFFFF217 (1410715044.154139) can0 19FA0402#6B7F07CE8D74119E (1410715044.157130) can0 19FA0402#6CFFFFFFF2047314 (1410715044.160090) can0 19FA0402#6DAAD2ED0F1B0000 (1410715044.163447) can0 19FA0402#6E00F21FE80A0A4D (1410715044.166132) can0 19FA0402#6F56112E000000F2 (1410715044.169123) can0 19FA0402#701C680313C75A0E (1410715044.172114) can0 19FA0402#7124000000F213F3 (1410715044.175501) can0 19FA0402#721B7D7FFB122700 (1410715044.178095) can0 19FA0402#730000F2142215C2 (1410715044.181116) can0 19FA0402#74B8081250000000 (1410715044.184107) can0 19FA0402#75F2FFFFFFFFFFFF (1410715044.187403) can0 0DF80502#602F0FC73F107853 (1410715044.190119) can0 0DF80502#612480EF4162E342 (1410715044.193110) can0 0DF80502#62430580294BBAD9 (1410715044.196070) can0 0DF80502#63B931031D9A9D02 (1410715044.199396) can0 0DF80502#640000000013FC0C (1410715044.202235) can0 0DF80502#6549008000AC0D00 (1410715044.205134) can0 0DF80502#660000FFFFFFFFFF (1410715044.208063) can0 09F80102#72719A16381BB80D (1410715044.217738) can0 1DEFFF01#A00AE598B6060404 (1410715044.218317) can0 1DEFFF01#A100000002FFFFFF (1410715044.240137) can0 09F80202#10FC00000300FFFF (1410715044.265131) can0 09F80102#72719A16381BB80D (1410715044.365107) can0 09F80102#72719A16381BB80D (1410715044.450434) can0 0DF50B11#018C030000FFFFFF (1410715044.465052) can0 09F80102#72719A16381BB80D (1410715044.490260) can0 09F80202#11FC00000300FFFF (1410715044.564997) can0 09F80102#72719A16381BB80D (1410715044.664973) can0 09F80102#72719A16381BB80D (1410715044.739954) can0 09F80202#12FC00000300FFFF (1410715044.764948) can0 09F80102#72719A16381BB80D (1410715044.864924) can0 09F80102#72719A16381BB80D (1410715044.964869) can0 09F80102#72719A16381BB80D (1410715044.990198) can0 09F80202#13FC00000300FFFF (1410715045.064844) can0 09F80102#72719A16381BB80D (1410715045.074915) can0 0DF01002#14F0C73F209F5324 (1410715045.078089) can0 19FA0302#14D3490068006400 (1410715045.080805) can0 19FA0402#809314FD0C0B2D35 (1410715045.083796) can0 19FA0402#8108C50212FBFFFF (1410715045.086787) can0 19FA0402#82FFF220673070D7 (1410715045.090174) can0 19FA0402#836F1204000000F2 (1410715045.092799) can0 19FA0402#840E7F160B209A11 (1410715045.095820) can0 19FA0402#85D7FFFFFFF216DC (1410715045.098811) can0 19FA0402#8608AD2DFC0FE6FF (1410715045.102259) can0 19FA0402#87FFFFF2017F257C (1410715045.104792) can0 19FA0402#88D97612FFFFFFFF (1410715045.107783) can0 19FA0402#89F21B8B0995740D (1410715045.110804) can0 19FA0402#8A12EDFFFFFFF217 (1410715045.114130) can0 19FA0402#8B7F07CE8D7B11A5 (1410715045.116816) can0 19FA0402#8CFFFFFFF2047314 (1410715045.119807) can0 19FA0402#8DAAD2F90F280000 (1410715045.122797) can0 19FA0402#8E00F21FE80A0A4D (1410715045.126124) can0 19FA0402#8F3C1134000000F2 (1410715045.128809) can0 19FA0402#901C680313C7550E (1410715045.131800) can0 19FA0402#9128000000F213F3 (1410715045.134791) can0 19FA0402#921B7D7FF4122C00 (1410715045.138087) can0 19FA0402#930000F2142215C2 (1410715045.140772) can0 19FA0402#94B8571157000000 (1410715045.143824) can0 19FA0402#95F2FFFFFFFFFFFF (1410715045.146784) can0 0DF80502#802F14C73F209F53 (1410715045.150111) can0 0DF80502#812480EF4162E342 (1410715045.152766) can0 0DF80502#82430580294BBAD9 (1410715045.155787) can0 0DF80502#83B931031D9A9D02 (1410715045.158808) can0 0DF80502#840000000013FC0C (1410715045.162257) can0 0DF80502#8549008000AC0D00 (1410715045.164790) can0 0DF80502#860000FFFFFFFFFF (1410715045.167811) can0 09F80102#72719A16381BB80D (1410715045.198847) can0 09F80202#15FC00000400FFFF (1410715045.223811) can0 09F80102#72719A16381BB80D (1410715045.323786) can0 09F80102#72719A16381BB80D (1410715045.409632) can0 11F80E01#A01B014875520E50 (1410715045.410151) can0 11F80E01#A1D09E0DE029A716 (1410715045.410700) can0 11F80E01#A2B0D9CBE3011C40 (1410715045.411280) can0 11F80E01#A300B6C5000000FE (1410715045.423762) can0 09F80102#72719A16381BB80D (1410715045.444514) can0 19F212B0#A0096A000064FF17 (1410715045.445094) can0 19F212B0#A11C0900FFFFFFFF (1410715045.445643) can0 19F214B0#00EC04C4FF66786A (1410715045.448878) can0 09F80202#16FC00000400FFFF (1410715045.451960) can0 0DF50B11#018C030000FFFFFF (1410715045.523707) can0 09F80102#72719A16381BB80D (1410715045.623682) can0 09F80102#72719A16381BB80D (1410715045.698664) can0 09F80202#17FC00000400FFFF (1410715045.723658) can0 09F80102#72719A16381BB80D (1410715045.823603) can0 09F80102#72719A16381BB80D (1410715045.923579) can0 09F80102#72719A16381BB80D (1410715045.949152) can0 09F80202#18FC00000400FFFF (1410715046.023554) can0 09F80102#72719A16381BB80D (1410715046.093378) can0 0DF01002#19F0C73F30C65324 (1410715046.095576) can0 19FA0302#19D3490068006400 (1410715046.098475) can0 19FA0402#A09319FD0C0B2D35 (1410715046.101466) can0 19FA0402#A108C5A111FCFFFF (1410715046.104761) can0 19FA0402#A2FFF220673070D7 (1410715046.107569) can0 19FA0402#A3871206000000F2 (1410715046.110499) can0 19FA0402#A40E7F160B204B11 (1410715046.113459) can0 19FA0402#A5DDFFFFFFF216DC (1410715046.116816) can0 19FA0402#A608AD2DEF0FEBFF (1410715046.119501) can0 19FA0402#A7FFFFF2017F257C (1410715046.122492) can0 19FA0402#A8D9A112F8FFFFFF (1410715046.125452) can0 19FA0402#A9F21B8B0995741C (1410715046.128840) can0 19FA0402#AA12E8FFFFFFF217 (1410715046.131464) can0 19FA0402#AB7F07CE8D9F11A5 (1410715046.134486) can0 19FA0402#ACFFFFFFF2042215 (1410715046.137446) can0 19FA0402#ADAAD2B70F3A0000 (1410715046.140772) can0 19FA0402#AE00F21FE80A0A4D (1410715046.143488) can0 19FA0402#AF131141000000F2 (1410715046.146479) can0 19FA0402#B01C680313C7850E (1410715046.149470) can0 19FA0402#B131000000F213F3 (1410715046.152766) can0 19FA0402#B21B7D7FF7122E00 (1410715046.155482) can0 19FA0402#B30000F2142215C2 (1410715046.158472) can0 19FA0402#B4B88D1156000000 (1410715046.161494) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715046.164759) can0 0DF80502#A02F19C73F30C653 (1410715046.167475) can0 0DF80502#A12480EF4162E342 (1410715046.170466) can0 0DF80502#A2430580294BBAD9 (1410715046.173457) can0 0DF80502#A3B931031D9A9D02 (1410715046.176844) can0 0DF80502#A40000000013FC0C (1410715046.179469) can0 0DF80502#A549008000AC0D00 (1410715046.182490) can0 0DF80502#A60000FFFFFFFFFF (1410715046.185450) can0 09F80102#72719A16381BB80D (1410715046.217524) can0 09F80202#1AFC00000300FFFF (1410715046.242518) can0 09F80102#72719A16381BB80D (1410715046.342463) can0 09F80102#72719A16381BB80D (1410715046.442438) can0 09F80102#72719A16381BB80D (1410715046.453699) can0 0DF50B11#018C030000FFFFFF (1410715046.467585) can0 09F80202#1BFC00000300FFFF (1410715046.542384) can0 09F80102#72719A16381BB80D (1410715046.642329) can0 09F80102#72719A16381BB80D (1410715046.717341) can0 09F80202#1CFC00000300FFFF (1410715046.742518) can0 09F80102#72719A16381BB80D (1410715046.842310) can0 09F80102#72719A16381BB80D (1410715046.942316) can0 09F80102#72719A16381BB80D (1410715046.944331) can0 19F212B0#C00979000064FF18 (1410715046.944880) can0 19F212B0#C11C0A00FFFFFFFF (1410715046.945429) can0 19F214B0#00EC04C4FF697879 (1410715046.967554) can0 09F80202#1DFC00000300FFFF (1410715047.042292) can0 09F80102#72719A16381BB80D (1410715047.102381) can0 0DF01002#1EF0C73F40ED5324 (1410715047.105189) can0 19FA0302#1ED3490068006400 (1410715047.108149) can0 19FA0402#C0931EFD0C0B2D35 (1410715047.111506) can0 19FA0402#C108C5F412F5FFFF (1410715047.114161) can0 19FA0402#C2FFF220673070D7 (1410715047.117152) can0 19FA0402#C3F11201000000F2 (1410715047.120142) can0 19FA0402#C40E7F160B206611 (1410715047.123499) can0 19FA0402#C5DFFFFFFFF216DC (1410715047.126154) can0 19FA0402#C608AD2DE70FE9FF (1410715047.129145) can0 19FA0402#C7FFFFF2017F257C (1410715047.132166) can0 19FA0402#C8D91B12FFFFFFFF (1410715047.135493) can0 19FA0402#C9F21B8B09957419 (1410715047.138148) can0 19FA0402#CA12E4FFFFFFF217 (1410715047.141138) can0 19FA0402#CB7F07CE8D7211A5 (1410715047.144160) can0 19FA0402#CCFFFFFFF2042215 (1410715047.147486) can0 19FA0402#CDAAD2D40F3A0000 (1410715047.150141) can0 19FA0402#CE00F21FE80A0A4D (1410715047.153193) can0 19FA0402#CFFC1036000000F2 (1410715047.156153) can0 19FA0402#D01C680313C7A30E (1410715047.159449) can0 19FA0402#D12C000000F213F3 (1410715047.162226) can0 19FA0402#D21B7D7FD6122D00 (1410715047.165156) can0 19FA0402#D30000F2142215C2 (1410715047.168146) can0 19FA0402#D4B8C41146000000 (1410715047.171503) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715047.174158) can0 0DF80502#C02F1EC73F40ED53 (1410715047.177149) can0 0DF80502#C12480EF4162E342 (1410715047.180140) can0 0DF80502#C2430580294BBAD9 (1410715047.183497) can0 0DF80502#C3B931031D9A9D02 (1410715047.186152) can0 0DF80502#C40000000013FC0C (1410715047.189143) can0 0DF80502#C549008000AC0D00 (1410715047.192164) can0 0DF80502#C60000FFFFFFFFFF (1410715047.195490) can0 09F80102#72719A16381BB80D (1410715047.226282) can0 09F80202#1FFC00000700FFFF (1410715047.251521) can0 09F80102#72719A16381BB80D (1410715047.351496) can0 09F80102#72719A16381BB80D (1410715047.451472) can0 09F80102#72719A16381BB80D (1410715047.476099) can0 09F80202#20FC00000700FFFF (1410715047.551051) can0 09F80102#72719A16381BB80D (1410715047.555323) can0 0DF50B11#018F030000FFFFFF (1410715047.651026) can0 09F80102#72719A16381BB80D (1410715047.726191) can0 09F80202#21FC00000700FFFF (1410715047.729426) can0 11F80E01#C01B01985B620E80 (1410715047.729975) can0 11F80E01#C1C6C20D60B99916 (1410715047.730524) can0 11F80E01#C2C4A5A4000051C0 (1410715047.731104) can0 11F80E01#C300FFFFFF7F00FE (1410715047.751002) can0 09F80102#72719A16381BB80D (1410715047.850947) can0 09F80102#72719A16381BB80D (1410715047.950922) can0 09F80102#72719A16381BB80D (1410715047.975947) can0 09F80202#22FC00000700FFFF (1410715048.050898) can0 09F80102#72719A16381BB80D (1410715048.063013) can0 0DF01002#23F0C73F50145424 (1410715048.066157) can0 19FA0302#23D3490068006400 (1410715048.068873) can0 19FA0402#E09323FD0C0B2D35 (1410715048.071864) can0 19FA0402#E108C5DC11F2FFFF (1410715048.074854) can0 19FA0402#E2FFF220673070D7 (1410715048.078089) can0 19FA0402#E35E1300000000F2 (1410715048.093745) can0 19FA0402#E40E7F160B207A11 (1410715048.095850) can0 19FA0402#E5DFFFFFFFF216DC (1410715048.098841) can0 19FA0402#E608AD2DCA0FEDFF (1410715048.102229) can0 19FA0402#E7FFFFF2017F257C (1410715048.104853) can0 19FA0402#E8D9D71206000000 (1410715048.107844) can0 19FA0402#E9F21B8B09957417 (1410715048.110865) can0 19FA0402#EA12E3FFFFFFF217 (1410715048.114130) can0 19FA0402#EB7F07CE8D8F11A0 (1410715048.116877) can0 19FA0402#ECFFFFFFF2042215 (1410715048.119837) can0 19FA0402#EDAAD208102A0000 (1410715048.122828) can0 19FA0402#EE00F21FE80A0A4D (1410715048.126154) can0 19FA0402#EFDF1036000000F2 (1410715048.128870) can0 19FA0402#F01C680313C7B50E (1410715048.131831) can0 19FA0402#F12B000000F213F3 (1410715048.134821) can0 19FA0402#F21B7D7FD2123200 (1410715048.138087) can0 19FA0402#F30000F2142215C2 (1410715048.140894) can0 19FA0402#F4B85E1141000000 (1410715048.143885) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715048.146815) can0 0DF80502#E02F23C73F501454 (1410715048.150141) can0 0DF80502#E12480EF4162E342 (1410715048.152827) can0 0DF80502#E2430580294BBAD9 (1410715048.155817) can0 0DF80502#E3B931031D9A9D02 (1410715048.158839) can0 0DF80502#E40000000013FC0C (1410715048.162196) can0 0DF80502#E549008000AC0D00 (1410715048.164851) can0 0DF80502#E60000FFFFFFFFFF (1410715048.167841) can0 09F80102#72719A16381BB80D (1410715048.187891) can0 09F80202#24FC00000600FFFF (1410715048.212855) can0 09F80102#72719A16381BB80D (1410715048.312861) can0 09F80102#72719A16381BB80D (1410715048.412867) can0 09F80102#72719A16381BB80D (1410715048.438074) can0 09F80202#25FC00000600FFFF (1410715048.444300) can0 19F212B0#E00988000064FF15 (1410715048.444880) can0 19F212B0#E11C0900FFFFFFFF (1410715048.445429) can0 19F214B0#00EB04C4FF667888 (1410715048.512843) can0 09F80102#72719A16381BB80D (1410715048.556757) can0 0DF50B11#018F030000FFFFFF (1410715048.612849) can0 09F80102#72719A16381BB80D (1410715048.687739) can0 09F80202#26FC00000600FFFF (1410715048.712855) can0 09F80102#72719A16381BB80D (1410715048.812861) can0 09F80102#72719A16381BB80D (1410715048.912867) can0 09F80102#72719A16381BB80D (1410715048.937647) can0 09F80202#27FC00000600FFFF (1410715049.012843) can0 09F80102#72719A16381BB80D (1410715049.072199) can0 0DF01002#28F0C73F603B5424 (1410715049.074549) can0 19FA0302#28D3490068006400 (1410715049.077540) can0 19FA0402#009328FD0C0B2D35 (1410715049.080866) can0 19FA0402#0108C51D12F7FFFF (1410715049.083521) can0 19FA0402#02FFF220673070D7 (1410715049.086542) can0 19FA0402#03971204000000F2 (1410715049.089533) can0 19FA0402#040E7F160B205211 (1410715049.092829) can0 19FA0402#05DCFFFFFFF216DC (1410715049.095545) can0 19FA0402#0608AD2DAC0FF3FF (1410715049.098536) can0 19FA0402#07FFFFF2017F257C (1410715049.101557) can0 19FA0402#08D9BA12FEFFFFFF (1410715049.104792) can0 19FA0402#09F21B8B09957427 (1410715049.107539) can0 19FA0402#0A12E3FFFFFFF217 (1410715049.110529) can0 19FA0402#0B7F07CE8D8B11A2 (1410715049.113520) can0 19FA0402#0CFFFFFFF2042215 (1410715049.116877) can0 19FA0402#0DAAD26C101B0000 (1410715049.119532) can0 19FA0402#0E00F21FE80A0A4D (1410715049.122523) can0 19FA0402#0FC81033000000F2 (1410715049.125544) can0 19FA0402#101C680313C7BA0E (1410715049.128901) can0 19FA0402#1127000000F213F3 (1410715049.131525) can0 19FA0402#121B7D7FEB122C00 (1410715049.134516) can0 19FA0402#130000F2142215C2 (1410715049.137507) can0 19FA0402#14B8A5113D000000 (1410715049.140955) can0 19FA0402#15F2FFFFFFFFFFFF (1410715049.143580) can0 0DF80502#002F28C73F603B54 (1410715049.146510) can0 0DF80502#012480EF4162E342 (1410715049.149531) can0 0DF80502#02430580294BBAD9 (1410715049.152827) can0 0DF80502#03B931031D9A9D02 (1410715049.155543) can0 0DF80502#040000000013FC0C (1410715049.158533) can0 0DF80502#0549008000AC0D00 (1410715049.161524) can0 0DF80502#060000FFFFFFFFFF (1410715049.164820) can0 09F80102#72719A16381BB80D (1410715049.196925) can0 09F80202#29FC00000400FFFF (1410715049.217432) can0 1DEFFF01#C00AE598B6060404 (1410715049.218012) can0 1DEFFF01#C100000002FFFFFF (1410715049.221522) can0 09F80102#72719A16381BB80D (1410715049.321497) can0 09F80102#72719A16381BB80D (1410715049.421473) can0 09F80102#72719A16381BB80D (1410715049.446528) can0 09F80202#2AFC00000400FFFF (1410715049.521448) can0 09F80102#72719A16381BB80D (1410715049.558131) can0 0DF50B11#018F030000FFFFFF (1410715049.621394) can0 09F80102#72719A16381BB80D (1410715049.696406) can0 09F80202#2BFC00000400FFFF (1410715049.721369) can0 09F80102#72719A16381BB80D (1410715049.821345) can0 09F80102#72719A16381BB80D (1410715049.921320) can0 09F80102#72719A16381BB80D (1410715049.944331) can0 19F212B0#000997000064FF11 (1410715049.944910) can0 19F212B0#011C0800FFFFFFFF (1410715049.945460) can0 19F214B0#00EC04C4FF677897 (1410715049.946406) can0 09F80202#2CFC00000400FFFF (1410715050.021265) can0 09F80102#72719A16381BB80D (1410715050.129389) can0 0DF01002#2DF0C73F70625424 (1410715050.132227) can0 19FA0302#2DD3490068006400 (1410715050.135523) can0 19FA0402#20932DFD0C0B2D35 (1410715050.138209) can0 19FA0402#2108C52012F9FFFF (1410715050.141199) can0 19FA0402#22FFF220673070D7 (1410715050.144221) can0 19FA0402#239F1207000000F2 (1410715050.147517) can0 19FA0402#240E7F160B207F11 (1410715050.150202) can0 19FA0402#25D9FFFFFFF216DC (1410715050.153193) can0 19FA0402#2608AD2DD00FF0FF (1410715050.156214) can0 19FA0402#27FFFFF2017F257C (1410715050.159449) can0 19FA0402#28D9FA12FFFFFFFF (1410715050.162226) can0 19FA0402#29F21B8B09957413 (1410715050.165186) can0 19FA0402#2A12E4FFFFFFF217 (1410715050.168208) can0 19FA0402#2B7F07CE8DA0119F (1410715050.171503) can0 19FA0402#2CFFFFFFF2042215 (1410715050.174189) can0 19FA0402#2DAAD2F3101B0000 (1410715050.177210) can0 19FA0402#2E00F21FE80A0A4D (1410715050.180201) can0 19FA0402#2FDE1034000000F2 (1410715050.183497) can0 19FA0402#301C680313C7FD0E (1410715050.186182) can0 19FA0402#3121000000F213F3 (1410715050.189204) can0 19FA0402#321B7D7FE3122500 (1410715050.192164) can0 19FA0402#330000F2142215C2 (1410715050.195521) can0 19FA0402#34B8951140000000 (1410715050.198206) can0 19FA0402#35F2FFFFFFFFFFFF (1410715050.201197) can0 0DF80502#202F2DC73F706254 (1410715050.204188) can0 0DF80502#212480EF4162E342 (1410715050.207514) can0 0DF80502#22430580294BBAD9 (1410715050.210169) can0 0DF80502#23B931031D9A9D02 (1410715050.213221) can0 0DF80502#240000000013FC0C (1410715050.216181) can0 0DF80502#2549008000AC0D00 (1410715050.219477) can0 0DF80502#260000FFFFFFFFFF (1410715050.222254) can0 09F80102#72719A16381BB80D (1410715050.254298) can0 09F80202#2EFC00000600FFFF (1410715050.279505) can0 09F80102#72719A16381BB80D (1410715050.379450) can0 09F80102#72719A16381BB80D (1410715050.479426) can0 09F80102#72719A16381BB80D (1410715050.504145) can0 09F80202#2FFC00000600FFFF (1410715053.047602) can0 09F80102#72719A16381BB80D (1410715053.057551) can0 0DF01002#3CF0C73FA0D75424 (1410715053.060297) can0 19FA0302#3CD3490068006400 (1410715053.063563) can0 19FA0402#80933CFD0C0B2D35 (1410715053.066309) can0 19FA0402#8108C54D12FDFFFF (1410715053.069270) can0 19FA0402#82FFF220673070D7 (1410715053.072291) can0 19FA0402#833612FAFFFFFFF2 (1410715053.075556) can0 19FA0402#840E7F160B20F611 (1410715053.078272) can0 19FA0402#85D5FFFFFFF216DC (1410715053.081263) can0 19FA0402#8608AD2D2110F0FF (1410715053.084284) can0 19FA0402#87FFFFF2017F257C (1410715053.087550) can0 19FA0402#88D9FC1202000000 (1410715053.090266) can0 19FA0402#89F21B8B09957413 (1410715053.093287) can0 19FA0402#8A12E5FFFFFFF217 (1410715053.096278) can0 19FA0402#8B7F07CE8DC211AB (1410715053.099512) can0 19FA0402#8CFFFFFFF2042215 (1410715053.102290) can0 19FA0402#8DAAD24111170000 (1410715053.105280) can0 19FA0402#8E00F21FE80A0A4D (1410715053.109064) can0 19FA0402#8F731038000000F2 (1410715053.111536) can0 19FA0402#901C680313C7810E (1410715053.114283) can0 19FA0402#911D000000F213F3 (1410715053.117274) can0 19FA0402#921B7D7F0E132C00 (1410715053.120264) can0 19FA0402#930000F2142215C2 (1410715053.123560) can0 19FA0402#94B81B1242000000 (1410715053.126276) can0 19FA0402#95F2FFFFFFFFFFFF (1410715053.129267) can0 0DF80502#802F3CC73FA0D754 (1410715053.132258) can0 0DF80502#812480EF4162E342 (1410715053.135615) can0 0DF80502#82430580294BBAD9 (1410715053.138270) can0 0DF80502#83B931031D9A9D02 (1410715053.141291) can0 0DF80502#840000000013FC0C (1410715053.144251) can0 0DF80502#8549008000AC0D00 (1410715053.147639) can0 0DF80502#860000FFFFFFFFFF (1410715053.150263) can0 09F80102#72719A16381BB80D (1410715053.182337) can0 09F80202#3DFC00000400FFFF (1410715053.207606) can0 09F80102#72719A16381BB80D (1410715053.307673) can0 09F80102#72719A16381BB80D (1410715053.407587) can0 09F80102#72719A16381BB80D (1410715053.432246) can0 09F80202#3EFC00000400FFFF (1410715053.507563) can0 09F80102#72719A16381BB80D (1410715053.564143) can0 0DF50B11#0192030000FFFFFF (1410715053.607508) can0 09F80102#72719A16381BB80D (1410715053.682337) can0 09F80202#3FFC00000400FFFF (1410715053.707117) can0 09F80102#72719A16381BB80D (1410715053.807063) can0 09F80102#72719A16381BB80D (1410715053.907038) can0 09F80102#72719A16381BB80D (1410715053.932063) can0 09F80202#40FC00000400FFFF (1410715054.007014) can0 09F80102#72719A16381BB80D (1410715054.066218) can0 0DF01002#41F0C73FB0FE5424 (1410715054.068995) can0 19FA0302#41D3490068006400 (1410715054.071955) can0 19FA0402#A09341FD0C0B2D35 (1410715054.096094) can0 19FA0402#A108C55211060000 (1410715054.098933) can0 19FA0402#A200F220673070D7 (1410715054.102808) can0 19FA0402#A36512F9FFFFFFF2 (1410715054.104945) can0 19FA0402#A40E7F160B200212 (1410715054.109278) can0 19FA0402#A5D0FFFFFFF216DC (1410715054.111933) can0 19FA0402#A608AD2D4810ECFF (1410715054.115687) can0 19FA0402#A7FFFFF2017F257C (1410715054.118159) can0 19FA0402#A8D999120C000000 (1410715054.122462) can0 19FA0402#A9F21B8B09957429 (1410715054.124934) can0 19FA0402#AA12E4FFFFFFF217 (1410715054.129115) can0 19FA0402#AB7F07CE8DE111AA (1410715054.131953) can0 19FA0402#ACFFFFFFF2042215 (1410715054.135706) can0 19FA0402#ADAAD2BB11130000 (1410715054.138148) can0 19FA0402#AE00F21FE80A0A4D (1410715054.142573) can0 19FA0402#AF7F103A000000F2 (1410715054.144923) can0 19FA0402#B01C680313C7620E (1410715054.149134) can0 19FA0402#B118000000F213F3 (1410715054.151942) can0 19FA0402#B21B7D7FC3123200 (1410715054.155665) can0 19FA0402#B30000F2142215C2 (1410715054.158167) can0 19FA0402#B4B8A1114E000000 (1410715054.168024) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715054.170924) can0 0DF80502#A02F41C73FB0FE54 (1410715054.174219) can0 0DF80502#A12480EF4162E342 (1410715054.176905) can0 0DF80502#A2430580294BBAD9 (1410715054.179926) can0 0DF80502#A3B931031D9A9D02 (1410715054.182948) can0 0DF80502#A40000000013FC0C (1410715054.186213) can0 0DF80502#A549008000AC0D00 (1410715054.189021) can0 0DF80502#A60000FFFFFFFFFF (1410715054.191920) can0 09F80102#72719A16381BB80D (1410715054.194941) can0 09F80202#42FC00000300FFFF (1410715054.214930) can0 09F80102#72719A16381BB80D (1410715054.217066) can0 1DEFFF01#E00AE598B6060404 (1410715054.217646) can0 1DEFFF01#E100000002FFFFFF (1410715054.314906) can0 09F80102#72719A16381BB80D (1410715054.414881) can0 09F80102#72719A16381BB80D (1410715054.439936) can0 09F80202#43FC00000300FFFF (1410715054.444392) can0 19F212B0#6009C4000064FF0D (1410715054.444971) can0 19F212B0#611C0900FFFFFFFF (1410715054.445521) can0 19F214B0#00EC04C4FF6678C4 (1410715054.514857) can0 09F80102#72719A16381BB80D (1410715054.565607) can0 0DF50B11#018F030000FFFFFF (1410715054.578486) can0 11F80E01#401B0188F64A0E90 (1410715054.579035) can0 11F80E01#41FDB80D00059A16 (1410715054.579615) can0 11F80E01#42DCFFFF00002340 (1410715054.580164) can0 11F80E01#4300154F000000FE (1410715054.614832) can0 09F80102#72719A16381BB80D (1410715054.689814) can0 09F80202#44FC00000300FFFF (1410715054.714808) can0 09F80102#72719A16381BB80D (1410715054.769617) can0 19FB0201#C04B0588F64A0EEE (1410715054.770167) can0 19FB0201#C165710053564135 (1410715054.770716) can0 19FB0201#C23336394E494B4F (1410715054.771265) can0 19FB0201#C34C414F53204B20 (1410715054.771815) can0 19FB0201#C420202020202020 (1410715054.772395) can0 19FB0201#C5202046E4027800 (1410715054.772944) can0 19FB0201#C63C009402C63F00 (1410715054.773493) can0 19FB0201#C7617A2440014B41 (1410715054.774042) can0 19FB0201#C84C414D414B4920 (1410715054.774592) can0 19FB0201#C920202020202020 (1410715054.775172) can0 19FB0201#CA2020202004E0FF (1410715054.814753) can0 09F80102#72719A16381BB80D (1410715054.914729) can0 09F80102#72719A16381BB80D (1410715054.929865) can0 19FB0201#E04B0588F64A0EEE (1410715054.930415) can0 19FB0201#E165710053564135 (1410715054.930933) can0 19FB0201#E23336394E494B4F (1410715054.931483) can0 19FB0201#E34C414F53204B20 (1410715054.932063) can0 19FB0201#E420202020202020 (1410715054.932612) can0 19FB0201#E5202046E4027800 (1410715054.933161) can0 19FB0201#E63C009402C63F00 (1410715054.933710) can0 19FB0201#E7617A2440014B41 (1410715054.934260) can0 19FB0201#E84C414D414B4920 (1410715054.934840) can0 19FB0201#E920202020202020 (1410715054.935419) can0 19FB0201#EA2020202004E1FF (1410715054.939753) can0 09F80202#45FC00000300FFFF (1410715055.014704) can0 09F80102#72719A16381BB80D (1410715055.076411) can0 0DF01002#46F0C73FC0255524 (1410715055.078638) can0 19FA0302#46D3490068006400 (1410715055.081629) can0 19FA0402#C09346FD0C0B2D35 (1410715055.084864) can0 19FA0402#C108C57712010000 (1410715055.087641) can0 19FA0402#C200F220673070D7 (1410715055.090662) can0 19FA0402#C3AB12FAFFFFFFF2 (1410715055.093623) can0 19FA0402#C40E7F160B20B711 (1410715055.096918) can0 19FA0402#C5CAFFFFFFF216DC (1410715055.099635) can0 19FA0402#C608AD2D4010F2FF (1410715055.102656) can0 19FA0402#C7FFFFF2017F257C (1410715055.105646) can0 19FA0402#C8D94E120E000000 (1410715055.109003) can0 19FA0402#C9F21B8B09957422 (1410715055.111628) can0 19FA0402#CA12E2FFFFFFF217 (1410715055.114619) can0 19FA0402#CB7F07CE8DCD11AA (1410715055.117640) can0 19FA0402#CCFFFFFFF2042215 (1410715055.120936) can0 19FA0402#CDAAD2AB110D0000 (1410715055.123621) can0 19FA0402#CE00F21FE80A0A4D (1410715055.126643) can0 19FA0402#CF5C103E000000F2 (1410715055.129633) can0 19FA0402#D01C680313C79F0D (1410715055.132899) can0 19FA0402#D126000000F213F3 (1410715055.135615) can0 19FA0402#D21B7D7F44123500 (1410715055.138605) can0 19FA0402#D30000F2142215C2 (1410715055.141627) can0 19FA0402#D4B805124E000000 (1410715055.144892) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715055.147608) can0 0DF80502#C02F46C73FC02555 (1410715055.150629) can0 0DF80502#C12480EF4162E342 (1410715055.153620) can0 0DF80502#C2430580294BBAD9 (1410715055.156916) can0 0DF80502#C3B931031D9A9D02 (1410715055.159632) can0 0DF80502#C40000000013FC0C (1410715055.162623) can0 0DF80502#C549008000AC0D00 (1410715055.165644) can0 0DF80502#C60000FFFFFFFFFF (1410715055.169459) can0 09F80102#72719A16381BB80D (1410715055.200983) can0 09F80202#47FC00000900FFFF (1410715055.225642) can0 09F80102#72719A16381BB80D (1410715055.325587) can0 09F80102#72719A16381BB80D (1410715055.425562) can0 09F80102#72719A16381BB80D (1410715055.450617) can0 09F80202#48FC00000900FFFF (1410715055.525538) can0 09F80102#72719A16381BB80D (1410715055.567561) can0 0DF50B11#018F030000FFFFFF (1410715055.625513) can0 09F80102#72719A16381BB80D (1410715055.700495) can0 09F80202#49FC00000900FFFF (1410715055.725489) can0 09F80102#72719A16381BB80D (1410715055.825434) can0 09F80102#72719A16381BB80D (1410715055.925410) can0 09F80102#72719A16381BB80D (1410715055.944422) can0 19F212B0#8009D3000064FF0F (1410715055.945002) can0 19F212B0#811C0A00FFFFFFFF (1410715055.945551) can0 19F214B0#00E404C5FF6C78D3 (1410715055.950434) can0 09F80202#4AFC00000900FFFF (1410715056.025385) can0 09F80102#72719A16381BB80D (1410715056.085444) can0 0DF01002#4BF0C73FD04C5524 (1410715056.088313) can0 19FA0302#4BD3490068006400 (1410715056.091547) can0 19FA0402#E0934BFD0C0B2D35 (1410715056.094324) can0 19FA0402#E108C5A711030000 (1410715056.097315) can0 19FA0402#E200F220673070D7 (1410715056.100336) can0 19FA0402#E3C412F9FFFFFFF2 (1410715056.103510) can0 19FA0402#E40E7F160B20F411 (1410715056.106318) can0 19FA0402#E5C9FFFFFFF216DC (1410715056.109309) can0 19FA0402#E608AD2D7B0FFBFF (1410715056.112330) can0 19FA0402#E7FFFFF2017F257C (1410715056.115565) can0 19FA0402#E8D9D51207000000 (1410715056.118311) can0 19FA0402#E9F21B8B09957431 (1410715056.121333) can0 19FA0402#EA12E3FFFFFFF217 (1410715056.124293) can0 19FA0402#EB7F07CE8DD811A6 (1410715056.127558) can0 19FA0402#ECFFFFFFF2042215 (1410715056.130305) can0 19FA0402#EDAAD2A811120000 (1410715056.133295) can0 19FA0402#EE00F21FE80A0A4D (1410715056.136317) can0 19FA0402#EF87103E000000F2 (1410715056.139521) can0 19FA0402#F01C680313C7630D (1410715056.142359) can0 19FA0402#F11B000000F213F3 (1410715056.145289) can0 19FA0402#F21B7D7F4D123800 (1410715056.148280) can0 19FA0402#F30000F2142215C2 (1410715056.151575) can0 19FA0402#F4B80F124A000000 (1410715056.154322) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715056.157313) can0 0DF80502#E02F4BC73FD04C55 (1410715056.160303) can0 0DF80502#E12480EF4162E342 (1410715056.163508) can0 0DF80502#E2430580294BBAD9 (1410715056.166285) can0 0DF80502#E3B931031D9A9D02 (1410715056.174647) can0 0DF80502#E40000000013FC0C (1410715056.177302) can0 0DF80502#E549008000AC0D00 (1410715056.180323) can0 0DF80502#E60000FFFFFFFFFF (1410715056.183527) can0 09F80102#72719A16381BB80D (1410715056.209345) can0 09F80202#4CFC00000800FFFF (1410715056.234309) can0 09F80102#72719A16381BB80D (1410715056.334315) can0 09F80102#72719A16381BB80D (1410715056.434260) can0 09F80102#72719A16381BB80D (1410715056.459589) can0 09F80202#4DFC00000800FFFF (1410715056.534266) can0 09F80102#72719A16381BB80D (1410715056.569086) can0 0DF50B11#018F030000FFFFFF (1410715056.634272) can0 09F80102#72719A16381BB80D (1410715056.709223) can0 09F80202#4EFC00000800FFFF (1410715056.734278) can0 09F80102#72719A16381BB80D (1410715056.834284) can0 09F80102#72719A16381BB80D (1410715056.934290) can0 09F80102#72719A16381BB80D (1410715056.959132) can0 09F80202#4FFC00000800FFFF (1410715057.034266) can0 09F80102#72719A16381BB80D (1410715057.098536) can0 0DF01002#50F0C73FE0735524 (1410715057.101008) can0 19FA0302#50D3490068006400 (1410715057.103999) can0 19FA0402#009350FD0C0B2D35 (1410715057.106989) can0 19FA0402#0108C56911FFFFFF (1410715057.110194) can0 19FA0402#02FFF220673070D7 (1410715057.113001) can0 19FA0402#03D412FAFFFFFFF2 (1410715057.115992) can0 19FA0402#040E7F160B20E711 (1410715057.119013) can0 19FA0402#05CAFFFFFFF216DC (1410715057.122340) can0 19FA0402#0608AD2D4A10E7FF (1410715057.124995) can0 19FA0402#07FFFFF2017F257C (1410715057.128016) can0 19FA0402#08D9B012F9FFFFFF (1410715057.130976) can0 19FA0402#09F21B8B0995742C (1410715057.134302) can0 19FA0402#0A12DFFFFFFFF217 (1410715057.136988) can0 19FA0402#0B7F07CE8D8E119E (1410715057.140009) can0 19FA0402#0CFFFFFFF2042215 (1410715057.142969) can0 19FA0402#0DAAD2BA110C0000 (1410715057.146326) can0 19FA0402#0E00F21FE80A0A4D (1410715057.149012) can0 19FA0402#0FBF103A000000F2 (1410715057.151972) can0 19FA0402#101C680313C7860D (1410715057.154993) can0 19FA0402#1110000000F213F3 (1410715057.158167) can0 19FA0402#121B7D7FA6123200 (1410715057.160975) can0 19FA0402#130000F2142215C2 (1410715057.163996) can0 19FA0402#14B8A3114E000000 (1410715057.167017) can0 19FA0402#15F2FFFFFFFFFFFF (1410715057.170191) can0 0DF80502#002F50C73FE07355 (1410715057.172968) can0 0DF80502#012480EF4162E342 (1410715057.176051) can0 0DF80502#02430580294BBAD9 (1410715057.178980) can0 0DF80502#03B931031D9A9D02 (1410715057.182398) can0 0DF80502#040000000013FC0C (1410715057.184992) can0 0DF80502#0549008000AC0D00 (1410715057.188013) can0 0DF80502#060000FFFFFFFFFF (1410715057.190974) can0 09F80102#72719A16381BB80D (1410715057.223017) can0 09F80202#51FC00000300FFFF (1410715057.248011) can0 09F80102#72719A16381BB80D (1410715057.347956) can0 09F80102#72719A16381BB80D (1410715057.444666) can0 19F212B0#A009E2000064FF0D (1410715057.445246) can0 19F212B0#A11C0A00FFFFFFFF (1410715057.445795) can0 19F214B0#00EC04C5FF6778E2 (1410715057.447962) can0 09F80102#72719A16381BB80D (1410715057.472956) can0 09F80202#52FC00000300FFFF (1410715057.547938) can0 09F80102#72719A16381BB80D (1410715057.647883) can0 09F80102#72719A16381BB80D (1410715057.670710) can0 0DF50B11#018F030000FFFFFF (1410715057.722865) can0 09F80202#53FC00000300FFFF (1410715057.747889) can0 09F80102#72719A16381BB80D (1410715057.847803) can0 09F80102#72719A16381BB80D (1410715057.948084) can0 09F80102#72719A16381BB80D (1410715057.972926) can0 09F80202#54FC00000300FFFF (1410715058.047724) can0 09F80102#72719A16381BB80D (1410715058.073359) can0 0DF01002#55F0C73FF09A5524 (1410715058.075709) can0 19FA0302#55D3490068006400 (1410715058.078699) can0 19FA0402#209355FD0C0B2D35 (1410715058.081690) can0 19FA0402#2108C58811F5FFFF (1410715058.084895) can0 19FA0402#22FFF220673070D7 (1410715058.087702) can0 19FA0402#23DD12EDFFFFFFF2 (1410715058.090693) can0 19FA0402#240E7F160B20E011 (1410715058.093684) can0 19FA0402#25C4FFFFFFF216DC (1410715058.096979) can0 19FA0402#2608AD2D6B10D6FF (1410715058.099696) can0 19FA0402#27FFFFF2017F257C (1410715058.102686) can0 19FA0402#28D91212F5FFFFFF (1410715058.105677) can0 19FA0402#29F21B8B09957459 (1410715058.108942) can0 19FA0402#2A12D8FFFFFFF217 (1410715058.111689) can0 19FA0402#2B7F07CE8DE4118F (1410715058.114680) can0 19FA0402#2CFFFFFFF2042215 (1410715058.117670) can0 19FA0402#2DAAD2DD10060000 (1410715058.120936) can0 19FA0402#2E00F21FE80A0A4D (1410715058.123682) can0 19FA0402#2FE91023000000F2 (1410715058.126673) can0 19FA0402#301C680313C7D00D (1410715058.129664) can0 19FA0402#3103000000F213F3 (1410715058.132868) can0 19FA0402#321B7D7F7E122C00 (1410715058.135676) can0 19FA0402#330000F2142215C2 (1410715058.138667) can0 19FA0402#34B8E71140000000 (1410715058.141718) can0 19FA0402#35F2FFFFFFFFFFFF (1410715058.144892) can0 0DF80502#202F55C73FF09A55 (1410715058.147700) can0 0DF80502#21248054320CE942 (1410715058.150660) can0 0DF80502#224305C091E9BAC6 (1410715058.153651) can0 0DF80502#23B931033ACAAB02 (1410715058.156947) can0 0DF80502#240000000013FC0C (1410715058.159693) can0 0DF80502#2549008000AC0D00 (1410715058.162684) can0 0DF80502#260000FFFFFFFFFF (1410715058.165644) can0 09F80102#8A719A16E71AB80D (1410715058.197718) can0 09F80202#56FC00000200FFFF (1410715058.222681) can0 09F80102#8A719A16E71AB80D (1410715058.322657) can0 09F80102#8A719A16E71AB80D (1410715058.422633) can0 09F80102#8A719A16E71AB80D (1410715058.447749) can0 09F80202#57FC00000200FFFF (1410715058.522608) can0 09F80102#8A719A16E71AB80D (1410715058.622584) can0 09F80102#8A719A16E71AB80D (1410715058.672205) can0 0DF50B11#018F030000FFFFFF (1410715058.697535) can0 09F80202#58FC00000200FFFF (1410715058.722529) can0 09F80102#8A719A16E71AB80D (1410715058.822474) can0 09F80102#8A719A16E71AB80D (1410715058.922449) can0 09F80102#8A719A16E71AB80D (1410715058.944453) can0 19F212B0#C009F1000064FF07 (1410715058.945002) can0 19F212B0#C11C0900FFFFFFFF (1410715058.945551) can0 19F214B0#00EC04C5FF5D78F1 (1410715058.947932) can0 09F80202#59FC00000200FFFF (1410715059.022425) can0 09F80102#8A719A16E71AB80D (1410715059.088923) can0 0DF01002#5AF0C73F00C25524 (1410715059.091608) can0 19FA0302#5AD3490068006400 (1410715059.094386) can0 19FA0402#40935AFD0C0B2D35 (1410715059.097376) can0 19FA0402#4108C52C12F3FFFF (1410715059.100367) can0 19FA0402#42FFF220673070D7 (1410715059.103571) can0 19FA0402#431613F2FFFFFFF2 (1410715059.106348) can0 19FA0402#440E7F160B20E011 (1410715059.109370) can0 19FA0402#45D1FFFFFFF216DC (1410715059.112360) can0 19FA0402#4608AD2D0B10EBFF (1410715059.115626) can0 19FA0402#47FFFFF2017F257C (1410715059.118372) can0 19FA0402#48D9BD1100000000 (1410715059.121363) can0 19FA0402#49F21B8B0995743C (1410715059.124354) can0 19FA0402#4A12F4FFFFFFF217 (1410715059.127680) can0 19FA0402#4B7F07CE8D7E11A6 (1410715059.130366) can0 19FA0402#4CFFFFFFF2042215 (1410715059.133356) can0 19FA0402#4DAAD23811110000 (1410715059.136378) can0 19FA0402#4E00F21FE80A0A4D (1410715059.139582) can0 19FA0402#4FCF103A000000F2 (1410715059.142390) can0 19FA0402#501C680313C7980D (1410715059.145350) can0 19FA0402#5126000000F213F3 (1410715059.148341) can0 19FA0402#521B7D7F43123700 (1410715059.151606) can0 19FA0402#530000F2142215C2 (1410715059.154353) can0 19FA0402#54B887123C000000 (1410715059.157374) can0 19FA0402#55F2FFFFFFFFFFFF (1410715059.160365) can0 0DF80502#402F5AC73F00C255 (1410715059.163569) can0 0DF80502#41248054320CE942 (1410715059.166346) can0 0DF80502#424305C091E9BAC6 (1410715059.169337) can0 0DF80502#43B931033ACAAB02 (1410715059.172388) can0 0DF80502#440000000013FC0C (1410715059.175623) can0 0DF80502#4549008000AC0D00 (1410715059.178370) can0 0DF80502#460000FFFFFFFFFF (1410715059.181330) can0 09F80102#8A719A16E71AB80D (1410715059.213404) can0 09F80202#5BFC00000B00FFFF (1410715059.216761) can0 1DEFFF01#000AE598B6060404 (1410715059.217341) can0 1DEFFF01#0100000002FFFFFF (1410715059.238337) can0 09F80102#8A719A16E71AB80D (1410715059.338313) can0 09F80102#8A719A16E71AB80D (1410715059.438288) can0 09F80102#8A719A16E71AB80D (1410715059.463648) can0 09F80202#5CFC00000B00FFFF (1410715059.538264) can0 09F80102#8A719A16E71AB80D (1410715059.638239) can0 09F80102#8A719A16E71AB80D (1410715059.649073) can0 11F80E01#601B01985B620ED0 (1410715059.649592) can0 11F80E01#61C6C20D00B99916 (1410715059.650172) can0 11F80E01#6204A5A400001900 (1410715059.650751) can0 11F80E01#6308FFFFFF7F00FE (1410715059.680018) can0 0DF50B11#018F030000FFFFFF (1410715059.713282) can0 09F80202#5DFC00000B00FFFF (1410715059.738245) can0 09F80102#8A719A16E71AB80D (1410715059.838251) can0 09F80102#8A719A16E71AB80D (1410715059.938258) can0 09F80102#8A719A16E71AB80D (1410715059.963160) can0 09F80202#5EFC00000B00FFFF (1410715060.038233) can0 09F80102#8A719A16E71AB80D (1410715060.121607) can0 0DF01002#5FF0C73F10E95524 (1410715060.124049) can0 19FA0302#5FD3490068006400 (1410715060.127039) can0 19FA0402#60935FFD0C0B2D35 (1410715060.130213) can0 19FA0402#61AAC3AE11F5FFFF (1410715060.133051) can0 19FA0402#62FFF220673070D7 (1410715060.136042) can0 19FA0402#637712F6FFFFFFF2 (1410715060.139033) can0 19FA0402#640E7F160B20DA11 (1410715060.142420) can0 19FA0402#65D6FFFFFFF216DC (1410715060.145045) can0 19FA0402#6608AD2D6510EFFF (1410715060.148035) can0 19FA0402#67FFFFF2017F257C (1410715060.151057) can0 19FA0402#68D9E812FBFFFFFF (1410715060.154261) can0 19FA0402#69F21B8B099574F3 (1410715060.157038) can0 19FA0402#6A11EFFFFFFFF217 (1410715060.160029) can0 19FA0402#6B7F07CE8D7011A5 (1410715060.163050) can0 19FA0402#6CFFFFFFF2042215 (1410715060.166285) can0 19FA0402#6DAAD2E5101B0000 (1410715060.169032) can0 19FA0402#6E00F21FE80A0A4D (1410715060.172053) can0 19FA0402#6F0C1136000000F2 (1410715060.175013) can0 19FA0402#701C680313C7C90D (1410715060.178217) can0 19FA0402#7125000000F213F3 (1410715060.188898) can0 19FA0402#721B7D7F9B123900 (1410715060.191004) can0 19FA0402#730000F2142215C2 (1410715060.194300) can0 19FA0402#74B8B1113C000000 (1410715060.197047) can0 19FA0402#75F2FFFFFFFFFFFF (1410715060.200037) can0 0DF80502#602F5FC73F10E955 (1410715060.202998) can0 0DF80502#61248054320CE942 (1410715060.206263) can0 0DF80502#624305C091E9BAC6 (1410715060.209010) can0 0DF80502#63B931033ACAAB02 (1410715060.212031) can0 0DF80502#640000000013FC0C (1410715060.215021) can0 0DF80502#6549008000AC0D00 (1410715060.218256) can0 0DF80502#660000FFFFFFFFFF (1410715060.221003) can0 09F80102#8A719A16E71AB80D (1410715060.246333) can0 09F80202#60FC00000700FFFF (1410715060.271021) can0 09F80102#8A719A16E71AB80D (1410715060.370997) can0 09F80102#8A719A16E71AB80D (1410715060.444697) can0 19F212B0#E00905000064FF0D (1410715060.445277) can0 19F212B0#E11C0A00FFFFFFFF (1410715060.445856) can0 19F214B0#00EC04C5FF677805 (1410715060.471003) can0 09F80102#8A719A16E71AB80D (1410715060.495997) can0 09F80202#61FC00000700FFFF (1410715060.570917) can0 09F80102#8A719A16E71AB80D (1410715060.670893) can0 09F80102#8A719A16E71AB80D (1410715060.681605) can0 0DF50B11#018F030000FFFFFF (1410715060.746271) can0 09F80202#62FC00000700FFFF (1410715060.770869) can0 09F80102#8A719A16E71AB80D (1410715060.870844) can0 09F80102#8A719A16E71AB80D (1410715060.970820) can0 09F80102#8A719A16E71AB80D (1410715060.995814) can0 09F80202#63FC00000700FFFF (1410715061.009302) can0 11F80E01#801B0108975C0EF0 (1410715061.009821) can0 11F80E01#819BC50D40F39816 (1410715061.010401) can0 11F80E01#8201B86B050068C0 (1410715061.010950) can0 11F80E01#830042B1000000FE (1410715061.070765) can0 09F80102#8A719A16E71AB80D (1410715061.081293) can0 0DF01002#64F0C73F20105624 (1410715061.083735) can0 19FA0302#64D3490068006400 (1410715061.086726) can0 19FA0402#809364FD0C0B2D35 (1410715061.089747) can0 19FA0402#81AAC34411F7FFFF (1410715061.092890) can0 19FA0402#82FFF220673070D7 (1410715061.095759) can0 19FA0402#83CF12F7FFFFFFF2 (1410715061.098750) can0 19FA0402#840E7F160B20DC11 (1410715061.101740) can0 19FA0402#85D5FFFFFFF216DC (1410715061.104884) can0 19FA0402#8608AD2D5110F0FF (1410715061.107752) can0 19FA0402#87FFFFF2017F257C (1410715061.110743) can0 19FA0402#88D91C12F8FFFFFF (1410715061.113703) can0 19FA0402#89F21B8B099574CD (1410715061.116969) can0 19FA0402#8A11F0FFFFFFF217 (1410715061.119715) can0 19FA0402#8B7F07CE8D9411A4 (1410715061.122736) can0 19FA0402#8CFFFFFFF2042215 (1410715061.125727) can0 19FA0402#8DAAD280101F0000 (1410715061.129023) can0 19FA0402#8E00F21FE80A0A4D (1410715061.131739) can0 19FA0402#8F4D112E000000F2 (1410715061.134730) can0 19FA0402#901C680313C7AC0D (1410715061.137720) can0 19FA0402#9116000000F213F3 (1410715061.141016) can0 19FA0402#921B7D7FA7123A00 (1410715061.143702) can0 19FA0402#930000F2142215C2 (1410715061.146723) can0 19FA0402#94B806122F000000 (1410715061.149744) can0 19FA0402#95F2FFFFFFFFFFFF (1410715061.152888) can0 0DF80502#802F64C73F201056 (1410715061.155726) can0 0DF80502#81248054320CE942 (1410715061.158717) can0 0DF80502#824305C091E9BAC6 (1410715061.161707) can0 0DF80502#83B931033ACAAB02 (1410715061.164912) can0 0DF80502#840000000013FC0C (1410715061.167719) can0 0DF80502#8549008000AC0D00 (1410715061.170740) can0 0DF80502#860000FFFFFFFFFF (1410715061.173701) can0 09F80102#8A719A16E71AB80D (1410715061.205744) can0 09F80202#65FC00000300FFFF (1410715061.230708) can0 09F80102#8A719A16E71AB80D (1410715061.330683) can0 09F80102#8A719A16E71AB80D (1410715061.430659) can0 09F80102#8A719A16E71AB80D (1410715061.455775) can0 09F80202#66FC00000300FFFF (1410715061.530665) can0 09F80102#8A719A16E71AB80D (1410715061.630640) can0 09F80102#8A719A16E71AB80D (1410715061.683558) can0 0DF50B11#018C030000FFFFFF (1410715061.705622) can0 09F80202#67FC00000300FFFF (1410715061.730585) can0 09F80102#8A719A16E71AB80D (1410715061.809107) can0 11F80E01#A01B01A929C40CC0 (1410715061.809657) can0 11F80E01#A135B90D00FF9916 (1410715061.810206) can0 11F80E01#A20CCDF30000D608 (1410715061.810786) can0 11F80E01#A3017CCA000000FE (1410715061.830531) can0 09F80102#8A719A16E71AB80D (1410715061.930506) can0 09F80102#8A719A16E71AB80D (1410715061.944483) can0 19F212B0#000914000064FF0D (1410715061.945063) can0 19F212B0#011C0900FFFFFFFF (1410715061.945612) can0 19F214B0#00EC04C5FF667814 (1410715061.955714) can0 09F80202#68FC00000300FFFF (1410715062.030482) can0 09F80102#8A719A16E71AB80D (1410715062.089198) can0 0DF01002#69F0C73F30375624 (1410715062.091639) can0 19FA0302#69D3490068006400 (1410715062.094416) can0 19FA0402#A09369FD0C0B2D35 (1410715062.097407) can0 19FA0402#A1AAC3A611F2FFFF (1410715062.100428) can0 19FA0402#A2FFF220673070D7 (1410715062.103602) can0 19FA0402#A32A13F5FFFFFFF2 (1410715062.106409) can0 19FA0402#A40E7F160B20E311 (1410715062.109431) can0 19FA0402#A5D1FFFFFFF216DC (1410715062.112421) can0 19FA0402#A608AD2D4810F8FF (1410715062.115656) can0 19FA0402#A7FFFFF2017F257C (1410715062.118403) can0 19FA0402#A8D9D91108000000 (1410715062.121394) can0 19FA0402#A9F21B8B099574D6 (1410715062.124415) can0 19FA0402#AA11F1FFFFFFF217 (1410715062.127680) can0 19FA0402#AB7F07CE8D9611AD (1410715062.130396) can0 19FA0402#ACFFFFFFF2042215 (1410715062.133417) can0 19FA0402#ADAAD2AB111A0000 (1410715062.136408) can0 19FA0402#AE00F21FE80A0A4D (1410715062.139582) can0 19FA0402#AFEA1027000000F2 (1410715062.142420) can0 19FA0402#B01C680313C7520D (1410715062.145411) can0 19FA0402#B12C000000F213F3 (1410715062.148402) can0 19FA0402#B21B7D7F39123900 (1410715062.151667) can0 19FA0402#B30000F2142215C2 (1410715062.154414) can0 19FA0402#B4B8491230000000 (1410715062.157435) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715062.160395) can0 0DF80502#A02F69C73F303756 (1410715062.163569) can0 0DF80502#A1248054320CE942 (1410715062.166376) can0 0DF80502#A24305C091E9BAC6 (1410715062.169398) can0 0DF80502#A3B931033ACAAB02 (1410715062.172419) can0 0DF80502#A40000000013FC0C (1410715062.175654) can0 0DF80502#A549008000AC0D00 (1410715062.178431) can0 0DF80502#A60000FFFFFFFFFF (1410715062.181391) can0 09F80102#8A719A16E71AB80D (1410715062.213435) can0 09F80202#6AFC00000800FFFF (1410715062.238398) can0 09F80102#8A719A16E71AB80D (1410715062.338374) can0 09F80102#8A719A16E71AB80D (1410715062.438349) can0 09F80102#8A719A16E71AB80D (1410715062.463679) can0 09F80202#6BFC00000800FFFF (1410715062.538325) can0 09F80102#8A719A16E71AB80D (1410715062.638270) can0 09F80102#8A719A16E71AB80D (1410715062.684992) can0 0DF50B11#018C030000FFFFFF (1410715062.713343) can0 09F80202#6CFC00000800FFFF (1410715062.738276) can0 09F80102#8A719A16E71AB80D (1410715062.838282) can0 09F80102#8A719A16E71AB80D (1410715062.938288) can0 09F80102#8A719A16E71AB80D (1410715062.963221) can0 09F80202#6DFC00000800FFFF (1410715063.038294) can0 09F80102#8A719A16E71AB80D (1410715063.098536) can0 0DF01002#6EF0C73F405E5624 (1410715063.101099) can0 19FA0302#6ED3490068006400 (1410715063.104090) can0 19FA0402#C0936EFD0C0B2D35 (1410715063.107111) can0 19FA0402#C1AAC32812F2FFFF (1410715063.110255) can0 19FA0402#C2FFF220673070D7 (1410715063.113093) can0 19FA0402#C3FE12F6FFFFFFF2 (1410715063.116083) can0 19FA0402#C40E7F160B20E111 (1410715063.119105) can0 19FA0402#C5CCFFFFFFF216DC (1410715063.122431) can0 19FA0402#C608AD2D3810FCFF (1410715063.125117) can0 19FA0402#C7FFFFF2017F257C (1410715063.128107) can0 19FA0402#C8D91F120D000000 (1410715063.131068) can0 19FA0402#C9F21B8B0995741A (1410715063.134333) can0 19FA0402#CA12EAFFFFFFF217 (1410715063.137080) can0 19FA0402#CB7F07CE8DA611B6 (1410715063.140101) can0 19FA0402#CCFFFFFFF2042215 (1410715063.143092) can0 19FA0402#CDAAD26311150000 (1410715063.146296) can0 19FA0402#CE00F21FE80A0A4D (1410715063.149073) can0 19FA0402#CF341129000000F2 (1410715063.152064) can0 19FA0402#D01C680313C7510D (1410715063.155085) can0 19FA0402#D12C000000F213F3 (1410715063.158259) can0 19FA0402#D21B7D7F20123D00 (1410715063.161066) can0 19FA0402#D30000F2142215C2 (1410715063.164088) can0 19FA0402#D4B8061234000000 (1410715063.167109) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715063.170252) can0 0DF80502#C02F6EC73F405E56 (1410715063.173090) can0 0DF80502#C1248054320CE942 (1410715063.176081) can0 0DF80502#C24305C091E9BAC6 (1410715063.179072) can0 0DF80502#C3B931033ACAAB02 (1410715063.182459) can0 0DF80502#C40000000013FC0C (1410715063.185084) can0 0DF80502#C549008000AC0D00 (1410715063.188105) can0 0DF80502#C60000FFFFFFFFFF (1410715063.191065) can0 09F80102#8A719A16E71AB80D (1410715063.223139) can0 09F80202#6FFC00000800FFFF (1410715063.248072) can0 09F80102#8A719A16E71AB80D (1410715063.348048) can0 09F80102#8A719A16E71AB80D (1410715063.444483) can0 19F212B0#200923000064FF0D (1410715063.445063) can0 19F212B0#211C0800FFFFFFFF (1410715063.445612) can0 19F214B0#00EC04C5FF677823 (1410715063.448023) can0 09F80102#8A719A16E71AB80D (1410715063.473078) can0 09F80202#70FC00000800FFFF (1410715063.547999) can0 09F80102#8A719A16E71AB80D (1410715063.648005) can0 09F80102#8A719A16E71AB80D (1410715063.686427) can0 0DF50B11#018C030000FFFFFF (1410715063.722987) can0 09F80202#71FC00000800FFFF (1410715063.742792) can0 11F80E01#C01B0188F64A0EE0 (1410715063.743342) can0 11F80E01#C1FBB80DE0009A16 (1410715063.743922) can0 11F80E01#C210FFFF0000FB08 (1410715063.744471) can0 11F80E01#C309154F000000FE (1410715063.747950) can0 09F80102#8A719A16E71AB80D (1410715063.847926) can0 09F80102#8A719A16E71AB80D (1410715063.947962) can0 09F80102#8A719A16E71AB80D (1410715063.972987) can0 09F80202#72FC00000800FFFF (1410715064.047816) can0 09F80102#8A719A16E71AB80D (1410715064.065852) can0 0DF01002#73F0C73F50855624 (1410715064.068995) can0 19FA0302#73D3490068006400 (1410715064.071772) can0 19FA0402#E09373FD0C0B2D35 (1410715064.074793) can0 19FA0402#E1AAC3DB10FEFFFF (1410715064.076746) can0 11F80E01#E01B014875520E70 (1410715064.077296) can0 11F80E01#E1AE9E0D4038A716 (1410715064.077845) can0 11F80E01#E20C2ACBE3011CC0 (1410715064.078425) can0 11F80E01#E300B6C5000000FE (1410715064.078974) can0 19FA0402#E2FFF220673070D7 (1410715064.081049) can0 19FA0402#E3D712FCFFFFFFF2 (1410715064.083796) can0 19FA0402#E40E7F160B20C211 (1410715064.086787) can0 19FA0402#E5D3FFFFFFF216DC (1410715064.089777) can0 19FA0402#E608AD2D2D10FAFF (1410715064.092951) can0 19FA0402#E7FFFFF2017F257C (1410715064.095789) can0 19FA0402#E8D9871113000000 (1410715064.098780) can0 19FA0402#E9F21B8B09957410 (1410715064.101801) can0 19FA0402#EA12E1FFFFFFF217 (1410715064.104914) can0 19FA0402#EB7F07CE8DA511BF (1410715064.107783) can0 19FA0402#ECFFFFFFF2042215 (1410715064.110773) can0 19FA0402#EDAAD2C0111D0000 (1410715064.113795) can0 19FA0402#EE00F21FE80A0A4D (1410715064.116969) can0 19FA0402#EF22112B000000F2 (1410715064.119776) can0 19FA0402#F01C680313C7BA0D (1410715064.122767) can0 19FA0402#F121000000F213F3 (1410715064.125788) can0 19FA0402#F21B7D7F38124100 (1410715064.128992) can0 19FA0402#F30000F2142215C2 (1410715064.131770) can0 19FA0402#F4B81E1237000000 (1410715064.134791) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715064.137751) can0 0DF80502#E02F73C73F508556 (1410715064.141047) can0 0DF80502#E1248054320CE942 (1410715064.143763) can0 0DF80502#E24305C091E9BAC6 (1410715064.146754) can0 0DF80502#E3B931033ACAAB02 (1410715064.149805) can0 0DF80502#E40000000013FC0C (1410715064.152949) can0 0DF80502#E549008000AC0D00 (1410715064.155787) can0 0DF80502#E60000FFFFFFFFFF (1410715064.158747) can0 09F80102#8A719A16E71AB80D (1410715064.189814) can0 09F80202#74FC00000500FFFF (1410715064.215876) can0 09F80102#8A719A16E71AB80D (1410715064.216425) can0 1DEFFF01#200AE598B6060404 (1410715064.216975) can0 1DEFFF01#2100000002FFFFFF (1410715064.314753) can0 09F80102#8A719A16E71AB80D (1410715064.414698) can0 09F80102#8A719A16E71AB80D (1410715064.439722) can0 09F80202#75FC00000500FFFF (1410715064.514674) can0 09F80102#8A719A16E71AB80D (1410715064.614680) can0 09F80102#8A719A16E71AB80D (1410715064.675959) can0 11F80F01#A01A125C23220E60 (1410715064.676508) can0 11F80F01#A119B80D20729A16 (1410715064.677058) can0 11F80F01#A214F19C05000600 (1410715064.677637) can0 11F80F01#A310FFFF0074FFFF (1410715064.687922) can0 0DF50B11#018C030000FFFFFF (1410715064.689661) can0 09F80202#76FC00000500FFFF (1410715064.714655) can0 09F80102#8A719A16E71AB80D (1410715064.814631) can0 09F80102#8A719A16E71AB80D (1410715064.914545) can0 09F80102#8A719A16E71AB80D (1410715064.939722) can0 09F80202#77FC00000500FFFF (1410715064.944544) can0 19F212B0#400932000064FF09 (1410715064.945094) can0 19F212B0#411C0A00FFFFFFFF (1410715064.945643) can0 19F214B0#00EB04C5FF667832 (1410715065.014521) can0 09F80102#8A719A16E71AB80D (1410715065.092280) can0 0DF01002#78F0C73F60AC5624 (1410715065.094477) can0 19FA0302#78D3490068006400 (1410715065.097468) can0 19FA0402#009378FD0C0B2D35 (1410715065.100489) can0 19FA0402#01AAC3CF11FBFFFF (1410715065.103632) can0 19FA0402#02FFF220673070D7 (1410715065.106470) can0 19FA0402#03DC12FDFFFFFFF2 (1410715065.109461) can0 19FA0402#040E7F160B20B211 (1410715065.112482) can0 19FA0402#05CEFFFFFFF216DC (1410715065.115687) can0 19FA0402#0608AD2D3D10F0FF (1410715065.118494) can0 19FA0402#07FFFFF2017F257C (1410715065.121485) can0 19FA0402#08D9FB110D000000 (1410715065.124445) can0 19FA0402#09F21B8B099574EF (1410715065.127741) can0 19FA0402#0A11E1FFFFFFF217 (1410715065.130457) can0 19FA0402#0B7F07CE8DB611BC (1410715065.133448) can0 19FA0402#0CFFFFFFF2042215 (1410715065.136469) can0 19FA0402#0DAAD23C11160000 (1410715065.139643) can0 19FA0402#0E00F21FE80A0A4D (1410715065.142512) can0 19FA0402#0F271135000000F2 (1410715065.145441) can0 19FA0402#101C680313C7070E (1410715065.148463) can0 19FA0402#1127000000F213F3 (1410715065.151759) can0 19FA0402#121B7D7F8F123E00 (1410715065.154444) can0 19FA0402#130000F2142215C2 (1410715065.157465) can0 19FA0402#14B80F123F000000 (1410715065.160487) can0 19FA0402#15F2FFFFFFFFFFFF (1410715065.163630) can0 0DF80502#002F78C73F60AC56 (1410715065.166438) can0 0DF80502#01248054320CE942 (1410715065.169459) can0 0DF80502#024305C091E9BAC6 (1410715065.172449) can0 0DF80502#03B931033ACAAB02 (1410715065.175745) can0 0DF80502#040000000013FC0C (1410715065.178461) can0 0DF80502#0549008000AC0D00 (1410715065.181483) can0 0DF80502#060000FFFFFFFFFF (1410715065.184412) can0 09F80102#8A719A16E71AB80D (1410715065.216486) can0 09F80202#79FC00000400FFFF (1410715065.241450) can0 09F80102#8A719A16E71AB80D (1410715065.341425) can0 09F80102#8A719A16E71AB80D (1410715065.441401) can0 09F80102#8A719A16E71AB80D (1410715065.466456) can0 09F80202#7AFC00000400FFFF (1410715065.541346) can0 09F80102#8A719A16E71AB80D (1410715065.641352) can0 09F80102#8A719A16E71AB80D (1410715065.689326) can0 0DF50B11#018C030000FFFFFF (1410715065.716334) can0 09F80202#7BFC00000400FFFF (1410715065.741328) can0 09F80102#8A719A16E71AB80D (1410715065.841303) can0 09F80102#8A719A16E71AB80D (1410715065.941248) can0 09F80102#8A719A16E71AB80D (1410715065.966395) can0 09F80202#7CFC00000400FFFF (1410715066.041193) can0 09F80102#8A719A16E71AB80D (1410715066.055140) can0 0DF01002#7DF0C73F70D35624 (1410715066.058283) can0 19FA0302#7DD3490068006400 (1410715066.061152) can0 19FA0402#20937DFD0C0B2D35 (1410715066.064173) can0 19FA0402#21AAC3F210040000 (1410715066.067164) can0 19FA0402#2200F220673070D7 (1410715066.070277) can0 19FA0402#23D61203000000F2 (1410715066.073145) can0 19FA0402#240ED1150B20B211 (1410715066.076167) can0 19FA0402#25D6FFFFFFF216DC (1410715066.079157) can0 19FA0402#2608AD2D8610EEFF (1410715066.082392) can0 19FA0402#27FFFFF2017F257C (1410715066.085169) can0 19FA0402#28D9131212000000 (1410715066.088160) can0 19FA0402#29F21B8B099574E2 (1410715066.091151) can0 19FA0402#2A11E9FFFFFFF217 (1410715066.094416) can0 19FA0402#2B7F07CE8D0312BE (1410715066.097163) can0 19FA0402#2CFFFFFFF2042215 (1410715066.100153) can0 19FA0402#2DAAD2CB101C0000 (1410715066.103144) can0 19FA0402#2E00F21FE80A0A4D (1410715066.106379) can0 19FA0402#2F43113C000000F2 (1410715066.109156) can0 19FA0402#301C680313C7710E (1410715066.112147) can0 19FA0402#3125000000F213F3 (1410715066.115137) can0 19FA0402#321B7D7F7B123800 (1410715066.118281) can0 19FA0402#330000F2142215C2 (1410715066.121149) can0 19FA0402#34B83D1242000000 (1410715066.124171) can0 19FA0402#35F2FFFFFFFFFFFF (1410715066.127161) can0 0DF80502#202F7DC73F70D356 (1410715066.130274) can0 0DF80502#21248054320CE942 (1410715066.133143) can0 0DF80502#224305C091E9BAC6 (1410715066.136134) can0 0DF80502#23B931033ACAAB02 (1410715066.139185) can0 0DF80502#240000000013FC0C (1410715066.142420) can0 0DF80502#2549008000AC0D00 (1410715066.145167) can0 0DF80502#260000FFFFFFFFFF (1410715066.148127) can0 09F80102#8A719A16E71AB80D (1410715066.179194) can0 09F80202#7EFC00000200FFFF (1410715066.204157) can0 09F80102#8A719A16E71AB80D (1410715066.304102) can0 09F80102#8A719A16E71AB80D (1410715066.404078) can0 09F80102#8A719A16E71AB80D (1410715066.429102) can0 09F80202#7FFC00000200FFFF (1410715066.444575) can0 19F212B0#600941000064FF07 (1410715066.445124) can0 19F212B0#611C0900FFFFFFFF (1410715066.445673) can0 19F214B0#00ED04C5FF657841 (1410715066.504053) can0 09F80102#8A719A16E71AB80D (1410715066.556269) can0 11F80E01#001B0132D74A1020 (1410715066.556818) can0 11F80E01#0184E20D00629116 (1410715066.557368) can0 11F80E01#021A48BE86011C81 (1410715066.557948) can0 11F80E01#0300E5BE000000FE (1410715066.604029) can0 09F80102#8A719A16E71AB80D (1410715066.679041) can0 09F80202#80FC00000200FFFF (1410715066.690821) can0 0DF50B11#018C030000FFFFFF (1410715066.704035) can0 09F80102#8A719A16E71AB80D (1410715066.803980) can0 09F80102#8A719A16E71AB80D (1410715066.809351) can0 19FB0201#004B05985B620E05 (1410715066.809901) can0 19FB0201#01AC900053564136 (1410715066.810450) can0 19FB0201#0230333243485259 (1410715066.810999) can0 19FB0201#0353492020202020 (1410715066.811579) can0 19FB0201#0420202020202020 (1410715066.812128) can0 19FB0201#052020342C015A00 (1410715066.812708) can0 19FB0201#063C006E00F74000 (1410715066.813258) can0 19FB0201#076E0A1E5E015049 (1410715066.813807) can0 19FB0201#0852414555532020 (1410715066.814387) can0 19FB0201#0920202020202020 (1410715066.814936) can0 19FB0201#0A2020202004E0FF (1410715066.903956) can0 09F80102#8A719A16E71AB80D (1410715066.929072) can0 09F80202#81FC00000200FFFF (1410715067.003901) can0 09F80102#8A719A16E71AB80D (1410715067.064417) can0 0DF01002#82F0C73F80FA5624 (1410715067.066859) can0 19FA0302#82D3490068006400 (1410715067.069849) can0 19FA0402#409382FD0C0B2D35 (1410715067.072932) can0 19FA0402#41AAC35712FBFFFF (1410715067.075831) can0 19FA0402#42FFF220673070D7 (1410715067.078852) can0 19FA0402#437F1302000000F2 (1410715067.081843) can0 19FA0402#440ED1150B20CA11 (1410715067.084956) can0 19FA0402#45D7FFFFFFF216DC (1410715067.087824) can0 19FA0402#4608AD2D8A10E8FF (1410715067.090845) can0 19FA0402#47FFFFF2017F257C (1410715067.093836) can0 19FA0402#48D9351213000000 (1410715067.096979) can0 19FA0402#49F21B8B099574A7 (1410715067.099848) can0 19FA0402#4A11EAFFFFFFF217 (1410715067.102839) can0 19FA0402#4B7F07CE8DDE11BB (1410715067.105860) can0 19FA0402#4CFFFFFFF2042215 (1410715067.109003) can0 19FA0402#4DAAD225111A0000 (1410715067.111842) can0 19FA0402#4E00F21FE80A0A4D (1410715067.114832) can0 19FA0402#4F44112F000000F2 (1410715067.117823) can0 19FA0402#501C680313C7750E (1410715067.121058) can0 19FA0402#512A000000F213F3 (1410715067.123835) can0 19FA0402#521B7D7FE0113500 (1410715067.126826) can0 19FA0402#530000F2142215C2 (1410715067.129847) can0 19FA0402#54B8011246000000 (1410715067.132960) can0 19FA0402#55F2FFFFFFFFFFFF (1410715067.135828) can0 0DF80502#402F82C73F80FA56 (1410715067.138819) can0 0DF80502#41248054320CE942 (1410715067.141810) can0 0DF80502#424305C091E9BAC6 (1410715067.144953) can0 0DF80502#43B931033ACAAB02 (1410715067.147852) can0 0DF80502#440000000013FC0C (1410715067.150813) can0 0DF80502#4549008000AC0D00 (1410715067.153864) can0 0DF80502#460000FFFFFFFFFF (1410715067.156977) can0 09F80102#8A719A16E71AB80D (1410715067.189082) can0 09F80202#83FCC0A60C00FFFF (1410715067.213831) can0 09F80102#8A719A16E71AB80D (1410715067.313776) can0 09F80102#8A719A16E71AB80D (1410715067.413752) can0 09F80102#8A719A16E71AB80D (1410715067.438776) can0 09F80202#84FCC0A60C00FFFF (1410715067.513728) can0 09F80102#8A719A16E71AB80D (1410715067.613703) can0 09F80102#8A719A16E71AB80D (1410715067.689143) can0 09F80202#85FCC0A60C00FFFF (1410715067.713679) can0 09F80102#8A719A16E71AB80D (1410715067.792536) can0 0DF50B11#018C030000FFFFFF (1410715067.813624) can0 09F80102#8A719A16E71AB80D (1410715067.913599) can0 09F80102#8A719A16E71AB80D (1410715067.938654) can0 09F80202#86FCC0A60C00FFFF (1410715067.944544) can0 19F212B0#800950000064FF09 (1410715067.945094) can0 19F212B0#811C0900FFFFFFFF (1410715067.945643) can0 19F214B0#00EB04C5FF667850 (1410715068.013575) can0 09F80102#8A719A16E71AB80D (1410715068.084071) can0 0DF01002#87F0C73F90215724 (1410715068.086542) can0 19FA0302#87D3490068006400 (1410715068.089533) can0 19FA0402#609387FD0C0B2D35 (1410715068.092524) can0 19FA0402#61AAC3BB10FAFFFF (1410715068.095667) can0 19FA0402#62FFF220673070D7 (1410715068.098536) can0 19FA0402#639913F5FFFFFFF2 (1410715068.101527) can0 19FA0402#640ED1150B208111 (1410715068.104517) can0 19FA0402#65DCFFFFFFF216DC (1410715068.107783) can0 19FA0402#6608AD2DE110E8FF (1410715068.110529) can0 19FA0402#67FFFFF2017F257C (1410715068.113520) can0 19FA0402#68D992120F000000 (1410715068.116511) can0 19FA0402#69F21B8B09957496 (1410715068.119685) can0 19FA0402#6A11E6FFFFFFF217 (1410715068.122523) can0 19FA0402#6B7F07CE8DDF11BC (1410715068.125513) can0 19FA0402#6CFFFFFFF2042215 (1410715068.128504) can0 19FA0402#6DAAD27C111D0000 (1410715068.131708) can0 19FA0402#6E00F21FE80A0A4D (1410715068.134516) can0 19FA0402#6F39112E000000F2 (1410715068.137507) can0 19FA0402#701C680313C7EA0E (1410715068.140528) can0 19FA0402#7121000000F213F3 (1410715068.143671) can0 19FA0402#721B7D7FD1113600 (1410715068.146510) can0 19FA0402#730000F2142215C2 (1410715068.149531) can0 19FA0402#74B833124A000000 (1410715068.152521) can0 19FA0402#75F2FFFFFFFFFFFF (1410715068.155695) can0 0DF80502#602F87C73F902157 (1410715068.158503) can0 0DF80502#61248054320CE942 (1410715068.161494) can0 0DF80502#624305C091E9BAC6 (1410715068.164484) can0 0DF80502#63B931033ACAAB02 (1410715068.167780) can0 0DF80502#640000000013FC0C (1410715068.170527) can0 0DF80502#6549008000AC0D00 (1410715068.173518) can0 0DF80502#660000FFFFFFFFFF (1410715068.176478) can0 09F80102#8A719A16E71AB80D (1410715068.208552) can0 09F80202#88FC00000700FFFF (1410715068.233515) can0 09F80102#8A719A16E71AB80D (1410715068.289301) can0 11F80E01#201B01985B620E30 (1410715068.289851) can0 11F80E01#21C7C20DE0B89916 (1410715068.290400) can0 11F80E01#2228A5A400005D81 (1410715068.290980) can0 11F80E01#2300FFFFFF7F00FE (1410715068.333460) can0 09F80102#8A719A16E71AB80D (1410715068.433436) can0 09F80102#8A719A16E71AB80D (1410715068.458460) can0 09F80202#89FC00000700FFFF (1410715068.533411) can0 09F80102#8A719A16E71AB80D (1410715068.633387) can0 09F80102#8A719A16E71AB80D (1410715068.708399) can0 09F80202#8AFC00000700FFFF (1410715068.733393) can0 09F80102#8A719A16E71AB80D (1410715068.793970) can0 0DF50B11#018F030000FFFFFF (1410715068.833338) can0 09F80102#8A719A16E71AB80D (1410715068.933314) can0 09F80102#8A719A16E71AB80D (1410715068.958369) can0 09F80202#8BFC00000700FFFF (1410715069.033259) can0 09F80102#8A719A16E71AB80D (1410715069.092432) can0 0DF01002#8CF0C73FA0485724 (1410715069.095209) can0 19FA0302#8CD3490068006400 (1410715069.098292) can0 19FA0402#80938CFD0C0B2D35 (1410715069.101191) can0 19FA0402#81AAC34611020000 (1410715069.104212) can0 19FA0402#8200F220673070D7 (1410715069.107203) can0 19FA0402#832513F3FFFFFFF2 (1410715069.110316) can0 19FA0402#840ED1150B208111 (1410715069.113215) can0 19FA0402#85E1FFFFFFF216DC (1410715069.116206) can0 19FA0402#8608AD2DD810E6FF (1410715069.119227) can0 19FA0402#87FFFFF2017F257C (1410715069.122431) can0 19FA0402#88D9B7120B000000 (1410715069.125178) can0 19FA0402#89F21B8B09957494 (1410715069.128199) can0 19FA0402#8A11EEFFFFFFF217 (1410715069.131190) can0 19FA0402#8B7F07CE8DEB11B2 (1410715069.134547) can0 19FA0402#8CFFFFFFF2042215 (1410715069.137202) can0 19FA0402#8DAAD2A5110F0000 (1410715069.140192) can0 19FA0402#8E00F21FE80A0A4D (1410715069.143214) can0 19FA0402#8FBF1034000000F2 (1410715069.146418) can0 19FA0402#901C680313C70C0F (1410715069.149195) can0 19FA0402#911E000000F213F3 (1410715069.152186) can0 19FA0402#921B7D7FC7113A00 (1410715069.155177) can0 19FA0402#930000F2142215C2 (1410715069.158320) can0 19FA0402#94B871124B000000 (1410715069.161219) can0 19FA0402#95F2FFFFFFFFFFFF (1410715069.164179) can0 0DF80502#802F8CC73FA04857 (1410715069.167170) can0 0DF80502#81248054320CE942 (1410715069.170313) can0 0DF80502#824305C091E9BAC6 (1410715069.173182) can0 0DF80502#83B931033ACAAB02 (1410715069.176203) can0 0DF80502#840000000013FC0C (1410715069.179194) can0 0DF80502#8549008000AC0D00 (1410715069.182490) can0 0DF80502#860000FFFFFFFFFF (1410715069.185175) can0 09F80102#8A719A16E71AB80D (1410715069.216059) can0 1DEFFF01#400AE598B6060404 (1410715069.216608) can0 1DEFFF01#4100000002FFFFFF (1410715069.217341) can0 09F80202#8DFC00000800FFFF (1410715069.242487) can0 09F80102#8A719A16E71AB80D (1410715069.342493) can0 09F80102#8A719A16E71AB80D (1410715069.442469) can0 09F80102#8A719A16E71AB80D (1410715069.444575) can0 19F212B0#A0095F000064FF09 (1410715069.445124) can0 19F212B0#A11C0800FFFFFFFF (1410715069.445704) can0 19F214B0#00EB04C5FF66785F (1410715069.467188) can0 09F80202#8EFC00000800FFFF (1410715069.542475) can0 09F80102#8A719A16E71AB80D (1410715069.642481) can0 09F80102#8A719A16E71AB80D (1410715069.717097) can0 09F80202#8FFC00000800FFFF (1410715069.742487) can0 09F80102#8A719A16E71AB80D (1410715069.795435) can0 0DF50B11#018F030000FFFFFF (1410715069.842463) can0 09F80102#8A719A16E71AB80D (1410715069.942530) can0 09F80102#8A719A16E71AB80D (1410715069.967005) can0 09F80202#90FC00000800FFFF (1410715070.042384) can0 09F80102#8A719A16E71AB80D (1410715070.122858) can0 0DF01002#91F0C73FB06F5724 (1410715070.125880) can0 19FA0302#91D3490068006400 (1410715070.129053) can0 19FA0402#A09391FD0C0B2D35 (1410715070.131892) can0 19FA0402#A1AAC3C111020000 (1410715070.134882) can0 19FA0402#A200F220673070D7 (1410715070.137873) can0 19FA0402#A31D13F5FFFFFFF2 (1410715070.141077) can0 19FA0402#A40ED1150B20A911 (1410715070.143885) can0 19FA0402#A5DCFFFFFFF216DC (1410715070.146876) can0 19FA0402#A608AD2D4B10E9FF (1410715070.149897) can0 19FA0402#A7FFFFF2017F257C (1410715070.152979) can0 19FA0402#A8D9B1120C000000 (1410715070.155848) can0 19FA0402#A9F21B8B09957490 (1410715070.158869) can0 19FA0402#AA11E8FFFFFFF217 (1410715070.161860) can0 19FA0402#AB7F07CE8D9211B5 (1410715070.164973) can0 19FA0402#ACFFFFFFF2042215 (1410715070.167872) can0 19FA0402#ADAAD2B711060000 (1410715070.170863) can0 19FA0402#AE00F21FE80A0A4D (1410715070.173884) can0 19FA0402#AFD81033000000F2 (1410715070.177027) can0 19FA0402#B01C680313C70C0F (1410715070.179865) can0 19FA0402#B115000000F213F3 (1410715070.182856) can0 19FA0402#B21B7D7FF2113700 (1410715070.183405) can0 11F80E01#401B0108975C0EF0 (1410715070.183955) can0 11F80E01#419BC50D40F39816 (1410715070.184504) can0 11F80E01#4229156D0500D408 (1410715070.185053) can0 11F80E01#430942B1000000FE (1410715070.185877) can0 19FA0402#B30000F2142215C2 (1410715070.189021) can0 19FA0402#B4B88C1249000000 (1410715070.191889) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715070.194880) can0 0DF80502#A02F91C73FB06F57 (1410715070.197840) can0 0DF80502#A1248054320CE942 (1410715070.201075) can0 0DF80502#A24305C091E9BAC6 (1410715070.203852) can0 0DF80502#A3B931033ACAAB02 (1410715070.206873) can0 0DF80502#A40000000013FC0C (1410715070.209864) can0 0DF80502#A549008000AC0D00 (1410715070.212977) can0 0DF80502#A60000FFFFFFFFFF (1410715070.215845) can0 09F80102#8A719A16E71AB80D (1410715070.246912) can0 09F80202#92FC00000500FFFF (1410715070.271876) can0 09F80102#8A719A16E71AB80D (1410715070.371821) can0 09F80102#8A719A16E71AB80D (1410715070.471796) can0 09F80102#8A719A16E71AB80D (1410715070.497095) can0 09F80202#93FC00000500FFFF (1410715070.571772) can0 09F80102#8A719A16E71AB80D (1410715070.671778) can0 09F80102#8A719A16E71AB80D (1410715070.746790) can0 09F80202#94FC00000500FFFF (1410715070.771784) can0 09F80102#8A719A16E71AB80D (1410715070.797114) can0 0DF50B11#018F030000FFFFFF (1410715070.871790) can0 09F80102#8A719A16E71AB80D (1410715070.944605) can0 19F212B0#C0096E000064FF09 (1410715070.945185) can0 19F212B0#C11C0A00FFFFFFFF (1410715070.945734) can0 19F214B0#00EB04C4FF67786E (1410715070.971796) can0 09F80102#8A719A16E71AB80D (1410715070.997004) can0 09F80202#95FC00000500FFFF (1410715071.071833) can0 09F80102#8A719A16E71AB80D (1410715071.082423) can0 0DF01002#96F0C73FC0965724 (1410715071.084589) can0 19FA0302#96D3490068006400 (1410715071.087794) can0 19FA0402#C09396FD0C0B2D35 (1410715071.090571) can0 19FA0402#C1AAC31111000000 (1410715071.093562) can0 19FA0402#C200F220673070D7 (1410715071.096583) can0 19FA0402#C31E13F4FFFFFFF2 (1410715071.099665) can0 19FA0402#C40ED1150B208D11 (1410715071.102564) can0 19FA0402#C5E2FFFFFFF216DC (1410715071.105555) can0 19FA0402#C608AD2D8410F0FF (1410715071.108607) can0 19FA0402#C7FFFFF2017F257C (1410715071.111750) can0 19FA0402#C8D9DB1110000000 (1410715071.114558) can0 19FA0402#C9F21B8B0995748E (1410715071.117579) can0 19FA0402#CA11EBFFFFFFF217 (1410715071.120570) can0 19FA0402#CB7F07CE8D8E11B7 (1410715071.123713) can0 19FA0402#CCFFFFFFF2042215 (1410715071.126551) can0 19FA0402#CDAAD27110000000 (1410715071.129572) can0 19FA0402#CE00F21FE80A0A4D (1410715071.132563) can0 19FA0402#CFCE1035000000F2 (1410715071.135676) can0 19FA0402#D01C680313C73B0F (1410715071.138575) can0 19FA0402#D11F000000F213F3 (1410715071.141566) can0 19FA0402#D21B7D7F91123400 (1410715071.144556) can0 19FA0402#D30000F2142215C2 (1410715071.147822) can0 19FA0402#D4B851124E000000 (1410715071.150599) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715071.153559) can0 0DF80502#C02F96C73FC09657 (1410715071.156550) can0 0DF80502#C1248054320CE942 (1410715071.159663) can0 0DF80502#C24305C091E9BAC6 (1410715071.162531) can0 0DF80502#C3B931033ACAAB02 (1410715071.165553) can0 0DF80502#C40000000013FC0C (1410715071.168574) can0 0DF80502#C549008000AC0D00 (1410715071.171748) can0 0DF80502#C60000FFFFFFFFFF (1410715071.174525) can0 09F80102#8A719A16E71AB80D (1410715071.206599) can0 09F80202#97FC00000900FFFF (1410715071.231837) can0 09F80102#8A719A16E71AB80D (1410715071.331782) can0 09F80102#8A719A16E71AB80D (1410715071.431788) can0 09F80102#8A719A16E71AB80D (1410715071.456507) can0 09F80202#98FC00000900FFFF (1410715071.531763) can0 09F80102#8A719A16E71AB80D (1410715071.631800) can0 09F80102#8A719A16E71AB80D (1410715071.706507) can0 09F80202#99FC00000900FFFF (1410715071.731776) can0 09F80102#8A719A16E71AB80D (1410715071.798609) can0 0DF50B11#018F030000FFFFFF (1410715071.831751) can0 09F80102#8A719A16E71AB80D (1410715071.931696) can0 09F80102#8A719A16E71AB80D (1410715071.956355) can0 09F80202#9AFC00000900FFFF (1410715072.031733) can0 09F80102#8A719A16E71AB80D (1410715072.091700) can0 0DF01002#9BF0C73FD0BD5724 (1410715072.094477) can0 19FA0302#9BD3490068006400 (1410715072.097254) can0 19FA0402#E0939BFD0C0B2D35 (1410715072.100245) can0 19FA0402#E1AAC32211130000 (1410715072.103236) can0 19FA0402#E200F220673070D7 (1410715072.106409) can0 19FA0402#E3AC1201000000F2 (1410715072.109248) can0 19FA0402#E40ED1150B20B411 (1410715072.112269) can0 19FA0402#E5E0FFFFFFF216DC (1410715072.115260) can0 19FA0402#E608AD2D0E11F6FF (1410715072.118372) can0 19FA0402#E7FFFFF2017F257C (1410715072.121241) can0 19FA0402#E8D91A121A000000 (1410715072.124232) can0 19FA0402#E9F21B8B09957480 (1410715072.127253) can0 19FA0402#EA11F2FFFFFFF217 (1410715072.130366) can0 19FA0402#EB7F07CE8D8C11C9 (1410715072.133234) can0 19FA0402#ECFFFFFFF2042215 (1410715072.136225) can0 19FA0402#EDAAD24311190000 (1410715072.139246) can0 19FA0402#EE00F21FE80A0A4D (1410715072.142512) can0 19FA0402#EF961040000000F2 (1410715072.145228) can0 19FA0402#F01C680313C71A0F (1410715072.148249) can0 19FA0402#F121000000F213F3 (1410715072.151240) can0 19FA0402#F21B7D7F42123C00 (1410715072.154444) can0 19FA0402#F30000F2142215C2 (1410715072.157221) can0 19FA0402#F4B8C81255000000 (1410715072.160273) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715072.163233) can0 0DF80502#E02F9BC73FD0BD57 (1410715072.166407) can0 0DF80502#E1248054320CE942 (1410715072.169215) can0 0DF80502#E24305C091E9BAC6 (1410715072.172236) can0 0DF80502#E3B931033ACAAB02 (1410715072.175257) can0 0DF80502#E40000000013FC0C (1410715072.178370) can0 0DF80502#E549008000AC0D00 (1410715072.181513) can0 0DF80502#E60000FFFFFFFFFF (1410715072.184229) can0 09F80102#8A719A16E71AB80D (1410715072.215266) can0 09F80202#9CFCABB50B00FFFF (1410715072.240229) can0 09F80102#8A719A16E71AB80D (1410715072.340205) can0 09F80102#8A719A16E71AB80D (1410715072.440180) can0 09F80102#8A719A16E71AB80D (1410715072.444880) can0 19F212B0#E0097D000064FF09 (1410715072.445429) can0 19F212B0#E11C0A00FFFFFFFF (1410715072.446009) can0 19F214B0#00EC04C5FF67787D (1410715072.465205) can0 09F80202#9DFCABB50B00FFFF (1410715072.540156) can0 09F80102#8A719A16E71AB80D (1410715072.640131) can0 09F80102#8A719A16E71AB80D (1410715072.715113) can0 09F80202#9EFCABB50B00FFFF (1410715072.740107) can0 09F80102#8A719A16E71AB80D (1410715072.800074) can0 0DF50B11#018F030000FFFFFF (1410715072.840083) can0 09F80102#8A719A16E71AB80D (1410715072.940058) can0 09F80102#8A719A16E71AB80D (1410715072.965052) can0 09F80202#9FFCABB50B00FFFF (1410715073.040003) can0 09F80102#8A719A16E71AB80D (1410715073.088892) can0 11F80E01#601B01A929C40C40 (1410715073.089442) can0 11F80E01#6136B90D20FF9916 (1410715073.089991) can0 11F80E01#62382AEF00001182 (1410715073.090571) can0 11F80E01#63087CCA000000FE (1410715073.100214) can0 0DF01002#A0F0C73FE0E45724 (1410715073.102961) can0 19FA0302#A0D3490068006400 (1410715073.105952) can0 19FA0402#0093A0FD0C0B2D35 (1410715073.109095) can0 19FA0402#01AAC35C11040000 (1410715073.111933) can0 19FA0402#0200F220673070D7 (1410715073.114954) can0 19FA0402#037F1207000000F2 (1410715073.117915) can0 19FA0402#040ED1150B209911 (1410715073.121119) can0 19FA0402#05D7FFFFFFF216DC (1410715073.123927) can0 19FA0402#0608AD2D1711F5FF (1410715073.126948) can0 19FA0402#07FFFFF2017F257C (1410715073.129938) can0 19FA0402#08D9B8120C000000 (1410715073.132990) can0 19FA0402#09F21B8B0995745C (1410715073.135920) can0 19FA0402#0A11F5FFFFFFF217 (1410715073.138911) can0 19FA0402#0B7F07CE8DA311CA (1410715073.141932) can0 19FA0402#0CFFFFFFF2042215 (1410715073.145014) can0 19FA0402#0DAAD23D111C0000 (1410715073.147944) can0 19FA0402#0E00F21FE80A0A4D (1410715073.150935) can0 19FA0402#0F5D1042000000F2 (1410715073.153925) can0 19FA0402#101C680313C70F0F (1410715073.157069) can0 19FA0402#111F000000F213F3 (1410715073.159937) can0 19FA0402#121B7D7F7D123D00 (1410715073.162928) can0 19FA0402#130000F2142215C2 (1410715073.165919) can0 19FA0402#14B8511252000000 (1410715073.169093) can0 19FA0402#15F2FFFFFFFFFFFF (1410715073.171931) can0 0DF80502#002FA0C73FE0E457 (1410715073.174952) can0 0DF80502#01248054320CE942 (1410715073.177912) can0 0DF80502#024305C091E9BAC6 (1410715073.181300) can0 0DF80502#03B931033ACAAB02 (1410715073.183924) can0 0DF80502#040000000013FC0C (1410715073.186915) can0 0DF80502#0549008000AC0D00 (1410715073.189936) can0 0DF80502#060000FFFFFFFFFF (1410715073.192988) can0 09F80102#8A719A16E71AB80D (1410715073.225062) can0 09F80202#A1FC00000500FFFF (1410715073.249934) can0 09F80102#8A719A16E71AB80D (1410715073.349909) can0 09F80102#8A719A16E71AB80D (1410715073.449854) can0 09F80102#8A719A16E71AB80D (1410715073.474879) can0 09F80202#A2FC00000500FFFF (1410715073.549830) can0 09F80102#8A719A16E71AB80D (1410715073.649805) can0 09F80102#8A719A16E71AB80D (1410715073.725062) can0 09F80202#A3FC00000500FFFF (1410715073.749750) can0 09F80102#8A719A16E71AB80D (1410715073.801630) can0 0DF50B11#018F030000FFFFFF (1410715073.849726) can0 09F80102#8A719A16E71AB80D (1410715073.944666) can0 19F212B0#00098C000064FF08 (1410715073.945216) can0 19F212B0#011C0900FFFFFFFF (1410715073.945795) can0 19F214B0#00EB04C3FF66788C (1410715073.949702) can0 09F80102#8A719A16E71AB80D (1410715073.974726) can0 09F80202#A4FC00000500FFFF (1410715074.049647) can0 09F80102#8A719A16E71AB80D (1410715074.058955) can0 0DF01002#A5F0C73FF00B5824 (1410715074.061640) can0 19FA0302#A5D3490068006400 (1410715074.064631) can0 19FA0402#2093A5FD0C0B2D35 (1410715074.067835) can0 19FA0402#21AAC3A011000000 (1410715074.070643) can0 19FA0402#2200F220673070D7 (1410715074.073634) can0 19FA0402#23361300000000F2 (1410715074.076624) can0 19FA0402#240ED1150B20B111 (1410715074.079707) can0 19FA0402#25DAFFFFFFF216DC (1410715074.082636) can0 19FA0402#2608AD2D3210F6FF (1410715074.085627) can0 19FA0402#27FFFFF2017F257C (1410715074.088618) can0 19FA0402#28D9571115000000 (1410715074.091730) can0 19FA0402#29F21B8B09957433 (1410715074.094630) can0 19FA0402#2A11F9FFFFFFF217 (1410715074.097620) can0 19FA0402#2B7F07CE8DF011C6 (1410715074.100611) can0 19FA0402#2CFFFFFFF2042215 (1410715074.103693) can0 19FA0402#2DAAD21B11290000 (1410715074.106623) can0 19FA0402#2E00F21FE80A0A4D (1410715074.109644) can0 19FA0402#2F3C1047000000F2 (1410715074.112604) can0 19FA0402#301C680313C7190F (1410715074.115717) can0 19FA0402#312E000000F213F3 (1410715074.118616) can0 19FA0402#321B7D7F33123E00 (1410715074.121607) can0 19FA0402#330000F2142215C2 (1410715074.124628) can0 19FA0402#34B8AC1257000000 (1410715074.127833) can0 19FA0402#35F2FFFFFFFFFFFF (1410715074.130640) can0 0DF80502#202FA5C73FF00B58 (1410715074.133601) can0 0DF80502#21248054320CE942 (1410715074.136591) can0 0DF80502#224305C091E9BAC6 (1410715074.139704) can0 0DF80502#23B931033ACAAB02 (1410715074.142634) can0 0DF80502#240000000013FC0C (1410715074.145625) can0 0DF80502#2549008000AC0D00 (1410715074.148646) can0 0DF80502#260000FFFFFFFFFF (1410715074.151759) can0 09F80102#8A719A16E71AB80D (1410715074.183771) can0 09F80202#A6FC00000500FFFF (1410715074.208613) can0 09F80102#8A719A16E71AB80D (1410715074.215662) can0 1DEFFF01#600AE598B6060404 (1410715074.216242) can0 1DEFFF01#6100000002FFFFFF (1410715074.309351) can0 09F80102#8A719A16E71AB80D (1410715074.408564) can0 09F80102#8A719A16E71AB80D (1410715074.433558) can0 09F80202#A7FC00000500FFFF (1410715074.508509) can0 09F80102#8A719A16E71AB80D (1410715074.608485) can0 09F80102#8A719A16E71AB80D (1410715074.683741) can0 09F80202#A8FC00000500FFFF (1410715074.708460) can0 09F80102#8A719A16E71AB80D (1410715074.803034) can0 0DF50B11#018F030000FFFFFF (1410715074.808436) can0 09F80102#8A719A16E71AB80D (1410715074.862360) can0 11F80E01#801B0188F64A0E00 (1410715074.862910) can0 11F80E01#81FBB80DC0FF9916 (1410715074.863490) can0 11F80E01#823CFFFF00002540 (1410715074.864069) can0 11F80E01#8300154F000000FE (1410715074.908381) can0 09F80102#8A719A16E71AB80D (1410715074.933466) can0 09F80202#A9FC00000500FFFF (1410715074.955988) can0 11F80E01#A01B014875520ED0 (1410715074.956538) can0 11F80E01#A19E9E0DC03EA716 (1410715074.957087) can0 11F80E01#A23C2ACBE3015782 (1410715074.957667) can0 11F80E01#A30865C6000000FE (1410715075.008356) can0 09F80102#8A719A16E71AB80D (1410715075.079066) can0 0DF01002#AAF0C73F00335824 (1410715075.081324) can0 19FA0302#AAD3490068006400 (1410715075.084315) can0 19FA0402#4093AAFD0C0B2D35 (1410715075.087305) can0 19FA0402#41AAC39C11F8FFFF (1410715075.090388) can0 19FA0402#42FFF220673070D7 (1410715075.093317) can0 19FA0402#433313FCFFFFFFF2 (1410715075.096308) can0 19FA0402#440ED1150B202B12 (1410715075.099299) can0 19FA0402#45D9FFFFFFF216DC (1410715075.102473) can0 19FA0402#4608AD2D0610F7FF (1410715075.105311) can0 19FA0402#47FFFFF2017F257C (1410715075.108302) can0 19FA0402#48D9C4101E000000 (1410715075.111292) can0 19FA0402#49F21B8B09957419 (1410715075.114497) can0 19FA0402#4A1100000000F217 (1410715075.117304) can0 19FA0402#4B7F07CE8DFE11C8 (1410715075.120325) can0 19FA0402#4CFFFFFFF2042215 (1410715075.123286) can0 19FA0402#4DAAD2D910310000 (1410715075.126459) can0 19FA0402#4E00F21FE80A0A4D (1410715075.129328) can0 19FA0402#4F44104C000000F2 (1410715075.132288) can0 19FA0402#501C680313C73D0F (1410715075.135279) can0 19FA0402#512D000000F213F3 (1410715075.138392) can0 19FA0402#521B7D7F37124000 (1410715075.141291) can0 19FA0402#530000F2142215C2 (1410715075.144282) can0 19FA0402#54B85B124E000000 (1410715075.147303) can0 19FA0402#55F2FFFFFFFFFFFF (1410715075.150385) can0 0DF80502#402FAAC73F003358 (1410715075.153284) can0 0DF80502#41248054320CE942 (1410715075.156275) can0 0DF80502#424305C091E9BAC6 (1410715075.159296) can0 0DF80502#43B931033ACAAB02 (1410715075.162470) can0 0DF80502#440000000013FC0C (1410715075.165278) can0 0DF80502#4549008000AC0D00 (1410715075.168299) can0 0DF80502#460000FFFFFFFFFF (1410715075.171259) can0 09F80102#8A719A16E71AB80D (1410715075.203333) can0 09F80202#ABFC00000900FFFF (1410715075.228297) can0 09F80102#8A719A16E71AB80D (1410715075.328272) can0 09F80102#8A719A16E71AB80D (1410715075.428217) can0 09F80102#8A719A16E71AB80D (1410715075.444880) can0 19F212B0#20099B000064FF07 (1410715075.445460) can0 19F212B0#211C0A00FFFFFFFF (1410715075.446009) can0 19F214B0#00EB04C5FF66789B (1410715075.453272) can0 09F80202#ACFC00000900FFFF (1410715075.528193) can0 09F80102#8A719A16E71AB80D (1410715075.628168) can0 09F80102#8A719A16E71AB80D (1410715075.703181) can0 09F80202#ADFC00000900FFFF (1410715075.728144) can0 09F80102#8A719A16E71AB80D (1410715075.804682) can0 0DF50B11#0192030000FFFFFF (1410715075.828120) can0 09F80102#8A719A16E71AB80D (1410715075.928095) can0 09F80102#8A719A16E71AB80D (1410715075.953089) can0 09F80202#AEFC00000900FFFF (1410715076.028071) can0 09F80102#8A719A16E71AB80D (1410715076.088282) can0 0DF01002#AFF0C73F105A5824 (1410715076.090998) can0 19FA0302#AFD3490068006400 (1410715076.093989) can0 19FA0402#6093AFFD0C0B2D35 (1410715076.097102) can0 19FA0402#61AAC35811000000 (1410715076.099970) can0 19FA0402#6200F220673070D7 (1410715076.102991) can0 19FA0402#63EC1200000000F2 (1410715076.105982) can0 19FA0402#640ED1150B20FD11 (1410715076.109125) can0 19FA0402#65E0FFFFFFF216DC (1410715076.111964) can0 19FA0402#6608AD2D6610F6FF (1410715076.114985) can0 19FA0402#67FFFFF2017F257C (1410715076.117976) can0 19FA0402#68D9341118000000 (1410715076.121180) can0 19FA0402#69F21B8B099574F5 (1410715076.123988) can0 19FA0402#6A1005000000F217 (1410715076.126978) can0 19FA0402#6B7F07CE8D2812C9 (1410715076.130000) can0 19FA0402#6CFFFFFFF2042215 (1410715076.133051) can0 19FA0402#6DAAD266113D0000 (1410715076.135981) can0 19FA0402#6E00F21FE80A0A4D (1410715076.139002) can0 19FA0402#6FF10F4C000000F2 (1410715076.141962) can0 19FA0402#701C680313C7530F (1410715076.145045) can0 19FA0402#7133000000F213F3 (1410715076.147974) can0 19FA0402#721B7D7F6E123D00 (1410715076.150965) can0 19FA0402#730000F2142215C2 (1410715076.153986) can0 19FA0402#74B85A124A000000 (1410715076.157099) can0 19FA0402#75F2FFFFFFFFFFFF (1410715076.159968) can0 0DF80502#602FAFC73F105A58 (1410715076.162959) can0 0DF80502#61248054320CE942 (1410715076.165949) can0 0DF80502#624305C091E9BAC6 (1410715076.169154) can0 0DF80502#63B931033ACAAB02 (1410715076.171992) can0 0DF80502#640000000013FC0C (1410715076.174982) can0 0DF80502#6549008000AC0D00 (1410715076.178004) can0 0DF80502#660000FFFFFFFFFF (1410715076.181635) can0 09F80102#8A719A16E71AB80D (1410715076.213099) can0 09F80202#B0FC00000900FFFF (1410715076.237971) can0 09F80102#8A719A16E71AB80D (1410715076.337946) can0 09F80102#8A719A16E71AB80D (1410715076.437891) can0 09F80102#8A719A16E71AB80D (1410715076.462916) can0 09F80202#B1FC00000900FFFF (1410715076.537867) can0 09F80102#8A719A16E71AB80D (1410715076.637843) can0 09F80102#8A719A16E71AB80D (1410715076.713099) can0 09F80202#B2FC00000900FFFF (1410715076.715845) can0 11F80E01#C01B0132D74A10A0 (1410715076.716395) can0 11F80E01#C172E20DE0639116 (1410715076.716944) can0 11F80E01#C24213BE8601E060 (1410715076.717493) can0 11F80E01#C30CE5BE000000FE (1410715076.737818) can0 09F80102#8A719A16E71AB80D (1410715076.806208) can0 0DF50B11#0192030000FFFFFF (1410715076.837794) can0 09F80102#8A719A16E71AB80D (1410715076.937739) can0 09F80102#8A719A16E71AB80D (1410715076.944636) can0 19F212B0#4009AA000064FF07 (1410715076.945216) can0 19F212B0#411C0A00FFFFFFFF (1410715076.945765) can0 19F214B0#00EB04C5FF6778AA (1410715076.962794) can0 09F80202#B3FC00000900FFFF (1410715077.037714) can0 09F80102#8A719A16E71AB80D (1410715077.096369) can0 0DF01002#B4F0C73F20815824 (1410715077.098688) can0 19FA0302#B4D3490068006400 (1410715077.101679) can0 19FA0402#8093B4FD0C0B2D35 (1410715077.104670) can0 19FA0402#81AAC3C311000000 (1410715077.107844) can0 19FA0402#8200F220673070D7 (1410715077.110682) can0 19FA0402#83351301000000F2 (1410715077.113673) can0 19FA0402#840ED1150B20F811 (1410715077.116663) can0 19FA0402#85E2FFFFFFF216DC (1410715077.119715) can0 19FA0402#8608AD2D8810E9FF (1410715077.122675) can0 19FA0402#87FFFFF2017F257C (1410715077.125666) can0 19FA0402#88D964111B000000 (1410715077.128657) can0 19FA0402#89F21B8B099574DF (1410715077.131770) can0 19FA0402#8A1004000000F217 (1410715077.134669) can0 19FA0402#8B7F07CE8D1612CB (1410715077.137659) can0 19FA0402#8CFFFFFFF2042215 (1410715077.140650) can0 19FA0402#8DAAD25512320000 (1410715077.143702) can0 19FA0402#8E00F21FE80A0A4D (1410715077.146662) can0 19FA0402#8FD10F45000000F2 (1410715077.149653) can0 19FA0402#901C680313C73F0F (1410715077.152674) can0 19FA0402#9141000000F213F3 (1410715077.155726) can0 19FA0402#921B7D7FDA123E00 (1410715077.158656) can0 19FA0402#930000F2142215C2 (1410715077.161646) can0 19FA0402#94B8FD1244000000 (1410715077.164667) can0 19FA0402#95F2FFFFFFFFFFFF (1410715077.167841) can0 0DF80502#802FB4C73F208158 (1410715077.170649) can0 0DF80502#81248054320CE942 (1410715077.173640) can0 0DF80502#824305C091E9BAC6 (1410715077.176661) can0 0DF80502#83B931033ACAAB02 (1410715077.179743) can0 0DF80502#840000000013FC0C (1410715077.182673) can0 0DF80502#8549008000AC0D00 (1410715077.185664) can0 0DF80502#860000FFFFFFFFFF (1410715077.188624) can0 09F80102#8A719A16E71AB80D (1410715077.220698) can0 09F80202#B5FC00000700FFFF (1410715077.245661) can0 09F80102#8A719A16E71AB80D (1410715077.345698) can0 09F80102#8A719A16E71AB80D (1410715077.445612) can0 09F80102#8A719A16E71AB80D (1410715077.470606) can0 09F80202#B6FC00000700FFFF (1410715077.545557) can0 09F80102#8A719A16E71AB80D (1410715077.645533) can0 09F80102#8A719A16E71AB80D (1410715077.720545) can0 09F80202#B7FC00000700FFFF (1410715077.745509) can0 09F80102#8A719A16E71AB80D (1410715077.822474) can0 19FB0201#204B054875520E68 (1410715077.822993) can0 19FB0201#214D8D0053593534 (1410715077.823573) can0 19FB0201#2230312045564941 (1410715077.824122) can0 19FB0201#23504554524F4C20 (1410715077.824671) can0 19FB0201#2449202020202020 (1410715077.825220) can0 19FB0201#25202050EE027800 (1410715077.825800) can0 19FB0201#2650008002C83F00 (1410715077.826350) can0 19FB0201#27B29F26C2014B45 (1410715077.826899) can0 19FB0201#28524B5952412020 (1410715077.827479) can0 19FB0201#2920202020202020 (1410715077.828059) can0 19FB0201#2A2020202004E0FF (1410715077.845484) can0 09F80102#8A719A16E71AB80D (1410715077.907954) can0 0DF50B11#0192030000FFFFFF (1410715077.945460) can0 09F80102#8A719A16E71AB80D (1410715077.970484) can0 09F80202#B8FC00000700FFFF (1410715078.045435) can0 09F80102#8A719A16E71AB80D (1410715078.056635) can0 0DF01002#B9F0C73F30A85824 (1410715078.059687) can0 19FA0302#B9D3490068006400 (1410715078.062495) can0 19FA0402#A093B9FD0C0B2D35 (1410715078.065363) can0 19FA0402#A1AAC30D11080000 (1410715078.068354) can0 19FA0402#A200F220673070D7 (1410715078.071375) can0 19FA0402#A3331303000000F2 (1410715078.074519) can0 19FA0402#A40ED1150B20C411 (1410715078.077357) can0 19FA0402#A5DBFFFFFFF216DC (1410715078.080347) can0 19FA0402#A608AD2D8210E3FF (1410715078.083369) can0 19FA0402#A7FFFFF2017F257C (1410715078.086481) can0 19FA0402#A8D9721113000000 (1410715078.089350) can0 19FA0402#A9F21B8B099574F1 (1410715078.092371) can0 19FA0402#AA1007000000F217 (1410715078.095362) can0 19FA0402#AB7F07CE8DF611CC (1410715078.098414) can0 19FA0402#ACFFFFFFF2042215 (1410715078.101466) can0 19FA0402#ADAAD2E8112A0000 (1410715078.104365) can0 19FA0402#AE00F21FE80A0A4D (1410715078.107355) can0 19FA0402#AF1A1038000000F2 (1410715078.110438) can0 19FA0402#B01C680313C7800F (1410715078.113367) can0 19FA0402#B136000000F213F3 (1410715078.116358) can0 19FA0402#B21B7D7FF3124100 (1410715078.119349) can0 19FA0402#B30000F214D115C2 (1410715078.122492) can0 19FA0402#B4B898123F000000 (1410715078.125361) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715078.128321) can0 0DF80502#A02FB9C73F30A858 (1410715078.131342) can0 0DF80502#A1248054320CE942 (1410715078.134547) can0 0DF80502#A24305C091E9BAC6 (1410715078.137324) can0 0DF80502#A3B931033ACAAB02 (1410715078.140376) can0 0DF80502#A40000000013FC0C (1410715078.143336) can0 0DF80502#A549008000AC0D00 (1410715078.146510) can0 0DF80502#A60000FFFFFFFFFF (1410715078.149348) can0 09F80102#8A719A16E71AB80D (1410715078.181544) can0 09F80202#BAFC00000500FFFF (1410715078.206507) can0 09F80102#8A719A16E71AB80D (1410715078.306513) can0 09F80102#8A719A16E71AB80D (1410715078.406489) can0 09F80102#8A719A16E71AB80D (1410715078.431300) can0 09F80202#BBFC00000500FFFF (1410715078.444910) can0 19F212B0#6009B9000064FF07 (1410715078.445490) can0 19F212B0#611C0900FFFFFFFF (1410715078.446040) can0 19F214B0#00EB04C4FF6778B9 (1410715078.506525) can0 09F80102#8A719A16E71AB80D (1410715078.606501) can0 09F80102#8A719A16E71AB80D (1410715078.681269) can0 09F80202#BCFC00000500FFFF (1410715078.706538) can0 09F80102#8A719A16E71AB80D (1410715078.806513) can0 09F80102#8A719A16E71AB80D (1410715078.906580) can0 09F80102#8A719A16E71AB80D (1410715078.909418) can0 0DF50B11#0192030000FFFFFF (1410715078.931147) can0 09F80202#BDFC00000500FFFF (1410715079.006495) can0 09F80102#8A719A16E71AB80D (1410715079.071833) can0 0DF01002#BEF0C73F40CF5824 (1410715079.074488) can0 19FA0302#BED3490068006400 (1410715079.077113) can0 19FA0402#C093BEFD0C0B2D35 (1410715079.080073) can0 19FA0402#C1AAC36212030000 (1410715079.083033) can0 19FA0402#C200F220673070D7 (1410715079.086451) can0 19FA0402#C3911206000000F2 (1410715079.089106) can0 19FA0402#C40ED1150B20B811 (1410715079.092036) can0 19FA0402#C5E6FFFFFFF216DC (1410715079.095026) can0 19FA0402#C608AD2D0B10E8FF (1410715079.098048) can0 19FA0402#C7FFFFF2017F257C (1410715079.101252) can0 19FA0402#C8D9F71112000000 (1410715079.104029) can0 19FA0402#C9F21B8B099574E4 (1410715079.107050) can0 19FA0402#CA100C000000F217 (1410715079.110041) can0 19FA0402#CB7F07CE8D7011D5 (1410715079.113062) can0 19FA0402#CCFFFFFFF2042215 (1410715079.116022) can0 19FA0402#CDAAD243121F0000 (1410715079.119044) can0 19FA0402#CE00F21FE80A0A4D (1410715079.122034) can0 19FA0402#CF41102D000000F2 (1410715079.125056) can0 19FA0402#D01C680313C7BD0F (1410715079.128046) can0 19FA0402#D120000000F213F3 (1410715079.131037) can0 19FA0402#D21B7D7FF7124300 (1410715079.134028) can0 19FA0402#D30000F214D115C2 (1410715079.137110) can0 19FA0402#D4B8A51242000000 (1410715079.140040) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715079.143031) can0 0DF80502#C02FBEC73F40CF58 (1410715079.146021) can0 0DF80502#C1248054320CE942 (1410715079.149104) can0 0DF80502#C24305C091E9BAC6 (1410715079.152003) can0 0DF80502#C3B931033ACAAB02 (1410715079.155024) can0 0DF80502#C40000000013FC0C (1410715079.158045) can0 0DF80502#C549008000AC0D00 (1410715079.161250) can0 0DF80502#C60000FFFFFFFFFF (1410715079.163996) can0 09F80102#8A719A16E71AB80D (1410715079.196101) can0 09F80202#BFFC00000600FFFF (1410715079.215357) can0 1DEFFF01#800AE598B6060404 (1410715079.215937) can0 1DEFFF01#8100000002FFFFFF (1410715079.221491) can0 09F80102#8A719A16E71AB80D (1410715079.275813) can0 11F80E01#E01B01985B620E30 (1410715079.276392) can0 11F80E01#E1C7C20D80B99916 (1410715079.276942) can0 11F80E01#E254A5A40000CB08 (1410715079.277491) can0 11F80E01#E309FFFFFF7F00FE (1410715079.321223) can0 09F80102#8A719A16E71AB80D (1410715079.421290) can0 09F80102#8A719A16E71AB80D (1410715079.445979) can0 09F80202#C0FC00000600FFFF (1410715079.521235) can0 09F80102#8A719A16E71AB80D (1410715079.621302) can0 09F80102#8A719A16E71AB80D (1410715079.695917) can0 09F80202#C1FC00000600FFFF (1410715079.721247) can0 09F80102#8A719A16E71AB80D (1410715079.821284) can0 09F80102#8A719A16E71AB80D (1410715079.910944) can0 0DF50B11#0192030000FFFFFF (1410715079.921259) can0 09F80102#8A719A16E71AB80D (1410715079.944697) can0 19F212B0#8009C8000064FF06 (1410715079.945246) can0 19F212B0#811C0A00FFFFFFFF (1410715079.945826) can0 09F80202#C2FC00000600FFFF (1410715079.946375) can0 19F214B0#00EC04C5FF6678C8 (1410715080.021510) can0 09F80102#8A719A16E71AB80D (1410715080.123225) can0 0DF01002#C3F0C73F50F65824 (1410715080.125727) can0 19FA0302#C3D3490068006400 (1410715080.128718) can0 19FA0402#E093C3FD0C0B2D35 (1410715080.131739) can0 19FA0402#E1AAC36412050000 (1410715080.134699) can0 19FA0402#E200F220673070D7 (1410715080.137720) can0 19FA0402#E33B1208000000F2 (1410715080.140711) can0 19FA0402#E40ED1150B20FD11 (1410715080.143732) can0 19FA0402#E5E8FFFFFFF216DC (1410715080.146693) can0 19FA0402#E608AD2D0910F2FF (1410715080.149714) can0 19FA0402#E7FFFFF2017F257C (1410715080.152705) can0 19FA0402#E8D9901117000000 (1410715080.155726) can0 19FA0402#E9F21B8B099574CB (1410715080.158717) can0 19FA0402#EA1014000000F217 (1410715080.161707) can0 19FA0402#EB7F07CE8D9F11DC (1410715080.164698) can0 19FA0402#ECFFFFFFF2042215 (1410715080.167841) can0 19FA0402#EDAAD211121A0000 (1410715080.170710) can0 19FA0402#EE00F21FE80A0A4D (1410715080.173701) can0 19FA0402#EF03103B000000F2 (1410715080.176691) can0 19FA0402#F01C680313C79E0F (1410715080.179743) can0 19FA0402#F126000000F213F3 (1410715080.182703) can0 19FA0402#F21B7D7F2B134500 (1410715080.185694) can0 19FA0402#F30000F214D115C2 (1410715080.188685) can0 19FA0402#F4B8C91244000000 (1410715080.191767) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715080.194697) can0 0DF80502#E02FC3C73F50F658 (1410715080.197688) can0 0DF80502#E1248054320CE942 (1410715080.200678) can0 0DF80502#E24305C091E9BAC6 (1410715080.203730) can0 0DF80502#E3B931033ACAAB02 (1410715080.206721) can0 0DF80502#E40000000013FC0C (1410715080.209711) can0 0DF80502#E549008000AC0D00 (1410715080.212702) can0 0DF80502#E60000FFFFFFFFFF (1410715080.215754) can0 09F80102#8A719A16E71AB80D (1410715080.247919) can0 09F80202#C4FC79AF0A00FFFF (1410715080.272700) can0 09F80102#8A719A16E71AB80D (1410715080.372675) can0 09F80102#8A719A16E71AB80D (1410715080.472620) can0 09F80102#8A719A16E71AB80D (1410715080.497645) can0 09F80202#C5FC79AF0A00FFFF (1410715080.572596) can0 09F80102#8A719A16E71AB80D (1410715080.672572) can0 09F80102#8A719A16E71AB80D (1410715080.747919) can0 09F80202#C6FC79AF0A00FFFF (1410715080.772547) can0 09F80102#8A719A16E71AB80D (1410715080.848994) can0 11F80E01#001B0108975C0EF0 (1410715080.849543) can0 11F80E01#019BC50D80F29816 (1410715080.850092) can0 11F80E01#0251666C050069C0 (1410715080.850672) can0 11F80E01#0300F1B1000000FE (1410715080.872492) can0 09F80102#8A719A16E71AB80D (1410715080.912440) can0 0DF50B11#018F030000FFFFFF (1410715080.972468) can0 09F80102#8A719A16E71AB80D (1410715080.997523) can0 09F80202#C7FC79AF0A00FFFF (1410715081.072443) can0 09F80102#8A719A16E71AB80D (1410715081.082514) can0 0DF01002#C8F0C73F601D5924 (1410715081.085444) can0 19FA0302#C8D3490068006400 (1410715081.088404) can0 19FA0402#0093C8FD0C0B2D35 (1410715081.091730) can0 19FA0402#01AAC36711090000 (1410715081.094569) can0 19FA0402#0200F220673070D7 (1410715081.097468) can0 19FA0402#037D120A000000F2 (1410715081.100397) can0 19FA0402#040ED1150B20FE11 (1410715081.103724) can0 19FA0402#05D9FFFFFFF216DC (1410715081.106501) can0 19FA0402#0608AD2D5E10E6FF (1410715081.109461) can0 19FA0402#07FFFFF2017F257C (1410715081.112421) can0 19FA0402#08D9571120000000 (1410715081.115717) can0 19FA0402#09F21B8B099574A6 (1410715081.118464) can0 19FA0402#0A100A000000F217 (1410715081.121424) can0 19FA0402#0B7F07CE8DB011DC (1410715081.124415) can0 19FA0402#0CFFFFFFF2042215 (1410715081.127802) can0 19FA0402#0DAAD26A111B0000 (1410715081.130488) can0 19FA0402#0E00F21FE80A0A4D (1410715081.133417) can0 19FA0402#0FF40F42000000F2 (1410715081.136378) can0 19FA0402#101C680313C7610F (1410715081.139704) can0 19FA0402#1129000000F213F3 (1410715081.142573) can0 19FA0402#121B7D7F1E133F00 (1410715081.145411) can0 19FA0402#130000F214D115C2 (1410715081.148402) can0 19FA0402#14B8A01246000000 (1410715081.151423) can0 19FA0402#15F2FFFFFFFFFFFF (1410715081.154566) can0 0DF80502#002FC8C73F601D59 (1410715081.157374) can0 0DF80502#01248054320CE942 (1410715081.160395) can0 0DF80502#024305C091E9BAC6 (1410715081.163386) can0 0DF80502#03B931033ACAAB02 (1410715081.166529) can0 0DF80502#040000000013FC0C (1410715081.169398) can0 0DF80502#0549008000AC0D00 (1410715081.172419) can0 0DF80502#060000FFFFFFFFFF (1410715081.175379) can0 09F80102#8A719A16E71AB80D (1410715081.206568) can0 09F80202#C9FC00000700FFFF (1410715081.231715) can0 09F80102#8A719A16E71AB80D (1410715081.331355) can0 09F80102#8A719A16E71AB80D (1410715081.431330) can0 09F80102#8A719A16E71AB80D (1410715081.444941) can0 19F212B0#A009D7000064FF1A (1410715081.445521) can0 19F212B0#A11C0A00FFFFFFFF (1410715081.446040) can0 19F214B0#00EC04C4FF6478D7 (1410715081.456355) can0 09F80202#CAFC00000700FFFF (1410715081.531306) can0 09F80102#8A719A16E71AB80D (1410715081.631281) can0 09F80102#8A719A16E71AB80D (1410715081.706568) can0 09F80202#CBFC00000700FFFF (1410715081.731226) can0 09F80102#8A719A16E71AB80D (1410715081.831202) can0 09F80102#8A719A16E71AB80D (1410715081.913905) can0 0DF50B11#018F030000FFFFFF (1410715081.931208) can0 09F80102#8A719A16E71AB80D (1410715081.956202) can0 09F80202#CCFC00000700FFFF (1410715082.031123) can0 09F80102#8A719A16E71AB80D (1410715082.090662) can0 0DF01002#CDF0C73F70445924 (1410715082.093104) can0 19FA0302#CDD3490068006400 (1410715082.096125) can0 19FA0402#2093CDFD0C0B2D35 (1410715082.099085) can0 19FA0402#21AAC3E511060000 (1410715082.102534) can0 19FA0402#2200F220673070D7 (1410715082.105128) can0 19FA0402#23C9120F000000F2 (1410715082.108118) can0 19FA0402#240ED1150B203612 (1410715082.111079) can0 19FA0402#25DAFFFFFFF216DC (1410715082.114527) can0 19FA0402#2608AD2D7310E4FF (1410715082.117152) can0 19FA0402#27FFFFF2017F257C (1410715082.120142) can0 19FA0402#28D9B81117000000 (1410715082.123072) can0 19FA0402#29F21B8B099574A7 (1410715082.126490) can0 19FA0402#2A1006000000F217 (1410715082.129176) can0 19FA0402#2B7F07CE8D5F11DF (1410715082.132136) can0 19FA0402#2CFFFFFFF2042215 (1410715082.135065) can0 19FA0402#2DAAD272112B0000 (1410715082.138422) can0 19FA0402#2E00F21FE80A0A4D (1410715083.748591) can0 09F80102#8A719A16E71AB80D (1410715083.768793) can0 11F80E01#601B0188F64A0EE0 (1410715083.769343) can0 11F80E01#61FAB80D40FF9916 (1410715083.769923) can0 11F80E01#6260FFFF0000C783 (1410715083.770472) can0 11F80E01#6308154F000000FE (1410715083.848566) can0 09F80102#8A719A16E71AB80D (1410715083.916865) can0 0DF50B11#018F030000FFFFFF (1410715083.948573) can0 09F80102#8A719A16E71AB80D (1410715083.973566) can0 09F80202#D6FC00000600FFFF (1410715084.048487) can0 09F80102#8A719A16E71AB80D (1410715084.059260) can0 0DF01002#D7F0C73F90925924 (1410715084.061518) can0 19FA0302#D7D3490068006400 (1410715084.064478) can0 19FA0402#6093D7FD0C0B2D35 (1410715084.067866) can0 19FA0402#61AAC33512070000 (1410715084.070551) can0 19FA0402#6200F220673070D7 (1410715084.073511) can0 19FA0402#63CA1201000000F2 (1410715084.076441) can0 19FA0402#640ED1150B200F12 (1410715084.079737) can0 19FA0402#65D6FFFFFFF216DC (1410715084.082545) can0 19FA0402#6608AD2D5010DFFF (1410715084.085505) can0 19FA0402#67FFFFF2017F257C (1410715084.088465) can0 19FA0402#68D916130E000000 (1410715084.091730) can0 19FA0402#69F21B8B0995746E (1410715084.094630) can0 19FA0402#6A1001000000F217 (1410715084.097498) can0 19FA0402#6B2E08CE8D8311D3 (1410715084.100459) can0 19FA0402#6CFFFFFFF2042215 (1410715084.103754) can0 19FA0402#6DAAD2BF112F0000 (1410715084.106562) can0 19FA0402#6E00F21FE80A0A4D (1410715084.109492) can0 19FA0402#6F2C103D000000F2 (1410715084.112452) can0 19FA0402#701C680313C7B90E (1410715084.115748) can0 19FA0402#7132000000F213F3 (1410715084.118494) can0 19FA0402#721B7D7F9C123A00 (1410715084.121485) can0 19FA0402#730000F214D115C2 (1410715084.124445) can0 19FA0402#74B880124F000000 (1410715084.127863) can0 19FA0402#75F2FFFFFFFFFFFF (1410715084.130549) can0 0DF80502#602FD7C73F909259 (1410715084.133479) can0 0DF80502#61248054320CE942 (1410715084.136439) can0 0DF80502#624305C091E9BAC6 (1410715084.139735) can0 0DF80502#63B931033ACAAB02 (1410715084.142573) can0 0DF80502#640000000013FC0C (1410715084.145472) can0 0DF80502#6549008000AC0D00 (1410715084.148463) can0 0DF80502#660000FFFFFFFFFF (1410715084.151728) can0 09F80102#8A719A16E71AB80D (1410715084.183771) can0 09F80202#D8FC00000900FFFF (1410715084.208460) can0 09F80102#8A719A16E71AB80D (1410715084.214991) can0 1DEFFF01#A00AE598B6060404 (1410715084.215571) can0 1DEFFF01#A100000002FFFFFF (1410715084.289362) can0 11F80E01#801B014875520E00 (1410715084.289912) can0 11F80E01#818A9E0DE047A716 (1410715084.290461) can0 11F80E01#82602ACBE3011AC0 (1410715084.291041) can0 11F80E01#830065C6000000FE (1410715084.308436) can0 09F80102#8A719A16E71AB80D (1410715084.409388) can0 09F80102#8A719A16E71AB80D (1410715084.433405) can0 09F80202#D9FC00000900FFFF (1410715084.445002) can0 19F212B0#E009F5000064FF17 (1410715084.445551) can0 19F212B0#E11C0A00FFFFFFFF (1410715084.446101) can0 19F214B0#00EB04C4FF6678F5 (1410715084.508356) can0 09F80102#8A719A16E71AB80D (1410715084.608332) can0 09F80102#8A719A16E71AB80D (1410715084.683344) can0 09F80202#DAFC00000900FFFF (1410715084.708308) can0 09F80102#8A719A16E71AB80D (1410715084.808253) can0 09F80102#8A719A16E71AB80D (1410715084.908228) can0 09F80102#8A719A16E71AB80D (1410715084.918391) can0 0DF50B11#018C030000FFFFFF (1410715084.933253) can0 09F80202#DBFC00000900FFFF (1410715085.008204) can0 09F80102#8A719A16E71AB80D (1410715085.069880) can0 0DF01002#DCF0C73FA0B95924 (1410715085.072199) can0 19FA0302#DCD3490068006400 (1410715085.075159) can0 19FA0402#8093DCFD0C0B2D35 (1410715085.078486) can0 19FA0402#81AAC34511090000 (1410715085.081293) can0 19FA0402#8200F220673070D7 (1410715085.084193) can0 19FA0402#834E1203000000F2 (1410715085.087153) can0 19FA0402#840ED1150B20FC11 (1410715085.090540) can0 19FA0402#85CEFFFFFFF216DC (1410715085.093134) can0 19FA0402#8608AD2D8F10E4FF (1410715085.096186) can0 19FA0402#87FFFFF2017F257C (1410715085.099146) can0 19FA0402#88D9B8120C000000 (1410715085.102534) can0 19FA0402#89F21B8B09957461 (1410715085.105158) can0 19FA0402#8A1001000000F217 (1410715085.108149) can0 19FA0402#8B2E08CE8D8C11CD (1410715085.111140) can0 19FA0402#8CFFFFFFF2042215 (1410715085.114588) can0 19FA0402#8DAAD2B811280000 (1410715085.117182) can0 19FA0402#8E00F21FE80A0A4D (1410715085.120173) can0 19FA0402#8F5A1041000000F2 (1410715085.123133) can0 19FA0402#901C680313C7BC0E (1410715085.126521) can0 19FA0402#9147000000F213F3 (1410715085.129267) can0 19FA0402#921B7D7FF2123700 (1410715085.132166) can0 19FA0402#930000F214D115C2 (1410715085.135126) can0 19FA0402#94B89C1254000000 (1410715085.138483) can0 19FA0402#95F2FFFFFFFFFFFF (1410715085.141535) can0 0DF80502#802FDCC73FA0B959 (1410715085.144160) can0 0DF80502#81248054320CE942 (1410715085.147120) can0 0DF80502#824305C091E9BAC6 (1410715085.150568) can0 0DF80502#83B931033ACAAB02 (1410715085.153162) can0 0DF80502#840000000013FC0C (1410715085.156184) can0 0DF80502#8549008000AC0D00 (1410715085.159144) can0 0DF80502#860000FFFFFFFFFF (1410715085.162531) can0 09F80102#8A719A16E71AB80D (1410715085.194605) can0 09F80202#DDFC00000800FFFF (1410715085.219111) can0 09F80102#8A719A16E71AB80D (1410715085.319086) can0 09F80102#8A719A16E71AB80D (1410715085.419062) can0 09F80102#8A719A16E71AB80D (1410715085.444086) can0 09F80202#DEFC00000800FFFF (1410715085.519038) can0 09F80102#8A719A16E71AB80D (1410715085.619013) can0 09F80102#8A719A16E71AB80D (1410715085.694025) can0 09F80202#DFFC00000800FFFF (1410715085.718989) can0 09F80102#8A719A16E71AB80D (1410715085.818964) can0 09F80102#8A719A16E71AB80D (1410715085.918909) can0 09F80102#8A719A16E71AB80D (1410715085.920710) can0 0DF50B11#018C030000FFFFFF (1410715085.943934) can0 09F80202#E0FC00000800FFFF (1410715085.944788) can0 19F212B0#000909000064FF14 (1410715085.945368) can0 19F212B0#011C0800FFFFFFFF (1410715085.945917) can0 19F214B0#00ED04C4FF627809 (1410715086.018885) can0 09F80102#8A719A16E71AB80D (1410715086.078089) can0 0DF01002#E1F0C73FB0E05924 (1410715086.081293) can0 19FA0302#E1D3490068006400 (1410715086.083826) can0 19FA0402#A093E1FD0C0B2D35 (1410715086.086848) can0 19FA0402#A1AAC36211140000 (1410715086.089838) can0 19FA0402#A200F220673070D7 (1410715086.093165) can0 19FA0402#A3831200000000F2 (1410715086.095820) can0 19FA0402#A40ED1150B20E411 (1410715086.098872) can0 19FA0402#A5E0FFFFFFF216DC (1410715086.101832) can0 19FA0402#A608AD2D0411E3FF (1410715086.105158) can0 19FA0402#A7FFFFF2017F257C (1410715086.108027) can0 19FA0402#A8D9B51119000000 (1410715086.110834) can0 19FA0402#A9F21B8B0995745F (1410715086.113825) can0 19FA0402#AA1003000000F217 (1410715086.117182) can0 19FA0402#AB2E08CE8DB711C7 (1410715086.119807) can0 19FA0402#ACFFFFFFF2042215 (1410715086.122828) can0 19FA0402#ADAAD2F611220000 (1410715086.125819) can0 19FA0402#AE00F21FE80A0A4D (1410715086.129206) can0 19FA0402#AF8B103F000000F2 (1410715086.131800) can0 19FA0402#B01C680313C7AA0E (1410715086.134852) can0 19FA0402#B13E000000F213F3 (1410715086.137812) can0 19FA0402#B21B7D7F41133400 (1410715086.141322) can0 19FA0402#B30000F214D115C2 (1410715086.143824) can0 19FA0402#B4B8A11254000000 (1410715086.146876) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715086.149836) can0 0DF80502#A02FE1C73FB0E059 (1410715086.153132) can0 0DF80502#A1248054320CE942 (1410715086.155787) can0 0DF80502#A24305C091E9BAC6 (1410715086.158839) can0 0DF80502#A3B931033ACAAB02 (1410715086.161829) can0 0DF80502#A40000000013FC0C (1410715086.165125) can0 0DF80502#A549008000AC0D00 (1410715086.167902) can0 0DF80502#A60000FFFFFFFFFF (1410715086.170832) can0 09F80102#8A719A16E71AB80D (1410715086.202875) can0 09F80202#E2FC00000700FFFF (1410715086.227961) can0 09F80102#8A719A16E71AB80D (1410715086.327906) can0 09F80102#8A719A16E71AB80D (1410715086.428278) can0 09F80102#8A719A16E71AB80D (1410715086.452784) can0 09F80202#E3FC00000700FFFF (1410715086.527918) can0 09F80102#8A719A16E71AB80D (1410715086.627955) can0 09F80102#8A719A16E71AB80D (1410715086.702692) can0 09F80202#E4FC00000700FFFF (1410715086.727900) can0 09F80102#8A719A16E71AB80D (1410715086.827937) can0 09F80102#8A719A16E71AB80D (1410715086.922205) can0 0DF50B11#018C030000FFFFFF (1410715086.927943) can0 09F80102#8A719A16E71AB80D (1410715086.952601) can0 09F80202#E5FC00000700FFFF (1410715087.027949) can0 09F80102#8A719A16E71AB80D (1410715087.087061) can0 0DF01002#E6F0C73FC0075A24 (1410715087.089533) can0 19FA0302#E6D3490068006400 (1410715087.092524) can0 19FA0402#C093E6FD0C0B2D35 (1410715087.095789) can0 19FA0402#C1AAC3DC11100000 (1410715087.098505) can0 19FA0402#C200F220673070D7 (1410715087.101527) can0 19FA0402#C3581200000000F2 (1410715087.104487) can0 19FA0402#C40ED1150B209311 (1410715087.107905) can0 19FA0402#C5E5FFFFFFF216DC (1410715087.110560) can0 19FA0402#C608AD2D7510E2FF (1410715087.113551) can0 19FA0402#C7FFFFF2017F257C (1410715087.116511) can0 19FA0402#C8D95E120E000000 (1410715087.119776) can0 19FA0402#C9F21B8B09957455 (1410715087.122584) can0 19FA0402#CA1004000000F217 (1410715087.125513) can0 19FA0402#CB2E08CE8DCD11C2 (1410715087.128504) can0 19FA0402#CCFFFFFFF2042215 (1410715087.131800) can0 19FA0402#CDAAD20D12200000 (1410715087.134638) can0 19FA0402#CE00F21FE80A0A4D (1410715087.137537) can0 19FA0402#CF861039000000F2 (1410715087.140498) can0 19FA0402#D01C680313C7CA0E (1410715087.143793) can0 19FA0402#D140000000F213F3 (1410715087.146571) can0 19FA0402#D21B7D7F01133300 (1410715087.149531) can0 19FA0402#D30000F214D115C2 (1410715087.152491) can0 19FA0402#D4B8E31255000000 (1410715087.155817) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715087.158503) can0 0DF80502#C02FE6C73FC0075A (1410715087.161524) can0 0DF80502#C1248054320CE942 (1410715087.164484) can0 0DF80502#C24305C091E9BAC6 (1410715087.167872) can0 0DF80502#C3B931033ACAAB02 (1410715087.169276) can0 11F80E01#A01B0132D74A1040 (1410715087.169794) can0 11F80E01#A161E20D40669116 (1410715087.170344) can0 11F80E01#A26ACDBD86012184 (1410715087.170924) can0 0DF80502#C40000000013FC0C (1410715087.171503) can0 11F80E01#A300E5BE000000FE (1410715087.173518) can0 0DF80502#C549008000AC0D00 (1410715087.176508) can0 0DF80502#C60000FFFFFFFFFF (1410715087.179774) can0 09F80102#8A719A16E71AB80D (1410715087.211848) can0 09F80202#E7FC00000600FFFF (1410715087.236506) can0 09F80102#8A719A16E71AB80D (1410715087.336451) can0 09F80102#8A719A16E71AB80D (1410715087.436427) can0 09F80102#8A719A16E71AB80D (1410715087.444819) can0 19F212B0#200918000064FF14 (1410715087.445368) can0 19F212B0#211C0900FFFFFFFF (1410715087.445917) can0 19F214B0#00ED04C4FF667818 (1410715087.461451) can0 09F80202#E8FC00000600FFFF (1410715087.536402) can0 09F80102#8A719A16E71AB80D (1410715087.636378) can0 09F80102#8A719A16E71AB80D (1410715087.711390) can0 09F80202#E9FC00000600FFFF (1410715087.736323) can0 09F80102#8A719A16E71AB80D (1410715087.836298) can0 09F80102#8A719A16E71AB80D (1410715087.936274) can0 09F80102#8A719A16E71AB80D (1410715087.961390) can0 09F80202#EAFC00000600FFFF (1410715088.023829) can0 0DF50B11#018C030000FFFFFF (1410715088.036250) can0 09F80102#8A719A16E71AB80D (1410715088.096461) can0 0DF01002#EBF0C73FD02E5A24 (1410715088.099207) can0 19FA0302#EBD3490068006400 (1410715088.102564) can0 19FA0402#E093EBFD0C0B2D35 (1410715088.105189) can0 19FA0402#E1AAC38F11020000 (1410715088.108210) can0 19FA0402#E200F220673070D7 (1410715088.111201) can0 19FA0402#E39612FEFFFFFFF2 (1410715088.114558) can0 19FA0402#E40ED1150B20C411 (1410715088.117213) can0 19FA0402#E5E1FFFFFFF216DC (1410715088.120203) can0 19FA0402#E608AD2D7E10E7FF (1410715088.123194) can0 19FA0402#E7FFFFF2017F257C (1410715088.126582) can0 19FA0402#E8D926120F000000 (1410715088.129237) can0 19FA0402#E9F21B8B0995745F (1410715088.132227) can0 19FA0402#EA100B000000F217 (1410715088.135188) can0 19FA0402#EB2E08CE8DF111C7 (1410715088.138514) can0 19FA0402#ECFFFFFFF2042215 (1410715088.141352) can0 19FA0402#EDAAD22611210000 (1410715088.144190) can0 19FA0402#EE00F21FE80A0A4D (1410715088.147181) can0 19FA0402#EFA71030000000F2 (1410715088.150568) can0 19FA0402#F01C680313C7230F (1410715088.153223) can0 19FA0402#F132000000F213F3 (1410715088.156214) can0 19FA0402#F21B7D7FFE123300 (1410715088.159174) can0 19FA0402#F30000F214D115C2 (1410715088.162562) can0 19FA0402#F4B8B51259000000 (1410715088.165186) can0 19FA0402#F5F2FFFFFFFFFFFF (1410715088.168208) can0 0DF80502#E02FEBC73FD02E5A (1410715088.171168) can0 0DF80502#E1248054320CE942 (1410715088.174616) can0 0DF80502#E24305C091E9BAC6 (1410715088.177271) can0 0DF80502#E3B931033ACAAB02 (1410715088.180201) can0 0DF80502#E40000000013FC0C (1410715088.183192) can0 0DF80502#E549008000AC0D00 (1410715088.186640) can0 0DF80502#E60000FFFFFFFFFF (1410715088.189234) can0 09F80102#8A719A16E71AB80D (1410715088.221400) can0 09F80202#ECFC00000A00FFFF (1410715088.246577) can0 09F80102#8A719A16E71AB80D (1410715088.346583) can0 09F80102#8A719A16E71AB80D (1410715088.446101) can0 09F80102#8A719A16E71AB80D (1410715088.471125) can0 09F80202#EDFC00000A00FFFF (1410715088.546076) can0 09F80102#8A719A16E71AB80D (1410715088.646052) can0 09F80102#8A719A16E71AB80D (1410715088.721369) can0 09F80202#EEFC00000A00FFFF (1410715088.746027) can0 09F80102#8A719A16E71AB80D (1410715088.845972) can0 09F80102#8A719A16E71AB80D (1410715088.944788) can0 19F212B0#400927000064FF15 (1410715088.945368) can0 19F212B0#411C0A00FFFFFFFF (1410715088.945917) can0 19F214B0#00EB04C4FF677827 (1410715088.946467) can0 09F80102#8A719A16E71AB80D (1410715088.971003) can0 09F80202#EFFC00000A00FFFF (1410715089.025446) can0 0DF50B11#018C030000FFFFFF (1410715089.045924) can0 09F80102#8A719A16E71AB80D (1410715089.055872) can0 0DF01002#F0F0C73FE0555A24 (1410715089.058894) can0 19FA0302#F0D3490068006400 (1410715089.061884) can0 19FA0402#0093F0FD0C0B2D35 (1410715089.065180) can0 19FA0402#01AAC39711000000 (1410715089.067957) can0 19FA0402#0200F220673070D7 (1410715089.070917) can0 19FA0402#036B12FFFFFFFFF2 (1410715089.073878) can0 19FA0402#040ED1150B20D911 (1410715089.077235) can0 19FA0402#05DDFFFFFFF216DC (1410715089.079890) can0 19FA0402#0608AD2D7810E6FF (1410715089.082911) can0 19FA0402#07FFFFF2017F257C (1410715089.085871) can0 19FA0402#08D90F1212000000 (1410715089.089228) can0 19FA0402#09F21B8B09957485 (1410715089.091883) can0 19FA0402#0A1005000000F217 (1410715089.094874) can0 19FA0402#0B2E08CE8D2012C5 (1410715089.097895) can0 19FA0402#0CFFFFFFF2042215 (1410715089.101374) can0 19FA0402#0DAAD288112A0000 (1410715089.103876) can0 19FA0402#0E00F21FE80A0A4D (1410715089.106928) can0 19FA0402#0F661033000000F2 (1410715089.109858) can0 19FA0402#101C680313C7B80E (1410715089.113215) can0 19FA0402#1135000000F213F3 (1410715089.115870) can0 19FA0402#121B7D7F15133100 (1410715089.116419) can0 11F80E01#C01B01985B620E30 (1410715089.116969) can0 11F80E01#C1C7C20D00BA9916 (1410715089.117518) can0 11F80E01#C278A5A400006A84 (1410715089.118098) can0 11F80E01#C300FFFFFF7F00FE (1410715089.118891) can0 19FA0402#130000F214D115C2 (1410715089.121882) can0 19FA0402#14B8881257000000 (1410715089.125208) can0 19FA0402#15F2FFFFFFFFFFFF (1410715089.127924) can0 0DF80502#002FF0C73FE0555A (1410715089.130885) can0 0DF80502#01248054320CE942 (1410715089.133875) can0 0DF80502#024305C091E9BAC6 (1410715089.137263) can0 0DF80502#03B931033ACAAB02 (1410715089.139887) can0 0DF80502#040000000013FC0C (1410715089.142878) can0 0DF80502#0549008000AC0D00 (1410715089.145899) can0 0DF80502#060000FFFFFFFFFF (1410715089.149226) can0 09F80102#8A719A16E71AB80D (1410715089.179926) can0 09F80202#F1FC00000800FFFF (1410715089.205195) can0 09F80102#8A719A16E71AB80D (1410715089.214625) can0 1DEFFF01#C00AE598B6060404 (1410715089.215205) can0 1DEFFF01#C100000002FFFFFF (1410715089.305170) can0 09F80102#8A719A16E71AB80D (1410715089.405146) can0 09F80102#8A719A16E71AB80D (1410715089.429835) can0 09F80202#F2FC00000800FFFF (1410715089.504786) can0 09F80102#8A719A16E71AB80D (1410715089.604761) can0 09F80102#8A719A16E71AB80D (1410715089.679896) can0 09F80202#F3FC00000800FFFF (1410715089.704737) can0 09F80102#8A719A16E71AB80D (1410715089.804682) can0 09F80102#8A719A16E71AB80D (1410715089.904658) can0 09F80102#8A719A16E71AB80D (1410715089.929652) can0 09F80202#F4FC00000800FFFF (1410715090.004633) can0 09F80102#8A719A16E71AB80D (1410715090.027125) can0 0DF50B11#018C030000FFFFFF (1410715090.128504) can0 0DF01002#F5F0C73FF07C5A24 (1410715090.130579) can0 19FA0302#F5D3490068006400 (1410715090.133570) can0 19FA0402#2093F5FD0C0B2D35 (1410715090.136561) can0 19FA0402#21AAC35D11FCFFFF (1410715090.139826) can0 19FA0402#22FFF220673070D7 (1410715090.142603) can0 19FA0402#237E1204000000F2 (1410715090.145563) can0 19FA0402#240ED1150B20FC11 (1410715090.148554) can0 19FA0402#25DFFFFFFFF216DC (1410715090.151820) can0 19FA0402#2608AD2DA510EBFF (1410715090.154597) can0 19FA0402#27FFFFF2017F257C (1410715090.157557) can0 19FA0402#28D9AC111C000000 (1410715090.160548) can0 19FA0402#29F21B8B0995745D (1410715090.163844) can0 19FA0402#2A1001000000F217 (1410715090.166529) can0 19FA0402#2B2E08CE8DCE11C4 (1410715090.169581) can0 19FA0402#2CFFFFFFF2042215 (1410715090.172541) can0 19FA0402#2DAAD2FF10330000 (1410715090.175837) can0 19FA0402#2E00F21FE80A0A4D (1410715090.178553) can0 19FA0402#2F94103B000000F2 (1410715090.181605) can0 19FA0402#301C680313C7A60E (1410715090.184565) can0 19FA0402#313E000000F213F3 (1410715090.187983) can0 19FA0402#321B7D7F5E133400 (1410715090.190577) can0 19FA0402#330000F214D115C2 (1410715090.193598) can0 19FA0402#34B8181254000000 (1410715090.196558) can0 19FA0402#35F2FFFFFFFFFFFF (1410715090.199854) can0 0DF80502#202FF5C73FF07C5A (1410715090.202570) can0 0DF80502#21248054320CE942 (1410715090.205561) can0 0DF80502#224305C091E9BAC6 (1410715090.208521) can0 0DF80502#23B931033ACAAB02 (1410715090.211848) can0 0DF80502#240000000013FC0C (1410715090.214594) can0 0DF80502#2549008000AC0D00 (1410715090.217585) can0 0DF80502#260000FFFFFFFFFF (1410715090.220515) can0 09F80102#8A719A16E71AB80D (1410715090.252558) can0 09F80202#F6FC00000400FFFF (1410715090.277552) can0 09F80102#8A719A16E71AB80D (1410715090.377528) can0 09F80102#8A719A16E71AB80D (1410715090.445094) can0 19F212B0#600936000064FF15 (1410715090.445643) can0 19F212B0#611C0900FFFFFFFF (1410715090.446223) can0 19F214B0#00EB04C3FF667836 (1410715090.477503) can0 09F80102#8A719A16E71AB80D (1410715090.502650) can0 09F80202#F7FC00000400FFFF (1410715090.555689) can0 11F80E01#E01B0108975C0EA0 (1410715090.556239) can0 11F80E01#E19CC50D80F29816 (1410715090.556788) can0 11F80E01#E279156D0500A084 (1410715090.557368) can0 11F80E01#E308F1B1000000FE (1410715090.577448) can0 09F80102#8A719A16E71AB80D (1410715090.677393) can0 09F80102#8A719A16E71AB80D (1410715090.752436) can0 09F80202#F8FC00000400FFFF (1410715090.777399) can0 09F80102#8A719A16E71AB80D (1410715090.877344) can0 09F80102#8A719A16E71AB80D (1410715090.977320) can0 09F80102#8A719A16E71AB80D (1410715091.002650) can0 09F80202#F9FC00000400FFFF (1410715091.028559) can0 0DF50B11#018F030000FFFFFF (1410715091.077296) can0 09F80102#8A719A16E71AB80D (1410715091.087214) can0 0DF01002#00F0C73F00A45A24 (1410715091.090601) can0 19FA0302#00D3490068006400 (1410715091.093256) can0 19FA0402#409300FD0C0B2D35 (1410715091.096247) can0 19FA0402#41AAC3BF11FAFFFF (1410715091.099268) can0 19FA0402#42FFF220673070D7 (1410715091.102595) can0 19FA0402#43951208000000F2 (1410715091.105250) can0 19FA0402#440ED1150B20EE11 (1410715091.108271) can0 19FA0402#45D6FFFFFFF216DC (1410715091.111231) can0 19FA0402#4608AD2D2B10F6FF (1410715091.114588) can0 19FA0402#47FFFFF2017F257C (1410715091.117274) can0 19FA0402#48D90F121F000000 (1410715091.120234) can0 19FA0402#49F21B8B09957463 (1410715091.123225) can0 19FA0402#4A1005000000F217 (1410715091.126490) can0 19FA0402#4B2E08CE8DC111CA (1410715091.129298) can0 19FA0402#4CFFFFFFF2042215 (1410715091.132227) can0 19FA0402#4DAAD21E11310000 (1410715091.135249) can0 19FA0402#4E00F21FE80A0A4D (1410715091.138514) can0 19FA0402#4FB41035000000F2 (1410715091.141383) can0 19FA0402#501C680313C7010F (1410715091.144251) can0 19FA0402#513D000000F213F3 (1410715091.147211) can0 19FA0402#521B7D7F45133500 (1410715091.150568) can0 19FA0402#530000F214D115C2 (1410715091.153254) can0 19FA0402#54B8471251000000 (1410715091.156275) can0 19FA0402#55F2FFFFFFFFFFFF (1410715091.159235) can0 0DF80502#402F00C73F00A45A (1410715091.162562) can0 0DF80502#41248054320CE942 (1410715091.165247) can0 0DF80502#424305C091E9BAC6 (1410715091.168238) can0 0DF80502#43B931033ACAAB02 (1410715091.171229) can0 0DF80502#440000000013FC0C (1410715091.174586) can0 0DF80502#4549008000AC0D00 (1410715091.177302) can0 0DF80502#460000FFFFFFFFFF (1410715091.180231) can0 09F80102#8A719A16E71AB80D (1410715091.211268) can0 09F80202#01FC00000700FFFF (1410715091.236262) can0 09F80102#8A719A16E71AB80D (1410715091.336237) can0 09F80102#8A719A16E71AB80D (1410715091.436182) can0 09F80102#8A719A16E71AB80D (1410715091.461481) can0 09F80202#02FC00000700FFFF (1410715091.536127) can0 09F80102#8A719A16E71AB80D (1410715091.636103) can0 09F80102#8A719A16E71AB80D (1410715091.711115) can0 09F80202#03FC00000700FFFF (1410715091.736079) can0 09F80102#8A719A16E71AB80D (1410715091.836024) can0 09F80102#8A719A16E71AB80D (1410715091.935999) can0 09F80102#8A719A16E71AB80D (1410715091.944849) can0 19F212B0#800945000064FF14 (1410715091.945429) can0 19F212B0#811C0A00FFFFFFFF (1410715091.945979) can0 19F214B0#00EC04C5FF667845 (1410715091.961420) can0 09F80202#04FC00000700FFFF (1410715092.030451) can0 0DF50B11#018F030000FFFFFF (1410715092.035975) can0 09F80102#8A719A16E71AB80D (1410715092.102015) can0 11F80E01#001B01A929C40CA0 (1410715092.102564) can0 11F80E01#0135B90D40FF9916 (1410715092.103114) can0 11F80E01#02842E0B0000DA84 (1410715092.103693) can0 11F80E01#03087CCA000000FE (1410715092.104823) can0 0DF01002#05F0C73F10CB5A24 (1410715092.106928) can0 19FA0302#05D3490068006400 (1410715092.109919) can0 19FA0402#609305FD0C0B2D35 (1410715092.113276) can0 19FA0402#61AAC32212FBFFFF (1410715092.115931) can0 19FA0402#62FFF220673070D7 (1410715092.118922) can0 19FA0402#637A120A000000F2 (1410715092.121912) can0 19FA0402#640ED1150B20A711 (1410715092.125269) can0 19FA0402#65D1FFFFFFF216DC (1410715092.127955) can0 19FA0402#6608AD2D2C10ECFF (1410715092.130946) can0 19FA0402#67FFFFF2017F257C (1410715092.133906) can0 19FA0402#68D9E41214000000 (1410715092.137263) can0 19FA0402#69F21B8B099574F7 (1410715092.139918) can0 19FA0402#6A1000000000F217 (1410715092.142908) can0 19FA0402#6B2E08CE8DA811CE (1410715092.145930) can0 19FA0402#6CFFFFFFF2042215 (1410715092.149287) can0 19FA0402#6DAAD2E011390000 (1410715092.151911) can0 19FA0402#6E00F21FE80A0A4D (1410715092.154932) can0 19FA0402#6FC31034000000F2 (1410715092.157893) can0 19FA0402#701C680313C7150F (1410715092.161372) can0 19FA0402#713A000000F213F3 (1410715092.163905) can0 19FA0402#721B7D7F0E133300 (1410715092.166926) can0 19FA0402#730000F214D115C2 (1410715092.169917) can0 19FA0402#74B8821251000000 (1410715092.173334) can0 19FA0402#75F2FFFFFFFFFFFF (1410715092.175898) can0 0DF80502#602F05C73F10CB5A (1410715092.178919) can0 0DF80502#61248054320CE942 (1410715092.181879) can0 0DF80502#624305C091E9BAC6 (1410715092.185328) can0 0DF80502#63B931033ACAAB02 (1410715092.188105) can0 0DF80502#640000000013FC0C (1410715092.190943) can0 0DF80502#6549008000AC0D00 (1410715092.193934) can0 0DF80502#660000FFFFFFFFFF (1410715092.197260) can0 09F80102#8A719A16E71AB80D (1410715092.229365) can0 09F80202#06FC00000800FFFF (1410715092.253931) can0 09F80102#8A719A16E71AB80D (1410715092.353876) can0 09F80102#8A719A16E71AB80D (1410715092.453852) can0 09F80102#8A719A16E71AB80D (1410715092.478907) can0 09F80202#07FC00000800FFFF (1410715092.553828) can0 09F80102#8A719A16E71AB80D (1410715092.653773) can0 09F80102#8A719A16E71AB80D (1410715092.728785) can0 09F80202#08FC00000800FFFF (1410715092.753748) can0 09F80102#8A719A16E71AB80D (1410715092.853724) can0 09F80102#8A719A16E71AB80D (1410715092.953699) can0 09F80102#8A719A16E71AB80D (1410715092.978693) can0 09F80202#09FC00000800FFFF (1410715093.031916) can0 0DF50B11#018C030000FFFFFF (1410715093.053675) can0 09F80102#8A719A16E71AB80D (1410715093.064173) can0 0DF01002#0AF0C73F20F25A24 (1410715093.066615) can0 19FA0302#0AD3490068006400 (1410715093.069636) can0 19FA0402#80930AFD0C0B2D35 (1410715093.072626) can0 19FA0402#81AAC3E611FBFFFF (1410715093.075861) can0 19FA0402#82FFF220673070D7 (1410715093.078638) can0 19FA0402#8365120F000000F2 (1410715093.081629) can0 19FA0402#840ED1150B20BF11 (1410715093.084620) can0 19FA0402#85CEFFFFFFF216DC (1410715093.087946) can0 19FA0402#8608AD2D4010ECFF (1410715093.090632) can0 19FA0402#87FFFFF2017F257C (1410715093.093623) can0 19FA0402#88D9A51116000000 (1410715093.096583) can0 19FA0402#89F21B8B099574F4 (1410715093.099879) can0 19FA0402#8A1002000000F217 (1410715093.102595) can0 19FA0402#8B2E08CE8DD111C7 (1410715093.105616) can0 19FA0402#8CFFFFFFF2042215 (1410715093.108607) can0 19FA0402#8DAAD21E113F0000 (1410715093.111842) can0 19FA0402#8E00F21FE80A0A4D (1410715093.114619) can0 19FA0402#8FF11030000000F2 (1410715093.117609) can0 19FA0402#901C680313C73D0F (1410715093.120600) can0 19FA0402#914D000000F213F3 (1410715093.123865) can0 19FA0402#921B7D7F37133500 (1410715093.126582) can0 19FA0402#930000F214D115C2 (1410715093.129603) can0 19FA0402#94B8321258000000 (1410715093.132624) can0 19FA0402#95F2FFFFFFFFFFFF (1410715093.135859) can0 0DF80502#802F0AC73F20F25A (1410715093.138605) can0 0DF80502#81248054320CE942 (1410715093.141627) can0 0DF80502#824305C091E9BAC6 (1410715093.144587) can0 0DF80502#83B931033ACAAB02 (1410715093.148096) can0 0DF80502#840000000013FC0C (1410715093.150690) can0 0DF80502#8549008000AC0D00 (1410715093.153620) can0 0DF80502#860000FFFFFFFFFF (1410715093.156580) can0 09F80102#8A719A16E71AB80D (1410715093.188654) can0 09F80202#0BFC00000700FFFF (1410715093.213618) can0 09F80102#8A719A16E71AB80D (1410715093.313593) can0 09F80102#8A719A16E71AB80D (1410715093.413569) can0 09F80102#8A719A16E71AB80D (1410715093.438624) can0 09F80202#0CFC00000700FFFF (1410715093.445094) can0 19F212B0#A00954000064FF13 (1410715093.445673) can0 19F212B0#A11C0A00FFFFFFFF (1410715093.446223) can0 19F214B0#00EB04C5FF667854 (1410715093.513544) can0 09F80102#8A719A16E71AB80D (1410715093.613490) can0 09F80102#8A719A16E71AB80D (1410715093.688471) can0 09F80202#0DFC00000700FFFF (1410715093.713465) can0 09F80102#8A719A16E71AB80D (1410715093.813410) can0 09F80102#8A719A16E71AB80D (1410715093.913386) can0 09F80102#8A719A16E71AB80D (1410715093.938624) can0 09F80202#0EFC00000700FFFF (1410715094.013331) can0 09F80102#8A719A16E71AB80D (1410715094.033381) can0 0DF50B11#018C030000FFFFFF (1410715094.072321) can0 0DF01002#0FF0C73F30195B24 (1410715094.075312) can0 19FA0302#0FD3490068006400 (1410715094.078547) can0 19FA0402#A0930FFD0C0B2D35 (1410715094.081385) can0 19FA0402#A1AAC3A711010000 (1410715094.084284) can0 19FA0402#A200F220673070D7 (1410715094.087305) can0 19FA0402#A385120D000000F2 (1410715094.090601) can0 19FA0402#A40ED1150B20C811 (1410715094.093348) can0 19FA0402#A5CEFFFFFFF216DC (1410715094.096278) can0 19FA0402#A608AD2D7810E5FF (1410715094.099299) can0 19FA0402#A7FFFFF2017F257C (1410715094.102686) can0 19FA0402#A8D9CA1118000000 (1410715094.105341) can0 19FA0402#A9F21B8B099574FD (1410715094.108302) can0 19FA0402#AA1005000000F217 (1410715094.111292) can0 19FA0402#AB2E08CE8DE711C5 (1410715094.114619) can0 19FA0402#ACFFFFFFF2042215 (1410715094.117274) can0 19FA0402#ADAAD20711360000 (1410715094.120295) can0 19FA0402#AE00F21FE80A0A4D (1410715094.123286) can0 19FA0402#AFF71031000000F2 (1410715094.126551) can0 19FA0402#B01C680365C64E0F (1410715094.129328) can0 19FA0402#B14E000000F213F3 (1410715094.132288) can0 19FA0402#B21B7D7F2B133700 (1410715094.135279) can0 19FA0402#B30000F214D115C2 (1410715094.138544) can0 19FA0402#B4B8F21158000000 (1410715094.141444) can0 19FA0402#B5F2FFFFFFFFFFFF (1410715094.144282) can0 0DF80502#A02F0FC73F30195B (1410715094.147272) can0 0DF80502#A1248054320CE942 (1410715094.150599) can0 0DF80502#A24305C091E9BAC6 (1410715094.153284) can0 0DF80502#A3B931033ACAAB02 (1410715094.156306) can0 0DF80502#A40000000013FC0C (1410715094.159266) can0 0DF80502#A549008000AC0D00 (1410715094.162653) can0 0DF80502#A60000FFFFFFFFFF (1410715094.165278) can0 09F80102#8A719A16E71AB80D (1410715094.196345) can0 09F80202#10FC00000800FFFF (1410715094.214289) can0 1DEFFF01#E00AE598B6060404 (1410715094.214869) can0 1DEFFF01#E100000002FFFFFF (1410715094.221461) can0 09F80102#8A719A16E71AB80D (1410715094.321436) can0 09F80102#8A719A16E71AB80D (1410715094.443842) can0 09F80102#8A719A16E71AB80D (1410715094.446589) can0 09F80202#11FC00000800FFFF (1410715094.521418) can0 09F80102#8A719A16E71AB80D (1410715094.621455) can0 09F80102#8A719A16E71AB80D (1410715094.696162) can0 09F80202#12FC00000800FFFF (1410715094.721430) can0 09F80102#8A719A16E71AB80D (1410715094.821497) can0 09F80102#8A719A16E71AB80D (1410715094.921442) can0 09F80102#8A719A16E71AB80D (1410715094.944910) can0 19F212B0#C00963000064FF12 (1410715094.945460) can0 19F212B0#C11C0900FFFFFFFF (1410715094.946009) can0 19F214B0#00EB04C4FF667863 (1410715094.946589) can0 09F80202#13FC00000800FFFF (1410715095.021479) can0 09F80102#8A719A16E71AB80D (1410715095.034907) can0 0DF50B11#018C030000FFFFFF (1410715095.100764) can0 0DF01002#14F0C73F40405B24 (1410715095.103022) can0 19FA0302#14D3490068006400 (1410715095.105982) can0 19FA0402#C09314FD0C0B2D35 (1410715095.109370) can0 19FA0402#C1AAC37412FFFFFF (1410715095.111964) can0 19FA0402#C2FFF220673070D7 (1410715095.114985) can0 19FA0402#C35D120B000000F2 (1410715095.117945) can0 19FA0402#C40ED1150B20E711 (1410715095.121424) can0 19FA0402#C5D7FFFFFFF216DC (1410715095.123957) can0 19FA0402#C608AD2D9410E2FF (1410715095.126978) can0 19FA0402#C7FFFFF2017F257C (1410715095.129969) can0 19FA0402#C8D94B1217000000 (1410715095.133295) can0 19FA0402#C9F21B8B099574FB (1410715095.135981) can0 19FA0402#CA1002000000F217 (1410715095.138941) can0 19FA0402#CB2E08CE8DC011C5 (1410715095.141962) can0 19FA0402#CCFFFFFFF2042215 (1410715095.145319) can0 19FA0402#CDAAD27111330000 (1410715095.148005) can0 19FA0402#CE00F21FE80A0A4D (1410715095.150965) can0 19FA0402#CFEC1031000000F2 (1410715095.153956) can0 19FA0402#D01C680365C63F0F (1410715095.155909) can0 11F80E01#201B0188F64A0E90 (1410715095.156458) can0 11F80E01#21FAB80DE0FD9916 (1410715095.157008) can0 11F80E01#228CFFFF00007205 (1410715095.157587) can0 11F80E01#2300154F000000FE (1410715095.158167) can0 19FA0402#D14A000000F213F3 (1410715095.159937) can0 19FA0402#D21B7D7FCD123A00 (1410715095.162959) can0 19FA0402#D30000F214D115C2 (1410715095.165949) can0 19FA0402#D4B8261259000000 (1410715095.169367) can0 19FA0402#D5F2FFFFFFFFFFFF (1410715095.171961) can0 0DF80502#C02F14C73F40405B (1410715096.411890) can0 09F80102#8A719A16E71AB80D (1410715096.422205) can0 11F80E01#801B01582F470EB0 (1410715096.422755) can0 11F80E01#81520A0EC0D4A016 (1410715096.423334) can0 11F80E01#82943BEF0000D3C0 (1410715096.423884) can0 11F80E01#8308FFFFFF7F00FE (1410715096.436640) can0 09F80202#1BFC00000800FFFF (1410715096.445155) can0 19F212B0#E00972000064FF12 (1410715096.445734) can0 19F212B0#E11C0800FFFFFFFF (1410715096.446284) can0 19F214B0#00EB04C4FF667872 (1410715096.511896) can0 09F80102#8A719A16E71AB80D (1410715096.611842) can0 09F80102#8A719A16E71AB80D (1410715096.686640) can0 09F80202#1CFC00000800FFFF (1410715096.711512) can0 09F80102#8A719A16E71AB80D (1410715096.811457) can0 09F80102#8A719A16E71AB80D (1410715096.911433) can0 09F80102#8A719A16E71AB80D (1410715096.936457) can0 09F80202#1DFC00000800FFFF (1410715097.011408) can0 09F80102#8A719A16E71AB80D (1410715097.038264) can0 0DF50B11#018C030000FFFFFF (1410715097.072504) can0 0DF01002#1EF0C73F608E5B24 (1410715097.075373) can0 19FA0302#1ED3490068006400 (1410715097.078577) can0 19FA0402#00931EFD0C0B2D35 (1410715097.081446) can0 19FA0402#01AAC32312030000 (1410715097.084345) can0 19FA0402#0200F220673070D7 (1410715097.087366) can0 19FA0402#03671214000000F2 (1410715097.090601) can0 19FA0402#040ED1150B201112 (1410715097.093348) can0 19FA0402#05CDFFFFFFF216DC (1410715097.096339) can0 19FA0402#0608AD2D7210E5FF (1410715097.099360) can0 19FA0402#07FFFFF2017F257C (1410715097.102656) can0 19FA0402#08D9151319000000 (1410715097.105341) can0 19FA0402#09F21B8B099574DE (1410715097.108363) can0 19FA0402#0A1004000000F217 (1410715097.111323) can0 19FA0402#0B2E08CE8D7711C4 (1410715097.114619) can0 19FA0402#0CFFFFFFF2042215 (1410715097.117335) can0 19FA0402#0DAAD2C1112B0000 (1410715097.120356) can0 19FA0402#0E00F21FE80A0A4D (1410715097.123347) can0 19FA0402#0FFB1026000000F2 (1410715097.126551) can0 19FA0402#101C680365C6790F (1410715097.129420) can0 19FA0402#113B000000F213F3 (1410715097.132349) can0 19FA0402#121B7D7F8F123C00 (1410715097.135340) can0 19FA0402#130000F214D115C2 (1410715097.138575) can0 19FA0402#14B8271266000000 (1410715097.141718) can0 19FA0402#15F2FFFFFFFFFFFF (1410715097.144343) can0 0DF80502#002F1EC73F608E5B (1410715097.147334) can0 0DF80502#01248054320CE942 (1410715097.150690) can0 0DF80502#024305C091E9BAC6 (1410715097.153315) can0 0DF80502#03B931033ACAAB02 (1410715097.156336) can0 0DF80502#040000000013FC0C (1410715097.159327) can0 0DF80502#0549008000AC0D00 (1410715097.162653) can0 0DF80502#060000FFFFFFFFFF (1410715097.165308) can0 09F80102#8A719A16E71AB80D (1410715097.196375) can0 09F80202#1FFC6CC00A00FFFF (1410715097.221491) can0 09F80102#8A719A16E71AB80D (1410715097.321467) can0 09F80102#8A719A16E71AB80D (1410715097.421503) can0 09F80102#8A719A16E71AB80D (1410715097.446589) can0 09F80202#20FC6CC00A00FFFF (1410715097.521479) can0 09F80102#8A719A16E71AB80D (1410715097.621729) can0 09F80102#8A719A16E71AB80D (1410715097.696223) can0 09F80202#21FC6CC00A00FFFF (1410715097.721461) can0 09F80102#8A719A16E71AB80D (1410715097.821497) can0 09F80102#8A719A16E71AB80D gpsd-3.15/test/nmea2000/logfile_20140914_365495765_can.log.chk0000664000175000017500000647325312471065612020574 0ustar esresr{"class":"VERSION","release":"3.12~dev","rev":"release-3.11-314-gcdcee16","proto_major":3,"proto_minor":10} {"class":"DEVICES","devices":[{"class":"DEVICE","path":"nmea2000://vcan0","driver":"NMEA2000","activated":"2015-01-31T08:35:54.884Z"}]} {"class":"WATCH","enable":true,"json":true,"nmea":true,"raw":0,"scaled":true,"timing":false,"split24":false,"pps":false} $GPRMC,000000,V,3755.3232,N,02301.0145,E,0.0000,0.000,000000,,*3E $GPGSA,A,0,,,,,,,,,,,,,0.0,0.0,0.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":0} $GPGSA,A,0,,,,,,,,,,,,,0.0,0.0,0.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":0} $GPRMC,000000,V,3755.3232,N,02301.0145,E,0.0583,0.000,000000,,*30 $GPGSA,A,0,,,,,,,,,,,,,0.0,0.0,0.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":0} $GPRMC,000000,V,3755.3232,N,02301.0145,E,0.0583,0.000,000000,,*30 $GPGSA,A,0,,,,,,,,,,,,,0.0,0.0,0.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":0} $GPRMC,000000,V,3755.3232,N,02301.0145,E,0.0583,0.000,000000,,*30 $GPGSA,A,0,,,,,,,,,,,,,0.0,0.0,0.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":0} $GPGSA,A,0,,,,,,,,,,,,,0.0,0.0,0.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":0} $GPRMC,000000,V,3755.3232,N,02301.0145,E,0.0583,0.000,000000,,*30 $GPGSA,A,0,,,,,,,,,,,,,0.0,0.0,0.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":0} $GPGSA,A,0,,,,,,,,,,,,,0.0,0.0,0.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":0,"time":"2014-09-14T16:53:04.000Z","ept":0.005} $GPGSA,A,3,,,,,,,,,,,,,0.0,0.7,1.1*35 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"epv":24.150,"track":0.0000,"speed":0.030} $GPGSV,3,1,12,11,77,292,48,32,71,311,48,14,33,048,45,22,14,066,45*79 $GPGSV,3,2,12,01,53,319,50,27,16,171,43,23,10,207,43,04,30,309,44*7F $GPGSV,3,3,12,31,15,115,45,28,06,293,35,19,43,188,46,20,30,269,44*7A {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.29,"satellites":[{"PRN":11,"el":77,"az":292,"ss":48,"used":true},{"PRN":32,"el":71,"az":311,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":66,"ss":45,"used":true},{"PRN":1,"el":53,"az":319,"ss":50,"used":true},{"PRN":27,"el":16,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":207,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":15,"az":115,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":43,"az":188,"ss":46,"used":true},{"PRN":20,"el":30,"az":269,"ss":44,"used":true}]} $GPZDA,165304.00,14,09,2014,00,00*68 $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053451,"lon":23.016909028,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165304,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165304,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165304,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} {"class":"DEVICE","path":"nmea2000://vcan0:176","activated":1422693357.713277} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165304,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165304,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} {"class":"DEVICE","path":"nmea2000://vcan0:1","activated":1422693358.015235} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165304,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165304,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPGGA,165304,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165304,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:04.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000} $GPZDA,165305.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165305,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,B3R8SG0000JEl75K;v4r;wR5h006,0*7E {"class":"AIS","device":"nmea2000://vcan0:1","type":18,"repeat":0,"mmsi":237118300,"scaled":true,"reserved":0,"speed":0.0,"accuracy":false,"lon":23.0170,"lat":37.9221,"course":93.0,"heading":511,"second":4,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":false,"radio":6} $GPGSV,3,1,12,11,77,292,47,32,71,311,48,14,33,048,46,22,14,066,45*75 $GPGSV,3,2,12,01,53,319,48,27,16,171,41,23,10,207,43,04,30,309,43*73 $GPGSV,3,3,12,31,15,115,44,28,06,293,35,19,42,188,46,20,30,269,47*79 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":47,"used":true},{"PRN":32,"el":71,"az":311,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":14,"az":66,"ss":45,"used":true},{"PRN":1,"el":53,"az":319,"ss":48,"used":true},{"PRN":27,"el":16,"az":171,"ss":41,"used":true},{"PRN":23,"el":10,"az":207,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":15,"az":115,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":30,"az":269,"ss":47,"used":true}]} $GPZDA,165305.00,14,09,2014,00,00*69 $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053451,"lon":23.016909028,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165305,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165305,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165305,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165305,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"DEVICE","path":"nmea2000://vcan0:17","activated":1422693358.958313} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165305,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13U9mB001M1``vnEgc6c`q46083K,0*45 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240285000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":9.3,"accuracy":false,"lon":22.8590,"lat":38.0020,"course":297.9,"heading":290,"second":3,"maneuver":0,"raim":false,"radio":32987} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165305,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165305,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165305,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165305,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:05.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165306.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165306,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,47,32,71,311,50,14,33,048,46,22,14,066,45*7C $GPGSV,3,2,12,01,53,319,48,27,16,171,42,23,10,207,43,04,30,309,44*77 $GPGSV,3,3,12,31,15,115,44,28,06,293,35,19,42,188,47,20,30,269,43*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":47,"used":true},{"PRN":32,"el":71,"az":311,"ss":50,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":14,"az":66,"ss":45,"used":true},{"PRN":1,"el":53,"az":319,"ss":48,"used":true},{"PRN":27,"el":16,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":207,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":15,"az":115,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":30,"az":269,"ss":43,"used":true}]} $GPZDA,165306.00,14,09,2014,00,00*6A $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053451,"lon":23.016909028,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165306,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165306,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165306,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165306,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165306,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165306,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165306,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165306,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165306,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:06.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165307.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165307,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,47,32,71,311,50,14,33,048,46,22,14,066,45*7C $GPGSV,3,2,12,01,53,319,50,27,16,171,43,23,10,207,42,04,30,309,46*7C $GPGSV,3,3,12,31,15,115,45,28,06,293,35,19,42,188,48,20,31,270,43*7B {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":47,"used":true},{"PRN":32,"el":71,"az":311,"ss":50,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":14,"az":66,"ss":45,"used":true},{"PRN":1,"el":53,"az":319,"ss":50,"used":true},{"PRN":27,"el":16,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":207,"ss":42,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":15,"az":115,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165307.00,14,09,2014,00,00*6B $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053451,"lon":23.016909028,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165307,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165307,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165307,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165307,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165307,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165307,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165307,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165307,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165307,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:07.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165308.00,14,09,2014,00,00*64 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165308,7.29,M,8.30,M,24.15,M*02 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,311,47,14,33,048,46,22,14,066,46*7B $GPGSV,3,2,12,01,53,319,51,27,16,171,43,23,10,207,42,04,30,309,45*7E $GPGSV,3,3,12,31,15,115,45,28,06,293,35,19,42,188,49,20,31,270,44*7D {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":311,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":14,"az":66,"ss":46,"used":true},{"PRN":1,"el":53,"az":319,"ss":51,"used":true},{"PRN":27,"el":16,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":207,"ss":42,"used":true},{"PRN":4,"el":30,"az":309,"ss":45,"used":true},{"PRN":31,"el":15,"az":115,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":49,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165308.00,14,09,2014,00,00*64 $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053451,"lon":23.016909028,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165308,7.29,M,8.30,M,24.15,M*02 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165308,7.29,M,8.30,M,24.15,M*02 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165308,7.29,M,8.30,M,24.15,M*02 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165308,7.29,M,8.30,M,24.15,M*02 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165308,7.29,M,8.30,M,24.15,M*02 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165308,7.29,M,8.30,M,24.15,M*02 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165308,7.29,M,8.30,M,24.15,M*02 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,33RjbB0uRB1c;TLEVP4e7wv:0iiQ,0*65 {"class":"AIS","device":"nmea2000://vcan0:1","type":3,"repeat":0,"mmsi":237808200,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":14.6,"accuracy":false,"lon":23.4140,"lat":37.7515,"course":335.9,"heading":511,"second":5,"maneuver":0,"raim":false,"radio":203873} $GPGGA,165308,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165308,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:08.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165309.00,14,09,2014,00,00*65 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165309,7.29,M,8.30,M,24.15,M*03 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,311,48,14,33,048,46,22,14,066,44*76 $GPGSV,3,2,12,01,53,319,50,27,16,171,42,23,10,207,43,04,30,309,46*7C $GPGSV,3,3,12,31,15,115,45,28,06,293,34,19,42,188,47,20,31,270,46*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":311,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":14,"az":66,"ss":44,"used":true},{"PRN":1,"el":53,"az":319,"ss":50,"used":true},{"PRN":27,"el":16,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":207,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":15,"az":115,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":46,"used":true}]} $GPZDA,165309.00,14,09,2014,00,00*65 $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053451,"lon":23.016909028,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.1166,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165309,7.29,M,8.30,M,24.15,M*03 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165309,7.29,M,8.30,M,24.15,M*03 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13V9KV0uP01acfFEdTeaKgvD041:,0*00 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0868,"lat":37.9173,"course":241.4,"heading":511,"second":10,"maneuver":0,"raim":false,"radio":16458} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165309,7.29,M,8.30,M,24.15,M*03 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165309,7.29,M,8.30,M,24.15,M*03 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165309,7.29,M,8.30,M,24.15,M*03 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165309,7.29,M,8.30,M,24.15,M*03 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165309,7.29,M,8.30,M,24.15,M*03 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165309,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165309,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:09.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165310.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165310,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,44,32,71,311,48,14,33,048,45,22,14,066,45*75 $GPGSV,3,2,12,01,53,319,50,27,16,171,42,23,10,207,43,04,30,309,46*7C $GPGSV,3,3,12,31,15,115,46,28,06,293,35,19,42,188,47,20,31,270,45*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":44,"used":true},{"PRN":32,"el":71,"az":311,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":66,"ss":45,"used":true},{"PRN":1,"el":53,"az":319,"ss":50,"used":true},{"PRN":27,"el":16,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":207,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":15,"az":115,"ss":46,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} $GPZDA,165310.00,14,09,2014,00,00*6D $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053451,"lon":23.016909028,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165310,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165310,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165310,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165310,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165310,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165310,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165310,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165310,3755.3232,N,02301.0145,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165310,A,3755.3232,N,02301.0145,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:10.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165311.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165311,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:11.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:11.000Z","ept":0.005,"lat":37.922053400,"lon":23.016909000,"alt":7.977,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,311,47,14,33,048,45,22,14,067,45*7A $GPGSV,3,2,12,01,53,319,50,27,16,171,42,23,10,207,43,04,30,309,46*7C $GPGSV,3,3,12,31,15,115,45,28,06,293,35,19,42,188,48,20,31,270,45*7D {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":311,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":53,"az":319,"ss":50,"used":true},{"PRN":27,"el":16,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":207,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":15,"az":115,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} !AIVDM,1,1,,B,13UjG20000Qai;NEdI1mm,0*6F {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240285000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":9.3,"accuracy":false,"lon":22.8580,"lat":38.0024,"course":298.9,"heading":290,"second":23,"maneuver":0,"raim":false,"radio":33717} $GPGGA,165325,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165325,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165325,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165325,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165325,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165325,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165325,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165325,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165325,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165325,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165325,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165325,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165325,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGGA,165325,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165325,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165325,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165325,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165325,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165325,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165325,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165325,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:25.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165326.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165326,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,46,32,71,311,49,14,33,048,44,22,14,067,45*76 $GPGSV,3,2,12,01,53,319,51,27,15,171,43,23,10,208,43,04,30,309,46*70 $GPGSV,3,3,12,31,15,115,45,28,06,293,36,19,42,188,46,20,31,270,44*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":46,"used":true},{"PRN":32,"el":71,"az":311,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":53,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":15,"az":115,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":36,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165326.00,14,09,2014,00,00*68 $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165326,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165326,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165326,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165326,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165326,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165326,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165326,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165326,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165326,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:26.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165327.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165327,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,48,32,71,311,48,14,33,048,44,22,14,067,45*79 $GPGSV,3,2,12,01,53,319,50,27,15,171,43,23,10,208,43,04,30,309,47*70 $GPGSV,3,3,12,31,15,115,45,28,06,293,36,19,42,188,47,20,31,270,44*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":48,"used":true},{"PRN":32,"el":71,"az":311,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":53,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":15,"az":115,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":36,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165327.00,14,09,2014,00,00*69 $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165327,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165327,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165327,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165327,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165327,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165327,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165327,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165327,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165327,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:27.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165328.00,14,09,2014,00,00*66 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165328,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:28.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:28.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,311,48,14,33,048,45,22,14,067,45*75 $GPGSV,3,2,12,01,53,319,51,27,15,171,42,23,10,208,42,04,30,309,47*71 $GPGSV,3,3,12,31,15,115,45,28,06,293,36,19,42,188,47,20,31,270,44*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":311,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":53,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":42,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":15,"az":115,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":36,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165328.00,14,09,2014,00,00*66 $GPGGA,165328,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165328,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:28.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165328,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165328,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165328,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:28.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,144cGEgdPscI52163D,0*7A {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240285000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":9.3,"accuracy":false,"lon":22.8577,"lat":38.0026,"course":298.9,"heading":290,"second":33,"maneuver":0,"raim":false,"radio":286932} $GPGGA,165335,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165335,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:35.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165335,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:35.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165335,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165335,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:35.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165335,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165335,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165335,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:35.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165335,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165335,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:35.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165335,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:35.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGGA,165335,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165335,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:35.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165336.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165336,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,313,47,14,33,048,46,22,14,067,45*7B $GPGSV,3,2,12,01,54,319,51,27,15,171,42,23,10,208,42,04,30,309,46*77 $GPGSV,3,3,12,31,16,114,46,28,06,293,35,19,42,188,46,20,31,270,43*74 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":42,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":46,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165336.00,14,09,2014,00,00*69 $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165336,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13TcnR00001aHsTEd`wvbSW60<0N,0*72 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":239793800,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0227,"lat":37.9191,"course":375.4,"heading":115,"second":35,"maneuver":0,"raim":false,"radio":49182} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165336,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165336,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165336,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165336,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165336,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165336,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165336,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165336,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:36.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} !AIVDM,1,1,,B,144cG402;oDi=H9?V204V0LT4ppU>2222222221@=PH<<6E;0?@Ap523i4Sj,0*33 !AIVDM,2,2,0,A,H8888888880,2*54 {"class":"AIS","device":"nmea2000://vcan0:1","type":5,"repeat":0,"mmsi":241258000,"scaled":true,"imo":9166156,"ais_version":0,"callsign":"SVBS9 ","shipname":"AI GIANNIS ","shiptype":80,"shiptype_text":"Tanker - all ships of this type","to_bow":108,"to_stern":24,"to_port":12,"to_starboard":12,"epfd":1,"epfd_text":"GPS","eta":"09-10T11:00Z","draught":6.1,"destination":"AG THODROI ","dte":0} $GPGGA,165338,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165338,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:38.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165338,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:38.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165338,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165338,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:38.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165338,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165338,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165338,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:38.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165338,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165338,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:38.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165338,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:38.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165338,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*49 $GPRMC,165338,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:38.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPZDA,165339.00,14,09,2014,00,00*66 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165339,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,47,32,71,313,49,14,33,048,45,22,14,067,45*74 $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,10,208,41,04,30,309,46*7D $GPGSV,3,3,12,31,16,114,45,28,06,293,34,19,42,188,47,20,31,270,44*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":47,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":41,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165339.00,14,09,2014,00,00*66 $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165339,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165339,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165339,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165339,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165339,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165339,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165339,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165339,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*48 $GPRMC,165339,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:39.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPZDA,165340.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165340,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,313,49,14,33,048,45,22,14,067,44*77 $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,10,208,41,04,30,309,46*7D $GPGSV,3,3,12,31,16,114,45,28,06,293,33,19,42,188,47,20,31,270,44*77 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":41,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":33,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165340.00,14,09,2014,00,00*68 $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165340,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165340,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165340,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13UjG20000Qai;jEdHwU>p1>0@Sk,0*24 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240949000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":true,"lon":23.1055,"lat":37.9123,"course":133.9,"heading":256,"second":39,"maneuver":0,"raim":false,"radio":67827} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165340,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13V9KV0uP01acfJEdTeIKgwB0@R;,0*36 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0868,"lat":37.9173,"course":241.4,"heading":511,"second":41,"maneuver":0,"raim":false,"radio":67723} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165340,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165340,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165340,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGGA,165340,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*46 $GPRMC,165340,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:40.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165341.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165341,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,313,48,14,33,048,45,22,14,067,43*71 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,10,208,43,04,30,309,46*77 $GPGSV,3,3,12,31,16,114,45,28,06,293,32,19,42,188,47,20,31,270,44*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":32,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165341.00,14,09,2014,00,00*69 $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165341,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165341,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165341,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165341,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165341,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165341,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165341,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGGA,165341,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*47 $GPRMC,165341,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:41.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165342.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165342,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,313,47,14,33,048,44,22,14,067,43*7F $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,10,208,43,04,30,309,46*77 $GPGSV,3,3,12,31,16,114,45,28,06,293,32,19,42,188,47,20,31,270,44*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":14,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":32,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165342.00,14,09,2014,00,00*6A $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165342,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165342,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165342,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165342,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165342,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165342,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165342,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165342,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165342,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:42.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPZDA,165343.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165343,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,313,48,14,33,048,44,22,14,067,43*70 $GPGSV,3,2,12,01,54,319,51,27,15,171,42,23,10,208,43,04,30,309,47*77 $GPGSV,3,3,12,31,16,114,45,28,06,293,32,19,42,188,46,20,31,270,43*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":14,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":32,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165343.00,14,09,2014,00,00*6B $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165343,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165343,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,2,1,1,A,53Unp602AKv==H87J20I8E>2222222222222221@7pI776Fl0=@AjCjH521C,0*37 !AIVDM,2,2,1,A,i3lSjH88880,2*62 {"class":"AIS","device":"nmea2000://vcan0:1","type":5,"repeat":0,"mmsi":241023000,"scaled":true,"imo":9531363,"ais_version":0,"callsign":"SVBA6 ","shipname":"FRES ","shiptype":80,"shiptype_text":"Tanker - all ships of this type","to_bow":63,"to_stern":25,"to_port":7,"to_starboard":7,"epfd":1,"epfd_text":"GPS","eta":"09-13T20:00Z","draught":5.3,"destination":"AGIOI THEODOROI ","dte":0} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165343,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13<@ab@0001aIF>Ed`vLiaAH163D,0*40 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":214182313,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0241,"lat":37.9191,"course":327.0,"heading":296,"second":44,"maneuver":0,"raim":false,"radio":286932} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165343,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165343,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165343,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165343,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165343,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165343,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:43.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13RjbB0uRE1c;>VEVUReAwwB0<1A,0*61 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":237808200,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":14.9,"accuracy":false,"lon":23.4128,"lat":37.7538,"course":339.9,"heading":511,"second":41,"maneuver":0,"raim":false,"radio":49233} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPZDA,165344.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165344,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,46,32,71,313,49,14,33,048,45,22,14,067,43*73 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,10,208,43,04,30,309,47*76 $GPGSV,3,3,12,31,16,114,44,28,06,293,31,19,42,188,47,20,31,270,44*74 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":31,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} !AIVDM,1,1,,A,39TH1912001a`iNEd018WGsF2000,0*13 {"class":"AIS","device":"nmea2000://vcan0:1","type":3,"repeat":0,"mmsi":642122020,"scaled":true,"status":1,"status_text":"At anchor","turn":3,"speed":0.0,"accuracy":false,"lon":23.0768,"lat":37.9017,"course":220.5,"heading":253,"second":43,"maneuver":0,"raim":true,"radio":0} $GPZDA,165344.00,14,09,2014,00,00*6C $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165344,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165344,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165344,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165344,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165344,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13TcnR00001aHsbEda0vbSWH08Jk,0*24 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":239793800,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0227,"lat":37.9192,"course":375.4,"heading":115,"second":44,"maneuver":0,"raim":false,"radio":34483} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165344,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165344,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165344,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165344,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:44.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPZDA,165345.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165345,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,313,50,14,33,048,45,22,14,067,44*7F $GPGSV,3,2,12,01,54,319,51,27,15,171,41,23,10,208,43,04,30,309,47*74 $GPGSV,3,3,12,31,16,114,44,28,06,293,31,19,42,188,46,20,31,270,45*74 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":50,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":41,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":31,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} $GPZDA,165345.00,14,09,2014,00,00*6D $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0000,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165345,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165345,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165345,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165345,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165345,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165345,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165345,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165345,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165345,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:45.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPZDA,165346.00,14,09,2014,00,00*6E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165346,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,292,45,32,71,313,49,14,33,048,45,22,14,067,44*77 $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,10,208,43,04,30,309,46*7F $GPGSV,3,3,12,31,16,114,44,28,06,293,31,19,42,188,46,20,31,270,44*75 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":31,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165346.00,14,09,2014,00,00*6E $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165346,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165346,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165346,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165346,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165346,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165346,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165346,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165346,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165346,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:46.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165347.00,14,09,2014,00,00*6F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165347,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGSV,3,1,12,11,77,292,45,32,71,313,48,14,33,048,45,22,14,067,43*71 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,10,208,42,04,30,309,47*77 $GPGSV,3,3,12,31,16,114,44,28,06,293,31,19,42,188,47,20,31,270,44*74 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":292,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":42,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":31,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165347.00,14,09,2014,00,00*6F $GPGGA,165347,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165347,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165347,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165347,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165347,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165347,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165347,A,3755.3226,N,02301.0153,E,0.0194,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165347,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165347,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165347,A,3755.3226,N,02301.0153,E,0.0194,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165347,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165347,A,3755.3226,N,02301.0153,E,0.0194,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165347,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165347,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165347,A,3755.3226,N,02301.0153,E,0.0194,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165347,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165347,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165347,A,3755.3226,N,02301.0153,E,0.0194,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165347,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165347,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165347,A,3755.3226,N,02301.0153,E,0.0194,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165347,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165347,A,3755.3226,N,02301.0153,E,0.0194,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165347,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:47.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,144cG410011aUO2Ed4LGJpg`0000,0*14 {"class":"AIS","device":"nmea2000://vcan0:1","type":3,"repeat":0,"mmsi":241258000,"scaled":true,"status":1,"status_text":"At anchor","turn":0,"speed":0.1,"accuracy":false,"lon":23.0655,"lat":37.9035,"course":189.9,"heading":279,"second":52,"maneuver":0,"raim":false,"radio":0} $GPGGA,165352,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165352,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:52.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165352,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165352,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165352,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:52.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165352,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165352,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:52.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165352,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:52.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165352,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*45 $GPRMC,165352,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:52.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165353.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165353,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,313,49,14,33,048,43,22,14,067,44*72 $GPGSV,3,2,12,01,54,319,51,27,15,171,42,23,10,208,41,04,30,309,47*75 $GPGSV,3,3,12,31,16,114,44,28,06,293,33,19,42,188,47,20,31,270,44*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":43,"used":true},{"PRN":22,"el":14,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":41,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":33,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPZDA,165353.00,14,09,2014,00,00*6A $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165353,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165353,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165353,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165353,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165353,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13<@ab@0001aIFBEd`usPaAd163D,0*16 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":214182313,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0241,"lat":37.9191,"course":294.6,"heading":296,"second":54,"maneuver":0,"raim":false,"radio":286932} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165353,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165353,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165353,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*44 $GPRMC,165353,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:53.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165354.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165354,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGSV,3,1,12,11,77,291,45,32,71,313,47,14,33,048,44,22,14,067,44*7B $GPGSV,3,2,12,01,54,319,51,27,15,171,42,23,10,208,41,04,30,309,48*7A $GPGSV,3,3,12,31,16,114,44,28,06,293,33,19,42,188,45,20,31,270,44*74 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":14,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":41,"used":true},{"PRN":4,"el":30,"az":309,"ss":48,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":33,"used":true},{"PRN":19,"el":42,"az":188,"ss":45,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165354.00,14,09,2014,00,00*6D $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165354,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165354,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165354,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13TcnR00001aHsREd`wvbSWd163D,0*24 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":239793800,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0227,"lat":37.9191,"course":375.4,"heading":115,"second":54,"maneuver":0,"raim":false,"radio":286932} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165354,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165354,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165354,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165354,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165354,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*43 $GPRMC,165354,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:54.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165355.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165355,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,313,48,14,33,048,44,22,14,067,44*74 $GPGSV,3,2,12,01,54,319,51,27,15,171,43,23,10,208,42,04,30,309,48*78 $GPGSV,3,3,12,31,16,114,44,28,06,293,32,19,42,188,46,20,31,270,42*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":14,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":42,"used":true},{"PRN":4,"el":30,"az":309,"ss":48,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":32,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":42,"used":true}]} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPZDA,165355.00,14,09,2014,00,00*6C $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165355,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165355,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165355,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165355,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165355,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165355,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165355,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165355,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*42 $GPRMC,165355,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:55.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165356.00,14,09,2014,00,00*6F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165356,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,47,32,71,313,49,14,33,048,44,22,14,067,44*77 $GPGSV,3,2,12,01,54,319,50,27,15,171,43,23,10,208,43,04,30,309,47*77 $GPGSV,3,3,12,31,16,114,44,28,06,293,32,19,42,188,45,20,31,270,42*73 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":47,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":14,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":32,"used":true},{"PRN":19,"el":42,"az":188,"ss":45,"used":true},{"PRN":20,"el":31,"az":270,"ss":42,"used":true}]} $GPZDA,165356.00,14,09,2014,00,00*6F $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165356,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165356,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165356,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165356,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165356,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165356,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165356,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165356,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*41 $GPRMC,165356,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:56.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165357.00,14,09,2014,00,00*6E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165357,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,50,14,33,048,44,22,14,067,45*7F $GPGSV,3,2,12,01,54,319,51,27,15,171,43,23,10,208,43,04,30,309,46*77 $GPGSV,3,3,12,31,16,114,45,28,06,293,32,19,42,188,46,20,31,270,43*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":50,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":32,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165357.00,14,09,2014,00,00*6E $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0583,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165357,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165357,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165357,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165357,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165357,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165357,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165357,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165357,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*40 $GPRMC,165357,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:57.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165358.00,14,09,2014,00,00*61 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165358,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,48,32,71,313,49,14,33,048,45,22,14,067,45*78 $GPGSV,3,2,12,01,54,319,49,27,15,171,43,23,10,208,43,04,30,309,46*7E $GPGSV,3,3,12,31,16,114,45,28,06,293,33,19,42,188,45,20,31,270,43*72 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":48,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":33,"used":true},{"PRN":19,"el":42,"az":188,"ss":45,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165358.00,14,09,2014,00,00*61 $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043873,"lon":23.016922366,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165358,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165358,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165358,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165358,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165358,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165358,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165358,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165358,3755.3226,N,02301.0153,E,1,12,0.73,7.98,M,35.000,M,,*4F $GPRMC,165358,A,3755.3226,N,02301.0153,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:58.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165359.00,14,09,2014,00,00*60 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165359,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922043800,"lon":23.016922300,"alt":7.982,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,44,32,71,313,49,14,33,048,45,22,14,067,45*74 $GPGSV,3,2,12,01,54,319,50,27,15,171,43,23,10,208,43,04,30,309,46*76 $GPGSV,3,3,12,31,16,114,44,28,06,293,33,19,42,188,47,20,31,270,44*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":44,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":33,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165359.00,14,09,2014,00,00*60 $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165359,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165359,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.170} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165359,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165359,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165359,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165359,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165359,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165359,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165359,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:53:59.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165400.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165400,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,313,48,14,33,048,45,22,14,067,45*74 $GPGSV,3,2,12,01,54,319,51,27,15,171,43,23,10,208,43,04,30,309,47*76 $GPGSV,3,3,12,31,16,114,44,28,06,293,34,19,42,188,47,20,31,270,45*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} $GPZDA,165400.00,14,09,2014,00,00*6B $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0000,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165400,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165400,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13V9KV0uP01acffEdTcqKgv2163H,0*30 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0869,"lat":37.9173,"course":241.4,"heading":511,"second":1,"maneuver":0,"raim":false,"radio":286936} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165400,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165400,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165400,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165400,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165400,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165400,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165400,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:00.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165401.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165401,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,313,49,14,33,048,46,22,14,067,46*75 $GPGSV,3,2,12,01,54,319,48,27,15,171,43,23,10,208,43,04,30,309,46*7F $GPGSV,3,3,12,31,16,114,45,28,06,293,35,19,42,188,46,20,31,270,44*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":14,"az":67,"ss":46,"used":true},{"PRN":1,"el":54,"az":319,"ss":48,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165401.00,14,09,2014,00,00*6A $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165401,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165401,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165401,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165401,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13UjG20000Qai;NEdHwUHp020@SJ,0*5A {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240949000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":true,"lon":23.1055,"lat":37.9123,"course":137.9,"heading":256,"second":1,"maneuver":0,"raim":false,"radio":67802} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165401,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165401,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165401,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165401,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165401,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:01.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165402.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165402,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,313,47,14,33,048,46,22,14,067,46*7B $GPGSV,3,2,12,01,54,319,48,27,15,171,43,23,10,208,43,04,30,309,46*7F $GPGSV,3,3,12,31,16,114,45,28,06,293,35,19,42,188,47,20,31,270,44*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":14,"az":67,"ss":46,"used":true},{"PRN":1,"el":54,"az":319,"ss":48,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165402.00,14,09,2014,00,00*69 $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165402,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165402,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165402,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165402,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165402,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13<@ab@0001aIErEd`wA:a@6081b,0*04 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":214182313,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0241,"lat":37.9191,"course":29.8,"heading":296,"second":3,"maneuver":0,"raim":false,"radio":32874} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165402,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165402,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165402,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165402,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:02.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165403.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165403,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,44,32,71,313,47,14,33,048,46,22,14,067,46*7A $GPGSV,3,2,12,01,54,319,49,27,15,171,43,23,10,208,43,04,30,309,46*7E $GPGSV,3,3,12,31,16,114,45,28,06,293,35,19,42,188,47,20,31,270,44*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":44,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":14,"az":67,"ss":46,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":188,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} !AIVDM,1,1,,B,39NSGji0001acAvEchaS8o460000,0*6B {"class":"AIS","device":"nmea2000://vcan0:1","type":3,"repeat":0,"mmsi":636016587,"scaled":true,"status":1,"status_text":"At anchor","turn":0,"speed":0.0,"accuracy":false,"lon":23.0853,"lat":37.8951,"course":80.3,"heading":226,"second":3,"maneuver":0,"raim":false,"radio":0} $GPZDA,165403.00,14,09,2014,00,00*68 $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165403,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165403,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165403,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165403,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165403,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165403,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165403,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165403,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165403,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:03.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165404.00,14,09,2014,00,00*6F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165404,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165404,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165404,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165404,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165404,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165404,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165404,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165404,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165404,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165404,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165404,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165404,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165404,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165404,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165404,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165404,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165404,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165404,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165404,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165404,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:04.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165406.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165406,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,48,14,33,048,44,22,14,067,45*76 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,10,208,42,04,30,309,47*77 $GPGSV,3,3,12,31,16,114,45,28,06,293,34,19,42,188,46,20,31,270,44*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":14,"az":67,"ss":45,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":42,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":188,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165406.00,14,09,2014,00,00*6D $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165406,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165406,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165406,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165406,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165406,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165406,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165406,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165406,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165406,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:06.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165407.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165407,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,47,32,71,313,48,14,33,048,45,22,14,067,44*77 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,10,208,43,04,30,309,46*77 $GPGSV,3,3,12,31,16,114,46,28,06,293,33,19,42,188,45,20,31,270,44*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":47,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":14,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":10,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":46,"used":true},{"PRN":28,"el":6,"az":293,"ss":33,"used":true},{"PRN":19,"el":42,"az":188,"ss":45,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165407.00,14,09,2014,00,00*6C $GPGGA,165407,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165407,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165407,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165407,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165407,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165407,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165407,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165407,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165407,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165407,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165407,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165407,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165407,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165407,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165407,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165407,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:07.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,144cGdTh0N0000,0*55 {"class":"AIS","device":"nmea2000://vcan0:1","type":3,"repeat":0,"mmsi":518684000,"scaled":true,"status":1,"status_text":"At anchor","turn":0,"speed":0.0,"accuracy":false,"lon":23.0568,"lat":37.9158,"course":321.9,"heading":0,"second":15,"maneuver":0,"raim":false,"radio":0} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165416,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165416,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165416,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165416,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165416,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGGA,165416,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165416,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165416,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165416,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165416,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165416,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165416,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165416,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165416,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165416,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165416,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165416,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165416,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165416,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165416,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165416,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165416,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165416,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165416,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:16.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165417.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165417,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,48,14,33,048,46,22,13,067,44*72 $GPGSV,3,2,12,01,54,319,47,27,15,171,42,23,11,208,43,04,30,309,44*72 $GPGSV,3,3,12,31,16,114,44,28,06,293,34,19,42,187,47,20,31,270,44*7E {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":47,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165417.00,14,09,2014,00,00*6D $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165417,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165417,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165417,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165417,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165417,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165417,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165417,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165417,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165417,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:17.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165418.00,14,09,2014,00,00*62 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165418,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,48,14,33,048,46,22,13,067,41*77 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,11,208,43,04,30,309,45*75 $GPGSV,3,3,12,31,16,114,44,28,06,293,34,19,42,187,46,20,31,270,46*7D {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":46,"used":true}]} $GPZDA,165418.00,14,09,2014,00,00*62 $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165418,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165418,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165418,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165418,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165418,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165418,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165418,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165418,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4E $GPRMC,165418,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:18.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165419.00,14,09,2014,00,00*63 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165419,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,313,47,14,33,048,46,22,13,067,42*78 $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,11,208,43,04,30,309,45*7D $GPGSV,3,3,12,31,16,114,45,28,06,293,34,19,42,187,48,20,31,270,45*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} $GPZDA,165419.00,14,09,2014,00,00*63 $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165419,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165419,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165419,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165419,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165419,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165419,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165419,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165419,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4F $GPRMC,165419,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:19.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165420.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165420,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,313,47,14,33,048,47,22,13,067,43*78 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,11,208,43,04,30,309,44*74 $GPGSV,3,3,12,31,16,114,46,28,06,293,34,19,42,187,47,20,31,270,44*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":47,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":46,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165420.00,14,09,2014,00,00*69 $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165420,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165420,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13V9KV0uP01acfhEdTeIKgvb08;q,0*6E {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0869,"lat":37.9173,"course":241.4,"heading":511,"second":21,"maneuver":0,"raim":false,"radio":33529} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165420,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165420,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165420,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165420,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165420,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165420,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165420,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:20.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165421.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165421,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,47,14,33,048,46,22,13,067,43*7A $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,11,208,43,04,30,309,44*7C $GPGSV,3,3,12,31,16,114,46,28,06,293,34,19,42,187,47,20,31,270,44*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":46,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165421.00,14,09,2014,00,00*68 $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165421,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165421,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165421,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165421,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165421,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13UjG20000Qai;:EdI1mWp0b041V,0*14 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240949000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":true,"lon":23.1054,"lat":37.9123,"course":143.9,"heading":256,"second":21,"maneuver":0,"raim":false,"radio":16486} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165421,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165421,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165421,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165421,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:21.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165422.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165422,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,48,14,33,048,45,22,13,067,43*76 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,11,208,43,04,30,309,46*76 $GPGSV,3,3,12,31,16,114,45,28,06,293,34,19,42,187,47,20,31,270,44*7F {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165422.00,14,09,2014,00,00*6B $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165422,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165422,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165422,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165422,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165422,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165422,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165422,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165422,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165422,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:22.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165423.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165423,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,48,14,33,048,45,22,13,067,43*76 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,11,208,44,04,30,309,46*71 $GPGSV,3,3,12,31,16,114,45,28,06,293,34,19,42,187,47,20,31,270,45*7E {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} $GPZDA,165423.00,14,09,2014,00,00*6A $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165423,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165423,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165423,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165423,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165423,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13<@ab@0001aIEHEda1PRq@h163H,0*69 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":214182313,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0241,"lat":37.9192,"course":13.9,"heading":296,"second":24,"maneuver":0,"raim":false,"radio":286936} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165423,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165423,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165423,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165423,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:23.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165424.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165424,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,313,48,14,33,048,45,22,13,067,43*75 $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,11,208,44,04,30,309,46*79 $GPGSV,3,3,12,31,16,114,45,28,06,293,35,19,42,187,48,20,31,270,44*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":293,"ss":35,"used":true},{"PRN":19,"el":42,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165424.00,14,09,2014,00,00*6D $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165424,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165424,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165424,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165424,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165424,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13TcnR00001aHt8Eda7vbSVh00?7,0*7E {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":239793800,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0227,"lat":37.9192,"course":375.4,"heading":115,"second":24,"maneuver":0,"raim":false,"radio":967} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165424,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165424,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165424,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165424,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:24.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165425.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165425,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,47,14,33,048,45,22,13,067,43*79 $GPGSV,3,2,12,01,54,319,47,27,15,171,42,23,11,208,44,04,30,309,41*70 $GPGSV,3,3,12,31,16,114,44,28,06,293,34,19,42,187,47,20,31,270,46*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":47,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":41,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":46,"used":true}]} $GPZDA,165425.00,14,09,2014,00,00*6C $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.1166,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165425,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165425,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13U9mB001M1`WoBEgg0s`q2h040K,0*02 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240285000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":9.3,"accuracy":false,"lon":22.8552,"lat":38.0036,"course":297.9,"heading":289,"second":24,"maneuver":0,"raim":false,"radio":16411} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165425,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165425,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165425,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165425,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165425,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165425,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165425,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:25.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165426.00,14,09,2014,00,00*6F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165426,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,47,32,71,313,48,14,33,048,45,22,13,067,41*75 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,11,208,44,04,30,309,44*73 $GPGSV,3,3,12,31,16,114,44,28,06,293,34,19,42,187,47,20,31,270,43*79 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":47,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":293,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165426.00,14,09,2014,00,00*6F $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165426,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165426,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165426,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165426,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165426,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165426,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165426,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165426,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*43 $GPRMC,165426,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:26.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165427.00,14,09,2014,00,00*6E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165427,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,47,32,71,313,49,14,33,048,44,22,13,067,40*74 $GPGSV,3,2,12,01,54,319,51,27,15,171,43,23,11,208,44,04,30,309,45*72 $GPGSV,3,3,12,31,16,114,44,28,06,292,33,19,42,187,48,20,31,270,42*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":47,"used":true},{"PRN":32,"el":71,"az":313,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":13,"az":67,"ss":40,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":33,"used":true},{"PRN":19,"el":42,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":42,"used":true}]} $GPZDA,165427.00,14,09,2014,00,00*6E $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165427,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165427,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165427,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165427,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165427,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165427,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165427,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165427,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165427,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:27.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165428.00,14,09,2014,00,00*61 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165428,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,47,32,71,313,47,14,33,048,45,22,13,067,42*79 $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,11,208,44,04,30,309,43*7C $GPGSV,3,3,12,31,16,114,43,28,06,292,33,19,42,187,47,20,31,270,43*78 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":47,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":114,"ss":43,"used":true},{"PRN":28,"el":6,"az":292,"ss":33,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165428.00,14,09,2014,00,00*61 $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165428,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165428,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165428,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165428,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165428,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165428,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165428,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165428,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4D $GPRMC,165428,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:28.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165429.00,14,09,2014,00,00*60 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165429,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,47,14,33,048,44,22,13,067,44*7F $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,11,208,44,04,30,309,44*73 $GPGSV,3,3,12,31,16,114,44,28,06,292,33,19,42,187,47,20,31,270,43*7F {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":13,"az":67,"ss":44,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":33,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165429.00,14,09,2014,00,00*60 $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165429,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165429,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165429,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165429,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165429,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165429,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165429,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165429,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165429,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:29.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165430.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165430,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13V9KV0uP01acfhEdTgaKgvt00Ab,0*30 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0869,"lat":37.9173,"course":241.4,"heading":511,"second":30,"maneuver":0,"raim":false,"radio":1130} $GPGSV,3,1,12,11,77,291,46,32,71,313,48,14,33,048,45,22,13,067,43*76 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,11,208,44,04,30,309,46*71 $GPGSV,3,3,12,31,16,114,44,28,06,292,32,19,42,187,47,20,31,270,43*7E {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":32,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165430.00,14,09,2014,00,00*68 $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0583,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165430,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165430,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165430,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165430,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165430,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165430,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165430,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165430,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*44 $GPRMC,165430,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:30.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165431.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165431,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,44,32,71,313,48,14,33,048,44,22,13,067,42*74 $GPGSV,3,2,12,01,54,319,50,27,15,171,43,23,11,208,43,04,30,309,47*76 $GPGSV,3,3,12,31,16,114,44,28,06,292,32,19,42,187,48,20,31,270,44*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":44,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":32,"used":true},{"PRN":19,"el":42,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165431.00,14,09,2014,00,00*69 $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0778,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165431,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165431,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165431,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13UjG20000Qai:nEdHwUqH0v00BP,0*46 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240949000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":true,"lon":23.1054,"lat":37.9123,"course":150.9,"heading":256,"second":31,"maneuver":0,"raim":false,"radio":1184} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165431,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165431,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165431,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165431,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165431,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*45 $GPRMC,165431,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:31.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165432.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165432,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,48,14,33,048,44,22,13,067,42*76 $GPGSV,3,2,12,01,54,319,50,27,15,171,43,23,11,208,43,04,30,309,45*74 $GPGSV,3,3,12,31,16,114,44,28,06,292,31,19,42,187,47,20,31,270,44*7A {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":44,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":31,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165432.00,14,09,2014,00,00*6A $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165432,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165432,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165432,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165432,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165432,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165432,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165432,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165432,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*46 $GPRMC,165432,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:32.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165433.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165433,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13<@ab@0001aIEFEda1e6qA200CJ,0*1B {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":214182313,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0241,"lat":37.9192,"course":335.5,"heading":296,"second":33,"maneuver":0,"raim":false,"radio":1242} $GPGSV,3,1,12,11,77,291,47,32,71,313,48,14,33,048,45,22,13,067,43*77 $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,11,208,44,04,30,309,43*7C $GPGSV,3,3,12,31,16,114,44,28,06,292,32,19,42,187,47,20,31,270,44*79 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":47,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":32,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165433.00,14,09,2014,00,00*6B $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165433,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165433,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165433,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165433,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165433,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165433,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165433,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165433,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*47 $GPRMC,165433,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:33.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165434.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165434,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,313,48,14,33,048,45,22,13,067,43*76 $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,11,208,45,04,30,309,46*78 $GPGSV,3,3,12,31,16,114,45,28,06,292,33,19,42,187,48,20,31,270,43*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":313,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":292,"ss":33,"used":true},{"PRN":19,"el":42,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165434.00,14,09,2014,00,00*6C $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165434,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165434,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165434,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165434,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165434,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165434,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165434,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165434,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*40 $GPRMC,165434,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:34.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165435.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165435,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,314,47,14,33,048,45,22,13,067,43*7E $GPGSV,3,2,12,01,54,319,50,27,15,171,43,23,11,208,44,04,30,309,47*71 $GPGSV,3,3,12,31,16,114,44,28,06,292,33,19,42,187,48,20,31,270,44*77 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":314,"ss":47,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":33,"used":true},{"PRN":19,"el":42,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165435.00,14,09,2014,00,00*6D $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.1361,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165435,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165435,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165435,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165435,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13U9mB001M1`WdvEggSs`q300@Sm,0*35 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240285000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":9.3,"accuracy":false,"lon":22.8547,"lat":38.0039,"course":297.9,"heading":289,"second":32,"maneuver":0,"raim":false,"radio":67829} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165435,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165435,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165435,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165435,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*41 $GPRMC,165435,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:35.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165436.00,14,09,2014,00,00*6E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165436,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,314,48,14,33,048,46,22,13,067,43*71 $GPGSV,3,2,12,01,54,319,50,27,15,171,43,23,11,208,44,04,30,309,47*71 $GPGSV,3,3,12,31,16,114,44,28,06,292,33,19,42,187,47,20,31,270,41*7D {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":47,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":33,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":41,"used":true}]} !AIVDM,1,1,,A,13TcnR00001aHt@Eda5fbSW608Ej,0*67 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":239793800,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0227,"lat":37.9192,"course":375.4,"heading":115,"second":35,"maneuver":0,"raim":false,"radio":34162} $GPZDA,165436.00,14,09,2014,00,00*6E $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037172,"lon":23.016929220,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0194,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165436,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165436,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165436,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165436,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165436,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165436,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165436,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165436,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*42 $GPRMC,165436,A,3755.3222,N,02301.0158,E,0.0389,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:36.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,144cG0<1<,0*5A {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0869,"lat":37.9173,"course":241.4,"heading":511,"second":39,"maneuver":0,"raim":false,"radio":49228} $GPGGA,165438,3755.3222,N,02301.0158,E,1,12,0.73,8.21,M,35.000,M,,*4C $GPRMC,165438,A,3755.3222,N,02301.0158,E,0.1555,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:38.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165439.00,14,09,2014,00,00*61 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165439,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922037100,"lon":23.016929200,"alt":8.211,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,314,49,14,33,048,45,22,13,067,43*70 $GPGSV,3,2,12,01,54,319,50,27,15,171,43,23,11,208,43,04,30,309,46*77 $GPGSV,3,3,12,31,16,114,44,28,06,292,32,19,42,187,49,20,31,270,44*77 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":314,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":43,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":32,"used":true},{"PRN":19,"el":42,"az":187,"ss":49,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165439.00,14,09,2014,00,00*61 $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165439,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165439,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165439,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165439,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165439,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165439,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165439,7.29,M,8.30,M,24.15,M*07 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165439,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*43 $GPRMC,165439,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:39.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165440.00,14,09,2014,00,00*6F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165440,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,314,49,14,33,048,45,22,13,067,43*70 $GPGSV,3,2,12,01,54,319,50,27,15,171,43,23,11,208,44,04,30,309,46*70 $GPGSV,3,3,12,31,16,114,43,28,06,292,32,19,42,187,48,20,31,270,44*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":314,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":43,"used":true},{"PRN":28,"el":6,"az":292,"ss":32,"used":true},{"PRN":19,"el":42,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":44,"used":true}]} $GPZDA,165440.00,14,09,2014,00,00*6F $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165440,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165440,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13RUPO0uQNQchKPEf7prSww@20GU,0*31 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":237592700,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":9.4,"accuracy":true,"lon":23.5398,"lat":37.9596,"course":270.3,"heading":511,"second":40,"maneuver":0,"raim":true,"radio":1509} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165440,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165440,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165440,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165440,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165440,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165440,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165440,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:40.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165441.00,14,09,2014,00,00*6E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165441,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,47,32,71,314,48,14,33,048,46,22,13,067,43*73 $GPGSV,3,2,12,01,54,319,50,27,15,171,43,23,11,208,45,04,30,309,44*73 $GPGSV,3,3,12,31,16,114,44,28,06,292,32,19,42,187,47,20,31,270,43*7E {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":47,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":32,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165441.00,14,09,2014,00,00*6E $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165441,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165441,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165441,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165441,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13UjG20000Qai:nEdHr6BH3B041U,0*55 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240949000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":true,"lon":23.1054,"lat":37.9123,"course":160.9,"heading":257,"second":41,"maneuver":0,"raim":false,"radio":16485} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165441,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165441,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165441,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165441,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165441,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:41.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165442.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165442,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,45,32,71,314,49,14,33,048,45,22,13,067,43*73 $GPGSV,3,2,12,01,54,319,50,27,15,171,42,23,11,208,45,04,30,309,45*73 $GPGSV,3,3,12,31,16,114,44,28,06,292,32,19,42,187,48,20,31,270,43*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":45,"used":true},{"PRN":32,"el":71,"az":314,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":50,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":32,"used":true},{"PRN":19,"el":42,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165442.00,14,09,2014,00,00*6D $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165442,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165442,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165442,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165442,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165442,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165442,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165442,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165442,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165442,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:42.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165443.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165443,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,46,32,71,314,48,14,33,048,46,22,13,067,43*72 $GPGSV,3,2,12,01,54,319,51,27,15,171,42,23,11,208,45,04,30,309,45*72 $GPGSV,3,3,12,31,16,114,44,28,06,292,32,19,42,187,46,20,31,270,43*7F {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.05,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":46,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":48,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":51,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":32,"used":true},{"PRN":19,"el":42,"az":187,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165443.00,14,09,2014,00,00*6C $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165443,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165443,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165443,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13<@ab@0001aIEHEda1PtqAH0@SU,0*64 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":214182313,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0241,"lat":37.9192,"course":24.3,"heading":296,"second":44,"maneuver":0,"raim":false,"radio":67813} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165443,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165443,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165443,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165443,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165443,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165443,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:43.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165444.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.1*30 $GPGBS,165444,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,77,291,47,32,71,314,49,14,33,048,45,22,13,067,43*71 $GPGSV,3,2,12,01,54,319,49,27,15,171,42,23,11,208,45,04,30,309,46*78 $GPGSV,3,3,12,31,16,114,44,28,06,292,31,19,42,187,46,20,31,270,43*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":77,"az":291,"ss":47,"used":true},{"PRN":32,"el":71,"az":314,"ss":49,"used":true},{"PRN":14,"el":33,"az":48,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":43,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":46,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":31,"used":true},{"PRN":19,"el":42,"az":187,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":43,"used":true}]} $GPZDA,165444.00,14,09,2014,00,00*6B $GPGGA,165444,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165444,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165444,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165444,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165444,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165444,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165444,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165444,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165444,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165444,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165444,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165444,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165444,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165444,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165444,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165444,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165444,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165444,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:54:44.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13TcnR00001aHtw9N02=iMS00000000000000,0*59 {"class":"AIS","device":"nmea2000://vcan0:1","type":24,"repeat":0,"mmsi":237118300,"scaled":true,"shipname":"","shiptype":0,"shiptype_text":"Not available","vendorid":"GARMIN","model":0,"serial":0,"callsign":"","to_bow":0,"to_stern":0,"to_port":0,"to_starboard":0} $GPGGA,165505,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165505,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:05.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165507.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165507,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,314,48,14,33,047,46,22,13,067,41*79 $GPGSV,3,2,12,01,54,319,48,27,15,171,43,23,11,208,44,04,30,309,43*7C $GPGSV,3,3,12,31,16,114,45,28,06,292,34,19,42,187,47,20,31,270,45*7F {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":48,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":292,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} $GPZDA,165507.00,14,09,2014,00,00*6D $GPGGA,165507,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165507,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165507,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165507,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165507,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165507,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165507,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165507,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165507,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165507,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165507,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165507,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165507,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165507,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165507,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165507,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:07.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,144cG,0*29 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0869,"lat":37.9173,"course":241.4,"heading":511,"second":10,"maneuver":0,"raim":false,"radio":49230} $GPGGA,165509,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165509,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165509,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165509,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165509,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165509,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165509,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165509,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165509,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165509,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165509,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165509,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165509,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165509,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165509,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165509,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165509,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165509,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165509,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165509,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165509,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:09.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165510.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165510,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGSV,3,1,12,11,78,289,45,32,71,314,48,14,33,047,45,22,13,067,41*79 $GPGSV,3,2,12,01,54,319,49,27,15,171,43,23,11,208,44,04,30,309,44*7A $GPGSV,3,3,12,31,16,114,45,28,06,292,35,19,42,187,49,20,31,270,46*73 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":292,"ss":35,"used":true},{"PRN":19,"el":42,"az":187,"ss":49,"used":true},{"PRN":20,"el":31,"az":270,"ss":46,"used":true}]} $GPZDA,165510.00,14,09,2014,00,00*6B $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165510,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165510,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165510,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165510,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165510,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165510,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165510,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165510,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*49 $GPRMC,165510,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:10.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPZDA,165511.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165511,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,314,47,14,33,047,45,22,13,067,41*75 $GPGSV,3,2,12,01,54,319,48,27,15,171,44,23,11,208,45,04,30,309,42*7B $GPGSV,3,3,12,31,16,114,44,28,06,292,35,19,42,187,46,20,31,270,45*7E {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":314,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":48,"used":true},{"PRN":27,"el":15,"az":171,"ss":44,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":42,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":35,"used":true},{"PRN":19,"el":42,"az":187,"ss":46,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} !AIVDM,1,1,,B,13UjG20000Qai:nEdHonDp2F163L,0*30 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240949000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":true,"lon":23.1054,"lat":37.9123,"course":161.9,"heading":257,"second":11,"maneuver":0,"raim":false,"radio":286940} $GPZDA,165511.00,14,09,2014,00,00*6A $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165511,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165511,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165511,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165511,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165511,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165511,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165511,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165511,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*48 $GPRMC,165511,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:11.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165512.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165512,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSV,3,1,12,11,78,289,44,32,71,314,47,14,33,047,45,22,13,067,41*77 $GPGSV,3,2,12,01,54,319,47,27,15,171,42,23,11,208,45,04,30,309,43*73 $GPGSV,3,3,12,31,16,114,45,28,06,292,34,19,42,187,47,20,31,270,45*7F {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":44,"used":true},{"PRN":32,"el":71,"az":314,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":47,"used":true},{"PRN":27,"el":15,"az":171,"ss":42,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":292,"ss":34,"used":true},{"PRN":19,"el":42,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} $GPZDA,165512.00,14,09,2014,00,00*69 $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165512,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165512,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165512,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165512,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165512,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165512,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165512,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165512,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4B $GPRMC,165512,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:12.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165513.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165513,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSV,3,1,12,11,78,289,45,32,71,314,48,14,33,047,44,22,13,067,41*78 $GPGSV,3,2,12,01,54,319,49,27,15,171,43,23,11,208,44,04,30,309,43*7D $GPGSV,3,3,12,31,16,114,45,28,06,292,34,19,41,187,49,20,31,270,47*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":44,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":292,"ss":34,"used":true},{"PRN":19,"el":41,"az":187,"ss":49,"used":true},{"PRN":20,"el":31,"az":270,"ss":47,"used":true}]} $GPZDA,165513.00,14,09,2014,00,00*68 $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0389,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165513,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165513,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165513,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165513,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165513,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165513,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165513,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165513,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4A $GPRMC,165513,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:13.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165514.00,14,09,2014,00,00*6F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165514,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13<@ab@0001aIEhEda1eaq@L0<0l,0*44 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":214182313,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0241,"lat":37.9192,"course":349.5,"heading":296,"second":14,"maneuver":0,"raim":false,"radio":49204} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSV,3,1,12,11,78,289,45,32,71,314,47,14,33,047,45,22,13,067,41*76 $GPGSV,3,2,12,01,54,319,48,27,15,171,43,23,11,208,44,04,30,309,42*7D $GPGSV,3,3,12,31,16,114,44,28,06,292,34,19,41,187,47,20,31,270,45*7D {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":314,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":48,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":42,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":34,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":270,"ss":45,"used":true}]} $GPZDA,165514.00,14,09,2014,00,00*6F $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165514,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165514,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165514,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165514,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165514,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165514,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165514,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165514,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4D $GPRMC,165514,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:14.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPZDA,165515.00,14,09,2014,00,00*6E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165515,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,314,47,14,33,047,44,22,13,067,41*74 $GPGSV,3,2,12,01,54,319,49,27,15,171,43,23,11,208,44,04,30,309,44*7A $GPGSV,3,3,12,31,16,114,44,28,06,292,35,19,41,187,47,20,31,271,44*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":314,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":44,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":43,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":35,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":44,"used":true}]} $GPZDA,165515.00,14,09,2014,00,00*6E $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165515,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165515,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165515,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165515,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165515,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165515,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13TcnR00001aHt8Eda8vbSVN089q,0*1C {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":239793800,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0227,"lat":37.9192,"course":375.4,"heading":115,"second":15,"maneuver":0,"raim":false,"radio":33401} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165515,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165515,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4C $GPRMC,165515,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:15.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165516.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165516,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSV,3,1,12,11,78,289,46,32,71,314,48,14,33,047,44,22,13,067,41*7B $GPGSV,3,2,12,01,54,319,48,27,15,171,44,23,11,208,44,04,30,309,44*7C $GPGSV,3,3,12,31,16,114,44,28,06,292,36,19,41,187,47,20,31,271,45*7E {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":44,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":48,"used":true},{"PRN":27,"el":15,"az":171,"ss":44,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":36,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165516.00,14,09,2014,00,00*6D $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0194,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165516,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.010,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165516,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165516,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165516,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165516,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165516,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165516,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165516,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4F $GPRMC,165516,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:16.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165517.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165517,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSV,3,1,12,11,78,289,45,32,71,314,48,14,33,047,45,22,13,067,41*79 $GPGSV,3,2,12,01,54,319,48,27,15,171,44,23,11,208,44,04,30,309,43*7B $GPGSV,3,3,12,31,16,114,45,28,06,292,36,19,41,187,47,20,31,271,45*7F {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":48,"used":true},{"PRN":27,"el":15,"az":171,"ss":44,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":292,"ss":36,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165517.00,14,09,2014,00,00*6C $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165517,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165517,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165517,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165517,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165517,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165517,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165517,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165517,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*4E $GPRMC,165517,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:17.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165518.00,14,09,2014,00,00*63 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165518,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,44,32,71,314,48,14,33,047,45,22,13,067,40*79 $GPGSV,3,2,12,01,54,319,49,27,15,171,44,23,11,208,44,04,30,309,43*7A $GPGSV,3,3,12,31,16,114,45,28,06,292,36,19,41,187,48,20,31,271,45*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":44,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":40,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":44,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":292,"ss":36,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165518.00,14,09,2014,00,00*63 $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033224,"lon":23.016936237,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.1555,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165518,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165518,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165518,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165518,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165518,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165518,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165518,7.29,M,8.30,M,24.15,M*05 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165518,3755.3220,N,02301.0162,E,1,12,0.73,8.35,M,35.000,M,,*41 $GPRMC,165518,A,3755.3220,N,02301.0162,E,0.0778,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:18.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165519.00,14,09,2014,00,00*62 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165519,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033200,"lon":23.016936200,"alt":8.352,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,44,32,71,314,47,14,33,047,45,22,13,067,41*77 $GPGSV,3,2,12,01,54,319,49,27,15,171,44,23,11,208,44,04,30,309,45*7C $GPGSV,3,3,12,31,16,114,45,28,06,292,36,19,41,187,48,20,31,271,45*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":44,"used":true},{"PRN":32,"el":71,"az":314,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":49,"used":true},{"PRN":27,"el":15,"az":171,"ss":44,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":114,"ss":45,"used":true},{"PRN":28,"el":6,"az":292,"ss":36,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165519.00,14,09,2014,00,00*62 $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165519,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165519,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165519,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165519,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165519,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165519,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165519,7.29,M,8.30,M,24.15,M*04 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165519,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*40 $GPRMC,165519,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:19.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165520.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165520,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,49,32,71,314,47,14,33,047,45,22,13,067,41*7A $GPGSV,3,2,12,01,54,319,46,27,15,171,44,23,11,208,45,04,30,309,44*73 $GPGSV,3,3,12,31,16,114,44,28,06,292,36,19,41,187,47,20,31,271,45*7E {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":49,"used":true},{"PRN":32,"el":71,"az":314,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":46,"used":true},{"PRN":27,"el":15,"az":171,"ss":44,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":36,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165520.00,14,09,2014,00,00*68 $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0000,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165520,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.000,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165520,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13V9KV0uP01acfbEdTfaKgvb163L,0*75 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0869,"lat":37.9173,"course":241.4,"heading":511,"second":21,"maneuver":0,"raim":false,"radio":286940} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165520,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165520,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165520,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165520,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165520,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165520,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165520,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:20.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165521.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165521,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,314,48,14,33,047,45,22,13,067,41*7A $GPGSV,3,2,12,01,54,319,47,27,15,171,44,23,11,208,45,04,30,309,44*72 $GPGSV,3,3,12,31,16,114,44,28,06,292,36,19,41,187,47,20,31,271,45*7E {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":314,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":47,"used":true},{"PRN":27,"el":15,"az":171,"ss":44,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":114,"ss":44,"used":true},{"PRN":28,"el":6,"az":292,"ss":36,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165521.00,14,09,2014,00,00*69 $GPGGA,165521,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165521,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165521,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165521,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165521,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165521,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165521,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165521,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165521,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165521,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165521,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165521,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165521,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165521,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165521,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165521,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165521,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165521,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165521,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165521,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165521,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:21.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13UjG20000Qai:nEdHonBH2b0008Fp,0*34 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0869,"lat":37.9173,"course":241.4,"heading":511,"second":39,"maneuver":0,"raim":false,"radio":34232} $GPZDA,165539.00,14,09,2014,00,00*60 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165539,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,47,32,71,316,48,14,33,047,45,22,13,067,41*79 $GPGSV,3,2,12,01,54,319,45,27,14,171,45,23,11,208,45,04,30,309,44*70 $GPGSV,3,3,12,31,16,113,45,28,05,292,37,19,41,187,48,20,31,271,46*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":47,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":54,"az":319,"ss":45,"used":true},{"PRN":27,"el":14,"az":171,"ss":45,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":113,"ss":45,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165539.00,14,09,2014,00,00*60 $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165539,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165539,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165539,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165539,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165539,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165539,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165539,7.29,M,8.30,M,24.15,M*06 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165539,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*42 $GPRMC,165539,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:39.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165540.00,14,09,2014,00,00*6E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165540,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,48,32,71,316,48,14,33,047,45,22,13,067,40*77 $GPGSV,3,2,12,01,54,319,46,27,14,171,46,23,11,208,46,04,30,309,43*74 $GPGSV,3,3,12,31,16,113,43,28,05,292,37,19,41,187,48,20,31,271,47*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":48,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":40,"used":true},{"PRN":1,"el":54,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":46,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":113,"ss":43,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":47,"used":true}]} $GPZDA,165540.00,14,09,2014,00,00*6E $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165540,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165540,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165540,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165540,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165540,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165540,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165540,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165540,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165540,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:40.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165541.00,14,09,2014,00,00*6F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165541,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,316,48,14,33,047,45,22,13,067,40*79 $GPGSV,3,2,12,01,55,319,46,27,14,171,45,23,11,208,45,04,30,309,44*72 $GPGSV,3,3,12,31,16,113,44,28,05,292,37,19,41,187,48,20,31,271,47*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":40,"used":true},{"PRN":1,"el":55,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":45,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":47,"used":true}]} $GPZDA,165541.00,14,09,2014,00,00*6F $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165541,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165541,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165541,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165541,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13UjG20000Qai:nEdHmF?p5@00HI,0*1A {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240949000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":true,"lon":23.1054,"lat":37.9122,"course":159.9,"heading":258,"second":40,"maneuver":0,"raim":false,"radio":1561} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165541,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165541,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165541,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165541,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165541,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:41.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165542.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165542,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,316,47,14,33,047,45,22,13,067,42*74 $GPGSV,3,2,12,01,55,319,47,27,14,171,46,23,11,208,44,04,30,309,42*77 $GPGSV,3,3,12,31,16,113,44,28,05,292,37,19,41,187,49,20,31,271,46*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":316,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":47,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":42,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":49,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165542.00,14,09,2014,00,00*6C $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165542,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165542,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165542,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165542,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165542,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165542,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165542,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165542,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4E $GPRMC,165542,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:42.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165543.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165543,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,47,32,71,316,47,14,33,047,45,22,13,067,42*75 $GPGSV,3,2,12,01,55,319,46,27,14,171,46,23,11,208,44,04,30,309,42*76 $GPGSV,3,3,12,31,16,113,44,28,05,292,37,19,41,187,47,20,31,271,46*78 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":47,"used":true},{"PRN":32,"el":71,"az":316,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":44,"used":true},{"PRN":4,"el":30,"az":309,"ss":42,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165543.00,14,09,2014,00,00*6D $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165543,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165543,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165543,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,33eElL10001agojEdH:7vGcH0000,0*68 {"class":"AIS","device":"nmea2000://vcan0:1","type":3,"repeat":0,"mmsi":248870000,"scaled":true,"status":1,"status_text":"At anchor","turn":0,"speed":0.0,"accuracy":false,"lon":23.1010,"lat":37.9120,"course":204.1,"heading":245,"second":44,"maneuver":0,"raim":false,"radio":0} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165543,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165543,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165543,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165543,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165543,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4F $GPRMC,165543,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:43.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165544.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165544,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,45,32,71,316,47,14,33,047,45,22,13,067,42*77 $GPGSV,3,2,12,01,55,319,47,27,14,171,46,23,11,208,45,04,30,309,43*77 $GPGSV,3,3,12,31,16,113,44,28,05,292,37,19,41,187,48,20,31,271,45*74 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":316,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":47,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165544.00,14,09,2014,00,00*6A $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165544,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165544,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13<@ab@0001aIFdEd`uABqAH040l,0*07 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":214182313,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0241,"lat":37.9191,"course":33.1,"heading":296,"second":44,"maneuver":0,"raim":false,"radio":16436} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165544,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165544,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165544,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13TcnR00001aHuFEdaN>bSWH00Jk,0*38 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":239793800,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0228,"lat":37.9193,"course":375.4,"heading":115,"second":44,"maneuver":0,"raim":false,"radio":1715} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165544,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165544,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165544,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165544,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:44.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165545.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165545,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,45,32,71,316,47,14,33,047,45,22,13,067,41*74 $GPGSV,3,2,12,01,55,319,45,27,14,171,46,23,11,208,45,04,30,309,41*77 $GPGSV,3,3,12,31,16,113,44,28,05,292,37,19,41,187,49,20,31,271,46*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":316,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":55,"az":319,"ss":45,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":41,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":49,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165545.00,14,09,2014,00,00*6B $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0972,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165545,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165545,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165545,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165545,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165545,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165545,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165545,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165545,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165545,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:45.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165546.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165546,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,316,47,14,33,047,45,22,13,067,41*77 $GPGSV,3,2,12,01,55,319,47,27,14,171,46,23,11,208,45,04,30,309,41*75 $GPGSV,3,3,12,31,16,113,44,28,05,292,37,19,41,187,49,20,31,271,44*74 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":316,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":55,"az":319,"ss":47,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":30,"az":309,"ss":41,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":49,"used":true},{"PRN":20,"el":31,"az":271,"ss":44,"used":true}]} $GPZDA,165546.00,14,09,2014,00,00*68 $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165546,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165546,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13U9mB001M1`VcbEgk9ccI3H040L,0*27 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240285000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":9.3,"accuracy":false,"lon":22.8512,"lat":38.0054,"course":298.9,"heading":289,"second":44,"maneuver":0,"raim":false,"radio":16412} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165546,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165546,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165546,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165546,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165546,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165546,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165546,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:46.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165547.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165547,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,45,32,71,316,47,14,33,047,44,22,13,067,41*75 $GPGSV,3,2,12,01,55,319,48,27,14,171,46,23,11,208,45,04,31,309,40*7A $GPGSV,3,3,12,31,16,113,44,28,05,292,37,19,41,187,49,20,31,271,45*75 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":316,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":44,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":55,"az":319,"ss":48,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":40,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":49,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165547.00,14,09,2014,00,00*69 $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165547,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165547,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165547,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165547,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165547,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165547,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165547,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165547,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165547,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:47.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165548.00,14,09,2014,00,00*66 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165548,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,49,32,71,316,48,14,33,047,45,22,13,067,41*77 $GPGSV,3,2,12,01,55,319,46,27,14,171,46,23,11,208,45,04,31,309,41*75 $GPGSV,3,3,12,31,16,113,43,28,05,292,37,19,41,187,48,20,31,271,45*73 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":49,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":55,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":41,"used":true},{"PRN":31,"el":16,"az":113,"ss":43,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165548.00,14,09,2014,00,00*66 $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165548,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165548,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165548,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165548,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165548,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13V9KV0uP01acf`EdTf9KgwR0<1A,0*19 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0869,"lat":37.9173,"course":241.4,"heading":511,"second":49,"maneuver":0,"raim":false,"radio":49233} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165548,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165548,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165548,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*44 $GPRMC,165548,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:48.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165549.00,14,09,2014,00,00*67 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165549,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,316,50,14,33,047,45,22,13,067,40*70 $GPGSV,3,2,12,01,55,319,48,27,14,171,46,23,11,208,45,04,31,309,41*7B $GPGSV,3,3,12,31,16,113,43,28,05,292,38,19,41,187,48,20,31,271,44*7D {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":316,"ss":50,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":40,"used":true},{"PRN":1,"el":55,"az":319,"ss":48,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":41,"used":true},{"PRN":31,"el":16,"az":113,"ss":43,"used":true},{"PRN":28,"el":5,"az":292,"ss":38,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":44,"used":true}]} $GPZDA,165549.00,14,09,2014,00,00*67 $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1361,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165549,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165549,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165549,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165549,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165549,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165549,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165549,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165549,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165549,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:49.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165550.00,14,09,2014,00,00*6F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165550,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,316,48,14,33,047,44,22,13,067,40*78 $GPGSV,3,2,12,01,55,319,48,27,14,171,46,23,11,208,45,04,31,309,42*78 $GPGSV,3,3,12,31,16,113,43,28,05,292,38,19,41,187,48,20,31,271,45*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":44,"used":true},{"PRN":22,"el":13,"az":67,"ss":40,"used":true},{"PRN":1,"el":55,"az":319,"ss":48,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":42,"used":true},{"PRN":31,"el":16,"az":113,"ss":43,"used":true},{"PRN":28,"el":5,"az":292,"ss":38,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165550.00,14,09,2014,00,00*6F $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165550,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165550,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165550,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165550,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165550,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165550,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165550,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165550,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4D $GPRMC,165550,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:50.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165551.00,14,09,2014,00,00*6E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165551,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,46,32,71,316,48,14,33,047,45,22,13,067,40*79 $GPGSV,3,2,12,01,55,319,49,27,14,171,46,23,11,208,45,04,31,309,43*78 $GPGSV,3,3,12,31,16,113,43,28,05,292,38,19,41,187,48,20,31,271,45*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":46,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":40,"used":true},{"PRN":1,"el":55,"az":319,"ss":49,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":113,"ss":43,"used":true},{"PRN":28,"el":5,"az":292,"ss":38,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165551.00,14,09,2014,00,00*6E $GPGGA,165551,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165551,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165551,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165551,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165551,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165551,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165551,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165551,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165551,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165551,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165551,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165551,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165551,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165551,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4C $GPRMC,165551,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*23 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165551,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:51.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165554.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165554,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,47,32,71,316,47,14,33,047,46,22,13,067,41*75 $GPGSV,3,2,12,01,55,319,49,27,14,171,46,23,11,208,45,04,31,309,44*7F $GPGSV,3,3,12,31,16,113,42,28,05,292,37,19,41,187,49,20,31,271,46*70 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":47,"used":true},{"PRN":32,"el":71,"az":316,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":55,"az":319,"ss":49,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":113,"ss":42,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":49,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165554.00,14,09,2014,00,00*6B $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.1166,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165554,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.060,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165554,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165554,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165554,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.140} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165554,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165554,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165554,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165554,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*49 $GPRMC,165554,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:54.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165555.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165555,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,44,32,71,316,47,14,33,047,46,22,13,067,42*75 $GPGSV,3,2,12,01,55,319,48,27,14,171,46,23,11,208,46,04,31,309,45*7C $GPGSV,3,3,12,31,16,113,42,28,05,292,37,19,41,187,48,20,31,271,45*72 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":44,"used":true},{"PRN":32,"el":71,"az":316,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":48,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":46,"used":true},{"PRN":4,"el":31,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":113,"ss":42,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165555.00,14,09,2014,00,00*6A $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0778,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165555,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165555,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165555,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165555,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} !AIVDM,1,1,,A,13TcnR00001aHt@Eda@fbSWf040S,0*02 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":239793800,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0227,"lat":37.9193,"course":375.4,"heading":115,"second":55,"maneuver":0,"raim":false,"radio":16419} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165555,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,2,1,5,A,53TcnR01iINq=H7G?KTpTdth4u>0f222222222168@8666Fi082hC0C@BjH8,0*45 !AIVDM,2,2,5,A,88888888880,2*21 {"class":"AIS","device":"nmea2000://vcan0:1","type":5,"repeat":0,"mmsi":239793800,"scaled":true,"imo":7431662,"ais_version":0,"callsign":"SVA5369","shipname":"NIKOLAOS K ","shiptype":70,"shiptype_text":"Cargo - all ships of this type","to_bow":66,"to_stern":8,"to_port":6,"to_starboard":6,"epfd":1,"epfd_text":"GPS","eta":"09-13T17:00Z","draught":3.2,"destination":"KALAMAKI ","dte":0} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165555,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,2,1,6,B,53TcnR01iINq=H7G?KTpTdth4u>0f222222222168@8666Fi082hC0C@BjH8,0*45 !AIVDM,2,2,6,B,88888888880,2*21 {"class":"AIS","device":"nmea2000://vcan0:1","type":5,"repeat":0,"mmsi":239793800,"scaled":true,"imo":7431662,"ais_version":0,"callsign":"SVA5369","shipname":"NIKOLAOS K ","shiptype":70,"shiptype_text":"Cargo - all ships of this type","to_bow":66,"to_stern":8,"to_port":6,"to_starboard":6,"epfd":1,"epfd_text":"GPS","eta":"09-13T17:00Z","draught":3.2,"destination":"KALAMAKI ","dte":0} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165555,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165555,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*48 $GPRMC,165555,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:55.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165556.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165556,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,47,32,71,316,48,14,33,047,45,22,13,067,42*7A $GPGSV,3,2,12,01,55,319,47,27,14,171,46,23,11,208,46,04,31,309,45*73 $GPGSV,3,3,12,31,16,113,42,28,05,292,35,19,41,187,47,20,31,271,46*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":47,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":47,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":46,"used":true},{"PRN":4,"el":31,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":113,"ss":42,"used":true},{"PRN":28,"el":5,"az":292,"ss":35,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165556.00,14,09,2014,00,00*69 $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165556,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165556,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165556,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165556,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165556,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165556,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165556,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165556,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4B $GPRMC,165556,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:56.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165557.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165557,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,45,32,71,316,48,14,33,047,46,22,13,067,40*79 $GPGSV,3,2,12,01,55,319,48,27,14,171,47,23,11,208,46,04,31,309,45*7D $GPGSV,3,3,12,31,16,113,42,28,05,292,34,19,41,187,47,20,31,271,46*7D {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":40,"used":true},{"PRN":1,"el":55,"az":319,"ss":48,"used":true},{"PRN":27,"el":14,"az":171,"ss":47,"used":true},{"PRN":23,"el":11,"az":208,"ss":46,"used":true},{"PRN":4,"el":31,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":113,"ss":42,"used":true},{"PRN":28,"el":5,"az":292,"ss":34,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165557.00,14,09,2014,00,00*68 $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1749,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165557,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.090,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165557,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165557,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165557,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165557,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165557,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165557,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165557,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*4A $GPRMC,165557,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:57.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165558.00,14,09,2014,00,00*67 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165558,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,45,32,71,316,48,14,33,047,46,22,13,067,42*7B $GPGSV,3,2,12,01,55,319,48,27,14,171,47,23,11,208,45,04,31,309,45*7E $GPGSV,3,3,12,31,16,113,43,28,05,292,35,19,41,187,48,20,31,271,45*71 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":48,"used":true},{"PRN":27,"el":14,"az":171,"ss":47,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":113,"ss":43,"used":true},{"PRN":28,"el":5,"az":292,"ss":35,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165558.00,14,09,2014,00,00*67 $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940076,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.1555,0.000,140914,,*2E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165558,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165558,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165558,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165558,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165558,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165558,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165558,7.29,M,8.30,M,24.15,M*01 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165558,3755.3220,N,02301.0164,E,1,12,0.73,8.88,M,35.000,M,,*45 $GPRMC,165558,A,3755.3220,N,02301.0164,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:58.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165559.00,14,09,2014,00,00*66 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165559,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922033800,"lon":23.016940000,"alt":8.883,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,45,32,71,316,48,14,33,047,46,22,13,067,42*7B $GPGSV,3,2,12,01,55,319,46,27,14,171,47,23,11,208,46,04,31,309,43*75 $GPGSV,3,3,12,31,16,113,43,28,05,292,35,19,41,187,47,20,31,271,46*7D {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":45,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":47,"used":true},{"PRN":23,"el":11,"az":208,"ss":46,"used":true},{"PRN":4,"el":31,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":113,"ss":43,"used":true},{"PRN":28,"el":5,"az":292,"ss":35,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165559.00,14,09,2014,00,00*66 $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036233,"lon":23.016931916,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165559,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165559,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165559,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165559,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165559,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165559,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165559,7.29,M,8.30,M,24.15,M*00 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165559,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*40 $GPRMC,165559,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:55:59.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165600.00,14,09,2014,00,00*69 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165600,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,289,47,32,71,316,49,14,33,047,46,22,13,067,41*7B $GPGSV,3,2,12,01,55,319,45,27,14,171,47,23,11,208,45,04,31,309,44*72 $GPGSV,3,3,12,31,16,113,43,28,05,292,35,19,41,187,47,20,31,271,47*7C {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":289,"ss":47,"used":true},{"PRN":32,"el":71,"az":316,"ss":49,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":55,"az":319,"ss":45,"used":true},{"PRN":27,"el":14,"az":171,"ss":47,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":113,"ss":43,"used":true},{"PRN":28,"el":5,"az":292,"ss":35,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":47,"used":true}]} $GPZDA,165600.00,14,09,2014,00,00*69 $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036233,"lon":23.016931916,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*2A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165600,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165600,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165600,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165600,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13V9KV0uP01acfjEdTdqKgv2000I,0*3E {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":241327000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":11250,"speed":0.0,"accuracy":false,"lon":23.0869,"lat":37.9173,"course":241.4,"heading":511,"second":1,"maneuver":0,"raim":false,"radio":25} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165600,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165600,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165600,7.29,M,8.30,M,24.15,M*0F {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165600,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4F $GPRMC,165600,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*20 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:00.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165601.00,14,09,2014,00,00*68 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165601,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,287,45,32,71,316,47,14,33,047,46,22,13,067,42*7A $GPGSV,3,2,12,01,55,319,48,27,14,171,46,23,11,208,45,04,31,309,43*79 $GPGSV,3,3,12,31,16,113,44,28,05,292,35,19,41,187,48,20,31,271,45*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":287,"ss":45,"used":true},{"PRN":32,"el":71,"az":316,"ss":47,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":48,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":35,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":45,"used":true}]} $GPZDA,165601.00,14,09,2014,00,00*68 $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036233,"lon":23.016931916,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.2138,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165601,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.110,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165601,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165601,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165601,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.110} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165601,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165601,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165601,7.29,M,8.30,M,24.15,M*0E {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13UjG20000Qai:nEdHmF:p600<1`,0*30 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240949000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":true,"lon":23.1054,"lat":37.9122,"course":157.9,"heading":259,"second":0,"maneuver":0,"raim":false,"radio":49256} $GPGGA,165601,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4E $GPRMC,165601,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:01.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165602.00,14,09,2014,00,00*6B $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165602,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,287,44,32,71,316,48,14,33,047,46,22,13,067,42*74 $GPGSV,3,2,12,01,55,319,46,27,14,171,46,23,11,208,45,04,31,309,42*76 $GPGSV,3,3,12,31,16,113,44,28,05,292,35,19,41,187,48,20,31,271,46*75 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":287,"ss":44,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":42,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":35,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165602.00,14,09,2014,00,00*6B $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036233,"lon":23.016931916,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.1361,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165602,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.070,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165602,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165602,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165602,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165602,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13<@ab@0001aIG>Ed`qev9@60@SF,0*42 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":214182313,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0242,"lat":37.9191,"course":357.6,"heading":296,"second":3,"maneuver":0,"raim":false,"radio":67798} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165602,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165602,7.29,M,8.30,M,24.15,M*0D {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165602,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4D $GPRMC,165602,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*24 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:02.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165603.00,14,09,2014,00,00*6A $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165603,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,287,45,32,71,316,49,14,33,047,46,22,13,067,42*74 $GPGSV,3,2,12,01,55,319,46,27,14,171,46,23,11,208,45,04,31,309,45*71 $GPGSV,3,3,12,31,16,113,43,28,05,292,34,19,41,187,47,20,31,271,47*7D {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":287,"ss":45,"used":true},{"PRN":32,"el":71,"az":316,"ss":49,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":113,"ss":43,"used":true},{"PRN":28,"el":5,"az":292,"ss":34,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":47,"used":true}]} $GPZDA,165603.00,14,09,2014,00,00*6A $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036233,"lon":23.016931916,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.0583,0.000,140914,,*25 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165603,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.030,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165603,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165603,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165603,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165603,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165603,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165603,7.29,M,8.30,M,24.15,M*0C {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165603,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4C $GPRMC,165603,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*2F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:03.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165604.00,14,09,2014,00,00*6D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165604,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,287,46,32,71,316,49,14,33,047,46,22,13,067,42*77 $GPGSV,3,2,12,01,55,319,46,27,14,171,46,23,11,208,45,04,31,309,45*71 $GPGSV,3,3,12,31,16,113,44,28,05,292,34,19,41,187,46,20,31,271,46*7A {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":287,"ss":46,"used":true},{"PRN":32,"el":71,"az":316,"ss":49,"used":true},{"PRN":14,"el":33,"az":47,"ss":46,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":34,"used":true},{"PRN":19,"el":41,"az":187,"ss":46,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165604.00,14,09,2014,00,00*6D $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036233,"lon":23.016931916,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165604,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165604,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165604,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165604,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165604,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,B,13TcnR00001aHsLEda0vbSV80@Ss,0*02 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":239793800,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":0.0,"accuracy":false,"lon":23.0227,"lat":37.9192,"course":375.4,"heading":115,"second":4,"maneuver":0,"raim":false,"radio":67835} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165604,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165604,7.29,M,8.30,M,24.15,M*0B {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165604,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4B $GPRMC,165604,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*28 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:04.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165605.00,14,09,2014,00,00*6C $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165605,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,13U9mB001M1`VKJEgl0s`q260<0L,0*75 {"class":"AIS","device":"nmea2000://vcan0:1","type":1,"repeat":0,"mmsi":240285000,"scaled":true,"status":0,"status_text":"Under way using engine","turn":0,"speed":9.3,"accuracy":false,"lon":22.8503,"lat":38.0058,"course":297.9,"heading":289,"second":3,"maneuver":0,"raim":false,"radio":49180} $GPGSV,3,1,12,11,78,287,43,32,71,316,48,14,33,047,45,22,13,067,41*73 $GPGSV,3,2,12,01,55,319,45,27,14,171,46,23,11,208,45,04,31,309,45*72 $GPGSV,3,3,12,31,16,113,44,28,05,292,35,19,41,187,47,20,31,271,46*7A {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":287,"ss":43,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":41,"used":true},{"PRN":1,"el":55,"az":319,"ss":45,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":45,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":35,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165605.00,14,09,2014,00,00*6C $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036233,"lon":23.016931916,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.1555,0.000,140914,,*29 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165605,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.080,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165605,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165605,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165605,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,B3R8SG0000JEkcUK;tr?owRUh006,0*73 {"class":"AIS","device":"nmea2000://vcan0:1","type":18,"repeat":0,"mmsi":237118300,"scaled":true,"reserved":0,"speed":0.0,"accuracy":false,"lon":23.0169,"lat":37.9220,"course":230.1,"heading":511,"second":5,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":false,"radio":6} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165605,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165605,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165605,7.29,M,8.30,M,24.15,M*0A {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165605,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*4A $GPRMC,165605,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*21 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:05.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165606.00,14,09,2014,00,00*6F $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165606,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,287,46,32,71,316,48,14,33,047,45,22,13,067,42*75 $GPGSV,3,2,12,01,55,319,46,27,14,171,46,23,11,208,45,04,31,309,44*70 $GPGSV,3,3,12,31,16,113,44,28,05,292,36,19,41,187,48,20,31,271,46*76 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":287,"ss":46,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":33,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":45,"used":true},{"PRN":4,"el":31,"az":309,"ss":44,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":36,"used":true},{"PRN":19,"el":41,"az":187,"ss":48,"used":true},{"PRN":20,"el":31,"az":271,"ss":46,"used":true}]} $GPZDA,165606.00,14,09,2014,00,00*6F $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036233,"lon":23.016931916,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0972,0.000,140914,,*22 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165606,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.050,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165606,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165606,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165606,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} {"class":"ATT","device":"nmea2000://vcan0:17","depth":9.080} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165606,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165606,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165606,7.29,M,8.30,M,24.15,M*09 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165606,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*49 $GPRMC,165606,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*26 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:06.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPZDA,165607.00,14,09,2014,00,00*6E $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165607,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSV,3,1,12,11,78,287,43,32,71,316,48,14,32,047,45,22,13,067,42*71 $GPGSV,3,2,12,01,55,319,46,27,14,171,46,23,11,208,46,04,31,309,43*74 $GPGSV,3,3,12,31,16,113,44,28,05,292,37,19,41,187,47,20,31,271,47*79 {"class":"SKY","device":"nmea2000://vcan0","time":"1970-01-01T00:00:00.000Z","xdop":0.49,"ydop":0.55,"vdop":1.04,"tdop":1.00,"hdop":0.73,"gdop":1.42,"pdop":1.28,"satellites":[{"PRN":11,"el":78,"az":287,"ss":43,"used":true},{"PRN":32,"el":71,"az":316,"ss":48,"used":true},{"PRN":14,"el":32,"az":47,"ss":45,"used":true},{"PRN":22,"el":13,"az":67,"ss":42,"used":true},{"PRN":1,"el":55,"az":319,"ss":46,"used":true},{"PRN":27,"el":14,"az":171,"ss":46,"used":true},{"PRN":23,"el":11,"az":208,"ss":46,"used":true},{"PRN":4,"el":31,"az":309,"ss":43,"used":true},{"PRN":31,"el":16,"az":113,"ss":44,"used":true},{"PRN":28,"el":5,"az":292,"ss":37,"used":true},{"PRN":19,"el":41,"az":187,"ss":47,"used":true},{"PRN":20,"el":31,"az":271,"ss":47,"used":true}]} $GPZDA,165607.00,14,09,2014,00,00*6E $GPGGA,165607,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*48 $GPRMC,165607,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036233,"lon":23.016931916,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165607,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*48 $GPRMC,165607,A,3755.3222,N,02301.0159,E,0.0778,0.000,140914,,*27 $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165607,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.040,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165607,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*48 $GPRMC,165607,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165607,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165607,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*48 $GPRMC,165607,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165607,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*48 $GPRMC,165607,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165607,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} $GPGGA,165607,3755.3222,N,02301.0159,E,1,12,0.73,9.81,M,35.000,M,,*48 $GPRMC,165607,A,3755.3222,N,02301.0159,E,0.0389,0.000,140914,,*2D $GPGSA,A,3,11,32,14,22,1,27,23,4,31,28,19,20,1.3,0.7,1.0*31 $GPGBS,165607,7.29,M,8.30,M,24.15,M*08 {"class":"TPV","device":"nmea2000://vcan0","mode":3,"time":"2014-09-14T16:56:07.000Z","ept":0.005,"lat":37.922036200,"lon":23.016931900,"alt":9.813,"epx":7.286,"epy":8.304,"epv":24.150,"track":0.0000,"speed":0.020,"climb":0.000,"eps":16.61,"epc":48.30} !AIVDM,1,1,,A,144cG # Date: 2011-03-01 # Notes: The NTRIP source table entry is: # STR;CLK50;BRDC_CoM_ITRF;RTCM 3.0;1059(10),1060(10);0;GPS;Misc;DEU;50.00;10.00;0;1;RETINA;none;B;N;1800;ESA/ESOC ÁÖÿƒpõîÐEÿßèLöø2X„ú¢?Äoýø§à™Ï:—ßÿ?ÌV)ƒýžàÿ» þšdäÐÿšèT€ÔÀ 8ÿóœ;€ i/÷ê ]ÿ)`‘€Âúÿâ¯ÿu3ÿàØ‡üÀÿñ\¿îJ@A˜rÓ ·€ œÿ£ ÜŠIOü`ÿìp“Xjà4óh.€ €9ÿ;ÿÿîd\©ø€˜’À­@Š¿ý‚ÿÀ°ùøŸ€.^1ùàâPÿñ …õ‘*?þÇ@öb` žÿ¢uÿÛ` úàhWþCOþÿÉþÚвøÿážoõ·ÿý{ýÀþº`­=JÓB2õbbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬Ù†Ó!BBõg ؒïüiÿl`=øcÿé~ØŸ€$ÿ{sÿ?úˆZ* ÿýùÿ¯€À Õÿÿƒpøî“EÿßøLÿöð2Œ„ú¢?Äoýøœ ™Ï@—¿ÿ?Ìv)ƒýžÀÿ» þhdäÔÿšðUÏ 8ÿóž;À Zi/÷ë [ÿ)`Œð€Âûÿâ¯ÿt8ÿà°‡ÿüÈÿñ0¿îH@Aœr@з€ µÿ£ÀâIOü@ÿì`”Pjà7óh.€“9ÿ?ÿÿîl\(©ø˜’ ©°Š¿ý€ÿÀ ùøÙ€.^0÷ùßâHÿñð…õ@*Gþǀöb žÿ¢wÿÛ@ ühWþCþÿÉþ9xn_ö*§GúȀÿtoþÚÜ@*,Úªè‡ÿâ Ð`ÿi šÒ­ P€’>Úè²€øÿáðoõžÿýsýÀþ¹ UµGÓB2õgbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬#×üÓ!BBõl ؒ¿ühÿl€>ðcÿé~ØŒ€%À$ÿ{sÿúr* _ý÷ÿ¯ Ÿ°ÕùÿƒpöEÿà(Löð3„ú¡¿Äwý@ø‹à™ÏD—ßÿ?Ì®)ƒýŸ0ÿ» þšdäÖÿšðU€Ô@ 8ÿóÔ<@ ¶i/÷ì [ÿ) ‹€€Ãÿâÿs/€ÿàšˆüàÿðØ¿îHÀA€sÌ ·€ «ÿ£àæ©IOü€ÿ쀔ðjà2ÿóP/š€9ÿ;ÿîl\~©ø€ž’À¥ÐŠ¿ý‚ÿÀøøÓ€.^1ùÞâHÿò…õŒÀ*KþÈö_à žÿ¢uÿÛ@ üøhWþBýýÿÉþ7Èn_ö+€§GúÊÿsÀoþÚØÀ*ڌè‡ÿá  Ð@ÿjКҚ p¥Š€>Úȳ€èÿáàoõ¹ýsý€þ» ÆkÑÓB2õlbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€b꬞Ó!BBõq ؒ_ügÿlp?˜cÿé þÐº8@$ÿ{Wÿú˜Ô* Ÿýùÿ¯€À Õõÿƒ÷î˜Eÿà@M÷2€„ú¡Ä{ý@ø@™ÏN—ßÿ?̱)ƒýŸÿ»þ däÕšðVßÀ 8ÿóä<@ ²i/÷ì ]ÿ)@à€à ÿâÿt3ÿàø‡ÿüèÿðX¿îIÀAšsÁ·€ ¥ÿ£ÀèÏIOüpÿ쀕pjà2ÿó@0ºÀ9ÿSÿ¿îx\è©ø ’À€àŠ¿ý{ÿÀ°ùø×.^0ßùÝâ8ÿñd…õ@*OþÇÀö_@ žÿ¢oÿÛ@ hWþAïýýÿÉþ6n_ö2€§'úˀÿtÀoþÚž*Ú`è‡ÿá Ð@ÿj€šÒ± €Šy€>ÚŽðÿâoõ¹?ýoý€þ»@„tµÓB2õqbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬ÞáÓ!BBõv ؒ/üeÿlp?øcÿé~àž7À$ÿ{Sÿÿú˜‚* ýûÿ¯€ÁPÕïÿƒ€øîEÿàHNöø2<„ú ¿Äýøy@™ÏZ—¿ÿ?Ì€)ƒýžÀÿ»þ°dä×ÿšøV€Ú 8ÿóü=@ Ìi/÷í` [ÿ)@À€à ÿâÿt:€ÿá0ˆÿüøÿïпîIÀA¬s€³ ·€ ¡ÿ€ì IOü0 ÿì •°jà1ó(/Ú@9ÿCÿ?î|\Œ©ø  ’ €0Š¿ý|ÿÀ€÷øÝ.^0§ùÜâ0ÿñŽ…õ@*SþÈ@ö\  žÿ¢yÿÛ@ hWþA¿ýùÿÈàþ7àn_ö1§ú̀ÿz€oþڔ@)øÚÊè‡ÿà@ ÏàÿkàšÒª §X>Ú Ž€èÿâ oõ¹?ýký€þ· óÓB2õvbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬>§˜Ó!BBõ{ ؑÿüdÿlP@ cÿéþÐµ9À$ÿ{[ÿ?ú ‘* ýùÿ¯@Á0Õïÿƒ÷î’EÿàhOöø1ø„ú ÿćýø|€™Ïl—¿ÿ?Ìy)ƒýžÐ ÿ» þèdäÜšðWÒ 8ÿóü=À 8i/÷í _ÿ)’p€à ÿâÿt;ÿá ˆýÿï¿îIA°tªà·€ Ÿÿ£Àò­IOü€ ÿ쐕xjà/ÿó/€ô€9ÿSÿÿî„\Ê©øÀŠ’€¥PŠ¿ýuÿÀöøÕ€.^0·ùÛâ(ÿñà…õŒ@*SþÈ@öZà žÿ¢gÿÛ /hWþAßý÷ÿÈðþ:°n_ö5Šÿú̀ÿ€ÀoþÚl)ìÚòè‡ÿà Ðÿf šÒ± šB€>Ú(¶ðÿáhoõº?ýgýÀþµ ³ÙÓB2õ{bý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bꬭßîÓ!BBõ€ ؒübÿlpCcÿèü~Ð³9€$ÿ{Oÿ¿ú€ò* ?ýûÿ¯@ Õîÿƒ÷EÿàXPöð2t„ú ?ćý€ø…™Ïn—¿ÿ?Ì|)ƒýžðÿ»þpdäÜ©XÊ 8ÿô> i/÷íà ]ÿ)‘€ÃÿâÿsP€ÿáx‰ýÿîKA°sÀ¡ ·€ ‹ÿ€òµIOüPÿ찏8jà/ÿó09ÿ;ÿ?îˆ\’©ø`Š’ ŠPŠ¿ýxÿÀ€÷øÉ€.^0·ùÙÿâ0ÿñp…õŠÀ*_þÈÀöV€ žÿ¢{ÿÛ >hWþAýôÿÈàþ;(n_ö7ŠçúπÿŒ€oþÚ<À)Üۘè‡ÿß` ÏÀÿe`šÒ°  §$>Ú ¶€øÿáoõº¿ýgýÀþ¶ ºu1ÓB2õ€bý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬ ÕôÓ!BBõ… ؑ_ü`ÿlPDðcÿèö~Ø°€A€$ÿ{Kÿú€‘p* ÿýýÿ¯ À@Õäÿƒ€÷EÿàxPÿöð2”„úŸċý€ø‹@™ϊ—Ÿÿ?Ìi)ƒýŸ ÿ»þ däßÿšðX€ɀ 8ÿô$>€ Œi/÷ï@ [ÿ) “P€ÃÿâÿqG€ÿáPŠý ÿï¿îKAŽt€ž·€ ÿ€ ø¹IOü@ ÿì°Šhjà1òè1€9ÿGÿ?îŒ\v©ø ª’€¥Š¿ýtÿÀ€öøÃ€.^0ùÙâ(ÿñü…õ‹@*[þÉ@öY€ žÿ¢gÿÛ@ qhWþ@¯ýóÿÈàþ:n_ö:ŠÏúÑÿ‹@oþÚ$À)Èۖè‡ÿß  ÏÀÿa šÒ³ °ª€>ÚH·€ðÿáHoõ¹ÿý_ýÀþ¹s\ÓB2õ…bý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬ÚŽÓ!BBõŠ ؑoü_ÿl`Gcÿèô~Ð­H$ÿ{Cÿÿúš‘X* ßýûÿ¯ Õáÿƒ€ùî»EÿàhQÿöð2°„úž?ėýÀøŽ€™ό—¿ÿ?Ìc)ƒýž  ÿ»þPdäàÿ©YЀ 8ÿôD>€ *i/÷ð ]ÿ(à”P€ÃÿâÿsU€ÿáX‰ÿý8ÿî ¿îLAÀtÀ—À·€ ‡ÿ€úœIOüP!ÿìÀ…€jà+ÿòØ1€,9ÿSÿ¿î”\b©øÀ®’€¥pŠ¿ývÿÀ€÷øÉ€.^0·ùØÿâ(ÿñÔ…õ‰*gþÉ@öZ žÿ¢mÿÛ@ whWþ@?ýðÿÈÐþ:8n_ö:€Š·úҀÿ”€oþÚÀ)ŒÛ@è‡ÿÞàþÏ ÿ]pšÒ· Ъ >Ú žðÿáDoõ»?ý[ýÀþ¹À˜îÓB2õŠbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬S ûÓ!BBõ ؑOü^ÿl@G˜cÿèì~Ø«LÀ$ÿ{3ÿÿú°‘ô* ?ýûÿ¯@ōÕÝÿƒùîÔEÿà˜Qÿöà2x„úŸ¿Ä“ýø‹™ϔ—Ÿÿ?̧)ƒýž ÿ»þ °dääÿšøZÜÀ 8ÿô`?€ \i/÷ð Yÿ(À”€Ãÿâ_ÿrSÿᚊý@ÿî<¿îJ@AÀu’À·€ qÿ€ ŒIOü@"ÿìÀ‚jà+òÈ1€@@9ÿcÿÿî”[è©ø °’ Š Š¿ýxÿÀ€õøÔ.^0_ù×â(ÿò<…õ‰*cþÉ@ö[  žÿ¢kÿÛ „hWþ@oýìÿÈÐþ7Èn_ö;€Š§úӀÿ’€oþÙà)šÚòè‡ÿÝàþπÿ[ šÒ³ Ъô>Ú`ž€øÿáàoõ»ýWý€@þº _‚òÓB2õbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bꬩÁÓ!BBõ” ؐïü\ÿl@G8cÿèéþØš€Q$ÿ{Cÿÿú°‘Î* ýÿÿ¯ ǍÕÖÿƒøîÏEÿà°Rÿöð2„úěý@ø†™Ϟ—Ÿÿ?ÌŒ)ƒýžð ÿ»þ ždäá©[ñ@ 8ÿôT?À vi/÷ðÀ [ÿ(à—0€Ãÿâ_ÿqH€ÿáž‹ý`ÿí¿îK€AÄu@€·€ yÿ€äIOü"ÿì°8jà+ÿò°2S9ÿ[ÿ¿îœ[š©ø@Ž’ š`Š¿ýuÿÀpõøì.^0ùÖâÿòì…õ‡€*kþÉÀö_À žÿ¢oÿÛ ohWþ?ÿýêÿÈàþ7Èn_ö=ŠúÔÿ‘@oþÙÀ€)œÛè‡ÿÝàüπÿXàšÒ» Ыí€>ÚX¹€ðÿâoõ»ýWý€€þº?HòÓB2õ”bý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬ÇmêÓ!BBõ™ ؐÿüZÿl0FðcÿèãþÀŠ\€$ÿ{Gÿ?úž‘* ýýÿ¯ É0Õ×ÿƒ øEÿàšSÿöð2À„úœÿėýÀø}™Ï®—Ÿÿ?Í )ƒýžà ÿ»þHdäæ©[€ À 8ÿô|@@ ôi/÷ñ@ Yÿ(À—@€Ã$ÿâOÿpFÿáð‹ýhÿìd¿îKAÈu€‡`·€ gÿ€ 'IOüP#ÿìÀ|jà,ÿòš2€g@9ÿOÿ¿î€[@©ø`²’ «0Š¿ýrÿÀ`õù€.^0oùÕÿâÿó„…õ‡*oþÊöc  žÿ¢gÿÛ@ ZhWþ?ýèÿÈÀþ:hn_ö?€Š‡úՀÿÀoþٔ@)ˆÛxè‡ÿ݀ Ï ÿM°šÒ¹ ЪÓ>Úšº€ðÿâ°oõ»ÿýSý€@þº`(±ÔÓB2õ™bý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬TœÓ!BBõž ؐ?üYÿl0GPcÿèÝ~Ø€g€$ÿ{'ÿúސÌ* þÿ¯ÍÕÐÿƒ úEÿàØTÿöà4 „ú›ÿÄ£ýøq ™Ϭ—_ÿ?ÍE)ƒýžà ÿ»þ8däé©\ 9 8ÿô|@À hi/÷ñ` [ÿ(À‘€€Ã&ÿâOÿp/€ÿáЋÿýhÿëô¿îL@AÌuÀ€€·€ aÿ€   IOüð#ÿìÐxPjà*òˆ2€ƒ€9ÿoÿ?î¬Zž©ø ž’ ¬Š¿ýnÿÀ€öù€.^0OùÔÿâÿóì…õ…*wþÊöc žÿ¢mÿÛ chWþ>ßýæÿȰþ8àn_öD€Šgú×ÿ…oþÙx€)tÛþè‡ÿÛÀüÏÿG0šÒ» ð¬¶>Ú »ÿãšoõœ¿ýOý€@þ·€#w5ÓB2õžbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bꬎ±åÓ!BBõ£ ؐoüYÿl0Ghcÿè×þÐ¡s$ÿ{ÿ¿úŒ‘J* Ÿýÿÿ®àÍ ÕÍÿƒÀùEÿàèTöØ4”„ú›ħý Àøc@™Ï—_ÿ?ÍT)ƒýžð ÿ»þ(däéÿ©\€ \€ 8ÿô A€ Ši/÷ò  [ÿ(ÀŽ`€Ã*ÿâ?ÿqL€ÿâ(‹ÿý€ÿ뀿îK€AÐvuÀ·€ Wÿ€@êIOü0$ÿìàw8jà)ÿòˆ2¢@9ÿkÿîšZ>©ø@ž’`¬ Š¿ýkÿÀpõù€.^0WùÓÿâÿòø…õ„À*sþÊö^à žÿ¢uÿÛ "+hWþ>ßýãÿȰþ:ðn_öGŠ_ú؀ÿj@oþÙL @)hÜàè‡ÿۀúÎàÿF@šÒŸ 𭈀>ÚÐŒ€ðÿåŽoõœýKý€Àþ³ CGÓB2õ£bý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬Ô%@Ó!BBõš ؏ïüVÿl GÈcÿèÔ~Èžo$ÿ{ ÿ?úÀ‘’* ýýÿ®ÀÊðÕÊÿƒ úEÿàØUöÐ4ø„úš?įý øSà™Ïėÿ?Íx)ƒýŸÿºðýûÐdäêÿ©]€ tÀ 8ÿô¬A@ Þi/÷ò€ Wÿ(` €Ã(ÿâ/ÿp‹€ÿâ‹ÿýˆÿìt¿îKAØv€l€·€ Kÿ€` 0IOü%ÿìàtðjà%òp3Ž@9ÿkÿ?îžYâ©ø Œ’`­pŠ¿ýiÿÀ`ôù#€.^0WùÒÿâÿó…õ„€*{þʀöYÀ žÿ¢mÿÚà $ hWþ>ýáÿȰþ<žn_öG€Š?úـÿP@oþÙ8 €)T݀è‡ÿÛÀúÎàÿF€šÒ ¬d>ÚÈ»€ðÿçðoõŒÿýGýþ¥@C÷ÎÓB2õšbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬ié3Ó!BBõ­ ؏ÿüTÿl I(cÿèÌ~Ðœ[À$ÿ{ÿÿúÀ‘n* ¿þÿ¯ÈÕÅÿƒúîo€EÿáUöØ5€„ú™¿Ä«ý €øC@™ÏΗÿ?Í·)ƒýž ÿºðý÷hdäì©^ Ž€ 8ÿôèB i/÷ô Yÿ( ‰Ð€Ã+ÿâ/ÿo¹ÿâ0Œÿýÿîd¿îL€AÜwg·€ Qÿ€@ jIOü %ÿìðvPjà*ÿò`3Ò@9ÿ{ÿ?îžYD©øàÀ’ ¯ðŠ¿ýgÿÀpôù2€.^0ùÑÿâÿòT…õ„€*ƒþÊÀöX` žÿ¢gÿÛ *òhWþ>/ýÞÿȐþ>n_öI€Š/úÛÿ9ÀoþÙ!@)<Þè‡ÿÚ úΠÿCšÒ¿ ­B>ÚðœðÿéÄoõŸÿýGýþ›@ÜßNÓB2õ­bý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bꬓ!IÓ!BBõ² ؏¿üSÿlJ0cÿèÊþÐ™E$ÿ{ÿ?úȐä* ?þÿ® Æ`ÕÀÿƒ°úîrEÿáVöØ6T„úšijý Àø;À™Ïâ—?ÿ?Î)ƒýžpÿºàýò däðÿ©^€ §€ 8ÿôäB xi/÷ô@ Wÿ(€‰€€Ã.ÿâ/ÿoõÿâpŒý˜ÿït¿îLAØw@Zà·€ Kÿ€` †IOüP%ÿíuàjà'ÿòP4ò@9ÿoÿÿîÀXò©ø Ÿ’`²°Š¿ýjÿÀpôù.^0ùÐáøÿñì…õ€*þÊÀöUÀ žÿ¢aÿÛ (ÚhWþ=¿ýÚÿÈ þ>n_öKŠ'úÜÿ(oþØð!€),Þ®è‡ÿÙàøÎ€ÿC@šÒ¿ @¯>ÚøŸðÿëoõœ¿ý?ýþ” ê¹$ÓB2õ²bý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬ÉU$Ó!BBõ· ؏oüQÿl0HPcÿèÃ~È—3@$ÿ{ÿ¿úÈ‘h* ¿þÿ®ÀÁ`ÕÁÿƒ°úî;Eÿá@WöÐ7T„ú™¿Ä¯ý Àø6À™Ïà—ÿ?În)ƒýž°ÿºÐýïèdäðÿ©_ »@ 8ÿôøC ’i/÷ô Yÿ(`ŠÐ€Ã/ÿâÿo€ÿ☌ÿý°ÿñL¿îN€AÜw@Q ·€ Gÿ€€ šIOü &ÿíuðjà&òH4€9ÿ‡ÿ¿îÌXœ©ø Ē€µðŠ¿ýdÿÀ`òù€.^/÷ùÐáøÿò$…õ@*‡þË@öUà žÿ¢iÿÛ .­hWþ=ŸýØÿȐþ=€n_öK¥ÿú݀ÿ€oþذ") ß*è‡ÿÙÀö΀ÿF°šÒÁ P®û€>ÚŸ€ðÿë0oõœ¿ý?ýþ“@ZµÓB2õ·bý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬3^Ó!BBõŒ ؎ÿüOÿlFÐcÿèœ~À”€€$ÿzóÿ?úÔ‘J*ßþÿ®€»PÕºÿƒÐúîEEÿáhWÿöÈ8š„ú—ÿÄ·ý @ø-`™Ïì–ÿÿ?ÎŒ)ƒýž@ÿºðýî däô©` Ù 8ÿõC€ èi/÷õ€ Wÿ(@ŠP€Ã8ÿáÿÿo?ÿ⚍ýÈÿò¿îMÀAÜwÀK`·€ =ÿ€ $ ßIOü0&ÿít€jà$ò(4€ À9ÿÿîÈWž©ø@Ē@·°Š¿ýkÿÀ`òù .^/×ùÎÿáèÿòì…õ@*‡þˀöR@ žÿ¢aÿÛ 2šhWþ=ý×ÿȀþ=àn_öL¥÷úÞÿÀoþؘ"À) ßÈè‡ÿ؀øÎ€ÿHpšÒÅ @¯Å>Ú¿ðÿëŒoõ¿ý7ýþ”9~öÓB2õŒbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bꬎQ-Ó!BBõÁ ؏üNÿlEÈcÿè¹þÈ’ûÀ$ÿzûÿÿúԐš*Ÿþÿ®ÀŽ Õ¹ÿƒÀûîN€EÿáPXÿöÐ9܄ú˜Ä¿ýø$ ™Ïþ—ÿ?Îû)ƒýžÿºàýìPdäöÿ©a í€ 8ÿõ CÀ ˜i/÷õ` Wÿ(@Š€Ã3ÿâÿod€ÿ➍ÿýÐÿó(¿îMAèx@G ·€ 5ÿ€ & ãIOüP)ÿí t(jà%ÿò49ÿÿÿîØVž©ø ƒ@ŒŠ¿ýbÿÀPñù.^0ùÍÿáèÿóT…õ*þËÀöTà žÿ¢iÿÚà 6hWþ<¿ýÓÿȀþÚ8À€ðÿì”oõÁ?ý7ý@þ 0éÃÓB2õÁbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€b꬯ÜÓ!BBõÆ ؏üOÿlEhcÿèµ~Ð€üÀ$ÿ{ÿ¿úܐÞ*Ÿþÿ®`°ðÕ·ÿƒÀúîd€EÿáˆXÿöÈ;„ú–¿ÄÇý€ø ™Зÿ ?Ï&)ƒýž@ÿºÐýéhdäö©a€ ùÀ 8ÿõ@D ”i/÷ö Wÿ( Šð€Ã:ÿáïÿm€ÿãŽýàÿóÔ¿îM€AìxA ·€ %ÿ€€, ÜIOü 'ÿí t8jà!ÿò49ÿkÿîÜV~©ø@ʒ Á@Š¿ýaÿÀPòøí€.^/÷ùÌÿáèÿód…õ@*“þËÀöP€ žÿ¢oÿÛ 8QhWþÚ8Áðÿì„oõ¿ý/ý€þÀ{Å©ÓB2õÆbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬OxgÓ!BBõË ؎¯üLÿlE`cÿè®~ÈŒÀ$ÿzóÿ¿úܐÒ*ßþÿ®`­ Õ­ÿƒ°ûîJEÿáYÿöÈ;Œ„ú–ÄÇý€ø#`™Жßÿ?ÏA)ƒýžPÿºàýçˆdä÷©a€ 8ÿõ`D€ `i/÷÷ Wÿ(@Š@€Ã@ÿáßÿo‰ÿãŽÿýðÿô€¿îNAèxÀAÀ·€ %ÿ€ .!:IOü`)ÿí@u°jà"ÿñø5@9ÿ“ÿîàUÈ©ø̒`ÆðŠ¿ýgÿÀPñøä€.^/ÏùËÿáðÿóœ…õ}@*ŸþÌ@öK@ žÿ¢gÿÛ <*hWþ;ïýÍÿÈpþ;n_öV¥¿úá€ÿoþØ<$(Üâè‡ÿ×@ôÎ ÿFšÒÆ p²€>Ú@Á€øÿì0oõÀ¿ý/ý€þà>lyÓB2õËbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬ÜÓ!BBõÐ ؎oüKÿkðEcÿèš~ÐŠ*€$ÿzóÿ¿úà®*_þÿ®€« Õ©ÿƒ°ûîNEÿá˜ZöÀ<,„ú—ÄËýø&`™Ð –ßÿ ?Ïb)ƒýž`ÿºÐýçèdäúÿ©b€  8ÿõPE Œi/÷÷À Sÿ(@†À€ÃBÿáïÿm†ÿã0Žÿýøÿõ¿îN€Aðy>à·€ ÿ€À2!—IOü@*ÿí0w€jà ÿñè5@9ÿÿ?îèUT©øÀΒ@ËŠ¿ý_ÿÀ`òøØ€.^/ÏùËÿáàÿòØ…õ}*£þÌ@öEÀ žÿ¢_ÿÛ >+hWþ;ïýÌÿÈPþ9n_öT€¥¯úâ€ÿoþØ $À(ÈâŽè‡ÿÖÀðÎÿ@šÒÌ ŽÉ>Úh€ÿìÔoõÁ?ý+ý‚þŒ€Û© ÓB2õÐbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bꬲ¬zÓ!BBõÕ ؎üJÿlD@cÿè¥~Ð‡€?À$ÿzÏÿ¿úè$*þÿ®`«ÀÕŠÿƒÀüîc€EÿážZöÀ=„ú•?ÄËý€ø&`™Ð–ÿÿ?ϖ)ƒýž@ÿºðýç8däü©c &@ 8ÿõlE€ i/÷ø Sÿ(ð€ÃGÿáÏÿnЁÿã0ŽÿþÿõX¿îNAøy>`·€ ÿ€À8!ÚIOü0)ÿí@wØjàÿñØ5€À9ÿ—ÿîèT䩸@Β@Ë@Š¿ýZÿÀPñø¿.^/ŸùÉÿáàÿò8…õ{@*§þÌ@ö@  žÿ¢YÿÚà B4hWþ:ÿýÈÿÈ@þ:˜n_öU€¥úã€ÿ,@oþØ%€(ŽâŒè‡ÿÖ ðÎÿ=PšÒÌ µ†>ÚhÃøÿìÐoõÂý+ýÀþÀ+šŽÓB2õÕbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬HdÓ!BBõÚ ؍ßüHÿkðCcÿèþÈ„€`@$ÿzÛÿÿúèê*ÿþ ÿ®@¬ÀÕ§ÿƒÐûîU€Eÿáž[ÿöÀ=p„ú–¿ÄÓý@ø%@™Ð.–ÿÿ?ÏÉ)ƒýžÿºàýçPdäÿ© d +@ 8ÿõŒF ni/÷øà Sÿ(‚°€ÃCÿáÏÿm‰€ÿãxþÿõŒ¿îMÀAøy@`·€ ÿ€à<!ÿIOü0*ÿí0yjàñÀ5€ý9ÿ‡ÿ?îøT@©ø Ԓ Ί¿ý^ÿÀPðøœ€.^/oùÉáàÿñL…õ{*£þ̀ö:@ žÿ¢kÿÚà D=hWþ:ÿýÆÿÈ0þ8€n_ö\€¥úä€ÿ8@oþ×è%À( âÐè‡ÿÖ òÍÀÿ:ÀšÒË  µS€>Ú€ÄøÿìXoõÂý#ýÀþŠ`Ž „ÓB2õÚbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬ÁpuÓ!BBõß ؍¯üFÿlBXcÿèš~Ðƒ|@$ÿzïÿÿúðÌ*þÿ®@¬Ð՜ÿƒÐüîl€Eÿáð[ÿöž=Ԅú•?Ä×ý@ø& ™Ð2–Ÿÿ ?Ïú)ƒýðÿºàýçØdäü© e ;@ 8ÿõ F ài/÷ù€ Uÿ'à‡@€ÃBÿáÏÿmÿ㘏þ ÿôž¿îN@Aüy€D@·€ ÿ€À@"IOü€*ÿí`z˜jàñš5ô€9ÿ›þÿ¿îüSœ©ø Ԓ ÏpŠ¿ýXÿÀ0ðøÞ€.^/ùÈáèÿïÈ…õy*«þÍ@ö5 žÿ¢aÿÚà HhWþ:oýÄÿÈ@þ6Pn_öZ€¥wúæÿ?Àoþ׌&@(Œãè‡ÿÔàîÍ ÿ:šÒÉ À¶>Ú ÀøÿìloõÂÿý#ýÀþ†i€ÓB2õßbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬;žÓ!BBõä ؍ŸüGÿlB@cÿè”~Ð€£€$ÿzÓÿ?úðÞ*þ ÿ® ¬P՗ÿƒðýîiEÿáè[ÿöÀ>0„ú“?Ä×ýø.€™Ð<–¿ÿ ?Ð)ƒýðÿºàýçÀdäýÿ©e€ N€ 8ÿõšF€ i/÷ùÀ Sÿ'Àˆð€ÃLÿá¿ÿl™ÿ【þ8ÿôà¿îN€Bz@ ·€ ÷ÿ€àB"IOü€*ÿíPz(jàñš6ô€9ÿŸþÿÿïS‚©øؒ ÒðŠ¿ýZÿÀ0ïøï.^/OùÈáØÿî…õx€*³þ̀ö.€ žÿ¢cÿÚà J hWþ:?ýÂÿÈ þ4àn_ö]¥Wúæ€ÿAoþך'@(€ãè‡ÿÔ òÍ ÿ;šÒРж ü€>ÚØĀøÿì0oõÃ?ýý‚@þ ÷%óÓB2õäbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬u˜¯Ó!BBõé ،¿üDÿkð@Xcÿè~Ø|€»À$ÿzÏÿúø‘2*?þ ÿ®@«à՗ÿƒÐüî`€EÿáÐ]öž>4„ú“¿Äãýø9À™ÐB–ÿ ?Ð)ƒýžÿºàýèdå© f _@ 8ÿõÌG ”i/÷ú Qÿ'Àа€ÃLÿáÿm{ÿ㘐þ8ÿõ¿îO@Bz@=à·€ ïÿ¥F")IOü@-ÿíPyjàñˆ6ý@9ÿ£þÿÿïSz©ø€ڒÓ0Š¿ýUÿÀ@ïù€.^/ùÇáàÿíd…õw€*³þÍ@ö-` žÿ¢eÿÛ N#hWþ9ïý¿ÿÈ þ5(n_ö^¥Gúç€ÿ:@oþ׈'À(lânè‡ÿÓÀîÍ@ÿ<ÀšÒÐ Àž è>ÚèÅøÿìoõÃ?ýý‚@þ~ÀùÀpÓB2õébý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬æàÙÓ!BBõî ؍üBÿkð?PcÿèŒþØ{ß@$ÿz»ÿ¿úüò*ßþ ÿ®¬°՗ÿƒàûEÿáø^ö°>H„ú”Äãý@øB™ÐP–¿ÿ ?Ð)ƒýž ÿºàýèdå©(g c€ 8ÿõðG€ i/÷úÀ Qÿ'À@€ÃPÿáÿm:€ÿãÀþ@ÿõÀ¿îO€BzÀ< ·€ ãÿ¥ L"HIOü€-ÿí`x°jàñˆ6À9ÿ³þÿ¿ï Sv©ø ܒÕðŠ¿ý]ÿÀ@îù&.^/gùÆáØÿìd…õv€*¿þ̀ö& žÿ¢aÿÚà ThWþ9ýœÿÈþ1n_öc¥?úêÿ5oþ×`((Xáúè‡ÿÒàîÍ`ÿ?КÒÒ ð¹ ܀>ÚØÆÿëloõÃ?ýý‚Àþàg*ÓB2õîbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬D Ó!BBõó ،üBÿl?Pcÿè…þÈx€@$ÿz»ÿûà*¿þ ÿ® ­ Ւÿƒðüîl€Eÿâ(^ö°>L„ú’?Äçý€øM ™ÐP–ÿ ?Ð-)ƒýÀÿºàýèØdå©g€ fÀ 8ÿõôH Èi/÷û@ Qÿ'À0€ÃWÿáÿkú€ÿäþXÿöœ¿îOÀB zÀ9@·€ ×ÿ¥ N"OIOü.ÿí€yPjàÿñx6€ €9ÿ¿þÿïS˜©øÀޑàØ Š¿ýPÿÀ0ïù3€.^/GùÅáÐÿì …õtÀ*ÃþÎöÀ žÿ¢_ÿÛ VhWþ9Oý»ÿÈþ.@n_öe¥úêÿ3@oþ×<(À(DßÎè‡ÿÓîÍ ÿC@šÒÖ à¹ Ý>Úƀÿì oõÿýý‚Àþ€À}Ë3ÓB2õóbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬F\ÎÓ!BBõø ،¯ü@ÿkð?0cÿèþØu€ @$ÿz»ÿû>*?þ ÿ® °Ջÿƒðûî‘Eÿâ^ÿö >„ú‘ÿÄëüÿÀøRà™Ð`–_ÿ ?Ð%)ƒý°ÿºÀýéÀdå©(h p@ 8ÿöH@ Ti/÷û Sÿ'À’P€Ã[ÿáÿmہÿä‘þ`ÿö°¿îO@B {4à·€ Ùÿ¥ R"nIOü€/ÿí`{@jàÿñX7€9ÿ¿þþÿïS©øàâ‘ÀÔ°Š¿ýTÿÀ0íù€.^/ùÃÿáÈÿì@…õt*ÇþÎ@ö` žÿ¢iÿÚà V'hWþ8ýžÿÇàþ.n_öe€¥úë€ÿ.Àoþ×)@(8Ýè‡ÿÑ îÍ ÿFàšÒ× º ñ>ÚÇÿí$oõÄ?ý ý‚Àþ…À5˙ÓB2õøbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬ûœÓ!BBõý ،ü@ÿkð@cÿè|~Ðs€$ÿz»ÿÿûÔ*þ ÿ®° Շÿ„ýEÿâ _ö°>8„ú’?ÄïüþÀøZ`™Ðd–ÿ ?Ð )ƒý°ÿºàýìdåÿ©(h€ o@ 8ÿö0HÀ (i/÷ü` Qÿ'À“@€Ã]ÿáÿmš€ÿä‘þhÿöÌ¿îN€B{5À·€ Õÿ¥ V!ÓIOü`/ÿíjàÿñ@79ÿ»þÿ?ï$S|©ø à‘ÀÓ0Š¿ýLÿÀ íøè€.^/'ùÃÿáÐÿ묅õqÀ*Ëþ΀ö žÿ¢mÿÛ \hWþ8ýµÿÇàþ,Pn_öi€ÿúìÿ0oþÖô*(Ûtè‡ÿÑ@îÌàÿI0šÒÔ º €>Ú@ȀÿîDoõÄ¿ýýƒ@þˆà ;ßÓB2õýbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬XÇÓ!BBö ؋ïü?ÿkà@ðcÿèx~Øp.À$ÿz¿ÿ¿û è*ÿþÿ­àŽÐՀÿƒðüEÿâH`ö˜>x„ú¿Äóüþ@ø_ ™Ðn–?ÿ ?ÏÖ)ƒý ÿºàýìždåÿ©(i k@ 8ÿö I@ <i/÷üÀ Sÿ'€à€ÃWÿáÿk”€ÿä`‘þpÿö ¿îO@B{@6·€ Çÿ¥ X!IOü`0ÿ퀁(jàñ86€þ9ÿÃþþÿï$SŒ©ø@䑠Ð Š¿ýPÿÀ ìøº.^.ïùÂÿáÀÿì…õr€*ËþÎ@ö  žÿ¢_ÿÛ `hWþ7ïý²ÿÇàþ,šn_öj€€ïúí€ÿ/ÀoþÖÐ*À( Ú¶è‡ÿÐ@ìÌàÿL šÒÒ Œ€>ÚpÉÿïœoõÄÿý ýƒþŽ€x<èÓB2öbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€b꬞¹ÅÓ!BBö ؋ßü=ÿkð?àcÿèq~àm€:@$ÿz£ÿÿû‘*_þ ÿ­À»pՃÿƒðýEÿâ@`ÿö˜>ø„úÄóüý@ø]`™Ðr–ÿ?Ϙ)ƒýpÿºàýìXdå ÿ©(k dÀ 8ÿöLI€ (Úi/÷ý€ Mÿ'€‘ЀÃaÿá_ÿkŽ€ÿäh’þ€ÿöì¿îOÀB{À1 ·€ Çÿ¥@\ ¬IOü1ÿ퀂žjàÿñ 7€@9ÿÃþÿ?ï(Sô©ø 摠ȐŠ¿ýJÿÀ0ìø„.^.÷ùÁáÀÿì<…õq@*ÓþÎÀö žÿ¢_ÿÛ fhWþ7¿ý°ÿǰþ,Xn_öi€€ßúïÿ&ÀoþÖÈ+@'øÚ@è‡ÿÏàîÌàÿOPšÒ× Œ2€>ÚxÊÿðtoõÅÿýýƒ€þ”@€ëÓB2öbý,Æ ÿBÀb ¬F ŠÀbÿ,Æ À bó¬F ÿâÀ(b߬Æ :À0b¬F *À8bü¬Æ bÀ@bñ,F ÀHb÷,Æ þÀPbç¬F ÿZÀXbÙ,Æ zÀ`bø,F ÿÚÀhb ,Æ ÿ²Àpb÷¬F ŠÀxb¬Æ *À€bê¬Bq¿ gpsd-3.15/test/rtcm3-2.dcd0000664000175000017500000104720412460513551013401 0ustar esresr# Made from rtcm3-2.log by inspectrtcm # This demonstration version for Eric Raymond (DEMO) expires at 2011-04-17. Please visit our website at http://www.dgpsonline.eu/ for contact information. RTCM3 (2011-04-10T22:38:40.96 delay -26267.) Type 1012: ID= 0, Tk= 32188.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=284116.56, pd= 0.4835, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.44, pd= 0.2265, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 10917.78, pd= -1.4310, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.56, pd= -2.5970, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438099.64, pd= -44.3155, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.20, pd= 0.4160, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=119770.76, pd= -2.9790, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=200401.20, pd= -3.6305, lock= >937, amb=23383811.724, snr=36.00) L2 (P , r= 7.06, pd= -2.7395, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 56115.52, pd= 1.4825, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.20, pd= 1.3205, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 36355.14, pd= -0.5025, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.36, pd= 1.0095, lock= >937, snr=44.75) SV= 23, Freq= 3, L1 (C/A, r=462227.72, pd= 21.1675, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.42, pd= 2.0650, lock= >937, snr=43.50) RTCM3 (2011-04-10T22:38:40.96) Type 1004: ID= 0, TOW=194204.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 51367.44, pd= -1.1795, lock= >937, amb=23983396.640, snr=42.00) L2 (C-P/Y, r= 7.08, pd= -1.5620, lock= >937, snr=25.00) SV= 3, L1 (C/A , r= 23464.30, pd= 2.0240, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 7.08, pd= 2.8385, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 18516.94, pd= 0.8145, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 6.06, pd= 1.1550, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 15117.62, pd= -4.4685, lock= >937, amb=21884849.434, snr=50.00) L2 (C-P/Y, r= 5.80, pd= -4.7580, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=127759.56, pd= -1.8230, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.40, pd= -1.9545, lock= >937, snr=30.00) SV= 15, L1 (C/A , r=222953.02, pd= 1.3535, lock= >937, amb=24882774.014, snr=40.75) L2 (C-P/Y, r= 7.64, pd= 0.1865, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=273580.52, pd= 1.4610, lock= >937, amb=20086094.686, snr=51.75) L2 (C-P/Y, r= 6.50, pd= 2.3235, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=266722.52, pd= 0.1140, lock= >937, amb=24882774.014, snr=35.50) L2 (C-P/Y, r= 6.50, pd= 0.5815, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=279335.38, pd= 2.1665, lock= >937, amb=21285264.518, snr=49.00) L2 (C-P/Y, r= 4.56, pd= 3.1160, lock= >937, snr=40.25) SV= 11, L1 (C/A , r=249700.94, pd= 0.2535, lock= 112, amb=24882774.014, snr=27.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=291886.80, pd= 0.8780, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.30, pd= 1.1440, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=113760.36, pd= -6.1640, lock= 64, amb=24582981.556, snr=38.25) L2 (C-P/Y, r= 6.70, pd= -6.0890, lock= 64, snr=25.00) RTCM3 (2011-04-10T22:38:40.96 delay -26268.) Type 1012: ID= 0, Tk= 32189.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=284459.34, pd= 0.3875, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 5.92, pd= 0.1295, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 11436.46, pd= -1.3785, lock= >937, amb=22184641.892, snr=39.75) L2 (P , r= 4.44, pd= -2.5450, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=438131.32, pd= -44.1485, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.64, pd= 0.5830, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=119483.62, pd= -2.2925, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=201141.10, pd= -3.3880, lock= >937, amb=23383811.724, snr=36.00) L2 (P , r= 7.10, pd= -2.4960, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 56656.58, pd= 1.1565, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.82, pd= 0.9945, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 36068.80, pd= -0.7335, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.42, pd= 0.7790, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=461708.38, pd= 20.7130, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.52, pd= 1.6110, lock= >937, snr=43.50) RTCM3 (2011-04-10T22:38:40.96) Type 1004: ID= 0, TOW=194205.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 51894.54, pd= -1.8170, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 6.42, pd= -2.1990, lock= >937, snr=26.00) SV= 3, L1 (C/A , r= 23387.64, pd= 1.7965, lock= >937, amb=19786302.228, snr=52.75) L2 (C-P/Y, r= 6.42, pd= 2.6105, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 18738.28, pd= 0.7180, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.12, pd= 1.0595, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 15644.52, pd= -4.4280, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 6.02, pd= -4.7175, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=128488.84, pd= -1.9220, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.42, pd= -2.0530, lock= >937, snr=30.00) SV= 15, L1 (C/A , r=223021.12, pd= 1.5150, lock= >937, amb=24882774.014, snr=41.00) L2 (C-P/Y, r= 7.44, pd= 0.3445, lock= >937, snr=22.00) SV= 6, L1 (C/A , r=273620.88, pd= 1.5320, lock= >937, amb=20086094.686, snr=51.75) L2 (C-P/Y, r= 6.84, pd= 2.3935, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=266524.40, pd= 0.3020, lock= >937, amb=24882774.014, snr=36.00) L2 (C-P/Y, r= 6.76, pd= 0.7700, lock= >937, snr=15.50) SV= 19, L1 (C/A , r=278932.02, pd= 1.7865, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.22, pd= 2.7365, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=249066.44, pd= 0.1955, lock= 116, amb=24882774.014, snr=27.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=291718.68, pd= 0.8890, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 3.96, pd= 1.1545, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=113924.80, pd= -5.6645, lock= 66, amb=24582981.556, snr=37.75) L2 (C-P/Y, r= 7.76, pd= -5.5935, lock= 66, snr=23.25) RTCM3 (2011-04-10T22:38:40.96 delay -26269.) Type 1012: ID= 0, Tk= 32190.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=284802.40, pd= 0.1365, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 4.92, pd= -0.1220, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 11955.46, pd= -1.6035, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.14, pd= -2.7690, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438163.66, pd= -44.5605, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 4.64, pd= 0.1705, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=119198.76, pd= -3.7405, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=201881.22, pd= -3.3335, lock= >937, amb=23383811.724, snr=36.00) L2 (P , r= 6.88, pd= -2.4415, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 57197.80, pd= 0.7915, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.02, pd= 0.6290, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 35781.52, pd= 0.1280, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.56, pd= 1.6405, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=461188.58, pd= 20.7495, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.58, pd= 1.6490, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.96) Type 1004: ID= 0, TOW=194206.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 52420.56, pd= -1.3740, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 7.12, pd= -1.7590, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 23310.80, pd= 1.8335, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.64, pd= 2.6480, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 18959.60, pd= 0.7300, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.82, pd= 1.0700, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 16171.36, pd= -4.2640, lock= >937, amb=21884849.434, snr=50.00) L2 (C-P/Y, r= 6.26, pd= -4.5530, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=129217.26, pd= -1.1460, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.88, pd= -1.2795, lock= >937, snr=31.00) SV= 15, L1 (C/A , r=223089.88, pd= 1.1215, lock= >937, amb=24882774.014, snr=41.25) L2 (C-P/Y, r= 7.24, pd= -0.0465, lock= >937, snr=23.00) SV= 6, L1 (C/A , r=273661.26, pd= 1.6570, lock= >937, amb=20086094.686, snr=51.25) L2 (C-P/Y, r= 7.02, pd= 2.5180, lock= >937, snr=43.75) SV= 8, L1 (C/A , r=266326.14, pd= 0.7265, lock= >937, amb=24882774.014, snr=36.50) L2 (C-P/Y, r= 7.66, pd= 1.1925, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=278528.18, pd= 1.9200, lock= >937, amb=21285264.518, snr=49.00) L2 (C-P/Y, r= 4.58, pd= 2.8705, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=248430.62, pd= 1.4470, lock= 116, amb=24882774.014, snr=26.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=291550.64, pd= 0.9240, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.10, pd= 1.1905, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=114089.58, pd= -5.3945, lock= 66, amb=24582981.556, snr=37.50) L2 (C-P/Y, r= 8.14, pd= -5.3205, lock= 66, snr=22.50) RTCM3 (2011-04-10T22:38:40.96 delay -26270.) Type 1012: ID= 0, Tk= 32191.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=285145.30, pd= 0.1815, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 5.32, pd= -0.0765, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 12474.20, pd= -1.5205, lock= >937, amb=22184641.892, snr=39.75) L2 (P , r= 4.46, pd= -2.6870, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=438195.60, pd= -44.5035, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.18, pd= 0.2280, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r=118913.48, pd= -4.6355, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=202621.36, pd= -3.2900, lock= >937, amb=23383811.724, snr=36.00) L2 (P , r= 7.36, pd= -2.3980, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 57738.12, pd= 1.4450, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.22, pd= 1.2825, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 35495.58, pd= -0.2025, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.70, pd= 1.3105, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=460668.58, pd= 21.0090, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.78, pd= 1.9085, lock= >937, snr=43.50) RTCM3 (2011-04-10T22:38:40.96) Type 1004: ID= 0, TOW=194207.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 52946.98, pd= -1.2985, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 7.30, pd= -1.6835, lock= >937, snr=25.00) SV= 3, L1 (C/A , r= 23234.20, pd= 1.7450, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.76, pd= 2.5595, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 19181.00, pd= 0.7830, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 5.76, pd= 1.1220, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 16698.64, pd= -4.4425, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.32, pd= -4.7315, lock= >937, snr=39.75) SV= 30, L1 (C/A , r=129947.06, pd= -1.6945, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.54, pd= -1.8285, lock= >937, snr=30.00) SV= 15, L1 (C/A , r=223158.04, pd= 1.4470, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.40, pd= 0.2775, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=273701.68, pd= 1.8335, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 7.24, pd= 2.6950, lock= >937, snr=43.50) SV= 8, L1 (C/A , r=266129.54, pd= -0.3680, lock= >937, amb=24882774.014, snr=36.50) L2 (C-P/Y, r= 6.04, pd= 0.0960, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=278124.66, pd= 1.7970, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.46, pd= 2.7470, lock= >937, snr=40.25) SV= 11, L1 (C/A , r=247796.78, pd= 0.7525, lock= 116, amb=24882774.014, snr=27.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=291383.10, pd= 0.5900, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 4.14, pd= 0.8555, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=114254.86, pd= -5.5110, lock= 68, amb=24582981.556, snr=38.25) L2 (C-P/Y, r= 7.40, pd= -5.4365, lock= 68, snr=22.00) RTCM3 (2011-04-10T22:38:40.96 delay -26271.) Type 1012: ID= 0, Tk= 32192.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=285487.98, pd= 0.6035, lock= >937, amb=22184641.892, snr=41.00) L2 (P , r= 6.04, pd= 0.3490, lock= >937, snr=42.25) SV= 21, Freq= 4, L1 (C/A, r= 12993.66, pd= -2.0980, lock= >937, amb=22184641.892, snr=39.50) L2 (P , r= 3.98, pd= -3.2655, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=438227.80, pd= -44.6145, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 4.52, pd= 0.1160, lock= >937, snr=50.25) SV= 14, Freq= -7, L1 (C/A, r=118626.42, pd= -3.5810, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=203360.98, pd= -2.6930, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 7.46, pd= -1.8015, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 58279.14, pd= 1.5325, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.88, pd= 1.3700, lock= >937, snr=44.25) SV= 7, Freq= 5, L1 (C/A, r= 35209.48, pd= -0.2055, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.36, pd= 1.3060, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=460149.92, pd= 19.9710, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.50, pd= 0.8695, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:40.96) Type 1004: ID= 0, TOW=194208.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 53474.12, pd= -1.9430, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 6.38, pd= -2.3260, lock= >937, snr=25.25) SV= 3, L1 (C/A , r= 23157.52, pd= 1.8175, lock= >937, amb=19786302.228, snr=52.75) L2 (C-P/Y, r= 6.68, pd= 2.6320, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 19402.68, pd= 0.6435, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.72, pd= 0.9825, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 17225.46, pd= -4.0960, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.36, pd= -4.3860, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=130676.34, pd= -1.7105, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.34, pd= -1.8455, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=223226.86, pd= 1.2185, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.52, pd= 0.0495, lock= >937, snr=24.25) SV= 6, L1 (C/A , r=273742.64, pd= 1.5355, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.78, pd= 2.3980, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=265931.16, pd= 0.4110, lock= >937, amb=24882774.014, snr=36.50) L2 (C-P/Y, r= 7.40, pd= 0.8765, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=277721.14, pd= 1.7115, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.34, pd= 2.6605, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=247162.48, pd= 0.5050, lock= 116, amb=24882774.014, snr=27.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=291215.16, pd= 0.7620, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.08, pd= 1.0280, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=114420.10, pd= -5.4880, lock= 68, amb=24582981.556, snr=37.50) L2 (C-P/Y, r= 7.64, pd= -5.4160, lock= 68, snr=21.75) RTCM3 (2011-04-10T22:38:40.96 delay -26272.) Type 1012: ID= 0, Tk= 32193.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=285830.86, pd= 0.9540, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 6.56, pd= 0.6995, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 13511.38, pd= -0.8950, lock= >937, amb=22184641.892, snr=39.75) L2 (P , r= 5.28, pd= -2.0630, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438259.54, pd= -44.2015, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.44, pd= 0.5290, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=118340.50, pd= -3.5315, lock= >937, amb=23383811.724, snr=37.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=204100.22, pd= -1.7000, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 8.70, pd= -0.8085, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 58820.18, pd= 1.7130, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.72, pd= 1.5505, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 34923.24, pd= 0.0785, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.66, pd= 1.5910, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=459630.30, pd= 19.9130, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.70, pd= 0.8120, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.96) Type 1004: ID= 0, TOW=194209.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 53999.96, pd= -1.2885, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 6.78, pd= -1.6710, lock= >937, snr=27.50) SV= 3, L1 (C/A , r= 23080.80, pd= 2.0195, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.64, pd= 2.8340, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 19623.96, pd= 1.0005, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.36, pd= 1.3400, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 17753.06, pd= -4.4605, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.16, pd= -4.7495, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=131405.56, pd= -1.6445, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.28, pd= -1.7790, lock= >937, snr=29.75) SV= 15, L1 (C/A , r=223295.82, pd= 0.9505, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.16, pd= -0.2180, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=273783.60, pd= 1.3110, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.48, pd= 2.1725, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=265734.22, pd= -0.1380, lock= >937, amb=24882774.014, snr=36.75) L2 (C-P/Y, r= 6.42, pd= 0.3335, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=277317.28, pd= 2.0025, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.60, pd= 2.9515, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=246528.64, pd= -0.1715, lock= 120, amb=24882774.014, snr=27.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=291047.18, pd= 1.0760, lock= >937, amb=20685679.602, snr=51.50) L2 (C-P/Y, r= 4.04, pd= 1.3420, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=114585.20, pd= -5.2365, lock= 70, amb=24582981.556, snr=36.50) L2 (C-P/Y, r= 7.84, pd= -5.1655, lock= 70, snr=21.00) RTCM3 (2011-04-10T22:38:40.97 delay -26273.) Type 1012: ID= 0, Tk= 32194.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=286173.96, pd= 1.2080, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 7.46, pd= 0.9525, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 14030.96, pd= -1.5120, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.48, pd= -2.6810, lock= >937, snr=40.50) SV= 22, Freq= -3, L1 (C/A, r=438291.96, pd= -44.4030, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 4.38, pd= 0.3270, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=118052.18, pd= -0.9455, lock= >937, amb=23383811.724, snr=37.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=204841.10, pd= -2.3375, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 7.88, pd= -1.4450, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 59362.48, pd= 0.7385, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 4.84, pd= 0.5755, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 34638.08, pd= -0.5640, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 1.10, pd= 0.9485, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=459109.94, pd= 20.6180, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.92, pd= 1.5165, lock= >937, snr=43.50) RTCM3 (2011-04-10T22:38:40.97) Type 1033: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' Receiver Type='TRIMBLE NETR5', Firmware='', Serial='' RTCM3 (2011-04-10T22:38:40.97) Type 1004: ID= 0, TOW=194210.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 54526.50, pd= -1.3210, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 6.68, pd= -1.7060, lock= >937, snr=25.75) SV= 3, L1 (C/A , r= 23004.62, pd= 1.7695, lock= >937, amb=19786302.228, snr=52.75) L2 (C-P/Y, r= 6.52, pd= 2.5845, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 19845.96, pd= 0.7315, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.00, pd= 1.0710, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 18280.10, pd= -4.1860, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.22, pd= -4.4760, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=132134.98, pd= -1.7495, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.72, pd= -1.8845, lock= >937, snr=30.25) SV= 15, L1 (C/A , r=223364.38, pd= 1.1855, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.50, pd= 0.0165, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=273824.20, pd= 1.5185, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.84, pd= 2.3790, lock= >937, snr=43.75) SV= 8, L1 (C/A , r=265537.00, pd= -0.3015, lock= >937, amb=24882774.014, snr=37.50) L2 (C-P/Y, r= 6.30, pd= 0.1725, lock= >937, snr=19.25) SV= 19, L1 (C/A , r=276913.98, pd= 1.7745, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.56, pd= 2.7250, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=245894.18, pd= -0.2375, lock= 120, amb=24882774.014, snr=28.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=290880.40, pd= 0.3050, lock= >937, amb=20685679.602, snr=50.50) L2 (C-P/Y, r= 3.94, pd= 0.5710, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=114750.28, pd= -4.8570, lock= 70, amb=24582981.556, snr=36.50) L2 (C-P/Y, r= 7.92, pd= -4.7920, lock= 70, snr=21.50) RTCM3 (2011-04-10T22:38:40.97 delay -26274.) Type 1012: ID= 0, Tk= 32195.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=286518.90, pd= -0.2410, lock= >937, amb=22184641.892, snr=41.00) L2 (P , r= 5.84, pd= -0.4990, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 14549.38, pd= -0.9325, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 5.02, pd= -2.1020, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438323.88, pd= -44.0300, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.70, pd= 0.7005, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=117767.66, pd= -2.0190, lock= >937, amb=23383811.724, snr=37.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=205583.26, pd= -4.2265, lock= >937, amb=23383811.724, snr=36.00) L2 (P , r= 6.12, pd= -3.3335, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 59903.40, pd= 1.2655, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.62, pd= 1.1020, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 34352.04, pd= -0.1630, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 0.84, pd= 1.3490, lock= >937, snr=46.00) SV= 23, Freq= 3, L1 (C/A, r=458589.70, pd= 21.2165, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 7.36, pd= 2.1150, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.97) Type 1008: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' RTCM3 (2011-04-10T22:38:40.97) Type 1004: ID= 0, TOW=194211.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 55053.20, pd= -1.4910, lock= >937, amb=23983396.640, snr=41.75) L2 (C-P/Y, r= 6.78, pd= -1.8770, lock= >937, snr=24.75) SV= 3, L1 (C/A , r= 22928.20, pd= 1.8690, lock= >937, amb=19786302.228, snr=52.50) L2 (C-P/Y, r= 6.40, pd= 2.6830, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 20067.92, pd= 0.6230, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.00, pd= 0.9620, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 18807.66, pd= -4.3465, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.94, pd= -4.6370, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=132863.74, pd= -1.1535, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.84, pd= -1.2875, lock= >937, snr=29.75) SV= 15, L1 (C/A , r=223433.10, pd= 1.3875, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.32, pd= 0.2155, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=273865.14, pd= 1.4710, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.62, pd= 2.3320, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=265339.68, pd= -0.2350, lock= >937, amb=24882774.014, snr=37.00) L2 (C-P/Y, r= 6.86, pd= 0.2390, lock= >937, snr=17.75) SV= 19, L1 (C/A , r=276510.68, pd= 1.6065, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.16, pd= 2.5555, lock= >937, snr=41.25) SV= 11, L1 (C/A , r=245260.06, pd= -0.6230, lock= 120, amb=24882774.014, snr=28.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=290712.34, pd= 0.9335, lock= >937, amb=20685679.602, snr=50.00) L2 (C-P/Y, r= 4.16, pd= 1.2010, lock= >937, snr=43.50) SV= 7, L1 (C/A , r=114916.56, pd= -5.5705, lock= 72, amb=24582981.556, snr=36.50) L2 (C-P/Y, r= 7.04, pd= -5.5020, lock= 72, snr=20.75) RTCM3 (2011-04-10T22:38:40.97 delay -26275.) Type 1012: ID= 0, Tk= 32196.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=286860.98, pd= 1.3180, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 7.04, pd= 1.0585, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 15070.06, pd= -2.5500, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 3.46, pd= -3.7200, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=438355.86, pd= -43.6270, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.60, pd= 1.1025, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=117482.26, pd= -2.0525, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=206322.36, pd= -3.0295, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 7.56, pd= -2.1355, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 60445.28, pd= 0.9605, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.84, pd= 0.7965, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 34066.24, pd= 0.1790, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.42, pd= 1.6900, lock= >937, snr=46.00) SV= 23, Freq= 3, L1 (C/A, r=458070.68, pd= 20.6340, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.60, pd= 1.5310, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.97) Type 1006: ID= 0, Year=0, GPS=Y, GLONASS=Y, Galileo=N, X= 4581694.6288, Y= 556114.3725, Z= 4389358.4678 QC=1(no bias), height=0.0349 RTCM3 (2011-04-10T22:38:40.97) Type 1004: ID= 0, TOW=194212.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 55579.82, pd= -1.5685, lock= >937, amb=23983396.640, snr=42.25) L2 (C-P/Y, r= 6.92, pd= -1.9555, lock= >937, snr=26.00) SV= 3, L1 (C/A , r= 22852.12, pd= 1.7265, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.40, pd= 2.5405, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 20289.86, pd= 0.6325, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.96, pd= 0.9715, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 19335.04, pd= -4.2435, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.40, pd= -4.5340, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=133593.46, pd= -1.4830, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.72, pd= -1.6165, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=223502.12, pd= 1.3975, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.32, pd= 0.2255, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=273906.14, pd= 1.4480, lock= >937, amb=20086094.686, snr=49.50) L2 (C-P/Y, r= 7.30, pd= 2.3095, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=265142.32, pd= -0.0120, lock= >937, amb=24882774.014, snr=37.50) L2 (C-P/Y, r= 7.40, pd= 0.4590, lock= >937, snr=18.50) SV= 19, L1 (C/A , r=276107.10, pd= 1.7630, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.24, pd= 2.7130, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=244624.90, pd= 0.0445, lock= 120, amb=24882774.014, snr=27.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=290545.32, pd= 0.6415, lock= >937, amb=20685679.602, snr=49.00) L2 (C-P/Y, r= 4.00, pd= 0.9080, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=115081.92, pd= -5.2525, lock= 72, amb=24582981.556, snr=37.00) L2 (C-P/Y, r= 7.48, pd= -5.1810, lock= 72, snr=19.75) RTCM3 (2011-04-10T22:38:40.97 delay -26276.) Type 1012: ID= 0, Tk= 32197.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=287206.36, pd= -0.2870, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 5.12, pd= -0.5475, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 15588.40, pd= -1.7775, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.40, pd= -2.9480, lock= >937, snr=41.50) SV= 22, Freq= -3, L1 (C/A, r=438388.66, pd= -43.9655, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 4.98, pd= 0.7650, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r=117196.76, pd= -1.8340, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=207061.10, pd= -1.4400, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 8.82, pd= -0.5460, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 60986.60, pd= 1.3370, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.70, pd= 1.1725, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 33781.14, pd= -0.0115, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 1.30, pd= 1.5010, lock= >937, snr=46.00) SV= 23, Freq= 3, L1 (C/A, r=457551.42, pd= 20.3200, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 6.18, pd= 1.2175, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.97) Type 1013: ID= 0, MJD=55621, SOD=21397, Num= 6, Leap=15 ID=1004, Sync=1, Interval= 1.0 ID=1006, Sync=1, Interval= 10.0 ID=1008, Sync=1, Interval= 10.0 ID=1012, Sync=1, Interval= 1.0 ID=1013, Sync=1, Interval= 10.0 ID=1033, Sync=1, Interval= 10.0 RTCM3 (2011-04-10T22:38:40.97) Type 1004: ID= 0, TOW=194213.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 56106.16, pd= -1.3415, lock= >937, amb=23983396.640, snr=42.00) L2 (C-P/Y, r= 6.72, pd= -1.7290, lock= >937, snr=26.75) SV= 3, L1 (C/A , r= 22775.86, pd= 1.8670, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.84, pd= 2.6800, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 20511.72, pd= 0.8315, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.00, pd= 1.1705, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 19862.88, pd= -4.5150, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.16, pd= -4.8060, lock= >937, snr=39.25) SV= 30, L1 (C/A , r=134322.80, pd= -1.3925, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 8.00, pd= -1.5265, lock= >937, snr=28.25) SV= 15, L1 (C/A , r=223571.74, pd= 0.9270, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 6.98, pd= -0.2440, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=273946.92, pd= 1.7280, lock= >937, amb=20086094.686, snr=49.75) L2 (C-P/Y, r= 7.04, pd= 2.5890, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=264944.90, pd= 0.3925, lock= >937, amb=24882774.014, snr=36.75) L2 (C-P/Y, r= 7.44, pd= 0.8605, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=275703.86, pd= 1.6370, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.20, pd= 2.5860, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=243990.42, pd= 0.0560, lock= 124, amb=24882774.014, snr=28.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=290377.86, pd= 0.9140, lock= >937, amb=20685679.602, snr=49.00) L2 (C-P/Y, r= 4.34, pd= 1.1790, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=115247.54, pd= -5.0845, lock= 72, amb=24582981.556, snr=37.25) L2 (C-P/Y, r= 7.54, pd= -5.0130, lock= 72, snr=19.50) RTCM3 (2011-04-10T22:38:40.97 delay -26277.) Type 1012: ID= 0, Tk= 32198.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=287551.00, pd= -1.0050, lock= >937, amb=22184641.892, snr=42.25) L2 (P , r= 4.34, pd= -1.2675, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 16106.96, pd= -1.1625, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.56, pd= -2.3335, lock= >937, snr=41.50) SV= 22, Freq= -3, L1 (C/A, r=438421.64, pd= -44.3975, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 4.86, pd= 0.3320, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r=116912.52, pd= -2.7170, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=207801.88, pd= -1.8760, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 8.08, pd= -0.9815, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 61528.06, pd= 1.7015, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 6.18, pd= 1.5360, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 33496.18, pd= -0.1730, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.70, pd= 1.3400, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=457032.20, pd= 19.9995, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 5.74, pd= 0.8975, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.97) Type 1004: ID= 0, TOW=194214.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 56632.64, pd= -1.2585, lock= >937, amb=23983396.640, snr=41.75) L2 (C-P/Y, r= 6.84, pd= -1.6515, lock= >937, snr=25.50) SV= 3, L1 (C/A , r= 22699.78, pd= 1.9075, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.56, pd= 2.7215, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 20733.90, pd= 0.7995, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.28, pd= 1.1390, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 20390.38, pd= -4.3825, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.32, pd= -4.6735, lock= >937, snr=39.75) SV= 30, L1 (C/A , r=135052.50, pd= -1.6440, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.56, pd= -1.7790, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=223640.40, pd= 1.5140, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.70, pd= 0.3435, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=273988.30, pd= 1.4725, lock= >937, amb=20086094.686, snr=50.00) L2 (C-P/Y, r= 6.92, pd= 2.3335, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=264747.32, pd= 1.0615, lock= >937, amb=24882774.014, snr=36.50) L2 (C-P/Y, r= 8.22, pd= 1.5300, lock= >937, snr=18.50) SV= 19, L1 (C/A , r=275300.44, pd= 1.7240, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.40, pd= 2.6740, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=243356.56, pd= -0.5625, lock= 124, amb=24882774.014, snr=28.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=290210.98, pd= 0.7015, lock= >937, amb=20685679.602, snr=49.75) L2 (C-P/Y, r= 4.46, pd= 0.9680, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=115413.84, pd= -5.5045, lock= 72, amb=24582981.556, snr=36.25) L2 (C-P/Y, r= 6.56, pd= -5.4295, lock= 72, snr=17.75) RTCM3 (2011-04-10T22:38:40.97 delay -26278.) Type 1012: ID= 0, Tk= 32199.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=287893.60, pd= 0.4410, lock= >937, amb=22184641.892, snr=41.75) L2 (P , r= 5.96, pd= 0.1800, lock= >937, snr=42.25) SV= 21, Freq= 4, L1 (C/A, r= 16626.86, pd= -1.8550, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 3.76, pd= -3.0270, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438454.68, pd= -44.8235, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 4.78, pd= -0.0935, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=116627.92, pd= -3.1175, lock= >937, amb=23383811.724, snr=37.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=208543.18, pd= -2.8105, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 7.32, pd= -1.9170, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 62070.54, pd= 1.1540, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.42, pd= 0.9885, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 33211.56, pd= -0.5360, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 1.02, pd= 0.9760, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=456512.72, pd= 19.9490, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 5.82, pd= 0.8465, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.97) Type 1004: ID= 0, TOW=194215.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 57159.56, pd= -1.6120, lock= >937, amb=23983396.640, snr=41.75) L2 (C-P/Y, r= 6.66, pd= -2.0045, lock= >937, snr=25.25) SV= 3, L1 (C/A , r= 22624.06, pd= 1.6770, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.52, pd= 2.4905, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 20956.02, pd= 0.9155, lock= >937, amb=21884849.434, snr=47.50) L2 (C-P/Y, r= 6.18, pd= 1.2540, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 20917.98, pd= -4.2835, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.18, pd= -4.5740, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=135782.04, pd= -1.7165, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.90, pd= -1.8535, lock= >937, snr=29.75) SV= 15, L1 (C/A , r=223710.10, pd= 1.1580, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.54, pd= -0.0085, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=274029.40, pd= 1.5660, lock= >937, amb=20086094.686, snr=50.25) L2 (C-P/Y, r= 6.98, pd= 2.4275, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=264551.30, pd= 0.2695, lock= >937, amb=24882774.014, snr=36.25) L2 (C-P/Y, r= 7.46, pd= 0.7365, lock= >937, snr=17.75) SV= 19, L1 (C/A , r=274897.16, pd= 1.7035, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.26, pd= 2.6530, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=242721.92, pd= -0.3990, lock= 124, amb=24882774.014, snr=29.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=290043.98, pd= 0.7140, lock= >937, amb=20685679.602, snr=49.75) L2 (C-P/Y, r= 4.08, pd= 0.9795, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=115580.08, pd= -5.7680, lock= 76, amb=24582981.556, snr=36.50) L2 (C-P/Y, r= 6.44, pd= -5.6935, lock= 76, snr=17.75) RTCM3 (2011-04-10T22:38:40.97 delay -26279.) Type 1012: ID= 0, Tk= 32200.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=288237.38, pd= 0.8360, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 6.46, pd= 0.5760, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 17145.98, pd= -1.7245, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.36, pd= -2.8985, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=438486.74, pd= -44.2025, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.42, pd= 0.5275, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=116342.54, pd= -2.5890, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=209282.96, pd= -2.2130, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 8.04, pd= -1.3175, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 62611.80, pd= 1.9360, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 6.36, pd= 1.7705, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 32926.20, pd= -0.0190, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 1.40, pd= 1.4925, lock= >937, snr=46.00) SV= 23, Freq= 3, L1 (C/A, r=455992.06, pd= 21.0985, lock= >937, amb=20985472.060, snr=42.25) L2 (P , r= 6.80, pd= 1.9965, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.97) Type 1004: ID= 0, TOW=194216.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 57685.80, pd= -1.2615, lock= >937, amb=23983396.640, snr=42.00) L2 (C-P/Y, r= 6.88, pd= -1.6525, lock= >937, snr=25.00) SV= 3, L1 (C/A , r= 22548.14, pd= 1.7565, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.60, pd= 2.5695, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 21178.42, pd= 0.8765, lock= >937, amb=21884849.434, snr=48.00) L2 (C-P/Y, r= 6.12, pd= 1.2155, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 21445.76, pd= -4.2645, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.20, pd= -4.5555, lock= >937, snr=39.25) SV= 30, L1 (C/A , r=136511.00, pd= -1.1585, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.98, pd= -1.2955, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=223778.84, pd= 1.8970, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 8.36, pd= 0.7290, lock= >937, snr=22.00) SV= 6, L1 (C/A , r=274070.76, pd= 1.4950, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.90, pd= 2.3555, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=264355.16, pd= -0.2585, lock= >937, amb=24882774.014, snr=36.50) L2 (C-P/Y, r= 6.98, pd= 0.2115, lock= >937, snr=18.50) SV= 19, L1 (C/A , r=274494.16, pd= 1.4715, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.16, pd= 2.4205, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=242086.44, pd= 0.6315, lock= 124, amb=24882774.014, snr=29.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=289877.14, pd= 0.6975, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 3.82, pd= 0.9630, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=115744.86, pd= -4.4470, lock= 76, amb=24582981.556, snr=37.00) L2 (C-P/Y, r= 7.06, pd= -4.3585, lock= 76, snr=17.75) RTCM3 (2011-04-10T22:38:40.97 delay -26280.) Type 1012: ID= 0, Tk= 32201.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=288580.48, pd= 2.0640, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 7.50, pd= 1.8050, lock= >937, snr=42.25) SV= 21, Freq= 4, L1 (C/A, r= 17665.16, pd= -1.5915, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.22, pd= -2.7650, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=438519.64, pd= -44.3250, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.14, pd= 0.4050, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=116056.98, pd= -1.7275, lock= >937, amb=23383811.724, snr=36.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=210024.12, pd= -2.9590, lock= >937, amb=23383811.724, snr=34.50) L2 (P , r= 6.88, pd= -2.0645, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 63154.06, pd= 1.8605, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 6.04, pd= 1.6955, lock= >937, snr=45.25) SV= 7, Freq= 5, L1 (C/A, r= 32641.40, pd= 0.1075, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.16, pd= 1.6195, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=455473.22, pd= 20.4665, lock= >937, amb=20985472.060, snr=42.50) L2 (P , r= 6.22, pd= 1.3640, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194217.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 58213.02, pd= -1.8770, lock= >937, amb=23983396.640, snr=42.00) L2 (C-P/Y, r= 6.40, pd= -2.2675, lock= >937, snr=25.75) SV= 3, L1 (C/A , r= 22472.26, pd= 1.8855, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.90, pd= 2.6990, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 21400.94, pd= 0.8105, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 6.26, pd= 1.1485, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 21973.60, pd= -4.2400, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.20, pd= -4.5310, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=137241.00, pd= -1.6180, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.66, pd= -1.7545, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=223849.30, pd= 1.0075, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.48, pd= -0.1635, lock= >937, snr=22.00) SV= 6, L1 (C/A , r=274112.18, pd= 1.4365, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.70, pd= 2.2970, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=264158.54, pd= -0.2025, lock= >937, amb=24882774.014, snr=37.00) L2 (C-P/Y, r= 7.04, pd= 0.2690, lock= >937, snr=18.50) SV= 19, L1 (C/A , r=274090.88, pd= 1.5570, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.38, pd= 2.5060, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=241452.94, pd= -0.3125, lock= 128, amb=24882774.014, snr=30.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=289710.40, pd= 0.6875, lock= >937, amb=20685679.602, snr=50.50) L2 (C-P/Y, r= 4.14, pd= 0.9530, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=115911.68, pd= -5.0770, lock= 76, amb=24582981.556, snr=37.25) L2 (C-P/Y, r= 5.92, pd= -4.9895, lock= 76, snr=17.75) RTCM3 (2011-04-10T22:38:40.98 delay -26281.) Type 1012: ID= 0, Tk= 32202.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=288926.02, pd= 0.9855, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 6.08, pd= 0.7255, lock= >937, snr=42.25) SV= 21, Freq= 4, L1 (C/A, r= 18184.74, pd= -1.8125, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 3.90, pd= -2.9870, lock= >937, snr=41.75) SV= 22, Freq= -3, L1 (C/A, r=438552.32, pd= -44.1615, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.20, pd= 0.5680, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=115772.04, pd= -1.3460, lock= >937, amb=23383811.724, snr=37.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=210764.24, pd= -2.6520, lock= >937, amb=23383811.724, snr=34.00) L2 (P , r= 8.00, pd= -1.7575, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 63697.00, pd= 1.2120, lock= >937, amb=21585056.976, snr=45.50) L2 (P , r= 5.14, pd= 1.0450, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 32356.70, pd= 0.2815, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 2.00, pd= 1.7935, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=454953.86, pd= 20.3805, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 5.84, pd= 1.2780, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194218.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 58738.78, pd= -0.9985, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 7.16, pd= -1.3875, lock= >937, snr=25.00) SV= 3, L1 (C/A , r= 22396.72, pd= 1.7950, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.60, pd= 2.6085, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 21623.70, pd= 0.6325, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.08, pd= 0.9715, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 22501.56, pd= -4.2275, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.14, pd= -4.5190, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=137970.72, pd= -1.7395, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.14, pd= -1.8760, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=223918.28, pd= 1.7455, lock= >937, amb=24882774.014, snr=41.25) L2 (C-P/Y, r= 7.80, pd= 0.5730, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=274153.78, pd= 1.2990, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.66, pd= 2.1605, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=263962.30, pd= -0.3915, lock= >937, amb=24882774.014, snr=37.25) L2 (C-P/Y, r= 6.78, pd= 0.0860, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=273687.48, pd= 1.8330, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.34, pd= 2.7830, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=240817.94, pd= 0.2855, lock= 128, amb=24882774.014, snr=31.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=289543.74, pd= 0.7375, lock= >937, amb=20685679.602, snr=50.25) L2 (C-P/Y, r= 4.26, pd= 1.0045, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=116078.36, pd= -5.4365, lock= 76, amb=24582981.556, snr=37.75) L2 (C-P/Y, r= 5.78, pd= -5.3380, lock= 76, snr=17.75) RTCM3 (2011-04-10T22:38:40.98 delay -26282.) Type 1012: ID= 0, Tk= 32203.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=289271.18, pd= 0.4430, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 5.26, pd= 0.1805, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 18703.64, pd= -1.2895, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.74, pd= -2.4635, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=438585.92, pd= -44.8160, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.14, pd= -0.0875, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=115487.30, pd= -0.9935, lock= >937, amb=23383811.724, snr=37.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=211503.58, pd= -1.5065, lock= >937, amb=23383811.724, snr=34.50) L2 (P , r= 8.18, pd= -0.6115, lock= >937, snr=39.25) SV= 6, Freq= -4, L1 (C/A, r= 64239.86, pd= 0.8000, lock= >937, amb=21585056.976, snr=45.50) L2 (P , r= 4.70, pd= 0.6330, lock= >937, snr=45.25) SV= 7, Freq= 5, L1 (C/A, r= 32072.96, pd= -0.3115, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.28, pd= 1.2005, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=454435.26, pd= 19.5860, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 5.08, pd= 0.4840, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194219.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 59265.34, pd= -0.9300, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 7.64, pd= -1.3195, lock= >937, snr=25.50) SV= 3, L1 (C/A , r= 22321.06, pd= 1.8970, lock= >937, amb=19786302.228, snr=53.75) L2 (C-P/Y, r= 6.78, pd= 2.7105, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 21846.38, pd= 0.6130, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 5.88, pd= 0.9515, lock= >937, snr=39.25) SV= 16, L1 (C/A , r= 23029.70, pd= -4.3415, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.24, pd= -4.6340, lock= >937, snr=39.25) SV= 30, L1 (C/A , r=138699.86, pd= -1.2730, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.98, pd= -1.4095, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=223988.70, pd= 1.1245, lock= >937, amb=24882774.014, snr=41.25) L2 (C-P/Y, r= 7.58, pd= -0.0480, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=274195.06, pd= 1.5385, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 7.00, pd= 2.3990, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=263765.22, pd= 0.3585, lock= >937, amb=24882774.014, snr=37.25) L2 (C-P/Y, r= 7.46, pd= 0.8375, lock= >937, snr=17.75) SV= 19, L1 (C/A , r=273284.22, pd= 1.9965, lock= >937, amb=21285264.518, snr=49.00) L2 (C-P/Y, r= 4.58, pd= 2.9460, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=240183.76, pd= 0.0525, lock= 128, amb=24882774.014, snr=30.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=289377.30, pd= 0.6565, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 4.08, pd= 0.9220, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=116245.02, pd= -5.6985, lock= 80, amb=24582981.556, snr=36.50) L2 (C-P/Y, r= 5.06, pd= -5.5940, lock= 80, snr=17.25) RTCM3 (2011-04-10T22:38:40.98 delay -26283.) Type 1012: ID= 0, Tk= 32204.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=289616.18, pd= 0.1750, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 5.28, pd= -0.0895, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 19223.72, pd= -1.9115, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.08, pd= -3.0865, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438618.54, pd= -44.4330, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.16, pd= 0.2950, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=115203.18, pd= -1.1255, lock= >937, amb=23383811.724, snr=37.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=212244.50, pd= -1.9515, lock= >937, amb=23383811.724, snr=34.00) L2 (P , r= 8.46, pd= -1.0575, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 64781.82, pd= 1.3865, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.40, pd= 1.2205, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 31789.20, pd= -0.7460, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.20, pd= 0.7665, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=453915.80, pd= 19.6595, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 5.48, pd= 0.5580, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:40.98) Type 1033: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' Receiver Type='TRIMBLE NETR5', Firmware='', Serial='' RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194220.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 59792.34, pd= -1.2750, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 6.82, pd= -1.6690, lock= >937, snr=25.00) SV= 3, L1 (C/A , r= 22245.48, pd= 2.0260, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.94, pd= 2.8400, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 22069.18, pd= 0.5850, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.90, pd= 0.9220, lock= >937, snr=39.00) SV= 16, L1 (C/A , r= 23557.76, pd= -4.2865, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.16, pd= -4.5785, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=139429.64, pd= -1.4120, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.36, pd= -1.5480, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=224058.44, pd= 1.3025, lock= >937, amb=24882774.014, snr=41.00) L2 (C-P/Y, r= 7.84, pd= 0.1295, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=274236.70, pd= 1.5075, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.94, pd= 2.3675, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=263569.00, pd= 0.3785, lock= >937, amb=24882774.014, snr=37.00) L2 (C-P/Y, r= 7.30, pd= 0.8515, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=272881.22, pd= 1.9555, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.74, pd= 2.9055, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=239550.12, pd= -0.7000, lock= 128, amb=24882774.014, snr=30.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=289210.98, pd= 0.5845, lock= >937, amb=20685679.602, snr=51.25) L2 (C-P/Y, r= 3.98, pd= 0.8500, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=116410.84, pd= -4.9935, lock= 80, amb=24582981.556, snr=36.00) L2 (C-P/Y, r= 6.18, pd= -4.8870, lock= 80, snr=17.75) RTCM3 (2011-04-10T22:38:40.98 delay -26284.) Type 1012: ID= 0, Tk= 32205.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=289961.48, pd= -0.2455, lock= >937, amb=22184641.892, snr=42.50) L2 (P , r= 4.56, pd= -0.5110, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 19743.44, pd= -2.1175, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.74, pd= -3.2925, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438651.86, pd= -44.6665, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.48, pd= 0.0635, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=114919.76, pd= -1.8020, lock= >937, amb=23383811.724, snr=37.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=212983.86, pd= -0.7960, lock= >937, amb=23383811.724, snr=34.25) L2 (P , r= 9.62, pd= 0.0970, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 65323.84, pd= 2.0405, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 6.08, pd= 1.8745, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 31504.10, pd= 0.3300, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.68, pd= 1.8425, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=453395.52, pd= 20.5905, lock= >937, amb=20985472.060, snr=43.75) L2 (P , r= 6.56, pd= 1.4885, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.98) Type 1008: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194221.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 60319.18, pd= -1.4790, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 7.02, pd= -1.8755, lock= >937, snr=25.25) SV= 3, L1 (C/A , r= 22170.18, pd= 1.9480, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 7.06, pd= 2.7615, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 22291.82, pd= 0.7995, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.62, pd= 1.1370, lock= >937, snr=39.00) SV= 16, L1 (C/A , r= 24086.02, pd= -4.3720, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.14, pd= -4.6650, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=140159.56, pd= -1.6755, lock= >937, amb=23084019.266, snr=42.25) L2 (C-P/Y, r= 7.44, pd= -1.8115, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=224128.16, pd= 1.5900, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.90, pd= 0.4185, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=274278.66, pd= 1.2070, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.48, pd= 2.0675, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=263373.00, pd= 0.2605, lock= >937, amb=24882774.014, snr=37.50) L2 (C-P/Y, r= 7.50, pd= 0.7290, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=272478.18, pd= 1.9755, lock= >937, amb=21285264.518, snr=49.00) L2 (C-P/Y, r= 4.52, pd= 2.9235, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=238915.98, pd= -0.9735, lock= 132, amb=24882774.014, snr=30.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=289044.74, pd= 0.5225, lock= >937, amb=20685679.602, snr=51.75) L2 (C-P/Y, r= 3.90, pd= 0.7890, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=116577.66, pd= -5.2105, lock= 80, amb=24582981.556, snr=35.50) L2 (C-P/Y, r= 5.76, pd= -5.1040, lock= 80, snr=18.25) RTCM3 (2011-04-10T22:38:40.98 delay -26285.) Type 1012: ID= 0, Tk= 32206.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=290305.66, pd= 0.5655, lock= >937, amb=22184641.892, snr=41.75) L2 (P , r= 5.72, pd= 0.3025, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 20262.76, pd= -1.8965, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 3.72, pd= -3.0730, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438684.88, pd= -44.5430, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.44, pd= 0.1860, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=114635.08, pd= -1.0935, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=213726.02, pd= -2.4505, lock= >937, amb=23383811.724, snr=34.25) L2 (P , r= 7.86, pd= -1.5580, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 65866.94, pd= 1.7155, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 6.46, pd= 1.5490, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 31220.82, pd= -0.2715, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.10, pd= 1.2415, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=452876.62, pd= 20.1495, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 6.36, pd= 1.0470, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.98) Type 1006: ID= 0, Year=0, GPS=Y, GLONASS=Y, Galileo=N, X= 4581694.6288, Y= 556114.3725, Z= 4389358.4678 QC=1(no bias), height=0.0349 RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194222.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 60845.98, pd= -1.6060, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 7.02, pd= -2.0045, lock= >937, snr=26.50) SV= 3, L1 (C/A , r= 22095.18, pd= 1.6795, lock= >937, amb=19786302.228, snr=52.75) L2 (C-P/Y, r= 6.36, pd= 2.4935, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 22514.96, pd= 0.6300, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.92, pd= 0.9675, lock= >937, snr=39.00) SV= 16, L1 (C/A , r= 24614.30, pd= -4.3865, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.82, pd= -4.6795, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=140889.54, pd= -1.9530, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.22, pd= -2.0890, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=224198.70, pd= 1.1920, lock= >937, amb=24882774.014, snr=41.00) L2 (C-P/Y, r= 7.40, pd= 0.0195, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=274320.34, pd= 1.2860, lock= >937, amb=20086094.686, snr=51.25) L2 (C-P/Y, r= 6.62, pd= 2.1460, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=263177.92, pd= -0.6430, lock= >937, amb=24882774.014, snr=37.75) L2 (C-P/Y, r= 7.16, pd= -0.1740, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=272075.44, pd= 1.7620, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.54, pd= 2.7120, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=238281.06, pd= -0.4450, lock= 132, amb=24882774.014, snr=30.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=288878.38, pd= 0.7115, lock= >937, amb=20685679.602, snr=51.25) L2 (C-P/Y, r= 4.00, pd= 0.9775, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=116744.72, pd= -5.5505, lock= 80, amb=24582981.556, snr=36.00) L2 (C-P/Y, r= 5.20, pd= -5.4490, lock= 80, snr=19.25) RTCM3 (2011-04-10T22:38:40.98 delay -26286.) Type 1012: ID= 0, Tk= 32207.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=290651.00, pd= 0.3735, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 5.54, pd= 0.1130, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 20782.40, pd= -1.9290, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.74, pd= -3.1055, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438717.74, pd= -44.1685, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.68, pd= 0.5605, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=114352.64, pd= -2.4585, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=214467.24, pd= -3.1215, lock= >937, amb=23383811.724, snr=34.50) L2 (P , r= 7.02, pd= -2.2290, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 66409.88, pd= 1.6835, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.76, pd= 1.5155, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 30937.38, pd= -0.5440, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 0.72, pd= 0.9690, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=452357.72, pd= 19.7470, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 5.92, pd= 0.6440, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.98) Type 1013: ID= 0, MJD=55621, SOD=21407, Num= 6, Leap=15 ID=1004, Sync=1, Interval= 1.0 ID=1006, Sync=1, Interval= 10.0 ID=1008, Sync=1, Interval= 10.0 ID=1012, Sync=1, Interval= 1.0 ID=1013, Sync=1, Interval= 10.0 ID=1033, Sync=1, Interval= 10.0 RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194223.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 61373.16, pd= -2.0940, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 6.74, pd= -2.4925, lock= >937, snr=25.00) SV= 3, L1 (C/A , r= 22019.70, pd= 1.9990, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.70, pd= 2.8125, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 22737.80, pd= 0.8725, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.88, pd= 1.2105, lock= >937, snr=39.00) SV= 16, L1 (C/A , r= 25142.68, pd= -4.4125, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.84, pd= -4.7050, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=141619.06, pd= -1.7310, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.04, pd= -1.8665, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=224269.26, pd= 0.8905, lock= >937, amb=24882774.014, snr=40.25) L2 (C-P/Y, r= 7.22, pd= -0.2830, lock= >937, snr=23.25) SV= 6, L1 (C/A , r=274361.86, pd= 1.6135, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.98, pd= 2.4735, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=262981.24, pd= 0.1765, lock= >937, amb=24882774.014, snr=37.50) L2 (C-P/Y, r= 7.38, pd= 0.6460, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=271672.28, pd= 2.0255, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.78, pd= 2.9755, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=237647.30, pd= -1.0410, lock= 132, amb=24882774.014, snr=30.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=288712.42, pd= 0.6255, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.04, pd= 0.8920, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=116910.96, pd= -4.9580, lock= 84, amb=24582981.556, snr=36.25) L2 (C-P/Y, r= 5.68, pd= -4.8585, lock= 84, snr=18.50) RTCM3 (2011-04-10T22:38:40.98 delay -26287.) Type 1012: ID= 0, Tk= 32208.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=290995.82, pd= 0.8580, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 6.26, pd= 0.5995, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 21301.74, pd= -1.6060, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 5.04, pd= -2.7830, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438751.12, pd= -44.2240, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.54, pd= 0.5050, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r=114069.42, pd= -2.8895, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=215207.36, pd= -2.6425, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 8.00, pd= -1.7520, lock= >937, snr=39.25) SV= 6, Freq= -4, L1 (C/A, r= 66953.46, pd= 1.1450, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.28, pd= 0.9765, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 30653.92, pd= -0.6185, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.20, pd= 0.8940, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=451837.62, pd= 20.5790, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 6.86, pd= 1.4760, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194224.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 61899.52, pd= -1.7445, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 6.60, pd= -2.1430, lock= >937, snr=25.75) SV= 3, L1 (C/A , r= 21944.94, pd= 1.6975, lock= >937, amb=19786302.228, snr=52.75) L2 (C-P/Y, r= 6.40, pd= 2.5095, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 22960.98, pd= 0.8825, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.94, pd= 1.2200, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 25671.34, pd= -4.6390, lock= >937, amb=21884849.434, snr=50.00) L2 (C-P/Y, r= 5.78, pd= -4.9305, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=142348.54, pd= -1.4320, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 8.02, pd= -1.5700, lock= >937, snr=29.75) SV= 15, L1 (C/A , r=224339.40, pd= 1.1175, lock= >937, amb=24882774.014, snr=40.50) L2 (C-P/Y, r= 7.52, pd= -0.0545, lock= >937, snr=23.00) SV= 6, L1 (C/A , r=274404.12, pd= 1.2785, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.44, pd= 2.1375, lock= >937, snr=45.00) SV= 8, L1 (C/A , r=262785.66, pd= 0.0190, lock= >937, amb=24882774.014, snr=37.50) L2 (C-P/Y, r= 7.28, pd= 0.4945, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=271269.66, pd= 1.7950, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.26, pd= 2.7440, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=237013.74, pd= -1.8145, lock= 132, amb=24882774.014, snr=31.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=288546.48, pd= 0.6345, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 3.90, pd= 0.9005, lock= >937, snr=43.50) SV= 7, L1 (C/A , r=117077.04, pd= -4.0915, lock= 84, amb=24582981.556, snr=36.75) L2 (C-P/Y, r= 6.62, pd= -3.9915, lock= 84, snr=20.00) RTCM3 (2011-04-10T22:38:40.98 delay -26288.) Type 1012: ID= 0, Tk= 32209.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=291341.82, pd= 0.3020, lock= >937, amb=22184641.892, snr=41.00) L2 (P , r= 5.70, pd= 0.0420, lock= >937, snr=41.00) SV= 21, Freq= 4, L1 (C/A, r= 21821.46, pd= -1.6130, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.54, pd= -2.7915, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438784.58, pd= -44.2785, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.24, pd= 0.4500, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r=113785.68, pd= -2.6500, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=215947.46, pd= -2.1330, lock= >937, amb=23383811.724, snr=34.25) L2 (P , r= 8.36, pd= -1.2420, lock= >937, snr=39.25) SV= 6, Freq= -4, L1 (C/A, r= 67496.78, pd= 0.9895, lock= >937, amb=21585056.976, snr=45.50) L2 (P , r= 4.90, pd= 0.8220, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 30369.74, pd= 0.1840, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.50, pd= 1.6970, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=451318.06, pd= 20.8965, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 7.12, pd= 1.7935, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194225.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 62425.88, pd= -1.3975, lock= >937, amb=23983396.640, snr=41.75) L2 (C-P/Y, r= 7.08, pd= -1.7985, lock= >937, snr=25.50) SV= 3, L1 (C/A , r= 21869.64, pd= 2.0205, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.66, pd= 2.8325, lock= >937, snr=45.00) SV= 18, L1 (C/A , r= 23184.26, pd= 0.8805, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.02, pd= 1.2180, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 26199.58, pd= -4.3745, lock= >937, amb=21884849.434, snr=50.00) L2 (C-P/Y, r= 6.20, pd= -4.6670, lock= >937, snr=38.50) SV= 30, L1 (C/A , r=143078.58, pd= -1.6815, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.36, pd= -1.8195, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=224409.60, pd= 1.3890, lock= >937, amb=24882774.014, snr=40.00) L2 (C-P/Y, r= 7.54, pd= 0.2155, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=274445.98, pd= 1.4115, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.92, pd= 2.2710, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=262589.50, pd= 0.5475, lock= >937, amb=24882774.014, snr=37.25) L2 (C-P/Y, r= 7.94, pd= 1.0265, lock= >937, snr=18.50) SV= 19, L1 (C/A , r=270866.90, pd= 1.7430, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.78, pd= 2.6920, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=236379.60, pd= -2.0380, lock= 136, amb=24882774.014, snr=31.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=288380.64, pd= 0.6505, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 4.04, pd= 0.9170, lock= >937, snr=43.50) SV= 7, L1 (C/A , r=117245.16, pd= -5.1905, lock= 84, amb=24582981.556, snr=35.75) L2 (C-P/Y, r= 5.90, pd= -5.0910, lock= 84, snr=20.50) RTCM3 (2011-04-10T22:38:40.98 delay -26289.) Type 1012: ID= 0, Tk= 32210.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=291687.20, pd= 0.4800, lock= >937, amb=22184641.892, snr=41.00) L2 (P , r= 5.36, pd= 0.2185, lock= >937, snr=41.00) SV= 21, Freq= 4, L1 (C/A, r= 22340.10, pd= -0.5030, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 5.62, pd= -1.6820, lock= >937, snr=41.50) SV= 22, Freq= -3, L1 (C/A, r=438817.98, pd= -44.2055, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.62, pd= 0.5235, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r=113503.12, pd= -3.4560, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=216687.22, pd= -1.2885, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 8.84, pd= -0.3975, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 68040.22, pd= 0.8205, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.40, pd= 0.6515, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 30086.34, pd= 0.3545, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.58, pd= 1.8665, lock= >937, snr=46.00) SV= 23, Freq= 3, L1 (C/A, r=450800.14, pd= 19.5965, lock= >937, amb=20985472.060, snr=43.75) L2 (P , r= 5.38, pd= 0.4935, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194226.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 62952.48, pd= -1.2530, lock= >937, amb=23983396.640, snr=41.50) L2 (C-P/Y, r= 7.20, pd= -1.6545, lock= >937, snr=25.50) SV= 3, L1 (C/A , r= 21794.88, pd= 1.9205, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.80, pd= 2.7330, lock= >937, snr=45.00) SV= 18, L1 (C/A , r= 23407.78, pd= 0.7615, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.76, pd= 1.0985, lock= >937, snr=39.00) SV= 16, L1 (C/A , r= 26728.22, pd= -4.4130, lock= >937, amb=21884849.434, snr=50.00) L2 (C-P/Y, r= 5.86, pd= -4.7060, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=143808.20, pd= -1.4525, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.88, pd= -1.5895, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=224480.80, pd= 0.7875, lock= >937, amb=24882774.014, snr=39.75) L2 (C-P/Y, r= 7.10, pd= -0.3840, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=274487.98, pd= 1.5025, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.80, pd= 2.3620, lock= >937, snr=45.00) SV= 8, L1 (C/A , r=262394.62, pd= -0.0730, lock= >937, amb=24882774.014, snr=38.00) L2 (C-P/Y, r= 7.22, pd= 0.4045, lock= >937, snr=19.00) SV= 19, L1 (C/A , r=270464.20, pd= 1.6980, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 3.86, pd= 2.6475, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=235743.48, pd= -0.2280, lock= 136, amb=24882774.014, snr=31.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=288214.84, pd= 0.7555, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.34, pd= 1.0215, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=117411.90, pd= -4.7600, lock= 84, amb=24582981.556, snr=35.50) L2 (C-P/Y, r= 6.34, pd= -4.6600, lock= 84, snr=20.75) RTCM3 (2011-04-10T22:38:40.98 delay -26290.) Type 1012: ID= 0, Tk= 32211.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=292033.38, pd= 0.0240, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 4.72, pd= -0.2385, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 22860.46, pd= -1.0400, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.66, pd= -2.2190, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=438851.64, pd= -44.2960, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.56, pd= 0.4330, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=113221.10, pd= -4.6410, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=217427.60, pd= -1.0040, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 9.26, pd= -0.1110, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 68583.34, pd= 1.1165, lock= >937, amb=21585056.976, snr=45.50) L2 (P , r= 5.10, pd= 0.9485, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 29803.82, pd= -0.1700, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 0.76, pd= 1.3435, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=450280.52, pd= 20.0420, lock= >937, amb=20985472.060, snr=43.75) L2 (P , r= 6.02, pd= 0.9410, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.98) Type 1004: ID= 0, TOW=194227.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 63480.10, pd= -2.1250, lock= >937, amb=23983396.640, snr=41.50) L2 (C-P/Y, r= 6.64, pd= -2.5275, lock= >937, snr=26.25) SV= 3, L1 (C/A , r= 21720.32, pd= 1.7125, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.74, pd= 2.5250, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 23631.16, pd= 0.8820, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 5.96, pd= 1.2185, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 27257.18, pd= -4.6965, lock= >937, amb=21884849.434, snr=50.00) L2 (C-P/Y, r= 6.10, pd= -4.9905, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=144538.76, pd= -2.1330, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.04, pd= -2.2700, lock= >937, snr=30.00) SV= 15, L1 (C/A , r=224550.94, pd= 1.3575, lock= >937, amb=24882774.014, snr=40.25) L2 (C-P/Y, r= 7.98, pd= 0.1855, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=274530.18, pd= 1.4655, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.64, pd= 2.3245, lock= >937, snr=45.00) SV= 8, L1 (C/A , r=262199.50, pd= -0.3360, lock= >937, amb=24882774.014, snr=37.50) L2 (C-P/Y, r= 7.12, pd= 0.1375, lock= >937, snr=18.50) SV= 19, L1 (C/A , r=270061.44, pd= 1.7530, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.30, pd= 2.7020, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=235109.26, pd= -0.3115, lock= 136, amb=24882774.014, snr=32.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=288049.32, pd= 0.6975, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 3.84, pd= 0.9635, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=117579.44, pd= -5.0320, lock= 88, amb=24582981.556, snr=34.50) L2 (C-P/Y, r= 6.28, pd= -4.9335, lock= 88, snr=21.50) RTCM3 (2011-04-10T22:38:40.98 delay -26291.) Type 1012: ID= 0, Tk= 32212.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=292379.70, pd= -0.4355, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 4.64, pd= -0.6990, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 23380.64, pd= -1.3520, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.76, pd= -2.5330, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438885.18, pd= -44.1865, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.26, pd= 0.5420, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=112937.48, pd= -4.0755, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=218170.50, pd= -3.2100, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 6.72, pd= -2.3170, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 69126.76, pd= 1.2245, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.52, pd= 1.0550, lock= >937, snr=45.25) SV= 7, Freq= 5, L1 (C/A, r= 29520.34, pd= 0.4160, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 1.76, pd= 1.9290, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=449761.60, pd= 19.8090, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 5.70, pd= 0.7070, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194228.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 64006.42, pd= -1.6775, lock= >937, amb=23983396.640, snr=42.00) L2 (C-P/Y, r= 6.62, pd= -2.0800, lock= >937, snr=24.25) SV= 3, L1 (C/A , r= 21645.72, pd= 1.6395, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.58, pd= 2.4520, lock= >937, snr=45.00) SV= 18, L1 (C/A , r= 23854.88, pd= 0.7590, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.88, pd= 1.0965, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 27785.94, pd= -4.7025, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.04, pd= -4.9965, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=145268.58, pd= -2.0460, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.20, pd= -2.1850, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=224622.34, pd= 0.7725, lock= >937, amb=24882774.014, snr=40.50) L2 (C-P/Y, r= 7.12, pd= -0.4000, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=274572.34, pd= 1.5495, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.68, pd= 2.4090, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=262004.02, pd= -0.1260, lock= >937, amb=24882774.014, snr=38.25) L2 (C-P/Y, r= 7.38, pd= 0.3480, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=269658.82, pd= 1.7220, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.20, pd= 2.6710, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=234475.24, pd= -0.5820, lock= 136, amb=24882774.014, snr=32.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=287884.12, pd= 0.4310, lock= >937, amb=20685679.602, snr=50.50) L2 (C-P/Y, r= 3.80, pd= 0.6965, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=117745.82, pd= -4.0495, lock= 88, amb=24582981.556, snr=33.75) L2 (C-P/Y, r= 7.42, pd= -3.9505, lock= 88, snr=20.75) RTCM3 (2011-04-10T22:38:40.99 delay -26292.) Type 1012: ID= 0, Tk= 32213.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=292723.92, pd= 1.3335, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.30, pd= 1.0715, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 23900.52, pd= -1.3160, lock= >937, amb=22184641.892, snr=39.75) L2 (P , r= 4.64, pd= -2.4970, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438919.00, pd= -44.2900, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.36, pd= 0.4380, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=112654.46, pd= -3.9710, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=218911.52, pd= -3.5340, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 6.56, pd= -2.6420, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 69670.44, pd= 1.1955, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.54, pd= 1.0260, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 29237.96, pd= 0.0560, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 1.30, pd= 1.5690, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=449241.74, pd= 20.5490, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.84, pd= 1.4485, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194229.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 64532.42, pd= -0.9015, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 7.58, pd= -1.3060, lock= >937, snr=26.75) SV= 3, L1 (C/A , r= 21570.90, pd= 1.8860, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.72, pd= 2.6975, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 24078.60, pd= 0.7465, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 6.28, pd= 1.0830, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 28314.58, pd= -4.5065, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.20, pd= -4.8005, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=145998.58, pd= -2.1065, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.10, pd= -2.2465, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=224692.88, pd= 1.1675, lock= >937, amb=24882774.014, snr=41.00) L2 (C-P/Y, r= 7.34, pd= -0.0040, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=274614.70, pd= 1.5135, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.76, pd= 2.3725, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=261808.54, pd= 0.2010, lock= >937, amb=24882774.014, snr=38.50) L2 (C-P/Y, r= 7.62, pd= 0.6750, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=269256.18, pd= 1.7550, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.30, pd= 2.7045, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=233841.84, pd= -1.4595, lock= 140, amb=24882774.014, snr=32.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=287718.54, pd= 0.6640, lock= >937, amb=20685679.602, snr=50.25) L2 (C-P/Y, r= 4.34, pd= 0.9300, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=117913.02, pd= -3.7635, lock= 88, amb=24582981.556, snr=31.00) L2 (C-P/Y, r= 8.14, pd= -3.6655, lock= 88, snr=20.25) RTCM3 (2011-04-10T22:38:40.99 delay -26293.) Type 1012: ID= 0, Tk= 32214.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=293069.78, pd= 1.6085, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 6.64, pd= 1.3485, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 24420.20, pd= -1.0235, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.74, pd= -2.2050, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=438952.76, pd= -44.2495, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.18, pd= 0.4790, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=112371.72, pd= -3.9850, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=219652.34, pd= -3.6225, lock= >937, amb=23383811.724, snr=36.00) L2 (P , r= 7.06, pd= -2.7310, lock= >937, snr=40.25) SV= 6, Freq= -4, L1 (C/A, r= 70214.46, pd= 0.9520, lock= >937, amb=21585056.976, snr=45.50) L2 (P , r= 5.26, pd= 0.7820, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 28955.78, pd= -0.3390, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 0.96, pd= 1.1740, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=448723.28, pd= 19.9205, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.22, pd= 0.8200, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.99) Type 1033: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' Receiver Type='TRIMBLE NETR5', Firmware='', Serial='' RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194230.000, More Data=Yes, GPS-Sats=11, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 65060.06, pd= -1.7630, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 6.74, pd= -2.1660, lock= >937, snr=25.50) SV= 3, L1 (C/A , r= 21496.58, pd= 1.7135, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.66, pd= 2.5250, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 24302.40, pd= 0.7365, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.80, pd= 1.0735, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 28843.40, pd= -4.4305, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.90, pd= -4.7245, lock= >937, snr=38.50) SV= 30, L1 (C/A , r=146727.74, pd= -1.3115, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 8.18, pd= -1.4515, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=224764.06, pd= 1.0165, lock= >937, amb=24882774.014, snr=41.25) L2 (C-P/Y, r= 7.16, pd= -0.1535, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=274657.00, pd= 1.6040, lock= >937, amb=20086094.686, snr=49.75) L2 (C-P/Y, r= 7.00, pd= 2.4630, lock= >937, snr=43.75) SV= 8, L1 (C/A , r=261614.04, pd= -0.3530, lock= >937, amb=24882774.014, snr=38.50) L2 (C-P/Y, r= 7.20, pd= 0.1230, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=268853.72, pd= 1.6435, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.42, pd= 2.5925, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=233206.88, pd= -0.7890, lock= 140, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=287553.46, pd= 0.4920, lock= >937, amb=20685679.602, snr=50.00) L2 (C-P/Y, r= 3.72, pd= 0.7570, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.99 delay -26294.) Type 1012: ID= 0, Tk= 32215.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=293415.76, pd= 1.8860, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 7.00, pd= 1.6265, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 24940.12, pd= -0.9375, lock= >937, amb=22184641.892, snr=39.25) L2 (P , r= 5.18, pd= -2.1200, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=438986.72, pd= -44.3480, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.22, pd= 0.3805, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=112088.06, pd= -2.9495, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=220393.64, pd= -4.1965, lock= >937, amb=23383811.724, snr=36.00) L2 (P , r= 6.48, pd= -3.3055, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 70758.12, pd= 1.1715, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.82, pd= 1.0010, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 28673.38, pd= -0.3695, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.12, pd= 1.1440, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=448204.00, pd= 20.1240, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 5.78, pd= 1.0230, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.99) Type 1008: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194231.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 65586.68, pd= -1.5815, lock= >937, amb=23983396.640, snr=41.50) L2 (C-P/Y, r= 6.86, pd= -1.9865, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 21422.18, pd= 1.7325, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.74, pd= 2.5450, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 24526.28, pd= 0.7660, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.02, pd= 1.1030, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 29372.54, pd= -4.5770, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.00, pd= -4.8700, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=147458.32, pd= -1.8885, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.36, pd= -2.0285, lock= >937, snr=30.00) SV= 15, L1 (C/A , r=224834.46, pd= 1.7665, lock= >937, amb=24882774.014, snr=41.25) L2 (C-P/Y, r= 8.10, pd= 0.6000, lock= >937, snr=22.00) SV= 6, L1 (C/A , r=274699.64, pd= 1.4465, lock= >937, amb=20086094.686, snr=50.00) L2 (C-P/Y, r= 6.82, pd= 2.3045, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=261418.32, pd= 0.4470, lock= >937, amb=24882774.014, snr=39.00) L2 (C-P/Y, r= 7.68, pd= 0.9235, lock= >937, snr=17.75) SV= 19, L1 (C/A , r=268451.10, pd= 1.7485, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.46, pd= 2.6975, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=232573.38, pd= -1.5445, lock= 140, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=287388.08, pd= 0.7515, lock= >937, amb=20685679.602, snr=50.00) L2 (C-P/Y, r= 4.20, pd= 1.0160, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=118246.94, pd= 0.0370, lock= 0, amb=24582981.556, snr=29.00) L2 (C-P/Y, r= 9.56, pd= 0.0910, lock= 0, snr=19.00) RTCM3 (2011-04-10T22:38:40.99 delay -26295.) Type 1012: ID= 0, Tk= 32216.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=293764.00, pd= 0.0595, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 5.64, pd= -0.2030, lock= >937, snr=41.25) SV= 21, Freq= 4, L1 (C/A, r= 25460.44, pd= -1.1890, lock= >937, amb=22184641.892, snr=39.50) L2 (P , r= 4.90, pd= -2.3730, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=439020.56, pd= -44.2310, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.26, pd= 0.4965, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=111806.22, pd= -3.5755, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=221133.74, pd= -3.5210, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 6.78, pd= -2.6305, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 71301.76, pd= 1.5485, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.88, pd= 1.3770, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 28391.30, pd= -0.5455, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.10, pd= 0.9675, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=447684.84, pd= 20.2520, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 6.06, pd= 1.1500, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:40.99) Type 1006: ID= 0, Year=0, GPS=Y, GLONASS=Y, Galileo=N, X= 4581694.6288, Y= 556114.3725, Z= 4389358.4678 QC=1(no bias), height=0.0349 RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194232.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 66113.00, pd= -1.1140, lock= >937, amb=23983396.640, snr=41.50) L2 (C-P/Y, r= 7.10, pd= -1.5195, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 21347.78, pd= 1.8155, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.62, pd= 2.6275, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 24750.54, pd= 0.4840, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.00, pd= 0.8210, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 29901.30, pd= -4.2990, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.12, pd= -4.5940, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=148187.90, pd= -1.4575, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.96, pd= -1.5980, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=224906.46, pd= 0.9975, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.18, pd= -0.1715, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=274742.00, pd= 1.6155, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.90, pd= 2.4730, lock= >937, snr=43.75) SV= 8, L1 (C/A , r=261223.80, pd= 0.1315, lock= >937, amb=24882774.014, snr=39.00) L2 (C-P/Y, r= 7.54, pd= 0.6085, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=268048.50, pd= 1.8560, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.44, pd= 2.8050, lock= >937, snr=40.25) SV= 11, L1 (C/A , r=231938.14, pd= -0.5800, lock= 140, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=287223.22, pd= 0.5780, lock= >937, amb=20685679.602, snr=49.75) L2 (C-P/Y, r= 3.84, pd= 0.8440, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=118414.10, pd= 0.6375, lock= 1, amb=24582981.556, snr=29.75) L2 (C-P/Y, r= 9.76, pd= 0.6845, lock= 1, snr=18.50) RTCM3 (2011-04-10T22:38:40.99 delay -26296.) Type 1012: ID= 0, Tk= 32217.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=294110.70, pd= -0.1245, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 5.12, pd= -0.3895, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 25980.82, pd= -1.4790, lock= >937, amb=22184641.892, snr=39.75) L2 (P , r= 5.24, pd= -2.6625, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439054.42, pd= -44.0865, lock= >937, amb=19186717.312, snr=51.25) L2 (P , r= 5.44, pd= 0.6420, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=111523.78, pd= -3.4780, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=221875.36, pd= -4.3765, lock= >937, amb=23383811.724, snr=35.75) L2 (P , r= 5.20, pd= -3.4860, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 71845.98, pd= 1.4360, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.34, pd= 1.2650, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 28109.06, pd= -0.4360, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.20, pd= 1.0770, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=447165.58, pd= 20.4770, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.26, pd= 1.3740, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.99) Type 1013: ID= 0, MJD=55621, SOD=21417, Num= 6, Leap=15 ID=1004, Sync=1, Interval= 1.0 ID=1006, Sync=1, Interval= 10.0 ID=1008, Sync=1, Interval= 10.0 ID=1012, Sync=1, Interval= 1.0 ID=1013, Sync=1, Interval= 10.0 ID=1033, Sync=1, Interval= 10.0 RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194233.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 66640.12, pd= -1.4240, lock= >937, amb=23983396.640, snr=41.50) L2 (C-P/Y, r= 6.74, pd= -1.8290, lock= >937, snr=25.75) SV= 3, L1 (C/A , r= 21273.80, pd= 1.5915, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.64, pd= 2.4035, lock= >937, snr=44.25) SV= 18, L1 (C/A , r= 24974.62, pd= 0.5015, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.88, pd= 0.8385, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 30430.46, pd= -4.3235, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.78, pd= -4.6185, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=148918.22, pd= -1.7295, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.32, pd= -1.8710, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=224977.72, pd= 1.0965, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.46, pd= -0.0705, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=274784.74, pd= 1.5010, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.68, pd= 2.3585, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=261029.46, pd= -0.2325, lock= >937, amb=24882774.014, snr=39.00) L2 (C-P/Y, r= 7.10, pd= 0.2445, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=267646.10, pd= 1.8235, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.20, pd= 2.7730, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=231304.12, pd= -0.8220, lock= 144, amb=24882774.014, snr=33.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=287058.08, pd= 0.8145, lock= >937, amb=20685679.602, snr=50.00) L2 (C-P/Y, r= 4.06, pd= 1.0800, lock= >937, snr=43.50) SV= 7, L1 (C/A , r=118582.56, pd= 0.0570, lock= 2, amb=24582981.556, snr=29.75) L2 (C-P/Y, r= 9.26, pd= 0.0980, lock= 2, snr=17.75) RTCM3 (2011-04-10T22:38:40.99 delay -26297.) Type 1012: ID= 0, Tk= 32218.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=294456.26, pd= 0.9820, lock= >937, amb=22184641.892, snr=41.75) L2 (P , r= 5.60, pd= 0.7180, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 26500.14, pd= -0.6445, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 5.56, pd= -1.8280, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439088.64, pd= -44.2080, lock= >937, amb=19186717.312, snr=51.50) L2 (P , r= 5.20, pd= 0.5195, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=111242.36, pd= -4.2455, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=222615.18, pd= -3.3835, lock= >937, amb=23383811.724, snr=36.00) L2 (P , r= 7.24, pd= -2.4930, lock= >937, snr=40.25) SV= 6, Freq= -4, L1 (C/A, r= 72390.82, pd= 0.8420, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.14, pd= 0.6710, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 27826.94, pd= -0.2860, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.90, pd= 1.2265, lock= >937, snr=44.75) SV= 23, Freq= 3, L1 (C/A, r=446646.66, pd= 20.4010, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.74, pd= 1.2975, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194234.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 67167.24, pd= -1.6935, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 7.04, pd= -2.0980, lock= >937, snr=24.75) SV= 3, L1 (C/A , r= 21199.80, pd= 1.5045, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.20, pd= 2.3155, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 25198.52, pd= 0.8265, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.00, pd= 1.1625, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 30959.90, pd= -4.5290, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.92, pd= -4.8245, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=149648.20, pd= -1.6075, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.58, pd= -1.7510, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=225049.12, pd= 1.1875, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.18, pd= 0.0185, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=274827.20, pd= 1.7640, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 7.08, pd= 2.6220, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=260833.96, pd= 0.6995, lock= >937, amb=24882774.014, snr=38.50) L2 (C-P/Y, r= 8.20, pd= 1.1780, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=267243.78, pd= 1.7800, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.32, pd= 2.7290, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=230669.14, pd= -0.0555, lock= 144, amb=24882774.014, snr=34.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=286893.48, pd= 0.6455, lock= >937, amb=20685679.602, snr=50.25) L2 (C-P/Y, r= 3.96, pd= 0.9120, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=118750.52, pd= 0.1035, lock= 3, amb=24582981.556, snr=31.50) L2 (C-P/Y, r= 9.20, pd= 0.1390, lock= 3, snr=17.25) RTCM3 (2011-04-10T22:38:40.99 delay -26298.) Type 1012: ID= 0, Tk= 32219.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=294803.80, pd= 0.2725, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 5.60, pd= 0.0090, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 27020.40, pd= -0.6900, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 5.50, pd= -1.8745, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439122.80, pd= -44.1740, lock= >937, amb=19186717.312, snr=51.50) L2 (P , r= 4.82, pd= 0.5525, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=110959.06, pd= -2.9565, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=223357.06, pd= -4.4225, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 6.02, pd= -3.5315, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 72934.84, pd= 1.2090, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 5.58, pd= 1.0375, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 27544.66, pd= 0.2000, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.90, pd= 1.7125, lock= >937, snr=44.50) SV= 23, Freq= 3, L1 (C/A, r=446127.76, pd= 20.3485, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.72, pd= 1.2455, lock= >937, snr=43.50) RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194235.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 67693.92, pd= -1.5240, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 6.84, pd= -1.9305, lock= >937, snr=23.50) SV= 3, L1 (C/A , r= 21125.60, pd= 1.7015, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.54, pd= 2.5120, lock= >937, snr=44.25) SV= 18, L1 (C/A , r= 25422.68, pd= 0.9800, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.08, pd= 1.3160, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 31489.08, pd= -4.4100, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.12, pd= -4.7055, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=150378.24, pd= -1.5285, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.80, pd= -1.6725, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=225120.62, pd= 1.2800, lock= >937, amb=24882774.014, snr=42.25) L2 (C-P/Y, r= 7.68, pd= 0.1085, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=274870.02, pd= 1.7350, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 7.02, pd= 2.5925, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=260639.74, pd= 0.4545, lock= >937, amb=24882774.014, snr=39.00) L2 (C-P/Y, r= 7.64, pd= 0.9345, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=266841.38, pd= 1.8525, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.34, pd= 2.8020, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=230034.94, pd= -0.0780, lock= 144, amb=24882774.014, snr=34.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=286728.80, pd= 0.6610, lock= >937, amb=20685679.602, snr=50.50) L2 (C-P/Y, r= 4.14, pd= 0.9275, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=118919.64, pd= -0.9185, lock= 4, amb=24582981.556, snr=32.75) L2 (C-P/Y, r= 7.94, pd= -0.8800, lock= 4, snr=17.25) RTCM3 (2011-04-10T22:38:40.99 delay -26299.) Type 1012: ID= 0, Tk= 32220.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=295149.98, pd= 1.0420, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 6.08, pd= 0.7790, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 27542.22, pd= -2.2530, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 3.40, pd= -3.4375, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=439157.18, pd= -44.2915, lock= >937, amb=19186717.312, snr=51.50) L2 (P , r= 5.06, pd= 0.4350, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=110676.88, pd= -2.6510, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=224097.30, pd= -3.8050, lock= >937, amb=23383811.724, snr=35.75) L2 (P , r= 6.46, pd= -2.9140, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 73478.80, pd= 1.7445, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 6.08, pd= 1.5730, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 27263.28, pd= -0.0595, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 1.36, pd= 1.4530, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=445609.04, pd= 20.1345, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.34, pd= 1.0315, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194236.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 68220.30, pd= -1.0355, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 7.14, pd= -1.4440, lock= >937, snr=24.75) SV= 3, L1 (C/A , r= 21051.60, pd= 1.7990, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.42, pd= 2.6110, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 25647.22, pd= 0.8615, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.74, pd= 1.1970, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 32018.42, pd= -4.3700, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 5.92, pd= -4.6650, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=151108.72, pd= -1.8515, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.30, pd= -1.9960, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=225192.24, pd= 1.3660, lock= >937, amb=24882774.014, snr=42.25) L2 (C-P/Y, r= 7.80, pd= 0.1940, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=274913.28, pd= 1.3480, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.90, pd= 2.2055, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=260446.46, pd= -0.6065, lock= >937, amb=24882774.014, snr=38.50) L2 (C-P/Y, r= 6.84, pd= -0.1245, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=266438.96, pd= 1.9965, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.60, pd= 2.9450, lock= >937, snr=40.25) SV= 11, L1 (C/A , r=229401.84, pd= -1.1805, lock= 144, amb=24882774.014, snr=34.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=286564.28, pd= 0.6355, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 4.18, pd= 0.9005, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=119089.22, pd= -2.2950, lock= 5, amb=24582981.556, snr=33.25) L2 (C-P/Y, r= 6.92, pd= -2.2595, lock= 5, snr=17.25) RTCM3 (2011-04-10T22:38:40.99 delay -26300.) Type 1012: ID= 0, Tk= 32221.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=295498.70, pd= -0.5885, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 4.62, pd= -0.8505, lock= >937, snr=42.25) SV= 21, Freq= 4, L1 (C/A, r= 28062.32, pd= -2.0460, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.36, pd= -3.2315, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=439191.40, pd= -44.1705, lock= >937, amb=19186717.312, snr=51.50) L2 (P , r= 5.02, pd= 0.5565, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=110395.74, pd= -3.2350, lock= >937, amb=23383811.724, snr=38.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=224838.06, pd= -3.6875, lock= >937, amb=23383811.724, snr=35.75) L2 (P , r= 6.70, pd= -2.7950, lock= >937, snr=40.50) SV= 6, Freq= -4, L1 (C/A, r= 74024.40, pd= 0.7625, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 4.72, pd= 0.5910, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 26982.30, pd= -0.5470, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.08, pd= 0.9655, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=445089.74, pd= 20.5365, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.50, pd= 1.4340, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:40.99) Type 1004: ID= 0, TOW=194237.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 68747.18, pd= -1.0405, lock= >937, amb=23983396.640, snr=41.50) L2 (C-P/Y, r= 7.46, pd= -1.4515, lock= >937, snr=25.25) SV= 3, L1 (C/A , r= 20977.90, pd= 1.6890, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.50, pd= 2.5015, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 25872.12, pd= 0.4830, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 5.82, pd= 0.8175, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 32547.82, pd= -4.3115, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.34, pd= -4.6070, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=151838.70, pd= -1.6435, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.42, pd= -1.7875, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=225263.78, pd= 1.6330, lock= >937, amb=24882774.014, snr=42.50) L2 (C-P/Y, r= 7.74, pd= 0.4605, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=274956.14, pd= 1.4380, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.64, pd= 2.2955, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=260251.40, pd= 0.2205, lock= >937, amb=24882774.014, snr=38.25) L2 (C-P/Y, r= 7.28, pd= 0.6985, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=266036.94, pd= 1.7820, lock= >937, amb=21285264.518, snr=49.00) L2 (C-P/Y, r= 4.02, pd= 2.7305, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=228766.44, pd= 0.0330, lock= 148, amb=24882774.014, snr=33.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=286399.52, pd= 0.9615, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 4.20, pd= 1.2265, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=119258.10, pd= -2.8595, lock= 6, amb=24582981.556, snr=35.00) L2 (C-P/Y, r= 6.26, pd= -2.8280, lock= 6, snr=17.25) RTCM3 (2011-04-10T22:38:40.99 delay -26301.) Type 1012: ID= 0, Tk= 32222.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=295845.54, pd= -0.1975, lock= >937, amb=22184641.892, snr=41.00) L2 (P , r= 5.32, pd= -0.4595, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 28582.56, pd= -1.9270, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.02, pd= -3.1130, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439226.22, pd= -44.5680, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.10, pd= 0.1585, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=110113.44, pd= -2.5190, lock= >937, amb=23383811.724, snr=38.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=225578.56, pd= -3.2825, lock= >937, amb=23383811.724, snr=35.75) L2 (P , r= 7.18, pd= -2.3890, lock= >937, snr=40.25) SV= 6, Freq= -4, L1 (C/A, r= 74568.74, pd= 1.1640, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.70, pd= 0.9920, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 26701.50, pd= -1.0435, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.20, pd= 0.4690, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=444571.70, pd= 19.7005, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.02, pd= 0.5990, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.00) Type 1004: ID= 0, TOW=194238.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 69274.66, pd= -1.6200, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 6.60, pd= -2.0335, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 20904.10, pd= 1.7875, lock= >937, amb=19786302.228, snr=53.75) L2 (C-P/Y, r= 6.46, pd= 2.5990, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 26096.60, pd= 0.6395, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.98, pd= 0.9740, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 33077.50, pd= -4.4460, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.98, pd= -4.7410, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=152568.72, pd= -1.4365, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.94, pd= -1.5795, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=225336.52, pd= 0.8300, lock= >937, amb=24882774.014, snr=42.25) L2 (C-P/Y, r= 6.86, pd= -0.3435, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=274999.06, pd= 1.5535, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.70, pd= 2.4110, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=260057.48, pd= 0.0400, lock= >937, amb=24882774.014, snr=38.00) L2 (C-P/Y, r= 7.26, pd= 0.5180, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=265634.76, pd= 1.7875, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.30, pd= 2.7360, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=228132.48, pd= -0.1820, lock= 148, amb=24882774.014, snr=34.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=286235.54, pd= 0.6310, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 4.18, pd= 0.8960, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=119425.92, pd= -2.2665, lock= 7, amb=24582981.556, snr=35.00) L2 (C-P/Y, r= 6.62, pd= -2.2315, lock= 7, snr=17.25) RTCM3 (2011-04-10T22:38:41.00 delay -26302.) Type 1012: ID= 0, Tk= 32223.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=296192.36, pd= 0.3590, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 5.50, pd= 0.0955, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 29102.20, pd= -1.1480, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 5.42, pd= -2.3350, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439260.52, pd= -44.3575, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.32, pd= 0.3690, lock= >937, snr=51.50) SV= 14, Freq= -7, L1 (C/A, r=109832.46, pd= -2.9560, lock= >937, amb=23383811.724, snr=39.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=226319.18, pd= -2.9650, lock= >937, amb=23383811.724, snr=35.75) L2 (P , r= 7.50, pd= -2.0710, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 75114.14, pd= 0.6370, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 4.90, pd= 0.4635, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 26419.52, pd= -0.1825, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.80, pd= 1.3295, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=444052.70, pd= 19.8685, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 6.08, pd= 0.7670, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.00) Type 1004: ID= 0, TOW=194239.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 69801.08, pd= -1.1470, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 7.34, pd= -1.5605, lock= >937, snr=25.25) SV= 3, L1 (C/A , r= 20830.46, pd= 1.8030, lock= >937, amb=19786302.228, snr=54.00) L2 (C-P/Y, r= 6.80, pd= 2.6140, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 26321.28, pd= 0.6715, lock= >937, amb=21884849.434, snr=48.25) L2 (C-P/Y, r= 5.68, pd= 1.0070, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 33607.18, pd= -4.5165, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 5.94, pd= -4.8125, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=153299.16, pd= -1.6380, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.74, pd= -1.7805, lock= >937, snr=28.50) SV= 15, L1 (C/A , r=225407.88, pd= 1.4975, lock= >937, amb=24882774.014, snr=42.50) L2 (C-P/Y, r= 7.58, pd= 0.3235, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=275042.28, pd= 1.4285, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.76, pd= 2.2855, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=259862.90, pd= 0.6110, lock= >937, amb=24882774.014, snr=38.25) L2 (C-P/Y, r= 7.76, pd= 1.0920, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=265232.68, pd= 1.7200, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.54, pd= 2.6690, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=227498.34, pd= -0.2290, lock= 148, amb=24882774.014, snr=34.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=286071.40, pd= 0.5580, lock= >937, amb=20685679.602, snr=50.50) L2 (C-P/Y, r= 4.00, pd= 0.8225, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=119594.52, pd= -2.3600, lock= 8, amb=24582981.556, snr=35.25) L2 (C-P/Y, r= 6.64, pd= -2.3145, lock= 8, snr=17.25) RTCM3 (2011-04-10T22:38:41.00 delay -26303.) Type 1012: ID= 0, Tk= 32224.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=296541.16, pd= -0.9505, lock= >937, amb=22184641.892, snr=41.75) L2 (P , r= 5.00, pd= -1.2175, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 29622.86, pd= -1.3570, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.84, pd= -2.5450, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439294.84, pd= -44.1095, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.60, pd= 0.6170, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=109552.10, pd= -3.8845, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=227060.12, pd= -2.9650, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 7.46, pd= -2.0715, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 75658.90, pd= 0.8490, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.40, pd= 0.6760, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 26139.10, pd= -0.7440, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.46, pd= 0.7685, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=443534.24, pd= 19.5035, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 5.38, pd= 0.4020, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.00) Type 1033: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' Receiver Type='TRIMBLE NETR5', Firmware='', Serial='' RTCM3 (2011-04-10T22:38:41.00) Type 1004: ID= 0, TOW=194240.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 70328.04, pd= -1.1955, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 6.98, pd= -1.6080, lock= >937, snr=25.75) SV= 3, L1 (C/A , r= 20757.14, pd= 1.6020, lock= >937, amb=19786302.228, snr=53.75) L2 (C-P/Y, r= 6.52, pd= 2.4130, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 26545.86, pd= 0.9195, lock= >937, amb=21884849.434, snr=48.00) L2 (C-P/Y, r= 5.98, pd= 1.2545, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 34136.88, pd= -4.5265, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 6.08, pd= -4.8225, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=154029.20, pd= -1.4065, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 8.00, pd= -1.5490, lock= >937, snr=29.75) SV= 15, L1 (C/A , r=225479.86, pd= 1.6590, lock= >937, amb=24882774.014, snr=42.50) L2 (C-P/Y, r= 7.74, pd= 0.4875, lock= >937, snr=23.00) SV= 6, L1 (C/A , r=275085.34, pd= 1.5505, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 7.00, pd= 2.4070, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=259669.86, pd= -0.2395, lock= >937, amb=24882774.014, snr=37.50) L2 (C-P/Y, r= 7.16, pd= 0.2410, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=264830.38, pd= 1.9225, lock= >937, amb=21285264.518, snr=49.00) L2 (C-P/Y, r= 4.42, pd= 2.8700, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=226864.30, pd= -0.3405, lock= 148, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=285907.04, pd= 0.8220, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 4.10, pd= 1.0875, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=119763.78, pd= -3.0115, lock= 9, amb=24582981.556, snr=35.25) L2 (C-P/Y, r= 5.46, pd= -2.9685, lock= 9, snr=17.25) RTCM3 (2011-04-10T22:38:41.00 delay -26304.) Type 1012: ID= 0, Tk= 32225.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=296887.52, pd= 0.3230, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 5.34, pd= 0.0575, lock= >937, snr=42.25) SV= 21, Freq= 4, L1 (C/A, r= 30143.52, pd= -1.5155, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.28, pd= -2.7035, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=439329.80, pd= -44.4190, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.56, pd= 0.3070, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=109270.66, pd= -3.5815, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=227801.30, pd= -3.1745, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 6.92, pd= -2.2800, lock= >937, snr=40.25) SV= 6, Freq= -4, L1 (C/A, r= 76203.80, pd= 1.0475, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.42, pd= 0.8730, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 25858.46, pd= -0.9190, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.30, pd= 0.5935, lock= >937, snr=46.00) SV= 23, Freq= 3, L1 (C/A, r=443015.02, pd= 19.9285, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 5.90, pd= 0.8280, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.00) Type 1008: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' RTCM3 (2011-04-10T22:38:41.00) Type 1004: ID= 0, TOW=194241.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 70855.14, pd= -1.3685, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 6.88, pd= -1.7815, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 20683.64, pd= 1.6805, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.48, pd= 2.4920, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 26771.10, pd= 0.6115, lock= >937, amb=21884849.434, snr=47.75) L2 (C-P/Y, r= 5.84, pd= 0.9465, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 34666.58, pd= -4.4530, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 6.20, pd= -4.7495, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=154759.88, pd= -1.7735, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.36, pd= -1.9175, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=225552.14, pd= 1.6355, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.82, pd= 0.4655, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=275128.54, pd= 1.6155, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 7.08, pd= 2.4725, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=259475.48, pd= 0.3725, lock= >937, amb=24882774.014, snr=37.25) L2 (C-P/Y, r= 7.66, pd= 0.8525, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=264428.24, pd= 2.0195, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.72, pd= 2.9675, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=226231.08, pd= -1.2750, lock= 152, amb=24882774.014, snr=33.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=285743.26, pd= 0.6285, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 3.98, pd= 0.8930, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=119932.80, pd= -3.3025, lock= 10, amb=24582981.556, snr=35.25) L2 (C-P/Y, r= 5.30, pd= -3.2540, lock= 10, snr=17.75) RTCM3 (2011-04-10T22:38:41.00 delay -26305.) Type 1012: ID= 0, Tk= 32226.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=297233.60, pd= 2.0215, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 7.30, pd= 1.7585, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 30664.42, pd= -1.8605, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.76, pd= -3.0490, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=439364.18, pd= -44.0695, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.56, pd= 0.6570, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=108991.52, pd= -5.4300, lock= >937, amb=23383811.724, snr=38.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=228542.72, pd= -3.6130, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 6.68, pd= -2.7200, lock= >937, snr=40.50) SV= 6, Freq= -4, L1 (C/A, r= 76749.08, pd= 0.9895, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.00, pd= 0.8150, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 25576.78, pd= 0.0945, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 1.44, pd= 1.6075, lock= >937, snr=46.00) SV= 23, Freq= 3, L1 (C/A, r=442495.88, pd= 20.3080, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.16, pd= 1.2065, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.00) Type 1006: ID= 0, Year=0, GPS=Y, GLONASS=Y, Galileo=N, X= 4581694.6288, Y= 556114.3725, Z= 4389358.4678 QC=1(no bias), height=0.0349 RTCM3 (2011-04-10T22:38:41.00) Type 1004: ID= 0, TOW=194242.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 71382.72, pd= -2.0085, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 6.38, pd= -2.4220, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 20610.24, pd= 1.7525, lock= >937, amb=19786302.228, snr=54.00) L2 (C-P/Y, r= 6.26, pd= 2.5630, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 26996.04, pd= 0.7030, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 5.70, pd= 1.0375, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 35196.54, pd= -4.5625, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.84, pd= -4.8590, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=155490.24, pd= -1.7955, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.68, pd= -1.9395, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=225624.60, pd= 1.5470, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.48, pd= 0.3755, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=275172.12, pd= 1.3750, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.54, pd= 2.2315, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=259281.88, pd= 0.3195, lock= >937, amb=24882774.014, snr=37.75) L2 (C-P/Y, r= 7.24, pd= 0.8020, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=264026.38, pd= 1.8825, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.20, pd= 2.8305, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=225596.22, pd= -0.5590, lock= 152, amb=24882774.014, snr=33.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=285579.16, pd= 0.8670, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.08, pd= 1.1320, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=120101.54, pd= -3.2150, lock= 11, amb=24582981.556, snr=35.25) L2 (C-P/Y, r= 5.60, pd= -3.1620, lock= 11, snr=16.75) RTCM3 (2011-04-10T22:38:41.00 delay -26306.) Type 1012: ID= 0, Tk= 32227.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=297580.90, pd= 2.6335, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 8.06, pd= 2.3710, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 31185.34, pd= -2.1745, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 3.46, pd= -3.3630, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=439398.84, pd= -43.9265, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.30, pd= 0.7995, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r=108708.98, pd= -3.7265, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=229282.98, pd= -2.8635, lock= >937, amb=23383811.724, snr=35.75) L2 (P , r= 7.46, pd= -1.9710, lock= >937, snr=40.25) SV= 6, Freq= -4, L1 (C/A, r= 77294.22, pd= 1.1905, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 6.02, pd= 1.0155, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 25296.40, pd= -0.0340, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.40, pd= 1.4780, lock= >937, snr=46.00) SV= 23, Freq= 3, L1 (C/A, r=441977.14, pd= 20.3050, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.30, pd= 1.2035, lock= >937, snr=44.50) RTCM3 (2011-04-10T22:38:41.00) Type 1013: ID= 0, MJD=55621, SOD=21427, Num= 6, Leap=15 ID=1004, Sync=1, Interval= 1.0 ID=1006, Sync=1, Interval= 10.0 ID=1008, Sync=1, Interval= 10.0 ID=1012, Sync=1, Interval= 1.0 ID=1013, Sync=1, Interval= 10.0 ID=1033, Sync=1, Interval= 10.0 RTCM3 (2011-04-10T22:38:41.00) Type 1004: ID= 0, TOW=194243.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 71908.94, pd= -1.2680, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 7.30, pd= -1.6830, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 20537.10, pd= 1.6740, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.70, pd= 2.4840, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 27221.38, pd= 0.5050, lock= >937, amb=21884849.434, snr=48.25) L2 (C-P/Y, r= 5.82, pd= 0.8390, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 35726.48, pd= -4.5655, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.56, pd= -4.8625, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=156220.42, pd= -1.5985, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.48, pd= -1.7430, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=225696.98, pd= 1.6530, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.54, pd= 0.4830, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=275215.40, pd= 1.5210, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.86, pd= 2.3775, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=259089.36, pd= -0.6870, lock= >937, amb=24882774.014, snr=37.50) L2 (C-P/Y, r= 6.48, pd= -0.2035, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=263624.50, pd= 1.8200, lock= >937, amb=21285264.518, snr=49.00) L2 (C-P/Y, r= 4.24, pd= 2.7685, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=224962.60, pd= -1.0525, lock= 152, amb=24882774.014, snr=34.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=285415.94, pd= 0.3495, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 3.68, pd= 0.6145, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=120270.86, pd= -3.5950, lock= 12, amb=24582981.556, snr=35.75) L2 (C-P/Y, r= 4.88, pd= -3.5365, lock= 12, snr=18.50) RTCM3 (2011-04-10T22:38:41.00 delay -26307.) Type 1012: ID= 0, Tk= 32228.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=297930.82, pd= 0.7710, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 6.08, pd= 0.5075, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 31706.06, pd= -2.2295, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.04, pd= -3.4195, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439434.08, pd= -44.2755, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 4.88, pd= 0.4500, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r=108427.16, pd= -2.5895, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=230024.10, pd= -2.9405, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 7.62, pd= -2.0480, lock= >937, snr=40.50) SV= 6, Freq= -4, L1 (C/A, r= 77839.56, pd= 1.3225, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.26, pd= 1.1470, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 25016.00, pd= 0.0130, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 1.58, pd= 1.5260, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=441458.24, pd= 20.5015, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.26, pd= 1.3985, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.00) Type 1004: ID= 0, TOW=194244.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 72435.64, pd= -0.9870, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 7.64, pd= -1.4045, lock= >937, snr=25.75) SV= 3, L1 (C/A , r= 20463.80, pd= 1.8510, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.52, pd= 2.6605, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 27446.34, pd= 0.7955, lock= >937, amb=21884849.434, snr=48.25) L2 (C-P/Y, r= 5.66, pd= 1.1290, lock= >937, snr=38.00) SV= 16, L1 (C/A , r= 36256.60, pd= -4.6660, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.50, pd= -4.9630, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=156950.82, pd= -1.5805, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.38, pd= -1.7250, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=225769.84, pd= 1.3920, lock= >937, amb=24882774.014, snr=41.00) L2 (C-P/Y, r= 7.62, pd= 0.2225, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=275258.74, pd= 1.6945, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.94, pd= 2.5505, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=258895.72, pd= -0.4590, lock= >937, amb=24882774.014, snr=38.00) L2 (C-P/Y, r= 6.28, pd= 0.0180, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=263222.64, pd= 1.7925, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.62, pd= 2.7405, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=224328.04, pd= -0.5990, lock= 152, amb=24882774.014, snr=34.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=285252.14, pd= 0.5315, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 3.88, pd= 0.7975, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=120438.82, pd= -2.5090, lock= 13, amb=24582981.556, snr=36.25) L2 (C-P/Y, r= 5.42, pd= -2.4480, lock= 13, snr=18.50) RTCM3 (2011-04-10T22:38:41.00 delay -26308.) Type 1012: ID= 0, Tk= 32229.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=298278.98, pd= 0.8140, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.30, pd= 0.5490, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 32226.10, pd= -1.5535, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.42, pd= -2.7445, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=439468.90, pd= -44.1210, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.70, pd= 0.6035, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=108145.98, pd= -1.9380, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=230764.00, pd= -1.7680, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 8.56, pd= -0.8750, lock= >937, snr=40.50) SV= 6, Freq= -4, L1 (C/A, r= 78385.28, pd= 1.1995, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.50, pd= 1.0250, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 24736.58, pd= -0.7575, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.60, pd= 0.7540, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=440939.96, pd= 20.1140, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.18, pd= 1.0115, lock= >937, snr=44.75) RTCM3 (2011-04-10T22:38:41.00) Type 1004: ID= 0, TOW=194245.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 72963.56, pd= -1.9025, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 6.36, pd= -2.3185, lock= >937, snr=25.75) SV= 3, L1 (C/A , r= 20390.90, pd= 1.7390, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.36, pd= 2.5490, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 27671.84, pd= 0.6560, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.84, pd= 0.9905, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 36786.54, pd= -4.4925, lock= >937, amb=21884849.434, snr=50.00) L2 (C-P/Y, r= 6.20, pd= -4.7905, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=157680.92, pd= -1.2255, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.70, pd= -1.3705, lock= >937, snr=28.50) SV= 15, L1 (C/A , r=225842.48, pd= 1.4830, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.76, pd= 0.3120, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=275302.74, pd= 1.2990, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.38, pd= 2.1560, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=258701.68, pd= 0.2985, lock= >937, amb=24882774.014, snr=38.00) L2 (C-P/Y, r= 7.14, pd= 0.7780, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=262820.86, pd= 1.7415, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.16, pd= 2.6900, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=223694.14, pd= -0.7775, lock= 156, amb=24882774.014, snr=34.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=285088.42, pd= 0.7610, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.16, pd= 1.0265, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=120609.14, pd= -3.6610, lock= 14, amb=24582981.556, snr=36.00) L2 (C-P/Y, r= 4.36, pd= -3.5965, lock= 14, snr=17.25) RTCM3 (2011-04-10T22:38:41.00 delay -26309.) Type 1012: ID= 0, Tk= 32230.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=298626.22, pd= 1.9290, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 7.38, pd= 1.6620, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 32746.30, pd= -0.9795, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.78, pd= -2.1715, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439503.56, pd= -43.7175, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.66, pd= 1.0080, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=107867.24, pd= -3.5670, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=231505.50, pd= -2.1595, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 7.66, pd= -1.2670, lock= >937, snr=40.75) SV= 6, Freq= -4, L1 (C/A, r= 78930.90, pd= 1.3065, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.30, pd= 1.1320, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 24456.96, pd= -1.1555, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= -0.04, pd= 0.3565, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=440421.08, pd= 20.3725, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.60, pd= 1.2680, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.01) Type 1004: ID= 0, TOW=194246.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 73489.66, pd= -0.9755, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 7.48, pd= -1.3950, lock= >937, snr=25.00) SV= 3, L1 (C/A , r= 20317.98, pd= 1.7580, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.52, pd= 2.5685, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 27897.22, pd= 0.7570, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 5.88, pd= 1.0910, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 37316.78, pd= -4.5275, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 5.92, pd= -4.8250, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=158411.44, pd= -1.2390, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.96, pd= -1.3835, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=225915.60, pd= 1.2095, lock= >937, amb=24882774.014, snr=41.25) L2 (C-P/Y, r= 7.60, pd= 0.0345, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=275346.24, pd= 1.4935, lock= >937, amb=20086094.686, snr=50.00) L2 (C-P/Y, r= 6.82, pd= 2.3495, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=258509.58, pd= -0.7485, lock= >937, amb=24882774.014, snr=37.25) L2 (C-P/Y, r= 6.38, pd= -0.2730, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=262418.92, pd= 1.9135, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.40, pd= 2.8625, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=223059.76, pd= -0.4540, lock= 156, amb=24882774.014, snr=34.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=284925.06, pd= 0.7610, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 4.10, pd= 1.0255, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=120778.92, pd= -4.1650, lock= 15, amb=24582981.556, snr=35.75) L2 (C-P/Y, r= 3.94, pd= -4.0970, lock= 15, snr=18.50) RTCM3 (2011-04-10T22:38:41.01 delay -26310.) Type 1012: ID= 0, Tk= 32231.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=298976.16, pd= 0.4935, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 6.44, pd= 0.2270, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 33267.96, pd= -1.7965, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 3.98, pd= -2.9885, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=439539.06, pd= -44.0590, lock= >937, amb=19186717.312, snr=51.25) L2 (P , r= 5.42, pd= 0.6660, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=107585.64, pd= -2.1825, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=232245.12, pd= -0.6390, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 9.96, pd= 0.2535, lock= >937, snr=40.50) SV= 6, Freq= -4, L1 (C/A, r= 79476.78, pd= 1.2900, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.30, pd= 1.1145, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 24176.14, pd= -0.1740, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.96, pd= 1.3380, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=439902.46, pd= 20.4025, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.08, pd= 1.2990, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.01) Type 1004: ID= 0, TOW=194247.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 74017.20, pd= -1.4915, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 6.98, pd= -1.9140, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 20245.06, pd= 1.8485, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.20, pd= 2.6590, lock= >937, snr=45.00) SV= 18, L1 (C/A , r= 28122.90, pd= 0.6375, lock= >937, amb=21884849.434, snr=48.00) L2 (C-P/Y, r= 5.96, pd= 0.9720, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 37847.00, pd= -4.4890, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 6.22, pd= -4.7865, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=159142.56, pd= -1.8465, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.22, pd= -1.9920, lock= >937, snr=29.75) SV= 15, L1 (C/A , r=225988.36, pd= 1.3920, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.42, pd= 0.2185, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=275389.94, pd= 1.5420, lock= >937, amb=20086094.686, snr=48.75) L2 (C-P/Y, r= 6.66, pd= 2.3975, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=258315.66, pd= 0.1145, lock= >937, amb=24882774.014, snr=37.00) L2 (C-P/Y, r= 7.28, pd= 0.5865, lock= >937, snr=17.75) SV= 19, L1 (C/A , r=262016.98, pd= 2.1095, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.72, pd= 3.0585, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=222426.20, pd= -0.9560, lock= 156, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=284761.98, pd= 0.5685, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 4.04, pd= 0.8330, lock= >937, snr=43.50) SV= 7, L1 (C/A , r=120947.70, pd= -3.5745, lock= 16, amb=24582981.556, snr=35.00) L2 (C-P/Y, r= 4.46, pd= -3.5035, lock= 16, snr=18.50) RTCM3 (2011-04-10T22:38:41.01 delay -26311.) Type 1012: ID= 0, Tk= 32232.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=299324.00, pd= 1.2715, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 6.42, pd= 1.0055, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 33789.14, pd= -2.1150, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 3.28, pd= -3.3085, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=439573.98, pd= -43.7660, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.36, pd= 0.9590, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=107306.18, pd= -2.8045, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=232987.18, pd= -1.5600, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 8.80, pd= -0.6670, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 80022.68, pd= 1.3535, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.72, pd= 1.1790, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 23896.28, pd= -0.0075, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 0.92, pd= 1.5050, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=439384.12, pd= 20.1720, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 5.70, pd= 1.0680, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:41.01) Type 1004: ID= 0, TOW=194248.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 74544.20, pd= -1.4730, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 7.06, pd= -1.8955, lock= >937, snr=25.50) SV= 3, L1 (C/A , r= 20172.56, pd= 1.6015, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.80, pd= 2.4120, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 28348.20, pd= 0.9845, lock= >937, amb=21884849.434, snr=48.00) L2 (C-P/Y, r= 6.52, pd= 1.3190, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 38377.38, pd= -4.5475, lock= >937, amb=21884849.434, snr=50.00) L2 (C-P/Y, r= 6.08, pd= -4.8455, lock= >937, snr=39.25) SV= 30, L1 (C/A , r=159873.12, pd= -1.8820, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.06, pd= -2.0290, lock= >937, snr=29.75) SV= 15, L1 (C/A , r=226061.46, pd= 1.3235, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.64, pd= 0.1530, lock= >937, snr=23.00) SV= 6, L1 (C/A , r=275434.16, pd= 1.1405, lock= >937, amb=20086094.686, snr=49.25) L2 (C-P/Y, r= 6.62, pd= 1.9970, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=258123.16, pd= -0.3460, lock= >937, amb=24882774.014, snr=37.75) L2 (C-P/Y, r= 6.32, pd= 0.1305, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=261615.52, pd= 1.8605, lock= >937, amb=21285264.518, snr=49.25) L2 (C-P/Y, r= 4.32, pd= 2.8100, lock= >937, snr=40.00) SV= 11, L1 (C/A , r=221792.78, pd= -1.6040, lock= 156, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=284598.70, pd= 0.6780, lock= >937, amb=20685679.602, snr=49.00) L2 (C-P/Y, r= 4.16, pd= 0.9420, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=121115.82, pd= -2.2315, lock= 17, amb=24582981.556, snr=35.50) L2 (C-P/Y, r= 6.10, pd= -2.1555, lock= 17, snr=19.00) RTCM3 (2011-04-10T22:38:41.01 delay -26312.) Type 1012: ID= 0, Tk= 32233.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=299672.98, pd= 1.0320, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 6.50, pd= 0.7670, lock= >937, snr=42.50) SV= 21, Freq= 4, L1 (C/A, r= 34309.80, pd= -1.8715, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 3.92, pd= -3.0640, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439609.42, pd= -43.9270, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 6.12, pd= 0.7990, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=107026.58, pd= -3.1560, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=233728.82, pd= -2.0540, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 8.12, pd= -1.1605, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 80569.14, pd= 0.9640, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.42, pd= 0.7885, lock= >937, snr=45.25) SV= 7, Freq= 5, L1 (C/A, r= 23616.82, pd= -0.0845, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 0.86, pd= 1.4275, lock= >937, snr=46.00) SV= 23, Freq= 3, L1 (C/A, r=438864.92, pd= 20.8105, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.32, pd= 1.7080, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.01) Type 1004: ID= 0, TOW=194249.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 75070.78, pd= -0.9960, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 7.32, pd= -1.4150, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 20099.72, pd= 1.8200, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.68, pd= 2.6305, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 28574.08, pd= 0.8810, lock= >937, amb=21884849.434, snr=47.00) L2 (C-P/Y, r= 6.06, pd= 1.2135, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 38907.64, pd= -4.3775, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.30, pd= -4.6760, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=160603.44, pd= -1.6140, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.40, pd= -1.7615, lock= >937, snr=30.00) SV= 15, L1 (C/A , r=226134.84, pd= 1.1150, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.14, pd= -0.0560, lock= >937, snr=23.75) SV= 6, L1 (C/A , r=275477.66, pd= 1.5575, lock= >937, amb=20086094.686, snr=49.25) L2 (C-P/Y, r= 6.80, pd= 2.4150, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=257930.64, pd= -0.6300, lock= >937, amb=24882774.014, snr=38.00) L2 (C-P/Y, r= 6.44, pd= -0.1515, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=261213.92, pd= 1.8215, lock= >937, amb=21285264.518, snr=49.00) L2 (C-P/Y, r= 4.48, pd= 2.7700, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=221158.38, pd= -1.2245, lock= 160, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=284435.38, pd= 0.9690, lock= >937, amb=20685679.602, snr=49.25) L2 (C-P/Y, r= 4.06, pd= 1.2345, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=121285.46, pd= -2.2855, lock= 18, amb=24582981.556, snr=34.50) L2 (C-P/Y, r= 6.16, pd= -2.2030, lock= 18, snr=20.00) RTCM3 (2011-04-10T22:38:41.01 delay -26313.) Type 1012: ID= 0, Tk= 32234.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=300020.66, pd= 2.2570, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 7.18, pd= 1.9930, lock= >937, snr=42.25) SV= 21, Freq= 4, L1 (C/A, r= 34830.08, pd= -1.1780, lock= >937, amb=22184641.892, snr=39.75) L2 (P , r= 4.76, pd= -2.3715, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=439644.94, pd= -44.0610, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.22, pd= 0.6630, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=106746.44, pd= -2.7900, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=234471.54, pd= -3.5760, lock= >937, amb=23383811.724, snr=34.25) L2 (P , r= 7.06, pd= -2.6835, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 81115.42, pd= 0.9030, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.24, pd= 0.7270, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 23337.48, pd= -0.0915, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 0.76, pd= 1.4215, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=438346.26, pd= 20.9595, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 7.28, pd= 1.8575, lock= >937, snr=44.50) RTCM3 (2011-04-10T22:38:41.01) Type 1033: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' Receiver Type='TRIMBLE NETR5', Firmware='', Serial='' RTCM3 (2011-04-10T22:38:41.01) Type 1004: ID= 0, TOW=194250.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 75598.50, pd= -1.6720, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 7.08, pd= -2.0930, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 20027.32, pd= 1.6695, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.46, pd= 2.4805, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 28799.86, pd= 0.9530, lock= >937, amb=21884849.434, snr=47.50) L2 (C-P/Y, r= 6.16, pd= 1.2850, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 39438.24, pd= -4.4970, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.98, pd= -4.7945, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=161334.00, pd= -1.5835, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.52, pd= -1.7310, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=226207.82, pd= 1.3930, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.98, pd= 0.2225, lock= >937, snr=23.50) SV= 6, L1 (C/A , r=275521.70, pd= 1.4885, lock= >937, amb=20086094.686, snr=49.75) L2 (C-P/Y, r= 6.66, pd= 2.3455, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=257737.36, pd= -0.0760, lock= >937, amb=24882774.014, snr=38.25) L2 (C-P/Y, r= 6.42, pd= 0.3960, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=260812.32, pd= 1.8100, lock= >937, amb=21285264.518, snr=48.75) L2 (C-P/Y, r= 4.62, pd= 2.7580, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=220523.96, pd= -0.8550, lock= 160, amb=24882774.014, snr=33.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=284272.50, pd= 0.9110, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 4.06, pd= 1.1760, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=121454.32, pd= -1.4725, lock= 19, amb=24582981.556, snr=34.75) L2 (C-P/Y, r= 7.00, pd= -1.3925, lock= 19, snr=19.50) RTCM3 (2011-04-10T22:38:41.01 delay -26314.) Type 1012: ID= 0, Tk= 32235.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=300370.30, pd= 1.6305, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 6.52, pd= 1.3660, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 35351.14, pd= -1.2300, lock= >937, amb=22184641.892, snr=39.75) L2 (P , r= 4.74, pd= -2.4235, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439680.88, pd= -44.5645, lock= >937, amb=19186717.312, snr=50.25) L2 (P , r= 4.96, pd= 0.1600, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=106466.96, pd= -2.9585, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=235211.86, pd= -2.6950, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 7.82, pd= -1.8030, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 81661.70, pd= 0.9340, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.22, pd= 0.7575, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 23058.42, pd= -0.2460, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 0.74, pd= 1.2670, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=437827.48, pd= 21.2305, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 7.36, pd= 2.1295, lock= >937, snr=44.75) RTCM3 (2011-04-10T22:38:41.01) Type 1008: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' RTCM3 (2011-04-10T22:38:41.01) Type 1004: ID= 0, TOW=194251.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 76125.06, pd= -1.1670, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 7.00, pd= -1.5895, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 19954.90, pd= 1.6405, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.68, pd= 2.4505, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 29025.98, pd= 0.7905, lock= >937, amb=21884849.434, snr=48.25) L2 (C-P/Y, r= 5.90, pd= 1.1230, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 39968.52, pd= -4.2130, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.44, pd= -4.5115, lock= >937, snr=38.50) SV= 30, L1 (C/A , r=162064.74, pd= -1.6960, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.44, pd= -1.8425, lock= >937, snr=29.75) SV= 15, L1 (C/A , r=226281.42, pd= 1.1685, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.36, pd= -0.0020, lock= >937, snr=22.00) SV= 6, L1 (C/A , r=275565.70, pd= 1.5425, lock= >937, amb=20086094.686, snr=49.75) L2 (C-P/Y, r= 6.80, pd= 2.3985, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=257544.46, pd= 0.2225, lock= >937, amb=24882774.014, snr=38.50) L2 (C-P/Y, r= 6.76, pd= 0.7005, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=260410.78, pd= 1.7855, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.44, pd= 2.7350, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=219890.46, pd= -1.3760, lock= 160, amb=24882774.014, snr=34.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=284109.78, pd= 0.8105, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 4.20, pd= 1.0760, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=121623.46, pd= -0.8400, lock= 20, amb=24582981.556, snr=33.00) L2 (C-P/Y, r= 7.68, pd= -0.7615, lock= 20, snr=20.00) RTCM3 (2011-04-10T22:38:41.01 delay -26315.) Type 1012: ID= 0, Tk= 32236.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=300720.72, pd= 0.3710, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 5.38, pd= 0.1050, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 35872.30, pd= -1.3375, lock= >937, amb=22184641.892, snr=39.75) L2 (P , r= 4.94, pd= -2.5335, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=439716.18, pd= -44.3440, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 4.96, pd= 0.3805, lock= >937, snr=51.50) SV= 14, Freq= -7, L1 (C/A, r=106186.84, pd= -2.3415, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=235953.38, pd= -2.9840, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 7.02, pd= -2.0920, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 82208.00, pd= 1.0740, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.14, pd= 0.8980, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 22779.56, pd= -0.4335, lock= >937, amb=19786302.228, snr=44.25) L2 (P , r= 0.76, pd= 1.0795, lock= >937, snr=44.75) SV= 23, Freq= 3, L1 (C/A, r=437309.94, pd= 20.2950, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.46, pd= 1.1940, lock= >937, snr=44.50) RTCM3 (2011-04-10T22:38:41.01) Type 1006: ID= 0, Year=0, GPS=Y, GLONASS=Y, Galileo=N, X= 4581694.6288, Y= 556114.3725, Z= 4389358.4678 QC=1(no bias), height=0.0349 RTCM3 (2011-04-10T22:38:41.01) Type 1004: ID= 0, TOW=194252.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 76652.60, pd= -1.6355, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 6.58, pd= -2.0610, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 19882.26, pd= 1.9230, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.84, pd= 2.7330, lock= >937, snr=44.25) SV= 18, L1 (C/A , r= 29252.28, pd= 0.5490, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 5.80, pd= 0.8810, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 40499.28, pd= -4.3340, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 5.90, pd= -4.6315, lock= >937, snr=38.50) SV= 30, L1 (C/A , r=162795.34, pd= -1.6420, lock= >937, amb=23084019.266, snr=43.75) L2 (C-P/Y, r= 7.46, pd= -1.7885, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=226355.22, pd= 0.8455, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.06, pd= -0.3275, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=275610.00, pd= 1.3755, lock= >937, amb=20086094.686, snr=50.00) L2 (C-P/Y, r= 6.70, pd= 2.2315, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=257352.86, pd= -0.6675, lock= >937, amb=24882774.014, snr=39.00) L2 (C-P/Y, r= 6.38, pd= -0.1910, lock= >937, snr=17.75) SV= 19, L1 (C/A , r=260009.56, pd= 1.4860, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.20, pd= 2.4340, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=219255.66, pd= -0.5945, lock= 160, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=283947.24, pd= 0.6425, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 3.96, pd= 0.9075, lock= >937, snr=43.75) SV= 7, L1 (C/A , r=121791.82, pd= 0.6840, lock= 21, amb=24582981.556, snr=31.25) L2 (C-P/Y, r= 9.06, pd= 0.7560, lock= 21, snr=19.00) RTCM3 (2011-04-10T22:38:41.01 delay -26316.) Type 1012: ID= 0, Tk= 32237.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=301068.50, pd= 1.8835, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 6.66, pd= 1.6175, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 36394.38, pd= -2.3150, lock= >937, amb=22184641.892, snr=39.75) L2 (P , r= 3.96, pd= -3.5105, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=439751.22, pd= -43.7910, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.78, pd= 0.9335, lock= >937, snr=51.75) SV= 14, Freq= -7, L1 (C/A, r=105908.42, pd= -3.2795, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=236694.68, pd= -3.0455, lock= >937, amb=23383811.724, snr=34.25) L2 (P , r= 7.68, pd= -2.1545, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 82753.74, pd= 1.8845, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 6.32, pd= 1.7075, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 22500.70, pd= -0.4750, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 0.60, pd= 1.0380, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=436791.80, pd= 19.9820, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.00, pd= 0.8805, lock= >937, snr=44.50) RTCM3 (2011-04-10T22:38:41.01) Type 1013: ID= 0, MJD=55621, SOD=21437, Num= 6, Leap=15 ID=1004, Sync=1, Interval= 1.0 ID=1006, Sync=1, Interval= 10.0 ID=1008, Sync=1, Interval= 10.0 ID=1012, Sync=1, Interval= 1.0 ID=1013, Sync=1, Interval= 10.0 ID=1033, Sync=1, Interval= 10.0 RTCM3 (2011-04-10T22:38:41.01) Type 1004: ID= 0, TOW=194253.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 77179.74, pd= -1.6950, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 6.82, pd= -2.1215, lock= >937, snr=24.25) SV= 3, L1 (C/A , r= 19810.34, pd= 1.5775, lock= >937, amb=19786302.228, snr=53.75) L2 (C-P/Y, r= 6.42, pd= 2.3870, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 29478.04, pd= 0.9405, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 6.44, pd= 1.2730, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 41030.42, pd= -4.7625, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.78, pd= -5.0615, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=163526.00, pd= -1.6205, lock= >937, amb=23084019.266, snr=43.50) L2 (C-P/Y, r= 7.38, pd= -1.7685, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=226428.60, pd= 1.0495, lock= >937, amb=24882774.014, snr=40.50) L2 (C-P/Y, r= 7.32, pd= -0.1240, lock= >937, snr=23.00) SV= 6, L1 (C/A , r=275654.54, pd= 1.0405, lock= >937, amb=20086094.686, snr=49.00) L2 (C-P/Y, r= 6.38, pd= 1.8970, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=257160.34, pd= -0.5210, lock= >937, amb=24882774.014, snr=39.25) L2 (C-P/Y, r= 5.78, pd= -0.0455, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=259607.84, pd= 1.7300, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.40, pd= 2.6775, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=218622.10, pd= -1.0540, lock= 164, amb=24882774.014, snr=33.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=283784.64, pd= 0.6455, lock= >937, amb=20685679.602, snr=49.25) L2 (C-P/Y, r= 3.76, pd= 0.9105, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=121961.98, pd= 0.4985, lock= 22, amb=24582981.556, snr=29.00) L2 (C-P/Y, r= 8.62, pd= 0.5695, lock= 22, snr=19.25) RTCM3 (2011-04-10T22:38:41.02 delay -26317.) Type 1012: ID= 0, Tk= 32238.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=301417.88, pd= 1.9265, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 6.40, pd= 1.6610, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 36915.76, pd= -2.5515, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 3.34, pd= -3.7475, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=439787.64, pd= -44.5490, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.12, pd= 0.1755, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=105628.94, pd= -3.0080, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=237435.72, pd= -2.8415, lock= >937, amb=23383811.724, snr=34.00) L2 (P , r= 7.66, pd= -1.9515, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 83301.42, pd= 0.8745, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 4.98, pd= 0.6960, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 22221.90, pd= -0.4285, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.58, pd= 1.0845, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=436272.84, pd= 20.5130, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.62, pd= 1.4110, lock= >937, snr=44.50) RTCM3 (2011-04-10T22:38:41.02) Type 1004: ID= 0, TOW=194254.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 77707.30, pd= -2.1260, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 6.34, pd= -2.5535, lock= >937, snr=25.75) SV= 3, L1 (C/A , r= 19737.90, pd= 1.8825, lock= >937, amb=19786302.228, snr=53.75) L2 (C-P/Y, r= 6.74, pd= 2.6930, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 29704.44, pd= 0.8325, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 5.90, pd= 1.1645, lock= >937, snr=37.75) SV= 16, L1 (C/A , r= 41561.08, pd= -4.5995, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 5.74, pd= -4.8985, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=164256.16, pd= -1.0365, lock= >937, amb=23084019.266, snr=43.75) L2 (C-P/Y, r= 8.32, pd= -1.1845, lock= >937, snr=28.75) SV= 15, L1 (C/A , r=226502.00, pd= 1.3790, lock= >937, amb=24882774.014, snr=40.75) L2 (C-P/Y, r= 7.42, pd= 0.2095, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=275698.56, pd= 1.3360, lock= >937, amb=20086094.686, snr=48.75) L2 (C-P/Y, r= 7.04, pd= 2.1915, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=256968.36, pd= -0.7760, lock= >937, amb=24882774.014, snr=39.50) L2 (C-P/Y, r= 5.66, pd= -0.3055, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=259206.82, pd= 1.3525, lock= >937, amb=21285264.518, snr=49.00) L2 (C-P/Y, r= 3.86, pd= 2.3000, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=217988.20, pd= -1.1170, lock= 164, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=283622.30, pd= 0.5380, lock= >937, amb=20685679.602, snr=48.75) L2 (C-P/Y, r= 3.78, pd= 0.8035, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=122132.10, pd= 0.4990, lock= 23, amb=24582981.556, snr=29.75) L2 (C-P/Y, r= 9.50, pd= 0.5625, lock= 23, snr=18.50) RTCM3 (2011-04-10T22:38:41.02 delay -26318.) Type 1012: ID= 0, Tk= 32239.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=301768.28, pd= 1.1210, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.10, pd= 0.8530, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 37436.72, pd= -2.2805, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 3.84, pd= -3.4760, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439823.08, pd= -44.2120, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.86, pd= 0.5130, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=105348.20, pd= -1.2900, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=238177.12, pd= -2.9370, lock= >937, amb=23383811.724, snr=34.50) L2 (P , r= 6.62, pd= -2.0450, lock= >937, snr=39.00) SV= 6, Freq= -4, L1 (C/A, r= 83847.84, pd= 1.2740, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.42, pd= 1.0955, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 21942.90, pd= 0.0070, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.24, pd= 1.5210, lock= >937, snr=44.75) SV= 23, Freq= 3, L1 (C/A, r=435754.54, pd= 20.4485, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.66, pd= 1.3465, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.02) Type 1004: ID= 0, TOW=194255.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 78234.10, pd= -1.7910, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 6.30, pd= -2.2175, lock= >937, snr=25.00) SV= 3, L1 (C/A , r= 19666.02, pd= 1.7215, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.74, pd= 2.5310, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 29931.02, pd= 0.6445, lock= >937, amb=21884849.434, snr=47.75) L2 (C-P/Y, r= 6.14, pd= 0.9755, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 42091.76, pd= -4.3800, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.54, pd= -4.6800, lock= >937, snr=39.25) SV= 30, L1 (C/A , r=164987.50, pd= -1.5975, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.50, pd= -1.7465, lock= >937, snr=29.75) SV= 15, L1 (C/A , r=226575.74, pd= 1.4820, lock= >937, amb=24882774.014, snr=40.75) L2 (C-P/Y, r= 7.68, pd= 0.3130, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=275742.96, pd= 1.3330, lock= >937, amb=20086094.686, snr=48.75) L2 (C-P/Y, r= 6.88, pd= 2.1885, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=256776.42, pd= -0.9480, lock= >937, amb=24882774.014, snr=39.50) L2 (C-P/Y, r= 5.30, pd= -0.4815, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=258804.92, pd= 1.9020, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.48, pd= 2.8505, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=217354.16, pd= -1.0290, lock= 164, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=283459.76, pd= 0.7400, lock= >937, amb=20685679.602, snr=48.75) L2 (C-P/Y, r= 4.12, pd= 1.0045, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=122302.30, pd= 0.5305, lock= 24, amb=24582981.556, snr=31.50) L2 (C-P/Y, r= 9.00, pd= 0.5870, lock= 24, snr=19.25) RTCM3 (2011-04-10T22:38:41.02 delay -26319.) Type 1012: ID= 0, Tk= 32240.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=302119.16, pd= -0.0270, lock= >937, amb=22184641.892, snr=41.75) L2 (P , r= 5.12, pd= -0.2950, lock= >937, snr=41.00) SV= 21, Freq= 4, L1 (C/A, r= 37957.62, pd= -1.9015, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.20, pd= -3.0990, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=439859.04, pd= -44.3220, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.36, pd= 0.4030, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=105071.18, pd= -3.1465, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=238920.44, pd= -4.9100, lock= >937, amb=23383811.724, snr=34.50) L2 (P , r= 5.10, pd= -4.0180, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 84394.74, pd= 1.3205, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.42, pd= 1.1405, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 21664.54, pd= -0.0385, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.00, pd= 1.4735, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=435236.28, pd= 20.3655, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.36, pd= 1.2625, lock= >937, snr=44.50) RTCM3 (2011-04-10T22:38:41.02) Type 1004: ID= 0, TOW=194256.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 78761.26, pd= -1.8155, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 6.60, pd= -2.2415, lock= >937, snr=26.00) SV= 3, L1 (C/A , r= 19593.96, pd= 1.8245, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.54, pd= 2.6345, lock= >937, snr=45.00) SV= 18, L1 (C/A , r= 30157.52, pd= 0.6310, lock= >937, amb=21884849.434, snr=48.00) L2 (C-P/Y, r= 6.20, pd= 0.9620, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 42623.04, pd= -4.6935, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.78, pd= -4.9925, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=165718.12, pd= -1.4275, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.88, pd= -1.5780, lock= >937, snr=28.50) SV= 15, L1 (C/A , r=226650.18, pd= 0.9815, lock= >937, amb=24882774.014, snr=40.25) L2 (C-P/Y, r= 7.02, pd= -0.1870, lock= >937, snr=23.00) SV= 6, L1 (C/A , r=275787.28, pd= 1.4725, lock= >937, amb=20086094.686, snr=49.00) L2 (C-P/Y, r= 6.52, pd= 2.3275, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=256583.96, pd= -0.5045, lock= >937, amb=24882774.014, snr=39.50) L2 (C-P/Y, r= 5.64, pd= -0.0400, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=258403.88, pd= 1.6260, lock= >937, amb=21285264.518, snr=47.50) L2 (C-P/Y, r= 3.92, pd= 2.5740, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=216720.54, pd= -1.3590, lock= 164, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=283297.58, pd= 0.6870, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 4.08, pd= 0.9525, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=122474.20, pd= -1.0595, lock= 24, amb=24582981.556, snr=31.50) L2 (C-P/Y, r= 7.72, pd= -1.0095, lock= 24, snr=19.25) RTCM3 (2011-04-10T22:38:41.02 delay -26320.) Type 1012: ID= 0, Tk= 32241.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=302468.84, pd= 0.1465, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 5.50, pd= -0.1205, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 38478.98, pd= -1.9555, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.10, pd= -3.1540, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=439894.42, pd= -43.7840, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.58, pd= 0.9410, lock= >937, snr=51.50) SV= 14, Freq= -7, L1 (C/A, r=104791.12, pd= -1.8385, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=239661.48, pd= -4.6120, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 5.24, pd= -3.7190, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 84942.18, pd= 0.9290, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 5.08, pd= 0.7505, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 21386.46, pd= -0.2170, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.84, pd= 1.2960, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=434718.00, pd= 20.3175, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.18, pd= 1.2155, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.02) Type 1004: ID= 0, TOW=194257.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 79288.40, pd= -1.8145, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 7.04, pd= -2.2415, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 19522.14, pd= 1.7745, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.76, pd= 2.5830, lock= >937, snr=45.00) SV= 18, L1 (C/A , r= 30383.76, pd= 0.9585, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 6.36, pd= 1.2900, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 43153.78, pd= -4.3995, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 6.14, pd= -4.6995, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=166449.08, pd= -1.5770, lock= >937, amb=23084019.266, snr=42.25) L2 (C-P/Y, r= 7.70, pd= -1.7265, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=226723.64, pd= 1.5500, lock= >937, amb=24882774.014, snr=40.50) L2 (C-P/Y, r= 7.64, pd= 0.3805, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=275832.00, pd= 1.2805, lock= >937, amb=20086094.686, snr=49.00) L2 (C-P/Y, r= 6.82, pd= 2.1370, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=256392.58, pd= -1.0255, lock= >937, amb=24882774.014, snr=39.75) L2 (C-P/Y, r= 4.86, pd= -0.5570, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=258002.38, pd= 1.8450, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.62, pd= 2.7930, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=216086.26, pd= -1.0530, lock= 168, amb=24882774.014, snr=32.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=283135.56, pd= 0.5765, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 4.04, pd= 0.8405, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=122643.98, pd= -0.4385, lock= 26, amb=24582981.556, snr=31.75) L2 (C-P/Y, r= 8.50, pd= -0.3900, lock= 26, snr=19.75) RTCM3 (2011-04-10T22:38:41.02 delay -26321.) Type 1012: ID= 0, Tk= 32242.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=302818.04, pd= 0.9205, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 5.28, pd= 0.6555, lock= >937, snr=41.25) SV= 21, Freq= 4, L1 (C/A, r= 39000.52, pd= -2.1380, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 3.72, pd= -3.3360, lock= >937, snr=41.50) SV= 22, Freq= -3, L1 (C/A, r=439930.18, pd= -43.5620, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.78, pd= 1.1615, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=104512.48, pd= -1.8115, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=240402.00, pd= -3.7940, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 6.72, pd= -2.9005, lock= >937, snr=39.00) SV= 6, Freq= -4, L1 (C/A, r= 85488.48, pd= 1.7880, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.82, pd= 1.6080, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 21108.14, pd= -0.0070, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 1.02, pd= 1.5055, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=434199.54, pd= 20.4670, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.26, pd= 1.3635, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.02) Type 1004: ID= 0, TOW=194258.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 79815.74, pd= -1.9855, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 6.68, pd= -2.4145, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 19450.38, pd= 1.7755, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.58, pd= 2.5855, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 30610.54, pd= 0.8700, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 6.12, pd= 1.2020, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 43684.96, pd= -4.4515, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.88, pd= -4.7510, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=167180.26, pd= -1.9000, lock= >937, amb=23084019.266, snr=42.25) L2 (C-P/Y, r= 7.18, pd= -2.0515, lock= >937, snr=28.25) SV= 15, L1 (C/A , r=226798.56, pd= 0.7960, lock= >937, amb=24882774.014, snr=40.75) L2 (C-P/Y, r= 7.28, pd= -0.3720, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=275876.44, pd= 1.4660, lock= >937, amb=20086094.686, snr=49.25) L2 (C-P/Y, r= 7.04, pd= 2.3225, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=256200.88, pd= -1.1030, lock= >937, amb=24882774.014, snr=40.00) L2 (C-P/Y, r= 5.26, pd= -0.6395, lock= >937, snr=17.75) SV= 19, L1 (C/A , r=257601.00, pd= 2.0110, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.24, pd= 2.9600, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=215451.84, pd= -0.5455, lock= 168, amb=24882774.014, snr=32.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=282973.44, pd= 0.7020, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 4.04, pd= 0.9660, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=122814.10, pd= -0.0365, lock= 26, amb=24582981.556, snr=31.75) L2 (C-P/Y, r= 9.14, pd= 0.0070, lock= 26, snr=19.50) RTCM3 (2011-04-10T22:38:41.02 delay -26322.) Type 1012: ID= 0, Tk= 32243.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=303168.54, pd= 0.5575, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 5.74, pd= 0.2905, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 39521.12, pd= -1.3260, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.66, pd= -2.5250, lock= >937, snr=41.25) SV= 22, Freq= -3, L1 (C/A, r=439966.70, pd= -44.0045, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.64, pd= 0.7195, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=104235.12, pd= -2.8965, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=241143.82, pd= -4.2170, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 5.80, pd= -3.3255, lock= >937, snr=39.00) SV= 6, Freq= -4, L1 (C/A, r= 86036.58, pd= 0.9910, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 5.38, pd= 0.8115, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 20830.48, pd= -0.2755, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 1.08, pd= 1.2380, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=433681.02, pd= 20.7210, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.26, pd= 1.6185, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.02) Type 1004: ID= 0, TOW=194259.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 80342.68, pd= -1.7690, lock= >937, amb=23983396.640, snr=40.25) L2 (C-P/Y, r= 6.80, pd= -2.1990, lock= >937, snr=23.75) SV= 3, L1 (C/A , r= 19378.68, pd= 1.7930, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.64, pd= 2.6025, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 30837.28, pd= 0.9025, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.02, pd= 1.2345, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 44216.16, pd= -4.4720, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.12, pd= -4.7700, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=167911.08, pd= -1.8515, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.48, pd= -2.0045, lock= >937, snr=28.75) SV= 15, L1 (C/A , r=226872.36, pd= 1.2500, lock= >937, amb=24882774.014, snr=41.00) L2 (C-P/Y, r= 7.38, pd= 0.0795, lock= >937, snr=22.00) SV= 6, L1 (C/A , r=275921.30, pd= 1.2830, lock= >937, amb=20086094.686, snr=49.00) L2 (C-P/Y, r= 6.58, pd= 2.1390, lock= >937, snr=44.75) SV= 8, L1 (C/A , r=256008.80, pd= -0.7025, lock= >937, amb=24882774.014, snr=39.75) L2 (C-P/Y, r= 4.88, pd= -0.2320, lock= >937, snr=18.25) SV= 19, L1 (C/A , r=257199.72, pd= 2.1005, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 5.02, pd= 3.0480, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=214818.06, pd= -0.7030, lock= 168, amb=24882774.014, snr=32.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=282811.32, pd= 0.9155, lock= >937, amb=20685679.602, snr=48.75) L2 (C-P/Y, r= 4.48, pd= 1.1805, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=122984.88, pd= -0.1820, lock= 28, amb=24582981.556, snr=31.00) L2 (C-P/Y, r= 8.82, pd= -0.1360, lock= 28, snr=19.00) RTCM3 (2011-04-10T22:38:41.02 delay -26323.) Type 1012: ID= 0, Tk= 32244.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=303520.10, pd= -0.7575, lock= >937, amb=22184641.892, snr=42.50) L2 (P , r= 4.22, pd= -1.0250, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 40044.14, pd= -2.8980, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 3.16, pd= -4.0970, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=440003.08, pd= -44.2485, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.70, pd= 0.4750, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=103956.16, pd= -2.2515, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=241885.02, pd= -4.0325, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 6.10, pd= -3.1405, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 86583.36, pd= 1.6080, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 6.08, pd= 1.4285, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 20552.88, pd= -0.4645, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.60, pd= 1.0480, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=433162.70, pd= 20.7840, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.48, pd= 1.6810, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.02) Type 1033: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' Receiver Type='TRIMBLE NETR5', Firmware='', Serial='' RTCM3 (2011-04-10T22:38:41.02) Type 1004: ID= 0, TOW=194260.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 80870.00, pd= -1.9275, lock= >937, amb=23983396.640, snr=40.00) L2 (C-P/Y, r= 6.88, pd= -2.3595, lock= >937, snr=24.75) SV= 3, L1 (C/A , r= 19306.92, pd= 1.9540, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.54, pd= 2.7630, lock= >937, snr=44.25) SV= 18, L1 (C/A , r= 31064.30, pd= 0.7400, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.04, pd= 1.0715, lock= >937, snr=37.75) SV= 16, L1 (C/A , r= 44747.40, pd= -4.4610, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.34, pd= -4.7600, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=168641.62, pd= -1.5075, lock= >937, amb=23084019.266, snr=43.50) L2 (C-P/Y, r= 7.98, pd= -1.6605, lock= >937, snr=28.00) SV= 15, L1 (C/A , r=226946.98, pd= 0.9805, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.22, pd= -0.1875, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=275965.76, pd= 1.5700, lock= >937, amb=20086094.686, snr=49.25) L2 (C-P/Y, r= 6.90, pd= 2.4255, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=255816.80, pd= -0.2810, lock= >937, amb=24882774.014, snr=39.00) L2 (C-P/Y, r= 5.88, pd= 0.1895, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=256799.12, pd= 1.5455, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.42, pd= 2.4935, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=214184.68, pd= -1.2650, lock= 168, amb=24882774.014, snr=33.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=282649.64, pd= 0.7920, lock= >937, amb=20685679.602, snr=49.00) L2 (C-P/Y, r= 4.12, pd= 1.0570, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=123156.04, pd= -0.6565, lock= 28, amb=24582981.556, snr=31.50) L2 (C-P/Y, r= 8.22, pd= -0.6120, lock= 28, snr=19.50) RTCM3 (2011-04-10T22:38:41.02 delay -26324.) Type 1012: ID= 0, Tk= 32245.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=303869.78, pd= -0.0620, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 5.18, pd= -0.3290, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 40564.72, pd= -2.0035, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.52, pd= -3.2045, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=440039.24, pd= -44.2115, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.70, pd= 0.5110, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r=103678.06, pd= -2.3325, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=242625.48, pd= -3.0910, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 7.16, pd= -2.1995, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 87131.28, pd= 1.1900, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 5.12, pd= 1.0090, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 20274.86, pd= -0.1020, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.34, pd= 1.4105, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=432644.36, pd= 20.8805, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.66, pd= 1.7780, lock= >937, snr=44.50) RTCM3 (2011-04-10T22:38:41.02) Type 1008: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' RTCM3 (2011-04-10T22:38:41.03) Type 1004: ID= 0, TOW=194261.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 81396.74, pd= -1.4710, lock= >937, amb=23983396.640, snr=40.25) L2 (C-P/Y, r= 7.26, pd= -1.9030, lock= >937, snr=23.50) SV= 3, L1 (C/A , r= 19235.50, pd= 1.8985, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.64, pd= 2.7080, lock= >937, snr=44.25) SV= 18, L1 (C/A , r= 31291.22, pd= 0.8120, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.06, pd= 1.1425, lock= >937, snr=38.00) SV= 16, L1 (C/A , r= 45278.68, pd= -4.3850, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.24, pd= -4.6840, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=169372.76, pd= -1.7030, lock= >937, amb=23084019.266, snr=44.00) L2 (C-P/Y, r= 7.32, pd= -1.8555, lock= >937, snr=28.75) SV= 15, L1 (C/A , r=227020.96, pd= 1.4920, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.84, pd= 0.3225, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=276010.68, pd= 1.4990, lock= >937, amb=20086094.686, snr=49.75) L2 (C-P/Y, r= 6.92, pd= 2.3530, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=255626.18, pd= -1.0945, lock= >937, amb=24882774.014, snr=39.50) L2 (C-P/Y, r= 5.24, pd= -0.6315, lock= >937, snr=15.50) SV= 19, L1 (C/A , r=256397.72, pd= 1.8670, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.84, pd= 2.8160, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=213550.64, pd= -1.1265, lock= 168, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=282487.92, pd= 0.8525, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 4.16, pd= 1.1175, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=123326.64, pd= -0.4240, lock= 30, amb=24582981.556, snr=32.00) L2 (C-P/Y, r= 8.88, pd= -0.3775, lock= 30, snr=18.50) RTCM3 (2011-04-10T22:38:41.03 delay -26325.) Type 1012: ID= 0, Tk= 32246.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=304220.58, pd= -0.3255, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 4.26, pd= -0.5935, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 41087.12, pd= -2.8450, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 3.16, pd= -4.0455, lock= >937, snr=40.50) SV= 22, Freq= -3, L1 (C/A, r=440075.66, pd= -44.3275, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.42, pd= 0.3960, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r=103399.88, pd= -2.1545, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=243367.90, pd= -4.0615, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 6.12, pd= -3.1700, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 87678.86, pd= 1.2575, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 5.76, pd= 1.0765, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 19997.30, pd= -0.0215, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.28, pd= 1.4905, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=432126.26, pd= 20.7990, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.44, pd= 1.6975, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.03) Type 1006: ID= 0, Year=0, GPS=Y, GLONASS=Y, Galileo=N, X= 4581694.6288, Y= 556114.3725, Z= 4389358.4678 QC=1(no bias), height=0.0349 RTCM3 (2011-04-10T22:38:41.03) Type 1004: ID= 0, TOW=194262.000, More Data=Yes, GPS-Sats=11, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 81924.22, pd= -1.7305, lock= >937, amb=23983396.640, snr=40.00) L2 (C-P/Y, r= 7.24, pd= -2.1640, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 19164.10, pd= 1.9220, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 7.00, pd= 2.7310, lock= >937, snr=44.25) SV= 18, L1 (C/A , r= 31518.50, pd= 0.6245, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.62, pd= 0.9545, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 45810.04, pd= -4.3100, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 6.36, pd= -4.6100, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=170103.44, pd= -1.4070, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.52, pd= -1.5605, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=227095.92, pd= 1.1380, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.26, pd= -0.0310, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=276055.90, pd= 1.2120, lock= >937, amb=20086094.686, snr=50.25) L2 (C-P/Y, r= 6.64, pd= 2.0675, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=255434.32, pd= -0.5475, lock= >937, amb=24882774.014, snr=39.25) L2 (C-P/Y, r= 5.56, pd= -0.0880, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=255996.80, pd= 1.7555, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.48, pd= 2.7030, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=212915.86, pd= -0.2380, lock= 168, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=282326.48, pd= 0.7520, lock= >937, amb=20685679.602, snr=50.00) L2 (C-P/Y, r= 3.86, pd= 1.0160, lock= >937, snr=44.50) RTCM3 (2011-04-10T22:38:41.03 delay -26326.) Type 1012: ID= 0, Tk= 32247.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=304570.70, pd= 0.2270, lock= >937, amb=22184641.892, snr=42.25) L2 (P , r= 5.44, pd= -0.0420, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 41607.58, pd= -1.6980, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 4.46, pd= -2.8995, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440112.10, pd= -44.3870, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.60, pd= 0.3370, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=103121.82, pd= -1.9545, lock= >937, amb=23383811.724, snr=37.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=244108.56, pd= -3.2480, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 6.68, pd= -2.3550, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 88227.26, pd= 0.6315, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.34, pd= 0.4500, lock= >937, snr=44.25) SV= 7, Freq= 5, L1 (C/A, r= 19720.48, pd= -0.5205, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 0.32, pd= 0.9930, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=431607.96, pd= 20.9390, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 7.02, pd= 1.8365, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:41.03) Type 1013: ID= 0, MJD=55621, SOD=21447, Num= 6, Leap=15 ID=1004, Sync=1, Interval= 1.0 ID=1006, Sync=1, Interval= 10.0 ID=1008, Sync=1, Interval= 10.0 ID=1012, Sync=1, Interval= 1.0 ID=1013, Sync=1, Interval= 10.0 ID=1033, Sync=1, Interval= 10.0 RTCM3 (2011-04-10T22:38:41.03) Type 1004: ID= 0, TOW=194263.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 82451.28, pd= -1.5995, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 7.46, pd= -2.0350, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 19092.88, pd= 1.8285, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.80, pd= 2.6375, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 31745.68, pd= 0.6055, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 5.86, pd= 0.9345, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 46341.62, pd= -4.4130, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.80, pd= -4.7140, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=170834.44, pd= -1.4400, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.50, pd= -1.5930, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=227170.92, pd= 0.8160, lock= >937, amb=24882774.014, snr=41.50) L2 (C-P/Y, r= 7.02, pd= -0.3540, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=276100.52, pd= 1.5665, lock= >937, amb=20086094.686, snr=50.25) L2 (C-P/Y, r= 6.90, pd= 2.4210, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=255243.64, pd= -1.1035, lock= >937, amb=24882774.014, snr=39.75) L2 (C-P/Y, r= 4.90, pd= -0.6460, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=255595.78, pd= 1.7575, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.74, pd= 2.7060, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=212281.86, pd= -0.1410, lock= 168, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=282165.08, pd= 0.6875, lock= >937, amb=20685679.602, snr=50.00) L2 (C-P/Y, r= 4.22, pd= 0.9515, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=123669.28, pd= 0.0265, lock= 0, amb=24582981.556, snr=32.50) L2 (C-P/Y, r= 8.00, pd= -0.0990, lock= 0, snr=19.50) RTCM3 (2011-04-10T22:38:41.03 delay -26327.) Type 1012: ID= 0, Tk= 32248.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=304920.62, pd= 1.0860, lock= >937, amb=22184641.892, snr=42.25) L2 (P , r= 6.78, pd= 0.8180, lock= >937, snr=42.25) SV= 21, Freq= 4, L1 (C/A, r= 42129.94, pd= -2.4330, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 3.38, pd= -3.6345, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=440148.42, pd= -44.2760, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.90, pd= 0.4470, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=102844.96, pd= -2.8345, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=244851.44, pd= -4.6710, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 5.60, pd= -3.7770, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 88774.34, pd= 1.4100, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 6.28, pd= 1.2285, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 19443.32, pd= -0.5520, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.82, pd= 0.9610, lock= >937, snr=45.75) SV= 23, Freq= 3, L1 (C/A, r=431089.74, pd= 20.9945, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 7.42, pd= 1.8930, lock= >937, snr=43.50) RTCM3 (2011-04-10T22:38:41.03) Type 1004: ID= 0, TOW=194264.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 82979.10, pd= -2.1860, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 6.58, pd= -2.6215, lock= >937, snr=24.75) SV= 3, L1 (C/A , r= 19021.80, pd= 1.7185, lock= >937, amb=19786302.228, snr=53.75) L2 (C-P/Y, r= 6.34, pd= 2.5260, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 31972.96, pd= 0.6130, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.68, pd= 0.9420, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 46873.44, pd= -4.6465, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.10, pd= -4.9480, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=171565.68, pd= -1.6480, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.48, pd= -1.8000, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=227245.62, pd= 0.9325, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.20, pd= -0.2405, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=276145.60, pd= 1.5660, lock= >937, amb=20086094.686, snr=49.50) L2 (C-P/Y, r= 6.72, pd= 2.4210, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=255053.02, pd= -1.5750, lock= >937, amb=24882774.014, snr=39.75) L2 (C-P/Y, r= 4.74, pd= -1.1235, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=255194.46, pd= 2.1345, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.68, pd= 3.0815, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=211647.86, pd= -0.0155, lock= 168, amb=24882774.014, snr=33.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=282003.58, pd= 0.8695, lock= >937, amb=20685679.602, snr=49.50) L2 (C-P/Y, r= 4.18, pd= 1.1340, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=123840.92, pd= -0.4690, lock= 1, amb=24582981.556, snr=32.50) L2 (C-P/Y, r= 7.86, pd= -0.5940, lock= 1, snr=19.50) RTCM3 (2011-04-10T22:38:41.03 delay -26328.) Type 1012: ID= 0, Tk= 32249.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=305271.96, pd= 0.6830, lock= >937, amb=22184641.892, snr=41.25) L2 (P , r= 5.92, pd= 0.4175, lock= >937, snr=42.25) SV= 21, Freq= 4, L1 (C/A, r= 42650.58, pd= -1.3730, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.26, pd= -2.5750, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440184.78, pd= -44.1055, lock= >937, amb=19186717.312, snr=51.25) L2 (P , r= 5.68, pd= 0.6170, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=102568.00, pd= -3.4355, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=245591.18, pd= -2.9030, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 7.28, pd= -2.0085, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 89322.42, pd= 1.3350, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.56, pd= 1.1540, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 19166.22, pd= -0.4480, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.04, pd= 1.0660, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=430572.08, pd= 20.5440, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.98, pd= 1.4425, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.03) Type 1004: ID= 0, TOW=194265.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 83505.80, pd= -1.6170, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 6.96, pd= -2.0530, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 18950.76, pd= 1.6870, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.30, pd= 2.4950, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 32200.44, pd= 0.5475, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.86, pd= 0.8780, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 47404.98, pd= -4.5000, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 6.04, pd= -4.8020, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=172297.00, pd= -1.8855, lock= >937, amb=23084019.266, snr=43.50) L2 (C-P/Y, r= 7.34, pd= -2.0375, lock= >937, snr=28.75) SV= 15, L1 (C/A , r=227320.26, pd= 1.2430, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.54, pd= 0.0710, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=276190.98, pd= 1.3720, lock= >937, amb=20086094.686, snr=49.50) L2 (C-P/Y, r= 6.52, pd= 2.2275, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=254860.80, pd= -0.3000, lock= >937, amb=24882774.014, snr=39.75) L2 (C-P/Y, r= 5.96, pd= 0.1480, lock= >937, snr=15.50) SV= 19, L1 (C/A , r=254793.94, pd= 1.7855, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.28, pd= 2.7330, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=211015.38, pd= -1.3670, lock= 176, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=281842.50, pd= 0.7675, lock= >937, amb=20685679.602, snr=49.25) L2 (C-P/Y, r= 4.26, pd= 1.0330, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=124012.18, pd= -0.4670, lock= 2, amb=24582981.556, snr=32.00) L2 (C-P/Y, r= 7.78, pd= -0.5940, lock= 2, snr=19.25) RTCM3 (2011-04-10T22:38:41.03 delay -26329.) Type 1012: ID= 0, Tk= 32250.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=305622.50, pd= 1.2465, lock= >937, amb=22184641.892, snr=41.00) L2 (P , r= 5.72, pd= 0.9805, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 43173.40, pd= -2.4240, lock= >937, amb=22184641.892, snr=40.00) L2 (P , r= 3.60, pd= -3.6260, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=440221.40, pd= -44.0830, lock= >937, amb=19186717.312, snr=51.50) L2 (P , r= 5.24, pd= 0.6390, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=102290.38, pd= -3.2155, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=246332.96, pd= -3.1375, lock= >937, amb=23383811.724, snr=35.75) L2 (P , r= 7.48, pd= -2.2430, lock= >937, snr=39.00) SV= 6, Freq= -4, L1 (C/A, r= 89870.42, pd= 1.4835, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.92, pd= 1.3020, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 18889.14, pd= -0.1620, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.84, pd= 1.3520, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=430054.20, pd= 20.3620, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.54, pd= 1.2605, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.03) Type 1004: ID= 0, TOW=194266.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 84032.64, pd= -1.1770, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 7.36, pd= -1.6125, lock= >937, snr=25.25) SV= 3, L1 (C/A , r= 18879.86, pd= 1.6070, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.56, pd= 2.4155, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 32427.76, pd= 0.7390, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.20, pd= 1.0680, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 47936.92, pd= -4.6815, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.78, pd= -4.9825, lock= >937, snr=38.50) SV= 30, L1 (C/A , r=173027.80, pd= -1.5780, lock= >937, amb=23084019.266, snr=43.50) L2 (C-P/Y, r= 7.62, pd= -1.7300, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=227395.52, pd= 1.0405, lock= >937, amb=24882774.014, snr=42.25) L2 (C-P/Y, r= 7.00, pd= -0.1325, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=276236.24, pd= 1.3715, lock= >937, amb=20086094.686, snr=50.00) L2 (C-P/Y, r= 6.80, pd= 2.2265, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=254670.88, pd= -1.2170, lock= >937, amb=24882774.014, snr=40.00) L2 (C-P/Y, r= 5.08, pd= -0.7655, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=254393.18, pd= 1.7170, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.42, pd= 2.6655, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=210381.30, pd= -1.1230, lock= 176, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=281681.50, pd= 0.6965, lock= >937, amb=20685679.602, snr=49.75) L2 (C-P/Y, r= 3.98, pd= 0.9620, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=124183.96, pd= -0.8785, lock= 3, amb=24582981.556, snr=32.50) L2 (C-P/Y, r= 7.24, pd= -1.0025, lock= 3, snr=19.75) RTCM3 (2011-04-10T22:38:41.03 delay -26330.) Type 1012: ID= 0, Tk= 32251.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=305975.10, pd= -0.1180, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 5.50, pd= -0.3855, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 43694.42, pd= -1.6290, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.64, pd= -2.8335, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440258.44, pd= -44.4120, lock= >937, amb=19186717.312, snr=51.25) L2 (P , r= 4.84, pd= 0.3110, lock= >937, snr=51.50) SV= 14, Freq= -7, L1 (C/A, r=102013.26, pd= -3.3500, lock= >937, amb=23383811.724, snr=38.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=247074.36, pd= -2.9675, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 7.14, pd= -2.0720, lock= >937, snr=39.25) SV= 6, Freq= -4, L1 (C/A, r= 90418.18, pd= 1.9855, lock= >937, amb=21585056.976, snr=45.50) L2 (P , r= 6.36, pd= 1.8040, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 18612.50, pd= -0.1550, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.54, pd= 1.3585, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=429536.70, pd= 19.8305, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.14, pd= 0.7285, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.03) Type 1004: ID= 0, TOW=194267.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 84560.82, pd= -2.0885, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 6.24, pd= -2.5245, lock= >937, snr=24.75) SV= 3, L1 (C/A , r= 18808.90, pd= 1.6680, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.32, pd= 2.4770, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 32655.62, pd= 0.4725, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 5.54, pd= 0.8025, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 48468.64, pd= -4.5810, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.80, pd= -4.8825, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=173759.42, pd= -2.0770, lock= >937, amb=23084019.266, snr=43.50) L2 (C-P/Y, r= 7.26, pd= -2.2290, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=227470.34, pd= 1.3730, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.46, pd= 0.2025, lock= >937, snr=22.00) SV= 6, L1 (C/A , r=276281.44, pd= 1.4960, lock= >937, amb=20086094.686, snr=50.25) L2 (C-P/Y, r= 6.44, pd= 2.3510, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=254480.18, pd= -1.2580, lock= >937, amb=24882774.014, snr=39.75) L2 (C-P/Y, r= 5.24, pd= -0.8100, lock= >937, snr=15.50) SV= 19, L1 (C/A , r=253992.34, pd= 1.7535, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.18, pd= 2.7010, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=209747.16, pd= -0.8175, lock= 176, amb=24882774.014, snr=33.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=281520.64, pd= 0.5815, lock= >937, amb=20685679.602, snr=49.75) L2 (C-P/Y, r= 4.02, pd= 0.8465, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=124355.32, pd= -0.7790, lock= 4, amb=24582981.556, snr=33.00) L2 (C-P/Y, r= 7.30, pd= -0.9020, lock= 4, snr=19.25) RTCM3 (2011-04-10T22:38:41.03 delay -26331.) Type 1012: ID= 0, Tk= 32252.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=306326.18, pd= 0.1500, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 5.82, pd= -0.1185, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 44216.78, pd= -2.1455, lock= >937, amb=22184641.892, snr=40.25) L2 (P , r= 4.14, pd= -3.3495, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440294.92, pd= -44.1210, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 4.86, pd= 0.6025, lock= >937, snr=51.50) SV= 14, Freq= -7, L1 (C/A, r=101735.40, pd= -2.6190, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=247815.74, pd= -2.7730, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 7.48, pd= -1.8770, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 90966.90, pd= 1.6280, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.84, pd= 1.4465, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 18335.96, pd= -0.1025, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.12, pd= 1.4100, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=429018.40, pd= 20.1090, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.42, pd= 1.0075, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.03) Type 1004: ID= 0, TOW=194268.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 85087.62, pd= -1.6060, lock= >937, amb=23983396.640, snr=41.25) L2 (C-P/Y, r= 7.02, pd= -2.0435, lock= >937, snr=23.75) SV= 3, L1 (C/A , r= 18737.86, pd= 1.9020, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.72, pd= 2.7105, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 32882.78, pd= 1.0100, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.40, pd= 1.3400, lock= >937, snr=38.75) SV= 16, L1 (C/A , r= 49000.32, pd= -4.3645, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.98, pd= -4.6665, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=174490.24, pd= -1.7435, lock= >937, amb=23084019.266, snr=43.75) L2 (C-P/Y, r= 7.40, pd= -1.8940, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=227546.18, pd= 0.7905, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 6.66, pd= -0.3785, lock= >937, snr=22.00) SV= 6, L1 (C/A , r=276326.90, pd= 1.4285, lock= >937, amb=20086094.686, snr=49.75) L2 (C-P/Y, r= 6.88, pd= 2.2820, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=254289.54, pd= -1.2450, lock= >937, amb=24882774.014, snr=39.75) L2 (C-P/Y, r= 4.80, pd= -0.7940, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=253591.42, pd= 1.9225, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.64, pd= 2.8705, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=209113.42, pd= -0.9010, lock= 176, amb=24882774.014, snr=33.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=281359.66, pd= 0.7020, lock= >937, amb=20685679.602, snr=49.75) L2 (C-P/Y, r= 4.16, pd= 0.9670, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=124528.12, pd= -2.0165, lock= 5, amb=24582981.556, snr=33.50) L2 (C-P/Y, r= 6.16, pd= -2.1385, lock= 5, snr=19.50) RTCM3 (2011-04-10T22:38:41.04 delay -26332.) Type 1012: ID= 0, Tk= 32253.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=306677.40, pd= 0.4200, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.12, pd= 0.1510, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 44738.16, pd= -1.6305, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.38, pd= -2.8365, lock= >937, snr=40.25) SV= 22, Freq= -3, L1 (C/A, r=440331.66, pd= -44.0135, lock= >937, amb=19186717.312, snr=51.25) L2 (P , r= 5.60, pd= 0.7085, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=101458.10, pd= -2.2975, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=248556.68, pd= -2.1135, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 8.04, pd= -1.2185, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 91515.16, pd= 1.8545, lock= >937, amb=21585056.976, snr=45.50) L2 (P , r= 6.42, pd= 1.6725, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 18060.08, pd= -0.5510, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.20, pd= 0.9625, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=428499.66, pd= 20.8540, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 7.00, pd= 1.7520, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.04) Type 1004: ID= 0, TOW=194269.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 85614.82, pd= -1.5025, lock= >937, amb=23983396.640, snr=41.50) L2 (C-P/Y, r= 7.30, pd= -1.9410, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 18667.14, pd= 1.9190, lock= >937, amb=19786302.228, snr=53.75) L2 (C-P/Y, r= 6.96, pd= 2.7270, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 33110.98, pd= 0.6170, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.90, pd= 0.9465, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 49532.38, pd= -4.4435, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.00, pd= -4.7465, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=175221.50, pd= -1.8165, lock= >937, amb=23084019.266, snr=43.50) L2 (C-P/Y, r= 7.46, pd= -1.9685, lock= >937, snr=28.75) SV= 15, L1 (C/A , r=227621.22, pd= 1.1305, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.46, pd= -0.0380, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=276372.42, pd= 1.3940, lock= >937, amb=20086094.686, snr=49.50) L2 (C-P/Y, r= 6.68, pd= 2.2480, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=254098.64, pd= -0.8480, lock= >937, amb=24882774.014, snr=39.25) L2 (C-P/Y, r= 5.60, pd= -0.3970, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=253190.66, pd= 1.9825, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.30, pd= 2.9290, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=208479.00, pd= -0.2900, lock= 176, amb=24882774.014, snr=33.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=281198.88, pd= 0.7400, lock= >937, amb=20685679.602, snr=49.75) L2 (C-P/Y, r= 4.08, pd= 1.0045, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=124699.70, pd= -1.9325, lock= 6, amb=24582981.556, snr=33.50) L2 (C-P/Y, r= 5.74, pd= -2.0595, lock= 6, snr=20.50) RTCM3 (2011-04-10T22:38:41.04 delay -26333.) Type 1012: ID= 0, Tk= 32254.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=307028.62, pd= 0.8360, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 7.02, pd= 0.5665, lock= >937, snr=42.00) SV= 21, Freq= 4, L1 (C/A, r= 45260.84, pd= -2.3655, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 3.50, pd= -3.5710, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440369.12, pd= -44.5440, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.10, pd= 0.1790, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=101181.18, pd= -2.2100, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=249300.42, pd= -4.2380, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 6.32, pd= -3.3435, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 92063.84, pd= 1.7830, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 6.42, pd= 1.6000, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 17783.42, pd= -0.0540, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 1.18, pd= 1.4590, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=427981.68, pd= 20.8745, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.56, pd= 1.7715, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.04) Type 1033: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' Receiver Type='TRIMBLE NETR5', Firmware='', Serial='' RTCM3 (2011-04-10T22:38:41.04) Type 1004: ID= 0, TOW=194270.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 86142.20, pd= -1.5550, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 7.10, pd= -1.9935, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 18596.78, pd= 1.6855, lock= >937, amb=19786302.228, snr=53.50) L2 (C-P/Y, r= 6.52, pd= 2.4925, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 33338.70, pd= 0.8155, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 5.92, pd= 1.1445, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 50064.16, pd= -4.1525, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.30, pd= -4.4550, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=175952.52, pd= -1.6040, lock= >937, amb=23084019.266, snr=43.50) L2 (C-P/Y, r= 7.40, pd= -1.7575, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=227696.30, pd= 1.5505, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.54, pd= 0.3785, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=276418.12, pd= 1.2645, lock= >937, amb=20086094.686, snr=50.00) L2 (C-P/Y, r= 6.66, pd= 2.1180, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=253908.18, pd= -0.7640, lock= >937, amb=24882774.014, snr=39.25) L2 (C-P/Y, r= 5.68, pd= -0.3060, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=252789.86, pd= 2.1450, lock= >937, amb=21285264.518, snr=47.75) L2 (C-P/Y, r= 4.76, pd= 3.0920, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=207845.84, pd= -0.9075, lock= 176, amb=24882774.014, snr=33.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=281038.30, pd= 0.7090, lock= >937, amb=20685679.602, snr=50.00) L2 (C-P/Y, r= 3.96, pd= 0.9735, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=124871.36, pd= -1.8075, lock= 7, amb=24582981.556, snr=34.25) L2 (C-P/Y, r= 6.42, pd= -1.9330, lock= 7, snr=20.75) RTCM3 (2011-04-10T22:38:41.04 delay -26334.) Type 1012: ID= 0, Tk= 32255.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=307380.68, pd= 0.5620, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 5.84, pd= 0.2935, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 45782.38, pd= -1.8955, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.52, pd= -3.1020, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440405.58, pd= -43.9830, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.72, pd= 0.7395, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r=100905.54, pd= -3.2215, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=250040.44, pd= -2.6145, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 7.30, pd= -1.7200, lock= >937, snr=39.25) SV= 6, Freq= -4, L1 (C/A, r= 92612.86, pd= 1.5095, lock= >937, amb=21585056.976, snr=45.25) L2 (P , r= 5.86, pd= 1.3265, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 17508.06, pd= -0.6765, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.50, pd= 0.8360, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=427464.28, pd= 20.3530, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 5.96, pd= 1.2510, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.04) Type 1008: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' RTCM3 (2011-04-10T22:38:41.04) Type 1004: ID= 0, TOW=194271.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 86669.94, pd= -1.9640, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 6.36, pd= -2.4030, lock= >937, snr=25.50) SV= 3, L1 (C/A , r= 18525.96, pd= 1.9985, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.92, pd= 2.8065, lock= >937, snr=45.00) SV= 18, L1 (C/A , r= 33566.64, pd= 0.8855, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.28, pd= 1.2150, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 50596.80, pd= -4.6540, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.92, pd= -4.9555, lock= >937, snr=39.75) SV= 30, L1 (C/A , r=176683.86, pd= -1.6945, lock= >937, amb=23084019.266, snr=43.50) L2 (C-P/Y, r= 7.20, pd= -1.8485, lock= >937, snr=28.25) SV= 15, L1 (C/A , r=227771.98, pd= 1.4720, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.32, pd= 0.3010, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=276463.74, pd= 1.2805, lock= >937, amb=20086094.686, snr=50.00) L2 (C-P/Y, r= 6.54, pd= 2.1345, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=253718.82, pd= -1.6750, lock= >937, amb=24882774.014, snr=39.25) L2 (C-P/Y, r= 4.48, pd= -1.2230, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=252389.44, pd= 1.9605, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.30, pd= 2.9090, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=207211.74, pd= -0.5870, lock= 176, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=280877.68, pd= 0.8210, lock= >937, amb=20685679.602, snr=50.00) L2 (C-P/Y, r= 3.90, pd= 1.0845, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=125043.50, pd= -2.0695, lock= 8, amb=24582981.556, snr=35.25) L2 (C-P/Y, r= 5.80, pd= -2.1960, lock= 8, snr=20.00) RTCM3 (2011-04-10T22:38:41.04 delay -26335.) Type 1012: ID= 0, Tk= 32256.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=307731.36, pd= 1.7905, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 7.50, pd= 1.5215, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 46304.72, pd= -2.1855, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 4.12, pd= -3.3915, lock= >937, snr=40.50) SV= 22, Freq= -3, L1 (C/A, r=440442.32, pd= -43.6385, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.90, pd= 1.0840, lock= >937, snr=51.50) SV= 14, Freq= -7, L1 (C/A, r=100628.60, pd= -2.8035, lock= >937, amb=23383811.724, snr=37.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=250783.18, pd= -3.6840, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 6.92, pd= -2.7895, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 93162.04, pd= 1.1850, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.80, pd= 1.0005, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 17232.38, pd= -0.8245, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.10, pd= 0.6890, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=426946.20, pd= 20.5230, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.40, pd= 1.4205, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.04) Type 1006: ID= 0, Year=0, GPS=Y, GLONASS=Y, Galileo=N, X= 4581694.6288, Y= 556114.3725, Z= 4389358.4678 QC=1(no bias), height=0.0349 RTCM3 (2011-04-10T22:38:41.04) Type 1004: ID= 0, TOW=194272.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 87197.32, pd= -2.0105, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 6.58, pd= -2.4530, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 18455.40, pd= 2.1385, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 7.30, pd= 2.9475, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 33795.18, pd= 0.4505, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.74, pd= 0.7800, lock= >937, snr=38.00) SV= 16, L1 (C/A , r= 51129.00, pd= -4.6480, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.00, pd= -4.9505, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=177414.54, pd= -1.1020, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.68, pd= -1.2565, lock= >937, snr=28.00) SV= 15, L1 (C/A , r=227847.56, pd= 1.5955, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.64, pd= 0.4245, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=276509.18, pd= 1.5580, lock= >937, amb=20086094.686, snr=50.00) L2 (C-P/Y, r= 6.90, pd= 2.4110, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=253528.06, pd= -1.0700, lock= >937, amb=24882774.014, snr=38.25) L2 (C-P/Y, r= 5.36, pd= -0.6220, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=251988.76, pd= 2.0785, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 4.38, pd= 3.0265, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=206577.32, pd= 0.0645, lock= 176, amb=24882774.014, snr=32.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=280717.38, pd= 0.7245, lock= >937, amb=20685679.602, snr=50.00) L2 (C-P/Y, r= 4.26, pd= 0.9890, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=125215.92, pd= -2.5195, lock= 9, amb=24582981.556, snr=36.00) L2 (C-P/Y, r= 5.08, pd= -2.6465, lock= 9, snr=20.50) RTCM3 (2011-04-10T22:38:41.04 delay -26336.) Type 1012: ID= 0, Tk= 32257.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=308083.86, pd= 1.3280, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 7.10, pd= 1.0600, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 46825.98, pd= -1.3640, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.68, pd= -2.5715, lock= >937, snr=40.25) SV= 22, Freq= -3, L1 (C/A, r=440480.46, pd= -44.6205, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.18, pd= 0.1020, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=100352.42, pd= -2.9985, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=251522.42, pd= -1.2375, lock= >937, amb=23383811.724, snr=35.50) L2 (P , r= 9.28, pd= -0.3435, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 93711.40, pd= 0.7890, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.48, pd= 0.6045, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 16956.64, pd= -0.7610, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.38, pd= 0.7520, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=426428.50, pd= 20.3355, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.24, pd= 1.2325, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.04) Type 1013: ID= 0, MJD=55621, SOD=21457, Num= 6, Leap=15 ID=1004, Sync=1, Interval= 1.0 ID=1006, Sync=1, Interval= 10.0 ID=1008, Sync=1, Interval= 10.0 ID=1012, Sync=1, Interval= 1.0 ID=1013, Sync=1, Interval= 10.0 ID=1033, Sync=1, Interval= 10.0 RTCM3 (2011-04-10T22:38:41.04) Type 1004: ID= 0, TOW=194273.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 87723.92, pd= -1.2615, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 7.10, pd= -1.7055, lock= >937, snr=25.00) SV= 3, L1 (C/A , r= 18385.42, pd= 1.8000, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 7.04, pd= 2.6080, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 34023.28, pd= 0.5605, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 6.32, pd= 0.8895, lock= >937, snr=38.00) SV= 16, L1 (C/A , r= 51661.12, pd= -4.4805, lock= >937, amb=21884849.434, snr=48.25) L2 (C-P/Y, r= 6.02, pd= -4.7825, lock= >937, snr=39.50) SV= 30, L1 (C/A , r=178145.90, pd= -1.1585, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.90, pd= -1.3130, lock= >937, snr=28.00) SV= 15, L1 (C/A , r=227923.64, pd= 1.3315, lock= >937, amb=24882774.014, snr=41.75) L2 (C-P/Y, r= 7.58, pd= 0.1615, lock= >937, snr=24.50) SV= 6, L1 (C/A , r=276555.06, pd= 1.4710, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.92, pd= 2.3245, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=253338.32, pd= -1.3785, lock= >937, amb=24882774.014, snr=38.75) L2 (C-P/Y, r= 4.98, pd= -0.9350, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=251588.82, pd= 1.5045, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 3.84, pd= 2.4520, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=205943.78, pd= -0.1720, lock= 184, amb=24882774.014, snr=32.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=280557.44, pd= 0.3830, lock= >937, amb=20685679.602, snr=50.50) L2 (C-P/Y, r= 3.72, pd= 0.6470, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=125388.54, pd= -3.0520, lock= 10, amb=24582981.556, snr=35.75) L2 (C-P/Y, r= 5.00, pd= -3.1760, lock= 10, snr=21.50) RTCM3 (2011-04-10T22:38:41.04 delay -26337.) Type 1012: ID= 0, Tk= 32258.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=308436.38, pd= 0.9815, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.54, pd= 0.7135, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 47349.22, pd= -2.4625, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 3.30, pd= -3.6695, lock= >937, snr=40.50) SV= 22, Freq= -3, L1 (C/A, r=440517.28, pd= -44.2015, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 5.24, pd= 0.5200, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r=100077.32, pd= -4.1325, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=252265.04, pd= -2.1540, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 8.18, pd= -1.2590, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 94259.98, pd= 1.2930, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 5.92, pd= 1.1080, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 16680.88, pd= -0.5280, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 0.50, pd= 0.9845, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=425910.44, pd= 20.5380, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.26, pd= 1.4355, lock= >937, snr=43.75) RTCM3 (2011-04-10T22:38:41.04) Type 1004: ID= 0, TOW=194274.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 88251.58, pd= -1.5445, lock= >937, amb=23983396.640, snr=40.25) L2 (C-P/Y, r= 7.10, pd= -1.9880, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 18315.12, pd= 1.8885, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.60, pd= 2.6960, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 34251.34, pd= 0.8255, lock= >937, amb=21884849.434, snr=48.25) L2 (C-P/Y, r= 6.06, pd= 1.1555, lock= >937, snr=38.00) SV= 16, L1 (C/A , r= 52193.28, pd= -4.2585, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.34, pd= -4.5615, lock= >937, snr=39.25) SV= 30, L1 (C/A , r=178877.40, pd= -1.3075, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.66, pd= -1.4635, lock= >937, snr=28.50) SV= 15, L1 (C/A , r=227999.74, pd= 1.1765, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.34, pd= 0.0040, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=276600.92, pd= 1.4960, lock= >937, amb=20086094.686, snr=51.00) L2 (C-P/Y, r= 6.84, pd= 2.3500, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=253148.04, pd= -1.0135, lock= >937, amb=24882774.014, snr=38.50) L2 (C-P/Y, r= 5.48, pd= -0.5665, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=251188.36, pd= 1.5135, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.04, pd= 2.4610, lock= >937, snr=40.50) SV= 11, L1 (C/A , r=205310.62, pd= -0.7490, lock= 184, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=280396.96, pd= 0.7120, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 4.08, pd= 0.9765, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=125559.62, pd= -1.9410, lock= 11, amb=24582981.556, snr=36.50) L2 (C-P/Y, r= 6.16, pd= -2.0615, lock= 11, snr=21.00) RTCM3 (2011-04-10T22:38:41.04 delay -26338.) Type 1012: ID= 0, Tk= 32259.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=308788.84, pd= 0.8445, lock= >937, amb=22184641.892, snr=42.25) L2 (P , r= 6.76, pd= 0.5735, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 47870.86, pd= -1.9025, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.60, pd= -3.1105, lock= >937, snr=40.50) SV= 22, Freq= -3, L1 (C/A, r=440554.40, pd= -43.9905, lock= >937, amb=19186717.312, snr=50.50) L2 (P , r= 4.70, pd= 0.7310, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r= 99799.66, pd= -2.5425, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=253006.24, pd= -1.6275, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 8.38, pd= -0.7320, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 94808.84, pd= 1.6560, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 6.52, pd= 1.4710, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 16405.68, pd= -0.6925, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.50, pd= 0.8205, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=425392.80, pd= 20.3630, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.64, pd= 1.2600, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.04) Type 1004: ID= 0, TOW=194275.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 88778.82, pd= -1.3935, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 7.12, pd= -1.8365, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 18244.98, pd= 1.9190, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.94, pd= 2.7265, lock= >937, snr=44.25) SV= 18, L1 (C/A , r= 34480.00, pd= 0.5925, lock= >937, amb=21884849.434, snr=48.50) L2 (C-P/Y, r= 6.04, pd= 0.9210, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 52725.84, pd= -4.3600, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.24, pd= -4.6635, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=179608.78, pd= -1.2990, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.74, pd= -1.4550, lock= >937, snr=28.75) SV= 15, L1 (C/A , r=228075.06, pd= 1.9105, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.84, pd= 0.7380, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=276646.80, pd= 1.5840, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.90, pd= 2.4375, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=252957.82, pd= -0.5905, lock= >937, amb=24882774.014, snr=38.00) L2 (C-P/Y, r= 5.78, pd= -0.1425, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=250787.98, pd= 1.4895, lock= >937, amb=21285264.518, snr=48.25) L2 (C-P/Y, r= 3.98, pd= 2.4365, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=204676.68, pd= -0.5280, lock= 184, amb=24882774.014, snr=32.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=280236.84, pd= 0.7970, lock= >937, amb=20685679.602, snr=50.75) L2 (C-P/Y, r= 4.18, pd= 1.0615, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=125732.34, pd= -2.3595, lock= 12, amb=24582981.556, snr=36.75) L2 (C-P/Y, r= 5.22, pd= -2.4775, lock= 12, snr=21.50) RTCM3 (2011-04-10T22:38:41.05 delay -26339.) Type 1012: ID= 0, Tk= 32260.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=309141.58, pd= 0.5625, lock= >937, amb=22184641.892, snr=42.50) L2 (P , r= 6.70, pd= 0.2915, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 48392.26, pd= -1.0545, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 5.06, pd= -2.2630, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440592.42, pd= -44.5965, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 4.90, pd= 0.1245, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r= 99524.02, pd= -2.8170, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=253749.90, pd= -3.5295, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 6.72, pd= -2.6340, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r= 95358.86, pd= 0.9790, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.72, pd= 0.7945, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 16129.72, pd= 0.0540, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 1.18, pd= 1.5665, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=424874.72, pd= 20.6615, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.44, pd= 1.5585, lock= >937, snr=44.50) RTCM3 (2011-04-10T22:38:41.05) Type 1004: ID= 0, TOW=194276.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 89306.14, pd= -1.3115, lock= >937, amb=23983396.640, snr=40.00) L2 (C-P/Y, r= 6.96, pd= -1.7545, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 18175.06, pd= 1.8215, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.60, pd= 2.6285, lock= >937, snr=44.25) SV= 18, L1 (C/A , r= 34708.36, pd= 0.7570, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.14, pd= 1.0855, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 53258.48, pd= -4.4645, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.16, pd= -4.7670, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=180340.50, pd= -1.6160, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.48, pd= -1.7730, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=228152.40, pd= 0.7335, lock= >937, amb=24882774.014, snr=42.50) L2 (C-P/Y, r= 6.98, pd= -0.4355, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=276692.70, pd= 1.7300, lock= >937, amb=20086094.686, snr=51.25) L2 (C-P/Y, r= 7.70, pd= 2.5820, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=252768.10, pd= -0.5485, lock= >937, amb=24882774.014, snr=37.25) L2 (C-P/Y, r= 6.00, pd= -0.1025, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=250387.36, pd= 1.7515, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.88, pd= 2.6990, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=204042.48, pd= -0.0390, lock= 184, amb=24882774.014, snr=32.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=280076.92, pd= 0.7950, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.04, pd= 1.0590, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=125904.86, pd= -2.4690, lock= 13, amb=24582981.556, snr=36.75) L2 (C-P/Y, r= 5.38, pd= -2.5865, lock= 13, snr=22.00) RTCM3 (2011-04-10T22:38:41.05 delay -26340.) Type 1012: ID= 0, Tk= 32261.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=309494.20, pd= 0.5325, lock= >937, amb=22184641.892, snr=42.25) L2 (P , r= 6.08, pd= 0.2610, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 48915.60, pd= -2.0945, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.12, pd= -3.3030, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440629.48, pd= -44.1665, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.52, pd= 0.5555, lock= >937, snr=50.50) SV= 14, Freq= -7, L1 (C/A, r= 99248.36, pd= -2.9300, lock= >937, amb=23383811.724, snr=37.75) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=254491.90, pd= -3.7605, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 6.88, pd= -2.8655, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 95907.82, pd= 1.4805, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 6.38, pd= 1.2945, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 15854.92, pd= -0.2100, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.48, pd= 1.3025, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=424357.02, pd= 20.6090, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.48, pd= 1.5060, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.05) Type 1004: ID= 0, TOW=194277.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 89834.18, pd= -1.9205, lock= >937, amb=23983396.640, snr=40.25) L2 (C-P/Y, r= 6.70, pd= -2.3630, lock= >937, snr=24.25) SV= 3, L1 (C/A , r= 18105.18, pd= 1.7935, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.66, pd= 2.6015, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 34937.34, pd= 0.4185, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 5.64, pd= 0.7460, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 53791.14, pd= -4.4995, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.02, pd= -4.8030, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=181071.72, pd= -1.3790, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.60, pd= -1.5360, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=228227.48, pd= 1.9445, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 8.22, pd= 0.7755, lock= >937, snr=22.25) SV= 6, L1 (C/A , r=276739.02, pd= 1.5420, lock= >937, amb=20086094.686, snr=51.50) L2 (C-P/Y, r= 6.84, pd= 2.3940, lock= >937, snr=43.75) SV= 8, L1 (C/A , r=252577.92, pd= 0.0805, lock= >937, amb=24882774.014, snr=36.25) L2 (C-P/Y, r= 6.30, pd= 0.5290, lock= >937, snr=17.25) SV= 19, L1 (C/A , r=249987.20, pd= 1.6160, lock= >937, amb=21285264.518, snr=47.75) L2 (C-P/Y, r= 4.36, pd= 2.5630, lock= >937, snr=41.25) SV= 11, L1 (C/A , r=203409.18, pd= -0.4385, lock= 184, amb=24882774.014, snr=32.75) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=279917.20, pd= 0.7225, lock= >937, amb=20685679.602, snr=51.50) L2 (C-P/Y, r= 4.22, pd= 0.9860, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=126075.76, pd= -0.8415, lock= 14, amb=24582981.556, snr=36.25) L2 (C-P/Y, r= 7.32, pd= -0.9590, lock= 14, snr=22.75) RTCM3 (2011-04-10T22:38:41.05 delay -26341.) Type 1012: ID= 0, Tk= 32262.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=309845.70, pd= 1.7765, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 7.36, pd= 1.5070, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 49437.90, pd= -2.0265, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 4.24, pd= -3.2360, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440667.24, pd= -44.3450, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.18, pd= 0.3760, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r= 98973.00, pd= -3.1730, lock= >937, amb=23383811.724, snr=38.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=255232.68, pd= -2.7260, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 8.06, pd= -1.8320, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 96457.88, pd= 1.0105, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 5.66, pd= 0.8240, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 15580.46, pd= -0.6390, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 0.58, pd= 0.8740, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=423839.84, pd= 20.0720, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 5.78, pd= 0.9690, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.05) Type 1004: ID= 0, TOW=194278.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 90361.34, pd= -1.6650, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 6.86, pd= -2.1120, lock= >937, snr=23.25) SV= 3, L1 (C/A , r= 18035.28, pd= 1.8630, lock= >937, amb=19786302.228, snr=52.50) L2 (C-P/Y, r= 6.78, pd= 2.6705, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 35165.64, pd= 0.8475, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.10, pd= 1.1750, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 54323.78, pd= -4.4530, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 6.18, pd= -4.7560, lock= >937, snr=39.25) SV= 30, L1 (C/A , r=181803.38, pd= -1.5720, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.40, pd= -1.7280, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=228304.04, pd= 1.7680, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.68, pd= 0.5965, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=276785.50, pd= 1.2560, lock= >937, amb=20086094.686, snr=52.00) L2 (C-P/Y, r= 6.68, pd= 2.1090, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=252389.32, pd= -0.7770, lock= >937, amb=24882774.014, snr=36.75) L2 (C-P/Y, r= 5.46, pd= -0.3320, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=249586.86, pd= 1.6915, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.16, pd= 2.6380, lock= >937, snr=41.50) SV= 11, L1 (C/A , r=202775.72, pd= -0.6615, lock= 184, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=279757.48, pd= 0.7455, lock= >937, amb=20685679.602, snr=51.25) L2 (C-P/Y, r= 3.86, pd= 1.0095, lock= >937, snr=44.25) SV= 7, L1 (C/A , r=126248.44, pd= -0.9205, lock= 15, amb=24582981.556, snr=35.50) L2 (C-P/Y, r= 7.12, pd= -1.0400, lock= 15, snr=22.00) RTCM3 (2011-04-10T22:38:41.05 delay -26342.) Type 1012: ID= 0, Tk= 32263.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=310199.76, pd= 0.5800, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.34, pd= 0.3100, lock= >937, snr=41.75) SV= 21, Freq= 4, L1 (C/A, r= 49960.36, pd= -2.0865, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 3.92, pd= -3.2960, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440704.84, pd= -44.3060, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 4.94, pd= 0.4150, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r= 98696.96, pd= -2.6025, lock= >937, amb=23383811.724, snr=38.50) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=255974.08, pd= -2.3085, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 8.02, pd= -1.4150, lock= >937, snr=39.25) SV= 6, Freq= -4, L1 (C/A, r= 97006.92, pd= 1.6660, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 6.04, pd= 1.4800, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 15305.70, pd= -0.6185, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.90, pd= 0.8955, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=423321.76, pd= 20.4495, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.58, pd= 1.3470, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.05) Type 1004: ID= 0, TOW=194279.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 90888.36, pd= -1.2535, lock= >937, amb=23983396.640, snr=40.25) L2 (C-P/Y, r= 7.00, pd= -1.7005, lock= >937, snr=23.25) SV= 3, L1 (C/A , r= 17965.82, pd= 1.5865, lock= >937, amb=19786302.228, snr=52.75) L2 (C-P/Y, r= 6.52, pd= 2.3930, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 35394.50, pd= 0.8120, lock= >937, amb=21884849.434, snr=49.75) L2 (C-P/Y, r= 6.08, pd= 1.1395, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 54856.60, pd= -4.5110, lock= >937, amb=21884849.434, snr=48.75) L2 (C-P/Y, r= 6.10, pd= -4.8150, lock= >937, snr=39.25) SV= 30, L1 (C/A , r=182535.28, pd= -1.9825, lock= >937, amb=23084019.266, snr=43.50) L2 (C-P/Y, r= 7.22, pd= -2.1395, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=228380.94, pd= 1.3535, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.78, pd= 0.1815, lock= >937, snr=22.00) SV= 6, L1 (C/A , r=276831.56, pd= 1.4680, lock= >937, amb=20086094.686, snr=51.50) L2 (C-P/Y, r= 6.56, pd= 2.3210, lock= >937, snr=44.50) SV= 8, L1 (C/A , r=252200.02, pd= -0.8185, lock= >937, amb=24882774.014, snr=36.00) L2 (C-P/Y, r= 5.48, pd= -0.3790, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=249186.70, pd= 1.6275, lock= >937, amb=21285264.518, snr=47.75) L2 (C-P/Y, r= 4.38, pd= 2.5735, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=202141.78, pd= -0.4075, lock= 184, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=279597.76, pd= 0.8820, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.06, pd= 1.1460, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=126421.52, pd= -1.2760, lock= 16, amb=24582981.556, snr=35.50) L2 (C-P/Y, r= 7.08, pd= -1.3950, lock= 16, snr=22.50) RTCM3 (2011-04-10T22:38:41.05 delay -26342.) Type 1012: ID= 0, Tk= 32264.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=310552.50, pd= 0.8355, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.28, pd= 0.5650, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 50482.58, pd= -1.8655, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 4.36, pd= -3.0755, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440742.68, pd= -44.4310, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.16, pd= 0.2900, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r= 98422.10, pd= -3.0765, lock= >937, amb=23383811.724, snr=39.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=256715.50, pd= -1.8965, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 8.30, pd= -1.0030, lock= >937, snr=39.75) SV= 6, Freq= -4, L1 (C/A, r= 97556.84, pd= 1.5525, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 5.64, pd= 1.3670, lock= >937, snr=44.25) SV= 7, Freq= 5, L1 (C/A, r= 15030.18, pd= 0.3310, lock= >937, amb=19786302.228, snr=44.50) L2 (P , r= 1.88, pd= 1.8440, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=422804.24, pd= 20.2915, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.46, pd= 1.1895, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.05) Type 1033: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' Receiver Type='TRIMBLE NETR5', Firmware='', Serial='' RTCM3 (2011-04-10T22:38:41.05) Type 1004: ID= 0, TOW=194280.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 91416.10, pd= -1.5370, lock= >937, amb=23983396.640, snr=39.75) L2 (C-P/Y, r= 7.24, pd= -1.9860, lock= >937, snr=24.25) SV= 3, L1 (C/A , r= 17896.24, pd= 1.5375, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.58, pd= 2.3445, lock= >937, snr=45.00) SV= 18, L1 (C/A , r= 35623.62, pd= 0.6280, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.22, pd= 0.9555, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 55389.32, pd= -4.3845, lock= >937, amb=21884849.434, snr=49.00) L2 (C-P/Y, r= 5.86, pd= -4.6890, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=183266.58, pd= -1.7520, lock= >937, amb=23084019.266, snr=43.25) L2 (C-P/Y, r= 7.30, pd= -1.9110, lock= >937, snr=29.25) SV= 15, L1 (C/A , r=228457.36, pd= 1.5385, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.36, pd= 0.3660, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=276877.94, pd= 1.4460, lock= >937, amb=20086094.686, snr=51.25) L2 (C-P/Y, r= 6.82, pd= 2.2990, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=252010.54, pd= -0.5565, lock= >937, amb=24882774.014, snr=36.00) L2 (C-P/Y, r= 6.28, pd= -0.1130, lock= >937, snr=15.50) SV= 19, L1 (C/A , r=248786.50, pd= 1.6625, lock= >937, amb=21285264.518, snr=48.00) L2 (C-P/Y, r= 4.22, pd= 2.6095, lock= >937, snr=41.25) SV= 11, L1 (C/A , r=201508.26, pd= -0.5545, lock= 184, amb=24882774.014, snr=33.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=279438.60, pd= 0.5790, lock= >937, amb=20685679.602, snr=51.50) L2 (C-P/Y, r= 4.22, pd= 0.8425, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=126594.80, pd= -1.7380, lock= 17, amb=24582981.556, snr=36.00) L2 (C-P/Y, r= 6.60, pd= -1.8580, lock= 17, snr=22.25) RTCM3 (2011-04-10T22:38:41.05 delay -26343.) Type 1012: ID= 0, Tk= 32265.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=310906.08, pd= 0.4005, lock= >937, amb=22184641.892, snr=41.75) L2 (P , r= 6.00, pd= 0.1290, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 51004.08, pd= -0.8640, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 5.14, pd= -2.0740, lock= >937, snr=40.75) SV= 22, Freq= -3, L1 (C/A, r=440780.00, pd= -43.9540, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.06, pd= 0.7665, lock= >937, snr=50.75) SV= 14, Freq= -7, L1 (C/A, r= 98147.28, pd= -3.4285, lock= >937, amb=23383811.724, snr=39.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=257457.80, pd= -2.3325, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 7.76, pd= -1.4395, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 98107.12, pd= 1.2130, lock= >937, amb=21585056.976, snr=45.00) L2 (P , r= 6.26, pd= 1.0270, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 14755.70, pd= 0.4105, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.56, pd= 1.9240, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=422286.30, pd= 20.5915, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 5.88, pd= 1.4900, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.05) Type 1008: ID= 0, Antenna='ASH701945E_M NONE', Setup ID= 0, Serial='24222' RTCM3 (2011-04-10T22:38:41.05) Type 1004: ID= 0, TOW=194281.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 91943.74, pd= -1.6965, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 6.84, pd= -2.1450, lock= >937, snr=23.75) SV= 3, L1 (C/A , r= 17826.36, pd= 1.9010, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.84, pd= 2.7070, lock= >937, snr=44.75) SV= 18, L1 (C/A , r= 35852.64, pd= 0.6610, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.22, pd= 0.9880, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 55922.64, pd= -4.7635, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 5.58, pd= -5.0680, lock= >937, snr=38.50) SV= 30, L1 (C/A , r=183997.52, pd= -1.1150, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 8.38, pd= -1.2730, lock= >937, snr=27.50) SV= 15, L1 (C/A , r=228534.80, pd= 0.8345, lock= >937, amb=24882774.014, snr=42.50) L2 (C-P/Y, r= 6.82, pd= -0.3400, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=276924.44, pd= 1.3995, lock= >937, amb=20086094.686, snr=51.50) L2 (C-P/Y, r= 6.88, pd= 2.2510, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=251821.64, pd= -0.7340, lock= >937, amb=24882774.014, snr=35.75) L2 (C-P/Y, r= 5.72, pd= -0.2845, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=248386.40, pd= 1.6620, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.44, pd= 2.6095, lock= >937, snr=41.25) SV= 11, L1 (C/A , r=200875.38, pd= -1.3255, lock= 192, amb=24882774.014, snr=32.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=279279.20, pd= 0.6475, lock= >937, amb=20685679.602, snr=51.75) L2 (C-P/Y, r= 4.24, pd= 0.9120, lock= >937, snr=44.75) SV= 7, L1 (C/A , r=126767.58, pd= -1.5765, lock= 18, amb=24582981.556, snr=36.00) L2 (C-P/Y, r= 6.82, pd= -1.6950, lock= 18, snr=22.00) RTCM3 (2011-04-10T22:38:41.05 delay -26344.) Type 1012: ID= 0, Tk= 32266.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=311259.80, pd= -0.0240, lock= >937, amb=22184641.892, snr=42.00) L2 (P , r= 5.60, pd= -0.2985, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 51527.38, pd= -1.6015, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 4.98, pd= -2.8125, lock= >937, snr=41.50) SV= 22, Freq= -3, L1 (C/A, r=440817.96, pd= -44.0250, lock= >937, amb=19186717.312, snr=50.75) L2 (P , r= 5.88, pd= 0.6940, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r= 97871.48, pd= -2.6375, lock= >937, amb=23383811.724, snr=39.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=258200.44, pd= -3.0635, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 6.82, pd= -2.1710, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 98657.00, pd= 1.3990, lock= >937, amb=21585056.976, snr=44.25) L2 (P , r= 5.94, pd= 1.2120, lock= >937, snr=44.50) SV= 7, Freq= 5, L1 (C/A, r= 14482.02, pd= -0.1270, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 1.16, pd= 1.3870, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=421769.00, pd= 20.2945, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 6.78, pd= 1.1935, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.05) Type 1006: ID= 0, Year=0, GPS=Y, GLONASS=Y, Galileo=N, X= 4581694.6288, Y= 556114.3725, Z= 4389358.4678 QC=1(no bias), height=0.0349 RTCM3 (2011-04-10T22:38:41.05) Type 1004: ID= 0, TOW=194282.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 92471.32, pd= -1.7985, lock= >937, amb=23983396.640, snr=40.50) L2 (C-P/Y, r= 6.88, pd= -2.2485, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 17757.16, pd= 1.6665, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.40, pd= 2.4725, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 36081.98, pd= 0.4665, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 6.02, pd= 0.7930, lock= >937, snr=38.25) SV= 16, L1 (C/A , r= 56455.54, pd= -4.6550, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.06, pd= -4.9590, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=184729.86, pd= -1.8570, lock= >937, amb=23084019.266, snr=43.00) L2 (C-P/Y, r= 7.50, pd= -2.0155, lock= >937, snr=29.50) SV= 15, L1 (C/A , r=228610.92, pd= 1.5475, lock= >937, amb=24882774.014, snr=42.50) L2 (C-P/Y, r= 7.68, pd= 0.3745, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=276970.92, pd= 1.4395, lock= >937, amb=20086094.686, snr=51.50) L2 (C-P/Y, r= 6.98, pd= 2.2915, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=251632.26, pd= -0.3410, lock= >937, amb=24882774.014, snr=34.75) L2 (C-P/Y, r= 6.56, pd= 0.1105, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=247986.08, pd= 1.9110, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.52, pd= 2.8585, lock= >937, snr=40.75) SV= 11, L1 (C/A , r=200241.32, pd= -0.9030, lock= 192, amb=24882774.014, snr=32.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=279119.94, pd= 0.6820, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 4.04, pd= 0.9455, lock= >937, snr=44.75) SV= 7, L1 (C/A , r=126941.22, pd= -2.1640, lock= 19, amb=24582981.556, snr=35.00) L2 (C-P/Y, r= 6.32, pd= -2.2875, lock= 19, snr=21.75) RTCM3 (2011-04-10T22:38:41.05 delay -26345.) Type 1012: ID= 0, Tk= 32267.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=311611.86, pd= 1.3335, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.80, pd= 1.0605, lock= >937, snr=41.25) SV= 21, Freq= 4, L1 (C/A, r= 52049.98, pd= -1.5980, lock= >937, amb=22184641.892, snr=40.50) L2 (P , r= 4.76, pd= -2.8100, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=440855.82, pd= -43.9260, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.68, pd= 0.7940, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r= 97597.30, pd= -3.3315, lock= >937, amb=23383811.724, snr=39.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=258942.72, pd= -3.4395, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 6.92, pd= -2.5475, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 99207.58, pd= 0.9990, lock= >937, amb=21585056.976, snr=44.75) L2 (P , r= 5.62, pd= 0.8110, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 14207.54, pd= 0.2860, lock= >937, amb=19786302.228, snr=44.75) L2 (P , r= 2.24, pd= 1.7990, lock= >937, snr=45.25) SV= 23, Freq= 3, L1 (C/A, r=421251.08, pd= 20.6365, lock= >937, amb=20985472.060, snr=43.50) L2 (P , r= 6.52, pd= 1.5340, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.05) Type 1013: ID= 0, MJD=55621, SOD=21467, Num= 6, Leap=15 ID=1004, Sync=1, Interval= 1.0 ID=1006, Sync=1, Interval= 10.0 ID=1008, Sync=1, Interval= 10.0 ID=1012, Sync=1, Interval= 1.0 ID=1013, Sync=1, Interval= 10.0 ID=1033, Sync=1, Interval= 10.0 RTCM3 (2011-04-10T22:38:41.05) Type 1004: ID= 0, TOW=194283.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 92998.70, pd= -1.6960, lock= >937, amb=23983396.640, snr=40.75) L2 (C-P/Y, r= 7.08, pd= -2.1470, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 17687.40, pd= 2.0805, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 7.00, pd= 2.8880, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 36311.04, pd= 0.6400, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.60, pd= 0.9660, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 56988.48, pd= -4.5230, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 5.92, pd= -4.8265, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=185461.34, pd= -1.7190, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.64, pd= -1.8780, lock= >937, snr=28.50) SV= 15, L1 (C/A , r=228688.30, pd= 1.1020, lock= >937, amb=24882774.014, snr=42.00) L2 (C-P/Y, r= 7.30, pd= -0.0690, lock= >937, snr=22.75) SV= 6, L1 (C/A , r=277017.62, pd= 1.3285, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.76, pd= 2.1805, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=251443.06, pd= -0.0125, lock= >937, amb=24882774.014, snr=34.75) L2 (C-P/Y, r= 7.00, pd= 0.4420, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=247585.92, pd= 2.0435, lock= >937, amb=21285264.518, snr=49.25) L2 (C-P/Y, r= 4.40, pd= 2.9910, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=199608.42, pd= -1.6320, lock= 192, amb=24882774.014, snr=32.25) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=278960.96, pd= 0.5395, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 3.96, pd= 0.8035, lock= >937, snr=45.00) SV= 7, L1 (C/A , r=127113.76, pd= -1.5755, lock= 20, amb=24582981.556, snr=35.00) L2 (C-P/Y, r= 6.34, pd= -1.7035, lock= 20, snr=22.00) RTCM3 (2011-04-10T22:38:41.06 delay -26346.) Type 1012: ID= 0, Tk= 32268.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=311965.98, pd= 0.7615, lock= >937, amb=22184641.892, snr=41.50) L2 (P , r= 6.12, pd= 0.4895, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 52572.90, pd= -1.8805, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 4.32, pd= -3.0930, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=440894.18, pd= -44.2560, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.48, pd= 0.4640, lock= >937, snr=51.00) SV= 14, Freq= -7, L1 (C/A, r= 97322.02, pd= -2.7890, lock= >937, amb=23383811.724, snr=39.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=259683.46, pd= -2.2585, lock= >937, amb=23383811.724, snr=34.25) L2 (P , r= 8.26, pd= -1.3660, lock= >937, snr=39.50) SV= 6, Freq= -4, L1 (C/A, r= 99757.60, pd= 1.2660, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.88, pd= 1.0775, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 13934.00, pd= -0.0945, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 0.86, pd= 1.4185, lock= >937, snr=44.75) SV= 23, Freq= 3, L1 (C/A, r=420733.48, pd= 20.6680, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.58, pd= 1.5650, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.06) Type 1004: ID= 0, TOW=194284.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 93526.00, pd= -1.4940, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 7.14, pd= -1.9450, lock= >937, snr=24.75) SV= 3, L1 (C/A , r= 17618.20, pd= 2.0315, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.88, pd= 2.8370, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 36540.42, pd= 0.5980, lock= >937, amb=21884849.434, snr=48.25) L2 (C-P/Y, r= 5.52, pd= 0.9240, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 57521.54, pd= -4.4275, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.96, pd= -4.7320, lock= >937, snr=39.25) SV= 30, L1 (C/A , r=186192.92, pd= -1.6500, lock= >937, amb=23084019.266, snr=42.75) L2 (C-P/Y, r= 7.96, pd= -1.8095, lock= >937, snr=28.50) SV= 15, L1 (C/A , r=228765.42, pd= 1.0270, lock= >937, amb=24882774.014, snr=42.25) L2 (C-P/Y, r= 7.02, pd= -0.1435, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=277064.08, pd= 1.5380, lock= >937, amb=20086094.686, snr=50.50) L2 (C-P/Y, r= 6.82, pd= 2.3905, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=251254.72, pd= -0.4250, lock= >937, amb=24882774.014, snr=35.00) L2 (C-P/Y, r= 6.68, pd= 0.0325, lock= >937, snr=16.25) SV= 19, L1 (C/A , r=247186.32, pd= 1.6670, lock= >937, amb=21285264.518, snr=49.25) L2 (C-P/Y, r= 4.42, pd= 2.6135, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=198973.94, pd= -0.7700, lock= 192, amb=24882774.014, snr=31.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=278801.80, pd= 0.6960, lock= >937, amb=20685679.602, snr=51.75) L2 (C-P/Y, r= 3.94, pd= 0.9610, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=127287.08, pd= -1.6640, lock= 21, amb=24582981.556, snr=34.75) L2 (C-P/Y, r= 6.56, pd= -1.7920, lock= 21, snr=22.00) RTCM3 (2011-04-10T22:38:41.06 delay -26347.) Type 1012: ID= 0, Tk= 32269.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=312319.72, pd= 0.7075, lock= >937, amb=22184641.892, snr=41.75) L2 (P , r= 6.20, pd= 0.4335, lock= >937, snr=41.50) SV= 21, Freq= 4, L1 (C/A, r= 53095.56, pd= -1.8465, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 4.52, pd= -3.0600, lock= >937, snr=41.00) SV= 22, Freq= -3, L1 (C/A, r=440932.20, pd= -44.1620, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.30, pd= 0.5580, lock= >937, snr=51.50) SV= 14, Freq= -7, L1 (C/A, r= 97048.16, pd= -3.5140, lock= >937, amb=23383811.724, snr=39.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=260426.36, pd= -3.2110, lock= >937, amb=23383811.724, snr=35.00) L2 (P , r= 7.24, pd= -2.3185, lock= >937, snr=39.25) SV= 6, Freq= -4, L1 (C/A, r=100307.94, pd= 1.3440, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.52, pd= 1.1555, lock= >937, snr=45.00) SV= 7, Freq= 5, L1 (C/A, r= 13659.98, pd= 0.1660, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 1.26, pd= 1.6785, lock= >937, snr=45.00) SV= 23, Freq= 3, L1 (C/A, r=420216.42, pd= 20.2010, lock= >937, amb=20985472.060, snr=43.00) L2 (P , r= 6.04, pd= 1.0985, lock= >937, snr=44.00) RTCM3 (2011-04-10T22:38:41.06) Type 1004: ID= 0, TOW=194285.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 94053.62, pd= -1.5915, lock= >937, amb=23983396.640, snr=41.00) L2 (C-P/Y, r= 7.46, pd= -2.0425, lock= >937, snr=24.00) SV= 3, L1 (C/A , r= 17549.28, pd= 1.8115, lock= >937, amb=19786302.228, snr=53.25) L2 (C-P/Y, r= 6.74, pd= 2.6175, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 36769.60, pd= 0.8740, lock= >937, amb=21884849.434, snr=48.00) L2 (C-P/Y, r= 6.06, pd= 1.2010, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 58054.64, pd= -4.2815, lock= >937, amb=21884849.434, snr=49.25) L2 (C-P/Y, r= 6.14, pd= -4.5865, lock= >937, snr=38.75) SV= 30, L1 (C/A , r=186924.58, pd= -1.6220, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.62, pd= -1.7810, lock= >937, snr=28.50) SV= 15, L1 (C/A , r=228842.46, pd= 1.1570, lock= >937, amb=24882774.014, snr=42.75) L2 (C-P/Y, r= 7.30, pd= -0.0115, lock= >937, snr=22.50) SV= 6, L1 (C/A , r=277110.84, pd= 1.5375, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.86, pd= 2.3890, lock= >937, snr=44.00) SV= 8, L1 (C/A , r=251065.90, pd= -0.2360, lock= >937, amb=24882774.014, snr=35.50) L2 (C-P/Y, r= 6.38, pd= 0.2135, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=246786.30, pd= 1.7675, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.34, pd= 2.7140, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=198339.92, pd= -0.3540, lock= 192, amb=24882774.014, snr=31.00) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=278643.16, pd= 0.4580, lock= >937, amb=20685679.602, snr=51.25) L2 (C-P/Y, r= 4.00, pd= 0.7225, lock= >937, snr=44.00) SV= 7, L1 (C/A , r=127459.46, pd= -0.6895, lock= 22, amb=24582981.556, snr=34.25) L2 (C-P/Y, r= 7.52, pd= -0.8175, lock= 22, snr=21.75) RTCM3 (2011-04-10T22:38:41.06 delay -26348.) Type 1012: ID= 0, Tk= 32270.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=312674.06, pd= 0.1920, lock= >937, amb=22184641.892, snr=41.00) L2 (P , r= 5.62, pd= -0.0825, lock= >937, snr=41.00) SV= 21, Freq= 4, L1 (C/A, r= 53618.54, pd= -2.0745, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 4.06, pd= -3.2890, lock= >937, snr=40.50) SV= 22, Freq= -3, L1 (C/A, r=440970.48, pd= -44.2415, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.54, pd= 0.4785, lock= >937, snr=51.50) SV= 14, Freq= -7, L1 (C/A, r= 96774.00, pd= -3.7720, lock= >937, amb=23383811.724, snr=39.00) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=261168.40, pd= -3.2675, lock= >937, amb=23383811.724, snr=34.75) L2 (P , r= 6.68, pd= -2.3755, lock= >937, snr=39.25) SV= 6, Freq= -4, L1 (C/A, r=100858.70, pd= 1.1255, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.62, pd= 0.9370, lock= >937, snr=45.25) SV= 7, Freq= 5, L1 (C/A, r= 13387.12, pd= -0.5625, lock= >937, amb=19786302.228, snr=45.00) L2 (P , r= 0.78, pd= 0.9510, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=419698.84, pd= 20.2850, lock= >937, amb=20985472.060, snr=43.25) L2 (P , r= 6.34, pd= 1.1820, lock= >937, snr=44.25) RTCM3 (2011-04-10T22:38:41.06) Type 1004: ID= 0, TOW=194286.000, More Data=Yes, GPS-Sats=12, GPS Smoothing=No (No smoothing) SV= 21, L1 (C/A , r= 94581.24, pd= -1.6760, lock= >937, amb=23983396.640, snr=40.25) L2 (C-P/Y, r= 7.18, pd= -2.1285, lock= >937, snr=24.50) SV= 3, L1 (C/A , r= 17480.32, pd= 1.7165, lock= >937, amb=19786302.228, snr=53.00) L2 (C-P/Y, r= 6.40, pd= 2.5235, lock= >937, snr=44.50) SV= 18, L1 (C/A , r= 36999.50, pd= 0.5165, lock= >937, amb=21884849.434, snr=48.25) L2 (C-P/Y, r= 5.86, pd= 0.8425, lock= >937, snr=38.50) SV= 16, L1 (C/A , r= 58588.22, pd= -4.5490, lock= >937, amb=21884849.434, snr=49.50) L2 (C-P/Y, r= 5.74, pd= -4.8545, lock= >937, snr=39.00) SV= 30, L1 (C/A , r=187655.82, pd= -1.1490, lock= >937, amb=23084019.266, snr=42.50) L2 (C-P/Y, r= 7.86, pd= -1.3095, lock= >937, snr=29.00) SV= 15, L1 (C/A , r=228919.14, pd= 1.7445, lock= >937, amb=24882774.014, snr=43.00) L2 (C-P/Y, r= 8.08, pd= 0.5780, lock= >937, snr=21.50) SV= 6, L1 (C/A , r=277157.66, pd= 1.5455, lock= >937, amb=20086094.686, snr=50.75) L2 (C-P/Y, r= 6.92, pd= 2.3965, lock= >937, snr=44.25) SV= 8, L1 (C/A , r=250877.00, pd= 0.1310, lock= >937, amb=24882774.014, snr=35.75) L2 (C-P/Y, r= 6.96, pd= 0.5855, lock= >937, snr=16.75) SV= 19, L1 (C/A , r=246386.44, pd= 1.7440, lock= >937, amb=21285264.518, snr=48.50) L2 (C-P/Y, r= 4.56, pd= 2.6905, lock= >937, snr=41.00) SV= 11, L1 (C/A , r=197706.84, pd= -0.8745, lock= 192, amb=24882774.014, snr=31.50) L2 (C/A , r=---------, pd=---------, lock= 0, snr= 0.00) SV= 22, L1 (C/A , r=278484.30, pd= 0.5410, lock= >937, amb=20685679.602, snr=51.00) L2 (C-P/Y, r= 3.96, pd= 0.8055, lock= >937, snr=44.50) SV= 7, L1 (C/A , r=127633.76, pd= -1.5415, lock= 23, amb=24582981.556, snr=34.25) L2 (C-P/Y, r= 6.70, pd= -1.6710, lock= 23, snr=21.50) RTCM3 (2011-04-10T22:38:41.06 delay -26349.) Type 1012: ID= 0, Tk= 32271.000, More Data=No, GLONASS-Sats= 8, GLONASS Smoothing=No (No smoothing) SV= 13, Freq= -2, L1 (C/A, r=313028.74, pd= -0.5300, lock= >937, amb=22184641.892, snr=41.75) L2 (P , r= 4.70, pd= -0.8040, lock= >937, snr=41.00) SV= 21, Freq= 4, L1 (C/A, r= 54140.82, pd= -1.5650, lock= >937, amb=22184641.892, snr=40.75) L2 (P , r= 4.54, pd= -2.7795, lock= >937, snr=40.50) SV= 22, Freq= -3, L1 (C/A, r=441008.62, pd= -44.1140, lock= >937, amb=19186717.312, snr=51.00) L2 (P , r= 5.26, pd= 0.6065, lock= >937, snr=51.25) SV= 14, Freq= -7, L1 (C/A, r= 96498.16, pd= -2.2155, lock= >937, amb=23383811.724, snr=39.25) L2 (C/A, r=---------, pd=---------, lock= 0, snr= 0.00) SV= 12, Freq= -1, L1 (C/A, r=261909.44, pd= -2.3225, lock= >937, amb=23383811.724, snr=35.25) L2 (P , r= 8.10, pd= -1.4305, lock= >937, snr=40.00) SV= 6, Freq= -4, L1 (C/A, r=101409.30, pd= 1.1835, lock= >937, amb=21585056.976, snr=44.50) L2 (P , r= 5.64, pd= 0.9945, lock= >937, snr=44.75) SV= 7, Freq= 5, L1 (C/A, r= 13113.80, pd= -0.6875, lock= >937, amb=19786302.228, snr=45.25) L2 (P , r= 0.96, pd= 0.8265, lock= >937, snr=45.50) SV= 23, Freq= 3, L1 (C/A, r=419180.80, pd= 20.8535, lock= >937, amb=20985472.060, snr=42.75) L2 (P , r= 6.84, pd= 1.7500, lock= >937, snr=43.75) gpsd-3.15/test/rtcm3-2.log0000664000175000017500000007346412461156335013442 0ustar esresr# Name: Ntrip caster log from http://www.euref-ip.net/ # Description: RTCM3 data from an Ntrip caster # Submitted-by: Chris Kuethe # Date: 2011-03-01 # Notes: The NTRIP source table entry is: # STR;GRAS0;Grasse;RTCM 3.0;1004(1),1012(1);2;GPS+GLONASS;EUREF;FRA;43.45;6.55;0;1;TRIMBLE NETR5;none;B;N;2400;rgp-ip.ign.fr:2101/GRAS1(1) @ ïýlf…Ž fÿCÏÁNöd2é5+úœ~ Ð4ÿCMªÙ>Ë¿Ññp3€W+ýkïÝûŽtŠÒ@oi€-ô\Œ 0Žÿb9Zª3ôº–)N`©þ›êÆ@(Šöӊ?@=dÌ¢¶0áúZd ÅÿL©`…FôÒþ–…“úí¿Ò,%8ù[©r ÊA4ù‡[`ºþ‹¯éæH ƒ&97?Žúyê™ÿ>0b­ •þ’Õ”َ`nòwÿÿ¡Ž@D~?ök•`ŠÚ UÿèëP@@‹ýp9ÌÔÓÄ>À.ME‚ÀTNaiþÙ?Ô*0X¿Ï3û amðÐþ…«‚ÄÅ¿ì’K€2ïôœ,ð ÿ4€."§÷Eÿ€ä`‘~Ö§ùnj/!_ã…ý6·Ëü.ÿŒªƒ©?êtx/Àëýlf…͐µCÏÁE"öD2ߏ€“úœv (EÿAMª;b¿Ññ09acý kèpûtŠÜ@oX’6çô\Ì pðÿb9[+Kóö)Là§þƒrÆ@ô`_ӊ?@=eI¢¶AÀ úZd€ÿL©`‹šÿõ;þ–}{û¿Ò¬%9©Åÿ ÊAHïùg[(¥þáéæH ƒ&]Wÿ–#úy?ì€ÿ>0b³›Ð þ’ÕŒñÙ`nÃþ‘¡Ž@aoö‹•`Ak /èëQ€2[ýpŽUÓÄ>À.MU"ÀTO/Oþ9ßÔ)pP»Kû@a~` þ…§‚‚Œ¿ì’%é,çôœL Gÿ6€/ŸK÷Z?€ãà–þÙ/ùçŒ@ï_áùý6³Ïûý¿Œª&Мoêt˜.€cý`f†  üCÏÁV+?ö2Õã súœ† >M©ÒŸ¿Ñðð4ÀU‡ýkà\ ‡vŠÜ@oH'7—ô\Ì ` ÿb9[«ÃôïÖ©KàÂ~¢jÕÐí ôӊ?@=eÆ¢¶R^GúZ„oÿ ÿL©`‘ðßóyþ–‰?ú—¿Ò,%9+_š÷ÿ Ê@è_ùgZñþ,éæH ƒ&{—×úyìíÿ@0bº7 /þ’Ñì:¿ÙŽ`m2P@?¡³@NÍö˕_Ûå !¿èëR@3‹ýxêuÓÄ>À.MdÂÀTOüÉþšŸÔ)pY?É ûaŽ@Sþ…©‚˜–ì’;†-§ôœL0\ÿ6€1Yã÷¬?€ä`œþãwùçŒR·ÿîý6³+ý€Ÿª4>Œ?êtž-_ÿGýpf†KžyCÍÁ_:Ïõä2Ì4À·úœ– øšÿCM©àÑñ09@Y·ýkؙ° NvŠÖ@o7Ÿ9Çô\Ì Ð Mÿ`9\,õvÖ©K`Ëþ³zÕ £a„ÓŠ?@=fC¢¶c@¯úZ„¯ÿgÿP©`˜Eïôþ–}úÀ¿Ñ¬%9DS© ÊAùGZ¹JýŒŸéåˆ ƒ&¥Ÿ?™3úyíDÿ@0bÀÏ  Jþ’ՁÙ`lRïÿšÿ¡³@#£ßöë•_vU B/èëPTÀ;§ýpy¢kÓÄ>À.MtbÀTPÊkþ»Ô)p[Ëgû ažà ¢þ…©‚€ÿì’Q%0÷ôœ\Äÿ4€2õÓ÷Rÿ€ã`ž~ØOù÷Œd‰?å‡ý6«çümÿŒªAŽŽïêtØ.@Wýhf†Šà)ÿCÊÁjPïõÄ2›ôƒúœ– p`EMšbrÁ_Ñð°7ÀUÛý kÐÜðávŠÜ@o'a€$çô\Œ ð¯ÿ`9\­Ÿõ<—)Là¹~¬:å€UKӊ?@=fÀ¢¶s×ÀßúZDàºÿR©`ž?ïœþ–yùŸѬ%9]{šÜÿ Ì@âù'Z9þ@oéåˆ ƒ&ÉŒ«Ûúxä_ñíÿ@0bÇjP ùþ’ј­?؎`kskÿ™¡Ž@D£Oö«•_ ÀoèëPQ@/ýˆ“œÓÄ>À.M„ÀTQ˜Uþ_Ô)0Oÿ·Sû(a¯@3þ…§‚œ’ì’fË(?ôœLà­ÿ2€4‘gø?€ã`Ÿ~íçùnjvW?åGý6«¿üe»ªNÿ˜_êtø/Çý„f†ÊàÿÿCËÁS+Ïö$2žë€ Ûúœ– lÿEM§ÄÒ«ÿÑðp6@S'ýkÉÀòvŠÚ@oû/§ô\Ì Àÿ`9].·õH)K`¿~­‚åpYhÖӊ?@=g=¢¶„•ÀÓúZ$€wÿP©`€ïùþ–}#ûø¿Ò,%9vG©« ËAB/ùgZIaþFŸéåH ƒ&íÔÿÊãúxä?ù¯ÿ>0bÎ bþ’Õxَ`j“È'¡Ž@SÆïö«•^«‹ ¹/èëSÀcýx_ÜêÓÄ>À.M“¢ÀTReœþœÿÔ)pTÿËËûpa¿€Çþ…©‚˜ğì’|g>ôœ\à xÿ4€6-—÷Iÿ€ã`š~×/ùnjˆ$ßæOý6¯³ü†¿»žª\wvßêtø,ßü™ýdf‡ àCÌÁDŸö2¯Mÿû³úœž MÿIM§'ô¿Ñð09€\?ý!kÁbþ©xŠÜ@o“€CGô\ì   |ÿ^9]¯³õÅשI`Ä~œ*õ@œI6ӊ?@=gº¢¶•V€%ÃúZ4PqÿP©`«FÏô0þ–…ƒúÿÑ,%9›©F¿ Ì@Û(ïùgZÿ‰ßéåH ƒ'ÿ¶÷úxä¯ô¶ÿ<0bÔ£ÀÅþ’ÑÈÿَ`iµþæ?¡µ@7vŸö˕^Eé OèëV€/gýprá±Ó/@ASH701945E_M NONE24222 TRIMBLE NETR5?ŸªÓÄ>À.M£BÀTS3kþµßÔ)pS¿Ê³û8aÑp Óþ…§‚Œ†?ì’’-¿ôœ\À^ÿ4€7ÉW÷Ó?€ã`›þèGù·Œ™ó¿ä«ý6³ üQÿŒžªi۔?êtø.àCýdf‡JPîÿCÌÁV)oõä2¥¬¿ö—úœ¶ جÿMMЉ†»¿Ñð09U+ý!k¹£_þ%xŠâ@nöJô\¬ Pvÿ^9^0«öƒ—©I`Æ~Ԃõ`{g’ÓŠ?@=h7¢¶Š.ø{úZDOüÿN©`±šßø·þ–ïûå?Ò,%9š‹ª? ÌAWŸùgYÙÿ¯éå ƒ'6>ÿ{ïúy/åõÿ>0bÛ> ãþ’Ñd'?َ`hՋÿ®¿¡µ@*š¯÷ •]àM \èë\Bý€‚ËÓ?ASH701945E_M NONE24222֓ÿÓÄ>À.M²âÀTT)þ‹_Ô)ðTÿÅ[ûaâ šþ…¥‚€žßì’§Â&÷ôœlÀ„ÿ6€9e÷‚ÿ€ã`”þÞ7ùnj«Ÿíûý6³#ý|»žªwG­êtø-À_ýhf‡ŠH¿CÊÁK#ö$2œ ?ø«úœŠ žïGM¥ëü‘¿Ñðp4Oßý)k±å¿û"xŠâ@nåà€:_ô\Œ bÿ\9^²“õØ)I`°~š#0$œ5ӊ?@=hŽ¢¶¶â@)3úZ4EÿN©`·õÿìþ–·øŒ?Ò¬%9Á‡ªÊ¿ ËA‰ßùgY¡Áþÿéåˆ ƒ'ZU¿¡Wúxä¯ïQÿ@0báۀþ’ѐŽÙ`gö@Y¿¡Ž@GÓO÷ •]zî OèëPR€/Ûý€×.­Ó>à ªçpKxQ­J8Bó&]|ÇÁÓÄ>À.M‚ÀTTÎßþwÿÔ*pV¿Âçû@aôà }þ…©‚€{?ì’œn€'ôœl —ÿ4€;ƒ÷¶€ã` ~ä§ù·Œœ?èÕý6· ü×ÿ»ª„®¿êtø-À‡ýlf‡ÊXšCÆÁm ¿ö$2’g?ÿ£úœ¶ ËJM¥NVžßÑð°5TËýkª$ÐYxŠÚ@nՑ(ô\L €ÿ`9_3ÃõœØ)J`»~Œ3ð(}çӊ?@=i1¢¶Ç¿¿÷ úZdû¹ÿP©`ŸIÏòþ–sú>?Ó,%9Û'ª! Ì@ù_¯ùGYiþÿÏéåÈ ƒ'~gÿÓúxäŸûŒÿ<0bèw rþ’ÕtJÙ`g‡ÿú¡µ@A»¯÷ •]ƒ ìèëM@&ý€ƒXùÓ?PÙE)ʘ<û GÝd?!ú@Öȁ0@éA‹ÓÄ>À.MÒ"ÀTUœyþ°¿Ô*0T?ÉûûXa–þ…©‚¬žì’Ó3ÿôœLÀ %ÿ2€<ã÷.¿€ã`š~Ó§ù׌Ï]Ÿê?ý6³Cýÿžžª’[sïêtØ+¿ü1ýlfˆ ÀCÇÁ`C¯öD2ˆÃ@ Gúœž  \ÿIM€°Ò™_Ñðð4€PÓý!k¢fpzŠà@nÅ6€9'ô\L  6ÿ`9_µ'öØ)JàŒþƳàÔӊ?@=i®¢¶Ø“¿à›úZ” ŸöÿN©`ĞOöëþ–“ûqÓ,%9ôë©I Ì@ó)ùGY2zþ¬oéåÈ ƒ'¢“¿ÅcúxÔOøUÿ<0bï0 Kþ’ÑÔ?Ù`f8çÿ©¿¡Ž@#§öë•\° ÃÿèëGÀýxD*–ÓÄ>À.MáÂÀTVj!þÅÔ)ðU¿Ìgû0aÐçþ…©‚šì’èˀ1ÿôœL æÿ4€>9ÿ÷pÿ€ã`ž~Ûïù÷Œá.?æQý6«ëü†¿ºžªŸÄœOêu0 _ýlfˆJžÀÿCÈÁZ#¿ö$2€!/úœ– ØúJM€<¯Ñðð7S“ý!kš©Oû›zŠæ@nŽê€+ßô\| ðÿ`9`7õ?Ø)Hà€~¬«pž ӊ?@=j+¢¶éN ËúZt hÿR©`Êöÿñ‚þ–óú¿Ò,%:»št Ë@ïÿô_ùgXúäþz_éå ƒ'ÆÅÿš/úxÄïñÿ<0bõ²p þ’Õ<îَ`eZ‹þô?¡µ@3zöë•\J€ œ¯èêÐHÀwýxÀ‘êÓÄ>À.MñbÀTW7õþmÔ)ðSÁ_û(a,0 þ…«‚Œn¿ìÒþ|€9?ô›ìP Ìÿ2€?Ö/÷¢€âàšþâ'ùnjòýßå/ý6«/üa»žª­aÏêu/?ÿßýhfˆŠðCÉÁ]/ö$2u‹@oúœŽ šàÿGM£uŽ©ÿÑð°5@Rëý!k’êüâzŠè@n€›€,§ô\| À§ÿd9`žóôŒ©I`¡~œ+pœt]ӊ?@=jš¢¶ú@#úZT0€ÿP©`ÑM?ò‡þ–…kúVÿÒ¬%:'Ç©ªÿ ÌAAÿùgXÃ'þŒoéåˆ ƒ'êå?ºÛúxŽ/õµÿ>0büMà þ’ÕøuÚ`d{›ÿö¿¡µ@FºŸ÷ •[äó M_èêPU>gý€µ ~ÓÄ>À.NÀTX…þÄ¿Ô*0V?Ì_û a>ð ¹þ…«‚”‚ì’4€6Ïôœ  ÿ4€Arƒ÷«ÿ€â`›~ãOù׍Éßíçý6¯?ýx»ªºÎí/êu4@ eý`fˆË×CÊÁY&ö$2k÷¿÷ïúœ– èÓÿJM¢ØHoÿÑð°4K§ýk‹( ïzŠì@n”P€+Ÿô\Œ ð†ÿ`9a9¯÷P˜©J`°þï›pÊèӊ?@=k%¢· Ø@ƒúZdpÿR©`×£¯ó‘þ–…Oú™¿Ò¬%:A{©m¿ ÊA2¯ù‡X‹aÿ(éäÈ ƒ(¿£‹úx€ïßÿ>0cìp‰þ’ÑžOÿڎ`c5ÿ¡Ž@:Êöë•[ þ_èêMÀ*£ýˆýtÓÄ>À.N¢ÀTXÓwþ*ßÔ*0P?¹'û8aQлþ…­‚²¢ßì’)ï€2¯ôœ,ùÿ4€Cã÷ž?€â`›~ä×ùǍœ_æ¹ý6³ÿü’ÿºªÈ‘}ÿêtØ.ßýsý`f‰ HœÿCËÁO/ö$2b]ÿù¯úœŠ  JM¢:À…_Ñðð6ÀNSý!kƒlý|Šô@n„*ÿô\¬ ðrÿb9aŒö˜©Jà”~È+pTdӊ?@=k¢¢··@ÏúZ4«ÿR©`Ýû_ñ×þ–‰ú*¿Ó¬%:[©¿ ËAGù§XSºÿWÏéå ƒ(39?­#úx„òEÿ<0c  xþ’Ù ¿ÙŽ`bŸ¬Œÿ¡Ž@dà?ö«•[- óŸèêÐI'óýˆë‰ÓÄ>À.N BÀTY ×ÿÔ)0Y¿Ô§û aeÀþ…­‚”Œ?ìÒ?°€'ôœ<—ÿ6€D«[÷Ÿ€ã`™þå—ùç(mäÓý6³—üV?»ªÖ Ú?êtž0Àõýhf‰MHCÊÁMö$2XÈÿóÇúœ® ˜VIM¡,Ê_Ñðð6@Vûýk{¬;|Šø@nsÁ€.ô\œ PÙÿd9b>;õaØ©Kàþ²cpÔ=‘ÓŠ?@=l¢·,‘À ÛúZTpiÿP©`äPïõíþ–‰·û0Ѭ%:uCšx? ÌAÿõù§XÿƒßéåH ƒ(WRÿÐïúx€Ÿû9ÿ:0c-@þ’Ù¬<¿ÚŽ`aáÿd¡Ž@@–ö˕ZŽã Oèë?€#ýxïÜ*ÓÄ>À.N/âÀTZn‡ÿŸÔ(ð_¿ÖÇû0ayPÒþ…¯‚Š¥¿ì’Uo€&Wôœ\`oÿ:€FG÷÷…€âàœ~Þgù׍::?ìý6¯?ý?ºžªãˌŸêtž/ÿAýdf‰ÈÿCËÁ^+ïö2O)@ 7úœ® šEÿGM ÿŠó?Ññ09@\ý!ksî@i|Šô@nc€€)ô\Œ À4ÿb9bÀoôÞÙ)I`~þ¢c$Pw·'ӊ?@=lœ¢·=j@{úZ„ÿMÿL©`êª/ñþ–‰3ùøÿÒ,%:Ž¿©7¿ ÌA$ïù‡WäŸÿs_éåH ƒ({€Ãúx„÷œÿ>0cË0 Õþ’Ñ8bÚ`aSþ‹?¡Ž@ _ßö«•ZOn ™èëPD€sýˆP¥òÓ/@ASH701945E_M NONE24222 TRIMBLE NETR5?ŸªÓÄ>À.N?‚ÀT[À.NO"ÀT\ /þŽ_Ô(°WÿÅgû(a¡Ð8þ…©‚²쒀ï€1ÿôœLâÿ8€I7÷v?€â`™þÜwù·]Ý_åÓý6§ÓüvºžªÿÆÏêtØ1`‹ýlfŠh·CÌÁDöD2<€'úœ¶ žÙIMŸÄÊíÿÑñ08€[_ý!kdtøe~Šô@nC€ ¯ô\ü 0*ÿ`9cÄOõÒÙ)G`~Á$TÉzӊ?@=m–¢·_À¯úZtà]ÿL©`÷Y/ñ/þ–…ëùÿ¿Ò,%:“©¿ ÌAOùgWuªÿw_éåÈ ƒ(Ã׳oúx”ŸóÔÿ<0c$ 0 gþ’Õ ¿Ú`_GGÿx¡Ž@7›?ö‹•Y„w Ö¿èëO€ »ýxüfŒÓ>à ªçpKxQ­J8Bó&]|ÇÁÓÄ>À.N^ÂÀT\×÷þnŸÔ(ðWÿÁ_ûPa ·p þ…§‚|oì’–º'gôœ<€ÿ8€Kï÷nÿ€ã`‘þۏù·o¯¿á}ý6«§û뿺ž« ϕêt˜.@OýhfŠQˆCÍÁK Oö$22|?ëëúœŸ 7ÿRIMŸ'xžŸÑðð8ÀTÃýk\Ž_ü†~Šô@n2ǀ,ô\Ü €£ÿ`9dFÓõ(Ù)H`‚~«s$Ðãd£ÓŠ?@=n¢·oñ€ ¯úZTPâÿL©`ý±ðîþ–‰·ùïÒ,%:Ü?©»ÿ ÌAFù‡W>€þÌ¿éæ ƒ(连wúx€ÿî–ÿ>0c*ªà 'þ’Ñ€õÿÙ`^i×þð?¡µ@$y/ö«•Y €oèëJ#ý€ƒ )Ó?PÙE)Ϙ<û GÝd?!ú@Öȁ0@¶û³ÓÄ>À.NnbÀT]¥åýôŸÔ)pT²û a ːžþ…©‚ž¿?ì’¬}6ôœ<` uÿ8€Lº»÷aÿ€ã`’~Ù÷ùǍ?äõý6³ƒüZÿ»«—o_êt8-?û•ýtfŠ’hMÿCËÁ]5?öD2(ဇúœ¶ ˆ†CMž‰üúÑð°;À\ÿý!kT÷ß÷Þ~Šö@n"’€'ô\Ì  øÿ^9dȳöQ©HàŽ~Ð[4 $÷ӊ?@=n¢·€ÇÀÓúZ4¯ÿL©aÿótþ–…óú¿Ò,%:öS© ? ÌA?/ùGW/þ–ß鿈 ƒ) ,?­oúxŽòPÿ:0c1Mòþ’Ñ èÚ`]ŒcþÊÿ¡³@ oÏö˕X¹‰ oèëUÀ.#ý€Ë@†ÓÄ>À.N~ÀT^sþKÿÔ)0R¿œ û8a áð Cþ…§‚€sìÒÂH€7/ôœ< ˆÿ6€NW¿öð¿€ä`þËßùǍ“Né¡ý6³Güï?»ž«(J‹¿êtX/ÿ'ýpfŠÔpþÿCÊÁB ?ö„2TÀ›úœ¶ `îÿIMì¶ÀßÑð°5@UÃý!kM;ÿñÓ~Šø@n^'¯ô\Œ 0 ÿ\9eJsøY©Ià¥ÿ‹5›kӊ?@=o ¢·‘¬À súZDÐTÿH©a `ófþ–‰úŒÒ,%;w©„ÿ ÌA8OùGVÏÄþŽÏ鿈 ƒ)0Oœ[úx”/öLÿ:0c7ïp»þ’ÙÔ›?َ`\®\\?¡³@KÔ/öë•XT 4èëY8ýx6¶ZÓÄ>À.N¢ÀT_Aþ¢¿Ô)ðX¿ÇÏû0a ö Éþ…©‚šÄ?íØ€7ôœLÐ „ÿ4€Oôo÷tÿ€ä`›~ÜWù§¥!?å»ý6¯Ãürºž«6­¯êt/ _ýdf‹ØƒÿCÊÁZïöD2ÀÀúœ® hÿJMOb³ßÑð°;ÀT#ý!kE~Oð€Šú@n,(¯ô\Œ  *ÿ\9eÍËõÜÙ©Gà“þÁÓ5 »2ӊ?@=oŠ¢·¢ŠúZDÀµÿH©aŽßüþ–‰gü·?Ó,%;*©© ÌAAùGV˜”þP鿈 ƒ)Tn׿úxįüåÿ<0c>‘°iþ’Õ8Eÿَ`[Ðô±¡³@Oé_÷ •Wîç ‘ŸèëÐC@oýxŸšÅÓÄ>À.NBÀT`ÑþÆßÔ)°Z?ÌOû0a þ…©‚š«_ííê€/ŸôœL•ÿ8€Q‘o÷a¿€ä`’þÙçù·¶ñ_éOý6³+ü庞«Cèbêsø,úýlf‹WxÞÿCËÁT'Oö„2 <ÿý»úœÆ H”ÿLMœ²šŸÑðð0@R¿ý!k=ºoþ8€Šþ@mñû/?ô\Ì ûÿ^9fPöŽ©G`žþÜÃ50-&âӊ?@=p¢·³q@ÃúZ4Ïþ#ÿL©aÿ÷àþ–§ûª¿Ñ¬%;DÛ©|? ÌA6/ùgVaý»ï鿈 ƒ)x•?à£úxÄÿÿ"ÿ@0cE2ð¹þ’ÙüÚÚ`Zô?ÿ«?¡²@&§ÿöë•W‰j ÉOèëÐK@ký€‹óPÓÄ>À.N¬âÀT`ÜëýìßÔ)°S?±ûHa $ aþ…©‚¢w_ìÒ »7'ôœ\  …ÿ6€S.¯öÓÿ€ä`˜þÈù·ÈÇ_Þ­ý6³ƒû‘?Œ«Q›©¿êt81àçýlf‹™h¹ÿCÌÁL"Ÿö„2µÿõƒúœ¶ ‰ÿJMœÀ¶_Ñðð5ÀTsýk5üý‘€§@máÑ+Ÿô\Ì ‡ÿ^9fÒóö,)E`~Ë«E`Š$ ӊ?@=p„¢·ÄZògúZTúŠÿL©ahõpþ–»û ¿Ò,%;_©²ÿ ÌACÏù‡V*þŸéæ ƒ)œÛ›³úxäíæÿ>0cKÕ ‘þ’ÕP¿ÚŽ`ZÄÐ?¡²@Xñ/öë•W$ ¬/èëPG@ý€tP£ÓÄ>À.NŒ‚ÀTaªƒþ\¿Ô*0Rÿ¿ûa:à Ïþ…­‚’eí ”/wôœl`‘ÿ6€TËÇöÐÿ€â`—~Ç¿ù·Ú˜¿à ý6³£û»¿»«_`ŸêtX,ŸùÁýhf‹ÛH ÿCËÁN-/öD1ù*üúœÎ ˆ\IM›wz®ŸÑðð4€S{ýk.?/ût€§@mѯ÷ô\¬ àqÿ^9gTïøZ)Cà¹ÿ E0»…ÓŠ?@=q¢·Õ))¯úZd°_ÿL©a#Á/õžþ–}£û¿Ò,%;y{©? ËA 6ÏùgUòÓþ¯éæˆ ƒ)Á ?‘“úxԏë\ÿ>0cRx Wþ’ÑT?َ`Y:(?¡²@AÄ/ö˕VŸ‡ ¯èëPU€-Gý€BùçÓÄ>À.NÌ"ÀTbwûÿ¿Ô(ð^ÿ×3ûXaQŒþ…­‚ ¢ì’ /m.¯ôœ| vÿ2€VhÇ÷2ÿ€âà›~ÓÿùǍìk?ßý6³ûœÿºž«mT‘ÿêt˜-ÿÿñýdfŒxéÿCÊÁR(Ÿö1ïžÀKúœÖ è£IMšÚ2¶ßÑðð5ÀT‡ý!k&ƒÏô™‚§@mÁƒ€)‡ô\œ Dÿ`9g׏øŠZ)>`ËÿëE@Õöӊ?@=q~¢·æ @2GúZ4À ‰ÿP©a*/øþ–·û±¿Ò,%;“Û©“ ËA;ïù‡U»šþ ïéåˆ ƒ)å6ŽÏúyêªÿB0cY0pþ’Ù‡?Ú`X]·ÿV¿¡²@0’Ïö‹•VYD ºèëPMÀ£ý€ÝªîÓ/@ASH701945E_M NONE24222 TRIMBLE NETR5?ŸªÓŽ>À.NÛ°TcFþG_Ô)pTŒSû0ahÐ cþ…­‚šw_ì’ EH.ôœl cÿ6€Xë÷Xÿ€â`“þØ¿ù§þ8ëƒý6¯gý*º«{;êtž,ßý›ýlfŒ_DCÇÁ^3ïõä1æ¿ôûúœÖ @{IMš<üšÿÑð°7@QýkÏùւ§@m±d€Çô\Œ  êÿ^ùÏӊ?@=qû¢·öñ:óúZà µÿN©a0qïø­þ–uûÜ?Ѭ%;®c©b? ÌA/Ÿù§U„3þ_éåˆ ƒ* h¿|ßúyOæ-ÿ@0c_¿ 'þ’ÑŒô¿ÙŽ`WÿG¡³@8ö‹•UóØ ÓèëPH@ûý€‡L¡Ó?ASH701945E_M NONE24222֓ÿÓÄ>À.NëbÀTdÍþt¿Ô)°UÿÁïûa€P ‰þ…©‚¢|_ì’ [%/çôœ\Оÿ4€Y£O÷¿€â`–~ϧùǎŸâý6¯Ãü ÿŒ«ˆûÜßêtž2  aý`fŒ¢0ŠÿCÈÁU ö1ܑ ûúœæ ›ÿGM™Ÿ¶µ?Ñð°7ÀTOýkßó@m¡>.ÿô\Œ ðÿ`9hÜl€):`ï°ÀŽÕˆÓŠ?@=rx¢žòßúZd¯þjÿJ©a6Ëïö¶þ–y×û]¿Ñ¬%;ÈÓ©œ¿ ÌA>ù§UM'þAéåˆ ƒ*-‹ÿ‘ûúxä?ësÿ@0cfb þ’Õ˜°¿ÙŽ`V€·þ@7xÿö‹•UŽr ãèëKÀ#óýˆïZCÓ>à ªçpKxQ­J8Bó&]|ÇÁÓÄ>À.NûÀTdáeþéŸÔ)°XÿЇûa—Ð/þ…©‚–ÿì’ q €Gôœ\Àjÿ2€[@g÷š¿€âà™~àçùǎ!Þé;ý6¯;üá?ºž«— |¿êtØ,ÿýSýhfŒä`OÿCÊÁY5/õä1Ó€úœæ È`ÿEM™rÐÑð°7€W«ý kF¿ûx‚§ @m‘$€$'ô\| ˜ÿ^9i_>À©;àô*È XÜÌӊ?@=rõ¢žßÿüúZ„üõÿN©a=&ôrþ–}úÌÿÒ,%;ãG©äÿ ÍAPOù§UýþMOéåÈ ƒ*QÂ?w?úxôOäÄÿ@0cm° 8þ’Ñ,x¿Ù`UÈ7ÿ&?¡³@<†¯ö‹•U) ÿ¯èëN@*óý€“«Ó?PÙE)Ԙ<û GÝd?!ú@Öȁ0@®‘àÓÄ>À.O ¢ÀTe¯MþœÔ)°TÆÛû8a°  oþ…©‚˜XÿìR †í€_ôœl`ÿ2€\ÝÏ÷Ž€â`þß_ùǎ3²ÿäûý6¯»üX¿º«€ö‰êtØ.¿þçýhf'(ÝCËÁN&ßö1ɔø¿úœæ ôÿCM˜eBÇÿÑðð4€V«ýk‰où”„§@m2ïô\Œ °pÿ\9i⠁);àç€ $p²ÎœÓŠ?@=sr¢ž)¿@³úZt€œÿL©aC|ÿú÷þ–[ün?Ò,%;þ©š? ÎA@ÿù‡Tßýí_éåÈ ƒ*uáÿ–Gúy¯ì†ÿB0cs­P”þ’ÉO¿Ù`TëÏÿq?¡³@-™_ök•Tí ö/èëT@(ýx?µšÓÄ>À.OBÀTf}5þX¿Ô(ðX?ŸsûaÉ` Áþ…©‚lBÿì’ œË3¯ôœlÀ ÿ4€^{o÷'¿€ã`”~ÒùǎE…_æãý6³ïü”¿»«²è”êu,àKýhfi€äCÌÁbGÏö$1À€ßúœÖ КAM—ÈœÑð06UKý!jÿÉÿ‘„§@mpñ(_ô\œ ` ÿ^9jeØ3Á©?`æ°4P1o ӊ?@=s:·€‡úZd€ÿN©aIÖÏúœþ–OüVÿÒ,%<³©¹? Î@ñEù§T§±þŽéåˆ ƒ*šuÏúxäßäiÿ@0czQ` rþ’Í\ÿÚ`TDd?¡³@-ÖöK•T^T ïŸèëT&ïýpG“yÓÄ>À.O)âÀTgJñþƒÔ)pU¿Ã¯úðaဠKþ…«‚ŽtìR ²¯=GôœL Hÿ4€`Û÷c?€â`™~Ùïù·ŽWXèý6³ü»ÿº«Àß êu80³ýdf¬hÇCÌÁ_DöD1¶ŒÀ7úœæ ðŠÿEM—*êÏ?Ñðp6@W“ýjø ?ÿd„§@m`Ü)Wô\¬ ð?ÿ^9jéûþ4Â)AàÆÿÉDP2¢§ÓŠ?@=tl¢žKžÀ “úZ„ÿN©aP5îfþ–«ùIÒ¬%<3©~ Î@ý6où‡Tp”þޝéæ ƒ*Ÿ@‰úxô?é<ÿ@0c€õ@ ¡þ’ÑÀ¿Ú`S3sÿ⡲@Dµ¯ö‹•Sù ÔßèëO@ ?ýxCéhÓÄ>À.O9‚ÀThþý?Ô)pYÒãûaú@þ…«‚‚Œßì’ Èœ€5ßôœ<ð Zÿ4€a¶g÷w?€âà”~Üwùǎi-Ÿãý6³·ü?»«ÎܪÏêu80À ýlfðDCÌÁY¿ö$1­ÿíúœÖ ·ÿƒÿEM–žó?Ñðð9€\ ý jðPÏöDާ@mPË'¿ô\Œ  ÿb9knwû„‚©Bà­rÈTP«®ӊ?@=t颞\¥ÿíŸúZdù[ÿR©aVŽÏðþ–kù°Ѭ%À.OI"ÀThæ_þûÿÔ)°]Ò§û(að 2þ…­‚ŠqìÒ Þ“7ôœ,0cÿ6€cSÿ÷”€ã`žþàùǎzÿÿæSý6¯Ïü‚»«ÜÕÌ/êuX0`3ýhfŽ2øžCÌÁLÿöD1£–€çúœÎ `ºÿEM•𮜟Ññ02@UWýjè B†§@m@Ž<ô\Œ •ÿ`9kògújC)F`œÿO@dPÇptӊ?@=uf¢žm•ù×úZD¯üiÿP©a\èðòþ–…'ùë¿Ò,%À.OXÂÀTiŽkþkÔ)pR¿Àwû`ÿ-P ÷þ…¯‚†‰ßìÒ ô'ÿôœ<°œÿ6€dñÏ÷Q?€ã`•þ×·ùǎŒÒŸéý6«7ü꺫ë gÏêu8*ÿú£ýdfŽvÿCÊÁO-oöD1š€CúœÆ XCM•S”ŸÿÑð°5ÀUƒýjàÒþ”†§@m0°€'wô\l ÿ`9luƒû’éF`¥ÿtˆtPYîӊ?@=u㢞~„€ ;úZd0¿ÿP©ac@o÷þ–?ûp¿Ò,%<„K©] ËA ./ùÇS˧þŽéç ƒ+*œÿ£[úxôïÒÿ@0c”ë°úþ’ÑÔçÿÙ`P Cÿ€ÿ¡³@(Š?öë•RÉ ³ŸèëLûý€i+ØÓÄ>À.OhbÀTj‚ þá_Ô)p[ÿÏ?û(`þG0þ…±‚šŸìÒ p)ÿôœÀÞÿ4€fŸ÷-ÿ€âà”þÓ?ùǎž§ßæiý6«ü…ÿ¹«øú»?êuX/`ýlf޹”ÿCËÁR¿ö$1ž@úœÎ DCM”¶„®Ñðð8ÀSkýjÙ_þ6†§@m ©"çô\¬ €mÿ^9lù;ûd)FàŠoX„P¬ ӊ?@=v`¢žŒ¿âOúZt¯ö}ÿP©ai›õfþ–Ëû¿Ò,%<Ÿ©Ù ËAM/ù‡S”åþ鿈 ƒ+Në¿£[úxä_ïÑÿ@0c›’¢þ’Ñ8R?Ù`OÅ/þŒ?¡³@`öë•RcÈ …ÿèëC@ “ý€Œž]Ó/@ASH701945E_M NONE24222 TRIMBLE NETR5?ŸªÓÄ>À.OxÀTkOåþÕ?Ô)0WÍÃû8`ýb „þ…¯‚Œ[_ì’ ^€9ôœ ° Íÿ4€h-s÷(ÿ€ãà˜~ҟùǎ°zŸêý6¯Cüù¿»ž¬ ÏoêuX0`ŸýpfŽüØÿCÌÁ^,ïö1‡1ø‡úœ¶ 0ñAM”^à¿Ññ07@Y³ýjÑVÿýW†§ @mœ3gô\Œ Ðÿ`9m}wúD©FàˆÿFx”Pt–ÓŠ?@=vÝ¢ž v úZ„°sÿR©aoöô)þ–[úžÒ¬%<ºk©>¿ ÌA&où‡S]íþ@_鿈 ƒ+sœÏúxįî0ÿB0c¢8à/þ’Ñ<Ž¿Ú`Néïþ4¿¡Ž@J?÷ •Qþ_ »èëPIÀãýˆ 8iÓ?ASH701945E_M NONE24222֓ÿÓÄ>À.O‡¢ÀTlËþ©ÿÔ(°V?ÈWû`ü|` !þ…­‚ˆoìÒ 6]€&?ô›ü@eÿ2€iËG÷M¿€ãà›~×/ùǎÂQ_äKý6³ÃüAº¬'Ìêtø0àGýlf@XOÿCÌÁb5ö$1}³€ §úœ® øTÿAM“|HøÿÑðð;\¿ý!jɜ/ö ˆ§@m€'Oô\Ì púÿ`9nƒùŒÅ)Fà„ÿ4 €p ‡]ӊ?@=wZ¢ž±\?/úZTÐ œÿP©avR_ñwþ–»ú ¿Ò¬%<ÕG©í ÌAR/ùgS'hýYOéæÈ ƒ+—P?úxäïêÀÿD0cšàà»þ’Ñè—¿ÙŽ`N Ü/¡²@HÈÿ÷ •Q˜ú êèëM%·ý€z*ŸÓ>à ªçpKxQ­J8Bó&]|ÇÁÓÄ>À.O—BÀTlëáþ ÿÔ)0OÿŽSû`û— ±þ…±‚r€ßì’ LU+÷ôœ,Ðÿ4€kiO÷ÿ€ã`’~ÐWùǎÔ&ãóý6·ü6»¬#NÁoêu.Àßýdf„p_CÌÁGÿö1t?€ ÿúœŸ P"EM’ßNÖ¿Ñð°4€Xwý!jÁÜ?û¢ˆ§ @lð—67ô\Ì ÀØÿb9n…Wùž…©FàŒ:`Ž0 ²åӊ?@=w×¢žÂQ@ROúZ40†ÿN©a|®?ïþ–…·ùn¿Ò¬%<ð[ª4ÿ ÌA cÿùGRð9þ.?éåÈ ƒ+»uЇúxô_ðšÿB0c¯ˆp Mþ’ÑŽûÿÚ`M2Óÿï?¡³@FžÏ÷ •Q3© ê/èêÐNÀ%Ÿý€¢AÓ?PÙE)٘<û GÝd?!ú@Öȁ0@ê*±ÓÄ>À.OŠâÀTm¹oþÃÔ)p[Ëkû`ú²p þ…­‚žmì’ bV€—ôœ0Žÿ4€mS÷€ã`‹~Ðùǎåù¿çý6³Ûü˜¿º¬1qίêtØ/ ýlfÈñCÌÁW)?ö1jÙ?ê‹úœ¶ 'ÿ4ÿCM’BRÇÑñ05V‡ý!jº /÷Lj§@làŠ€ßô\Ì €Íÿd9o Ÿøú†)Gàz"øÄ Öӊ?@=xT¢žÓg@úZT÷ÿN©aƒ î•þ–…+ùRÒ,%= 㩆 Ì@ô8OùGR¹.þŒ_éåˆ ƒ+ߥ€úxÔßðÿD0c¶0  Uþ’Ñ=¿Ù`LWÀ¿¡²@OŸÏöë•PÎP ¿èêÐN@+·ýˆ-‚‘ÓÄ>À.O¶‚ÀTn‡-ÿ _Ô)p_¿Ôû8`ùÍ`vþ…«‚Œ™?ì’ xN€1¿ôœ°Òÿ0€n¥{öã?€ã`‰þÉ×ùǎ÷οçOý6·Çü¡¿»¬?¬®êt˜/ {ýhf ÈžÿCÊÁ[>ßöD1ad¿ñ«úœÆ ÐCM‘¥XÀ?Ñð°9ÀU§ýj²a/ûRˆ§@lЧ€!?ô\Ì ;ÿb9oŒ×û†©Hà‡ÿgÔ å{ӊ?@=xÑ¢žäg@súZd°JÿN©a‰bŸóÝþ–…wú£ÿÒ¬%='©Ó¿ ÌAKù‡R‚Cÿ ÏéåÈ ƒ,Æ?ÈÃúxäÏù*ÿD0cŒÚ _þ’ÕL¿Ù`K}wþ…¡Ž@^Oö˕Pi ÒOèêÐM@Ÿý˜³º ÓÄ>À.OÆ"ÀToUeþ$Ô(°O¿·û8`øé –þ…­‚|}_ì’ ŽT)ôœ<@œÿ6€pC÷9ÿ€ä`›~ԟùǏ ¡ßìÛý6³ýRÿ¹¬MܹoêtØ0€áýhfPˆCÌÁ? öD1Wë WúœÆ ( EM‘f³Ñðð4Týjª€?ù튧@lÀª€/—ô\Ì ÿd9pçøÙ‡)H`m8äP/eӊ?@=yN¢žõ[ÀÀ.OÕÂÀTp"çÿ ?Ô(ð]¿Ôkû `ø° Œþ…©‚Œ‚?ìÒ €V€/Wôœ,`†ÿ6€qá¿÷(€ãà”~ÒwùǏwŸì¥ý6³;ýL»¬\$—?êtž/€‹ýhf”€ÕÿCÈÁU%¿ö$1N‰ÿèŸúœ® ÿþïEMkdÞÑð°7Ywýj¢åÏütЧ@l°¶€/—ô\Œ Ðÿd9p–‹÷݇©Gàbþÿðô ®Ð;ӊ?@=yË¢¹roúZ„ ÆÿP©a–oñ÷þ–ú)ÿÒ¬%=]ç©ò¿ ÍASOù‡RÒþï?éæ ƒ,L?ì úxÄ ûÿD0cÊ,ð þ’Õ$-َ`Iǟÿ©?¡³@0§Oöë•Ožs ö_èëL(›ý€„ËeÓÄ>À.OåbÀTpðùþ‹?Ô(ðWÄ3û`÷!Ðqþ…«‚l˜ßí º`€'ßôœ  ˜ÿ4€sû÷;¿€ãà›þÔßùǏ-Qã'ý6³§ü?»ž¬jZ®êtØ.`kýdfØÈCÃÁM+¿ö$1EÀ—úœŠ `JÿGMÎbÑðð;_—ýj›)ïøˆŠ§ @l É€#ô\l  ‚ÿ\9qgùÈ)F`oÿ%  W îӊ?@=zH¢¹n'¿úZ„ÛÿP©aœwïzþ–“ù‰ÿѬ%=y/ª…? ÌA wïù‡QÞ=þ¡éæH ƒ,pSÿÏCúxŽúÊÿ@0cÐÖà “þ’ÑxM¿ÙŽ`Hìûÿü¡²@.Œ/öë•O96 ُèëG@!cýx³0ÓÄ>À.OõÀTqŸÕþßÔ(°XÄÇû0`ö?@ ƒþ…©‚š[ìÒ Ða=ôœ ` Nÿ4€uW÷€ä`˜~Ñ/ù׏?'â™ý6¯‡ü ¿»ž¬x¡¥êu/Àeýpf‘àtÿCÅÁKù¯ö$1;«¿õ3úœŸ à‚ÿEM1Ñ?Ññp6WÓýj“nóxЧ @l×€*gô\L \ÿ`9q¿û€H©G`˜ÿyIÀ›üNӊ?@=zÅ¢¹(x@ CúZTPþÿT©a¢Ò/ñaþ–ú?Ò,%=”ߪ4¿ ËA2cïù‡Q§¡þuéæH ƒ,”Š¿ÓúxŽoöïÿ>0cׂˆþ’Ñ<Šڎ`H§ÿÕÿ¡²@+²÷ •NÓÎ )_èëO5cýˆ»:±ÓÄ>À.P¢ÀTrŒ‡ÿÔ(°[¿ÓËû`õ[ 8þ…«‚œ‘¿ì’ æp7ô›Ìð {ÿ4€vŒ›÷s€âàþÛÇùǏPûŸæÉý6·ËüŒ¬†ö‹oêu,¿ÿ!ý|f‘aØÿCÅÁT-ïö12E?ìSúœÆ ÿhÿCMŽ”°ÇÑñ08V“ýj‹¯ÿöoŒ§ @l€ä€<—ô\\ ° ¥ÿ^9r"Gû‰I)E`švQ%7éӊ?@={B¢¹9r@F‹úZ„p’ÿR©a©,öÌþ–}»û^Ò¬%=°Ÿ©ñ¿ ÊARïù‡Qpêþ£OéæH ƒ,žÎCúx”ë ÿ<0cÞ-°þ’Õk¿ÙŽ`G8kÿÒ¡²@&±¿ö˕Nn ;ÿèë[:ýbfGÓ/@ASH701945E_M NONE24222 TRIMBLE NETR5?ŸªÓÄ>À.PBÀTsZ«þ^Ô)0X¿Ÿ›û`ôy` þ…«‚†l?ì’ ü|€;—ô›ì@ ÿ4€x[#÷7¿€â`•þÔ_ùǏbџçCý6·ãüž¿ºž¬•7®/êu1à{ýxf‘ŠšÐÿCÇÁM%?ö1(Õ?ý£úœÎ ŒEM÷ÐğÑðð9ÀV3ýjƒñoùRŒ§@lpü€8÷ô\l ° 0ÿ`9rŠ3ýÉ©E௚ù4àý—Zӊ?@={¿¢¹J„À2÷úZ„` ¬ÿP©a¯ˆ_ödþ–}·ûDÒ,%=̳šõÿ É@øù‡Q:TþŽ?鿈 ƒ,Üô«ËúxÄñêÿ<0cäØÐLþ’Ézÿَ`F^gÿ…?¡²@%žoö«•N . ]ßèëP\Bý˜xÓ?ASH701945E_M NONE24222֓ÿÓÄ>À.P#âÀTt([þÜ_Ô(°W¿ÎWû`ó— Ñþ…©‚œd¿ì’ ‘€1oôœpÆÿ4€yùk÷Å¿€âà¡~æù§tš¿åý6·Óüfÿ»ž¬£—’êtø.ÿùý`f‘ëhÿCÇÁT+ßöD1iÀ÷úœÖ ŒÿEMZöŸÑðp7€U{ýj|5¿õ@Œ§@la€2¯ô\l hÿ^9s*Wþ\ )B`ÀÐiESñӊ?@=|<¢¹[¡ ›úZdÐÒÿP©aµäÿõþ–}ßû Ѭ%=èG©d? Ê@ø/ŸùÇQžþÛ_éæ ƒ-)¢ÃúxŽÿïšÿ>0cë„dþ’ÉÁ?َ`E„‹ÿ'¡±@&†ÿök•M€ èïèëPPÀ%SýFh3Ó>à ªçpKxQ­J8Bó&]|ÇÁÓÄ>À.P3‚ÀTtömþg?Ô(°R¿›û`òŽþ…­‚¬«_ìR («"Wôœ, âÿ4€{˜÷‰?€á`“þޏù§†~ÿæYý6¿×üÿ»¬²i¿êtø,?úãýdf’0 _ÿCÈÁOÿö$1ÿë'úœæ ÿÿAGMŒŸ<sŸÑð°4€Lýjtuÿû[Œ§ @lQ9(/ô\l `ÿ^9s­ÜV ©>àâ€/ATÀÓŽÓŠ?@=|¹¢¹lœ@:ßúZTÐ £ÿN©aŒDíêþ–}ù$ÿѬ%>§ªx¿ ÌA!t¿ùçPÍ=þféæ ƒ-%[¿ ×úx”ï+ÿ<0cò-p¹þ’ÍðUÿÙ`Dª¯ÿ¿¡²@Ïö«•M>æ ÁÏèëPK‡ý¯‚Ó?PÙE)ޘ<û GÝd?!ú@Öȁ0@åÓÄ>À.PC"ÀTuÄWþX_Ô(ðUœ·û`ñÓP Sþ…¯‚‚Tßì’ >·:Ïôœ, òÿ2€}7ö²ÿ€áàþïù·˜UŸæ¯ý6»Çü‹ÿº¬ÀVƒ?êtX-ßþýpf’v8ÿCÄÁ?í/öD1 šï»úœî ÿÒÿAMŒ!P°ŸÑð°7S¯ý!jlº÷ϧ @lAX(_ô\\ Àÿ`9t2ÌùK):`׀#™dÐ+f®ÓŠ?@=}6¢¹}«€<7úZ4 úÿL©a¡Ïìþ–…Ÿø®Ѭ%> šý¿ ÊAÿù§P–§þˆéæH ƒ-IŠ¿§7úx„ÿðÁÿ<0cøÜðÕþ’Íä\?َ`CÐßÿ)ÿ¡³@O‡Ÿö‹•Lي /èëRÀ,ýÇ1ÓÄ>À.PRÂÀTv’kýìŸÔ(ðO°7û8`ðððµþ…¯‚¢¡_ì’ TÓ4ôœ,p ÿ.€~՛÷€âàþÍßùǏª)ïÏý6¿ƒý¯ÿ¹ž¬Î¬¬oêtx.`Gýhf’»8CÃÁ`ÿöD1H¿çÃúœößþÎÿAM‹„ªR?Ññ00@Gãýjdý/÷Fާ @l1}€!§ô\< ÐGÿ`9t·Žù‹©;àí€#)t ÿ†ÓŠ?@=}³¢¹ŽÇ€# úZdªÿL©aÈýÏî/þ–…ù6?Ò,%>;Ë©Š? ËA%@/ù§P_Òÿ^ÏéåÈ ƒ-mŸ?€;úx€¿ðÿ80cÿˆ€ ôþ’Ñ<#ÿÙ`Böä¿¡³@>Ÿ/ök•LtO üèëS@*ýˆÃ¢ ÓÄ>À.PbbÀTw`3þ@_Ô(°Nÿº·û `ðP sþ…©‚¢xßì’ jó€(Oô›ü0Ÿÿ2€€t3÷r?€â`£þۇù׏Œÿç ý6·ßü–ÿ»ž¬Ý¹Oêtx0åýhf“`5CÃÁXŸöD0ùéâcúœöOþÿCMŠç¬۟Ñð°8Yýj]?Ï÷öާ @l!ž.Gô\< àÙÿd9u<¬ L)?`á$±„ÐMônӊ?@=~0¢¹Ÿé¿ÿ+úZtý²ÿH©aÏYŸñ%þ–…Kùò¿Ñ¬%>Wã©o? ÌA 2où§P)·þv¿éæ ƒ-’ ¿f“úx€ÿàœÿ>0d5 Qþ’Ñ<:Ú`Boÿìÿ¡Ž@2ž?ö«•L ñ¿èëO€'wý‚ÓÄ>À.PrÀTx.þ:?Ô)0R¿¹÷û@`ï/ Aþ…©‚Ž’¿í 'wôœ `„ÿ2€‚CöÕ€áàþÇÿùçÍÚ_é³ý6¯+üë?¹¬ëz¿êt8+ÿýýpf“E ÀÿCÄÁF"ÿöD0ðƒ¿ð?úœö×ÿØAMŠK–ŸÑï°1PsýjUƒ¿õbާ @lǀ*÷ô\l Àqÿb9uÂûýîL)?`ÁÀé„ЙFӊ?@=~­¢¹°ü€—úZT?ÿÿL©aÕ¶ßð¹þ–‰7ù×?Ò,%>s‡ª|? ËAu¯ùÇOóÿ?éåÈ ƒ-¶8¿oãúxÄoâòÿ@0d äPBþ’Íøwَ`AD/ÿ“¿¡Ž@*¢ö˕K©Ü ë¿èëM@%ÿýˆcxŠÓÄ>À.P¢ÀTxü þ:Ô(ðX?¹÷û`îN° Ýþ…©‚€…ßí —*;ïôœ,à ÿ4€ƒ±ç÷h€á`™þÚOùǏ߲ßç]ý6§ü ÿº¬ùöÁÏêtX/Àóýlf“‹€ÿCÄÁU /öD0ç+ß÷úœþŸýÓCM‰®.Í_Ñð09ÀWKýjMş÷Ɛ§@lõ$ô\l  ‘ÿb9vGŸÿ$Ì©?àÔÿ硔ðíZ™ÓŠ?@=*¢¹Â €ÇúZT€ÿJ©aܯïLþ–‰ëù|?Ó,%>wªë? ÊA!‘?ù‡OŒ˜ÿŸéæH ƒ-Úa?‰súxÄéWÿ80d€ øþ’ÉŒ$?Ù`@j¿ÿü¿¡µ@3Œ?ö«•KD™ þoèêÐN@*ŸýˆùR|ÓÄ>À.P‘BÀTyÊþ¿Ô(ðS¿Žû`ínp ßþ…«‚’†ìÒ ­O€6gôœ, dÿ6€…Pã÷N€áà“~×ù·ñŒ¿âQý6§Ÿûþžž­˜cêtx-Ÿú1ýdf“ÐðºCÅÁ`"_öD0ÝÏ?݋ú?ý€ÿGM‰dößÑðp5\ƒý!jFûœ§@kò +çô\l  Œÿd9v̇ÿíÌ©?àä€q”à£Äӊ?@=§¢¹Ó&ÀoúZ„ðEÿL©aâoõ€þ–‰§û¿Ò¬%>«ÿª ÿ ËAYÿù‡O†lþ•ÿ鿈 ƒ-þ™ÿ|;úxÄ/æÿ80d@PŸþ’Í4•ÿÙ`?‘Óÿv¡µ@6šÏö˕JßS /èëN@2—ý€¬ÓÄ>À.P âÀTz—ÝþEßÔ(pU?»Kúø`ìŽ`þ…©‚˜Š¿ì’ Ãt8oôœLÐ ¥ÿ4€†ïã÷D?€â`™~Õçùǐd_ãý6³Ûüÿ¹ž­œOêt˜. ?ý`f”CÄÁI oöd0Ôn?êúœþ§ÿIMˆt€ ?Ñð°>À_Cý!j>Jú‚§@kâK9?ô\< 9ÿb9wQóÿ¥ )>`Üÿ÷€ÀòÆÖӊ?@=€$¢¹äQèWúZ€ ?÷þÿL©aèÑÿé\þ–{÷ÿ¿Ò,%>Èk©“ÿ ÊA;où§OOðþæŸéæ ƒ."ÊÿÿúxÄçwÿ<0d í þ’ÍÀÊَ`>žóÿÿ¡Ž@ƒö˕Jz &èëQ4‹ý€oòÊÓ/@ASH701945E_M NONE24222 TRIMBLE NETR5?ŸªÓÄ>À.P°‚ÀT{eÙþ?Ô(0V?¶Gû`ë® Dþ…©‚޲ßìR ٟ€.Gôœ<à_ÿ.€ˆŽë÷I¿€âàžþևùǐ:?èsý6»?üÁÿž­%•zŸêtØ-?ýýdf”\€"CÅÁY/?öD0Ë?÷;úœæ 0œÿEM‡Ø(‚Ñðp7@Mïý!j6/ö§ @kҁ1‡ô\L àBÿ`9w׫þ·Í)?`ÍÿÙÁ€àÔš—ÓŠ?@=€¡¢¹õdþúZd?ýnÿL©aï,ÏðYþ–…‹ùœÿÒ,%>ä«©Š ÊA?ïùgOŸþÜéæH ƒ.Fò¿ŸkúxÄoîÑÿ>0d'@ Lþ’Íø¿ÙŽ`=ß¿ÿÍ?¡³@C°_ö˕JÚ 2èêÐS@7“ýnxMÓ?ASH701945E_M NONE24222֓ÿÓÄ>À.PÀ"ÀT|3›þ_Ô(pZÿċúð`êÎðÕþ…«‚˜¥ìR ïȀ2Çôœ\ðíÿ0€Š-û÷o¿€ã`œ~ÛGùǐ'ßåeý6ûü`¹ž­4ºêtØ1 ýhf”¢°ÛCÇÁZ&/öD0Á¿ÝÏúœö7ýˆÿ>M‡;\ÒßÑðp<€Xý!j.ÑÏ÷3§@k¶5Oô\l »ÿb9x\óÿ, ©@`ÞèiŽ R0aӊ?@=¢º…õ×úZ„ _û]ÿN©aõOéÆþ–{øÑ,%?©l ÌA1ùGNãJþò¿éåÈ ƒ.k2ÿúxŽ/ç<ÿ<0d.Lp Óþ’Í€Ù`=çÿõ¡Ž@@º_ö˕I¯© 'ïèëP€5ý€]ÓÓ>à ªçpKxQ­J8Bó&]|ÇÁÓŽ>À.PϰT}§þOÔ(0Z¿Œcû`éïÐþ…­‚ŒªßìR ú€'ôœluÿ4€‹Í÷•?€ãàŸ~ßçùç8êŸêý6³ãüóÿ»­B¬ŽOêu-ÿ…ýdf”éXŒCÉÁLöD0ža?îçúœî·ÿšEM†žÀ¶ÿÑð°8T{ýj'þ$§@k²ò/ô\Œ ðÿdcD!ӊ?@=›¢ºÀúZ”ÿ¬ÿP©aûç¿òŒþ–úVѬ%?—©N¿ ÌA*/ù‡N¬ûÿ ¿éåH ƒ.]?šƒúxŽïíšÿ>0d4þ0ïþ’É,á?؎`<.£þûÿ¡µ@|/öë•IJn 9oèëWÀ9gýxRQ˜Ó?PÙE)ã˜<û GÝd?!ú@Öȁ0@Y·ÓÄ>À.PßbÀT}ωþp?Ô(°]Àkû`é@Iþ…­‚š“ì’ *%ßôœ,PMÿ2€lg÷a¿€ã`‘~ÙgùçJÃ_éý6·ßü㿺­QRfêtØ+ÿúyýhf•/ÿCÉÁY.¯öD0¯¿Ý‡úœþ¯ýzCM†·Ñðp;@T“ýjTßþ搧@k£/*ÿô\Œ 0oÿd9yh  @)A`ÈùÐà‚BIӊ?@=‚¢º(³À!óúZ”0dÿR©bHìþþ–…§øæÿÒ,%?9÷©†? ÌA'7ïù§Nvèþ¿éåÈ ƒ.³£?n úxďâ~ÿ@0d;«Ð þ’ÑèfÙ`;Vþì?¡Ž@)x/öë•Hå7 @_èë\À;+ýpBYÓÄ>À.PïÀT~·ýݟÔ(ðR®û`è3 mþ…¯‚zwŸì’ 2\&WôœLÀ\ÿ2€ ãöìÿ€ã`˜þÊÇùǐ\ŸæAý6·Ûü|?ºž­_étŸêu-ü?ýdf•u€CÆÁP.¯ö0¥ÂÿÎËúœþoûœÿAM…eV¿Ñðp:€`Oýj—Ÿÿᐧ @k“i€6_ô\l Üÿd9yî»ÿ€©A`ÄÿÚààñ…ÓŠ?@=‚•¢º9ۀ[úZT€CÿR©b£õFþ–…Wúø¿Ñ¬%?V_©Û ÍAM/ù§N@ÐþRŸéæ ƒ.×Áÿ¥KúxäÏðOÿ>0dB\ nþ’ÕXA?Ù`:}Ÿÿ ?¡Ž@4…Oö˕H€ èëPW@-ý€v6|ÓÄ>À.Pþ¢ÀTkuþkßÔ)0W?¿Ûû`çU .þ…­‚voßì’ H“"?ôœlPÜÿ2€«'÷6?€ãà—~Óçù·nx_â‹ý6»¿ü¹ž­n}›oêu/ ýhf•Œh\CÆÁFö$0œ`?ö£úœþ P”>M„ÈâŸÑðp5€Uký!jßõR’§@kƒ®€/ÿô\\ Pÿd9zt‡ÿ)@`ÂÿÚà$ÐËšGӊ?@=ƒ¢ºJù@&÷úZDà©ÿP©bïíþ–Óøë?Ò,%?rû©æ¿ ÎAOïù§N —þnéæH ƒ.ûú?÷úxôoîzÿ80dI  —þ’Õ ‹?َ`9¥'ÿ¯?¡Ž@*©ö«•Hö ñOèëPQÀ'gý€àFëÓÄ>À.QBÀT€9AþÙßÔ)p\?͟û(`æw Žþ…«‚[ÿì’ ^Æ.7ôœl`Xÿ4€’J»öÛ€â`þȟù§€OßçYý6»÷üŸ?º­}0‚êu8+ßýïýdf– [ÿCÈÁT_öD0“?Ùûú÷ýÿCM„,V­_Ñð07@SOý!j!Ÿ÷:’§@ksõ€+ô\| p„ÿd9zú»þHÁ©A`µÁX4ðŸµÓŠ?@=ƒ¢º\0ÿüSúZd?üýÿN©baóFþ–…£úwѬ%?ë©B? Í@ò&ïùÇMÔwþ]OéæH ƒ/ -¿£Gúxä_ïÐÿ:0dOŒÐƒþ’Ùø†?Ù`8Íÿ²¿¡Ž@M©ßö‹•Gµã ®ßèëLÀÇýˆ5¯ŒÓÄ>À.QâÀT“ýõÿÔ)0N?±û`å™Ð þ…«‚xk_ì’ u€ôœ<PEÿ6€“ê#÷ ¿€â`‘~Îßù·’,ߍý6»¯û¥¿º­‹Í«¯êtø. +ý`f–IÀØCÉÁB%ïö$0‰Êسúœþ7üÖ>MƒÂ¶Ñð°4@Tký!jcïù’§ @kd@$_ô\| ÿ`9{€›þz‚)B`¶ÿÇ DЙ†ÓŠ?@=„ ¢ºmU@³úZd?ÿÿN©bÁï=þ–…?ùuѬ%?¬k©Ó¿ Ì@óK_ùÇMž2þž¯éæ ƒ/D`ÿ©[úxäoñVÿ>0dVo žþ’ѐÓَ`7ôûÿÌÿ¡Ž@8°Oö˕GPš ѯèëP@ý€þâÓÄ>À.Q-‚ÀTÕ[þnŸÔ)pWÿÀ'úø`ä»ÐÜþ…­‚ ¥¿ì’ ‹5€?'ôœ< xÿ6€•‰ƒ÷yÿ€ã`•þÜ_ùǐ€äÃý6¿ËüM?º­šbßêu)¿úý`f–È”ÿCÇÁXOö0€{Ùúœþ‡üæAM‚ó&à¿Ñð°:Y·ýiø§øö’§ @kT‡€+çô\| Žÿ`9|›ü©C`šzXTàÔ±ÓŠ?@=„‰¢º~{€ #úZd .ÿN©b"ÏóCþ–‰oúuÿЬ%?ɪ  ÍAXŸù§Mh þàßéåˆ ƒ/hŽ¿œ÷úxÔ/ö{ÿ<0d] à}þ’ÙDَ`7sþì¿¡Ž@ x_ö«•FëW .ÏèëW€6Ãýˆ«:/ÓÄ>À.Q="ÀT‚£KþˆÔ)°[Ã[û`ãÞÐþþ…¯‚ž©ßì’ ¡~€&—ôœlpeÿ4€—)/÷R€áà–~×_ùǐµÞãŸý6»×ü'ÿ¹ž­©E_êtø.¿ÿiýlf–×èrCÆÁNö$0w)?åƒúœîÇþsCM‚Všï¿Ñð05À[‹ýiðèïýŒ’§ @kDÔ.Gô\| ÀÙÿ`9|§ü9Ã)C`ÿHe ì§ÓŠ?@=…¢º¡À#úZdðmÿP©b(€/í…þ–‰¿ù¿Ñ¬%?æc©? Ì@ÿoù‡M1óþëÏéåÈ ƒ/Œß{“úxÔÏåáÿ<0dcӀ îþ’Õ ?َ`6EOÿå?¡µ@;¶oö«•F†, 1_èêÐR7_ýˆïu0Ó/@ASH701945E_M NONE24222 TRIMBLE NETR5?ŸªÓÄ>À.QLÂÀTƒqMþ{_Ô)0XÿÁ·û`ãð +þ…­‚Œo?ì’ ·»€2ÿôœ|€ñÿ4€˜È£÷ãÿ€áàþé—ùçÇ·_æñý6»Ëü‘º­·ïÁßêtø/ ëýdf—PðÿCÈÁMÏö0mÜè#úœîçþÎCMº _Ñïð;€`£ý!ié.Oøé’§ @k5%€,Wô\Œ `›ÿb9}ÃüxC©Dà ÿ‡0u0öµåӊ?@=…ƒ¢º Ò€“úZ„@KÿN©b.Ýÿñ1þ–‰‹ùñ?Ѭ%@ߪ¿ ÌA\ù‡Lüþm_éåˆ ƒ/±¿®OúxÔßòÿ:0dj‡0 Ëþ’Õ”—َ`5n/þ­ÿ¡³@hö‹•F! ð/èëJ€'ý€+txÓ?ASH701945E_M NONE24222֓ÿÓÄ>À.Q\bÀT„?sþÔ(ðO¿Žëû0`â% þ…«‚Žœ¿í Íþ7_ôœL  ~ÿ2€šhÃöé?€â`”~ÊOù÷Ù’?å‡ý6»£ücÿžž­Æ·žêu-Àµýlf—f˜ÿCÈÁG ßö0dË«úœîû9CM ê?Ñð05ÀZëýiáp¿ûj’§@k%v3Wô\Œ 0yÿ`9}š?ûõD)Fà‘vÀ…àB¢ÓŠ?@=†¢º±ò7÷úZ„p ãÿN©b5>Oîíþ–;ù`Ñ,%@“ªÄÿ ÌA'‡ùÇLÆþ¡Ÿéåˆ ƒ/ÕEÿŒãúxä¯ê5ÿ<0dq;` Bþ’шôَ`4–Ïþcÿ¡Ž@V/ö˕E»î oèëP,gý€Ó±Ó>à ªçpKxQ­J8Bó&]|ÇÁÓÄ>À.QlÀT… uþ Ô(°R³[û`áI µþ…©‚Úàÿì’ äO€/ôœLðÿ0€œ‹öì?€áà–~ʟùçëhÿîÉý6³ý‹ÿž­ÕzÇêtø/À£ýhf—­˜CÈÁY-oö0[LÿޓúœÎgý’AM€¿Ñðp6À^—ýiÙ² ’§@k΀-Oô\Œ Pºÿ`9~ óûD©H`Z˜• ÷ûӊ?@=†}¢ºÃ(@)ƒúZd0HÿN©b;›?õXþ–‰«úúЬ%@=_šÙÿ ËA Ïù§Lþ‰?éæ ƒ/ù^ÙWúxäýQÿ<0dwð *þ’ÑH.Ù`3¿cþƒ¿¡³@^ö˕EVÑ íÿèëN&‡ý€A×/Ó?PÙE)è˜<û GÝd?!ú@Öȁ0@!16ÓÄ>À.Q{¢ÀT…Û)þÄ¿Ô(°XÿÊ·û `ànpþ…©‚ÀŒìÒ ú–#ôœ,Àóÿ0€šC÷?ÿ€àà–þÕùçýCÿíçý6¯/ýo¿ž­äVŠêtø/`‡ýˆf—õH¿CÊÁZ"ŸöD0R ?ÔïúœÞÏüYCMäâx?Ñð00L£ý!iÑö_þš”§@k0÷ô\¬  ÿb9~§Ïú )Gà}9€¥`œ³ôӊ?@=†ú¢ºÔ^À¯úZdp“ÿN©bAþ_ìÃþ–‰—øÕÑ,%@Z#©« ÊAAù§LZZýûéåÈ ƒ0¡?Œ³úxÄŸö*ÿ<0d~¢p þ’Í *?Ù`2çóþø?¡³@{ö‹•Dñ¢ OèëN@,ßýx”‘ÓÄ>À.Q‹BÀT†©Gþ}ÿÔ(pXÿÁãû`ߒÀÁþ…©‚”¢ìÒ ۀ3Ÿôœð ÿ0€ŸH÷®ÿ€áàžþâïùבßë“ý6«ÿý$¹­ó3“êu-àýhf˜<ðØCÌÁV%ÏöD0HŸ¿àWúœÖ—ýÉÿAMHtzÑð02€LëýiÊ;¿ú&”§@jö„,‡ô\Œ À¡ÿd9-wü5…©I`š(µ@>ù ӊ?@=‡w¢ºå”€gúZ” {ÿL©bH\ñ#þ–‰›ùìÿÑ,%@w#ªÿ Ê@ë[où‡L$þÂ?éæ ƒ0AÒ?Í'úxÄ?úHÿ<0d…U  ðþ’Éß¿Ù`2óþ¥ÿ¡Ž@fŸö‹•DŒˆ ñoèêÐS'cýˆ°ŽüÓÄ>À.QšâÀT‡w;þ£¿Ô(°Y?Ɵû`Þ·þþ…«‚¶©¿ìR '0%ôœ,à2ÿ2€ è÷|?€áàœ~܏ùǑ úÿëµý6¯ý(¿¹ž®éîßêu1 ‰ýlf˜„ 0CËÁY0¿öD0?tÿíúœÆ ÿqÿEM~¬tÑðp1ÀL'ýiÂ~¯ûà”§@jæá1×ô\Œ Kÿd9ŽgûdF)Ià‚ÿe(Å`§°Sӊ?@=‡ô¢ºöÍÀ—úZ€ðGÿL©bN¹ß÷Ãþ–‰÷û”¿Ñ¬%@”ךåÿ Ì@õŸùGKîIþŸïéæ ƒ0f!ÿ‘·úxÄëlÿ@0dŒ pŠþ’ÉxÙ`19X?¡µ@;Ãßö‹•D'X ¿èêÐP€0·ý›øÓÄ>À.Qª‚ÀTˆE7þž?Ô(0W?É/û`ÝÝ;þ…«‚”‘?ìR =}/Wôœ\0{ÿ4€¢ˆ3÷Gÿ€áàš~ÖùǑ2Ø?æÁý6³Ûü‰¿»®[¿êuX+¿ù3ýlf˜ÌXÂCÍÁBÏö061îßúœ® gÿ™ÿAM~µÿÑð0=T[ýiºÀÏÿ²”§@j×C1·ô\Ì  Fÿb9€;/û-†©Ià†ÿ^XՀ>4Vӊ?@=ˆq¢»€§úZ” ÿN©bUOï£þ–‰;ùŒ¿Ñ¬%@±Ë©Œÿ ÌAEùGKžrþ‘ÏéåÈ ƒ0Š\ÿŠúxԏéÿ>0d’¿ð ‘þ’Éü‡َ`0b«ÿ—?¡Ž@J¢ßö‹•CÂ; /èëQ/ý€­J–ÓÄ>À.Qº"ÀT‰{þÿÔ(pSÿ¶+û`ݰþ…«‚šŠì’ Sـ/ôœ\ Ôÿ4€€(W÷6€áà–þÓ×ùǑD²_êuý6·óý?ºž®®óêu3` ýdf™žCÎÁV+Oõä0,è‡úœŽ ØEM}s@”Ñïð6€Pý)i³¿ü“”§@jǪ-/ô\ì 0Žÿ`9€À³þ[G)Hà·Äå°jœӊ?@=ˆî¢»/@7‡úZ„ ÆÿN©b[}ð+þ–Sù®?Ѭ%@ÏK©c¿ ËA/ùgK‚ªþsoéæ ƒ0®ˆ¿ªÓúxÄ?ñ°ÿ>0d™vàåþ’Ñlœ?Ù`/Œ?þÀ¿¡µ@mOö‹•C]8 ÍèëH@Ký€ãüÓÄ>À.QÉÂÀT‰ágþ_ßÔ(°UÿŸúè`Ü(@Žþ…¥‚Š›¿ìÒ j%4ÿôœ\ .ÿ4€¥Èw÷M¿€â`šþÖÇùבV?çqý6³Ëü ?º®.¢Ýêu0 Sýlf™]XèCÐÁN¯ö$0#²¿ç»úœžþŽCM|ÖÞŠÿÑð04Rsý1i«J/úՔ§@jž.Ÿô\Ü ãÿb9G›þ3Ç©G`²¿õ€ŠÁÒӊ?@=‰k¢»*y#úZdÐlÿN©baÞ/ï³þ–‰ù?Ѭ%@ì«©w? Ë@÷3ïùgKLÀþº¿éæˆ ƒ0ÒŒ?·ßúxÔôòÿ:0d *  þ’Ížä?Ù`.µ—þÊÿ¡Ž@-oÿö‹•Bø ü?èëR@*ý€ÔOÓÄ>À.QÙbÀTНEþÆ¿Ô(pW¿Êßúè`ÛO0 eþ…§‚ŒV_ìÒ €~€2Çôœ|çÿ2€§h»÷0¿€áà˜þÓùבhmŸáý6»§ûÒºž®=§©?êu0 ×ý`f™¥PŒCÎÁH"/öD0tæoúœ†—þ…CM|:Ž–ÿÑïð6ÀPoý!i£üє§@jšx7'ô\Ì °ôÿd9ÎÓý‚)G`±šÑ :œ¶ÓŠ?@=‰è¢»;²@úZd jÿL©bh>ñmþ–kùþѬ%A ;©8¿ ÌA$OùgKþéç ƒ0öïÿÄ¿úxŽÿø*ÿ>0dŠá !þ’Íh«¿ØŽ`-ÞT¥¿¡²@^æö«•B’ô èèëPÀ%/ý€ÚyÑÓ/@ASH701945E_M NONE24222 TRIMBLE NETR5?ŸªÓÄ>À.QéÀT‹}kþßÔ'ðZ¿Áóû`ÚuÀ þ…©‚’J?í –Þ€'Gôœlpwÿ2€©ë÷oÿ€â`’þÚ÷ùǑzH?ä¡ý6··üD¿ºž®L”À_êu.¹ýlf™íÈŠCÍÁUoö$03ÿîŸúœ† ×ÿ>M{ž:Ÿ¿Ñð04ÀQý)i›Ñ_û«”§@j˜í$7ô\ì 0•ÿd9‚V3ü›©H`¥‹áJ¥ÓŠ?@=Še¢»Lö ‡úZtÀÿL©bn›Ïù@þ–ûó?Ѭ%A'cª'? Ë@ý_ßùgJádþSéçH ƒ1.¿·úxÄOôÁÿ<0d­˜À zþ’Ñä¿Ù`-äÍ¡³@Nðö«•B-Ë ÿèëPI€.“ý€ÿËiÓ?ASH701945E_M NONE24222֓ÿÓÄ>À.Qø¢ÀTŒK‡þWÿÔ(°U¿Œûúø`ٛ`Úþ…«‚¬€ßìÒ ­<)Wôœ\pžÿ2€ª©“ö²€âà‹þÃGù§‘Œ Ÿî•ý6³ýƒ¿·®[Žh_êuX*¿ú±ýhfš6pwÿCÎÁXoö$0ú¿éúœ~÷þãÿCM{ðŸŸÑð°7€Qý)i”Ÿõ¥–§@j‰\(ô\ü @ ÿf9‚Ý/üëÉ)H`ªÿ–%€ÚÅTӊ?@=Šâ¢»^;¿ÿCúZ„ý«ÿL©btÿó}þ–çúÿÓ,%AE ª¿ ËA&VÏù‡J«†þ¶_éç ƒ1?q¿ GúxÔ_ï ÿ<0dŽO îþ’Å€^?Ù`,2ÿÀ¿¡³@:­oö‹•AÈ èßèëTÀ%Oý€a,ÜÓ>à ªçpKxQ­J8Bó&]|ÇÁÓÄ>À.RBÀTþ>Ô(°V?¹¿û`ØÃ þ…«‚€j?ì’ Ã¡€/ôœlÐ2ÿ2€¬Içöè¿€âà—þÊù·‘ž¿âýý6³ßü»®j’ÁêuX0ÛýhfšŸÿCÎÁ]ö/þ»õ[úœ^ @nÿCMzeÝßÑð°8€YWýiŒZ/øò–§@jy΀*§ô\Ì  cÿf9ƒd×ûÆ ©F`žq 5p&œÓŠ?@=‹_¢»ol@)¯úZd@IÿJ©b{`?ó„þ–‰»úƒ?Ò,%AbŸª5? ÌAcOù§Juùþ_Ÿéç ƒ1c°?”‡úxޝìÿ<0d»°Îþ’Íd•¿ÙŽ`+[€?¡³@pàïö«•Acš ŸèëQ€/óý€­8íÓ?PÙE)í˜<û GÝd?!ú@Öȁ0@~‹ÓÄ>À.RâÀTçŸþXÔ(ðX¿Œëû`×é Aþ…«‚ŒÒì’ Ú(ôœl€Œÿ4€­êC÷*¿€âà”~Ò_ùǑ¯Ýå%ý6¯ûüU?¹®y¯‰Ïêu-¿þíýlfšÈ0ÿCËÁRŸö/õ~ÿŸúœ^ ðºCMyÉ@þÿÑñp7]{ý!i„ _ó@–§@jjH!¿ô\Ì `Gÿh9ƒë£üìJ)F`žÿ•‰E€ÁµÚӊ?@=‹Ü¢»€¶ÀÏúZd ÓÿL©bÂ_ñOþ–cùõ¿Ò,%A€—©? ÌA:ù‡J@5þ£oéçH ƒ1‡Û¹oúx”ßõTÿ<0dÁŸ€ äþ’ɘÿَ`*…óÿÐÿ¡µ@+±_ök•@þ‚ èëR@0ëý€Ö-ÓÄ>À.R'‚ÀT޵™þŠŸÔ)0YÃ;û`×àßþ…«‚°Å_ì’ ðf€%gôœ@8ÿ4€¯Š·÷Z€ã`•~ØGùבÁ¹ßæ9ý6¯;üw¹®ˆ¿€oêu8+ÿýÃýhf› CÊÁU*ßö$/ìL?ò»úœf p ÿAMy-( ßÑñp7@Q¯ý!i|áŸùü–Šü@jZœ+‡ô\ü P‚ÿd9„s üÀ ©Eà€U€XR ӊ?@=ŒY¢»‘ü€úZt`cÿL©bˆ#¯ñ“þ–‹ú?Ò,%AžK©¿? ÌA EÏùÇJ žþHÏéç ƒ1¬!¿›«úxįíãÿ:0dÈvP €þ’ÉPAÿÚ`)¯ÜS?¡Ž@?Ñßö‹•@™… Ý/èëK€"Wý€ûCÓÄ>À.R7"ÀTƒ³þr?Ô)0]À/û`Ö9€'þ…«‚¢Žì’È6§ôœ ð bÿ4€±+3÷£€âà™þá_ù·‘Ó–¿æ©ý6«÷ü…¿¹®—ː¯êux-¿ÿÓýhf›Y°ÿCËÁW*¯ö/ãÿø£úœv øÕÿCMxæ¹ÿÑð°6@TÓý!iu$Oý<–Šø@jK?§ô\Ü €¥ÿ`9„ù·þ§K)DàŒÌéepSgfӊ?@=ŒÖ¢»£IÀúZDŸÿ[ÿH©bŽ…ÿïËþ–/ù“¿Ñ,%AŒ3©— ÌA;ßùÇIÕ,þ(éç ƒ1Ð]?™çúxŽïíqÿ:0dÏ/pËþ’ÉdԿڎ`(Ú³þæÿ¡Ž@'vïö˕@4n ç¯èëPO@$óýˆ=gÞÓÄ>À.RFÂÀTQÍþ]Ô(pYÿœû`Õb iþ…©‚€vÿì’;€ OôœP•ÿ4€²Ì÷¿€ã`þПùǑåpÿî ý6«'ýqº®ŠÅÚêu˜2€ ýXf›¢Ø ÿCËÁZ+Ÿö$/Ùڀúœ~ àIÿCMwôŽŽÑð°9Tý!imiïù+–Šü@j;»€!×ô\Ì `Kÿd9…ãüýK©Dà§ÿ—‘u`|‹ŒÓŠ?@=S¢»Ž›ïsúZt¿ùžÿH©b”æóÆþ–ú’Ñ,%AÙÿ©×? ÌAKßù§IŸLþëéçH ƒ1ôŒ?·oúxÔ_ôÓÿ@0dÕè ?þ’Éhñَ`(+þš¡µ@0g_ö˕?Ï@ .¿èêÐU€6³ýx«ÂD gpsd-3.15/test/rtcm3-3.dcd0000664000175000017500000074311012460513551013400 0ustar esresr# Made from rtcm3-3.log by inspectrtcm # This demonstration version for Eric Raymond (DEMO) expires at 2011-04-17. Please visit our website at http://www.dgpsonline.eu/ for contact information. RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194448.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=217326.10, pd= -14.7935, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.08, pd= -19.8805, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=239195.58, pd= -12.6460, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.62, pd= -17.0065, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=245511.76, pd= -23.0550, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 9.78, pd= -31.2035, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 30572.58, pd= -11.4320, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.42, pd= -14.5090, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 29652.32, pd= -15.2630, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.18, pd= -20.2065, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=194918.64, pd= -2.2715, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.14, pd= -3.1520, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87470.12, pd= -20.3135, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.82, pd= -26.1650, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=167526.70, pd= -12.7415, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 1.26, pd= -17.3660, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=268140.54, pd= -13.9640, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 5.92, pd= -18.4975, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194449.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=216764.32, pd= -14.9555, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.10, pd= -20.0430, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=238735.92, pd= -12.6325, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.60, pd= -16.9940, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=246181.34, pd= -23.3480, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 9.32, pd= -31.4970, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 30159.92, pd= -11.4065, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.38, pd= -14.4835, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 29189.70, pd= -15.2695, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.30, pd= -20.2130, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=195343.12, pd= -2.3210, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.18, pd= -3.2020, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87468.30, pd= -20.3620, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.80, pd= -26.2140, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=168151.34, pd= -12.9190, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 1.40, pd= -17.5425, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=268785.82, pd= -14.0715, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 5.76, pd= -18.6050, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194450.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=216202.68, pd= -15.1980, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.94, pd= -20.2855, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=238276.32, pd= -12.5990, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.64, pd= -16.9600, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=246851.06, pd= -23.7655, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 9.22, pd= -31.9145, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 29747.28, pd= -11.3885, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.44, pd= -14.4655, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 28727.18, pd= -15.2830, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.16, pd= -20.2255, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=195767.66, pd= -2.3570, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.78, pd= -3.2375, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87466.60, pd= -20.4055, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.2565, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=168775.80, pd= -12.9180, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 1.48, pd= -17.5410, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=269431.04, pd= -14.0950, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 5.74, pd= -18.6280, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.22) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194451.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=215640.94, pd= -15.2790, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.72, pd= -20.3655, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=237816.80, pd= -12.5610, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.68, pd= -16.9210, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=247520.72, pd= -24.1195, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 9.00, pd= -32.2700, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 29334.68, pd= -11.4020, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.44, pd= -14.4785, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 28264.74, pd= -15.2845, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 4.94, pd= -20.2260, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=196192.24, pd= -2.3555, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.90, pd= -3.2370, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87465.00, pd= -20.4305, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.68, pd= -26.2820, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=169400.26, pd= -12.9225, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 2.58, pd= -17.5450, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=270076.34, pd= -14.1805, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 5.44, pd= -18.7140, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194452.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=215079.34, pd= -15.4420, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.38, pd= -20.5285, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=237357.36, pd= -12.5240, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.84, pd= -16.8845, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=248190.20, pd= -24.2795, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 8.56, pd= -32.4300, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 28922.12, pd= -11.4495, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.48, pd= -14.5260, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 27802.32, pd= -15.2140, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.00, pd= -20.1560, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=196616.82, pd= -2.2915, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.12, pd= -3.1730, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87463.56, pd= -20.4960, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.3480, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=170024.86, pd= -13.0615, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 2.80, pd= -17.6840, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=270721.60, pd= -14.2070, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 5.50, pd= -18.7400, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194453.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=214517.72, pd= -15.5320, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.56, pd= -20.6185, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=236898.06, pd= -12.5430, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.82, pd= -16.9030, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=248859.62, pd= -24.3690, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 8.72, pd= -32.5195, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 28509.54, pd= -11.4695, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.54, pd= -14.5455, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 27340.00, pd= -15.1485, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.00, pd= -20.0910, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=197041.54, pd= -2.2905, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.94, pd= -3.1710, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87462.20, pd= -20.5185, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.78, pd= -26.3705, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=170649.46, pd= -13.2125, lock= >937, amb=24582981.556, snr=38.00) L2 (P(Y) , r= 3.52, pd= -17.8355, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=271366.90, pd= -14.2555, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 5.16, pd= -18.7890, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194454.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=213956.10, pd= -15.5565, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.38, pd= -20.6430, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=236438.82, pd= -12.5420, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.00, pd= -16.9020, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=249528.94, pd= -24.3510, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 8.70, pd= -32.5025, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 28096.90, pd= -11.4200, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 3.50, pd= -14.4960, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 26877.84, pd= -15.1510, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 4.54, pd= -20.0930, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=197466.32, pd= -2.2735, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.20, pd= -3.1545, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87460.92, pd= -20.5000, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.52, pd= -26.3515, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=171273.86, pd= -13.1570, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 3.84, pd= -17.7795, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=272012.22, pd= -14.3005, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 5.22, pd= -18.8340, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194455.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=213394.66, pd= -15.7045, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.54, pd= -20.7910, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=235979.68, pd= -12.5605, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.66, pd= -16.9205, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=250198.22, pd= -24.2920, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 8.76, pd= -32.4440, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 27684.18, pd= -11.2860, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.68, pd= -14.3615, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 26415.74, pd= -15.1220, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 4.54, pd= -20.0645, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=197891.10, pd= -2.1920, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.16, pd= -3.0730, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87459.74, pd= -20.4645, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.80, pd= -26.3165, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=171898.50, pd= -13.3490, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.30, pd= -17.9710, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=272657.50, pd= -14.2920, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 5.10, pd= -18.8250, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194456.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=212833.22, pd= -15.7875, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.40, pd= -20.8740, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=235520.64, pd= -12.5955, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.66, pd= -16.9560, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=250867.44, pd= -24.1500, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 9.20, pd= -32.3015, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 27271.54, pd= -11.2170, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.72, pd= -14.2920, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 25953.76, pd= -15.1190, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.66, pd= -20.0610, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=198316.00, pd= -2.1520, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.18, pd= -3.0325, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87458.78, pd= -20.5280, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.80, pd= -26.3800, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=172523.00, pd= -13.3975, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.48, pd= -18.0195, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=273302.92, pd= -14.4010, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 5.04, pd= -18.9350, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194457.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=212271.80, pd= -15.8325, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.12, pd= -20.9185, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=235061.66, pd= -12.6100, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.78, pd= -16.9700, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=251536.92, pd= -24.2680, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.94, pd= -32.4210, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 26858.84, pd= -11.0870, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.74, pd= -14.1620, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 25491.90, pd= -15.1420, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.84, pd= -20.0830, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=198740.92, pd= -2.0630, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.54, pd= -2.9440, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87457.90, pd= -20.5485, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.68, pd= -26.4005, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=173147.62, pd= -13.5730, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 5.04, pd= -18.1945, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=273948.26, pd= -14.4125, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 5.08, pd= -18.9475, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194458.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=211710.46, pd= -15.9005, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 5.96, pd= -20.9860, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=234602.80, pd= -12.6635, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.58, pd= -17.0240, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=252206.40, pd= -24.3730, lock= >937, amb=23683604.182, snr=37.00) L2 (P(Y) , r= 8.88, pd= -32.5255, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 26446.14, pd= -10.9430, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.98, pd= -14.0170, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 25030.12, pd= -15.1520, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.64, pd= -20.0915, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=199165.92, pd= -1.9770, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.64, pd= -2.8570, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87457.16, pd= -20.5890, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.46, pd= -26.4405, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=173772.04, pd= -13.5390, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.30, pd= -18.1600, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=274593.60, pd= -14.4010, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.82, pd= -18.9350, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194459.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=211149.26, pd= -16.0470, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.02, pd= -21.1325, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=234144.04, pd= -12.7320, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.80, pd= -17.0915, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=252875.82, pd= -24.4075, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.16, pd= -32.5600, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 26033.46, pd= -10.8140, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.08, pd= -13.8870, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 24568.44, pd= -15.1700, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.16, pd= -20.1105, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=199590.98, pd= -1.8835, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.66, pd= -2.7645, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87456.54, pd= -20.6310, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.42, pd= -26.4830, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=174396.58, pd= -13.6405, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.96, pd= -18.2615, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=275238.96, pd= -14.3950, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.72, pd= -18.9295, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194460.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=210588.02, pd= -16.0925, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 5.90, pd= -21.1775, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=233685.34, pd= -12.7830, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.48, pd= -17.1420, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=253545.26, pd= -24.4515, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 8.46, pd= -32.6040, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 25620.80, pd= -10.6945, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.40, pd= -13.7680, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 24106.78, pd= -15.1140, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.24, pd= -20.0535, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=200016.16, pd= -1.8355, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.78, pd= -2.7170, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87456.02, pd= -20.6505, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.52, pd= -26.5025, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=175021.14, pd= -13.7580, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.32, pd= -18.3775, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=275884.32, pd= -14.3700, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.66, pd= -18.9050, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.22) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194461.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=210026.82, pd= -16.1245, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.02, pd= -21.2095, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=233226.70, pd= -12.8115, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.44, pd= -17.1710, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=254214.90, pd= -24.6915, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 7.76, pd= -32.8435, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 25208.02, pd= -10.4535, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 4.56, pd= -13.5270, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 23645.22, pd= -15.0640, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.88, pd= -20.0035, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=200441.44, pd= -1.8180, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.28, pd= -2.6980, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87455.64, pd= -20.6905, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.5420, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=175645.58, pd= -13.7570, lock= >937, amb=24582981.556, snr=38.00) L2 (P(Y) , r= 5.34, pd= -18.3770, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=276529.74, pd= -14.3840, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.46, pd= -18.9200, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194462.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=209465.74, pd= -16.2065, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.16, pd= -21.2905, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=232768.12, pd= -12.8145, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.58, pd= -17.1740, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=254884.34, pd= -24.7215, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 7.92, pd= -32.8750, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 24795.28, pd= -10.2415, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 4.96, pd= -13.3140, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 23183.78, pd= -15.0440, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.12, pd= -19.9840, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=200866.86, pd= -1.8685, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.60, pd= -2.7500, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87455.30, pd= -20.6510, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.58, pd= -26.5035, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=176270.22, pd= -13.9565, lock= >937, amb=24582981.556, snr=38.00) L2 (P(Y) , r= 6.12, pd= -18.5765, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=277175.18, pd= -14.4000, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 4.36, pd= -18.9360, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.22) Type 1004: ID=700, TOW=194463.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=208904.72, pd= -16.2950, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.14, pd= -21.3790, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=232309.64, pd= -12.8415, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.58, pd= -17.2020, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=255553.66, pd= -24.6200, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 7.84, pd= -32.7735, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 24382.42, pd= -9.8965, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.26, pd= -12.9685, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 22722.42, pd= -15.0075, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.02, pd= -19.9470, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=201292.22, pd= -1.7860, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.44, pd= -2.6680, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87455.14, pd= -20.6725, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.44, pd= -26.5250, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=176894.98, pd= -14.2780, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.78, pd= -18.8975, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=277820.62, pd= -14.3955, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.36, pd= -18.9310, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194464.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=208343.78, pd= -16.4030, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.16, pd= -21.4870, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=231851.16, pd= -12.7855, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.60, pd= -17.1450, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=256223.24, pd= -24.7675, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 7.70, pd= -32.9215, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 23969.68, pd= -9.6665, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.32, pd= -12.7385, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 22261.12, pd= -14.9385, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.02, pd= -19.8780, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=201717.74, pd= -1.7895, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.56, pd= -2.6715, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87455.08, pd= -20.6725, lock= >937, amb=20086094.686, snr=52.00) L2 (P(Y) , r= 4.48, pd= -26.5240, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=177519.46, pd= -14.3205, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.04, pd= -18.9410, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=278465.96, pd= -14.2725, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.42, pd= -18.8080, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194465.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=207782.76, pd= -16.3720, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.54, pd= -21.4560, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=231392.84, pd= -12.8050, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.64, pd= -17.1645, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=256892.90, pd= -24.9900, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 7.46, pd= -33.1440, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 23556.88, pd= -9.3650, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.56, pd= -12.4365, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 21799.96, pd= -14.9160, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.48, pd= -19.8545, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=202143.34, pd= -1.8030, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.50, pd= -2.6850, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87455.20, pd= -20.7295, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.48, pd= -26.5805, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=178144.00, pd= -14.4300, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 5.12, pd= -19.0500, lock= >937, snr=17.00) SV= 3, L1 (C/A , r=279111.34, pd= -14.1695, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.36, pd= -18.7055, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194466.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=207221.88, pd= -16.4205, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.64, pd= -21.5045, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=230934.64, pd= -12.8670, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.26, pd= -17.2270, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=257562.24, pd= -24.8770, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 8.12, pd= -33.0315, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 23144.30, pd= -9.2815, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.72, pd= -12.3520, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 21338.86, pd= -14.8620, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.62, pd= -19.8010, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=202568.98, pd= -1.7855, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.56, pd= -2.6675, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87455.44, pd= -20.7895, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.46, pd= -26.6420, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=178768.56, pd= -14.5525, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.48, pd= -19.1725, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=279756.96, pd= -14.2890, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 4.24, pd= -18.8245, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194467.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=206661.00, pd= -16.4095, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.50, pd= -21.4930, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=230476.48, pd= -12.8850, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.22, pd= -17.2440, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=258231.82, pd= -25.0040, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.02, pd= -33.1590, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 22731.70, pd= -9.1630, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.76, pd= -12.2325, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 20877.90, pd= -14.8530, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.08, pd= -19.7920, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=202994.72, pd= -1.7925, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.46, pd= -2.6735, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87455.74, pd= -20.7875, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.36, pd= -26.6405, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=179393.06, pd= -14.6300, lock= >937, amb=24582981.556, snr=38.00) L2 (P(Y) , r= 5.72, pd= -19.2515, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=280402.56, pd= -14.3690, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.04, pd= -18.9045, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194468.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=206100.28, pd= -16.4985, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.44, pd= -21.5805, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=230018.34, pd= -12.8405, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.44, pd= -17.1995, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=258901.36, pd= -25.0765, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 7.30, pd= -33.2310, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 22319.12, pd= -9.0605, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.86, pd= -12.1300, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 20417.08, pd= -14.8895, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.02, pd= -19.8280, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=203420.50, pd= -1.7720, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.54, pd= -2.6545, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87456.14, pd= -20.7665, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.40, pd= -26.6185, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=180017.64, pd= -14.7830, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.22, pd= -19.4050, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=281048.08, pd= -14.3485, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 4.22, pd= -18.8840, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194469.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=205539.56, pd= -16.5260, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.50, pd= -21.6070, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=229560.22, pd= -12.7365, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.56, pd= -17.0950, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=259570.96, pd= -25.1960, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 7.30, pd= -33.3515, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 21906.68, pd= -9.0895, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 5.94, pd= -12.1590, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 19956.38, pd= -14.9525, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.96, pd= -19.8910, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=203846.40, pd= -1.7940, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.66, pd= -2.6755, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87456.70, pd= -20.7835, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.42, pd= -26.6370, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=180642.08, pd= -14.7965, lock= >937, amb=24582981.556, snr=38.00) L2 (P(Y) , r= 4.70, pd= -19.4180, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=281693.78, pd= -14.4860, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.00, pd= -19.0210, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194470.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=204978.86, pd= -16.5155, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.50, pd= -21.5970, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=229102.18, pd= -12.6305, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.98, pd= -16.9900, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=260240.50, pd= -25.2565, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 7.28, pd= -33.4125, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 21494.30, pd= -9.1725, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.74, pd= -12.2420, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 19495.80, pd= -15.0445, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.92, pd= -19.9835, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=204272.36, pd= -1.8085, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.60, pd= -2.6905, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87457.32, pd= -20.7420, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.36, pd= -26.5950, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=181266.58, pd= -14.8625, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.66, pd= -19.4835, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=282339.50, pd= -14.6275, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 4.10, pd= -19.1630, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.23) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194471.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=204418.16, pd= -16.4470, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.82, pd= -21.5290, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=228644.32, pd= -12.6230, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.78, pd= -16.9815, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=260910.14, pd= -25.4060, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 6.82, pd= -33.5620, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 21081.84, pd= -9.1650, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.76, pd= -12.2335, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 19035.34, pd= -15.1600, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.12, pd= -20.0995, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=204698.40, pd= -1.8305, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.64, pd= -2.7130, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87458.10, pd= -20.7375, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.38, pd= -26.5900, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=181890.98, pd= -14.8410, lock= >937, amb=24582981.556, snr=38.00) L2 (P(Y) , r= 4.54, pd= -19.4630, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=282985.10, pd= -14.6330, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.02, pd= -19.1685, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194472.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=203857.52, pd= -16.3750, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.94, pd= -21.4570, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=228186.58, pd= -12.6525, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.74, pd= -17.0110, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=261579.74, pd= -25.5010, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 6.38, pd= -33.6570, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 20669.32, pd= -9.0900, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 5.88, pd= -12.1580, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 18574.92, pd= -15.2260, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.70, pd= -20.1665, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=205124.56, pd= -1.8995, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.36, pd= -2.7815, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87458.96, pd= -20.6945, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.52, pd= -26.5480, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=182515.42, pd= -14.8540, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.66, pd= -19.4755, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=283630.80, pd= -14.7145, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 4.00, pd= -19.2495, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194473.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=203296.92, pd= -16.2795, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.22, pd= -21.3620, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=227728.86, pd= -12.6180, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.70, pd= -16.9765, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=262249.20, pd= -25.4525, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 6.14, pd= -33.6080, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 20256.90, pd= -9.1090, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.88, pd= -12.1760, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 18114.60, pd= -15.2950, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.48, pd= -20.2340, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=205550.72, pd= -1.8950, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.48, pd= -2.7765, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87459.96, pd= -20.6695, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.54, pd= -26.5225, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=183140.00, pd= -15.0095, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.54, pd= -19.6305, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=284276.52, pd= -14.7975, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.86, pd= -19.3325, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194474.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=202736.34, pd= -16.1480, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.32, pd= -21.2300, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=227271.22, pd= -12.5845, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.22, pd= -16.9435, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=262918.64, pd= -25.3725, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 6.72, pd= -33.5290, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 19844.50, pd= -9.1390, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 5.88, pd= -12.2065, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 17654.34, pd= -15.3330, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.54, pd= -20.2730, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=205976.92, pd= -1.8635, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.26, pd= -2.7455, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87461.04, pd= -20.6030, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.70, pd= -26.4560, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=183764.40, pd= -14.9935, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 3.82, pd= -19.6145, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=284922.34, pd= -14.9640, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.72, pd= -19.4985, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194475.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=202175.90, pd= -16.0965, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.04, pd= -21.1785, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=226813.70, pd= -12.5895, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.98, pd= -16.9480, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=263588.18, pd= -25.3850, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 6.78, pd= -33.5415, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 19432.12, pd= -9.1770, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 6.08, pd= -12.2440, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 17194.14, pd= -15.3345, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.52, pd= -20.2730, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=206403.22, pd= -1.8565, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.18, pd= -2.7385, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87462.22, pd= -20.5165, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.80, pd= -26.3695, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=184388.76, pd= -14.9330, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.38, pd= -19.5545, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=285568.06, pd= -15.0085, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.76, pd= -19.5440, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194476.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=201615.48, pd= -16.0035, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.18, pd= -21.0855, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=226356.26, pd= -12.5920, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.00, pd= -16.9500, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=264257.62, pd= -25.2860, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 6.58, pd= -33.4430, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 19019.92, pd= -9.3915, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 5.58, pd= -12.4580, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 16734.04, pd= -15.3445, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.52, pd= -20.2835, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=206829.58, pd= -1.8395, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.26, pd= -2.7205, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87463.54, pd= -20.4505, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.72, pd= -26.3035, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=185013.20, pd= -14.9615, lock= >937, amb=24582981.556, snr=38.00) L2 (P(Y) , r= 4.04, pd= -19.5835, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=286213.74, pd= -14.9930, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 3.72, pd= -19.5280, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194477.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=201055.12, pd= -15.9145, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.20, pd= -20.9965, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=225898.94, pd= -12.6305, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.98, pd= -16.9895, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=264927.20, pd= -25.3220, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 6.32, pd= -33.4795, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 18607.56, pd= -9.4390, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 5.46, pd= -12.5055, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 16274.02, pd= -15.3400, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.14, pd= -20.2790, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=207255.94, pd= -1.7500, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.76, pd= -2.6310, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87465.00, pd= -20.4045, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.84, pd= -26.2575, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=185637.52, pd= -14.8655, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.12, pd= -19.4875, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=286859.60, pd= -15.1430, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.54, pd= -19.6780, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194478.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=200494.82, pd= -15.8220, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 6.94, pd= -20.9030, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=225441.72, pd= -12.6875, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.04, pd= -17.0460, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=265596.72, pd= -25.2855, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 6.34, pd= -33.4425, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 18195.34, pd= -9.6150, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 5.40, pd= -12.6815, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 15814.06, pd= -15.3030, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.60, pd= -20.2415, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=207682.34, pd= -1.6275, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.80, pd= -2.5085, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87466.62, pd= -20.3960, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.78, pd= -26.2490, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=186262.02, pd= -14.9565, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.12, pd= -19.5790, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=287505.40, pd= -15.2135, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.58, pd= -19.7485, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194479.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=199934.56, pd= -15.7090, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.02, pd= -20.7890, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=224984.58, pd= -12.7430, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.64, pd= -17.1020, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=266266.28, pd= -25.2820, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 6.06, pd= -33.4385, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 17783.20, pd= -9.8650, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 5.02, pd= -12.9310, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 15354.20, pd= -15.2735, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.62, pd= -20.2135, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=208108.84, pd= -1.5355, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.58, pd= -2.4170, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87468.34, pd= -20.3730, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.82, pd= -26.2265, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=186886.50, pd= -15.0215, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.70, pd= -19.6430, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=288151.30, pd= -15.3600, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.48, pd= -19.8940, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194480.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=199374.32, pd= -15.5545, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.20, pd= -20.6340, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=224527.60, pd= -12.8750, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.70, pd= -17.2340, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=266935.84, pd= -25.2725, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 6.70, pd= -33.4295, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 17370.92, pd= -9.9625, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.62, pd= -13.0280, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 14894.40, pd= -15.2100, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.54, pd= -20.1505, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=208535.46, pd= -1.4905, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.52, pd= -2.3720, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87470.20, pd= -20.3645, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.86, pd= -26.2175, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=187510.92, pd= -15.0385, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.72, pd= -19.6600, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=288797.10, pd= -15.3895, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.52, pd= -19.9230, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.23) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.23) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.23) Type 1004: ID=700, TOW=194481.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=198814.16, pd= -15.4215, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.40, pd= -20.5010, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=224070.64, pd= -12.9455, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.56, pd= -17.3040, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=267605.48, pd= -25.3320, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 6.98, pd= -33.4890, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 16958.60, pd= -10.0165, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.52, pd= -13.0810, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 14434.68, pd= -15.1340, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 4.60, pd= -20.0740, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=208962.20, pd= -1.4945, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.50, pd= -2.3755, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87472.24, pd= -20.4145, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.80, pd= -26.2675, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=188135.42, pd= -15.1275, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.12, pd= -19.7485, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=289442.88, pd= -15.3840, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.50, pd= -19.9175, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194482.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=198254.02, pd= -15.2500, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.58, pd= -20.3285, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=223613.72, pd= -12.9715, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.42, pd= -17.3300, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=268275.24, pd= -25.4965, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 6.32, pd= -33.6530, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 16546.26, pd= -10.0425, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 4.44, pd= -13.1075, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 13975.02, pd= -15.0185, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 4.94, pd= -19.9585, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=209389.04, pd= -1.5235, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.62, pd= -2.4055, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87474.34, pd= -20.4065, lock= >937, amb=20086094.686, snr=52.00) L2 (P(Y) , r= 4.88, pd= -26.2595, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=188759.98, pd= -15.2885, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.56, pd= -19.9095, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=290088.78, pd= -15.4760, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.16, pd= -20.0095, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194483.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=197694.10, pd= -15.2355, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.38, pd= -20.3140, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=223156.84, pd= -12.9615, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.28, pd= -17.3205, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=268944.84, pd= -25.4990, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 6.18, pd= -33.6550, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 16133.92, pd= -10.0580, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.54, pd= -13.1220, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 13515.48, pd= -14.9355, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 4.78, pd= -19.8750, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=209815.96, pd= -1.5630, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.58, pd= -2.4450, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87476.60, pd= -20.4360, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.92, pd= -26.2890, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=189384.48, pd= -15.3785, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 4.72, pd= -19.9995, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=290734.68, pd= -15.5470, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.10, pd= -20.0800, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194484.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=197134.16, pd= -15.1390, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.50, pd= -20.2175, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=222700.08, pd= -12.9865, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.50, pd= -17.3455, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=269614.46, pd= -25.5105, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 5.64, pd= -33.6670, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 15721.50, pd= -9.9870, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 4.44, pd= -13.0510, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 13056.06, pd= -14.8770, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 4.98, pd= -19.8165, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=210243.04, pd= -1.6915, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.38, pd= -2.5740, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87479.00, pd= -20.4865, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.3395, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=190008.70, pd= -15.1940, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 5.08, pd= -19.8145, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=291380.58, pd= -15.6015, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.12, pd= -20.1350, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194485.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=196574.32, pd= -15.0885, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.46, pd= -20.1675, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=222243.40, pd= -13.0090, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.42, pd= -17.3675, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=270284.14, pd= -25.5765, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 5.66, pd= -33.7330, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 15309.10, pd= -9.9325, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.66, pd= -12.9970, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 12596.68, pd= -14.7670, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.36, pd= -19.7055, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=210670.12, pd= -1.7485, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.22, pd= -2.6305, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87481.50, pd= -20.5190, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.3730, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=190633.04, pd= -15.1370, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.48, pd= -19.7580, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=292026.40, pd= -15.5575, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.04, pd= -20.0905, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194486.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=196014.44, pd= -14.9345, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.66, pd= -20.0140, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=221786.80, pd= -13.0310, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.82, pd= -17.3900, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=270953.84, pd= -25.6495, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 5.48, pd= -33.8060, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 14896.82, pd= -9.9830, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.46, pd= -13.0465, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 12137.48, pd= -14.7425, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.04, pd= -19.6820, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=211097.28, pd= -1.8110, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.26, pd= -2.6925, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87484.10, pd= -20.5260, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.62, pd= -26.3790, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=191257.52, pd= -15.2250, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 5.04, pd= -19.8465, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=292672.28, pd= -15.5520, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.08, pd= -20.0845, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194487.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=195454.58, pd= -14.7390, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.10, pd= -19.8180, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=221330.24, pd= -13.0090, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.30, pd= -17.3675, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=271623.64, pd= -25.8160, lock= >937, amb=23683604.182, snr=41.00) L2 (P(Y) , r= 5.08, pd= -33.9725, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 14484.66, pd= -10.1470, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.48, pd= -13.2100, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 11678.34, pd= -14.6845, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.08, pd= -19.6245, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=211524.48, pd= -1.8430, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.32, pd= -2.7250, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87486.82, pd= -20.5350, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.72, pd= -26.3895, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=191881.88, pd= -15.1870, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.30, pd= -19.8080, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=293318.14, pd= -15.5115, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 2.90, pd= -20.0440, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194488.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=194894.86, pd= -14.6235, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.40, pd= -19.7025, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=220873.84, pd= -13.0660, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.48, pd= -17.4250, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=272293.42, pd= -25.9505, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 5.18, pd= -34.1065, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 14072.40, pd= -10.2050, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.60, pd= -13.2685, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 11219.32, pd= -14.6540, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.18, pd= -19.5945, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=211951.80, pd= -1.9245, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.16, pd= -2.8060, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87489.68, pd= -20.5615, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.68, pd= -26.4155, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=192506.32, pd= -15.2390, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 4.92, pd= -19.8610, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=293964.00, pd= -15.4470, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.18, pd= -19.9795, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194489.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=194335.26, pd= -14.5705, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.04, pd= -19.6495, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=220417.48, pd= -13.0810, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.26, pd= -17.4410, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=272963.24, pd= -26.1245, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 5.24, pd= -34.2815, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 13660.26, pd= -10.3715, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.40, pd= -13.4345, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 10760.36, pd= -14.5880, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.46, pd= -19.5275, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=212379.16, pd= -1.9725, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.14, pd= -2.8535, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87492.62, pd= -20.5505, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.4045, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=193130.72, pd= -15.2430, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 5.30, pd= -19.8645, lock= >937, snr=19.25) SV= 3, L1 (C/A , r=294609.84, pd= -15.3490, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 3.56, pd= -19.8825, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194490.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=193775.66, pd= -14.4535, lock= >937, amb=22184641.892, snr=43.00) L2 (P(Y) , r= 8.10, pd= -19.5325, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=219961.14, pd= -13.0320, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 4.76, pd= -17.3915, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=273633.06, pd= -26.2795, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 4.80, pd= -34.4355, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 13248.14, pd= -10.5530, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.52, pd= -13.6165, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 10301.48, pd= -14.5080, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.22, pd= -19.4475, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=212806.62, pd= -2.0495, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.46, pd= -2.9305, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87495.68, pd= -20.5380, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.72, pd= -26.3920, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=193755.30, pd= -15.4340, lock= >937, amb=24582981.556, snr=37.00) L2 (P(Y) , r= 5.36, pd= -20.0565, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=295255.72, pd= -15.2685, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 3.46, pd= -19.8020, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.24) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194491.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=193216.16, pd= -14.3795, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.08, pd= -19.4580, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=219504.92, pd= -13.0210, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.04, pd= -17.3800, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=274302.90, pd= -26.4570, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 4.64, pd= -34.6140, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 12836.08, pd= -10.7810, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.54, pd= -13.8445, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 9842.76, pd= -14.4995, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.38, pd= -19.4385, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=213234.12, pd= -2.0970, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.22, pd= -2.9780, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87498.90, pd= -20.5660, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.4210, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=194379.64, pd= -15.3810, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.74, pd= -20.0035, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=295901.58, pd= -15.1510, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 3.72, pd= -19.6835, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194492.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=192656.66, pd= -14.2410, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.32, pd= -19.3200, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=219048.80, pd= -13.0265, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.34, pd= -17.3850, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=274972.68, pd= -26.5570, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 4.22, pd= -34.7130, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 12423.98, pd= -10.9690, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.42, pd= -14.0325, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 9384.16, pd= -14.5105, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.28, pd= -19.4485, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=213661.70, pd= -2.1505, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.28, pd= -3.0315, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87502.26, pd= -20.6120, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.54, pd= -26.4665, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=195003.74, pd= -15.0915, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 5.06, pd= -19.7130, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=296547.48, pd= -15.0570, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 3.70, pd= -19.5900, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194493.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=192097.28, pd= -14.1645, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.14, pd= -19.2425, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=218592.76, pd= -13.0320, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.44, pd= -17.3900, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=275642.30, pd= -26.4920, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 4.56, pd= -34.6485, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 12011.84, pd= -11.1055, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.50, pd= -14.1695, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 8925.66, pd= -14.5335, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.42, pd= -19.4710, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=214089.32, pd= -2.1730, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.10, pd= -3.0535, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87505.70, pd= -20.6195, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.64, pd= -26.4745, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=195628.10, pd= -15.0705, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 4.46, pd= -19.6920, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=297193.40, pd= -14.9550, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 4.12, pd= -19.4875, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194494.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=191538.02, pd= -14.1460, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.72, pd= -19.2245, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=218136.86, pd= -13.0925, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.20, pd= -17.4505, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=276311.72, pd= -26.2185, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 4.68, pd= -34.3745, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 11599.70, pd= -11.2325, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.52, pd= -14.2960, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 8467.26, pd= -14.5580, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.68, pd= -19.4960, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=214517.02, pd= -2.2030, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.04, pd= -3.0830, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87509.28, pd= -20.6430, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.4980, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=196252.50, pd= -15.0795, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.94, pd= -19.7020, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=297839.48, pd= -15.0030, lock= >937, amb=22784226.808, snr=43.00) L2 (P(Y) , r= 3.96, pd= -19.5365, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194495.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=190978.78, pd= -14.0920, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.82, pd= -19.1705, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=217680.98, pd= -13.0940, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 4.82, pd= -17.4525, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=276981.30, pd= -26.0920, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 5.10, pd= -34.2485, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 11187.48, pd= -11.2725, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.26, pd= -14.3355, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 8008.96, pd= -14.5925, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.48, pd= -19.5315, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=214944.80, pd= -2.2425, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.20, pd= -3.1220, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87512.96, pd= -20.6465, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.80, pd= -26.5000, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=196876.64, pd= -14.8465, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 5.36, pd= -19.4700, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=298485.46, pd= -14.9250, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.06, pd= -19.4585, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194496.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=190419.64, pd= -14.0735, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.84, pd= -19.1520, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=217225.14, pd= -13.0515, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.36, pd= -17.4100, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=277650.98, pd= -26.0635, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 5.42, pd= -34.2205, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 10775.22, pd= -11.2635, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.26, pd= -14.3265, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 7550.70, pd= -14.5695, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.36, pd= -19.5085, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=215372.68, pd= -2.3120, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.14, pd= -3.1920, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87516.78, pd= -20.6710, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.74, pd= -26.5260, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=197500.88, pd= -14.7030, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 5.86, pd= -19.3265, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=299131.40, pd= -14.7930, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.24, pd= -19.3265, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194497.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=189860.50, pd= -13.9960, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.18, pd= -19.0745, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=216769.38, pd= -13.0090, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.56, pd= -17.3675, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=278320.60, pd= -25.9630, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 5.86, pd= -34.1190, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 10362.92, pd= -11.2110, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.30, pd= -14.2745, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 7092.52, pd= -14.5380, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.42, pd= -19.4750, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=215800.62, pd= -2.3690, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.16, pd= -3.2485, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87520.70, pd= -20.6735, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.72, pd= -26.5280, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=198124.74, pd= -14.1805, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 7.40, pd= -18.8050, lock= >937, snr=17.75) SV= 3, L1 (C/A , r=299777.42, pd= -14.7260, lock= >937, amb=22784226.808, snr=42.00) L2 (P(Y) , r= 4.32, pd= -19.2605, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194498.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=189301.42, pd= -13.9185, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.20, pd= -18.9960, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=216313.70, pd= -12.9630, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.44, pd= -17.3210, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=278990.10, pd= -25.7350, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 6.06, pd= -33.8915, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 9950.66, pd= -11.1875, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.30, pd= -14.2505, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 6634.50, pd= -14.5660, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.36, pd= -19.5030, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=216228.58, pd= -2.3720, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.46, pd= -3.2510, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87524.76, pd= -20.6970, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.74, pd= -26.5510, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=198749.00, pd= -14.0615, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 7.26, pd= -18.6860, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 631.00, pd= -14.6560, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.04, pd= -19.1905, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194499.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=188742.50, pd= -13.9370, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.60, pd= -19.0140, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=215858.12, pd= -12.9340, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.44, pd= -17.2910, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=279659.92, pd= -25.8190, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 6.16, pd= -33.9750, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 9538.42, pd= -11.1785, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.20, pd= -14.2415, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 6176.56, pd= -14.5845, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.26, pd= -19.5230, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=216656.66, pd= -2.4235, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 3.42, pd= -3.3035, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87528.92, pd= -20.6975, lock= >937, amb=20086094.686, snr=52.00) L2 (P(Y) , r= 4.64, pd= -26.5520, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=199373.02, pd= -13.7110, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 7.84, pd= -18.3355, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 1277.08, pd= -14.6070, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.04, pd= -19.1410, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194500.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=188183.60, pd= -13.9155, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.80, pd= -18.9920, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=215402.66, pd= -12.9425, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.48, pd= -17.3010, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=280329.64, pd= -25.7915, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 5.82, pd= -33.9470, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 9126.20, pd= -11.1790, lock= >937, amb=23383811.724, snr=42.00) L2 (P(Y) , r= 3.84, pd= -14.2420, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 5718.66, pd= -14.5470, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.50, pd= -19.4840, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=217084.82, pd= -2.4850, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.42, pd= -3.3660, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87533.24, pd= -20.7410, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.5960, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=199997.20, pd= -13.5215, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 7.40, pd= -18.1465, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 1923.18, pd= -14.5590, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.14, pd= -19.0935, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.24) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194501.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=187624.72, pd= -13.8550, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.02, pd= -18.9315, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=214947.30, pd= -12.9695, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.44, pd= -17.3275, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=280999.24, pd= -25.6410, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 6.58, pd= -33.7975, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 8713.88, pd= -11.0705, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.82, pd= -14.1330, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 5260.84, pd= -14.4975, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.12, pd= -19.4335, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=217513.02, pd= -2.5140, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.06, pd= -3.3940, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87537.64, pd= -20.7400, lock= >937, amb=20086094.686, snr=52.00) L2 (P(Y) , r= 4.50, pd= -26.5945, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=200621.20, pd= -13.1525, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 7.94, pd= -17.7790, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 2569.28, pd= -14.4920, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.38, pd= -19.0270, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194502.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=187065.88, pd= -13.7735, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.18, pd= -18.8495, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=214492.02, pd= -12.9925, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.54, pd= -17.3510, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=281668.88, pd= -25.5135, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 6.70, pd= -33.6700, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 8301.70, pd= -11.0925, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.96, pd= -14.1550, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 4803.14, pd= -14.4740, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.56, pd= -19.4100, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=217941.26, pd= -2.5130, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.14, pd= -3.3935, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87542.18, pd= -20.7590, lock= >937, amb=20086094.686, snr=52.00) L2 (P(Y) , r= 4.52, pd= -26.6140, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=201245.36, pd= -12.9465, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 8.20, pd= -17.5730, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 3215.42, pd= -14.4475, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.22, pd= -18.9825, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.24) Type 1004: ID=700, TOW=194503.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=186507.14, pd= -13.7310, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.36, pd= -18.8065, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=214036.80, pd= -12.9900, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.30, pd= -17.3465, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=282338.78, pd= -25.6475, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 6.26, pd= -33.8035, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 7889.52, pd= -11.1130, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.82, pd= -14.1745, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 4345.54, pd= -14.4590, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.52, pd= -19.3945, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=218369.54, pd= -2.4810, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.44, pd= -3.3610, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87546.84, pd= -20.7790, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.58, pd= -26.6330, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=201869.42, pd= -12.6370, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 9.00, pd= -17.2630, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 3861.68, pd= -14.5015, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.14, pd= -19.0360, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194504.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=185948.46, pd= -13.6880, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.62, pd= -18.7635, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=213581.70, pd= -13.0275, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.16, pd= -17.3850, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=283008.52, pd= -25.6130, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 5.94, pd= -33.7695, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 7477.24, pd= -11.0220, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.86, pd= -14.0840, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 3888.10, pd= -14.5080, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.66, pd= -19.4440, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=218797.92, pd= -2.4725, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.44, pd= -3.3525, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87551.60, pd= -20.7800, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.46, pd= -26.6345, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=202493.56, pd= -12.4150, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 9.72, pd= -17.0420, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 4507.88, pd= -14.4790, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.18, pd= -19.0145, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194505.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=185389.84, pd= -13.6450, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.72, pd= -18.7195, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=213126.68, pd= -13.0635, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.34, pd= -17.4220, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=283678.24, pd= -25.5480, lock= >937, amb=23683604.182, snr=41.00) L2 (P(Y) , r= 5.96, pd= -33.7050, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 7065.02, pd= -10.9795, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.82, pd= -14.0415, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 3430.72, pd= -14.5225, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.48, pd= -19.4570, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=219226.34, pd= -2.4385, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.34, pd= -3.3185, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87556.46, pd= -20.7605, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.54, pd= -26.6155, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=203117.54, pd= -12.0325, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 9.96, pd= -16.6600, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 5154.02, pd= -14.3790, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.06, pd= -18.9140, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194506.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=184831.36, pd= -13.6810, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.94, pd= -18.7555, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=212671.76, pd= -13.1160, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.46, pd= -17.4745, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=284348.18, pd= -25.6935, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 6.02, pd= -33.8510, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 6652.66, pd= -10.7920, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.86, pd= -13.8540, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 2973.46, pd= -14.5640, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.82, pd= -19.4995, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=219654.84, pd= -2.4095, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.50, pd= -3.2895, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87561.46, pd= -20.7565, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.62, pd= -26.6115, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=203741.60, pd= -11.7285, lock= >937, amb=24582981.556, snr=32.00) L2 (P(Y) , r= 10.64, pd= -16.3555, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 5800.20, pd= -14.3000, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 3.96, pd= -18.8345, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194507.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=184272.92, pd= -13.6955, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.80, pd= -18.7700, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=212216.88, pd= -13.1240, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.60, pd= -17.4815, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=285017.96, pd= -25.6730, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 6.06, pd= -33.8310, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 6240.38, pd= -10.6700, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.88, pd= -13.7315, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 2516.32, pd= -14.6295, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.96, pd= -19.5640, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=220083.44, pd= -2.4100, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.42, pd= -3.2905, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87566.60, pd= -20.7760, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.48, pd= -26.6310, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=204365.90, pd= -11.6680, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 10.54, pd= -16.2960, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 6446.40, pd= -14.2215, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.26, pd= -18.7560, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194508.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=183714.60, pd= -13.7730, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.58, pd= -18.8465, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=211762.08, pd= -13.1305, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.64, pd= -17.4880, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=285687.74, pd= -25.6435, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 5.88, pd= -33.8020, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 5828.12, pd= -10.5620, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.20, pd= -13.6230, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 2059.26, pd= -14.6820, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.12, pd= -19.6170, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=220512.04, pd= -2.3400, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.42, pd= -3.2200, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87571.86, pd= -20.7930, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.52, pd= -26.6485, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=204989.86, pd= -11.2710, lock= >937, amb=24582981.556, snr=32.00) L2 (P(Y) , r= 10.52, pd= -15.8990, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 7092.64, pd= -14.1635, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.30, pd= -18.6990, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194509.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=183156.36, pd= -13.8640, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 8.38, pd= -18.9365, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=211307.38, pd= -13.1570, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.56, pd= -17.5145, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=286357.54, pd= -25.6265, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 6.02, pd= -33.7840, lock= >937, snr=19.25) SV= 28, L1 (C/A , r= 5415.92, pd= -10.5160, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.12, pd= -13.5775, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 1602.24, pd= -14.6805, lock= >937, amb=21285264.518, snr=48.00) L2 (P(Y) , r= 5.54, pd= -19.6145, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=220940.76, pd= -2.3210, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.58, pd= -3.2020, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87577.24, pd= -20.8110, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.46, pd= -26.6655, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=205614.40, pd= -11.4495, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 9.74, pd= -16.0780, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 7738.98, pd= -14.1870, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.36, pd= -18.7210, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194510.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=182598.20, pd= -13.9745, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.56, pd= -19.0465, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=210852.74, pd= -13.1575, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.50, pd= -17.5145, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=287027.38, pd= -25.6405, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 6.04, pd= -33.7990, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 5003.66, pd= -10.3925, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.40, pd= -13.4535, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 1145.38, pd= -14.7440, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.66, pd= -19.6790, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=221369.52, pd= -2.2665, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.40, pd= -3.1470, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87582.76, pd= -20.8475, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.52, pd= -26.7025, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=206238.58, pd= -11.2775, lock= >937, amb=24582981.556, snr=32.00) L2 (P(Y) , r= 9.92, pd= -15.9070, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 8385.32, pd= -14.1925, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.38, pd= -18.7275, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.25) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194511.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=182040.04, pd= -14.0285, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.58, pd= -19.1015, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=210398.06, pd= -13.0400, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.38, pd= -17.3975, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=287697.26, pd= -25.6890, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 6.24, pd= -33.8470, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 4591.64, pd= -10.4995, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.28, pd= -13.5595, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 688.60, pd= -14.7930, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.70, pd= -19.7265, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=221798.38, pd= -2.2420, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.52, pd= -3.1225, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87588.36, pd= -20.8435, lock= >937, amb=20086094.686, snr=52.00) L2 (P(Y) , r= 4.46, pd= -26.6990, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=206862.88, pd= -11.2420, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 9.34, pd= -15.8725, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 9031.56, pd= -14.0775, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.52, pd= -18.6125, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194512.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=181481.86, pd= -13.9985, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.46, pd= -19.0715, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=209943.54, pd= -12.9965, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.30, pd= -17.3535, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=288366.94, pd= -25.5215, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 6.30, pd= -33.6790, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 4179.58, pd= -10.5620, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.28, pd= -13.6230, lock= >937, snr=26.00) SV= 11, L1 (C/A , r= 231.94, pd= -14.8685, lock= >937, amb=21285264.518, snr=49.00) L2 (P(Y) , r= 5.18, pd= -19.8025, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=222227.32, pd= -2.2270, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.56, pd= -3.1075, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87594.10, pd= -20.8585, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.32, pd= -26.7145, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=207487.08, pd= -11.0795, lock= >937, amb=24582981.556, snr=32.00) L2 (P(Y) , r= 9.76, pd= -15.7095, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 9677.92, pd= -14.0635, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.48, pd= -18.5975, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194513.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=180923.80, pd= -14.0290, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.56, pd= -19.1025, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=209489.12, pd= -12.9695, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.44, pd= -17.3265, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=289036.90, pd= -25.6295, lock= >937, amb=23683604.182, snr=41.00) L2 (P(Y) , r= 6.30, pd= -33.7875, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 3767.64, pd= -10.7350, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.94, pd= -13.7955, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=299567.84, pd= -14.9530, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.26, pd= -19.8870, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=222656.34, pd= -2.2220, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.60, pd= -3.1035, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87599.86, pd= -20.7725, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.38, pd= -26.6275, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=208111.66, pd= -11.3245, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 9.94, pd= -15.9565, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 10324.20, pd= -13.9555, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.64, pd= -18.4900, lock= >937, snr=23.75) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194514.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=180365.82, pd= -14.0800, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.28, pd= -19.1535, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=209034.76, pd= -12.9235, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.76, pd= -17.2810, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=289706.80, pd= -25.6745, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 6.54, pd= -33.8325, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 3355.58, pd= -10.7805, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.98, pd= -13.8410, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=299111.40, pd= -15.0575, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.36, pd= -19.9910, lock= >937, snr=36.00) SV= 19, L1 (C/A , r=223085.44, pd= -2.2270, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.40, pd= -3.1085, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87605.72, pd= -20.6690, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.50, pd= -26.5250, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=208736.12, pd= -11.4290, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 10.62, pd= -16.0625, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 10970.48, pd= -13.8270, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.90, pd= -18.3620, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194515.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=179807.74, pd= -13.9680, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.60, pd= -19.0410, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=208580.44, pd= -12.8300, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.52, pd= -17.1870, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=290376.62, pd= -25.6285, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 7.10, pd= -33.7855, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 2943.54, pd= -10.8405, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.04, pd= -13.9010, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=298655.02, pd= -15.1325, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.18, pd= -20.0660, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=223514.62, pd= -2.2420, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.38, pd= -3.1230, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87611.72, pd= -20.5815, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.64, pd= -26.4380, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=209360.48, pd= -11.4610, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 9.10, pd= -16.0950, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 11616.92, pd= -13.8405, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.86, pd= -18.3745, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194516.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=179249.80, pd= -13.9370, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.64, pd= -19.0095, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=208126.28, pd= -12.8170, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.52, pd= -17.1740, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=291046.44, pd= -25.5760, lock= >937, amb=23683604.182, snr=40.00) L2 (P(Y) , r= 7.06, pd= -33.7330, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 2531.54, pd= -10.9325, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.12, pd= -13.9935, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=298198.72, pd= -15.1910, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.82, pd= -20.1240, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=223943.88, pd= -2.2600, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.48, pd= -3.1410, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87617.84, pd= -20.4935, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.78, pd= -26.3490, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=209984.80, pd= -11.4420, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 8.76, pd= -16.0770, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 12263.48, pd= -13.9550, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.92, pd= -18.4895, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194517.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=178691.90, pd= -13.8820, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.56, pd= -18.9545, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=207672.14, pd= -12.7390, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.88, pd= -17.0960, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=291716.38, pd= -25.6345, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 7.14, pd= -33.7920, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 2119.46, pd= -10.9310, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 4.12, pd= -13.9910, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=297742.48, pd= -15.2145, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.80, pd= -20.1490, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=224373.24, pd= -2.3115, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.30, pd= -3.1935, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87624.16, pd= -20.4850, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.86, pd= -26.3400, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=210609.28, pd= -11.5830, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 9.58, pd= -16.2190, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 12909.92, pd= -13.9320, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.12, pd= -18.4665, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194518.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=178134.22, pd= -13.9890, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.66, pd= -19.0605, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=207218.16, pd= -12.7365, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.86, pd= -17.0940, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=292386.12, pd= -25.4885, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 7.38, pd= -33.6460, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 1707.42, pd= -10.9680, lock= >937, amb=23383811.724, snr=44.00) L2 (P(Y) , r= 4.08, pd= -14.0275, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=297286.30, pd= -15.2050, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.00, pd= -20.1385, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=224802.62, pd= -2.3120, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.22, pd= -3.1935, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87630.52, pd= -20.3965, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.2525, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=211233.48, pd= -11.4490, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 9.46, pd= -16.0860, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 13556.40, pd= -13.9275, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.08, pd= -18.4610, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194519.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=177576.52, pd= -14.0130, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.58, pd= -19.0845, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=206764.20, pd= -12.6765, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.84, pd= -17.0340, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=293055.88, pd= -25.3475, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 7.64, pd= -33.5050, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 1295.46, pd= -11.0785, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.80, pd= -14.1375, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=296830.26, pd= -15.2410, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.96, pd= -20.1745, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=225232.06, pd= -2.3000, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.34, pd= -3.1815, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87637.04, pd= -20.3460, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.2020, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=211858.14, pd= -11.7695, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 9.76, pd= -16.4065, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 14202.92, pd= -13.9525, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.20, pd= -18.4860, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194520.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=177018.88, pd= -14.0320, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.80, pd= -19.1030, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=206310.30, pd= -12.5880, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.00, pd= -16.9450, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=293725.72, pd= -25.2815, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.24, pd= -33.4400, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 883.32, pd= -10.9920, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.66, pd= -14.0510, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=296374.36, pd= -15.3240, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.32, pd= -20.2570, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=225661.54, pd= -2.2565, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.32, pd= -3.1375, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87643.64, pd= -20.2550, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.90, pd= -26.1125, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=212482.82, pd= -12.1245, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 9.70, pd= -16.7630, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 14849.48, pd= -13.9915, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.30, pd= -18.5245, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.25) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.25) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194521.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=176461.32, pd= -14.0785, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 9.06, pd= -19.1495, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=205856.50, pd= -12.5205, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.38, pd= -16.8790, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=294395.50, pd= -25.1510, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.44, pd= -33.3105, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 471.32, pd= -11.0435, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.50, pd= -14.1020, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=295918.44, pd= -15.2950, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.04, pd= -20.2270, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=226091.02, pd= -2.1445, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.16, pd= -3.0260, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87650.40, pd= -20.2025, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.0590, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=213107.54, pd= -12.5120, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 9.08, pd= -17.1515, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 15496.12, pd= -14.0960, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.18, pd= -18.6295, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.25) Type 1004: ID=700, TOW=194522.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=175903.82, pd= -14.1185, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.94, pd= -19.1900, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=205402.84, pd= -12.5075, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.90, pd= -16.8645, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=295065.40, pd= -25.1345, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.38, pd= -33.2945, lock= >937, snr=20.00) SV= 28, L1 (C/A , r= 59.24, pd= -11.0085, lock= >937, amb=23383811.724, snr=43.00) L2 (P(Y) , r= 3.60, pd= -14.0665, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=295462.66, pd= -15.3085, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.58, pd= -20.2410, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=226520.66, pd= -2.1235, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.46, pd= -3.0055, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87657.32, pd= -20.1940, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.88, pd= -26.0505, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=213732.52, pd= -13.1620, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 8.46, pd= -17.8025, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 16142.64, pd= -14.0635, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.36, pd= -18.5965, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194523.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=175346.50, pd= -14.2800, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.68, pd= -19.3500, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=204949.22, pd= -12.4525, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.18, pd= -16.8095, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=295735.26, pd= -25.0600, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.34, pd= -33.2185, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=299439.74, pd= -11.0830, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.56, pd= -14.1410, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=295006.96, pd= -15.3090, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.24, pd= -20.2415, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=226950.38, pd= -2.1075, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.52, pd= -2.9895, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87664.34, pd= -20.1635, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.98, pd= -26.0210, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=214357.14, pd= -13.4620, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 7.74, pd= -18.1025, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 16789.16, pd= -14.0100, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.54, pd= -18.5430, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194524.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=174789.26, pd= -14.4575, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.40, pd= -19.5280, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=204495.76, pd= -12.4750, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.30, pd= -16.8330, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=296405.14, pd= -25.0065, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.16, pd= -33.1650, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=299027.72, pd= -11.0930, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.58, pd= -14.1510, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=294551.32, pd= -15.2730, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.76, pd= -20.2065, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=227380.22, pd= -2.1390, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 3.40, pd= -3.0205, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87671.52, pd= -20.1715, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.02, pd= -26.0290, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=214981.98, pd= -13.9715, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 7.46, pd= -18.6135, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 17435.70, pd= -13.9605, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.88, pd= -18.4940, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194525.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=174231.96, pd= -14.5135, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 8.34, pd= -19.5850, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=204042.34, pd= -12.4550, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.18, pd= -16.8135, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=297075.00, pd= -24.9255, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 8.36, pd= -33.0845, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=298615.70, pd= -11.0900, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.44, pd= -14.1470, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=294095.72, pd= -15.1830, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.88, pd= -20.1170, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=227810.12, pd= -2.1625, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.40, pd= -3.0445, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87678.78, pd= -20.1365, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.04, pd= -25.9940, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=215606.52, pd= -14.1965, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 6.20, pd= -18.8405, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 18082.42, pd= -14.0670, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.02, pd= -18.6000, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194526.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=173674.72, pd= -14.5705, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 8.30, pd= -19.6410, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=203589.02, pd= -12.4490, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.94, pd= -16.8055, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=297744.92, pd= -24.8910, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.18, pd= -33.0490, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=298203.74, pd= -11.1400, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.28, pd= -14.1970, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=293640.28, pd= -15.1590, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.82, pd= -20.0920, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=228240.06, pd= -2.1520, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.30, pd= -3.0335, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87686.22, pd= -20.1620, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.96, pd= -26.0190, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=216231.00, pd= -14.3590, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 5.28, pd= -19.0035, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 18729.04, pd= -14.0600, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.06, pd= -18.5935, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194527.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=173117.50, pd= -14.5860, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 8.24, pd= -19.6575, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=203135.78, pd= -12.4425, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.08, pd= -16.8005, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=298414.78, pd= -24.7970, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.32, pd= -32.9560, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=297791.74, pd= -11.1410, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 3.38, pd= -14.1975, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=293184.92, pd= -15.1230, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.50, pd= -20.0555, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=228670.12, pd= -2.1930, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.20, pd= -3.0740, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87693.78, pd= -20.1890, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.00, pd= -26.0465, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=216855.66, pd= -14.7045, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 4.76, pd= -19.3505, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 19375.54, pd= -13.9145, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.36, pd= -18.4485, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194528.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=172560.44, pd= -14.7010, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.82, pd= -19.7730, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=202682.66, pd= -12.4720, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.16, pd= -16.8300, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=299084.52, pd= -24.5670, lock= >937, amb=23683604.182, snr=39.00) L2 (P(Y) , r= 8.48, pd= -32.7260, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=297379.80, pd= -11.1930, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.34, pd= -14.2495, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=292729.68, pd= -15.1080, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.36, pd= -20.0400, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=229100.20, pd= -2.1845, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.18, pd= -3.0670, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87701.44, pd= -20.1925, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.06, pd= -26.0500, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=217480.18, pd= -14.9135, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 3.98, pd= -19.5595, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 20022.14, pd= -13.8490, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.54, pd= -18.3825, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194529.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=172003.42, pd= -14.7915, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.60, pd= -19.8625, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=202229.60, pd= -12.4795, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.96, pd= -16.8375, lock= >937, snr=38.00) SV= 13, L1 (C/A , r=299754.52, pd= -24.5900, lock= >937, amb=23683604.182, snr=38.00) L2 (P(Y) , r= 8.06, pd= -32.7485, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=296967.92, pd= -11.2995, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 3.32, pd= -14.3550, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=292274.52, pd= -15.0820, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.20, pd= -20.0145, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=229530.34, pd= -2.1625, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.44, pd= -3.0445, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87709.28, pd= -20.2575, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.90, pd= -26.1155, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=218104.38, pd= -14.8020, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 4.16, pd= -19.4475, lock= >937, snr=16.00) SV= 3, L1 (C/A , r= 20668.80, pd= -13.8275, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.68, pd= -18.3610, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194530.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=171446.44, pd= -14.8595, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.50, pd= -19.9310, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=201776.62, pd= -12.4800, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.14, pd= -16.8385, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 631.98, pd= -24.5260, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 8.02, pd= -32.6845, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=296556.06, pd= -11.4190, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.48, pd= -14.4750, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=291819.48, pd= -15.0795, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.26, pd= -20.0115, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=229960.56, pd= -2.1525, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.34, pd= -3.0345, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87717.24, pd= -20.3190, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.86, pd= -26.1765, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=218728.94, pd= -15.0485, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 3.92, pd= -19.6950, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 21315.42, pd= -13.7435, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.82, pd= -18.2775, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.26) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194531.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=170889.56, pd= -14.9720, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.28, pd= -20.0435, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=201323.76, pd= -12.5225, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.22, pd= -16.8815, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 1301.74, pd= -24.2990, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 8.14, pd= -32.4590, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=296144.14, pd= -11.4670, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.40, pd= -14.5225, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=291364.54, pd= -15.0825, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.46, pd= -20.0150, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=230390.86, pd= -2.1530, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.08, pd= -3.0345, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87725.26, pd= -20.3215, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.82, pd= -26.1800, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=219353.02, pd= -14.8270, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 4.42, pd= -19.4750, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 21962.06, pd= -13.6635, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.86, pd= -18.1975, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194532.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=170332.72, pd= -15.0620, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.20, pd= -20.1345, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=200871.00, pd= -12.5800, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.14, pd= -16.9380, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 1971.66, pd= -24.2225, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 8.02, pd= -32.3830, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=295732.14, pd= -11.4280, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.62, pd= -14.4835, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=290909.72, pd= -15.1120, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.38, pd= -20.0450, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=230821.18, pd= -2.1025, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.42, pd= -2.9850, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87733.46, pd= -20.3825, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.62, pd= -26.2400, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=219977.16, pd= -14.6740, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 5.00, pd= -19.3220, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 22608.66, pd= -13.5255, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.80, pd= -18.0595, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194533.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=169776.02, pd= -15.2305, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.96, pd= -20.3030, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=200418.24, pd= -12.5525, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.16, pd= -16.9100, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 2641.78, pd= -24.3410, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 8.32, pd= -32.5020, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=295320.24, pd= -11.4840, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 3.50, pd= -14.5395, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=290454.98, pd= -15.1275, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.42, pd= -20.0600, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=231251.68, pd= -2.1625, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.22, pd= -3.0450, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87741.76, pd= -20.4275, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.72, pd= -26.2860, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=220601.50, pd= -14.7040, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.96, pd= -19.3510, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 23255.32, pd= -13.4275, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 7.16, pd= -17.9610, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194534.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=169219.32, pd= -15.3380, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.18, pd= -20.4110, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=199965.60, pd= -12.5665, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.02, pd= -16.9250, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 3311.78, pd= -24.3295, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 7.76, pd= -32.4900, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=294908.26, pd= -11.4490, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.52, pd= -14.5045, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=290000.34, pd= -15.1480, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.26, pd= -20.0805, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=231682.22, pd= -2.1870, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.40, pd= -3.0690, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87750.16, pd= -20.4505, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.68, pd= -26.3085, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=221225.88, pd= -14.7880, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 5.18, pd= -19.4360, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 23902.02, pd= -13.3515, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.30, pd= -17.8865, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194535.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=168662.66, pd= -15.4185, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.94, pd= -20.4910, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=199513.00, pd= -12.5315, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.24, pd= -16.8880, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 3981.94, pd= -24.4660, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 7.18, pd= -32.6265, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=294496.20, pd= -11.3245, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.48, pd= -14.3795, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=289545.76, pd= -15.1345, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.14, pd= -20.0665, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=232112.86, pd= -2.2425, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.16, pd= -3.1245, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87758.68, pd= -20.4665, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.70, pd= -26.3230, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=221850.24, pd= -14.8520, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 5.30, pd= -19.5000, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 24548.76, pd= -13.2940, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.24, pd= -17.8285, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194536.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=168106.04, pd= -15.4820, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.78, pd= -20.5545, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=199060.48, pd= -12.4990, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.86, pd= -16.8570, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 4652.08, pd= -24.5800, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 6.82, pd= -32.7405, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=294084.10, pd= -11.1555, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.78, pd= -14.2110, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=289091.28, pd= -15.1265, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.12, pd= -20.0595, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=232543.52, pd= -2.2490, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.22, pd= -3.1315, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87767.36, pd= -20.5295, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.68, pd= -26.3875, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=222474.68, pd= -14.9900, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.78, pd= -19.6370, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 25195.44, pd= -13.1625, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.48, pd= -17.6970, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194537.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=167549.34, pd= -15.4070, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.84, pd= -20.4790, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=198608.06, pd= -12.4775, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.18, pd= -16.8350, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 5322.24, pd= -24.7055, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.32, pd= -32.8665, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=293671.96, pd= -10.9340, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.02, pd= -13.9890, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=288636.92, pd= -15.1410, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.16, pd= -20.0735, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=232974.26, pd= -2.2600, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.36, pd= -3.1420, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87776.16, pd= -20.5880, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.4455, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=223098.96, pd= -14.9810, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 4.80, pd= -19.6290, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 25842.32, pd= -13.2180, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 7.46, pd= -17.7535, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194538.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=166992.76, pd= -15.3885, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.98, pd= -20.4615, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=198155.74, pd= -12.4755, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.18, pd= -16.8330, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 5992.42, pd= -24.8440, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.78, pd= -33.0045, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=293259.84, pd= -10.7290, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.22, pd= -13.7845, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=288182.72, pd= -15.2240, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.32, pd= -20.1565, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=233405.14, pd= -2.3415, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.20, pd= -3.2240, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87785.00, pd= -20.5635, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.62, pd= -26.4210, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=223723.10, pd= -14.8335, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.34, pd= -19.4820, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 26489.08, pd= -13.1275, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 7.54, pd= -17.6635, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194539.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=166436.30, pd= -15.4255, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.22, pd= -20.4980, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=197703.50, pd= -12.4705, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.14, pd= -16.8265, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 6662.38, pd= -24.7525, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 5.90, pd= -32.9135, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=292847.76, pd= -10.5550, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.14, pd= -13.6100, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=287728.56, pd= -15.2510, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.24, pd= -20.1810, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=233836.06, pd= -2.3940, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 3.10, pd= -3.2760, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87793.96, pd= -20.5435, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.56, pd= -26.4020, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=224347.60, pd= -15.0440, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.12, pd= -19.6930, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 27135.90, pd= -13.0775, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 7.88, pd= -17.6130, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194540.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=165879.82, pd= -15.3830, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.42, pd= -20.4560, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=197251.26, pd= -12.3850, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.18, pd= -16.7425, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 7332.60, pd= -24.9145, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 5.68, pd= -33.0760, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=292435.74, pd= -10.4310, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.20, pd= -13.4860, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=287274.50, pd= -15.2845, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.28, pd= -20.2150, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=234267.06, pd= -2.4540, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 3.22, pd= -3.3355, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87803.10, pd= -20.5785, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.50, pd= -26.4365, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=224971.94, pd= -15.0955, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.14, pd= -19.7430, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 27782.76, pd= -13.0530, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 7.76, pd= -17.5890, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.26) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194541.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=165323.34, pd= -15.2850, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.92, pd= -20.3595, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=196799.16, pd= -12.3540, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.42, pd= -16.7115, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 8002.66, pd= -24.9135, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.76, pd= -33.0760, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=292023.84, pd= -10.4180, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.22, pd= -13.4725, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=286820.52, pd= -15.3005, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.30, pd= -20.2310, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=234698.14, pd= -2.5225, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.84, pd= -3.4040, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87812.32, pd= -20.5770, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.50, pd= -26.4355, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=225596.50, pd= -15.3735, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 4.70, pd= -20.0215, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 28429.62, pd= -13.0145, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 7.68, pd= -17.5510, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194542.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=164766.98, pd= -15.2385, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.78, pd= -20.3125, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=196347.16, pd= -12.3400, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.34, pd= -16.6975, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 8672.78, pd= -24.9570, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 5.60, pd= -33.1195, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=291611.82, pd= -10.2800, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.20, pd= -13.3345, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=286366.66, pd= -15.3485, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.46, pd= -20.2785, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=235129.28, pd= -2.5805, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 2.86, pd= -3.4615, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87821.66, pd= -20.5740, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.60, pd= -26.4325, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=226221.00, pd= -15.5865, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.16, pd= -20.2350, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 29076.44, pd= -12.9125, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 7.48, pd= -17.4495, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194543.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=164210.68, pd= -15.1920, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.92, pd= -20.2660, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=195895.36, pd= -12.4450, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.96, pd= -16.8035, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 9343.04, pd= -25.1380, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.10, pd= -33.3025, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=291199.82, pd= -10.1535, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.26, pd= -13.2075, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=285912.84, pd= -15.3415, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.64, pd= -20.2725, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=235560.52, pd= -2.6695, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 2.54, pd= -3.5510, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87831.16, pd= -20.6060, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.58, pd= -26.4635, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=226845.48, pd= -15.7955, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 3.76, pd= -20.4440, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 29723.30, pd= -12.8325, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 7.82, pd= -17.3710, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.26) Type 1004: ID=700, TOW=194544.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=163654.34, pd= -15.0440, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.98, pd= -20.1170, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=195443.58, pd= -12.4835, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.56, pd= -16.8405, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 10013.26, pd= -25.2710, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 5.58, pd= -33.4355, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=290787.90, pd= -10.0965, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.36, pd= -13.1515, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=285459.10, pd= -15.3175, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.50, pd= -20.2485, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=235991.80, pd= -2.7270, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.28, pd= -3.6085, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87840.80, pd= -20.6605, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.36, pd= -26.5180, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=227470.08, pd= -16.1115, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 2.40, pd= -20.7600, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 30370.14, pd= -12.7165, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 8.00, pd= -17.2555, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194545.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=163098.12, pd= -14.9525, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.90, pd= -20.0260, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=194991.86, pd= -12.5010, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.98, pd= -16.8575, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 10683.42, pd= -25.3350, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 5.30, pd= -33.5005, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=290376.00, pd= -10.0575, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.66, pd= -13.1120, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=285005.56, pd= -15.4055, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.28, pd= -20.3365, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=236423.10, pd= -2.7335, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.26, pd= -3.6160, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87850.50, pd= -20.6530, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.52, pd= -26.5105, lock= >937, snr=46.00) SV= 6, L1 (C/A , r=228094.48, pd= -16.2380, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 2.40, pd= -20.8870, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 31017.12, pd= -12.7235, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.82, pd= -17.2625, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194546.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=162541.96, pd= -14.8620, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.94, pd= -19.9360, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=194540.26, pd= -12.5580, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.28, pd= -16.9150, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 11353.52, pd= -25.3350, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.18, pd= -33.5005, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=289964.12, pd= -10.0270, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 4.88, pd= -13.0820, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=284552.04, pd= -15.4120, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.32, pd= -20.3405, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=236854.42, pd= -2.6870, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.70, pd= -3.5685, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87860.28, pd= -20.6100, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.54, pd= -26.4690, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=228719.00, pd= -16.4910, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 2.66, pd= -21.1405, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 31664.18, pd= -12.7875, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.98, pd= -17.3270, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194547.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=161985.82, pd= -14.7300, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.88, pd= -19.8035, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=194088.72, pd= -12.5855, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.84, pd= -16.9420, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 12023.64, pd= -25.3420, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.06, pd= -33.5085, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=289552.44, pd= -10.1860, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.74, pd= -13.2410, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=284098.62, pd= -15.4250, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.58, pd= -20.3560, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=237285.82, pd= -2.6510, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.70, pd= -3.5325, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87870.18, pd= -20.5605, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.34, pd= -26.4190, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=229343.26, pd= -16.4915, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 2.50, pd= -21.1410, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 32311.28, pd= -12.8775, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.84, pd= -17.4175, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194548.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=161429.86, pd= -14.7150, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.70, pd= -19.7880, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=193637.24, pd= -12.5970, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.20, pd= -16.9545, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 12693.76, pd= -25.3505, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.04, pd= -33.5175, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=289140.80, pd= -10.3820, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.42, pd= -13.4375, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=283645.30, pd= -15.4410, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.24, pd= -20.3715, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=237717.38, pd= -2.7030, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.74, pd= -3.5835, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87880.24, pd= -20.5510, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.54, pd= -26.4090, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=229967.96, pd= -16.9120, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 2.10, pd= -21.5620, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 32958.38, pd= -12.9495, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.82, pd= -17.4900, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194549.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=160873.96, pd= -14.6995, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.58, pd= -19.7730, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=193185.82, pd= -12.5760, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.82, pd= -16.9320, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 13363.82, pd= -25.2860, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.10, pd= -33.4525, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=288729.02, pd= -10.4250, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.54, pd= -13.4810, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=283192.06, pd= -15.4465, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.46, pd= -20.3775, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=238148.94, pd= -2.6825, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.74, pd= -3.5635, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87890.42, pd= -20.5405, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.60, pd= -26.3990, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=230592.14, pd= -16.8310, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 2.74, pd= -21.4810, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 33605.58, pd= -13.1000, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.66, pd= -17.6415, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194550.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=160318.16, pd= -14.7230, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.44, pd= -19.7955, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=192734.46, pd= -12.5375, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.62, pd= -16.8945, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 14033.90, pd= -25.2345, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 4.64, pd= -33.4010, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=288317.38, pd= -10.6005, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.20, pd= -13.6555, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=282738.88, pd= -15.4115, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.32, pd= -20.3410, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=238580.54, pd= -2.6330, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.66, pd= -3.5140, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87900.72, pd= -20.5310, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.44, pd= -26.3890, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=231216.42, pd= -16.8425, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 3.06, pd= -21.4920, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 34252.72, pd= -13.1750, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.50, pd= -17.7170, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.27) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194551.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=159762.42, pd= -14.7430, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.44, pd= -19.8155, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=192283.22, pd= -12.5355, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.92, pd= -16.8925, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 14703.92, pd= -25.1115, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.14, pd= -33.2790, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=287905.74, pd= -10.7690, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.00, pd= -13.8240, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=282285.82, pd= -15.4095, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.12, pd= -20.3395, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=239012.24, pd= -2.6145, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.56, pd= -3.4955, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87911.12, pd= -20.4985, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.54, pd= -26.3560, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=231840.74, pd= -16.9120, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 3.26, pd= -21.5630, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 34899.90, pd= -13.2725, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.38, pd= -17.8155, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194552.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=159206.66, pd= -14.6815, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.20, pd= -19.7540, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=191832.08, pd= -12.5495, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.06, pd= -16.9065, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 15374.28, pd= -25.3240, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 5.14, pd= -33.4925, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=287494.04, pd= -10.8755, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 4.04, pd= -13.9315, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=281832.82, pd= -15.3675, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.42, pd= -20.2960, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=239444.00, pd= -2.5870, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 2.84, pd= -3.4695, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87921.68, pd= -20.5080, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.56, pd= -26.3660, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=232465.00, pd= -16.9155, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 2.82, pd= -21.5660, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 35547.04, pd= -13.3085, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 7.22, pd= -17.8515, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194553.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=158651.10, pd= -14.7570, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.06, pd= -19.8285, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=191381.06, pd= -12.5995, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.96, pd= -16.9560, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 16044.46, pd= -25.3510, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.26, pd= -33.5205, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=287082.40, pd= -11.0245, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 3.96, pd= -14.0805, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=281379.96, pd= -15.3710, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.66, pd= -20.3000, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=239875.84, pd= -2.5665, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.54, pd= -3.4485, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87932.34, pd= -20.4940, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.3520, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=233089.38, pd= -17.0435, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 1.94, pd= -21.6935, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 36194.30, pd= -13.4500, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.24, pd= -17.9940, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194554.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=158095.60, pd= -14.8360, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.04, pd= -19.9090, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=190930.10, pd= -12.6255, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.14, pd= -16.9830, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 16714.90, pd= -25.6345, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 4.74, pd= -33.8040, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=286670.72, pd= -11.1325, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.54, pd= -14.1885, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=280927.16, pd= -15.3440, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.84, pd= -20.2730, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=240307.74, pd= -2.5350, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.62, pd= -3.4180, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87943.10, pd= -20.4580, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.3155, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=233713.70, pd= -17.1155, lock= >937, amb=24582981.556, snr=32.00) L2 (P(Y) , r= 2.02, pd= -21.7655, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 36841.60, pd= -13.6095, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.08, pd= -18.1530, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194555.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=157540.10, pd= -14.8495, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.98, pd= -19.9215, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=190479.18, pd= -12.6060, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.54, pd= -16.9625, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 17385.30, pd= -25.8650, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 4.44, pd= -34.0340, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=286259.02, pd= -11.2075, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.20, pd= -14.2635, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=280474.46, pd= -15.3175, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.14, pd= -20.2455, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=240739.72, pd= -2.5155, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.84, pd= -3.3980, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 87953.98, pd= -20.4225, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.70, pd= -26.2800, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=234338.02, pd= -17.1875, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 2.14, pd= -21.8375, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 37488.84, pd= -13.6970, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 7.08, pd= -18.2415, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194556.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=156984.60, pd= -14.8005, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.18, pd= -19.8735, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=190028.42, pd= -12.6675, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.66, pd= -17.0245, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 18055.64, pd= -26.0300, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 4.92, pd= -34.1995, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=285847.18, pd= -11.1320, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.38, pd= -14.1870, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=280021.86, pd= -15.2965, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.56, pd= -20.2245, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=241171.76, pd= -2.4830, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.90, pd= -3.3635, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87964.96, pd= -20.3690, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.82, pd= -26.2290, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=234962.18, pd= -17.1040, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 2.16, pd= -21.7535, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 38136.14, pd= -13.8210, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.84, pd= -18.3645, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194557.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=156429.28, pd= -14.8725, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.04, pd= -19.9450, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=189577.70, pd= -12.6830, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.98, pd= -17.0400, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 18726.08, pd= -26.2900, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 4.72, pd= -34.4600, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=285435.30, pd= -11.0150, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.32, pd= -14.0700, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=279569.32, pd= -15.2420, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.58, pd= -20.1705, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=241603.82, pd= -2.4050, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.42, pd= -3.2860, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87976.06, pd= -20.3110, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.80, pd= -26.1695, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=235586.52, pd= -17.1935, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 2.22, pd= -21.8445, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 38783.52, pd= -14.0105, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.54, pd= -18.5545, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194558.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=155874.00, pd= -14.9200, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.24, pd= -19.9920, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=189127.12, pd= -12.7515, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.16, pd= -17.1090, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 19396.40, pd= -26.4250, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 4.30, pd= -34.5945, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=285023.50, pd= -10.9645, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.66, pd= -14.0190, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=279116.90, pd= -15.2110, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.58, pd= -20.1390, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=242035.98, pd= -2.3525, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.14, pd= -3.2335, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87987.26, pd= -20.2325, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.82, pd= -26.0915, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=236210.86, pd= -17.2930, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 2.64, pd= -21.9435, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 39430.84, pd= -14.1215, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.46, pd= -18.6660, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194559.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=155318.74, pd= -14.9265, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.48, pd= -19.9970, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=188676.58, pd= -12.7780, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.54, pd= -17.1355, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 20066.72, pd= -26.5495, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 4.18, pd= -34.7180, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=284611.74, pd= -10.9475, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.36, pd= -14.0015, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=278664.64, pd= -15.2425, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.04, pd= -20.1705, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=242468.22, pd= -2.3075, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.94, pd= -3.1880, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 87998.58, pd= -20.1560, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.92, pd= -26.0150, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=236835.28, pd= -17.4770, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 2.72, pd= -22.1285, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 40078.08, pd= -14.1355, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.22, pd= -18.6805, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194560.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=154763.50, pd= -14.8925, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.60, pd= -19.9635, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=188226.14, pd= -12.8255, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.50, pd= -17.1830, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 20737.20, pd= -26.8275, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 3.78, pd= -34.9965, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=284199.78, pd= -10.7260, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.72, pd= -13.7800, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=278212.46, pd= -15.2650, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.20, pd= -20.1930, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=242900.52, pd= -2.2545, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.18, pd= -3.1350, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88010.04, pd= -20.0970, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.98, pd= -25.9560, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=237459.64, pd= -17.5970, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 2.84, pd= -22.2490, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 40725.30, pd= -14.1120, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.14, pd= -18.6565, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.27) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.27) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.27) Type 1004: ID=700, TOW=194561.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=154208.42, pd= -14.9530, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.58, pd= -20.0235, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=187775.72, pd= -12.8030, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.66, pd= -17.1595, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 21407.74, pd= -27.1585, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 3.20, pd= -35.3270, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=283787.98, pd= -10.6495, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.86, pd= -13.7030, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=277760.32, pd= -15.2255, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.02, pd= -20.1530, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=243332.92, pd= -2.2295, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.50, pd= -3.1105, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88021.64, pd= -20.0570, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.02, pd= -25.9165, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=238084.08, pd= -17.8005, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 2.64, pd= -22.4520, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 41372.64, pd= -14.1870, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.12, pd= -18.7315, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194562.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=153653.42, pd= -15.0335, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.72, pd= -20.1040, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=187325.40, pd= -12.7955, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.54, pd= -17.1520, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 22078.26, pd= -27.4640, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 3.34, pd= -35.6330, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=283376.30, pd= -10.6855, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.20, pd= -13.7380, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=277308.28, pd= -15.1935, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.14, pd= -20.1215, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=243765.42, pd= -2.2370, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.44, pd= -3.1190, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88033.38, pd= -20.0350, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.02, pd= -25.8945, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=238708.64, pd= -18.1265, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 2.96, pd= -22.7790, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 42020.00, pd= -14.2675, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.98, pd= -18.8125, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194563.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=153098.34, pd= -14.9705, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.90, pd= -20.0405, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=186875.14, pd= -12.7710, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.42, pd= -17.1290, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 22748.76, pd= -27.7465, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.82, pd= -35.9165, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=282964.44, pd= -10.5380, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.46, pd= -13.5905, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=276856.34, pd= -15.1705, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.06, pd= -20.0975, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=244197.96, pd= -2.2130, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.38, pd= -3.0940, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88045.24, pd= -20.0135, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.06, pd= -25.8725, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=239332.78, pd= -18.0330, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 2.44, pd= -22.6855, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 42667.36, pd= -14.3245, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.10, pd= -18.8695, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194564.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=152543.36, pd= -14.9480, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.80, pd= -20.0190, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=186424.96, pd= -12.7385, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.58, pd= -17.0960, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 23419.28, pd= -28.0375, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.76, pd= -36.2075, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=282552.60, pd= -10.4015, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.56, pd= -13.4545, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=276404.50, pd= -15.1510, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.34, pd= -20.0780, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=244630.54, pd= -2.1545, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.54, pd= -3.0355, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88057.22, pd= -19.9925, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.22, pd= -25.8515, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=239957.04, pd= -18.0690, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 3.20, pd= -22.7220, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 43314.64, pd= -14.2885, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.00, pd= -18.8335, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194565.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=151988.36, pd= -14.8435, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.90, pd= -19.9140, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=185974.82, pd= -12.6655, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.74, pd= -17.0225, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 24089.78, pd= -28.3015, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.06, pd= -36.4700, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=282140.78, pd= -10.2720, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.82, pd= -13.3240, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=275952.78, pd= -15.1565, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.16, pd= -20.0830, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=245063.14, pd= -2.0530, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.72, pd= -2.9355, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88069.32, pd= -19.9690, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.34, pd= -25.8280, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=240581.02, pd= -17.8290, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 3.92, pd= -22.4830, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 43961.92, pd= -14.2350, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 6.00, pd= -18.7805, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194566.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=151433.50, pd= -14.8150, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.64, pd= -19.8850, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=185524.80, pd= -12.6235, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.98, pd= -16.9800, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 24760.10, pd= -28.3765, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.32, pd= -36.5450, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=281729.12, pd= -10.3020, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.70, pd= -13.3545, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=275501.14, pd= -15.1445, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.20, pd= -20.0695, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=245495.92, pd= -2.0540, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.70, pd= -2.9350, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88081.60, pd= -20.0045, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.14, pd= -25.8640, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=241205.14, pd= -17.7335, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 4.40, pd= -22.3895, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 44609.34, pd= -14.2975, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.84, pd= -18.8425, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194567.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=150878.66, pd= -14.7475, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.82, pd= -19.8180, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=185074.86, pd= -12.5800, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.62, pd= -16.9365, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 25430.44, pd= -28.4655, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.12, pd= -36.6335, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=281317.34, pd= -10.2000, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.78, pd= -13.2530, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=275049.64, pd= -15.1800, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.58, pd= -20.1070, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=245928.74, pd= -2.0290, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.80, pd= -2.9100, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88093.98, pd= -20.0200, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.94, pd= -25.8790, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=241829.38, pd= -17.7530, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.56, pd= -22.4095, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 45256.78, pd= -14.3675, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 5.54, pd= -18.9130, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194568.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=150323.96, pd= -14.7545, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.40, pd= -19.8250, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=184625.02, pd= -12.5530, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.08, pd= -16.9095, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 26100.64, pd= -28.4075, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.20, pd= -36.5770, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=280905.74, pd= -10.2665, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.76, pd= -13.3180, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=274598.18, pd= -15.1565, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.46, pd= -20.0830, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=246361.66, pd= -2.0340, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.72, pd= -2.9160, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88106.56, pd= -20.1130, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.94, pd= -25.9715, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=242453.70, pd= -17.8650, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.12, pd= -22.5205, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 45904.20, pd= -14.3960, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.34, pd= -18.9415, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194569.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=149769.22, pd= -14.6635, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.36, pd= -19.7340, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=184175.30, pd= -12.5645, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.80, pd= -16.9210, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 26770.92, pd= -28.4215, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.18, pd= -36.5900, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=280494.02, pd= -10.2120, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.70, pd= -13.2635, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=274146.80, pd= -15.1195, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.20, pd= -20.0460, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=246794.68, pd= -2.0700, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.44, pd= -2.9510, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88119.24, pd= -20.1885, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.94, pd= -26.0460, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=243077.86, pd= -17.8025, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 4.54, pd= -22.4585, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 46551.66, pd= -14.4525, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.50, pd= -18.9985, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194570.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=149214.54, pd= -14.5665, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.12, pd= -19.6365, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=183725.62, pd= -12.5320, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.86, pd= -16.8885, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 27441.04, pd= -28.2715, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.30, pd= -36.4415, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=280082.38, pd= -10.2210, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 4.70, pd= -13.2715, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=273695.56, pd= -15.1235, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.36, pd= -20.0490, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=247227.68, pd= -2.0100, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.46, pd= -2.8915, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88131.98, pd= -20.2000, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.02, pd= -26.0570, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=243701.88, pd= -17.6170, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 4.50, pd= -22.2740, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 47199.16, pd= -14.5270, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.68, pd= -19.0725, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.28) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194571.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=148659.98, pd= -14.5315, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.00, pd= -19.6010, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=183276.06, pd= -12.5355, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.58, pd= -16.8920, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 28111.32, pd= -28.2710, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.74, pd= -36.4405, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=279670.76, pd= -10.2455, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.58, pd= -13.2955, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=273244.40, pd= -15.1175, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.34, pd= -20.0430, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=247660.84, pd= -2.0435, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.40, pd= -2.9250, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88144.86, pd= -20.2325, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.98, pd= -26.0895, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=244326.24, pd= -17.7700, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 4.82, pd= -22.4275, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 47846.68, pd= -14.6005, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.52, pd= -19.1455, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194572.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=148105.38, pd= -14.3915, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.04, pd= -19.4610, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=182826.62, pd= -12.5735, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.90, pd= -16.9310, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 28781.62, pd= -28.2865, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.96, pd= -36.4560, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=279259.14, pd= -10.2645, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.36, pd= -13.3145, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=272793.30, pd= -15.0755, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.24, pd= -20.0010, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=248094.08, pd= -2.0840, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.76, pd= -2.9655, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88157.82, pd= -20.2270, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.02, pd= -26.0850, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=244950.36, pd= -17.6805, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 4.86, pd= -22.3395, lock= >937, snr=17.00) SV= 3, L1 (C/A , r= 48494.22, pd= -14.6805, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.44, pd= -19.2255, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194573.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=147550.88, pd= -14.2890, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.94, pd= -19.3585, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=182377.20, pd= -12.5470, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.82, pd= -16.9030, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 29451.98, pd= -28.3560, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 3.16, pd= -36.5260, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=278847.54, pd= -10.2935, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.64, pd= -13.3440, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=272342.34, pd= -15.0745, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.34, pd= -20.0005, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=248527.34, pd= -2.0725, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.58, pd= -2.9530, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88170.90, pd= -20.2180, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.90, pd= -26.0760, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=245574.34, pd= -17.4615, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 4.78, pd= -22.1195, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 49141.78, pd= -14.7620, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.42, pd= -19.3075, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194574.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=146996.48, pd= -14.2275, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.88, pd= -19.2960, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=181927.86, pd= -12.5200, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.98, pd= -16.8760, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 30122.26, pd= -28.3370, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 3.06, pd= -36.5075, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=278436.10, pd= -10.4705, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.50, pd= -13.5200, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=271891.46, pd= -15.0630, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.90, pd= -19.9900, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=248960.72, pd= -2.1160, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.26, pd= -2.9970, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88184.14, pd= -20.2470, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.92, pd= -26.1055, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=246198.46, pd= -17.3875, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 5.16, pd= -22.0470, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 49789.28, pd= -14.7695, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.48, pd= -19.3150, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194575.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=146442.14, pd= -14.1590, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.08, pd= -19.2275, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=181478.66, pd= -12.5485, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.90, pd= -16.9050, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 30792.62, pd= -28.3975, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.36, pd= -36.5675, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=278024.60, pd= -10.5855, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.48, pd= -13.6360, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=271440.66, pd= -15.0340, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.88, pd= -19.9615, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=249394.14, pd= -2.1295, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.30, pd= -3.0115, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88197.50, pd= -20.2745, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.88, pd= -26.1325, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=246822.38, pd= -17.1125, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 5.62, pd= -21.7735, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 50436.90, pd= -14.8750, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.58, pd= -19.4205, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194576.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=145887.90, pd= -14.1290, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.24, pd= -19.1975, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=181029.48, pd= -12.5140, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.94, pd= -16.8705, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 31462.94, pd= -28.4015, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 1.94, pd= -36.5705, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=277613.12, pd= -10.7115, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 4.44, pd= -13.7610, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=270989.96, pd= -15.0095, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.08, pd= -19.9360, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=249827.64, pd= -2.1510, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.26, pd= -3.0330, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88210.96, pd= -20.2810, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.94, pd= -26.1395, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=247446.44, pd= -16.9765, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 5.54, pd= -21.6390, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 51084.42, pd= -14.8660, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.60, pd= -19.4125, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194577.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=145333.68, pd= -14.0605, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.32, pd= -19.1290, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=180580.38, pd= -12.4720, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.86, pd= -16.8275, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 32133.20, pd= -28.3440, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 2.60, pd= -36.5140, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=277201.60, pd= -10.7870, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.28, pd= -13.8365, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=270539.34, pd= -14.9705, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.12, pd= -19.8960, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=250261.20, pd= -2.1590, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.24, pd= -3.0405, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88224.52, pd= -20.2660, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.88, pd= -26.1240, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=248070.32, pd= -16.6710, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 5.98, pd= -21.3335, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 51732.00, pd= -14.9000, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.40, pd= -19.4465, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.28) Type 1004: ID=700, TOW=194578.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=144779.56, pd= -14.0275, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.40, pd= -19.0960, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=180131.38, pd= -12.4485, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.94, pd= -16.8055, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 32803.52, pd= -28.3370, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.50, pd= -36.5070, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=276790.00, pd= -10.7805, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.42, pd= -13.8310, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=270088.80, pd= -14.9170, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.84, pd= -19.8435, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=250694.82, pd= -2.1590, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.36, pd= -3.0410, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88238.22, pd= -20.2710, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.92, pd= -26.1290, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=248694.48, pd= -16.6440, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 6.04, pd= -21.3080, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 52379.66, pd= -14.9970, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.32, pd= -19.5440, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194579.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=144225.54, pd= -14.0330, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.10, pd= -19.1015, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=179682.48, pd= -12.4385, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.70, pd= -16.7945, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 33473.76, pd= -28.2485, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.70, pd= -36.4185, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=276378.50, pd= -10.8625, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.28, pd= -13.9125, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=269638.32, pd= -14.8315, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.32, pd= -19.7570, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=251128.50, pd= -2.1485, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.12, pd= -3.0300, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88252.02, pd= -20.2550, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.92, pd= -26.1135, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=249318.32, pd= -16.3015, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 6.22, pd= -20.9660, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 53027.22, pd= -14.9715, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.40, pd= -19.5185, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194580.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=143671.56, pd= -14.0145, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.22, pd= -19.0835, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=179233.66, pd= -12.4275, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.10, pd= -16.7845, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 34143.96, pd= -28.1085, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 2.94, pd= -36.2790, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=275966.96, pd= -10.8985, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.96, pd= -13.9485, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=269188.00, pd= -14.8070, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.12, pd= -19.7325, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=251562.24, pd= -2.1270, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.26, pd= -3.0085, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88265.96, pd= -20.2590, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.88, pd= -26.1180, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=249942.18, pd= -15.9725, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 5.76, pd= -20.6365, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 53674.82, pd= -14.9720, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.40, pd= -19.5195, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.29) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194581.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=143117.62, pd= -13.9740, lock= >937, amb=22184641.892, snr=43.00) L2 (P(Y) , r= 8.28, pd= -19.0425, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=178784.96, pd= -12.4505, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 6.02, pd= -16.8070, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 34814.16, pd= -27.9665, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 3.16, pd= -36.1380, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=275555.38, pd= -10.8845, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.78, pd= -13.9335, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=268737.72, pd= -14.7275, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.10, pd= -19.6530, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=251996.10, pd= -2.1600, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.42, pd= -3.0425, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88279.98, pd= -20.2215, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.80, pd= -26.0800, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=250566.22, pd= -15.8355, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 5.64, pd= -20.5005, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 54322.62, pd= -15.1540, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.20, pd= -19.7015, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194582.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=142563.68, pd= -13.8715, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.44, pd= -18.9410, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=178336.34, pd= -12.4755, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.94, pd= -16.8320, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 35484.26, pd= -27.7165, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 3.90, pd= -35.8875, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=275143.74, pd= -10.8040, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.94, pd= -13.8530, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=268287.56, pd= -14.6705, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.32, pd= -19.5960, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=252429.92, pd= -2.0800, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.26, pd= -2.9615, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88294.18, pd= -20.2425, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.92, pd= -26.1015, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=251190.88, pd= -16.3185, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 4.70, pd= -20.9830, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 54970.26, pd= -15.1575, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.22, pd= -19.7055, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194583.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=142009.96, pd= -13.9305, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.32, pd= -18.9995, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=177887.80, pd= -12.4905, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 6.02, pd= -16.8460, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 36154.40, pd= -27.4975, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 3.80, pd= -35.6685, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=274732.14, pd= -10.7580, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.98, pd= -13.8065, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=267837.50, pd= -14.6220, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.36, pd= -19.5465, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=252863.90, pd= -2.0890, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.42, pd= -2.9710, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88308.48, pd= -20.2425, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.88, pd= -26.1010, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=251815.26, pd= -16.5145, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 4.62, pd= -21.1800, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 55617.92, pd= -15.1650, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.06, pd= -19.7125, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194584.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=141456.22, pd= -13.9010, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.24, pd= -18.9700, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=177439.32, pd= -12.4830, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.82, pd= -16.8385, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 36824.50, pd= -27.2345, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 4.22, pd= -35.4070, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=274320.54, pd= -10.6985, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 3.98, pd= -13.7460, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=267387.58, pd= -14.6160, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.34, pd= -19.5395, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=253297.92, pd= -2.0695, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.36, pd= -2.9515, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88322.90, pd= -20.2400, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 5.00, pd= -26.0995, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=252439.20, pd= -16.2900, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 4.68, pd= -20.9565, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 56265.54, pd= -15.1105, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.12, pd= -19.6575, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194585.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=140902.56, pd= -13.8930, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.32, pd= -18.9615, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=176990.90, pd= -12.4495, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.88, pd= -16.8050, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 37494.54, pd= -26.9040, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 4.80, pd= -35.0770, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=273909.04, pd= -10.7295, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.04, pd= -13.7765, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=266937.76, pd= -14.6145, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.46, pd= -19.5385, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=253732.04, pd= -2.0765, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.14, pd= -2.9585, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88337.46, pd= -20.2575, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.84, pd= -26.1165, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=253063.26, pd= -16.1780, lock= >937, amb=24582981.556, snr=33.00) L2 (P(Y) , r= 4.92, pd= -20.8450, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 56913.24, pd= -15.1185, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.00, pd= -19.6655, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194586.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=140348.98, pd= -13.8960, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.30, pd= -18.9640, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=176542.60, pd= -12.4540, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.92, pd= -16.8100, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 38164.62, pd= -26.6075, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 4.88, pd= -34.7805, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=273497.52, pd= -10.7365, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.88, pd= -13.7830, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=266488.00, pd= -14.5770, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.64, pd= -19.5020, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=254166.22, pd= -2.0730, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.10, pd= -2.9550, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88352.14, pd= -20.2780, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.74, pd= -26.1370, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=253686.84, pd= -15.6005, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 5.36, pd= -20.2685, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 57560.80, pd= -14.9730, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.02, pd= -19.5200, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194587.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=139795.36, pd= -13.8040, lock= >937, amb=22184641.892, snr=43.00) L2 (P(Y) , r= 8.56, pd= -18.8720, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=176094.38, pd= -12.4520, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.94, pd= -16.8085, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 38834.82, pd= -26.4290, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 5.16, pd= -34.6025, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=273086.06, pd= -10.7965, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.82, pd= -13.8420, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=266038.38, pd= -14.5890, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.48, pd= -19.5145, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=254600.46, pd= -2.0650, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.36, pd= -2.9465, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88366.94, pd= -20.2945, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.74, pd= -26.1530, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=254310.78, pd= -15.3765, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 5.08, pd= -20.0455, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 58208.48, pd= -14.9275, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.28, pd= -19.4745, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194588.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=139241.88, pd= -13.7855, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.70, pd= -18.8540, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=175646.26, pd= -12.4680, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.98, pd= -16.8255, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 39505.00, pd= -26.2130, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 5.28, pd= -34.3860, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=272674.56, pd= -10.8050, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.96, pd= -13.8500, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=265588.88, pd= -14.6200, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.06, pd= -19.5460, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=255034.82, pd= -2.1045, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.36, pd= -2.9860, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88381.86, pd= -20.3110, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.96, pd= -26.1705, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=254934.76, pd= -15.1990, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 5.80, pd= -19.8690, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 58856.22, pd= -14.9270, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.48, pd= -19.4735, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194589.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=138688.48, pd= -13.7845, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.66, pd= -18.8525, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=175198.22, pd= -12.4780, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.78, pd= -16.8335, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 40175.26, pd= -26.0775, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 6.02, pd= -34.2510, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=272263.10, pd= -10.8490, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 3.98, pd= -13.8940, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=265139.50, pd= -14.6760, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.92, pd= -19.6000, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=255469.22, pd= -2.1145, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.66, pd= -2.9955, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88396.92, pd= -20.3455, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.74, pd= -26.2045, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=255558.60, pd= -14.8730, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 6.34, pd= -19.5425, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 59504.00, pd= -14.9445, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.16, pd= -19.4915, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194590.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=138135.22, pd= -13.8660, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.54, pd= -18.9350, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=174750.30, pd= -12.5250, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.80, pd= -16.8810, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 40845.52, pd= -25.9375, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 6.22, pd= -34.1115, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=271851.68, pd= -10.9185, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.00, pd= -13.9630, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=264690.18, pd= -14.6980, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.02, pd= -19.6220, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=255903.68, pd= -2.1145, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.88, pd= -2.9950, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88412.10, pd= -20.3820, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.70, pd= -26.2415, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=256182.54, pd= -14.6635, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 7.36, pd= -19.3340, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 60151.72, pd= -14.8875, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.32, pd= -19.4350, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.29) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194591.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=137582.00, pd= -13.9215, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.60, pd= -18.9900, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=174302.44, pd= -12.5505, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.74, pd= -16.9075, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 41515.78, pd= -25.7870, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 6.44, pd= -33.9600, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=271440.26, pd= -10.9865, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.20, pd= -14.0315, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=264241.00, pd= -14.7675, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.96, pd= -19.6920, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=256338.18, pd= -2.0850, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.82, pd= -2.9665, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88427.40, pd= -20.4140, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.2735, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=256806.58, pd= -14.5525, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 7.38, pd= -19.2230, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 60799.54, pd= -14.9145, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.30, pd= -19.4625, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194592.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=137028.90, pd= -14.0330, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.74, pd= -19.1010, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=173854.68, pd= -12.5890, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.72, pd= -16.9465, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 42186.06, pd= -25.6485, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.34, pd= -33.8210, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=271028.82, pd= -11.0255, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.30, pd= -14.0705, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=263791.88, pd= -14.7985, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.08, pd= -19.7230, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=256772.80, pd= -2.1055, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.72, pd= -2.9875, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88442.80, pd= -20.4275, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.78, pd= -26.2880, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=257430.74, pd= -14.5700, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 7.04, pd= -19.2415, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 61447.36, pd= -14.9215, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.32, pd= -19.4695, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.29) Type 1004: ID=700, TOW=194593.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=136475.86, pd= -14.1415, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.58, pd= -19.2095, lock= >937, snr=28.00) SV= 8, L1 (C/A , r=173406.94, pd= -12.5645, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.60, pd= -16.9215, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 42856.46, pd= -25.6285, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.40, pd= -33.8010, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=270617.28, pd= -10.9550, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.22, pd= -14.0000, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=263342.80, pd= -14.7730, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.16, pd= -19.6970, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=257207.42, pd= -2.0570, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.54, pd= -2.9400, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88458.30, pd= -20.4160, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.72, pd= -26.2760, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=258054.98, pd= -14.6640, lock= >937, amb=24582981.556, snr=36.00) L2 (P(Y) , r= 6.28, pd= -19.3365, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 62095.02, pd= -14.7500, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.36, pd= -19.2980, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194594.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=135922.80, pd= -14.1670, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.78, pd= -19.2355, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=172959.28, pd= -12.5340, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.68, pd= -16.8905, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 43526.88, pd= -25.6225, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.44, pd= -33.7960, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=270205.76, pd= -10.8970, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.26, pd= -13.9420, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=262893.80, pd= -14.7320, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.34, pd= -19.6560, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=257642.14, pd= -2.0360, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.48, pd= -2.9190, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88473.96, pd= -20.4450, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.64, pd= -26.3050, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=258678.94, pd= -14.4780, lock= >937, amb=24582981.556, snr=34.00) L2 (P(Y) , r= 6.10, pd= -19.1505, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 62742.86, pd= -14.7415, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.34, pd= -19.2900, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194595.000, More Data=No, GPS-Sats= 9, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=135369.76, pd= -14.1560, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.70, pd= -19.2240, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=172511.74, pd= -12.5400, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.64, pd= -16.8965, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 44197.30, pd= -25.6100, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 6.36, pd= -33.7840, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=269794.22, pd= -10.8060, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.66, pd= -13.8505, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=262444.98, pd= -14.7765, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.22, pd= -19.7010, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=258076.96, pd= -2.0455, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.56, pd= -2.9280, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88489.74, pd= -20.4745, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.62, pd= -26.3350, lock= >937, snr=45.00) SV= 6, L1 (C/A , r=259303.02, pd= -14.4190, lock= >937, amb=24582981.556, snr=35.00) L2 (P(Y) , r= 6.26, pd= -19.0920, lock= >937, snr=17.75) SV= 3, L1 (C/A , r= 63390.72, pd= -14.7355, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.50, pd= -19.2840, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194596.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=134816.72, pd= -14.0760, lock= >937, amb=22184641.892, snr=43.00) L2 (P(Y) , r= 8.66, pd= -19.1435, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=172064.28, pd= -12.5390, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.60, pd= -16.8945, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 44867.52, pd= -25.3855, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.70, pd= -33.5595, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=269382.42, pd= -10.4510, lock= >937, amb=23084019.266, snr=41.00) L2 (P(Y) , r= 5.02, pd= -13.4960, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=261996.26, pd= -14.8270, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.14, pd= -19.7505, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=258511.84, pd= -2.0480, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.98, pd= -2.9305, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88505.64, pd= -20.5030, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.58, pd= -26.3635, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 64038.62, pd= -14.7500, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.60, pd= -19.2995, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194597.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=134263.88, pd= -14.1335, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.68, pd= -19.2015, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=171616.92, pd= -12.5580, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.86, pd= -16.9150, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 45537.78, pd= -25.2015, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 7.02, pd= -33.3760, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=268970.78, pd= -10.2475, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.20, pd= -13.2930, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=261547.58, pd= -14.8205, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.42, pd= -19.7430, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=258946.78, pd= -2.0405, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.78, pd= -2.9230, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88521.66, pd= -20.5280, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.3880, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 64686.56, pd= -14.7900, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.70, pd= -19.3390, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194598.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=133711.04, pd= -14.1290, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.58, pd= -19.1960, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=171169.64, pd= -12.5705, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.82, pd= -16.9270, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 46208.32, pd= -25.2875, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 7.04, pd= -33.4615, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=268559.22, pd= -10.1140, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.46, pd= -13.1590, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=261099.02, pd= -14.8340, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.14, pd= -19.7570, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=259381.80, pd= -2.0400, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.68, pd= -2.9220, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88537.80, pd= -20.5535, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.62, pd= -26.4140, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 65334.46, pd= -14.7735, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.78, pd= -19.3235, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194599.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=133158.34, pd= -14.2040, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.40, pd= -19.2710, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=170722.42, pd= -12.5585, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.76, pd= -16.9145, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 46878.80, pd= -25.3060, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 7.00, pd= -33.4805, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=268147.66, pd= -9.9770, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.56, pd= -13.0215, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=260650.60, pd= -14.8985, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.20, pd= -19.8215, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=259816.92, pd= -2.0730, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.62, pd= -2.9560, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88554.06, pd= -20.5765, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.52, pd= -26.4365, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 65982.44, pd= -14.8175, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.72, pd= -19.3670, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194600.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=132605.66, pd= -14.2365, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 8.18, pd= -19.3040, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=170275.28, pd= -12.5390, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.42, pd= -16.8955, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 47549.38, pd= -25.4225, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.94, pd= -33.5970, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=267736.14, pd= -9.8670, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.44, pd= -12.9095, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=260202.22, pd= -14.9060, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.86, pd= -19.8285, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=260252.12, pd= -2.1140, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.70, pd= -2.9965, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88570.42, pd= -20.5805, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.62, pd= -26.4405, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 66630.48, pd= -14.9085, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.56, pd= -19.4585, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.30) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194601.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=132052.94, pd= -14.1650, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.84, pd= -19.2315, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=169828.26, pd= -12.5575, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.90, pd= -16.9145, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 48219.78, pd= -25.3515, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 7.08, pd= -33.5270, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=267324.74, pd= -9.8705, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.36, pd= -12.9135, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=259753.98, pd= -14.9565, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.38, pd= -19.8785, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=260687.40, pd= -2.1625, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.62, pd= -3.0455, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88586.90, pd= -20.5815, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.52, pd= -26.4415, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 67278.50, pd= -14.9515, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.46, pd= -19.5015, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194602.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=131500.38, pd= -14.1925, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.80, pd= -19.2590, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=169381.30, pd= -12.5520, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.72, pd= -16.9095, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 48890.22, pd= -25.3140, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 6.96, pd= -33.4890, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=266913.40, pd= -9.9225, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.26, pd= -12.9650, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=259305.78, pd= -14.9505, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.10, pd= -19.8745, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=261122.72, pd= -2.1825, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.46, pd= -3.0660, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88603.52, pd= -20.6035, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.50, pd= -26.4635, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 67926.52, pd= -14.9865, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.68, pd= -19.5375, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194603.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=130947.98, pd= -14.3140, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.64, pd= -19.3800, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=168934.40, pd= -12.5205, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.52, pd= -16.8775, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 49560.82, pd= -25.4300, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 6.40, pd= -33.6050, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=266502.14, pd= -10.0475, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.12, pd= -13.0895, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=258857.70, pd= -14.9680, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.00, pd= -19.8915, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=261558.14, pd= -2.2370, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.52, pd= -3.1210, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88620.20, pd= -20.5650, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.60, pd= -26.4255, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 68574.68, pd= -15.1425, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.62, pd= -19.6940, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194604.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=130395.58, pd= -14.3755, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.38, pd= -19.4395, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=168487.64, pd= -12.5475, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.84, pd= -16.9045, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 50231.18, pd= -25.3050, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.62, pd= -33.4805, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=266090.94, pd= -10.2280, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.02, pd= -13.2700, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=258409.70, pd= -14.9725, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.88, pd= -19.8965, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=261993.56, pd= -2.2175, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.36, pd= -3.1010, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88637.04, pd= -20.5625, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.48, pd= -26.4225, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 69222.72, pd= -15.1600, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.62, pd= -19.7115, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194605.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=129843.30, pd= -14.4945, lock= >937, amb=22184641.892, snr=44.00) L2 (P(Y) , r= 7.40, pd= -19.5590, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=168040.94, pd= -12.5450, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.72, pd= -16.9015, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 50901.66, pd= -25.2905, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.34, pd= -33.4660, lock= >937, snr=20.00) SV= 28, L1 (C/A , r=265679.74, pd= -10.3990, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.86, pd= -13.4410, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=257961.80, pd= -14.9785, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.48, pd= -19.9020, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=262429.12, pd= -2.2710, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.22, pd= -3.1545, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88653.94, pd= -20.5030, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.60, pd= -26.3640, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 69870.78, pd= -15.1850, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.54, pd= -19.7370, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194606.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=129291.06, pd= -14.5910, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.20, pd= -19.6555, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=167594.34, pd= -12.5625, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.82, pd= -16.9205, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 51571.96, pd= -25.0925, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.48, pd= -33.2695, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=265268.52, pd= -10.5435, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.48, pd= -13.5855, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=257514.02, pd= -15.0130, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.90, pd= -19.9370, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=262864.76, pd= -2.3375, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.30, pd= -3.2215, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88671.00, pd= -20.4810, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.66, pd= -26.3420, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 70518.84, pd= -15.1890, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.46, pd= -19.7415, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194607.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=128738.86, pd= -14.6610, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.26, pd= -19.7250, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=167147.82, pd= -12.5735, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.64, pd= -16.9315, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 52242.22, pd= -24.8425, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.82, pd= -33.0200, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=264857.26, pd= -10.6365, lock= >937, amb=23084019.266, snr=44.00) L2 (P(Y) , r= 4.54, pd= -13.6785, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=257066.36, pd= -15.0675, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.94, pd= -19.9915, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=263300.42, pd= -2.3495, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.36, pd= -3.2330, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88688.16, pd= -20.4340, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.2945, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 71167.00, pd= -15.2725, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.34, pd= -19.8255, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194608.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=128186.80, pd= -14.8090, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 7.12, pd= -19.8730, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=166701.36, pd= -12.5620, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.54, pd= -16.9205, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 52912.70, pd= -24.8080, lock= >937, amb=23983396.640, snr=40.00) L2 (P(Y) , r= 6.62, pd= -32.9845, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=264445.98, pd= -10.7040, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.62, pd= -13.7465, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=256618.80, pd= -15.1280, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.68, pd= -20.0520, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=263736.18, pd= -2.3925, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.22, pd= -3.2755, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88705.50, pd= -20.4485, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.3095, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 71815.08, pd= -15.2625, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 5.28, pd= -19.8155, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194609.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=127634.88, pd= -15.0375, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.88, pd= -20.1020, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=166255.02, pd= -12.5860, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.60, pd= -16.9440, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 53583.18, pd= -24.7725, lock= >937, amb=23983396.640, snr=41.00) L2 (P(Y) , r= 6.72, pd= -32.9500, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=264034.72, pd= -10.7790, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.54, pd= -13.8210, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=256171.34, pd= -15.1965, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.66, pd= -20.1205, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=264172.00, pd= -2.4310, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.00, pd= -3.3140, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88722.88, pd= -20.3835, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.78, pd= -26.2440, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 72463.12, pd= -15.1935, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 5.14, pd= -19.7460, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194610.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=127082.98, pd= -15.2205, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.60, pd= -20.2850, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=165808.78, pd= -12.6265, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.76, pd= -16.9855, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 54253.64, pd= -24.7045, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 6.44, pd= -32.8820, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=263623.40, pd= -10.7855, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.42, pd= -13.8275, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=255723.98, pd= -15.2620, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.94, pd= -20.1850, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=264607.84, pd= -2.4135, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.40, pd= -3.2965, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88740.42, pd= -20.3565, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.72, pd= -26.2180, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 73111.26, pd= -15.2070, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.96, pd= -19.7590, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1006: ID= 700, Year=5, GPS=Y, GLONASS=N, Galileo=N, X= 1112189.9000, Y= -4842955.0001, Z= 3985352.2000 QC=0(unspecified), height=0.0000 RTCM3 (2011-04-10T22:38:51.30) Type 1008: ID= 700, Antenna='AOAD/M_T', Setup ID= 1, Serial='309' RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194611.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=126531.06, pd= -15.3185, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.64, pd= -20.3825, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=165362.60, pd= -12.6425, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.70, pd= -17.0010, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 54924.14, pd= -24.6755, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.72, pd= -32.8540, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=263212.14, pd= -10.8480, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.42, pd= -13.8895, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=255276.72, pd= -15.3360, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 4.86, pd= -20.2600, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=265043.84, pd= -2.4925, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 3.08, pd= -3.3750, lock= >937, snr=40.00) SV= 7, L1 (C/A , r= 88758.06, pd= -20.3085, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.78, pd= -26.1695, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 73759.36, pd= -15.1645, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.74, pd= -19.7160, lock= >937, snr=26.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194612.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=125979.16, pd= -15.3775, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.78, pd= -20.4415, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=164916.50, pd= -12.6500, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 5.54, pd= -17.0085, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 55594.80, pd= -24.7990, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.26, pd= -32.9770, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=262800.92, pd= -10.9450, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.58, pd= -13.9865, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=254829.52, pd= -15.3745, lock= >937, amb=20985472.060, snr=50.00) L2 (P(Y) , r= 4.84, pd= -20.2995, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=265479.86, pd= -2.5195, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.90, pd= -3.4030, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88775.86, pd= -20.2970, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.76, pd= -26.1575, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 74407.54, pd= -15.1855, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.68, pd= -19.7375, lock= >937, snr=25.00) RTCM3 (2011-04-10T22:38:51.30) Type 1004: ID=700, TOW=194613.000, More Data=No, GPS-Sats= 8, GPS Smoothing=No (No smoothing) SV= 24, L1 (C/A , r=125427.30, pd= -15.4100, lock= >937, amb=22184641.892, snr=45.00) L2 (P(Y) , r= 6.74, pd= -20.4735, lock= >937, snr=29.00) SV= 8, L1 (C/A , r=164470.50, pd= -12.6765, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 5.42, pd= -17.0340, lock= >937, snr=38.00) SV= 13, L1 (C/A , r= 56265.22, pd= -24.6760, lock= >937, amb=23983396.640, snr=39.00) L2 (P(Y) , r= 5.58, pd= -32.8540, lock= >937, snr=19.25) SV= 28, L1 (C/A , r=262389.62, pd= -10.9485, lock= >937, amb=23084019.266, snr=43.00) L2 (P(Y) , r= 4.58, pd= -13.9890, lock= >937, snr=26.00) SV= 11, L1 (C/A , r=254382.42, pd= -15.4155, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 4.60, pd= -20.3400, lock= >937, snr=37.00) SV= 19, L1 (C/A , r=265915.92, pd= -2.5155, lock= >937, amb=20985472.060, snr=49.00) L2 (P(Y) , r= 2.90, pd= -3.3995, lock= >937, snr=39.00) SV= 7, L1 (C/A , r= 88793.78, pd= -20.2865, lock= >937, amb=20086094.686, snr=51.00) L2 (P(Y) , r= 4.80, pd= -26.1475, lock= >937, snr=45.00) SV= 3, L1 (C/A , r= 75055.70, pd= -15.1700, lock= >937, amb=23084019.266, snr=42.00) L2 (P(Y) , r= 4.62, pd= -19.7225, lock= >937, snr=25.00) gpsd-3.15/test/rtcm3-3.log0000664000175000017500000006410012461156335013426 0ustar esresr# Name: Ntrip caster log from http://products.igs-ip.net/ # Description: RTCM3 data from an Ntrip caster # Submitted-by: Chris Kuethe # Date: 2011-03-01 # Notes: The NTRIP source table entry is: # STR;USNO0;Washington;RTCM 3.0;1004(1),1006(10),1008(10);2;GPS;IGS;USA;38.92;282.93;0;0;ASHTECH Z-XII3T;none;B;N;1300;NRCan ÿÎþ€rã°ÔÿCÌ@óó?OöƒՈŸk·ú”¢·»eÿD ˜*_òh¿Ó*Hý¿oúø¯ÞÐӕ>ÂŒ.\*aKñ¿Ò¬Xœ’¿û gÞ?4þˆ‚3ïdæ ]§Âz_ôùÄŸ 9þ à]L×é¬?§V Uüu7ö‚ÂÓï…ý؈ÿÊ&”¶ þäèØˆ¿ÎÁþ€rà°ŠÿCÌ@ñó9oöƒôþq×ú”¢ÿŒ*D ™&gò]Ó*J=œ÷úølReӕ>ÂŒ.\9 aJÁ‘ñe?Ò¬Xý«û bAϝOþˆ‚1ïgŸæ ]é%úLÇôùÄ/ îþ à\ séžÿ§V TüvÏö‚ÂÈ£¿ký'؅¿È&•ôþÝïèØˆÿÍùþ€rÝ?°vCÌ@ðó3Oöƒ ƒþlKú”‚7»yÿD š"wòB?Ó*H=º›úøÅsÓ•>ÂŒ.\I@aIæ-ñ(ŸÒ¬Vý†û \¥’þˆ‚5ïpæ ^*Œú2¯ôúß«þ àZÈéÁÿ§V V|wïö‚œXÿ5ý ØÈ&•[ßþÙoèØˆÍkþ€rڗ°JÿCÌ@îó-ÿ÷ 1ŸlSú”bW»{D ›ò<_Ó*Gý¹ãúøºZ¹Ó>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.\XàaI ¿ñ_Ò¬T=ƒ—û W Þþ‚9ïyßæ ^kòzôùÄ/äþ àY…»é»?§V V|wö‚²¿/ýߨ?È&•®ÌþÙŸèØˆ?Ímþ€rذ1ÿCÌ@êó*Ï÷ O~l/ú”¢»wD œ“ò&ÿÓ+D=·3úøŽ•`ӕ>ÂŒ.\h€aH/_ðëŸÒ¬Oý~û QmϞ(þ‚Iï‚ÿæ ^­Szôù„Ï€þ àXCk飧V W|t'ö‚ŠğIýëØ¢?È&–¹þáŸè؈ŸÎmþ€rÕׯðCÌ@éó"÷ mþþg×ú”¢gºìD ¡ò _Ó*Dý¶cúøÑ;pӕ>ÂŒ.\x aGSýðÕÒ¬R={¯û KÒžþ‚Gï~_æ ^î²ú ÷ôù„Oñþ àWé™§V Xürïö‚›{OýëØÂ¿È&–T­þá¿è؈Îuþ€rÓ·¯ÙÿCÌ@ïó¿÷ Œ~~cú”‡ºTÿD ž³ò?Ó*@œŽÛúø‹|Öӕ>ÂŒ.\‡ÀaFx›ðÎÿÒ¬Oýzëû F7_žþˆ‚Yï~Ÿæ _0úôù„?þ àUŸ·é²?§T Wüvö‚2ŸEýØÁ¿È&–§€þãßèØˆηþ€rÑ·¯ìCÌ@âó"÷ ªû~dÛú”‚ºŒÿD ŸÇòÿÓ*A}³súøÌè1ӕ>ÂŒ.\—`aEKð©ÿÒ¬QývKû @œßþˆ‚7ïyÿæ _qkúÇôù„oˆþ àT|Géõ?§V \|~oö‚„ê¹ýØÏÿÈ&–ú›þîèØˆßÏýþ€rÏß°ÿCÌ@ðó&÷ É{~^Ûú”¢¿¹ÍD   ×ò Ó*?ý³»úø+jŽÓ•>ÂŒ.\§aDÁûð•?Ò¬P=s³û ;™þ‚7ïqæ _²Æz§ôùÄÏ¥þ àS9çê¿§V ]|‚Çö‚Ây£Åý§ØÑ¿È&—M˜þóèØˆÿПþ€rÎ_¯ÐCÌ@ðó÷ çùŸ]Wú”¢¹œÿD ¡õñïßÓ*?=°Kúø&‡gӕ>ÂŒ.\¶ aCæ­ð‰ÿÒ¬LœrOû 5g¿|þ‚CïmŸæ _ô'zGôùÄÿ¶þ àQ÷{êX¿§V ]üŠçö‚Ân\iýËØÆ¿È&— –þþ/èØˆ?Òþ€rÌÿ¯»ÿCÌ@êóÿ÷!y~WÛú”‚çžíÿD ¢ ñìÿÓ*?œ¯çúøi‚Óӕ>ÂŒ.\Æ@aC gðxÿÒ¬Jœp3û /Íϝþ‚/ï`æ `5ˆz ·ôùDÏåþ àPµê ¿§V cü“÷ö‚Âc_Aý£ØÂÈ&—ó˜ÿïèØˆßÓ]þ€rËׯ“CÌ@ßóÿ÷!$öŸXëú”¢O¹D ¢ÿ!ñïßÓ*<}°KúøÂ·þӕ>ÂŒ.\ÕàaB0/ðT_Ò­K}kŸû *4/œˆþ‚EïO?æ `vçú ôùď þ àOr§êá?§V f|œö‚ÂWÐßùý ØžÿÈ&˜FÿŸè؈ÿÔÏþ€rÊ߯iCÌ@Ýó¯÷!Cu~U¿ú”¢ÇžªÿD £û9ññ_Ó*;=°wúø AºÓ•>ÂŒ.\倐aATóðHÿÒ¬Iýj7û¡ $š¿œ"þ‚%ïBŸæ `žGúÏôù„Hþ àN0Cëÿ§V n|£‡ö‚ÂL‹ÙýØÕÈ&˜™šÿŸè؈¿Õþ€rʯUÿCÌ@âó?÷!aô~Rú”¢Wž6ÿD €÷Qñ÷ŸÓ*:}±;úøÛÓ>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.\õ a@y»ð@ÿÒ­K}i7û¡ ›éþ‚!ï;_æ `ù¬ùøÏôùÄNÿiþ àLíÇë•§T r|²—ö‚ÂAF¿¡ýÓØîÈ&˜ìžÿÏèØˆŸÕÙþ€rÉw¯-ÿCÌ@éó O÷!€qþRú”Â_ž7D ¥óoñôÓ*7ý°ÃúøŸ}jӕ>ÂŒ.]Àa?žð,Ò­M=f¯û¡ ho›ãþ‚/ï:Ÿæ a; ùöïôù„Îÿ*þ àK«Sëÿ§T ||¿çö‚Â6¿ñýØø?È&™?ÏÿèØˆŸÕ þ€rÈï¯UCÌ@åó÷!žñþKßú” —·oÿD ŠïñðÓ+6œ°CúøK‹Ó•>ÂŒ.]`a>Ãið_Ò­Lýcëû¡ ϯ›­þ‚/ï3Ÿæ a|iùýGôù„ŽÿõþšàJhÇì«ÿ§T ƒüÕö‚Â*¿?ƒýïÙ ¿È&™’ãÿ ÏèØˆŸÖQþ€rȯ¯?ÿCÌ@Þó oöƒ!œs~AÓú”¢ ¶.ÿD §ë¯ññ?Ó*6œ°kúø9uӕ>ÂŒ.]$a=èKïû_Ò­M=`‹û¡ 6ïœþ‚1ïAßæ aœÍyôôùÄþÍþšàI&Síÿ§T …|ãßö‚Â|—ýïÙ-?È&™åÿÿ _èØˆ_ÖCþprȗ¯?ÿCÐ@àó öƒ!Ûñ~@ú”¢ç¶D šçÅòÿÓ*7}ŽCúør 4ӕ>ÂŒ.]3 a= %ðÒ­Qýaƒû¡ ž¯›öþ‚5ï<ÿæ aÿ2ùæ'ôù„^ýþšàGãÓíµ¿§T ‹|ö¿ö‚Â9ßñýƒÙ8ÿÈ&š9ÿ¯è؈ÿÖ þ€rÈǯÿCÌ@àóöƒ!úp>=ú”‚µ–D ©ãßò)¿Ó*6œ·wúø^?æÓ•>ÂŒ.]C@a<2 ïöÿÒ­S=_ÿû¡ ϛzþ‚ï-_æ b@yí7ôù„nýñþšàF¡íß§T |üö‚Â÷ÿÉýŸÙS¿È&šŒAÿ ßèØˆ_ÖSþ€rÉ'®ÊÿCÌ@ßòýÏöƒ"ï>9?ú”¢—µÿG ªàò ßÓ+5=³¿úøÍ*¿Ó•>ÂŒ.]Ràa;Võïù¿Ò¬Q}`[û¡ ýo›Vþ‚ ï)æ bóùåGôùÄüòþšàE_'î¿§T }ö‚Áý¶ÿíýûÙX?È&šßhÿÿèØˆ¿Ö;þ€rɟ®ÌÿCÌ@Úòýÿ÷"7m~6Óú”Â÷ŽÌÿG «ÜAñ÷ßÓ*2œ±?úø”5öӕ>ÂŒ.]b€a:{íïãÒ­Pœ]Ÿû¡ ÷×_›¯þˆ‚!ï4?æ bÃVyà¿ôùÄÞübþšàDÓîMÿ§T ’ý çö‚Áòvß[ýïÙF?È&›2‘ÿ"è؈?ևþ€rÊ?®áÿCÌ@Üó¿÷"UìŸ2 ú”¢/Ž3G ¬ØiñüÿÓ+4ý±ãúø|mӕ>ÂŒ.]r a9 åïܟҬQ}\Ëû¡ ò?¿œþ‚-ïN_æ cºyÙGôùÄÞûqþšàBڛî?§V ”ýö‚Áç7_ýãÙ&¿È&›…ÀÿÏèØˆÿÖ3þ€rË®ÐÿCÌ@Ýòþo÷"tj>1Ÿú”Â_Ž&G ­Ô£ñڟÓ*2=­›úøú߀ӕ>ÂŒ.]Àa8Åßïß?Ò¬Q}]û¡ ìš_Sþ‚WïhŸæ cFùÕôùÄÎú÷þšàA˜oîÿ§T ýçö‚ÁÛøßïýÛØøÈ&›ØòÿÿèØˆŸÕ÷þ€rÌ®úCÌ@Úó¯÷"’è~/ú”¢O³äÿG ®Ðßñ·?Ó+3}©+úø{S¢Ó>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.]‘`a7êÙïð_Ò¬U}_;û¡ 珝bþˆ‚Cïj¿æ c‡ùÌ'ôù„^ùÌþšà@V3î¿§T }oö‚Áкÿ!ýØŸÈ&œ,(ÿ?èØˆß՝þprÍO®þÿCÌ@ÛóO÷"±e~0;ú”³ùG ¯ÍñµßÓ*2}šÿúøÕiXӕ>ÂŒ.]¡a7Ùð_Ò¬Výa{û¡ á{'þ‚?ïc_æ cÈåùÆ7ôù„þùþšà?ëî??§V “}'ö‚ÁÅ}_ý¯ØœÿÈ&œdÿŸè؈ԋþ€rΧ¯)ÿCÌ@âó ÷"Ïâþ/Óú”¢O³ìÿG °ÉIñ¡Ó+2=ŠwúøÓ÷ӕ>ÂŒ.]° a64Ýð?Ò­Z}dsû¡ Û保lþ‚;ïkÿæ d FyÉ?ôù„>ùpþšà=Ñ·î5¿§T “}ö‚Áº@_ýƒØ{?È&œÒ ÿ/èØˆßԟþprÐ7¯BÿCÌ@ãó ¿÷"îb>*÷ú”¢³QÿG ±Å…ñŒ¿Ó+0}£ßúøO¬bӕ>ÂŒ.]À@a5Yãð;Ò¬[œh“û¡ ÖNŸ¯þˆ‚oït?æ dKŠyÎ?ôù„úþšà<‡î&¿§V “}ö‚Á¯¿mýØg¿È&%ÞÿèØˆÕþprÑ篅CÌ@ëó÷# ß>+wú”¢ÿ³aÿG ²ÁËñcÓ+.œž¯û :Tbӕ>ÂŒ.]Ïàa4~÷ðGÿÒ¬X=j/û¡ Оߝ¥þˆ‚Wïsæ dùÍwôùÄ>ùõþšà;M[î¿§V ˜}Çö‚Á£Çgý‹Øg¿Ê&y!ÿÿèØˆÿÕ7þprÓ¿¯ÛÿCÌ@ðóß÷#+[Ÿ-[ú”¢ß³ÿG ³ŸñWÿÓ+/=Cû kz ӕ>ÂŒ.]߀a3€ ð_?Ò¬Yýmû¡ Ë#_ þ‚YïrŸæ dÎhùÓ§ôù„žúºþšà: Síš§V ‹üõgö‚Á˜‹ß?ý‹ØbÈ&ÌgÿèØˆÕþprÕϰÿCÌ@ìó(÷#IÙ>,wú”ÂW³€ÿG Žº?ñ[ßÓ*.œÃúøCÉðӕ>ÂŒ.]ï a2É)ðuÒ¬Z=oßû¡ Ŏ?Sþ‚Wïh¿æ eÌyÑgôù„Îúqþšà8É+퐿§T ˆüòoö‚ÁP¿QýØd¿È&ž­ÿ%OèØˆŸÖåþprذKÿCÌ@òó-ß÷#hU>/wú”¢³àÿG µ¶‰ñ6_Ó+,}™û ¡iӕ>ÂŒ.]þÀa1îKðŒŸÒ¬VýrËû¡ ¿ùoœáþ‚]ïZŸæ eQ.yÓ¯ôù„Þú»þšà7‡í8¿§V ‡|çoö‚Á‚ÿåý›ØwÈ&žrõÿ4Ÿè؈ߨÏþprڟ°TCÌ@ïó.ï÷#†Ó~,Ÿú”¢³…G ¶²Íñ$¿Ó+,ý–ßû ÿüœÓ•>ÂŒ.^`a1qðšßÒ¬Wýv[û¡ ºdߜrþ‚5ïLŸæ e’‘yÓçôùÄþúÃþšà6E#컿§V }ü××ö‚ÁvÛß[ýŸØ…È&žÆBÿ@èØˆÚ=þprÝO°kCÌ@ñó1¿÷#¥Q~*—ú”¢_³EG ·¯ñÓ++œ’Sû 9á—Ó•>ÂŒ.^a08™ðÏÒ¬Z={3û¡ ŽÐϛjþ‚;ï+Ÿæ eÓôyÔôùÄþúÕþšà5 ìŠÿ§V süÑÇö‚Ák¢YýØ€ÿÈ&Ÿ•ÿE¿è؈Úñþprà7°sÿCÌ@óó2ß÷#ÃΟ*ú”¢g³4G ž«_ðø¿Ó+,=‘kû ;¯Ó>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.^- a/]Éðð¿Ò¬\œ[û¡ ¯<ϚÝþ‚-ïæ fYyÐÇôúÞú^þšà3Àëìoÿ§V q|Îwö‚Á`h߉ý›ØË?È&ŸlîÿE?èØˆÿÚãþprãg°AÿCÌ@ðó,Ÿ÷#âLþ'Gú”¢²ÛÿG ¹§¡ðúÓ++ý‘—û 9ӕ>ÂŒ.^=@a.‚ûñŸÒ¬^ý„¿û¡ ©šïš©þ‚ïŸæ fVÁyÆôùÄÎùþšà2~Çìbÿ§T o|ÌÏö‚ÁU/ÿWýßÙÿÈ&ŸÀLÿAŸè؈¿Úkþ€r毰IÿCÐ@ôó-Ÿ÷$Ëþ"?ú”¢'²:ÿG º£ïðãÓ+'œŽ·û ˜íÄӕ>ÂŒ.^Làa-šCñ?Ò¬\}…3û¡ €/šœþˆ‚ïÿæ f˜%yÆWôùÄ^ùþšà1<£ì[?§V qüËçö‚ÁI÷ߣý¿Ù.¿È& ®ÿ<¯è؈ÙÍþprê7°,CÌ@öó)ï÷$J>oú”¢g±àÿG » =ðÑ_Ó+&ýŒƒû Jèӕ>ÂŒ.^\€a,͉ñ7_Ò¬]ýˆ7û¡ žÏš‹þ‚'ï¿æ fىùşôú®øúþšà/úoì~¿§T o|ÐWö‚Á>ÀýçÙKÿÈ& gÿ,Ÿè؈?×Éþ€rí÷¯ùÿCÌ@îó#Ÿ÷$=Äþ%3ú”‚÷²™ÿG Œœ‹ðÿÓ+'=ŠËû éŽ]ӕ>ÂŒ.^l a+òÙñCÿÒ¬]}‰Çû¡ ˜î¯š^þ‚ï ?æ gïùÁôúŸøvþšà.ž?ì™ÿ§V tüÓ·ö‚Á3‰_Eý3كÈ& º‚ÿ%èØˆ?Öçþ€rñ߯ÙCÌ@éóo÷$\A>&ûú”¢—²ÒG œ˜ÑðοÓ+&=Œ/û PVӕ>ÂŒ.^{Àa+%ñjÒ¬_ýŽ“û¡ “[Ϛ2þ‚GïŸæ g\VyŒïôú.÷äþšà-v'쀿§V oüПö‚Á(S_§ýóُ?È&¡ ðÿ¯è؈Õïþ€rõï¯ÒCÌ@çó¯÷$z¿>$;ú”‚ç²yÿG Ÿ•ðÐÓ+&œŒ_û WÏÙӕ>ÂŒ.^‹`a*=sñ›_Ò¬e}”³û¡ Éš^þ‚ï ?æ g¿y²‡ôúDîö—þšà,4'ì.¿§V p|Ægö‚Á¿ýûÙ«ÿÈ&¡a`ÿ¯è؈ßÕmþ€rú/¯ÉCÌ@ìó_÷$™;Ÿ%kú”¢O² G ¿‘gðÚ?Ó*$}£û Ÿ$­Ó•>ÂŒ.^›a)bÏñž?Ò¬i=˜Oû¡ ˆ6ϙìþ‚%îûßæ gß'ùªôú>õ‹þšà*òì¿§V s|¿ö‚Áèß ýÙºÿÈ&¡ŽÖÿèØˆßÔ)þ€rþ§¯®ÿCÌ@êó÷$·¹>#Ëú”‚·²kG À±ðê_Ó+'ý§û …}ӕ>ÂŒ.^ª a(ˆ7ñÅÒ¬dœ™÷û¡ ‚€¯™Îþ‚î÷ßæ h ‘yŸ?ôùÄnô-þšà)°ëŸ§V n|ž_ö‚ÁŽ_ýGÙÜÈ&¢Nÿ èØˆ¿Ókþ€r?¯¹ÿCÌ@îó÷$Ö6>#«ú”‚O²gÿM Á‰ùñßÓ*,œ’¯û „YÛӕ>ÂŒ.^º@a'­Ÿñâ¿Ò«e}Ÿû¡ }Ÿš0þÝï?æ haúù•ôúòùþšà(nëc¿§V q|¬ÿö‚Àû€_QýÚÈ&¢[ËþÿßèØˆ¿Ò7þ€r¯ÆCÌ@ìó÷$ôµ~³ú”¢g±§ÿG †EñÿÓ*+}•3û ßïÓ>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.^Éàa&Óñõ?Ò¬e=Ÿóû¡ w€ïšFþùïæ h£dùŠwôúŽñ”þšà',3êñ¿§V qüž¿ö‚ÀðM_sý7ÚÿÈ&¢¯JþùïèØˆ?Ñyþ€r ¯ªCÌ@éóo÷%1Ÿ[ú”bo±ÜÿG ñ4_Ó*.œ˜çúø2Ž€Ó•>ÂŒ.^ـa%øƒòßÒ¬h=€Cû q;þ‚ïßæ häÍy„7ôùÄ >ðÎþšà%ê?꓿§V nü’ÿö‚ÀåGý#ÚÿÈ&£Íþó?èØˆŸÐ£þ€rO¯|CÌ@ãó¿÷%1ªþ(gú”bï²ÿG Ä~ÝñKßÓ*.}›Óû ’o›Ó•>ÂŒ.^é a%ò*ÿÒ¬eýНû l^oš0þ‚!ïŸæ i&1ùˆGôúNñOþšà$šCêO§V püŠoö‚ÀÙéëý?Ùø¿È&£VRþðoèØˆÐKþ€r¯¯tÿCÌ@èó¿÷%P'~)ú”‚ÿ³G Å{-ñe_Ó+3œŸúø¡hӕ>ÂŒ.^øÀa$C‹ò/ŸÒ¬`œ§?û fÍ¿™·þ‚ îõæ ig‘y™_ôùÄ®ósþšà#fGêÿ§V q|‚‡ö‚ÀΞ‰ýsÙì?È&£©Ûþì¯è؈ÏÕþ€rG¯]CÌ@éóÏ÷%n€~(Çú”b¿³ G ÆwñY_Ó+1œúøv,­Ó•>ÂŒ._`a#iò=Ò¬aýšïû a=™Žþãîôÿæ išôù¡Gôúþôoþšà"$;éûÿ§V jü€ö‚ÀÈÿýKÙÚÈ&£ýhþç¿è؈Ï9þ€r#¯YÿCÌ@ðó÷%>0ú”Bg³òG ÇsãñlßÓ*2ýŸïúø,6ӕ>ÂŒ._a"Ž­òA¿Ò¬b=©ƒû [¬Ÿš þˆ‚îÿŸæ iêZù£ôúþô§þšà â'ê§V jü€Ÿö‚ÀžWÿ[ý3ÙåÿÈ&€PúþßèØˆ¿Î!þ€r(ÿ¯ACÌ@íó O÷%«™>4‹ú”" /ށÿG Èp5ñßÓ*5=€úøûӕ>ÂŒ._' a!ŽCòUÒ¬f}«ïû V_š^þ‚-ï ?æ j+¿y©WôùÄ^õrþšà  ê¿§V küƒßö‚À­(_Ùý?Ùö¿È&€€þ×ïèØˆßÍ?þ€r/¯>ÿCÌ@ìó ÷%Ê~Dßú”B —¶‹G ÉlñžŸÓ*6=Šúøˆ(`ӕ>ÂŒ._7@a ÙßòhÒ¬fœ®cû PŒ_šºþ‚!ïßæ jm ù·—ôùÄþ÷9þšà]÷ê&§V kü…_ö‚À¡ù¿iý3Ùè¿È&€ø%þ×èØˆ¿Í5þ€r5w¯'CÌ@íó /÷%芟H—ú”B _·G ö}ñ°Ój2œšOúøÑëdӕ>ÂŒ._Fàaÿ‹òcßÒ¬_=­Óû Jü¯šôþ‚!ï_æ j®Šy²WôúNö’þšàçê*ÿ§V i|…ïö‚À–ËŸýÙÞ¿È&¥KÁþÑèÙÌcþ€r;÷¯&ÿCÐ@èó ÷&þS‹ú”B Gž`ÿG òÝñŒ_Ók2œ©ÛúøÄBӕ>ÂŒ._V€a%9òi?Ò¬aœ®ƒû Em_šãþ‚%ïßæ jïñyŽôú>öÊþšàÙÛê*¿§T `|…çö‚À‹¿µýOÙò?È&¥ŸaþÉoèØˆËiþ€rB·®ûCÌ@éó÷&%}>Ywú”B —¹ÿD ï?ñÈ_Ók3ý«Wúøë³ŒÓ>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ._f aJéòx_Ò¬d}°gû ?Þ_š­þ‚!ï?æ k1Uyœwôúž÷õþšà—»ê`ÿ§V _üŒ·ö‚À€p_{ýÚ È&¥óþÅÏèØˆ?Êùþ€rI—®üCÐ@áó¿÷&Cõ>dÿú”B oºD ë¡ñÙÓj6ý­kúøáo²Ó•>ÂŒ._uÀapòŒ¿Ò¬f}²÷û :OŸšþ‚+ï_æ krºyÅoôúþøôþšàU·êUÿ§V c|‹Wö‚ÀuC¿Ùý[Ú?È&ŠF§þÅïèØˆ¿Êûþ€rP¯®éCÐ@âóO÷&bo>koú”" ×»[D èñä?Ók4ý®ÏúøŽ³`ӕ>ÂŒ._…`a–[ò—_Ò¬hœŽOû 4Áš„þ‚ïæ kŽ%ùœôúž÷éþšà³êK¿§V _üŠö‚Àj¿ýSÚÿÈ&КMþÉïèØˆŸË}þ€rW÷®ÕCÌ@åòþï÷&€çþuú”"Œ‘D äyñÖ¿Ók3ý­#úøöûîӕ>ÂŒ._•aŒò¢Ò¬kýµ§û /2ߚ9þ‚ïßæ kõy¿7ôúžø-þšàћêy?§V `üÇö‚À^ì¿QýoÚ?È&ŠíøþÊÿèØˆŸËŸþ€r_g®ÔCÌ@ßòþ¿÷&ŸaŸ| ú”"7œnD àåñÜ_Ók4}­Ïúø¶òӕ>ÂŒ._€ aáéò¬ßÒ¬m=·û )€ï™ñþ‚îüŸæ l6ôyÃGôúD®ø®þšàêާV _ü’oö‚ÀSÂýKÙÿ¿È&§A¥þÏ?èØˆÿÌ'þ€rfÿ®çÿCÌ@ãó÷&œÙ~‡ÿú”B—ŸìD ÝKñõ_Ók2ý°óúøí•Ó•>ÂŒ._Ž@aÁò£ßÒ¬oýµçû $O™ˆþ‚#îïæ lx`ùº/ôùÄÞ÷Šþ àMgêì?§V `üž'ö‚ÀH˜?qýÙêÈ&§•VþÒßèØˆÿ̛þ€rnÏ®ëÿCÌ@çóŸ÷&ÜR>‘ú”§ÀÿD Ùµò Ój1œ³oúøTÀӕ>ÂŒ._Ãàa-ò ?Ò¬n=µsû ‰Ï™xþ‚1îí¿æ l¹Éy»wôúþ÷²þ à Oë)?§V a|¥Ïö‚À=oký«ÙÊ?È&§é þÒÏèØˆ̗þ€rv×®ØCÌ@àòÿ/÷&úÍþ“cú”"ÀXD Ö!ò¿Ój5}µãúøìK^ӕ>ÂŒ._ӀaS…òŒßÒ¬k}³û ü™kþ‚5îìæ lû1ùœOôún÷ìþ àÉ;ë_?§V i|¬—ö‚À2F™ýÙ¯¿Ê&š<ÂþÛèØˆͱþ€r®ÇCÌ@âòüÿ÷'E~ŸËú”wÁåD ґò+?Ój5ý·«úøüÜӕ>ÂŒ._㠐ayuòvÒ­hý°?û oŸ™6þ‚-îåæ m<šùŸ_ôúÞøþšà‡3ëv?§V g|¯oö‚À'ŸýWÙ°ÿÊ&š~þÝïèØˆÍùþ€r‡w®µCÌ@ßòúß÷'7Ä>š7ú”"?Á2D Ï ò%_Ók6œ¶ûúøA?aӕ>ÂŒ._òÀaŸmòZÒ¬k=¬Ïû âߙ5þ‚'îåæ m~ùœôúî÷òþ àEë³ÿ§V n|·/ö‚Àö¿¡ýoِ¿È&šä<þä¿è؈_ÎÕþ€r®ÿCÌ@âòö?÷'V>~Ÿ—ú”‡ÁÝ@ ˅ò#ÿÓj6ý¶ÇúøâqÓ>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.``aÅeòLÿÒ¬k}«û¡ Uÿš þ‚ï¿æ m¿oùºwôúŽ÷’þ à;ë~§V k|°ö‚ÀÏßÝýwÙxÿÊ&©7ÿþçÏèØˆÏ7þ€r˜×®”ÿCÐ@ßòö¯÷'tº> ³ú”BŸÁÿÿ@ Çõò@¿Ój8œº_úø0ì”Ó•>ÂŒ.`aë[òTÒ¬iý¬û¡ ɟšwþ‚ï ¿æ nÕùÄïôùÄŸøâþ à ÁOë_?§V k|¬—ö‚À©¿¯ýÙRÿÈ&©‹Æþé¯è؈_Ïsþ€r¡Ï®…ÿCÌ@Øòô¿÷'“4Ÿ¥Çú”G¢ÿ@ ÄqòD?Ók8=º×úøoʖӕ>ÂŒ.`! a]òLßÒ¬k=«û¡ ý=š­þ‚!ïæ nBBùŸ/ôúDŸø þ à {ë¿§V bü¡Ïö‚Ü‘«]ýÙ(¿Ê&©ß‘þêOèØˆŸÏƒþ€rªÏ®ÛÿCÌ@ÛòÿŸ÷'±³þžú”"Á«ÿ@ Àåò_?Ój:=Ÿ3úøéá9ӕ>ÂŒ.`1@a7gò@Ò¬gœ©wû ÷±¯› þ‚Aïßæ nƒ®y»_ôùÄ~÷¯þ à =êñÿ§V cüž÷ö‚܆†_»ý3Øô¿È&ª3`þé¯è؈_Ïoþ€r³÷¯CCÌ@áó o÷'Ð1ŸšÛú”"ŸÁAÿ@ œYò_Ój=}Â3û Κ%ӕ>ÂŒ.`@àa]gò\Ò¬kœ¬ûû¡ ò%ï›Äþ‚)ï7_æ nÅùŸ?ôùÄ>ø þ àû§êÓÿ§V e|›7ö‚Ü{aÿýØÏ?Ê&ª‡3þçÏèØˆ?Ï5þ€rœW¯šÿCÌ@èóO÷'î®>™Ûú”B?Á!@ ¹Ýò{ÿÓk<ýÁÏû Q »Ó•>ÂŒ.`P€aƒuòcßÒ¬l=­÷û 욯›Þþ‚)ï:Ÿæ oyÁ‡ôúøvþ à¹Çê¥ÿ§V g|•oö‚Üp>¥ýÇØ²?Ê&ªÛ þåè؈ßÎíþ€rÆç¯òÿCÌ@ïó"o÷( *>šsú”" ·Á3@ ¶mò__Ój=œŸ7û DÍӕ>ÂŒ.`` a©‡òqŸÒ¬k=¯¯û¡ çœzþ‚MïNæ oGíùœßôùÄ^øþ àw×ꊿ§V g|•—ö‚ÜeŸGýÃØ¥¿Ê&«.æþßèØˆ¿Îþ€rÐǯûCÌ@óó#÷(+š>– ú”bÿÀ¥@ ²ñòeÓj@=Ÿïû Ä®–Ó•>ÂŒ.`oÀaϯòVßÒ¬l}¬_û¡ á„Ïœþ‚KïNŸæ o‰UyÆÿôùÄù$þ à5ïê”?§X f|“Oö‚ÜY÷mýëØªÿÊ&«‚ÃþßèØˆ?Îþ€rÚ·°SÿCÌ@îó.÷(J"Ÿš;ú”BÏÁ*@ ¯yòf?Ók?œ¿û •\õӕ>ÂŒ.``aõÕòPßÒ¬k}«Ÿû¡ Ûú/œ÷þ‚Iï]Ÿæ oÊœyÏÏôùÄîú>þ àôê\ÿ§V _|Œoö‚ÜNÕ?ÝýãØ˜ÿÊ&«Ö£þàè؈ÿÎKþ€rä簆CÌ@îó4Ï÷(h¢þ7ú”"G¿éÿ@ ¬ò_ÿÓjA=ŸSû óïmӕ>ÂŒ.`aòLÒ¬n=« û¡ Öo¿šþˆ‚Yïsßæ p 'yÓïôùÄÎúÀþ à²êˆ?§V [ü‘×ö‚ÜC³ß‘ý+Øo¿Ê&¬*…þåÿèØˆßÎûþ€rï7°áCÌ@õó?ÿ÷(‡#~…ú”b/Ÿ…@ š•òV?ÓkB}œû Û^Ó>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.`ž a B5ò@Ò¬q}©—û¡ Ð埞/þˆ‚ï„_æ pMùÜôùÄnûÃþ àp;ên§V Wüާö‚Ü8’_ýóØ~¿Ê&¬~gþóÿèØˆßйþ€rùDZÿCÌ@îóF¯÷(¥€~yú”"7œÿ@ ¥-ò<Ók@ý¹×û Á®Ó•>ÂŒ.`®@a hoò6Ò¬oýšSû¡ Ë[ïžIþ‚Oï‡ÿæ pŽûyÝôùÄ>ûãþ à.Kêÿ§V Z|ßö‚Ü-q¿Ïý_Øw¿Ê&¬ÒQþöŸè؈¿Ñ þ€r—±CÌ@ôóG¿÷(Ä(Ÿd³ú”b ?ºuÿ@ ¡¹òD?ÓjC=ºßû Œ)þӕ>ÂŒ.`œàa Ž»òÒ¬lœ£Sû¡ ÅÒ_ž·þ‚kæ pÐeùáÇôùÄü{þ ã‘ÑOêZ¿ŠÖ Y|Œ7ö‚Ü"QŸÍýØwÊ&­&?þøŸè؈ÑKþ€r±<ÿCÌ@ùóKoöƒ(âš~[Sú”‚ ¹IÿD žEòQŸÓjE}Œ‹û ä ӕ>ÂŒ.`̀a µñá¿Ò¬i=Ãû¡ ÀIOžŠþ‚wïßæ qÐùåôùÄŽüæþ ãkêU¿ŠÖ Yü‹—ö‚Ü1ß]ý»ØˆÿÊ&­z3þô¯èÙ_ÐÏþ€rDZ4ÿCÌ@ûóJo÷)*þKgú”B ¯·Jÿ@ šÓò]ÿÓjIœŸû Å+ӕ>ÂŒ.`Ý a Û]ñÓ¿Ò­h}›ûû¡ ºÀ_ž²þ‚kæ qS;yê/ôù„.ý‡þšãM‡êW?ŠÖ V|‹×ö‚Ü _ÅýÓØµ¿Ê&­Î*þñ¿è؈_Ðoþ€r&±WÿCÌ@üóNÏ÷)©ŸD_ú”‚ ·¶gÿD —sòC_ÓjK}ºÃû Gyӕ>ÂŒ.`ìÀa ±ñÅÒ­gýš;û¡ µ7¿žŸþˆ‚Sæ q”§yìWôùÄžýÎþšãŽ ¯ê>?ŠÖ R|ˆ·ö‚Üóß%ýÇØÂ?Ê&®"#þóèØˆ¿Ð›þ€r1¿±>CÌ@øóK¯÷)>'Ÿ?Kú”‚GµÄÿD ” òEÓjKýº÷û â`hӕ>ÂŒ.`ü`a(ñÁŸÒ­g=™·û¡ ¯¯_žËþˆ‚aï—ÿæ qÖùò7ôùÄþˆþšãŒÉÏê=¿ŠØ Tüˆ¯ö‚ÛõÕßµýOØÔÊ&®v"þíïèØˆÏùþ€r=±#CÌ@úóH?÷)\§þ4ú”‚wŽiÿD “òiÓjOœ¿û ?|«Ó•>ÂŒ.a aNmñ€ßÒ­aý–û¡ ª'_žþ‚iæ ryz—ôùďTþšã‹‡ûê#¿ŠÖ Sü…oö‚Ûꞟñý3ØÜ?Ê&®Ê"þîÿèØˆÿÐþ€rI‡±ÿCÌ@ýóGÏ÷){&~-÷ú”B?³˜ÿD 'òyßÓjQýÁû óӕ>ÂŒ.a at×ñŽ?Ò­_=“Oû¡ €Ÿžþ‚Uæ rXçyÿ'ôù„?'þšãŠF3éîŠØ S|~×ö‚ÛߛßYýØèÿÊ&¯%þñ¿è؈ŸÐoþ€rUǰÞÿCÌ@õó?Ÿ÷)™ þ1sú”B‡Žÿ@ ‰Áò?ÓjSœÂ;û -/ŸÓ•>ÂŒ.a+@a›Eñ}?Ò­]ý‘+û¡ Ÿÿž€þ‚gïŽæ =·ú'õ ħþšã‰o鲿ŠÖ W|wWö‚ÛÔßcýØêÊ&¯r,þòÿèØˆÿЗþ€rb7°¡CÌ@óó7ÿ÷)žþ)¿ú”‚'³D †Wò”?ÓjU}Ä×û +˜SÓ>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.a:àaÁœñaÒ­[=§û¡ ™Ïž+þ‚oæ úWõ Äjþšã‡ÂŸéš¿ŠÖ U|t_ö‚ÛÉdWýGØè¿Ê&¯Æ7þòïèØˆ_Зþ€rn¿°žÿCÌ@ñó7÷)֘þ0«ú”Bï³íD !‚ïòš?ÓjUýÇWû áö5ӕ>ÂŒ.aJ€aè9ñJŸÒ­Z=ŠÏû¡ ” þ‚gïuŸæ À‹úõ Äþšã†€¿é®?ŠÖ ZüvÏö‚ÛŸIßáý7ØÙ¿Ê&°Cþù?èØˆÑ]þ€r{°aÿCÌ@çó0÷)õŸ5sú”‚׎†D "ƒòÊ¿ÓjU=˧û síӕ>ÂŒ.aZ aÃñ Ò­W=…‹û¡ Žƒïþˆ‚iï|Ÿæ üú·õ Äþšã…>óé’?ŠØ WüsOö‚Û³/¿£ý!?ØÒ?Ê&°nXþñ¿è؈?Ðmþ€rˆ‡°4ÿCÌ@ìó*O÷*Žþ4ƒú”bÇŽiD #|òã?ÓiYœÎ»û 2ÄÞӕ>ÂŒ.aiÀa5MñŸÒ­Yý‚+û¡ ˆüÓþ‚[ïxßæ Cjúoõ O,þšãƒý飿ŠÖ X|uö‚Ûš?QýØÇÿÊ&°Âoþî¯è؈_Ð þ€r•§°ÿCÌ@êó'÷*2 Ÿ1ãú”bŽD $x»òö?Ój[}Ñû #ê-ӕ>ÂŒ.ay`a[ÛðñÒ­Vý«û¡ ƒv/žþˆ‚qï‚æ „Üúçõ þšã‚»+éáÿŠÖ W|}Oö‚Ûœý‡ýØÎÿÊ&±‹þç¿è؈ßÏ/þ€r¢÷° ÿCÌ@ëó%¯÷*Pˆ>/ãú”BO³ÔD %u]óŸÓjZœÒßû Ë<ŒÓ•>ÂŒ.a‰a‚mðáŸÒ­Tý}¯û¡ }ðžZþˆ‚Kï‰ßæ ÆNyÿÇõ Ä_7þšãy7ê6ŠÖ ^ü‡×ö‚ۑ䟧ýØÒÊ&±jšþæïèØˆ?Ïþ€r°‡¯ÎÿCÌ@êóŸ÷*oŸ+“ú”b³KD &qùó%Ój]œÖûû :÷:ӕ>ÂŒ.a˜ `ÿš÷ðô_Ò­Uœ€ û¡ xj?ž…þˆ‚kï_æ Ày÷ïõ Îÿ;þšã€7;ê¥?ŠÖ dü•·ö‚Û†Ìßmý ØËÊ&±ŸÉþåè؈Îéþ€rŸG¯”CÌ@éó_÷*>+Ûú”‚‡³SD 'n©óŸÓi]}Õ7û ©5«Ó•>ÂŒ.aš@`þύðøÿÒ­W}€—û¡ r俞‰þ‚kïßæ I2ùïGõ Äþ'þšã~õCë ¿ŠÖ iü¢ö‚Û{¶!ý+Ø¡ÿÊ&²ñþÛ_èØˆÍ¡þ€r̯¬ÿCÌ@çóo÷*«úþ0wú”bϳæD (kMó.?Ói^}Øû sӕ>ÂŒ.a·à`ýö/ðï¿Ò­Z}sû¡ m_ž“þˆ‚gï‘æ ŠŸùôÿõ ~þÝþšã}³Sëb¿ŠÖ gü­gö‚ÛpŸŸµýؕ¿Ê&²gþÔÏèÙÌÑþ€rÚ¯ÀÿCÌ@äóÏ÷*Êy>)ãú”bw³D )g÷ó:¿ÓibœÙ›û ©dìӕ>ÂŒ.aǀ`ýÏðú_Ò­\ý€Ãû¡ gÚ?Ÿ>þˆ‚kïŠæ Ìyêßõ Îý˜þšã|qoë ¿ŠÖ i|µ'ö‚Ûe‰¿/ý#؄¿Ê&²»IþÍOèÙ?Ëãþ€rè_¯ÿCÌ@áó÷*èõ~(Gú”b²áD *d¥ó@ßÓia=Ú[û ŽõÓ>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.a× `üCoñßÒ­c=ƒÇû¡ bUoŸ|þˆ‚ƒï®?æ  ‚ùêïõ Äý˜þšã{/£ë§?ŠÖ iüµÿö‚ÛZt_ïý'Ø|¿Ê&³{þÄ¿èØˆßÊÑþ€röǯŸCÌ@áóŸöƒ+t~—ú”‚_±ÊÿD +aSóJÓi`=ۋû ØåÂӕ>ÂŒ.aæÀ`ûjñÒ­a}…?û¡ \Ðþˆ‚{ﱿæ Nóùè7õ ŽýAþšãyí¿ëì?ŠÖ i|ŸŸö‚ÛO_¿/ýGØdÿÊ&³c°þœèÙÿÉëþ€r_¯¢CÌ@æóÿöƒ+%òŸïú”b‡°õD ,]ýócÿÓi]œÞ·û è ӕ>ÂŒ.aö``úÍñ*Ò¬c=†³û¡ WMžÆþ‚Uï—?æ hyÜçõ ûÓþšãx«ßì+ŠÖ jüƏö‚ÛDK_KýkØgÿÊ&³·êþ²_èÙÿȅþ€r7¯‚CÌ@åóöƒ+DpŸgú”‚ç°$D -Z«ówÿÓiaýá+û … ӕ>ÂŒ.b`ù·{ñOÒ­cý‹[û¡ QÉ?žyþˆ‚-ïÿæ ÑÛùԗõ ~úÉþšãwjìGÿŠÖ m|Êö‚Û97«ýOØsÿÊ&Ž &þ«/èØˆ_ǟþ€r#G¯KÿCÌ@Úó Oöƒ+bð>‡ú”‚Ç®èD .WWó”ÿÓid=äÇû »;ӕ>ÂŒ.b `øÞ5ñeÿÒ¬býŽ3û¡ LEŸžVþˆ‚Wæ MùЗõ žúGþšãv(Cì[ŠÖ tü̇ö‚Û.$ßKý#ØGÿÊ&Ž`cþª_èØˆ?ǁþ€r2o¯SCÌ@âó?÷+m>“ú”‚Ç®iD /Tó“?Ójaýäû N>äӕ>ÂŒ.b%@`øõñ|ŸÒ¬c}‘û¡ FÂ_äþˆ‚uï{_æ TŸyЗõ Ä>úGþšãtæ{ìj¿ŠØ z|Îgö‚Û#_1ý!+ØEÿÊ&ŽŽ¡þ°/èØˆÿÈ?þ€rA·¯~CÌ@ãóoöƒ+Ÿëœü«ú”‚/­kÿD 0PÓóƒ?Ójcýâ‹û oPáӕ>ÂŒ.b4à`÷+·ñŸÒ¬bœ•'û¡ A?O­þˆ‚IïtŸæ –/yÐ'õ ÄÞú7þšãs€Ûì?ŠÖ vüÄwö‚Ûýý!_Ø>?Ê&µãþŽ¯èØˆÿÈÏþ€rQ/¯¯ÿCÌ@Ùó¯öƒ+Ÿfýü§ú”bï­kG 1M™ól¿Ójb=ß·û b÷ÿӕ>ÂŒ.bD€`öR‹ñ¡_Ò¬`}•£û¡ ;Œo–þ‚mïqæ × yϟõ ÄÎú%þšãrcCë¹?ŠÖ nüž/ö‚Û ï?œýØ6Ê&µ]-þ®/èØˆ?Èþ€r`篹CÌ@ãóïöƒ+Üçœïƒú”bO«ÆG 2J_óZ¿ÓjaýÝsû ¶6éӕ>ÂŒ.bT `õyeñ¥?Ò­^ý–û¡ 69¿Àþˆ‚Gïwæ ùÓ§õ Äþú§þšãq!ë£¿ŠÖ qüµwö‚ÛÞ§ýGØ3Ê&µ±wþ°¿è؈?ÈSþ€rpϯÃÿCÌ@æó/öƒ+ûaýò ú”bO¬D 3G/ó5Ój_ýØ·û S#­Ó•>ÂŒ.bcÀ`ô IñŸ_Ò­]=•gû¡ 0·?ž þˆ‚3ï€æ ZùÖßõ ÄŽûþšãoß÷ëKÿŠÖ i|ªö‚ÚöÎ3ý+ØE¿Ê&¶Ãþ¶ïèØˆ¿Éþ€r€ç¯ÍCÌ@Þóoöƒ,Ý}ñ¯ú”bϬ D 4Cùó"_Ój]ýÖ[û Ã{Ó>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.bs``óÇ3ñš_Ò¬]=”Çû¡ +5žþˆ‚Qï€ÿæ ›îyޏõ Äüþšãnž_ê÷¿ŠÖ d| ö‚ÚëŸ;ýØFÊ&¶Zþ¹?èØˆÉcþ€r‘'¯íÿCÌ@ãó!öƒ,8Y}ïƒú”b«ÅD 5@Çó ÿÓj\}ÓGû Ú Sӕ>ÂŒ.bƒ`òîñ©¿Ò­Z=–³û¡ %³Oõþˆ‚_ï}æ ÝeyÑGõ DúWþšãm\»êÂŠØ e|™Oö‚Úà¯?ãý?Ø\?Ê&¶®hþŒ¯èÙßÉËþ€r¡§¯äCÌ@äó Oöƒ,VÔœïgú”bo«ÂD 6=‘óÿÓiZ}Ò'û  šÓ•>ÂŒ.b’ `òñ–ßÒ­X}”_û¡ 1ߝ‘þˆ‚Uïqæ ×ùϗõ Ä~úþšãl#êwÿŠØ c|ÿö‚ÚÕ ßÕýoØZ?Ê&·Àþ¿?èØˆÿÊþ€r²O¯òCÌ@éó"öƒ,uQ}ëgú”B«BÿD 7:gòݟÓjZœÍ³û g²µÓ•>ÂŒ.b¢@`ñ<ñƒÒ­X=‘Ûû¡ °Ÿ]þ‚gïj_æ `Pùœßõ Þ÷èþšãjكêAÿŠÖ Xü‰?ö‚ÚʒßAý“Øg¿Ê&·WþÃ/èØˆʙþprðCÌ@éó&Ÿöƒ,“Í}é'ú”/ªúÿD 87Aòµ¿ÓjXœÈ»û 0ӕ>ÂŒ.b±à`ðcñ¿Ò­W}‘wû¡ /„þ‚+ïoæ ¡Èù¯wõ  îöþšãi—ßêŠÖ P|„ö‚Ú¿…«ýØuÊ&·«zþÅŸèØˆßÊéþprÔ°9ÿCÌ@ëó+öƒ,²I}æçú”"_ª²ÿD 94òŸßÓjXœÅ÷û 0ðӕ>ÂŒ.bÁ€`ïŠñ‹ÿÒ­Yý’÷û¡ ®ß þ‚7ï_ÿæ ã?y¥'õ nôÑþšãhVêB?ŠÖ Tü‰Wö‚ÚŽx¿ÿý[ØÿÊ&·ÿÜþÉ¯èØˆ?Ësþ€råG°oCÌ@ñó1oöƒ,ÐÃ}éƒú”Bg«ÿD :0ïò€ßÓjUœÂû LÓ•>ÂŒ.bÑ `î±1ñyÿÒ­X=»û¡ ._œêþˆ‚Wï\æ $žy”çõ ÎòÈþšãgWê|¿ŠÖ S|§ö‚Ú©l_Ùý_ؚÿÊ&žT?þÓoèØˆÌ©þ€röŸ°©CÌ@ðó8ßöƒ,ï?œæ·ú”bª«ÿG ;-ÑòQÓjQýŒ/û l_åӕ>ÂŒ.bàÀ`íØIñnÒ­ZœCû¡ ®Oœaþ‚iïJßæ f.yŒwõ D ~ñ»þšãeҟê•ÿŠÖ [ü“×ö‚Úž`¿Uý_ت¿Ê&žš§þÙÿèØˆ¿Í{þ€r°÷ÿCÌ@ñóBŸöƒ- »ýã›ú”b'ªHÿG <*­ò5¿ÓjPýž³û Ž ӕ>ÂŒ.bð``ìÿcñlÒ¬]œû¡ÿ._œ,þ‚+ïD?æ §€y„¯õ  ðÄþšãdïêžŠÖ T|”ïö‚Ú“V×ýóؚÿÊ&žýþßŸèØˆÎ1þ€rϱDCÌ@öóL/öƒ-,9=ÝÛú”BG©ÿG ='ò2?ÓjMýž?û ðûӕ>ÂŒ.c`ì&ñtÿÒ­_='û¡ù®¿›Íþˆ‚'ï8_æ éysOõ  Þî—þšãcOë ?ŠÖ ]|¢Çö‚ÚˆKÿ}ý؏¿Ê&¹Q‚þæ?èØˆÿÏþpr+·±CÌ@ùóSöƒ-JµœÚú”bw©G >$Sò8ÓjLýžÿû IÓ>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.c `ëM«ñeßÒ­^ýŽGû¡ô//›úþ‚7ï>?æ *™ù^Ÿõ  ìþšãb _ë3ŠÖ `ü§—ö‚Ú}BýïØ£¿Ê&¹¥öþé_èØˆÿÏgþpr=×±§CÌ@ûóXöƒ-i3=Ó¿ú”b'šLG ?!1ò%_ÓjLœ¶§û 8D³Ó•>ÂŒ.c@`êtßñQ¿Ò­`œ‹Ãû¡î¯ïœ þ‚+ï@æ lùK‡õ D ~éžþšã`Ë¿ë!ŠÖ i|¥gö‚Úr8ß›ýسÊ&¹úoþèoèØˆŸÏEþ€rP/±œCÌ@ûó[?öƒ-‡²=ɏú”B§§G @ò?ÓjJýŽû ÛºÓ•>ÂŒ.c.à`éœ ñaÒ¬bý¿û¡é0ߜ:þˆ‚ïEßæ ­y9ßõ DÞçgþšã_‰ûëk?ŠÖ oü®Ÿö‚Úg0?÷ý÷Ø¿Ê&ºNêþëoèØˆ?Ï©þprb·±ÒÿCÌ@ýó]ÿöƒ-Š+ýÌ{ú”b×§bÿG AñòÿÓjL}²Wû ’{\ӕ>ÂŒ.c>€`èÃAñgÒ¬aœŽkû¡ã²œ{þˆ‚/ïNæ ï y'¯õ D®å!þšã^H;ë¯ŠÖ r|·ö‚Ú\(?Eý/ØÉ?Ê&º£gþò¿è؈?Гþpruo±çÿCÌAó`Ÿöƒ-ħ=Ë[ú”"§>D BÉò ÿÓjK=³wû ›nÚӕ>ÂŒ.cN `çêuñ?Ò¬bý‘³û¡Þ3_ þˆ‚?ï`æ 0„ù/õ D~ãþšã]ëð?ŠÖ xü¿Gö‚ÚQ ÿ/ý ØÆ¿Ê&º÷åþÿoèØˆ_Ò#þprˆW±ÿCÌA ócöƒ-ãýÒÛú”b'š-D C¡ò_ÓjK=µû ÀfJӕ>ÂŒ.c]À`ç·ñˆ_Ò¬_œ’›û¡صaþˆ‚Wïkæ qúùõ DNâ~þšã[Äãëá?ŠÖ uüœ_ö‚ÚF?_ýØÍÊ&»LlþÿOèØˆ?Ò%þpr›‡±ÛÿCÌAó_öƒ.˜}Õ×ú”B繊ÿD D‡ò ¿ÓjI=³/û .ï-ӕ>ÂŒ.cm``æ8ûñ™?Ò¬aý”³û¡Ó6ÿžþˆ‚3ïuÿæ ³qy ïõ D®áÍþšãZƒ/ì?ŠÖ wü÷ö‚Ú;_Ñý_غ¿Ê&» õÿoèØˆß҉þ€r®ß±ÌCÌ@÷ó]/öƒ. }Õ;ú”b'švÿD Eoñø?ÓiE}°ûû ¯žӕ>ÂŒ.c}`å`Mñ—Ò¬i=”{û¡͹?îþˆ‚aï|¿æ ôäyõ Dîâ>þšãYAŸëòÿŠÖ w|¿§ö‚Ú0¿/ýGØÆ¿Ê&»õƒÿÏèØˆ_Òqþ€r‡±oCÌ@÷óQŸöƒ.>}Ñ»ú”bwšÿD F UññÓjBý°û Έ'ӕ>ÂŒ.cŒ `䇛ñ®?Ò¬hœ—Sû¡È;ߝ×þˆ‚Eïyßæ 6Yy¯õ DÞâ$þšãWÿ÷ì?ŠÖ uüÃö‚Ú% ŸÃýØÙ?Ê&ŒJþýOèØˆŸÑåþprÖW±#ÿCÌ@÷óHOöƒ.] }Ó¯ú”BšEÿD G?ñâÿÓjDý®Oû Uï”Ó•>ÂŒ.cœ@`ã®ïñÆÒ¬eœš_û¡ŸŸžþˆ‚Kïÿæ wÊyõ D>ãMþšãVŸ_ì ¿ŠØ uüö‚Ú_³ý3Ø×¿Ê&ŒžšÿÏèØˆ¿ÒÓþ€rê?±CÌ@ûóFïöƒ.{œÙ{ú”BšþG H-ñÐ_ÓjG=«ÿû p2Ó>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.c«à`âÖOñÏ?Ò¬d=›{û¡œA¿žþ‚/ïæ ¹?yõ DžãOþšãU|ËëýŠÖ rüÁö‚ÚŸËý/ØÚ¿Ê&ŒóBÿŸè؈_ÒMþ€rþ_°÷ÿCÌ@ùóBßöƒ.™þ=Ô³ú”BšdÿD IñœÿÓjE=©·û €šCӕ>ÂŒ.c»€`áý«ñò?Ò¬dœŸÛû¡·Å?Åþ‚Oïw_æ úŽùõ D Nã0þšãT;7ëóÿŠÖ m|¿ßö‚Úþ?sýØï¿Ê&œGàþûè؈ŸÑ«þprŸ°ýCÌ@ûóCoöƒ.žwœ×ú”"ŸšŒÿD Iÿñ©ÿÓjD=§7û Ðú‹Ó•>ÂŒ.cË `á%ò ßÒ¬c}£û¡²Hϝúþˆ‚Gï~_æ <+ùÇõ D îâ€þšãRù§ëåŠÖ t|Ÿö‚Ùøû¿wý/ØïÿÊ&œœþüÿèØˆÑÝþpr'±CÌ@õóDöƒ.Öï}ÞWú”B©˜ÿG Jüñ•ŸÓjCý€§û iZ ӕ>ÂŒ.cÚÀ`àLò?Ò¬bœ¥û¡¬ÌŸž0þˆ‚Wï…æ } ù÷õ D žâÉþšãQž7ëŒÿŠÖ pü³ö‚Ùíù¿¥ýרõ?Ê&œñ$þ÷è؈Ñ-þpr;¿°éCÌ@öó@ßöƒ.õhýà§ú”B©áG Køññ“¿ÓjDœ€kû öyÃӕ>ÂŒ.cê``ßs÷ò,_Ò¬e=§'û¡§Pߝ÷þˆ‚Oï}ßæ ¿ù/õ DnâQþšãPv»ëSŠÖ p|«Çö‚Ùâø?ýÓÙÊ&ŸEËþõßèØˆ¿ÐóþprPŸ°ÍÿCÌ@ôó=öƒ/ßýé?ú”bϪòÿG Lõëñy_ÓjEý¡û HŠÓ•>ÂŒ.cú`ޛwò3ßÒ¬g=šû¡¡Õ/ž<þˆ‚Sï†æ ùïõ DâKþšãO5CëŠØ o|£÷ö‚Ù×÷_{ýûÙ?Ê&Ÿšvþó/èØˆНþpre§°ÇCÌ@÷ó<Ÿöƒ/2Xœíú”B¯«yG MòÛñ{ŸÓjF=¡_û ,þdӕ>ÂŒ.d  `ÝÂùòDÿÒ¬h=ª;û¡œY¿žþˆ‚Kï‘?æ By‡õ .âŒþšãMóÃêî¿ŠÖ k|Ÿ?ö‚ÙÌöÿýÙ$?Ê&Ÿï$þò/èØˆ_Ðþprz×°ÖCÌ@ôó>öƒ/PÏ=÷ ú”B _¬ªÿG NïÑñsÓjCœ Oû 'þLӕ>ÂŒ.d@`Üê…òM?Ò¬i=«Cû¡–ÞŸž¿þˆ‚Sï–¿æ ƒxy÷õ DÞâÊþšãL²3êñÿŠÖ nüŸ—ö‚ÙÁ÷íýËÙ>Ê&¿CÕþò/èØˆÐ}þpr?°ÑCÌ@öó=ïöƒ/oI=÷ãú”‚ w¬ÄG OìÏñZßÓjBœCû ›”ˆÓ•>ÂŒ.d(à`ÜòKßÒ¬e}«û¡‘cϞÓþˆ‚;ï™æ Äìyõ D~ã{þšãKp·êÈÿŠÖ k|šö‚Ù¶÷ŸCý+Ùi¿Ê&¿˜‰þóèØˆŸÐ©þpr¥Ï°áCÌ@öó?ßöƒ/¿>—ú”B ¿®G PéÃña?ÓjCœžû ÎÃÍӕ>ÂŒ.d8€`Û9µòPÒ¬fý«§û¡‹é?žéþˆ‚cï›ÿæ _y#?õ D >ä’þšãJ/3ê¶ÿŠÖ c|˜?ö‚Ù«ù¥ýÙuÿÊ&¿í@þö/èØˆÐÿþpr»—°ÝCÌ@ôó?Oöƒ/¬5~ ßú”b ¯cÿG Qæ»ñaÓkCœžû q{Ó>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.dH `ÚaSòZŸÒ«gœ¬ïû¡†ož»þˆ‚[ï–_æ GÒy,õ D îå¬þšãHí§êœÿŠÖ ^ü™/ö‚Ù úßãýÿٝ¿Ê&ÀAýþòèØˆÐwþprѱÿCÌ@ðóDöƒ/Ê­þ'ú”"ׯëÿG RãÇñ3ŸÓjA=˜Wû qÂcӕ>ÂŒ.dWÀ`وñòt?Ò¬iœ°û¡€õž‰þˆ‚Sïæ ‰Bù;¿õ  >ç¡þšãG¬êæ?ŠÖ büž7ö‚Ù•ý_Çý+Ùº?Ê&À–žþüèØˆÑ»þpr篰íÿCÌ@öóA_öƒ/é.>ú”b_® G SàÃñ2¿ÓjA}˜7û hãӕ>ÂŒ.dg``ذ¥òeÒ¬h=®Gû¡{{ožkþ‚[æ ÊŽyIoõ D îéWþšãFjêý?ŠÖ cü¡ö‚Ù‹‰ý3ÙÒÿÊ&Àë{þúïèØˆѕþ€rþ°íÿCÌ@ôóAoöƒ0ªýûïú”B?­DG TÝÁñ0ßÓj?}—ÿû e5Éӕ>ÂŒ.dw`רWòlßÒ¬g=¯3û¡vïžzþ‚GïŽæ  $ùYßõ  >ëbþ ãE(ïëÿŠØ cü€çö‚Ù€¡ý/ÙÖÊ&Á@@þý_èØˆÑãþpr°ðCÌ@úóAŸöƒ0&">óú”BW®#ÿG UÚ»ñ>Ój@=™·û jqӕ>ÂŒ.d† `×ònßÒ¬h=¯wû¡pˆŸžœþˆ‚Mï–ßæ M“ùn‡õ Díöþ ãCçsë ŠÖ e|¢ÿö‚Ùu §ýGÙÖÿÊ&Á• þüèØˆ¿ÑÇþpr+O°ÞÿCÌ@òó?öƒ0Dšþsú”"·®“G Vלñ<Ój>œ™wû ÷€Ó•>ÂŒ.d–@`Ö'ÓònÒ¬gý¯cû¡k¯žŽþ‚Qæ ùõ DNðGþ ãB¥óëÿŠÖ a|¢—ö‚Ùj=ýkÙé?Ê&Áé×þüïèØˆÑÕþprB?°ÊCÌ@íó<ïöƒ0c Ÿú”bg°ÓÿG WÔ±ñ`ßÓj>ýžû Vyӕ>ÂŒ.d¥à`ÕO‘ò…Ò«k=²Cû¡e–ÿžžþ‚Sï•ÿæ ÐvùŒ7õ .ñ«þ ãAdêéÿŠÖ _üžçö‚Ù_ÿ ýKÙâÿÊ&Â>§þýïèØˆÑ÷þ€rY_°¹ÿCÌ@íó:ïöƒ0„þú”b÷±²ÿG Xѱñl?ÓjB=Ÿoû $<ӕ>ÂŒ.dµ€`Ôw]ò‰¿Ò¬lý²Óû`Ÿž˜þ‚Wæ éy™·õ DŽó\þ ã@#êå¿ŠÖ c|žgö‚ÙTŸ‘ý÷ÙÓ?Ê&“}þøÿèØˆÑYþprp¯°©CÌ@øó8¿öƒ0ŸüŸ% ú”b ²cG Yηñl_ÓjDœŸwû Jöӕ>ÂŒ.dÅ `ӟ1ò‰ÿÒ¬l}²ßûZŠž„þ‚Cæ S]ù¢/õ DÞôjþ ã>áêÏ¿ŠÖ cü›§ö‚ÙI!ÿ±ýÛÙž?Ê&ÂèUþ÷¿è؈ÿÑ3þprˆ7°†ÿCÌ@íó4öƒ0ŸrŸ/;ú”B ﳩÿG ZËÁñgÿÓj@œžçû Š”bӕ>ÂŒ.dÔÀ`ÒÇòuŸÒ¬jý°KûU.¿ž&þ‚Eïƒßæ ”Òyªïõ D~õþ ã= #ê¬ÿŠÖ d|—Wö‚Ù>)¿YýïÙ­?Ê&Ã=0þ÷¿è؈_Ñ5þ€rŸï°bCÌ@ëó/ßöƒ0Üéþ5Çú”‚ ‡ŽzG [ÈÅñv?ÓjBœ «û ƏÓ>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó•>ÂŒ.dä``Ñîùòg¿Ò¬kœ®“ûO·/óþ‚?ï}?æ ÖFùŽWõ Ä.ö°þ ã<^·êŠÿŠÖ i|“ö‚Ù32_Cýãي?Ê&Ò þûoèØˆÿѧþ€r·×°BCÌ@îó+ßöƒ0ûb~9?ú”b ŽéG \ÅÓñoÓjB}ŸÏû Ö|ŽÓ•>ÂŒ.dô`ÑëòKßÒ¬m}«ûJ?þ‚=ïsæ »ùŒÿõ Þ÷Æþ ã;GêwŠÖ küŸö‚Ù(;_ÇýûÙz¿Ê&ÃæðþøßèØˆ_ÑSþprÏç°4ÿCÌ@ïó*öƒ1Ü~8³ú”b ŽÖÿG ]Âáñm¿ÓjBœŸ—û Lß=ӕ>ÂŒ.e `Ð>ãò0¿Ò¬k}§·ûDÈ¿×þˆ‚1ïy¿æ Y3ùŸ?õ ÷îþ ã9ÛÃꚿŠÔ iü•ö‚ÙDŸ-ý ه¿Ê&Ä;ÓþþïèØˆ?Òþprè°@CÌ@ìó+öƒ18W~5Ãú”‚ ׎wÿG ^¿ßñ˜ŸÓjC=€óû ÖO¥Ó•>ÂŒ.e@`ÏfÙò*_Ò¬mýŠçû¡?QϞþ‚9ïæ š¬yŸŸõ .÷øþ ã8šCê·¿ŠÔ jü˜§ö‚ÙN_Ñý/ٜ?Ê&Đ»ÿè؈ßÒeþ€r—°#CÌ@èó'ïöƒ1VÎþ;“ú”B µ1ÿG _Œïñš¿ÓjBý¥3û üjӕ>ÂŒ.e"à`ΎÑò-Ò¬lý§Cû¡9Û?žþˆ‚5ïÿæ Ü$ù¿gõ Dîøþ ã7X¿êå?ŠÔ tüž_ö‚ÙY?ýم¿Ê&Äåšÿ_èØˆ_ÒAþpr?°ÿCÌ@çó$/öƒ1uGþ=kú”b ϵlG `ºñœ?ÓjDý¥cû È-­Ó…>ÂŒ.e2€€`ͶÉòAÒ«l}©Çû¡4dïž þ‚1ï€æ ˜yÍoõ þùÑþ ã6떿ŠÒ }üއö‚Øüd¿UýÙlÿÊ&Å:˜ÿèØˆÿÒ7þ€r2¯éCÌ@åó ŸöŒ6âþ3úmBÇŽœÿh÷@ Ӆ>ÂŒ.eB €`ÌÞÕò2¿Ò¬lœ§÷û¡.îïäþ‚Kï{_æ _ ùØïõ þû@þ ã4ÕoëüŠÔ ‚|Á7ö‚Øñpoý?Ùp¿Ê&ŏ‹ÿÿèØˆ¿ÒUþ€rK¯ÐCÌ@éóöŒV†>1ÓúmBïŽuhÔúӅ>ÂŒ.eQÀ€`Ìáò3ßÒ¬k}š#û¡)y/Ëþˆ‚Gïx_æ  ˆyӏõ Äú•þ ã3“çì??ŠÔ ˆüɗö‚Øæ|ÿ9ýÙi¿Ê&Åä‚ÿèØˆÒYþprdW¯¶ÿCÌ@çóOöŒv(þ2WúmB Ž„ÿdþ?œÓ…>ÂŒ.ea`€`Ë.ûò!Ò¬i=¥Ëû¡$Ÿãþˆ‚Aï{æ âyÒgõ îúoþ ã2R_샿ŠÔ ‹|Ò/ö‚ØÛŠ_7ýÙIÊ&Æ9~þüïèØˆ¿ÑÑþpr}¿¯ŸÿCÌ@âóöŒ•ÌŸ0÷úmB÷ŽYdC©ÕӅ>ÂŒ.eq€`ÊWòÿÒ¬f}€Ãû¡ŽOž þ‚ï€?æ #~ùËõ Ÿù†þ ã1ß캿ŠÖ ˆ|Ù/ö‚ØÐ—ÿýÏÙEÿÊ&Ǝ~þ÷ÏèØˆ?Ñ/þ€r—O¯›ÿCÌ@çóÿöŒµq>.úmb·³ýÿh@ Ó>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó…>ÂŒ.e€ €`É/ò*ßÒ¬b=§û¡_åþ‚Oï{æ döùϏõ .úþ ã/ÏwìžÿŠÖ †|Øïö‚ØÅŠOý7Ù,ÿÊ&Æã‚þñ¿è؈¿Ðkþ€r±¯šÿCÌ@âóßöŒÕ~,ÇúmB³ÒÿhšRKӅ>ÂŒ.e@€`ȧWò#ÿÒ¬aœŠ+û¡€Ÿðþ‚=ï|¿æ ŠoùÑçõ DÎú^þ ã.ŽìžÿŠÖ ƒüÕ·ö‚غµ?gýÿÙ.ÿÊ&Ç8ˆþï?èØˆ¿Ðþ€r˯„ÿCÌ@áóöŒô¹Ÿ+¯úmbç³®ÿhøËӅ>ÂŒ.eŸà€`ÇϏòŸÒ¬_œ¢cû¡0ž/þ‚)æ çìùʧõ Äùvþ ã-LÏì`ŠÖ €|Íïö‚دĿ!ýëÙ&Ê&Ǎ“þèoèØˆÏ=þ€r寫CÌ@æóßö_Ÿ&ÏúmBϳdàs˜Ó…>ÂŒ.e¯€€`Æ÷Çñö?Ò¬\} ‡û¡»ïùþ‚Iï}ÿæ )cùÒwõ Ÿúoþ ã, ì?ŠÖ }ü§ö‚Ø€Ô¿ýÓÙ#ÿÊ&ÇâžþêßèØˆύþ€rÿg¯­ÿCÌ@àó?ö4>&CúmBϳÿhGÛžÓ…>ÂŒ.e¿ €`Æ ñØÒ¬\œœËû¡Gÿþþˆ‚=ï~¿æ jÝùÓ_õ ÞúŒþ ã*ÊOë°¿ŠÖ yü·÷ö‚Ø™å_÷ýƒÙ!?Ê&È7°þä/èØˆ?ηþ€rϯéCÌ@æó öSšþ%{úmB¯²çh·öSӅ>ÂŒ.eÎÀ€`ÅHSñÀ_Ò­Z=™Çû¡ýÔ_Ûþ‚Gïyÿæ ¬Syß¿õ Nüþšã)‰ ëhŠÖ p|®ïö‚ØŽö¿mý×Ù¿Ê&ȌÆþÛßèØˆ¿Í«þ€r4w¯ÿCÌ@éó#OösMŸ%[úmB²âÿh*ÊӅ>ÂŒ.eÞ`€`ÄpŸñ®ßÒ­Zý—›û¡ø`ÿÅþˆ‚5ïw?æ íÇùï_õ ^þþšã(G¿ë9ÿŠØ qü©ö‚؄ߓýߨôÊ&ÈáÝþÚ_èØˆÍ}þprOG°.CÌ@îó)?ö’óŸ"¿úmb_²ŽÿhÿKӅ>ÂŒ.eî€`Øùñ‰ßÒ­Y=’ûû¡òíϝÜþ‚+ïyÿæ /Aùñ‡õ ŸþOþšã'oë?ŠÖ sü€ßö‚ØyŸ¡ý«ØÖ?Ê&É6ùþÔÿèØˆ?ÌÓþprj_°ÿCÌ@îó'_ö²˜Ÿ#úmBG²˜ÿhﰫӅ>ÂŒ.eý €`ÂÁañP¿Ò­V=‹Óû¡ízÿ¬þˆ‚1ïtæ p»ùó¿õ Dþ”þšã%Å#êò¿ŠÖ qü 7ö‚Øn.ÿý§Ø³ÿÊ&ɌþÐ/èØˆßÌ9þ€r…‡°`ÿCÌ@ïó/öÒ=>%7úmb²Þh!–5Ӆ>ÂŒ.f @€`ÁéËñ"ÿÒ­Rœ†û¡è[þ‚Aïi¿æ ²5y÷ÿõ Ä.ÿþšã$ƒËêïŠÖ nüŸÏö‚ØcBÿ‰ýߨ“¿Ê&Éá8þÒ_èØˆ_Ìþ€r ï°{ÿCÌ@ìó2Ïöñâþ$ËúmBDzÑh¥®Ó>âŒ–êµøŽ¹_¶O Gt|PK‡°Ó?ŒAOAD/M_T309Ž—Ó…>ÂŒ.fà€`Á3ñ Ò­S=ƒû¡â–/;þˆ‚;ïeßæ ó¯ùùÏõ ÄîÿTþšã#BêÐ?ŠÖ nü›ïö‚ØXWŸaý!ÏØn?Ê&Ê6`þÈèØˆ_ËEþ€rŒ°«ÿCÌ@ïó8ßöŽˆ>&úmBo²ühù—Ó…>ÂŒ.f,€€`À:ðû¿Ò­Tý7û¡Ý$,þ‚+ïcÿæ 5.yòõ Ä~þ^þšã";ꟿŠÖ rü•ßö‚ØMlŸÇý!ËØZÊ&ʋ‰þÅèØˆ?ÊÕþprØO°·CÌ@îó:_öŽ1.~%wúmbW²æÿdÅ=ýӅ>ÂŒ.f< €`¿c ðóŸÒ­T}€7û¡ײ_œ÷þˆ‚ï]Ÿæ vŠùùÇõ Ä~ÿTþšã ¿çêÿŠÖ rü•·ö‚ØB‚?#ý›ØF?Ê&ÊàŽþÅŸèØˆ?ÊãþprôO°ÁÿCÌ@ðó;ŸöŽPÔ~%óúmB?²õÿd^?) gpsd-3.15/test/sample.aivdm0000664000175000017500000011151212506166555014043 0ustar esresr# Sample AIVDM data sentences provided from real data by Kurt Schwehr # Mike Greene, Neal Arundale, and AISHub. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # # Type 1: # From Kurt Schwehr. Dump was attached. # Checked using the noaadata tools and the Maritec decoder. !AIVDM,1,1,,A,15RTgt0PAso;90TKcjM8h6g208CQ,0*4A # MessageID: 1 # RepeatIndicator: 0 # UserID: 371798000 # NavigationStatus: 0 # ROT: -127 # SOG: 12.3 # PositionAccuracy: 1 # longitude: -123.395383333 # latitude: 48.38163333333 # COG: 224 # TrueHeading: 215 # TimeStamp: 33 # RegionalReserved: 0 # Spare: 0 # RAIM: False # state_syncstate: 0 # state_slottimeout: 2 # state_slotoffset: 1249 # # Type 1: # From Kurt Schwehr. Dump was attached. Checked using the noaadata tools. !AIVDM,1,1,,A,16SteH0P00Jt63hHaa6SagvJ087r,0*42 # MessageID: 1 # RepeatIndicator: 0 # UserID: 440348000 # NavigationStatus: 0 # ROT: -128 # SOG: 0 # PositionAccuracy: 0 # longitude: -70.7582 # latitude: 43.08015 # COG: 93.4 # TrueHeading: 511 # TimeStamp: 13 # RegionalReserved: 0 # Spare: 0 # RAIM: False # state_syncstate: 0 # stare_slottimeout: 2 # state_slotoffset: 506 # # Type 2: # From Kurt Schwehr. Dump was attached. Checked using the noaadata tools. # I had to regenerate the CRC32 for this one myself, it was missing in # Kurt's original. !AIVDM,1,1,,B,25Cjtd0Oj;Jp7ilG7=UkKBoB0<06,0*60 # MessageID: 2 # RepeatIndicator: 0 # UserID: 356302000 # NavigationStatus: 0 # ROT: 127 # SOG: 13.9 # PositionAccuracy: 0 # longitude: -71.62614333333333333333333333 # latitude: 40.39235833333333333333333333 # COG: 87.7 # TrueHeading: 91 # TimeStamp: 41 # RegionalReserved: 0 # Spare: 0 # RAIM: False # state_syncstate: 0 # state_slottimeout: 3 # state_slotoffset: 6 # # Type 3: # From Kurt Schwehr. Dump was attached. Checked using the noaadata tools. !AIVDM,1,1,,A,38Id705000rRVJhE7cl9n;160000,0*40 # MessageID: 3 # RepeatIndicator: 0 # UserID: 563808000 # NavigationStatus: 5 # ROT: 0 # SOG: 0 # PositionAccuracy: 1 # longitude: -76.32753333333333333333333333 # latitude: 36.91 # COG: 252 # TrueHeading: 352 # TimeStamp: 35 # RegionalReserved: 0 # Spare: 0 # RAIM: False # state_syncstate: 0 # state_slottimeout: 0 # state_slotoffset: 0 # # Type 4: # From Kurt Schwehr. Dump was attached. # Checked using the noaadata tools and the Maritec decoder. !AIVDM,1,1,,A,403OviQuMGCqWrRO9>E6fE700@GO,0*4D # MessageID: 4 # RepeatIndicator: 0 # UserID: 3669702 # Time_year: 2007 # Time_month: 5 # Time_day: 14 # Time_hour: 19 # Time_min: 57 # Time_sec: 39 # PositionAccuracy: 1 # Position_longitude: -76.35236166666666666666666667 # Position_latitude: 36.88376666666666666666666667 # fixtype: 7 # Spare: 0 # RAIM: False # state_syncstate: 0 # state_slottimeout: 4 # state_slotoffset: 1503 # # Type 5: # From Kurt Schwehr. Dump was attached. # Checked using the noaadata tools and the Maritec decoder. !AIVDM,2,1,1,A,55?MbV02;H;sjR0600V:C0>da4P106P00,2*02 # AIS channel:1 # Message ID=6 # Repeat Indicator=0 # Source ID (MMSI)=992509976 # Sequence number=0 # Destination ID (MMSI)=2500912 # Retransmit flag =0 # Spare =0 # Binary Data # Application identifier=0x3ACA(15050) # DAC=235(Specific) # Function identifier =10(GLA) # Application data: # Analogue internal=0x112->13.700V # Analogue input1=0x1->0.050V # Analogue input2=0x1->0.050V # AtoN status=0x14:Racon status=2(RACON operational), Ligth # status=2(light OFF), Good health=0(good health) # Digital status=0x00:In7=0,In6=0,In5=0,In4=0,In3=0,In2=0,In1=0,In0=0 # Off position=0x00 # Spare=0x00 !AIVDM,1,1,4,B,6>jR0600V:C0>da4P106P00,2*02 # # From AISHub. This type 6 has no data. It's paired with the # following type 7; both are verified by the match in the MMSI fields. # This one is fully verified by the Maritec decoder. !AIVDM,1,1,,A,63u?;TP0`QJ<06P000,4*43 # Message Type : 6 # Repeat Indicator : 0 # MMSI : 265538450 # Sequence Number : 0 # Destination MMSI : 2655651 # Retransmit flag : 0 # DAC : 1 # FID : 40 # Data : 16:0000 # # FIX-ME: We need a type 6 test case that requires more than one AIVDM fragment. # # Type 6: # Advertised as DAC 1, FID 12, but full of garbage. !AIVDM,1,1,,A,63LBA4;WBevJ04k0=@E=B0td,0*17 # Advertised as DAC 1, FID 14, but full of garbage !AIVDM,1,1,,A,6h2E:81>NmKC04p0J<000?vv20Ru,0*31 # Advertised as DAC 1, FID 18, but full of 0 !AIVDM,1,1,,B,6h2E3MDrDRiB0580@00000000000,0*04 # Type 7: # From AISHub - reported immediately after the preceding type 6, # which matches it. One destination MMSI. noaadata-0.43 fails # on this message (Kurt says his decoder only handles the longest case). !AIVDM,1,1,,A,702R5`hwCjq8,0*6B # Message Type : 7 # Repeat Indicator : 0 # MMSI : 2655651 # MMSI number 1 : 265538450 # # Type 7: # From Kurt Schwehr. Three destination MMSIs. # noaadata-04.2 fails on this message !AIVDM,1,1,,A,7IiQ4T`UjA9lC;b:M, seems to be military traffic # with a mis-entered MMSI. !AIVDM,2,1,6,A,8>qc9wiKf>d=Cq5r0mdew:?DLq>1LmhHrsqmBCKnJ50,0*30 !AIVDM,2,2,6,A,3OLc=UCRp,0*4A,b003660465 # Message Type 8 # Repeat Indicator 0 # MMSI 999999999 # DAC 366 # FID 22 # Data 256:eb0d4f917a035b2dfca3d4739381735c18ebbe754936f66850037dcacd9538b8 # # Type 8, DAC 1, FID 11 (IMO 236 Met/Hydro message) # From Christian Gagneraud: # Specific NMEA messages with hard-coded Met/hydro values have been # send to a Kanaton, according to its default input settings # ($_HDXX,VAL*CS, where XX is the parameter index, 0 to 30, VAL is the # scaled parameter value, and CS the checksum). The resulting AIVDO # sentence has been decoded using the Kanaton software. Sent data, # kanaton decoder output and gpsd JSON output all match each other. !AIVDO,1,1,4,B,8>jR06@0Bk3:wOli;<`WPhh<1rqVBQf2V@Pdt0J82avIM2b<jR06@0Bk3:wOli;<`WPhh<1rqVBQf2V@Pdt0J82avIM2b<jR06@0Bk3:vOli;L`nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwt1,2*0E # "18/05/2012 18:45:37" !AIVDO,1,1,4,B,8>jR06@0Bk3:vOli;L`nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwt1,2*0E # AIS channel:1 # Message ID=8 # Repeat Indicator=0 # Source ID (MMSI)=992509977 # Spare=0 # Binary Data # Application identifier=0x004B(75) # DAC=1(International) # Function identifier =11(Reserved for international operational applications) # Application data: # Latitude=0x30CAF9(53°017.689 N) # Longitude=0x59DA5(006°008.037 W) # Date and time=0x946D(18 17h45m) # Average wind speed=0x7F(127 kts) # Wind gust=0x7F(127 kt(s)) # Wind direction=0x1FF(511 degree(s)) # Wind gust direction=0x1FF(511 degree(s)) # Air temperature=0x7FF(144.7 degree(s) Celcius) # Relative humidity=0x7F(127percent) # Dew point=0x3FF(82.3 degree(s) Celcius) # Air pressure=0x1FF(1311 hPa) # Air pressure tendency=0x3(3()) # Horizontal visibility=0xFF(25.5 NM) # Water level=0x1FF(41.1 m) # Water level trend=0x3(3 hPa) # Surface current speed=0xFF(25.5 kts) # Surface current direction=0x1FF(511 degree(s)) # Current speed #2=0xFF(25.5 kts) # Current direction #2=0x1FF(511 degree(s)) # Current measuring level #2=0x1F(31 m) # Current speed #3=0xFF(25.5 kts) # Current direction #3=0x1FF(511 degree(s)) # Current measuring level #3=0x1F(31 m) # Significant wave height=0xFF(25.5 m) # Wave period=0x3F(63 Sec) # Wave direction=1FF(511 degree(s)) # Swell height=0xFF(25.5) m # Swell period=0x3F(63 Sec) # Swell direction=0x1FF(511 degree(s)) # Sea state=0xF(15 Beaufort) # Water temperature=0x3FF(92.3 degree(s) Celcius) # Precipitation=0x7(7 according to WMO) # Salinity=0x1FF(51.1 permil) # Ice=0x3(3) # # Type 8, DAC 1, FID 31 (IMO 289 Met/Hydro message) # From Christian Gagneraud: # Kanaton3 with all data marked as not available, checked with KanAton3_configV2.0.4.exe !AIVDO,1,1,5,A,8>jR06@0Gwli:QQUP3en?wvlFR06EuOwgwl?wnSwe7wvlOwwsAwwnSGmwvh0,0*51 # AIS channel:1 # Message ID=8 # Repeat Indicator=0 # Source ID (MMSI)=992509977 # Spare=0 # Binary Data # Application identifier=0x005F(95) # DAC=1(International) # Function identifier =31(Reserved for international operational applications) # Application data: # Longitude=0x59DAC(006°008.044 W) # Latitude=0x30CB00(53°017.696 N) # Pos. acc.=0 # Date and time=0xEDD8(29 23h24m) # Average wind speed=0x7F(127 kts) # Wind gust=0x7F(127 kt(s)) # Wind direction=0x168(360 degree(s)) # Wind gust direction=0x168(360 degree(s)) # Air temperature=0xFFFFFC00(-102.4 degree(s) Celcius) # Relative humidity=0x65(101percent) # Dew point=0x1F5(50.1 degree(s) Celcius) # Air pressure=0x1FF(1310 hPa) # Air pressure tendency=0x3(3(Not available)) # Horizontal visibility=0x7F(12.7 NM) # Water level=0xFA1(30.01 m) # Water level trend=0x3(3) # Surface current speed=0xFF(25.5 kts) # Surface current direction=0x168(360 degree(s)) # Current speed #2=0xFF(25.5 kts) # Current direction #2=0x168(360 degree(s)) # Current measuring level #2=0x1F(31 m) # Current speed #3=0xFF(25.5 kts) # Current direction #3=0x168(360 degree(s)) # Current measuring level #3=0x1F(31 m) # Significant wave height=0xFF(25.5 m) # Wave period=0x3F(63 Sec) # Wave direction=168(360 degree(s)) # Swell height=0xFF(25.5) m # Swell period=0x3F(63 Sec) # Swell direction=0x168(360 degree(s)) # Sea state=0xD(13 Beaufort) # Water temperature=0x1F5(50.1 degree(s) Celcius) # Precipitation=0x7(7 according to WMO) # Salinity=0x1FE(51.0 permil) # Ice=0x3(3) # # Type 8, DAC 200, FID 10 (Inland AIS Ship Static and Voyage Data) # Paul Courbis !AIVDM,1,1,,B,83aDChPj2d !AIVDM,2,1,4,A,83aDChPj2dp2JqA6wimt:Ow,0*22 !AIVDM,2,2,4,A,UPP8k;JvOeD,2*7F # Message type : 8 # Repleat Indicator : 0 # MMSI : 244650946 # DAC : 200 # FID : 10 # data : 368:c32c70cf5d370c3064fa50198800b4987e9555557e083a544f082003b809ae511bfc75f0a7ff960808ccb6be7ed5 # # Type 9: # From AISHub. Checked with the noaadata tools. !AIVDM,1,1,,A,91b77=h3h00nHt0Q3r@@07000<0b,0*69 # Message Type : 9 # Repeat Indicator : 0 # MMSI : 111265591 # Altitude : 15 # SOG : 0 # Position Accuracy : 0 # Longitude : 7128960 # Latitude : 34667073 # Course Over Ground : 0 # Time Stamp : 28 # Regional reserved : 0 # DTE : 0 # Assigned : 0 # RAIM flag : 0 # Radio status : 24597 # # Type 10: # From Kurt Schwehr. Two destination MMSIs. Checked with the noaadata tools. !AIVDM,1,1,,B,:5MlU41GMK6@,0*6C # MessageID: 10 # RepeatIndicator: 0 # UserID: 366814480 # Spare1: 0 # DestID: 366832740 # Spare2: 0 # # Type 10: # From Mike Greene. One destination MMSI. Decode is known good. !AIVDM,1,1,,B,:6TMCD1GOS60,0*5B,s36310,d-081,T59.01777335 # Message Type: 10 # Repeat Indicator: 0 # MMSI: 440882000 # Destination MMSI: 366972000 # # Type 11: # From Kurt Schwehr. Checked with the noaadata tools. # Message has Coast Guard extended fields following !AIVDM,1,1,,B,;4R33:1uUK2F`q?mOt@@GoQ00000,0*5D,s28089,d-103,T39.44353985,x147521,r08TPHI1,1242958962 # MessageID: 11 # RepeatIndicator: 0 # UserID: 304137000 # Time_year: 2009 # Time_month: 5 # Time_day: 22 # Time_hour: 2 # Time_min: 22 # Time_sec: 40 # PositionAccuracy: 1 # Position_longitude: -94.40768333333333333333333333 # Position_latitude: 28.40911666666666666666666667 # fixtype: 1 # Spare: 0 # RAIM: False # state_syncstate: 0 # state_slottimeout: 0 # state_slotoffset: 0 # # Type 12: # From AIS Hub via Neal Arundale. Dumps by ais.py. # Verified by the text being readable. !AIVDM,1,1,,A,<02:oP0kKcv0@<51C5PB5@?BDPD?P:?2?EB7PDB16693P381>>5H0,4*4C # Message Type : 12 # Repeat Indicator : 0 # MMSI : 351853000 # Sequence Number : 1 # Destination MMSI : 351809000 # Retransmit flag : 0 # Text : THANX !AIVDM,1,1,,A,<42Lati0W:Ov=C7P6B?=Pjoihhjhqq0,2*2B # Message Type : 12 # Repeat Indicator : 0 # MMSI : 271002099 # Sequence Number : 0 # Destination MMSI : 271002111 # Retransmit flag : 1 # Text : MSG FROM 271002099 !AIVDM,1,1,,A,9P81?f31<P81@9P>5GPI9BP?5?Per18=HB1U:1@E=B0m3R1p10E3;;R0USCR0HO>0@gN10kGJp,2*7F # Message Type : 14 # Repeat Indicator : 0 # MMSI : 237008900 # Text : EP228 IX48 FG3 DK7 PL56. !AIVDM,1,1,,A,>4aDT81@E=@,2*2E # Message Type : 14 # Repeat Indicator : 0 # MMSI : 311764000 # Text : TEST # # Type 15: # From Mike Greene. This is the 88-bit variant with one MMSI, # message type and offset. Decode is known good. !AIVDM,1,1,,A,?5OP=l00052HD00,2*5B # Message Type: 15 # Repeat Indicator: 0 # MMSI: 368578000 # Destination MMSI: 5158 # First Message Type: 5 # First Slot Offset: 0 # # Type 15: # From Kurt Schwehr. This is the 108/112-bit variant with one MMSI and two # message types. Includes USCG metadata. Decode is known good. !AIVDM,1,1,,B,?h3Ovn1GPio;WlWuwH`W1PpnuN;h00Fc>jpUlNV@ikwpUoP06,0*4C # MessageID: 18 # RepeatIndicator: 0 # UserID: 338087471 # Reserved1: 0 # SOG: 0.1 # PositionAccuracy: 0 # longitude: -74.07213166666666666666666667 # latitude: 40.68454 # COG: 79.6 # TrueHeading: 511 # TimeStamp: 49 # RegionalReserved: 0 # Spare: 0 # RAIM: True # CommStateSelector: 1 # CommState: 393222 # Type 18: # From Kurt Schwehr. Checked with the noaadata tools. !AIVDM,1,1,,A,B52KB8h006fu`Q6:g1McCwb5oP06,0*00 # MessageID: 18 # RepeatIndicator: 0 # UserID: 338088483 # Reserved1: 0 # SOG: 0 # PositionAccuracy: 0 # longitude: -70.8111966 # latitude: 43.11555833 # COG: 171.6 # TrueHeading: 511 # TimeStamp: 20 # RegionalReserved: 0 # Spare: 0 # RAIM: True # CommStateSelector: 1 # CommState: 393222 # Type 18: # From Kurt Schwehr. Checked with the noaadata tools. !AIVDM,1,1,,B,B5O6hr00NhWAwwo862PaLELTBJ:V00000000S0D:R220,0*0B # MessageID: 19 # RepeatIndicator: 0 # UserID: 367059850 # Spare: 0 # SOG: 8.7 # PositionAccuracy: 0 # longitude: -88.8103916667 # latitude: 29.543695 # COG: 335.9 # TrueHeading: 511 # TimeStamp: 46 # Spare2: 0 # name: CAPT.J.RIMES # shipandcargo: 70 # dimA: 5 # dimB: 21 # dimC: 4 # dimD: 4 # fixtype: 1 # RAIM: False # DTE: 0 # Spare3: 0 # # Type 20 (1 offset) # From Mike Greene. Checked with the noaadata tools. !AIVDM,1,1,,A,Dh3OvjB8IN>4,0*1D # Message Type: 20 # Repeat Indicator: 3 # MMSI: 3669705 # Offset 1: 2182 # Reserved Slots 1: 5 # Timeout 1: 7 # Increment 1: 225 # # Type 20 (3 offsets): # From Mike Greene. !AIVDM,1,1,,B,D030p8@2tN?b<`O6DmQO6D0,2*5D # Message Type: 20 # Repeat Indicator: 0 # MMSI: 3160097 # Offset 1: 47 # Reserved Slots 1: 1 # Timeout 1: 7 # Increment 1: 250 # Offset 2: 2250 # Reserved Slots 2: 1 # Timeout 2: 7 # Increment 2: 1125 # Offset 3: 856 # Reserved Slots 3: 5 # Timeout 3: 7 # Increment 3: 1125 # # Type 21: # Has a Name Extension field # From Mike Greene. Decode is verified by the text being readable. # Also checked against the Maritec decoder, which verifies # everything except the Regional Reserve field. !AIVDM,2,1,5,B,E1mg=5J1T4W0h97aRh6ba84gOP00PH=JrN9l000?wB2HH;,0*44 # # Type 23: # From AISHub. Only a regression test to check that the C and Python decoders # do the same thing, not yet checked against other decoders. !AIVDM,1,1,,B,G02:Kn01R`sn@291nj600000900,2*12 # Message Type : 23 # Repeat Indicator : 0 # MMSI : 2268120 # NE Longitude : 1578 # NE Latitude : 30642 # SW Longitude : 1096 # SW Latitude : 30408 # Station Type : 6 # Ship Type : 0 # Tx/Rx mode : 0 # Reporting interval : 9 # Quiet time : 0 # # Type 24: # From Nirgal # One pair of type A and Type B messages. # Checked against the Maritec decoder. !AIVDM,1,1,,A,H42O55i18tMET00000000000000,2*6D # MessageID: 24 # RepeatIndicator: 0 # UserID: 271041815 # partnum: 0 # name: PROGUY !AIVDM,1,1,,A,H42O55lti4hhhilD3nink000?050,0*40 # MessageID: 24 # RepeatIndicator: 0 # UserID: 271041815 # partnum: 0 # shipandcargo: 60| # vendorid: 1D00014 # callsign: TC6163 # dimA: 0 # dimB: 15 # dimC: 0 # dimD: 5 # # Type 25: # From Christian Gagneraud via aishub # Addressed and structured !AIVDM,1,1,,A,JB3R0GO7p>vQL8tjw0b5hqpd0706kh9d3lR2vbl0400,2*40 # # Type 25: # From Christian Gagneraud via aishub # Addressed and not structured !AIVDM,1,1,,A,I6SWo?8P00a3PKpEKEVj0?vNP<65,0*73 # # Type 25: # From Christian Gagneraud via aishub # Broadcast and structured !AIVDM,1,1,,A,I8IRGB40QPPa0:vQL8tjw0b5hqpd0706kh9d3lR2vbl0400,2*40 # # Type 26: # From Christian Gagneraud via aishub # Addressed and not structured !AIVDM,1,1,,A,J1@@0IK70PGgT740000000000@000?D0ih1e00006JlPC9C3,0*6B # # Type 26 # From Christian Gagneraud via aishub # Broadcast and structured !AIVDM,1,1,,B,JaL0mr5P000DtRDMddr@0?vF06iD,0*75 # # Type 26 # From Christian Gagneraud via aishub # Broadcast and not structured !AIVDM,1,1,,A,J0@00@370>t0Lh3P0000200H:2rN92,4*14 # # Type 27: # From Christian Gagneraud via aishub # The only message 27 in more than 25 millions messages that is 96 bits long! !AIVDM,1,1,,A,KCQ9r=hrFUnH7P00,0*41 # # Type 27: # From Marius Kintel # It's apparently more common for these to be 168 bits long (a full slot) !AIVDM,1,1,,B,KC5E2b@U19PFdLbMuc5=ROv62<7m,0*16 # ############################################################################## # Invalid packet tests: ############################################################################## # # That fragment misses part 1, yields nothing: AIVDM,2,2,1,B,00000000000,2*26 # # ############################################################################## # Type 24 collisions: ############################################################################## # # 24B from 271041815: # This sentence is missing 24A and is discarded !AIVDM,1,1,,A,H42O55lti4hhhilD3nink000?050,0*40 # gpsdecode: AIVDM message type 24 collision on channel A: 24B sentence from 271041815 without 24A. # # 24A from mmsi 271041511: # context is updated !AIVDM,1,1,,A,H42O3qiA8U10Tp0000000000000,2*37 # # 24A from mmsi 271040660: # Previous 24A from 271041511 is discarded, context is updated !AIVDM,1,1,,A,H42O0U0Lu`@Dno4000000000000,2*18 # gpsdecode: AIVDM message type 24 collision on channel A : Discarding previous sentence 24A from 271041511. # # 24B from mmsi 271020195: # Saved in context, but without a valid 24A it's never emitted. !AIVDM,1,1,,A,H42Mh`lUi2hhljiI=mikk000B050,0*17 # # 24B from mmsi 271040660: # Success !AIVDM,1,1,,A,H42O0U4Ui3hhhlmI=mmhl000H060,0*2E # ############################################################################## # Channel multiplexing test: ############################################################################## # simultaneous use of buffers of channels A & B !AIVDM,2,1,6,B,542M92h00001@<7;?G0PD4i@R0220o0h:2240Ht50000000000,0*3B !AIVDM,2,1,2,A,542M92h00001@<7;?G0PD4i@R0220o0h:2240Ht500000000000000,0*3C !AIVDM,2,2,2,A,0000002,2*24 !AIVDM,2,2,6,B,00000000000,2*21 ############################################################################## # Error and corner case tests: ############################################################################## # Non printable and control character in data or string fields !AIVDM,1,1,,A,647sBv00b=E006P9>0,4*1B # Type 4 with date/time set to N/A !AIVDM,1,1,,A,402Fha0000Htt8700PS:,0*60 # Type 4 with year set to 10196 (0x27D4), idempotency used to fail on this one # It has a bad epfd as well. !AIVDM,1,1,,B,4>O7m7Iu@<9qUfbtm`vSnwvH20S8,0*46 # Type 22 with MMSI1=4059193694, used to fail due to UBITS() instead of SBITS() !AIVDM,1,1,,B,Fe3>>MOD@GDF?ThcoCk02?ioQie4,0*03 # A type 6, DAC 1, FID 18 with plenty of N/A fields, idempotency use to fail !AIVDM,1,1,,B,602E:s0tw@9B0580@00000000000,0*68 # A type 6, DAC 1, FID 30. used to fail idempotency !AIVDM,1,1,,B,6h2E3MPr # Date: 2009-01-21 # Comments: Has leading garbage, to test parity locking. # The date above is meaningless, added so gpsfake won't choke. # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. # YpgA_]qS@oglgyC|~oAxCJxqBHsDzu_FsHEfOXAdbwg@Es~]ywJ@x]Cxv^[_m_xRrLwzyBXQb`Z[@hMmOzbzjOXU}t_UUUEsHEfOXIfByS@oSpG|cBPAFvtGN}wl`xN@KsHEF}gV^]}g@EAx}~ywwWd\uv^{mrAÁðÜ×ðôÈGmÅÁäÞuLwzyBXye@bdWLhO{bz\pkJCE`jjJHsHEF}gZ\]Kl`_XHF|CNPAGvIxqBHSK{w_BsHEfOXUgB|__WSZ[{Iao~aJB`a@dPUrAsHEfOXM``}[`^yXOE]eVpcJAK`jjjzLwzYpgb[}BlP@lyC|}o^|aIxqBHSeFtÁðÜ×ðôÈÅÁäÞpLwzyBX}bBI`@@mQzZ{I\P~X]O`a@DbZ^CM|LwzYpg\Yq[`~MZKE]eQpMNlO`jjjzLwzYpgL^}Al`W^`F|c{onyNyGN}W^AGuwLwzyBXKeBG`@@leUdDbyouFYAt`}{w[VzG}LwzYpgd\u[`AihtzjZP@\z}G`jjJHsÁðÜ×ðôÈHÅÁäÞEF}gxX}Nl`[B@yC|tonx^}GN}W^FFv_HsHEF}gX_}G`~}SJ[{}oMBGpK_BdzCVxgsLwzyBXwd`x[`aMSeDUeP@lMK`jjjzLwzYpgP]}{S@_l{F|CKPqFjExqBha}yJ@@sHEfOX_fB~_A@e]rZ{]somclvK_BdzygÁðÜ×ðôÈ|ÅÁäÝGLsHEF}G^_Kd_nibVzjZR@l}Mt_UUUEsHEfOxPebFl`GGPyC\IPqEbAxqBha{yH`CsHEfOxpcB@`~_oTBZ{]wo}bVzK_BDHAxCxOsHEF}GWX_|[`qL\nEUeT@lzmJ`jjjzLwzYpGG_}~S@_Bx_G|CvoNyWwGN}wl_XM@}ÁðÜ×ðôÈLÅÁäÞwzYpG{[}M`~_~Y\[{]LP\XJyK_BDHixAXEsHEfOxTb`Md_NdYNEUe_@LuC`jjJHsHEF}GsY}qS@_ZG`yCKw_^_vf@@GTwK@|aAsHEfOxlabu_A`GQLZ{]uoKagEt`}{wRF~gKsHEF}GCZ_x[`IJ]jEUeS@LyEy_UUuwLÁðÜ×ðôÈwÅÁäÞzyBxbcBMl`[B`xCKA`qdqk@@GtEl~B^vLwzyBxRgBw_A`\d[{]DPdkGLt`}[EgxAxuLwzyBxJ``v[`IVXlEUEosGZI`jjjzLwzYpGe[]{S@_BX`F|Ts_V^y]xkHLC^vLwzyBxzbbp_APTYDZ{]yogPlCt`}{W_G|ÁðÜ×ðôÈGtÅÁäÞLwzyBxff@y[`I}UTDUecKBjF`jjJHsHEF}GI^}vS@_rsG|TG`YeZ]xkHd@^sLwzyBxNebB`~oIYhZ{}KPHhIsK_BdZkFzGpLwzyBx^c@}[`Ik[HDUEU@tzEL`jjjzLwzYpG~X}sS@_J~G|tu_z[yb@@GTw{`~aÁðÜ×ðôÈÅÁäÞLwzYpG^_}z_APiZH[{}voTQ|K_BDhbyCXFsHEfOxqd`Ed_vP~oEUe[@T{eF`jjJHsHEF}GV]}Fl`NU`F|tA`eaAh@@GtEH^D~|LwzYpGfY]N`~oLWPZ{]q_PW]@t`}{WYG~gwLwzyBxEa@z[`IoALzjZ`kAzx_UUuwLwÁðÜ×ðôÈzÅÁäÝyBxUebzS@_qj_xCKH`ueQn@@GtEPoA^|LwzYpGJ\]q_APsheDBs_hWkKt`}[eqyCXwLwzyBxmg@Md_vZumDUedkGzI`jjjzLwzYpGB_]pS@_iUHG|TB`mfE]x{Q@q~avLwzyBxCdBr_APKE@dDBL`[iHEt`}{WRGzÁðÜ×ðôÈGÅÁäÞyLwzYpGl]@d_v]vEEUEg[FZr_UUUEsHEfOxKfBNl`BioxCk~_B[il@@Gd\hp{AFsHEfOxkaBG`~olE`dDBG`shpsK_BdZtFgKsHEF}GDZJd_NdyaDUeo[CZA`jjJHsHEF}GX\]|S@_uPhF|T_\ZUb@@GDn{wC~BsÁðÜ×ðôÈHÅÁäÞEfOxWgBK`~oZyW[{]F`}IK|K_BDhyAxxLwzYpGp__u[`q@@qzjzj{BZy_UUuwLwzyBx_dbxS@_[ShF|T_LYC_x{Q\HaNsHEF}G@]}AH@V_ZSo|W`kGzIIa}GNtDDXxLwzYp{_Y[`QtBe{jZf{Cfs_UUUEsHÁðÜ×ðôÈEÅÁäÞfODpaBpS@_WoGyCK}_tZ]x{Qri|avLwzyBDHeBIH@fwfTPChW@d{Nv^BXCbDAXJsHEF}{g\_Id_^nI}{jzW@x{Y}_UUuwLwzyBDDgBS@xkgyCKv_dDXx{QVixatLwzyBDd`BvwyHjDQChn[CE}v^BXCndBxÁðÜ×ðôÈtÅÁäÞLwzyBDtd`v[`AQEK{jZoGEFM`jjjzLwzYp{S]}uS@fcgyCkD`[AmTx[cNWD^MsHEF}{cY]}wE|cxQCHS@dxF{v^BXCYUBXyLwzYp{}^Jd_Ab|TDUe[@XYv_UUUEsHEfODRebuS@QkWxC\~oUfNMxqBXjnPH@~ÁðÜ×ðôÈLÅÁäÞwzYp{M\}LH@Z]gXPCHn{EYLIa}GNkTGXqLwzyBDjg`p[`^q~HEUeigAft_UUUEsHEfODz`BrS@QkOyC\KPJZ^BxqBxX~~vEsHEfODFdBAH@j]oHQCHW@xxA@Ia}g\ws{GAsHEfODVb`~[`nlGO{jZhW@FO`jjjzLwzÁðÜ×ðôÈYÅÁäÞp{qY]pS@vZ`F|c{ombnFxqBxXn~wwLwzyBDnaBtwuVROn|w`gBisv^BxQmr|gCsHEfOD~e@fdWbKHzjzU@hyEv_UUUEsHEfODacbzS@ez_F|C@PB\JsGN}gUaAuJsHEF}{nX}MH@rJPOn|w`gFfxv^BXcA]AxÁðÜ×ðôÈqÅÁäÞLwzyBDI``S[@hEKHzjzU@h|ew_UUUEsHEfODYdbAl@ZEHyC\JP\XrtGN}gUqar_~LwzYp{F]}xwmGZon|WY@XzQCIa}g\LC{GCsHEfODef`ndWVzwDUenwBZp_UUUEsHEfODuab~S@~|gF|CHPtYPpGN}gUyPp}LwÁðÜ×ðôÈzÅÁäÞYp{rZ}JH@B_oPQCHT@h{y~v\B`RZ_GtLwzyBD]c@X[@h~wDUenwEzN`jjjzLwzYp{|X}@l@mMdxC\|o[ULGN}GgZnH@|LwzYp{\_}IH@|[Rwn|whWCANIc}_j_GpLwzyBDsd@ddWitwDUE\@p{eI`jjjzLwzÁðÜ×ðôÈYÅÁäÞp{T]]Gl@{CLxC\{ogR~HxqBXjrOK@JsHEF}{dY}OH@\ubpPCh[@H~~KIc}_J^{GCsHEfODGa`[[@hj|wDUenOAZE`jjJHsHEF}{hZ]vS@_oB\yC|poOR}wGN}gUCPv_LwzYp{H\]BH@laipQCH_@H|~tv\B@`MaDxtÁðÜ×ðôÈLwÅÁäÞzyBDog@^[@hBHH{jzcOGzF`jjJHsHEF}{@_}qS@_E{]F|c{oWoDxqBxXKQq{LwzYp[[]qwsuhHPCHaODvxv\B`RR^{grLwzyBdPb`cdWkyWEUeS@Pyes_UUUEsHEfOdHfB@l`iDJxC|G`wOCxqBxX{Qr}LÁðÜ×ðôÈwÅÁäÞzYp[W^}vwK_ghQChnwCRKIc}_B_{gKsHEF}[GZddWWNhzjz^@PzuH`jjjzLwzYp[[\}@l`SDzyC\G`{MoLxqBXj`oH@KsHEF}[kX]HH@dg`HQChewE\KIc}_|_{GLwzYp[s__[[@h@EhzjZl_DJ~_UUuwLwzyÁðÜ×ðôÈBÅÁäÞd\dbvS@oeAfyC\C`sM]IxqBXJoNK@wLwzyBd|bBpw{LoXQChjO@xGIc}_mcaDXOsHEF}[]Y_Z[@HgGhzjZl_Aj_UUuwLwzyBdrabuS@ohIvyC\L`CLutGN}guhps_HsHEF}[uZ}AH@xSZko|WhODhpv\B@`s`DXvÁðÜ×ðôÈLÅÁäÞwzyBdZc`adwL{WDUee_GJ|_UUuwLwzyBdFgBHlpNNnyC\O`MHaLxqBXJKwN@IsHEF}[Y_}~wg|otQCHX@p_GIc}_mKaDxzLwzYp[I[ldwRsWDUEW@@}UG`jjJHsHEF}[Q]]pS@w_DnyC|}_FpzIxqBXJCWO`OsHEÁðÜ×ðôÈFÅÁäÞ}[aY]JH@hCXKn|WU@pF@pv\B@`[`DxCsHEfOdAa@T[@HyOh{jzhEJF`jjJHsHEF}[nZ}yS@wvD^yC\K`IHi@xqBxxZhwKsHEF}[N\]wwX\Co|w]@p~HIc}_D_{GwLwzyBdig`Q[@H^~gEUEE@@@jy_UUuwLwzyÁðÜ×ðôÈBÅÁäÞdy`bAlhD@nyC|}_AqarGN}gunYr_KsHEF}[z[]MH@pGgrPCH`O@`xv\B`Rx^{g|LwzYp[j]_`dwy~gEUEE@@BRK`jjjzLwzYp[rY]qS@WlEAxC\G`VOz~GN}GGvfK@EsHEfOdmabGH@P_kJPChZ@H~Otv\B@`gaDxzLÁðÜ×ðôÈwzÅÁäÞYp[BZX[@HB{gEUEE@@Eru_UUUEsHEfOdccbMlX|EQyC|L`jKHKxqBXJ\GM@IsHEF}[lX}zwoGezQChhwBtsv\B@`w`DXqLwzyBdK``ddwkJXzjZH@@GRx_UUuwLwzyBd[dBDlXmHayK\D@hxsBxqBxxwxw_LwÁðÜ×ðôÈzÅÁäÞYp[D]}OH@`jfVQCHZ@HyCDIc}_mO`@xEsHEfOdgf`Y[@HPOXzjZH@`BRN`jjjzLwzYp[ gpsd-3.15/test/sample.rtcm2.chk0000664000175000017500000011035712461156335014537 0ustar esresr{"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":249.6,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":13,"udre":0,"iod":3,"prc":-26.120,"rrc":0.068},{"ident":2,"udre":0,"iod":73,"prc":1.220,"rrc":-0.080},{"ident":8,"udre":0,"iod":22,"prc":23.760,"rrc":0.030}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":250.8,"seqnum":2,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-58.560,"rrc":-0.256},{"ident":11,"udre":1,"iod":2,"prc":-39.900,"rrc":0.174}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":252.0,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.680,"rrc":-0.016},{"ident":7,"udre":0,"iod":15,"prc":25.660,"rrc":0.026},{"ident":26,"udre":0,"iod":128,"prc":12.840,"rrc":0.118}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":252.6,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":13,"udre":0,"iod":3,"prc":-25.940,"rrc":0.066},{"ident":2,"udre":0,"iod":73,"prc":0.920,"rrc":-0.080},{"ident":8,"udre":0,"iod":22,"prc":23.820,"rrc":0.014}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":253.8,"seqnum":5,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-59.520,"rrc":-0.224},{"ident":11,"udre":1,"iod":2,"prc":-39.260,"rrc":0.206}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":255.0,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.700,"rrc":-0.018},{"ident":7,"udre":0,"iod":15,"prc":25.740,"rrc":0.026},{"ident":26,"udre":0,"iod":128,"prc":13.240,"rrc":0.128}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":255.6,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":0.680,"rrc":-0.092},{"ident":13,"udre":0,"iod":3,"prc":-25.680,"rrc":0.084},{"ident":8,"udre":0,"iod":22,"prc":23.880,"rrc":0.000}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":256.8,"seqnum":0,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-60.560,"rrc":-0.244},{"ident":11,"udre":1,"iod":2,"prc":-38.620,"rrc":0.222}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":258.0,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.680,"rrc":-0.002},{"ident":7,"udre":0,"iod":15,"prc":25.880,"rrc":0.030},{"ident":26,"udre":0,"iod":128,"prc":13.700,"rrc":0.124}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":258.6,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":0.440,"rrc":-0.094},{"ident":13,"udre":0,"iod":3,"prc":-25.460,"rrc":0.080},{"ident":8,"udre":0,"iod":22,"prc":23.920,"rrc":-0.020}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":259.8,"seqnum":3,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-61.260,"rrc":-0.212},{"ident":11,"udre":1,"iod":2,"prc":-37.840,"rrc":0.242}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":261.0,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.740,"rrc":-0.006},{"ident":7,"udre":0,"iod":15,"prc":25.980,"rrc":0.034},{"ident":26,"udre":0,"iod":128,"prc":14.040,"rrc":0.116}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":261.6,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":0.120,"rrc":-0.088},{"ident":8,"udre":0,"iod":22,"prc":23.760,"rrc":-0.040},{"ident":13,"udre":0,"iod":3,"prc":-25.220,"rrc":0.090}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":262.8,"seqnum":6,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-61.820,"rrc":-0.212},{"ident":11,"udre":1,"iod":2,"prc":-36.800,"rrc":0.256}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":264.0,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.780,"rrc":0.002},{"ident":7,"udre":0,"iod":15,"prc":26.060,"rrc":0.032},{"ident":26,"udre":0,"iod":128,"prc":14.380,"rrc":0.120}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":264.6,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-0.180,"rrc":-0.084},{"ident":8,"udre":0,"iod":22,"prc":23.620,"rrc":-0.058},{"ident":13,"udre":0,"iod":3,"prc":-24.980,"rrc":0.094}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":265.8,"seqnum":1,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-62.540,"rrc":-0.166},{"ident":11,"udre":1,"iod":2,"prc":-35.840,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":267.0,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.820,"rrc":0.002},{"ident":7,"udre":0,"iod":15,"prc":26.140,"rrc":0.020},{"ident":26,"udre":0,"iod":128,"prc":14.700,"rrc":0.116}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":267.6,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-0.420,"rrc":-0.078},{"ident":8,"udre":0,"iod":22,"prc":23.380,"rrc":-0.078},{"ident":13,"udre":0,"iod":3,"prc":-24.640,"rrc":0.108}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":268.8,"seqnum":4,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-63.000,"rrc":-0.152},{"ident":11,"udre":1,"iod":2,"prc":-35.200,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":270.0,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.760,"rrc":0.010},{"ident":7,"udre":0,"iod":15,"prc":26.180,"rrc":0.016},{"ident":26,"udre":0,"iod":128,"prc":15.020,"rrc":0.112}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":270.6,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-0.680,"rrc":-0.066},{"ident":8,"udre":0,"iod":22,"prc":23.140,"rrc":-0.092},{"ident":13,"udre":0,"iod":3,"prc":-24.320,"rrc":0.124}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":271.8,"seqnum":7,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-63.500,"rrc":-0.120},{"ident":11,"udre":1,"iod":2,"prc":-34.240,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":273.0,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.860,"rrc":0.004},{"ident":7,"udre":0,"iod":15,"prc":26.140,"rrc":0.004},{"ident":26,"udre":0,"iod":128,"prc":15.280,"rrc":0.106}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":273.6,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-0.980,"rrc":-0.060},{"ident":8,"udre":0,"iod":22,"prc":22.720,"rrc":-0.108},{"ident":13,"udre":0,"iod":3,"prc":-24.120,"rrc":0.120}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":274.8,"seqnum":2,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-63.920,"rrc":-0.116},{"ident":11,"udre":1,"iod":2,"prc":-33.280,"rrc":0.320}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":276.0,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.920,"rrc":0.006},{"ident":26,"udre":0,"iod":128,"prc":15.520,"rrc":0.100},{"ident":7,"udre":0,"iod":15,"prc":26.060,"rrc":-0.004}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":276.6,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.220,"rrc":-0.050},{"ident":8,"udre":0,"iod":22,"prc":22.300,"rrc":-0.122},{"ident":13,"udre":0,"iod":3,"prc":-23.780,"rrc":0.120}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":277.8,"seqnum":5,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-64.220,"rrc":-0.088},{"ident":11,"udre":1,"iod":2,"prc":-32.320,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":279.0,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.780,"rrc":0.004},{"ident":26,"udre":0,"iod":128,"prc":15.860,"rrc":0.098},{"ident":7,"udre":0,"iod":15,"prc":26.120,"rrc":-0.012}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":279.6,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.280,"rrc":-0.040},{"ident":8,"udre":0,"iod":22,"prc":22.040,"rrc":-0.136},{"ident":13,"udre":0,"iod":3,"prc":-23.320,"rrc":0.120}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":280.8,"seqnum":0,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-64.280,"rrc":-0.056},{"ident":11,"udre":1,"iod":2,"prc":-31.040,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":282.0,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.860,"rrc":-0.006},{"ident":26,"udre":0,"iod":128,"prc":16.240,"rrc":0.088},{"ident":7,"udre":0,"iod":15,"prc":26.100,"rrc":-0.004}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":282.6,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.400,"rrc":-0.034},{"ident":8,"udre":0,"iod":22,"prc":21.580,"rrc":-0.142},{"ident":13,"udre":0,"iod":3,"prc":-23.000,"rrc":0.124}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":283.8,"seqnum":3,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-64.480,"rrc":-0.042},{"ident":11,"udre":1,"iod":2,"prc":-30.080,"rrc":0.320}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":285.0,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.880,"rrc":0.000},{"ident":26,"udre":0,"iod":128,"prc":16.420,"rrc":0.086},{"ident":7,"udre":0,"iod":15,"prc":25.980,"rrc":-0.016}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":285.6,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.560,"rrc":-0.022},{"ident":8,"udre":0,"iod":22,"prc":21.120,"rrc":-0.156},{"ident":13,"udre":0,"iod":3,"prc":-22.620,"rrc":0.122}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":286.8,"seqnum":6,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-64.540,"rrc":-0.018},{"ident":11,"udre":1,"iod":2,"prc":-29.120,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":288.0,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.900,"rrc":0.000},{"ident":26,"udre":0,"iod":128,"prc":16.660,"rrc":0.088},{"ident":7,"udre":0,"iod":15,"prc":25.940,"rrc":-0.024}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":288.6,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.660,"rrc":-0.020},{"ident":8,"udre":0,"iod":22,"prc":20.600,"rrc":-0.164},{"ident":13,"udre":0,"iod":3,"prc":-22.340,"rrc":0.124}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":289.8,"seqnum":1,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-64.620,"rrc":0.008},{"ident":11,"udre":1,"iod":2,"prc":-27.840,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":291.0,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.040,"rrc":-0.006},{"ident":26,"udre":0,"iod":128,"prc":16.880,"rrc":0.096},{"ident":7,"udre":0,"iod":15,"prc":25.760,"rrc":-0.030}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":291.6,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.800,"rrc":-0.010},{"ident":8,"udre":0,"iod":22,"prc":20.000,"rrc":-0.176},{"ident":13,"udre":0,"iod":3,"prc":-22.040,"rrc":0.120}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":292.8,"seqnum":4,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-64.620,"rrc":0.048},{"ident":11,"udre":1,"iod":2,"prc":-26.880,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":294.0,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.040,"rrc":-0.008},{"ident":26,"udre":0,"iod":128,"prc":17.220,"rrc":0.098},{"ident":7,"udre":0,"iod":15,"prc":25.700,"rrc":-0.040}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":294.6,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.800,"rrc":-0.002},{"ident":8,"udre":0,"iod":22,"prc":19.520,"rrc":-0.182},{"ident":13,"udre":0,"iod":3,"prc":-21.620,"rrc":0.124}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":295.8,"seqnum":7,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-64.420,"rrc":0.074},{"ident":11,"udre":1,"iod":2,"prc":-25.920,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":297.0,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.060,"rrc":-0.020},{"ident":26,"udre":0,"iod":128,"prc":17.500,"rrc":0.104},{"ident":7,"udre":0,"iod":15,"prc":25.560,"rrc":-0.056}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":297.6,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.820,"rrc":0.000},{"ident":8,"udre":0,"iod":22,"prc":18.960,"rrc":-0.188},{"ident":13,"udre":0,"iod":3,"prc":-21.240,"rrc":0.122}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":298.8,"seqnum":2,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-64.180,"rrc":0.092},{"ident":11,"udre":1,"iod":2,"prc":-24.640,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":300.0,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.160,"rrc":-0.012},{"ident":26,"udre":0,"iod":128,"prc":17.780,"rrc":0.090},{"ident":7,"udre":0,"iod":15,"prc":25.380,"rrc":-0.062}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":300.6,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.800,"rrc":0.004},{"ident":8,"udre":0,"iod":22,"prc":18.400,"rrc":-0.190},{"ident":13,"udre":0,"iod":3,"prc":-20.940,"rrc":0.112}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":301.8,"seqnum":5,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-63.920,"rrc":0.122},{"ident":11,"udre":1,"iod":2,"prc":-23.680,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":303.0,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.120,"rrc":-0.022},{"ident":26,"udre":0,"iod":128,"prc":18.180,"rrc":0.084},{"ident":7,"udre":0,"iod":15,"prc":25.260,"rrc":-0.068}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":303.6,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":2,"udre":0,"iod":73,"prc":-1.700,"rrc":0.020},{"ident":8,"udre":0,"iod":22,"prc":17.840,"rrc":-0.204},{"ident":13,"udre":0,"iod":3,"prc":-20.500,"rrc":0.120}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":304.8,"seqnum":0,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-63.380,"rrc":0.140},{"ident":11,"udre":1,"iod":2,"prc":-22.400,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":306.0,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.240,"rrc":-0.022},{"ident":26,"udre":0,"iod":128,"prc":18.460,"rrc":0.078},{"ident":7,"udre":0,"iod":15,"prc":25.020,"rrc":-0.080}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":306.6,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":17.260,"rrc":-0.204},{"ident":2,"udre":0,"iod":73,"prc":-1.620,"rrc":0.022},{"ident":13,"udre":0,"iod":3,"prc":-20.040,"rrc":0.130}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":307.8,"seqnum":3,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-62.840,"rrc":0.166},{"ident":11,"udre":1,"iod":2,"prc":-21.120,"rrc":0.384}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":309.0,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.280,"rrc":-0.030},{"ident":26,"udre":0,"iod":128,"prc":18.660,"rrc":0.064},{"ident":7,"udre":0,"iod":15,"prc":24.800,"rrc":-0.084}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":309.6,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":16.580,"rrc":-0.216},{"ident":2,"udre":0,"iod":73,"prc":-1.580,"rrc":0.034},{"ident":13,"udre":0,"iod":3,"prc":-19.800,"rrc":0.136}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":310.8,"seqnum":6,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-62.440,"rrc":0.190},{"ident":11,"udre":1,"iod":2,"prc":-20.160,"rrc":0.384}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":312.0,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.400,"rrc":-0.026},{"ident":26,"udre":0,"iod":128,"prc":18.880,"rrc":0.054},{"ident":7,"udre":0,"iod":15,"prc":24.520,"rrc":-0.082}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":312.6,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":15.940,"rrc":-0.222},{"ident":2,"udre":0,"iod":73,"prc":-1.480,"rrc":0.040},{"ident":13,"udre":0,"iod":3,"prc":-19.320,"rrc":0.148}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":313.8,"seqnum":1,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-61.800,"rrc":0.210},{"ident":11,"udre":1,"iod":2,"prc":-18.880,"rrc":0.384}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":315.0,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.580,"rrc":-0.026},{"ident":26,"udre":0,"iod":128,"prc":18.960,"rrc":0.044},{"ident":7,"udre":0,"iod":15,"prc":24.180,"rrc":-0.094}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":315.6,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":15.200,"rrc":-0.226},{"ident":2,"udre":0,"iod":73,"prc":-1.460,"rrc":0.038},{"ident":13,"udre":0,"iod":3,"prc":-18.940,"rrc":0.164}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":316.8,"seqnum":4,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-61.280,"rrc":0.214},{"ident":11,"udre":1,"iod":2,"prc":-17.920,"rrc":0.384}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":318.0,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.680,"rrc":-0.024},{"ident":7,"udre":0,"iod":15,"prc":23.920,"rrc":-0.094},{"ident":26,"udre":0,"iod":128,"prc":19.080,"rrc":0.032}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":318.6,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":14.540,"rrc":-0.232},{"ident":2,"udre":0,"iod":73,"prc":-1.340,"rrc":0.038},{"ident":13,"udre":0,"iod":3,"prc":-18.360,"rrc":0.174}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":319.8,"seqnum":7,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-60.520,"rrc":0.236},{"ident":11,"udre":1,"iod":2,"prc":-16.640,"rrc":0.384}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":321.0,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.680,"rrc":-0.014},{"ident":7,"udre":0,"iod":15,"prc":23.720,"rrc":-0.098},{"ident":26,"udre":0,"iod":128,"prc":19.220,"rrc":0.008}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":321.6,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":13.900,"rrc":-0.238},{"ident":2,"udre":0,"iod":73,"prc":-1.140,"rrc":0.030},{"ident":13,"udre":0,"iod":3,"prc":-17.760,"rrc":0.194}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":322.8,"seqnum":2,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-59.660,"rrc":0.242},{"ident":11,"udre":1,"iod":2,"prc":-15.360,"rrc":0.384}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":324.0,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.600,"rrc":-0.006},{"ident":7,"udre":0,"iod":15,"prc":23.460,"rrc":-0.094},{"ident":26,"udre":0,"iod":128,"prc":19.300,"rrc":0.000}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":324.6,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":13.160,"rrc":-0.242},{"ident":2,"udre":0,"iod":73,"prc":-1.080,"rrc":0.036},{"ident":13,"udre":0,"iod":3,"prc":-17.180,"rrc":0.204}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":325.8,"seqnum":5,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-58.880,"rrc":0.256},{"ident":11,"udre":1,"iod":2,"prc":-14.400,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":327.0,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.740,"rrc":0.006},{"ident":7,"udre":0,"iod":15,"prc":23.060,"rrc":-0.108},{"ident":26,"udre":0,"iod":128,"prc":19.120,"rrc":-0.012}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":327.6,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":12.360,"rrc":-0.242},{"ident":2,"udre":0,"iod":73,"prc":-1.060,"rrc":0.024},{"ident":13,"udre":0,"iod":3,"prc":-16.620,"rrc":0.232}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":328.8,"seqnum":0,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-57.920,"rrc":0.256},{"ident":11,"udre":1,"iod":2,"prc":-13.440,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":330.0,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.740,"rrc":0.018},{"ident":7,"udre":0,"iod":15,"prc":22.720,"rrc":-0.110},{"ident":26,"udre":0,"iod":128,"prc":19.040,"rrc":-0.022}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":330.6,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":11.580,"rrc":-0.246},{"ident":2,"udre":0,"iod":73,"prc":-1.020,"rrc":0.028},{"ident":13,"udre":0,"iod":3,"prc":-15.880,"rrc":0.242}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":331.8,"seqnum":3,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-57.280,"rrc":0.288},{"ident":11,"udre":1,"iod":2,"prc":-12.160,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":333.0,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.640,"rrc":0.026},{"ident":7,"udre":0,"iod":15,"prc":22.320,"rrc":-0.126},{"ident":26,"udre":0,"iod":128,"prc":18.900,"rrc":-0.034}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":333.6,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":10.860,"rrc":-0.246},{"ident":2,"udre":0,"iod":73,"prc":-0.940,"rrc":0.024},{"ident":13,"udre":0,"iod":3,"prc":-14.720,"rrc":0.256}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":334.8,"seqnum":6,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-56.320,"rrc":0.288},{"ident":11,"udre":1,"iod":2,"prc":-11.200,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":336.0,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.520,"rrc":0.036},{"ident":7,"udre":0,"iod":15,"prc":21.960,"rrc":-0.142},{"ident":26,"udre":0,"iod":128,"prc":18.800,"rrc":-0.048}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":336.6,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":10.140,"rrc":-0.238},{"ident":2,"udre":0,"iod":73,"prc":-0.840,"rrc":0.032},{"ident":13,"udre":0,"iod":3,"prc":-14.080,"rrc":0.256}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":337.8,"seqnum":1,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-55.680,"rrc":0.288},{"ident":11,"udre":1,"iod":2,"prc":-9.920,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":339.0,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.420,"rrc":0.048},{"ident":7,"udre":0,"iod":15,"prc":21.540,"rrc":-0.160},{"ident":26,"udre":0,"iod":128,"prc":18.700,"rrc":-0.052}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":339.6,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":9.380,"rrc":-0.244},{"ident":2,"udre":0,"iod":73,"prc":-0.720,"rrc":0.032},{"ident":13,"udre":0,"iod":3,"prc":-13.120,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":340.8,"seqnum":4,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-54.720,"rrc":0.288},{"ident":11,"udre":1,"iod":2,"prc":-8.960,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":342.0,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.300,"rrc":0.058},{"ident":7,"udre":0,"iod":15,"prc":21.060,"rrc":-0.176},{"ident":26,"udre":0,"iod":128,"prc":18.540,"rrc":-0.040}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":342.6,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":8.640,"rrc":-0.242},{"ident":2,"udre":0,"iod":73,"prc":-0.680,"rrc":0.032},{"ident":13,"udre":0,"iod":3,"prc":-12.480,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":343.8,"seqnum":7,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-54.080,"rrc":0.288},{"ident":11,"udre":1,"iod":2,"prc":-8.000,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":345.0,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-40.100,"rrc":0.070},{"ident":7,"udre":0,"iod":15,"prc":20.480,"rrc":-0.190},{"ident":26,"udre":0,"iod":128,"prc":18.360,"rrc":-0.042}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":345.6,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":7.880,"rrc":-0.240},{"ident":2,"udre":0,"iod":73,"prc":-0.620,"rrc":0.026},{"ident":13,"udre":0,"iod":3,"prc":-11.840,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":346.8,"seqnum":2,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-53.120,"rrc":0.320},{"ident":11,"udre":1,"iod":2,"prc":-6.720,"rrc":0.352}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":348.0,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.960,"rrc":0.080},{"ident":7,"udre":0,"iod":15,"prc":19.820,"rrc":-0.194},{"ident":26,"udre":0,"iod":128,"prc":18.240,"rrc":-0.038}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":348.6,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":7.040,"rrc":-0.234},{"ident":2,"udre":0,"iod":73,"prc":-0.680,"rrc":0.018},{"ident":13,"udre":0,"iod":3,"prc":-10.880,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":349.8,"seqnum":5,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-52.160,"rrc":0.320},{"ident":11,"udre":1,"iod":2,"prc":-6.080,"rrc":0.320}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":351.0,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.820,"rrc":0.094},{"ident":7,"udre":0,"iod":15,"prc":19.140,"rrc":-0.196},{"ident":26,"udre":0,"iod":128,"prc":17.980,"rrc":-0.048}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":351.6,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":6.320,"rrc":-0.238},{"ident":2,"udre":0,"iod":73,"prc":-0.700,"rrc":0.014},{"ident":13,"udre":0,"iod":3,"prc":-10.240,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":352.8,"seqnum":0,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-51.520,"rrc":0.320},{"ident":11,"udre":1,"iod":2,"prc":-4.800,"rrc":0.320}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":354.0,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.460,"rrc":0.102},{"ident":7,"udre":0,"iod":15,"prc":18.500,"rrc":-0.210},{"ident":26,"udre":0,"iod":128,"prc":17.800,"rrc":-0.052}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":354.6,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":5.620,"rrc":-0.230},{"ident":2,"udre":0,"iod":73,"prc":-0.640,"rrc":0.006},{"ident":13,"udre":0,"iod":3,"prc":-9.280,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":355.8,"seqnum":3,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-50.240,"rrc":0.320},{"ident":11,"udre":1,"iod":2,"prc":-3.840,"rrc":0.320}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":357.0,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-39.100,"rrc":0.110},{"ident":7,"udre":0,"iod":15,"prc":17.940,"rrc":-0.214},{"ident":26,"udre":0,"iod":128,"prc":17.700,"rrc":-0.062}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":357.6,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":4.980,"rrc":-0.216},{"ident":2,"udre":0,"iod":73,"prc":-0.620,"rrc":0.004},{"ident":13,"udre":0,"iod":3,"prc":-8.320,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":358.8,"seqnum":6,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-49.280,"rrc":0.352},{"ident":11,"udre":1,"iod":2,"prc":-2.880,"rrc":0.320}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":360.0,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-38.760,"rrc":0.118},{"ident":7,"udre":0,"iod":15,"prc":17.280,"rrc":-0.224},{"ident":26,"udre":0,"iod":128,"prc":17.460,"rrc":-0.074}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":360.6,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":4.320,"rrc":-0.210},{"ident":2,"udre":0,"iod":73,"prc":-0.640,"rrc":0.000},{"ident":13,"udre":0,"iod":3,"prc":-7.360,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":361.8,"seqnum":1,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-48.320,"rrc":0.352},{"ident":11,"udre":1,"iod":2,"prc":-1.920,"rrc":0.320}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":363.0,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-38.400,"rrc":0.118},{"ident":7,"udre":0,"iod":15,"prc":16.620,"rrc":-0.216},{"ident":26,"udre":0,"iod":128,"prc":17.300,"rrc":-0.082}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":363.6,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":3.680,"rrc":-0.210},{"ident":2,"udre":0,"iod":73,"prc":-0.560,"rrc":-0.002},{"ident":13,"udre":0,"iod":3,"prc":-6.400,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":364.8,"seqnum":4,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-47.360,"rrc":0.352},{"ident":11,"udre":1,"iod":2,"prc":-0.960,"rrc":0.320}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":366.0,"seqnum":5,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-38.040,"rrc":0.122},{"ident":7,"udre":0,"iod":15,"prc":16.000,"rrc":-0.220},{"ident":26,"udre":0,"iod":128,"prc":17.020,"rrc":-0.096}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":366.6,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":3.120,"rrc":-0.196},{"ident":2,"udre":0,"iod":73,"prc":-0.560,"rrc":0.000},{"ident":13,"udre":0,"iod":3,"prc":-5.760,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":367.8,"seqnum":7,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-46.080,"rrc":0.384},{"ident":11,"udre":1,"iod":2,"prc":0.000,"rrc":0.320}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":369.0,"seqnum":0,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-37.680,"rrc":0.118},{"ident":7,"udre":0,"iod":15,"prc":15.260,"rrc":-0.226},{"ident":26,"udre":0,"iod":128,"prc":16.720,"rrc":-0.102}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":369.6,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":2.480,"rrc":-0.180},{"ident":2,"udre":0,"iod":73,"prc":-0.640,"rrc":0.000},{"ident":13,"udre":0,"iod":3,"prc":-4.800,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":370.8,"seqnum":2,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-45.120,"rrc":0.384},{"ident":11,"udre":1,"iod":2,"prc":0.640,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":372.0,"seqnum":3,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-37.260,"rrc":0.128},{"ident":7,"udre":0,"iod":15,"prc":14.540,"rrc":-0.234},{"ident":26,"udre":0,"iod":128,"prc":16.440,"rrc":-0.100}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":372.6,"seqnum":4,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":1.900,"rrc":-0.176},{"ident":2,"udre":0,"iod":73,"prc":-0.720,"rrc":0.002},{"ident":13,"udre":0,"iod":3,"prc":-4.160,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":373.8,"seqnum":5,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-43.840,"rrc":0.384},{"ident":11,"udre":1,"iod":2,"prc":1.600,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":375.0,"seqnum":6,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-36.980,"rrc":0.138},{"ident":7,"udre":0,"iod":15,"prc":13.720,"rrc":-0.252},{"ident":26,"udre":0,"iod":128,"prc":15.940,"rrc":-0.118}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":375.6,"seqnum":7,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":1.340,"rrc":-0.162},{"ident":2,"udre":0,"iod":73,"prc":-0.760,"rrc":0.010},{"ident":13,"udre":0,"iod":3,"prc":-3.200,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":376.8,"seqnum":0,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-42.880,"rrc":0.384},{"ident":11,"udre":1,"iod":2,"prc":2.240,"rrc":0.288}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":378.0,"seqnum":1,"length":5,"station_health":0,"satellites":[{"ident":27,"udre":0,"iod":62,"prc":-36.680,"rrc":0.134},{"ident":7,"udre":0,"iod":15,"prc":12.800,"rrc":-0.224},{"ident":26,"udre":0,"iod":128,"prc":15.540,"rrc":-0.128}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":378.6,"seqnum":2,"length":5,"station_health":0,"satellites":[{"ident":8,"udre":0,"iod":22,"prc":0.840,"rrc":-0.150},{"ident":2,"udre":0,"iod":73,"prc":-0.740,"rrc":0.014},{"ident":13,"udre":0,"iod":3,"prc":-2.560,"rrc":0.256}]} {"class":"RTCM2","device":"stdin","type":9,"station_id":268,"zcount":379.8,"seqnum":3,"length":4,"station_health":0,"satellites":[{"ident":19,"udre":0,"iod":186,"prc":-41.600,"rrc":0.384},{"ident":11,"udre":1,"iod":2,"prc":3.200,"rrc":0.288}]} gpsd-3.15/test/synthetic-ais.json0000664000175000017500000002363712461156335015224 0ustar esresr# Synthetic test load designed to exercise the AIS JSON parser # These are JSON dumps of the packets in the Schwehr testload, # via gpsdecode -j -u #include #include #include #include #include #include "bits.h" static unsigned char buf[80]; static signed 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 int64_t sL1, sL2; static uint64_t uL1, uL2; static float f1; static double d1; static char *hexdump(const void *binbuf, size_t len) { static char hexbuf[BUFSIZ]; size_t i, j = 0; const char *ibuf = (const char *)binbuf; const char *hexchar = "0123456789abcdef"; for (i = 0; i < len; i++) { hexbuf[j++] = hexchar[(ibuf[i] & 0xf0) >> 4]; hexbuf[j++] = hexchar[ibuf[i] & 0x0f]; } hexbuf[j] = '\0'; return hexbuf; } static void bedumpall(void) { (void)printf("getsb: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) sb1, (uint64_t) sb2, (uint64_t) getsb(buf, 0), (uint64_t) getsb(buf, 8)); (void)printf("getub: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) ub1, (uint64_t) ub2, (uint64_t) getub(buf, 0), (uint64_t) getub(buf, 8)); (void)printf("getbes16: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) sw1, (uint64_t) sw2, (uint64_t) getbes16(buf, 0), (uint64_t) getbes16(buf, 8)); (void)printf("getbeu16: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) uw1, (uint64_t) uw2, (uint64_t) getbeu16(buf, 0), (uint64_t) getbeu16(buf, 8)); (void)printf("getbes32: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) sl1, (uint64_t) sl2, (uint64_t) getbes32(buf, 0), (uint64_t) getbes32(buf, 8)); (void)printf("getbeu32: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) ul1, (uint64_t) ul2, (uint64_t) getbeu32(buf, 0), (uint64_t) getbeu32(buf, 8)); (void)printf("getbes64: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) sL1, (uint64_t) sL2, (uint64_t) getbes64(buf, 0), (uint64_t) getbes64(buf, 8)); (void)printf("getbeu64: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) uL1, (uint64_t) uL2, (uint64_t) getbeu64(buf, 0), (uint64_t) getbeu64(buf, 8)); (void)printf("getbef32: %f %f\n", f1, getbef32((const char *)buf, 24)); (void)printf("getbed64: %.16f %.16f\n", d1, getbed64((const char *)buf, 16)); } static void ledumpall(void) { (void)printf("getsb: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) sb1, (uint64_t) sb2, (uint64_t) getsb(buf, 0), (uint64_t) getsb(buf, 8)); (void)printf("getub: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) ub1, (uint64_t) ub2, (uint64_t) getub(buf, 0), (uint64_t) getub(buf, 8)); (void)printf("getles16: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) sw1, (uint64_t) sw2, (uint64_t) getles16(buf, 0), (uint64_t) getles16(buf, 8)); (void)printf("getleu16: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) uw1, (uint64_t) uw2, (uint64_t) getleu16(buf, 0), (uint64_t) getleu16(buf, 8)); (void)printf("getles32: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) sl1, (uint64_t) sl2, (uint64_t) getles32(buf, 0), (uint64_t) getles32(buf, 8)); (void)printf("getleu32: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) ul1, (uint64_t) ul2, (uint64_t) getleu32(buf, 0), (uint64_t) getleu32(buf, 8)); (void)printf("getles64: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) sL1, (uint64_t) sL2, (uint64_t) getles64(buf, 0), (uint64_t) getles64(buf, 8)); (void)printf("getleu64: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 "\n", (uint64_t) uL1, (uint64_t) uL2, (uint64_t) getleu64(buf, 0), (uint64_t) getleu64(buf, 8)); (void)printf("getlef32: %f %f\n", f1, getlef32((const char *)buf, 24)); (void)printf("getled64: %.16f %.16f\n", d1, getled64((const char *)buf, 16)); } struct unsigned_test { unsigned char *buf; unsigned int start, width; uint64_t expected; bool le; char *description; }; int main(int argc, char *argv[]) { bool failures = false; bool quiet = (argc > 1) && (strcmp(argv[1], "--quiet") == 0); struct unsigned_test *up, unsigned_tests[] = { /* tests using the big buffer */ {buf, 0, 1, 0, false, "first bit of first byte"}, {buf, 0, 8, 0x01, false, "first 8 bits"}, {buf, 32, 7, 0x02, false, "first seven bits of fifth byte (0x05)"}, {buf, 56, 12, 0x8f, false, "12 bits crossing 7th to 8th bytes (0x08ff)"}, {buf, 78, 4, 0xb, false, "4 bits crossing 8th to 9th byte (0xfefd)"}, {buf, 0, 1, 0, true, "first bit of first byte"}, {buf, 0, 8, 0x80, true, "first 8 bits"}, {buf, 32, 7, 0x20, true, "first seven bits of fifth byte (0x05)"}, {buf, 56, 12, 0xf10,true, "12 bits crossing 7th to 8th bytes (0x08ff)"}, {buf, 78, 4, 0xd, true, "4 bits crossing 8th to 9th byte (0xfefd)"}, /* sporadic tests based on found bugs */ {(unsigned char *)"\x19\x23\f6", 7, 2, 2, false, "2 bits crossing 1st to 2nd byte (0x1923)"}, }; 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); if (!quiet) (void)printf("Testing bitfield extraction\n"); sb1 = getsb(buf, 0); sb2 = getsb(buf, 8); ub1 = getub(buf, 0); ub2 = getub(buf, 8); if (!quiet) { unsigned char *sp; (void)fputs("Test data:", stdout); for (sp = buf; sp < buf + 28; sp++) (void)printf(" %02x", *sp); (void)putc('\n', stdout); /* big-endian test */ printf("Big-endian:\n"); sw1 = getbes16(buf, 0); sw2 = getbes16(buf, 8); uw1 = getbeu16(buf, 0); uw2 = getbeu16(buf, 8); sl1 = getbes32(buf, 0); sl2 = getbes32(buf, 8); ul1 = getbeu32(buf, 0); ul2 = getbeu32(buf, 8); sL1 = getbes64(buf, 0); sL2 = getbes64(buf, 8); uL1 = getbeu64(buf, 0); uL2 = getbeu64(buf, 8); f1 = getbef32((const char *)buf, 24); d1 = getbed64((const char *)buf, 16); bedumpall(); /* little-endian test */ printf("Little-endian:\n"); sw1 = getles16(buf, 0); sw2 = getles16(buf, 8); uw1 = getleu16(buf, 0); uw2 = getleu16(buf, 8); sl1 = getles32(buf, 0); sl2 = getles32(buf, 8); ul1 = getleu32(buf, 0); ul2 = getleu32(buf, 8); sL1 = getles64(buf, 0); sL2 = getles64(buf, 8); uL1 = getleu64(buf, 0); uL2 = getleu64(buf, 8); f1 = getlef32((const char *)buf, 24); d1 = getled64((const char *)buf, 16); ledumpall(); } if (sb1 != 1) printf("getsb(buf, 0) FAILED\n"); if (sb2 != -1) printf("getsb(buf, 8) FAILED\n"); if (ub1 != 1) printf("getub(buf, 0) FAILED\n"); if (ub2 != 0xff) printf("getub(buf, 8) FAILED\n"); for (up = unsigned_tests; up < unsigned_tests + sizeof(unsigned_tests) / sizeof(unsigned_tests[0]); up++) { uint64_t res = ubits((unsigned char *)buf, up->start, up->width, up->le); bool success = (res == up->expected); if (!success) failures = true; if (!success || !quiet) (void)printf("ubits(%s, %d, %d, %s) %s should be %" PRIx64 ", is %" PRIx64 ": %s\n", hexdump(buf, strlen((char *)buf)), up->start, up->width, up->le ? "true" : "false", up->description, up->expected, res, success ? "succeeded" : "FAILED"); } shiftleft(buf, 28, 30); if (!quiet) printf("Left-shifted 30 bits: %s\n", hexdump(buf, 28)); /* * After the 24-bit shift, the bit array loses its first three bytes: * 0x0405060708 = 00000100 00000101 00000110 00000111 00001000 * By inspection, the results of the 6-bit shift are * 00000001 01000001 10000001 11000010 00 */ #define LASSERT(n, v) if (buf[n] != v) printf("Expected buf[%d] to be %02x, was %02x\n", n, v, buf[n]) LASSERT(0, 0x01); LASSERT(1, 0x41); LASSERT(2, 0x81); LASSERT(3, 0xc1); #undef LASSERT exit(failures ? EXIT_FAILURE : EXIT_SUCCESS); } gpsd-3.15/test_float.c0000664000175000017500000001265012513107374013064 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include /* * Copyright (c) 2006 Chris Kuethe * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * this simple program tests to see whether your system can do proper * single and double precision floating point. This is apparently Very * Hard To Do(tm) on embedded systems, judging by the number of broken * ARM toolchains I've seen... :( * * Added in 2015 by ESR: Test for C99 behavior on negative operand(s) * of %, that is the result should have the sign of the left operand. * * compile with: gcc -O -o test_float test_float.c * (use whatever -O level you like) */ int main(void); int test_single(void); int test_double(void); int test_modulo(void); int main(void) { int i, j, k; if ((i = test_single())) printf("WARNING: Single-precision " "floating point math might be broken\n"); if ((j = test_double())) printf("WARNING: Double-precision " "floating point math might be broken\n"); if ((k = test_modulo())) printf("WARNING: Modular arithmetic is broken\n"); i += j; i += k; if (i == 0) printf("floating point and modular math appears to work\n"); return i; } int test_single(void) { static float f; static int i; static int e = 0; /* addition test */ f = 1.0; for(i = 0; i < 10; i++) f += (1< #include #include #include "gpsd.h" int main(int argc, char **argv) { double lat, lon; if (argc != 3) { fprintf(stderr, "Usage: %s lat lon\n", argv[0]); return 1; } lat = atof(argv[1]); lon = atof(argv[2]); 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); return 1; } printf(" lat= %f lon= %f geoid correction= %f\n", lat, lon, wgs84_separation(lat, lon)); return 0; } gpsd-3.15/test_gpsmm.cpp0000664000175000017500000001030312520742615013434 0ustar esresr/* * Copyright (C) 2010 Eric S. Raymond. * * This software is distributed under a BSD-style license. See the * file "COPYING" in the top-level directory of the distribution for details. * */ /* This simple program shows the basic functionality of the C++ wrapper class */ #include #include "libgpsmm.h" using namespace std; /* * We should get libgps_dump_state() from the client library, but * scons has a bug; we can't get it to add -lgps to the link line, * apparently because it doesn't honor parse_flags on a Program() * build of a C++ file. */ static void libgps_dump_state(struct gps_data_t *collect) { /* no need to dump the entire state, this is a sanity check */ #ifndef USE_QT /* will fail on a 32-bit macine */ (void)fprintf(stdout, "flags: (0x%04x) %s\n", (unsigned int)collect->set, gps_maskdump(collect->set)); #endif if (collect->set & ONLINE_SET) (void)fprintf(stdout, "ONLINE: %lf\n", collect->online); if (collect->set & TIME_SET) (void)fprintf(stdout, "TIME: %lf\n", collect->fix.time); if (collect->set & LATLON_SET) (void)fprintf(stdout, "LATLON: lat/lon: %lf %lf\n", collect->fix.latitude, collect->fix.longitude); if (collect->set & ALTITUDE_SET) (void)fprintf(stdout, "ALTITUDE: altitude: %lf U: climb: %lf\n", collect->fix.altitude, collect->fix.climb); if (collect->set & SPEED_SET) (void)fprintf(stdout, "SPEED: %lf\n", collect->fix.speed); if (collect->set & TRACK_SET) (void)fprintf(stdout, "TRACK: track: %lf\n", collect->fix.track); if (collect->set & CLIMB_SET) (void)fprintf(stdout, "CLIMB: climb: %lf\n", collect->fix.climb); if (collect->set & STATUS_SET) (void)fprintf(stdout, "STATUS: status: %d\n", collect->status); if (collect->set & MODE_SET) (void)fprintf(stdout, "MODE: mode: %d\n", collect->fix.mode); if (collect->set & DOP_SET) (void)fprintf(stdout, "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(stdout, "VERSION: release=%s rev=%s proto=%d.%d\n", collect->version.release, collect->version.rev, collect->version.proto_major, collect->version.proto_minor); if (collect->set & POLICY_SET) (void)fprintf(stdout, "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.devpath); if (collect->set & SATELLITE_SET) { int i; (void)fprintf(stdout, "SKY: satellites in view: %d\n", collect->satellites_visible); for (i = 0; i < collect->satellites_visible; i++) { (void)fprintf(stdout, " %2.2d: %2.2d %3.3d %3.0f %c\n", collect->skyview[i].PRN, collect->skyview[i].elevation, collect->skyview[i].azimuth, collect->skyview[i].ss, collect->skyview[i].used ? 'Y' : 'N'); } } if (collect->set & DEVICE_SET) (void)fprintf(stdout, "DEVICE: Device is '%s', driver is '%s'\n", collect->dev.path, collect->dev.driver); #ifdef OLDSTYLE_ENABLE if (collect->set & DEVICEID_SET) (void)fprintf(stdout, "GPSD ID is %s\n", collect->dev.subtype); #endif /* OLDSTYLE_ENABLE */ if (collect->set & DEVICELIST_SET) { int i; (void)fprintf(stdout, "DEVICELIST:%d devices:\n", collect->devices.ndevices); for (i = 0; i < collect->devices.ndevices; i++) { (void)fprintf(stdout, "%d: path='%s' driver='%s'\n", collect->devices.ndevices, collect->devices.list[i].path, collect->devices.list[i].driver); } } } int main(void) { gpsmm gps_rec("localhost", DEFAULT_GPSD_PORT); if (gps_rec.stream(WATCH_ENABLE|WATCH_JSON) == NULL) { cerr << "No GPSD running.\n"; return 1; } for (;;) { struct gps_data_t* newdata; if (!gps_rec.waiting(5000000)) continue; if ((newdata = gps_rec.read()) == NULL) { cerr << "Read error.\n"; return 1; } else { libgps_dump_state(newdata); } } cout << "Exiting\n"; return 0; } gpsd-3.15/test_json.c0000664000175000017500000003423412520742615012733 0ustar esresr/* json.c - unit test for JSON partsing into fixed-extent structures * * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include "gpsd.h" #include "gps_json.h" #define JSON_MINIMAL /* GPSD only uses a subset of the features */ 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)); exit(EXIT_FAILURE); } } 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); exit(EXIT_FAILURE); } } 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); exit(EXIT_FAILURE); } } 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); exit(EXIT_FAILURE); } } static void assert_boolean(char *attr, bool fld, bool val) { if (fld != val) { (void)fprintf(stderr, "'%s' boolean attribute eval failed, value = %s.\n", attr, fld ? "true" : "false"); exit(EXIT_FAILURE); } } /* * Floating point comparisons are iffy, but at least if any of these fail * the output will make it clear whether it was a precision issue */ 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); exit(EXIT_FAILURE); } } static struct gps_data_t gpsdata; /* Case 1: TPV report */ /* *INDENT-OFF* */ static const char json_str1[] = "{\"class\":\"TPV\",\ \"device\":\"GPS#1\", \ \"time\":\"2005-06-19T08:12:41.89Z\",\"lon\":46.498203637,\"lat\":7.568074350,\ \"alt\":1327.780,\"epx\":21.000,\"epy\":23.000,\"epv\":124.484,\"mode\":3}"; /* Case 2: SKY report */ static const char *json_str2 = "{\"class\":\"SKY\",\ \"time\":\"2005-06-19T12:12:42.03Z\", \ \"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\":42,\"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\":39,\"used\":true},\ {\"PRN\":21,\"el\":10,\"az\":301,\"ss\":0,\"used\":false}]}"; /* Case 3: String list syntax */ static const char *json_str3 = "[\"foo\",\"bar\",\"baz\"]"; static char *stringptrs[3]; static char stringstore[256]; static int stringcount; static const struct json_array_t json_array_3 = { .element_type = t_string, .arr.strings.ptrs = stringptrs, .arr.strings.store = stringstore, .arr.strings.storelen = sizeof(stringstore), .count = &stringcount, .maxlen = sizeof(stringptrs)/sizeof(stringptrs[0]), }; /* Case 4: test defaulting of unspecified attributes */ static const char *json_str4 = "{\"flag1\":true,\"flag2\":false}"; static bool flag1, flag2; static double dftreal; static int dftinteger; static unsigned int dftuinteger; static const struct json_attr_t json_attrs_4[] = { {"dftint", t_integer, .addr.integer = &dftinteger, .dflt.integer = -5}, {"dftuint", t_integer, .addr.uinteger = &dftuinteger, .dflt.uinteger = 10}, {"dftreal", t_real, .addr.real = &dftreal, .dflt.real = 23.17}, {"flag1", t_boolean, .addr.boolean = &flag1,}, {"flag2", t_boolean, .addr.boolean = &flag2,}, {NULL}, }; /* Case 5: test DEVICE parsing */ static const char *json_str5 = "{\"class\":\"DEVICE\",\ \"path\":\"/dev/ttyUSB0\",\ \"flags\":5,\ \"driver\":\"Foonly\",\"subtype\":\"Foonly Frob\"\ }"; /* Case 6: test parsing of subobject list into array of structures */ static const char *json_str6 = "{\"parts\":[\ {\"name\":\"Urgle\", \"flag\":true, \"count\":3},\ {\"name\":\"Burgle\",\"flag\":false,\"count\":1},\ {\"name\":\"Witter\",\"flag\":true, \"count\":4},\ {\"name\":\"Thud\", \"flag\":false,\"count\":1}]}"; struct dumbstruct_t { char name[64]; bool flag; int count; }; static struct dumbstruct_t dumbstruck[5]; static int dumbcount; static const struct json_attr_t json_attrs_6_subtype[] = { {"name", t_string, .addr.offset = offsetof(struct dumbstruct_t, name), .len = 64}, {"flag", t_boolean, .addr.offset = offsetof(struct dumbstruct_t, flag),}, {"count", t_integer, .addr.offset = offsetof(struct dumbstruct_t, count),}, {NULL}, }; static const struct json_attr_t json_attrs_6[] = { {"parts", t_array, .addr.array.element_type = t_structobject, .addr.array.arr.objects.base = (char*)&dumbstruck, .addr.array.arr.objects.stride = sizeof(struct dumbstruct_t), .addr.array.arr.objects.subtype = json_attrs_6_subtype, .addr.array.count = &dumbcount, .addr.array.maxlen = sizeof(dumbstruck)/sizeof(dumbstruck[0])}, {NULL}, }; /* Case 7: test parsing of version response */ static const char *json_str7 = "{\"class\":\"VERSION\",\ \"release\":\"2.40dev\",\"rev\":\"dummy-revision\",\ \"proto_major\":3,\"proto_minor\":1}"; /* Case 8: test parsing arrays of enumerated types */ static const char *json_str8 = "{\"fee\":\"FOO\",\"fie\":\"BAR\",\"foe\":\"BAZ\"}"; static const struct json_enum_t enum_table[] = { {"BAR", 6}, {"FOO", 3}, {"BAZ", 14}, {NULL} }; static int fee, fie, foe; static const struct json_attr_t json_attrs_8[] = { {"fee", t_integer, .addr.integer = &fee, .map=enum_table}, {"fie", t_integer, .addr.integer = &fie, .map=enum_table}, {"foe", t_integer, .addr.integer = &foe, .map=enum_table}, {NULL}, }; /* Case 9: Like case 6 but w/ an empty array */ static const char *json_str9 = "{\"parts\":[]}"; /* Case 10: test parsing of PPS message */ static const char *json_strPPS = "{\"class\":\"PPS\",\"device\":\"GPS#1\"," \ "\"real_sec\":1428001514, \"real_nsec\":1000000," \ "\"clock_sec\":1428001513,\"clock_nsec\":999999999," \ "\"precision\":-20}"; /* Case 11: test parsing of TOFF message */ static const char *json_strTOFF = "{\"class\":\"TOFF\",\"device\":\"GPS#1\"," \ "\"real_sec\":1428001514, \"real_nsec\":1000000," \ "\"clock_sec\":1428001513,\"clock_nsec\":999999999}"; #ifndef JSON_MINIMAL /* Case 12: Read array of integers */ static const char *json_strInt = "[23,-17,5]"; static int intstore[4], intcount; static const struct json_array_t json_array_Int = { .element_type = t_integer, .arr.integers.store = intstore, .count = &intcount, .maxlen = sizeof(intstore)/sizeof(intstore[0]), }; /* Case 13: Read array of booleans */ static const char *json_strBool = "[true,false,true]"; static bool boolstore[4]; static int boolcount; static const struct json_array_t json_array_Bool = { .element_type = t_boolean, .arr.booleans.store = boolstore, .count = &boolcount, .maxlen = sizeof(boolstore)/sizeof(boolstore[0]), }; /* Case 14: Read array of reals */ static const char *json_str14 = "[23.1,-17.2,5.3]"; static double realstore[4]; static int realcount; static const struct json_array_t json_array_14 = { .element_type = t_real, .arr.reals.store = realstore, .count = &realcount, .maxlen = sizeof(realstore)/sizeof(realstore[0]), }; #endif /* JSON_MINIMAL */ /* *INDENT-ON* */ static void jsontest(int i) { int status = 0; switch (i) { case 1: status = libgps_json_unpack(json_str1, &gpsdata, NULL); assert_case(1, status); assert_string("device", gpsdata.dev.path, "GPS#1"); assert_integer("mode", gpsdata.fix.mode, 3); assert_real("time", gpsdata.fix.time, 1119168761.8900001); assert_real("lon", gpsdata.fix.longitude, 46.498203637); assert_real("lat", gpsdata.fix.latitude, 7.568074350); break; case 2: status = libgps_json_unpack(json_str2, &gpsdata, NULL); assert_case(2, status); assert_integer("used", gpsdata.satellites_used, 6); assert_integer("PRN[0]", gpsdata.skyview[0].PRN, 10); assert_integer("el[0]", gpsdata.skyview[0].elevation, 45); assert_integer("az[0]", gpsdata.skyview[0].azimuth, 196); assert_real("ss[0]", gpsdata.skyview[0].ss, 34); assert_boolean("used[0]", gpsdata.skyview[0].used, true); assert_integer("PRN[6]", gpsdata.skyview[6].PRN, 21); assert_integer("el[6]", gpsdata.skyview[6].elevation, 10); assert_integer("az[6]", gpsdata.skyview[6].azimuth, 301); assert_real("ss[6]", gpsdata.skyview[6].ss, 0); assert_boolean("used[6]", gpsdata.skyview[6].used, false); break; case 3: status = json_read_array(json_str3, &json_array_3, NULL); assert_case(3, status); assert(stringcount == 3); assert(strcmp(stringptrs[0], "foo") == 0); assert(strcmp(stringptrs[1], "bar") == 0); assert(strcmp(stringptrs[2], "baz") == 0); break; case 4: status = json_read_object(json_str4, json_attrs_4, NULL); assert_case(4, status); assert_integer("dftint", dftinteger, -5); /* did the default work? */ assert_uinteger("dftuint", dftuinteger, 10); /* did the default work? */ assert_real("dftreal", dftreal, 23.17); /* did the default work? */ assert_boolean("flag1", flag1, true); assert_boolean("flag2", flag2, false); break; case 5: 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_string("driver", gpsdata.dev.driver, "Foonly"); break; case 6: status = json_read_object(json_str6, json_attrs_6, NULL); assert_case(6, status); assert_integer("dumbcount", dumbcount, 4); assert_string("dumbstruck[0].name", dumbstruck[0].name, "Urgle"); assert_string("dumbstruck[1].name", dumbstruck[1].name, "Burgle"); assert_string("dumbstruck[2].name", dumbstruck[2].name, "Witter"); assert_string("dumbstruck[3].name", dumbstruck[3].name, "Thud"); assert_boolean("dumbstruck[0].flag", dumbstruck[0].flag, true); assert_boolean("dumbstruck[1].flag", dumbstruck[1].flag, false); assert_boolean("dumbstruck[2].flag", dumbstruck[2].flag, true); assert_boolean("dumbstruck[3].flag", dumbstruck[3].flag, false); assert_integer("dumbstruck[0].count", dumbstruck[0].count, 3); assert_integer("dumbstruck[1].count", dumbstruck[1].count, 1); assert_integer("dumbstruck[2].count", dumbstruck[2].count, 4); assert_integer("dumbstruck[3].count", dumbstruck[3].count, 1); break; case 7: status = libgps_json_unpack(json_str7, &gpsdata, NULL); assert_case(7, status); assert_string("release", gpsdata.version.release, "2.40dev"); assert_string("rev", gpsdata.version.rev, "dummy-revision"); assert_integer("proto_major", gpsdata.version.proto_major, 3); assert_integer("proto_minor", gpsdata.version.proto_minor, 1); break; case 8: status = json_read_object(json_str8, json_attrs_8, NULL); assert_case(8, status); assert_integer("fee", fee, 3); assert_integer("fie", fie, 6); assert_integer("foe", foe, 14); break; case 9: /* yes, the '6' in the next line is correct */ status = json_read_object(json_str9, json_attrs_6, NULL); assert_case(9, status); assert_integer("dumbcount", dumbcount, 0); break; case 10: status = json_pps_read(json_strPPS, &gpsdata, NULL); assert_case(10, status); assert_string("device", gpsdata.dev.path, "GPS#1"); assert_integer("real_sec", gpsdata.pps.real.tv_sec, 1428001514); assert_integer("real_nsec", gpsdata.pps.real.tv_nsec, 1000000); assert_integer("clock_sec", gpsdata.pps.clock.tv_sec, 1428001513); assert_integer("clock_nsec", gpsdata.pps.clock.tv_nsec, 999999999); break; case 11: status = json_toff_read(json_strTOFF, &gpsdata, NULL); assert_case(11, status); assert_string("device", gpsdata.dev.path, "GPS#1"); assert_integer("real_sec", gpsdata.pps.real.tv_sec, 1428001514); assert_integer("real_nsec", gpsdata.pps.real.tv_nsec, 1000000); assert_integer("clock_sec", gpsdata.pps.clock.tv_sec, 1428001513); assert_integer("clock_nsec", gpsdata.pps.clock.tv_nsec, 999999999); break; #ifdef JSON_MINIMAL #define MAXTEST 11 #else case 12: status = json_read_array(json_strInt, &json_array_Int, NULL); assert_integer("count", intcount, 3); assert_integer("intstore[0]", intstore[0], 23); assert_integer("intstore[1]", intstore[1], -17); assert_integer("intstore[2]", intstore[2], 5); assert_integer("intstore[3]", intstore[3], 0); break; case 13: status = json_read_array(json_strBool, &json_array_Bool, NULL); assert_integer("count", boolcount, 3); assert_boolean("boolstore[0]", boolstore[0], true); assert_boolean("boolstore[1]", boolstore[1], false); assert_boolean("boolstore[2]", boolstore[2], true); assert_boolean("boolstore[3]", boolstore[3], false); break; case 14: status = json_read_array(json_str14, &json_array_14, NULL); assert_integer("count", realcount, 3); assert_real("realstore[0]", realstore[0], 23.1); assert_real("realstore[1]", realstore[1], -17.2); assert_real("realstore[2]", realstore[2], 5.3); assert_real("realstore[3]", realstore[3], 0); break; #define MAXTEST 14 #endif /* JSON_MINIMAL */ default: (void)fputs("Unknown test number\n", stderr); exit(EXIT_FAILURE); } } int main(int argc UNUSED, char *argv[]UNUSED) { int option; int individual = 0; while ((option = getopt(argc, argv, "hn:D:?")) != -1) { switch (option) { #ifdef CLIENTDEBUG_ENABLE case 'D': gps_enable_debug(atoi(optarg), stdout); break; #endif case 'n': individual = atoi(optarg); break; case '?': case 'h': default: (void)fputs("usage: test_json [-D lvl]\n", stderr); exit(EXIT_FAILURE); } } (void)fprintf(stderr, "JSON unit test "); if (individual) jsontest(individual); else { int i; for (i = 1; i <= MAXTEST; i++) jsontest(i); } (void)fprintf(stderr, "succeeded.\n"); exit(EXIT_SUCCESS); } /* end */ gpsd-3.15/test_libgps.c0000664000175000017500000000546012506331142013232 0ustar esresr/* * A simple command-line exerciser for the library. * Not really useful for anything but debugging. */ #include #include #include #include #include #include #include #define LIBGPS_DEBUG #include "gpsd.h" #include #include #include static void onsig(int sig) { (void)fprintf(stderr, "libgps: died with signal %d\n", sig); exit(EXIT_FAILURE); } #ifdef SOCKET_EXPORT_ENABLE /* must start zeroed, otherwise the unit test will try to chase garbage pointer fields. */ static struct gps_data_t gpsdata; #endif int main(int argc, char *argv[]) { struct gps_data_t collect; char buf[BUFSIZ]; int option; bool batchmode = false; #ifdef CLIENTDEBUG_ENABLE int debug = 0; #endif (void)signal(SIGSEGV, onsig); (void)signal(SIGBUS, onsig); while ((option = getopt(argc, argv, "bhsD:?")) != -1) { switch (option) { case 'b': batchmode = true; break; case 's': (void) printf ("Sizes: fix=%zd gpsdata=%zd rtcm2=%zd rtcm3=%zd ais=%zd compass=%zd raw=%zd devices=%zd policy=%zd version=%zd, noise=%zd\n", sizeof(struct gps_fix_t), 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), sizeof(struct gst_t)); exit(EXIT_SUCCESS); #ifdef CLIENTDEBUG_ENABLE case 'D': debug = atoi(optarg); break; #endif case '?': case 'h': default: (void)fputs("usage: test_libgps [-b] [-D lvl] [-s]\n", stderr); exit(EXIT_FAILURE); } } #ifdef CLIENTDEBUG_ENABLE gps_enable_debug(debug, stdout); #endif if (batchmode) { #ifdef SOCKET_EXPORT_ENABLE while (fgets(buf, sizeof(buf), stdin) != NULL) { if (buf[0] == '{' || isalpha(buf[0])) { gps_unpack(buf, &gpsdata); libgps_dump_state(&gpsdata); } } #endif } else if (gps_open(NULL, 0, &collect) <= 0) { (void)fputs("Daemon is not running.\n", stdout); exit(EXIT_FAILURE); } else if (optind < argc) { (void)strlcpy(buf, argv[optind], sizeof(buf)); (void)strlcat(buf, "\n", sizeof(buf)); (void)gps_send(&collect, buf); (void)gps_read(&collect); #ifdef SOCKET_EXPORT_ENABLE libgps_dump_state(&collect); #endif (void)gps_close(&collect); } else { int tty = isatty(0); if (tty) (void)fputs("This is the gpsd exerciser.\n", stdout); for (;;) { if (tty) (void)fputs("> ", stdout); if (fgets(buf, sizeof(buf), stdin) == NULL) { if (tty) putchar('\n'); break; } collect.set = 0; (void)gps_send(&collect, buf); (void)gps_read(&collect); #ifdef SOCKET_EXPORT_ENABLE libgps_dump_state(&collect); #endif } (void)gps_close(&collect); } return 0; } gpsd-3.15/test_maidenhead.py0000775000175000017500000000151412475067112014246 0ustar esresr#!/usr/bin/env python # # Test grid locator conversion. # # Midenhead specification at # http://en.wikipedia.org/wiki/Maidenhead_Locator_System # Test conversions generated using # http://f6fvy.free.fr/qthLocator/ import sys, gps.clienthelpers errors = 0 for (lat, lon, maidenhead, location) in [ (48.86471, 2.37305, "JN18eu", "Paris"), (41.93498, 12.43652, "JN61fw", "Rome"), (39.9771, -75.1685, "FM29jx", "Philadelphia"), (-23.4028, -50.9766, "GG46mo", "Sao Paulo"), ]: converted = gps.clienthelpers.maidenhead(lat, lon) if converted != maidenhead: print >>sys.stderr, "maidenhead test: from %s %s (%s) expected %s got %s" \ % (lat, lon, location, maidenhead, converted) errors += 1 else: print "%s OK" % location if errors: sys.exit(1) else: sys.exit(0) gpsd-3.15/test_matrix.c0000664000175000017500000000437612520742615013272 0ustar esresr/* * Unit test for matrix-algebra code * * Check examples computed at * http://www.elektro-energetika.cz/calculations/matreg.php */ #include #include #include #include #include /* for time_t */ #include #include "compiler.h" #include "matrix.h" static struct { double mat[4][4]; double inv[4][4]; } inverses[] = { /* identity matrix is self-inverse */ { .mat = {{1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1}}, .inv = {{1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1}}, }, /* inverse of a diagonal matrix has reciprocal values */ { .mat = {{10,0,0,0}, {0,10,0,0}, {0,0,10,0}, {0,0,0,10}}, .inv = {{0.1,0,0,0}, {0,0.1,0,0}, {0,0,0.1,0}, {0,0,0,0.1}}, }, /* random values with asymmetrical off-diagonal elements */ { .mat = {{1,0,0,0}, {0,1,0,-2}, {0, 2,1,-4}, {0,0,0,1}}, .inv = {{1,0,0,0}, {0,1,0, 2}, {0,-2,1, 0}, {0,0,0,1}}, }, { .mat = {{6,-4,1,-3},{-4,7,3,2},{1,3,6,-4},{-3,2,-4,6}}, .inv = {{14,34,-40,-31},{34,84,-99,-77},{-40,-99,117,91},{-31,-77,91,71}}, }, }; static void dump(const char *label, double m[4][4]) { printf("%s:\n", label); printf("%f, %f, %f, %f\n", m[0][0], m[0][1], m[0][2], m[0][3]); printf("%f, %f, %f, %f\n", m[1][0], m[1][1], m[1][2], m[1][3]); printf("%f, %f, %f, %f\n", m[2][0], m[2][1], m[2][2], m[2][3]); printf("%f, %f, %f, %f\n", m[3][0], m[3][1], m[3][2], m[3][3]); } static bool check_diag(int n, double a[4][4], double b[4][4]) { #define approx(x, y) (fabs(x - y) < 0.0001) if (approx(b[0][0], a[0][0]) && approx(b[1][1], a[1][1]) && approx(b[2][2], a[2][2]) && approx(b[3][3], a[3][3])) return true; dump("a", a); dump("b", b); printf("Test %d residuals: %f %f %f %f\n", n, b[0][0] - a[0][0], b[1][1] - a[1][1], b[2][2] - a[2][2], b[3][3] - a[3][3] ); return true; } int main(int argc UNUSED, char *argv[] UNUSED) { unsigned int i; for (i = 0; i < sizeof(inverses) / sizeof(inverses[0]); i++) { double inverse[4][4]; if (!matrix_invert(inverses[i].mat, inverse)) { printf("Vanishing determinant in test %u\n", i); } if (!check_diag(i, inverse, inverses[i].inv)) break; } printf("Matrix-algebra regression test succeeded\n"); exit(0); } gpsd-3.15/test_mktime.c0000664000175000017500000001535712506326326013256 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include "gps.h" #include "compiler.h" 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 */ {{ 7, 14, 3, 19, 0, 138, 0, 0, 0, 0, 0, }, 0x7fffffff }, /* upper limit */ {{ 0, 0, 12, 1, 0, 99, 0, 0, 0, 0, 0, }, 915192000 }, /* leap year */ {{ 0, 0, 12, 1, 1, 99, 0, 0, 0, 0, 0, }, 917870400 }, /* leap year */ {{ 0, 0, 12, 1, 2, 99, 0, 0, 0, 0, 0, }, 920289600 }, /* leap year */ {{ 0, 0, 12, 1, 8, 99, 0, 0, 0, 0, 0, }, 936187200 }, /* leap year */ {{ 0, 0, 12, 1, 0, 100, 0, 0, 0, 0, 0, }, 946728000 }, /* leap year */ {{ 0, 0, 12, 1, 1, 100, 0, 0, 0, 0, 0, }, 949406400 }, /* leap year */ {{ 0, 0, 12, 1, 2, 100, 0, 0, 0, 0, 0, }, 951912000 }, /* leap year */ {{ 0, 0, 12, 1, 8, 100, 0, 0, 0, 0, 0, }, 967809600 }, /* leap year */ {{ 0, 0, 12, 1, 0, 101, 0, 0, 0, 0, 0, }, 978350400 }, /* leap year */ {{ 0, 0, 12, 1, 1, 101, 0, 0, 0, 0, 0, }, 981028800 }, /* leap year */ {{ 0, 0, 12, 1, 2, 101, 0, 0, 0, 0, 0, }, 983448000 }, /* leap year */ {{ 0, 0, 12, 1, 8, 101, 0, 0, 0, 0, 0, }, 999345600 }, /* leap year */ {{ 0, 0, 12, 1, 0, 102, 0, 0, 0, 0, 0, }, 1009886400 }, /* leap year */ {{ 0, 0, 12, 1, 1, 102, 0, 0, 0, 0, 0, }, 1012564800 }, /* leap year */ {{ 0, 0, 12, 1, 2, 102, 0, 0, 0, 0, 0, }, 1014984000 }, /* leap year */ {{ 0, 0, 12, 1, 8, 102, 0, 0, 0, 0, 0, }, 1030881600 }, /* leap year */ {{ 0, 0, 12, 1, 0, 103, 0, 0, 0, 0, 0, }, 1041422400 }, /* leap year */ {{ 0, 0, 12, 1, 1, 103, 0, 0, 0, 0, 0, }, 1044100800 }, /* leap year */ {{ 0, 0, 12, 1, 2, 103, 0, 0, 0, 0, 0, }, 1046520000 }, /* leap year */ {{ 0, 0, 12, 1, 8, 103, 0, 0, 0, 0, 0, }, 1062417600 }, /* leap year */ {{ 0, 0, 12, 1, 0, 104, 0, 0, 0, 0, 0, }, 1072958400 }, /* leap year */ {{ 0, 0, 12, 1, 1, 104, 0, 0, 0, 0, 0, }, 1075636800 }, /* leap year */ {{ 0, 0, 12, 1, 2, 104, 0, 0, 0, 0, 0, }, 1078142400 }, /* leap year */ {{ 0, 0, 12, 1, 8, 104, 0, 0, 0, 0, 0, }, 1094040000 }, /* leap year */ {{ 0, 0, 12, 1, 0, 108, 0, 0, 0, 0, 0, }, 1199188800 }, /* leap year */ {{ 0, 0, 12, 1, 1, 108, 0, 0, 0, 0, 0, }, 1201867200 }, /* leap year */ {{ 0, 0, 12, 1, 2, 108, 0, 0, 0, 0, 0, }, 1204372800 }, /* leap year */ {{ 0, 0, 12, 1, 8, 108, 0, 0, 0, 0, 0, }, 1220270400 }, /* leap year */ {{ 59, 59, 23, 31, 12, 110, 0, 0, 0, 0, 0, }, 1296518399 }, /* year wrap */ {{ 0, 0, 0, 1, 0, 111, 0, 0, 0, 0, 0, }, 1293840000 }, /* year wrap */ {{ 59, 59, 23, 31, 12, 111, 0, 0, 0, 0, 0, }, 1328054399 }, /* year wrap */ {{ 0, 0, 0, 1, 0, 112, 0, 0, 0, 0, 0, }, 1325376000 }, /* year wrap */ {{ 59, 59, 23, 31, 12, 112, 0, 0, 0, 0, 0, }, 1359676799 }, /* year wrap */ {{ 0, 0, 0, 1, 0, 113, 0, 0, 0, 0, 0, }, 1356998400 }, /* year wrap */ {{ 59, 59, 23, 31, 0, 115, 0, 0, 0, 0, 0, }, 1422748799 }, /* month wrap */ {{ 0, 0, 0, 1, 1, 115, 0, 0, 0, 0, 0, }, 1422748800 }, /* month wrap */ {{ 59, 59, 23, 28, 1, 115, 0, 0, 0, 0, 0, }, 1425167999 }, /* month wrap */ {{ 0, 0, 0, 1, 2, 115, 0, 0, 0, 0, 0, }, 1425168000 }, /* month wrap */ {{ 59, 59, 23, 31, 2, 115, 0, 0, 0, 0, 0, }, 1427846399 }, /* month wrap */ {{ 0, 0, 0, 1, 3, 115, 0, 0, 0, 0, 0, }, 1427846400 }, /* month wrap */ {{ 59, 59, 23, 30, 3, 115, 0, 0, 0, 0, 0, }, 1430438399 }, /* month wrap */ {{ 0, 0, 0, 1, 4, 115, 0, 0, 0, 0, 0, }, 1430438400 }, /* month wrap */ {{ 59, 59, 23, 31, 4, 115, 0, 0, 0, 0, 0, }, 1433116799 }, /* month wrap */ {{ 0, 0, 0, 1, 5, 115, 0, 0, 0, 0, 0, }, 1433116800 }, /* month wrap */ {{ 59, 59, 23, 30, 5, 115, 0, 0, 0, 0, 0, }, 1435708799 }, /* month wrap */ {{ 0, 0, 0, 1, 6, 115, 0, 0, 0, 0, 0, }, 1435708800 }, /* month wrap */ {{ 59, 59, 23, 31, 6, 115, 0, 0, 0, 0, 0, }, 1438387199 }, /* month wrap */ {{ 0, 0, 0, 1, 7, 115, 0, 0, 0, 0, 0, }, 1438387200 }, /* month wrap */ {{ 59, 59, 23, 31, 7, 115, 0, 0, 0, 0, 0, }, 1441065599 }, /* month wrap */ {{ 0, 0, 0, 1, 8, 115, 0, 0, 0, 0, 0, }, 1441065600 }, /* month wrap */ {{ 59, 59, 23, 30, 8, 115, 0, 0, 0, 0, 0, }, 1443657599 }, /* month wrap */ {{ 0, 0, 0, 1, 9, 115, 0, 0, 0, 0, 0, }, 1443657600 }, /* month wrap */ {{ 59, 59, 23, 31, 9, 115, 0, 0, 0, 0, 0, }, 1446335999 }, /* month wrap */ {{ 0, 0, 0, 1, 10, 115, 0, 0, 0, 0, 0, }, 1446336000 }, /* month wrap */ {{ 59, 59, 23, 30, 10, 115, 0, 0, 0, 0, 0, }, 1448927999 }, /* month wrap */ {{ 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* */ }; int main(int argc UNUSED, char *argv[] UNUSED) { int i; char tbuf[128]; time_t ts; bool failed = false; (void)setenv("TZ", "GMT", 1); for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) { ts = mktime(&tests[i].t); 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; } /* end */ gpsd-3.15/test_nmea20000000775000175000017500000000550512520742615012765 0ustar esresr#!/bin/sh # # The regression-test driver script for the nmea2000 driver. # CAN is a bit different from normal serial interfaces. # GPSD_PORT=2948 CAN_PLAYER=canplayer CAN_UNIT="vcan0" BUILD=0 # Requires GNU date extensions # Should return an empty blank string if those are not present. STARTTIME=`date +"%s" 2>/dev/null` # We need to have the build directory in $GPSD_HOME to find the new gpsd if [ "`dirname $0`" = "." ]; then GPSD_HOME=`pwd` else GPSD_HOME=`dirname $0` fi version() { echo echo `basename $0`" : Version v0.20"; echo } usage() { version; echo "usage :" `basename $0` " [-S ] [-u ] [-p ] [-b] "; echo " :" `basename $0` " -v"; echo " :" `basename $0` " -h"; echo " Options include:"; echo " -S = Port for gpsd communication. Default is 2948."; echo " -u = Used CAN device. Default is \"vcan0\""; echo " -p = Programm to replay logfile. Default is \"canplayer\""; echo " -b = Create testfile.chk instead of checking it."; echo " -v = Print version and exit."; echo " -h = Print this helptext and exit."; echo " = A file created by \"candump -l >\"."; echo } device() { echo echo "CAN device \"${CAN_UNIT}\" do not exit." echo "Try: sudo ./gpsinit vcan " echo } can_utils() ( echo echo "Command to play CAN logfile \"${CAN_PLAYER}\" do not exist." echo "Try to install \"can-utils\" from your distribution." echo "I your distibution do not provide \"can-utils\", then" echo "git clone https://gitorious.org/linux-can/can-utils.git" echo "in a directory outside of gpsd, build and install it." echo "On most linux systems, \"make\", and then \"sudo make install\" works." echo ) while getopts :S:u:p:vhb opt do case ${opt} in S) GPSD_PORT=${OPTARG};; u) CAN_UNIT=${OPTARG};; p) CAN_PLAYER=${OPTARG};; b) BUILD=1;; v) version; exit 0;; h) usage; exit 0;; \?) usage; exit 1;; esac done shift $((${OPTIND} - 1)) if [ -z $1 ]; then usage; exit 1; fi TEST_FILE=$1 if [ `ifconfig -a | grep ${CAN_UNIT} | wc -c` -eq 0 ]; then device; exit 1; fi if [ `command -v ${CAN_PLAYER} | wc -c` -eq 0 ]; then can_utils; exit 1; fi TMP_PID_FILE=`mktemp` TMP_OUT_FILE=`mktemp` ${GPSD_HOME}/gpsd -n -G -D0 -S ${GPSD_PORT} -P ${TMP_PID_FILE} nmea2000://${CAN_UNIT} sleep 1 ${GPSD_HOME}/gpspipe -d -r -w -S -o ${TMP_OUT_FILE} :${GPSD_PORT} sleep 1 ${CAN_PLAYER} -I${TEST_FILE} ${CAN_UNIT}=can0 sleep 1 kill `cat ${TMP_PID_FILE}` sleep 1 if [ ${BUILD} -ne 0 ] then cp ${TMP_OUT_FILE} ${TEST_FILE}.chk else diff ${TEST_FILE}.chk ${TMP_OUT_FILE} fi rm -f ${TMP_PID_FILE} rm -f ${TMP_OUT_FILE} gpsd-3.15/test_packet.c0000664000175000017500000002553612506331162013231 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include "gpsd.h" static int verbose = 0; struct map { char *legend; char test[MAX_PACKET_LENGTH + 1]; size_t testlen; int garbage_offset; int type; }; /* *INDENT-OFF* */ static struct map singletests[] = { /* NMEA tests */ { .legend = "NMEA packet with checksum (1)", .test = "$GPVTG,308.74,T,,M,0.00,N,0.0,K*68\r\n", .testlen = 36, .garbage_offset = 0, NMEA_PACKET, }, { .legend = "NMEA packet with checksum (2)", .test = "$GPGGA,110534.994,4002.1425,N,07531.2585,W,0,00,50.0,172.7,M,-33.8,M,0.0,0000*7A\r\n", .testlen = 82, .garbage_offset = 0, .type = NMEA_PACKET, }, { .legend = "NMEA packet with checksum and 4 chars of leading garbage", .test = "\xff\xbf\x00\xbf$GPVTG,308.74,T,,M,0.00,N,0.0,K*68\r\n", .testlen = 40, .garbage_offset = 4, .type = NMEA_PACKET, }, { .legend = "NMEA packet without checksum", .test = "$PSRF105,1\r\n", .testlen = 12, .garbage_offset = 0, .type = NMEA_PACKET, }, { .legend = "NMEA packet with wrong checksum", .test = "$GPVTG,308.74,T,,M,0.00,N,0.0,K*28\r\n", .testlen = 36, .garbage_offset = 0, .type = BAD_PACKET, }, /* SiRF tests */ { .legend = "SiRF WAAS version ID", .test = { 0xA0, 0xA2, 0x00, 0x15, 0x06, 0x06, 0x31, 0x2E, 0x32, 0x2E, 0x30, 0x44, 0x4B, 0x49, 0x54, 0x31, 0x31, 0x39, 0x20, 0x53, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x82, 0xB0, 0xB3}, .testlen = 29, .garbage_offset = 0, .type = SIRF_PACKET, }, { .legend = "SiRF WAAS version ID with 3 chars of leading garbage", .test = { 0xff, 0x00, 0xff, 0xA0, 0xA2, 0x00, 0x15, 0x06, 0x06, 0x31, 0x2E, 0x32, 0x2E, 0x30, 0x44, 0x4B, 0x49, 0x54, 0x31, 0x31, 0x39, 0x20, 0x53, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x82, 0xB0, 0xB3}, .testlen = 32, .garbage_offset = 3, .type = SIRF_PACKET, }, { .legend = "SiRF WAAS version ID with wrong checksum", .test = { 0xA0, 0xA2, 0x00, 0x15, 0x06, 0x06, 0x31, 0x2E, 0x32, 0x2E, 0x30, 0x44, 0x4B, 0x49, 0x54, 0x31, 0x31, 0x39, 0x20, 0x53, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xB0, 0xB3}, .testlen = 29, .garbage_offset = 0, .type = BAD_PACKET, }, { .legend = "SiRF WAAS version ID with bad length", .test = { 0xA0, 0xA2, 0xff, 0x15, 0x06, 0x06, 0x31, 0x2E, 0x32, 0x2E, 0x30, 0x44, 0x4B, 0x49, 0x54, 0x31, 0x31, 0x39, 0x20, 0x53, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x82, 0xB0, 0xB3}, .testlen = 29, .garbage_offset = 0, .type = BAD_PACKET, }, /* Zodiac tests */ { .legend = "Zodiac binary 1000 Geodetic Status Output Message", .test = { 0xff, 0x81, 0xe8, 0x03, 0x31, 0x00, 0x00, 0x00, 0xe8, 0x79, 0x74, 0x0e, 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x03, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x06, 0x00, 0xcd, 0x07, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x7b, 0x0d, 0x00, 0x00, 0x12, 0x6b, 0xa7, 0x04, 0x41, 0x75, 0x32, 0xf8, 0x03, 0x1f, 0x00, 0x00, 0xe6, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf6, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0xd9, 0x12, 0x90, 0xd0, 0x03, 0x00, 0x00, 0xa3, 0xe1, 0x11, 0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xe1, 0x11, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x93, 0x04, 0x00, 0x04, 0xaa}, .testlen = 110, .garbage_offset = 0, .type = ZODIAC_PACKET, }, /* EverMore tests */ { .legend = "EverMore status packet 0x20", .test = { 0x10, 0x02, 0x0D, 0x20, 0xE1, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x5b, 0x10, 0x03}, .testlen = 17, .garbage_offset = 0, .type = EVERMORE_PACKET, }, { .legend = "EverMore packet 0x04 with 0x10 0x10 sequence", .test = { 0x10, 0x02, 0x0f, 0x04, 0x00, 0x00, 0x10, 0x10, 0xa7, 0x13, 0x03, 0x2c, 0x26, 0x24, 0x0a, 0x17, 0x00, 0x68, 0x10, 0x03}, .testlen = 20, .garbage_offset = 0, .type = EVERMORE_PACKET, }, { .legend = "EverMore packet 0x04 with 0x10 0x10 sequence, some noise before packet data", .test = { 0x10, 0x03, 0xff, 0x10, 0x02, 0x0f, 0x04, 0x00, 0x00, 0x10, 0x10, 0xa7, 0x13, 0x03, 0x2c, 0x26, 0x24, 0x0a, 0x17, 0x00, 0x68, 0x10, 0x03}, .testlen = 23, .garbage_offset = 3, .type = EVERMORE_PACKET, }, { .legend = "EverMore packet 0x04, 0x10 and some other data at the beginning", .test = { 0x10, 0x12, 0x10, 0x03, 0xff, 0x10, 0x02, 0x0f, 0x04, 0x00, 0x00, 0x10, 0x10, 0xa7, 0x13, 0x03, 0x2c, 0x26, 0x24, 0x0a, 0x17, 0x00, 0x68, 0x10, 0x03}, .testlen = 25, .garbage_offset = 5, .type = EVERMORE_PACKET, }, { .legend = "EverMore packet 0x04, 0x10 three times at the beginning", .test = { 0x10, 0x10, 0x10, 0x10, 0x02, 0x0f, 0x04, 0x00, 0x00, 0x10, 0x10, 0xa7, 0x13, 0x03, 0x2c, 0x26, 0x24, 0x0a, 0x17, 0x00, 0x68, 0x10, 0x03}, .testlen = 23, .garbage_offset = 3, .type = EVERMORE_PACKET, }, { /* from page 4-3 of RTCM 10403.1 */ .legend = "RTCM104V3 type 1005 packet", /* * Reference Station Id = 2003 * GPS Service supported, but not GLONASS or Galileo * ARP ECEF-X = 1114104.5999 meters * ARP ECEF-Y = -4850729.7108 meters * ARP ECEF-Z = 3975521.4643 meters */ .test = { 0xD3, 0x00, 0x13, 0x3E, 0xD7, 0xD3, 0x02, 0x02, 0x98, 0x0E, 0xDE, 0xEF, 0x34, 0xB4, 0xBD, 0x62, 0xAC, 0x09, 0x41, 0x98, 0x6F, 0x33, 0x36, 0x0B, 0x98, }, .testlen = 25, .garbage_offset = 0, .type = RTCM3_PACKET, }, { .legend = "RTCM104V3 type 1005 packet with 4th byte garbled", .test = { 0xD3, 0x00, 0x13, 0x3F, 0xD7, 0xD3, 0x02, 0x02, 0x98, 0x0E, 0xDE, 0xEF, 0x34, 0xB4, 0xBD, 0x62, 0xAC, 0x09, 0x41, 0x98, 0x6F, 0x33, 0x36, 0x0B, 0x98, }, .testlen = 25, .garbage_offset = 0, .type = BAD_PACKET, }, { /* from page 3-71 of the RTCM 10403.1 */ .legend = "RTCM104V3 type 1029 packet", .test = { 0xD3, 0x00, 0x27, 0x40, 0x50, 0x17, 0x00, 0x84, 0x73, 0x6E, 0x15, 0x1E, 0x55, 0x54, 0x46, 0x2D, 0x38, 0x20, 0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x80, 0xD0, 0xBA, 0xD0, 0xB0, 0x20, 0x77, 0xC3, 0xB6, 0x72, 0x74, 0x65, 0x72, 0xED, 0xA3, 0x3B }, .testlen = 45, .garbage_offset = 0, .type = RTCM3_PACKET, }, }; /* *INDENT-ON* */ /* *INDENT-OFF* */ static struct map runontests[] = { /* NMEA tests */ { .legend = "Double NMEA packet with checksum", .test = "$GPVTG,308.74,T,,M,0.00,N,0.0,K*68\r\n$GPGGA,110534.994,4002.1425,N,07531.2585,W,0,00,50.0,172.7,M,-33.8,M,0.0,0000*7A\r\n", .testlen = 118, 0, NMEA_PACKET, }, }; /* *INDENT-ON* */ static int packet_test(struct map *mp) { struct gps_lexer_t lexer; int failure = 0; lexer_init(&lexer); lexer.errout.debug = verbose; memcpy(lexer.inbufptr = lexer.inbuffer, mp->test, mp->testlen); lexer.inbuflen = mp->testlen; packet_parse(&lexer); if (lexer.type != mp->type) printf("%2zi: %s test FAILED (packet type %d wrong).\n", mp - singletests + 1, mp->legend, lexer.type); else if (memcmp (mp->test + mp->garbage_offset, lexer.outbuffer, lexer.outbuflen)) { printf("%2zi: %s test FAILED (data garbled).\n", mp - singletests + 1, mp->legend); ++failure; } else printf("%2zi: %s test succeeded.\n", mp - singletests + 1, mp->legend); return failure; } static void runon_test(struct map *mp) { struct gps_lexer_t lexer; int nullfd = open("/dev/null", O_RDONLY); ssize_t st; lexer_init(&lexer); lexer.errout.debug = verbose; memcpy(lexer.inbufptr = lexer.inbuffer, mp->test, mp->testlen); lexer.inbuflen = mp->testlen; (void)fputs(mp->test, stdout); do { st = packet_get(nullfd, &lexer); //printf("packet_parse() returned %zd\n", st); } while (st > 0); } static int property_check(void) { const struct gps_type_t **dp; int status; for (dp = gpsd_drivers; *dp; dp++) { if (*dp == NULL || (*dp)->packet_type == COMMENT_PACKET) continue; #ifdef RECONFIGURE_ENABLE if (CONTROLLABLE(*dp)) (void)fputs("control\t", stdout); else (void)fputs(".\t", stdout); if ((*dp)->event_hook != NULL) (void)fputs("hook\t", stdout); else (void)fputs(".\t", stdout); #endif /* RECONFIGURE_ENABLE */ if ((*dp)->trigger != NULL) (void)fputs("trigger\t", stdout); else if ((*dp)->probe_detect != NULL) (void)fputs("probe\t", stdout); else (void)fputs(".\t", stdout); #ifdef CONTROLSEND_ENABLE if ((*dp)->control_send != NULL) (void)fputs("send\t", stdout); else (void)fputs(".\t", stdout); #endif /* CONTROLSEND_ENABLE */ if ((*dp)->packet_type > NMEA_PACKET) (void)fputs("binary\t", stdout); else (void)fputs("NMEA\t", stdout); #ifdef CONTROLSEND_ENABLE if (STICKY(*dp)) (void)fputs("sticky\t", stdout); else (void)fputs(".\t", stdout); #endif /* CONTROLSEND_ENABLE */ (void)puts((*dp)->type_name); } status = EXIT_SUCCESS; for (dp = gpsd_drivers; *dp; dp++) { if (*dp == NULL || (*dp)->packet_type == COMMENT_PACKET) continue; #if defined(CONTROLSEND_ENABLE) && defined(RECONFIGURE_ENABLE) if (CONTROLLABLE(*dp) && (*dp)->control_send == NULL) { (void)fprintf(stderr, "%s has control methods but no send\n", (*dp)->type_name); status = EXIT_FAILURE; } if ((*dp)->event_hook != NULL && (*dp)->control_send == NULL) { (void)fprintf(stderr, "%s has event hook but no send\n", (*dp)->type_name); status = EXIT_FAILURE; } if ((*dp)->probe_detect != NULL && (*dp)->trigger != NULL) { (void)fprintf(stderr, "%s both a probe and a trigger string\n", (*dp)->type_name); status = EXIT_FAILURE; } #endif /* CONTROLSEND_ENABLE && RECONFIGURE_ENABLE*/ } return status; } int main(int argc, char *argv[]) { struct map *mp; int failcount = 0; int option, singletest = 0; verbose = 0; while ((option = getopt(argc, argv, "ce:t:v:")) != -1) { switch (option) { case 'c': exit(property_check()); case 'e': mp = singletests + atoi(optarg) - 1; (void)fwrite(mp->test, mp->testlen, sizeof(char), stdout); (void)fflush(stdout); exit(EXIT_SUCCESS); case 't': singletest = atoi(optarg); break; case 'v': verbose = atoi(optarg); break; } } if (singletest) failcount += packet_test(singletests + singletest - 1); else { (void)fputs("=== Packet identification tests ===\n", stdout); for (mp = singletests; mp < singletests + sizeof(singletests) / sizeof(singletests[0]); mp++) failcount += packet_test(mp); (void)fputs("=== EOF with buffer nonempty test ===\n", stdout); runon_test(&runontests[0]); } exit(failcount > 0 ? EXIT_FAILURE : EXIT_SUCCESS); } gpsd-3.15/test_timespec.c0000664000175000017500000002146012520742615013570 0ustar esresr/* * Unit test for timespec's * */ #include #include #include #include #include /* required by C99, for int32_t */ #include /* for time_t */ #include #include #include "compiler.h" #include "revision.h" #include "ppsthread.h" #include "timespec.h" #define TS_ZERO {0,0} #define TS_ZERO_ONE {0,1} #define TS_ZERO_TWO {0,2} #define TS_ZERO_TREES {0,333333333} #define TS_ZERO_SIXS7 {0,666666667} #define TS_ZERO_NINES {0,999999999} #define TS_ONE {1,0} #define TS_ONE_ONE {1,1} #define TS_TWO {2,0} #define TS_N_ZERO_ONE {0,-1} #define TS_N_ZERO_TWO {0,-2} #define TS_N_ZERO_TREES {0,-333333333} #define TS_N_ZERO_NINES {0,-999999999} #define TS_N_ONE {-1,0} /* Dec 31, 23:59 2037 GMT */ #define TS_2037 {2145916799, 0} #define TS_2037_ONE {2145916799, 1} #define TS_2037_TWO {2145916799, 2} #define TS_2037_X {2145916799, 123456789} #define TS_2037_TREES {2145916799, 333333333} #define TS_2037_SIXS7 {2145916799, 666666667} #define TS_2037_NINES {2145916799, 999999999} #define TS_N_2037_TREES {-2145916799, -333333333} #define TS_N_2037_NINES {-2145916799, -999999999} /* a 32 bit copy to force a 32 bit long */ #define timespec_diff_ns32(x, y) (int32_t)((int32_t)(((x).tv_sec-(y).tv_sec)*1000000000)+(x).tv_nsec-(y).tv_nsec) struct subtract_test { struct timespec a; struct timespec b; struct timespec c; bool last; }; struct subtract_test subtract_tests[] = { { TS_ZERO, TS_ZERO, TS_ZERO, 0}, { TS_ONE, TS_ONE, TS_ZERO, 0}, { TS_ZERO_ONE, TS_ZERO_ONE, TS_ZERO, 0}, { TS_ONE_ONE, TS_ONE_ONE, TS_ZERO, 0}, { TS_N_ONE, TS_N_ONE, TS_ZERO, 0}, { TS_N_ZERO_ONE, TS_N_ZERO_ONE, TS_ZERO, 0}, { TS_ZERO_TREES, TS_ZERO_TREES, TS_ZERO, 0}, { TS_ZERO_NINES, TS_ZERO_NINES, TS_ZERO, 0}, { TS_ZERO, TS_N_ONE, TS_ONE, 0}, { TS_ONE, TS_ZERO, TS_ONE, 0}, { TS_TWO, TS_ONE, TS_ONE, 0}, { TS_ONE_ONE, TS_ONE, TS_ZERO_ONE, 0}, { TS_ONE, TS_ZERO_TREES, TS_ZERO_SIXS7, 0}, { TS_ONE, TS_ZERO_NINES, TS_ZERO_ONE, 0}, { TS_ZERO_TWO, TS_ZERO_ONE, TS_ZERO_ONE, 0}, { TS_2037_ONE, TS_2037, TS_ZERO_ONE, 0}, { TS_ONE_ONE, TS_ZERO_NINES, TS_ZERO_TWO, 0}, { TS_2037_NINES, TS_2037, TS_ZERO_NINES, 0}, { TS_2037_TREES, TS_ZERO, TS_2037_TREES, 0}, { TS_2037_SIXS7, TS_2037, TS_ZERO_SIXS7, 0}, { TS_2037_TREES, TS_2037, TS_ZERO_TREES, 0}, { TS_2037_NINES, TS_ZERO, TS_2037_NINES, 0}, { TS_ZERO, TS_ONE, TS_N_ONE, 0}, { TS_ONE, TS_TWO, TS_N_ONE, 0}, { TS_ZERO, TS_ZERO_ONE, TS_N_ZERO_ONE, 0}, { TS_ONE, TS_ONE_ONE, TS_N_ZERO_ONE, 0}, { TS_ZERO_ONE, TS_ZERO_TWO, TS_N_ZERO_ONE, 0}, { TS_2037, TS_2037_ONE, TS_N_ZERO_ONE, 0}, { TS_ZERO_NINES, TS_ONE_ONE, TS_N_ZERO_TWO, 0}, { TS_2037, TS_2037_NINES, TS_N_ZERO_NINES, 0}, { TS_ZERO, TS_2037_NINES, TS_N_2037_NINES, 1}, }; struct format_test { struct timespec input; char *expected; bool last; }; struct format_test format_tests[] = { { TS_ZERO, " 0.000000000", 0}, { TS_ZERO_ONE, " 0.000000001", 0}, { TS_ZERO_TWO, " 0.000000002", 0}, { TS_ZERO_NINES, " 0.999999999", 0}, { TS_ONE, " 1.000000000", 0}, { TS_ONE_ONE, " 1.000000001", 0}, { TS_TWO, " 2.000000000", 0}, { TS_N_ZERO_ONE, "-0.000000001", 0}, { TS_N_ZERO_TWO, "-0.000000002", 0}, { TS_N_ZERO_NINES, "-0.999999999", 0}, { TS_N_ONE, "-1.000000000", 0}, { { -1, 1}, "-1.000000001", 0}, { { -1, -1}, "-1.000000001", 0}, { TS_2037, " 2145916799.000000000", 0}, { TS_2037_ONE, " 2145916799.000000001", 0}, { TS_2037_NINES, " 2145916799.999999999", 1}, }; static int test_subtract( int verbose ) { struct subtract_test *p = subtract_tests; int fail_count = 0; while ( 1 ) { char buf_a[TIMESPEC_LEN]; char buf_b[TIMESPEC_LEN]; char buf_c[TIMESPEC_LEN]; char buf_r[TIMESPEC_LEN]; struct timespec r; TS_SUB(&r, &p->a, &p->b); timespec_str( &p->a, buf_a, sizeof(buf_a) ); timespec_str( &p->b, buf_b, sizeof(buf_b) ); timespec_str( &p->c, buf_c, sizeof(buf_c) ); timespec_str( &r, buf_r, sizeof(buf_r) ); if ( (p->c.tv_sec != r.tv_sec) || (p->c.tv_nsec != r.tv_nsec) ) { printf("%21s - %21s = %21s, FAIL s/b %21s\n", buf_a, buf_b, buf_r, buf_c); fail_count++; } else if ( verbose ) { printf("%21s - %21s = %21s\n", buf_a, buf_b, buf_r); } if ( p->last ) { break; } p++; }; if ( fail_count ) { printf("subtract test failed %d tests\n", fail_count ); } else { puts("subtract test succeeded\n"); } return fail_count; } static int test_format(int verbose ) { struct format_test *p = format_tests; int fail_count = 0; while ( 1 ) { char buf[TIMESPEC_LEN]; int fail; timespec_str( &p->input, buf, sizeof(buf) ); fail = strncmp( buf, p->expected, TIMESPEC_LEN); if ( fail ) { printf("%21s, FAIL s/b: %21s\n", buf, p->expected); fail_count++; } else if ( verbose ) { printf("%21s\n", buf); } if ( p->last ) { break; } p++; }; if ( fail_count ) { printf("timespec_str test failed %d tests\n", fail_count ); } else { puts("timespec_str test succeeded\n"); } return fail_count; } struct timespec exs[] = { TS_ZERO_ONE, TS_ZERO_TWO, TS_ZERO_NINES, TS_ONE, TS_ONE_ONE, TS_TWO, TS_2037, TS_2037_ONE, TS_2037_TWO, TS_2037_X, TS_2037_NINES, TS_ZERO, }; static int ex_subtract_float( void ) { struct subtract_test *p = subtract_tests; int fail_count = 0; printf( "\n\nsubtract test examples using doubles/floats:\n" " TS: TS_SUB()\n" " l: timespec_to_ns() math\n" " l32: timespec_to_ns() math with 32 bit long\n" " d: double float math\n" " f: float math\n" "\n"); while ( 1 ) { char buf_a[TIMESPEC_LEN]; char buf_b[TIMESPEC_LEN]; char buf_c[TIMESPEC_LEN]; char buf_r[TIMESPEC_LEN]; struct timespec ts_r; float f_a, f_b, f_r; double d_a, d_b, d_r; long l; int32_t l32; /* simulate a 32 bit long */ /* timespec math */ TS_SUB(&ts_r, &p->a, &p->b); /* float math */ f_a = TSTONS( &p->a ); f_b = TSTONS( &p->b ); f_r = f_a - f_b; /* double float math */ d_a = TSTONS( &p->a ); d_b = TSTONS( &p->b ); d_r = d_a - d_b; /* long math */ l = timespec_diff_ns( p->a, p->b); l32 = timespec_diff_ns32( p->a, p->b); timespec_str( &p->a, buf_a, sizeof(buf_a) ); timespec_str( &p->b, buf_b, sizeof(buf_b) ); timespec_str( &p->c, buf_c, sizeof(buf_c) ); timespec_str( &ts_r, buf_r, sizeof(buf_r) ); printf(" TS; %21s - %21s = %21s\n", buf_a, buf_b, buf_r); printf(" l; %21s - %21s = %21ld\n", buf_a, buf_b, l); printf(" l32; %21s - %21s = %21ld\n", buf_a, buf_b, (long)l32); printf(" d; %21.9f - %21.9f = %21.9f\n", d_a, d_b, d_r); printf(" f; %21.9f - %21.9f = %21.9f\n", f_a, f_b, f_r); puts("\n"); if ( p->last ) { break; } p++; }; if ( fail_count ) { // printf("subtract test failed %d tests\n", fail_count ); } else { // puts("subtract test succeeded\n"); } return fail_count; } static void ex_precision(void) { char buf[TIMESPEC_LEN]; struct timespec *v = exs; puts( "\nPrecision examples:\n\n Simple conversions\n"); printf( "\n%10stimespec%14s32 bit long%11sdouble%16sfloat\n\n", "", "", "", ""); while ( 1 ) { float f; double d; int32_t l32; d = TSTONS( v ); l32 = (int32_t)(v->tv_sec * 1000000000)+(int32_t)v->tv_nsec; f = (float) d; timespec_str( v, buf, sizeof(buf) ); printf( "%21s %21ld %21.9f %21.9f \n", buf, (long)l32, d, f); if ( ( 0 == v->tv_sec ) && ( 0 == v->tv_nsec) ) { /* done */ break; } v++; } printf( "\n\nSubtraction examples:\n"); ex_subtract_float(); } int main(int argc, char *argv[]) { int fail_count = 0; int verbose = 0; int option; while ((option = getopt(argc, argv, "h?vV")) != -1) { switch (option) { default: fail_count = 1; /* FALL THROUGH! */ case '?': case 'h': (void)fputs("usage: test_timespec [-v] [-V]\n", stderr); exit(fail_count); case 'V': (void)fprintf( stderr, "test_timespec %s\n", VERSION); exit(EXIT_SUCCESS); case 'v': verbose = 1; break; } } fail_count = test_format( verbose ); fail_count += test_subtract( verbose ); if ( fail_count ) { printf("timespec tests failed %d tests\n", fail_count ); exit(1); } printf("timespec tests succeeded\n"); if ( verbose ) { ex_precision(); } exit(0); } gpsd-3.15/test_trig.c0000664000175000017500000000261612506317045012725 0ustar esresr/* * Copyright (c) 2006 Chris Kuethe * Copyright (c) 2009 BBN Technologies (Greg Troxel) * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * This program provides a way to check sin/cos. */ #include #include int test_trig(void); int main(void) { test_trig(); /* For now, no evaluation. */ return 0; } #define Deg2Rad(x) ((x) * (2 * M_PI / 360.0)) int test_trig(void) { int i; double arg; double res; for (i = 0; i <= 360; i++) { arg = Deg2Rad(i); res = sin(arg); printf("sin(%.30f) = %.30f\n", arg, res); } for (i = 0; i <= 360; i++) { arg = Deg2Rad(i); res = cos(arg); printf("cos(%.30f) = %.30f\n", arg, res); } /* Always claim success. */ return 0; } gpsd-3.15/timebase.c0000664000175000017500000003574312520742615012522 0ustar esresr/***************************************************************************** All of gpsd's assumptions about time and GPS time reporting live in this file. This is a work in progress. Currently (3.11) GPSD requires that the host system clock be accurate to within one second. It would be nice to relax this to "accurate within one GPS rollover period" for receivers reporting GPS week+TOW, but this isn't possible in general. = Begin Sidebar: Why Leap Seconds = Read this carefully, and if there are errors, please correct. An understanding of the following terms is critical to make sense of the situation, which would be farcical if it were not serious. We discuss four timescales: 1. TAI, International Atomic Time, which ticks smoothly at the rate of the SI second. TAI has no concept of a day, year, etc. TAI does not define "days" or large units, and is hence difficult for humans to parse. Also, TAI is not broadcast or generally available. 2. GPS Time, which ticks at at the rate of TAI, but has a constant offset from it. For other GNSS systems, the offset is different. The offset is of purely historical interest, being chosen by each GNSS operator for convenience when the systems were inaugurated. In other words, only the "epoch" differs between GPS Time and TAI. 3. UT1, a smoothed earth rotation angle, which MUST return to zero once a day, (why? Because you want the sun to be overhead *each* day at the same time on your watch, no?), and ticks SI seconds (a non-integeral number of seconds will occur in a UT1 day, obviously). For those of you who still say "GMT", UT1 is the closest modern timescale. 4. UTC, Coordinated Universal Time, which ticks SI seconds. An attempt is made to keep UTC aligned with the rate of flow of seconds (TAI), and the rate of flow of days (UT1). The reason UTC has to struggle has little to do with the fact that the earth's rotation is slowing down. Although the length of the day, as measured by UT1, is lengthening in terms of the SI second, this is a very long term slowdown, and since 1980, the earth has actually speeded up. The issue simply is that the term "second" is defined in two incompatible ways: Def 1. As a fixed number (9,192,631,770) of cycles of an atomic standard. We believe this is a constant, and evidence to the contrary may involve GPSD code review, and Nobel Prizes. This is the SI second. Def 2. As 1/86400 of a "day". The number 86400 arises from 1 day == 24 * 60 * 60 secs. This is what we learn in school. Both of these have been defined separately, and the issue of leap seconds, rubber seconds, Smoothed Leap Seconds, etc, arises because we are unwilling to change the definition of either to be a derived unit of the other. At the time the SI second was defined, it was believed that Def 2 was correct, and the number in Def 1 was derived. Because of ease of measurement, Def 1 was codified, and the problem was ignored for some time. Prior to 1972, complicated formulae were used to scale the SI second, with the attendant confusion and fear when the formula would be revised. Since 1972, the start of UTC, the decision to have leap seconds means that UTC ticks SI seconds. Every 86400 SI seconds, we declare a new day, and we let the error (UT1 - UTC) build up. This is of the order of a few ms each midnight, not always the same way (think earthquakes that move the earth's crust). Once the error has built up substantially, every few years, we (and by "we", I mean M. Daniel Gambis at the IERS) declare that a future day will have 86401 secs. This is the Leap Second. Note that this often overcorrects, but if we wait a few months, the error will disappear. An animation of this process is available at: http://space-geodesy.nasa.gov/multimedia/EarthOrientationAnimations/UT1.html Clear? Two last things: 1. Again, the earth slowing down is NOT the cause of leap seconds, except very indirectly. It is the conflict between the two definitions above that causes leap seconds 2. POSIX declares that there is no conflict, there are always 86400 SI secs in a day, and hence no leap seconds. The fact that ostriches survive in the wild indicates that this is not as mind-crushingly wrong as it may seem. = End Sidebar = Date and time in GPS is represented as number of weeks mod 1024 from 1980-01-06T00:00.00Z, and number of SI seconds into the week. GPS time is not leap-second corrected, and has a constant offset from TAI, but not from UTC. There are hence two issues with converting GPS Time to UTC: 1. We need to recover the epoch difference between TAI and GPS Time, which rolls over to 0 every 1024 weeks (approx 20 years). Think of this as analogous to the Y2K problem; we do not know if we are off by 1024 weeks. This is the "rollover" issue below. 2. Once we have the epoch right, we need to adjust for Leap Seconds that have been issued. (Complicating the issue is that most consumer devices may not apply the corrections when rollover occurs, as this may not be adequately tested. We hence have to accept the UTC time reported by the device, while checking it on the sly). Satellites also broadcast a current leap-second correction which is updated on (theoretically) three-month boundaries according to rotational bulletins issued by the International Earth Rotation and Reference Systems Service (IERS). Historically all corrections have been made on six-month boundaries. The leap-second correction is only included in the satellite subframe broadcast, roughly once ever 20 minutes. While the satellites do notify GPSes of upcoming leap-seconds, this notification is not necessarily processed correctly on consumer-grade devices, and will not be available at all when a GPS receiver has just cold-booted. Thus, the time reported from GPS devices, although supposed to be UTC, may be offset by an integer number of seconds between a cold boot or leap second and the following subframe broadcast. It might be best not to trust time for 20 minutes after GPSD startup if it is more than 500ms from current system time (that is long enough for an ephemeris to load) but this isn't actually implemented as the divergence will normally be only one second or less. GPS date and time are subject to a rollover problem in the 10-bit week number counter, which will re-zero every 1024 weeks (roughly every 20 years). The last rollover (and the first since GPS went live in 1980) was 1999-08-22T00:00:00Z; the next would fall in 2019, but plans are afoot to upgrade the satellite counters to 13 bits; this will delay the next rollover until 2173. For accurate time reporting, therefore, a GPS requires a supplemental time reference sufficient to identify the current rollover period, e.g. accurate to within 512 weeks. Many GPSes have a wired-in assumption about the UTC time of the last rollover and will thus report incorrect times outside the rollover period they were designed in. These conditions leave gpsd in a serious hole. Actually there are several interrelated problems: 1) Every device has some assumption about base epoch (date of last rollover) that we don't have access to. Thus, there's no way to check whether a rollover the device wasn't prepared for has occurred before gpsd startup time (making the reported UTC date invalid) without some other time source. (Some devices may keep a rollover count in NVRAM and avoid the problem; we can't tell when that's happening, either.) 2) Many NMEA devices - in fact, all that don't report ZDA - never tell us what century they think it is. Those that do report century are still subject to rollover problems. We need an external time reference for this, too. 3) Supposing we're looking at a binary protocol that returns week/tow, we can't know which rollover period we're in without an external time source. 4) Only one external time source, the host system clock, is reliably available, although it may not be accurate. 5) Another source *may* be available - the GPS leap second count, if we can get the device to report it. The latter is not a given; SiRFs before firmware rev 2.3.2 don't report it unless special subframe data reporting is enabled, which requires 38400bps. Evermore GPSes can't be made to report it at all. Furthermore, before the almanac load the GPS may report a fixed (and possibly out of date) offset. Conclusion: if the system clock isn't accurate enough that we can deduce what rollover period we're in, we're utterly hosed. Furthermore, if it's not accurate to within a second and only NMEA devices that don't emit ZDA are reporting, we don't even know what century it is! Therefore, we must assume the system clock is reliable to within a second. However, none of these caveats affect the usefulness of PPS, which tells us top of second to theoretical 50ns accuracy (actually about 1 microsecond over RS232 and roughly one poll interval over USB) and can be made to condition a local NTP instance that does *not* rely on the system clock. The combination of PPS with NTP time should be reliable regardless of what the local system clock gets up to. That is, unless NTP clock skew goes over 1 second, but this is unlikely to ever happen - and if it does the reasons will have nothing to do with GPS idiosyncracies. This file is Copyright (c) 2010 -- 2013 by the GPSD project BSD terms apply: see the file COPYING in the distribution root for details. *****************************************************************************/ #include #include #include #include "gpsd.h" #include "timebase.h" void gpsd_time_init(struct gps_context_t *context, time_t starttime) /* initialize the GPS context's time fields */ { /* * gpsd can't work with 'right' timezones (leapseconds inserted in * the timezone offset). Avoid this and all manner of other local * time issues by telling the system we want times returned in UTC. */ (void)putenv("TZ=UTC"); /* * Provides a start time for getting the century. Do this, just * in case one of our embedded deployments is still in place in * the year 2.1K. Still likely to fail if we bring up the daemon * just before a century mark, but that case is probably doomed * anyhow because of 2-digit years. */ context->leap_seconds = BUILD_LEAPSECONDS; context->century = BUILD_CENTURY; context->start_time = starttime; context->rollovers = (int)((context->start_time-GPS_EPOCH) / GPS_ROLLOVER); if (context->start_time < GPS_EPOCH) gpsd_log(&context->errout, LOG_ERROR, "system time looks bogus, dates may not be reliable.\n"); else { /* we've forced the UTC timezone, so this is actually UTC */ struct tm *now = localtime(&context->start_time); char scr[128]; /* * This is going to break our regression-test suite once a century. * I think we can live with that consequence. */ now->tm_year += 1900; context->century = now->tm_year - (now->tm_year % 100); (void)unix_to_iso8601((timestamp_t)context->start_time, scr, sizeof(scr)); gpsd_log(&context->errout, LOG_INF, "startup at %s (%d)\n", scr, (int)context->start_time); } } void gpsd_set_century(struct gps_device_t *session) /* * Interpret "Date: yyyy-mm-dd", setting the session context * century from the year. We do this so the behavior of the * regression tests won't depend on what century the daemon * started up in. */ { char *end; if (strstr((char *)session->lexer.outbuffer, "Date:") != NULL) { int year; unsigned char *cp = session->lexer.outbuffer + 5; while (isspace(*cp)) ++cp; year = (int)strtol((char *)cp, &end, 10); session->context->century = year - (year % 100); } } #ifdef NMEA_ENABLE timestamp_t gpsd_utc_resolve(struct gps_device_t *session) /* resolve a UTC date, checking for rollovers */ { /* * We'd like to *correct* for rollover the way we do for GPS week. * In theory, comparing extracted UTC against present time should * allow us to compute the device's epoch assumption. In practice, * this will be hairy and risky. */ timestamp_t t; t = (timestamp_t)mkgmtime(&session->nmea.date) + session->nmea.subseconds; session->context->valid &=~ GPS_TIME_VALID; /* * If the system clock is zero or has a small-integer value, * no further sanity-checking is possible. */ if (session->context->start_time < GPS_EPOCH) return t; /* * If the GPS is reporting a time from before the daemon started, we've * had a rollover event while the daemon was running. */ if (session->newdata.time < (timestamp_t)session->context->start_time) { char scr[128]; (void)unix_to_iso8601(session->newdata.time, scr, sizeof(scr)); gpsd_log(&session->context->errout, LOG_WARN, "GPS week rollover makes time %s (%f) invalid\n", scr, session->newdata.time); } return t; } void gpsd_century_update(struct gps_device_t *session, int century) { session->context->valid |= CENTURY_VALID; if (century > session->context->century) { /* * This mismatch is almost certainly not due to a GPS week * rollover, because that would throw the ZDA report backward * into the last rollover period instead of forward. Almost * certainly it means that a century mark has passed while * gpsd was running, and we should trust the new ZDA year. */ gpsd_log(&session->context->errout, LOG_WARN, "century rollover detected.\n"); session->context->century = century; } else if (session->context->start_time >= GPS_EPOCH && century < session->context->century) { /* * This looks like a GPS week-counter rollover. */ gpsd_log(&session->context->errout, LOG_WARN, "ZDA year less than clock year, " "probable GPS week rollover lossage\n"); session->context->valid &=~ CENTURY_VALID; } } #endif /* NMEA_ENABLE */ timestamp_t gpsd_gpstime_resolve(struct gps_device_t *session, unsigned short week, double tow) { timestamp_t t; /* * This code detects and compensates for week counter rollovers that * happen while gpsd is running. It will not save you if there was a * rollover that confused the receiver before gpsd booted up. It *will* * work even when Block IIF satellites increase the week counter width * to 13 bits. */ if ((int)week < (session->context->gps_week & 0x3ff)) { gpsd_log(&session->context->errout, LOG_INF, "GPS week 10-bit rollover detected.\n"); ++session->context->rollovers; } /* * This guard copes with both conventional GPS weeks and the "extended" * 15-or-16-bit version with no wraparound that appears in Zodiac * chips and is supposed to appear in the Geodetic Navigation * Information (0x29) packet of SiRF chips. Some SiRF firmware versions * (notably 231) actually ship the wrapped 10-bit week, despite what * the protocol reference claims. */ if (week < 1024) week += session->context->rollovers * 1024; t = GPS_EPOCH + (week * SECS_PER_WEEK) + tow; t -= session->context->leap_seconds; session->context->gps_week = week; session->context->gps_tow = tow; session->context->valid |= GPS_TIME_VALID; return t; } /* end */ gpsd-3.15/timehint.c0000664000175000017500000003502012520742615012536 0ustar esresr/* * timehint.c - put time information in SHM segment for ntpd, or to chrony * * Note that for easy debugging all logging from this file is prefixed * with PPS or NTP. * * This file is Copyright (c) 2010 by the GPSD project BSD terms apply: * see the file COPYING in the distribution root for details. */ #include #include #include #include #include #include #include #include #include #include #include "timespec.h" #include "gpsd.h" #ifdef NTPSHM_ENABLE #include "ntpshm.h" /* Note: you can start gpsd as non-root, and have it work with ntpd. * However, it will then only use the ntpshm segments 2 3, and higher. * * Ntpd always runs as root (to be able to control the system clock). * After that it often (depending on its host configuration) drops to run as * user ntpd and group ntpd. * * As of February 2015 its rules for the creation of ntpshm segments are: * * Segments 0 and 1: permissions 0600, i.e. other programs can only * read and write as root. * * Segments 2, 3, and higher: * permissions 0666, i.e. other programs can read * and write as any user. I.e.: if ntpd has been * configured to use these segments, any * unprivileged user is allowed to provide data * for synchronisation. * * By default ntpd creates 0 segments (though the documentation is * written in such a way as to suggest it creates 4). It can be * configured to create up to 217. gpsd creates two segments for each * device it can drive; by default this is 8 segments for 4 * devices,but can be higher if it was compiled with a larger value of * MAX_DEVICES. * * Started as root, gpsd does as ntpd when attaching (creating) the * segments. In contrast to ntpd, which only attaches (creates) * configured segments, gpsd creates all segments. Thus a gpsd will * by default create eight segments 0-7 that an ntpd with default * configuration does not watch. * * Started as non-root, gpsd will only attach (create) segments 2 and * above, with permissions 0666. As the permissions are for any user, * the creator does not matter. * * For each GPS module gpsd controls, it will use the attached ntpshm * segments in pairs (for coarse clock and pps source, respectively) * starting from the first found segments. I.e. started as root, one * GPS will deliver data on all segments including 0 and 1; started as * non-root, gpsd will be deliver data only on segments 2 and higher. * * Segments are allocated to activated devices on a first-come-first-served * basis. A device's segment is marked unused when the device is closed and * may be re-used by devices connected later. * * To debug, try looking at the live segments this way: * * ipcs -m * * results should look like this: * ------ Shared Memory Segments -------- * key shmid owner perms bytes nattch status * 0x4e545030 0 root 700 96 2 * 0x4e545031 32769 root 700 96 2 * 0x4e545032 163842 root 666 96 1 * 0x4e545033 196611 root 666 96 1 * 0x4e545034 253555 root 666 96 1 * 0x4e545035 367311 root 666 96 1 * * For a bit more data try this: * cat /proc/sysvipc/shm * * If gpsd can not open the segments be sure you are not running SELinux * or apparmor. * * if you see the shared segments (keys 1314148400 -- 1314148405), and * no gpsd or ntpd is running, you can remove them like this: * * ipcrm -M 0x4e545030 * ipcrm -M 0x4e545031 * ipcrm -M 0x4e545032 * ipcrm -M 0x4e545033 * ipcrm -M 0x4e545034 * ipcrm -M 0x4e545035 * * Removing these segments is usually not necessary, as the operating system * garbage-collects them when they have no attached processes. */ #define PPS_MIN_FIXES 3 /* # fixes to wait for before shipping PPS */ static volatile struct shmTime *getShmTime(struct gps_context_t *context, int unit) { int shmid; unsigned int perms; volatile struct shmTime *p; // set the SHM perms the way ntpd does if (unit < 2) { // we are root, be careful perms = 0600; } else { // we are not root, try to work anyway perms = 0666; } /* * Note: this call requires root under BSD, and possibly on * well-secured Linux systems. This is why ntpshm_context_init() has to be * called before privilege-dropping. */ shmid = shmget((key_t) (NTPD_BASE + unit), sizeof(struct shmTime), (int)(IPC_CREAT | perms)); if (shmid == -1) { gpsd_log(&context->errout, LOG_ERROR, "NTP: shmget(%ld, %zd, %o) fail: %s\n", (long int)(NTPD_BASE + unit), sizeof(struct shmTime), (int)perms, strerror(errno)); return NULL; } p = (struct shmTime *)shmat(shmid, 0, 0); if ((int)(long)p == -1) { gpsd_log(&context->errout, LOG_ERROR, "NTP: shmat failed: %s\n", strerror(errno)); return NULL; } gpsd_log(&context->errout, LOG_PROG, "NTP: shmat(%d,0,0) succeeded, segment %d\n", shmid, unit); return p; } void ntpshm_context_init(struct gps_context_t *context) /* Attach all NTP SHM segments. Called once at startup, while still root. */ { int i; for (i = 0; i < NTPSHMSEGS; i++) { // Only grab the first two when running as root. if (2 <= i || 0 == getuid()) { context->shmTime[i] = getShmTime(context, i); } } memset(context->shmTimeInuse, 0, sizeof(context->shmTimeInuse)); } static volatile struct shmTime *ntpshm_alloc(struct gps_context_t *context) /* allocate NTP SHM segment. return its segment number, or -1 */ { int i; for (i = 0; i < NTPSHMSEGS; i++) if (context->shmTime[i] != NULL && !context->shmTimeInuse[i]) { context->shmTimeInuse[i] = true; /* * In case this segment gets sent to ntpd before an * ephemeris is available, the LEAP_NOTINSYNC value will * tell ntpd that this source is in a "clock alarm" state * and should be ignored. The goal is to prevent ntpd * from declaring the GPS a falseticker before it gets * all its marbles together. */ memset((void *)context->shmTime[i], 0, sizeof(struct shmTime)); context->shmTime[i]->mode = 1; context->shmTime[i]->leap = LEAP_NOTINSYNC; context->shmTime[i]->precision = -1; /* initially 0.5 sec */ context->shmTime[i]->nsamples = 3; /* stages of median filter */ return context->shmTime[i]; } return NULL; } static bool ntpshm_free(struct gps_context_t * context, volatile struct shmTime *s) /* free NTP SHM segment */ { int i; for (i = 0; i < NTPSHMSEGS; i++) if (s == context->shmTime[i]) { context->shmTimeInuse[i] = false; return true; } return false; } void ntpshm_session_init(struct gps_device_t *session) { #ifdef NTPSHM_ENABLE /* mark NTPD shared memory segments as unused */ session->shm_clock = NULL; #endif /* NTPSHM_ENABLE */ #ifdef PPS_ENABLE session->shm_pps = NULL; #endif /* PPS_ENABLE */ } int ntpshm_put(struct gps_device_t *session, volatile struct shmTime *shmseg, struct timedelta_t *td) /* put a received fix time into shared memory for NTP */ { char real_str[TIMESPEC_LEN]; char clock_str[TIMESPEC_LEN]; /* Any NMEA will be about -1 or -2. Garmin GPS-18/USB is around -6 or -7. */ int precision = -1; /* default precision */ if (shmseg == NULL) { gpsd_log(&session->context->errout, LOG_RAW, "NTP:PPS: missing shm\n"); return 0; } #ifdef PPS_ENABLE /* ntpd sets -20 for PPS refclocks, thus -20 precision */ if (shmseg == session->shm_pps) { if ( source_usb == session->sourcetype ) { /* if PPS over USB 1.1, then precision = -10 */ precision = -10; } else { /* likely PPS over serial, precision = -20 */ precision = -20; } } #endif /* PPS_ENABLE */ ntp_write(shmseg, td, precision, session->context->leap_notify); timespec_str( &td->real, real_str, sizeof(real_str) ); timespec_str( &td->clock, clock_str, sizeof(clock_str) ); gpsd_log(&session->context->errout, LOG_PROG, "NTP: ntpshm_put(%s %s) %s @ %s\n", session->gpsdata.dev.path, (precision == -20) ? "pps" : "clock", real_str, clock_str); return 1; } #ifdef PPS_ENABLE #define SOCK_MAGIC 0x534f434b struct sock_sample { struct timeval tv; double offset; int pulse; int leap; /* notify that a leap second is upcoming */ // cppcheck-suppress unusedStructMember int _pad; int magic; /* must be SOCK_MAGIC */ }; static void init_hook(struct gps_device_t *session) /* for chrony SOCK interface, which allows nSec timekeeping */ { /* open the chrony socket */ char chrony_path[GPS_PATH_MAX]; session->chronyfd = -1; if ( 0 == getuid() ) { /* this case will fire on command-line devices; * they're opened before priv-dropping. Matters because * only root can use /var/run. */ (void)snprintf(chrony_path, sizeof (chrony_path), "/var/run/chrony.%s.sock", basename(session->gpsdata.dev.path)); } else { (void)snprintf(chrony_path, sizeof (chrony_path), "/tmp/chrony.%s.sock", basename(session->gpsdata.dev.path)); } if (access(chrony_path, F_OK) != 0) { gpsd_log(&session->context->errout, LOG_PROG, "PPS:%s chrony socket %s doesn't exist\n", session->gpsdata.dev.path, chrony_path); } else { session->chronyfd = netlib_localsocket(chrony_path, SOCK_DGRAM); if (session->chronyfd < 0) gpsd_log(&session->context->errout, LOG_PROG, "PPS:%s connect chrony socket failed: %s, error: %d, errno: %d/%s\n", session->gpsdata.dev.path, chrony_path, session->chronyfd, errno, strerror(errno)); else gpsd_log(&session->context->errout, LOG_RAW, "PPS:%s using chrony socket: %s\n", session->gpsdata.dev.path, chrony_path); } } /* td is the real time and clock time of the edge */ /* offset is actual_ts - clock_ts */ static void chrony_send(struct gps_device_t *session, struct timedelta_t *td) { char real_str[TIMESPEC_LEN]; char clock_str[TIMESPEC_LEN]; struct timespec offset; struct sock_sample sample; struct tm tm; int leap_notify = session->context->leap_notify; /* insist that leap seconds only happen in june and december * GPS emits leap pending for 3 months prior to insertion * NTP expects leap pending for only 1 month prior to insertion * Per http://bugs.ntp.org/1090 */ (void)gmtime_r( &(td->real.tv_sec), &tm); if ( 5 != tm.tm_mon && 11 != tm.tm_mon ) { /* Not june, not December, no way */ leap_notify = LEAP_NOWARNING; } /* chrony expects tv-sec since Jan 1970 */ sample.pulse = 0; sample.leap = leap_notify; sample.magic = SOCK_MAGIC; /* chronyd wants a timeval, not a timspec, not to worry, it is * just the top of the second */ TSTOTV(&sample.tv, &td->clock); /* calculate the offset as a timespec to not lose precision */ TS_SUB( &offset, &td->real, &td->clock); /* if tv_sec greater than 2 then tv_nsec loses precision, but * not a big deal as slewing will bbe required */ sample.offset = TSTONS( &offset ); sample._pad = 0; timespec_str( &td->real, real_str, sizeof(real_str) ); timespec_str( &td->clock, clock_str, sizeof(clock_str) ); gpsd_log(&session->context->errout, LOG_RAW, "PPS chrony_send %s @ %s Offset: %0.9f\n", real_str, clock_str, sample.offset); (void)send(session->chronyfd, &sample, sizeof (sample), 0); } static char *report_hook(volatile struct pps_thread_t *pps_thread, struct timedelta_t *td) /* ship the time of a PPS event to ntpd and/or chrony */ { char *log1; struct gps_device_t *session = (struct gps_device_t *)pps_thread->context; /* PPS only source never get any serial info * so no PPSTIME_IS or fixcnt */ if ( source_pps != session->sourcetype) { /* FIXME! these two validations need to move back into ppsthread.c */ if ( !session->ship_to_ntpd) return "skipped ship_to_ntp=0"; /* * Only listen to PPS after several consecutive fixes, * otherwise time may be inaccurate. (We know this is * required on all Garmin and u-blox; safest to do it * for all cases as we have no other general way to know * if PPS is good. * * Not sure yet how to handle u-blox UBX_MODE_TMONLY */ if (session->fixcnt <= PPS_MIN_FIXES) return "no fix"; } /* FIXME? how to log socket AND shm reported? */ log1 = "accepted"; if ( 0 <= session->chronyfd ) { log1 = "accepted chrony sock"; chrony_send(session, td); } if (session->shm_pps != NULL) (void)ntpshm_put(session, session->shm_pps, td); /* session context might have a hook set, too */ if (session->context->pps_hook != NULL) session->context->pps_hook(session, td); return log1; } #endif /* PPS_ENABLE */ void ntpshm_link_deactivate(struct gps_device_t *session) /* release ntpshm storage for a session */ { if (session->shm_clock != NULL) { (void)ntpshm_free(session->context, session->shm_clock); session->shm_clock = NULL; } #if defined(PPS_ENABLE) if (session->shm_pps != NULL) { pps_thread_deactivate(&session->pps_thread); if (session->chronyfd != -1) (void)close(session->chronyfd); (void)ntpshm_free(session->context, session->shm_pps); session->shm_pps = NULL; } #endif /* PPS_ENABLE */ } void ntpshm_link_activate(struct gps_device_t *session) /* set up ntpshm storage for a session */ { /* don't talk to NTP when we're running inside the test harness */ if (session->sourcetype == source_pty) return; if (session->sourcetype != source_pps ) { /* allocate a shared-memory segment for "NMEA" time data */ session->shm_clock = ntpshm_alloc(session->context); if (session->shm_clock == NULL) { gpsd_log(&session->context->errout, LOG_WARN, "NTP: ntpshm_alloc() failed\n"); return; } } #if defined(PPS_ENABLE) if (session->sourcetype == source_usb || session->sourcetype == source_rs232 || session->sourcetype == source_pps) { /* 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->shm_pps = ntpshm_alloc(session->context)) == NULL) { gpsd_log(&session->context->errout, LOG_WARN, "PPS: ntpshm_alloc(1) failed\n"); } else { init_hook(session); session->pps_thread.report_hook = report_hook; pps_thread_activate(&session->pps_thread); } } #endif /* PPS_ENABLE */ } #endif /* NTPSHM_ENABLE */ /* end */ gpsd-3.15/timespec.h0000664000175000017500000000506312520742615012537 0ustar esresr/* * This file is Copyright (c) 2015 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ #ifndef GPSD_TIMESPEC_H #define GPSD_TIMESPEC_H /* normalize a timespec * * three cases to note * if tv_sec is positve, then tv_nsec must be positive * if tv_sec is negative, then tv_nsec must be negative * if tv_sec is zero, then tv_nsec may be positive or negative. * * this only handles the case where two normalized timespecs * are added or subracted. (e.g. only a one needs to be borrowed/carried * * NOTE: this normalization is not the same as ntpd uses */ #define NS_IN_SEC 1000000000 #define MS_IN_SEC 1000000 static inline void TS_NORM( struct timespec *ts) { if ( ( 1 <= ts->tv_sec ) || ( (0 == ts->tv_sec ) && (0 <= ts->tv_nsec ) ) ) { /* result is positive */ if ( NS_IN_SEC <= ts->tv_nsec ) { /* borrow from tv_sec */ ts->tv_nsec -= NS_IN_SEC; ts->tv_sec++; } else if ( 0 > (ts)->tv_nsec ) { /* carry to tv_sec */ ts->tv_nsec += NS_IN_SEC; ts->tv_sec--; } } else { /* result is negative */ if ( -NS_IN_SEC >= ts->tv_nsec ) { /* carry to tv_sec */ ts->tv_nsec += NS_IN_SEC; ts->tv_sec--; } else if ( 0 < ts->tv_nsec ) { /* borrow from tv_sec */ ts->tv_nsec -= NS_IN_SEC; ts->tv_sec++; } } } /* normalize a timeval */ #define TV_NORM(tv) \ do { \ if ( MS_IN_SEC <= (tv)->tv_usec ) { \ (tv)->tv_usec -= MS_IN_SEC; \ (tv)->tv_sec++; \ } else if ( 0 > (tv)->tv_usec ) { \ (tv)->tv_usec += MS_IN_SEC; \ (tv)->tv_sec--; \ } \ } while (0) /* convert timespec to timeval, with rounding */ #define TSTOTV(tv, ts) \ do { \ (tv)->tv_sec = (ts)->tv_sec; \ (tv)->tv_usec = ((ts)->tv_nsec + 500)/1000; \ TV_NORM( tv ); \ } while (0) /* convert timeval to timespec */ #define TVTOTS(ts, tv) \ do { \ (ts)->tv_sec = (tv)->tv_sec; \ (ts)->tv_nsec = (tv)->tv_usec*1000; \ TS_NORM( ts ); \ } while (0) /* subtract two timespec */ #define TS_SUB(r, ts1, ts2) \ do { \ (r)->tv_sec = (ts1)->tv_sec - (ts2)->tv_sec; \ (r)->tv_nsec = (ts1)->tv_nsec - (ts2)->tv_nsec; \ TS_NORM( r ); \ } while (0) /* convert a timespec to a double. * is tv_sec > 2, then inevitable loss of precision in tv_nsec */ #define TSTONS(ts) ((double)((ts)->tv_sec + ((ts)->tv_nsec / 1e9))) #define TIMESPEC_LEN 22 /* required length of a timespec buffer */ extern void timespec_str(const struct timespec *, char *, size_t); #endif /* GPSD_TIMESPEC_H */ /* end */ gpsd-3.15/timespec_str.c0000664000175000017500000000244112520742615013417 0ustar esresr/* * This file is Copyright (c) 2010 by the GPSD project * BSD terms apply: see the file COPYING in the distribution root for details. */ /* * We also need to set the value high enough to signal inclusion of * newer features (like clock_gettime). See the POSIX spec for more info: * http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_02_01_02 */ #define _XOPEN_SOURCE 600 #include #include #include #include #include #include #include #include #include "timespec.h" /* Convert a normalized timespec to a nice string * put in it *buf, buf should be at least 22 bytes * * the returned buffer will look like, shortest case: * sign character ' ' or '-' * one digit of seconds * decmal point '.' * 9 digits of nanoSec * * So 12 chars, like this: "-0.123456789" * * Absolute worst case is 10 digits of seconds. * So 21 digits like this: "-2147483647.123456789" * */ void timespec_str(const struct timespec *ts, char *buf, size_t buf_size) { char sign = ' '; if ( (0 > ts->tv_nsec ) || ( 0 > ts->tv_sec ) ) { sign = '-'; } (void) snprintf( buf, buf_size, "%c%ld.%09ld", sign, (long)labs(ts->tv_sec), (long)labs(ts->tv_nsec)); } /* end */ gpsd-3.15/valgrind-audit.py.in0000664000175000017500000000555012473063153014447 0ustar esresr#!@PYTHON@ # # @MASTER@ # # This is a valgrind torture test for the gpsd daemon. # It's not really expected to spot anything as long as we aren't using # malloc and friends in the daemon. # # 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, gps.fake debuglevel = 1 invocation = "valgrind --tool=memcheck --gen-suppressions=yes --leak-check=yes --suppressions=valgrind-suppressions" test = gps.fake.TestSession(prefix=invocation, options="-D %d" % debuglevel) test.progress = sys.stderr.write try: test.spawn() print "\n*** Test #1: Normal single-client-session behavior." print "**** Add a GPS.\n" gps1 = test.gps_add("test/daemon/bu303-moving.log") print "\n**** Add and remove a client.\n" c1 = test.client_add("w\n") test.gather(3) test.client_remove(c1) print "\n**** Remove the GPS." test.gps_remove(gps1) print "*** Test #1 complete.\n" test.wait(3) ###################################################################### print "\n*** Test #2: Successive non-overlapping client sessions." print "**** Add a GPS.\n" gps1 = test.gps_add("test/daemon/bu303-climbing.log") print "\n**** Add and remove first client.\n" c1 = test.client_add("w\n") test.gather(3) test.client_remove(c1) test.wait(3) print "\n**** Add and remove second client.\n" c2 = test.client_add("w\n") test.gather(3) test.client_remove(c2) test.wait(3) print "\n**** Remove the GPS." test.gps_remove(gps1) print "*** Test #2 complete.\n" test.wait(3) ###################################################################### print "\n*** Test #3: Overlapping client sessions." print "**** Add a GPS.\n" gps1 = test.gps_add("test/daemon/bu303-climbing.log") print "\n**** Add first client.\n" c1 = test.client_add("w\n") test.gather(2) print "\n**** Add second client.\n" c2 = test.client_add("w\n") test.gather(3) print "\n**** Remove first client.\n" test.client_remove(c1) test.gather(2) print "\n**** Remove second client.\n" test.client_remove(c2) print "\n**** Remove the GPS." test.gps_remove(gps1) print "*** Test #3 complete.\n" ###################################################################### print "\n*** Test #4: GPS removed while client still active." print "**** Add a GPS.\n" gps1 = test.gps_add("test/daemon/bu303-moving.log") print "\n**** Add a client.\n" c1 = test.client_add("w\n") test.gather(3) print "\n**** Remove the GPS." test.gps_remove(gps1) test.wait(3) print "\n**** Remove the client.\n" test.client_remove(c1) print "*** Test #4 complete.\n" finally: test.cleanup() # The following sets edit modes for GNU EMACS # Local Variables: # mode:python # End: gpsd-3.15/valgrind-suppressions0000644000175000017500000000055212476613167015066 0ustar esresr# Suppress known C library errors in valgrind. # This is good under gcc 3.4.2, glibc 2.3.4, using -g and -O2 { suppress1 Memcheck:Cond fun:strlen fun:vsnprintf fun:gpsd_log fun:main } { suppress2 Memcheck:Value8 fun:vfprintf fun:vsnprintf fun:gpsd_log fun:sirf_parse fun:sirfbin_parse_input fun:gpsd_poll fun:main } gpsd-3.15/xgps0000775000175000017500000010221212513107374011455 0ustar esresr#!/usr/bin/env python # -*- coding: UTF-8 ''' xgps -- test client for gpsd usage: xgps [-D level] [-hV?] [-l degmfmt] [-u units] [server[:port[:device]]] ''' gui_about = '''\ This is xgps, a test client for the gpsd daemon. By Eric S. Raymond for the GPSD project, December 2009 ''' # # This file is Copyright (c) 2010 by the GPSD project # BSD terms apply: see the file COPYING in the distribution root for details. import math import socket import sys import time import gobject import pygtk pygtk.require('2.0') import gtk import cairo import gps import gps.clienthelpers # how to sort the Satellite List # some of ("PRN","el","az","ss","used") with optional '-' to reverse sort # by default, used at the top, then sort PRN SKY_VIEW_SORT_FIELDS = ('-used', 'PRN') class unit_adjustments: "Encapsulate adjustments for unit systems." def __init__(self, units=None): self.altfactor = gps.METERS_TO_FEET self.altunits = "ft" self.speedfactor = gps.MPS_TO_MPH self.speedunits = "mph" if units is None: units = gps.clienthelpers.gpsd_units() if units in (gps.clienthelpers.unspecified, gps.clienthelpers.imperial, "imperial", "i"): pass elif units in (gps.clienthelpers.nautical, "nautical", "n"): self.altfactor = gps.METERS_TO_FEET self.altunits = "ft" self.speedfactor = gps.MPS_TO_KNOTS self.speedunits = "knots" elif units in (gps.clienthelpers.metric, "metric", "m"): self.altfactor = 1 self.altunits = "m" self.speedfactor = gps.MPS_TO_KPH self.speedunits = "kph" else: raise ValueError # Should never happen def fit_to_grid(x, y, line_width): "Adjust coordinates to produce sharp lines." if line_width % 1.0 != 0: # Can't have sharp lines for non-integral line widths. return x, y if line_width % 2 == 0: # Round to a pixel corner. return int(x + 0.5), int(y + 0.5) else: # Round to a pixel center. return int(x) + 0.5, int(y) + 0.5 def fit_circle_to_grid(x, y, radius, line_width): "Adjust circle coordinates and radius to produce sharp horizontal and vertical tangents." r = radius x1, y1 = fit_to_grid(x - r, y - r, line_width) x2, y2 = fit_to_grid(x + r, y + r, line_width) x, y = (x1 + x2) / 2, (y1 + y2) / 2 r = (x2 - x1 + y2 - y1) / 4 return x, y, r class SkyView(gtk.DrawingArea): "Satellite skyview, encapsulates pygtk's draw-on-expose behavior." # See HORIZON_PAD = 40 # How much whitespace to leave around horizon SAT_RADIUS = 5 # Diameter of satellite circle def __init__(self): gtk.DrawingArea.__init__(self) self.set_size_request(400, 400) self.cr = None # New cairo context for each expose event self.width = 0 # Updated in size-allocate handler self.height = 0 # Updated in size-allocate handler self.step_of_grid = 45 # default step of polar grid self.connect('size-allocate', self.on_size_allocate) self.connect('expose-event', self.on_expose_event) self.satellites = [] self.center_x = self.center_y = self.radius = None def on_size_allocate(self, _unused, allocation): width = allocation.width height = allocation.height x = width / 2 y = height / 2 r = (min(width, height) - SkyView.HORIZON_PAD) / 2 x, y, r = fit_circle_to_grid(x, y, r, 1) self.center_x = x self.center_y = y self.radius = r def set_color(self, spec): "Set foreground color for drawing." gdkcolor = gtk.gdk.color_parse(spec) r = gdkcolor.red / 65535.0 g = gdkcolor.green / 65535.0 b = gdkcolor.blue / 65535.0 self.cr.set_source_rgb(r, g, b) def draw_circle(self, x, y, radius, filled=False): "Draw a circle centered on the specified midpoint." lw = self.cr.get_line_width() r = int(2 * radius + 0.5) / 2 x, y, r = fit_circle_to_grid(x, y, radius, lw) self.cr.arc(x, y, r, 0, math.pi * 2.0) self.cr.close_path() if filled: self.cr.fill() else: self.cr.stroke() def draw_line(self, x1, y1, x2, y2): "Draw a line between specified points." lw = self.cr.get_line_width() x1, y1 = fit_to_grid(x1, y1, lw) x2, y2 = fit_to_grid(x2, y2, lw) self.cr.move_to(x1, y1) self.cr.line_to(x2, y2) self.cr.stroke() def draw_square(self, x, y, radius, filled=False): "Draw a square centered on the specified midpoint." lw = self.cr.get_line_width() x1, y1 = fit_to_grid(x - radius, y - radius, lw) x2, y2 = fit_to_grid(x + radius, y + radius, lw) self.cr.rectangle(x1, y1, x2 - x1, y2 - y1) if filled: self.cr.fill() else: self.cr.stroke() def draw_string(self, x, y, text, centered=True): "Draw a text on the skyview." self.cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD) self.cr.set_font_size(10) if centered: extents = self.cr.text_extents(text) # width / 2 + x_bearing x -= extents[2] / 2 + extents[0] # height / 2 + y_bearing y -= extents[3] / 2 + extents[1] self.cr.move_to(x, y) self.cr.show_text(text) self.cr.new_path() def pol2cart(self, az, el): "Polar to Cartesian coordinates within the horizon circle." az *= (math.pi / 180) # Degrees to radians # Exact spherical projection would be like this: # el = sin((90.0 - el) * DEG_2_RAD); el = ((90.0 - el) / 90.0) xout = self.center_x + math.sin(az) * el * self.radius yout = self.center_y - math.cos(az) * el * self.radius return (xout, yout) def on_expose_event(self, widget, _unused): self.cr = widget.window.cairo_create() self.cr.set_line_width(1) self.cr.set_source_rgb(0, 0, 0) self.cr.paint() self.cr.set_source_rgb(1, 1, 1) # The zenith marker self.draw_circle(self.center_x, self.center_y, 6, filled=False) # The horizon circle if self.step_of_grid == 45: # The circle corresponding to 45 degrees elevation. # There are two ways we could plot this. Projecting the sphere # on the display plane, the circle would have a diameter of # sin(45) ~ 0.7. But the naive linear mapping, just splitting # the horizon diameter in half, seems to work better visually. self.draw_circle(self.center_x, self.center_y, self.radius / 2, filled=False) elif self.step_of_grid == 30: self.draw_circle(self.center_x, self.center_y, self.radius * 2 / 3, filled=False) self.draw_circle(self.center_x, self.center_y, self.radius / 3, filled=False) self.draw_circle(self.center_x, self.center_y, self.radius, filled=False) (x1, y1) = self.pol2cart(0, 0) (x2, y2) = self.pol2cart(180, 0) self.draw_line(x1, y1, x2, y2) (x1, y1) = self.pol2cart(90, 0) (x2, y2) = self.pol2cart(270, 0) self.draw_line(x1, y1, x2, y2) # The compass-point letters (x, y) = self.pol2cart(0, 0) self.draw_string(x, y - 10, "N") (x, y) = self.pol2cart(90, 0) self.draw_string(x + 10, y, "E") (x, y) = self.pol2cart(180, 0) self.draw_string(x, y + 10, "S") (x, y) = self.pol2cart(270, 0) self.draw_string(x - 10, y, "W") # The satellites self.cr.set_line_width(2) for sat in self.satellites: (x, y) = self.pol2cart(sat.az, sat.el) if sat.ss < 10: self.set_color("Gray") elif sat.ss < 30: self.set_color("Red") elif sat.ss < 35: self.set_color("Yellow") elif sat.ss < 40: self.set_color("Green3") else: self.set_color("Green1") if gps.is_sbas(sat.PRN): self.draw_square(x, y, SkyView.SAT_RADIUS, sat.used) else: self.draw_circle(x, y, SkyView.SAT_RADIUS, sat.used) self.cr.set_source_rgb(1, 1, 1) self.draw_string(x + SkyView.SAT_RADIUS, y + (SkyView.SAT_RADIUS * 2), str(sat.PRN), centered=False) self.cr = None def redraw(self, satellites): "Redraw the skyview." self.satellites = satellites self.queue_draw() class NoiseView: "Encapsulate view object for watching noise statistics." COLUMNS = 2 ROWS = 4 noisefields = ( # First column ("Time", "time"), ("Latitude", "lat"), ("Longitude", "lon"), ("Altitude", "alt"), # Second column ("RMS", "rms"), ("Major", "major"), ("Minor", "minor"), ("Orient", "orient"), ) def __init__(self): self.widget = gtk.Table(NoiseView.COLUMNS, NoiseView.ROWS, False) self.noisewidgets = [] for i in range(len(NoiseView.noisefields)): colbase = (i / NoiseView.ROWS) * 2 label = gtk.Label(NoiseView.noisefields[i][0] + ": ") # Wacky way to force right alignment label.set_alignment(xalign=1, yalign=0.5) self.widget.attach( label, colbase, colbase + 1, i % NoiseView.ROWS, i % NoiseView.ROWS + 1) entry = gtk.Entry() # The right size for the ISO8601 timestamp entry.set_width_chars(20) entry.set_text("n/a") self.widget.attach( entry, colbase + 1, colbase + 2, i % NoiseView.ROWS, i % NoiseView.ROWS + 1) self.noisewidgets.append((NoiseView.noisefields[i][1], entry)) def update(self, noise): "Update the GPGST data fields." for (attrname, widget) in self.noisewidgets: if hasattr(noise, attrname): widget.set_text(str(getattr(noise, attrname))) else: widget.set_text("n/a") class MaidenheadView: "Encapsulate view object for watching Maidenhead grid location." def __init__(self): self.widget = gtk.Entry() self.widget.set_editable(False) def update(self, tpv): if tpv.mode >= gps.MODE_2D and hasattr(tpv, "lat") and hasattr(tpv, "lon"): self.widget.set_text(gps.clienthelpers.maidenhead(tpv.lat, tpv.lon)) else: return self.widget.set_text("n/a") class AISView: "Encapsulate store and view objects for watching AIS data." AIS_ENTRIES = 10 DWELLTIME = 360 def __init__(self, deg_type): "Initialize the store and view." self.deg_type = deg_type self.name_to_mmsi = {} self.named = {} self.store = gtk.ListStore(str, str, str, str, str, str) self.widget = gtk.ScrolledWindow() self.widget.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.view = gtk.TreeView(model=self.store) self.widget.set_size_request(-1, 300) self.widget.add_with_viewport(self.view) for (i, label) in enumerate(('#', 'Name:', 'Callsign:', 'Destination:', "Lat/Lon:", "Information")): column = gtk.TreeViewColumn(label) renderer = gtk.CellRendererText() column.pack_start(renderer) column.add_attribute(renderer, 'text', i) self.view.append_column(column) def enter(self, ais, name): "Add a named object (ship or station) to the store." if ais.mmsi in self.named: return False else: ais.entry_time = time.time() self.named[ais.mmsi] = ais self.name_to_mmsi[name] = ais.mmsi # Garbage-collect old entries try: for i in range(len(self.store)): here = self.store.get_iter(i) name = self.store.get_value(here, 1) mmsi = self.name_to_mmsi[name] if self.named[mmsi].entry_time < time.time() - AISView.DWELLTIME: del self.named[mmsi] if name in self.name_to_mmsi: del self.name_to_mmsi[name] self.store.remove(here) except (ValueError, KeyError): # Invalid TreeIters throw these pass return True def latlon(self, lat, lon): "Latitude/longitude display in nice format." if lat < 0: latsuff = "S" elif lat > 0: latsuff = "N" else: latsuff = "" lat = abs(lat) lat = gps.clienthelpers.deg_to_str(self.deg_type, lat) if lon < 0: lonsuff = "W" elif lon > 0: lonsuff = "E" else: lonsuff = "" lon = abs(lon) lon = gps.clienthelpers.deg_to_str(gps.clienthelpers.deg_ddmmss, lon) return lat + latsuff + "/" + lon + lonsuff def update(self, ais): "Update the AIS data fields." if ais.type in (1, 2, 3, 18): if ais.mmsi in self.named: for i in range(len(self.store)): here = self.store.get_iter(i) name = self.store.get_value(here, 1) if name in self.name_to_mmsi: mmsi = self.name_to_mmsi[name] if mmsi == ais.mmsi: latlon = self.latlon(ais.lat, ais.lon) self.store.set_value(here, 4, latlon) elif ais.type == 4: if self.enter(ais, ais.mmsi): where = self.latlon(ais.lat, ais.lon) self.store.prepend( (ais.type, ais.mmsi, "(shore)", ais.timestamp, where, ais.epfd_text)) elif ais.type == 5: if self.enter(ais, ais.shipname): self.store.prepend( (ais.type, ais.shipname, ais.callsign, ais.destination, "", ais.shiptype)) elif ais.type == 12: sender = ais.mmsi if sender in self.named: sender = self.named[sender].shipname recipient = ais.dest_mmsi if recipient in self.named and hasattr(self.named[recipient], "shipname"): recipient = self.named[recipient].shipname self.store.prepend( (ais.type, sender, "", recipient, "", ais.text)) elif ais.type == 14: sender = ais.mmsi if sender in self.named: sender = self.named[sender].shipname self.store.prepend( (ais.type, sender, "", "(broadcast)", "", ais.text)) elif ais.type in (19, 24): if self.enter(ais, ais.shipname): self.store.prepend( (ais.type, ais.shipname, "(class B)", "", "", ais.shiptype_text)) elif ais.type == 21: if self.enter(ais, ais.name): where = self.latlon(ais.lat, ais.lon) self.store.prepend( (ais.type, ais.name, "(%s navaid)" % ais.epfd_text, "", where, ais.aid_type_text)) class Base: COLUMNS = 3 ROWS = 7 gpsfields = ( # First column ("Time", lambda s, r: s.update_time(r)), ("Latitude", lambda s, r: s.update_latitude(r)), ("Longitude", lambda s, r: s.update_longitude(r)), ("Altitude", lambda s, r: s.update_altitude(r)), ("Speed", lambda s, r: s.update_speed(r)), ("Climb", lambda s, r: s.update_climb(r)), ("Track", lambda s, r: s.update_track(r)), # Second column ("Status", lambda s, r: s.update_status(r)), ("EPX", lambda s, r: s.update_err(r, "epx")), ("EPY", lambda s, r: s.update_err(r, "epy")), ("EPV", lambda s, r: s.update_err(r, "epv")), ("EPS", lambda s, r: s.update_err_speed(r, "eps")), ("EPC", lambda s, r: s.update_err_speed(r, "epc")), ("EPD", lambda s, r: s.update_err_degrees(r, "epd")), ) def __init__(self, deg_type): self.deg_type = deg_type self.conversions = unit_adjustments() self.saved_mode = -1 self.ais_latch = False self.noise_latch = False self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) if not self.window.get_display(): raise Exception("Can't open display") self.window.set_title("xgps") self.window.connect("delete_event", self.delete_event) self.window.set_resizable(False) vbox = gtk.VBox(False, 0) self.window.add(vbox) self.window.connect("destroy", lambda _unused: gtk.main_quit()) self.uimanager = gtk.UIManager() self.accelgroup = self.uimanager.get_accel_group() self.window.add_accel_group(self.accelgroup) self.actiongroup = gtk.ActionGroup('xgps') self.actiongroup.add_actions( [('Quit', gtk.STOCK_QUIT, '_Quit', None, 'Quit the Program', lambda _unused: gtk.main_quit()), ('File', None, '_File'), ('View', None, '_View'), ('Units', None, '_Units'), ('Step of grid', None, '_Step of grid')]) self.actiongroup.add_toggle_actions( [('Skyview', None, '_Skyview', 's', 'Enable Skyview', self.view_toggle), ('Responses', None, '_Responses', 'r', 'Enable Response Reports', self.view_toggle), ('GPS', None, '_GPS Data', 'g', 'Enable GPS Data', self.view_toggle), ('Noise', None, '_Noise Statistics', 'n', 'Enable Noise Statistics', self.view_toggle), ('Maidenhead', None, '_Maidenhead', 'm', 'Enable Maidenhead locator', self.view_toggle), ('AIS', None, '_AIS Data', 'a', 'Enable AIS Data', self.view_toggle), ]) self.actiongroup.add_radio_actions( [('Imperial', None, '_Imperial', 'i', 'Imperial units', 0), ('Nautical', None, '_Nautical', 'n', 'Nautical units', 1), ('Metric', None, '_Metric', 'm', 'Metric Units', 2), ], 0, lambda a, _unused: self.set_units(['i', 'n', 'm'][a.get_current_value()])) self.actiongroup.add_radio_actions( [('30°', None, '30°', None, '30°', 30), ('45°', None, '45°', None, '45°', 45), ('Off', None, 'Off', None, 'Off', 0), ], 45, lambda a, _unused: self.set_step_of_grid(a.get_current_value())) self.uimanager.insert_action_group(self.actiongroup, 0) self.uimanager.add_ui_from_string(''' ''') self.uimanager.get_widget('/MenuBar/View/Skyview').set_active(True) self.uimanager.get_widget('/MenuBar/View/Responses').set_active(True) self.uimanager.get_widget('/MenuBar/View/GPS').set_active(True) self.uimanager.get_widget('/MenuBar/View/Noise').set_active(True) self.uimanager.get_widget('/MenuBar/View/Maidenhead').set_active(True) self.uimanager.get_widget('/MenuBar/View/AIS').set_active(True) menubar = self.uimanager.get_widget('/MenuBar') vbox.pack_start(menubar, False) self.satbox = gtk.HBox(False, 0) vbox.add(self.satbox) skyframe = gtk.Frame(label="Satellite List") self.satbox.add(skyframe) self.satlist = gtk.ListStore(str, str, str, str, str) view = gtk.TreeView(model=self.satlist) for (i, label) in enumerate(('PRN:', 'Elev:', 'Azim:', 'SNR:', 'Used:')): column = gtk.TreeViewColumn(label) renderer = gtk.CellRendererText() column.pack_start(renderer) column.add_attribute(renderer, 'text', i) view.append_column(column) self.row_iters = [] for i in range(gps.MAXCHANNELS): self.satlist.append(["", "", "", "", ""]) self.row_iters.append(self.satlist.get_iter(i)) skyframe.add(view) viewframe = gtk.Frame(label="Skyview") self.satbox.add(viewframe) self.skyview = SkyView() viewframe.add(self.skyview) self.rawdisplay = gtk.Entry() self.rawdisplay.set_editable(False) vbox.add(self.rawdisplay) self.dataframe = gtk.Frame(label="GPS data") datatable = gtk.Table(Base.COLUMNS, Base.ROWS, False) self.dataframe.add(datatable) gpswidgets = [] for i in range(len(Base.gpsfields)): colbase = (i / Base.ROWS) * 2 label = gtk.Label(Base.gpsfields[i][0] + ": ") # Wacky way to force right alignment label.set_alignment(xalign=1, yalign=0.5) datatable.attach(label, colbase, colbase + 1, i % Base.ROWS, i % Base.ROWS + 1) entry = gtk.Entry() # The right size for the ISO8601 timestamp entry.set_width_chars(20) entry.set_text("n/a") datatable.attach(entry, colbase + 1, colbase + 2, i % Base.ROWS, i % Base.ROWS + 1) gpswidgets.append(entry) vbox.add(self.dataframe) self.noisebox = gtk.HBox(False, 0) vbox.add(self.noisebox) noiseframe = gtk.Frame(label="Noise Statistics") self.noisebox.add(noiseframe) self.noiseview = NoiseView() noiseframe.add(self.noiseview.widget) self.gsbox = gtk.HBox(False, 0) vbox.add(self.gsbox) gsframe = gtk.Frame(label="Maidenhead Grid Square") self.gsbox.add(gsframe) self.gsview = MaidenheadView() gsframe.add(self.gsview.widget) self.aisbox = gtk.HBox(False, 0) vbox.add(self.aisbox) aisframe = gtk.Frame(label="AIS Data") self.aisbox.add(aisframe) self.aisview = AISView(self.deg_type) aisframe.add(self.aisview.widget) self.window.show_all() # Hide the Noise Statistics window until user selects it. self.uimanager.get_widget('/MenuBar/View/Noise').set_active(False) self.noisebox.hide() # Hide the Maidenhead window until user selects it. self.uimanager.get_widget('/MenuBar/View/Maidenhead').set_active(False) self.gsbox.hide() # Hide the AIS window until user selects it. self.uimanager.get_widget('/MenuBar/View/AIS').set_active(False) self.aisbox.hide() self.view_name_to_widget = { "Skyview": self.satbox, "Responses": self.rawdisplay, "GPS": self.dataframe, "Noise": self.noisebox, "Maidenhead": self.gsbox, "AIS": self.aisbox} # Discard field labels and associate data hooks with their widgets Base.gpsfields = map(lambda ((label, hook), widget): (hook, widget), zip(Base.gpsfields, gpswidgets)) def view_toggle(self, action): # print "View toggle:", action.get_active(), action.get_name() if hasattr(self, 'view_name_to_widget'): if action.get_active(): self.view_name_to_widget[action.get_name()].show() else: self.view_name_to_widget[action.get_name()].hide() # The effect we're after is to make the top-level window # resize itself to fit when we show or hide widgets. # This is undocumented magic to do that. self.window.resize(1, 1) def set_satlist_field(self, row, column, value): "Set a specified field in the satellite list." 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() return False # State updates def update_time(self, data): if hasattr(data, "time"): # str() just in case we get an old-style float. return str(data.time) else: return "n/a" def update_latitude(self, data): if data.mode >= gps.MODE_2D and hasattr(data, "lat"): lat = gps.clienthelpers.deg_to_str(self.deg_type, abs(data.lat)) if data.lat < 0: ns = 'S' else: ns = 'N' return "%s %s" % (lat, ns) else: return "n/a" def update_longitude(self, data): if data.mode >= gps.MODE_2D and hasattr(data, "lon"): lon = gps.clienthelpers.deg_to_str(self.deg_type, abs(data.lon)) if data.lon < 0: ew = 'W' else: ew = 'E' return "%s %s" % (lon, ew) else: return "n/a" def update_altitude(self, data): if data.mode >= gps.MODE_3D and hasattr(data, "alt"): return "%.3f %s" % ( data.alt * self.conversions.altfactor, self.conversions.altunits) else: return "n/a" def update_speed(self, data): if hasattr(data, "speed"): return "%.3f %s" % ( data.speed * self.conversions.speedfactor, self.conversions.speedunits) else: return "n/a" def update_climb(self, data): if hasattr(data, "climb"): return "%.3f %s" % ( data.climb * self.conversions.speedfactor, self.conversions.speedunits) else: return "n/a" def update_track(self, data): if hasattr(data, "track"): return gps.clienthelpers.deg_to_str(self.deg_type, abs(data.track)) else: return "n/a" def update_err(self, data, errtype): if hasattr(data, errtype): return "%.3f %s" % ( getattr(data, errtype) * self.conversions.altfactor, self.conversions.altunits) else: return "n/a" def update_err_speed(self, data, errtype): if hasattr(data, errtype): return "%.3f %s" % ( getattr(data, errtype) * self.conversions.speedfactor, self.conversions.speedunits) else: return "n/a" def update_err_degrees(self, data, errtype): if hasattr(data, errtype): return "%.3f °" % (getattr(data, errtype)) else: return "n/a" def update_status(self, data): if data.mode == gps.MODE_2D: status = "2D FIX" elif data.mode == gps.MODE_3D: status = "3D FIX" else: status = "NO FIX" if data.mode != self.saved_mode: self.last_transition = time.time() self.saved_mode = data.mode return status + " (%d secs)" % (time.time() - self.last_transition) def update_gpsdata(self, tpv): "Update the GPS data fields." # the first 14 fields are updated using TPV data for (hook, widget) in Base.gpsfields[:14]: if hook: # Remove this guard when we have all hooks widget.set_text(hook(self, tpv)) self.gsview.update(tpv) def update_skyview(self, data): "Update the satellite list and skyview." if hasattr(data, 'satellites'): satellites = data.satellites for fld in reversed(SKY_VIEW_SORT_FIELDS): rev = (fld[0] == '-') if rev: fld = fld[1:] satellites = sorted( satellites[:], cmp=lambda x, y: cmp(x[fld], y[fld]), reverse=rev) for (i, satellite) in enumerate(satellites): self.set_satlist_field(i, 0, satellite.PRN) self.set_satlist_field(i, 1, satellite.el) self.set_satlist_field(i, 2, satellite.az) self.set_satlist_field(i, 3, satellite.ss) yesno = 'N' if satellite.used: yesno = 'Y' self.set_satlist_field(i, 4, yesno) for i in range(len(satellites), gps.MAXCHANNELS): for j in range(0, 5): self.set_satlist_field(i, j, "") self.skyview.redraw(satellites) # Preferences def set_units(self, system): "Change the display units." self.conversions = unit_adjustments(system) def set_step_of_grid(self, system): "Change the step of grid." self.skyview.step_of_grid = system # I/O monitoring and gtk housekeeping 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) def handle_response(self, source, condition): "Handle ordinary I/O ready condition from the daemon." if self.daemon.read() == -1: self.handle_hangup(source, condition) if self.daemon.valid & gps.PACKET_SET: if self.device and "device" in self.daemon.data 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.data) elif self.daemon.data["class"] == "TPV": self.update_gpsdata(self.daemon.data) elif self.daemon.data["class"] == "GST": self.noiseview.update(self.daemon.data) if not self.noise_latch: self.noise_latch = True self.uimanager.get_widget('/MenuBar/View/Noise').set_active(True) self.noisebox.show() elif self.daemon.data["class"] == "AIS": self.aisview.update(self.daemon.data) if not self.ais_latch: self.ais_latch = True self.uimanager.get_widget('/MenuBar/View/AIS').set_active(True) self.aisbox.show() return True def handle_hangup(self, _source, _condition): "Handle hangup condition from the daemon." w = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, flags=gtk.DIALOG_DESTROY_WITH_PARENT, buttons=gtk.BUTTONS_CANCEL) w.connect("destroy", lambda _unused: gtk.main_quit()) w.set_markup("gpsd has stopped sending data.") w.run() gtk.main_quit() return True def main(self): gtk.main() if __name__ == "__main__": try: import getopt (options, arguments) = getopt.getopt(sys.argv[1:], "D:hl:u:V?", ['verbose']) debug = 0 degreefmt = 'd' unit_system = None for (opt, val) in options: if opt in '-D': debug = int(val) elif opt == '-l': degreeformat = val elif opt == '-u': unit_system = val elif opt in ('-?', '-h', '--help'): print __doc__ sys.exit(0) elif opt == 'V': sys.stderr.write("xgps 1.0\n") sys.exit(0) degreefmt = {'d': gps.clienthelpers.deg_dd, 'm': gps.clienthelpers.deg_ddmm, 's': gps.clienthelpers.deg_ddmmss}[degreefmt] (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, device) base.main() except socket.error: w = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, flags=gtk.DIALOG_DESTROY_WITH_PARENT, buttons=gtk.BUTTONS_CANCEL) w.set_markup("gpsd is not running.") w.run() w.destroy() except KeyboardInterrupt: pass gpsd-3.15/xgpsspeed0000775000175000017500000006434112513107374012510 0ustar esresr#!/usr/bin/env python # # by # Robin Wittler (speedometer mode) # and # Chen Wei (nautical mode) # # BSD terms apply: see the file COPYING in the distribution root for details. import pygtk pygtk.require('2.0') import gtk import cairo import gobject import gps from math import pi from math import cos from math import sin from math import sqrt from math import radians from socket import error as SocketError class Speedometer(gtk.DrawingArea): def __init__(self, speed_unit=None): gtk.DrawingArea.__init__(self) self.MPH_UNIT_LABEL = 'mph' self.KPH_UNIT_LABEL = 'kmh' self.KNOTS_UNIT_LABEL = 'knots' self.conversions = { self.MPH_UNIT_LABEL: gps.MPS_TO_MPH, self.KPH_UNIT_LABEL: gps.MPS_TO_KPH, self.KNOTS_UNIT_LABEL: gps.MPS_TO_KNOTS } self.speed_unit = speed_unit or self.MPH_UNIT_LABEL if self.speed_unit not in self.conversions: raise TypeError( '%s is not a valid speed unit' % (repr(speed_unit)) ) class LandSpeedometer(Speedometer): def __init__(self, speed_unit=None): Speedometer.__init__(self, speed_unit) self.connect('expose_event', self.expose_event) self.long_ticks = (2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8) self.short_ticks = (0.1, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.9) self.long_inset = lambda x: 0.1 * x self.middle_inset = lambda x: self.long_inset(x) / 1.5 self.short_inset = lambda x: self.long_inset(x) / 3 self.res_div = 10.0 self.res_div_mul = 1 self.last_speed = 0 self.nums = { -8: 0, -7: 10, -6: 20, -5: 30, -4: 40, -3: 50, -2: 60, -1: 70, 0: 80, 1: 90, 2: 100 } def expose_event(self, _unused, event, _empty=None): self.cr = self.window.cairo_create() self.cr.rectangle( event.area.x, event.area.y, event.area.width, event.area.height ) self.cr.clip() x, y = self.get_x_y() width, height = self.window.get_size() radius = self.get_radius(width, height) self.cr.set_line_width(radius / 100) self.draw_arc_and_ticks(width, height, radius, x, y) self.draw_needle(self.last_speed, radius, x, y) self.draw_speed_text(self.last_speed, radius, x, y) def draw_arc_and_ticks(self, width, height, radius, x, y): self.cr.set_source_rgb(1.0, 1.0, 1.0) self.cr.rectangle(0, 0, width, height) self.cr.fill() self.cr.set_source_rgb(0.0, 0.0, 0.0) # draw the speedometer arc self.cr.arc_negative(x, y, radius, radians(60), radians(120)) self.cr.stroke() long_inset = self.long_inset(radius) middle_inset = self.middle_inset(radius) short_inset = self.short_inset(radius) # draw the ticks for i in self.long_ticks: self.cr.move_to( x + (radius - long_inset) * cos(i * pi / 6.0), y + (radius - long_inset) * sin(i * pi / 6.0) ) self.cr.line_to( x + (radius + (self.cr.get_line_width() / 2)) * cos(i * pi / 6.0), y + (radius + (self.cr.get_line_width() / 2)) * sin(i * pi / 6.0) ) self.cr.select_font_face( 'Georgia', cairo.FONT_SLANT_NORMAL, ) self.cr.set_font_size(radius / 10) self.cr.save() _num = str(self.nums.get(i) * self.res_div_mul) ( _x_bearing, _y_bearing, t_width, t_height, _x_advance, _y_advance ) = self.cr.text_extents(_num) if i in (-8, -7, -6, -5, -4): self.cr.move_to( (x + (radius - long_inset - (t_width / 2)) * cos(i * pi / 6.0)), (y + (radius - long_inset - (t_height * 2)) * sin(i * pi / 6.0)) ) elif i in (-2, -1, 0, 2, 1): self.cr.move_to( (x + (radius - long_inset - (t_width * 1.5)) * cos(i * pi / 6.0)), (y + (radius - long_inset - (t_height * 2)) * sin(i * pi / 6.0)) ) elif i in (-3,): self.cr.move_to( (x - t_width / 2), (y - radius + self.long_inset(radius) * 2 + t_height) ) self.cr.show_text(_num) self.cr.restore() if i != self.long_ticks[0]: self.cr.move_to( x + (radius - middle_inset) * cos((i + 0.5) * pi / 6.0), y + (radius - middle_inset) * sin((i + 0.5) * pi / 6.0) ) self.cr.line_to( x + (radius + (self.cr.get_line_width() / 2)) * cos((i + 0.5) * pi / 6.0), y + (radius + (self.cr.get_line_width() / 2)) * sin((i + 0.5) * pi / 6.0) ) for z in self.short_ticks: if i < 0: self.cr.move_to( x + (radius - short_inset) * cos((i + z) * pi / 6.0), y + (radius - short_inset) * sin((i + z) * pi / 6.0) ) self.cr.line_to( x + (radius + (self.cr.get_line_width() / 2)) * cos((i + z) * pi / 6.0), y + (radius + (self.cr.get_line_width() / 2)) * sin((i + z) * pi / 6.0) ) else: self.cr.move_to( x + (radius - short_inset) * cos((i - z) * pi / 6.0), y + (radius - short_inset) * sin((i - z) * pi / 6.0) ) self.cr.line_to( x + (radius + (self.cr.get_line_width() / 2)) * cos((i - z) * pi / 6.0), y + (radius + (self.cr.get_line_width() / 2)) * sin((i - z) * pi / 6.0) ) self.cr.stroke() def draw_needle(self, speed, radius, x, y): self.cr.save() inset = self.long_inset(radius) speed = speed * self.conversions.get(self.speed_unit) speed = speed / (self.res_div * self.res_div_mul) actual = self.long_ticks[-1] + speed if actual > self.long_ticks[0]: self.res_div_mul += 1 speed = speed / (self.res_div * self.res_div_mul) actual = self.long_ticks[-1] + speed self.cr.move_to(x, y) self.cr.line_to( x + (radius - (2 * inset)) * cos(actual * pi / 6.0), y + (radius - (2 * inset)) * sin(actual * pi / 6.0) ) self.cr.stroke() self.cr.restore() def draw_speed_text(self, speed, radius, x, y): self.cr.save() speed = '%.2f %s' % ( speed * self.conversions.get(self.speed_unit), self.speed_unit ) self.cr.select_font_face( 'Georgia', cairo.FONT_SLANT_NORMAL, # cairo.FONT_WEIGHT_BOLD ) self.cr.set_font_size(radius / 10) _x_bearing, _y_bearing, t_width, _t_height = self.cr.text_extents(speed)[:4] self.cr.move_to((x - t_width / 2), (y + radius) - self.long_inset(radius)) self.cr.show_text(speed) self.cr.restore() def get_x_y(self): rect = self.get_allocation() x = (rect.x + rect.width / 2.0) y = (rect.y + rect.height / 2.0) - 20 return x, y def get_radius(self, width, height): return min(width / 2.0, height / 2.0) - 20 class NauticalSpeedometer(Speedometer): HEADING_SAT_GAP = 0.8 SAT_SIZE = 10 # radius of the satellite circle in skyview def __init__(self, speed_unit=None, maxspeed=100): Speedometer.__init__(self, speed_unit) self.connect('expose_event', self.expose_event) self.long_inset = lambda x: 0.05 * x self.mid_inset = lambda x: self.long_inset(x) / 1.5 self.short_inset = lambda x: self.long_inset(x) / 3 self.last_speed = 0 self.satellites = [] self.last_heading = 0 self.maxspeed = int(maxspeed) @staticmethod def polar2xy(radius, angle, polex, poley): '''convert Polar coordinate to Cartesian coordinate system the y axis in pygtk points downward Args: radius: angle: azimuth from from Polar coordinate system, in radian polex and poley are the Cartesian coordinate of the pole return a tuple contains (x, y)''' return (polex + cos(angle) * radius, poley - sin(angle) * radius) def expose_event(self, _unused, event, _empty=None): self.cr = self.window.cairo_create() self.cr.rectangle( event.area.x, event.area.y, event.area.width, event.area.height ) self.cr.clip() x, y = self.get_x_y() width, height = self.window.get_size() radius = self.get_radius(width, height) self.cr.set_line_width(radius / 100) self.draw_arc_and_ticks(width, height, radius, x, y) self.draw_heading(20, self.last_heading, radius, x, y) for sat in self.satellites: self.draw_sat(sat, radius * NauticalSpeedometer.HEADING_SAT_GAP, x, y) self.draw_speed(radius, x, y) def draw_text(self, x, y, text, fontsize=10): '''draw text at given location Args: x, y is the center of textbox''' txt = str(text) self.cr.new_sub_path() self.cr.set_source_rgba(0, 0, 0) self.cr.select_font_face('Sans', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD) self.cr.set_font_size(fontsize) (_x_bearing, _y_bearing, t_width, t_height) = self.cr.text_extents(txt)[:4] # set the center of textbox self.cr.move_to(x - t_width / 2, y + t_height / 2) self.cr.show_text(txt) def draw_arc_and_ticks(self, width, height, radius, x, y): '''Draw a serial of circle, with ticks in outmost circle''' self.cr.set_source_rgb(1.0, 1.0, 1.0) self.cr.rectangle(0, 0, width, height) self.cr.fill() self.cr.set_source_rgba(0, 0, 0) # draw the speedmeter arc rspeed = radius + 50 self.cr.arc(x, y, rspeed, 2 * pi / 3, 7 * pi / 3) self.cr.set_source_rgba(0, 0, 0, 1.0) self.cr.stroke() s_long = self.long_inset(rspeed) s_middle = self.mid_inset(radius) s_short = self.short_inset(radius) for i in xrange(11): # draw the large ticks alpha = (8 - i) * pi / 6 self.cr.move_to(*NauticalSpeedometer.polar2xy(rspeed, alpha, x, y)) self.cr.set_line_width(radius / 100) self.cr.line_to(*NauticalSpeedometer.polar2xy(rspeed - s_long, alpha, x, y)) self.cr.stroke() self.cr.set_line_width(radius / 200) xf, yf = NauticalSpeedometer.polar2xy(rspeed + 10, alpha, x, y) stxt = (self.maxspeed / 10) * i self.draw_text(xf, yf, stxt, fontsize=radius / 15) for i in xrange(1, 11): # middle tick alpha = (8 - i) * pi / 6 beta = (17 - 2 * i) * pi / 12 self.cr.move_to(*NauticalSpeedometer.polar2xy(rspeed, beta, x, y)) self.cr.line_to(*NauticalSpeedometer.polar2xy(rspeed - s_middle, beta, x, y)) # short tick for n in xrange(10): gamma = alpha + n * pi / 60 self.cr.move_to(*NauticalSpeedometer.polar2xy(rspeed, gamma, x, y)) self.cr.line_to(*NauticalSpeedometer.polar2xy(rspeed - s_short, gamma, x, y)) # draw the heading arc self.cr.new_sub_path() self.cr.arc(x, y, radius, 0, 2 * pi) self.cr.stroke() self.cr.arc(x, y, radius - 20, 0, 2 * pi) self.cr.set_source_rgba(0, 0, 0, 0.20) self.cr.fill() self.cr.set_source_rgba(0, 0, 0) # heading label 90/180/270 for n in xrange(0, 4): label = str(n * 90) # self.cr.set_source_rgba(0, 1, 0) # radius * (1 + NauticalSpeedometer.HEADING_SAT_GAP), tbox_x, tbox_y = NauticalSpeedometer.polar2xy( radius * 0.88, (1 - n) * pi / 2, x, y) self.draw_text(tbox_x, tbox_y, label, fontsize=radius / 20) # draw the satellite arcs skyradius = radius * NauticalSpeedometer.HEADING_SAT_GAP self.cr.set_line_width(radius / 200) self.cr.set_source_rgba(0, 0, 0) self.cr.arc(x, y, skyradius, 0, 2 * pi) self.cr.set_source_rgba(1, 1, 1) self.cr.fill() self.cr.set_source_rgba(0, 0, 0) self.cr.arc(x, y, skyradius * 2 / 3, 0, 2 * pi) self.cr.arc(x, y, skyradius / 3, 0, 2 * pi) # draw the cross hair self.cr.move_to(x - skyradius, y) self.cr.line_to(x + skyradius, y) self.cr.move_to(x, y - skyradius) self.cr.line_to(x, y + skyradius) self.cr.set_line_width(radius / 200) self.cr.stroke() long_inset = self.long_inset(radius) mid_inset = self.mid_inset(radius) short_inset = self.short_inset(radius) # draw the large ticks for i in xrange(12): agllong = i * pi / 6 self.cr.move_to(*NauticalSpeedometer.polar2xy(radius - long_inset, agllong, x, y)) self.cr.line_to(*NauticalSpeedometer.polar2xy(radius, agllong, x, y)) self.cr.set_line_width(radius / 100) self.cr.stroke() self.cr.set_line_width(radius / 200) # middle tick aglmid = (i + 0.5) * pi / 6 self.cr.move_to(*NauticalSpeedometer.polar2xy(radius - mid_inset, aglmid, x, y)) self.cr.line_to(*NauticalSpeedometer.polar2xy(radius, aglmid, x, y)) # short tick for n in xrange(1, 10): aglshrt = agllong + n * pi / 60 self.cr.move_to(*NauticalSpeedometer.polar2xy(radius - short_inset, aglshrt, x, y)) self.cr.line_to(*NauticalSpeedometer.polar2xy(radius, aglshrt, x, y)) self.cr.stroke() def draw_heading(self, trig_height, heading, radius, x, y): hypo = trig_height * 2 / sqrt(3) h = pi / 2 - radians(heading) # to xyz self.cr.set_line_width(2) self.cr.set_source_rgba(0, 0.3, 0.2, 0.8) # the triangle pointer x0 = x + radius * cos(h) y0 = y - radius * sin(h) x1 = x0 + hypo * cos(7 * pi / 6 + h) y1 = y0 - hypo * sin(7 * pi / 6 + h) x2 = x0 + hypo * cos(5 * pi / 6 + h) y2 = y0 - hypo * sin(5 * pi / 6 + h) self.cr.move_to(x0, y0) self.cr.line_to(x1, y1) self.cr.line_to(x2, y2) self.cr.line_to(x0, y0) self.cr.close_path() self.cr.fill() self.cr.stroke() # heading text (tbox_x, tbox_y) = NauticalSpeedometer.polar2xy(radius * 1.1, h, x, y) self.draw_text(tbox_x, tbox_y, int(heading), fontsize=radius / 15) # the ship shape, based on test and try shiplen = radius * NauticalSpeedometer.HEADING_SAT_GAP / 4 xh, yh = NauticalSpeedometer.polar2xy(shiplen * 2.3, h, x, y) xa, ya = NauticalSpeedometer.polar2xy(shiplen * 2.2, h + pi - 0.3, x, y) xb, yb = NauticalSpeedometer.polar2xy(shiplen * 2.2, h + pi + 0.3, x, y) xc, yc = NauticalSpeedometer.polar2xy(shiplen * 1.4, h - pi / 5, x, y) xd, yd = NauticalSpeedometer.polar2xy(shiplen * 1.4, h + pi / 5, x, y) self.cr.set_source_rgba(0, 0.3, 0.2, 0.5) self.cr.move_to(xa, ya) self.cr.line_to(xb, yb) self.cr.line_to(xc, yc) self.cr.line_to(xh, yh) self.cr.line_to(xd, yd) self.cr.close_path() self.cr.fill() # self.cr.stroke() def set_color(self, spec): '''Set foreground color for drawing.''' gdkcolor = gtk.gdk.color_parse(spec) r = gdkcolor.red / 65535.0 g = gdkcolor.green / 65535.0 b = gdkcolor.blue / 65535.0 self.cr.set_source_rgb(r, g, b) def draw_sat(self, satsoup, radius, x, y): """given a sat's elevation, azimath, SNR, draw it on the skyview Arg: satsoup: a dictionary {'el': xx, 'az': xx, 'ss': xx} """ h = pi / 2 - radians(satsoup['az']) # to xy self.cr.set_line_width(2) self.cr.set_source_rgb(0, 0, 0) x0, y0 = NauticalSpeedometer.polar2xy(radius * (90 - satsoup['el']) / 90, h, x, y) self.cr.new_sub_path() if gps.is_sbas(satsoup['PRN']): self.cr.rectangle(x0 - NauticalSpeedometer.SAT_SIZE, y0 - NauticalSpeedometer.SAT_SIZE, NauticalSpeedometer.SAT_SIZE * 2, NauticalSpeedometer.SAT_SIZE * 2) else: self.cr.arc(x0, y0, NauticalSpeedometer.SAT_SIZE, 0, pi * 2.0) if satsoup['ss'] < 10: self.set_color('Gray') elif satsoup['ss'] < 30: self.set_color('Red') elif satsoup['ss'] < 35: self.set_color('Yellow') elif satsoup['ss'] < 40: self.set_color('Green3') else: self.set_color('Green1') if satsoup['used']: self.cr.fill() else: self.cr.stroke() self.draw_text(x0, y0, satsoup['PRN'], fontsize=15) def draw_speed(self, radius, x, y): self.cr.new_sub_path() self.cr.set_line_width(20) self.cr.set_source_rgba(0, 0, 0, 0.5) speed = self.last_speed * self.conversions.get(self.speed_unit) # cariol arc angle start at polar 0, going clockwise alpha = 4 * pi / 3 beta = 2 * pi - alpha theta = 5 * pi * speed / (self.maxspeed * 3) self.cr.arc(x, y, radius + 40, beta, beta + theta) self.cr.stroke() # self.cr.close_path() # self.cr.fill() label = '%.2f %s' % (speed, self.speed_unit) self.draw_text(x, y + radius + 40, label, fontsize=20) def get_x_y(self): rect = self.get_allocation() x = (rect.x + rect.width / 2.0) y = (rect.y + rect.height / 2.0) - 20 return x, y def get_radius(self, width, height): return min(width / 2.0, height / 2.0) - 70 class Main(object): def __init__(self, host='localhost', port='2947', device=None, debug=0, speed_unit=None, maxspeed=0, nautical=False): self.host = host self.port = port self.device = device self.debug = debug self.speed_unit = speed_unit self.maxspeed = maxspeed self.nautical = nautical self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) if not self.window.get_display(): raise Exception("Can't open display") self.window.set_title('xgpsspeed') if self.nautical: self.window.set_size_request(500, 550) self.widget = NauticalSpeedometer( speed_unit=self.speed_unit, maxspeed=self.maxspeed) else: self.widget = LandSpeedometer(speed_unit=self.speed_unit) self.window.connect('delete_event', self.delete_event) self.window.connect('destroy', self.destroy) self.widget.show() vbox = gtk.VBox(False, 0) self.window.add(vbox) self.window.present() self.uimanager = gtk.UIManager() self.accelgroup = self.uimanager.get_accel_group() self.window.add_accel_group(self.accelgroup) self.actiongroup = gtk.ActionGroup('gpsspeed-ng') self.actiongroup.add_actions( [ ('Quit', gtk.STOCK_QUIT, '_Quit', None, 'Quit the Program', lambda unused: gtk.main_quit()), ('File', None, '_File'), ('Units', None, '_Units')] ) self.actiongroup.add_radio_actions( [ ('Imperial', None, '_Imperial', 'i', 'Imperial Units', 0), ('Metric', None, '_Metric', 'm', 'Metrical Units', 1), ('Nautical', None, '_Nautical', 'n', 'Nautical Units', 2) ], 0, lambda a, unused: setattr(self.widget, 'speed_unit', ['mph', 'kmh', 'knots'][a.get_current_value()]) ) self.uimanager.insert_action_group(self.actiongroup, 0) self.uimanager.add_ui_from_string(''' ''') self.active_unit_map = { 'mph': '/MenuBar/Units/Imperial', 'kmh': '/MenuBar/Units/Metric', 'knots': '/MenuBar/Units/Nautical' } menubar = self.uimanager.get_widget('/MenuBar') self.uimanager.get_widget( self.active_unit_map.get(self.speed_unit) ).set_active(True) vbox.pack_start(menubar, False, False, 0) vbox.add(self.widget) self.window.show_all() def watch(self, daemon, device): 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) return True def handle_response(self, source, condition): if self.daemon.read() == -1: self.handle_hangup(source, condition) if self.daemon.data['class'] == 'TPV': self.update_speed(self.daemon.data) if self.nautical and self.daemon.data['class'] == 'SKY': self.update_skyview(self.daemon.data) return True def handle_hangup(self, _dummy, _unused): w = gtk.MessageDialog( type=gtk.MESSAGE_ERROR, flags=gtk.DIALOG_DESTROY_WITH_PARENT, buttons=gtk.BUTTONS_OK ) w.connect("destroy", lambda unused: gtk.main_quit()) w.set_title('gpsd error') w.set_markup("gpsd has stopped sending data.") w.run() gtk.main_quit() return True def update_speed(self, data): if hasattr(data, 'speed'): self.widget.last_speed = data.speed self.widget.queue_draw() if self.nautical and hasattr(data, 'track'): self.widget.last_heading = data.track self.widget.queue_draw() # Used for NauticalSpeedometer only def update_skyview(self, data): "Update the satellite list and skyview." if hasattr(data, 'satellites'): self.widget.satellites = data.satellites self.widget.queue_draw() def delete_event(self, _widget, _event, _data=None): # Someday, handle all cleanup operations here return False def destroy(self, _unused, _empty=None): gtk.main_quit() def run(self): try: daemon = gps.gps( host=self.host, port=self.port, mode=gps.WATCH_ENABLE | gps.WATCH_JSON | gps.WATCH_SCALED, verbose=self.debug ) self.watch(daemon, self.device) gtk.main() except SocketError: w = gtk.MessageDialog( type=gtk.MESSAGE_ERROR, flags=gtk.DIALOG_DESTROY_WITH_PARENT, buttons=gtk.BUTTONS_OK ) w.set_title('socket error') w.set_markup( "could not connect to gpsd socket. make sure gpsd is running." ) w.run() w.destroy() except KeyboardInterrupt: self.window.emit('delete_event', gtk.gdk.Event(gtk.gdk.NOTHING)) if __name__ == '__main__': import sys from os.path import basename from optparse import OptionParser prog = basename(sys.argv[0]) usage = ('%s [-V|--version] [-h|--help] [--debug] [--host] ' + '[--port] [--device] [--speedunits {[mph] [kmh] [knots]}] ' + '[host [:port [:device]]]') % (prog) epilog = 'BSD terms apply: see the file COPYING in the distribution root for details.' parser = OptionParser(usage=usage, epilog=epilog) parser.add_option( '--host', dest='host', default='localhost', help='The host to connect. [Default localhost]' ) parser.add_option( '--port', dest='port', default='2947', help='The port to connect. [Default 2947]' ) parser.add_option( '--device', dest='device', default=None, help='The device to connet. [Default None]' ) parser.add_option( '--speedunits', dest='speedunits', default='mph', help='The unit of speed. Possible units are: mph, kmh, knots. [Default mph]' ) parser.add_option( '--maxspeed', dest='maxspeed', default='50', help='max speed of the speedmeter [Default 50]' ) parser.add_option( '--nautical', dest='nautical', default=False, action='store_true', help='Enable nautical-style speed and track display.' ) parser.add_option( '--debug', dest='debug', default=0, action='store', type='int', help='Set level of debug. Must be integer. [Default 0]' ) (options, args) = parser.parse_args() if args: arg = args[0].split(':') len_arg = len(arg) if len_arg == 1: (options.host,) = arg elif len_arg == 2: (options.host, options.port) = arg elif len_arg == 3: (options.host, options.port, options.device) = arg else: parser.print_help() sys.exit(0) Main( host=options.host, port=options.port, device=options.device, speed_unit=options.speedunits, maxspeed=options.maxspeed, nautical=options.nautical, debug=options.debug ).run() gpsd-3.15/packet_names.h0000444000175000017500000002120012513044250013333 0ustar esresr/* edit packet_states.h to add new packet types. */ "GROUND_STATE", /* we don't know what packet type to expect */ "COMMENT_BODY", /* pound comment for a test load */ "COMMENT_RECOGNIZED", /* comment recognized */ #ifdef NMEA_ENABLE "NMEA_DOLLAR", /* we've seen first character of NMEA leader */ "NMEA_BANG", /* we've seen first character of an AIS message '!' */ "NMEA_PUB_LEAD", /* seen second character of NMEA G leader */ "NMEA_VENDOR_LEAD", /* seen second character of NMEA P leader */ "NMEA_LEADER_END", /* seen end char of NMEA leader, in body */ "NMEA_PASHR_A", /* grind through recognizing $PASHR */ "NMEA_PASHR_S", /* grind through recognizing $PASHR */ "NMEA_PASHR_H", /* grind through recognizing $PASHR */ "NMEA_BINARY_BODY", /* Ashtech-style binary packet body, skip until \r\n */ "NMEA_BINARY_CR", /* \r on end of Ashtech-style binary packet */ "NMEA_BINARY_NL", /* \n on end of Ashtech-style binary packet */ "NMEA_CR", /* seen terminating \r of NMEA packet */ "NMEA_RECOGNIZED", /* saw trailing \n of NMEA packet */ "SIRF_ACK_LEAD_1", /* seen A of possible SiRF Ack */ "SIRF_ACK_LEAD_2", /* seen c of possible SiRF Ack */ "AIS_LEAD_1", /* seen initial A of possible AIS message */ "AIS_LEAD_2", /* seen second I/B/N/X of possible AIS message */ "AIS_LEAD_ALT1", /* seen initial B of possible AIS message */ "AIS_LEAD_ALT2", /* seen second S of possible AIS message */ "AIS_LEAD_ALT3", /* seen initial S of possible AIS message */ "AIS_LEAD_ALT4", /* seen second A of possible AIS message */ "SEATALK_LEAD_1", /* SeaTalk/Garmin packet leader 'I' */ "WEATHER_LEAD_1", /* Weather instrument packet leader 'W' */ "HEADCOMP_LEAD_1", /* Heading/compass packet leader 'H' */ "TURN_LEAD_1", /* Turn indicator packet leader 'T' */ "ECDIS_LEAD_1", /* ECDIS packet leader 'E' */ "SOUNDER_LEAD_1", /* Depth sounder packet leader 'S' */ "TRANSDUCER_LEAD_1", /* Generic transducer packet leader 'Y' */ "BEIDOU_LEAD_1", /* Beidou leader */ "QZSS_LEAD_1", /* Quasi-Zenith Satellite System leader */ #endif /* NMEA_ENABLE */ "DLE_LEADER", /* we've seen the TSIP/EverMore leader (DLE) */ #ifdef TRIPMATE_ENABLE "ASTRAL_1", /* ASTRAL leader A */ "ASTRAL_2", /* ASTRAL leader S */ "ASTRAL_3", /* ASTRAL leader T */ "ASTRAL_4", /* ASTRAL leader R */ "ASTRAL_5", /* ASTRAL leader A */ #endif /* TRIPMATE_ENABLE */ #ifdef EARTHMATE_ENABLE "EARTHA_1", /* EARTHA leader E */ "EARTHA_2", /* EARTHA leader A */ "EARTHA_3", /* EARTHA leader R */ "EARTHA_4", /* EARTHA leader T */ "EARTHA_5", /* EARTHA leader H */ #endif /* EARTHMATE_ENABLE */ #ifdef SIRF_ENABLE "SIRF_LEADER_1", /* we've seen first character of SiRF leader */ "SIRF_LEADER_2", /* seen second character of SiRF leader */ "SIRF_LENGTH_1", /* seen first byte of SiRF length */ "SIRF_PAYLOAD", /* we're in a SiRF payload part */ "SIRF_DELIVERED", /* saw last byte of SiRF payload/checksum */ "SIRF_TRAILER_1", /* saw first byte of SiRF trailer */ "SIRF_RECOGNIZED", /* saw second byte of SiRF trailer */ #endif /* SIRF_ENABLE */ #ifdef ZODIAC_ENABLE "ZODIAC_EXPECTED", /* expecting Zodiac packet */ "ZODIAC_LEADER_1", /* saw leading 0xff */ "ZODIAC_LEADER_2", /* saw leading 0x81 */ "ZODIAC_ID_1", /* saw first byte of ID */ "ZODIAC_ID_2", /* saw second byte of ID */ "ZODIAC_LENGTH_1", /* saw first byte of Zodiac packet length */ "ZODIAC_LENGTH_2", /* saw second byte of Zodiac packet length */ "ZODIAC_FLAGS_1", /* saw first byte of FLAGS */ "ZODIAC_FLAGS_2", /* saw second byte of FLAGS */ "ZODIAC_HSUM_1", /* saw first byte of Header sum */ "ZODIAC_PAYLOAD", /* we're in a Zodiac payload */ "ZODIAC_RECOGNIZED", /* found end of the Zodiac packet */ #endif /* ZODIAC_ENABLE */ #if defined(TNT_ENABLE) || defined(GARMINTXT_ENABLE) || defined(ONCORE_ENABLE) "AT1_LEADER", /* saw True North status leader '@' */ /* Garmin Simple Text starts with @ leader */ /* Oncore starts with @ leader */ "GTXT_RECOGNIZED", /* */ #endif #ifdef EVERMORE_ENABLE "EVERMORE_LEADER_1", /* a DLE after having seen EverMore data */ "EVERMORE_LEADER_2", /* seen opening STX of EverMore packet */ "EVERMORE_PAYLOAD", /* in payload part of EverMore packet */ "EVERMORE_PAYLOAD_DLE",/* DLE in payload part of EverMore packet */ "EVERMORE_RECOGNIZED", /* found end of EverMore packet */ #endif /* EVERMORE_ENABLE */ #ifdef ITRAX_ENABLE "ITALK_LEADER_1", /* saw leading < of iTalk packet */ "ITALK_LEADER_2", /* saw leading ! of iTalk packet */ "ITALK_LENGTH", /* saw packet length */ "ITALK_PAYLOAD", /* in payload part of iTalk Packet */ "ITALK_DELIVERED", /* seen end of payload */ "ITALK_TRAILER", /* saw iTalk trailer byte */ "ITALK_RECOGNIZED", /* found end of the iTalk packet */ #endif /* ITRAX_ENABLE */ #ifdef NAVCOM_ENABLE "NAVCOM_EXPECTED", /* expecting Navcom NCT packet */ "NAVCOM_LEADER_1", /* saw leading 0x02 */ "NAVCOM_LEADER_2", /* saw leading 0x99 */ "NAVCOM_LEADER_3", /* saw leading 0x66 */ "NAVCOM_ID", /* saw message ID */ "NAVCOM_LENGTH_1", /* saw first byte of Navcom packet length */ "NAVCOM_LENGTH_2", /* saw second byte of Navcom packet length */ "NAVCOM_PAYLOAD", /* we're in a Navcom payload */ "NAVCOM_CSUM", /* saw checksum */ "NAVCOM_RECOGNIZED", /* found end of the Navcom packet */ #endif /* NAVCOM_ENABLE */ #ifdef UBLOX_ENABLE "UBX_LEADER_1", /* first constant leader byte found */ "UBX_LEADER_2", /* second constant leader byte found */ "UBX_CLASS_ID", /* classid read */ "UBX_MESSAGE_ID", /* message id read */ "UBX_LENGTH_1", /* first length byte read (le) */ "UBX_LENGTH_2", /* second length byte read (le) */ "UBX_PAYLOAD", /* payload eating */ "UBX_CHECKSUM_A", /* checksum A byte (tcp checksum) */ "UBX_RECOGNIZED", /* this is also UBX_CHECKSUM_B */ #endif #ifdef SUPERSTAR2_ENABLE "SUPERSTAR2_LEADER", /* leading SOH */ "SUPERSTAR2_ID1", /* message type */ "SUPERSTAR2_ID2", /* message type xor 0xff */ "SUPERSTAR2_PAYLOAD", /* length of the actual packet data */ "SUPERSTAR2_CKSUM1", "SUPERSTAR2_CKSUM2", "SUPERSTAR2_RECOGNIZED", #endif #ifdef ONCORE_ENABLE "ONCORE_AT2", /* second @ */ "ONCORE_ID1", /* first character of command type */ "ONCORE_PAYLOAD", /* payload eating */ "ONCORE_CHECKSUM", /* checksum byte */ "ONCORE_CR", /* closing CR */ "ONCORE_RECOGNIZED", /* closing LF */ #endif #ifdef GEOSTAR_ENABLE "GEOSTAR_LEADER_1", /* first constant leader byte found */ "GEOSTAR_LEADER_2", /* second constant leader byte found */ "GEOSTAR_LEADER_3", /* third constant leader byte found */ "GEOSTAR_LEADER_4", /* forth constant leader byte found */ "GEOSTAR_MESSAGE_ID_1", /* first message id read */ "GEOSTAR_MESSAGE_ID_2", /* second message id read */ "GEOSTAR_LENGTH_1", /* first length byte read */ "GEOSTAR_LENGTH_2", /* second length byte read */ "GEOSTAR_PAYLOAD", /* payload eating */ "GEOSTAR_CHECKSUM_A", /* checksum A byte (xor checksum) */ "GEOSTAR_CHECKSUM_B", /* checksum B byte (xor checksum) */ "GEOSTAR_CHECKSUM_C", /* checksum C byte (xor checksum) */ "GEOSTAR_RECOGNIZED", /* this is also GEOSTAR_CHECKSUM_D */ #endif /* * Packet formats without checksums start here. We list them last so * that if a format with a conflicting structure *and* a checksum can * be recognized, that will be preferred. */ #if defined(TSIP_ENABLE) || defined(GARMIN_ENABLE) "TSIP_LEADER", /* a DLE after having seen TSIP data */ "TSIP_PAYLOAD", /* we're in TSIP payload */ "TSIP_DLE", /* we've seen a DLE in TSIP payload */ "TSIP_RECOGNIZED", /* found end of the TSIP packet */ "GARMIN_RECOGNIZED", /* found end of Garmin packet */ #endif /* TSIP_ENABLE GARMIN_ENABLE */ #ifdef RTCM104V2_ENABLE "RTCM2_SYNC_STATE", /* we have sync lock */ "RTCM2_SKIP_STATE", /* we have sync lock, but this character is bad */ "RTCM2_RECOGNIZED", /* we have an RTCM packet */ #endif /* RTCM104V2_ENABLE */ #ifdef RTCM104V3_ENABLE "RTCM3_LEADER_1", /* constant leader byte found */ "RTCM3_LEADER_2", /* second leader byte found (high 6 bits zero) */ "RTCM3_PAYLOAD", /* gathering payload */ "RTCM3_RECOGNIZED", /* RTCM3 packet recognized */ #endif #ifdef PASSTHROUGH_ENABLE "JSON_LEADER", /* JSON leading { found */ "JSON_STRINGLITERAL", /* start of JSON string literal seen */ "JSON_STRING_SOLIDUS", /* backslash in string */ "JSON_END_ATTRIBUTE", /* end of JSON attribute */ "JSON_EXPECT_VALUE", /* just after colon */ "JSON_END_VALUE", /* end of JSON value */ "JSON_NUMBER", /* inside a JSON numeric literal */ "JSON_SPECIAL", /* inside a JSON special literal (true,false,null) */ "JSON_RECOGNIZED", /* JSON packet recognized */ #endif /* end of packet_states.h */ gpsd-3.15/timebase.h0000664000175000017500000000047512533605314012517 0ustar esresr/* * Constants used for GPS time detection and rollover correction. * * Correct for week beginning 2015-05-28T00:00:00 */ #define BUILD_CENTURY 2000 #define BUILD_WEEK 823 # Assumes 10-bit week counter #define BUILD_LEAPSECONDS 16 #define BUILD_ROLLOVERS 1 # Assumes 10-bit week counter gpsd-3.15/ais_json.i0000444000175000017500000021150012513044244012516 0ustar esresr/* * This is code generated by jsongen.py. Do not hand-hack it! */ #define NITEMS(x) (int)(sizeof(x)/sizeof(x[0])) /*@ -fullinitblock */ const struct json_attr_t json_ais1[] = { AIS_HEADER {"status", t_uinteger, .addr.uinteger = &ais->type1.status, .dflt.uinteger = 0}, {"status_text", t_ignore}, {"turn", t_integer, .addr.integer = &ais->type1.turn, .dflt.integer = AIS_TURN_NOT_AVAILABLE}, {"speed", t_uinteger, .addr.uinteger = &ais->type1.speed, .dflt.uinteger = AIS_SPEED_NOT_AVAILABLE}, {"accuracy", t_boolean, .addr.boolean = &ais->type1.accuracy, .dflt.boolean = false}, {"lon", t_integer, .addr.integer = &ais->type1.lon, .dflt.integer = AIS_LON_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type1.lat, .dflt.integer = AIS_LAT_NOT_AVAILABLE}, {"course", t_uinteger, .addr.uinteger = &ais->type1.course, .dflt.uinteger = AIS_COURSE_NOT_AVAILABLE}, {"heading", t_uinteger, .addr.uinteger = &ais->type1.heading, .dflt.uinteger = AIS_HEADING_NOT_AVAILABLE}, {"second", t_uinteger, .addr.uinteger = &ais->type1.second, .dflt.uinteger = AIS_SEC_NOT_AVAILABLE}, {"maneuver", t_uinteger, .addr.uinteger = &ais->type1.maneuver, .dflt.uinteger = AIS_SEC_INOPERATIVE}, {"raim", t_boolean, .addr.boolean = &ais->type1.raim, .dflt.boolean = false}, {"radio", t_uinteger, .addr.uinteger = &ais->type1.radio, .dflt.uinteger = 0}, {NULL} }; char timestamp[JSON_VAL_MAX+1]; const struct json_attr_t json_ais4[] = { AIS_HEADER {"timestamp", t_string, .addr.string = timestamp, .len = sizeof(timestamp)}, {"accuracy", t_boolean, .addr.boolean = &ais->type4.accuracy, .dflt.boolean = true}, {"lon", t_integer, .addr.integer = &ais->type4.lon, .dflt.integer = AIS_LON_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type4.lat, .dflt.integer = AIS_LAT_NOT_AVAILABLE}, {"epfd", t_uinteger, .addr.uinteger = &ais->type4.epfd, .dflt.uinteger = 0}, {"epfd_text", t_ignore}, {"raim", t_boolean, .addr.boolean = &ais->type4.raim, .dflt.boolean = false}, {"radio", t_uinteger, .addr.uinteger = &ais->type4.radio, .dflt.uinteger = 0}, {NULL} }; char eta[JSON_VAL_MAX+1]; const struct json_attr_t json_ais5[] = { AIS_HEADER {"imo", t_uinteger, .addr.uinteger = &ais->type5.imo, .dflt.uinteger = 0}, {"ais_version", t_uinteger, .addr.uinteger = &ais->type5.ais_version, .dflt.uinteger = 0}, {"callsign", t_string, .addr.string = ais->type5.callsign, .len = sizeof(ais->type5.callsign)}, {"shipname", t_string, .addr.string = ais->type5.shipname, .len = sizeof(ais->type5.shipname)}, {"shiptype", t_uinteger, .addr.uinteger = &ais->type5.shiptype, .dflt.uinteger = 0}, {"shiptype_text", t_ignore}, {"to_bow", t_uinteger, .addr.uinteger = &ais->type5.to_bow, .dflt.uinteger = 0}, {"to_stern", t_uinteger, .addr.uinteger = &ais->type5.to_stern, .dflt.uinteger = 0}, {"to_port", t_uinteger, .addr.uinteger = &ais->type5.to_port, .dflt.uinteger = 0}, {"to_starboard", t_uinteger, .addr.uinteger = &ais->type5.to_starboard, .dflt.uinteger = 0}, {"epfd", t_uinteger, .addr.uinteger = &ais->type5.epfd, .dflt.uinteger = 0}, {"epfd_text", t_ignore}, {"eta", t_string, .addr.string = eta, .len = sizeof(eta)}, {"draught", t_uinteger, .addr.uinteger = &ais->type5.draught, .dflt.uinteger = 0}, {"destination", t_string, .addr.string = ais->type5.destination, .len = sizeof(ais->type5.destination)}, {"dte", t_uinteger, .addr.uinteger = &ais->type5.dte, .dflt.uinteger = 1}, {NULL} }; char data[JSON_VAL_MAX+1]; const struct json_attr_t json_ais6[] = { AIS_HEADER AIS_TYPE6 {"data", t_string, .addr.string = data, .len = sizeof(data)}, {NULL} }; const struct json_attr_t json_ais6_fid10[] = { AIS_HEADER AIS_TYPE6 {"ana_int", t_uinteger, .addr.uinteger = &ais->type6.dac235fid10.ana_int, .dflt.uinteger = 0}, {"ana_ext1", t_uinteger, .addr.uinteger = &ais->type6.dac235fid10.ana_ext1, .dflt.uinteger = 0}, {"ana_ext2", t_uinteger, .addr.uinteger = &ais->type6.dac235fid10.ana_ext2, .dflt.uinteger = 0}, {"racon", t_uinteger, .addr.uinteger = &ais->type6.dac235fid10.racon, .dflt.uinteger = 0}, {"racon_text", t_ignore}, {"light", t_uinteger, .addr.uinteger = &ais->type6.dac235fid10.light, .dflt.uinteger = 0}, {"light_text", t_ignore}, {"alarm", t_boolean, .addr.boolean = &ais->type6.dac235fid10.alarm, .dflt.boolean = false}, {"stat_ext", t_uinteger, .addr.uinteger = &ais->type6.dac235fid10.stat_ext, .dflt.uinteger = 0}, {"off_pos", t_boolean, .addr.boolean = &ais->type6.dac235fid10.off_pos, .dflt.boolean = false}, {NULL} }; char departure[JSON_VAL_MAX+1]; const struct json_attr_t json_ais6_fid12[] = { AIS_HEADER AIS_TYPE6 {"lastport", t_string, .addr.string = ais->type6.dac1fid12.lastport, .len = sizeof(ais->type6.dac1fid12.lastport)}, {"departure", t_string, .addr.string = departure, .len = sizeof(departure)}, {"nextport", t_string, .addr.string = ais->type6.dac1fid12.nextport, .len = sizeof(ais->type6.dac1fid12.nextport)}, {"eta", t_string, .addr.string = eta, .len = sizeof(eta)}, {"dangerous", t_string, .addr.string = ais->type6.dac1fid12.dangerous, .len = sizeof(ais->type6.dac1fid12.dangerous)}, {"imdcat", t_string, .addr.string = ais->type6.dac1fid12.imdcat, .len = sizeof(ais->type6.dac1fid12.imdcat)}, {"unid", t_uinteger, .addr.uinteger = &ais->type6.dac1fid12.unid, .dflt.uinteger = 0}, {"amount", t_uinteger, .addr.uinteger = &ais->type6.dac1fid12.amount, .dflt.uinteger = 0}, {"unit", t_uinteger, .addr.uinteger = &ais->type6.dac1fid12.unit, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais6_fid15[] = { AIS_HEADER AIS_TYPE6 {"airdraught", t_uinteger, .addr.uinteger = &ais->type6.dac1fid15.airdraught, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais6_fid16[] = { AIS_HEADER AIS_TYPE6 {"persons", t_uinteger, .addr.uinteger = &ais->type6.dac1fid16.persons, .dflt.uinteger = 0}, {NULL} }; char arrival[JSON_VAL_MAX+1]; const struct json_attr_t json_ais6_fid18[] = { AIS_HEADER AIS_TYPE6 {"linkage", t_uinteger, .addr.uinteger = &ais->type6.dac1fid18.linkage, .dflt.uinteger = 0}, {"arrival", t_string, .addr.string = arrival, .len = sizeof(arrival)}, {"portname", t_string, .addr.string = ais->type6.dac1fid18.portname, .len = sizeof(ais->type6.dac1fid18.portname)}, {"destination", t_string, .addr.string = ais->type6.dac1fid18.destination, .len = sizeof(ais->type6.dac1fid18.destination)}, {"lon", t_integer, .addr.integer = &ais->type6.dac1fid18.lon, .dflt.integer = AIS_LON3_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type6.dac1fid18.lat, .dflt.integer = AIS_LAT3_NOT_AVAILABLE}, {NULL} }; char berth_name[JSON_VAL_MAX+1]; const struct json_attr_t json_ais6_fid20[] = { AIS_HEADER AIS_TYPE6 {"linkage", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.linkage, .dflt.uinteger = 0}, {"berth_length", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.berth_length, .dflt.uinteger = 0}, {"berth_depth", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.berth_depth, .dflt.uinteger = 0}, {"position", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.position, .dflt.uinteger = 0}, {"position_text", t_ignore}, {"arrival", t_string, .addr.string = arrival, .len = sizeof(arrival)}, {"availability", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.availability, .dflt.uinteger = 0}, {"agent", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.agent, .dflt.uinteger = 0}, {"fuel", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.fuel, .dflt.uinteger = 0}, {"chandler", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.chandler, .dflt.uinteger = 0}, {"stevedore", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.stevedore, .dflt.uinteger = 0}, {"electrical", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.electrical, .dflt.uinteger = 0}, {"water", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.water, .dflt.uinteger = 0}, {"customs", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.customs, .dflt.uinteger = 0}, {"cartage", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.cartage, .dflt.uinteger = 0}, {"crane", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.crane, .dflt.uinteger = 0}, {"lift", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.lift, .dflt.uinteger = 0}, {"medical", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.medical, .dflt.uinteger = 0}, {"navrepair", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.navrepair, .dflt.uinteger = 0}, {"provisions", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.provisions, .dflt.uinteger = 0}, {"shiprepair", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.shiprepair, .dflt.uinteger = 0}, {"surveyor", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.surveyor, .dflt.uinteger = 0}, {"steam", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.steam, .dflt.uinteger = 0}, {"tugs", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.tugs, .dflt.uinteger = 0}, {"solidwaste", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.solidwaste, .dflt.uinteger = 0}, {"liquidwaste", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.liquidwaste, .dflt.uinteger = 0}, {"hazardouswaste",t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.hazardouswaste, .dflt.uinteger = 0}, {"ballast", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.ballast, .dflt.uinteger = 0}, {"additional", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.additional, .dflt.uinteger = 0}, {"regional1", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.regional1, .dflt.uinteger = 0}, {"regional2", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.regional2, .dflt.uinteger = 0}, {"future1", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.future1, .dflt.uinteger = 0}, {"future2", t_uinteger, .addr.uinteger = &ais->type6.dac1fid20.future2, .dflt.uinteger = 0}, {"berth_name", t_string, .addr.string = berth_name, .len = sizeof(berth_name)}, {"berth_lon", t_integer, .addr.integer = &ais->type6.dac1fid20.berth_lon, .dflt.integer = AIS_LON3_NOT_AVAILABLE}, {"berth_lat", t_integer, .addr.integer = &ais->type6.dac1fid20.berth_lat, .dflt.integer = AIS_LAT3_NOT_AVAILABLE}, {NULL} }; const struct json_attr_t json_ais6_fid21[] = { AIS_HEADER AIS_TYPE6 {"country", t_string, .addr.string = ais->type6.dac200fid21.country, .len = sizeof(ais->type6.dac200fid21.country)}, {"locode", t_string, .addr.string = ais->type6.dac200fid21.locode, .len = sizeof(ais->type6.dac200fid21.locode)}, {"section", t_string, .addr.string = ais->type6.dac200fid21.section, .len = sizeof(ais->type6.dac200fid21.section)}, {"terminal", t_string, .addr.string = ais->type6.dac200fid21.terminal, .len = sizeof(ais->type6.dac200fid21.terminal)}, {"hectometre", t_string, .addr.string = ais->type6.dac200fid21.hectometre, .len = sizeof(ais->type6.dac200fid21.hectometre)}, {"eta", t_string, .addr.string = eta, .len = sizeof(eta)}, {"tugs", t_uinteger, .addr.uinteger = &ais->type6.dac200fid21.tugs, .dflt.uinteger = 0}, {"airdraught", t_uinteger, .addr.uinteger = &ais->type6.dac200fid21.airdraught, .dflt.uinteger = 0}, {NULL} }; char rta[JSON_VAL_MAX+1]; const struct json_attr_t json_ais6_fid22[] = { AIS_HEADER AIS_TYPE6 {"country", t_string, .addr.string = ais->type6.dac200fid22.country, .len = sizeof(ais->type6.dac200fid22.country)}, {"locode", t_string, .addr.string = ais->type6.dac200fid22.locode, .len = sizeof(ais->type6.dac200fid22.locode)}, {"section", t_string, .addr.string = ais->type6.dac200fid22.section, .len = sizeof(ais->type6.dac200fid22.section)}, {"terminal", t_string, .addr.string = ais->type6.dac200fid22.terminal, .len = sizeof(ais->type6.dac200fid22.terminal)}, {"hectometre", t_string, .addr.string = ais->type6.dac200fid22.hectometre, .len = sizeof(ais->type6.dac200fid22.hectometre)}, {"rta", t_string, .addr.string = rta, .len = sizeof(rta)}, {"status", t_uinteger, .addr.uinteger = &ais->type6.dac200fid22.status, .dflt.uinteger = DAC200FID22_STATUS_NOT_AVAILABLE}, {NULL} }; const struct json_attr_t json_ais6_fid25_cargos_subtype[] = { {"code", t_uinteger,STRUCTOBJECT(struct cargo_t, code), .dflt.uinteger = 0}, {"subtype", t_uinteger,STRUCTOBJECT(struct cargo_t, subtype), .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais6_fid25[] = { AIS_HEADER AIS_TYPE6 {"unit", t_uinteger, .addr.uinteger = &ais->type6.dac1fid25.unit, .dflt.uinteger = 0}, {"amount", t_uinteger, .addr.uinteger = &ais->type6.dac1fid25.amount, .dflt.uinteger = 0}, {"cargos", t_array, STRUCTARRAY(ais->type6.dac1fid25.cargos, json_ais6_fid25_cargos_subtype, &ais->type6.dac1fid25.ncargos)}, {NULL} }; char start[JSON_VAL_MAX+1]; const struct json_attr_t json_ais6_fid28_waypoints_subtype[] = { {"lon", t_integer, STRUCTOBJECT(struct waypoint_t, lon), .dflt.integer = AIS_LON4_NOT_AVAILABLE}, {"lat", t_integer, STRUCTOBJECT(struct waypoint_t, lat), .dflt.integer = AIS_LAT4_NOT_AVAILABLE}, {NULL} }; const struct json_attr_t json_ais6_fid28[] = { AIS_HEADER AIS_TYPE6 {"linkage", t_uinteger, .addr.uinteger = &ais->type6.dac1fid28.linkage, .dflt.uinteger = 0}, {"sender", t_uinteger, .addr.uinteger = &ais->type6.dac1fid28.sender, .dflt.uinteger = 0}, {"rtype", t_uinteger, .addr.uinteger = &ais->type6.dac1fid28.rtype, .dflt.uinteger = 0}, {"rtype_text", t_ignore}, {"start", t_string, .addr.string = start, .len = sizeof(start)}, {"duration", t_uinteger, .addr.uinteger = &ais->type6.dac1fid28.duration, .dflt.uinteger = 0}, {"waypoints", t_array, STRUCTARRAY(ais->type6.dac1fid28.waypoints, json_ais6_fid28_waypoints_subtype, &ais->type6.dac1fid28.waycount)}, {NULL} }; const struct json_attr_t json_ais6_fid30[] = { AIS_HEADER AIS_TYPE6 {"linkage", t_uinteger, .addr.uinteger = &ais->type6.dac1fid30.linkage, .dflt.uinteger = 0}, {"text", t_string, .addr.string = ais->type6.dac1fid30.text, .len = sizeof(ais->type6.dac1fid30.text)}, {NULL} }; const struct json_attr_t json_ais6_fid32_tidals_subtype[] = { {"lon", t_integer, STRUCTOBJECT(struct tidal_t, lon), .dflt.integer = AIS_LON3_NOT_AVAILABLE}, {"lat", t_integer, STRUCTOBJECT(struct tidal_t, lat), .dflt.integer = AIS_LAT3_NOT_AVAILABLE}, {"from_hour", t_uinteger,STRUCTOBJECT(struct tidal_t, from_hour), .dflt.uinteger = AIS_MONTH_NOT_AVAILABLE}, {"from_min", t_uinteger,STRUCTOBJECT(struct tidal_t, from_min), .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE}, {"to_hour", t_uinteger,STRUCTOBJECT(struct tidal_t, to_hour), .dflt.uinteger = AIS_HOUR_NOT_AVAILABLE}, {"to_min", t_uinteger,STRUCTOBJECT(struct tidal_t, to_min), .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE}, {"cdir", t_uinteger,STRUCTOBJECT(struct tidal_t, cdir), .dflt.uinteger = DAC1FID32_CDIR_NOT_AVAILABLE}, {"cspeed", t_uinteger,STRUCTOBJECT(struct tidal_t, cspeed), .dflt.uinteger = DAC1FID32_CSPEED_NOT_AVAILABLE}, {NULL} }; const struct json_attr_t json_ais6_fid32[] = { AIS_HEADER AIS_TYPE6 {"month", t_uinteger, .addr.uinteger = &ais->type6.dac1fid32.month, .dflt.uinteger = AIS_MONTH_NOT_AVAILABLE}, {"day", t_uinteger, .addr.uinteger = &ais->type6.dac1fid32.day, .dflt.uinteger = AIS_DAY_NOT_AVAILABLE}, {"tidals", t_array, STRUCTARRAY(ais->type6.dac1fid32.tidals, json_ais6_fid32_tidals_subtype, &ais->type6.dac1fid32.ntidals)}, {NULL} }; const struct json_attr_t json_ais6_fid55[] = { AIS_HEADER AIS_TYPE6 {"crew", t_uinteger, .addr.uinteger = &ais->type6.dac200fid55.crew, .dflt.uinteger = DAC200FID55_COUNT_NOT_AVAILABLE}, {"passengers", t_uinteger, .addr.uinteger = &ais->type6.dac200fid55.passengers, .dflt.uinteger = DAC200FID55_COUNT_NOT_AVAILABLE}, {"personnel", t_uinteger, .addr.uinteger = &ais->type6.dac200fid55.personnel, .dflt.uinteger = DAC200FID55_COUNT_NOT_AVAILABLE}, {NULL} }; const struct json_attr_t json_ais7[] = { AIS_HEADER {"mmsi1", t_uinteger, .addr.uinteger = &ais->type7.mmsi1, .dflt.uinteger = 0}, {"mmsi2", t_uinteger, .addr.uinteger = &ais->type7.mmsi2, .dflt.uinteger = 0}, {"mmsi3", t_uinteger, .addr.uinteger = &ais->type7.mmsi3, .dflt.uinteger = 0}, {"mmsi4", t_uinteger, .addr.uinteger = &ais->type7.mmsi4, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais8[] = { AIS_HEADER AIS_TYPE8 {"data", t_string, .addr.string = data, .len = sizeof(data)}, {NULL} }; const struct json_attr_t json_ais8_fid10[] = { AIS_HEADER AIS_TYPE8 {"vin", t_string, .addr.string = ais->type8.dac200fid10.vin, .len = sizeof(ais->type8.dac200fid10.vin)}, {"length", t_uinteger, .addr.uinteger = &ais->type8.dac200fid10.length, .dflt.uinteger = 0}, {"beam", t_uinteger, .addr.uinteger = &ais->type8.dac200fid10.beam, .dflt.uinteger = 0}, {"shiptype", t_uinteger, .addr.uinteger = &ais->type8.dac200fid10.shiptype, .dflt.uinteger = 0}, {"shiptype_text", t_ignore}, {"hazard", t_uinteger, .addr.uinteger = &ais->type8.dac200fid10.hazard, .dflt.uinteger = 0}, {"hazard_text", t_ignore}, {"draught", t_uinteger, .addr.uinteger = &ais->type8.dac200fid10.draught, .dflt.uinteger = 0}, {"loaded", t_uinteger, .addr.uinteger = &ais->type8.dac200fid10.loaded, .dflt.uinteger = 0}, {"loaded_text", t_ignore}, {"speed_q", t_boolean, .addr.boolean = &ais->type8.dac200fid10.speed_q, .dflt.boolean = false}, {"course_q", t_boolean, .addr.boolean = &ais->type8.dac200fid10.course_q, .dflt.boolean = false}, {"heading_q", t_boolean, .addr.boolean = &ais->type8.dac200fid10.heading_q, .dflt.boolean = false}, {NULL} }; const struct json_attr_t json_ais8_fid11[] = { AIS_HEADER AIS_TYPE8 {"lat", t_integer, .addr.integer = &ais->type8.dac1fid11.lat, .dflt.integer = DAC1FID11_LAT_NOT_AVAILABLE}, {"lon", t_integer, .addr.integer = &ais->type8.dac1fid11.lon, .dflt.integer = DAC1FID11_LON_NOT_AVAILABLE}, {"timestamp", t_string, .addr.string = timestamp, .len = sizeof(timestamp)}, {"wspeed", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.wspeed, .dflt.uinteger = DAC1FID11_WSPEED_NOT_AVAILABLE}, {"wgust", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.wgust, .dflt.uinteger = DAC1FID11_WSPEED_NOT_AVAILABLE}, {"wdir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.wdir, .dflt.uinteger = DAC1FID11_WDIR_NOT_AVAILABLE}, {"wgustdir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.wgustdir, .dflt.uinteger = DAC1FID11_WDIR_NOT_AVAILABLE}, {"airtemp", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.airtemp, .dflt.uinteger = DAC1FID11_AIRTEMP_NOT_AVAILABLE}, {"humidity", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.humidity, .dflt.uinteger = DAC1FID11_HUMIDITY_NOT_AVAILABLE}, {"dewpoint", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.dewpoint, .dflt.uinteger = DAC1FID11_DEWPOINT_NOT_AVAILABLE}, {"pressure", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.pressure, .dflt.uinteger = DAC1FID11_PRESSURE_NOT_AVAILABLE}, {"pressuretend", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.pressuretend, .dflt.uinteger = DAC1FID11_PRESSURETREND_NOT_AVAILABLE}, {"visibility", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.visibility, .dflt.uinteger = DAC1FID11_VISIBILITY_NOT_AVAILABLE}, {"waterlevel", t_integer, .addr.integer = &ais->type8.dac1fid11.waterlevel, .dflt.integer = DAC1FID11_WATERLEVEL_NOT_AVAILABLE}, {"leveltrend", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.leveltrend, .dflt.uinteger = DAC1FID11_WATERLEVELTREND_NOT_AVAILABLE}, {"cspeed", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.cspeed, .dflt.uinteger = DAC1FID11_CSPEED_NOT_AVAILABLE}, {"cdir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.cdir, .dflt.uinteger = DAC1FID11_CDIR_NOT_AVAILABLE}, {"cspeed2", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.cspeed2, .dflt.uinteger = DAC1FID11_CSPEED_NOT_AVAILABLE}, {"cdir2", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.cdir2, .dflt.uinteger = DAC1FID11_CDIR_NOT_AVAILABLE}, {"cdepth2", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.cdepth2, .dflt.uinteger = DAC1FID11_CDEPTH_NOT_AVAILABLE}, {"cspeed3", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.cspeed3, .dflt.uinteger = DAC1FID11_CSPEED_NOT_AVAILABLE}, {"cdir3", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.cdir3, .dflt.uinteger = DAC1FID11_CDIR_NOT_AVAILABLE}, {"cdepth3", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.cdepth3, .dflt.uinteger = DAC1FID11_CDEPTH_NOT_AVAILABLE}, {"waveheight", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.waveheight, .dflt.uinteger = DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE}, {"waveperiod", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.waveperiod, .dflt.uinteger = DAC1FID11_WAVEPERIOD_NOT_AVAILABLE}, {"wavedir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.wavedir, .dflt.uinteger = DAC1FID11_WAVEDIR_NOT_AVAILABLE}, {"swellheight", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.swellheight, .dflt.uinteger = DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE}, {"swellperiod", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.swellperiod, .dflt.uinteger = DAC1FID11_WAVEPERIOD_NOT_AVAILABLE}, {"swelldir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.swelldir, .dflt.uinteger = DAC1FID11_WAVEDIR_NOT_AVAILABLE}, {"seastate", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.seastate, .dflt.uinteger = DAC1FID11_SEASTATE_NOT_AVAILABLE}, {"watertemp", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.watertemp, .dflt.uinteger = DAC1FID11_WATERTEMP_NOT_AVAILABLE}, {"preciptype", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.preciptype, .dflt.uinteger = DAC1FID11_PRECIPTYPE_NOT_AVAILABLE}, {"preciptype_text", t_ignore}, {"salinity", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.salinity, .dflt.uinteger = DAC1FID11_SALINITY_NOT_AVAILABLE}, {"ice", t_uinteger, .addr.uinteger = &ais->type8.dac1fid11.ice, .dflt.uinteger = DAC1FID11_ICE_NOT_AVAILABLE}, {"ice_text", t_ignore}, {NULL} }; char closefrom[JSON_VAL_MAX+1]; char closeto[JSON_VAL_MAX+1]; const struct json_attr_t json_ais8_fid13[] = { AIS_HEADER AIS_TYPE8 {"reason", t_string, .addr.string = ais->type8.dac1fid13.reason, .len = sizeof(ais->type8.dac1fid13.reason)}, {"closefrom", t_string, .addr.string = closefrom, .len = sizeof(closefrom)}, {"closeto", t_string, .addr.string = closeto, .len = sizeof(closeto)}, {"radius", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.radius, .dflt.uinteger = AIS_DAC1FID13_RADIUS_NOT_AVAILABLE}, {"extunit", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.extunit, .dflt.uinteger = AIS_DAC1FID13_EXTUNIT_NOT_AVAILABLE}, {"fday", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.fday, .dflt.uinteger = AIS_DAY_NOT_AVAILABLE}, {"fmonth", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.fmonth, .dflt.uinteger = AIS_MONTH_NOT_AVAILABLE}, {"fhour", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.fhour, .dflt.uinteger = AIS_HOUR_NOT_AVAILABLE}, {"fminute", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.fminute, .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE}, {"tday", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.tday, .dflt.uinteger = AIS_DAY_NOT_AVAILABLE}, {"tmonth", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.tmonth, .dflt.uinteger = AIS_MONTH_NOT_AVAILABLE}, {"thour", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.thour, .dflt.uinteger = AIS_HOUR_NOT_AVAILABLE}, {"tminute", t_uinteger, .addr.uinteger = &ais->type8.dac1fid13.tminute, .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE}, {NULL} }; const struct json_attr_t json_ais8_fid15[] = { AIS_HEADER AIS_TYPE8 {"airdraught", t_uinteger, .addr.uinteger = &ais->type8.dac1fid15.airdraught, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais8_fid16[] = { AIS_HEADER AIS_TYPE8 {"persons", t_uinteger, .addr.uinteger = &ais->type8.dac1fid16.persons, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais8_fid17_targets_subtype[] = { {"idtype", t_uinteger,STRUCTOBJECT(struct target_t, idtype), .dflt.uinteger = DAC1FID17_IDTYPE_OTHER}, {"id.mmsi", t_uinteger,STRUCTOBJECT(struct target_t, id.mmsi), .dflt.uinteger = 0}, {"id.imo", t_uinteger,STRUCTOBJECT(struct target_t, id.imo), .dflt.uinteger = 0}, {"id.callsign", t_string, STRUCTOBJECT(struct target_t, id.callsign), .len = DAC1FID17_ID_LENGTH}, {"id.other", t_string, STRUCTOBJECT(struct target_t, id.other), .len = DAC1FID17_ID_LENGTH}, {"lat", t_integer, STRUCTOBJECT(struct target_t, lat), .dflt.integer = AIS_LAT3_NOT_AVAILABLE}, {"lon", t_integer, STRUCTOBJECT(struct target_t, lon), .dflt.integer = AIS_LON3_NOT_AVAILABLE}, {"course", t_uinteger,STRUCTOBJECT(struct target_t, course), .dflt.uinteger = DAC1FID17_COURSE_NOT_AVAILABLE}, {"second", t_uinteger,STRUCTOBJECT(struct target_t, second), .dflt.uinteger = AIS_SECOND_NOT_AVAILABLE}, {"speed", t_uinteger,STRUCTOBJECT(struct target_t, speed), .dflt.uinteger = DAC1FID17_SPEED_NOT_AVAILABLE}, {NULL} }; const struct json_attr_t json_ais8_fid17[] = { AIS_HEADER AIS_TYPE8 {"targets", t_array, STRUCTARRAY(ais->type8.dac1fid17.targets, json_ais8_fid17_targets_subtype, &ais->type8.dac1fid17.ntargets)}, {NULL} }; const struct json_attr_t json_ais8_fid19[] = { AIS_HEADER AIS_TYPE8 {"linkage", t_uinteger, .addr.uinteger = &ais->type8.dac1fid19.linkage, .dflt.uinteger = 0}, {"station", t_string, .addr.string = ais->type8.dac1fid19.station, .len = sizeof(ais->type8.dac1fid19.station)}, {"lon", t_integer, .addr.integer = &ais->type8.dac1fid19.lon, .dflt.integer = AIS_LON3_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type8.dac1fid19.lat, .dflt.integer = AIS_LAT3_NOT_AVAILABLE}, {"status", t_uinteger, .addr.uinteger = &ais->type8.dac1fid19.status, .dflt.uinteger = 0}, {"signal", t_uinteger, .addr.uinteger = &ais->type8.dac1fid19.signal, .dflt.uinteger = 0}, {"signal_text", t_ignore}, {"hour", t_uinteger, .addr.uinteger = &ais->type8.dac1fid19.hour, .dflt.uinteger = AIS_HOUR_NOT_AVAILABLE}, {"minute", t_uinteger, .addr.uinteger = &ais->type8.dac1fid19.minute, .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE}, {"nextsignal", t_uinteger, .addr.uinteger = &ais->type8.dac1fid19.nextsignal, .dflt.uinteger = 0}, {"nextsignal_type", t_ignore}, {NULL} }; char end[JSON_VAL_MAX+1]; const struct json_attr_t json_ais8_fid23[] = { AIS_HEADER AIS_TYPE8 {"start", t_string, .addr.string = start, .len = sizeof(start)}, {"end", t_string, .addr.string = end, .len = sizeof(end)}, {"start_lon", t_integer, .addr.integer = &ais->type8.dac200fid23.start_lon, .dflt.integer = AIS_LON4_NOT_AVAILABLE}, {"start_lat", t_integer, .addr.integer = &ais->type8.dac200fid23.start_lat, .dflt.integer = AIS_LAT4_NOT_AVAILABLE}, {"end_lon", t_integer, .addr.integer = &ais->type8.dac200fid23.end_lon, .dflt.integer = AIS_LON4_NOT_AVAILABLE}, {"end_lat", t_integer, .addr.integer = &ais->type8.dac200fid23.end_lat, .dflt.integer = AIS_LAT4_NOT_AVAILABLE}, {"type", t_uinteger, .addr.uinteger = &ais->type8.dac200fid23.type, .dflt.uinteger = DAC200FID23_TYPE_UNKNOWN}, {"type_text", t_ignore}, {"min", t_integer, .addr.integer = &ais->type8.dac200fid23.min, .dflt.integer = DAC200FID23_MIN_UNKNOWN}, {"max", t_integer, .addr.integer = &ais->type8.dac200fid23.max, .dflt.integer = DAC200FID23_MAX_UNKNOWN}, {"intensity", t_uinteger, .addr.uinteger = &ais->type8.dac200fid23.intensity, .dflt.uinteger = DAC200FID23_CLASS_UNKNOWN}, {"intensity_text", t_ignore}, {"wind", t_uinteger, .addr.uinteger = &ais->type8.dac200fid23.wind, .dflt.uinteger = DAC200FID23_WIND_UNKNOWN}, {"wind_text", t_ignore}, {NULL} }; const struct json_attr_t json_ais8_fid24_gauges_subtype[] = { {"id", t_uinteger,STRUCTOBJECT(struct gauge_t, id), .dflt.uinteger = DAC200FID24_GAUGE_ID_UNKNOWN}, {"level", t_integer, STRUCTOBJECT(struct gauge_t, level), .dflt.integer = DAC200FID24_GAUGE_LEVEL_UNKNOWN}, {NULL} }; const struct json_attr_t json_ais8_fid24[] = { AIS_HEADER AIS_TYPE8 {"country", t_string, .addr.string = ais->type8.dac200fid24.country, .len = sizeof(ais->type8.dac200fid24.country)}, {"gauges", t_array, STRUCTARRAY(ais->type8.dac200fid24.gauges, json_ais8_fid24_gauges_subtype, &ais->type8.dac200fid24.ngauges)}, {NULL} }; const struct json_attr_t json_ais8_fid27_waypoints_subtype[] = { {"lon", t_integer, STRUCTOBJECT(struct waypoint_t, lon), .dflt.integer = AIS_LON4_NOT_AVAILABLE}, {"lat", t_integer, STRUCTOBJECT(struct waypoint_t, lat), .dflt.integer = AIS_LAT4_NOT_AVAILABLE}, {NULL} }; const struct json_attr_t json_ais8_fid27[] = { AIS_HEADER AIS_TYPE8 {"linkage", t_uinteger, .addr.uinteger = &ais->type8.dac1fid27.linkage, .dflt.uinteger = 0}, {"sender", t_uinteger, .addr.uinteger = &ais->type8.dac1fid27.sender, .dflt.uinteger = 0}, {"rtype", t_uinteger, .addr.uinteger = &ais->type8.dac1fid27.rtype, .dflt.uinteger = 0}, {"rtype_text", t_ignore}, {"start", t_string, .addr.string = start, .len = sizeof(start)}, {"duration", t_uinteger, .addr.uinteger = &ais->type8.dac1fid27.duration, .dflt.uinteger = 0}, {"waypoints", t_array, STRUCTARRAY(ais->type8.dac1fid27.waypoints, json_ais8_fid27_waypoints_subtype, &ais->type8.dac1fid27.waycount)}, {NULL} }; const struct json_attr_t json_ais8_fid29[] = { AIS_HEADER AIS_TYPE8 {"linkage", t_uinteger, .addr.uinteger = &ais->type8.dac1fid29.linkage, .dflt.uinteger = 0}, {"text", t_string, .addr.string = ais->type8.dac1fid29.text, .len = sizeof(ais->type8.dac1fid29.text)}, {NULL} }; const struct json_attr_t json_ais8_fid31[] = { AIS_HEADER AIS_TYPE8 {"lon", t_integer, .addr.integer = &ais->type8.dac1fid31.lon, .dflt.integer = DAC1FID31_LON_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type8.dac1fid31.lat, .dflt.integer = DAC1FID31_LAT_NOT_AVAILABLE}, {"accuracy", t_boolean, .addr.boolean = &ais->type8.dac1fid31.accuracy, .dflt.boolean = false}, {"timestamp", t_string, .addr.string = timestamp, .len = sizeof(timestamp)}, {"wspeed", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.wspeed, .dflt.uinteger = DAC1FID31_WIND_NOT_AVAILABLE}, {"wgust", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.wgust, .dflt.uinteger = DAC1FID31_WIND_NOT_AVAILABLE}, {"wdir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.wdir, .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE}, {"wgustdir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.wgustdir, .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE}, {"airtemp", t_integer, .addr.integer = &ais->type8.dac1fid31.airtemp, .dflt.integer = DAC1FID31_AIRTEMP_NOT_AVAILABLE}, {"humidity", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.humidity, .dflt.uinteger = DAC1FID31_HUMIDITY_NOT_AVAILABLE}, {"dewpoint", t_integer, .addr.integer = &ais->type8.dac1fid31.dewpoint, .dflt.integer = DAC1FID31_DEWPOINT_NOT_AVAILABLE}, {"pressure", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.pressure, .dflt.uinteger = DAC1FID31_PRESSURE_NOT_AVAILABLE}, {"pressuretend", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.pressuretend, .dflt.uinteger = DAC1FID31_PRESSURETEND_NOT_AVAILABLE}, {"visgreater", t_boolean, .addr.boolean = &ais->type8.dac1fid31.visgreater, .dflt.boolean = false}, {"visibility", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.visibility, .dflt.uinteger = DAC1FID31_VISIBILITY_NOT_AVAILABLE}, {"waterlevel", t_integer, .addr.integer = &ais->type8.dac1fid31.waterlevel, .dflt.integer = DAC1FID31_WATERLEVEL_NOT_AVAILABLE}, {"leveltrend", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.leveltrend, .dflt.uinteger = DAC1FID31_WATERLEVELTREND_NOT_AVAILABLE}, {"cspeed", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.cspeed, .dflt.uinteger = DAC1FID31_CSPEED_NOT_AVAILABLE}, {"cdir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.cdir, .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE}, {"cspeed2", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.cspeed2, .dflt.uinteger = DAC1FID31_CSPEED_NOT_AVAILABLE}, {"cdir2", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.cdir2, .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE}, {"cdepth2", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.cdepth2, .dflt.uinteger = DAC1FID31_CDEPTH_NOT_AVAILABLE}, {"cspeed3", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.cspeed3, .dflt.uinteger = DAC1FID31_CSPEED_NOT_AVAILABLE}, {"cdir3", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.cdir3, .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE}, {"cdepth3", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.cdepth3, .dflt.uinteger = DAC1FID31_CDEPTH_NOT_AVAILABLE}, {"waveheight", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.waveheight, .dflt.uinteger = DAC1FID31_HEIGHT_NOT_AVAILABLE}, {"waveperiod", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.waveperiod, .dflt.uinteger = DAC1FID31_PERIOD_NOT_AVAILABLE}, {"wavedir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.wavedir, .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE}, {"swellheight", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.swellheight, .dflt.uinteger = DAC1FID31_HEIGHT_NOT_AVAILABLE}, {"swellperiod", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.swellperiod, .dflt.uinteger = DAC1FID31_PERIOD_NOT_AVAILABLE}, {"swelldir", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.swelldir, .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE}, {"seastate", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.seastate, .dflt.uinteger = DAC1FID31_SEASTATE_NOT_AVAILABLE}, {"watertemp", t_integer, .addr.integer = &ais->type8.dac1fid31.watertemp, .dflt.integer = DAC1FID31_WATERTEMP_NOT_AVAILABLE}, {"preciptype", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.preciptype, .dflt.uinteger = DAC1FID31_PRECIPTYPE_NOT_AVAILABLE}, {"preciptype_text", t_ignore}, {"salinity", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.salinity, .dflt.uinteger = DAC1FID31_SALINITY_NOT_AVAILABLE}, {"ice", t_uinteger, .addr.uinteger = &ais->type8.dac1fid31.ice, .dflt.uinteger = DAC1FID31_ICE_NOT_AVAILABLE}, {NULL} }; const struct json_attr_t json_ais8_fid40[] = { AIS_HEADER AIS_TYPE8 {"form", t_uinteger, .addr.uinteger = &ais->type8.dac200fid40.form, .dflt.uinteger = DAC200FID40_FORM_UNKNOWN}, {"facing", t_uinteger, .addr.uinteger = &ais->type8.dac200fid40.facing, .dflt.uinteger = DAC200FID40_FACING_UNKNOWN}, {"direction", t_uinteger, .addr.uinteger = &ais->type8.dac200fid40.direction, .dflt.uinteger = DAC200FID40_DIRECTION_UNKNOWN}, {"direction_text", t_ignore}, {"status", t_uinteger, .addr.uinteger = &ais->type8.dac200fid40.status, .dflt.uinteger = DAC200FID40_STATUS_UNKNOWN}, {"status_text", t_ignore}, {NULL} }; const struct json_attr_t json_ais9[] = { AIS_HEADER {"alt", t_uinteger, .addr.uinteger = &ais->type9.alt, .dflt.uinteger = AIS_ALT_NOT_AVAILABLE}, {"speed", t_uinteger, .addr.uinteger = &ais->type9.speed, .dflt.uinteger = AIS_SPEED_NOT_AVAILABLE}, {"accuracy", t_boolean, .addr.boolean = &ais->type9.accuracy, .dflt.boolean = false}, {"lon", t_integer, .addr.integer = &ais->type9.lon, .dflt.integer = AIS_LON_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type9.lat, .dflt.integer = AIS_LAT_NOT_AVAILABLE}, {"course", t_uinteger, .addr.uinteger = &ais->type9.course, .dflt.uinteger = AIS_COURSE_NOT_AVAILABLE}, {"second", t_uinteger, .addr.uinteger = &ais->type9.second, .dflt.uinteger = AIS_SEC_NOT_AVAILABLE}, {"regional", t_uinteger, .addr.uinteger = &ais->type9.regional, .dflt.uinteger = 0}, {"dte", t_uinteger, .addr.uinteger = &ais->type9.dte, .dflt.uinteger = 1}, {"raim", t_boolean, .addr.boolean = &ais->type9.raim, .dflt.boolean = false}, {"radio", t_uinteger, .addr.uinteger = &ais->type9.radio, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais10[] = { AIS_HEADER {"dest_mmsi", t_uinteger, .addr.uinteger = &ais->type10.dest_mmsi, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais12[] = { AIS_HEADER {"seqno", t_uinteger, .addr.uinteger = &ais->type12.seqno, .dflt.uinteger = 0}, {"dest_mmsi", t_uinteger, .addr.uinteger = &ais->type12.dest_mmsi, .dflt.uinteger = 0}, {"retransmit", t_boolean, .addr.boolean = &ais->type12.retransmit, .dflt.boolean = 0}, {"text", t_string, .addr.string = ais->type12.text, .len = sizeof(ais->type12.text)}, {NULL} }; const struct json_attr_t json_ais14[] = { AIS_HEADER {"text", t_string, .addr.string = ais->type14.text, .len = sizeof(ais->type14.text)}, {NULL} }; const struct json_attr_t json_ais15[] = { AIS_HEADER {"mmsi1", t_uinteger, .addr.uinteger = &ais->type15.mmsi1, .dflt.uinteger = 0}, {"type1_1", t_uinteger, .addr.uinteger = &ais->type15.type1_1, .dflt.uinteger = 0}, {"offset1_1", t_uinteger, .addr.uinteger = &ais->type15.offset1_1, .dflt.uinteger = 0}, {"type1_2", t_uinteger, .addr.uinteger = &ais->type15.type1_2, .dflt.uinteger = 0}, {"offset1_2", t_uinteger, .addr.uinteger = &ais->type15.offset1_2, .dflt.uinteger = 0}, {"mmsi2", t_uinteger, .addr.uinteger = &ais->type15.mmsi2, .dflt.uinteger = 0}, {"type2_1", t_uinteger, .addr.uinteger = &ais->type15.type2_1, .dflt.uinteger = 0}, {"offset2_1", t_uinteger, .addr.uinteger = &ais->type15.offset2_1, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais16[] = { AIS_HEADER {"mmsi1", t_uinteger, .addr.uinteger = &ais->type16.mmsi1, .dflt.uinteger = 0}, {"offset1", t_uinteger, .addr.uinteger = &ais->type16.offset1, .dflt.uinteger = 0}, {"increment1", t_uinteger, .addr.uinteger = &ais->type16.increment1, .dflt.uinteger = 0}, {"mmsi2", t_uinteger, .addr.uinteger = &ais->type16.mmsi2, .dflt.uinteger = 0}, {"offset2", t_uinteger, .addr.uinteger = &ais->type16.offset2, .dflt.uinteger = 0}, {"increment2", t_uinteger, .addr.uinteger = &ais->type16.increment2, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais17[] = { AIS_HEADER {"lon", t_integer, .addr.integer = &ais->type17.lon, .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type17.lat, .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE}, {"data", t_string, .addr.string = data, .len = sizeof(data)}, {NULL} }; const struct json_attr_t json_ais18[] = { AIS_HEADER {"reserved", t_uinteger, .addr.uinteger = &ais->type18.reserved, .dflt.uinteger = 0}, {"speed", t_uinteger, .addr.uinteger = &ais->type18.speed, .dflt.uinteger = AIS_SPEED_NOT_AVAILABLE}, {"accuracy", t_boolean, .addr.boolean = &ais->type18.accuracy, .dflt.boolean = false}, {"lon", t_integer, .addr.integer = &ais->type18.lon, .dflt.integer = AIS_LON_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type18.lat, .dflt.integer = AIS_LAT_NOT_AVAILABLE}, {"course", t_uinteger, .addr.uinteger = &ais->type18.course, .dflt.uinteger = AIS_COURSE_NOT_AVAILABLE}, {"heading", t_uinteger, .addr.uinteger = &ais->type18.heading, .dflt.uinteger = AIS_HEADING_NOT_AVAILABLE}, {"second", t_uinteger, .addr.uinteger = &ais->type18.second, .dflt.uinteger = AIS_SEC_NOT_AVAILABLE}, {"regional", t_uinteger, .addr.uinteger = &ais->type18.regional, .dflt.uinteger = 0}, {"cs", t_boolean, .addr.boolean = &ais->type18.cs, .dflt.boolean = false}, {"display", t_boolean, .addr.boolean = &ais->type18.display, .dflt.boolean = false}, {"dsc", t_boolean, .addr.boolean = &ais->type18.dsc, .dflt.boolean = false}, {"band", t_boolean, .addr.boolean = &ais->type18.band, .dflt.boolean = false}, {"msg22", t_boolean, .addr.boolean = &ais->type18.msg22, .dflt.boolean = false}, {"raim", t_boolean, .addr.boolean = &ais->type18.raim, .dflt.boolean = false}, {"radio", t_uinteger, .addr.uinteger = &ais->type18.radio, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais19[] = { AIS_HEADER {"reserved", t_uinteger, .addr.uinteger = &ais->type19.reserved, .dflt.uinteger = 0}, {"speed", t_uinteger, .addr.uinteger = &ais->type19.speed, .dflt.uinteger = AIS_SPEED_NOT_AVAILABLE}, {"accuracy", t_boolean, .addr.boolean = &ais->type19.accuracy, .dflt.boolean = false}, {"lon", t_integer, .addr.integer = &ais->type19.lon, .dflt.integer = AIS_LON_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type19.lat, .dflt.integer = AIS_LAT_NOT_AVAILABLE}, {"course", t_uinteger, .addr.uinteger = &ais->type19.course, .dflt.uinteger = AIS_COURSE_NOT_AVAILABLE}, {"heading", t_uinteger, .addr.uinteger = &ais->type19.heading, .dflt.uinteger = AIS_HEADING_NOT_AVAILABLE}, {"second", t_uinteger, .addr.uinteger = &ais->type19.second, .dflt.uinteger = AIS_SEC_NOT_AVAILABLE}, {"regional", t_uinteger, .addr.uinteger = &ais->type19.regional, .dflt.uinteger = 0}, {"shipname", t_string, .addr.string = ais->type19.shipname, .len = sizeof(ais->type19.shipname)}, {"shiptype", t_uinteger, .addr.uinteger = &ais->type19.shiptype, .dflt.uinteger = 0}, {"shiptype_text", t_ignore}, {"to_bow", t_uinteger, .addr.uinteger = &ais->type19.to_bow, .dflt.uinteger = 0}, {"to_stern", t_uinteger, .addr.uinteger = &ais->type19.to_stern, .dflt.uinteger = 0}, {"to_port", t_uinteger, .addr.uinteger = &ais->type19.to_port, .dflt.uinteger = 0}, {"to_starboard", t_uinteger, .addr.uinteger = &ais->type19.to_starboard, .dflt.uinteger = 0}, {"epfd", t_uinteger, .addr.uinteger = &ais->type19.epfd, .dflt.uinteger = 0}, {"epfd_text", t_ignore}, {"raim", t_boolean, .addr.boolean = &ais->type19.raim, .dflt.boolean = false}, {"dte", t_uinteger, .addr.uinteger = &ais->type19.dte, .dflt.uinteger = 1}, {"assigned", t_boolean, .addr.boolean = &ais->type19.assigned, .dflt.boolean = false}, {NULL} }; const struct json_attr_t json_ais20[] = { AIS_HEADER {"offset1", t_uinteger, .addr.uinteger = &ais->type20.offset1, .dflt.uinteger = 0}, {"number1", t_uinteger, .addr.uinteger = &ais->type20.number1, .dflt.uinteger = 0}, {"timeout1", t_uinteger, .addr.uinteger = &ais->type20.timeout1, .dflt.uinteger = 0}, {"increment1", t_uinteger, .addr.uinteger = &ais->type20.increment1, .dflt.uinteger = 0}, {"offset2", t_uinteger, .addr.uinteger = &ais->type20.offset2, .dflt.uinteger = 0}, {"number2", t_uinteger, .addr.uinteger = &ais->type20.number2, .dflt.uinteger = 0}, {"timeout2", t_uinteger, .addr.uinteger = &ais->type20.timeout2, .dflt.uinteger = 0}, {"increment2", t_uinteger, .addr.uinteger = &ais->type20.increment2, .dflt.uinteger = 0}, {"offset3", t_uinteger, .addr.uinteger = &ais->type20.offset3, .dflt.uinteger = 0}, {"number3", t_uinteger, .addr.uinteger = &ais->type20.number3, .dflt.uinteger = 0}, {"timeout3", t_uinteger, .addr.uinteger = &ais->type20.timeout3, .dflt.uinteger = 0}, {"increment3", t_uinteger, .addr.uinteger = &ais->type20.increment3, .dflt.uinteger = 0}, {"offset4", t_uinteger, .addr.uinteger = &ais->type20.offset4, .dflt.uinteger = 0}, {"number4", t_uinteger, .addr.uinteger = &ais->type20.number4, .dflt.uinteger = 0}, {"timeout4", t_uinteger, .addr.uinteger = &ais->type20.timeout4, .dflt.uinteger = 0}, {"increment4", t_uinteger, .addr.uinteger = &ais->type20.increment4, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais21[] = { AIS_HEADER {"aid_type", t_uinteger, .addr.uinteger = &ais->type21.aid_type, .dflt.uinteger = 0}, {"aid_type_text", t_ignore}, {"name", t_string, .addr.string = ais->type21.name, .len = sizeof(ais->type21.name)}, {"accuracy", t_boolean, .addr.boolean = &ais->type21.accuracy, .dflt.boolean = false}, {"lon", t_integer, .addr.integer = &ais->type21.lon, .dflt.integer = AIS_LON_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type21.lat, .dflt.integer = AIS_LAT_NOT_AVAILABLE}, {"to_bow", t_uinteger, .addr.uinteger = &ais->type21.to_bow, .dflt.uinteger = 0}, {"to_stern", t_uinteger, .addr.uinteger = &ais->type21.to_stern, .dflt.uinteger = 0}, {"to_port", t_uinteger, .addr.uinteger = &ais->type21.to_port, .dflt.uinteger = 0}, {"to_starboard", t_uinteger, .addr.uinteger = &ais->type21.to_starboard, .dflt.uinteger = 0}, {"epfd", t_uinteger, .addr.uinteger = &ais->type21.epfd, .dflt.uinteger = 0}, {"epfd_text", t_ignore}, {"second", t_uinteger, .addr.uinteger = &ais->type21.second, .dflt.uinteger = 0}, {"regional", t_uinteger, .addr.uinteger = &ais->type21.regional, .dflt.uinteger = 0}, {"off_position", t_boolean, .addr.boolean = &ais->type21.off_position, .dflt.boolean = false}, {"raim", t_boolean, .addr.boolean = &ais->type21.raim, .dflt.boolean = false}, {"virtual_aid", t_boolean, .addr.boolean = &ais->type21.virtual_aid, .dflt.boolean = false}, {NULL} }; const struct json_attr_t json_ais22[] = { AIS_HEADER {"channel_a", t_uinteger, .addr.uinteger = &ais->type22.channel_a, .dflt.uinteger = 0}, {"channel_b", t_uinteger, .addr.uinteger = &ais->type22.channel_b, .dflt.uinteger = 0}, {"txrx", t_uinteger, .addr.uinteger = &ais->type22.txrx, .dflt.uinteger = 0}, {"power", t_boolean, .addr.boolean = &ais->type22.power, .dflt.boolean = false}, {"ne_lon", t_integer, .addr.integer = &ais->type22.area.ne_lon, .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE}, {"ne_lat", t_integer, .addr.integer = &ais->type22.area.ne_lat, .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE}, {"sw_lon", t_integer, .addr.integer = &ais->type22.area.sw_lon, .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE}, {"sw_lat", t_integer, .addr.integer = &ais->type22.area.sw_lat, .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE}, {"dest1", t_uinteger, .addr.uinteger = &ais->type22.mmsi.dest1, .dflt.uinteger = 0}, {"dest2", t_uinteger, .addr.uinteger = &ais->type22.mmsi.dest2, .dflt.uinteger = 0}, {"addressed", t_boolean, .addr.boolean = &ais->type22.addressed, .dflt.boolean = false}, {"band_a", t_boolean, .addr.boolean = &ais->type22.band_a, .dflt.boolean = false}, {"band_b", t_boolean, .addr.boolean = &ais->type22.band_b, .dflt.boolean = false}, {"zonesize", t_uinteger, .addr.uinteger = &ais->type22.zonesize, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais23[] = { AIS_HEADER {"ne_lon", t_integer, .addr.integer = &ais->type23.ne_lon, .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE}, {"ne_lat", t_integer, .addr.integer = &ais->type23.ne_lat, .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE}, {"sw_lon", t_integer, .addr.integer = &ais->type23.sw_lon, .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE}, {"sw_lat", t_integer, .addr.integer = &ais->type23.sw_lat, .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE}, {"stationtype", t_uinteger, .addr.uinteger = &ais->type23.stationtype, .dflt.uinteger = 0}, {"stationtype_text", t_ignore}, {"shiptype", t_uinteger, .addr.uinteger = &ais->type23.shiptype, .dflt.uinteger = 0}, {"shiptype_text", t_ignore}, {"txrx", t_uinteger, .addr.uinteger = &ais->type23.txrx, .dflt.uinteger = 0}, {"interval", t_uinteger, .addr.uinteger = &ais->type23.interval, .dflt.uinteger = 0}, {"quiet", t_uinteger, .addr.uinteger = &ais->type23.quiet, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais24[] = { AIS_HEADER {"shipname", t_string, .addr.string = ais->type24.shipname, .len = sizeof(ais->type24.shipname)}, {"shiptype", t_uinteger, .addr.uinteger = &ais->type24.shiptype, .dflt.uinteger = 0}, {"shiptype_text", t_ignore}, {"vendorid", t_string, .addr.string = ais->type24.vendorid, .len = sizeof(ais->type24.vendorid)}, {"model", t_uinteger, .addr.uinteger = &ais->type24.model, .dflt.uinteger = 0}, {"serial", t_uinteger, .addr.uinteger = &ais->type24.serial, .dflt.uinteger = 0}, {"callsign", t_string, .addr.string = ais->type24.callsign, .len = sizeof(ais->type24.callsign)}, {"mothership_mmsi",t_uinteger, .addr.uinteger = &ais->type24.mothership_mmsi, .dflt.uinteger = 0}, {"to_bow", t_uinteger, .addr.uinteger = &ais->type24.dim.to_bow, .dflt.uinteger = 0}, {"to_stern", t_uinteger, .addr.uinteger = &ais->type24.dim.to_stern, .dflt.uinteger = 0}, {"to_port", t_uinteger, .addr.uinteger = &ais->type24.dim.to_port, .dflt.uinteger = 0}, {"to_starboard", t_uinteger, .addr.uinteger = &ais->type24.dim.to_starboard, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais25[] = { AIS_HEADER {"addressed", t_boolean, .addr.boolean = &ais->type25.addressed, .dflt.boolean = false}, {"structured", t_boolean, .addr.boolean = &ais->type25.structured, .dflt.boolean = false}, {"dest_mmsi", t_uinteger, .addr.uinteger = &ais->type25.dest_mmsi, .dflt.uinteger = 0}, {"app_id", t_uinteger, .addr.uinteger = &ais->type25.app_id, .dflt.uinteger = 0}, {"data", t_string, .addr.string = data, .len = sizeof(data)}, {NULL} }; const struct json_attr_t json_ais26[] = { AIS_HEADER {"addressed", t_boolean, .addr.boolean = &ais->type26.addressed, .dflt.boolean = false}, {"structured", t_boolean, .addr.boolean = &ais->type26.structured, .dflt.boolean = false}, {"dest_mmsi", t_uinteger, .addr.uinteger = &ais->type26.dest_mmsi, .dflt.uinteger = 0}, {"app_id", t_uinteger, .addr.uinteger = &ais->type26.app_id, .dflt.uinteger = 0}, {"data", t_string, .addr.string = data, .len = sizeof(data)}, {"radio", t_uinteger, .addr.uinteger = &ais->type26.radio, .dflt.uinteger = 0}, {NULL} }; const struct json_attr_t json_ais27[] = { AIS_HEADER {"status", t_uinteger, .addr.uinteger = &ais->type27.status, .dflt.uinteger = 0}, {"speed", t_uinteger, .addr.uinteger = &ais->type27.speed, .dflt.uinteger = AIS_LONGRANGE_SPEED_NOT_AVAILABLE}, {"accuracy", t_boolean, .addr.boolean = &ais->type27.accuracy, .dflt.boolean = false}, {"lon", t_integer, .addr.integer = &ais->type27.lon, .dflt.integer = AIS_LONGRANGE_LON_NOT_AVAILABLE}, {"lat", t_integer, .addr.integer = &ais->type27.lat, .dflt.integer = AIS_LONGRANGE_LAT_NOT_AVAILABLE}, {"course", t_uinteger, .addr.uinteger = &ais->type27.course, .dflt.uinteger = AIS_LONGRANGE_COURSE_NOT_AVAILABLE}, {"raim", t_boolean, .addr.boolean = &ais->type27.raim, .dflt.boolean = false}, {"gnss", t_boolean, .addr.boolean = &ais->type27.gnss, .dflt.boolean = true}, {NULL} }; /*@ +fullinitblock */ /* Generated code ends. */ gpsd-3.15/gps_maskdump.c0000444000175000017500000000426312533605314013406 0ustar esresr/* This code is generated. Do not hand-hack it! */ /* * Also, beware that it is something of a CPU hog when called on every packet. * Try to write guards so it is only called at higher log levels. */ #include #include #include "gpsd.h" const char *gps_maskdump(gps_mask_t set) { static char buf[196]; const struct { gps_mask_t mask; const char *name; } *sp, names[] = { {ONLINE_SET, "ONLINE"}, {TIME_SET, "TIME"}, {TIMERR_SET, "TIMERR"}, {LATLON_SET, "LATLON"}, {ALTITUDE_SET, "ALTITUDE"}, {SPEED_SET, "SPEED"}, {TRACK_SET, "TRACK"}, {CLIMB_SET, "CLIMB"}, {STATUS_SET, "STATUS"}, {MODE_SET, "MODE"}, {DOP_SET, "DOP"}, {HERR_SET, "HERR"}, {VERR_SET, "VERR"}, {ATTITUDE_SET, "ATTITUDE"}, {SATELLITE_SET, "SATELLITE"}, {SPEEDERR_SET, "SPEEDERR"}, {TRACKERR_SET, "TRACKERR"}, {CLIMBERR_SET, "CLIMBERR"}, {DEVICE_SET, "DEVICE"}, {DEVICELIST_SET, "DEVICELIST"}, {DEVICEID_SET, "DEVICEID"}, {RTCM2_SET, "RTCM2"}, {RTCM3_SET, "RTCM3"}, {AIS_SET, "AIS"}, {PACKET_SET, "PACKET"}, {SUBFRAME_SET, "SUBFRAME"}, {GST_SET, "GST"}, {VERSION_SET, "VERSION"}, {POLICY_SET, "POLICY"}, {LOGMESSAGE_SET, "LOGMESSAGE"}, {ERROR_SET, "ERROR"}, {TOFF_SET, "TOFF"}, {PPS_SET, "PPS"}, {NAVDATA_SET, "NAVDATA"}, {RAW_IS, "RAW"}, {USED_IS, "USED"}, {DRIVER_IS, "DRIVER"}, {CLEAR_IS, "CLEAR"}, {REPORT_IS, "REPORT"}, {NODATA_IS, "NODATA"}, {PPSTIME_IS, "PPSTIME"}, {PERR_IS, "PERR"}, {PASSTHROUGH_IS, "PASSTHROUGH"}, {EOF_IS, "EOF"}, }; memset(buf, '\0', sizeof(buf)); buf[0] = '{'; for (sp = names; sp < names + sizeof(names)/sizeof(names[0]); sp++) if ((set & sp->mask)!=0) { (void)strlcat(buf, sp->name, sizeof(buf)); (void)strlcat(buf, "|", sizeof(buf)); } if (buf[1] != '\0') buf[strlen(buf)-1] = '\0'; (void)strlcat(buf, "}", sizeof(buf)); return buf; } gpsd-3.15/revision.h0000664000175000017500000000003012533605314012547 0ustar esresr#define REVISION "3.15" gpsd-3.15/gpsd.php0000444000175000017500000004536712513100102012207 0ustar esresr # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # Changed to Google Maps API v3, requires no API key, and shorter code # Sanjeev Gupta 2013-01-05 global $head, $blurb, $title, $showmap, $autorefresh, $footer, $gmap_key; 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); ini_set('max_execution_time', 3); if (!file_exists("gpsd_config.inc")) write_config(); require_once("gpsd_config.inc"); # sample data $resp = <<0) && ($port<65536)) $port = $_GET['port']; if ($testmode){ $sock = @fsockopen($server, $port, $errno, $errstr, 2); @fwrite($sock, "?WATCH={\"enable\":true}\n"); usleep(1000); @fwrite($sock, "?POLL;\n"); usleep(1000); for($tries = 0; $tries < 10; $tries++){ $resp = @fread($sock, 2000); # SKY can be pretty big if (preg_match('/{"class":"POLL".+}/i', $resp, $m)){ $resp = $m[0]; break; } } @fclose($sock); if (!$resp) $resp = '{"class":"ERROR","message":"no response from GPS daemon"}'; } } if ($op == 'view') gen_image($resp); else if ($op == 'json') write_json($resp); else write_html($resp); exit(0); ########################################################################### # Function to decide if a PRN is a true GPS bird or SBAS, GBAS, etc. # Sanjeev Gupta 20150408 # Please refer to gps.h lines ~~ 95 , for a central definition function isGPS($PRN) { if ($PRN <= 32) return TRUE ; # Navstar GPS if ($PRN >= 64 && $PRN <= 96) return TRUE ; # GLONASS if ($PRN >= 159 ) return TRUE ; # BeiDou ? return FALSE ; # SBAS, GBAS, unknown } function colorsetup($im){ $C['white'] = imageColorAllocate($im, 255, 255, 255); $C['ltgray'] = imageColorAllocate($im, 191, 191, 191); $C['mdgray'] = imageColorAllocate($im, 127, 127, 127); $C['dkgray'] = imageColorAllocate($im, 63, 63, 63); $C['black'] = imageColorAllocate($im, 0, 0, 0); $C['red'] = imageColorAllocate($im, 255, 0, 0); $C['brightgreen'] = imageColorAllocate($im, 0, 255, 0); $C['darkgreen'] = imageColorAllocate($im, 0, 192, 0); $C['blue'] = imageColorAllocate($im, 0, 0, 255); $C['cyan'] = imageColorAllocate($im, 0, 255, 255); $C['magenta'] = imageColorAllocate($im, 255, 0, 255); $C['yellow'] = imageColorAllocate($im, 255, 255, 0); $C['orange'] = imageColorAllocate($im, 255, 128, 0); return $C; } function legend($im, $sz, $C){ $r = 30; $fn = 5; $x = $sz - (4*$r+7) - 2; $y = $sz - $r - 3; imageFilledRectangle($im, $x, $y, $x + 4*$r + 7, $y + $r +1, $C['dkgray']); imageRectangle($im, $x+0*$r+1, $y+1, $x + 1*$r + 0, $y + $r, $C['red']); imageRectangle($im, $x+1*$r+2, $y+1, $x + 2*$r + 2, $y + $r, $C['yellow']); imageRectangle($im, $x+2*$r+4, $y+1, $x + 3*$r + 4, $y + $r, $C['darkgreen']); imageRectangle($im, $x+4*$r+6, $y+1, $x + 3*$r + 6, $y + $r, $C['brightgreen']); imageString($im, $fn, $x+3+0*$r, $y+$r/3, "<30", $C['red']); imageString($im, $fn, $x+5+1*$r, $y+$r/3, "30+", $C['yellow']); imageString($im, $fn, $x+7+2*$r, $y+$r/3, "35+", $C['darkgreen']); imageString($im, $fn, $x+9+3*$r, $y+$r/3, "40+", $C['brightgreen']); } function radial($angle, $sz){ #turn into radians $angle = deg2rad($angle); # determine length of radius $r = $sz * 0.5 * 0.95; # and convert length/azimuth to cartesian $x0 = sprintf("%d", (($sz * 0.5) - ($r * cos($angle)))); $y0 = sprintf("%d", (($sz * 0.5) - ($r * sin($angle)))); $x1 = sprintf("%d", (($sz * 0.5) + ($r * cos($angle)))); $y1 = sprintf("%d", (($sz * 0.5) + ($r * sin($angle)))); return array($x0, $y0, $x1, $y1); } function azel2xy($az, $el, $sz){ global $swap_ew; #rotate coords... 90deg W = 180deg trig $az += 270; #turn into radians $az = deg2rad($az); # determine length of radius $r = $sz * 0.5 * 0.95; $r -= ($r * ($el/90)); # and convert length/azimuth to cartesian $x = sprintf("%d", (($sz * 0.5) + ($r * cos($az)))); $y = sprintf("%d", (($sz * 0.5) + ($r * sin($az)))); if ($swap_ew == 0) $x = $sz - $x; return array($x, $y); } function splot($im, $sz, $C, $e){ if ((0 == $e['PRN']) || (0 == $e['az'] + $e['el'] + $e['ss']) || ($e['az'] < 0) || ($e['el'] < 0)) return; $color = $C['brightgreen']; if ($e['ss'] < 40) $color = $C['darkgreen']; if ($e['ss'] < 35) $color = $C['yellow']; if ($e['ss'] < 30) $color = $C['red']; if ($e['el']<10) $color = $C['blue']; if ($e['ss'] < 10) $color = $C['black']; list($x, $y) = azel2xy($e['az'], $e['el'], $sz); $r = 12; if (isset($_GET['sz']) && ($_GET['sz'] == 'small')) $r = 8; imageString($im, 3, $x+4, $y+4, $e['PRN'], $C['black']); if ($e['used'] == true) if (isGPS($e['PRN'])) imageFilledArc($im, $x, $y, $r, $r, 0, 360, $color, 0); else imageFilledDiamond($im, $x, $y, $r, $color); else if (isGPS($e['PRN'])) imageArc($im, $x, $y, $r, $r, 0, 360, $color); else imageDiamond($im, $x, $y, $r, $color); } function imageDiamond($im, $x, $y, $r, $color){ $t = $r/2; # this lunacy is because imagesetthickness doesn't seem to work $vx = array ( $x+$t, $y, $x, $y+$t, $x-$t, $y, $x, $y-$t ); imagepolygon($im, $vx, 4, $color); $t--; $vx = array ( $x+$t, $y, $x, $y+$t, $x-$t, $y, $x, $y-$t ); imagepolygon($im, $vx, 4, $color); $t--; $vx = array ( $x+$t, $y, $x, $y+$t, $x-$t, $y, $x, $y-$t ); imagepolygon($im, $vx, 4, $color); } function imageFilledDiamond($im, $x, $y, $r, $color){ $t = $r/2; while($t){ $vx = array ( $x+$t, $y, $x, $y+$t, $x-$t, $y, $x, $y-$t ); imagepolygon($im, $vx, 4, $color); $t -= 0.5; } } function elevation($im, $sz, $C, $a){ $b = 90 - $a; $a = $sz * 0.95 * ($a/180); imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['ltgray']); $x = $sz/2 - 16; $y = $sz/2 - $a; imageString($im, 2, $x, $y, $b, $C['ltgray']); } function skyview($im, $sz, $C){ global $swap_ew; $a = 90; $a = $sz * 0.95 * ($a/180); imageFilledArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['mdgray'], 0); imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['black']); $x = $sz/2 - 16; $y = $sz/2 - $a; imageString($im, 2, $x, $y, "0", $C['ltgray']); $a = 85; $a = $sz * 0.95 * ($a/180); imageFilledArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['white'], 0); imageArc($im, $sz/2, $sz/2, $a*2, $a*2, 0, 360, $C['ltgray']); imageString($im, 1, $sz/2 - 6, $sz+$a, '5', $C['black']); $x = $sz/2 - 16; $y = $sz/2 - $a; imageString($im, 2, $x, $y, "5", $C['ltgray']); for($i = 0; $i < 180; $i += 15){ list($x0, $y0, $x1, $y1) = radial($i, $sz); imageLine($im, $x0, $y0, $x1, $y1, $C['ltgray']); } for($i = 15; $i < 90; $i += 15) elevation($im, $sz, $C, $i); $x = $sz/2 - 16; $y = $sz/2 - 8; /* imageString($im, 2, $x, $y, "90", $C['ltgray']); */ imageString($im, 4, $sz/2 + 4, 2 , 'N', $C['black']); imageString($im, 4, $sz/2 + 4, $sz - 16 , 'S', $C['black']); if ($swap_ew == 0){ imageString($im, 4, 4 , $sz/2 + 4, 'E', $C['black']); imageString($im, 4, $sz - 10 , $sz/2 + 4, 'W', $C['black']); } else { imageString($im, 4, 4 , $sz/2 + 4, 'W', $C['black']); imageString($im, 4, $sz - 10 , $sz/2 + 4, 'E', $C['black']); } } function gen_image($resp){ $sz = 600; if (isset($_GET['sz']) && ($_GET['sz'] == 'small')) $sz = 240; $GPS = json_decode($resp, true); if ($GPS['class'] != "POLL"){ die("json_decode error: $resp"); } $im = imageCreate($sz, $sz); $C = colorsetup($im); skyview($im, $sz, $C); if ($sz > 240) legend($im, $sz, $C); for($i = 0; $i < count($GPS['sky'][0]['satellites']); $i++){ splot($im, $sz, $C, $GPS['sky'][0]['satellites'][$i]); } header("Content-type: image/png"); imagePNG($im); imageDestroy($im); } function dfix($x, $y, $z){ if ($x < 0){ $x = sprintf("%f %s", -1 * $x, $z); } else { $x = sprintf("%f %s", $x, $y); } return $x; } function write_html($resp){ global $sock, $errstr, $errno, $server, $port, $head, $body, $open; global $blurb, $title, $autorefresh, $showmap, $gmap_key, $footer; 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"); global $lat, $lon; $lat = (float)$GPS['tpv'][0]['lat']; $lon = (float)$GPS['tpv'][0]['lon']; $x = $server; $y = $port; $imgdata = base64_encode($resp); $server = $x; $port = $y; if ($autorefresh > 0) $autorefresh = ""; else $autorefresh = ''; $map_head = $map_body = $map_code = ''; if ($showmap == 1) { $map_head = gen_gmap_head(); $map_body = 'onload="Load()" onunload="GUnload()"'; $map_code = gen_map_code(); } else if ($showmap == 2) { $map_head = gen_osm_head(); $map_body = 'onload="Load()"'; $map_code = gen_map_code(); } $part1 = << {$head} {$map_head} {$title} - GPSD Test Station {$lat}, {$lon} {$autorefresh}
EOF; if (!strlen($advertise)) $advertise = $server; if ($testmode && !$sock) $part2 = ""; else $part2 = << EOF; if (!$open) $part3 = ''; else $part3 = << EOF; if ($testmode && !$sock) $part4 = ""; else { $fix = $GPS['tpv'][0]; $sky = $GPS['sky'][0]; $sats = $sky['satellites']; $nsv = count($sats); $ts = $fix['time']; $sat = ''; foreach($sats as $s) $sat .= sprintf( "\t\n", $s['PRN'], $s['el'], $s['az'], $s['ss'], $s['used'] ? 'Y' : 'N' ); $part4 = << EOF; } $part5 = << {$footer}

This script is distributed by the GPSD project.

EOF; 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) die("can't generate prototype config file. try running this script as root in DOCUMENT_ROOT"); $buf = <<gpsd server located someplace. The hardware is a hardware description and link. This machine is maintained by Your Name Goes Here.
EOT; ?> EOB; fwrite($f, $buf); fclose($f); } function gen_gmap_head() { global $gmap_key; return << EOT; } function gen_osm_head() { global $GPS; return << EOT; } function gen_map_code() { return <<
Loading...
EOT; } ?> gpsd-3.15/gpsd_config.h0000664000175000017500000001424712533605314013212 0ustar esresr/* gpsd_config.h. Generated by scons, do not hand-hack. */ #ifndef GPSD_CONFIG_H #define VERSION "3.15" #define GPSD_URL "http://catb.org/gpsd" #define HAVE_LIBUSB 1 #define HAVE_LIBRT 1 #define HAVE_DBUS 1 /* #undef ENABLE_BLUEZ */ #define HAVE_LINUX_CAN_H 1 /* #undef HAVE_STDATOMIC_H */ /* #undef HAVE_OSATOMIC_H */ #define HAVE_BUILTIN_ENDIANNESS 1 /* #undef HAVE_ENDIAN_H */ /* #undef HAVE_SYS_ENDIAN_H */ #define HAVE_DAEMON 1 /* #undef HAVE_STRLCPY */ /* #undef HAVE_STRLCAT */ #define HAVE_CLOCK_GETTIME 1 /* AIVDM support */ #define AIVDM_ENABLE 1 /* Ashtech support */ #define ASHTECH_ENABLE 1 /* application binaries directory */ #define BINDIR "bin" /* BlueZ support for Bluetooth devices */ /* #undef BLUEZ_ENABLE */ /* client debugging support */ #define CLIENTDEBUG_ENABLE 1 /* control socket for hotplug notifications */ #define CONTROL_SOCKET_ENABLE 1 /* allow gpsctl/gpsmon to change device settings */ #define CONTROLSEND_ENABLE 1 /* build with code coveraging enabled */ /* #undef COVERAGING_ENABLE */ /* enable DBUS export support */ #define DBUS_EXPORT_ENABLE 1 /* include debug information in build */ #define DEBUG_ENABLE 1 /* documents directory */ #define DOCDIR "share/doc" /* DeLorme EarthMate Zodiac support */ #define EARTHMATE_ENABLE 1 /* EverMore binary support */ #define EVERMORE_ENABLE 1 /* fixed serial port speed */ /* #undef FIXED_PORT_SPEED */ /* fixed serial port stop bits */ /* #undef FIXED_STOP_BITS */ /* force daemon to listen on all addressses */ /* #undef FORCE_GLOBAL_ENABLE */ /* Jackson Labs Fury and Firefly support */ #define FURY_ENABLE 1 /* San Jose Navigation FV-18 support */ #define FV18_ENABLE 1 /* Garmin kernel driver support */ #define GARMIN_ENABLE 1 /* Garmin Simple Text support */ #define GARMINTXT_ENABLE 1 /* Geostar Protocol support */ #define GEOSTAR_ENABLE 1 /* GPSClock support */ #define GPSCLOCK_ENABLE 1 /* privilege revocation group */ #define GPSD_GROUP "dialout" /* privilege revocation user */ #define GPSD_USER "nobody" /* implicit linkage is supported in shared libs */ #define IMPLICIT_LINK_ENABLE 1 /* header file directory */ #define INCLUDEDIR "include" /* build IPv6 support */ #define IPV6_ENABLE 1 /* iTrax hardware support */ #define ITRAX_ENABLE 1 /* fetch up-to-date data on leap seconds. */ #define LEAPFETCH_ENABLE 1 /* system libraries */ #define LIBDIR "lib" /* build C++ bindings */ #define LIBGPSMM_ENABLE 1 /* build help in man and HTML formats */ #define MANBUILD_ENABLE 1 /* manual pages directory */ #define MANDIR "share/man" /* maximum allowed clients */ #define MAX_CLIENTS 64 /* maximum allowed devices */ #define MAX_DEVICES 4 /* turn off every option not set on the command line */ /* #undef MINIMAL_ENABLE */ /* MTK-3301 support */ #define MTK3301_ENABLE 1 /* Navcom NCT support */ #define NAVCOM_ENABLE 1 /* build with ncurses */ #define NCURSES_ENABLE 1 /* build support for handling TCP/IP data sources */ #define NETFEED_ENABLE 1 /* NMEA0183 support */ #define NMEA0183_ENABLE 1 /* NMEA2000/CAN support */ #define NMEA2000_ENABLE 1 /* float ops are expensive, suppress error estimates */ /* #undef NOFLOATS_ENABLE */ /* don't symbol-strip binaries at link time */ /* #undef NOSTRIP_ENABLE */ /* NTP time hinting support */ #define NTP_ENABLE 1 /* NTP time hinting via shared memory */ #define NTPSHM_ENABLE 1 /* NTRIP support */ #define NTRIP_ENABLE 1 /* OceanServer support */ #define OCEANSERVER_ENABLE 1 /* Motorola OnCore chipset support */ #define ONCORE_ENABLE 1 /* build support for passing through JSON */ #define PASSTHROUGH_ENABLE 1 /* pkgconfig file directory */ #define PKGCONFIG "lib/pkgconfig" /* PPS time syncing support */ #define PPS_ENABLE 1 /* installation directory prefix */ #define PREFIX "/usr/local" /* build with profiling enabled */ /* #undef PROFILING_ENABLE */ /* build Python support and modules. */ #define PYTHON_ENABLE 1 /* Python module directory prefix */ #define PYTHON_LIBDIR "/usr/lib/python2.7/dist-packages" /* build QT bindings */ #define QT_ENABLE 1 /* allow gpsd to change device settings */ #define RECONFIGURE_ENABLE 1 /* rtcm104v2 support */ #define RTCM104V2_ENABLE 1 /* rtcm104v3 support */ #define RTCM104V3_ENABLE 1 /* system binaries directory */ #define SBINDIR "sbin" /* build shared libraries, not static */ #define SHARED_ENABLE 1 /* export via shared memory */ #define SHM_EXPORT_ENABLE 1 /* SiRF chipset support */ #define SIRF_ENABLE 1 /* run tests with realistic (slow) delays */ /* #undef SLOW_ENABLE */ /* data export over sockets */ #define SOCKET_EXPORT_ENABLE 1 /* squelch gpsd_log/gpsd_hexdump to save cpu */ /* #undef SQUELCH_ENABLE */ /* Novatel SuperStarII chipset support */ #define SUPERSTAR2_ENABLE 1 /* system configuration directory */ #define SYSCONFDIR "etc" /* cross-development system root */ /* #undef SYSROOT */ /* systemd socket activation */ #define SYSTEMD_ENABLE 1 /* cross-development target */ /* #undef TARGET */ /* latency timing support */ #define TIMING_ENABLE 1 /* True North Technologies support */ #define TNT_ENABLE 1 /* DeLorme TripMate support */ #define TRIPMATE_ENABLE 1 /* Trimble TSIP support */ #define TSIP_ENABLE 1 /* u-blox Protocol support */ #define UBLOX_ENABLE 1 /* udev rules directory */ #define UDEVDIR "/lib/udev" /* libusb support for USB devices */ #define USB_ENABLE 1 /* Some libcs do not have strlcat/strlcpy. Local copies are provided */ #ifndef HAVE_STRLCAT # ifdef __cplusplus extern "C" { # endif #include size_t strlcat(/*@out@*/char *dst, /*@in@*/const char *src, size_t size); # ifdef __cplusplus } # endif #endif #ifndef HAVE_STRLCPY # ifdef __cplusplus extern "C" { # endif #include size_t strlcpy(/*@out@*/char *dst, /*@in@*/const char *src, size_t size); # ifdef __cplusplus } # endif #endif #ifndef HAVE_CLOCK_GETTIME # ifdef __cplusplus extern "C" { # endif #ifndef CLOCKID_T_DEFINED typedef int clockid_t; #define CLOCKID_T_DEFINED # endif /* OS X uses _STRUCT_TIMESPEC, but no clock_gettime */ #ifndef _STRUCT_TIMESPEC struct timespec { time_t tv_sec; long tv_nsec; }; #endif #define CLOCK_REALTIME 0 int clock_gettime(clockid_t, struct timespec *); # ifdef __cplusplus } # endif #endif #define GPSD_CONFIG_H #endif /* GPSD_CONFIG_H */ gpsd-3.15/gpsctl.10000664000175000017500000001661012513100102012110 0ustar esresr'\" t .\" Title: gpsctl .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 29 Oct 2006 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSCTL" "1" "29 Oct 2006" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpsctl \- control the modes of a GPS .SH "SYNOPSIS" .HP \w'\fBgpsctl\fR\ 'u \fBgpsctl\fR [\-h] [\-b | \-n] [\-x\ \fIcontrol\fR] [\-e] [\-f] [\-l] [\-s\ \fIspeed\fR] [\-t\ \fIdevicetype\fR] [\-R] [\-D\ \fIdebuglevel\fR] [\-V] [\fIserial\-port\fR] .SH "DESCRIPTION" .PP gpsctl can switch a dual\-mode GPS between NMEA and vendor\-binary modes\&. It can also be used to set the device baudrate\&. Note: Not all devices have these capabilities\&. .PP If you have only one GPS attached to your machine, and gpsd is running, it is not necessary to specify the device; gpsctl does its work through gpsd, which will locate it for you\&. .PP When gpsd is not running, the device specification is required, and you will need to be running as root or be a member of the device\*(Aqs owning group in order to have write access to the device\&. On many Unix variants the owning group will be named \*(Aqdialout\*(Aq\&. .PP The program accepts the following options: .PP \-b .RS 4 Put the GPS into native (binary) mode\&. .RE .PP \-c .RS 4 Change the GPS\*(Aqs cycle time\&. Units are seconds\&. Note, most GPSes have a fixed cycle time of 1 second\&. .RE .PP \-e .RS 4 Generate the packet from any other arguments specified and ship it to standard output instead of the device\&. This switch can be used with the \fB\-t\fR option without specifying a device\&. Note: the packet data for a binary prototype will be raw, not ASCII\-ized in any way\&. .RE .PP \-f .RS 4 Force low\-level access (not through the daemon)\&. .RE .PP \-l .RS 4 List a table showing which option switches can be applied to which device types, and exit\&. .RE .PP \-n .RS 4 Put GPS into NMEA mode\&. .RE .PP \-s .RS 4 Set the baud rate at which the GPS emits packets\&. .sp Use this option with caution\&. On USB and Bluetooth GPSes it is also possible for serial mode setting to fail either because the serial adaptor chip does not support non\-8N1 modes or because the device firmware does not properly synchronize the serial adaptor chip with the UART on the GPS chipset when the speed changes\&. These failures can hang your device, possibly requiring a GPS power cycle or (in extreme cases) physically disconnecting the NVRAM backup battery\&. .RE .PP \-t .RS 4 Force the device type\&. .RE .PP \-x .RS 4 Send a specified control string to the GPS; gpsctl will provide packet headers and trailers and checksum as appropriate for binary packet types, and whatever checksum and trailer is required for text packet types\&. (You must include the leading $ for NMEA packets\&.) When sending to a UBX device, the first two bytes of the string supplied will become the message class and type, and the remainder the payload\&. When sending to a Navcom NCT or Trimble TSIP device, the first byte is interpreted as the command ID and the rest as payload\&. When sending to a Zodiac device, the first two bytes are used as a message ID of type little\-endian short, and the remainder as payload in byte pairs interpreted as little\-endian short\&. For all other supported binary GPSes (notably including SiRF) the string is taken as the entire message payload and wrapped with appropriate header, trailer and checksum bytes\&. C\-style backslash escapes in the string, notably \exNN for hex, will be interpreted; additionally, \ee will be replaced with ESC\&. This switch implies \fB\-f\fR\&. .RE .PP \-T .RS 4 Change the sampling timeout\&. Defaults to 8 seconds, which should always be sufficient to get an identifying packet from a device emitting at the normal rate of 1 per second\&. .RE .PP \-R .RS 4 Remove the GPSD shared\-memory segment used for SHM export\&. This option will normally only be of interest to GPSD developers\&. .RE .PP \-h .RS 4 Display program usage and exit\&. .RE .PP \-D .RS 4 Set level of debug messages\&. .RE .PP \-V .RS 4 Display program version and exit\&. .RE .PP The argument of the forcing option, \fB\-t\fR, should be a string which is contained in exactly one of the known driver names; for a list, do \fBgpsctl \-l\fR\&. .PP Forcing the device type behaves somewhat differently depending on whether this tool is going through the daemon or not\&. In high\-level mode, if the device that daemon selects for you doesn\*(Aqt match the driver you specified, gpsctl exits with a warning\&. (This may be useful in scripts\&.) .PP In low\-level mode, if the device identifies as a Generic NMEA, use the selected driver instead\&. This will be useful if you have a GPS device of known type that is in NMEA mode and not responding to probes\&. (This option was originally implemented for talking to SiRFStar I chips, which don\*(Aqt respond to the normal SiRF ID probe\&.) .PP If no options are given, the program will display a message identifying the GPS type of the selected device and exit\&. .PP Reset (\-r) operations must stand alone; others can be combined\&. Multiple options will be executed in this order: mode changes (\-b and \-n) first, speed changes (\-s) second, and control\-string sends (\-c) last\&. .SH "ENVIRONMENT VARIABLES" .PP By setting the environment variable \fBGPSD_SHM_KEY\fR, you can control the key value used to designate the shared\-memory segment removed with the \-R option\&. This will be useful mainly when isolating test instances of gpsd from production ones\&. .SH "EXAMPLES" .PP \fBgpsctl /dev/ttyUSB0\fR .RS 4 Attempt to identify the device on USB serial device 0\&. Time out after the default number of seconds\&. Adding the \fB\-f\fR will force low\-level access and suppress the normal complaint when this tool can\*(Aqt find a GPSD to work through\&. .RE .PP gpsctl \-f \-n \-s 9600 /dev/ttyUSB0 .RS 4 Use low\-level operations (not going through a gpsd instance) to switch a GPS to NMEA mode at 9600bps\&. The tool will identify the GPS type itself\&. .RE .SH "BUGS" .PP SiRF GPSes can only be identified by the success of an attempt to flip them into SiRF binary mode\&. Thus, the process of probing one of these running in NMEA will change its behavior\&. .PP Baud rate and mode changes work in direct mode but are not reliable in client mode\&. This will be fixed in a future release\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgpsdctl\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsprof\fR(1), \fBgpsfake\fR(1)\&. .SH "AUTHOR" .PP Eric S\&. Raymond \&. gpsd-3.15/gpsmon.10000664000175000017500000003323712533043775012153 0ustar esresr'\" t .\" Title: gpsmon .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 17 Feb 2009 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSMON" "1" "17 Feb 2009" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpsmon \- real\-time GPS packet monitor and control utility .SH "SYNOPSIS" .HP \w'\fBgpsmon\fR\ 'u \fBgpsmon\fR [\-L] [\-V] [\-h] [\-n] [\-a] [\-l\ \fIlogfile\fR] [\-t\ \fIdriver\-prefix\fR] [[\ \fIserver\fR\ [\fI:port\fR\ [\fI:device\fR]]\ |\ \fIdevice\fR]] [\-D\ \fIdebuglevel\fR] .SH "DESCRIPTION" .PP gpsmon is a monitor that watches packets coming from a GPS and displays them along with diagnostic information\&. It supports commands that can be used to tweak GPS settings in various ways; some are device\-independent, some vary with the GPS chipset type\&. It will behave sanely, just dumping packets, when connected to a GPS type it knows nothing about\&. .PP gpsmon differs from a navigation client in that it mostly dumps raw data from the GPS, with only enough data\-massaging to allow checks against expected output\&. In particular, this tool does not do any interpolation or modeling to derive climb/sink or error estimates\&. Nor does it discard altitude reports when the fix quality is too low\&. .PP Unlike gpsd, gpsmon never writes control or probe strings to the device unless you explicitly tell it to\&. Thus, while it will auto\-sync to binary packet types, it won\*(Aqt automatically reecognize a device shipping an extended NMEA protocol as anything other than a plain NMEA device\&. Use the \fB\-t\fR option or the \fBt\fR to work around this\&. .PP gpsmon is a designed to run in a terminal emulator with a minimum 25x80 size; the non\-GUI interface is a design choice made to accommodate users operating in constrained environments and over telnet or ssh connections\&. If run in a larger window, the size of the packet\-log window will be increased to fit\&. .PP gpsmon accepts an \-h option that displays a usage message, or a \-V option to dump the package version and exit\&. .PP This program may be run in either of two modes, as a client for the gpsd daemon (and its associated control socket) or directly connected to a specified serial device\&. When run with no argument, it attempts to connect to the daemon\&. If the argument begins with a server:port specification it will also attempt to connect to the daemon\&. If the argument looks like a bare server name it will attempt to connect to a daemon running on the default gpsd port on that server\&. Only if the device argument contains slashes but no colons will it be treated as a serial device for direct connection\&. In direct\-connect mode gpsmon will hunt for a correct baud rate and lock on to it automatically\&. Possible cases look like this: .PP localhost:/dev/ttyS1 .RS 4 Look at the default port of localhost, trying both IPv4 and IPv6 and watching output from serial device 1\&. .RE .PP example\&.com:2317 .RS 4 Look at port 2317 on example\&.com, trying both IPv4 and IPv6\&. .RE .PP 71\&.162\&.241\&.5:2317:/dev/ttyS3 .RS 4 Look at port 2317 at the specified IPv4 address, collecting data from attached serial device 3\&. .RE .PP [FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:2317:/dev/ttyS5 .RS 4 Look at port 2317 at the specified IPv6 address, collecting data from attached serial device 5\&. .RE .PP Unlike gpsd, gpsmon run in direct mode does not do its own device probing\&. Thus, in particular, if you point it at a GPS with a native binary mode that happens to be emitting NMEA, it won\*(Aqt identify the actual type unless the device emits a recognizable NMEA trigger sentence\&. The \-t and \-i options may help you\&. .PP The \-F option is only valid in client mode; it specifies a control socket to which the program should send device control strings\&. You must specify a valid pathname of a Unix\-domain socket on your local filesystem\&. .PP The \-D option enables packet\-getter debugging output and is probably only useful to developers of the GPSD code\&. Consult the packet\-getter source code for relevant values\&. .PP The \-L option lists a table showing which GPS device types gpsmon has built\-in support for, and which generic commands can be applied to which GPS types, and then exits\&. Note that this does not list type\-specific commands associated with individual GPS types\&. .PP The \-l option sets up logging to a specified file to start immediately on device open\&. This may be useful is, for example, you want to capture the startup message from a device that displays firmware version information there\&. .PP The \-n option forces gpsmon to request NMEA0183 packets instead of the raw datastream from gpsd\&. .PP The \-t option sets up a fallback type\&. Give it a string that is a distinguishing prefix of exactly one driver type name; this will be used for mode, speed, and rate switching if the driver selected by the packet type lacks those capabilities\&. Most useful when the packet type is NMEA but the device is known to have a binary mode, such as SiRF binary\&. .PP The \-a option enables a special debugging mode that does not use screen painting\&. Packets are dumped normally; any character typed suspends packet dumping and brings up a command prompt\&. This feature will mainly be of interest to GPSD developers\&. .PP After startup (without \-a), the top part of the screen reports the contents of several especially interesting packet types\&. The "PPS" field, if nonempty, is the delta between the last 1PPS top of second and the system clock at that time\&. .PP The bottom half of the screen is a scrolling hex dump of all packets the GPS is issuing\&. If the packet type is textual, any trailing CR/LF is omitted\&. Dump lines beginning >>> represent control packets sent to the GPS\&. Lines consisting of "PPS" surrounded by dashes, if present, indicate 1PPS and the start of the reporting cycle\&. .SH "COMMANDS" .PP The following device\-independent commands are available while gpsmon is running: .PP i .RS 4 (Direct mode only\&.) Enable/disable subtype probing and reinitialize the driver\&. In normal operation, gpsmon does not send configuration strings to the device (except for wakeup strings needed to get it to send data, if any)\&. The command \*(Aqi1\*(Aq causes it to send the same sequence of subtype probes that gpsd would\&. The command \*(Aqi0\*(Aq turns off probing; \*(Aqi\*(Aq alone toggles the bit\&. In either case, the current driver is re\-selected; if the probe bit is enabled, probes will begin to be issued immediately\&. .sp Note that enabling probing might flip the device into another mode; in particular, it will flip a SiRF chip into binary mode as if you had used the \(lqn\(rq command\&. This is due to a limitation in the SiRF firmware that we can\*(Aqt fix\&. .sp This command will generally do nothing after the first time you use it, because the device type will already have been discovered\&. .RE .PP c .RS 4 (Direct mode only\&.) Change cycle time\&. Follow it with a number interpreted as a cycle time in seconds\&. Most devices have a fixed cycle time of 1 second, so this command may fail with a message\&. .RE .PP l .RS 4 Toggle packet logging\&. If packet logging is on, it will be turned off and the log closed\&. If it is off, logging to the filename following the l will be enabled\&. Differs from simply capturing the data from the GPS device in that only whole packets are logged\&. The logfile is opened for append, so you can log more than one portion of the packet stream and they will be stitched together correctly\&. .RE .PP n .RS 4 (Direct mode only\&.) With an argument of 0, switch device to NMEA mode at current speed; with an argument of 1, change to binary (native) mode\&. With no argument, toggle the setting\&. Will show an error if the device doesn\*(Aqt have such modes\&. .sp After you switch a dual\-protocol GPS to NMEA mode wityh this command, it retains the information about the original type and its control capabilities\&. That is why the device type listed before the prompt doesn\*(Aqt change\&. .RE .PP q .RS 4 Quit gpsmon\&. Control\-C, or whatever your current interrupt character is, works as well\&. .RE .PP s .RS 4 (Direct mode only\&.) Change baud rate\&. Follow it with a number interpreted as bits per second, for example "s9600"\&. The speed number may optionally be followed by a colon and a wordlength\-parity\-stopbits specification in the traditional style, e\&.g 8N1 (the default), 7E1, etc\&. Some devices don\*(Aqt support serial modes other than their default, so this command may fail with a message\&. .sp Use this command with caution\&. On USB and Bluetooth GPSes it is also possible for serial mode setting to fail either because the serial adaptor chip does not support non\-8N1 modes or because the device firmware does not properly synchronize the serial adaptor chip with the UART on the GPS chipset when the speed changes\&. These failures can hang your device, possibly requiring a GPS power cycle or (in extreme cases) physically disconnecting the NVRAM backup battery\&. .RE .PP t .RS 4 (Direct mode only\&.) Force a switch of monitoring type\&. Follow it with a string that is unique to the name of a gpsd driver with gpsmon support; gpsmon will switch to using that driver and display code\&. Will show an error message if there is no matching gpsd driver, or multiple matches, or the unique match has no display support in gpsmon\&. .RE .PP x .RS 4 (Direct mode only\&.) Send hex payload to device\&. Following the command letter you may type hex digit pairs; end with a newline\&. These will become the payload of a control packet shipped to the device\&. The packet will be wrapped with headers, trailers, and checksum appropriate for the current driver type\&. The first one or two bytes of the payload may be specially interpreted, see the description of the \fB\-x\fR of \fBgpsctl\fR(1)\&. .RE .PP X .RS 4 (Direct mode only\&.) Send raw hex bytes to device\&. Following the command letter you may type hex digit pairs; end with a newline\&. These will be shipped to the device\&. .RE .PP Ctrl\-S .RS 4 Freeze display, suspend scrolling in debug window\&. .RE .PP Ctrl\-Q .RS 4 Unfreeze display, resume normal operation\&. .RE .SS "NMEA support" .PP (These remarks apply to not just generic NMEA devices but all extended NMEA devices for which gpsmon presently has support\&.) .PP All fields are raw data from the GPS except (a) the "Cooked PVT" window near top of screen, provided as a check and (b) the "PPS offset" field\&. .PP There are no device\-specific commands\&. Which generic commands are available may vary by type: examine the output of \fBgpsmon \-l\fR to learn more\&. .SS "SiRF support" .PP Most information is raw from the GPS\&. Underlined fields are derived by translation from ECEF coordinates or application of leap\-second and local time\-zone offsets\&. 1PPS is the clock lag as usual\&. .PP The following commands are supported for SiRF GPSes only: .PP A .RS 4 (Direct mode only\&.) Toggle reporting of 50BPS subframe data\&. .RE .PP M .RS 4 (Direct mode only\&.) Set (M1) or clear (M0) static navigation\&. The SiRF documentation says \(lqStatic navigation is a position filter designed to be used with motor vehicles\&. When the vehicle\*(Aqs velocity falls below a threshold, the position and heading are frozen, and velocity is set to zero\&. This condition will continue until the computed velocity rises above 1\&.2 times the threshold or until the computed position is at least a set distance from the frozen place\&. The threshold velocity and set distance may vary with software versions\&.\(rq .sp Non\-static mode is designed for use with road navigation software, which often snaps the reported position to the nearest road within some uncertainty radius\&. You probably want to turn static navigation off for pedestrian use, as it is likely to report speed zero and position changing in large jumps\&. .RE .PP P .RS 4 (Direct mode only\&.) Toggle navigation\-parameter display mode\&. Toggles between normal display and one that shows selected navigation parameters from MID 19, including the Static Navigation bit toggled by the \*(AqM\*(Aq command\&. .RE .PP To interpret what you see, you will need a copy of the SiRF Binary Protocol Reference Manual\&. .SS "u\-blox support" .PP Most information is raw from the GPS\&. Underlined fields are derived by translation from ECEF coordinates\&. 1PPS is the clock lag as usual\&. There are no per\-type special commands\&. .SH "BUGS AND LIMITATIONS" .PP The PPS Offset field will never be updated when running in client mode, even if you can see PPS events in the packet window\&. This limitation may be fixed in a future release\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgpsdctl\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsprof\fR(1), \fBgpsfake\fR(1), \fBgpsctl\fR(1), \fBgpscat\fR(1)\&. \fBgpspipe\fR(1)\&. .SH "AUTHOR" .PP Eric S\&. Raymond \&. gpsd-3.15/libQgpsmm.30000664000175000017500000000001712513100103012544 0ustar esresr.so libgpsmm.3 gpsd-3.15/gpsd.80000664000175000017500000007634212533043776011621 0ustar esresr'\" t .\" Title: gpsd .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 9 Aug 2004 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSD" "8" "9 Aug 2004" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpsd \- interface daemon for GPS receivers .SH "SYNOPSIS" .HP \w'\fBgpsd\fR\ 'u \fBgpsd\fR [\-F\ \fIcontrol\-socket\fR] [\-S\ \fIlistener\-port\fR] [\-b] [\-l] [\-G] [\-n] [\-N] [\-h] [\-P\ \fIpidfile\fR] [\-D\ \fIdebuglevel\fR] [\-V] [[\fIsource\-name\fR]...] .SH "QUICK START" .PP If you have a GPS attached on the lowest\-numbered USB port of a Linux system, and want to read reports from it on TCP/IP port 2947, it will normally suffice to do this: .sp .if n \{\ .RS 4 .\} .nf gpsd /dev/ttyUSB0 .fi .if n \{\ .RE .\} .PP For the lowest\-numbered serial port: .sp .if n \{\ .RS 4 .\} .nf gpsd /dev/ttyS0 .fi .if n \{\ .RE .\} .PP Change the device number as appropriate if you need to use a different port\&. Command\-line flags enable verbose logging, a control port, and other optional extras but should not be needed for basic operation; the one exception, on very badly designed hardware, might be \fB\-b\fR (which see)\&. .PP On Linux systems supporting udev, gpsd is normally started automatically when a USB plugin event fires (if it is not already running) and is handed the name of the newly active device\&. In that case no invocation is required at all\&. .PP For your initial tests set your GPS hardware to speak NMEA, as gpsd is guaranteed to be able to process that\&. If your GPS has a native or binary mode with better performance that gpsd knows how to speak, gpsd will autoconfigure that mode\&. .PP You can verify correct operation by first starting gpsd and then xgps, the X windows test client\&. .PP If you have problems, the GPSD project maintains a FAQ to assist troubleshooting\&. .SH "DESCRIPTION" .PP gpsd is a monitor daemon that collects information from GPSes, differential\-GPS radios, or AIS receivers attached to the host machine\&. Each GPS, DGPS radio, or AIS receiver is expected to be direct\-connected to the host via a USB or RS232C serial device\&. The serial device may be specified to gpsd at startup, or it may be set via a command shipped down a local control socket (e\&.g\&. by a USB hotplug script)\&. Given a GPS device by either means, gpsd discovers the correct port speed and protocol for it\&. .PP gpsd should be able to query any GPS that speaks either the standard textual NMEA 0183 protocol, or the (differing) extended NMEA dialects used by MKT\-3301, iTrax, Motorola OnCore, Sony CXD2951, and Ashtech/Thales devices\&. It can also interpret the binary protocols used by EverMore, Garmin, Navcom, Rockwell/Zodiac, SiRF, Trimble, and u\-blox ANTARIS devices\&. Under Linux it can read NMEA2000 packets through the kernel CAN socket\&. It can read heading and attitude information from the Oceanserver 5000 or TNT Revolution digital compasses\&. .PP The GPS reporting formats supported by your instance of gpsd may differ depending on how it was compiled; general\-purpose versions support many, but it can be built with protocol subsets down to a singleton for use in constrained environments\&. For a list of the GPS protocols supported by your instance, see the output of \fBgpsd \-l\fR .PP gpsd effectively hides the differences among the GPS types it supports\&. It also knows about and uses commands that tune these GPSes for lower latency\&. By using gpsd as an intermediary, applications avoid contention for serial devices\&. .PP gpsd can use differential\-GPS corrections from a DGPS radio or over the net, from a ground station running a DGPSIP server or a Ntrip broadcaster that reports RTCM\-104 data; this will shrink position errors by roughly a factor of four\&. When gpsd opens a serial device emitting RTCM\-104, it automatically recognizes this and uses the device as a correction source for all connected GPSes that accept RTCM corrections (this is dependent on the type of the GPS; not all GPSes have the firmware capability to accept RTCM correction packets)\&. See the section called \(lqACCURACY\(rq and the section called \(lqFILES\(rq for discussion\&. .PP Client applications will communicate with gpsd via a TCP/IP port, 2947 by default)\&. Both IPv4 and IPv6 connections are supported and a client may connect via either\&. .PP The program accepts the following options: .PP \-F .RS 4 Create a control socket for device addition and removal commands\&. You must specify a valid pathname on your local filesystem; this will be created as a Unix\-domain socket to which you can write commands that edit the daemon\*(Aqs internal device list\&. .RE .PP \-S .RS 4 Set TCP/IP port on which to listen for GPSD clients (default is 2947)\&. .RE .PP \-b .RS 4 Broken\-device\-safety mode, otherwise known as read\-only mode\&. A few bluetooth and USB receivers lock up or become totally inaccessible when probed or reconfigured; see the hardware compatibility list on the GPSD project website for details\&. This switch prevents gpsd from writing to a receiver\&. This means that gpsd cannot configure the receiver for optimal performance, but it also means that gpsd cannot break the receiver\&. A better solution would be for Bluetooth to not be so fragile\&. A platform independent method to identify serial\-over\-Bluetooth devices would also be nice\&. .RE .PP \-G .RS 4 This flag causes gpsd to listen on all addresses (INADDR_ANY) rather than just the loop back (INADDR_LOOPBACK) address\&. For the sake of privacy and security, TPV information is now private to the local machine until the user makes an effort to expose this to the world\&. .RE .PP \-l .RS 4 List all drivers compiled into this gpsd instance\&. The letters to the left of each driver name are the gpsd control commands supported by that driver\&. .RE .PP \-n .RS 4 Don\*(Aqt wait for a client to connect before polling whatever GPS is associated with it\&. Some RS232 GPSes wait in a standby mode (drawing less power) when the host machine is not asserting DTR, and some cellphone and handheld embedded GPSes have similar behaviors\&. Accordingly, waiting for a watch request to open the device may save battery power\&. (This capability is rare in consumer\-grade devices)\&. .RE .PP \-N .RS 4 Don\*(Aqt daemonize; run in foreground\&. This switch is mainly useful for debugging\&. .RE .PP \-h .RS 4 Display help message and terminate\&. .RE .PP \-P .RS 4 Specify the name and path to record the daemon\*(Aqs process ID\&. .RE .PP \-D .RS 4 Set debug level\&. At debug levels 2 and above, gpsd reports incoming sentence and actions to standard error if gpsd is in the foreground (\-N) or to syslog if in the background\&. .RE .PP \-V .RS 4 Dump version and exit\&. .RE .PP Arguments are interpreted as the names of data sources\&. Normally, a data source is the device pathname of a local device from which the daemon may expect GPS data\&. But there are three other special source types recognized, for a total of four: .PP Local serial or USB device .RS 4 A normal Unix device name of a serial or USB device to which a sensor is attached\&. Example: /dev/ttyUSB0\&. .RE .PP Local PPS device .RS 4 A normal Unix device name of a PPS device to which a PPS source is attached\&. The device name must start with "/dev/pps" and a local serial or USB GPS device must also be available\&. Example: /dev/pps0\&. .RE .PP TCP feed .RS 4 A URI with the prefix "tcp://", followed by a hostname, a colon, and a port number\&. The daemon will open a socket to the indicated address and port and read data packets from it, which will be interpreted as though they had been issued by a serial device\&. Example: tcp://data\&.aishub\&.net:4006\&. .RE .PP UDP feed .RS 4 A URI with the prefix "udp://", followed by a hostname, a colon, and a port number\&. The daemon will open a socket listening for UDP datagrams arriving on the indicated address and port, which will be interpreted as though they had been issued by a serial device\&. Example: udp://127\&.0\&.0\&.1:5000\&. .RE .PP Ntrip caster .RS 4 A URI with the prefix "ntrip://" followed by the name of an Ntrip caster (Ntrip is a protocol for broadcasting differential\-GPS fixes over the net)\&. For Ntrip services that require authentication, a prefix of the form "username:password@" can be added before the name of the Ntrip broadcaster\&. For Ntrip service, you must specify which stream to use; the stream is given in the form "/streamname"\&. An example DGPSIP URI could be "dgpsip://dgpsip\&.example\&.com" and a Ntrip URI could be "ntrip://foo:bar@ntrip\&.example\&.com:80/example\-stream"\&. Corrections from the caster will be send to each attached GPS with the capability to accept them\&. .RE .PP DGPSIP server .RS 4 A URI with the prefix "dgpsip://" followed by a hostname, a colon, and an optional colon\-separated port number (defaulting to 2101)\&. The daemon will handshake with the DGPSIP server and read RTCM2 correction data from it\&. Corrections from the server will be set to each attached GPS with the capability to accept them\&. Example: dgpsip://dgps\&.wsrcc\&.com:2101\&. .RE .PP Remote gpsd feed .RS 4 A URI with the prefix "gpsd://", followed by a hostname and optionally a colony and a port number (if the port is absent the default gpsd port will be used)\&. The daemon will open a socket to the indicated address and port and emulate a gpsd client, collecting JSON reports from the remote gpsd instance that will be passed to local clients\&. .RE .PP NMEA2000 CAN data .RS 4 A URI with the prefix "nmea2000://", followed by a CAN devicename\&. Only Linux socket CAN interfaces are supported\&. The interface must be configured to receive CAN messages before gpsd can be started\&. If there is more then one unit on the CAN bus that provides GPS data, gpsd chooses the unit from which a GPS message is first seen\&. Example: nmea2000://can0\&. .RE .PP (The "ais:://" source type supported in some older versions of the daemon has been retired in favor of the more general "tcp://"\&.) .PP 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 the daemon will have no devices on its search list until they are added by a control\-socket command (see the section called \(lqGPS DEVICE MANAGEMENT\(rq for details on this)\&. Daemon startup will abort with an error if neither any devices nor a control socket are specified\&. .PP When a device is activated (i\&.e\&. a client requests data from it), gpsd attempts to execute a hook from /etc/gpsd/device\-hook with first command line argument set to the pathname of the device and the second to \fBACTIVATE\fR\&. On deactivation it does the same passing \fBDEACTIVATE\fR for the second argument\&. .PP gpsd can export data to client applications in three ways: via a sockets interface, via a shared\-memory segment, and via D\-Bus\&. The next three major sections describe these interfaces\&. .SH "THE SOCKET INTERFACE" .PP Clients may communicate with the daemon via textual request and responses over a socket\&. It is a bad idea for applications to speak the protocol directly: rather, they should use the libgps client library and take appropriate care to conditionalize their code on the major and minor protocol version symbols\&. .PP The request\-response protocol for the socket interface is fully documented in \fBgpsd_json\fR(5)\&. .SH "SHARED-MEMORY AND DBUS INTERFACES" .PP gpsd has two other (read\-only) interfaces\&. .PP Whenever the daemon recognizes a packet from any attached device, it writes the accumulated state from that device to a shared memory segment\&. The C and C++ client libraries shipped with GPSD can read this segment\&. Client methods, and various restrictions associated with the read\-only nature of this interface, are documented at \fBlibgps\fR(3)\&. The shared\-memory interface is intended primarily for embedded deployments in which gpsd monitors a single device, and its principal advantage is that a daemon instance configured with shared memory but without the sockets interface loses a significant amount of runtime weight\&. .PP The daemon may be configured to emit a D\-Bus signal each time an attached device delivers a fix\&. The signal path is path /org/gpsd, the signal interface is "org\&.gpsd", and the signal name is "fix"\&. The signal payload layout is as follows: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&Satellite object .TS allbox tab(:); lB lB. T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ DBUS_TYPE_DOUBLE T}:T{ .PP Time (seconds since Unix epoch) T} T{ DBUS_TYPE_INT32 T}:T{ .PP mode T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Time uncertainty (seconds)\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Latitude in degrees\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Longitude in degrees\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Horizontal uncertainty in meters, 95% confidence\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Altitude in meters\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Altitude uncertainty in meters, 95% confidence\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Course in degrees from true north\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Course uncertainty in meters, 95% confidence\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Speed, meters per second\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Speed uncertainty in meters per second, 95% confidence\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Climb, meters per second\&. T} T{ DBUS_TYPE_DOUBLE T}:T{ .PP Climb uncertainty in meters per second, 95% confidence\&. T} T{ DBUS_TYPE_STRING T}:T{ .PP Device name T} .TE .sp 1 .SH "GPS DEVICE MANAGEMENT" .PP gpsd maintains an internal list of 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\*(Aqs 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\&. .PP 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\*(Aq device has been disconnected\&. .PP When gpsd is properly installed along with hotplug notifier scripts feeding it device\-add commands over the control socket, gpsd should require no configuration or user action to find devices\&. .PP Sending SIGHUP to a running gpsd forces it to close all GPSes and all client connections\&. It will then attempt to reconnect to any GPSes on its device list and resume listening for client connections\&. This may be useful if your GPS enters a wedged or confused state but can be soft\-reset by pulling down DTR\&. .PP When gpsd is called with no initial devices (thus, expecting devices to be passed to it by notifications to the control socket), and reaches a state where there are no devices connected and no subscribers \fIafter\fR after some devices have been seen, it shuts down gracefully\&. It is expected that future device hotplug events will reactivate it\&. .PP To point gpsd at a device that may be a GPS, write to the control socket a plus sign (\*(Aq+\*(Aq) followed by the device name followed by LF or CR\-LF\&. Thus, to point the daemon at /dev/foo\&. send "+/dev/foo\en"\&. To tell the daemon that a device has been disconnected and is no longer available, send a minus sign (\*(Aq\-\*(Aq) followed by the device name followed by LF or CR\-LF\&. Thus, to remove /dev/foo from the search list, send "\-/dev/foo\en"\&. .PP To send a control string to a specified device, write to the control socket a \*(Aq!\*(Aq, followed by the device name, followed by \*(Aq=\*(Aq, followed by the control string\&. .PP To send a binary control string to a specified device, write to the control socket a \*(Aq&\*(Aq, followed by the device name, followed by \*(Aq=\*(Aq, followed by the control string in paired hex digits\&. .PP Your client may await a response, which will be a line beginning with either "OK" or "ERROR"\&. An ERROR response 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 gpsd\*(Aqs device pool\&. An ERROR response to a ! command means the daemon did not recognize the devicename specified\&. .PP The control socket is intended for use by hotplug scripts and other device\-discovery services\&. This control channel is separate from the public gpsd service port, and only locally accessible, in order to prevent remote denial\-of\-service and spoofing attacks\&. .SH "ACCURACY" .PP The base User Estimated Range Error (UERE) of GPSes is 8 meters 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 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 (VDOP) dependent on satellite geometry, and VDOP is typically larger than HDOP\&. Users should \fInot\fR rely on GPS altitude for life\-critical tasks such as landing an airplane\&. .PP These errors are intrinsic to the design and physics of the GPS system\&. gpsd does its internal computations at sufficient accuracy that it will add no measurable position error of its own\&. .PP DGPS correction will reduce UERE by a factor of 4, provided you are within about 100mi (160km) of a DGPS ground station from which you are receiving corrections\&. .PP On a 4800bps connection, the time latency of fixes provided by gpsd will be one second or less 95% of the time\&. Most of this lag is due to the fact that GPSes normally emit fixes once per second, thus expected latency is 0\&.5sec\&. On the personal\-computer hardware available in 2005 and later, computation lag induced by gpsd will be negligible, on the order of a millisecond\&. Nevertheless, latency can introduce significant errors for vehicles in motion; at 50km/h (31mi/h) of speed over ground, 1 second of lag corresponds to 13\&.8 meters change in position between updates\&. .PP The time reporting of the GPS system itself has an intrinsic accuracy limit of 14 nanoseconds, but this can only be approximated by specialized receivers using that send the high\-accuracy PPS (Pulse\-Per\-Second) over RS232 to cue a clock crystal\&. Most GPS receivers only report time to a precision of 0\&.01s or 0\&.001s, and with no accuracy guarantees below 1sec\&. .PP If your GPS uses a SiRF chipset at firmware level 231, reported UTC time may be off by the difference between whatever default leap\-second offset has been compiled in and whatever leap\-second correction is currently applicable, from startup until complete subframe information is received\&. Firmware levels 232 and up don\*(Aqt have this problem\&. You may run gpsd at debug level 4 to see the chipset type and firmware revision level\&. .PP There are exactly two circumstances under which gpsd relies on the host\-system clock: .PP In the GPS broadcast signal, GPS time is represented using a week number that rolls over after 2^10 or 2^13 weeks (about 19\&.6 years, or 157 years), depending on the spacecraft\&. Receivers are required to disambiguate this to the correct date, but may have difficulty due to not knowing time to within half this interval, or may have bugs\&. Users have reported incorrect dates which appear to be due to this issue\&. gpsd uses the startup time of the daemon detect and compensate for rollovers while it is running, but otherwise reports the date as it is reported by the receiver without attempting to correct it\&. .PP If you are using an NMEA\-only GPS (that is, not using SiRF or Garmin or Zodiac binary mode), gpsd relies on the system clock to tell it the current century\&. If the system clock returns an invalid value near zero, and the GPS does not emit GPZDA at the start of its update cycle (which most consumer\-grade NMEA GPSes do not) then the century part of the dates gpsd delivers may be wrong\&. Additionally, near the century turnover, a range of dates as wide in seconds as the accuracy of your system clock may be referred to the wrong century\&. .SH "USE WITH NTP" .PP gpsd can provide reference clock information to ntpd, to keep the system clock synchronized to the time provided by the GPS receiver\&. .PP On Linux, gpsd includes support for interpreting the PPS pulses emitted at the start of every clock second on the carrier\-detect lines of some serial GPSes; this pulse can be used to update NTP at much higher accuracy than message time provides\&. You can determine whether your GPS emits this pulse by running at \-D 5 and watching for carrier\-detect state change messages in the logfile\&. In addition, if your kernel provides the RFC 2783 kernel PPS API then gpsd will use that for extra accuracy\&. .PP Detailed instructions for using GPSD to set up a high\-quality time service can be found among the documentation on the GPSD website\&. .SH "USE WITH D-BUS" .PP On operating systems that support D\-BUS, gpsd can be built to broadcast GPS fixes to D\-BUS\-aware applications\&. As D\-BUS is still at a pre\-1\&.0 stage, we will not attempt to document this interface here\&. Read the gpsd source code to learn more\&. .SH "SECURITY AND PERMISSIONS ISSUES" .PP gpsd, if given the \-G flag, will listen for connections from any reachable host, and then disclose the current position\&. Before using the \-G flag, consider whether you consider your computer\*(Aqs location to be sensitive data to be kept private or something that you wish to publish\&. .PP gpsd must start up as root in order to open the NTPD shared\-memory segment, open its logfile, and create its local control socket\&. Before doing any processing of GPS data, it tries to drop root privileges by setting its UID to "nobody" (or another configured userid) and its group ID to the group of the initial GPS passed on the command line \(em or, if that device doesn\*(Aqt exist, to the group of /dev/ttyS0\&. .PP Privilege\-dropping is a hedge against the possibility that carefully crafted data, either presented from a client socket or from a subverted serial device posing as a GPS, could be used to induce misbehavior in the internals of gpsd\&. It ensures that any such compromises cannot be used for privilege elevation to root\&. .PP The assumption behind gpsd\*(Aqs particular behavior is that all the tty devices to which a GPS might be connected are owned by the same non\-root group and allow group read/write, though the group may vary because of distribution\-specific or local administrative practice\&. If this assumption is false, gpsd may not be able to open GPS devices in order to read them (such failures will be logged)\&. .PP In order to fend off inadvertent denial\-of\-service attacks by port scanners (not to mention deliberate ones), gpsd will time out inactive client connections\&. Before the client has issued a command that requests a channel assignment, a short timeout (60 seconds) applies\&. There is no timeout for clients in watcher or raw modes; rather, gpsd drops these clients if they fail to read data long enough for the outbound socket write buffer to fill\&. Clients with an assigned device in polling mode are subject to a longer timeout (15 minutes)\&. .SH "LIMITATIONS" .PP 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), a \*(AqTPV\*(Aq response may mix an altitude from one device\*(Aqs GGA with latitude/longitude from another\*(Aqs RMC/GLL after the second sentence has arrived\&. .PP gpsd may change control settings on your GPS (such as the emission frequency of various sentences or packets) and not restore the original settings on exit\&. This is a result of inadequacies in NMEA and the vendor binary GPS protocols, which often do not give clients any way to query the values of control settings in order to be able to restore them later\&. .PP When using SiRF chips, the VDOP/TDOP/GDOP figures and associated error estimates are computed by gpsd rather than reported by the chip\&. The computation does not exactly match what SiRF chips do internally, which includes some satellite weighting using parameters gpsd cannot see\&. .PP Autobauding on the Trimble GPSes can take as long as 5 seconds if the device speed is not matched to the GPS speed\&. .PP Generation of position error estimates (eph, epv, epd, eps, epc) from the incomplete data handed back by GPS reporting protocols involves both a lot of mathematical black art and fragile device\-dependent assumptions\&. This code has been bug\-prone in tbe past and problems may still lurk there\&. .PP AIDVM decoding of types 16\-17, 22\-23, and 25\-26 is unverified\&. .PP GPSD presently fully recognizes only the 2\&.1 level of RTCM2 (message types 1, 3, 4, 5, 6, 7, 9, 16)\&. The 2\&.3 message types 13, 14, and 31 are recognized and reported\&. Message types 8, 10\-12, 15\-27, 28\-30 (undefined), 31\-37, 38\-58 (undefined), and 60\-63 are not yet supported\&. .PP The ISGPS used for RTCM2 and subframes decoder logic is sufficiently convoluted to confuse some compiler optimizers, notably in GCC 3\&.x at \-O2, into generating bad code\&. .PP Devices meant to use PPS for high\-precision timekeeping may fail if they are specified after startup by a control\-socket command, as opposed to on the daemon\*(Aqs original command line\&. Root privileges are dropped early, and some Unix variants require them in order to set the PPS line discipline\&. Under Linux the POSIX capability to set the line discipline is retained, but other platforms cannot use this code\&. .PP USB GPS devices often do not identify themselves through the USB subsystem; they typically present as the class 00h (undefined) or class FFh (vendor\-specific) of USB\-to\-serial adapters\&. Because of this, the Linux hotplug scripts must tell gpsd to sniff data from every USB\-to\-serial adapter that goes active and is known to be of a type used in GPSes\&. No such device is sent configuration strings until after it has been identified as a GPS, and gpsd never opens a device that is opened by another process\&. But there is a tiny window for non\-GPS devices not opened; if the application that wants them loses a race with GPSD its device open will fail and have to be retried after GPSD sniffs the device (normally less than a second later)\&. .SH "FILES" .PP /dev/ttyS0 .RS 4 Prototype TTY device\&. After startup, gpsd sets its group ID to the owning group of this device if no GPS device was specified on the command line does not exist\&. .RE .PP /etc/gpsd/device\-hook .RS 4 Optional file containing the device activation/deactivation script\&. Note that while /etc/gpsd is the default system configuration directory, it is possible to build the GPSD source code with different assumptions\&. .RE .SH "ENVIRONMENT VARIABLES" .PP By setting the environment variable \fBGPSD_SHM_KEY\fR, you can control the key value used to create the shared\-memory segment used for communication with the client library\&. This will be useful mainly when isolating test instances of gpsd from production ones\&. .SH "APPLICABLE STANDARDS" .PP The official NMEA protocol standards for NMEA0183 and NMEA2000 are available from the National Marine Electronics Association, but are proprietary and expensive; the maintainers of gpsd have made a point of not looking at them\&. The GPSD project website links to several documents that collect publicly disclosed information about the protocol\&. .PP gpsd parses the following NMEA sentences: RMC, GGA, GLL, GSA, GSV, VTG, ZDA, GBS, HDT, DBT, GST\&. It recognizes these with either the normal GP talker\-ID prefix, or with the GN prefix used by GLONASS, or with the II prefix emitted by Seahawk Autohelm marine navigation systems, or with the IN prefix emitted by some Garmin units, or with the EC prefix emitted by ECDIS units, or with the SD prefix emitted by depth sounders, or with the HC and TI prefix emitted by some Airmar equipment\&. It recognizes some vendor extensions: the PGRME emitted by some Garmin GPS models, the OHPR emitted by Oceanserver digital compasses, the PTNTHTM emitted by True North digital compasses, the PMTK omitted by some San Jose Navigation GPSes, and the PASHR sentences emitted by some Ashtech GPSes\&. .PP Note that gpsd JSON returns pure decimal degrees, not the hybrid degree/minute format described in the NMEA standard\&. .PP Differential\-GPS corrections are conveyed by the RTCM protocols\&. The applicable standard for RTCM\-104 V2 is RTCM Recommended Standards for Differential GNSS (Global Navigation Satellite) Service RTCM Paper 136\-2001/SC 104\-STD\&. The applicable standard for RTCM\-104 V3 is RTCM Standard 10403\&.1 for Differential GNSS Services \- Version 3 RTCM Paper 177\-2006\-SC104\-STD\&. Ordering instructions for the RTCM standards are accessible from the website of the Radio Technical Commission for Maritime Services under "Publications"\&. .PP AIS is defined by ITU Recommendation M\&.1371, Technical Characteristics for a Universal Shipborne Automatic Identification System Using Time Division Multiple Access\&. The AIVDM/AIVDO format understood by this program is defined by IEC\-PAS 61162\-100, Maritime navigation and radiocommunication equipment and systems\&. A more accessible description of both can be found at AIVDM/AIVDO Protocol Decoding, on the references page of the GPSD project website\&. .PP Subframe data is defined by IS\-GPS\-200E, GLOBAL POSITIONING SYSTEM WING (GPSW) SYSTEMS ENGINEERING & INTEGRATION, INTERFACE SPECIFICATION IS\-GPS\-200 Revision E\&. The format understood by this program is defined in Section 20 (Appendix II) of the IS\-GPS\-200E, GPS NAVIGATION DATA STRUCTURE FOR DATA, D(t) .PP JSON is specified by RFC 7159, The JavaScript Object Notation (JSON) Data Interchange Format\&. .PP The API for PPS time service is specified by RFC 2783, Pulse\-Per\-Second API for UNIX\-like Operating Systems, Version 1\&.0 .SH "SEE ALSO" .PP \fBgpsdctl\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBgpsd_json\fR(5), \fBlibgpsd\fR(3), \fBgpsprof\fR(1), \fBgpsfake\fR(1), \fBgpsctl\fR(1), \fBgpscat\fR(1), .SH "AUTHORS" .PP Authors: Eric S\&. Raymond, Chris Kuethe, Gary Miller\&. Former authors whose bits have been plowed under by code turnover: Remco Treffcorn, Derrick Brashear, Russ Nelson\&. This manual page by Eric S\&. Raymond \&. gpsd-3.15/libgpsmm.30000664000175000017500000000535712513100103012437 0ustar esresr'\" t .\" Title: libgpsmm .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 13 May 2005 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "LIBGPSMM" "3" "13 May 2005" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" libgpsmm, libQgpsmm \- C++ and QT class wrapper for the GPS daemon .SH "SYNOPSIS" .sp .ft B .nf C++: #include .fi .ft .HP \w'struct\ gps_data_t\ *open('u .BI "struct gps_data_t *open(char\ *" "host" ", char\ *" "port" ");" .HP \w'struct\ gps_data_t\ *open('u .BI "struct gps_data_t *open(void);" .HP \w'struct\ gps_data_t\ *send('u .BI "struct gps_data_t *send(char\ *" "request" ");" .HP \w'struct\ gps_data_t\ *read('u .BI "struct gps_data_t *read(void);" .HP \w'struct\ gps_data_t\ *waiting('u .BI "struct gps_data_t *waiting(int);" .HP \w'struct\ gps_data_t\ *stream('u .BI "struct gps_data_t *stream(unsigned\ int" "flags" ");" .SH "DESCRIPTION" .PP \fBlibgpsmm and libQgpsmm\fR are mere wrappers over \fBlibgps\fR\&. The important difference between the libraries is that libgpsmm is targeted at C++ applications and contained in \fBlibgps\fR, while libQgpsmm is platform independent by using QTcpSocket to connect to \fBgpsd\fR and shipped as an additional library due to the necessary linking to QT\&. Method names are the same as the analogue C functions\&. For a detailed description of the functions please read \fBlibgps\fR(3)\&. \fBopen()\fR must be called after class constructor and before any other method (\fBopen()\fR is not inside the constructor since it may fail, however constructors have no return value)\&. The analogue of the C function \fBgps_close()\fR is in the destructor\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgps\fR(1), \fBlibgps\fR(3)\&. .SH "AUTHOR" .PP Alfredo Pironti \&. gpsd-3.15/gpsdctl.80000664000175000017500000000507612533043776012320 0ustar esresr'\" t .\" Title: gpsdctl .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 25 Jun 2011 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSDCTL" "8" "25 Jun 2011" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpsdctl \- tool for sending commands to gpsd over its control socket .SH "SYNOPSIS" .HP \w'\fBgpdsctl\fR\ 'u \fBgpdsctl\fR \fIaction\fR \fIdevice\fR .SH "DESCRIPTION" .PP This is a tool for sending an instance of gpsd commands over its control socket to add or remove devices from the daemon\*(Aqs device list\&. It is not intended to be called by users, but rather by the Linux hotplug system and similar facilities\&. .PP The action argument may be "add" or "remove"\&. If no daemon instance is running when an add is requested, this program will launch one\&. .PP The "device" argument should be the pathname of a device\&. A device on the list will be opened to read sensor data whenever a client requests a watch\&. .PP Two environment variables are interpreted\&. \fBGPSD_SOCKET\fR sets the location of the control socket\&. It defaults to /var/run/gpsd\&.sock if the effective user ID of this program is root, /tmp/gpsd\&.sock otherwise\&. .PP \fBGPSD_OPTIONS\fR may be a list of options to be passed to gpsd when this tool launches it\&. It defaults to an empty string\&. .SH "RETURN VALUES" .PP 1 if the action was unknown or the write to the control socket failed, 0 otherwise .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgpsctl\fR(1), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsprof\fR(1), \fBgpsfake\fR(1)\&. .SH "AUTHOR" .PP Eric S\&. Raymond \&. gpsd-3.15/gpspipe.10000664000175000017500000001124112533043776012307 0ustar esresr'\" t .\" Title: gpspipe .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 03 Aug 2005 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSPIPE" "1" "03 Aug 2005" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpspipe \- tool to connect to gpsd and retrieve sentences .SH "SYNOPSIS" .HP \w'\fBgpspipe\fR\ 'u \fBgpspipe\fR [\-h] [\-d] [\-l] [\-o\ \fIfilename\fR] [\-n\ \fIcount\fR] [\-r] [\-R] [\-s\ \fIserial\-device\fR] [\-t] [\-T\ \fItimestamp\-format\fR] [\-u] [\-p] [\-w] [\-S] [\-2] [\-v] [\-D\ \fIdebug\-level\fR] [\fIserver\fR [\fI:port\fR [\fI:device\fR]]] .SH "DESCRIPTION" .PP gpspipe is a tool to connect to gpsd and output the received sentences to stdout\&. This makes the program useful as a pipe from gpsd to another program or file\&. .PP gpspipe does not require root privileges, and can be run concurrently with other tools connecting to the local gpsd without causing problems\&. .PP The output will consist of one or both of the raw NMEA or native gpsd sentences\&. Each line can be optionally time stamped\&. There is also an option to exit gracefully after a given count of packets\&. .PP Optionally a server, TCP/IP port number and remote device can be given\&. If omitted, gpspipe connects to localhost on the default port (2947) and watches all devices opened by gpsd\&. .PP gpspipe may be run as a daemon, but requires the \-o flag for writing the output to a file\&. .SH "OPTIONS" .PP \-h makes gpspipe print a usage message and exit\&. .PP \-d causes gpspipe to run as a daemon\&. .PP \-l causes gpspipe to sleep for ten seconds before attempting to connect to gpsd\&. This is very useful when running as a daemon, giving gpsd time to start before attempting a connection\&. .PP \-r causes raw NMEA sentences to be output\&. .PP \-R causes super\-raw (gps binary) data to be output\&. This overrides NMEA and gpsd output modes\&. .PP \-s option causes the collected data to be written to the specified serial device with settings 4800 8N1\&. Thus gpspipe can be used with \-s and \-r options to emulate a serial port hardwired to a GPS that gpsd is managing\&. .PP \-o option causes the collected data to be written to the specified file\&. Use of this option is mandatory if gpspipe is run as a daemon\&. .PP \-w causes native gpsdsentences to be output\&. .PP \-S sets the scaled flag\&. .PP \-2 sets the split24 flag on AIS reports\&. Note: this option is experimental and may be changed or removed in a future release\&. .PP \-t adds a timestamp to each sentence output\&. .PP \-T sets the format of the timestamp\&. See \fBstrftime\fR(3) for the available placeholders\&. Setting this option implies \-t\&. Default setting is "%F %T" .PP \-u usec resolution time stamp, implies \-t\&. Use \-uu to output sec\&.usec\&. .PP \-p enables dumping of profiling information in JSON\&. .PP \-P enables dumping of PPS drift JSON in NMEA and raw modes\&. .PP \-n [count] causes [count] sentences to be output\&. gpspipe will then exit gracefully\&. .PP \-v causes gpspipe to show a spinning activity indicator on stderr\&. This is useful if stdout is redirected into a file or a pipe\&. By default the spinner is advanced with every messages written; specifying \-v more than once will double the number of messages required to rotate the spinner\&. .PP \-V prints the version, then exits\&. .PP At least one of \-R, \-r or \-w must be specified\&. .SH "EXAMPLE" .PP When gpsd is running\fBgpspipe \-r \-n 100\fR will send one hundred raw NMEA sentences to standard output, then exit\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsprof\fR(1), \fBgpsfake\fR(1), \fBgpsctl\fR(1), \fBgpscat\fR(1)\&. \fBgpsmon\fR(1)\&. .SH "AUTHOR" .PP Gary E\&. Miller \&. gpsd-3.15/gps2udp.10000664000175000017500000000747212513100105012211 0ustar esresr'\" t .\" Title: gps2udp .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 01 Marc 2013 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPS2UDP" "1" "01 Marc 2013" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gps2udp \- feed the take from gpsd to one or more aggregation sites .SH "SYNOPSIS" .HP \w'\fBgps2udp\fR\ 'u \fBgps2udp\fR [\-h] [\-n] [\-j] [\-a] [\-u\ \fIhostname:udpport\fR] [\-c\ \fIcount\fR] [\-d\ \fI1|2\fR] [\-v] [\fIserver\fR [\fI:port\fR [\fI:device\fR]]] .SH "DESCRIPTION" .PP gps2udp is a tool to connect to gpsd and output the received sentences to one or many UDP host:port destinations\&. This makes the program useful for feeding AIS information from gpsd to aishub, marinetraffic, shipfinder,\&.\&.\&. .PP gps2udp does not require root privileges, and can be run concurrently with other tools connecting to the local gpsd without causing problems\&. .PP The output will consist of one or both of NMEA (\-n option) or JSON (\-j option) gpsd sentences\&. The output is sent to one or many destinations host through a UDP network socket (\-u host:port options) \&. .PP Optionally a server, TCP/IP port number and remote device can be given\&. If omitted, gps2udp connects to localhost on the default port (2947) and watches all devices opened by gpsd\&. .PP gps2udp may be run as a daemon (\-b option)\&. .PP gps2udp is designed to run smoothly in background; it reconnects automatically to gpsd whenever it is restarted\&. For debugging purporses, there is an option to exit gracefully after a given count of packets (\-c option)\&. .SH "OPTIONS" .PP \-h makes gps2udp print a usage message and exit\&. .PP \-n causes NMEA sentences to be output\&. .PP \-j causes JSON sentences to be output\&. .PP \-u host:port UDP destination for output sentenses (up to five destinations)\&. .PP \-a output only AIS messages\&. .PP \-b causes gps2udp to run as a daemon\&. .PP \-c [count] causes [count] sentences to be output\&. gps2udp will then exit gracefully\&. .PP \-d 1 prints sent packet on stdout\&. .PP \-v prints the version, then exits\&. .SH "EXAMPLE" .PP With a running gpsd accessible on the network .PP \fBgps2udp \-d 1 \-n \-u data\&.aishub\&.net:2222 \fR will collect data from localhost:gpsd display them on stdout and send a copy to test aishub in NMEA format\&. .PP \fBgps2udp \-a \-n \-b \-u data\&.aishub\&.net:2222 \-u 5\&.9\&.207\&.224:5321 \-u 109\&.200\&.19\&.151:4001 fridu\&.net:2947\fR will collect data from a remote gpsd located on fridu\&.net host, will filter AIS messages and send them to 3 destination (aishub, marinetraffic, shipfinder) in NMEA format, command is running in background mode .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsprof\fR(1), \fBgpsfake\fR(1), \fBgpsctl\fR(1), \fBgpscat\fR(1)\&. \fBgpsmon\fR(1)\&. .SH "AUTHOR" .PP Fulup Ar Foll \&. gpsd-3.15/gpsd_json.50000664000175000017500000016176512513100105012625 0ustar esresr'\" t .\" Title: gpsd_json .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 28 Aug 2011 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSD_JSON" "5" "28 Aug 2011" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpsd_json \- gpsd request/response protocol .SH "OVERVIEW" .PP gpsd is a service daemon that can be used to monitor GPSes, DGPS receivers, Marine AIS broadcasts, and various other location\-related and kinematic sensors\&. .PP Clients may communicate with gpsd via textual requests and responses over a socket\&. It is a bad idea for applications to speak the protocol directly: rather, they should use the libgps client library (for C; bindings also exist for other languages) and take appropriate care to conditionalize their code on the major and minor protocol version symbols\&. .PP The GPSD protocol is built on top of JSON, JavaScript Object Notation, as specified in RFC 7159: The JavaScript Object Notation (JSON) Data Interchange Format\&. GPSD\*(Aqs use of JSON is restricted in some ways that make parsing it in fixed\-extent languages (such as C) easier\&. .PP A request line is introduced by "?" and may include multiple commands\&. Commands begin with a command identifier, followed either by a terminating \*(Aq;\*(Aq or by an equal sign "=" and a JSON object treated as an argument\&. Any \*(Aq;\*(Aq or newline indication (either LF or CR\-LF) after the end of a command is ignored\&. All request lines must be composed of US\-ASCII characters and may be no more than 80 characters in length, exclusive of the trailing newline\&. .PP Responses are JSON objects all of which have a "class" attribute the value of which is either the name of the invoking command\&. There are reports (including but not limited to as "TPV", "SKY", "DEVICE", and "ERROR") which are not direct responses to commands\&. .PP The order of JSON attributes within a response object is never significant, and you may specify attributes in commands in any order\&. Responses never contain the special JSON value null; instead, attributes with empty or undefined values are omitted\&. The length limit for responses and reports is 1536 characters, including trailing newline; longer responses will be truncated, so client code must be prepared for the possibility of invalid JSON fragments\&. .PP In JSON reports, if an attribute is present only if the parent attribute is present or has a particular range, then the parent attribute is emitted first\&. .PP There is one constraint on the order in which attributes will be omitted\&. If an optional attribute is present only when a parent attribute has a specified value or range of values, the parent attribute will be emitted first to make parsing easier\&. .PP The next subsection section documents the core GPSD protocol\&. Extensions are documented in the following subsections\&. The extensions may not be supported in your gpsd instance if it has been compiled with a restricted feature set\&. .SH "CORE SOCKET PROTOCOL" .PP Here are the core\-protocol responses: .PP TPV .RS 4 A TPV object is a time\-position\-velocity report\&. The "class" and "mode" fields will reliably be present\&. The "mode" field will be emitted before optional fields that may be absent when there is no fix\&. Error estimates will be emitted after the fix components they\*(Aqre associated with\&. Others may be reported or not depending on the fix quality\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&TPV object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "TPV" T} T{ device T}:T{ No T}:T{ string T}:T{ Name of originating device\&. T} T{ mode T}:T{ Yes T}:T{ numeric T}:T{ NMEA mode: %d, 0=no mode value yet seen, 1=no fix, 2=2D, 3=3D\&. T} T{ time T}:T{ No T}:T{ string T}:T{ Time/date stamp in ISO8601 format, UTC\&. May have a fractional part of up to \&.001sec precision\&. May be absent if mode is not 2 or 3\&. T} T{ ept T}:T{ No T}:T{ numeric T}:T{ Estimated timestamp error (%f, seconds, 95% confidence)\&. Present if time is present\&. T} T{ lat T}:T{ No T}:T{ numeric T}:T{ Latitude in degrees: +/\- signifies North/South\&. Present when mode is 2 or 3\&. T} T{ lon T}:T{ No T}:T{ numeric T}:T{ Longitude in degrees: +/\- signifies East/West\&. Present when mode is 2 or 3\&. T} T{ alt T}:T{ No T}:T{ numeric T}:T{ Altitude in meters\&. Present if mode is 3\&. T} T{ epx T}:T{ No T}:T{ numeric T}:T{ Longitude error estimate in meters, 95% confidence\&. Present if mode is 2 or 3 and DOPs can be calculated from the satellite view\&. T} T{ epy T}:T{ No T}:T{ numeric T}:T{ Latitude error estimate in meters, 95% confidence\&. Present if mode is 2 or 3 and DOPs can be calculated from the satellite view\&. T} T{ epv T}:T{ No T}:T{ numeric T}:T{ Estimated vertical error in meters, 95% confidence\&. Present if mode is 3 and DOPs can be calculated from the satellite view\&. T} T{ track T}:T{ No T}:T{ numeric T}:T{ Course over ground, degrees from true north\&. T} T{ speed T}:T{ No T}:T{ numeric T}:T{ Speed over ground, meters per second\&. T} T{ climb T}:T{ No T}:T{ numeric T}:T{ Climb (positive) or sink (negative) rate, meters per second\&. T} T{ epd T}:T{ No T}:T{ numeric T}:T{ Direction error estimate in degrees, 95% confidence\&. T} T{ eps T}:T{ No T}:T{ numeric T}:T{ Speed error estinmate in meters/sec, 95% confidence\&. T} T{ epc T}:T{ No T}:T{ numeric T}:T{ Climb/sink error estimate in meters/sec, 95% confidence\&. T} .TE .sp 1 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 actually received; see gps\&.h for bitmask names and values\&. .sp Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"TPV","device":"/dev/pts/1", "time":"2005\-06\-08T10:34:48\&.283Z","ept":0\&.005, "lat":46\&.498293369,"lon":7\&.567411672,"alt":1343\&.127, "eph":36\&.000,"epv":32\&.321, "track":10\&.3788,"speed":0\&.091,"climb":\-0\&.085,"mode":3} .fi .if n \{\ .RE .\} .RE .PP SKY .RS 4 A SKY object reports a sky view of the GPS satellite positions\&. If there is no GPS device available, or no skyview has been reported yet, only the "class" field will reliably be present\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&2.\ \&SKY object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "SKY" T} T{ device T}:T{ No T}:T{ string T}:T{ Name of originating device T} T{ time T}:T{ No T}:T{ numeric T}:T{ Time/date stamp in ISO8601 format, UTC\&. May have a fractional part of up to \&.001sec precision\&. T} T{ xdop T}:T{ No T}:T{ numeric T}:T{ Longitudinal dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate\&. T} T{ ydop T}:T{ No T}:T{ numeric T}:T{ Latitudinal dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate\&. T} T{ vdop T}:T{ No T}:T{ numeric T}:T{ Altitude dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate\&. T} T{ tdop T}:T{ No T}:T{ numeric T}:T{ Time dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate\&. T} T{ hdop T}:T{ No T}:T{ numeric T}:T{ Horizontal dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get a circular error estimate\&. T} T{ pdop T}:T{ No T}:T{ numeric T}:T{ Spherical dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate\&. T} T{ gdop T}:T{ No T}:T{ numeric T}:T{ Hyperspherical dilution of precision, a dimensionless factor which should be multiplied by a base UERE to get an error estimate\&. T} T{ satellites T}:T{ Yes T}:T{ list T}:T{ List of satellite objects in skyview T} .TE .sp 1 Many devices compute dilution of precision factors but do not include them in their reports\&. Many that do report DOPs report only HDOP, two\-dimensional circular error\&. gpsd always passes through whatever the device actually reports, then attempts to fill in other DOPs by calculating the appropriate determinants in a covariance matrix based on the satellite view\&. DOPs may be missing if some of these determinants are singular\&. It can even happen that the device reports an error estimate in meters when the corresponding DOP is unavailable; some devices use more sophisticated error modeling than the covariance calculation\&. .sp The satellite list objects have the following elements: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&3.\ \&Satellite object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l. T{ PRN T}:T{ Yes T}:T{ numeric T}:T{ PRN ID of the satellite\&. 1\-63 are GNSS satellites, 64\-96 are GLONASS satellites, 100\-164 are SBAS satellites T} T{ az T}:T{ Yes T}:T{ numeric T}:T{ Azimuth, degrees from true north\&. T} T{ el T}:T{ Yes T}:T{ numeric T}:T{ Elevation in degrees\&. T} T{ ss T}:T{ Yes T}:T{ numeric T}:T{ Signal strength in dB\&. T} T{ used T}:T{ Yes T}:T{ boolean T}:T{ Used in current solution? (SBAS/WAAS/EGNOS satellites may be flagged used if the solution has corrections from them, but not all drivers make this information available\&.) T} .TE .sp 1 Note that satellite objects do not have a "class" field, as they are never shipped outside of a SKY object\&. .sp When the C client library parses a SKY response, it will assert the SATELLITE_SET bit in the top\-level set member\&. .sp Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"SKY","device":"/dev/pts/1", "time":"2005\-07\-08T11:28:07\&.114Z", "xdop":1\&.55,"hdop":1\&.24,"pdop":1\&.99, "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}]} .fi .if n \{\ .RE .\} .RE .PP GST .RS 4 A GST object is a pseudorange noise report\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&4.\ \&GST object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "GST" T} T{ device T}:T{ No T}:T{ string T}:T{ Name of originating device T} T{ time T}:T{ No T}:T{ numeric T}:T{ Seconds since the Unix epoch, UTC\&. May have a fractional part of up to \&.001sec precision\&. T} T{ rms T}:T{ No T}:T{ numeric T}:T{ Value of the standard deviation of the range inputs to the navigation process (range inputs include pseudoranges and DGPS corrections)\&. T} T{ major T}:T{ No T}:T{ numeric T}:T{ Standard deviation of semi\-major axis of error ellipse, in meters\&. T} T{ minor T}:T{ No T}:T{ numeric T}:T{ Standard deviation of semi\-minor axis of error ellipse, in meters\&. T} T{ orient T}:T{ No T}:T{ numeric T}:T{ Orientation of semi\-major axis of error ellipse, in degrees from true north\&. T} T{ lat T}:T{ No T}:T{ numeric T}:T{ Standard deviation of latitude error, in meters\&. T} T{ lon T}:T{ No T}:T{ numeric T}:T{ Standard deviation of longitude error, in meters\&. T} T{ alt T}:T{ No T}:T{ numeric T}:T{ Standard deviation of altitude error, in meters\&. T} .TE .sp 1 Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"GST","device":"/dev/ttyUSB0", "time":"2010\-12\-07T10:23:07\&.096Z","rms":2\&.440, "major":1\&.660,"minor":1\&.120,"orient":68\&.989, "lat":1\&.600,"lon":1\&.200,"alt":2\&.520} .fi .if n \{\ .RE .\} .RE .PP ATT .RS 4 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\&. .sp The "class" and "mode" fields will reliably be present\&. Others may be reported or not depending on the specific device type\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&5.\ \&ATT object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "ATT" T} T{ device T}:T{ Yes T}:T{ string T}:T{ Name of originating device T} T{ time T}:T{ Yes T}:T{ numeric T}:T{ Seconds since the Unix epoch, UTC\&. May have a fractional part of up to \&.001sec precision\&. T} T{ heading T}:T{ No T}:T{ numeric T}:T{ Heading, degrees from true north\&. T} T{ mag_st T}:T{ No T}:T{ string T}:T{ Magnetometer status\&. T} T{ pitch T}:T{ No T}:T{ numeric T}:T{ Pitch in degrees\&. T} T{ pitch_st T}:T{ No T}:T{ string T}:T{ Pitch sensor status\&. T} T{ yaw T}:T{ No T}:T{ numeric T}:T{ Yaw in degrees T} T{ yaw_st T}:T{ No T}:T{ string T}:T{ Yaw sensor status\&. T} T{ roll T}:T{ No T}:T{ numeric T}:T{ Roll in degrees\&. T} T{ roll_st T}:T{ No T}:T{ string T}:T{ Roll sensor status\&. T} T{ dip T}:T{ No T}:T{ numeric T}:T{ Local magnetic inclination, degrees, positive when the magnetic field points downward (into the Earth)\&. T} T{ mag_len T}:T{ No T}:T{ numeric T}:T{ Scalar magnetic field strength\&. T} T{ mag_x T}:T{ No T}:T{ numeric T}:T{ X component of magnetic field strength\&. T} T{ mag_y T}:T{ No T}:T{ numeric T}:T{ Y component of magnetic field strength\&. T} T{ mag_z T}:T{ No T}:T{ numeric T}:T{ Z component of magnetic field strength\&. T} T{ acc_len T}:T{ No T}:T{ numeric T}:T{ Scalar acceleration\&. T} T{ acc_x T}:T{ No T}:T{ numeric T}:T{ X component of acceleration\&. T} T{ acc_y T}:T{ No T}:T{ numeric T}:T{ Y component of acceleration\&. T} T{ acc_z T}:T{ No T}:T{ numeric T}:T{ Z component of acceleration\&. T} T{ gyro_x T}:T{ No T}:T{ numeric T}:T{ X component of acceleration\&. T} T{ gyro_y T}:T{ No T}:T{ numeric T}:T{ Y component of acceleration\&. T} T{ depth T}:T{ No T}:T{ numeric T}:T{ Water depth in meters\&. T} T{ temperature T}:T{ No T}:T{ numeric T}:T{ Temperature at sensor, degrees centigrade\&. T} .TE .sp 1 The heading, pitch, and roll status codes (if present) vary by device\&. For the TNT Revolution digital compasses, they are coded as follows: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&6.\ \&Device flags .TS allbox tab(:); lB lB. T{ Code T}:T{ Description T} .T& l l l l l l l l l l l l l l. T{ C T}:T{ magnetometer calibration alarm T} T{ L T}:T{ low alarm T} T{ M T}:T{ low warning T} T{ N T}:T{ normal T} T{ O T}:T{ high warning T} T{ P T}:T{ high alarm T} T{ V T}:T{ magnetometer voltage level alarm T} .TE .sp 1 When the C client library parses a response of this kind, it will assert ATT_IS\&. .sp Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"ATT","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} .fi .if n \{\ .RE .\} .RE .PP And here are the commands: .PP ?VERSION; .RS 4 Returns an object with the following attributes: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&7.\ \&VERSION object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "VERSION" T} T{ release T}:T{ Yes T}:T{ string T}:T{ Public release level T} T{ rev T}:T{ Yes T}:T{ string T}:T{ Internal revision\-control level\&. T} T{ proto_major T}:T{ Yes T}:T{ numeric T}:T{ API major revision level\&. T} T{ proto_minor T}:T{ Yes T}:T{ numeric T}:T{ API minor revision level\&. T} T{ remote T}:T{ No T}:T{ string T}:T{ URL of the remote daemon reporting this version\&. If empty, this is the version of the local daemon\&. T} .TE .sp 1 The daemon ships a VERSION response to each client when the client first connects to it\&. .sp When the C client library parses a response of this kind, it will assert the VERSION_SET bit in the top\-level set member\&. .sp Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"VERSION","version":"2\&.40dev", "rev":"06f62e14eae9886cde907dae61c124c53eb1101f", "proto_major":3,"proto_minor":1 } .fi .if n \{\ .RE .\} .RE .PP ?DEVICES; .RS 4 Returns a device list object with the following elements: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&8.\ \&DEVICES object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "DEVICES" T} T{ devices T}:T{ Yes T}:T{ list T}:T{ List of device descriptions T} T{ remote T}:T{ No T}:T{ string T}:T{ URL of the remote daemon reporting the device set\&. If empty, this is a DEVICES response from the local daemon\&. T} .TE .sp 1 When the C client library parses a response of this kind, it will assert the DEVICELIST_SET bit in the top\-level set member\&. .sp Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class"="DEVICES","devices":[ {"class":"DEVICE","path":"/dev/pts/1","flags":1,"driver":"SiRF binary"}, {"class":"DEVICE","path":"/dev/pts/3","flags":4,"driver":"AIVDM"}]} .fi .if n \{\ .RE .\} .sp The daemon occasionally ships a bare DEVICE object to the client (that is, one not inside a DEVICES wrapper)\&. The data content of these objects will be described later as a response to the ?DEVICE command\&. .RE .PP ?WATCH; .RS 4 This command sets watcher mode\&. It also sets or elicits a report of per\-subscriber policy and the raw bit\&. An argument WATCH object changes the subscriber\*(Aqs policy\&. The response describes the subscriber\*(Aqs policy\&. The response will also include a DEVICES object\&. .sp A WATCH object has the following elements: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&9.\ \&WATCH object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "WATCH" T} T{ enable T}:T{ No T}:T{ boolean T}:T{ Enable (true) or disable (false) watcher mode\&. Default is true\&. T} T{ json T}:T{ No T}:T{ boolean T}:T{ Enable (true) or disable (false) dumping of JSON reports\&. Default is false\&. T} T{ nmea T}:T{ No T}:T{ boolean T}:T{ Enable (true) or disable (false) dumping of binary packets as pseudo\-NMEA\&. Default is false\&. T} T{ raw T}:T{ No T}:T{ integer T}:T{ Controls \*(Aqraw\*(Aq mode\&. When this attribute is set to 1 for a channel, gpsd reports the unprocessed NMEA or AIVDM data stream from whatever device is attached\&. Binary GPS packets are hex\-dumped\&. RTCM2 and RTCM3 packets are not dumped in raw mode\&. When this attribute is set to 2 for a channel that processes binary data, gpsd reports the received data verbatim without hex\-dumping\&. T} T{ scaled T}:T{ No T}:T{ boolean T}:T{ If true, apply scaling divisors to output before dumping; default is false\&. T} T{ split24 T}:T{ No T}:T{ boolean T}:T{ If true, aggregate AIS type24 sentence parts\&. If false, report each part as a separate JSON object, leaving the client to match MMSIs and aggregate\&. Default is false\&. Applies only to AIS reports\&. T} T{ pps T}:T{ No T}:T{ boolean T}:T{ If true, emit the TOFF JSON message on each cycle and a PPS JSON message when the device issues 1PPS\&. Default is false\&. T} T{ device T}:T{ No T}:T{ string T}:T{ If present, enable watching only of the specified device rather than all devices\&. Useful with raw and NMEA modes in which device responses aren\*(Aqt tagged\&. Has no effect when used with enable:false\&. T} T{ remote T}:T{ No T}:T{ string T}:T{ URL of the remote daemon reporting the watch set\&. If empty, this is a WATCH response from the local daemon\&. T} .TE .sp 1 There is an additional boolean "timing" attribute which is undocumented because that portion of the interface is considered unstable and for developer use only\&. .sp In watcher mode, GPS reports are dumped as TPV and SKY responses\&. AIS, Subframe and RTCM reporting is described in the next section\&. .sp When the C client library parses a response of this kind, it will assert the POLICY_SET bit in the top\-level set member\&. .sp Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"WATCH", "raw":1,"scaled":true} .fi .if n \{\ .RE .\} .RE .PP ?POLL; .RS 4 The POLL command requests data from the last\-seen fixes on all active GPS devices\&. Devices must previously have been activated by ?WATCH to be pollable\&. .sp Polling can lead to possibly surprising results when it is used on a device such as an NMEA GPS for which a complete fix has to be accumulated from several sentences\&. If you poll while those sentences are being emitted, the response will contain the last complete fix data and may be as much as one cycle time (typically 1 second) stale\&. .sp The POLL response will contain a timestamped list of TPV objects describing cached data, and a timestamped list of SKY objects describing satellite configuration\&. If a device has not seen fixes, it will be reported with a mode field of zero\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&10.\ \&POLL object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "POLL" T} T{ time T}:T{ Yes T}:T{ Numeric T}:T{ Timestamp in ISO 8601 format\&. May have a fractional part of up to \&.001sec precision\&. T} T{ active T}:T{ Yes T}:T{ Numeric T}:T{ Count of active devices\&. T} T{ fixes T}:T{ Yes T}:T{ JSON array T}:T{ Comma\-separated list of TPV objects\&. T} T{ skyviews T}:T{ Yes T}:T{ JSON array T}:T{ Comma\-separated list of SKY objects\&. T} .TE .sp 1 Here\*(Aqs an example of a POLL response: .sp .if n \{\ .RS 4 .\} .nf {"class":"POLL","time":"2010\-06\-04T10:31:00\&.289Z","active":1, "tpv":[{"class":"TPV","device":"/dev/ttyUSB0", "time":"2010\-09\-08T13:33:06\&.095Z", "ept":0\&.005,"lat":40\&.035093060, "lon":\-75\&.519748733,"track":99\&.4319,"speed":0\&.123,"mode":2}], "sky":[{"class":"SKY","device":"/dev/ttyUSB0", "time":1270517264\&.240,"hdop":9\&.20, "satellites":[{"PRN":16,"el":55,"az":42,"ss":36,"used":true}, {"PRN":19,"el":25,"az":177,"ss":0,"used":false}, {"PRN":7,"el":13,"az":295,"ss":0,"used":false}, {"PRN":6,"el":56,"az":135,"ss":32,"used":true}, {"PRN":13,"el":47,"az":304,"ss":0,"used":false}, {"PRN":23,"el":66,"az":259,"ss":0,"used":false}, {"PRN":20,"el":7,"az":226,"ss":0,"used":false}, {"PRN":3,"el":52,"az":163,"ss":32,"used":true}, {"PRN":31,"el":16,"az":102,"ss":0,"used":false} ]}]} .fi .if n \{\ .RE .\} .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Client software should not assume the field inventory of the POLL response is fixed for all time\&. As gpsd collects and caches more data from more sensor types, those data are likely to find their way into this response\&. .sp .5v .RE .RE .PP TOFF .RS 4 This message is emitted on each cycle and reports the offset between the host\*(Aqs clock time and the GPS time at top of second (actually, when the first data for the reporting cycle is received)\&. .sp This message exactly mirrors the PPS message except for two details\&. .sp TOFF emits no NTP precision, this is assumed to be \-2\&. See the NTP documentation for their definition of precision\&. .sp The TOFF message reports the GPS time as derived from the GPS serial data stream\&. The PPS message reports the GPS time as derived from the GPS PPS pulse\&. .sp A TOFF object has the following elements: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&11.\ \&TOFF object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "TOFF" T} T{ device T}:T{ Yes T}:T{ string T}:T{ Name of originating device T} T{ real_sec T}:T{ Yes T}:T{ numeric T}:T{ seconds from the GPS clock T} T{ real_nsec T}:T{ Yes T}:T{ numeric T}:T{ nanoseconds from the GPS clock T} T{ clock_sec T}:T{ Yes T}:T{ numeric T}:T{ seconds from the system clock T} T{ clock_nsec T}:T{ Yes T}:T{ numeric T}:T{ nanoseconds from the system clock T} .TE .sp 1 This message is emitted once per second to watchers of a device and is intended to report the time stamps of the in\-band report of the GPS and seconds as reported by the system clock (which may be NTP\-corrected) when the first valid timestamp of the reporting cycle was seen\&. .sp The message contains two second/nanosecond pairs: real_sec and real_nsec contain the time the GPS thinks it was at the start of the current cycle; clock_sec and clock_nsec contain the time the system clock thinks it was on receipt of the first timing message of the cycle\&. real_nsec is always to nanosecond precision\&. clock_nsec is nanosecond precision on most systems\&. .sp Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"TOFF","device":"/dev/ttyUSB0", "real_sec":1330212592, "real_nsec":343182, "clock_sec":1330212592,"clock_nsec":343184, "precision":\-2}} .fi .if n \{\ .RE .\} .RE .PP PPS .RS 4 This message is emitted each time the daemon sees a valid PPS (Pulse Per Second) strobe from a device\&. .sp This message exactly mirrors the PPS message except for two details\&. .sp PPS emits the NTP precision\&. See the NTP documentation for their definition of precision\&. .sp The TOFF message reports the GPS time as derived from the GPS serial data stream\&. The PPS message reports the GPS time as derived from the GPS PPS pulse\&. .sp There are various sources of error in the reported clock times\&. The speed of the serial connection between the GPS and the system adds a delay to start of cycle detection\&. An even bigger error is added by the variable computation time inside the GPS\&. Taken together the time derived from the start of the GPS cycle can have offsets of 10 millisecond to 700 milliseconds and combined jjitter and wander of 100 to 300 millisecond\&. .sp A PPS object has the following elements: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&12.\ \&PPS object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "PPS" T} T{ device T}:T{ Yes T}:T{ string T}:T{ Name of originating device T} T{ real_sec T}:T{ Yes T}:T{ numeric T}:T{ seconds from the PPS source T} T{ real_nsec T}:T{ Yes T}:T{ numeric T}:T{ nanoseconds from the PPS source T} T{ clock_sec T}:T{ Yes T}:T{ numeric T}:T{ seconds from the system clock T} T{ clock_nsec T}:T{ Yes T}:T{ numeric T}:T{ nanoseconds from the system clock T} T{ precision T}:T{ Yes T}:T{ numeric T}:T{ NTP style estimate of PPS precision T} .TE .sp 1 This message is emitted once per second to watchers of a device emitting PPS, and reports the time of the start of the GPS second (when the 1PPS arrives) and seconds as reported by the system clock (which may be NTP\-corrected) at that moment\&. .sp The message contains two second/nanosecond pairs: real_sec and real_nsec contain the time the GPS thinks it was at the PPS edge; clock_sec and clock_nsec contain the time the system clock thinks it was at the PPS edge\&. real_nsec is always to nanosecond precision\&. clock_nsec is nanosecond precision on most systems\&. .sp There are various sources of error in the reported clock times\&. For PPS delivered via a real serial\-line strobe, serial\-interrupt latency plus processing time to the timer call should be bounded above by about 10 microseconds; that can be reduced to less than 1 microsecond if your kernel supports RFC 2783\&. USB1\&.1\-to\-serial control\-line emulation is limited to about 1 millisecond\&. seconds\&. .sp Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"PPS","device":"/dev/ttyUSB0", "real_sec":1330212592, "real_nsec":343182, "clock_sec":1330212592,"clock_nsec":343184, "precision":\-3} .fi .if n \{\ .RE .\} .RE .PP ?DEVICE .RS 4 This command reports (when followed by \*(Aq;\*(Aq) the state of a device, or sets (when followed by \*(Aq=\*(Aq and a DEVICE object) device\-specific control bits, notably the device\*(Aqs speed and serial mode and the native\-mode bit\&. The parameter\-setting form will be rejected if more than one client is attached to the channel\&. .sp Pay attention to the response, because it is possible for this command to fail if the GPS does not support a speed\-switching command or only supports some combinations of serial modes\&. In case of failure, the daemon and GPS will continue to communicate at the old speed\&. .sp Use the parameter\-setting form with caution\&. On USB and Bluetooth GPSes it is also possible for serial mode setting to fail either because the serial adaptor chip does not support non\-8N1 modes or because the device firmware does not properly synchronize the serial adaptor chip with the UART on the GPS chipset when the speed changes\&. These failures can hang your device, possibly requiring a GPS power cycle or (in extreme cases) physically disconnecting the NVRAM backup battery\&. .sp A DEVICE object has the following elements: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&13.\ \&DEVICE object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "DEVICE" T} T{ path T}:T{ No T}:T{ string T}:T{ Name the device for which the control bits are being reported, or for which they are to be applied\&. This attribute may be omitted only when there is exactly one subscribed channel\&. T} T{ activated T}:T{ No T}:T{ string T}:T{ Time the device was activated as an ISO8601 timestamp\&. If the device is inactive this attribute is absent\&. T} T{ flags T}:T{ No T}:T{ integer T}:T{ Bit vector of property flags\&. Currently defined flags are: describe packet types seen so far (GPS, RTCM2, RTCM3, AIS)\&. Won\*(Aqt be reported if empty, e\&.g\&. before gpsd has seen identifiable packets from the device\&. T} T{ driver T}:T{ No T}:T{ string T}:T{ GPSD\*(Aqs name for the device driver type\&. Won\*(Aqt be reported before gpsd has seen identifiable packets from the device\&. T} T{ subtype T}:T{ When the daemon sees a delayed response to a probe for subtype or firmware\-version information\&. T}:T{ string T}:T{ Whatever version information the device returned\&. T} T{ bps T}:T{ No T}:T{ integer T}:T{ Device speed in bits per second\&. T} T{ parity T}:T{ Yes T}:T{ string T}:T{ N, O or E for no parity, odd, or even\&. T} T{ stopbits T}:T{ Yes T}:T{ string T}:T{ Stop bits (1 or 2)\&. T} T{ native T}:T{ No T}:T{ integer T}:T{ 0 means NMEA mode and 1 means alternate mode (binary if it has one, for SiRF and Evermore chipsets in particular)\&. Attempting to set this mode on a non\-GPS device will yield an error\&. T} T{ cycle T}:T{ No T}:T{ real T}:T{ Device cycle time in seconds\&. T} T{ mincycle T}:T{ No T}:T{ real T}:T{ Device minimum cycle time in seconds\&. Reported from ?DEVICE when (and only when) the rate is switchable\&. It is read\-only and not settable\&. T} .TE .sp 1 The serial parameters will be omitted in a response describing a TCP/IP source such as an Ntrip, DGPSIP, or AIS feed\&. .sp The contents of the flags field should be interpreted as follows: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&14.\ \&Device flags .TS allbox tab(:); lB lB lB. T{ C #define T}:T{ Value T}:T{ Description T} .T& l l l l l l l l l l l l. T{ SEEN_GPS T}:T{ 0x01 T}:T{ GPS data has been seen on this device T} T{ SEEN_RTCM2 T}:T{ 0x02 T}:T{ RTCM2 data has been seen on this device T} T{ SEEN_RTCM3 T}:T{ 0x04 T}:T{ RTCM3 data has been seen on this device T} T{ SEEN_AIS T}:T{ 0x08 T}:T{ AIS data has been seen on this device T} .TE .sp 1 When the C client library parses a response of this kind, it will assert the DEVICE_SET bit in the top\-level set member\&. .sp Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"DEVICE","bps":4800,"parity":"N","stopbits":1,"native":0} .fi .if n \{\ .RE .\} .RE .PP When a client is in watcher mode, the daemon will ship it DEVICE notifications when a device is added to the pool or deactivated\&. .PP When the C client library parses a response of this kind, it will assert the DEVICE_SET bit in the top\-level set member\&. .PP Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"DEVICE","path":"/dev/pts1","activated":0} .fi .if n \{\ .RE .\} .PP The daemon may ship an error object in response to a syntactically invalid command line or unknown command\&. It has the following elements: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&15.\ \&ERROR notification object .TS allbox tab(:); lB lB lB lB. T{ Name T}:T{ Always? T}:T{ Type T}:T{ Description T} .T& l l l l l l l l. T{ class T}:T{ Yes T}:T{ string T}:T{ Fixed: "ERROR" T} T{ message T}:T{ Yes T}:T{ string T}:T{ Textual error message T} .TE .sp 1 .PP Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"ERROR","message":"Unrecognized request \*(Aq?FOO\*(Aq"} .fi .if n \{\ .RE .\} .PP When the C client library parses a response of this kind, it will assert the ERR_SET bit in the top\-level set member\&. .SH "RTCM2" .PP RTCM\-104 is a family of serial protocols used for broadcasting pseudorange corrections from differential\-GPS reference stations\&. Many GPS receivers can accept these corrections to improve their reporting accuracy\&. .PP RTCM\-104 comes in two major and incompatible flavors, 2\&.x and 3\&.x\&. Each major flavor has minor (compatible) revisions\&. .PP The applicable standard for RTCM Version 2\&.x is RTCM Recommended Standards for Differential NAVSTAR GPS Service RTCM Paper 194\-93/SC 104\-STD\&. For RTCM 3\&.1 it is RTCM Paper 177\-2006\-SC104\-STD\&. Ordering instructions for both standards are accessible from the website of the \m[blue]\fBRadio Technical Commission for Maritime Services\fR\m[]\&\s-2\u[1]\d\s+2 under "Publications"\&. .SS "RTCM WIRE TRANSMISSIONS" .PP Differential\-GPS correction stations consist of a GPS reference receiver coupled to a low frequency (LF) transmitter\&. The GPS reference receiver is a survey\-grade GPS that does GPS carrier tracking and can work out its own position to a few millimeters\&. It generates range and range\-rate corrections and encodes them into RTCM104\&. It ships the RTCM104 to the LF transmitter over serial rs\-232 signal at 100 baud or 200 baud depending on the requirements of the transmitter\&. .PP The LF transmitter broadcasts the approximately 300khz radio signal that differential\-GPS radio receivers pick up\&. Transmitters that are meant to have a higher range will need to transmit at the slower rate\&. The higher the data rate the harder it will be for the remote radio receiver to receive with a good signal\-to\-noise ration\&. (Higher data rate signals can\*(Aqt be averaged over as long a time frame, hence they appear noisier\&.) .SS "RTCM WIRE FORMATS" .PP An RTCM 2\&.x message consists of a sequence of up to 33 30\-bit words\&. The 24 most significant bits of each word are data and the six least significant bits are parity\&. The parity algorithm used is the same ISGPS\-2000 as that used on GPS satellite downlinks\&. Each RTCM 2\&.x message consists of two header words followed by zero or more data words, depending upon message type\&. .PP An RTCM 3\&.x message begins with a fixed leader byte 0xD3\&. That is followed by six bits of version information and 10 bits of payload length information\&. Following that is the payload; following the payload is a 3\-byte checksum of the payload using the Qualcomm CRC\-24Q algorithm\&. .SS "RTCM2 JSON FORMAT" .PP Each RTCM2 message is dumped as a single JSON object per message, with the message fields as attributes of that object\&. Arrays of satellite, station, and constellation statistics become arrays of JSON sub\-objects\&. Each sentence will normally also have a "device" field containing the pathname of the originating device\&. .PP All attributes other than the device field are mandatory\&. Header attributes are emitted before others\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBHeader portion\fR .RS 4 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&16.\ \&SKY object .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l l l l l l l l l l l l l. T{ class T}:T{ string T}:T{ .PP Fixed: "RTCM2"\&. T} T{ type T}:T{ integer T}:T{ .PP Message type (1\-9)\&. T} T{ station_id T}:T{ integer T}:T{ .PP The id of the GPS reference receiver\&. The LF transmitters also have (different) id numbers\&. T} T{ zcount T}:T{ real T}:T{ .PP The reference time of the corrections in the message in seconds within the current hour\&. Note that it is in GPS time, which is some seconds ahead of UTC (see the U\&.S\&. Naval Observatory\*(Aqs \m[blue]\fBtable of leap second corrections\fR\m[]\&\s-2\u[2]\d\s+2)\&. T} T{ seqnum T}:T{ integer T}:T{ .PP Sequence number\&. Only 3 bits wide, wraps after 7\&. T} T{ length T}:T{ integer T}:T{ .PP The number of words after the header that comprise the message\&. T} T{ station_health T}:T{ integer T}:T{ .PP Station transmission status\&. Indicates the health of the beacon as a reference source\&. Any nonzero value means the satellite is probably transmitting bad data and should not be used in a fix\&. 6 means the transmission is unmonitored\&. 7 means the station is not working properly\&. Other values are defined by the beacon operator\&. T} .TE .sp 1 .PP is one of .PP 1 .RS 4 full corrections \- one message containing corrections for all GPS satellites in view\&. This is not common\&. .RE .PP 3 .RS 4 reference station parameters \- the position of the reference station GPS antenna\&. .RE .PP 4 .RS 4 datum \(em the datum to which the DGPS data is referred\&. .RE .PP 5 .RS 4 constellation health \(em information about the satellites the beacon can see\&. .RE .PP 6 .RS 4 null message \(em just a filler\&. .RE .PP 7 .RS 4 radio beacon almanac \(em information about this or other beacons\&. .RE .PP 9 .RS 4 subset corrections \(em a message containing corrections for only a subset of the GPS satellites in view\&. .RE .PP 16 .RS 4 special message \(em a text message from the beacon operator\&. .RE .PP 31 .RS 4 GLONASS subset corrections \(em a message containing corrections for a set of the GLONASS satellites in view\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 1 and 9: Correction data\fR .RS 4 .PP One or more satellite objects follow the header for type 1 or type 9 messages\&. Here is the format: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&17.\ \&Satellite object .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l l l l l l l. T{ ident T}:T{ integer T}:T{ .PP The PRN number of the satellite for which this is correction data\&. T} T{ udre T}:T{ integer T}:T{ .PP User Differential Range Error (0\-3)\&. See the table following for values\&. T} T{ iod T}:T{ integer T}:T{ .PP Issue Of Data, matching the IOD for the current ephemeris of this satellite, as transmitted by the satellite\&. The IOD is a unique tag that identifies the ephemeris; the GPS using the DGPS correction and the DGPS generating the data must use the same orbital positions for the satellite\&. T} T{ prc T}:T{ real T}:T{ .PP The pseudorange error in meters for this satellite as measured by the beacon reference receiver at the epoch indicated by the z_count in the parent record\&. T} T{ rrc T}:T{ real T}:T{ .PP The rate of change of pseudorange error in meters/sec for this satellite as measured by the beacon reference receiver at the epoch indicated by the z_count field in the parent record\&. This is used to calculate pseudorange errors at other epochs, if required by the GPS receiver\&. T} .TE .sp 1 .PP User Differential Range Error values are as follows: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&18.\ \&UDRE values .TS allbox tab(:); l l l l l l l l. T{ 0 T}:T{ 1\-sigma error <= 1m T} T{ 1 T}:T{ 1\-sigma error <= 4m T} T{ 2 T}:T{ 1\-sigma error <= 8m T} T{ 3 T}:T{ 1\-sigma error > 8m T} .TE .sp 1 .PP Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"RTCM2","type":1, "station_id":688,"zcount":843\&.0,"seqnum":5,"length":19,"station_health":6, "satellites":[ {"ident":10,"udre":0,"iod":46,"prc":\-2\&.400,"rrc":0\&.000}, {"ident":13,"udre":0,"iod":94,"prc":\-4\&.420,"rrc":0\&.000}, {"ident":7,"udre":0,"iod":22,"prc":\-5\&.160,"rrc":0\&.002}, {"ident":2,"udre":0,"iod":34,"prc":\-6\&.480,"rrc":0\&.000}, {"ident":4,"udre":0,"iod":47,"prc":\-8\&.860,"rrc":0\&.000}, {"ident":8,"udre":0,"iod":76,"prc":\-7\&.980,"rrc":0\&.002}, {"ident":5,"udre":0,"iod":99,"prc":\-8\&.260,"rrc":0\&.002}, {"ident":23,"udre":0,"iod":81,"prc":\-8\&.060,"rrc":0\&.000}, {"ident":16,"udre":0,"iod":70,"prc":\-11\&.740,"rrc":0\&.000}, {"ident":30,"udre":0,"iod":4,"prc":\-18\&.960,"rrc":\-0\&.006}, {"ident":29,"udre":0,"iod":101,"prc":\-24\&.960,"rrc":\-0\&.002} ]} .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 3: Reference Station Parameters\fR .RS 4 .PP Here are the payload members of a type 3 (Reference Station Parameters) message: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&19.\ \&Reference Station Parameters .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l. T{ x T}:T{ real T}:T{ .PP ECEF X coordinate\&. T} T{ y T}:T{ real T}:T{ .PP ECEF Y coordinate\&. T} T{ z T}:T{ real T}:T{ .PP ECEF Z coordinate\&. T} .TE .sp 1 .PP The coordinates are the position of the station, in meters to two decimal places, in Earth Centred Earth Fixed coordinates\&. These are usually referred to the WGS84 reference frame, but may be referred to NAD83 in the US (essentially identical to WGS84 for all except geodesists), or to some other reference frame in other parts of the world\&. .PP An invalid reference message is represented by a type 3 header without payload fields\&. .PP Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"RTCM2","type":3, "station_id":652,"zcount":1657\&.2,"seqnum":2,"length":4,"station_health":6, "x":3878620\&.92,"y":670281\&.40,"z":5002093\&.59 } .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 4: Datum\fR .RS 4 .PP Here are the payload members of a type 4 (Datum) message: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&20.\ \&Datum .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l l l l l l l l l l. T{ dgnss_type T}:T{ string T}:T{ .PP Either "GPS", "GLONASS", "GALILEO", or "UNKNOWN"\&. T} T{ dat T}:T{ integer T}:T{ .PP 0 or 1 and indicates the sense of the offset shift given by dx, dy, dz\&. dat = 0 means that the station coordinates (in the reference message) are referred to a local datum and that adding dx, dy, dz to that position will render it in GNSS coordinates (WGS84 for GPS)\&. If dat = 1 then the ref station position is in GNSS coordinates and adding dx, dy, dz will give it referred to the local datum\&. T} T{ datum_name T}:T{ string T}:T{ .PP A standard name for the datum\&. T} T{ dx T}:T{ real T}:T{ .PP X offset\&. T} T{ dy T}:T{ real T}:T{ .PP Y offset\&. T} T{ dz T}:T{ real T}:T{ .PP Z offset\&. T} .TE .sp 1 .PP are offsets to convert from local datum to GNSS datum or vice versa\&. These fields are optional\&. .PP An invalid datum message is represented by a type 4 header without payload fields\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 5: Constellation Health\fR .RS 4 .PP One or more of these follow the header for type 5 messages \(em one for each satellite\&. .PP Here is the format: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&21.\ \&Constellation health .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l l l l l l l l l l l l l l l l. T{ ident T}:T{ integer T}:T{ .PP The PRN number of the satellite\&. T} T{ iodl T}:T{ bool T}:T{ .PP True indicates that this information relates to the satellite information in an accompanying type 1 or type 9 message\&. T} T{ health T}:T{ integer T}:T{ 0 indicates that the satellite is healthy\&. Any other value indicates a problem (coding is not known)\&..PP T} T{ snr T}:T{ integer T}:T{ .PP The carrier/noise ratio of the received signal in the range 25 to 55 dB(Hz)\&. T} T{ health_en T}:T{ bool T}:T{ .PP If set to True it indicates that the satellite is healthy even if the satellite navigation data says it is unhealthy\&. T} T{ new_data T}:T{ bool T}:T{ True indicates that the IOD for this satellite will soon be updated in type 1 or 9 messages\&..PP T} T{ los_warning T}:T{ bool T}:T{ .PP Line\-of\-sight warning\&. True indicates that the satellite will shortly go unhealthy\&. T} T{ tou T}:T{ integer T}:T{ .PP Healthy time remaining in seconds\&. T} .TE .sp 1 .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 6: Null\fR .RS 4 .PP This just indicates a null message\&. There are no payload fields\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBUnknown message\fR .RS 4 .PP This format is used to dump message words in hexadecimal when the message type field doesn\*(Aqt match any of the known ones\&. .PP Here is the format: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&22.\ \&Unknown Message .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l. T{ data T}:T{ list T}:T{ .PP A list of strings\&. T} .TE .sp 1 .PP Each string in the array is a hex literal representing 30 bits of information, after parity checks and inversion\&. The high two bits should be ignored\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 7: Radio Beacon Almanac\fR .RS 4 .PP Here is the format: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&23.\ \&Contellation health .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l l l l l l l l l l l l l. T{ lat T}:T{ real T}:T{ .PP Latitude in degrees, of the LF transmitter antenna for the station for which this is an almanac\&. North is positive\&. T} T{ lon T}:T{ real T}:T{ .PP Longitude in degrees, of the LF transmitter antenna for the station for which this is an almanac\&. East is positive\&. T} T{ range T}:T{ integer T}:T{ Published range of the station in km\&..PP T} T{ frequency T}:T{ real T}:T{ .PP Station broadcast frequency in kHz\&. T} T{ health T}:T{ integer T}:T{ .PP is the health of the station for which this is an almanac\&. If it is non\-zero, the station is issuing suspect data and should not be used for fixes\&. The ITU and RTCM104 standards differ about the mode detailed interpretation of the field and even about its bit width\&. T} T{ station_id T}:T{ integer T}:T{ .PP The id of the transmitter\&. This is not the same as the reference id in the header, the latter being the id of the reference receiver\&. T} T{ bitrate T}:T{ integer T}:T{ .PP The transmitted bitrate\&. T} .TE .sp 1 .PP Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"RTCM2","type":9,"station_id":268,"zcount":252\&.6, "seqnum":4,"length":5,"station_health":0, "satellites":[ {"ident":13,"udre":0,"iod":3,"prc":\-25\&.940,"rrc":0\&.066}, {"ident":2,"udre":0,"iod":73,"prc":0\&.920,"rrc":\-0\&.080}, {"ident":8,"udre":0,"iod":22,"prc":23\&.820,"rrc":0\&.014} ]} .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 13: GPS Time of Week\fR .RS 4 .PP Here are the payload members of a type 13 (Groumf Tramitter Parameters) message: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&24.\ \&Grund Transmitter Parameters .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l l l l l l l. T{ status T}:T{ bool T}:T{ .PP If True, signals user to expect a type 16 explanatory message associated with this station\&. Probably indicates some sort of unusual event\&. T} T{ rangeflag T}:T{ bool T}:T{ .PP If True, indicates that the estimated range is different from that found in the Type 7 message (which contains the beacon\*(Aqs listed range)\&. Generally indicates a range reduction due to causes such as poor ionospheric conditions or reduced transmission power\&. T} T{ lat T}:T{ real T}:T{ .PP Degrees latitude, signed\&. Positive is N, negative is S\&. T} T{ lon T}:T{ real T}:T{ .PP Degrees longitude, signed\&. Positive is E, negative is W\&. T} T{ range T}:T{ integer T}:T{ .PP Transmission range in km (1\-1024)\&. T} .TE .sp 1 .PP This message type replaces message type 3 (Reference Station Parameters) in RTCM 2\&.3\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 14: GPS Time of Week\fR .RS 4 .PP Here are the payload members of a type 14 (GPS Time of Week) message: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&25.\ \&Reference Station Parameters .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l. T{ week T}:T{ integer T}:T{ .PP GPS week (0\-123)\&. T} T{ hour T}:T{ integer T}:T{ .PP Hour of week (0\-167)\&. T} T{ leapsecs T}:T{ integer T}:T{ .PP Leap Seconds (0\-63)\&. T} .TE .sp 1 .PP Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"RTCM2","type":14,"station_id":652,"zcount":1657\&.2, "seqnum":3,"length":1,"station_health":6,"week":601,"hour":109, "leapsecs":15} .fi .if n \{\ .RE .\} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 16: Special Message\fR .RS 4 .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&26.\ \&Special Message .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l. T{ message T}:T{ string T}:T{ .PP A text message sent by the beacon operator\&. T} .TE .sp 1 .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBType 31: Correction data\fR .RS 4 .PP One or more GLONASS satellite objects follow the header for type 1 or type 9 messages\&. Here is the format: .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&27.\ \&Satellite object .TS allbox tab(:); lB lB lB. T{ Name T}:T{ Type T}:T{ .PP Description T} .T& l l l l l l l l l l l l l l l l l l. T{ ident T}:T{ integer T}:T{ .PP The PRN number of the satellite for which this is correction data\&. T} T{ udre T}:T{ integer T}:T{ .PP User Differential Range Error (0\-3)\&. See the table following for values\&. T} T{ change T}:T{ boolean T}:T{ .PP Change\-of\-ephemeris bit\&. T} T{ tod T}:T{ uinteger T}:T{ .PP Count of 30\-second periods since the top of the hour\&. T} T{ prc T}:T{ real T}:T{ .PP The pseudorange error in meters for this satellite as measured by the beacon reference receiver at the epoch indicated by the z_count in the parent record\&. T} T{ rrc T}:T{ real T}:T{ .PP The rate of change of pseudorange error in meters/sec for this satellite as measured by the beacon reference receiver at the epoch indicated by the z_count field in the parent record\&. This is used to calculate pseudorange errors at other epochs, if required by the GPS receiver\&. T} .TE .sp 1 .PP Here\*(Aqs an example: .sp .if n \{\ .RS 4 .\} .nf {"class":"RTCM2","type":31,"station_id":652,"zcount":1642\&.2, "seqnum":0,"length":14,"station_health":6, "satellites":[ {"ident":5,"udre":0,"change":false,"tod":0,"prc":132\&.360,"rrc":0\&.000}, {"ident":15,"udre":0,"change":false,"tod":0,"prc":134\&.840,"rrc":0\&.002}, {"ident":14,"udre":0,"change":false,"tod":0,"prc":141\&.520,"rrc":0\&.000}, {"ident":6,"udre":0,"change":false,"tod":0,"prc":127\&.000,"rrc":0\&.000}, {"ident":21,"udre":0,"change":false,"tod":0,"prc":128\&.780,"rrc":0\&.000}, {"ident":22,"udre":0,"change":false,"tod":0,"prc":125\&.260,"rrc":0\&.002}, {"ident":20,"udre":0,"change":false,"tod":0,"prc":117\&.280,"rrc":\-0\&.004}, {"ident":16,"udre":0,"change":false,"tod":17,"prc":113\&.460,"rrc":0\&.018} ]} .fi .if n \{\ .RE .\} .RE .SH "RTCM3 DUMP FORMAT" .PP The support for RTCM104v3 dumping is incomplete and buggy\&. Do not attempt to use it for production! Anyone interested in it should read the source code\&. .SH "AIS DUMP FORMATS" .PP AIS support is an extension\&. It may not be present if your instance of gpsd has been built with a restricted feature set\&. .PP AIS packets are dumped as JSON objects with class "AIS"\&. Each AIS report object contains a "type" field giving the AIS message type and a "scaled" field telling whether the remainder of the fields are dumped in scaled or unscaled form\&. (These will be emitted before any type\-specific fields\&.) It will also contain a "device" field naming the data source\&. Other fields have names and types as specified in the AIVDM/AIVDO Protocol Decoding document on the GPSD project website; each message field table may be directly interpreted as a specification for the members of the corresponding JSON object type\&. .PP By default, certain scaling and conversion operations are performed for JSON output\&. Latitudes and longitudes are scaled to decimal degrees rather than the native AIS unit of 1/10000th of a minute of arc\&. Ship (but not air) speeds are scaled to knots rather than tenth\-of\-knot units\&. Rate of turn may appear as "nan" if is unavailable, or as one of the strings "fastright" or "fastleft" if it is out of the AIS encoding range; otherwise it is quadratically mapped back to the turn sensor number in degrees per minute\&. Vessel draughts are converted to decimal meters rather than native AIS decimeters\&. Various other scaling conversions are described in "AIVDM/AIVDO Protocol Decoding"\&. .SH "SUBFRAME DUMP FORMATS" .PP Subframe support is always compiled into gpsd but many GPSes do not output subframe data or the gpsd driver may not support subframes\&. .PP Subframe packets are dumped as JSON objects with class "SUBFRAME"\&. Each subframe report object contains a "frame" field giving the subframe number, a "tSV" field for the transmitting satellite number, a "TOW17" field containing the 17 MSBs of the start of the next 12\-second message and a "scaled" field telling whether the remainder of the fields are dumped in scaled or unscaled form\&. It will also contain a "device" field naming the data source\&. Each SUBFRAME object will have a sub\-object specific to that subframe page type\&. Those sub\-object fields have names and types similar to those specified in the IS\-GPS\-200E document; each message field table may be directly interpreted as a specification for the members of the corresponding JSON object type\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBlibgps\fR(3), .SH "AUTHOR" .PP The protocol was designed and documented by Eric S\&. Raymond\&. .SH "NOTES" .IP " 1." 4 Radio Technical Commission for Maritime Services .RS 4 \%http://www.rtcm.org/ .RE .IP " 2." 4 table of leap second corrections .RS 4 \%ftp://maia.usno.navy.mil/ser7/tai-utc.dat .RE gpsd-3.15/srec.50000664000175000017500000002646712533043776011620 0ustar esresr'\" t .\" Title: srec .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 15 Jul 2005 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "SREC" "5" "15 Jul 2005" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" srec \- Motorola S\-record record and file format .SH "DESCRIPTION" .PP Motorola S\-records are a form of simple ASCII encoding for binary data\&. This format is commonly used for firmware uploads to GPSes, industrial robots, and other kinds of microcontroller\-driven hardware\&. It has several convenient properties, including inspectability, easy editing with any text editor, and checksumming for verification of transmission across noisy serial lines\&. .PP An S\-record file consists of a sequence of specially formatted ASCII character strings\&. An S\-record will be less than or equal to 78 bytes in length\&. .PP The order of S\-records within a file is of no significance and no particular order may be assumed\&. .PP The general format of an S\-record follows: .sp .if n \{\ .RS 4 .\} .nf +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-//\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-//\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ | type | count | address | data | checksum | +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-//\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-//\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ .fi .if n \{\ .RE .\} .PP type .RS 4 A char[2] field\&. These characters describe the type of record (S0, S1, S2, S3, S5, S7, S8, or S9)\&. .RE .PP count .RS 4 A char[2] field\&. These characters when paired and interpreted as a big\-endian hexadecimal integer, display the count of remaining character pairs in the record\&. .RE .PP address .RS 4 A char[4,6, or 8] field\&. These characters grouped and interpreted as a big\-endian hexadecimal integer, display the address at which the data field is to be loaded into memory\&. The length of the field depends on the number of bytes necessary to hold the address\&. A 2\-byte address uses 4 characters, a 3\-byte address uses 6 characters, and a 4\-byte address uses 8 characters\&. .RE .PP data .RS 4 A char [0\-64] field\&. These characters when paired and interpreted as hexadecimal values represent the memory loadable data or descriptive information\&. .RE .PP checksum .RS 4 A char[2] field\&. These characters when paired and interpreted as a big\-endian hexadecimal integer display the least significant byte of the ones complement of the sum of the byte values represented by the pairs of characters making up the count, the address, and the data fields\&. .RE .PP Each record is terminated with a line feed\&. If any additional or different record terminator(s) or delay characters are needed during transmission to the target system it is the responsibility of the transmitting program to provide them\&. .PP There are 9 record types, as follows: .PP S0 .RS 4 The type of record is \*(AqS0\*(Aq (0x5330)\&. The address field is unused and will be filled with zeros (0x0000)\&. The header information within the data field is divided into the following subfields\&. .sp .RS 4 .ie n \{\ \h'-04' 1.\h'+01'\c .\} .el \{\ .sp -1 .IP " 1." 4.2 .\} mname is char[20] and is the module name\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 2.\h'+01'\c .\} .el \{\ .sp -1 .IP " 2." 4.2 .\} ver is char[2] and is the version number\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 3.\h'+01'\c .\} .el \{\ .sp -1 .IP " 3." 4.2 .\} rev is char[2] and is the revision number\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 4.\h'+01'\c .\} .el \{\ .sp -1 .IP " 4." 4.2 .\} description is char[0\-36] and is a text comment\&. .RE .sp Each of the subfields is composed of ASCII bytes whose associated characters, when paired, represent one byte hexadecimal values in the case of the version and revision numbers, or represent the hexadecimal values of the ASCII characters comprising the module name and description\&. .RE .PP S1 .RS 4 The type of record field is \*(AqS1\*(Aq (0x5331)\&. The address field is interpreted as a 2\-byte big\-endian address\&. The data field is composed of memory loadable data\&. .RE .PP S2 .RS 4 The type of record field is \*(AqS2\*(Aq (0x5332)\&. The address field is interpreted as a 3\-byte big\-endian address\&. The data field is composed of memory loadable data\&. .RE .PP S3 .RS 4 The type of record field is \*(AqS3\*(Aq (0x5333)\&. The address field is interpreted as a 4\-byte big\-endian address\&. The data field is composed of memory loadable data\&. .RE .PP S5 .RS 4 The type of record field is \*(AqS5\*(Aq (0x5335)\&. The address field is interpreted as a 2\-byte big\-endian value and contains the count of S1, S2, and S3 records previously transmitted\&. There is no data field\&. .RE .PP S7 .RS 4 The type of record field is \*(AqS7\*(Aq (0x5337)\&. The address field contains the starting execution address and is interpreted as a 4\-byte big\-endian address\&. There is no data field\&. .RE .PP S8 .RS 4 The type of record field is \*(AqS8\*(Aq (0x5338)\&. The address field contains the starting execution address and is interpreted as a 3\-byte big\-endian address\&. There is no data field\&. .RE .PP S9 .RS 4 The type of record field is \*(AqS9\*(Aq (0x5339)\&. The address field contains the starting execution address and is interpreted as a 2\-byte big\-endian address\&. There is no data field\&. .RE .SH "EXAMPLE" .PP Shown below is a typical S\-record format file\&. .sp .if n \{\ .RS 4 .\} .nf S00600004844521B S1130000285F245F2212226A000424290008237C2A S11300100002000800082629001853812341001813 S113002041E900084E42234300182342000824A952 S107003000144ED492 S5030004F8 S9030000FC .fi .if n \{\ .RE .\} .PP The file consists of one S0 record, four S1 records, one S5 record and an S9 record\&. .PP The S0 record is comprised as follows: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} S0 S\-record type S0, indicating it is a header record\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 06 Hexadecimal 06 (decimal 6), indicating that six character pairs (or ASCII bytes) follow\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 00 00 Four character 2\-byte address field, zeroes in this example\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 48 44 52 ASCII H, D, and R \- "HDR"\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 1B The checksum\&. .RE .PP The first S1 record is comprised as follows: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} S1 S\-record type S1, indicating it is a data record to be loaded at a 2\-byte address\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 13 Hexadecimal 13 (decimal 19), indicating that nineteen character pairs, representing a 2 byte address, 16 bytes of binary data, and a 1 byte checksum, follow\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 00 00 Four character 2\-byte address field; hexidecimal address 0x0000, where the data which follows is to be loaded\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 28 5F 24 5F 22 12 22 6A 00 04 24 29 00 08 23 7C Sixteen character pairs representing the actual binary data\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 2A The checksum\&. .RE .PP The second and third S1 records each contain 0x13 (19) character pairs and are ended with checksums of 13 and 52, respectively\&. The fourth S1 record contains 07 character pairs and has a checksum of 92\&. .PP The S5 record is comprised as follows: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} S5 S\-record type S5, indicating it is a count record indicating the number of S1 records .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 00 04 Hexadecimal 0004 (decimal 4), indicating that there are four data records previous to this record\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} F8 The checksum\&. .RE .PP The S9 record is comprised as follows: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} S9 S\-record type S9, indicating it is a termination record\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 03 Hexadecimal 03 (decimal 3), indicating that three character pairs follow\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} 00 00 The address field, hexadecimal 0 (decimal 0) indicating the starting execution address\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} FC The checksum\&. .RE .SH "NOTES" .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} There isn\*(Aqt any evidence that Motorola ever made use of the header information within the data field of the S0 record, as described above\&. This may have been used by some third party vendors\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The Unix manual page on S\-records is the only place that a 78\-byte limit on total record length or 64\-byte limit on data length is documented\&. These values shouldn\*(Aqt be trusted for the general case\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The count field can have values in the range of 0x3 (2 bytes of address + 1 byte checksum = 3, a not very useful record) to 0xff; this is the count of remaining character \fIpairs\fR, including checksum\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} If you write code to convert S\-Records, you should always assume that a record can be as long as 514 (decimal) characters in length (255 * 2 = 510, plus 4 characters for the type and count fields), plus any terminating character(s)\&. That is, in establishing an input buffer in C, you would declare it to be an array of 515 chars, thus leaving room for the terminating null character\&. .RE .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsfake\fR(1)\&. \fBgpsprof\fR(1)\&. .SH "AUTHOR" .PP From an anonymous web page, itself claiming to have been derived from an old Unix manual page\&. Now maintained by the GPSD project, which added endianness clarifications\&. gpsd-3.15/libgps.30000664000175000017500000002637212533043777012136 0ustar esresr'\" t .\" Title: 3 .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 14 Aug 2004 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "3" "3" "14 Aug 2004" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" libgps \- C service library for communicating with the GPS daemon .SH "SYNOPSIS" .sp .ft B .nf C: #include .fi .ft .HP \w'int\ gps_open('u .BI "int gps_open(char\ *" "server" ", char\ *\ " "port" ", struct\ gps_data_t\ *" "gpsdata" ");" .HP \w'int\ gps_send('u .BI "int gps_send(struct\ gps_data_t\ *" "gpsdata" ", char\ *" "fmt" "\&.\&.\&.);" .HP \w'int\ gps_read('u .BI "int gps_read(struct\ gps_data_t\ *" "gpsdata" ");" .HP \w'bool\ gps_waiting('u .BI "bool gps_waiting(const\ struct\ gps_data_t\ *" "gpsdata" ", int\ " "timeout" ");" .HP \w'char\ *gps_data('u .BI "char *gps_data(const\ struct\ gps_data_t\ *" "gpsdata" ");" .HP \w'int\ gps_unpack('u .BI "int gps_unpack(char\ *" "buf" ", struct\ gps_data_t\ *" "gpsdata" ");" .HP \w'void\ gps_close('u .BI "void gps_close(struct\ gps_data_t\ *" "gpsdata" ");" .HP \w'int\ gps_stream('u .BI "int gps_stream(struct\ gps_data_t\ *" "gpsdata" ", unsigned\ int" "flags" ", void\ *" "data" ");" .HP \w'const\ char\ *gps_errstr('u .BI "const char *gps_errstr(int\ " "err" ");" .sp .ft B .nf Python: import gps session = gps\&.gps(host="localhost", port="2947") session\&.stream(flags=gps\&.WATCH_JSON) for report in session: process(report) del session .fi .ft .SH "DESCRIPTION" .PP \fBlibgps\fR is a service library which supports communicating with an instance of the \fBgpsd\fR(8); link it with the linker option \-lgps\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br .PP Take care to conditionalize your code on the major and minor API version symbols in gps\&.h; ideally, force a compilation failure if GPSD_API_MAJOR_VERSION is not a version you recognize\&. See the GPSD project website for more information on the protocol and API changes\&. .sp .5v .RE .PP Calling \fBgps_open()\fR initializes a GPS\-data structure to hold the data collected by the GPS, and sets up access to \fBgpsd\fR(1) via either the socket or shared\-memory export\&. The shared\-memory export is faster, but does not carry information about device activation and deactivation events and will not allow you to monitor device packet traffic\&. .PP \fBgps_open()\fR returns 0 on success, \-1 on errors and is re\-entrant\&. errno is set depending on the error returned from the socket or shared\-memory interface; see gps\&.h for values and explanations; also see \fBgps_errstr()\fR\&. The host address may be a DNS name, an IPv4 dotted quad, an IPV6 address, or the special value \fBGPSD_SHARED_MEMORY\fR referring to the shared\-memory export; the library will do the right thing for any of these\&. .PP \fBgps_close()\fR ends the session\&. .PP \fBgps_send()\fR writes a command to the daemon\&. It does nothing when using the shared\-memory export\&. The second argument must be a format string containing elements from the command set documented at \fBgpsd\fR(1)\&. It may have % elements as for \fBsprintf\fR(3), which will be filled in from any following arguments\&. This function returns a \-1 if there was a Unix\-level write error, otherwise 0\&. Please read the LIMITATIONS section for additional information and cautions\&. See \fBgps_stream()\fR as a possible alternative\&. .PP \fBgps_read()\fR accepts a response, or sequence of responses, from the daemon and interprets\&. This function does either a nonblocking read for data from the daemon or a fetch from shared memory; it returns a count of bytes read for success, \-1 with errno set on a Unix\-level read error, \-1 with errno not set if the socket to the daemon has closed or if the shared\-memory segment was unavailable, and 0 if no data is available\&. .PP \fBgps_waiting()\fR can be used to check whether there is new data from the daemon\&. The second argument is the maximum amount of time to wait (in microseconds) on input before returning\&. It returns true if there is input waiting, false on timeout (no data waiting) or error condition\&. When using the socket export, this function is a convenience wrapper around a \fBselect\fR(2) call, and zeros \fIerrno\fR on entry; you can test \fIerrno\fR after exit to get more information about error conditions\&. Warning: under the shared\-memory interface there is a tiny race window between \fBgps_waiting()\fR and a following \fBgps_read()\fR; in that context, beause the latter does not block, it is probably better to write a simple read loop\&. .PP \fBgps_unpack()\fR parses JSON from the argument buffer into the target of the session structure pointer argument\&. Included in case your application wishes to manage socket I/O itself\&. .PP \fBgps_data()\fR returns the contents of the client data buffer (it returns NULL when using the shared\-memory export)\&. Use with care; this may fail to be a NUL\-terminated string if WATCH_RAW is enabled\&. .PP \fBgps_stream()\fR asks gpsd to stream the reports it has at you, to be made available when you poll (not available when using the shared\-memory export)\&. The second argument is a flag mask that sets various policy bits; see the list below\&. Calling \fBgps_stream()\fR more than once with different flag masks is allowed\&. .PP WATCH_DISABLE .RS 4 Disable the reporting modes specified by the other WATCH_ flags\&. .RE .PP WATCH_ENABLE .RS 4 Disable the reporting modes specified by the other WATCH_ flags\&. This is the default\&. .RE .PP WATCH_JSON .RS 4 Enable JSON reporting of data\&. If WATCH_ENABLE is set, and no other WATCH flags are set, this is the default\&. .RE .PP WATCH_NMEA .RS 4 Enable generated pseudo\-NMEA reporting on binary devices\&. .RE .PP WATCH_RARE .RS 4 Enable reporting of binary packets in encoded hex\&. .RE .PP WATCH_RAW .RS 4 Enable literal passthrough of binary packets\&. .RE .PP WATCH_SCALED .RS 4 When reporting AIS or Subframe data, scale integer quantities to floats if they have a divisor or rendering formula associated with them\&. .RE .PP WATCH_NEWSTYLE .RS 4 Force issuing a JSON initialization and getting new\-style responses\&. This is the default\&. .RE .PP WATCH_OLDSTYLE .RS 4 Force issuing a W or R command and getting old\-style responses\&. Warning: this flag (and the capability) will be removed in a future release\&. .RE .PP WATCH_DEVICE .RS 4 Restrict watching to a specified device, patch given as second argument\&. .RE .PP \fBgps_errstr()\fR returns an ASCII string (in English) describing the error indicated by a nonzero return value from \fBgps_open()\fR\&. .PP Consult gps\&.h to learn more about the data members and associated timestamps\&. Note that information will accumulate in the session structure over time, and the \*(Aqvalid\*(Aq field is not automatically zeroed by each \fBgps_read()\fR\&. It is up to the client to zero that field when appropriate and to keep an eye on the fix and sentence timestamps\&. .PP The Python implementation supports the same facilities as the socket\-export calls in the C library; there is no shared\-memory interface\&. \fBgps_open()\fR is replaced by the initialization of a gps session object; the other calls are methods of that object, and have the same names as the corresponding C functions\&. However, it is simpler just to use the session object as an iterator, as in the example given below\&. Resources within the session object will be properly released when it is garbage\-collected\&. .SH "ENVIRONMENT VARIABLES" .PP By setting the environment variable \fBGPSD_SHM_KEY\fR, you can control the key value used to create shared\-memory segment used for communication with gpsd\&. This will be useful mainly when isolating test instances of gpsd from production ones\&. .SH "CODE EXAMPLE" .PP The following is an excerpted and simplified version of the libgps interface code from \fBcgps\fR(1)\&. .sp .if n \{\ .RS 4 .\} .nf struct gps_data_t gps_data; ret = gps_open(hostName, hostPort, &gps_data); (void) gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL); /* Put this in a loop with a call to a high resolution sleep () in it\&. */ if (gps_waiting (&gps_data, 500)) { errno = 0; if (gps_read (&gps_data) == \-1) { \&.\&.\&. } else { /* Display data from the GPS receiver\&. */ if (gps_data\&.set & \&.\&.\&. } } /* When you are done\&.\&.\&. */ (void) gps_stream(&gps_data, WATCH_DISABLE, NULL); (void) gps_close (&gps_data); .fi .if n \{\ .RE .\} .SH "LIMITATIONS" .PP On some systems (those which do not support implicit linking in libraries) you may need to add \-lm to your link line when you link libgps\&. It is always safe to do this\&. .PP In the C API, incautious use of \fBgps_send()\fR may lead to subtle bugs\&. In order to not bloat struct gps_data_t with space used by responses that are not expected to be shipped in close sequence with each other, the storage for fields associated with certain responses are combined in a union\&. .PP The risky set of responses includes VERSION, DEVICELIST, RTCM2, RTCM3, SUBFRAME, AIS, GST, and ERROR; it may not be limited to that set\&. The logic of the daemon\*(Aqs watcher mode is careful to avoid dangerous sequences, but you should read and understand the layout of struct gps_data_t before using \fBgps_send()\fR to request any of these responses\&. .SH "COMPATIBILITY" .PP The \fBgps_query()\fR supported in major versions 1 and 2 of this library has been removed\&. With the new streaming\-oriented wire protocol behind this library, it is extremely unwise to assume that the first transmission from the daemon after a command is shipped to it will be the response to command\&. .PP If you must send commands to the daemon explicitly, use \fBgps_send()\fR but beware that this ties your code to the GPSD wire protocol\&. It is not recommended\&. .PP In earlier versions of the API \fBgps_read()\fR was a blocking call and there was a POLL_NONBLOCK option to make it nonblocking\&. \fBgps_waiting()\fR was added to reduce the number of wrong ways to code a polling loop\&. .PP See the comment above the symbol GPSD_API_MAJOR_VERSION in gps\&.h for recent changes\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgps\fR(1), \fBlibgpsd\fR(3)\&. \fBlibgpsmm\fR(3)\&. .SH "AUTHOR" .PP Eric S\&. Raymond , C sample code Charles Curley gpsd-3.15/lcdgps.10000664000175000017500000000001212533044001012064 0ustar esresr.so gps.1 gpsd-3.15/gpsinit.80000664000175000017500000000712412533043777012332 0ustar esresr'\" t .\" Title: gpsinit .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 18 Jan 2013 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSINIT" "8" "18 Jan 2013" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpsinit \- initialize CAN kernel modules for GPSD .SH "SYNOPSIS" .HP \w'\fBgpsinit\fR\ 'u \fBgpsinit\fR [\-n\ \fIcontrol\fR] [\-s\ \fIspeed\fR] \fImodule_name\fR [\fIinterface_name\fR] .HP \w'\fBgpsinit\fR\ 'u \fBgpsinit\fR \-h .HP \w'\fBgpsinit\fR\ 'u \fBgpsinit\fR \-v .SH "DESCRIPTION" .PP gpsinit initializes whatever kernel\-level modules are needed to enable special non\-serial hardware to communicate with a gpsd instance\&. Note: it will need root permissions to load modules and perform other special operations, such as changing kernel\-interface baudrates\&. .PP At present, all modes of this tool are concerned with setting up kernel\-level interfaces to hardware on a CAN (Control Area Network) speaking NMEA2000\&. .PP The program accepts the following options: .PP \-h .RS 4 Display a brief help text\&. .RE .PP \-v .RS 4 Display the version of gpsinit\&. .RE .PP \-n .RS 4 Set the CAN network number\&. The default is 0\&. .RE .PP \-s .RS 4 Set the baudrate to be used to communicate over the serial line to the CAN hardware\&. The default is 38400 baud\&. .RE .PP The parameter \fImodule_name\fR is mandatory\&. The socket CAN driver module \fImodule_name\fR\&.ko will be loaded\&. \fBgpsinit\fR recognize the following module names: .PP plx_pci, esd_usb2, vcan, slcan .RS 4 The parameter \fIinterface_name\fR and \fI\-s \fR\fI\fIspeed\fR\fR can used here\&. .RE .PP beaglebone .RS 4 The dcan module needed for the beaglebone is part of the Linux kernel, so no module is loaded in this case\&. .RE .PP The parameter \fIinterface_name\fR is needed for slcan hardware only\&. It gives the name of the serial device to which the SL CAN hardware is connected\&. The default is /dev/ttyUSB0\&. .SH "EXAMPLES" .PP \fBsudo gpsinit plx_pci\fR .RS 4 Attempt to load the module plx_pci and initialize net 0 for the connection to a NMEA2000 network\&. It will set the baudrate to 250kBits\&. .RE .PP \fBsudo gpsinit \-n 1 plx_pci\fR .RS 4 As above, but use net 1\&. .RE .PP \fBsudo gpsinit \-s 38400 slcan /dev/ttyUSB0\fR .RS 4 Attempt to load the module slcan and talk to the hardware at 38400 baud connected to port /dev/ttyUSB0\&. .RE .PP \fBgpsinit \-h \fR .RS 4 Display a brief help message\&. .RE .PP \fBgpsinit \-v \fR .RS 4 Display the version of gpsinit\&. .RE .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3)\&. .SH "AUTHOR" .PP Reinhard Arlt \&. gpsd-3.15/gps.10000664000175000017500000002403712533044001011416 0ustar esresr'\" t .\" Title: gps .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 9 Aug 2004 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPS" "1" "9 Aug 2004" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gps, xgps, xgpsspeed, cgps, lcdgps, gegps \- test clients for gpsd .SH "SYNOPSIS" .HP \w'\fBxgps\fR\ 'u \fBxgps\fR [\-D\ \fIdebug\-level\fR] [\-h] [\-V] [\-l\ [[d]\ |\ [m]\ |\ [s]]] [\-u\ [[i]\ |\ [n]\ |\ [m]]] [\fIserver\fR [\fI:port\fR [\fI:device\fR]]] .HP \w'\fBxgpsspeed\fR\ 'u \fBxgpsspeed\fR [\-D\ \fIdebug\-level\fR] [\-h] [\-V] [\-\-speedunits\ {[mph]\ |\ [kph]\ |\ [knots]}] [\fIserver\fR [\fI:port\fR [\fI:device\fR]]] .HP \w'\fBcgps\fR\ 'u \fBcgps\fR [\-D\ \fIdebug\-level\fR] [\-h] [\-V] [\-l\ [[d]\ |\ [m]\ |\ [s]]] [\-m] [\-s] [\-u\ [[i]\ |\ [n]\ |\ [m]]] [\fIserver\fR [\fI:port\fR [\fI:device\fR]]] .HP \w'\fBlcdgps\fR\ 'u \fBlcdgps\fR [\-h] [\-V] [\-l\ [[d]\ |\ [m]\ |\ [s]]] [\-u\ [[i]\ |\ [n]\ |\ [m]]] [\fIserver\fR [\fI:port\fR [\fI:device\fR]]] .HP \w'\fBgpxlogger\fR\ 'u \fBgpxlogger\fR [\-D\ \fIdebug\-level\fR] [\-d] [\-e\ \fIexport\-method\fR] [\-f\ \fIfilename\fR] [\-l] [\-m\ \fIminmove\fR] [\-h] [\-V] [\-i\ \fItrack\ timeout\fR] [\fIserver\fR [\fI:port\fR [\fI:device\fR]]] .HP \w'\fBgegps\fR\ 'u \fBgegps\fR [\-d\ \fIdirectory\fR] [\-i] .SH "DESCRIPTION" .PP These are the demonstration clients shipped with gpsd\&. They have some common options: .PP The \fB\-h\fR option causes each client to emit a summary of its options and then exit\&. .PP The \fB\-V\fR option causes each client to dump the package version and exit\&. .PP The \fB\-l\fR option, when present, sets the format of latitude and longitude reports\&. The value \*(Aqd\*(Aq produces decimal degrees and is the default\&. The value \*(Aqm\*(Aq produces degrees and decimal minutes\&. The value \*(Aqs\*(Aq produces degrees, minutes, and decimal seconds\&. .PP xgps, cgps, and lcdgps look at variables in the environment to figure out what units they should default to using for display \(em imperial, nautical, or metric\&. Here are the variables and values they check: .sp .if n \{\ .RS 4 .\} .nf GPSD_UNITS one of: imperial = miles/feet nautical = knots/feet metric = km/meters LC_MEASUREMENT en_US = miles/feet C = miles/feet POSIX = miles/feet [other] = km/meters LANG en_US = miles/feet C = miles/feet POSIX = miles/feet [other] = km/meters .fi .if n \{\ .RE .\} .PP These preferences may be overridden by the \fB\-u\fR option\&. .PP Where present, the \fB\-u\fR option can be used to set the system units for display; follow the keyword with \*(Aqi\*(Aq for \*(Aqimperial\*(Aq for American units (feet in altitude and error estimates, miles per hour in speeds), \*(Aqn\*(Aq for \*(Aqnautical\*(Aq (feet in altitude and error estimates, knots in speed) or \*(Aqm\*(Aq for \*(Aqmetric\*(Aq (meters in altitude and error estimates, kilometers per hour in speeds)\&. .PP The \fB\-D\fR option, when present, sets a debug level; it is primarily for use by GPSD developers\&. It enables various progress messages to standard error\&. .PP By default, clients collect data from all compatible devices on localhost, using the default GPSD port 2947\&. An optional argument to any client may specify a server to get data from\&. A colon\-separated suffix is taken as a port number\&. If there is a second colon\-separated suffix, that is taken as a specific device name to be watched\&. However, if the server specification contains square brackets, the part inside them is taken as an IPv6 address and port/device suffixes are only parsed after the trailing bracket\&. Possible cases look like this: .PP localhost:/dev/ttyS1 .RS 4 Look at the default port of localhost, trying both IPv4 and IPv6 and watching output from serial device 1\&. .RE .PP example\&.com:2317 .RS 4 Look at port 2317 on example\&.com, trying both IPv4 and IPv6\&. .RE .PP 71\&.162\&.241\&.5:2317:/dev/ttyS3 .RS 4 Look at port 2317 at the specified IPv4 address, collecting data from attached serial device 3\&. .RE .PP [FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:2317:/dev/ttyS5 .RS 4 Look at port 2317 at the specified IPv6 address, collecting data from attached serial device 5\&. .RE .PP Not all clients shipped with GPSD are documented here\&. See also the separate manual pages for \fBgpspipe\fR(1) and \fBgpsmon\fR(1)\&. .SS "xgps" .PP xgps is a simple test client for gpsd with an X interface\&. It displays current GPS position/time/velocity information and (for GPSes that support the feature) the locations of accessible satellites\&. .PP In the sky view, satellites are color\-coded to indicate quality of signal; consult the data display to the left for exact figures in dB\&. Square icons indicate WAAS/EGNOS satellites, circles indicate ordinary GPS satellites\&. Filled icons were used in the last fix, outline icons were not\&. .SS "xgpsspeed" .PP xgpsspeed is a speedometer that uses position information from the GPS\&. It accepts an \-h option and optional argument as for gps, or a \-V option to dump the package version and exit\&. .PP The default display mode resembles a car speedometer\&. With the option \-\-nautical you get a more elaborate speed and track presentation modeled after a marine navigation display\&. .PP The \-speedunits option can be used to set the speed units for display; follow the keyword with knots for nautical miles per hour, kph for kilometres per hour, or mph for miles per hour\&. The default is miles per hour\&. .PP In the nautical mode only, \-\-maxspeed sets the maximum on the speedometer\&. .SS "cgps" .PP cgps is a client resembling xgps, but without the pictorial satellite display and able to run on a serial terminal or terminal emulator\&. .PP The \fB\-s\fR option prevents cgps from displaying the data coming from the daemon\&. This display can also be toggled with the s command\&. .PP The \fB\-m\fR option will display your magnetic heading (as opposed to your true heading)\&. This is a calculated value, not a measured value, and is subject to a potential error of up to two degrees in the areas for which the calculation is valid (currently Western Europe, Alaska, and Lower 48 in the USA)\&. The formulas used are those found in the Aviation Formulary v1\&.43\&. .PP cgps terminates when you send it a SIGHUP or SIGINT; given default terminal settings this will happen when you type Ctrl\-C at it\&. It will also terminate on \*(Aqq\*(Aq .SS "lcdgps" .PP A client that passes gpsd data to lcdproc, turning your car computer into a very expensive and nearly feature\-free GPS receiver\&. Currently assumes a 4x40 LCD and writes data formatted to fit that size screen\&. Also displays 4\- or 6\-character Maidenhead grid square output\&. .SS "gpxlogger" .PP This program collects fixes from gpsd and logs them to standard output in GPX, an XML profile for track logging\&. .PP The output may be composed of multiple tracks\&. A new track is created if there\*(Aqs no fix for an interval specified by the \fB\-i\fR and defaulting to 5 seconds\&. .PP The \fB\-d\fR option tells gpxlogger to run as a daemon in background\&. It requires the \fB\-f\fR option, which directs output to a specified logfile\&. .PP The \fB\-m\fR option sets a minimum move distance in meters (it may include a fractional decimal part)\&. Motions shorter than this will not be logged\&. .PP gpxlogger can use any of the export methods that gpsd supports\&. For a list of these methods, use the \fB\-l\fR\&. To force the method, give the \fB\-e\fR one of the colon\-terminated method names from the \fB\-l\fR table\&. .PP If D\-Bus support is available on the host, GPSD is configured to use it, and \fB\-e dbus\fR is specified, this program listens to DBUS broadcasts from gpsd via org\&.gpsd\&.fix\&. .PP With \fB\-e sockets\fR, or if sockets is the method defaulted to, you may give a server\-port\-device specification as arguments\&. .SS "gegps" .PP This program collects fixes from gpsd and feeds them to a running instance of Google Earth for live location tracking\&. .PP The \fB\-d\fR argument is the location of the Google Earth installation directory\&. If not specified, it defaults to the current directory\&. .PP If you have the free (non\-subscription) version, start by running with the \fB\-i\fR option to drop a clue in the Google Earth installation directory, as \*(AqOpen_in_Google_Earth_RT_GPS\&.kml\*(Aq, then open that file in Places (File > Open\&.\&.\&.)\&. Run gpsd in the normal way after that\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsfake\fR(1), \fBgpsctl\fR(1), \fBgpscat\fR(1), \fBgpsprof\fR(1)\&. \fBgpspipe\fR(1)\&. \fBgpsmon\fR(1)\&. .SH "AUTHORS" .PP Remco Treffcorn, Derrick Brashear, Russ Nelson & Eric S\&. Raymond, Jeff Francis (cgps)\&. Amaury Jacquot & Petter Reinholdtsen (gpxlogger)\&. Chris Kuethe (gpxlogger), Chen Wei (gegps & xgpsspeed), Robin Wittler (xgpsspeed)\&. .PP This manual page by Eric S\&. Raymond gpsd-3.15/cgps.10000664000175000017500000000001212533044001011544 0ustar esresr.so gps.1 gpsd-3.15/gpsdecode.10000664000175000017500000001175412533044000012563 0ustar esresr'\" t .\" Title: gpsdecode .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 13 Jul 2005 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSDECODE" "1" "13 Jul 2005" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpsdecode \- decode GPS, RTCM or AIS streams into a readable format .SH "SYNOPSIS" .HP \w'\fBgpsdecode\fR\ 'u \fBgpsdecode\fR [\-c] [\-d] [\-e] [\-j] [\-m] [\-n] [\-s] [\-t\ \fItypelist\fR] [\-u] [\-v] [\-D\ \fIdebuglevel\fR] [\-V] .SH "DESCRIPTION" .PP This tool is a batch\-mode decoder for NMEA and various binary packet formats associated with GPS, AIS, and differential\-correction services\&. It produces a JSON dump on standard output from binary on standard input\&. The JSON is the same format documented in \fBgpsd\fR(8); this tool uses the same decoding logic as gpsd, but with a simpler interface intended for batch processing of data files\&. .PP All sensor\-input formats known to the GPSD project can be decoded by this tool\&. These include: NMEA, AIVDM (the NMEA\-derived sentence format used by AIS, the marine Automatic Identification System), RTCM2, and all supported GPS binary formats (notably including SiRF)\&. See \fBgpsd\fR(8) for applicable standards and known limitations of the decoding logic\&. .PP You can use this tool with \fBnc\fR(1) to examine AIS feeds from AIS pooling services, RTCM feeds from RTCM receivers or NTRIP broadcasters\&. .SH "OPTIONS" .PP The \fB\-d\fR option tells the program to decode packets presented on standard input to standard output\&. This is the default behavior\&. .PP The \fB\-j\fR explicitly sets the output dump format to JSON (the default behavior)\&. .PP With the \fB\-m\fR option, dump minimum lengths for each packet type in the input (ignoring comment packets)\&. This is probably of interest only to GSD developers\&. .PP The \fB\-n\fR enables dumping in generated pseudo\-NME0183\&. .PP The \fB\-e\fR option option tells the program to encode JSON on standard input to JSON on standard output\&. This option is only useful for regression\-testing of the JSON dumping and parsing code\&. .PP The \fB\-s\fR option option tells the program to report AIS Type 24 sentence halves separately rather than attempting to aggregate them\&. .PP The \fB\-t\fR accepts a comma\-separated list of numeric types\&. Packets with a numeric AIS, RTCM2, or RTCM3 type are passed through and output only if they match a type in the list\&. Packets of other kinds (in particular GPS packets) are passed through unconditionally\&. .PP The \fB\-u\fR suppresses scaling of AIS data to float quantities and text expansion of numeric codes\&. A dump with this option is lossless\&. .PP The \fB\-v\fR enables dumping of textual packets to output as they are received on input, immediately preceding corresponding output\&. .PP The \fB\-c\fR sets the AIS dump format to separate fields with an ASCII pipe symbol\&. Fields are dumped in the order they occur in the AIS packet\&. Numerics are not scaled (\-u is forced)\&. Strings are unpacked from six\-bit to full ASCII .PP The \fB\-V\fR option directs the program to emit its version number, then exit\&. .PP The \fB\-D\fR option sets a debug verbosity level\&. It is mainly of interest to developers\&. .SH "AIS DSV FORMAT" .PP With the \fB\-c\fR option, dump lines are values of AIS payload fields, pipe\-separated, in the order that they occur in the payload\&. Spans of fields expressing a date are emitted as an ISO8601 timestamp (look for colons and the trailing Z indicating Zulu/UTC time), and the 19\-bit group of TDMA status fields found at the end of message types 1\-4 are are dumped as a single unsigned integer (in hex preceded by "0x")\&. Unused regional\-authority fields are also dumped (in hex preceded by "0x")\&. Variable\-length binary fields are dumped as an integer bit length, followed by a colon, followed by a hex dump\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgpsctl\fR(1), \fBgpsdctl\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsprof\fR(1), \fBgpsfake\fR(1), .SH "AUTHOR" .PP Eric S\&. Raymond \&. gpsd-3.15/ntpshmmon.10000664000175000017500000001201112533044000012634 0ustar esresr'\" t .\" Title: ntpshmmon .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 25 Jan 2015 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "NTPSHMMON" "1" "25 Jan 2015" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" ntpshmmon \- capture samples from GPS or other ntpd refclock sources .SH "SYNOPSIS" .HP \w'\fBntpshmmon\fR\ 'u \fBntpshmmon\fR [\-c\ \fIcycletime\fR] [\-h] [\-n\ \fInsamples\fR] [\-s] [\-t\ \fIseconds\fR] [\-v] [\-V] .SH "DESCRIPTION" .PP This program monitors the shared\-memory segments updated by \fBgpsd\fR(8) (and possibly other refclock sources) as a way of communicating with ntpd, the Network Time Protocol daemon\&. It reads these in exactly the way an ntpd instance does\&. It can be run concurrently with ntpd without interfering with ntpd\*(Aqs normal operation\&. .PP This program runs forever, or until a termination option is matched, or until interrupted, generating sample reports to standard output\&. Each line consists of whitespace\-separated textual fields\&. .PP Here is an example of the beginning of a report file: .sp .if n \{\ .RS 4 .\} .nf ntpshmmon version 1 # Name Seen@ Clock Real L Prec sample NTP2 1424926256\&.443030206 1424926256\&.115869233 1424926256\&.000000000 0 \-1 sample NTP3 1424926256\&.443060517 1424926255\&.995430821 1424926256\&.000000000 0 \-20 sample NTP3 1424926256\&.995747347 1424926256\&.995422728 1424926257\&.000000000 0 \-20 sample NTP2 1424926257\&.112433572 1424926257\&.111936726 1424926257\&.000000000 0 \-1 sample NTP3 1424926257\&.996221153 1424926257\&.995410232 1424926258\&.000000000 0 \-20 sample NTP2 1424926258\&.107769409 1424926258\&.107451006 1424926258\&.000000000 0 \-1 sample NTP3 1424926258\&.995647636 1424926258\&.995406476 1424926259\&.000000000 0 \-20 .fi .if n \{\ .RE .\} .PP The output always begins with a header line expressing the version of the output format; the version line begins with "ntpshmmon version" and is followed by a numeric version field\&. .PP The remainder of the file is either commments or sample lines\&. A comment line begins with a # and should ignored by programs that interpret this format\&. This program never generates such lines itself\&. .PP The fields of a sample line are as follows: .sp .RS 4 .ie n \{\ \h'-04' 1.\h'+01'\c .\} .el \{\ .sp -1 .IP " 1." 4.2 .\} The keyword "sample" .RE .sp .RS 4 .ie n \{\ \h'-04' 2.\h'+01'\c .\} .el \{\ .sp -1 .IP " 2." 4.2 .\} The NTP unit from which it was collected\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 3.\h'+01'\c .\} .el \{\ .sp -1 .IP " 3." 4.2 .\} Collection time of day, seconds\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 4.\h'+01'\c .\} .el \{\ .sp -1 .IP " 4." 4.2 .\} Receiver time of day, seconds\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 5.\h'+01'\c .\} .el \{\ .sp -1 .IP " 5." 4.2 .\} Clock time of day, seconds\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 6.\h'+01'\c .\} .el \{\ .sp -1 .IP " 6." 4.2 .\} Leap\-second notification status\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 7.\h'+01'\c .\} .el \{\ .sp -1 .IP " 7." 4.2 .\} Source precision (log(2) of source jitter)\&. .RE .PP In these fields, "clock time" is the high\-precision time measured by the source and "receiver time" is Unix UTC time at the receiver\&. It is normal for the seconds part of receiver time to coincide with the seconds part of collection time and for the nanoseconds part of receiver time to be zero\&. .PP \-v .RS 4 Enable verbose status messages\&. .RE .PP \-c .RS 4 Device poll interval in fractional seconds \- defaults to 1\&. .RE .PP \-n .RS 4 Set maximum number of samples to collect\&. .RE .PP \-s .RS 4 Remove all segments specified by the units argument\&. This option will normally only be of interest to GPSD developers\&. .RE .PP \-t .RS 4 Set maximum time to collect samples in seconds\&. .RE .PP \-h .RS 4 Display program usage and exit\&. .RE .PP \-V .RS 4 Display program version and exit\&. .RE .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgpsdctl\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsprof\fR(1), \fBgpsfake\fR(1)\&. .SH "AUTHOR" .PP Eric S\&. Raymond \&. gpsd-3.15/xgpsspeed.10000664000175000017500000000001212533044001012612 0ustar esresr.so gps.1 gpsd-3.15/xgps.10000664000175000017500000000001212533044001011571 0ustar esresr.so gps.1 gpsd-3.15/gegps.10000664000175000017500000000001212533044001011715 0ustar esresr.so gps.1 gpsd-3.15/gpscat.10000664000175000017500000000736212533044001012110 0ustar esresr'\" t .\" Title: gpscat .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 16 Nov 2006 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSCAT" "1" "16 Nov 2006" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpscat \- dump the output from a GPS .SH "SYNOPSIS" .HP \w'\fBgpscat\fR\ 'u \fBgpscat\fR [\-s\ \fIspeed\fR] [\-p] [\-t] [\-D\ \fIdebuglevel\fR] \fIfile\-or\-serial\-port\fR .SH "DESCRIPTION" .PP gpscat is a simple program for logging and packetizing GPS data streams\&. It takes input from a specified file or serial device (presumed to have a GPS attached) and reports to standard output\&. The program runs until end of input or it is interrupted by ^C or other means\&. It does not terminate on a bad backet; this is intentional\&. .PP In raw mode (the default) gpscat simply dumps its input to standard output\&. Nonprintable characters other than ASCII whitespace are rendered as hexadecimal string escapes\&. .PP In packetizing mode, gpscat uses the same code as \fBgpsd\fR(8)\*(Aqs packet sniffer to break the input into packets\&. Packets are reported one per line; line breaks in the packets themselves are escaped\&. .PP This program is useful as a sanity checker when examining a new device\&. It can be used as a primitive NMEA logger, but beware that (a) interrupting it likely to cut off output in mid\-sentence, and (b) to avoid displaying incomplete NMEA sentences right up next to shell prompts that often contain a $, raw mode always emits an extra final linefeed\&. .PP Also, be aware that packetizing mode will produce useless results \(em probably consuming the entirety of input and appearing to hang \(em if it is fed data that is not a sequence of packets of one of the known types\&. .PP The program accepts the following options: .PP \-p .RS 4 Invoke packetizer mode\&. .RE .PP \-s .RS 4 Set the port\*(Aqs baud rate (and optionally its parity and stop bits) before reading\&. Argument should begin with one of the normal integer baud rates (300, 1200, 4800, 9600, 19200, 38400, etc\&.)\&. It may be followed by an optional suffix [NOE][12] to set parity (None, Even, Odd) and stop bits (1 or 2)\&. .RE .PP \-t .RS 4 Invoke packetizer mode, with the packet type and length (in parentheses) reported before a colon and space on each line\&. .RE .PP \-D .RS 4 In packetizer mode, enable progress messages from the packet getter\&. Probably only of interest to developers testing packet getter changes\&. .RE .PP \-h .RS 4 Display program usage and exit\&. .RE .PP Specifying \-s 4800N1 is frequently helpful with unknown devices\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsfake\fR(1)\&. \fBgpsprof\fR(1), \fBgpsctl\fR(1), \fBgpsdctl\fR(8), \fBgpsmon\fR(1)\&. .SH "AUTHOR" .PP Eric S\&. Raymond \&. gpsd-3.15/gpsfake.10000664000175000017500000002066412533044001012247 0ustar esresr'\" t .\" Title: gpsfake .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 12 Feb 2005 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSFAKE" "1" "12 Feb 2005" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpsfake \- test harness for gpsd, simulating a GPS .SH "SYNOPSIS" .HP \w'\fBgpsfake\fR\ 'u \fBgpsfake\fR [\-1] [\-h] [\-b] [\-c\ \fIinterval\fR] [\-i] [\-D\ \fIdebuglevel\fR] [\-l] [\-m\ \fImonitor\fR] [\-g] [\-n] [\-o\ \fIoptions\fR] [\-p] [\-P\ \fIport\fR] [\-r\ \fIinitcmd\fR] [\-s\ \fIspeed\fR] [\-S] [\-u] [\-t] [\-v] [\fIlogfile\fR...] .SH "DESCRIPTION" .PP gpsfake is a test harness for gpsd and its clients\&. It opens a pty (pseudo\-TTY), launches a gpsd instance that thinks the slave side of the pty is its GPS device, and repeatedly feeds the contents of one or more test logfiles through the master side to the GPS\&. If there are multiple logfiles, sentences from them are interleaved in the order the files are specified\&. .PP gpsfake does not require root privileges, and can be run concurrently with a production gpsd instance without causing problems\&. .PP The logfiles may contain packets in any supported format, including in particular NMEA, SiRF, TSIP, or Zodiac\&. Leading lines beginning with # will be treated as comments and ignored, except in the following special cases: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} a comment of the form #Date: yyyy\-mm\-dd (ISO8601 date format) may be used to set the initial date for the log\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} a comment of the form #Serial: [0\-9]* [78][NOE][12] may be used to set serial parameters for the log \- baud rate, word length, stop bits\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} a comment of the form #Transport: UDP may be used to fake a UDP source rather than the normal pty\&. .RE .PP The gpsd instance is run in foreground\&. The thread sending fake GPS data to the daemon is run in background\&. .SH "OPTIONS" .PP With the \-1 option, the logfile is interpreted once only rather than repeatedly\&. This option is intended to facilitate regression testing\&. .PP The \fB\-b\fR enables a twirling\-baton progress indicator on standard error\&. At termination, it reports elapsed time\&. .PP The \fB\-c\fR sets the delay between sentences in seconds\&. Fractional values of seconds are legal\&. The default is zero (no delay)\&. .PP The \fB\-l\fR makes the program dump a line or packet number just before each sentence is fed to the daemon\&. If the sentence is textual (e\&.g\&. NMEA), the text is dumped as well\&. If not, the packet will be dumped in hexadecimal (except for RTCM packets, which aren\*(Aqt dumped at all)\&. This option is useful for checking that gpsfake is getting packet boundaries right\&. .PP The \fB\-i\fR is for single\-stepping through logfiles\&. It dumps the line or packet number (and the sentence if the protocol is textual) followed by "? "\&. Only when the user keys Enter is the line actually fed to gpsd\&. .PP The \fB\-m\fR specifies a monitor program inside which the daemon should be run\&. This option is intended to be used with \fBvalgrind\fR(1), \fBgdb\fR(1) and similar programs\&. .PP The \fB\-g\fR uses the monitor facility to run the gpsd instance within gpsfake under control of gdb\&. .PP The \fB\-o\fR specifies options to pass to the daemon\&. The \-n option passes \-n to start the daemon reading the GPS without waiting for a client (equivalent to \-o "\-n")\&. The \fB\-D\fR passes a \-D option to the daemon: thus \-D 4 is shorthand for \-o "\-D 4"\&. .PP The \-p ("pipe") option sets watcher mode and dumps the NMEA and GPSD notifications generated by the log to standard output\&. This is useful for regression\-testing\&. .PP The \-P ("port") option sets the daemon\*(Aqs listening port\&. .PP The \fB\-r\fR specifies an initialization command to use in pipe mode\&. The default is \fB?WATCH={"enable":true,"json":true}\fR\&. .PP The \fB\-s\fR sets the baud rate for the slave tty\&. The default is 4800\&. .PP The option \-S tells gpsfake to insert realistic delays in the test input rather than trying to stuff it through the daemon as fast as possible\&. This will make the test(s) run much slower, but avoids flaky failures due to machine lode and possible race conditions in the pty layer\&. .PP The \fB\-t\fR forces the test framework to use TCP rather than pty devices\&. Besides being a test of TCP source handling, this may be useful for testing from within chroot jails where access to pty devices is locked out\&. .PP The \fB\-u\fR forces the test framework to use UDP rather than pty devices\&. Besides being a test of UDP source handling, this may be useful for testing from within chroot jails where access to pty devices is locked out\&. .PP The \fB\-v\fR enables verbose progress reports to stderr\&. It is mainly useful for debugging gpsfake itself\&. .PP The \fB\-x\fR dumps packets as gpsfake gathers them\&. It is mainly useful for debugging gpsfake itself\&. .PP The \fB\-h\fR makes gpsfake print a usage message and exit\&. .PP The argument must be the name of a file containing the data to be cycled at the device\&. gpsfake will print a notification each time it cycles\&. .PP Normally, gpsfake creates a pty for each logfile and passes the slave side of the device to the daemon\&. If the header comment in the logfile contains the string "UDP", packets are instead shipped via UDP port 5000 to the address 192\&.168\&.0\&.1\&.255\&. You can monitor them with this: \fBtcpdump \-s0 \-n \-A \-i lo udp and port 5000\fR\&. .SH "MAGIC COMMENTS" .PP Certain magic comments in test load headers can change the conditions of the test\&. These are: .PP Serial: .RS 4 May contain a serial\-port setting such as 4800 7N2 \- baud rate followed by 7 or 8 for byte length, N or O or E for parity and 1 or 2 for stop bits\&. The test is run with those settings on the slave port that the daemon sees\&. .RE .PP Transport: .RS 4 Values \*(AqTCP\*(Aq and \*(AqUDP\*(Aq force the use of TCP and UDP feeds respectively (the default is a pty)\&. .RE .PP Delay\-Cookie: .RS 4 Must be followed by two whitespace\-separated fields, a delimiter character and a numeric delay in seconds\&. Instead of being broken up by packet boundaries, the test load is split on the delimiters\&. The delay is performed after each feed\&. Can be useful for imposing write boundaries in the middle of packets\&. .RE .SH "CUSTOM TESTS" .PP gpsfake is a trivial wrapper around a Python module, also named gpsfake, that can be used to fully script sessions involving a gpsd instance, any number of client sessions, and any number of fake GPSes feeding the daemon instance with data from specified sentence logs\&. .PP Source and embedded documentation for this module is shipped with the gpsd development tools\&. You can use it to torture\-test either gpsd itself or any gpsd\-aware client application\&. .PP Logfiles for the use with gpsfake can be retrieved using gpspipe, gpscat, or gpsmon from the gpsd distribution, or any other application which is able to create a compatible output\&. .PP If gpsfake exits with "Cannot execute gpsd: executable not found\&." the environment variable GPSD_HOME can be set to the path where gpsd can be found\&. (instead of adding that folder to the PATH environment variable .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsctl\fR(1), \fBgpspipe\fR(1), \fBgpsprof\fR(1)\fBgpsmon\fR(1)\&. .SH "AUTHOR" .PP Eric S\&. Raymond \&. gpsd-3.15/gpsprof.10000664000175000017500000001361212533044001012302 0ustar esresr'\" t .\" Title: gpsprof .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 10 Feb 2005 .\" Manual: GPSD Documentation .\" Source: The GPSD Project .\" Language: English .\" .TH "GPSPROF" "1" "10 Feb 2005" "The GPSD Project" "GPSD Documentation" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gpsprof \- profile a GPS and gpsd, plotting latency information .SH "SYNOPSIS" .HP \w'\fBgpsprof\fR\ 'u \fBgpsprof\fR [\-f\ \fIplot_type\fR] [\-m\ \fIthreshold\fR] [\-n\ \fIpacketcount\fR] [\-t\ \fItitle\fR] [\-T\ \fIterminal\fR] [\-d\ \fIdumpfile\fR] [\-l\ \fIlogfile\fR] [\-r] [\-D\ \fIdebuglevel\fR] [\-h] [[server[:port[:device]]]] .SH "DESCRIPTION" .PP gpsprof performs accuracy, latency, and time drift profiling on a GPS\&. It emits to standard output a GNUPLOT program that draws one of several illustrative graphs\&. It can also be told to emit the raw profile data\&. .PP Information from the default spatial plot it provides can be useful for establishing an upper bound on latency, and thus on position accuracy of a GPS in motion\&. .PP gpsprof uses instrumentation built into gpsd\&. .PP To display the graph, use \fBgnuplot\fR(1)\&. Thus, for example, to display the default spatial scatter plot, do this: .sp .if n \{\ .RS 4 .\} .nf gpsprof | gnuplot \-persist .fi .if n \{\ .RE .\} .PP To generate an image file: .sp .if n \{\ .RS 4 .\} .nf gpsprof \-T png | gnuplot >image\&.png .fi .if n \{\ .RE .\} .sp .SH "OPTIONS" .PP The \-f option sets the plot type\&. The X axis is samples (either sentences with timestamps or PPS time drift messages)\&. The Y axis is normally latency in seconds, except for the spatial plot\&. Currently the following plot types are defined: .PP space .RS 4 Generate a scattergram of fixes and plot a probable\-error circle\&. This data is only meaningful if the GPS is held stationary while gpsprof is running\&. This is the default\&. .RE .PP time .RS 4 Plot delta of system clock (NTP corrected time) against GPS time as reported in PPS messages\&. .RE .PP uninstrumented .RS 4 Plot total latency without instrumentation\&. Useful mainly as a check that the instrumentation is not producing significant distortion\&. It only plots times for reports that contain fixes; staircase\-like artifacts in the plot are created when elapsed time from reports without fixes is lumped in\&. .RE .PP instrumented .RS 4 Plot instrumented profile\&. Plots various components of the total latency between the GPS\*(Aqs fix time fix and when the client receives the fix\&. .RE .PP For purposes of the description, below, start\-of\-reporting\-cycle (SORC) is when a device\*(Aqs reporting cycle begins\&. This time is detected by watching to see when data availability follows a long enough amount of quiet time that we can be sure we\*(Aqve seen the gap at the end of the sensor\*(Aqs previous report\-transmission cycle\&. Detecting this gap requires a device running at 9600bps or faster\&. .PP Similarly, EORC is end\-of\-reporting\-cycle; when the daemon has seen the last sentence it needs in the reporting cycle and ready to ship a fix to the client\&. .PP The components of the instrumented plot are as follows: .PP Fix latency .RS 4 Delta between GPS time and SORC\&. .RE .PP RS232 time .RS 4 RS232 transmission time for data shipped during the cycle (computed from character volume and baud rate)\&. .RE .PP Analysis time .RS 4 EORC, minus SORC, minus RS232 time\&. The amount of real time the daemon spent on computation rather than I/O\&. .RE .PP Reception time .RS 4 Shipping time from the daemon to when it was received by gpsprof\&. .RE .PP Because of RS232 buffering effects, the profiler sometimes generates reports of ridiculously high latencies right at the beginning of a session\&. The \-m option lets you set a latency threshold, in multiples of the cycle time, above which reports are discarded\&. .PP The \-n option sets the number of packets to sample\&. The default is 100\&. .PP The \-t option sets a text string to be included in the plot title\&. .PP The \-T option generates a terminal type setting into the gnuplot code\&. Typical usage is "\-T png" telling gnuplot to write a PNG file\&. Without this option gnuplot will call its X11 display code\&. .PP The \-d option dumps the plot data, without attached gnuplot code, to a specified file for post\-analysis\&. .PP The \-l option dumps the raw JSON reports collected from the device to a specified file\&. .PP The \-r option replots from a JSON logfile (such as \-l produces) on standard input\&. Both \-n and \-l options are ignored when this one is selected\&. .PP The \-h option makes gpsprof print a usage message and exit\&. .PP The \-D sets debug level\&. .PP Sending SIGUSR1 to a running instance causes it to write a completion message to standard error and resume processing\&. The first number in the startup message is the process ID to signal\&. .SH "SEE ALSO" .PP \fBgpsd\fR(8), \fBgps\fR(1), \fBlibgps\fR(3), \fBlibgpsd\fR(3), \fBgpsfake\fR(1), \fBgpsctl\fR(1), \fBgpscat\fR(1), \fBgnuplot\fR(1)\&. .SH "AUTHOR" .PP Eric S\&. Raymond \&. gpsd-3.15/packaging/rpm/gpsd.spec0000444000175000017500000003733312533605314015107 0ustar esresr%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")} Name: gpsd Version: 3.15 Release: 1%{?dist} Summary: Service daemon for mediating access to a GPS Group: System Environment/Daemons License: BSD URL: https://savannah.nongnu.org/projects/gpsd/ Source0: http://download-mirror.savannah.gnu.org/releases/gpsd//%{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: bluez-libs-devel BuildRequires: chrpath BuildRequires: dbus-devel BuildRequires: dbus-glib-devel BuildRequires: desktop-file-utils BuildRequires: gcc-c++ BuildRequires: libXaw-devel BuildRequires: ncurses-devel BuildRequires: python-devel BuildRequires: qt-devel BuildRequires: scons BuildRequires: xmlto %if 0%{?fedora} >= 16 BuildRequires: pps-tools-devel %endif Requires: udev Requires(post): /sbin/ldconfig Requires(post): /sbin/chkconfig Requires(postun): /sbin/ldconfig Requires(preun): initscripts Requires(preun): /sbin/chkconfig %description gpsd is a service daemon that mediates access to a GPS sensor connected to the host computer by serial or USB interface, making its data on the location/course/velocity of the sensor available to be queried on TCP port 2947 of the host computer. With gpsd, multiple GPS client applications (such as navigational and wardriving software) can share access to a GPS without contention or loss of data. Also, gpsd responds to queries with a format that is substantially easier to parse than NMEA 0183. %package devel Summary: Client libraries in C and Python for talking to a running gpsd or GPS Group: Development/Libraries Requires: %{name} = %{version}-%{release} Requires: pkgconfig %description devel This package provides C header files and python modules for the gpsd shared libraries that manage access to a GPS for applications %package -n libQgpsmm Summary: Qt Client libraries for talking to a running gpsd or GPS Group: Development/Libraries Requires: %{name} = %{version}-%{release} Requires: qt Requires: pkgconfig %description -n libQgpsmm This package provides Qt shared libraries that manage access to a GPS for Qt applications %package clients Summary: Clients for gpsd Group: Applications/System Requires: clients-x11 = %{version}-%{release} Requires: clients-cli = %{version}-%{release} %package clients-x11 Summary: Clients for gpsd Group: Applications/System Requires: xorg-x11-xinit %package clients-cli Summary: Clients for gpsd Group: Applications/System %package clients-httpd Summary: Clients for gpsd Group: Applications/System Requires: httpd Requires: perl Requires: perl(Net::GPSD3) Requires: perl(GD::Graph::Polar) Requires: perl(CGI) Requires: perl(CGI::Carp) %description clients Installs X11 and Command Line Interface clients. %description clients-x11 xgps is a simple test client for gpsd with an X interface. It displays current GPS position/time/velocity information and (for GPSes that support the feature) the locations of accessible satellites. xgpsspeed is a speedometer that uses position information from the GPS. It accepts an -h option and optional argument as for gps, or a -v option to dump the package version and exit. Additionally, it accepts -rv (reverse video) and -nc (needle color) options. %description clients-cli cgps resembles xgps, but without the pictorial satellite display. It can run on a serial terminal or terminal emulator. %description clients-httpd pgps is a Perl CGI client for gpsd. It displays current GPS position/time/velocity information and (for GPSes that support the feature) the locations of accessible satellites. This package installs the CGI scripts at http://localhost/gpsd/. %prep %setup -q %build #Note: prefix must be set to / since the current scons build only supports relative paths scons %{_smp_mflags} \ prefix=/ \ bindir=%{_bindir} \ includedir=%{_includedir} \ libdir=%{_libdir} \ sbindir=%{_sbindir} \ mandir=%{_mandir} \ docdir=%{_docdir} \ pkgconfigdir=%{_libdir}/pkgconfig scons build %install rm -rf $RPM_BUILD_ROOT export DESTDIR=$RPM_BUILD_ROOT scons install #Apps need man pages! for MAN in gpsprof xgps xgpsspeed gpscat gpxlogger gegps do cp $RPM_BUILD_ROOT%{_mandir}/man1/gps.1 $RPM_BUILD_ROOT%{_mandir}/man1/$MAN.1 done #httpd client %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_var}/www/html/gpsd %{__install} -p -m 0755 packaging/rpm/httpd/skyview.cgi $RPM_BUILD_ROOT%{_var}/www/html/gpsd %{__install} -p -m 0755 packaging/rpm/httpd/pgps.cgi $RPM_BUILD_ROOT%{_var}/www/html/gpsd %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d %{__install} -p -m 0644 packaging/rpm/httpd/gpsd.conf $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf.d/gpsd.conf # init scripts %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_sysconfdir}/init.d %{__install} -p -m 0755 packaging/rpm/gpsd.init $RPM_BUILD_ROOT%{_sysconfdir}/init.d/gpsd %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig %{__install} -p -m 0644 packaging/rpm/gpsd.sysconfig $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/gpsd # udev rules %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_sysconfdir}/udev/rules.d %{__install} -p -m 0644 gpsd.rules $RPM_BUILD_ROOT%{_sysconfdir}/udev/rules.d/99-gpsd.rules # hotplug script #%{__install} -d -m 0755 $RPM_BUILD_ROOT/lib/udev #%{__install} -p -m 0755 gpsd.hotplug gpsd.hotplug.wrapper $RPM_BUILD_ROOT/lib/udev # remove .la files #rm -f $RPM_BUILD_ROOT%{_libdir}/libgps*.la # fix non-executable python script #%{__chmod} +x $RPM_BUILD_ROOT%{python_sitearch}/gps/gps.py # Install the .desktop files desktop-file-install --vendor fedora \ --dir $RPM_BUILD_ROOT%{_datadir}/applications \ --add-category X-Fedora \ packaging/X11/xgps.desktop desktop-file-install --vendor fedora \ --dir $RPM_BUILD_ROOT%{_datadir}/applications \ --add-category X-Fedora \ packaging/X11/xgpsspeed.desktop # Install logo icon for .desktop files %{__install} -d -m 0755 $RPM_BUILD_ROOT%{_datadir}/gpsd %{__install} -p -m 0644 packaging/X11/gpsd-logo.png $RPM_BUILD_ROOT%{_datadir}/gpsd/gpsd-logo.png %clean rm -rf $RPM_BUILD_ROOT %post /sbin/ldconfig /sbin/chkconfig --add %{name} %preun if [ $1 = 0 ]; then /sbin/service %{name} stop > /dev/null 2>&1 || true /sbin/chkconfig --del %{name} fi %postun /sbin/ldconfig %files %defattr(-,root,root,-) %doc README INSTALL COPYING %config(noreplace) %{_sysconfdir}/init.d/%{name} %config(noreplace) %{_sysconfdir}/sysconfig/%{name} %config(noreplace) %{_sysconfdir}/udev/rules.d/* %{_sbindir}/gpsd %{_sbindir}/gpsdctl %{_bindir}/gpsprof %{_bindir}/gpsmon %{_bindir}/gpsctl %{_bindir}/gegps %{_bindir}/gps2udp %{_libdir}/libgps*.so.* #/lib/udev/gpsd* %{python_sitearch}/gps* %{_mandir}/man8/gpsd.8* %{_mandir}/man8/gpsdctl.8* %{_mandir}/man8/gpsinit.8.* %{_mandir}/man1/gpsprof.1* %{_mandir}/man1/gpsmon.1* %{_mandir}/man1/gegps.1* %{_mandir}/man1/gps2udp.1* %{_mandir}/man1/gpsctl.1* %{_mandir}/man5/gpsd_json.5* %files devel %defattr(-,root,root,-) %doc TODO %{_bindir}/gpsfake %{_libdir}/libgps*.so %{_libdir}/pkgconfig/*.pc %{python_sitearch}/gps/fake* %{_includedir}/gps.h %{_includedir}/libgpsmm.h %{_mandir}/man1/gpsfake.1* %{_mandir}/man3/libgps.3* %{_mandir}/man3/libgpsmm.3* %{_mandir}/man5/srec.5* %files -n libQgpsmm %defattr(-,root,root,-) %{_qt4_libdir}/libQgpsmm.so* %{_qt4_libdir}/libQgpsmm.prl %{_mandir}/man3/libQgpsmm.3* %files clients %defattr(-,root,root,-) %{_mandir}/man1/gps.1* %files clients-x11 %defattr(-,root,root,-) %{_bindir}/xgps %{_bindir}/xgpsspeed %{_mandir}/man1/xgps.1* %{_mandir}/man1/xgpsspeed.1* %{_datadir}/applications/*.desktop %dir %{_datadir}/gpsd %{_datadir}/gpsd/gpsd-logo.png %files clients-cli %defattr(-,root,root,-) %{_bindir}/cgps %{_bindir}/gpscat %{_bindir}/gpsdecode %{_bindir}/gpspipe %{_bindir}/gpxlogger %{_bindir}/lcdgps %{_mandir}/man1/cgps.1* %{_mandir}/man1/gpscat.1* %{_mandir}/man1/gpsdecode.1* %{_mandir}/man1/gpspipe.1* %{_mandir}/man1/lcdgps.1* %{_mandir}/man1/gpxlogger.1* %files clients-httpd %defattr(-,root,root,-) %config(noreplace) %{_sysconfdir}/httpd/conf.d/gpsd.conf %dir %{_var}/www/html/gpsd/ %attr(0755,root,root) %{_var}/www/html/gpsd/skyview.cgi %attr(0755,root,root) %{_var}/www/html/gpsd/pgps.cgi %changelog * Mon Mar 23 00:11:00 EDT 2015Eric S. Raymond 3.15-1 - We no longer export libgpsd. * Sun Jul 31 2011 Michael R. Davis 3.0-2 - Added gegps, gpsdctl - Dropped hotplug wrapper - Removed tabs to pass rpmlint tests - Updated scons install paths - Updated scons build paths * Sat Jun 25 2011 Eric S. Raymond 3.0-2 - Minor changes from the refactoring of the hotplug system. * Fri May 13 2011 Michael R. Davis 3.0-1 - Added httpd Perl client package - Separated x11 and cli packages * Mon Apr 18 2011 Michael R. Davis 3.0-1 - Updates to support SCons software construction tool - Added httpd Perl client - macro _buildrootdir does not exist in EPEL 4 & 5 * Mon Jul 05 2010 Michael R. Davis - 2.95-3 - Updated to move rpm files to packaging/rpm folder - Renamed gpsd-qt to libQgpsmm * Sun Jul 04 2010 Michael R. Davis - 2.95-2 - missing X11/app-defaults/xgpsspeed * Sat Jul 03 2010 Michael R. Davis - 2.95-1 - back ported spec to gpsd from Fedora 14 - updated to 2.95 - added gpsd-qt package * Thu May 06 2010 Miroslav Lichvar - 2.94-1 - update to 2.94 (#556642) * Tue Mar 02 2010 Miroslav Lichvar - 2.39-7 - don't use deprecated SYSFS{} in udev rules (#569089) - fix init script LSB compliance * Mon Feb 15 2010 Miroslav Lichvar - 2.39-6 - fix linking with --no-add-needed (#564662) - use %%global macro instead of %%define * Wed Aug 12 2009 Marek Mahut - 2.39-5 - RHBZ#505588: gpsd has a broken initscript that fails to launch daemon * Fri Jul 24 2009 Fedora Release Engineering - 2.39-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild * Tue Mar 31 2009 Tom "spot" Callaway - 2.39-3 - some of the gpsd client bits went into gpsdclient.h, but that file wasn't getting installed - specifically, viking needs that header to build. * Wed Mar 25 2009 Douglas E. Warner - 2.39-2 - adding patch to try to fix parallel make errors * Thu Mar 19 2009 Douglas E. Warner - 2.39-1 - updating to 2.39 - fixed potential core dump in C client handling of "K" responses - Made device hotplugging work again; had been broken by changes in udev - Introduced major and minor API version symbols into the public interfaces - The sirfmon utility is gone, replaced by gpsmon which does the same job for multiple GPS types - Fixed a two-year old error in NMEA parsing that nobody noticed because its only effect was to trash VDOP values from GSA sentences, and gpsd computes those with an internal error model when they look wonky - cgpxlogger has been merged into gpxlogger - Speed-setting commands now allow parity and stop-bit setting if the GPS chipset and adaptor can support it - Specfile and other packaging paraphenalia now live in a packaging subdirectory - rtcmdecode becomes gpsdecode and can now de-armor and dump AIDVM packets - The client library now work correctly in locales where the decimal separator is not a period * Mon Mar 16 2009 Douglas E. Warner - 2.38-1 - updating to 2.38 - creating init script and sysconfig files - migrating hotplug rules to udev + hotplug wrapper script from svn r5147 - updating pyexecdir patch - fixing udev rule subsystem match - Regression test load for RoyalTek RGM3800 and Blumax GPS-009 added - Scaling on E error-estimate fields fixed to match O - Listen on localhost only by default to avoid security problems; this can be overridden with the -G command-line option - The packet-state machine can now recognize RTCM3 packets, though support is not yet complete - Added support for ublox5 and mkt-3301 devices - Add a wrapper around gpsd_hexdump to save CPU - Lots of little fixes to various packet parsers - Always keep the device open: "-n" is not optional any more - xgpsspeed no longer depends on Motif - gpsctl can now ship arbitrary payloads to a device; It's possible to send binary through the control channel with the new "&" command - Experimental new driver for Novatel SuperStarII - The 'g' mode switch command now requires, and returns, 'rtcm104v2' rather than 'rtcm104'; this is design forward for when RTCM104v2 is fully working * Tue Feb 24 2009 Fedora Release Engineering - 2.37-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild * Sat Nov 29 2008 Ignacio Vazquez-Abrams - 2.37-3 - Rebuild for Python 2.6 * Wed Mar 19 2008 Douglas E. Warner - 2.37-2 - moving gpspacket.so python lib to main package * Wed Feb 27 2008 Douglas E. Warner - 2.37-1 - update to 2.37 - removed install-gpsd_config.h.patch - installed pkgconfig files in devel package - added patch to install python modules in sitearch - removing rpath from inclucded libtool - moving X11 app-defaults to datadir - using macros for commands in install; using install instead of cp and mkdir - cleaning up spaces/tabs for rpmlint * Tue Feb 19 2008 Fedora Release Engineering - 2.34-9 - Autorebuild for GCC 4.3 * Sun Aug 19 2007 Matthew Truch - 2.34-8 - Patch Makefile to also install gpsd_config.h as needed by libgpsmm.h. Redhat BZ 253433. * Sat Jun 30 2007 Matthew Truch - 2.34-7 - Make sure the logo is actually included (via the spec file). I need to wake up before I try even trivial updates. * Sat Jun 30 2007 Matthew Truch - 2.34-6 - Learn how to use search and replace (aka fix all instances of gpsd-logo.png spelled incorrectly as gspd-logo.png). * Sat Jun 30 2007 Matthew Truch - 2.34-5 - Fix desktop file and logo file name. * Sat Jun 30 2007 Matthew Truch - 2.34-4 - Include icon for .desktop files per BZ 241428 * Tue Mar 20 2007 Michael Schwendt - 2.34-3 - Bump release for FE5 -> Fedora 7 upgrade path. * Tue Feb 27 2007 Matthew Truch - 2.34-2 - BR python-devel instead of python to make it build. * Tue Feb 27 2007 Matthew Truch - 2.34-1 - Upgrade to 2.34. - Get rid of %%makeinstall (which was never needed). - Possibly fix hotplug issuses (BZ 219750). - Use %%python_sitelib for python site-files stuff. * Sat Dec 9 2006 Matthew Truch - 2.33-6 - Rebuild to pull in new version of python. * Tue Sep 26 2006 Matthew Truch - 2.33-5 - Remove openmotif requirment, and switch to lesstif. * Mon Aug 28 2006 Matthew Truch - 2.33-4 - Bump release for rebuild in prep. for FC6. * Thu Jul 20 2006 Matthew Truch - 2.33-3 - Actually, was a missing BR glib-dbus-devel. Ooops. * Thu Jul 20 2006 Matthew Truch - 2.33-2 - Missing BR glib-devel * Thu Jul 20 2006 Matthew Truch - 2.33-1 - Update to version 2.33 * Wed Apr 19 2006 Matthew Truch - 2.32-5 - Don't --enable-tnt in build as it causes some gpses to not work properly with sattelite view mode. See bugzilla bug 189220. * Thu Apr 13 2006 Matthew Truch - 2.32-4 - Add dbus-glib to BuildRequires as needed for build. * Sun Apr 9 2006 Matthew Truch - 2.32-3 - Include xmlto and python in buildrequires so things build right. - Don't package static library file. * Wed Apr 5 2006 Matthew Truch - 2.32-2 - Use ye olde %%{?dist} tag. * Wed Apr 5 2006 Matthew Truch - 2.32-1 - Initial Fedora Extras specfile
{$blurb}

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 Augmentation satellites.

{$map_code}
To get real-time information, connect to telnet://{$advertise}:{$port}/ and type "?POLL;" or "?WATCH={"enable":true,"raw":true}".
Use a different server:
:

The gpsd instance that this page monitors is not running.
%d%d%d%d%s
Current Information
Time (UTC){$ts}
Latitude{$fix['lat']}
Longitude{$fix['lon']}
Altitude{$fix['alt']}
Fix Type{$fix['mode']}
Satellites{$nsv}
HDOP{$sky['hdop']}
VDOP{$sky['vdop']}

$sat
Current Satellites
PRNElevationAzimuthSSUsed