windFixes = NmeaFactory.INSTANCE.readWind(zipInputStream);
+ assertTrue(!Util.isEmpty(windFixes));
+ }
+ }
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector.test/src/com/sap/sailing/nmeaconnector/test/SentenceReaderSupport.java b/java/com.sap.sailing.nmeaconnector.test/src/com/sap/sailing/nmeaconnector/test/SentenceReaderSupport.java
new file mode 100755
index 00000000000..18a16beab43
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector.test/src/com/sap/sailing/nmeaconnector/test/SentenceReaderSupport.java
@@ -0,0 +1,57 @@
+package com.sap.sailing.nmeaconnector.test;
+
+import java.util.concurrent.CountDownLatch;
+
+import com.sap.sailing.nmeaconnector.NmeaFactory;
+
+import net.sf.marineapi.nmea.event.AbstractSentenceListener;
+import net.sf.marineapi.nmea.event.SentenceListener;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.sentence.Sentence;
+
+/**
+ * Abstract test support class that adds a listener to a {@link SentenceReader} passed to the constructor. This listener
+ * will react to the reading being {@link SentenceListener#readingPaused() paused and unblocks all calls to
+ * {@link #waitUntilAllMessagesHaveBeenRead()}.
+ *
+ *
+ * Subclasses can start the reading process by calling {@link #startReading()} which is shorthand for calling
+ * {@link SentenceReader#start()} on the {@link SentenceReader} passed to the constructor.
+ *
+ * @author Axel Uhl (d043530)
+ *
+ */
+public class SentenceReaderSupport {
+ private final SentenceReader reader;
+ private final CountDownLatch finishedLatch;
+
+ protected SentenceReaderSupport(SentenceReader reader) {
+ finishedLatch = new CountDownLatch(1);
+ this.reader = reader;
+ NmeaFactory.INSTANCE.getUtil().registerAdditionalParsers();
+ reader.addSentenceListener(new AbstractSentenceListener() {
+ @Override
+ public void readingPaused() {
+ finishedLatch.countDown();
+ }
+
+ @Override
+ public void readingStopped() {
+ finishedLatch.countDown();
+ }
+
+ @Override
+ public void sentenceRead(Sentence sentence) {
+ }
+ });
+ reader.setPauseTimeout(100);
+ }
+
+ protected void startReading() {
+ reader.start();
+ }
+
+ protected void waitUntilAllMessagesHaveBeenRead() throws InterruptedException {
+ finishedLatch.await();
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/.classpath b/java/com.sap.sailing.nmeaconnector/.classpath
new file mode 100644
index 00000000000..eca7bdba8f0
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/java/com.sap.sailing.nmeaconnector/.project b/java/com.sap.sailing.nmeaconnector/.project
new file mode 100755
index 00000000000..c8d00592061
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/.project
@@ -0,0 +1,28 @@
+
+
+ com.sap.sailing.nmeaconnector
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.core.resources.prefs b/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.core.resources.prefs
new file mode 100755
index 00000000000..99f26c0203a
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.core.runtime.prefs b/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.core.runtime.prefs
new file mode 100755
index 00000000000..deae05a9778
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\r\n
diff --git a/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a698e59674f
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.pde.core.prefs b/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.pde.core.prefs
new file mode 100755
index 00000000000..f29e940a005
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/java/com.sap.sailing.nmeaconnector/META-INF/MANIFEST.MF b/java/com.sap.sailing.nmeaconnector/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..38acb7987dd
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Nmeaconnector
+Bundle-SymbolicName: com.sap.sailing.nmeaconnector
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: SAP
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ClassPath: .
+Export-Package: com.sap.sailing.nmeaconnector
+Require-Bundle: com.sap.sailing.domain,
+ com.sap.sailing.domain.common,
+ com.sap.sse.common,
+ net.sf.marineapi,
+ com.sap.sailing.declination
+Import-Package: org.osgi.framework
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: com.sap.sailing.nmeaconnector.impl.Activator
diff --git a/java/com.sap.sailing.nmeaconnector/build.properties b/java/com.sap.sailing.nmeaconnector/build.properties
new file mode 100755
index 00000000000..34d2e4d2dad
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/java/com.sap.sailing.nmeaconnector/pom.xml b/java/com.sap.sailing.nmeaconnector/pom.xml
new file mode 100644
index 00000000000..f4ad8005d1b
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ root
+ com.sap.sailing
+ 1.0.0-SNAPSHOT
+
+ com.sap.sailing.nmeaconnector
+ eclipse-plugin
+
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/AAMSentence.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/AAMSentence.java
new file mode 100755
index 00000000000..9d02b7e3653
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/AAMSentence.java
@@ -0,0 +1,45 @@
+/*
+ * MWVSentence.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector;
+
+import net.sf.marineapi.nmea.sentence.Sentence;
+
+/**
+ * This sentence is obsolete over most of its former coverage area.
+ * The US/Canadian/Russian Loran-C network was shut down in 2010; it is still as of 2015 in limited use in Europe.
+ * Loran-C operations in Norway will cease from 1st Jan 2016. [NORWAY]
+ * The format of the sentence is:
+ * 1 2 3 4 5 6
+ * | | | | | |
+ * $--AAM,A,A,x.x,N,c--c*hh
+ * Field Number:
+ * Status, BOOLEAN, A = Arrival circle entered, V = not passed
+ * Status, BOOLEAN, A = perpendicular passed at waypoint, V = not passed
+ * Arrival circle radius
+ * Units of radius, nautical miles
+ * Waypoint ID
+ * Checksum
+ * Example: GPAAM,A,A,0.10,N,WPTNME*43
+ * WPTNME is the waypoint name.
+ *
+ */
+public interface AAMSentence extends Sentence {
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/BATSentence.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/BATSentence.java
new file mode 100755
index 00000000000..48e2744c088
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/BATSentence.java
@@ -0,0 +1,61 @@
+/*
+ * MWVSentence.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector;
+
+import net.sf.marineapi.nmea.sentence.Sentence;
+
+/**
+ * BAT sentence. Used for the proprietary NMEA extension of the SailTimer WindVane's battery indicator message.
+ * The format of the sentence is:
+ *
+ * $WIBAT,a,b*hh
+ *
+ * 1) Wind Vane Battery (‘0’= Low, ‘1’= Good)
+ * 2) Base Unit battery level (‘0’ = Low, ‘9’ = Good)
+ * 3) Checksum
+ *
+ */
+public interface BATSentence extends Sentence {
+ public static enum WindVaneBatteryStatus {
+ LOW(0), GOOD(1);
+
+ private final int value;
+
+ private WindVaneBatteryStatus(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+ }
+
+ WindVaneBatteryStatus getWindVaneBatteryStatus();
+
+ void setWindVaneBatteryStatus(WindVaneBatteryStatus status);
+
+ /**
+ * Battery status is reported as value ranve 0..9 where 0 means "Low" and 9 means "Good."
+ */
+ int getBaseUnitBatteryLevel();
+
+ void setBaseUnitBatteryLevel(int level);
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/BWCSentence.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/BWCSentence.java
new file mode 100755
index 00000000000..90c0e6918dd
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/BWCSentence.java
@@ -0,0 +1,48 @@
+/*
+ * MWVSentence.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector;
+
+import net.sf.marineapi.nmea.sentence.Sentence;
+
+/**
+ * BWC sentence. Bearing and Distance to Waypoint – Latitude, N/S, Longitude, E/W, UTC, Status.
+ * The format of the sentence is:
+ *
+ * 1 2 3 4 5 6 7 8 9 10 11 12 13
+ * | | | | | | | | | | | | |
+ * $--BWC,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x.x,T,x.x,M,x.x,N,c--c*hh
+ * 1) Time (UTC)
+ * 2) Waypoint Latitude
+ * 3) N = North, S = South
+ * 4) Waypoint Longitude
+ * 5) E = East, W = West
+ * 6) Bearing, True
+ * 7) T = True
+ * 8) Bearing, Magnetic
+ * 9) M = Magnetic
+ * 10) Nautical Miles
+ * 11) N = Nautical Miles
+ * 12) Waypoint ID
+ * 13) Checksum
+ *
+ */
+public interface BWCSentence extends Sentence {
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/BWRSentence.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/BWRSentence.java
new file mode 100755
index 00000000000..c752cf41905
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/BWRSentence.java
@@ -0,0 +1,48 @@
+/*
+ * MWVSentence.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector;
+
+import net.sf.marineapi.nmea.sentence.Sentence;
+
+/**
+ * BWR sentence. Bearing and Distance to Waypoint – Rhumb Line Latitude, N/S, Longitude, E/W, UTC, Status.
+ * The format of the sentence is:
+ *
+ * 1 2 3 4 5 6 7 8 9 10 11 12 13
+ * | | | | | | | | | | | | |
+ * $--BWR,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x.x,T,x.x,M,x.x,N,c--c*hh
+ * 1) Time (UTC)
+ * 2) Waypoint Latitude
+ * 3) N = North, S = South
+ * 4) Waypoint Longitude
+ * 5) E = East, W = West
+ * 6) Bearing, True
+ * 7) T = True
+ * 8) Bearing, Magnetic
+ * 9) M = Magnetic
+ * 10) Nautical Miles
+ * 11) N = Nautical Miles
+ * 12) Waypoint ID
+ * 13) Checksum
+ *
+ */
+public interface BWRSentence extends Sentence {
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/GLCSentence.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/GLCSentence.java
new file mode 100755
index 00000000000..1c4099119f5
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/GLCSentence.java
@@ -0,0 +1,52 @@
+/*
+ * MWVSentence.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector;
+
+import net.sf.marineapi.nmea.sentence.Sentence;
+
+/**
+ * This sentence is obsolete over most of its former coverage area.
+ * The US/Canadian/Russian Loran-C network was shut down in 2010; it is still as of 2015 in limited use in Europe.
+ * Loran-C operations in Norway will cease from 1st Jan 2016. [NORWAY]
+ * The format of the sentence is:
+ * 12 14
+ * 1 2 3 4 5 6 7 8 9 10 11| 13|
+ * | | | | | | | | | | | | | |
+ * $--GLC,xxxx,x.x,a,x.x,a,x.x,a.x,x,a,x.x,a,x.x,a*hh
+ * Field Number:
+ * GRI Microseconds/10
+ * Master TOA Microseconds
+ * Master TOA Signal Status
+ * Time Difference 1 Microseconds
+ * Time Difference 1 Signal Status
+ * Time Difference 2 Microseconds
+ * Time Difference 2 Signal Status
+ * Time Difference 3 Microseconds
+ * Time Difference 3 Signal Status
+ * Time Difference 4 Microseconds
+ * Time Difference 4 Signal Status
+ * Time Difference 5 Microseconds
+ * Time Difference 5 Signal Status
+ * Checksum
+ *
+ */
+public interface GLCSentence extends Sentence {
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/NMEAWindReceiver.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/NMEAWindReceiver.java
new file mode 100755
index 00000000000..674d5b93b90
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/NMEAWindReceiver.java
@@ -0,0 +1,53 @@
+package com.sap.sailing.nmeaconnector;
+
+import com.sap.sailing.domain.common.Wind;
+import com.sap.sailing.domain.tracking.WindListener;
+import com.sap.sse.common.TimePoint;
+
+import net.sf.marineapi.nmea.event.SentenceListener;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.sentence.DateSentence;
+import net.sf.marineapi.nmea.sentence.MWVSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TimeSentence;
+
+/**
+ * A stateful receiver that consumes sentences from an NMEA {@link SentenceReader}
+ * for which it acts as a {@link SentenceListener} for sentences providing information
+ * about wind measurements, date/time reference, location of measurements and data
+ * that may be required to convert apparent wind speeds and angles into true wind
+ * speeds and directions. Clients can {@link #addWindListener(WindListener) register}
+ * as a {@link WindListener} and receive {@link WindListener#windDataReceived} callbacks
+ * whenever a {@link Wind} fix was assembled out of the various NMEA sentences.
+ *
+ * The NMEA 0183 protocol specifies that a {@link SentenceId#MWV} sentence may provide
+ * "true" (relative to true north) or "relative" (relative to bow) wind angles. However,
+ * it is not entirely clear in all cases if those angles have the magnetic declination
+ * already corrected. Only with {@link SentenceId#MWD} sentences does this become clear,
+ * and a value for the magnetic declination could be inferred. For now, we will assume
+ * that {@link SentenceId#MWV} values really provide angles based on true north if
+ * {@link MWVSentence#isTrue()} is {@code true}.
+ *
+ * This receiver assumes that the sentences do not necessarily have to be entirely
+ * time-synchronous. But different sentence types can provide "hints" as to the timing.
+ * GPS fixes (@link SentenceId#GGA} and other position fixes {@link SentenceId#GLL} have
+ * time of day but no date information. Other messages such as {@link SentenceId#RMC} and
+ * {@link SentenceId#ZDA} contain date and optionally time zone information. When analyzing
+ * the entire sequence, under certain assumptions such as fixes with time information being
+ * less than 24h apart from each other and with at least one {@link DateSentence} per day
+ * it is possible to combine {@link TimeSentence}s with the last date information into
+ * a full {@link TimePoint}.
+ *
+ * In order to also work in streaming mode and to provide {@link Wind} fixes as soon as
+ * all data relevant for a wind fix has been received, this receiver won't wait for the
+ * next timing information to interpolate, but instead the last timing data received
+ * before the wind measurement will be used for the {@link Wind} fix.
+ *
+ * @author Axel Uhl (d043530)
+ *
+ */
+public interface NMEAWindReceiver {
+ void addWindListener(WindListener listener);
+
+ void removeWindListener(WindListener listener);
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/NmeaFactory.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/NmeaFactory.java
new file mode 100755
index 00000000000..49000598cc8
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/NmeaFactory.java
@@ -0,0 +1,32 @@
+package com.sap.sailing.nmeaconnector;
+
+import java.io.InputStream;
+
+import com.sap.sailing.domain.common.Wind;
+import com.sap.sailing.nmeaconnector.impl.NmeaFactoryImpl;
+
+import net.sf.marineapi.nmea.sentence.MWVSentence;
+import net.sf.marineapi.nmea.sentence.ZDASentence;
+
+public interface NmeaFactory {
+ static NmeaFactory INSTANCE = new NmeaFactoryImpl();
+
+ NmeaUtil getUtil();
+
+ /**
+ * Reads from a series of NMEA 0183 sentences and looks for timing information in the form of {@link ZDASentence}s
+ * as well as for weather records ({@link MWVSentence} sentences). If multiple {@code MWV} sentences are found between
+ * two time stamps, linear interpolation is used to assign time points to each wind reading. The information is
+ * furthermore combined with position and motion data. If the wind readings are apparent readings, the speed of
+ * the wind sensor is taken into account to transform into a true reading. NMEA specifies that a "true" reading
+ * is relative to "true north" which we can only believe; it means that the instrument needs to have an understanding
+ * of the magnetic declination at the time and position of the measurement.
+ *
+ * @param inputStream
+ * will be consumed up to its end but will not be closed; the caller remains responsible for closing the
+ * input stream.
+ * @return a sequence of {@link Wind} objects as extracted from the NMEA 0183 sentences found in the contents of the
+ * {@code reader}; never {@code null}, but possibly empty
+ */
+ Iterable readWind(InputStream inputStream) throws InterruptedException;
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/NmeaUtil.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/NmeaUtil.java
new file mode 100755
index 00000000000..ad9f06f4741
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/NmeaUtil.java
@@ -0,0 +1,38 @@
+package com.sap.sailing.nmeaconnector;
+
+import com.sap.sailing.domain.common.Position;
+import com.sap.sailing.domain.common.Speed;
+import com.sap.sailing.domain.common.SpeedWithBearing;
+import com.sap.sailing.domain.common.Wind;
+import com.sap.sse.common.TimePoint;
+
+import net.sf.marineapi.nmea.parser.SentenceFactory;
+import net.sf.marineapi.nmea.sentence.MWVSentence;
+import net.sf.marineapi.nmea.util.Units;
+
+public interface NmeaUtil {
+ Wind getWind(TimePoint timePoint, Position position, MWVSentence mwvSentence);
+
+ Speed getSpeed(double magnitude, Units unit);
+
+ SpeedWithBearing getSpeedWithBearing(double speedMagnitude, Units speedUnit, double bearingInDegrees);
+
+ /**
+ * Replaces all occurrences of sequenceToFind by replaceWith, as {@link String#replace(CharSequence, CharSequence)},
+ * but assuming that nmeaSentence has a trailing NMEA checksum, adjusts the checksum accordingly. This will turn a valid
+ * checksum into a valid checksum again, and an invalid checksum into an invalid checksum.
+ */
+ String replace(String nmeaSentence, String sequenceToFind, String replaceWith);
+
+ /**
+ * Call this to register proprietary parsers provided by this bundle with the
+ * {@link SentenceFactory} {@link SentenceFactory#getInstance() default instance}.
+ */
+ void registerAdditionalParsers();
+
+ /**
+ * Call this to unregister proprietary parsers provided by this bundle from the
+ * {@link SentenceFactory} {@link SentenceFactory#getInstance() default instance}.
+ */
+ void unregisterAdditionalParsers();
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/TimedBearing.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/TimedBearing.java
new file mode 100755
index 00000000000..b6df8f16443
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/TimedBearing.java
@@ -0,0 +1,7 @@
+package com.sap.sailing.nmeaconnector;
+
+import com.sap.sailing.domain.common.Bearing;
+import com.sap.sse.common.Timed;
+
+public interface TimedBearing extends Timed, Bearing {
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/TimedSpeedWithBearing.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/TimedSpeedWithBearing.java
new file mode 100755
index 00000000000..7eb156b8430
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/TimedSpeedWithBearing.java
@@ -0,0 +1,8 @@
+package com.sap.sailing.nmeaconnector;
+
+import com.sap.sailing.domain.common.SpeedWithBearing;
+import com.sap.sse.common.Timed;
+
+public interface TimedSpeedWithBearing extends Timed, SpeedWithBearing {
+
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/AAMParser.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/AAMParser.java
new file mode 100755
index 00000000000..875196f0923
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/AAMParser.java
@@ -0,0 +1,62 @@
+/*
+ * GSVParser.java
+ * Copyright (C) 2010 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector.impl;
+
+import com.sap.sailing.nmeaconnector.AAMSentence;
+
+import net.sf.marineapi.nmea.parser.SentenceParser;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+/**
+ * GSV sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ * @author Axel Uhl
+ */
+public class AAMParser extends SentenceParser implements AAMSentence {
+
+ // field indices, in case someone plans to use them:
+// private static final int STATUS_1 = 0;
+// private static final int STATUS_2 = 1;
+// private static final int ARRIVAL_CIRCLE_RADIUS = 2;
+// private static final int UNIT_OF_RADIUS = 3;
+// private static final int WAYPOINT_ID = 4;
+
+ /**
+ * Constructor.
+ *
+ * @param nmea
+ * GLC Sentence
+ */
+ public AAMParser(String nmea) {
+ super(nmea, "AAM");
+ }
+
+ /**
+ * Creates an GSV parser with empty sentence.
+ *
+ * @param talker
+ * TalkerId to set
+ */
+ public AAMParser(TalkerId talker) {
+ super(talker, "AAM", 5);
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/Activator.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/Activator.java
new file mode 100755
index 00000000000..a832bca2b8f
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/Activator.java
@@ -0,0 +1,27 @@
+package com.sap.sailing.nmeaconnector.impl;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+import com.sap.sailing.nmeaconnector.NmeaFactory;
+
+import net.sf.marineapi.nmea.parser.SentenceFactory;
+
+/**
+ * Registers and unregisters additional proprietary NMEA sentence parsers with the {@link SentenceFactory}
+ * {@link SentenceFactory#getInstance() default instance}.
+ *
+ * @author Axel Uhl (d043530)
+ *
+ */
+public class Activator implements BundleActivator {
+ @Override
+ public void start(BundleContext context) throws Exception {
+ NmeaFactory.INSTANCE.getUtil().registerAdditionalParsers();
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ NmeaFactory.INSTANCE.getUtil().unregisterAdditionalParsers();
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/BATParser.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/BATParser.java
new file mode 100755
index 00000000000..e23c36ff23d
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/BATParser.java
@@ -0,0 +1,92 @@
+/*
+ * MWVParser.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector.impl;
+
+import com.sap.sailing.nmeaconnector.BATSentence;
+
+import net.sf.marineapi.nmea.parser.SentenceParser;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+/**
+ * BAT sentence parser. Used for the proprietary NMEA extension of the SailTimer WindVane's battery indicator message.
+ * The format of the sentence is:
+ *
+ * $WIBAT,a,b*hh
+ *
+ * 1) Wind Vane Battery (‘0’= Low, ‘1’= Good)
+ * 2) Base Unit battery level (‘0’ = Low, ‘9’ = Good)
+ * 3) Checksum
+ *
+ *
+ * @author Axel Uhl
+ */
+public class BATParser extends SentenceParser implements BATSentence {
+ private static final int WIND_VANE_BATTERY_STATUS = 0;
+ private static final int BASE_UNIT_BATTERY_LEVEL = 1;
+
+ /**
+ * Creates a new instance of BATParser.
+ *
+ * @param nmea BAT sentence String
+ */
+ public BATParser(String nmea) {
+ super(nmea, /* Proprietary extension for SailTimer WindVane's battery indicator message */ "BAT");
+ }
+
+ /**
+ * Creates a new empty instance of BATParser.
+ *
+ * @param talker Talker id to set
+ */
+ public BATParser(TalkerId talker) {
+ super(talker, /* Proprietary extension for SailTimer WindVane's battery indicator message */ "BAT", 2);
+ }
+
+ @Override
+ public WindVaneBatteryStatus getWindVaneBatteryStatus() {
+ WindVaneBatteryStatus result = null;
+ final int intValue = getIntValue(WIND_VANE_BATTERY_STATUS);
+ for (BATSentence.WindVaneBatteryStatus status : BATSentence.WindVaneBatteryStatus.values()) {
+ if (status.getValue() == intValue) {
+ result = status;
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public int getBaseUnitBatteryLevel() {
+ return getIntValue(BASE_UNIT_BATTERY_LEVEL);
+ }
+
+ @Override
+ public void setWindVaneBatteryStatus(WindVaneBatteryStatus status) {
+ setIntValue(WIND_VANE_BATTERY_STATUS, status.getValue());
+ }
+
+ @Override
+ public void setBaseUnitBatteryLevel(int level) {
+ if (level < 0 || level > 9) {
+ throw new IllegalArgumentException("Level must be in the range 0..9 but was "+level);
+ }
+ setIntValue(BASE_UNIT_BATTERY_LEVEL, level);
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/BWCParser.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/BWCParser.java
new file mode 100755
index 00000000000..aad05f72a33
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/BWCParser.java
@@ -0,0 +1,46 @@
+/*
+ * MWVParser.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector.impl;
+
+import com.sap.sailing.nmeaconnector.BWCSentence;
+
+import net.sf.marineapi.nmea.parser.SentenceParser;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+public class BWCParser extends SentenceParser implements BWCSentence {
+ /**
+ * Creates a new instance of BWCParser.
+ *
+ * @param nmea BWC sentence String
+ */
+ public BWCParser(String nmea) {
+ super(nmea, "BWC");
+ }
+
+ /**
+ * Creates a new empty instance of BWCParser.
+ *
+ * @param talker Talker id to set
+ */
+ public BWCParser(TalkerId talker) {
+ super(talker, "BWC", 12);
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/BWRParser.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/BWRParser.java
new file mode 100755
index 00000000000..d0605c022b0
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/BWRParser.java
@@ -0,0 +1,46 @@
+/*
+ * MWVParser.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector.impl;
+
+import com.sap.sailing.nmeaconnector.BWCSentence;
+
+import net.sf.marineapi.nmea.parser.SentenceParser;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+public class BWRParser extends SentenceParser implements BWCSentence {
+ /**
+ * Creates a new instance of BWRParser.
+ *
+ * @param nmea BWR sentence String
+ */
+ public BWRParser(String nmea) {
+ super(nmea, "BWR");
+ }
+
+ /**
+ * Creates a new empty instance of BWRParser.
+ *
+ * @param talker Talker id to set
+ */
+ public BWRParser(TalkerId talker) {
+ super(talker, "BWR", 12);
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/DegreeBearingWithTimepoint.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/DegreeBearingWithTimepoint.java
new file mode 100755
index 00000000000..e1d4e762b98
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/DegreeBearingWithTimepoint.java
@@ -0,0 +1,20 @@
+package com.sap.sailing.nmeaconnector.impl;
+
+import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
+import com.sap.sailing.nmeaconnector.TimedBearing;
+import com.sap.sse.common.TimePoint;
+
+public class DegreeBearingWithTimepoint extends DegreeBearingImpl implements TimedBearing {
+ private static final long serialVersionUID = 8704478920647067862L;
+ private final TimePoint timePoint;
+
+ public DegreeBearingWithTimepoint(TimePoint timePoint, double bearingDeg) {
+ super(bearingDeg);
+ this.timePoint = timePoint;
+ }
+
+ @Override
+ public TimePoint getTimePoint() {
+ return timePoint;
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/GLCParser.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/GLCParser.java
new file mode 100755
index 00000000000..55c9edfb500
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/GLCParser.java
@@ -0,0 +1,70 @@
+/*
+ * GSVParser.java
+ * Copyright (C) 2010 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package com.sap.sailing.nmeaconnector.impl;
+
+import com.sap.sailing.nmeaconnector.GLCSentence;
+
+import net.sf.marineapi.nmea.parser.SentenceParser;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+/**
+ * GSV sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ * @author Axel Uhl
+ */
+public class GLCParser extends SentenceParser implements GLCSentence {
+
+ // field indices, in case someone plans to use them:
+// private static final int GRI_MICROSECONDS_BY_10 = 0;
+// private static final int MASTER_TOA_MICROSECONDS = 1;
+// private static final int MASTER_TOA_SIGNAL_STATUS = 2;
+// private static final int TIME_DIFF_1_MICROSECONDS = 3;
+// private static final int TIME_DIFF_1_SIGNAL_STATUS = 4;
+// private static final int TIME_DIFF_2_MICROSECONDS = 5;
+// private static final int TIME_DIFF_2_SIGNAL_STATUS = 6;
+// private static final int TIME_DIFF_3_MICROSECONDS = 7;
+// private static final int TIME_DIFF_3_SIGNAL_STATUS = 8;
+// private static final int TIME_DIFF_4_MICROSECONDS = 9;
+// private static final int TIME_DIFF_4_SIGNAL_STATUS = 10;
+// private static final int TIME_DIFF_5_MICROSECONDS = 11;
+// private static final int TIME_DIFF_5_SIGNAL_STATUS = 12;
+
+ /**
+ * Constructor.
+ *
+ * @param nmea
+ * GLC Sentence
+ */
+ public GLCParser(String nmea) {
+ super(nmea, "GLC");
+ }
+
+ /**
+ * Creates an GSV parser with empty sentence.
+ *
+ * @param talker
+ * TalkerId to set
+ */
+ public GLCParser(TalkerId talker) {
+ super(talker, "GLC", 19);
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/KnotSpeedWithBearingAndTimepoint.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/KnotSpeedWithBearingAndTimepoint.java
new file mode 100755
index 00000000000..eded0d58caf
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/KnotSpeedWithBearingAndTimepoint.java
@@ -0,0 +1,33 @@
+package com.sap.sailing.nmeaconnector.impl;
+
+import com.sap.sailing.domain.common.Bearing;
+import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
+import com.sap.sailing.domain.tracking.Track;
+import com.sap.sailing.nmeaconnector.TimedSpeedWithBearing;
+import com.sap.sse.common.TimePoint;
+
+/**
+ * Can be used as a wind vector in a {@link Track} because it has a {@link TimePoint}.
+ *
+ * @author Axel Uhl (d043530)
+ *
+ */
+public class KnotSpeedWithBearingAndTimepoint extends KnotSpeedWithBearingImpl implements TimedSpeedWithBearing {
+ private static final long serialVersionUID = -627441174825774742L;
+ private final TimePoint timePoint;
+
+ public KnotSpeedWithBearingAndTimepoint(TimePoint timePoint, double speedInKnots, Bearing bearing) {
+ super(speedInKnots, bearing);
+ this.timePoint = timePoint;
+ }
+
+ @Override
+ public TimePoint getTimePoint() {
+ return timePoint;
+ }
+
+ @Override
+ public String toString() {
+ return getTimePoint().toString()+": "+super.toString();
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/NMEAWindReceiverImpl.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/NMEAWindReceiverImpl.java
new file mode 100755
index 00000000000..c2f2b74fe30
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/NMEAWindReceiverImpl.java
@@ -0,0 +1,407 @@
+package com.sap.sailing.nmeaconnector.impl;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.time.ZoneId;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.sap.sailing.declination.Declination;
+import com.sap.sailing.declination.DeclinationService;
+import com.sap.sailing.domain.common.Bearing;
+import com.sap.sailing.domain.common.Position;
+import com.sap.sailing.domain.common.Speed;
+import com.sap.sailing.domain.common.SpeedWithBearing;
+import com.sap.sailing.domain.common.Wind;
+import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
+import com.sap.sailing.domain.common.impl.DegreePosition;
+import com.sap.sailing.domain.common.impl.KilometersPerHourSpeedImpl;
+import com.sap.sailing.domain.common.impl.KnotSpeedImpl;
+import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
+import com.sap.sailing.domain.common.impl.MeterPerSecondSpeedImpl;
+import com.sap.sailing.domain.common.impl.WindImpl;
+import com.sap.sailing.domain.common.scalablevalue.impl.ScalableBearing;
+import com.sap.sailing.domain.common.scalablevalue.impl.ScalablePosition;
+import com.sap.sailing.domain.common.scalablevalue.impl.ScalableSpeedWithBearing;
+import com.sap.sailing.domain.common.tracking.GPSFix;
+import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl;
+import com.sap.sailing.domain.tracking.DynamicTrack;
+import com.sap.sailing.domain.tracking.WindListener;
+import com.sap.sailing.domain.tracking.impl.DynamicTrackImpl;
+import com.sap.sailing.nmeaconnector.NMEAWindReceiver;
+import com.sap.sailing.nmeaconnector.TimedBearing;
+import com.sap.sailing.nmeaconnector.TimedSpeedWithBearing;
+import com.sap.sse.common.TimePoint;
+import com.sap.sse.common.impl.MillisecondsTimePoint;
+
+import net.sf.marineapi.nmea.event.AbstractSentenceListener;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.parser.DataNotAvailableException;
+import net.sf.marineapi.nmea.sentence.DateSentence;
+import net.sf.marineapi.nmea.sentence.HeadingSentence;
+import net.sf.marineapi.nmea.sentence.MDASentence;
+import net.sf.marineapi.nmea.sentence.MWDSentence;
+import net.sf.marineapi.nmea.sentence.MWVSentence;
+import net.sf.marineapi.nmea.sentence.PositionSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TimeSentence;
+import net.sf.marineapi.nmea.sentence.VTGSentence;
+import net.sf.marineapi.nmea.sentence.VWRSentence;
+import net.sf.marineapi.nmea.sentence.ZDASentence;
+import net.sf.marineapi.nmea.util.CompassPoint;
+import net.sf.marineapi.nmea.util.Date;
+import net.sf.marineapi.nmea.util.Direction;
+import net.sf.marineapi.nmea.util.Time;
+import net.sf.marineapi.nmea.util.Units;
+
+public class NMEAWindReceiverImpl implements NMEAWindReceiver {
+ private static final Logger logger = Logger.getLogger(NMEAWindReceiverImpl.class.getName());
+ private final ConcurrentHashMap listeners;
+ private final DynamicTrack trueWind;
+ private final DynamicTrack apparentWind;
+ private final DynamicTrack sensorPositions;
+ private final DynamicTrack sensorSpeeds;
+ private final DynamicTrack trueHeadings;
+
+ /**
+ * Don't use the {@link GregorianCalendar#getTime() time point} of this calendar unless a {@link DateSentence} and a
+ * {@link TimeSentence} have been received which is indicated by the {@link #dateReceived} and the
+ * {@link #timeReceived} fields, respectively.
+ */
+ private final GregorianCalendar utcCalendar;
+
+ private final DeclinationService declinationService = DeclinationService.INSTANCE;
+
+ /**
+ * Until a {@link DateSentence} has been received, the {@link #utcCalendar}'s {@link GregorianCalendar#getTime()}
+ * must not be used.
+ */
+ private boolean dateReceived;
+
+ private boolean timeReceived;
+
+ private class MWVSentenceListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(MWVSentence sentence) {
+ final TimePoint timePoint = getLastTimePoint();
+ if (timePoint != null) {
+ try {
+ final Speed speed = createSpeed(sentence.getSpeedUnit(), sentence.getSpeed());
+ final KnotSpeedWithBearingAndTimepoint fix;
+ if (sentence.isTrue()) {
+ final Bearing trueHeading = trueHeadings.getInterpolatedValue(getLastTimePoint(), f->new ScalableBearing(f));
+ if (trueHeading != null) {
+ // need to take heading into account as MWV is still relative to bow, even if "true" is provided;
+ // it is what you would see on the wind display when set to "true wind"
+ fix = new KnotSpeedWithBearingAndTimepoint(timePoint,
+ speed.getKnots(), new DegreeBearingImpl(sentence.getAngle()).reverse().add(trueHeading));
+ trueWind.add(fix);
+ tryToCreateWindFixFromTrueWind(fix);
+ }
+ } else {
+ fix = new KnotSpeedWithBearingAndTimepoint(timePoint,
+ speed.getKnots(), new DegreeBearingImpl(sentence.getAngle()).reverse());
+ apparentWind.add(fix);
+ tryToCreateWindFixFromApparentWind(fix);
+ }
+ // use the newly gained wind data to try to assemble a Wind fix if
+ // other values such as heading and position are known
+ } catch (DataNotAvailableException e) {
+ // can happen... simply ignore this incomplete sentence
+ }
+ }
+ }
+ }
+
+ private class MWDSentenceListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(MWDSentence sentence) {
+ // the message provides data about the true wind direction (TWD) and true wind speed (TWS);
+ // here, "true" means "not apparent"; the direction may still be provided in degrees true
+ // or degrees magnetic, and we need to find out which is available
+ final TimePoint timePoint = getLastTimePoint();
+ if (timePoint != null) {
+ final com.sap.sailing.domain.common.Position position = getPosition(timePoint);
+ if (position != null) {
+ final Speed speed;
+ if (!Double.isNaN(sentence.getWindSpeed())) {
+ speed = new MeterPerSecondSpeedImpl(sentence.getWindSpeed());
+ } else if (!Double.isNaN(sentence.getWindSpeedKnots())) {
+ speed = new KnotSpeedImpl(sentence.getWindSpeedKnots());
+ } else {
+ speed = null;
+ }
+ if (speed != null) {
+ final Bearing direction;
+ if (!Double.isNaN(sentence.getTrueWindDirection())) {
+ direction = new DegreeBearingImpl(sentence.getTrueWindDirection());
+ } else {
+ Declination declination;
+ try {
+ declination = declinationService.getDeclination(timePoint, position, /* timeoutForOnlineFetchInMilliseconds */ 1000);
+ if (declination != null) {
+ direction = new DegreeBearingImpl(sentence.getMagneticWindDirection()).add(declination.getBearingCorrectedTo(timePoint));
+ } else {
+ direction = null;
+ }
+ if (direction != null) {
+ final KnotSpeedWithBearingAndTimepoint fix = new KnotSpeedWithBearingAndTimepoint(timePoint,
+ speed.getKnots(), direction);
+ trueWind.add(fix);
+ tryToCreateWindFixFromTrueWind(fix);
+ }
+ } catch (ParseException | IOException e) {
+ logger.log(Level.WARNING, "Couldn't correct magnetic TWD reading by declination; ignoring", e);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private class VTGSentenceListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(VTGSentence sentence) {
+ try {
+ sensorSpeeds.add(new KnotSpeedWithBearingAndTimepoint(getLastTimePoint(), sentence.getSpeedKnots(), new DegreeBearingImpl(sentence.getTrueCourse())));
+ } catch (DataNotAvailableException e) {
+ // no sensor speed will be recorded if data is not available
+ }
+ }
+ }
+
+ private class VWRSentenceListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(VWRSentence sentence) {
+ apparentWind.add(new KnotSpeedWithBearingAndTimepoint(getLastTimePoint(), sentence.getSpeedKnots(),
+ new DegreeBearingImpl(sentence.getWindAngle() * (sentence.getDirectionLeftRight()==Direction.LEFT ? -1 : 1))));
+ }
+ }
+
+ private class MDASentenceListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(MDASentence sentence) {
+ if (!Double.isNaN(sentence.getTrueWindDirection())) {
+ if (!Double.isNaN(sentence.getWindSpeed())) {
+ trueWind.add(new KnotSpeedWithBearingAndTimepoint(getLastTimePoint(), new MeterPerSecondSpeedImpl(sentence.getWindSpeed()).getKnots(),
+ new DegreeBearingImpl(sentence.getTrueWindDirection())));
+ } else if (!Double.isNaN(sentence.getWindSpeedKnots())) {
+ trueWind.add(new KnotSpeedWithBearingAndTimepoint(getLastTimePoint(), sentence.getWindSpeedKnots(),
+ new DegreeBearingImpl(sentence.getTrueWindDirection())));
+ }
+ }
+ }
+ }
+
+ private class HeadingSentenceListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(HeadingSentence sentence) {
+ if (getLastTimePoint() != null) {
+ if (sentence.isTrue()) {
+ try {
+ trueHeadings.add(new DegreeBearingWithTimepoint(getLastTimePoint(), sentence.getHeading()));
+ } catch (DataNotAvailableException e) {
+ // ignore; in this case, no true heading will be recorded
+ }
+ } else {
+ final Position position = getPosition(getLastTimePoint());
+ if (position != null) {
+ try {
+ final Declination declination = declinationService.getDeclination(getLastTimePoint(), position, /* timeoutForOnlineFetchInMilliseconds */ 1000);
+ if (declination != null) {
+ try {
+ trueHeadings.add(new DegreeBearingWithTimepoint(getLastTimePoint(),
+ new DegreeBearingImpl(sentence.getHeading()).add(declination.getBearingCorrectedTo(getLastTimePoint())).getDegrees()));
+ } catch (DataNotAvailableException e) {
+ // no true heading will be created if data is not available
+ }
+ }
+ } catch (IOException | ParseException e) {
+ logger.log(Level.WARNING, "Error trying to obtain magnetic declination while converting magnetic heading to true heading", e);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private class DateListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(DateSentence sentence) {
+ try {
+ final Date date = sentence.getDate();
+ utcCalendar.set(date.getYear(), date.getMonth() - 1, date.getDay());
+ dateReceived = true;
+ } catch (DataNotAvailableException | IllegalArgumentException e) {
+ // can happen; ignore sentence
+ }
+ }
+ }
+
+ private class TimeListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(TimeSentence sentence) {
+ try {
+ final Time time = sentence.getTime();
+ utcCalendar.set(utcCalendar.get(Calendar.YEAR), utcCalendar.get(Calendar.MONTH), utcCalendar.get(Calendar.DAY_OF_MONTH),
+ time.getHour(), time.getMinutes(), (int) time.getSeconds());
+ final int millisInSecond = (int) ((time.getSeconds()-(int) time.getSeconds())*1000);
+ utcCalendar.set(Calendar.MILLISECOND, millisInSecond);
+ timeReceived = true;
+ } catch (DataNotAvailableException e) {
+ // can happen; ignore sentence
+ }
+ }
+ }
+
+ private class PositionListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(PositionSentence sentence) {
+ if (sentence instanceof TimeSentence) { // all PositionSentence implementations currently also implement TimeSentence
+ TimeSentence timeSentence = (TimeSentence) sentence;
+ // now make sure we work with the latest time from this record:
+ new TimeListener().sentenceRead(timeSentence);
+ final TimePoint timePoint = getLastTimePoint();
+ if (timePoint != null) {
+ try {
+ final GPSFix fix = new GPSFixImpl(getPosition(sentence), timePoint);
+ sensorPositions.add(fix);
+ } catch (DataNotAvailableException e) {
+ // no sensor position is recorded in this case
+ }
+ }
+ }
+ }
+
+ private Position getPosition(PositionSentence sentence) throws DataNotAvailableException {
+ return new DegreePosition(
+ Math.abs(sentence.getPosition().getLatitude())*(sentence.getPosition().getLatitudeHemisphere()==CompassPoint.NORTH?1:-1),
+ Math.abs(sentence.getPosition().getLongitude())*(sentence.getPosition().getLongitudeHemisphere()==CompassPoint.EAST?1:-1));
+ }
+ }
+
+ /**
+ * @param sentenceReader
+ * The reader that this receiver will listen to for those NMEA sentences of interest for the construction
+ * of wind fixes
+ */
+ public NMEAWindReceiverImpl(SentenceReader sentenceReader) {
+ super();
+ utcCalendar = new GregorianCalendar();
+ utcCalendar.setTimeZone(TimeZone.getTimeZone(ZoneId.of("UTC")));
+ this.listeners = new ConcurrentHashMap<>();
+ this.trueWind = new DynamicTrackImpl<>("trueWind in "+getClass().getName());
+ this.apparentWind = new DynamicTrackImpl<>("apparentWind in "+getClass().getName());
+ this.sensorPositions = new DynamicTrackImpl<>("measurementPositions in "+getClass().getName());
+ this.sensorSpeeds = new DynamicTrackImpl<>("sensorSpeeds in "+getClass().getName());
+ this.trueHeadings = new DynamicTrackImpl<>("trueHeadings in "+getClass().getName());
+ sentenceReader.addSentenceListener(new MWVSentenceListener(), SentenceId.MWV);
+ sentenceReader.addSentenceListener(new MWDSentenceListener(), SentenceId.MWD);
+ sentenceReader.addSentenceListener(new VWRSentenceListener(), SentenceId.VWR);
+ sentenceReader.addSentenceListener(new MDASentenceListener(), SentenceId.MDA);
+ sentenceReader.addSentenceListener(new VTGSentenceListener(), SentenceId.VTG);
+ sentenceReader.addSentenceListener(new HeadingSentenceListener());
+ sentenceReader.addSentenceListener(new DateListener());
+ sentenceReader.addSentenceListener(new TimeListener());
+ sentenceReader.addSentenceListener(new PositionListener());
+ }
+
+ private Speed createSpeed(Units speedUnit, double amount) {
+ final Speed result;
+ switch (speedUnit) {
+ case KMH:
+ result = new KilometersPerHourSpeedImpl(amount);
+ break;
+ case KNOT:
+ result = new KnotSpeedImpl(amount);
+ break;
+ case METER:
+ result = new MeterPerSecondSpeedImpl(amount);
+ break;
+ default:
+ throw new RuntimeException("Unknown speed unit: "+speedUnit);
+ }
+ return result;
+ }
+
+ /**
+ * To be called when new true wind evidence has been received for {@code timePoint}. Creates a {@link Wind} fix when
+ * enough data is available, in particular position data. If this is the case, the wind fix generated will be passed
+ * to {@link #notifyListeners(Wind)}.
+ */
+ private void tryToCreateWindFixFromTrueWind(TimedSpeedWithBearing trueWind) {
+ final com.sap.sailing.domain.common.Position position = getPosition(trueWind.getTimePoint());
+ if (position != null) {
+ final Wind wind = new WindImpl(position, trueWind.getTimePoint(), trueWind);
+ notifyListeners(wind);
+ }
+ }
+
+ /**
+ * To be called when new apparent wind evidence has been received for {@code timePoint}. Creates a {@link Wind} fix
+ * when enough data is available, such as motion and heading data required to turn the apparent wind fix into a true
+ * wind fix, as well as position data, motion and heading. If this is the case, the wind fix generated will be
+ * passed to {@link #notifyListeners(Wind)}.
+ */
+ private void tryToCreateWindFixFromApparentWind(TimedSpeedWithBearing apparentWind) {
+ final com.sap.sailing.domain.common.Position position = getPosition(apparentWind.getTimePoint());
+ if (position != null) {
+ final SpeedWithBearing sensorSpeed = sensorSpeeds.getInterpolatedValue(getLastTimePoint(), fix->new ScalableSpeedWithBearing(fix));
+ if (sensorSpeed != null) {
+ final Bearing trueHeading = trueHeadings.getInterpolatedValue(getLastTimePoint(), fix->new ScalableBearing(fix));
+ if (trueHeading != null) {
+ final SpeedWithBearing apparentWindTrue = new KnotSpeedWithBearingImpl(apparentWind.getKnots(), apparentWind.getBearing().add(trueHeading));
+ final SpeedWithBearing trueWind = apparentWindTrue.add(sensorSpeed); // this subtracts the induced wind which is the sensorSpeed reversed
+ final Wind wind = new WindImpl(position, apparentWind.getTimePoint(), trueWind);
+ notifyListeners(wind);
+ }
+ }
+ }
+ }
+
+ /**
+ * Based on the sequence of messages received from the reader, a "current" time point is approximated whenever a
+ * {@link TimeSentence} or {@link DateSentence} or some time zone information as in a {@link ZDASentence} is
+ * received. Several messages that are of interest for wind fix construction do not carry their own time stamp
+ * information. For those, the time point inferred from the last {@link TimeSentence} is used which is what this
+ * method returns.
+ *
+ * @return the last {@link TimePoint} inferred from the combination of {@link TimeSentence}, {@link DateSentence}
+ * and {@link ZDASentence}, or {@code null} in case not enough information about timing has been received
+ * yet.
+ */
+ private TimePoint getLastTimePoint() {
+ final TimePoint result;
+ if (dateReceived && timeReceived) {
+ result = new MillisecondsTimePoint(utcCalendar.getTime());
+ } else {
+ result = null;
+ }
+ return result;
+ }
+
+ private com.sap.sailing.domain.common.Position getPosition(TimePoint timePoint) {
+ return sensorPositions.getInterpolatedValue(timePoint, gpsFix->new ScalablePosition(gpsFix.getPosition()));
+ }
+
+ @Override
+ public void addWindListener(WindListener listener) {
+ listeners.put(listener, listener);
+ }
+
+ @Override
+ public void removeWindListener(WindListener listener) {
+ listeners.remove(listener);
+ }
+
+ private void notifyListeners(Wind wind) {
+ for (WindListener listener : listeners.values()) {
+ listener.windDataReceived(wind);
+ }
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/NmeaFactoryImpl.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/NmeaFactoryImpl.java
new file mode 100755
index 00000000000..64dc5574191
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/NmeaFactoryImpl.java
@@ -0,0 +1,52 @@
+package com.sap.sailing.nmeaconnector.impl;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+import com.sap.sailing.domain.common.Wind;
+import com.sap.sailing.domain.tracking.WindListener;
+import com.sap.sailing.nmeaconnector.NMEAWindReceiver;
+import com.sap.sailing.nmeaconnector.NmeaFactory;
+import com.sap.sailing.nmeaconnector.NmeaUtil;
+
+import net.sf.marineapi.nmea.event.AbstractSentenceListener;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.sentence.Sentence;
+
+public class NmeaFactoryImpl implements NmeaFactory {
+
+ @Override
+ public NmeaUtil getUtil() {
+ return new NmeaUtilImpl();
+ }
+
+ @Override
+ public Iterable readWind(InputStream inputStream) throws InterruptedException {
+ final CountDownLatch finishedLatch = new CountDownLatch(1);
+ final List result = new ArrayList<>();
+ final SentenceReader sentenceReader = new SentenceReader(inputStream);
+ sentenceReader.addSentenceListener(new AbstractSentenceListener() {
+ @Override
+ public void readingStopped() {
+ finishedLatch.countDown();
+ }
+
+ @Override
+ public void sentenceRead(Sentence sentence) {}
+ });
+ final NMEAWindReceiver receiver = new NMEAWindReceiverImpl(sentenceReader);
+ receiver.addWindListener(new WindListener() {
+ @Override
+ public void windDataReceived(Wind wind) {
+ result.add(wind);
+ }
+ @Override public void windDataRemoved(Wind wind) {}
+ @Override public void windAveragingChanged(long oldMillisecondsOverWhichToAverage, long newMillisecondsOverWhichToAverage) {}
+ });
+ sentenceReader.start();
+ finishedLatch.await();
+ return result;
+ }
+}
diff --git a/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/NmeaUtilImpl.java b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/NmeaUtilImpl.java
new file mode 100755
index 00000000000..faaa7036dbb
--- /dev/null
+++ b/java/com.sap.sailing.nmeaconnector/src/com/sap/sailing/nmeaconnector/impl/NmeaUtilImpl.java
@@ -0,0 +1,118 @@
+package com.sap.sailing.nmeaconnector.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.sap.sailing.domain.base.impl.KilometersPerHourSpeedWithBearingImpl;
+import com.sap.sailing.domain.common.Bearing;
+import com.sap.sailing.domain.common.Position;
+import com.sap.sailing.domain.common.Speed;
+import com.sap.sailing.domain.common.SpeedWithBearing;
+import com.sap.sailing.domain.common.Wind;
+import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
+import com.sap.sailing.domain.common.impl.KilometersPerHourSpeedImpl;
+import com.sap.sailing.domain.common.impl.KnotSpeedImpl;
+import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
+import com.sap.sailing.domain.common.impl.WindImpl;
+import com.sap.sailing.nmeaconnector.NmeaUtil;
+import com.sap.sse.common.TimePoint;
+
+import net.sf.marineapi.nmea.parser.SentenceFactory;
+import net.sf.marineapi.nmea.parser.SentenceParser;
+import net.sf.marineapi.nmea.sentence.MWVSentence;
+import net.sf.marineapi.nmea.util.Units;
+
+public class NmeaUtilImpl implements NmeaUtil {
+ private static Map> proprietaryParsers;
+
+ static {
+ proprietaryParsers = new HashMap<>();
+ proprietaryParsers.put("BAT", BATParser.class);
+ proprietaryParsers.put("AAM", AAMParser.class);
+ proprietaryParsers.put("GLC", GLCParser.class);
+ proprietaryParsers.put("BWC", BWCParser.class);
+ proprietaryParsers.put("BWR", BWRParser.class);
+ }
+
+ @Override
+ public void registerAdditionalParsers() {
+ SentenceFactory sentenceFactory = SentenceFactory.getInstance();
+ for (Entry> e : proprietaryParsers.entrySet()) {
+ if (!sentenceFactory.hasParser(e.getKey())) {
+ sentenceFactory.registerParser(e.getKey(), e.getValue());
+ }
+ }
+ }
+
+ @Override
+ public void unregisterAdditionalParsers() {
+ SentenceFactory sentenceFactory = SentenceFactory.getInstance();
+ for (Entry> e : proprietaryParsers.entrySet()) {
+ if (!sentenceFactory.hasParser(e.getKey())) {
+ sentenceFactory.unregisterParser(e.getValue());
+ }
+ }
+ }
+
+ @Override
+ public Wind getWind(TimePoint timePoint, Position position, MWVSentence mwvSentence) {
+ return new WindImpl(position, timePoint, new KnotSpeedWithBearingImpl(mwvSentence.getSpeed(),
+ new DegreeBearingImpl(mwvSentence.getAngle())));
+ }
+
+ @Override
+ public Speed getSpeed(double magnitude, Units unit) {
+ switch (unit) {
+ case KMH:
+ return new KilometersPerHourSpeedImpl(magnitude);
+ case KNOT:
+ return new KnotSpeedImpl(magnitude);
+ case METER:
+ return new KilometersPerHourSpeedImpl(magnitude * 3.6);
+ default:
+ throw new IllegalArgumentException("Unit "+unit+" not understood for a speed");
+ }
+ }
+
+ @Override
+ public SpeedWithBearing getSpeedWithBearing(double speedMagnitude, Units speedUnit, double bearingInDegrees) {
+ Bearing bearing = new DegreeBearingImpl(bearingInDegrees);
+ switch (speedUnit) {
+ case KMH:
+ return new KilometersPerHourSpeedWithBearingImpl(speedMagnitude, bearing);
+ case KNOT:
+ return new KnotSpeedWithBearingImpl(speedMagnitude, bearing);
+ case METER:
+ return new KilometersPerHourSpeedWithBearingImpl(speedMagnitude * 3.6, bearing);
+ default:
+ throw new IllegalArgumentException("Unit "+speedUnit+" not understood for a speed");
+ }
+ }
+
+ @Override
+ public String replace(String nmeaSentence, String regexToFind, String replaceWith) {
+ while (nmeaSentence.matches(".*" + regexToFind + ".*")) {
+ final String resultWithOldChecksum = nmeaSentence.replaceFirst(regexToFind, replaceWith);
+ if (resultWithOldChecksum.matches(".*\\*[0-9a-fA-F][0-9a-fA-F]$")) {
+ // found checksum
+ int checksum = Integer.valueOf(resultWithOldChecksum.substring(resultWithOldChecksum.length() - 2), 16);
+ for (char oldChar : regexToFind.toCharArray()) {
+ checksum ^= (byte) oldChar;
+ }
+ for (char newChar : replaceWith.toCharArray()) {
+ checksum ^= (byte) newChar;
+ }
+ String newHexChecksum = Integer.toHexString(checksum).toUpperCase();
+ if (newHexChecksum.length() == 1) {
+ newHexChecksum = "0" + newHexChecksum;
+ }
+ nmeaSentence = resultWithOldChecksum.substring(0, resultWithOldChecksum.length() - 2) + newHexChecksum;
+ } else {
+ nmeaSentence = resultWithOldChecksum;
+ }
+ }
+ return nmeaSentence;
+ }
+
+}
diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/StatisticsJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/StatisticsJsonDeserializer.java
index f71b8c5af25..6e9e34f0f23 100644
--- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/StatisticsJsonDeserializer.java
+++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/StatisticsJsonDeserializer.java
@@ -2,15 +2,32 @@ package com.sap.sailing.server.gateway.deserialization.impl;
import org.json.simple.JSONObject;
+import com.sap.sailing.domain.base.Competitor;
+import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.common.Distance;
+import com.sap.sailing.domain.common.Speed;
+import com.sap.sailing.domain.common.impl.KnotSpeedImpl;
import com.sap.sailing.domain.common.impl.MeterDistance;
import com.sap.sailing.domain.statistics.Statistics;
import com.sap.sailing.domain.statistics.impl.StatisticsImpl;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.StatisticsJsonSerializer;
+import com.sap.sse.common.TimePoint;
+import com.sap.sse.common.Util.Triple;
+import com.sap.sse.common.impl.MillisecondsTimePoint;
public class StatisticsJsonDeserializer implements JsonDeserializer {
+
+ private final CompetitorJsonDeserializer competitorJsonDeserializer;
+
+ public static StatisticsJsonDeserializer create(SharedDomainFactory baseDomainFactory) {
+ return new StatisticsJsonDeserializer(CompetitorJsonDeserializer.create(baseDomainFactory));
+ }
+
+ private StatisticsJsonDeserializer(CompetitorJsonDeserializer competitorJsonDeserializer) {
+ this.competitorJsonDeserializer = competitorJsonDeserializer;
+ }
@Override
public Statistics deserialize(JSONObject object) throws JsonDeserializationException {
@@ -21,7 +38,17 @@ public class StatisticsJsonDeserializer implements JsonDeserializer
long gpsFixes = getLongValue(object, StatisticsJsonSerializer.FIELD_NUMBER_OF_GPS_FIXES);
long windFixes = getLongValue(object, StatisticsJsonSerializer.FIELD_NUMBER_OF_WIND_FIXES);
Distance distance = new MeterDistance(getDoubleValue(object, StatisticsJsonSerializer.FIELD_DISTANCE_TRAVELED_IN_METERS));
- return new StatisticsImpl(competitors, regattas, races, trackedRaces, gpsFixes, windFixes, distance);
+ JSONObject maxSpeedObject = (JSONObject) object.get(StatisticsJsonSerializer.FIELD_MAX_SPEED);
+ final Triple maxSpeed;
+ if (maxSpeedObject != null) {
+ final Competitor fastestCompetitor = competitorJsonDeserializer.deserialize((JSONObject) maxSpeedObject.get(StatisticsJsonSerializer.FIELD_FASTEST_COMPETITOR));
+ final Speed fastestCompetitorSpeed = new KnotSpeedImpl(getDoubleValue(maxSpeedObject, StatisticsJsonSerializer.FIELD_FASTEST_COMPETITOR_SPEED_IN_KNOTS));
+ final TimePoint timePoint = new MillisecondsTimePoint(getLongValue(maxSpeedObject, StatisticsJsonSerializer.FIELD_TIMEPOINT_MILLIS));
+ maxSpeed = new Triple(fastestCompetitor, fastestCompetitorSpeed, timePoint);
+ } else {
+ maxSpeed = null;
+ }
+ return new StatisticsImpl(competitors, regattas, races, trackedRaces, gpsFixes, windFixes, distance, maxSpeed);
}
private int getIntValue(JSONObject object, String field) {
diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/StatisticsJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/StatisticsJsonSerializer.java
index 57948e4e1cf..2ceb58cf8b5 100644
--- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/StatisticsJsonSerializer.java
+++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/StatisticsJsonSerializer.java
@@ -2,8 +2,12 @@ package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
+import com.sap.sailing.domain.base.Competitor;
+import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.statistics.Statistics;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
+import com.sap.sse.common.TimePoint;
+import com.sap.sse.common.Util.Triple;
public class StatisticsJsonSerializer implements JsonSerializer {
@@ -14,6 +18,12 @@ public class StatisticsJsonSerializer implements JsonSerializer {
public static final String FIELD_NUMBER_OF_GPS_FIXES = "numberOfGPSFixes";
public static final String FIELD_NUMBER_OF_WIND_FIXES = "numberOfWindFixes";
public static final String FIELD_DISTANCE_TRAVELED_IN_METERS = "distanceTraveledInMeters";
+ public static final String FIELD_MAX_SPEED = "maxSpeed";
+ public static final String FIELD_FASTEST_COMPETITOR = "fastestCompetitor";
+ public static final String FIELD_FASTEST_COMPETITOR_SPEED_IN_KNOTS = "fastestCompetitorSpeedInKnots";
+ public static final String FIELD_TIMEPOINT_MILLIS = "timepointMillis";
+
+ private final CompetitorJsonSerializer competitorJsonSerializer = CompetitorJsonSerializer.create();
@Override
public JSONObject serialize(Statistics object) {
@@ -25,6 +35,16 @@ public class StatisticsJsonSerializer implements JsonSerializer {
result.put(FIELD_NUMBER_OF_GPS_FIXES, object.getNumberOfGPSFixes());
result.put(FIELD_NUMBER_OF_WIND_FIXES, object.getNumberOfWindFixes());
result.put(FIELD_DISTANCE_TRAVELED_IN_METERS, object.getDistanceTraveled().getMeters());
+ final Triple maxSpeed = object.getMaxSpeed();
+ if (maxSpeed != null) {
+ JSONObject maxSpeedObject = new JSONObject();
+
+ maxSpeedObject.put(FIELD_FASTEST_COMPETITOR, competitorJsonSerializer.serialize(maxSpeed.getA()));
+ maxSpeedObject.put(FIELD_FASTEST_COMPETITOR_SPEED_IN_KNOTS, maxSpeed.getB().getKnots());
+ maxSpeedObject.put(FIELD_TIMEPOINT_MILLIS, maxSpeed.getC().asMillis());
+
+ result.put(FIELD_MAX_SPEED, maxSpeedObject);
+ }
return result;
}
}
diff --git a/java/com.sap.sailing.server.gateway/META-INF/MANIFEST.MF b/java/com.sap.sailing.server.gateway/META-INF/MANIFEST.MF
index 70725e25a12..9833131ba55 100644
--- a/java/com.sap.sailing.server.gateway/META-INF/MANIFEST.MF
+++ b/java/com.sap.sailing.server.gateway/META-INF/MANIFEST.MF
@@ -59,7 +59,8 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sse.datamining.shared;bundle-version="1.0.0",
com.sap.sailing.datamining,
com.sap.sailing.server,
- com.sap.sailing.grib
+ com.sap.sailing.grib,
+ com.sap.sailing.nmeaconnector
Bundle-ClassPath: .
Web-ContextPath: /sailingserver
Export-Package: com.sap.sailing.server.gateway,
diff --git a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml
index 48ebcaa39e9..88e08143335 100644
--- a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml
+++ b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml
@@ -131,7 +131,16 @@
/grib-wind-import
-
+
+ NmeaWindImportServlet
+ com.sap.sailing.server.gateway.windimport.nmea.NmeaWindImportServlet
+
+
+ NmeaWindImportServlet
+ /nmea-wind-import
+
+
+
ExpeditionWindMeasureStatusGetServlet
com.sap.sailing.server.gateway.impl.ExpeditionWindMeasureStatusGetServlet
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/AbstractWindImportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/AbstractWindImportServlet.java
index 9b362a2d53f..f057de15f7b 100755
--- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/AbstractWindImportServlet.java
+++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/AbstractWindImportServlet.java
@@ -198,7 +198,7 @@ public abstract class AbstractWindImportServlet extends SailingServerHttpServlet
response.getWriter().append(windImportResult.json().toJSONString());
}
- protected abstract Iterable importWind(Map streamsWithFilenames) throws IOException;
+ protected abstract Iterable importWind(Map streamsWithFilenames) throws IOException, InterruptedException;
protected abstract WindSource getWindSource(UploadRequest uploadRequest);
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/nmea/NmeaWindImportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/nmea/NmeaWindImportServlet.java
new file mode 100755
index 00000000000..a711e47293a
--- /dev/null
+++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/windimport/nmea/NmeaWindImportServlet.java
@@ -0,0 +1,76 @@
+package com.sap.sailing.server.gateway.windimport.nmea;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.logging.Logger;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import com.sap.sailing.domain.common.Wind;
+import com.sap.sailing.domain.common.WindSource;
+import com.sap.sailing.domain.common.WindSourceType;
+import com.sap.sailing.domain.common.impl.WindSourceWithAdditionalID;
+import com.sap.sailing.nmeaconnector.NmeaFactory;
+import com.sap.sailing.server.gateway.windimport.AbstractWindImportServlet;
+import com.sap.sse.common.Util;
+import com.sap.sse.common.impl.MillisecondsTimePoint;
+
+public class NmeaWindImportServlet extends AbstractWindImportServlet {
+ private static final long serialVersionUID = -4547876638456305135L;
+ private static final Logger logger = Logger.getLogger(NmeaWindImportServlet.class.getName());
+
+ @Override
+ protected WindSource getWindSource(UploadRequest uploadRequest) {
+ final WindSource windSource;
+ final String sourceName;
+ logger.info("Importing NMEA wind data from "+uploadRequest.files);
+ if (uploadRequest.files != null && !uploadRequest.files.isEmpty()) {
+ sourceName = uploadRequest.files.toString();
+ } else {
+ sourceName = "NMEA Wind Import";
+ }
+ windSource = new WindSourceWithAdditionalID(WindSourceType.WEB, sourceName + "@" + MillisecondsTimePoint.now());
+ return windSource;
+ }
+
+ @Override
+ protected Iterable importWind(Map inputStreamsAndFilenames) throws IOException, InterruptedException {
+ final Iterable result;
+ if (inputStreamsAndFilenames != null && inputStreamsAndFilenames.size() == 1) {
+ logger.info("Reading NMEA wind data from "+inputStreamsAndFilenames.values().iterator().next());
+ result = readWind(inputStreamsAndFilenames.values().iterator().next(), inputStreamsAndFilenames.keySet().iterator().next());
+ } else {
+ final List windList = new LinkedList<>();
+ for (final Entry inputStreamAndFileName : inputStreamsAndFilenames.entrySet()) {
+ logger.info("Reading NMEA wind data from "+inputStreamAndFileName.getValue());
+ Util.addAll(readWind(inputStreamAndFileName.getValue(), inputStreamAndFileName.getKey()), windList);
+ }
+ result = windList;
+ }
+ return result;
+ }
+
+ private Iterable readWind(String filename, InputStream inputStream) throws InterruptedException, IOException {
+ final Iterable result;
+ if (filename.toLowerCase().endsWith("zip")) {
+ logger.info("NMEA file "+filename+" is a ZIP file");
+ final List windList = new LinkedList<>();
+ final ZipInputStream zipInputStream = new ZipInputStream(inputStream);
+ ZipEntry entry;
+ while ((entry=zipInputStream.getNextEntry()) != null) {
+ if (entry.getName().toLowerCase().endsWith(".txt")) {
+ logger.info("Reading NMEA wind data from "+filename+"'s ZIP entry "+entry.getName());
+ Util.addAll(NmeaFactory.INSTANCE.readWind(zipInputStream), windList);
+ }
+ }
+ result = windList;
+ } else {
+ result = NmeaFactory.INSTANCE.readWind(inputStream);
+ }
+ return result;
+ }
+}
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch
index 9310279f89b..f88e98a5dec 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy OSX).launch
@@ -34,5 +34,5 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch
index 5fdc452b5ea..08dd1fe63e7 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch
@@ -36,5 +36,5 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch
index e874bda6c88..51869c17f6a 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch
@@ -33,5 +33,5 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch
index dfcc3890577..966a9e45237 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch
@@ -27,6 +27,6 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch
index 80260f9787c..b22e335cf3d 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch
@@ -16,7 +16,7 @@
-
+
@@ -27,6 +27,6 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch
index 41e436d9ae8..2ad6feccaba 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate dev).launch
@@ -27,6 +27,6 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch
index be8e9a1e91a..ad96b3d18e1 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, auto-replicate).launch
@@ -29,6 +29,6 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch
index 1830b2a0cde..ccf672e9f3d 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch
@@ -27,6 +27,6 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch
index 552547e7509..29b3a5bdec3 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch
@@ -27,5 +27,5 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch
index 463f29114f5..6ed8b35b55e 100644
--- a/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch
+++ b/java/com.sap.sailing.server/SailingServer (No Proxy, winddbTest).launch
@@ -33,5 +33,5 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (Proxy).launch b/java/com.sap.sailing.server/SailingServer (Proxy).launch
index 01f111cfe94..1d74ca7bea4 100644
--- a/java/com.sap.sailing.server/SailingServer (Proxy).launch
+++ b/java/com.sap.sailing.server/SailingServer (Proxy).launch
@@ -36,6 +36,6 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch
index 50c30ce398a..a8f36f33c71 100644
--- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch
+++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch
@@ -27,6 +27,6 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch
index da143d14036..fb905308c40 100644
--- a/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch
+++ b/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch
@@ -27,5 +27,5 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch b/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch
index 313e43dfd8f..e494c8e6c9f 100644
--- a/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch
+++ b/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch
@@ -26,5 +26,5 @@
-
+
diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch
index ca123d2d151..3fdeaffdfb8 100644
--- a/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch
+++ b/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch
@@ -28,6 +28,6 @@
-
+
diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java
index 3e9fd19e001..b73010ad90f 100644
--- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java
+++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java
@@ -626,7 +626,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
});
this.dataImportLock = new DataImportLockWithProgress();
- remoteSailingServerSet = new RemoteSailingServerSet(scheduler);
+ remoteSailingServerSet = new RemoteSailingServerSet(scheduler, baseDomainFactory);
regattasByName = new ConcurrentHashMap();
regattasByNameLock = new NamedReentrantReadWriteLock("regattasByName for " + this, /* fair */false);
eventsById = new ConcurrentHashMap();
diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RemoteSailingServerSet.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RemoteSailingServerSet.java
index 9e339bc8098..6ce1dfc7762 100644
--- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RemoteSailingServerSet.java
+++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RemoteSailingServerSet.java
@@ -29,6 +29,7 @@ import org.json.simple.parser.ParseException;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.EventBase;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
+import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.statistics.Statistics;
import com.sap.sailing.server.gateway.deserialization.impl.CourseAreaJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.EventBaseJsonDeserializer;
@@ -64,12 +65,14 @@ public class RemoteSailingServerSet {
private final ConcurrentMap, Exception>> cachedEventsForRemoteSailingServers;
private final ConcurrentMap, Exception>> cachedStatisticsByYearForRemoteSailingServers;
+ private final StatisticsJsonDeserializer statisticsJsonDeserializer;
/**
* @param scheduler
* Used to schedule the periodic updates of the {@link #cachedEventsForRemoteSailingServers event cache}
*/
- public RemoteSailingServerSet(ScheduledExecutorService scheduler) {
+ public RemoteSailingServerSet(ScheduledExecutorService scheduler, SharedDomainFactory baseDomainFactory) {
+ this.statisticsJsonDeserializer = StatisticsJsonDeserializer.create(baseDomainFactory);
remoteSailingServers = new ConcurrentHashMap<>();
cachedEventsForRemoteSailingServers = new ConcurrentHashMap<>();
cachedStatisticsByYearForRemoteSailingServers = new ConcurrentHashMap<>();
@@ -169,8 +172,7 @@ public class RemoteSailingServerSet {
final URL statisticsByYearURL = getStatisticsByYearURL(ref.getURL());
logger.fine("Updating by-year statistics for remote server " + ref + " from URL " + statisticsByYearURL);
JSONArray statisticsByYear = getJsonFromRemoteServerSynchronously(ref, statisticsByYearURL);
- StatisticsByYearJsonDeserializer deserializer = new StatisticsByYearJsonDeserializer(
- new StatisticsJsonDeserializer());
+ StatisticsByYearJsonDeserializer deserializer = new StatisticsByYearJsonDeserializer(statisticsJsonDeserializer);
final Map statisticsByYearMap = new HashMap<>();
for (Object entry : statisticsByYear) {
JSONObject jsonEntry = (JSONObject) entry;
diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/StatisticsAggregator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/StatisticsAggregator.java
index 949f1445b24..15810ce4979 100644
--- a/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/StatisticsAggregator.java
+++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/StatisticsAggregator.java
@@ -1,8 +1,12 @@
package com.sap.sailing.server.statistics;
+import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.Distance;
+import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.statistics.Statistics;
import com.sap.sailing.domain.statistics.impl.StatisticsImpl;
+import com.sap.sse.common.TimePoint;
+import com.sap.sse.common.Util.Triple;
/**
* Aggregates local and remote {@link Statistics} to get the overall statistics values.
@@ -16,6 +20,7 @@ public class StatisticsAggregator {
private long numberOfGPSFixes = 0l;
private long numberOfWindFixes = 0l;
private Distance distanceTraveled = Distance.NULL;
+ private Triple maxSpeed = null;
public void addStatistics(Statistics remoteStatisticsForYear) {
competitors += remoteStatisticsForYear.getNumberOfCompetitors();
@@ -25,10 +30,16 @@ public class StatisticsAggregator {
numberOfGPSFixes += remoteStatisticsForYear.getNumberOfGPSFixes();
numberOfWindFixes += remoteStatisticsForYear.getNumberOfWindFixes();
distanceTraveled = distanceTraveled.add(remoteStatisticsForYear.getDistanceTraveled());
+
+ final Triple maxSpeedFromStatisticsToAdd = remoteStatisticsForYear.getMaxSpeed();
+ if (maxSpeedFromStatisticsToAdd != null
+ && (maxSpeed == null || maxSpeedFromStatisticsToAdd.getB().compareTo(maxSpeed.getB()) > 0)) {
+ maxSpeed = maxSpeedFromStatisticsToAdd;
+ }
}
public Statistics getStatistics() {
return new StatisticsImpl(competitors, regattas, races, trackedRaces, numberOfGPSFixes, numberOfWindFixes,
- distanceTraveled);
+ distanceTraveled, maxSpeed);
}
}
diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/StatisticsCalculator.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/StatisticsCalculator.java
index 4428b8b3452..0d3cd547cb6 100644
--- a/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/StatisticsCalculator.java
+++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/StatisticsCalculator.java
@@ -130,6 +130,6 @@ public class StatisticsCalculator {
return new StatisticsImpl(getNumberOfCompetitors(), getNumberOfRegattas(),
getNumberOfRaces(), getNumberOfTrackedRaces(),
getNumberOfGPSFixes(), getNumberOfWindFixes(),
- getTotalDistanceTraveled());
+ getTotalDistanceTraveled(), getMaxSpeed());
}
}
diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/TrackedRaceStatisticsCacheImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/TrackedRaceStatisticsCacheImpl.java
index 9415ba01acc..35737d9f563 100644
--- a/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/TrackedRaceStatisticsCacheImpl.java
+++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/statistics/TrackedRaceStatisticsCacheImpl.java
@@ -150,7 +150,7 @@ public class TrackedRaceStatisticsCacheImpl extends AbstractTrackedRegattaAndRac
public TrackedRaceStatistics computeCacheUpdate(TrackedRace trackedRace, EmptyUpdateInterval updateInterval)
throws Exception {
logger.log(Level.FINE, ()->"Updating statistics for race " + trackedRace.getRaceIdentifier());
- return new TrackedRaceStatisticsCalculator(trackedRace, false, true).getStatistics();
+ return new TrackedRaceStatisticsCalculator(trackedRace, true, true).getStatistics();
}
}
diff --git a/java/com.sap.sailing.www/release_notes_admin.html b/java/com.sap.sailing.www/release_notes_admin.html
index 82567582a43..c7e9e3c9391 100755
--- a/java/com.sap.sailing.www/release_notes_admin.html
+++ b/java/com.sap.sailing.www/release_notes_admin.html
@@ -22,6 +22,17 @@
Release Notes - Administration Console
+
August 2017
+
+ An NMEA wind import feature is now available under "Tracked Races -- Wind." It can be
+ used to import .txt and .zip files containing data in NMEA-0183 format. The importer
+ recognizes wind data provided by MWD and MDA sentences but can also use apparent and true
+ wind readings from MWV sentences which are then combined with position, heading and motion data
+ to obtain a true wind speed and direction. ZIP files are searched for .txt files which
+ are then analyzed.
+
+
+
July 2017
The sort order of Events/Leaderboards in event series in Home.html is now more consistent
diff --git a/java/net.sf.marineapi.test/.classpath b/java/net.sf.marineapi.test/.classpath
new file mode 100644
index 00000000000..110168ffa19
--- /dev/null
+++ b/java/net.sf.marineapi.test/.classpath
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/java/net.sf.marineapi.test/.gitignore b/java/net.sf.marineapi.test/.gitignore
new file mode 100644
index 00000000000..092357e47d3
--- /dev/null
+++ b/java/net.sf.marineapi.test/.gitignore
@@ -0,0 +1 @@
+bin
diff --git a/java/net.sf.marineapi.test/.project b/java/net.sf.marineapi.test/.project
new file mode 100755
index 00000000000..e04929144ac
--- /dev/null
+++ b/java/net.sf.marineapi.test/.project
@@ -0,0 +1,28 @@
+
+
+ net.sf.marineapi.test
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/java/net.sf.marineapi.test/.settings/org.eclipse.jdt.core.prefs b/java/net.sf.marineapi.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a698e59674f
--- /dev/null
+++ b/java/net.sf.marineapi.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/java/net.sf.marineapi.test/.settings/org.eclipse.pde.core.prefs b/java/net.sf.marineapi.test/.settings/org.eclipse.pde.core.prefs
new file mode 100755
index 00000000000..f29e940a005
--- /dev/null
+++ b/java/net.sf.marineapi.test/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/java/net.sf.marineapi.test/META-INF/MANIFEST.MF b/java/net.sf.marineapi.test/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..025f7cb0f4a
--- /dev/null
+++ b/java/net.sf.marineapi.test/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test
+Bundle-SymbolicName: net.sf.marineapi.test
+Bundle-Version: 1.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Fragment-Host: net.sf.marineapi
+Require-Bundle: org.junit;bundle-version="4.8.2"
diff --git a/java/net.sf.marineapi.test/build.properties b/java/net.sf.marineapi.test/build.properties
new file mode 100755
index 00000000000..0a97af7a804
--- /dev/null
+++ b/java/net.sf.marineapi.test/build.properties
@@ -0,0 +1,6 @@
+source.. = src/,\
+ resources/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ resources/
diff --git a/java/net.sf.marineapi.test/pom.xml b/java/net.sf.marineapi.test/pom.xml
new file mode 100644
index 00000000000..b507c5ef97d
--- /dev/null
+++ b/java/net.sf.marineapi.test/pom.xml
@@ -0,0 +1,12 @@
+
+
+ 4.0.0
+
+ root
+ com.sap.sailing
+ 1.0.0-SNAPSHOT
+
+ net.sf.marineapi.test
+ eclipse-test-plugin
+
diff --git a/java/net.sf.marineapi.test/resources/data/AIS-VDM-VDO.txt b/java/net.sf.marineapi.test/resources/data/AIS-VDM-VDO.txt
new file mode 100755
index 00000000000..c970016602b
--- /dev/null
+++ b/java/net.sf.marineapi.test/resources/data/AIS-VDM-VDO.txt
@@ -0,0 +1,19 @@
+!AIVDM,1,1,,A,13u?etPv2;0n:dDPwUM1U1Cb069D,0*23
+!AIVDM,1,1,,A,400TcdiuiT7VDR>3nIfr6>i00000,0*78
+!AIVDM,2,1,0,A,58wt8Ui`g??r21`7S=:220588OA;0sk,0*7B
+!AIVDM,2,2,0,A,eQ8823mDm3kP00000000000,2*5D
+!AIVDM,2,1,9,B,61c2;qLPH1m@wsm6ARhp34k;S8i=3To,0*2C
+!AIVDM,2,2,9,B,Djhi=3Di<2pp=34k>4D,2*03
+!AIVDM,1,1,1,B,8>h8nkP0Glr=>M4fWA<59B1@E=@,0*17
+!AIVDM,1,1,,A,B6CdCm0t3`tba35f@V9faHi7kP06,0*58
+!AIVDM,2,1,0,B,C8u:8C@t7@TnGCKfm6Po`e6N`:Va0L2J;06HV50JV?SjBPL3,0*28
+!AIVDM,2,2,0,B,11RP,0*17
+!AIVDO,2,1,5,B,E1c2;q@b44ah4ah0h:2ab@70VRpU0U>0600:1Dp,2*7D
+!AIVDO,1,1,,B,H1c2;qDTijklmno31<E6fE700@GO,0*4D
+!AIVDM,2,1,1,A,55?MbV02;H;s;h00Fc>jpUlNV@ikwpUoP06,0*4C
+!AIVDM,1,1,,A,B52KB8h006fu`Q6:g1McCwb5oP06,0*00
+!AIVDM,1,1,,B,B5O6hr00NhWAwwo862PaLELTBJ:V00000000S0D:R220,0*0B
+!AIVDM,1,1,,A,H42O55i18tMET00000000000000,2*6D
+!AIVDM,1,1,,A,H42O55lti4hhhilD3nink000?050,0*40
+
+# 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
+
+# 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
diff --git a/java/net.sf.marineapi.test/resources/data/Garmin-GPS15.txt b/java/net.sf.marineapi.test/resources/data/Garmin-GPS15.txt
new file mode 100644
index 00000000000..a751ceeffe7
--- /dev/null
+++ b/java/net.sf.marineapi.test/resources/data/Garmin-GPS15.txt
@@ -0,0 +1,1937 @@
+$GPGGA,220550,4124.7580,N,08152.2565,W,2,04,4.4,235.1,M,-34.0,M,,*7B
+$GPGSA,A,2,02,,,,,,,26,,29,,35,4.5,4.4,1.0*38
+$PGRME,16.4,M,13.9,M,21.5,M*10
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220555,4124.7580,N,08152.2563,W,2,04,3.9,235.9,M,-34.0,M,,*7A
+$GPGSA,A,2,02,,,,,,,26,,29,,35,4.0,3.9,1.0*37
+$PGRME,16.4,M,13.9,M,21.5,M*10
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220600,4124.7579,N,08152.2561,W,2,04,3.9,236.6,M,-34.0,M,,*71
+$GPGSA,A,2,02,,,,,,,26,,29,,35,4.0,3.9,1.0*37
+$PGRME,16.4,M,13.9,M,21.5,M*10
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220605,4124.7578,N,08152.2560,W,2,04,3.7,236.2,M,-34.0,M,,*7E
+$GPGSA,A,2,02,,,,,,,26,,29,,35,3.8,3.7,1.0*36
+$PGRME,16.5,M,14.0,M,21.7,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220610,4124.7576,N,08152.2558,W,2,04,3.7,236.1,M,-34.0,M,,*7C
+$GPGSA,A,2,02,,,,,,,26,,29,,35,3.8,3.7,1.0*36
+$PGRME,16.5,M,14.0,M,21.7,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220615,4124.7574,N,08152.2556,W,2,04,3.7,236.8,M,-34.0,M,,*7C
+$GPGSA,A,2,02,,,,,,,26,,29,,35,3.8,3.7,1.0*36
+$PGRME,16.5,M,14.0,M,21.7,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220620,4124.7573,N,08152.2555,W,2,04,4.4,237.6,M,-34.0,M,,*75
+$GPGSA,A,2,02,,,,,,,26,,29,,35,4.5,4.4,1.0*38
+$PGRME,16.4,M,13.9,M,21.5,M*10
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220625,4124.7571,N,08152.2554,W,2,04,4.6,237.6,M,-34.0,M,,*71
+$GPGSA,A,2,02,,,,,,,26,,29,,35,4.8,4.6,1.0*37
+$PGRME,16.5,M,14.0,M,21.7,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220630,4124.7570,N,08152.2553,W,2,04,4.7,238.8,M,-34.0,M,,*73
+$GPGSA,A,2,,06,,,,,,26,,29,,35,5.2,4.7,1.6*3F
+$PGRME,10.3,M,14.1,M,18.7,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220635,4124.7569,N,08152.2552,W,2,05,3.1,239.6,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.3,3.1,1.0*3C
+$PGRME,10.7,M,11.1,M,16.8,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220640,4124.7567,N,08152.2551,W,2,04,2.8,239.6,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,,,29,,35,3.0,2.8,1.0*33
+$PGRME,10.3,M,11.1,M,15.1,M*18
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220645,4124.7566,N,08152.2550,W,2,04,3.1,241.7,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,,,29,,35,3.3,3.1,1.0*38
+$PGRME,10.3,M,11.1,M,15.1,M*18
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220650,4124.7564,N,08152.2549,W,2,04,2.8,241.7,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,,,29,,35,3.0,2.8,1.0*33
+$PGRME,10.3,M,11.1,M,15.1,M*18
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220655,4124.7563,N,08152.2549,W,2,04,3.1,241.8,M,-34.0,M,,*76
+$GPGSA,A,2,,06,,,,,,26,,29,,35,3.3,3.1,1.0*3F
+$PGRME,10.2,M,11.1,M,15.1,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220700,4124.7560,N,08152.2547,W,2,05,3.1,241.9,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.3,3.1,1.0*3C
+$PGRME,10.5,M,11.1,M,15.3,M*1C
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220705,4124.7559,N,08152.2547,W,2,04,2.8,242.1,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,,,29,,35,3.0,2.8,1.0*33
+$PGRME,10.2,M,11.1,M,15.1,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220710,4124.7557,N,08152.2546,W,2,05,3.5,242.4,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.5,1.6*3E
+$PGRME,8.0,M,7.4,M,10.9,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220715,4124.7555,N,08152.2545,W,2,05,3.5,242.0,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.5,1.6*3E
+$PGRME,8.0,M,7.4,M,10.9,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220720,4124.7553,N,08152.2544,W,2,05,3.9,243.2,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.0,3.9,1.6*37
+$PGRME,8.0,M,7.4,M,11.0,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220725,4124.7551,N,08152.2543,W,2,05,4.2,242.5,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.3,4.2,1.6*38
+$PGRME,9.0,M,7.4,M,11.8,M*1C
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,220730,4124.7549,N,08152.2543,W,2,05,3.4,241.4,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.8*31
+$PGRME,7.9,M,6.6,M,10.2,M*13
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,220735,4124.7547,N,08152.2542,W,2,05,3.6,239.5,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,2.3*36
+$PGRME,7.9,M,6.6,M,10.3,M*12
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,220740,4124.7546,N,08152.2541,W,2,05,3.7,238.6,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.7,1.0*38
+$PGRME,8.0,M,7.4,M,11.0,M*15
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,220745,4124.7545,N,08152.2541,W,2,05,3.6,239.9,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,1.8*3E
+$PGRME,8.0,M,7.4,M,11.0,M*15
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,220750,4124.7544,N,08152.2540,W,2,05,3.8,239.3,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.0,3.8,1.0*30
+$PGRME,8.0,M,7.4,M,11.0,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220755,4124.7544,N,08152.2539,W,2,05,3.8,234.3,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.1,3.8,1.6*37
+$PGRME,8.0,M,7.4,M,11.0,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220800,4124.7544,N,08152.2539,W,2,05,3.6,233.4,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,2.3*36
+$PGRME,7.9,M,6.6,M,10.3,M*12
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,220805,4124.7543,N,08152.2538,W,2,05,3.6,236.1,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,2.3*36
+$PGRME,7.9,M,6.6,M,10.3,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220810,4124.7543,N,08152.2538,W,2,05,3.4,238.4,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.2*3B
+$PGRME,7.9,M,6.6,M,10.3,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220815,4124.7542,N,08152.2537,W,2,05,3.6,241.8,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,1.8*3E
+$PGRME,7.9,M,6.6,M,10.3,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220820,4124.7542,N,08152.2537,W,2,05,4.0,245.4,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.4,4.0,1.6*3D
+$PGRME,7.9,M,6.6,M,10.3,M*12
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,220825,4124.7541,N,08152.2536,W,2,05,3.8,246.2,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.0,3.8,1.0*30
+$PGRME,8.0,M,7.5,M,11.0,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220830,4124.7540,N,08152.2536,W,2,05,3.6,250.3,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,2.3*36
+$PGRME,8.0,M,7.5,M,11.0,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220835,4124.7539,N,08152.2535,W,2,05,4.0,250.4,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.4,4.0,1.6*3D
+$PGRME,8.0,M,7.5,M,11.0,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220840,4124.7537,N,08152.2535,W,2,05,3.6,248.3,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,1.8*3E
+$PGRME,8.0,M,7.5,M,11.0,M*14
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220845,4124.7536,N,08152.2535,W,2,05,3.7,250.3,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.7,1.0*38
+$PGRME,8.0,M,7.5,M,11.0,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220850,4124.7535,N,08152.2535,W,2,05,4.0,247.2,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.4,4.0,1.6*3D
+$PGRME,8.0,M,7.5,M,11.0,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220855,4124.7534,N,08152.2535,W,2,05,4.3,242.3,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.9,4.3,1.6*33
+$PGRME,8.0,M,7.5,M,11.0,M*14
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,220900,4124.7533,N,08152.2535,W,2,05,3.4,237.9,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.8*31
+$PGRME,7.9,M,6.7,M,10.3,M*13
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,220905,4124.7532,N,08152.2535,W,2,05,3.7,235.0,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.8,3.7,1.0*31
+$PGRME,7.9,M,6.6,M,10.3,M*12
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,220910,4124.7532,N,08152.2536,W,2,05,3.4,235.3,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.8*31
+$PGRME,7.9,M,6.7,M,10.3,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220915,4124.7531,N,08152.2536,W,2,05,3.4,234.0,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.7,3.4,1.2*3F
+$PGRME,7.9,M,6.6,M,10.4,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220920,4124.7531,N,08152.2537,W,2,05,3.7,232.0,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.9,3.7,1.0*30
+$PGRME,8.0,M,7.4,M,11.0,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220925,4124.7530,N,08152.2537,W,2,05,4.2,231.9,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.8,4.2,1.2*36
+$PGRME,7.9,M,6.7,M,10.4,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220930,4124.7530,N,08152.2537,W,2,05,3.4,233.0,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,2.1*3B
+$PGRME,7.9,M,6.7,M,10.4,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220935,4124.7530,N,08152.2538,W,2,05,3.6,233.5,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.6,1.0*39
+$PGRME,8.5,M,6.7,M,10.9,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,220940,4124.7530,N,08152.2538,W,2,05,3.4,233.9,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.5*3C
+$PGRME,7.9,M,6.7,M,10.4,M*14
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,220945,4124.7530,N,08152.2539,W,2,05,3.8,233.4,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.0,3.8,1.0*30
+$PGRME,9.0,M,7.3,M,11.9,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,220950,4124.7530,N,08152.2539,W,2,05,3.4,233.5,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.8*31
+$PGRME,7.9,M,6.8,M,10.4,M*1B
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,220955,4124.7530,N,08152.2540,W,2,05,4.0,238.8,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.4,4.0,1.6*3D
+$PGRME,8.0,M,7.6,M,11.1,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221000,4124.7530,N,08152.2540,W,2,05,3.6,244.2,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,2.5*30
+$PGRME,8.0,M,7.6,M,11.1,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221005,4124.7529,N,08152.2540,W,2,05,3.4,245.9,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.6,3.4,1.0*3C
+$PGRME,7.9,M,6.8,M,10.4,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221010,4124.7529,N,08152.2540,W,2,05,3.6,244.3,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.1,3.6,1.6*38
+$PGRME,8.0,M,7.6,M,11.1,M*16
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221015,4124.7528,N,08152.2541,W,2,05,3.6,243.0,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.1,3.6,1.7*39
+$PGRME,8.0,M,7.6,M,11.1,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221020,4124.7527,N,08152.2541,W,2,05,3.6,243.0,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.1,3.6,1.7*39
+$PGRME,8.0,M,7.6,M,11.1,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221025,4124.7527,N,08152.2541,W,2,05,3.8,246.8,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.7,3.8,2.2*37
+$PGRME,8.0,M,7.6,M,11.1,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221030,4124.7526,N,08152.2541,W,2,05,3.8,245.9,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.7,3.8,2.2*37
+$PGRME,7.9,M,6.8,M,10.4,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221035,4124.7526,N,08152.2541,W,2,05,3.6,246.9,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,2.8*3D
+$PGRME,8.0,M,7.6,M,11.1,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221040,4124.7526,N,08152.2541,W,2,05,3.6,247.7,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,2.8*3D
+$PGRME,8.0,M,7.6,M,11.1,M*16
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221045,4124.7525,N,08152.2541,W,2,05,3.8,247.9,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.3,3.8,3.3*32
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221050,4124.7525,N,08152.2541,W,2,05,3.8,249.5,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.1,3.8,1.7*36
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221055,4124.7524,N,08152.2541,W,2,05,3.4,248.9,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.8*31
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221100,4124.7524,N,08152.2540,W,2,05,3.6,247.8,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,2.3*36
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221105,4124.7525,N,08152.2540,W,2,05,3.4,245.3,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,2.4*3E
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221110,4124.7523,N,08152.2540,W,2,05,3.4,244.6,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,2.9*33
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221115,4124.7523,N,08152.2539,W,2,05,3.4,244.7,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,2.9*33
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221120,4124.7523,N,08152.2539,W,2,05,3.4,245.4,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,2.9*33
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221125,4124.7523,N,08152.2539,W,2,05,3.9,246.5,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.4,3.9,1.7*32
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221130,4124.7523,N,08152.2538,W,2,05,3.4,246.7,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.8*31
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221135,4124.7523,N,08152.2538,W,2,05,3.4,246.4,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.8*31
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221140,4124.7522,N,08152.2537,W,2,05,3.4,247.3,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.9*30
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221145,4124.7522,N,08152.2537,W,2,05,3.4,250.3,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,2.1*3B
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221150,4124.7522,N,08152.2536,W,2,05,3.6,253.8,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.6,2.6*33
+$PGRME,7.9,M,6.9,M,10.5,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221155,4124.7522,N,08152.2536,W,2,05,3.7,250.8,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.1,3.7,3.2*3E
+$PGRME,8.0,M,7.7,M,11.2,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221200,4124.7521,N,08152.2535,W,2,05,3.4,249.6,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,2.9*33
+$PGRME,7.9,M,7.0,M,10.5,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221205,4124.7521,N,08152.2534,W,2,05,3.4,248.6,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,2.9*33
+$PGRME,7.9,M,7.0,M,10.5,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221210,4124.7521,N,08152.2534,W,2,05,3.6,248.2,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.6,2.9*33
+$PGRME,7.9,M,7.0,M,10.5,M*13
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221215,4124.7521,N,08152.2533,W,2,05,3.6,248.2,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.7,3.6,3.0*3A
+$PGRME,7.9,M,7.0,M,10.5,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221220,4124.7520,N,08152.2533,W,2,05,3.6,248.4,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.6,2.9*33
+$PGRME,7.9,M,7.0,M,10.5,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221225,4124.7521,N,08152.2533,W,2,05,3.4,243.4,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,2.9*33
+$PGRME,7.9,M,7.0,M,10.5,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221230,4124.7520,N,08152.2532,W,2,05,3.4,241.4,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.2*3B
+$PGRME,7.9,M,7.0,M,10.6,M*10
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221235,4124.7520,N,08152.2532,W,2,05,3.4,241.2,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.2*3B
+$PGRME,7.9,M,7.0,M,10.6,M*10
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221240,4124.7520,N,08152.2532,W,2,05,4.1,240.5,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.0,4.1,1.2*3C
+$PGRME,7.9,M,7.0,M,10.6,M*10
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221245,4124.7520,N,08152.2531,W,2,05,3.5,238.0,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.5,1.5*3F
+$PGRME,8.9,M,7.1,M,11.5,M*1C
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221250,4124.7520,N,08152.2531,W,2,05,3.9,236.9,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.9,1.3*3A
+$PGRME,7.9,M,7.0,M,10.6,M*10
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221255,4124.7521,N,08152.2531,W,2,05,4.9,238.2,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.7,4.9,1.0*31
+$PGRME,8.9,M,7.1,M,11.5,M*1C
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221300,4124.7521,N,08152.2531,W,2,05,4.0,239.5,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,4.0,1.0*37
+$PGRME,8.6,M,7.0,M,11.2,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221305,4124.7521,N,08152.2531,W,2,05,4.4,236.0,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.5,4.4,1.9*37
+$PGRME,8.9,M,7.2,M,11.5,M*1F
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221310,4124.7522,N,08152.2531,W,2,05,4.6,232.7,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.7,4.6,2.3*3E
+$PGRME,7.9,M,7.1,M,10.6,M*11
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221315,4124.7523,N,08152.2530,W,2,05,3.4,232.1,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.2*3B
+$PGRME,7.9,M,7.1,M,10.6,M*11
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221320,4124.7523,N,08152.2530,W,2,05,3.5,232.7,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.5,2.5*33
+$PGRME,8.0,M,7.8,M,11.2,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221325,4124.7523,N,08152.2530,W,2,05,3.7,234.2,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.0,3.7,2.9*35
+$PGRME,8.9,M,7.2,M,11.5,M*1F
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221330,4124.7523,N,08152.2529,W,2,05,3.4,234.1,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.4,1.2*3B
+$PGRME,7.9,M,7.1,M,10.6,M*11
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221335,4124.7523,N,08152.2529,W,2,05,3.3,235.7,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.9*37
+$PGRME,7.9,M,7.1,M,10.6,M*11
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221340,4124.7524,N,08152.2529,W,2,05,3.3,236.8,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.2*3C
+$PGRME,7.9,M,7.1,M,10.6,M*11
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221345,4124.7524,N,08152.2529,W,2,05,3.5,239.1,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.5,2.7*31
+$PGRME,8.0,M,7.8,M,11.2,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221350,4124.7524,N,08152.2529,W,2,05,3.5,240.9,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.5,2.7*31
+$PGRME,8.0,M,7.8,M,11.3,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221355,4124.7524,N,08152.2529,W,2,05,4.0,239.3,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.7,4.0,2.2*39
+$PGRME,8.8,M,8.5,M,13.0,M*11
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221400,4124.7524,N,08152.2529,W,2,05,3.3,238.5,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,2.3*3E
+$PGRME,7.9,M,7.1,M,10.6,M*11
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221405,4124.7525,N,08152.2528,W,2,05,3.3,239.4,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,2.8*35
+$PGRME,7.9,M,7.1,M,10.6,M*11
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221410,4124.7525,N,08152.2528,W,2,05,3.6,239.1,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.0,3.6,1.5*3A
+$PGRME,7.9,M,7.1,M,10.6,M*11
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221415,4124.7525,N,08152.2528,W,2,05,3.5,241.5,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.5,1.9*31
+$PGRME,8.9,M,7.3,M,11.6,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221420,4124.7526,N,08152.2528,W,2,05,3.3,241.6,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.2*3C
+$PGRME,7.9,M,7.2,M,10.7,M*13
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221425,4124.7525,N,08152.2527,W,2,05,3.3,240.7,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.7*39
+$PGRME,7.9,M,7.2,M,10.7,M*13
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221430,4124.7525,N,08152.2527,W,2,05,3.3,242.0,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.9*37
+$PGRME,7.9,M,7.2,M,10.7,M*13
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221435,4124.7525,N,08152.2526,W,2,05,3.3,243.6,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.9*37
+$PGRME,7.9,M,7.2,M,10.7,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221440,4124.7525,N,08152.2526,W,2,05,3.3,243.8,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,2.0*3D
+$PGRME,7.9,M,7.2,M,10.7,M*13
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221445,4124.7526,N,08152.2526,W,2,05,4.0,244.1,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.0,4.0,1.2*3D
+$PGRME,8.9,M,7.3,M,11.6,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221450,4124.7525,N,08152.2526,W,2,05,4.5,244.5,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.3,4.5,1.2*3B
+$PGRME,8.9,M,7.4,M,11.6,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221455,4124.7525,N,08152.2525,W,2,04,4.5,244.2,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,,,35,5.3,4.5,1.2*30
+$PGRME,8.9,M,7.4,M,11.6,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221500,4124.7525,N,08152.2525,W,2,05,5.1,243.2,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.7,5.1,1.0*38
+$PGRME,8.9,M,7.4,M,11.6,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221505,4124.7525,N,08152.2524,W,2,05,3.7,244.1,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.8,3.7,1.8*3E
+$PGRME,8.9,M,7.4,M,11.6,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221510,4124.7525,N,08152.2524,W,2,05,3.7,245.1,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.8,3.7,1.8*3E
+$PGRME,7.9,M,7.2,M,10.7,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221515,4124.7526,N,08152.2524,W,2,05,4.0,244.9,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,4.0,1.2*35
+$PGRME,8.9,M,7.4,M,11.6,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221520,4124.7526,N,08152.2524,W,2,05,3.3,245.8,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.4*3A
+$PGRME,7.9,M,7.2,M,10.7,M*13
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221525,4124.7525,N,08152.2523,W,2,05,3.3,246.1,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.4*3A
+$PGRME,7.9,M,7.2,M,10.7,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221530,4124.7525,N,08152.2523,W,2,05,3.5,245.7,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.5,1.7*3D
+$PGRME,7.9,M,7.2,M,10.7,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221535,4124.7525,N,08152.2523,W,2,05,3.5,245.3,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.5,1.9*33
+$PGRME,8.9,M,7.4,M,11.6,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221540,4124.7525,N,08152.2522,W,2,05,3.5,242.6,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.5,2.1*38
+$PGRME,7.9,M,7.3,M,10.7,M*12
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221545,4124.7525,N,08152.2522,W,2,05,3.3,241.4,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,2.4*39
+$PGRME,7.9,M,7.3,M,10.7,M*12
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221550,4124.7524,N,08152.2521,W,2,05,3.3,240.6,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.4*3A
+$PGRME,7.9,M,7.3,M,10.7,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221555,4124.7524,N,08152.2522,W,2,05,3.5,241.4,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.5,2.3*35
+$PGRME,8.0,M,8.0,M,11.3,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221600,4124.7524,N,08152.2522,W,2,05,3.5,241.5,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.5,3.0*37
+$PGRME,7.9,M,7.3,M,10.7,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221605,4124.7525,N,08152.2521,W,2,05,3.5,240.5,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.5,3.5,2.9*33
+$PGRME,8.8,M,7.5,M,11.6,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221610,4124.7524,N,08152.2521,W,2,05,4.2,237.0,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.6,4.2,1.7*3C
+$PGRME,8.0,M,8.0,M,11.3,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221615,4124.7524,N,08152.2521,W,2,05,4.3,236.9,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,4.3,1.0*3B
+$PGRME,10.6,M,8.2,M,13.6,M*27
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221620,4124.7523,N,08152.2521,W,2,05,4.4,235.9,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.7,4.4,1.2*3F
+$PGRME,7.9,M,7.3,M,10.8,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221625,4124.7524,N,08152.2521,W,2,05,4.4,232.4,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.5,4.4,1.0*3F
+$PGRME,10.0,M,8.1,M,13.0,M*24
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221630,4124.7524,N,08152.2521,W,2,05,3.8,229.3,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.1,3.8,1.0*31
+$PGRME,7.9,M,7.3,M,10.8,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221635,4124.7524,N,08152.2521,W,2,05,4.3,230.3,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.1,4.3,1.7*3A
+$PGRME,7.9,M,7.4,M,10.8,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221640,4124.7525,N,08152.2521,W,2,05,3.7,230.2,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.9,3.7,1.0*30
+$PGRME,8.7,M,8.5,M,12.9,M*16
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221645,4124.7526,N,08152.2521,W,2,05,4.0,228.4,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.3,4.0,1.0*3D
+$PGRME,8.7,M,8.2,M,12.2,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221650,4124.7525,N,08152.2521,W,2,05,4.3,225.9,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,4.3,1.7*33
+$PGRME,7.9,M,7.4,M,10.8,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221655,4124.7526,N,08152.2521,W,2,05,4.1,224.4,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,4.1,1.0*39
+$PGRME,8.6,M,8.0,M,11.9,M*11
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221700,4124.7526,N,08152.2520,W,2,05,3.3,224.8,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.9,3.3,1.2*36
+$PGRME,7.9,M,7.4,M,10.8,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221705,4124.7527,N,08152.2522,W,2,05,4.0,224.9,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,4.0,1.0*3C
+$PGRME,7.9,M,7.4,M,10.8,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221710,4124.7527,N,08152.2522,W,2,05,3.6,225.0,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.8,3.6,1.0*30
+$PGRME,9.6,M,7.3,M,12.2,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221715,4124.7528,N,08152.2522,W,2,05,3.6,224.1,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.8,3.6,1.0*30
+$PGRME,9.7,M,7.5,M,12.4,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221720,4124.7527,N,08152.2522,W,2,05,3.4,228.3,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.9,3.4,1.0*33
+$PGRME,8.4,M,7.4,M,11.2,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221725,4124.7528,N,08152.2522,W,2,05,3.8,226.8,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.7,3.8,2.0*35
+$PGRME,8.0,M,8.1,M,11.4,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221730,4124.7664,N,08152.2502,W,2,05,3.5,226.9,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.5,3.5,2.2*38
+$PGRME,8.8,M,7.6,M,11.7,M*18
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221735,4124.7657,N,08152.2491,W,2,05,3.3,232.3,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,2.4*39
+$PGRME,7.9,M,7.4,M,10.8,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221740,4124.7624,N,08152.2482,W,2,05,3.3,273.9,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,2.4*39
+$PGRME,7.9,M,7.4,M,10.8,M*1A
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221745,4124.7513,N,08152.2450,W,2,05,3.5,269.7,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.5,2.9*3F
+$PGRME,7.9,M,7.4,M,10.8,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221750,4124.7503,N,08152.2446,W,2,05,3.7,289.6,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.3,3.7,1.0*3D
+$PGRME,8.5,M,8.1,M,11.8,M*12
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221755,4124.7496,N,08152.2444,W,2,05,3.9,277.2,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.8,3.9,1.7*3F
+$PGRME,8.4,M,8.1,M,11.8,M*13
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221800,4124.7490,N,08152.2442,W,2,05,3.3,276.2,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,2.3*3E
+$PGRME,7.9,M,7.5,M,10.9,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221805,4124.7485,N,08152.2442,W,2,05,3.8,274.5,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.3,3.8,1.0*32
+$PGRME,7.9,M,7.5,M,10.9,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221810,4124.7482,N,08152.2443,W,2,05,3.4,273.4,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.5,3.4,1.4*3C
+$PGRME,8.8,M,7.7,M,11.7,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221815,4124.7482,N,08152.2444,W,2,05,3.5,273.1,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.3,3.5,1.0*3F
+$PGRME,7.9,M,7.5,M,10.9,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221820,4124.7482,N,08152.2445,W,2,05,3.5,269.3,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.3,3.5,1.0*3F
+$PGRME,8.6,M,8.3,M,12.5,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221825,4124.7482,N,08152.2445,W,2,05,3.5,269.3,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.3,3.5,1.0*3F
+$PGRME,11.2,M,8.6,M,14.5,M*22
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221830,4124.7485,N,08152.2446,W,2,05,4.0,265.2,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,4.0,1.0*3C
+$PGRME,9.2,M,7.7,M,12.1,M*17
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221835,4124.7488,N,08152.2446,W,2,05,4.0,263.6,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,4.0,1.0*3C
+$PGRME,10.3,M,7.9,M,13.1,M*21
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221840,4124.7490,N,08152.2447,W,2,04,4.1,259.6,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,,,35,4.2,4.1,1.0*36
+$PGRME,11.7,M,8.3,M,14.5,M*22
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221845,4124.7494,N,08152.2447,W,2,05,4.2,255.6,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,4.2,1.2*3A
+$PGRME,8.8,M,7.7,M,11.7,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221850,4124.7497,N,08152.2448,W,2,05,4.2,251.5,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,4.2,1.2*3A
+$PGRME,9.4,M,8.5,M,13.2,M*1E
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221855,4124.7500,N,08152.2449,W,2,05,4.1,254.0,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,4.1,1.0*3D
+$PGRME,8.6,M,8.4,M,12.2,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221900,4124.7502,N,08152.2449,W,2,05,4.1,251.7,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,4.1,1.0*3D
+$PGRME,10.8,M,8.7,M,14.1,M*2C
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221905,4124.7505,N,08152.2451,W,2,05,3.3,248.5,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,3.3,1.2*3A
+$PGRME,7.9,M,7.5,M,10.9,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221910,4124.7506,N,08152.2452,W,2,05,3.3,246.9,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.8*36
+$PGRME,7.9,M,7.5,M,10.9,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221915,4124.7508,N,08152.2453,W,2,05,3.4,243.4,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.5,3.4,2.1*3A
+$PGRME,8.8,M,7.8,M,11.8,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221920,4124.7511,N,08152.2454,W,2,05,3.4,239.4,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.5,3.4,2.1*3A
+$PGRME,7.9,M,7.6,M,10.9,M*19
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221925,4124.7513,N,08152.2456,W,2,05,3.7,236.5,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.3,3.7,1.2*3F
+$PGRME,8.8,M,7.8,M,11.8,M*19
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221930,4124.7515,N,08152.2457,W,2,05,3.6,237.1,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.5,3.6,1.2*38
+$PGRME,8.8,M,7.8,M,11.8,M*19
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,221935,4124.7513,N,08152.2457,W,2,05,3.2,243.0,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.2,1.8*37
+$PGRME,7.9,M,7.6,M,10.9,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221940,4124.7352,N,08152.2428,W,2,05,3.5,247.5,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.1,3.5,1.0*3D
+$PGRME,9.2,M,7.9,M,12.1,M*19
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221945,4124.7369,N,08152.2412,W,2,05,3.2,247.0,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.2,1.8*37
+$PGRME,7.9,M,7.6,M,10.9,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221950,4124.7503,N,08152.2438,W,2,05,3.2,247.5,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.1,3.2,1.2*38
+$PGRME,7.9,M,7.6,M,10.9,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,221955,4124.7509,N,08152.2440,W,2,05,3.6,247.5,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,3.6,1.2*3F
+$PGRME,7.9,M,7.6,M,10.9,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222000,4124.7511,N,08152.2440,W,2,05,3.2,246.3,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,3.2,1.4*3D
+$PGRME,7.9,M,7.6,M,10.9,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222005,4124.7512,N,08152.2441,W,2,05,3.2,248.5,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,3.2,1.4*3D
+$PGRME,7.9,M,7.6,M,10.9,M*19
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,222010,4124.7512,N,08152.2441,W,2,05,3.7,248.7,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,3.7,1.8*3F
+$PGRME,8.7,M,7.9,M,11.8,M*17
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,222015,4124.7510,N,08152.2442,W,2,05,3.6,249.7,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.6,1.0*39
+$PGRME,7.8,M,7.6,M,10.9,M*18
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222020,4124.7509,N,08152.2442,W,2,05,3.7,251.5,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.7,3.7,1.2*3B
+$PGRME,8.7,M,7.9,M,11.8,M*17
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222025,4124.7508,N,08152.2443,W,2,04,4.0,254.5,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,,,35,4.8,4.0,1.2*3F
+$PGRME,10.7,M,8.2,M,13.6,M*26
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222030,4124.7506,N,08152.2443,W,2,05,4.0,256.4,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.8,4.0,1.2*34
+$PGRME,8.7,M,7.9,M,11.8,M*17
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222035,4124.7503,N,08152.2443,W,2,05,3.4,257.3,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.5,3.4,1.7*3F
+$PGRME,7.8,M,7.7,M,11.0,M*11
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222040,4124.7500,N,08152.2444,W,2,05,3.4,257.5,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.5,3.4,1.9*31
+$PGRME,8.7,M,7.9,M,11.8,M*17
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222045,4124.7499,N,08152.2445,W,2,04,3.8,256.7,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,,,35,4.7,3.8,1.0*3D
+$PGRME,11.8,M,8.2,M,14.6,M*2F
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222050,4124.7498,N,08152.2447,W,2,04,3.8,253.6,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,,,35,4.7,3.8,1.0*3D
+$PGRME,13.7,M,8.6,M,16.4,M*26
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222055,4124.7499,N,08152.2448,W,2,05,3.8,255.3,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.0,3.8,1.2*33
+$PGRME,7.8,M,7.7,M,11.0,M*11
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222100,4124.7491,N,08152.2461,W,2,05,4.1,254.9,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,4.1,1.0*3D
+$PGRME,10.4,M,7.4,M,13.1,M*2B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222105,4124.7334,N,08152.2636,W,2,04,3.7,254.3,M,-34.0,M,,*70
+$GPGSA,A,2,02,,,,,,,26,,29,,35,3.8,3.7,1.0*36
+$PGRME,11.7,M,7.2,M,13.7,M*29
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222110,4124.7349,N,08152.2607,W,2,04,3.9,254.2,M,-34.0,M,,*73
+$GPGSA,A,2,02,,,,,,,26,,29,,35,4.0,3.9,1.0*37
+$PGRME,13.6,M,7.2,M,15.5,M*2E
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222115,4124.7368,N,08152.2578,W,2,03,4.0,254.2,M,-34.0,M,,*77
+$GPGSA,A,2,02,,,,,,,26,,,,35,4.2,4.0,1.0*30
+$PGRME,13.6,M,7.2,M,15.5,M*2E
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222120,4124.7383,N,08152.2555,W,2,04,3.5,254.2,M,-34.0,M,,*7E
+$GPGSA,A,2,02,,,,,,,26,,29,,35,3.7,3.5,1.0*3B
+$PGRME,11.7,M,7.2,M,13.8,M*26
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222125,4124.7392,N,08152.2538,W,2,04,3.6,254.2,M,-34.0,M,,*73
+$GPGSA,A,2,02,,,,,,,26,,29,,35,3.8,3.6,1.0*37
+$PGRME,11.7,M,7.2,M,13.8,M*26
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222130,4124.7400,N,08152.2526,W,2,04,4.0,254.1,M,-34.0,M,,*76
+$GPGSA,A,2,02,,,,,,,26,,29,,35,4.2,4.0,1.0*3B
+$PGRME,12.7,M,7.2,M,14.7,M*2D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222135,4124.7405,N,08152.2516,W,2,05,4.3,256.4,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,4.3,1.0*39
+$PGRME,14.3,M,7.9,M,16.4,M*25
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222140,4124.7413,N,08152.2506,W,2,05,4.5,257.6,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.7,4.5,1.2*3E
+$PGRME,7.8,M,7.8,M,11.0,M*1E
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222145,4124.7419,N,08152.2495,W,2,05,3.2,260.2,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.1,3.2,1.4*3E
+$PGRME,7.8,M,7.8,M,11.0,M*1E
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222150,4124.7423,N,08152.2483,W,2,05,3.5,261.8,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.7,3.5,1.0*3C
+$PGRME,8.3,M,7.6,M,11.4,M*10
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222155,4124.7425,N,08152.2474,W,2,05,3.8,262.8,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.0,3.8,1.2*33
+$PGRME,7.8,M,7.8,M,11.0,M*1E
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222200,4124.7427,N,08152.2465,W,2,05,3.2,266.1,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.1,3.2,1.4*3E
+$PGRME,7.8,M,7.8,M,11.0,M*1E
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222205,4124.7425,N,08152.2457,W,2,05,3.9,266.4,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.9,1.0*34
+$PGRME,8.3,M,7.7,M,11.4,M*11
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222210,4124.7426,N,08152.2450,W,2,05,4.2,263.3,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,5.0,4.2,1.0*3D
+$PGRME,9.4,M,8.4,M,12.8,M*14
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222215,4124.7426,N,08152.2444,W,2,05,3.8,264.1,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.9,3.8,1.0*3F
+$PGRME,7.8,M,7.8,M,11.1,M*1F
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222220,4124.7426,N,08152.2439,W,2,05,3.8,266.8,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.9,3.8,1.0*3F
+$PGRME,8.3,M,8.3,M,11.9,M*17
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222225,4124.7425,N,08152.2434,W,2,05,3.7,264.3,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.8,3.7,1.0*31
+$PGRME,9.4,M,8.5,M,12.9,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222230,4124.7426,N,08152.2430,W,2,04,3.7,265.2,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.8,3.7,1.0*3A
+$PGRME,10.4,M,8.8,M,13.8,M*21
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222235,4124.7425,N,08152.2427,W,2,04,3.7,265.2,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.8,3.7,1.0*3A
+$PGRME,10.6,M,8.8,M,13.9,M*22
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222240,4124.7426,N,08152.2424,W,2,03,3.7,265.2,M,-34.0,M,,*73
+$GPGSA,A,3,,06,,,,,,26,,,,35,3.8,3.7,1.0*38
+$PGRME,10.9,M,8.8,M,14.1,M*22
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222245,4124.7423,N,08152.2421,W,2,04,3.8,379.9,M,-34.0,M,,*79
+$GPGSA,A,3,,06,,,,,,26,,29,,35,4.3,3.8,1.7*37
+$PGRME,8.2,M,9.6,M,14.5,M*1B
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222250,4124.7098,N,08152.2383,W,2,04,3.6,379.8,M,-34.0,M,,*79
+$GPGSA,A,3,,06,,,,,,26,,29,,35,3.8,3.6,1.0*32
+$PGRME,8.7,M,9.6,M,14.6,M*1D
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222255,4124.6960,N,08152.2399,W,2,03,3.6,379.8,M,-34.0,M,,*7F
+$GPGSA,A,2,,06,,,,,,26,,,,35,3.8,3.6,1.0*38
+$PGRME,8.7,M,9.6,M,14.6,M*1D
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222300,4124.6942,N,08152.2404,W,2,03,3.6,379.8,M,-34.0,M,,*7D
+$GPGSA,A,2,,06,,,,,,26,,,,35,3.8,3.6,1.0*38
+$PGRME,9.1,M,9.6,M,14.8,M*14
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222305,4124.6937,N,08152.2406,W,2,04,3.6,308.4,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.8,3.6,1.0*3B
+$PGRME,10.1,M,9.8,M,15.3,M*28
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222310,4124.6940,N,08152.2406,W,2,05,3.6,364.4,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.7,3.6,1.0*3F
+$PGRME,8.0,M,7.8,M,11.2,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222315,4124.6988,N,08152.2404,W,2,05,3.6,318.6,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.7,3.6,1.0*3F
+$PGRME,9.9,M,8.4,M,13.0,M*10
+$PGRMV,0.1,-0.3,0.1*72
+$PGRMM,WGS 84*06
+$GPGGA,222320,4124.7023,N,08152.2413,W,2,04,3.6,295.7,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.7,3.6,1.0*34
+$PGRME,11.2,M,8.9,M,14.4,M*2C
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222325,4124.7043,N,08152.2421,W,2,04,3.6,295.7,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.7,3.6,1.0*34
+$PGRME,11.9,M,9.2,M,15.1,M*29
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222330,4124.7059,N,08152.2426,W,2,04,3.6,295.9,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.7,3.6,1.0*34
+$PGRME,12.3,M,9.4,M,15.5,M*22
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222335,4124.7079,N,08152.2430,W,2,05,3.6,291.8,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.7,3.6,1.0*3F
+$PGRME,8.5,M,8.1,M,11.8,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222340,4124.7096,N,08152.2432,W,2,05,3.6,292.6,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.7,3.6,1.0*3F
+$PGRME,7.6,M,7.8,M,10.9,M*18
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,33,R*06
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222345,4124.7112,N,08152.2434,W,2,05,3.6,290.3,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.7,3.6,1.0*3F
+$PGRME,9.1,M,8.2,M,12.3,M*1C
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222350,4124.7240,N,08152.2459,W,2,04,3.8,215.9,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,,,35,4.0,3.8,1.4*3E
+$PGRME,10.5,M,8.8,M,13.7,M*2F
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222355,4124.7263,N,08152.2465,W,2,04,3.7,225.3,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.9,3.7,1.2*39
+$PGRME,10.5,M,8.8,M,13.7,M*2F
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222400,4124.7281,N,08152.2467,W,2,04,3.6,231.9,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.9,3.6,1.2*38
+$PGRME,11.2,M,9.0,M,14.4,M*24
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222405,4124.7298,N,08152.2470,W,2,05,3.5,240.1,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.7,3.5,1.0*3C
+$PGRME,8.2,M,9.8,M,14.8,M*18
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,222410,4124.7307,N,08152.2470,W,2,05,3.3,243.3,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.7,3.3,1.0*3A
+$PGRME,8.1,M,7.7,M,11.3,M*14
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,222415,4124.7315,N,08152.2473,W,2,05,3.6,241.4,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.0,3.6,1.2*3D
+$PGRME,8.9,M,8.0,M,12.1,M*15
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,222420,4124.7325,N,08152.2477,W,2,04,3.5,241.1,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.6,3.5,1.0*36
+$PGRME,10.0,M,8.4,M,13.2,M*23
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,222425,4124.7335,N,08152.2482,W,2,04,3.5,241.0,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.6,3.5,1.0*36
+$PGRME,10.8,M,8.7,M,13.9,M*23
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222430,4124.7343,N,08152.2486,W,2,05,3.7,242.4,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.9,3.7,1.0*30
+$PGRME,9.2,M,8.1,M,12.4,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222435,4124.7350,N,08152.2491,W,2,05,3.3,240.7,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,3.3,1.7*3F
+$PGRME,7.6,M,7.9,M,10.9,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222440,4124.7357,N,08152.2496,W,2,05,3.3,240.3,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.7,3.3,2.4*3A
+$PGRME,7.7,M,8.4,M,11.4,M*16
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,34,R*01
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222445,4124.7362,N,08152.2500,W,2,05,3.3,242.5,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.4,3.3,1.4*3A
+$PGRME,7.6,M,7.9,M,11.0,M*11
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222450,4124.7367,N,08152.2503,W,2,05,3.3,243.0,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.1,3.3,1.7*3C
+$PGRME,7.7,M,8.4,M,11.4,M*16
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222455,4124.7372,N,08152.2506,W,2,05,3.5,238.7,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.6,3.5,1.0*3D
+$PGRME,8.1,M,8.9,M,12.1,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222500,4124.7377,N,08152.2510,W,2,04,3.5,240.3,M,-34.0,M,,*76
+$GPGSA,A,3,,06,,,,,,26,,29,,35,3.6,3.5,1.0*3F
+$PGRME,8.5,M,9.3,M,12.7,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222505,4124.7382,N,08152.2513,W,2,04,3.8,241.9,M,-34.0,M,,*7C
+$GPGSA,A,3,,06,,,,,,26,,29,,35,4.4,3.8,1.7*30
+$PGRME,8.1,M,10.0,M,13.7,M*23
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222510,4124.7387,N,08152.2516,W,2,05,3.4,238.8,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.6,3.4,1.0*3C
+$PGRME,8.0,M,7.9,M,11.3,M*1B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222515,4124.7391,N,08152.2519,W,2,05,3.5,235.9,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.8,3.5,1.2*31
+$PGRME,9.7,M,8.6,M,13.1,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222520,4124.7396,N,08152.2522,W,2,04,3.4,234.7,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.6,3.4,1.0*37
+$PGRME,11.6,M,8.9,M,14.7,M*2B
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222525,4124.7489,N,08152.2573,W,2,05,3.1,232.9,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.6,3.1,1.0*39
+$PGRME,8.5,M,8.3,M,11.9,M*11
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222530,4124.7492,N,08152.2575,W,2,05,3.9,231.7,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,3.9,1.0*36
+$PGRME,10.7,M,8.8,M,14.8,M*25
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222535,4124.7493,N,08152.2582,W,2,05,4.4,231.9,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.9,4.4,1.0*33
+$PGRME,12.4,M,8.8,M,16.1,M*2F
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222540,4124.7494,N,08152.2586,W,2,04,4.6,230.6,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,26,,,,35,5.0,4.6,1.0*32
+$PGRME,14.8,M,9.1,M,18.2,M*20
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,34,R*01
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222545,4124.7500,N,08152.2586,W,2,05,3.8,230.2,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.9,3.8,1.0*3F
+$PGRME,13.4,M,8.9,M,16.1,M*2F
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222550,4124.7505,N,08152.2586,W,2,05,4.4,229.2,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.6,4.4,1.0*3C
+$PGRME,15.7,M,9.2,M,18.3,M*2C
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222555,4124.7508,N,08152.2587,W,2,05,3.8,230.5,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.9,3.8,1.0*3F
+$PGRME,10.3,M,8.2,M,13.4,M*20
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222600,4124.7511,N,08152.2586,W,2,05,4.1,230.4,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.2,4.1,1.0*3D
+$PGRME,11.6,M,8.2,M,14.6,M*21
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222605,4124.7514,N,08152.2585,W,2,03,4.3,230.4,M,-34.0,M,,*79
+$GPGSA,A,3,02,,,,,,,26,,,,35,4.4,4.3,1.0*34
+$PGRME,13.9,M,8.2,M,16.6,M*2E
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222610,4124.7517,N,08152.2583,W,2,03,4.4,230.4,M,-34.0,M,,*7F
+$GPGSA,A,2,02,,,,,,,26,,,,35,4.6,4.4,1.0*30
+$PGRME,13.9,M,8.2,M,16.6,M*2E
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222615,4124.7520,N,08152.2583,W,2,03,4.7,230.4,M,-34.0,M,,*7D
+$GPGSA,A,2,02,,,,,,,26,,,,35,4.8,4.7,1.0*3D
+$PGRME,15.8,M,8.2,M,18.2,M*23
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222620,4124.7523,N,08152.2583,W,2,04,4.9,231.1,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,26,,,,35,5.0,4.9,1.0*3D
+$PGRME,16.0,M,8.6,M,19.6,M*29
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222625,4124.7527,N,08152.2580,W,2,04,4.6,231.6,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,26,,,,35,5.1,4.6,1.0*33
+$PGRME,16.8,M,8.9,M,20.2,M*20
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222630,4124.7528,N,08152.2578,W,2,05,3.3,236.2,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,3.5,3.3,1.0*38
+$PGRME,9.2,M,9.9,M,15.7,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222635,4124.7530,N,08152.2574,W,2,05,3.7,238.8,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,26,,29,,35,4.0,3.7,1.2*3C
+$PGRME,11.3,M,10.1,M,17.1,M*1A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222640,4124.7532,N,08152.2571,W,2,04,3.7,241.9,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,26,,,,35,4.0,3.7,1.2*37
+$PGRME,11.3,M,10.1,M,17.1,M*1A
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,34,R*01
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222645,4124.7532,N,08152.2567,W,2,04,3.4,243.2,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,26,,,,35,3.7,3.4,1.2*34
+$PGRME,11.8,M,10.3,M,16.1,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222650,4124.7532,N,08152.2563,W,2,04,3.8,243.4,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,,26,,,35,4.0,3.8,1.0*3A
+$PGRME,13.2,M,10.3,M,17.2,M*18
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222655,4124.7533,N,08152.2560,W,2,04,3.6,241.5,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,,26,,,35,3.9,3.6,1.2*38
+$PGRME,14.0,M,10.6,M,17.7,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222700,4124.7533,N,08152.2557,W,2,04,3.3,239.6,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,,26,,,35,3.4,3.3,1.0*32
+$PGRME,12.4,M,10.8,M,16.4,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222705,4124.7533,N,08152.2555,W,2,04,3.4,241.4,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,,26,,,35,3.6,3.4,1.2*35
+$PGRME,12.7,M,10.9,M,16.8,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222710,4124.7532,N,08152.2553,W,2,05,3.3,244.0,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.3,1.0*39
+$PGRME,7.6,M,8.1,M,11.1,M*17
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222715,4124.7529,N,08152.2551,W,2,05,3.4,246.6,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.6,3.4,1.2*3E
+$PGRME,8.4,M,8.5,M,12.0,M*1C
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222720,4124.7528,N,08152.2550,W,2,05,3.5,247.5,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.8,3.5,1.4*37
+$PGRME,9.2,M,8.9,M,12.8,M*1F
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222725,4124.7525,N,08152.2549,W,2,05,3.3,246.9,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.3,1.0*39
+$PGRME,8.4,M,8.9,M,12.4,M*14
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222730,4124.7524,N,08152.2548,W,2,05,3.3,244.6,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.3,1.0*39
+$PGRME,9.5,M,9.3,M,13.3,M*19
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222735,4124.7522,N,08152.2547,W,2,05,3.4,245.1,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.6,3.4,1.2*3E
+$PGRME,8.6,M,8.7,M,12.2,M*1E
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222740,4124.7522,N,08152.2546,W,2,05,3.3,244.4,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.3,1.0*39
+$PGRME,7.7,M,8.3,M,11.3,M*16
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,34,R*01
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222745,4124.7521,N,08152.2546,W,2,05,3.2,247.1,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.2,1.0*38
+$PGRME,7.8,M,8.8,M,11.7,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222750,4124.7399,N,08152.2513,W,2,05,4.0,276.6,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,4.5,4.0,1.0*3B
+$PGRME,7.7,M,8.3,M,11.3,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222755,4124.7396,N,08152.2514,W,2,05,3.2,219.2,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.2,1.0*38
+$PGRME,8.6,M,9.2,M,12.6,M*1E
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222800,4124.7434,N,08152.2522,W,2,05,3.4,236.4,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.9,3.4,1.7*34
+$PGRME,7.7,M,8.3,M,11.3,M*16
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222805,4124.7532,N,08152.2549,W,2,05,3.3,231.9,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.6,3.3,1.2*39
+$PGRME,8.5,M,8.7,M,12.2,M*1D
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222810,4124.7537,N,08152.2558,W,2,05,3.2,232.8,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.2,1.0*38
+$PGRME,8.5,M,9.2,M,12.9,M*12
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222815,4124.7538,N,08152.2564,W,2,05,3.3,236.1,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.9,3.3,1.7*33
+$PGRME,7.7,M,8.3,M,11.3,M*16
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222820,4124.7537,N,08152.2568,W,2,05,3.2,237.9,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.2,1.0*38
+$PGRME,8.1,M,9.2,M,12.3,M*1C
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222825,4124.7535,N,08152.2571,W,2,05,3.2,236.6,M,-34.0,M,,*79
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.2,1.0*38
+$PGRME,8.2,M,9.9,M,13.4,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222830,4124.7535,N,08152.2573,W,2,05,3.0,234.8,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.7,3.0,1.5*3C
+$PGRME,7.7,M,8.4,M,11.4,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222835,4124.7537,N,08152.2575,W,2,05,3.3,234.0,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,4.0,3.3,1.8*32
+$PGRME,8.5,M,8.8,M,12.3,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222840,4124.7539,N,08152.2576,W,2,05,3.3,233.4,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.6,3.3,1.2*39
+$PGRME,9.5,M,9.2,M,13.2,M*19
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,35,R*00
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222845,4124.7540,N,08152.2576,W,2,05,3.3,235.0,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.9,3.3,1.7*33
+$PGRME,7.7,M,8.4,M,11.4,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222850,4124.7541,N,08152.2575,W,2,05,3.2,237.8,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.8,3.2,1.4*30
+$PGRME,8.5,M,8.8,M,12.3,M*13
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222855,4124.7540,N,08152.2575,W,2,05,3.2,237.0,M,-34.0,M,,*7F
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.3,3.2,1.0*3F
+$PGRME,11.0,M,9.0,M,14.2,M*20
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222900,4124.7540,N,08152.2574,W,2,05,3.3,233.7,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.5,3.3,1.2*3A
+$PGRME,11.7,M,9.7,M,15.2,M*21
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222905,4124.7541,N,08152.2575,W,2,05,3.3,240.1,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.5,3.3,1.2*3A
+$PGRME,7.7,M,8.4,M,11.4,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222910,4124.7538,N,08152.2574,W,2,05,3.3,239.6,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.5,3.3,1.2*3A
+$PGRME,9.5,M,9.3,M,13.3,M*19
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222915,4124.7537,N,08152.2573,W,2,04,3.4,238.8,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,,26,,,35,3.7,3.4,1.4*32
+$PGRME,10.1,M,9.6,M,14.0,M*24
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222920,4124.7536,N,08152.2572,W,2,05,3.4,239.6,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.6,3.4,1.0*3C
+$PGRME,8.5,M,8.9,M,12.3,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222925,4124.7535,N,08152.2570,W,2,05,3.3,241.9,M,-34.0,M,,*77
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.5,3.3,1.2*3A
+$PGRME,7.7,M,8.4,M,11.4,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222930,4124.7435,N,08152.2503,W,2,05,3.1,247.1,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.3,3.1,1.0*3C
+$PGRME,8.5,M,8.9,M,12.3,M*12
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,222935,4124.7427,N,08152.2489,W,2,05,3.1,248.5,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.3,3.1,1.0*3C
+$PGRME,8.4,M,9.3,M,12.8,M*13
+$PGRMV,0.0,0.0,0.1*5D
+$PGRMM,WGS 84*06
+$GPGGA,222940,4124.7434,N,08152.2495,W,2,05,3.1,248.8,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.3,3.1,1.0*3C
+$PGRME,9.4,M,9.7,M,13.7,M*18
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,35,R*00
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222945,4124.7443,N,08152.2505,W,2,05,3.1,245.8,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.3,3.1,1.0*3C
+$PGRME,7.7,M,8.5,M,11.4,M*17
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,222950,4124.7448,N,08152.2511,W,2,05,3.2,249.2,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,4.1,3.2,2.0*39
+$PGRME,7.7,M,8.9,M,11.8,M*17
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,222955,4124.7451,N,08152.2515,W,2,05,3.5,243.8,M,-34.0,M,,*75
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.8,3.5,1.2*31
+$PGRME,9.2,M,8.9,M,12.9,M*1E
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223000,4124.7455,N,08152.2519,W,2,05,3.0,244.4,M,-34.0,M,,*7B
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.0,1.2*38
+$PGRME,7.7,M,8.5,M,11.5,M*16
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223005,4124.7454,N,08152.2523,W,2,05,4.2,249.0,M,-34.0,M,,*7A
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,4.8,4.2,1.0*34
+$PGRME,8.3,M,8.3,M,11.9,M*17
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223010,4124.7451,N,08152.2525,W,2,05,3.4,250.8,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.6,3.4,1.0*3C
+$PGRME,8.4,M,8.5,M,12.1,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223015,4124.7449,N,08152.2528,W,2,05,3.4,254.3,M,-34.0,M,,*72
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.7,3.4,1.0*3D
+$PGRME,8.5,M,9.0,M,12.4,M*1D
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223020,4124.7445,N,08152.2528,W,2,05,3.1,256.8,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.2,3.1,1.0*3D
+$PGRME,8.9,M,9.0,M,12.7,M*12
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223025,4124.7443,N,08152.2529,W,2,04,3.3,258.0,M,-34.0,M,,*73
+$GPGSA,A,3,02,06,,,,,,,26,,,35,3.4,3.3,1.0*32
+$PGRME,11.2,M,9.4,M,14.9,M*2D
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223030,4124.7439,N,08152.2529,W,2,05,3.0,260.5,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.7,3.0,1.5*3C
+$PGRME,7.7,M,8.6,M,11.5,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223035,4124.7436,N,08152.2522,W,2,05,3.4,259.2,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,4.1,3.4,1.0*3C
+$PGRME,7.7,M,8.6,M,11.5,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223040,4124.7569,N,08152.2469,W,2,05,3.2,252.8,M,-34.0,M,,*7E
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.4,3.2,1.2*3A
+$PGRME,8.5,M,9.1,M,12.4,M*1C
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,35,R*00
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223045,4124.7659,N,08152.2501,W,2,05,3.5,250.1,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.8,3.5,1.2*31
+$PGRME,7.7,M,8.6,M,11.5,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223050,4124.7656,N,08152.2499,W,2,05,3.2,246.4,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,4.3,3.2,1.0*38
+$PGRME,8.5,M,9.1,M,12.5,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223055,4124.7644,N,08152.2502,W,2,05,3.0,250.6,M,-34.0,M,,*74
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.3,3.0,1.2*3F
+$PGRME,7.7,M,8.6,M,11.5,M*15
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223100,4124.7489,N,08152.2517,W,2,05,3.3,250.6,M,-34.0,M,,*71
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.8,3.3,1.6*33
+$PGRME,7.7,M,8.6,M,11.6,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223105,4124.7417,N,08152.2508,W,2,05,3.7,250.2,M,-34.0,M,,*7D
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,4.4,3.7,1.8*32
+$PGRME,7.7,M,8.9,M,11.9,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223110,4124.7447,N,08152.2489,W,2,05,3.0,246.6,M,-34.0,M,,*70
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.5,3.0,1.4*3F
+$PGRME,7.7,M,8.7,M,11.6,M*17
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223115,4124.7463,N,08152.2480,W,2,05,3.1,242.1,M,-34.0,M,,*78
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.6,3.1,1.5*3C
+$PGRME,7.7,M,8.7,M,11.6,M*17
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223120,4124.7476,N,08152.2476,W,2,05,3.0,239.9,M,-34.0,M,,*76
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.2,3.0,1.0*3C
+$PGRME,7.9,M,8.7,M,11.8,M*17
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223125,4124.7484,N,08152.2475,W,2,05,3.0,244.2,M,-34.0,M,,*7C
+$GPGSA,A,3,02,06,,,,,,,26,29,,35,3.2,3.0,1.0*3C
+$PGRME,7.9,M,8.7,M,11.8,M*17
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223133,4124.7520,N,08152.2467,W,0,00,,,M,,M,,*47
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$PGRME,,M,,M,,M*00
+$PGRMV,,,*72
+$PGRMM,WGS 84*06
+$GPGGA,223138,4124.7520,N,08152.2467,W,0,00,,,M,,M,,*4C
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$PGRME,,M,,M,,M*00
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,34,R*01
+$PGRMV,,,*72
+$PGRMM,WGS 84*06
+$GPGGA,223143,4124.7520,N,08152.2467,W,0,00,,,M,,M,,*40
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$PGRME,,M,,M,,M*00
+$PGRMV,,,*72
+$PGRMM,WGS 84*06
+$GPGGA,223150,4124.7478,N,08152.2474,W,2,03,3.0,242.5,M,-34.0,M,,*7B
+$GPGSA,A,2,06,,,,,,,,26,,,35,3.2,3.0,1.0*34
+$PGRME,40.3,M,50.0,M,64.2,M*1C
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223155,4124.7515,N,08152.2472,W,2,03,3.0,242.5,M,-34.0,M,,*72
+$GPGSA,A,2,06,,,,,,,,26,,,35,3.2,3.0,1.0*34
+$PGRME,40.2,M,50.0,M,64.2,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223200,4124.7538,N,08152.2480,W,2,03,3.0,242.5,M,-34.0,M,,*73
+$GPGSA,A,2,06,,,,,,,,26,,,35,3.2,3.0,1.0*34
+$PGRME,40.2,M,50.0,M,64.2,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223205,4124.7544,N,08152.2485,W,2,03,3.0,242.5,M,-34.0,M,,*78
+$GPGSA,A,2,06,,,,,,,,26,,,35,3.2,3.0,1.0*34
+$PGRME,40.2,M,50.0,M,64.2,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223210,4124.7543,N,08152.2488,W,2,03,2.4,242.5,M,-34.0,M,,*73
+$GPGSA,A,2,06,,,,,,,,26,,,35,2.6,2.4,1.0*34
+$PGRME,40.1,M,50.0,M,64.1,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223215,4124.7540,N,08152.2490,W,2,03,2.4,242.5,M,-34.0,M,,*7C
+$GPGSA,A,2,06,,,,,,,,26,,,35,2.6,2.4,1.0*34
+$PGRME,40.1,M,50.0,M,64.1,M*1D
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223220,4124.7538,N,08152.2492,W,2,03,2.5,242.5,M,-34.0,M,,*76
+$GPGSA,A,2,06,,,,,,,,26,,,35,2.7,2.5,1.0*34
+$PGRME,39.5,M,50.0,M,63.7,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223225,4124.7536,N,08152.2493,W,2,03,2.6,242.5,M,-34.0,M,,*7F
+$GPGSA,A,2,06,,,,,,,,26,,,35,2.8,2.6,1.0*38
+$PGRME,39.5,M,50.0,M,63.7,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223230,4124.7533,N,08152.2494,W,2,03,2.6,242.5,M,-34.0,M,,*79
+$GPGSA,A,2,06,,,,,,,,26,,,35,2.8,2.6,1.0*38
+$PGRME,39.5,M,50.0,M,63.7,M*16
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223235,4124.7530,N,08152.2496,W,2,04,3.0,243.4,M,-34.0,M,,*7D
+$GPGSA,A,3,06,,,,,,,,26,29,,35,3.8,3.0,2.1*36
+$PGRME,8.8,M,13.4,M,16.0,M*2F
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223240,4124.7527,N,08152.2497,W,2,05,3.3,244.8,M,-34.0,M,,*71
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,4.4,3.3,2.7*31
+$PGRME,8.6,M,11.4,M,14.3,M*22
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,35,R*00
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223245,4124.7523,N,08152.2499,W,2,05,3.4,251.0,M,-34.0,M,,*75
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,4.9,3.4,3.1*3C
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223250,4124.7520,N,08152.2461,W,2,05,3.8,250.6,M,-34.0,M,,*7E
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.8,3.4*39
+$PGRME,10.2,M,13.2,M,16.7,M*1D
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223255,4124.7602,N,08152.2466,W,2,05,3.8,245.2,M,-34.0,M,,*7F
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.8,3.4*39
+$PGRME,10.1,M,13.2,M,16.7,M*1E
+$PGRMV,0.0,0.0,-0.2*73
+$PGRMM,WGS 84*06
+$GPGGA,223300,4124.7617,N,08152.2466,W,2,05,3.7,243.7,M,-34.0,M,,*76
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.7,3.9*3B
+$PGRME,10.1,M,13.2,M,16.7,M*1E
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223305,4124.7613,N,08152.2470,W,2,05,3.7,244.6,M,-34.0,M,,*76
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.7,3.9*3B
+$PGRME,7.8,M,10.8,M,13.3,M*29
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223310,4124.7597,N,08152.2475,W,2,05,3.4,248.0,M,-34.0,M,,*71
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.0,3.4,3.7*32
+$PGRME,7.8,M,10.8,M,13.3,M*29
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223315,4124.7585,N,08152.2478,W,2,05,3.7,250.4,M,-34.0,M,,*74
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.7,3.9*3B
+$PGRME,7.8,M,10.7,M,13.3,M*26
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223320,4124.7576,N,08152.2481,W,2,05,3.7,249.4,M,-34.0,M,,*70
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.7,3.9*3B
+$PGRME,10.1,M,13.0,M,16.5,M*1E
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223325,4124.7569,N,08152.2483,W,2,05,4.1,250.0,M,-34.0,M,,*74
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.8,4.1,4.2*3A
+$PGRME,7.8,M,10.7,M,13.2,M*27
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223330,4124.7562,N,08152.2486,W,2,05,4.1,250.7,M,-34.0,M,,*79
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.5,4.1,1.0*30
+$PGRME,14.4,M,15.1,M,21.3,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223335,4124.7556,N,08152.2489,W,2,05,3.9,253.3,M,-34.0,M,,*7C
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.6,3.9,2.4*3B
+$PGRME,9.1,M,11.2,M,14.5,M*24
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223340,4124.7548,N,08152.2493,W,2,05,4.6,261.5,M,-34.0,M,,*75
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.1,4.6,1.8*38
+$PGRME,7.8,M,10.7,M,13.2,M*27
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,35,R*00
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223345,4124.7539,N,08152.2499,W,2,05,5.3,257.5,M,-34.0,M,,*7D
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.9,5.3,2.9*36
+$PGRME,9.1,M,11.1,M,14.4,M*26
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223350,4124.7533,N,08152.2504,W,2,05,5.3,260.5,M,-34.0,M,,*72
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.0,5.3,1.0*35
+$PGRME,11.0,M,13.2,M,17.2,M*1A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223355,4124.7527,N,08152.2509,W,2,05,5.8,258.8,M,-34.0,M,,*72
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.5,5.8,1.3*38
+$PGRME,14.1,M,13.4,M,20.0,M*1E
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223400,4124.7522,N,08152.2511,W,2,04,5.8,258.3,M,-34.0,M,,*73
+$GPGSA,A,3,,,09,,,,,,26,29,,35,6.5,5.8,1.3*3E
+$PGRME,14.1,M,13.4,M,20.0,M*1E
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223405,4124.7518,N,08152.2514,W,2,05,5.8,257.4,M,-34.0,M,,*73
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.1,5.8,1.3*3C
+$PGRME,16.1,M,15.4,M,22.7,M*1F
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223410,4124.7513,N,08152.2515,W,2,05,5.8,258.3,M,-34.0,M,,*75
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.0,5.8,1.0*3E
+$PGRME,7.8,M,10.5,M,13.1,M*26
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223415,4124.7509,N,08152.2516,W,2,05,5.9,254.8,M,-34.0,M,,*7E
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.1,5.9,1.3*3D
+$PGRME,9.0,M,10.9,M,14.2,M*28
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223420,4124.7507,N,08152.2520,W,2,05,5.9,253.1,M,-34.0,M,,*7D
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.1,5.9,1.3*3D
+$PGRME,7.8,M,10.4,M,13.0,M*26
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223425,4124.7506,N,08152.2523,W,2,05,4.2,248.6,M,-34.0,M,,*7D
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.6,4.2,1.3*33
+$PGRME,7.8,M,10.4,M,13.0,M*26
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223430,4124.7505,N,08152.2523,W,2,05,4.6,246.4,M,-34.0,M,,*72
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.8,4.6,1.0*3A
+$PGRME,7.8,M,10.4,M,13.0,M*26
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223435,4124.7501,N,08152.2524,W,2,05,3.6,261.2,M,-34.0,M,,*70
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.1,3.6,1.0*34
+$PGRME,9.0,M,10.9,M,14.2,M*28
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223440,4124.7499,N,08152.2526,W,2,05,4.6,240.4,M,-34.0,M,,*72
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.8,4.6,1.3*39
+$PGRME,7.8,M,10.4,M,13.0,M*26
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,35,R*00
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223445,4124.7502,N,08152.2529,W,2,05,5.0,218.0,M,-34.0,M,,*75
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.1,5.0,1.0*37
+$PGRME,7.8,M,10.4,M,12.9,M*2E
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223450,4124.7611,N,08152.2563,W,2,05,3.3,214.6,M,-34.0,M,,*71
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.0,3.3,1.8*38
+$PGRME,7.8,M,10.4,M,12.9,M*2E
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223455,4124.7620,N,08152.2556,W,2,05,4.1,214.0,M,-34.0,M,,*73
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.7,4.1,1.5*37
+$PGRME,9.7,M,12.4,M,15.8,M*2B
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223500,4124.7625,N,08152.2552,W,2,05,4.6,216.3,M,-34.0,M,,*75
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,6.2,4.6,2.2*32
+$PGRME,9.7,M,12.4,M,15.8,M*2B
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223505,4124.7594,N,08152.2560,W,2,05,3.6,220.5,M,-34.0,M,,*7C
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.2,3.6,2.5*31
+$PGRME,8.9,M,10.8,M,14.1,M*22
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223510,4124.7414,N,08152.2598,W,2,05,3.9,224.8,M,-34.0,M,,*70
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.5,3.9,1.0*3F
+$PGRME,13.6,M,14.3,M,20.2,M*1C
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223515,4124.7441,N,08152.2578,W,2,05,4.2,225.4,M,-34.0,M,,*7A
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.9,4.2,1.5*3A
+$PGRME,16.9,M,16.0,M,23.9,M*1F
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223520,4124.7453,N,08152.2563,W,2,04,4.8,229.9,M,-34.0,M,,*7F
+$GPGSA,A,3,06,,09,,,,,,26,,,35,6.2,4.8,1.5*33
+$PGRME,19.6,M,17.4,M,27.0,M*17
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223525,4124.7456,N,08152.2559,W,2,05,2.3,225.9,M,-34.0,M,,*76
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,2.5,2.3,1.0*33
+$PGRME,9.6,M,12.3,M,15.6,M*23
+$PGRMV,-0.0,0.2,-0.1*5F
+$PGRMM,WGS 84*06
+$GPGGA,223530,4124.7496,N,08152.2534,W,2,05,2.8,232.0,M,-34.0,M,,*71
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,3.2,2.8,1.5*3B
+$PGRME,7.7,M,10.3,M,12.9,M*26
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223535,4124.7489,N,08152.2530,W,2,05,2.8,236.8,M,-34.0,M,,*72
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,3.2,2.8,1.5*3B
+$PGRME,7.7,M,10.3,M,12.9,M*26
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223540,4124.7487,N,08152.2530,W,2,05,3.2,236.9,M,-34.0,M,,*74
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,3.8,3.2,2.0*3C
+$PGRME,9.6,M,12.2,M,15.5,M*21
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,36,R*03
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223545,4124.7486,N,08152.2531,W,2,05,3.7,238.4,M,-34.0,M,,*77
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,4.4,3.7,1.5*34
+$PGRME,13.3,M,14.8,M,20.3,M*13
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223550,4124.7485,N,08152.2530,W,2,05,3.7,242.2,M,-34.0,M,,*7A
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,4.4,3.7,1.5*34
+$PGRME,13.3,M,14.8,M,20.3,M*13
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223555,4124.7484,N,08152.2529,W,2,04,4.2,242.0,M,-34.0,M,,*77
+$GPGSA,A,3,06,,09,,,,,,26,,,35,5.1,4.2,1.5*39
+$PGRME,16.6,M,16.4,M,23.9,M*14
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223600,4124.7468,N,08152.2526,W,2,05,3.6,249.4,M,-34.0,M,,*74
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.6,2.2*30
+$PGRME,9.5,M,12.2,M,15.5,M*22
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223605,4124.7362,N,08152.2518,W,2,05,3.6,252.2,M,-34.0,M,,*7D
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.2,3.6,2.5*31
+$PGRME,8.9,M,10.6,M,13.9,M*23
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223610,4124.7362,N,08152.2537,W,2,05,3.6,253.5,M,-34.0,M,,*72
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.1,3.6,1.0*34
+$PGRME,11.7,M,12.1,M,17.3,M*1E
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223615,4124.7373,N,08152.2540,W,2,05,3.9,254.6,M,-34.0,M,,*7C
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.5,3.9,1.5*3A
+$PGRME,11.7,M,12.1,M,17.3,M*1E
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223620,4124.7381,N,08152.2541,W,2,05,2.8,250.0,M,-34.0,M,,*74
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,3.2,2.8,1.5*3B
+$PGRME,7.7,M,10.2,M,12.8,M*26
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223625,4124.7517,N,08152.2534,W,2,05,3.2,243.4,M,-34.0,M,,*77
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,4.1,3.2,2.4*36
+$PGRME,7.7,M,10.2,M,12.8,M*26
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223630,4124.7533,N,08152.2529,W,2,05,4.1,240.0,M,-34.0,M,,*7A
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.2,4.1,1.5*32
+$PGRME,7.7,M,10.1,M,12.7,M*2A
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223635,4124.7504,N,08152.2584,W,2,05,2.8,242.9,M,-34.0,M,,*78
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,3.4,2.8,1.8*30
+$PGRME,7.7,M,10.1,M,12.7,M*2A
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223640,4124.7478,N,08152.2566,W,2,05,3.2,245.7,M,-34.0,M,,*7E
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,3.9,3.2,2.2*3F
+$PGRME,9.5,M,12.1,M,15.3,M*27
+$PGRMT,GPS 15-H Ver. 2.02,P,P,R,R,P,,36,R*03
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223645,4124.7473,N,08152.2556,W,2,05,3.2,244.5,M,-34.0,M,,*70
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,3.9,3.2,2.2*3F
+$PGRME,7.7,M,10.1,M,12.7,M*2A
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223650,4124.7474,N,08152.2551,W,2,05,3.5,241.2,M,-34.0,M,,*71
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,4.6,3.5,2.8*3A
+$PGRME,7.7,M,10.1,M,12.7,M*2A
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223655,4124.7475,N,08152.2547,W,2,05,3.6,242.6,M,-34.0,M,,*76
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.6,3.6*35
+$PGRME,7.7,M,10.1,M,12.7,M*2A
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223700,4124.7475,N,08152.2543,W,2,05,3.6,244.4,M,-34.0,M,,*77
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.6,3.9*3A
+$PGRME,7.7,M,10.1,M,12.7,M*2A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223705,4124.7476,N,08152.2541,W,2,05,3.3,246.6,M,-34.0,M,,*76
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.0,3.3,3.7*35
+$PGRME,7.7,M,10.1,M,12.7,M*2A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223710,4124.7475,N,08152.2539,W,2,05,3.6,246.3,M,-34.0,M,,*7E
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.6,4.0*34
+$PGRME,9.4,M,12.0,M,15.2,M*26
+$PGRMV,0.0,0.0,-0.0*71
+$PGRMM,WGS 84*06
+$GPGGA,223715,4124.7475,N,08152.2539,W,2,05,3.3,243.7,M,-34.0,M,,*7F
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.0,3.3,3.8*3A
+$PGRME,7.7,M,10.1,M,12.7,M*2A
+$PGRMV,0.0,0.0,0.0*5C
+$PGRMM,WGS 84*06
+$GPGGA,223720,4124.7477,N,08152.2539,W,2,05,3.6,245.6,M,-34.0,M,,*79
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,5.4,3.6,4.0*34
+$PGRME,7.7,M,10.1,M,12.7,M*2A
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223725,4124.7477,N,08152.2528,W,2,05,2.7,241.7,M,-34.0,M,,*79
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,3.2,2.7,1.5*34
+$PGRME,7.6,M,10.1,M,12.7,M*2B
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+$GPGGA,223730,4124.7495,N,08152.2527,W,2,05,2.3,233.0,M,-34.0,M,,*78
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,2.5,2.3,1.0*33
+$PGRME,9.4,M,11.9,M,15.2,M*2C
+$PGRMV,-0.0,0.2,-0.1*5F
+$PGRMM,WGS 84*06
+$GPGGA,223735,4124.7354,N,08152.2485,W,2,05,3.2,303.9,M,-34.0,M,,*75
+$GPGSA,A,3,06,,09,,,,,,26,29,,35,3.9,3.2,2.2*3F
+$PGRME,7.6,M,10.0,M,12.6,M*2B
+$PGRMV,0.0,0.0,-0.1*70
+$PGRMM,WGS 84*06
+
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/resources/data/Garmin-GPS15H.txt b/java/net.sf.marineapi.test/resources/data/Garmin-GPS15H.txt
new file mode 100644
index 00000000000..e7d6731b307
--- /dev/null
+++ b/java/net.sf.marineapi.test/resources/data/Garmin-GPS15H.txt
@@ -0,0 +1,4382 @@
+$GPRMC,183408,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*68
+$GPGGA,183408,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4F
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,00,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183409,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*69
+$GPGGA,183409,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4E
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,47,13,20,067,32,23,10,041,00*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183410,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*61
+$GPGGA,183410,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*46
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183411,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*60
+$GPGGA,183411,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*47
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,31,04,50,056,00,05,43,263,00,06,02,307,00*7C
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183412,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*63
+$GPGGA,183412,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*44
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,47,13,20,067,00,23,10,041,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183413,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*62
+$GPGGA,183413,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*45
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183414,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*65
+$GPGGA,183414,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*42
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,32,04,50,056,00,05,43,263,00,06,02,307,00*7F
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183415,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*64
+$GPGGA,183415,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*43
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,47,13,20,067,00,23,10,041,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183416,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*67
+$GPGGA,183416,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*40
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183417,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*66
+$GPGGA,183417,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*41
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,31,04,50,056,00,05,43,263,00,06,02,307,00*7C
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183418,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*69
+$GPGGA,183418,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4E
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,45,13,20,067,00,23,10,041,00*70
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183419,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*68
+$GPGGA,183419,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4F
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,41,35,34,141,43*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183420,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*62
+$GPGGA,183420,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*45
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,32,04,50,056,00,05,43,263,00,06,02,307,00*7F
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183421,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*63
+$GPGGA,183421,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*44
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,46,13,20,067,00,23,10,041,00*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183422,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*60
+$GPGGA,183422,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*47
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183423,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*61
+$GPGGA,183423,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*46
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,32,04,50,056,00,05,43,263,00,06,02,307,00*7F
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183424,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*66
+$GPGGA,183424,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*41
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,47,13,20,067,00,23,10,041,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183425,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*67
+$GPGGA,183425,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*40
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183426,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*64
+$GPGGA,183426,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*43
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,33,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183427,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*65
+$GPGGA,183427,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*42
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,47,13,20,067,00,23,10,041,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183428,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*6A
+$GPGGA,183428,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4D
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,39,35,34,141,43*7D
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183429,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*6B
+$GPGGA,183429,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4C
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,33,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183430,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*63
+$GPGGA,183430,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*44
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,47,13,20,067,00,23,10,041,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183431,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*62
+$GPGGA,183431,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*45
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183432,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*61
+$GPGGA,183432,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*46
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,33,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183433,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*60
+$GPGGA,183433,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*47
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,47,13,20,067,00,23,10,041,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183434,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*67
+$GPGGA,183434,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*40
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,41,35,34,141,43*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183435,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*66
+$GPGGA,183435,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*41
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,32,04,50,056,00,05,43,263,00,06,02,307,00*7F
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183436,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*65
+$GPGGA,183436,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*42
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,31,10,44,197,48,13,20,067,00,23,10,041,00*7F
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183437,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*64
+$GPGGA,183437,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*43
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,41,35,34,141,43*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183438,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*6B
+$GPGGA,183438,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4C
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,00,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183439,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*6A
+$GPGGA,183439,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4D
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,48,13,20,067,00,23,10,041,00*7D
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183440,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*64
+$GPGGA,183440,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*43
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,41,35,34,141,43*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183441,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*65
+$GPGGA,183441,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*42
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,00,04,50,056,35,05,43,263,00,06,02,307,00*78
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183442,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*66
+$GPGGA,183442,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*41
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,49,13,20,067,00,23,09,040,00*75
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183443,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*67
+$GPGGA,183443,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*40
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,18,067,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183444,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*60
+$GPGGA,183444,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*47
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,00,04,50,056,35,05,43,263,00,06,02,307,00*78
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183445,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*61
+$GPGGA,183445,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*46
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,49,13,20,067,00,23,09,040,00*75
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183446,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*62
+$GPGGA,183446,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*45
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,17,068,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183447,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*63
+$GPGGA,183447,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*44
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,00,04,50,056,35,05,43,263,00,06,02,307,00*78
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183448,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*6C
+$GPGGA,183448,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4B
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,49,13,20,067,00,23,09,040,00*75
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183449,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*6D
+$GPGGA,183449,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*4A
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,17,068,00,30,29,304,00,33,09,106,41,35,34,141,43*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183450,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*65
+$GPGGA,183450,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*42
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,00,04,50,056,36,05,43,263,00,06,02,307,00*7B
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183451,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*64
+$GPGGA,183451,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*43
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,20,126,00,10,44,197,49,13,20,067,00,23,09,040,00*75
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183452,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*67
+$GPGGA,183452,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*40
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,17,068,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183453,V,4124.7502,N,08152.2393,W,,,010305,007.9,W*66
+$GPGGA,183453,4124.7502,N,08152.2393,W,0,00,,,M,,M,,*41
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,71,317,00,04,50,056,36,05,43,263,00,06,02,307,00*7B
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183453,A,4124.6743,N,08152.2490,W,000.0,000.0,010305,007.9,W*73
+$GPGGA,183453,4124.6743,N,08152.2490,W,2,04,2.5,232.9,M,-34.0,M,,*7C
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,2,12,07,20,126,32,10,44,197,49,13,20,067,00,23,09,040,00*74
+$PGRME,252.5,M,50.0,M,257.4,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,183454,A,4124.7340,N,08152.2465,W,000.0,000.0,010305,007.9,W*78
+$GPGGA,183454,4124.7340,N,08152.2465,W,2,04,4.2,259.7,M,-34.0,M,,*75
+$GPGSA,A,2,,04,,,07,10,,,,,,35,5.4,4.2,1.7*36
+$GPGSV,3,3,12,24,17,068,00,30,29,304,00,33,09,106,41,35,34,141,43*72
+$PGRME,13.4,M,25.9,M,29.1,M*1C
+$PGRMM,WGS 84*06
+$GPRMC,183455,A,4124.7339,N,08152.2463,W,000.0,000.0,010305,007.9,W*71
+$GPGGA,183455,4124.7339,N,08152.2463,W,2,04,2.5,259.3,M,-34.0,M,,*79
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,71,317,00,04,50,056,36,05,43,263,00,06,02,307,00*7B
+$PGRME,13.6,M,28.3,M,31.5,M*14
+$PGRMM,WGS 84*06
+$GPRMC,183456,A,4124.7342,N,08152.2464,W,000.0,000.0,010305,007.9,W*79
+$GPGGA,183456,4124.7342,N,08152.2464,W,2,04,2.5,259.0,M,-34.0,M,,*72
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,2,12,07,20,126,31,10,44,197,50,13,20,067,00,23,09,040,00*7F
+$PGRME,13.6,M,28.3,M,31.5,M*14
+$PGRMM,WGS 84*06
+$GPRMC,183457,A,4124.7342,N,08152.2464,W,000.0,000.0,010305,007.9,W*78
+$GPGGA,183457,4124.7342,N,08152.2464,W,2,04,2.5,258.8,M,-34.0,M,,*7A
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,3,12,24,17,068,00,30,29,304,00,33,09,106,41,35,34,141,43*72
+$PGRME,13.8,M,30.4,M,33.6,M*15
+$PGRMM,WGS 84*06
+$GPRMC,183458,A,4124.7341,N,08152.2447,W,000.0,000.0,010305,007.9,W*75
+$GPGGA,183458,4124.7341,N,08152.2447,W,2,04,2.5,258.6,M,-34.0,M,,*79
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,71,317,00,04,50,056,35,05,43,263,00,06,02,307,00*78
+$PGRME,13.8,M,30.4,M,33.6,M*15
+$PGRMM,WGS 84*06
+$GPRMC,183459,A,4124.7340,N,08152.2437,W,000.0,000.0,010305,007.9,W*72
+$GPGGA,183459,4124.7340,N,08152.2437,W,2,04,2.5,258.4,M,-34.0,M,,*7C
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,2,12,07,20,126,32,10,44,197,50,13,20,067,32,23,09,040,00*7D
+$PGRME,13.8,M,30.4,M,33.6,M*15
+$PGRMM,WGS 84*06
+$GPRMC,183500,A,4124.7338,N,08152.2429,W,000.0,000.0,010305,007.9,W*7F
+$GPGGA,183500,4124.7338,N,08152.2429,W,2,04,4.2,211.2,M,-34.0,M,,*7B
+$GPGSA,A,2,,04,,,07,10,,,,,,35,5.4,4.2,1.7*36
+$GPGSV,3,3,12,24,17,068,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183501,A,4124.7346,N,08152.2441,W,001.5,348.3,010305,007.9,W*71
+$GPGGA,183501,4124.7346,N,08152.2441,W,2,04,2.5,211.3,M,-34.0,M,,*7D
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,71,317,00,04,50,056,34,05,43,263,00,06,02,307,00*79
+$PGRME,13.6,M,28.2,M,31.4,M*14
+$PGRMM,WGS 84*06
+$GPRMC,183502,A,4124.7477,N,08152.2520,W,001.5,348.3,010305,007.9,W*71
+$GPGGA,183502,4124.7477,N,08152.2520,W,2,04,6.9,211.4,M,-34.0,M,,*72
+$GPGSA,A,2,,04,,,07,10,,,,,,35,7.1,6.9,1.0*3F
+$GPGSV,3,2,12,07,20,126,35,10,44,197,50,13,20,067,32,23,09,040,00*7A
+$PGRME,13.6,M,28.2,M,31.4,M*14
+$PGRMM,WGS 84*06
+$GPRMC,183503,A,4124.7413,N,08152.2473,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183503,4124.7413,N,08152.2473,W,2,04,4.2,228.9,M,-34.0,M,,*78
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.0,4.2,1.7*3E
+$GPGSV,3,3,12,24,17,068,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183504,A,4124.7413,N,08152.2473,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,183504,4124.7413,N,08152.2473,W,2,04,4.2,229.1,M,-34.0,M,,*76
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.0,4.2,1.7*3E
+$GPGSV,3,1,12,02,71,317,00,04,50,056,33,05,43,263,00,06,02,307,00*7E
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183505,A,4124.7414,N,08152.2473,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183505,4124.7414,N,08152.2473,W,2,04,8.4,229.3,M,-34.0,M,,*78
+$GPGSA,A,2,,04,,,07,10,,,,,,35,12.3,8.4,1.0*0A
+$GPGSV,3,2,12,07,20,126,34,10,44,197,51,13,20,067,00,23,09,040,00*7B
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183506,A,4124.7415,N,08152.2473,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183506,4124.7415,N,08152.2473,W,2,04,8.4,229.4,M,-34.0,M,,*7D
+$GPGSA,A,2,,04,,,07,10,,,,,,35,12.3,8.4,1.0*0A
+$GPGSV,3,3,12,24,17,068,00,30,29,304,00,33,09,106,40,35,34,141,43*73
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183507,A,4124.7416,N,08152.2473,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183507,4124.7416,N,08152.2473,W,2,04,11.8,229.5,M,-34.0,M,,*4A
+$GPGSA,A,2,,04,,,07,10,,,,,,35,14.9,11.8,1.0*32
+$GPGSV,3,1,12,02,71,317,00,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183508,A,4124.7417,N,08152.2473,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183508,4124.7417,N,08152.2473,W,2,04,14.5,229.6,M,-34.0,M,,*4F
+$GPGSA,A,2,,04,,,07,10,,,,,,35,17.0,14.5,1.0*30
+$GPGSV,3,2,12,07,20,126,36,10,44,197,51,13,20,067,00,23,09,040,00*79
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183509,A,4124.7418,N,08152.2473,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183509,4124.7418,N,08152.2473,W,2,04,16.7,229.7,M,-34.0,M,,*40
+$GPGSA,A,2,,04,,,07,10,,,,,,35,18.8,16.7,1.0*37
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,40,35,34,141,43*74
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183510,A,4124.7418,N,08152.2473,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183510,4124.7418,N,08152.2473,W,2,04,18.5,229.7,M,-34.0,M,,*44
+$GPGSA,A,2,,04,,,07,10,,,,,,35,20.2,18.5,1.0*3A
+$GPGSV,3,1,12,02,71,317,00,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183511,A,4124.7419,N,08152.2473,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183511,4124.7419,N,08152.2473,W,2,04,20.0,229.8,M,-34.0,M,,*45
+$GPGSA,A,2,,04,,,07,10,,,,,,35,21.3,20.0,1.0*34
+$GPGSV,3,2,12,07,20,126,36,10,44,197,51,13,20,067,00,23,09,040,00*79
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183512,A,4124.7420,N,08152.2473,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183512,4124.7420,N,08152.2473,W,2,00,21.1,229.8,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,,,,,,,,22.2,21.1,1.0*32
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183513,A,4124.7421,N,08152.2472,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183513,4124.7421,N,08152.2472,W,2,00,21.1,229.9,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,,,,,,,,22.2,21.1,1.0*32
+$GPGSV,3,1,12,02,71,317,00,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183514,A,4124.7422,N,08152.2472,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,183514,4124.7422,N,08152.2472,W,2,00,21.1,229.9,M,-34.0,M,,*4C
+$GPGSA,A,2,,,,,,,,,,,,,22.2,21.1,1.0*32
+$GPGSV,3,2,12,07,20,126,00,10,44,197,50,13,20,067,00,23,09,040,00*7D
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183515,A,4124.7422,N,08152.2472,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183515,4124.7422,N,08152.2472,W,2,00,21.1,229.9,M,-34.0,M,,*4D
+$GPGSA,A,2,,,,,,,,,,,,,22.2,21.1,1.0*32
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183516,A,4124.7423,N,08152.2472,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183516,4124.7423,N,08152.2472,W,2,00,21.1,229.9,M,-34.0,M,,*4F
+$GPGSA,A,2,,,,,,,,,,,,,22.2,21.1,1.0*32
+$GPGSV,3,1,12,02,71,317,00,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183517,A,4124.7424,N,08152.2472,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183517,4124.7424,N,08152.2472,W,2,00,22.1,229.9,M,-34.0,M,,*4A
+$GPGSA,A,2,,,,,,,,,,,,,23.0,22.1,1.0*32
+$GPGSV,3,2,12,07,20,126,31,10,44,197,50,13,20,067,00,23,09,040,00*7F
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183518,A,4124.7425,N,08152.2472,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183518,4124.7425,N,08152.2472,W,2,00,22.1,229.9,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,,,,,,,,23.0,22.1,1.0*32
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183519,A,4124.7426,N,08152.2472,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183519,4124.7426,N,08152.2472,W,2,00,22.1,229.9,M,-34.0,M,,*46
+$GPGSA,A,2,,,,,,,,,,,,,23.0,22.1,1.0*32
+$GPGSV,3,1,12,02,71,317,00,04,50,056,00,05,43,263,00,06,02,307,00*7E
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183520,A,4124.7427,N,08152.2472,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,183520,4124.7427,N,08152.2472,W,2,00,22.1,229.9,M,-34.0,M,,*4D
+$GPGSA,A,2,,,,,,,,,,,,,23.0,22.1,1.0*32
+$GPGSV,3,2,12,07,20,126,00,10,44,197,50,13,20,067,00,23,09,040,00*7D
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183521,A,4124.7427,N,08152.2471,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,183521,4124.7427,N,08152.2471,W,2,00,22.1,229.9,M,-34.0,M,,*4F
+$GPGSA,A,2,,,,,,,,,,,,,23.0,22.1,1.0*32
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183522,A,4124.7428,N,08152.2471,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183522,4124.7428,N,08152.2471,W,2,00,22.1,229.9,M,-34.0,M,,*43
+$GPGSA,A,2,,,,,,,,,,,,,23.0,22.1,1.0*32
+$GPGSV,3,1,12,02,72,320,00,04,50,056,35,05,43,263,00,06,02,307,00*7F
+$PGRME,13.4,M,25.8,M,29.1,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,183523,A,4124.7429,N,08152.2471,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183523,4124.7429,N,08152.2471,W,2,03,2.5,230.0,M,-34.0,M,,*77
+$GPGSA,A,2,,04,,,,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,20,126,00,10,44,197,50,13,20,067,00,23,09,040,00*7D
+$PGRME,13.6,M,28.2,M,31.4,M*14
+$PGRMM,WGS 84*06
+$GPRMC,183524,A,4124.7427,N,08152.2471,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183524,4124.7427,N,08152.2471,W,2,03,2.5,230.0,M,-34.0,M,,*7E
+$GPGSA,A,2,,04,,,,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.6,M,28.2,M,31.4,M*14
+$PGRMM,WGS 84*06
+$GPRMC,183525,A,4124.7427,N,08152.2471,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183525,4124.7427,N,08152.2471,W,2,03,2.5,230.0,M,-34.0,M,,*7F
+$GPGSA,A,2,,04,,,,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,1,12,02,72,320,00,04,50,056,35,05,43,263,00,06,02,307,00*7F
+$PGRME,13.6,M,28.2,M,31.4,M*14
+$PGRMM,WGS 84*06
+$GPRMC,183526,A,4124.7426,N,08152.2471,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183526,4124.7426,N,08152.2471,W,2,04,2.5,227.9,M,-34.0,M,,*75
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,2,12,07,20,126,35,10,44,197,50,13,20,067,00,23,09,040,00*7B
+$PGRME,30.5,M,30.6,M,47.2,M*1C
+$PGRMM,WGS 84*06
+$GPRMC,183527,A,4124.7408,N,08152.2471,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183527,4124.7408,N,08152.2471,W,2,04,4.2,249.3,M,-34.0,M,,*7B
+$GPGSA,A,2,,04,,,07,10,,,,,,35,5.4,4.2,1.7*36
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,40,35,34,141,43*74
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183528,A,4124.7393,N,08152.2468,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183528,4124.7393,N,08152.2468,W,2,04,8.5,249.1,M,-34.0,M,,*70
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.4,8.5,1.0*36
+$GPGSV,3,1,12,02,72,320,00,04,50,056,32,05,43,263,00,06,02,307,00*78
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183529,A,4124.7380,N,08152.2466,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183529,4124.7380,N,08152.2466,W,2,04,4.2,253.8,M,-34.0,M,,*74
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.1,4.2,1.7*3F
+$GPGSV,3,2,12,07,20,126,34,10,44,197,49,13,20,067,00,23,09,040,00*72
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183530,A,4124.7371,N,08152.2464,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,183530,4124.7371,N,08152.2464,W,2,04,4.2,256.0,M,-34.0,M,,*7D
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.1,4.2,1.7*3F
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,40,35,34,141,43*74
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183531,A,4124.7207,N,08152.2437,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183531,4124.7207,N,08152.2437,W,2,04,8.5,255.9,M,-34.0,M,,*7B
+$GPGSA,A,2,,04,,,07,10,,,,,,35,12.4,8.5,1.0*0C
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,263,00,06,02,307,00*70
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183532,A,4124.7207,N,08152.2436,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183532,4124.7207,N,08152.2436,W,2,04,8.5,255.7,M,-34.0,M,,*77
+$GPGSA,A,2,,04,,,07,10,,,,,,35,12.4,8.5,1.0*0C
+$GPGSV,3,2,12,07,20,126,33,10,44,197,49,13,20,067,00,23,09,040,00*75
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183533,A,4124.7207,N,08152.2435,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183533,4124.7207,N,08152.2435,W,2,04,8.5,255.6,M,-34.0,M,,*74
+$GPGSA,A,2,,04,,,07,10,,,,,,35,12.4,8.5,1.0*0C
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,40,35,34,141,43*74
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183534,A,4124.7207,N,08152.2434,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183534,4124.7207,N,08152.2434,W,2,04,11.9,255.5,M,-34.0,M,,*45
+$GPGSA,A,2,,04,,,07,10,,,,,,35,15.1,11.9,1.0*3A
+$GPGSV,3,1,12,02,72,320,00,04,49,057,32,05,43,262,00,06,02,307,00*70
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183535,A,4124.7207,N,08152.2434,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,183535,4124.7207,N,08152.2434,W,2,04,4.2,264.0,M,-34.0,M,,*7C
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.1,4.2,1.7*3F
+$GPGSV,3,2,12,07,20,126,34,10,44,197,48,13,20,067,00,23,09,040,00*73
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183536,A,4124.7211,N,08152.2433,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183536,4124.7211,N,08152.2433,W,2,04,4.2,263.9,M,-34.0,M,,*71
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.1,4.2,1.7*3F
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183537,A,4124.7215,N,08152.2432,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183537,4124.7215,N,08152.2432,W,2,04,4.2,263.8,M,-34.0,M,,*74
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.1,4.2,1.7*3F
+$GPGSV,3,1,12,02,72,320,00,04,49,057,31,05,43,262,00,06,03,307,00*72
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183538,A,4124.7218,N,08152.2432,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183538,4124.7218,N,08152.2432,W,2,04,8.5,263.7,M,-34.0,M,,*72
+$GPGSA,A,2,,04,,,07,10,,,,,,35,12.4,8.5,1.0*0C
+$GPGSV,3,2,12,07,20,126,35,10,44,197,48,13,20,067,00,23,09,040,00*72
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183539,A,4124.7221,N,08152.2431,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183539,4124.7221,N,08152.2431,W,2,04,11.9,263.7,M,-34.0,M,,*4E
+$GPGSA,A,2,,04,,,07,10,,,,,,35,15.1,11.9,1.0*3A
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.6,M,28.9,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,183540,A,4124.7224,N,08152.2431,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183540,4124.7224,N,08152.2431,W,2,04,2.5,263.6,M,-34.0,M,,*7A
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,72,320,00,04,49,057,32,05,43,262,00,06,03,307,00*71
+$PGRME,13.6,M,28.0,M,31.2,M*10
+$PGRMM,WGS 84*06
+$GPRMC,183541,A,4124.7228,N,08152.2431,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183541,4124.7228,N,08152.2431,W,2,04,7.1,263.6,M,-34.0,M,,*76
+$GPGSA,A,2,,04,,,07,10,,,,,,35,7.2,7.1,1.0*35
+$GPGSV,3,2,12,07,19,126,36,10,44,197,47,13,20,067,00,23,09,040,00*74
+$PGRME,13.6,M,28.0,M,31.2,M*10
+$PGRMM,WGS 84*06
+$GPRMC,183542,A,4124.7232,N,08152.2431,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183542,4124.7232,N,08152.2431,W,2,04,10.8,263.6,M,-34.0,M,,*41
+$GPGSA,A,2,,04,,,07,10,,,,,,35,10.9,10.8,1.0*37
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.6,M,28.0,M,31.2,M*10
+$PGRMM,WGS 84*06
+$GPRMC,183543,A,4124.7235,N,08152.2431,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183543,4124.7235,N,08152.2431,W,2,04,2.5,263.5,M,-34.0,M,,*7A
+$GPGSA,A,2,,04,,,07,10,,,,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,72,320,36,04,49,057,32,05,43,262,00,06,03,307,00*74
+$PGRME,13.9,M,30.2,M,33.4,M*10
+$PGRMM,WGS 84*06
+$GPRMC,183544,A,4124.7240,N,08152.2432,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183544,4124.7240,N,08152.2432,W,2,03,2.5,263.5,M,-34.0,M,,*7B
+$GPGSA,A,2,,04,,,,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,19,126,35,10,44,197,47,13,20,067,36,23,09,040,00*72
+$PGRME,13.9,M,30.2,M,33.4,M*10
+$PGRMM,WGS 84*06
+$GPRMC,183545,A,4124.7244,N,08152.2433,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183545,4124.7244,N,08152.2433,W,2,03,2.5,263.5,M,-34.0,M,,*7F
+$GPGSA,A,2,,04,,,,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,40,35,34,141,43*74
+$PGRME,13.9,M,30.2,M,33.4,M*10
+$PGRMM,WGS 84*06
+$GPRMC,183546,A,4124.7247,N,08152.2433,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183546,4124.7247,N,08152.2433,W,2,04,4.2,268.5,M,-34.0,M,,*72
+$GPGSA,A,2,,04,,,07,10,,,,,,35,5.5,4.2,1.7*37
+$GPGSV,3,1,12,02,72,320,37,04,49,057,33,05,43,262,00,06,03,307,00*74
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183547,A,4124.7251,N,08152.2434,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183547,4124.7251,N,08152.2434,W,2,04,8.5,268.5,M,-34.0,M,,*78
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.5,8.5,1.0*37
+$GPGSV,3,2,12,07,19,126,00,10,44,197,46,13,20,067,35,23,09,040,00*76
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183548,A,4124.7254,N,08152.2434,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183548,4124.7254,N,08152.2434,W,2,04,8.5,268.6,M,-34.0,M,,*71
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.5,8.5,1.0*37
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183549,A,4124.7257,N,08152.2435,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183549,4124.7257,N,08152.2435,W,2,04,8.5,268.6,M,-34.0,M,,*72
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.5,8.5,1.0*37
+$GPGSV,3,1,12,02,72,320,38,04,49,057,00,05,43,262,00,06,03,307,00*7B
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183550,A,4124.7259,N,08152.2435,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183550,4124.7259,N,08152.2435,W,2,04,8.5,268.6,M,-34.0,M,,*74
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.5,8.5,1.0*37
+$GPGSV,3,2,12,07,19,126,00,10,44,197,45,13,20,067,34,23,09,040,00*74
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183551,A,4124.7262,N,08152.2436,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183551,4124.7262,N,08152.2436,W,2,04,8.5,268.6,M,-34.0,M,,*7E
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.5,8.5,1.0*37
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183552,A,4124.7264,N,08152.2436,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183552,4124.7264,N,08152.2436,W,2,04,8.5,268.6,M,-34.0,M,,*7B
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.5,8.5,1.0*37
+$GPGSV,3,1,12,02,72,320,39,04,49,057,00,05,43,262,00,06,03,307,00*7A
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183553,A,4124.7267,N,08152.2437,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183553,4124.7267,N,08152.2437,W,2,04,12.0,268.6,M,-34.0,M,,*46
+$GPGSA,A,2,,04,,,07,10,,,,,,35,12.8,12.0,1.0*3E
+$GPGSV,3,2,12,07,19,126,33,10,45,198,45,13,20,067,35,23,09,040,00*7B
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183554,A,4124.7269,N,08152.2438,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183554,4124.7269,N,08152.2438,W,2,04,14.8,268.6,M,-34.0,M,,*4E
+$GPGSA,A,2,,04,,,07,10,,,,,,35,15.5,14.8,1.0*3A
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183555,A,4124.7271,N,08152.2438,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183555,4124.7271,N,08152.2438,W,2,00,14.8,268.6,M,-34.0,M,,*42
+$GPGSA,A,2,,,,,,,,,,,,,15.5,14.8,1.0*3E
+$GPGSV,3,1,12,02,72,320,38,04,49,057,00,05,43,262,00,06,03,307,00*7B
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183556,A,4124.7273,N,08152.2439,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183556,4124.7273,N,08152.2439,W,2,00,14.8,268.6,M,-34.0,M,,*42
+$GPGSA,A,2,,,,,,,,,,,,,15.5,14.8,1.0*3E
+$GPGSV,3,2,12,07,19,126,35,10,45,198,44,13,20,067,35,23,09,040,00*7C
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183557,A,4124.7275,N,08152.2439,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183557,4124.7275,N,08152.2439,W,2,00,17.1,268.6,M,-34.0,M,,*4F
+$GPGSA,A,2,,,,,,,,,,,,,17.7,17.1,1.0*34
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183558,A,4124.7276,N,08152.2440,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,183558,4124.7276,N,08152.2440,W,2,00,19.0,268.6,M,-34.0,M,,*42
+$GPGSA,A,2,,,,,,,,,,,,,19.4,19.0,1.0*36
+$GPGSV,3,1,12,02,72,320,38,04,49,057,00,05,43,262,00,06,03,307,00*7B
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183559,A,4124.7278,N,08152.2440,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183559,4124.7278,N,08152.2440,W,2,00,20.5,268.6,M,-34.0,M,,*42
+$GPGSA,A,2,,,,,,,,,,,,,20.9,20.5,1.0*3E
+$GPGSV,3,2,12,07,19,126,35,10,45,198,45,13,20,067,35,23,09,040,00*7D
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183600,A,4124.7279,N,08152.2441,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,183600,4124.7279,N,08152.2441,W,2,00,20.5,268.6,M,-34.0,M,,*4D
+$GPGSA,A,2,,,,,,,,,,,,,20.9,20.5,1.0*3E
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183601,A,4124.7281,N,08152.2441,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183601,4124.7281,N,08152.2441,W,2,00,20.5,268.6,M,-34.0,M,,*4B
+$GPGSA,A,2,,,,,,,,,,,,,20.9,20.5,1.0*3E
+$GPGSV,3,1,12,02,72,320,37,04,49,057,00,05,43,262,00,06,03,307,00*74
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183602,A,4124.7282,N,08152.2442,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183602,4124.7282,N,08152.2442,W,2,00,20.5,268.6,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,,,,,,,,20.9,20.5,1.0*3E
+$GPGSV,3,2,12,07,19,126,35,10,45,198,45,13,20,067,37,23,09,040,00*7F
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183603,A,4124.7284,N,08152.2443,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183603,4124.7284,N,08152.2443,W,2,00,21.7,268.6,M,-34.0,M,,*4D
+$GPGSA,A,2,,,,,,,,,,,,,22.0,21.7,1.0*36
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183604,A,4124.7285,N,08152.2443,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183604,4124.7285,N,08152.2443,W,2,00,22.7,268.6,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,,,,,,,,23.0,22.7,1.0*34
+$GPGSV,3,1,12,02,72,320,37,04,49,057,00,05,43,262,32,06,03,307,00*75
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183605,A,4124.7287,N,08152.2444,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183605,4124.7287,N,08152.2444,W,2,00,23.6,268.6,M,-34.0,M,,*4C
+$GPGSA,A,2,,,,,,,,,,,,,23.8,23.6,1.0*3C
+$GPGSV,3,2,12,07,19,126,34,10,45,198,45,13,20,066,38,23,09,040,00*70
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183606,A,4124.7288,N,08152.2444,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183606,4124.7288,N,08152.2444,W,2,00,23.6,268.6,M,-34.0,M,,*40
+$GPGSA,A,2,,,,,,,,,,,,,23.8,23.6,1.0*3C
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183607,A,4124.7289,N,08152.2445,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,183607,4124.7289,N,08152.2445,W,2,00,24.2,268.6,M,-34.0,M,,*42
+$GPGSA,A,2,,,,,,,,,,,,,24.4,24.2,1.0*34
+$GPGSV,3,1,12,02,72,320,37,04,49,057,33,05,43,262,33,06,03,307,00*74
+$PGRME,13.4,M,25.5,M,28.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,183608,A,4124.7291,N,08152.2446,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183608,4124.7291,N,08152.2446,W,2,04,4.2,268.4,M,-34.0,M,,*73
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.0,4.2,1.7*3E
+$GPGSV,3,2,12,07,19,126,35,10,45,198,45,13,20,066,38,23,09,040,00*71
+$PGRME,13.4,M,25.4,M,28.7,M*16
+$PGRMM,WGS 84*06
+$GPRMC,183609,A,4124.7292,N,08152.2447,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183609,4124.7292,N,08152.2447,W,2,04,4.2,267.7,M,-34.0,M,,*7C
+$GPGSA,A,2,,04,,,07,10,,,,,,35,9.0,4.2,1.7*3E
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,44*72
+$PGRME,13.4,M,25.4,M,28.7,M*16
+$PGRMM,WGS 84*06
+$GPRMC,183610,A,4124.7293,N,08152.2446,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183610,4124.7293,N,08152.2446,W,1,04,4.2,265.8,M,-34.0,M,,*7A
+$GPGSA,A,3,,04,,,07,10,,,,,,35,9.0,4.2,2.3*38
+$GPGSV,3,1,12,02,72,320,37,04,49,057,31,05,43,262,33,06,03,307,00*76
+$PGRME,13.4,M,25.4,M,28.7,M*16
+$PGRMM,WGS 84*06
+$GPRMC,183611,A,4124.7294,N,08152.2447,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183611,4124.7294,N,08152.2447,W,1,04,4.2,265.5,M,-34.0,M,,*70
+$GPGSA,A,3,,04,,,07,10,,,,,,35,9.0,4.2,2.3*38
+$GPGSV,3,2,12,07,19,126,35,10,45,198,45,13,20,066,38,23,09,040,00*71
+$PGRME,13.4,M,25.4,M,28.7,M*16
+$PGRMM,WGS 84*06
+$GPRMC,183612,A,4124.7295,N,08152.2448,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183612,4124.7295,N,08152.2448,W,1,04,8.6,265.4,M,-34.0,M,,*74
+$GPGSA,A,3,,04,,,07,10,,,,,,35,12.5,8.6,1.0*0F
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,43*75
+$PGRME,13.4,M,25.4,M,28.7,M*16
+$PGRMM,WGS 84*06
+$GPRMC,183613,A,4124.7296,N,08152.2449,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183613,4124.7296,N,08152.2449,W,1,04,2.5,265.2,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,07,10,,,,,,35,2.7,2.5,1.0*35
+$GPGSV,3,1,12,02,72,320,36,04,49,057,31,05,43,262,34,06,03,307,00*70
+$PGRME,10.1,M,25.4,M,27.3,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,183614,A,4124.7298,N,08152.2450,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183614,4124.7298,N,08152.2450,W,1,04,2.5,265.1,M,-34.0,M,,*7A
+$GPGSA,A,3,,04,,,07,10,,,,,,35,2.7,2.5,1.0*35
+$GPGSV,3,2,12,07,19,126,00,10,45,198,46,13,20,066,37,23,09,040,00*7B
+$PGRME,10.1,M,25.4,M,27.3,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,183615,A,4124.7299,N,08152.2450,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183615,4124.7299,N,08152.2450,W,1,04,2.5,265.1,M,-34.0,M,,*7A
+$GPGSA,A,3,,04,,,07,10,,,,,,35,2.7,2.5,1.0*35
+$GPGSV,3,3,12,24,17,068,35,30,29,303,00,33,09,106,41,35,34,141,43*73
+$PGRME,10.1,M,25.4,M,27.3,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,183616,A,4124.7300,N,08152.2451,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183616,4124.7300,N,08152.2451,W,1,04,2.5,265.0,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,07,10,,,,,,35,2.7,2.5,1.0*35
+$GPGSV,3,1,12,02,72,320,36,04,49,057,31,05,43,262,33,06,03,307,00*77
+$PGRME,10.1,M,25.4,M,27.3,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,183617,A,4124.7301,N,08152.2451,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183617,4124.7301,N,08152.2451,W,1,04,2.5,265.0,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,07,10,,,,,,35,2.7,2.5,1.0*35
+$GPGSV,3,2,12,07,19,126,00,10,45,198,46,13,20,066,00,23,09,040,00*7F
+$PGRME,10.1,M,25.4,M,27.3,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,183618,A,4124.7302,N,08152.2452,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183618,4124.7302,N,08152.2452,W,1,04,2.5,264.9,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,07,10,,,,,,35,2.7,2.5,1.0*35
+$GPGSV,3,3,12,24,17,068,35,30,29,303,00,33,09,106,41,35,34,141,43*73
+$PGRME,10.1,M,25.4,M,27.3,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,183619,A,4124.7303,N,08152.2452,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183619,4124.7303,N,08152.2452,W,1,03,2.5,264.9,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,1,12,02,72,320,36,04,49,057,31,05,43,262,32,06,03,307,00*76
+$PGRME,10.1,M,25.4,M,27.3,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,183620,A,4124.7304,N,08152.2453,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183620,4124.7304,N,08152.2453,W,1,05,3.7,262.7,M,-34.0,M,,*79
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,5.6,3.7,1.8*3E
+$GPGSV,3,2,12,07,19,126,34,10,45,198,46,13,20,066,00,23,09,040,00*78
+$PGRME,10.3,M,25.7,M,27.6,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,183621,A,4124.7305,N,08152.2454,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183621,4124.7305,N,08152.2454,W,1,05,2.8,261.1,M,-34.0,M,,*75
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,3,12,24,17,068,36,30,29,303,00,33,09,106,41,35,34,141,43*70
+$PGRME,8.6,M,10.5,M,13.6,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183622,A,4124.7306,N,08152.2455,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,183622,4124.7306,N,08152.2455,W,1,05,2.8,259.2,M,-34.0,M,,*7C
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.2,2.8,1.3*39
+$GPGSV,3,1,12,02,72,320,37,04,49,057,34,05,43,262,00,06,03,307,00*73
+$PGRME,8.6,M,10.5,M,13.6,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183623,A,4124.7307,N,08152.2456,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183623,4124.7307,N,08152.2456,W,1,05,4.2,258.3,M,-34.0,M,,*73
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,5.9,4.2,1.7*3C
+$GPGSV,3,2,12,07,19,126,35,10,45,198,46,13,20,066,00,23,09,040,00*79
+$PGRME,9.1,M,12.0,M,15.1,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183624,A,4124.7308,N,08152.2456,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183624,4124.7308,N,08152.2456,W,1,05,4.2,256.7,M,-34.0,M,,*71
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,6.2,4.2,2.3*33
+$GPGSV,3,3,12,24,17,068,34,30,29,303,00,33,09,106,40,35,34,141,43*73
+$PGRME,7.2,M,10.5,M,12.7,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183625,A,4124.7309,N,08152.2457,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183625,4124.7309,N,08152.2457,W,1,05,4.2,256.5,M,-34.0,M,,*72
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,6.2,4.2,2.3*33
+$GPGSV,3,1,12,02,72,320,36,04,49,057,34,05,43,262,00,06,03,307,00*72
+$PGRME,7.8,M,12.0,M,14.3,M*24
+$PGRMM,WGS 84*06
+$GPRMC,183626,A,4124.7310,N,08152.2458,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183626,4124.7310,N,08152.2458,W,1,05,3.7,256.5,M,-34.0,M,,*74
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,8.5,3.7,1.8*30
+$GPGSV,3,2,12,07,19,126,34,10,45,198,45,13,20,066,33,23,09,040,00*7B
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183627,A,4124.7311,N,08152.2458,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183627,4124.7311,N,08152.2458,W,1,05,2.8,256.6,M,-34.0,M,,*79
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,3,12,24,17,068,32,30,29,303,00,33,09,106,40,35,34,141,43*75
+$PGRME,8.3,M,13.6,M,16.0,M*26
+$PGRMM,WGS 84*06
+$GPRMC,183628,A,4124.7312,N,08152.2460,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183628,4124.7312,N,08152.2460,W,1,05,2.8,256.7,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,1,12,02,72,320,36,04,49,057,00,05,43,262,00,06,03,307,00*75
+$PGRME,8.5,M,13.6,M,16.1,M*21
+$PGRMM,WGS 84*06
+$GPRMC,183629,A,4124.7313,N,08152.2460,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183629,4124.7313,N,08152.2460,W,1,05,2.8,256.7,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,2,12,07,19,126,00,10,45,198,45,13,20,066,32,23,09,040,00*7D
+$PGRME,8.6,M,13.6,M,16.1,M*22
+$PGRMM,WGS 84*06
+$GPRMC,183630,A,4124.7314,N,08152.2461,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183630,4124.7314,N,08152.2461,W,1,05,2.8,256.8,M,-34.0,M,,*7E
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,40,35,34,141,44*73
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183631,A,4124.7315,N,08152.2462,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183631,4124.7315,N,08152.2462,W,1,05,2.8,256.8,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,1,12,02,72,320,34,04,49,057,00,05,43,262,00,06,03,307,00*77
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183632,A,4124.7316,N,08152.2463,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183632,4124.7316,N,08152.2463,W,1,05,2.8,256.8,M,-34.0,M,,*7C
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,2,12,07,19,126,00,10,45,198,45,13,20,066,00,23,09,040,00*7C
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183633,A,4124.7317,N,08152.2463,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183633,4124.7317,N,08152.2463,W,1,05,2.8,256.8,M,-34.0,M,,*7C
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,40,35,34,141,43*74
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183634,A,4124.7318,N,08152.2464,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183634,4124.7318,N,08152.2464,W,1,04,2.8,256.9,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,1,12,02,72,320,34,04,49,057,00,05,43,262,00,06,03,307,00*77
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183635,A,4124.7319,N,08152.2465,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183635,4124.7319,N,08152.2465,W,1,03,2.8,256.9,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,2,12,07,19,126,00,10,45,198,45,13,20,066,00,23,09,040,00*7C
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183636,A,4124.7319,N,08152.2466,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183636,4124.7319,N,08152.2466,W,1,03,2.8,256.9,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,40,35,34,141,44*73
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183637,A,4124.7320,N,08152.2466,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,183637,4124.7320,N,08152.2466,W,1,03,7.5,256.9,M,-34.0,M,,*76
+$GPGSA,A,3,,,,,,10,,,24,,,35,7.6,7.5,1.0*31
+$GPGSV,3,1,12,02,72,320,33,04,49,057,00,05,43,262,00,06,03,307,00*70
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183638,A,4124.7321,N,08152.2467,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183638,4124.7321,N,08152.2467,W,1,03,11.3,256.9,M,-34.0,M,,*48
+$GPGSA,A,3,,,,,,10,,,24,,,35,11.4,11.3,1.0*35
+$GPGSV,3,2,12,07,19,126,33,10,45,198,45,13,20,066,00,23,09,040,00*7C
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183639,A,4124.7322,N,08152.2468,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,183639,4124.7322,N,08152.2468,W,1,00,14.4,256.9,M,-34.0,M,,*44
+$GPGSA,A,3,,,,,,,,,,,,,14.5,14.4,1.0*32
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,40,35,34,141,43*74
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183640,A,4124.7323,N,08152.2468,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183640,4124.7323,N,08152.2468,W,1,00,16.9,256.9,M,-34.0,M,,*44
+$GPGSA,A,3,,,,,,,,,,,,,17.0,16.9,1.0*3B
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,00,06,03,307,00*70
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183641,A,4124.7324,N,08152.2469,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183641,4124.7324,N,08152.2469,W,1,00,19.0,256.9,M,-34.0,M,,*45
+$GPGSA,A,3,,,,,,,,,,,,,19.0,19.0,1.0*33
+$GPGSV,3,2,12,07,19,126,35,10,45,198,45,13,20,066,00,23,09,039,00*74
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183642,A,4124.7324,N,08152.2469,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183642,4124.7324,N,08152.2469,W,1,00,20.6,256.9,M,-34.0,M,,*4A
+$GPGSA,A,3,,,,,,,,,,,,,20.7,20.6,1.0*32
+$GPGSV,3,3,12,24,17,068,00,30,29,303,00,33,09,106,41,35,34,141,44*72
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183643,A,4124.7325,N,08152.2470,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183643,4124.7325,N,08152.2470,W,1,00,22.0,256.9,M,-34.0,M,,*46
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,00,06,03,307,00*70
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183644,A,4124.7326,N,08152.2470,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183644,4124.7326,N,08152.2470,W,1,00,22.0,256.9,M,-34.0,M,,*42
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,2,12,07,19,126,00,10,45,198,45,13,20,066,00,23,09,039,00*72
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183645,A,4124.7327,N,08152.2471,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183645,4124.7327,N,08152.2471,W,1,00,22.0,256.9,M,-34.0,M,,*43
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,3,12,24,16,068,00,30,29,303,00,33,09,106,41,35,34,141,44*73
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183646,A,4124.7327,N,08152.2472,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183646,4124.7327,N,08152.2472,W,1,00,22.0,256.9,M,-34.0,M,,*43
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,00,06,03,307,00*70
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183647,A,4124.7328,N,08152.2472,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183647,4124.7328,N,08152.2472,W,1,00,22.0,256.9,M,-34.0,M,,*4D
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,2,12,07,19,126,00,10,45,198,45,13,20,066,00,23,09,039,00*72
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183648,A,4124.7329,N,08152.2473,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183648,4124.7329,N,08152.2473,W,1,00,22.0,256.9,M,-34.0,M,,*42
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,3,12,24,16,068,00,30,29,303,00,33,09,106,41,35,34,141,44*73
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183649,A,4124.7329,N,08152.2473,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183649,4124.7329,N,08152.2473,W,1,00,22.0,256.9,M,-34.0,M,,*43
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,00,06,03,307,00*70
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183650,A,4124.7330,N,08152.2474,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183650,4124.7330,N,08152.2474,W,1,00,22.0,256.9,M,-34.0,M,,*44
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,2,12,07,19,126,00,10,45,198,44,13,20,066,00,23,09,039,00*73
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183651,A,4124.7331,N,08152.2474,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183651,4124.7331,N,08152.2474,W,1,00,22.0,256.9,M,-34.0,M,,*44
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,3,12,24,16,068,00,30,29,303,00,33,09,106,41,35,34,141,43*74
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183652,A,4124.7331,N,08152.2474,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,183652,4124.7331,N,08152.2474,W,1,00,22.0,256.9,M,-34.0,M,,*47
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,00,06,03,307,00*70
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183653,A,4124.7332,N,08152.2475,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183653,4124.7332,N,08152.2475,W,1,00,22.0,256.9,M,-34.0,M,,*44
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,2,12,07,19,126,00,10,45,198,44,13,20,066,00,23,09,039,00*73
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183654,A,4124.7332,N,08152.2475,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183654,4124.7332,N,08152.2475,W,1,00,22.0,256.9,M,-34.0,M,,*43
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,3,12,24,16,068,00,30,29,303,00,33,09,106,41,35,34,141,44*73
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183655,A,4124.7333,N,08152.2476,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183655,4124.7333,N,08152.2476,W,1,00,22.0,256.9,M,-34.0,M,,*40
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,00,06,03,307,00*70
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183656,A,4124.7334,N,08152.2476,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183656,4124.7334,N,08152.2476,W,1,00,22.0,256.9,M,-34.0,M,,*44
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,2,12,07,19,126,00,10,45,198,44,13,20,066,00,23,09,039,00*73
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183657,A,4124.7334,N,08152.2477,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183657,4124.7334,N,08152.2477,W,1,00,22.0,256.9,M,-34.0,M,,*44
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,3,12,24,16,068,00,30,29,303,00,33,09,106,41,35,34,141,43*74
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183658,A,4124.7335,N,08152.2477,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183658,4124.7335,N,08152.2477,W,1,00,22.0,256.9,M,-34.0,M,,*4A
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,35,06,03,307,00*76
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183659,A,4124.7335,N,08152.2477,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,183659,4124.7335,N,08152.2477,W,1,00,22.0,256.9,M,-34.0,M,,*4B
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,2,12,07,19,126,00,10,45,198,44,13,20,066,00,23,09,039,00*73
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183700,A,4124.7336,N,08152.2478,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183700,4124.7336,N,08152.2478,W,1,00,22.0,256.9,M,-34.0,M,,*4A
+$GPGSA,A,3,,,,,,,,,,,,,22.0,22.0,1.0*33
+$GPGSV,3,3,12,24,16,068,00,30,29,303,00,33,09,106,41,35,34,141,43*74
+$PGRME,8.7,M,13.6,M,16.2,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183659,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*6D
+$GPGGA,183659,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*4A
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,35,06,03,307,00*76
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183700,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*60
+$GPGGA,183700,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*47
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,00,10,45,198,43,13,20,066,00,23,09,039,00*74
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183701,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*61
+$GPGGA,183701,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*46
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,29,303,00,33,09,106,41,35,34,141,43*74
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183702,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*62
+$GPGGA,183702,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*45
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,34,06,03,307,00*77
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183703,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*63
+$GPGGA,183703,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*44
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,00,10,45,198,43,13,20,066,00,23,09,039,00*74
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183704,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*64
+$GPGGA,183704,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*43
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,29,303,00,33,09,106,40,35,34,141,43*75
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183705,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*65
+$GPGGA,183705,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*42
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,33,06,03,307,00*70
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183706,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*66
+$GPGGA,183706,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*41
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,00,10,45,198,44,13,20,066,00,23,09,039,00*73
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183707,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*67
+$GPGGA,183707,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*40
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,44*7A
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183708,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*68
+$GPGGA,183708,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*4F
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,32,06,03,307,00*71
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183709,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*69
+$GPGGA,183709,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*4E
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,00,10,45,198,45,13,20,066,00,23,09,039,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183710,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*61
+$GPGGA,183710,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*46
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,43*7D
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183711,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*60
+$GPGGA,183711,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*47
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,31,06,03,307,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183712,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*63
+$GPGGA,183712,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*44
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,00,10,45,198,45,13,20,066,00,23,09,039,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183713,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*62
+$GPGGA,183713,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*45
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,43*7D
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183714,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*65
+$GPGGA,183714,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*42
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,31,06,03,307,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183715,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*64
+$GPGGA,183715,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*43
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,00,10,45,198,46,13,20,066,00,23,09,039,00*71
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183716,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*67
+$GPGGA,183716,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*40
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,44*7A
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183717,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*66
+$GPGGA,183717,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*41
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,320,00,04,49,057,00,05,43,262,32,06,03,307,00*71
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183718,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*69
+$GPGGA,183718,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*4E
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,37,10,45,198,46,13,20,066,00,23,09,039,00*75
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183719,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*68
+$GPGGA,183719,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*4F
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,44*7A
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183720,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*62
+$GPGGA,183720,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*45
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,323,00,04,49,057,00,05,43,262,31,06,03,307,00*71
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183721,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*63
+$GPGGA,183721,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*44
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,36,10,45,198,46,13,20,066,00,23,09,039,00*74
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183722,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*60
+$GPGGA,183722,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*47
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,44*7A
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183723,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*61
+$GPGGA,183723,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*46
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,323,00,04,49,057,00,05,43,262,31,06,03,307,00*71
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183724,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*66
+$GPGGA,183724,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*41
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,37,10,45,198,46,13,20,066,00,23,09,039,00*75
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183725,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*67
+$GPGGA,183725,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*40
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,44*7A
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183726,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*64
+$GPGGA,183726,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*43
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,1,12,02,72,323,00,04,49,057,00,05,43,262,34,06,03,307,00*74
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183727,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*65
+$GPGGA,183727,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*42
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,2,12,07,19,126,37,10,45,198,46,13,20,066,34,23,09,039,00*72
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183728,V,4124.7387,N,08152.2515,W,,,010305,007.9,W*6A
+$GPGGA,183728,4124.7387,N,08152.2515,W,0,00,,,M,,M,,*4D
+$GPGSA,A,1,,,,,,,,,,,,,,,*1E
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,40,35,34,141,44*7B
+$PGRME,,M,,M,,M*00
+$PGRMM,WGS 84*06
+$GPRMC,183731,A,4124.7348,N,08152.2487,W,000.0,000.0,010305,007.9,W*7C
+$GPGGA,183731,4124.7348,N,08152.2487,W,1,03,2.5,256.9,M,-34.0,M,,*75
+$GPGSA,A,2,,04,,,,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,43,262,00,06,03,307,00*72
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183732,A,4124.7344,N,08152.2486,W,000.0,000.0,010305,007.9,W*72
+$GPGGA,183732,4124.7344,N,08152.2486,W,1,03,2.5,256.9,M,-34.0,M,,*7B
+$GPGSA,A,2,,04,,,,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,19,126,36,10,45,198,46,13,20,066,34,23,09,039,00*73
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183733,A,4124.7341,N,08152.2486,W,000.0,000.0,010305,007.9,W*76
+$GPGGA,183733,4124.7341,N,08152.2486,W,1,03,7.4,256.9,M,-34.0,M,,*7B
+$GPGSA,A,2,,04,,,,10,,,,,,35,7.6,7.4,1.0*33
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,44*7A
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183734,A,4124.7197,N,08152.2484,W,000.0,000.0,010305,007.9,W*7A
+$GPGGA,183734,4124.7197,N,08152.2484,W,1,03,11.4,256.9,M,-34.0,M,,*40
+$GPGSA,A,2,,04,,,,10,,,,,,35,11.6,11.4,1.0*33
+$GPGSV,3,1,12,02,72,323,34,04,48,057,00,05,42,260,35,06,03,307,00*70
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183735,A,4124.7161,N,08152.2477,W,000.0,000.0,010305,007.9,W*7E
+$GPGGA,183735,4124.7161,N,08152.2477,W,1,03,14.7,256.9,M,-34.0,M,,*42
+$GPGSA,A,2,,04,,,,10,,,,,,35,14.8,14.7,1.0*3E
+$GPGSV,3,2,12,07,19,126,36,10,45,198,46,13,20,066,34,23,09,039,00*73
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183736,A,4124.7132,N,08152.2473,W,000.0,000.0,010305,007.9,W*7F
+$GPGGA,183736,4124.7132,N,08152.2473,W,1,03,14.7,256.9,M,-34.0,M,,*43
+$GPGSA,A,2,,04,,,,10,,,,,,35,14.8,14.7,1.0*3E
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,40,35,34,141,43*7C
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183737,A,4124.7004,N,08152.2451,W,000.0,000.0,010305,007.9,W*7A
+$GPGGA,183737,4124.7004,N,08152.2451,W,1,03,17.3,256.9,M,-34.0,M,,*41
+$GPGSA,A,2,,04,,,,10,,,,,,35,17.4,17.3,1.0*36
+$GPGSV,3,1,12,02,72,323,34,04,48,057,00,05,42,260,00,06,04,307,00*71
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183738,A,4124.6989,N,08152.2448,W,000.0,000.0,010305,007.9,W*70
+$GPGGA,183738,4124.6989,N,08152.2448,W,1,03,17.3,256.9,M,-34.0,M,,*4B
+$GPGSA,A,2,,04,,,,10,,,,,,35,17.4,17.3,1.0*36
+$GPGSV,3,2,12,07,19,126,35,10,45,198,46,13,20,066,32,23,09,039,00*76
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183739,A,4124.6874,N,08152.2429,W,000.0,000.0,010305,007.9,W*75
+$GPGGA,183739,4124.6874,N,08152.2429,W,1,03,17.3,256.9,M,-34.0,M,,*4E
+$GPGSA,A,2,,04,,,,10,,,,,,35,17.4,17.3,1.0*36
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,43*7D
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183740,A,4124.6874,N,08152.2429,W,000.0,000.0,010305,007.9,W*7B
+$GPGGA,183740,4124.6874,N,08152.2429,W,1,00,19.5,256.9,M,-34.0,M,,*4B
+$GPGSA,A,2,,,,,,,,,,,,,19.6,19.5,1.0*31
+$GPGSV,3,1,12,02,72,323,36,04,48,057,00,05,42,260,00,06,04,307,00*73
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183741,A,4124.6874,N,08152.2429,W,000.0,000.0,010305,007.9,W*7A
+$GPGGA,183741,4124.6874,N,08152.2429,W,1,00,21.2,256.9,M,-34.0,M,,*46
+$GPGSA,A,2,,,,,,,,,,,,,21.3,21.2,1.0*33
+$GPGSV,3,2,12,07,18,127,37,10,45,198,46,13,20,066,33,23,09,039,00*75
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183742,A,4124.6874,N,08152.2428,W,000.0,000.0,010305,007.9,W*78
+$GPGGA,183742,4124.6874,N,08152.2428,W,1,00,22.7,256.9,M,-34.0,M,,*42
+$GPGSA,A,2,,,,,,,,,,,,,22.7,22.7,1.0*32
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,40,35,34,141,43*7C
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183743,A,4124.6874,N,08152.2428,W,000.0,000.0,010305,007.9,W*79
+$GPGGA,183743,4124.6874,N,08152.2428,W,1,00,23.8,256.9,M,-34.0,M,,*4D
+$GPGSA,A,2,,,,,,,,,,,,,23.9,23.8,1.0*33
+$GPGSV,3,1,12,02,72,323,37,04,48,057,00,05,42,260,00,06,04,307,00*72
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183744,A,4124.6873,N,08152.2428,W,000.0,000.0,010305,007.9,W*79
+$GPGGA,183744,4124.6873,N,08152.2428,W,1,00,24.8,256.9,M,-34.0,M,,*4A
+$GPGSA,A,2,,,,,,,,,,,,,24.8,24.8,1.0*32
+$GPGSV,3,2,12,07,18,127,36,10,45,198,46,13,20,066,34,23,09,039,00*73
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183745,A,4124.6873,N,08152.2428,W,000.0,000.0,010305,007.9,W*78
+$GPGGA,183745,4124.6873,N,08152.2428,W,1,00,25.5,256.9,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,,,,,,,,25.6,25.5,1.0*31
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,40,35,34,141,43*7C
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183746,A,4124.6873,N,08152.2428,W,000.0,000.0,010305,007.9,W*7B
+$GPGGA,183746,4124.6873,N,08152.2428,W,1,00,25.5,256.9,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,,,,,,,,25.6,25.5,1.0*31
+$GPGSV,3,1,12,02,72,323,37,04,48,057,00,05,42,260,00,06,04,307,00*72
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183747,A,4124.6873,N,08152.2427,W,000.0,000.0,010305,007.9,W*75
+$GPGGA,183747,4124.6873,N,08152.2427,W,1,00,25.5,256.9,M,-34.0,M,,*4A
+$GPGSA,A,2,,,,,,,,,,,,,25.6,25.5,1.0*31
+$GPGSV,3,2,12,07,18,127,31,10,45,198,45,13,20,066,35,23,09,039,00*76
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183748,A,4124.6872,N,08152.2427,W,000.0,000.0,010305,007.9,W*7B
+$GPGGA,183748,4124.6872,N,08152.2427,W,1,00,26.1,256.9,M,-34.0,M,,*43
+$GPGSA,A,2,,,,,,,,,,,,,26.2,26.1,1.0*31
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,43*7D
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183749,A,4124.6872,N,08152.2427,W,000.0,000.0,010305,007.9,W*7A
+$GPGGA,183749,4124.6872,N,08152.2427,W,1,00,26.1,256.9,M,-34.0,M,,*42
+$GPGSA,A,2,,,,,,,,,,,,,26.2,26.1,1.0*31
+$GPGSV,3,1,12,02,72,323,37,04,48,057,00,05,42,260,00,06,04,307,00*72
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183750,A,4124.6872,N,08152.2427,W,000.0,000.0,010305,007.9,W*72
+$GPGGA,183750,4124.6872,N,08152.2427,W,1,00,26.7,256.9,M,-34.0,M,,*4C
+$GPGSA,A,2,,,,,,,,,,,,,26.7,26.7,1.0*32
+$GPGSV,3,2,12,07,18,127,33,10,45,198,45,13,20,066,33,23,09,039,00*72
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183751,A,4124.6872,N,08152.2426,W,000.0,000.0,010305,007.9,W*72
+$GPGGA,183751,4124.6872,N,08152.2426,W,1,00,27.1,256.9,M,-34.0,M,,*4B
+$GPGSA,A,2,,,,,,,,,,,,,27.1,27.1,1.0*32
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,41,35,34,141,43*7D
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183752,A,4124.6871,N,08152.2426,W,000.0,000.0,010305,007.9,W*72
+$GPGGA,183752,4124.6871,N,08152.2426,W,1,00,27.1,256.9,M,-34.0,M,,*4B
+$GPGSA,A,2,,,,,,,,,,,,,27.1,27.1,1.0*32
+$GPGSV,3,1,12,02,72,323,37,04,48,057,00,05,42,260,33,06,04,307,00*72
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183753,A,4124.6871,N,08152.2426,W,000.0,000.0,010305,007.9,W*73
+$GPGGA,183753,4124.6871,N,08152.2426,W,1,00,27.1,256.9,M,-34.0,M,,*4A
+$GPGSA,A,2,,,,,,,,,,,,,27.1,27.1,1.0*32
+$GPGSV,3,2,12,07,18,127,34,10,46,198,44,13,20,066,00,23,09,039,00*77
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183754,A,4124.6871,N,08152.2426,W,000.0,000.0,010305,007.9,W*74
+$GPGGA,183754,4124.6871,N,08152.2426,W,1,00,27.4,256.9,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,,,,,,,,27.5,27.4,1.0*33
+$GPGSV,3,3,12,24,16,068,35,30,30,302,00,33,09,106,41,35,34,141,43*7B
+$PGRME,8.2,M,13.6,M,15.9,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183755,A,4124.6872,N,08152.2429,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183755,4124.6872,N,08152.2429,W,1,04,3.8,273.5,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.4,3.8,1.8*3B
+$GPGSV,3,1,12,02,72,323,37,04,48,057,00,05,42,260,33,06,04,307,00*72
+$PGRME,8.5,M,15.0,M,17.2,M*23
+$PGRMM,WGS 84*06
+$GPRMC,183756,A,4124.6897,N,08152.2432,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183756,4124.6897,N,08152.2432,W,1,04,2.8,273.1,M,-34.0,M,,*77
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,2,12,07,18,127,33,10,46,198,44,13,20,066,00,23,09,039,00*70
+$PGRME,8.7,M,15.0,M,17.3,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183757,A,4124.7033,N,08152.2454,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183757,4124.7033,N,08152.2454,W,1,04,2.8,272.8,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,3,12,24,16,068,36,30,30,302,00,33,09,106,41,35,34,141,43*78
+$PGRME,8.7,M,15.0,M,17.3,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183758,A,4124.7091,N,08152.2466,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183758,4124.7091,N,08152.2466,W,1,04,2.8,272.5,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,1,12,02,72,323,37,04,48,057,00,05,42,260,34,06,04,307,00*75
+$PGRME,8.7,M,15.0,M,17.3,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183759,A,4124.7137,N,08152.2477,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183759,4124.7137,N,08152.2477,W,1,04,2.8,272.3,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,2,12,07,18,127,00,10,46,198,44,13,20,066,00,23,09,039,00*70
+$PGRME,8.8,M,15.0,M,17.4,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183800,A,4124.7293,N,08152.2510,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183800,4124.7293,N,08152.2510,W,1,04,2.8,272.2,M,-34.0,M,,*77
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,3,12,24,16,068,36,30,30,302,00,33,09,106,41,35,34,141,43*78
+$PGRME,8.8,M,15.0,M,17.4,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183801,A,4124.7323,N,08152.2517,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183801,4124.7323,N,08152.2517,W,1,04,2.8,272.1,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,1,12,02,72,323,38,04,48,057,00,05,42,260,35,06,04,307,00*7B
+$PGRME,8.8,M,15.0,M,17.4,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183802,A,4124.7467,N,08152.2546,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183802,4124.7467,N,08152.2546,W,1,04,2.8,271.9,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,2,12,07,18,127,00,10,46,198,44,13,20,066,00,23,09,039,00*70
+$PGRME,8.8,M,15.0,M,17.4,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183803,A,4124.7477,N,08152.2547,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183803,4124.7477,N,08152.2547,W,1,04,2.8,271.9,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,3,12,24,16,068,35,30,30,302,00,33,09,106,41,35,34,141,43*7B
+$PGRME,8.8,M,15.0,M,17.4,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183804,A,4124.7486,N,08152.2547,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183804,4124.7486,N,08152.2547,W,1,03,2.8,271.8,M,-34.0,M,,*7D
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,1,12,02,72,323,38,04,48,057,00,05,42,260,34,06,04,307,00*7A
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,183805,A,4124.7492,N,08152.2547,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183805,4124.7492,N,08152.2547,W,1,03,2.8,271.8,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,2,12,07,18,127,00,10,46,198,44,13,20,065,00,23,09,039,00*73
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,183806,A,4124.7499,N,08152.2545,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183806,4124.7499,N,08152.2545,W,1,03,2.8,271.7,M,-34.0,M,,*7C
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,3,12,24,16,068,34,30,30,302,00,33,09,106,41,35,34,141,43*7A
+$PGRME,9.0,M,15.0,M,17.5,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183807,A,4124.7506,N,08152.2543,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183807,4124.7506,N,08152.2543,W,1,03,2.8,271.7,M,-34.0,M,,*7C
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,1,12,02,72,323,38,04,48,057,00,05,42,260,00,06,04,307,00*7D
+$PGRME,9.0,M,15.0,M,17.5,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183808,A,4124.7511,N,08152.2540,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183808,4124.7511,N,08152.2540,W,1,03,2.8,271.7,M,-34.0,M,,*76
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,2,12,07,18,127,34,10,46,198,44,13,20,065,00,23,09,039,00*74
+$PGRME,9.0,M,15.0,M,17.5,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183809,A,4124.7516,N,08152.2538,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183809,4124.7516,N,08152.2538,W,1,04,2.8,271.6,M,-34.0,M,,*79
+$GPGSA,A,2,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3D
+$GPGSV,3,3,12,24,16,068,34,30,30,302,00,33,09,106,41,35,34,141,43*7A
+$PGRME,7.7,M,13.1,M,15.2,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183810,A,4124.7521,N,08152.2536,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183810,4124.7521,N,08152.2536,W,1,04,7.8,271.5,M,-34.0,M,,*7D
+$GPGSA,A,2,,,,,07,10,,,24,,,35,8.0,7.8,1.0*33
+$GPGSV,3,1,12,02,72,323,39,04,48,057,00,05,42,260,00,06,04,307,00*7C
+$PGRME,7.7,M,13.1,M,15.2,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183811,A,4124.7525,N,08152.2535,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183811,4124.7525,N,08152.2535,W,1,04,7.8,271.5,M,-34.0,M,,*7B
+$GPGSA,A,2,,,,,07,10,,,24,,,35,8.0,7.8,1.0*33
+$GPGSV,3,2,12,07,18,127,34,10,46,198,44,13,20,065,00,23,09,039,00*74
+$PGRME,7.7,M,13.1,M,15.2,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183812,A,4124.7528,N,08152.2533,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183812,4124.7528,N,08152.2533,W,1,04,3.8,272.0,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.3,3.8,1.8*3C
+$GPGSV,3,3,12,24,16,068,35,30,30,302,00,33,09,106,40,35,34,141,43*7A
+$PGRME,8.1,M,14.5,M,16.6,M*26
+$PGRMM,WGS 84*06
+$GPRMC,183813,A,4124.7531,N,08152.2531,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183813,4124.7531,N,08152.2531,W,1,04,3.8,273.6,M,-34.0,M,,*7D
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.3,3.8,2.4*33
+$GPGSV,3,1,12,02,72,323,37,04,48,057,00,05,42,260,00,06,04,307,00*72
+$PGRME,8.1,M,14.5,M,16.6,M*26
+$PGRMM,WGS 84*06
+$GPRMC,183814,A,4124.7533,N,08152.2529,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183814,4124.7533,N,08152.2529,W,1,04,2.8,273.6,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,2,12,07,18,127,33,10,46,198,43,13,20,065,00,23,09,039,00*74
+$PGRME,8.3,M,14.5,M,16.7,M*25
+$PGRMM,WGS 84*06
+$GPRMC,183815,A,4124.7535,N,08152.2528,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183815,4124.7535,N,08152.2528,W,1,04,2.8,273.6,M,-34.0,M,,*76
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,3,12,24,16,068,36,30,30,302,00,33,09,106,40,35,34,141,43*79
+$PGRME,8.3,M,14.5,M,16.7,M*25
+$PGRMM,WGS 84*06
+$GPRMC,183816,A,4124.7537,N,08152.2526,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183816,4124.7537,N,08152.2526,W,1,04,2.8,273.1,M,-34.0,M,,*7E
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,1,12,02,72,323,36,04,48,057,00,05,42,260,00,06,04,307,00*73
+$PGRME,7.6,M,12.8,M,14.9,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183817,A,4124.7539,N,08152.2525,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183817,4124.7539,N,08152.2525,W,1,04,2.9,273.3,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.6,2.9,1.7*3C
+$GPGSV,3,2,12,07,18,127,35,10,46,198,44,13,20,065,00,23,09,039,00*75
+$PGRME,7.6,M,12.8,M,14.9,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183818,A,4124.7540,N,08152.2524,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183818,4124.7540,N,08152.2524,W,1,04,2.3,273.6,M,-34.0,M,,*7E
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.5,2.3,1.0*33
+$GPGSV,3,3,12,24,16,068,37,30,30,302,00,33,09,106,41,35,34,141,43*79
+$PGRME,7.6,M,12.8,M,14.9,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183819,A,4124.7541,N,08152.2523,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183819,4124.7541,N,08152.2523,W,1,04,2.3,273.7,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.5,2.3,1.0*33
+$GPGSV,3,1,12,02,72,323,35,04,48,057,00,05,42,260,34,06,04,307,00*77
+$PGRME,7.8,M,12.8,M,15.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183820,A,4124.7542,N,08152.2523,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183820,4124.7542,N,08152.2523,W,1,04,2.3,273.9,M,-34.0,M,,*7F
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.5,2.3,1.0*33
+$GPGSV,3,2,12,07,18,127,35,10,46,198,44,13,20,065,00,23,09,039,00*75
+$PGRME,7.8,M,12.8,M,15.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183821,A,4124.7543,N,08152.2522,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183821,4124.7543,N,08152.2522,W,1,04,7.5,274.0,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,07,10,,,24,,,35,7.7,7.5,1.0*37
+$GPGSV,3,3,12,24,16,068,35,30,30,302,00,33,09,106,40,35,34,141,43*7A
+$PGRME,7.8,M,12.8,M,15.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183822,A,4124.7544,N,08152.2521,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,183822,4124.7544,N,08152.2521,W,1,04,11.7,274.1,M,-34.0,M,,*40
+$GPGSA,A,3,,,,,07,10,,,24,,,35,11.8,11.7,1.0*3A
+$GPGSV,3,1,12,02,72,323,35,04,48,057,00,05,42,260,00,06,04,307,00*70
+$PGRME,7.8,M,12.8,M,15.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183823,A,4124.7544,N,08152.2521,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183823,4124.7544,N,08152.2521,W,1,04,3.8,273.8,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.3,3.8,1.7*33
+$GPGSV,3,2,12,07,18,127,37,10,46,198,44,13,20,065,00,23,09,039,00*77
+$PGRME,8.2,M,14.2,M,16.5,M*21
+$PGRMM,WGS 84*06
+$GPRMC,183824,A,4124.7545,N,08152.2520,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183824,4124.7545,N,08152.2520,W,1,04,2.3,273.4,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.5,2.3,1.0*33
+$GPGSV,3,3,12,24,16,068,36,30,30,302,00,33,09,106,40,35,34,141,43*79
+$PGRME,8.2,M,14.2,M,16.5,M*21
+$PGRMM,WGS 84*06
+$GPRMC,183825,A,4124.7545,N,08152.2521,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183825,4124.7545,N,08152.2521,W,1,04,2.4,272.7,M,-34.0,M,,*77
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.2,2.4,1.7*35
+$GPGSV,3,1,12,02,72,323,35,04,48,057,00,05,42,260,00,06,04,307,00*70
+$PGRME,8.2,M,14.2,M,16.5,M*21
+$PGRMM,WGS 84*06
+$GPRMC,183826,A,4124.7546,N,08152.2520,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183826,4124.7546,N,08152.2520,W,1,04,7.6,272.5,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.2,7.6,1.0*3E
+$GPGSV,3,2,12,07,18,127,36,10,46,198,44,13,20,065,00,23,09,039,00*76
+$PGRME,8.2,M,14.2,M,16.5,M*21
+$PGRMM,WGS 84*06
+$GPRMC,183827,A,4124.7546,N,08152.2520,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183827,4124.7546,N,08152.2520,W,1,04,2.8,272.4,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.0,2.8,1.0*3C
+$GPGSV,3,3,12,24,16,068,35,30,30,302,00,33,09,106,40,35,34,141,44*7D
+$PGRME,8.4,M,14.2,M,16.5,M*27
+$PGRMM,WGS 84*06
+$GPRMC,183828,A,4124.7547,N,08152.2519,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183828,4124.7547,N,08152.2519,W,1,04,7.9,272.3,M,-34.0,M,,*7F
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.0,7.9,1.0*33
+$GPGSV,3,1,12,02,72,323,34,04,48,057,00,05,42,260,00,06,04,307,00*71
+$PGRME,8.4,M,14.2,M,16.5,M*27
+$PGRMM,WGS 84*06
+$GPRMC,183829,A,4124.7547,N,08152.2519,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183829,4124.7547,N,08152.2519,W,1,04,12.0,272.2,M,-34.0,M,,*42
+$GPGSA,A,3,,,,,07,10,,,24,,,35,12.1,12.0,1.0*34
+$GPGSV,3,2,12,07,18,127,36,10,46,198,43,13,20,065,00,23,09,039,00*71
+$PGRME,8.4,M,14.2,M,16.5,M*27
+$PGRMM,WGS 84*06
+$GPRMC,183830,A,4124.7548,N,08152.2519,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183830,4124.7548,N,08152.2519,W,1,04,12.0,272.2,M,-34.0,M,,*45
+$GPGSA,A,3,,,,,07,10,,,24,,,35,12.1,12.0,1.0*34
+$GPGSV,3,3,12,24,16,068,34,30,30,302,00,33,09,106,40,35,34,141,43*7B
+$PGRME,8.4,M,14.2,M,16.5,M*27
+$PGRMM,WGS 84*06
+$GPRMC,183831,A,4124.7548,N,08152.2519,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183831,4124.7548,N,08152.2519,W,1,04,3.8,270.0,M,-34.0,M,,*7C
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.3,3.8,1.7*33
+$GPGSV,3,1,12,02,72,323,33,04,48,057,00,05,42,260,00,06,04,307,00*76
+$PGRME,8.7,M,15.5,M,17.8,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183832,A,4124.7548,N,08152.2518,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183832,4124.7548,N,08152.2518,W,1,04,2.3,267.5,M,-34.0,M,,*77
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.5,2.3,1.0*33
+$GPGSV,3,2,12,07,18,127,35,10,46,198,43,13,20,065,00,23,09,039,00*72
+$PGRME,8.7,M,15.5,M,17.8,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183833,A,4124.7549,N,08152.2518,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183833,4124.7549,N,08152.2518,W,1,04,7.5,267.5,M,-34.0,M,,*74
+$GPGSA,A,3,,,,,07,10,,,24,,,35,7.7,7.5,1.0*37
+$GPGSV,3,3,12,24,16,068,33,30,30,302,00,33,09,106,40,35,34,141,44*7B
+$PGRME,8.7,M,15.5,M,17.8,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183834,A,4124.7549,N,08152.2518,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,183834,4124.7549,N,08152.2518,W,1,04,11.7,267.4,M,-34.0,M,,*47
+$GPGSA,A,3,,,,,07,10,,,24,,,35,11.8,11.7,1.0*3A
+$GPGSV,3,1,12,02,72,323,33,04,48,057,00,05,42,260,00,06,04,307,00*76
+$PGRME,8.7,M,15.5,M,17.8,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183835,A,4124.7549,N,08152.2518,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183835,4124.7549,N,08152.2518,W,1,04,11.7,267.3,M,-34.0,M,,*41
+$GPGSA,A,3,,,,,07,10,,,24,,,35,11.8,11.7,1.0*3A
+$GPGSV,3,2,12,07,18,127,34,10,46,198,43,13,20,065,00,23,09,039,00*73
+$PGRME,8.7,M,15.5,M,17.8,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183836,A,4124.7549,N,08152.2518,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183836,4124.7549,N,08152.2518,W,1,04,3.8,56.6,M,-34.0,M,,*4B
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.2,3.8,1.7*32
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,40,35,34,141,44*7B
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183837,A,4124.7549,N,08152.2518,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183837,4124.7549,N,08152.2518,W,1,04,8.7,56.6,M,-34.0,M,,*4E
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.1,8.7,1.0*09
+$GPGSV,3,1,12,02,72,323,33,04,48,057,00,05,42,260,00,06,04,307,00*76
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183838,A,4124.7550,N,08152.2518,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183838,4124.7550,N,08152.2518,W,1,04,8.7,56.5,M,-34.0,M,,*4A
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.1,8.7,1.0*09
+$GPGSV,3,2,12,07,18,127,00,10,46,198,43,13,20,065,00,23,09,039,00*74
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183839,A,4124.7550,N,08152.2519,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183839,4124.7550,N,08152.2519,W,1,04,8.7,56.5,M,-34.0,M,,*4A
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.1,8.7,1.0*09
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,40,35,34,141,44*7B
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183840,A,4124.7550,N,08152.2519,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183840,4124.7550,N,08152.2519,W,1,04,8.7,56.5,M,-34.0,M,,*44
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.1,8.7,1.0*09
+$GPGSV,3,1,12,02,72,323,33,04,48,057,00,05,42,260,00,06,04,307,00*76
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183841,A,4124.7550,N,08152.2519,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183841,4124.7550,N,08152.2519,W,1,04,8.7,56.5,M,-34.0,M,,*45
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.1,8.7,1.0*09
+$GPGSV,3,2,12,07,18,127,00,10,46,198,44,13,20,065,00,23,09,038,00*72
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183842,A,4124.7550,N,08152.2519,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183842,4124.7550,N,08152.2519,W,1,04,8.7,56.5,M,-34.0,M,,*46
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.1,8.7,1.0*09
+$GPGSV,3,3,12,24,16,068,00,30,30,302,00,33,09,106,40,35,34,141,43*7C
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183843,A,4124.7550,N,08152.2520,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183843,4124.7550,N,08152.2520,W,1,04,12.7,56.5,M,-34.0,M,,*76
+$GPGSA,A,3,,,,,07,10,,,24,,,35,16.3,12.7,1.0*35
+$GPGSV,3,1,12,02,72,323,34,04,48,057,00,05,42,260,31,06,04,307,00*73
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183844,A,4124.7550,N,08152.2520,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183844,4124.7550,N,08152.2520,W,1,04,12.7,56.5,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,07,10,,,24,,,35,16.3,12.7,1.0*35
+$GPGSV,3,2,12,07,18,127,00,10,46,198,44,13,20,065,00,23,09,038,32*73
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183845,A,4124.7550,N,08152.2520,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183845,4124.7550,N,08152.2520,W,1,00,12.7,56.5,M,-34.0,M,,*74
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,3,12,24,16,069,00,30,30,302,00,33,09,106,40,35,34,141,44*7A
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183846,A,4124.7550,N,08152.2521,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183846,4124.7550,N,08152.2521,W,1,00,12.7,56.5,M,-34.0,M,,*76
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,1,12,02,72,323,33,04,48,057,00,05,42,260,30,06,04,307,00*75
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183847,A,4124.7550,N,08152.2521,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183847,4124.7550,N,08152.2521,W,1,00,12.7,56.5,M,-34.0,M,,*77
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,2,12,07,18,127,00,10,46,198,45,13,20,065,00,23,09,038,32*72
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183848,A,4124.7550,N,08152.2521,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183848,4124.7550,N,08152.2521,W,1,00,12.7,56.5,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,3,12,24,16,069,00,30,30,302,00,33,09,106,40,35,34,141,44*7A
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183849,A,4124.7550,N,08152.2521,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183849,4124.7550,N,08152.2521,W,1,00,12.7,56.5,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,00,06,04,307,00*76
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183850,A,4124.7550,N,08152.2522,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183850,4124.7550,N,08152.2522,W,1,00,12.7,56.5,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,2,12,07,18,127,00,10,46,198,45,13,20,065,00,23,09,038,00*73
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183851,A,4124.7550,N,08152.2522,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183851,4124.7550,N,08152.2522,W,1,00,12.7,56.5,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,3,12,24,16,069,00,30,30,302,00,33,09,106,40,35,34,141,44*7A
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183852,A,4124.7550,N,08152.2522,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183852,4124.7550,N,08152.2522,W,1,00,12.7,56.5,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,00,06,04,307,00*76
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183853,A,4124.7550,N,08152.2522,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,183853,4124.7550,N,08152.2522,W,1,00,12.7,56.5,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,2,12,07,18,127,00,10,46,198,45,13,20,065,00,23,09,038,33*73
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183854,A,4124.7550,N,08152.2523,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183854,4124.7550,N,08152.2523,W,1,00,12.7,56.5,M,-34.0,M,,*77
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,3,12,24,16,069,00,30,30,302,00,33,09,106,40,35,34,141,44*7A
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183855,A,4124.7550,N,08152.2523,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183855,4124.7550,N,08152.2523,W,1,00,12.7,56.5,M,-34.0,M,,*76
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,30,06,04,307,00*75
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183856,A,4124.7550,N,08152.2523,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183856,4124.7550,N,08152.2523,W,1,00,12.7,56.5,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,2,12,07,18,127,00,10,46,198,45,13,20,065,00,23,09,038,33*73
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183857,A,4124.7550,N,08152.2523,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183857,4124.7550,N,08152.2523,W,1,00,12.7,56.5,M,-34.0,M,,*74
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,3,12,24,16,069,00,30,30,302,00,33,09,106,40,35,34,141,43*7D
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183858,A,4124.7550,N,08152.2523,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183858,4124.7550,N,08152.2523,W,1,00,12.7,56.4,M,-34.0,M,,*7A
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,32,06,04,307,00*77
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183859,A,4124.7550,N,08152.2524,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,183859,4124.7550,N,08152.2524,W,1,00,12.7,56.4,M,-34.0,M,,*7C
+$GPGSA,A,3,,,,,,,,,,,,,16.3,12.7,1.0*33
+$GPGSV,3,2,12,07,18,127,33,10,46,198,45,13,20,065,00,23,09,038,33*73
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183900,A,4124.7550,N,08152.2524,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183900,4124.7550,N,08152.2524,W,1,00,16.0,56.4,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,,,,,,,,,18.9,16.0,1.0*34
+$GPGSV,3,3,12,24,16,069,00,30,30,302,00,33,09,106,40,35,34,141,43*7D
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183901,A,4124.7550,N,08152.2524,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,183901,4124.7550,N,08152.2524,W,1,00,16.0,56.4,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,,,,,,,,,18.9,16.0,1.0*34
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,33,06,04,307,00*76
+$PGRME,9.0,M,16.7,M,19.0,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,183902,A,4124.7550,N,08152.2524,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183902,4124.7550,N,08152.2524,W,1,03,2.8,56.5,M,-34.0,M,,*4F
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,2,12,07,18,127,00,10,46,198,44,13,20,065,00,23,09,038,33*72
+$PGRME,9.1,M,16.7,M,19.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183903,A,4124.7550,N,08152.2525,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183903,4124.7550,N,08152.2525,W,1,03,2.8,56.5,M,-34.0,M,,*4F
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,3,12,24,16,069,32,30,30,302,00,33,09,106,40,35,34,141,43*7C
+$PGRME,9.1,M,16.7,M,19.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183904,A,4124.7550,N,08152.2525,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183904,4124.7550,N,08152.2525,W,1,03,2.8,56.5,M,-34.0,M,,*48
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,33,06,04,307,00*76
+$PGRME,9.1,M,16.7,M,19.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183905,A,4124.7550,N,08152.2525,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183905,4124.7550,N,08152.2525,W,1,03,2.8,56.5,M,-34.0,M,,*49
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,2,12,07,18,127,00,10,46,198,44,13,20,065,00,23,09,038,00*72
+$PGRME,9.1,M,16.7,M,19.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183906,A,4124.7550,N,08152.2526,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183906,4124.7550,N,08152.2526,W,1,03,2.8,56.5,M,-34.0,M,,*49
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,3,12,24,16,069,33,30,30,302,00,33,09,106,40,35,34,141,44*7A
+$PGRME,9.2,M,16.7,M,19.1,M*2C
+$PGRMM,WGS 84*06
+$GPRMC,183907,A,4124.7550,N,08152.2526,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183907,4124.7550,N,08152.2526,W,1,03,2.8,56.5,M,-34.0,M,,*48
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,34,06,04,307,00*71
+$PGRME,9.2,M,16.7,M,19.1,M*2C
+$PGRMM,WGS 84*06
+$GPRMC,183908,A,4124.7546,N,08152.2530,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183908,4124.7546,N,08152.2530,W,1,03,2.8,56.5,M,-34.0,M,,*47
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,2,12,07,18,127,00,10,46,198,43,13,20,065,00,23,09,038,00*75
+$PGRME,9.3,M,16.7,M,19.1,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183909,A,4124.7541,N,08152.2534,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183909,4124.7541,N,08152.2534,W,1,03,2.8,56.5,M,-34.0,M,,*45
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,3,12,24,16,069,32,30,30,301,00,33,09,106,40,35,34,141,43*7F
+$PGRME,9.3,M,16.7,M,19.1,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183910,A,4124.7426,N,08152.2656,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183910,4124.7426,N,08152.2656,W,1,03,2.8,56.5,M,-34.0,M,,*4A
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,34,06,04,307,00*71
+$PGRME,9.3,M,16.7,M,19.1,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183911,A,4124.7405,N,08152.2675,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,183911,4124.7405,N,08152.2675,W,1,03,2.8,56.5,M,-34.0,M,,*4B
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,2,12,07,18,127,00,10,46,198,42,13,20,065,00,23,09,038,00*74
+$PGRME,9.4,M,16.7,M,19.2,M*29
+$PGRMM,WGS 84*06
+$GPRMC,183912,A,4124.7398,N,08152.2693,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183912,4124.7398,N,08152.2693,W,1,03,2.8,56.5,M,-34.0,M,,*43
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,3,12,24,16,069,32,30,30,301,00,33,09,106,40,35,34,141,43*7F
+$PGRME,9.4,M,16.7,M,19.2,M*29
+$PGRMM,WGS 84*06
+$GPRMC,183913,A,4124.7395,N,08152.2708,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,183913,4124.7395,N,08152.2708,W,1,03,2.8,56.5,M,-34.0,M,,*4C
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,33,06,04,307,00*76
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183914,A,4124.7394,N,08152.2722,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,183914,4124.7394,N,08152.2722,W,1,03,2.8,56.5,M,-34.0,M,,*42
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,2,12,07,18,127,00,10,46,198,41,13,20,065,00,23,09,038,00*77
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183915,A,4124.7395,N,08152.2738,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183915,4124.7395,N,08152.2738,W,1,03,2.8,56.5,M,-34.0,M,,*49
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,40,35,34,141,43*7E
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183916,A,4124.7395,N,08152.2752,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183916,4124.7395,N,08152.2752,W,1,03,2.8,56.5,M,-34.0,M,,*46
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,00,06,04,307,00*76
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,183917,A,4124.7396,N,08152.2763,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183917,4124.7396,N,08152.2763,W,1,03,2.8,56.5,M,-34.0,M,,*46
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,2,12,07,18,127,00,10,46,198,40,13,20,065,00,23,09,038,00*76
+$PGRME,9.6,M,16.7,M,19.2,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183918,A,4124.7397,N,08152.2774,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183918,4124.7397,N,08152.2774,W,1,03,2.8,56.5,M,-34.0,M,,*4E
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,40,35,34,141,44*79
+$PGRME,9.6,M,16.7,M,19.2,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183919,A,4124.7398,N,08152.2784,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183919,4124.7398,N,08152.2784,W,1,03,2.8,56.5,M,-34.0,M,,*4F
+$GPGSA,A,3,,,,,,10,,,24,,,35,3.0,2.8,1.0*3B
+$GPGSV,3,1,12,02,72,323,00,04,48,057,00,05,42,260,00,06,04,307,00*76
+$PGRME,9.6,M,16.7,M,19.2,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183920,A,4124.7400,N,08152.2794,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,183920,4124.7400,N,08152.2794,W,1,03,2.8,56.5,M,-34.0,M,,*42
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,2,12,07,18,127,00,10,46,198,41,13,20,065,00,23,09,038,00*77
+$PGRME,9.6,M,16.7,M,19.3,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,183921,A,4124.7397,N,08152.2800,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183921,4124.7397,N,08152.2800,W,1,03,2.8,56.5,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,3,12,24,16,069,33,30,30,301,00,33,09,106,41,35,34,141,43*7F
+$PGRME,9.6,M,16.7,M,19.3,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,183922,A,4124.7394,N,08152.2805,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183922,4124.7394,N,08152.2805,W,1,03,2.8,56.5,M,-34.0,M,,*4D
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,1,12,02,72,326,00,04,48,057,00,05,42,260,00,06,04,307,00*73
+$PGRME,9.6,M,16.7,M,19.3,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,183923,A,4124.7391,N,08152.2810,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183923,4124.7391,N,08152.2810,W,1,03,2.8,56.5,M,-34.0,M,,*4D
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,2,12,07,18,127,00,10,46,198,40,13,20,065,00,23,09,038,00*76
+$PGRME,9.6,M,16.7,M,19.3,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,183924,A,4124.7389,N,08152.2815,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183924,4124.7389,N,08152.2815,W,1,03,2.8,56.5,M,-34.0,M,,*46
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,3,12,24,16,069,33,30,30,301,00,33,09,106,41,35,34,141,43*7F
+$PGRME,9.6,M,16.7,M,19.3,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,183925,A,4124.7387,N,08152.2819,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183925,4124.7387,N,08152.2819,W,1,03,2.8,56.5,M,-34.0,M,,*45
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,1,12,02,72,326,00,04,48,057,00,05,42,260,00,06,04,307,00*73
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183926,A,4124.7384,N,08152.2822,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183926,4124.7384,N,08152.2822,W,1,03,2.8,56.5,M,-34.0,M,,*4D
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,2,12,07,18,127,00,10,46,198,40,13,20,065,34,23,09,038,00*71
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183927,A,4124.7384,N,08152.2826,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183927,4124.7384,N,08152.2826,W,1,03,2.8,56.5,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,3,12,24,16,069,33,30,30,301,00,33,09,106,40,35,34,141,43*7E
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183928,A,4124.7383,N,08152.2829,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183928,4124.7383,N,08152.2829,W,1,03,2.8,56.5,M,-34.0,M,,*4F
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,1,12,02,72,326,00,04,48,057,00,05,42,260,35,06,04,307,00*75
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183929,A,4124.7383,N,08152.2833,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183929,4124.7383,N,08152.2833,W,1,03,2.8,56.5,M,-34.0,M,,*45
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,2,12,07,18,127,00,10,46,198,40,13,20,065,00,23,09,038,00*76
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183930,A,4124.7383,N,08152.2836,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183930,4124.7383,N,08152.2836,W,1,03,2.8,56.5,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,3,12,24,16,069,32,30,30,301,00,33,09,106,41,35,34,141,43*7E
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,183931,A,4124.7383,N,08152.2839,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,183931,4124.7383,N,08152.2839,W,1,03,2.8,56.5,M,-34.0,M,,*46
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,1,12,02,72,326,35,04,47,058,00,05,42,260,35,06,04,307,00*73
+$PGRME,9.8,M,16.7,M,19.3,M*24
+$PGRMM,WGS 84*06
+$GPRMC,183932,A,4124.7384,N,08152.2842,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183932,4124.7384,N,08152.2842,W,1,03,2.8,56.5,M,-34.0,M,,*4E
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,2,12,07,18,127,00,10,46,198,39,13,20,065,00,23,09,038,00*78
+$PGRME,9.8,M,16.7,M,19.3,M*24
+$PGRMM,WGS 84*06
+$GPRMC,183933,A,4124.7385,N,08152.2844,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183933,4124.7385,N,08152.2844,W,1,03,2.8,56.5,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,41,35,34,141,43*7F
+$PGRME,9.8,M,16.7,M,19.3,M*24
+$PGRMM,WGS 84*06
+$GPRMC,183934,A,4124.7386,N,08152.2847,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183934,4124.7386,N,08152.2847,W,1,03,2.8,56.5,M,-34.0,M,,*4F
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,1,12,02,72,326,35,04,47,058,00,05,42,259,33,06,04,307,00*7F
+$PGRME,9.8,M,16.7,M,19.3,M*24
+$PGRMM,WGS 84*06
+$GPRMC,183935,A,4124.7387,N,08152.2849,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183935,4124.7387,N,08152.2849,W,1,03,2.8,56.5,M,-34.0,M,,*41
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,2,12,07,18,127,00,10,46,198,39,13,20,065,00,23,09,038,00*78
+$PGRME,9.8,M,16.7,M,19.3,M*24
+$PGRMM,WGS 84*06
+$GPRMC,183936,A,4124.7388,N,08152.2851,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183936,4124.7388,N,08152.2851,W,1,03,2.8,56.5,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,3,12,24,16,069,30,30,30,301,00,33,09,106,41,35,34,141,44*7B
+$PGRME,9.8,M,16.7,M,19.4,M*23
+$PGRMM,WGS 84*06
+$GPRMC,183937,A,4124.7390,N,08152.2854,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183937,4124.7390,N,08152.2854,W,1,03,2.8,56.5,M,-34.0,M,,*49
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,1,12,02,72,326,34,04,47,058,00,05,42,259,32,06,04,307,00*7F
+$PGRME,9.8,M,16.7,M,19.4,M*23
+$PGRMM,WGS 84*06
+$GPRMC,183938,A,4124.7391,N,08152.2857,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,183938,4124.7391,N,08152.2857,W,1,03,2.8,56.5,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,2,12,07,18,127,00,10,46,198,37,13,20,065,00,23,09,038,00*76
+$PGRME,9.8,M,16.7,M,19.4,M*23
+$PGRMM,WGS 84*06
+$GPRMC,183939,A,4124.7393,N,08152.2859,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,183939,4124.7393,N,08152.2859,W,1,03,2.8,56.5,M,-34.0,M,,*49
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,41,35,34,141,44*78
+$PGRME,9.8,M,16.7,M,19.4,M*23
+$PGRMM,WGS 84*06
+$GPRMC,183940,A,4124.7394,N,08152.2862,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,183940,4124.7394,N,08152.2862,W,1,03,2.8,56.5,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,10,,,24,,,35,3.0,2.8,1.0*3A
+$GPGSV,3,1,12,02,72,326,33,04,47,058,32,05,42,259,00,06,04,307,00*78
+$PGRME,9.8,M,16.7,M,19.4,M*23
+$PGRMM,WGS 84*06
+$GPRMC,183941,A,4124.7395,N,08152.2864,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183941,4124.7395,N,08152.2864,W,1,04,2.5,56.5,M,-34.0,M,,*44
+$GPGSA,A,2,,04,,,,10,,,24,,,35,2.7,2.5,1.0*35
+$GPGSV,3,2,12,07,18,127,00,10,46,198,38,13,20,065,00,23,09,038,00*79
+$PGRME,8.7,M,16.7,M,18.8,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183942,A,4124.7396,N,08152.2866,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,183942,4124.7396,N,08152.2866,W,1,04,2.5,56.5,M,-34.0,M,,*46
+$GPGSA,A,2,,04,,,,10,,,24,,,35,2.7,2.5,1.0*35
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,41,35,34,141,44*78
+$PGRME,8.7,M,16.7,M,18.8,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183943,A,4124.7397,N,08152.2868,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,183943,4124.7397,N,08152.2868,W,1,04,2.5,56.5,M,-34.0,M,,*48
+$GPGSA,A,2,,04,,,,10,,,24,,,35,2.7,2.5,1.0*35
+$GPGSV,3,1,12,02,72,326,34,04,47,058,00,05,42,259,00,06,04,307,00*7E
+$PGRME,8.7,M,16.7,M,18.8,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183944,A,4124.7398,N,08152.2870,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183944,4124.7398,N,08152.2870,W,1,04,2.5,56.5,M,-34.0,M,,*49
+$GPGSA,A,2,,04,,,,10,,,24,,,35,2.7,2.5,1.0*35
+$GPGSV,3,2,12,07,18,127,00,10,46,198,39,13,20,065,00,23,09,038,00*78
+$PGRME,8.7,M,16.7,M,18.8,M*20
+$PGRMM,WGS 84*06
+$GPRMC,183945,A,4124.7399,N,08152.2872,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183945,4124.7399,N,08152.2872,W,1,04,2.5,56.5,M,-34.0,M,,*4B
+$GPGSA,A,2,,04,,,,10,,,24,,,35,2.7,2.5,1.0*35
+$GPGSV,3,3,12,24,16,069,33,30,30,301,00,33,09,106,41,35,34,141,44*78
+$PGRME,8.8,M,16.7,M,18.9,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183946,A,4124.7400,N,08152.2874,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,183946,4124.7400,N,08152.2874,W,1,04,2.5,56.5,M,-34.0,M,,*49
+$GPGSA,A,2,,04,,,,10,,,24,,,35,2.7,2.5,1.0*35
+$GPGSV,3,1,12,02,72,326,34,04,47,058,00,05,42,259,35,06,04,307,00*78
+$PGRME,8.8,M,16.7,M,18.9,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183947,A,4124.7401,N,08152.2876,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,183947,4124.7401,N,08152.2876,W,1,04,2.5,56.5,M,-34.0,M,,*4B
+$GPGSA,A,2,,04,,,,10,,,24,,,35,2.7,2.5,1.0*35
+$GPGSV,3,2,12,07,18,127,00,10,46,198,39,13,20,065,00,23,09,038,00*78
+$PGRME,8.8,M,16.7,M,18.9,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183948,A,4124.7401,N,08152.2878,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,183948,4124.7401,N,08152.2878,W,1,04,2.5,56.5,M,-34.0,M,,*4A
+$GPGSA,A,2,,04,,,,10,,,24,,,35,2.7,2.5,1.0*35
+$GPGSV,3,3,12,24,16,069,34,30,30,301,00,33,09,106,41,35,34,141,44*7F
+$PGRME,8.8,M,16.7,M,18.9,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183949,A,4124.7402,N,08152.2880,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183949,4124.7402,N,08152.2880,W,1,04,2.5,56.5,M,-34.0,M,,*4F
+$GPGSA,A,2,,04,,,,10,,,24,,,35,2.7,2.5,1.0*35
+$GPGSV,3,1,12,02,72,326,35,04,47,058,00,05,42,259,35,06,04,307,00*79
+$PGRME,9.0,M,16.7,M,18.9,M*27
+$PGRMM,WGS 84*06
+$GPRMC,183950,A,4124.7403,N,08152.2882,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183950,4124.7403,N,08152.2882,W,1,03,2.5,56.5,M,-34.0,M,,*43
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.7,2.5,1.0*31
+$GPGSV,3,2,12,07,18,127,00,10,46,198,40,13,20,065,00,23,09,038,00*76
+$PGRME,9.0,M,16.7,M,18.9,M*27
+$PGRMM,WGS 84*06
+$GPRMC,183951,A,4124.7403,N,08152.2883,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,183951,4124.7403,N,08152.2883,W,1,03,2.6,56.5,M,-34.0,M,,*40
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.7,2.6,1.0*32
+$GPGSV,3,3,12,24,16,069,35,30,30,301,00,33,09,106,41,35,34,141,43*79
+$PGRME,9.1,M,16.7,M,19.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183952,A,4124.7404,N,08152.2886,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183952,4124.7404,N,08152.2886,W,1,03,2.6,56.5,M,-34.0,M,,*41
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,1,12,02,72,326,34,04,47,058,00,05,42,259,37,06,04,307,00*7A
+$PGRME,9.1,M,16.7,M,19.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183953,A,4124.7404,N,08152.2888,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,183953,4124.7404,N,08152.2888,W,1,03,2.6,56.5,M,-34.0,M,,*4E
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,2,12,07,18,127,00,10,47,198,40,13,20,065,00,23,09,038,00*77
+$PGRME,9.1,M,16.7,M,19.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183954,A,4124.7405,N,08152.2889,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,183954,4124.7405,N,08152.2889,W,1,03,2.6,56.5,M,-34.0,M,,*49
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,3,12,24,16,069,35,30,30,301,00,33,09,106,41,35,34,141,44*7E
+$PGRME,9.1,M,16.7,M,19.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183955,A,4124.7405,N,08152.2891,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,183955,4124.7405,N,08152.2891,W,1,03,2.6,56.5,M,-34.0,M,,*41
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,1,12,02,72,326,34,04,47,058,00,05,42,259,36,06,04,307,00*7B
+$PGRME,9.1,M,16.7,M,19.0,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,183956,A,4124.7406,N,08152.2893,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,183956,4124.7406,N,08152.2893,W,1,03,2.6,56.5,M,-34.0,M,,*43
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,2,12,07,18,127,00,10,47,198,40,13,20,065,00,23,09,038,00*77
+$PGRME,9.2,M,16.7,M,19.0,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183957,A,4124.7406,N,08152.2895,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,183957,4124.7406,N,08152.2895,W,1,03,2.6,56.5,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,3,12,24,16,069,36,30,30,301,00,33,09,106,41,35,34,141,44*7D
+$PGRME,9.3,M,16.7,M,19.1,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183958,A,4124.7405,N,08152.2896,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183958,4124.7405,N,08152.2896,W,1,03,2.6,56.5,M,-34.0,M,,*4B
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,1,12,02,72,326,35,04,47,058,00,05,42,259,34,06,04,307,00*78
+$PGRME,9.3,M,16.7,M,19.1,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,183959,A,4124.7405,N,08152.2897,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,183959,4124.7405,N,08152.2897,W,1,03,2.6,56.5,M,-34.0,M,,*4B
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,2,12,07,18,127,00,10,47,198,42,13,20,065,00,23,09,038,00*75
+$PGRME,9.3,M,16.7,M,19.1,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,184000,A,4124.7405,N,08152.2899,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184000,4124.7405,N,08152.2899,W,1,03,2.6,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,3,12,24,16,069,35,30,30,301,00,33,09,106,41,35,34,141,44*7E
+$PGRME,9.3,M,16.7,M,19.1,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,184001,A,4124.7405,N,08152.2900,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184001,4124.7405,N,08152.2900,W,1,03,2.6,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.6,1.0*3D
+$GPGSV,3,1,12,02,72,326,35,04,47,058,00,05,42,259,00,06,04,307,00*7F
+$PGRME,9.4,M,16.7,M,19.1,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,184002,A,4124.7405,N,08152.2901,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184002,4124.7405,N,08152.2901,W,1,03,2.7,56.5,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.7,1.0*3C
+$GPGSV,3,2,12,07,18,127,00,10,47,198,42,13,20,065,00,23,09,038,00*75
+$PGRME,9.4,M,16.7,M,19.1,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,184003,A,4124.7405,N,08152.2903,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184003,4124.7405,N,08152.2903,W,1,03,2.7,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.8,2.7,1.0*3C
+$GPGSV,3,3,12,24,16,069,34,30,30,301,00,33,09,106,41,35,34,141,44*7F
+$PGRME,9.4,M,16.7,M,19.1,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,184004,A,4124.7406,N,08152.2904,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184004,4124.7406,N,08152.2904,W,1,03,2.7,56.5,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,1,12,02,72,326,34,04,47,058,00,05,42,259,00,06,04,307,00*7E
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184005,A,4124.7406,N,08152.2905,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184005,4124.7406,N,08152.2905,W,1,03,2.7,56.5,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,2,12,07,18,127,00,10,47,198,43,13,21,064,00,23,09,038,00*74
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184006,A,4124.7405,N,08152.2907,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184006,4124.7405,N,08152.2907,W,1,03,2.7,56.5,M,-34.0,M,,*46
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,40,35,34,141,44*79
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184007,A,4124.7405,N,08152.2908,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184007,4124.7405,N,08152.2908,W,1,03,2.7,56.5,M,-34.0,M,,*48
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,1,12,02,72,326,33,04,47,058,00,05,42,259,00,06,04,307,00*79
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184008,A,4124.7405,N,08152.2909,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184008,4124.7405,N,08152.2909,W,1,03,2.7,56.5,M,-34.0,M,,*46
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,2,12,07,18,127,00,10,47,198,43,13,21,064,00,23,09,038,00*74
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184009,A,4124.7405,N,08152.2910,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184009,4124.7405,N,08152.2910,W,1,03,2.7,56.5,M,-34.0,M,,*4F
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,3,12,24,16,069,31,30,30,301,00,33,09,106,40,35,34,141,44*7B
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184010,A,4124.7406,N,08152.2911,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184010,4124.7406,N,08152.2911,W,1,03,2.7,56.5,M,-34.0,M,,*45
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,1,12,02,72,326,33,04,47,058,00,05,42,259,00,06,04,307,00*79
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184011,A,4124.7406,N,08152.2912,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184011,4124.7406,N,08152.2912,W,1,03,2.7,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,2,12,07,18,127,00,10,47,198,43,13,21,064,00,23,09,038,34*73
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184012,A,4124.7405,N,08152.2913,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184012,4124.7405,N,08152.2913,W,1,03,2.7,56.5,M,-34.0,M,,*46
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,41,35,34,141,43*7F
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184013,A,4124.7405,N,08152.2914,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184013,4124.7405,N,08152.2914,W,1,03,2.7,56.5,M,-34.0,M,,*40
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,1,12,02,72,326,33,04,47,058,00,05,42,259,00,06,04,307,00*79
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184014,A,4124.7405,N,08152.2914,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184014,4124.7405,N,08152.2914,W,1,03,2.7,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,2,12,07,18,127,00,10,47,198,42,13,21,064,00,23,09,038,35*73
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184015,A,4124.7405,N,08152.2915,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184015,4124.7405,N,08152.2915,W,1,03,2.7,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,41,35,34,141,43*7F
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184016,A,4124.7405,N,08152.2916,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184016,4124.7405,N,08152.2916,W,1,03,2.7,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,1,12,02,72,326,32,04,47,058,00,05,42,259,00,06,04,307,00*78
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184017,A,4124.7405,N,08152.2917,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184017,4124.7405,N,08152.2917,W,1,03,2.7,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,2,12,07,18,127,00,10,47,198,42,13,21,064,00,23,09,038,34*72
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184018,A,4124.7405,N,08152.2918,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184018,4124.7405,N,08152.2918,W,1,03,2.7,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,41,35,34,141,43*7F
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184019,A,4124.7405,N,08152.2919,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184019,4124.7405,N,08152.2919,W,1,00,2.7,56.5,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,,,,,,,,2.9,2.7,1.0*3C
+$GPGSV,3,1,12,02,72,326,32,04,47,058,00,05,42,259,34,06,04,307,00*7F
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184020,A,4124.7406,N,08152.2920,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184020,4124.7406,N,08152.2920,W,1,00,2.7,56.5,M,-34.0,M,,*47
+$GPGSA,A,2,,,,,,,,,,,,,2.9,2.7,1.0*3C
+$GPGSV,3,2,12,07,18,127,00,10,47,198,41,13,21,064,00,23,09,038,33*76
+$PGRME,9.5,M,16.7,M,19.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184021,A,4124.7405,N,08152.2920,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184021,4124.7405,N,08152.2920,W,1,03,2.7,56.5,M,-34.0,M,,*46
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,3,12,24,16,069,31,30,30,301,00,33,09,106,41,35,34,141,43*7D
+$PGRME,9.6,M,16.7,M,19.2,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,184022,A,4124.7405,N,08152.2921,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184022,4124.7405,N,08152.2921,W,1,03,2.7,56.5,M,-34.0,M,,*44
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.7,1.0*3D
+$GPGSV,3,1,12,02,72,326,31,04,47,058,30,05,42,259,35,06,04,307,00*7E
+$PGRME,9.6,M,16.7,M,19.2,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,184023,A,4124.7406,N,08152.2922,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184023,4124.7406,N,08152.2922,W,1,05,4.2,340.3,M,-34.0,M,,*72
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,6.0,4.2,1.6*37
+$GPGSV,3,2,12,07,18,127,33,10,47,198,40,13,21,064,00,23,09,038,00*77
+$PGRME,10.0,M,17.4,M,20.0,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184024,A,4124.7401,N,08152.2915,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184024,4124.7401,N,08152.2915,W,1,05,2.8,340.3,M,-34.0,M,,*7A
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,3,12,24,16,069,32,30,30,301,00,33,09,106,40,35,34,141,44*78
+$PGRME,10.0,M,17.4,M,20.1,M*1E
+$PGRMM,WGS 84*06
+$GPRMC,184025,A,4124.7402,N,08152.2910,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184025,4124.7402,N,08152.2910,W,1,05,2.8,340.3,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,3.0,2.8,1.0*38
+$GPGSV,3,1,12,02,72,326,00,04,47,058,31,05,42,259,33,06,04,307,00*7B
+$PGRME,10.0,M,17.4,M,20.1,M*1E
+$PGRMM,WGS 84*06
+$GPRMC,184026,A,4124.7404,N,08152.2905,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184026,4124.7404,N,08152.2905,W,1,05,2.5,340.3,M,-34.0,M,,*71
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,18,127,31,10,47,198,40,13,21,064,00,23,09,038,00*75
+$PGRME,8.8,M,17.4,M,19.5,M*21
+$PGRMM,WGS 84*06
+$GPRMC,184027,A,4124.7356,N,08152.2704,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184027,4124.7356,N,08152.2704,W,1,05,2.5,340.3,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,3,12,24,16,069,31,30,30,301,00,33,09,106,40,35,34,141,44*7B
+$PGRME,8.8,M,17.4,M,19.5,M*21
+$PGRMM,WGS 84*06
+$GPRMC,184028,A,4124.7320,N,08152.2676,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184028,4124.7320,N,08152.2676,W,1,05,4.2,293.0,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,5.9,4.2,1.6*3D
+$GPGSV,3,1,12,02,72,326,00,04,47,058,33,05,42,259,34,06,04,307,00*7E
+$PGRME,9.3,M,18.0,M,20.3,M*2C
+$PGRMM,WGS 84*06
+$GPRMC,184029,A,4124.7294,N,08152.2665,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184029,4124.7294,N,08152.2665,W,1,05,2.5,174.3,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,18,127,31,10,47,198,39,13,21,064,00,23,09,038,00*7B
+$PGRME,7.6,M,10.7,M,13.2,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184030,A,4124.7297,N,08152.2694,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184030,4124.7297,N,08152.2694,W,1,05,2.5,174.3,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,41,35,34,141,44*78
+$PGRME,7.6,M,10.7,M,13.2,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184031,A,4124.7241,N,08152.2585,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184031,4124.7241,N,08152.2585,W,1,05,2.5,174.3,M,-34.0,M,,*71
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,1,12,02,72,326,00,04,47,058,32,05,42,259,33,06,04,307,00*78
+$PGRME,7.6,M,10.7,M,13.2,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184032,A,4124.7250,N,08152.2628,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184032,4124.7250,N,08152.2628,W,1,05,2.5,174.3,M,-34.0,M,,*76
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,18,127,00,10,47,198,37,13,21,064,00,23,09,038,00*77
+$PGRME,7.6,M,10.7,M,13.2,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184033,A,4124.7257,N,08152.2664,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184033,4124.7257,N,08152.2664,W,1,05,2.5,174.3,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,3,12,24,16,069,33,30,30,301,00,33,09,106,40,35,34,141,44*79
+$PGRME,7.6,M,10.7,M,13.2,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184034,A,4124.7263,N,08152.2692,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184034,4124.7263,N,08152.2692,W,1,05,4.2,258.8,M,-34.0,M,,*76
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,5.9,4.2,1.6*3D
+$GPGSV,3,1,12,02,72,326,00,04,47,058,32,05,42,259,32,06,04,307,00*79
+$PGRME,8.2,M,12.0,M,14.6,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184035,A,4124.7235,N,08152.2835,W,000.4,348.3,010305,007.9,W*7E
+$GPGGA,184035,4124.7235,N,08152.2835,W,1,05,2.5,-29.8,M,-34.0,M,,*6F
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,18,127,00,10,47,198,36,13,21,064,00,23,09,038,00*76
+$PGRME,8.3,M,10.8,M,13.9,M*27
+$PGRMM,WGS 84*06
+$GPRMC,184036,A,4124.7316,N,08152.3016,W,000.4,348.3,010305,007.9,W*75
+$GPGGA,184036,4124.7316,N,08152.3016,W,1,05,2.5,-29.6,M,-34.0,M,,*6A
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,3,12,24,16,069,32,30,30,301,00,33,09,106,40,35,34,141,44*78
+$PGRME,8.3,M,10.8,M,13.9,M*27
+$PGRMM,WGS 84*06
+$GPRMC,184037,A,4124.7316,N,08152.3015,W,000.4,348.3,010305,007.9,W*77
+$GPGGA,184037,4124.7316,N,08152.3015,W,1,05,2.5,-29.5,M,-34.0,M,,*6B
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,1,12,02,72,326,00,04,47,058,31,05,42,259,32,06,04,307,00*7A
+$PGRME,8.3,M,10.8,M,13.9,M*27
+$PGRMM,WGS 84*06
+$GPRMC,184038,A,4124.7315,N,08152.3014,W,000.4,348.3,010305,007.9,W*7A
+$GPGGA,184038,4124.7315,N,08152.3014,W,1,05,2.5,-29.3,M,-34.0,M,,*60
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,18,127,00,10,47,198,37,13,21,064,00,23,09,038,00*77
+$PGRME,8.3,M,10.8,M,13.9,M*27
+$PGRMM,WGS 84*06
+$GPRMC,184039,A,4124.7370,N,08152.2918,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184039,4124.7370,N,08152.2918,W,1,05,2.5,140.4,M,-34.0,M,,*72
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.9,2.5,1.3*3E
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,40,35,34,141,43*7E
+$PGRME,8.3,M,10.8,M,13.9,M*27
+$PGRMM,WGS 84*06
+$GPRMC,184040,A,4124.7370,N,08152.2917,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184040,4124.7370,N,08152.2917,W,1,05,2.5,140.3,M,-34.0,M,,*74
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,1,12,02,72,326,00,04,47,058,34,05,42,259,36,06,04,307,00*7B
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184041,A,4124.7382,N,08152.2889,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184041,4124.7382,N,08152.2889,W,1,05,2.5,140.2,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,18,127,00,10,47,198,37,13,21,064,00,23,09,038,00*77
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184042,A,4124.7389,N,08152.2868,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184042,4124.7389,N,08152.2868,W,1,05,2.5,140.1,M,-34.0,M,,*7B
+$GPGSA,A,3,,04,,,07,10,,,24,,,35,2.7,2.5,1.0*33
+$GPGSV,3,3,12,24,16,069,00,30,30,301,00,33,09,106,40,35,34,141,43*7E
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184043,A,4124.7393,N,08152.2858,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184043,4124.7393,N,08152.2858,W,1,04,2.5,140.0,M,-34.0,M,,*72
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,72,326,00,04,47,058,34,05,42,259,37,06,04,307,00*7A
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184044,A,4124.7397,N,08152.2845,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184044,4124.7397,N,08152.2845,W,1,04,2.5,140.0,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,2,12,07,18,127,00,10,47,198,39,13,21,064,36,23,09,038,00*7C
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184045,A,4124.7400,N,08152.2837,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184045,4124.7400,N,08152.2837,W,1,04,2.5,139.9,M,-34.0,M,,*77
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,3,12,24,15,069,00,30,30,301,00,33,09,106,40,35,34,141,43*7D
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184046,A,4124.7402,N,08152.2832,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184046,4124.7402,N,08152.2832,W,1,04,2.5,139.9,M,-34.0,M,,*73
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,72,326,00,04,47,058,00,05,42,259,38,06,04,307,00*72
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184047,A,4124.7404,N,08152.2827,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184047,4124.7404,N,08152.2827,W,1,04,2.5,139.9,M,-34.0,M,,*70
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,2,12,07,18,127,00,10,47,198,39,13,21,064,35,23,09,038,00*7F
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184048,A,4124.7405,N,08152.2824,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184048,4124.7405,N,08152.2824,W,1,03,2.5,139.8,M,-34.0,M,,*7B
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,3,12,24,15,069,00,30,30,301,00,33,09,106,40,35,34,141,43*7D
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184049,A,4124.7406,N,08152.2822,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184049,4124.7406,N,08152.2822,W,1,03,2.5,139.8,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,1,12,02,73,328,00,04,47,058,00,05,42,259,38,06,04,307,00*7D
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184050,A,4124.7407,N,08152.2820,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184050,4124.7407,N,08152.2820,W,1,03,2.5,139.8,M,-34.0,M,,*74
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,2,12,07,18,127,00,10,47,198,42,13,21,064,34,23,09,038,00*72
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184051,A,4124.7408,N,08152.2818,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184051,4124.7408,N,08152.2818,W,1,03,2.5,139.8,M,-34.0,M,,*71
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,3,12,24,15,069,31,30,30,301,00,33,09,106,40,35,34,141,43*7F
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184052,A,4124.7408,N,08152.2817,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184052,4124.7408,N,08152.2817,W,1,03,2.5,139.8,M,-34.0,M,,*7D
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,1,12,02,73,328,00,04,47,058,00,05,42,259,38,06,04,307,00*7D
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184053,A,4124.7408,N,08152.2812,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184053,4124.7408,N,08152.2812,W,1,03,2.5,139.8,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,2,12,07,18,127,00,10,47,198,43,13,21,064,34,23,09,038,00*73
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184054,A,4124.7407,N,08152.2806,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184054,4124.7407,N,08152.2806,W,1,03,2.5,139.8,M,-34.0,M,,*74
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,3,12,24,15,069,00,30,30,301,00,33,09,106,40,35,34,141,44*7A
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184055,A,4124.7406,N,08152.2801,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184055,4124.7406,N,08152.2801,W,1,03,2.5,139.8,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,1,12,02,73,328,00,04,47,058,00,05,42,259,38,06,04,307,00*7D
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184056,A,4124.7405,N,08152.2797,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184056,4124.7405,N,08152.2797,W,1,03,2.5,139.8,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,2,12,07,18,127,00,10,47,198,44,13,21,064,33,23,09,038,00*73
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184057,A,4124.7404,N,08152.2792,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184057,4124.7404,N,08152.2792,W,1,03,2.5,139.8,M,-34.0,M,,*76
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,3,12,24,15,069,00,30,30,301,00,33,09,106,40,35,34,141,44*7A
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184058,A,4124.7404,N,08152.2789,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184058,4124.7404,N,08152.2789,W,1,03,2.5,139.7,M,-34.0,M,,*7C
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,1,12,02,73,328,00,04,47,058,00,05,42,259,38,06,04,307,00*7D
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184059,A,4124.7403,N,08152.2786,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184059,4124.7403,N,08152.2786,W,1,03,2.5,139.7,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,2,12,07,18,127,00,10,47,198,44,13,21,064,34,23,09,038,00*74
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184100,A,4124.7403,N,08152.2783,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184100,4124.7403,N,08152.2783,W,1,03,2.5,139.7,M,-34.0,M,,*7D
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,3,12,24,15,069,00,30,30,301,00,33,09,106,40,35,34,141,44*7A
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184101,A,4124.7402,N,08152.2780,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184101,4124.7402,N,08152.2780,W,1,03,2.5,139.7,M,-34.0,M,,*7E
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,1,12,02,73,328,00,04,47,058,00,05,42,259,36,06,04,307,00*73
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184102,A,4124.7402,N,08152.2778,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184102,4124.7402,N,08152.2778,W,1,00,2.5,139.7,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,2,12,07,18,127,00,10,47,198,45,13,21,064,34,23,09,038,00*75
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184103,A,4124.7401,N,08152.2776,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184103,4124.7401,N,08152.2776,W,1,00,2.5,139.7,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,3,12,24,15,069,00,30,30,301,00,33,09,106,40,35,34,141,43*7D
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184104,A,4124.7401,N,08152.2774,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184104,4124.7401,N,08152.2774,W,1,00,2.5,139.7,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,1,12,02,73,328,32,04,47,058,00,05,42,259,35,06,04,307,00*71
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184105,A,4124.7401,N,08152.2772,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184105,4124.7401,N,08152.2772,W,1,00,2.5,139.7,M,-34.0,M,,*77
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,2,12,07,18,127,00,10,47,198,45,13,21,064,34,23,09,038,00*75
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184106,A,4124.7401,N,08152.2770,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184106,4124.7401,N,08152.2770,W,1,00,2.5,139.7,M,-34.0,M,,*76
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,3,12,24,15,069,00,30,30,301,00,33,09,106,40,35,34,141,44*7A
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184107,A,4124.7400,N,08152.2769,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184107,4124.7400,N,08152.2769,W,1,00,2.5,139.7,M,-34.0,M,,*7E
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,1,12,02,73,328,00,04,47,058,00,05,42,259,33,06,04,307,00*76
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184108,A,4124.7400,N,08152.2767,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184108,4124.7400,N,08152.2767,W,1,00,2.5,139.7,M,-34.0,M,,*7F
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,2,12,07,18,127,00,10,47,198,45,13,21,064,32,23,09,038,00*73
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184109,A,4124.7400,N,08152.2766,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184109,4124.7400,N,08152.2766,W,1,00,2.5,139.7,M,-34.0,M,,*7F
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,3,12,24,15,069,31,30,30,300,00,33,09,106,40,35,34,141,44*79
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184110,A,4124.7399,N,08152.2766,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184110,4124.7399,N,08152.2766,W,1,03,2.6,139.7,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.6,1.0*33
+$GPGSV,3,1,12,02,73,328,30,04,47,058,00,05,42,259,34,06,04,307,00*72
+$PGRME,8.2,M,10.8,M,13.5,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,184111,A,4124.7399,N,08152.2765,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184111,4124.7399,N,08152.2765,W,1,03,2.6,139.7,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.8,2.6,1.0*3C
+$GPGSV,3,2,12,07,18,127,00,10,47,198,45,13,21,064,00,23,09,038,00*72
+$PGRME,8.3,M,10.8,M,13.6,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184112,A,4124.7397,N,08152.2763,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184112,4124.7397,N,08152.2763,W,1,03,2.6,139.7,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.8,2.6,1.0*3C
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,43*7C
+$PGRME,8.3,M,10.8,M,13.6,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184113,A,4124.7395,N,08152.2762,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184113,4124.7395,N,08152.2762,W,1,04,2.5,139.7,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,73,328,30,04,47,058,32,05,42,259,35,06,04,307,00*72
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184114,A,4124.7394,N,08152.2761,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184114,4124.7394,N,08152.2761,W,1,04,2.5,139.7,M,-34.0,M,,*7A
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,2,12,07,18,127,00,10,47,198,46,13,21,064,33,23,09,038,00*71
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184115,A,4124.7393,N,08152.2760,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184115,4124.7393,N,08152.2760,W,1,04,2.5,139.7,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,3,12,24,15,069,32,30,30,300,00,33,09,106,39,35,34,141,44*74
+$PGRME,7.9,M,10.8,M,13.3,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184116,A,4124.7392,N,08152.2758,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184116,4124.7392,N,08152.2758,W,1,04,2.5,163.1,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.9,2.5,1.3*39
+$GPGSV,3,1,12,02,73,328,00,04,47,058,31,05,42,259,00,06,04,307,00*74
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184117,A,4124.7392,N,08152.2757,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184117,4124.7392,N,08152.2757,W,1,04,2.5,163.1,M,-34.0,M,,*73
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.9,2.5,1.3*39
+$GPGSV,3,2,12,07,18,127,00,10,47,198,47,13,21,064,33,23,09,038,00*70
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184118,A,4124.7391,N,08152.2755,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184118,4124.7391,N,08152.2755,W,1,04,2.5,163.1,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,39,35,34,141,44*75
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184119,A,4124.7391,N,08152.2754,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184119,4124.7391,N,08152.2754,W,1,04,2.5,163.1,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,73,328,00,04,47,058,32,05,42,259,00,06,04,307,00*77
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184120,A,4124.7392,N,08152.2752,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184120,4124.7392,N,08152.2752,W,1,04,2.5,163.1,M,-34.0,M,,*72
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,2,12,07,18,127,00,10,47,198,48,13,21,064,33,23,09,038,00*7F
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184121,A,4124.7392,N,08152.2750,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184121,4124.7392,N,08152.2750,W,1,04,2.5,174.1,M,-34.0,M,,*77
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.9,2.5,1.3*39
+$GPGSV,3,3,12,24,15,069,32,30,30,300,00,33,09,106,39,35,34,141,44*74
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184122,A,4124.7393,N,08152.2747,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184122,4124.7393,N,08152.2747,W,1,04,2.5,183.1,M,-34.0,M,,*7B
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.9,2.5,1.0*3A
+$GPGSV,3,1,12,02,73,328,00,04,47,058,32,05,42,259,00,06,04,307,00*77
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184123,A,4124.7394,N,08152.2745,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184123,4124.7394,N,08152.2745,W,1,04,2.5,183.1,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.9,2.5,1.0*3A
+$GPGSV,3,2,12,07,18,127,00,10,47,198,48,13,21,064,32,23,09,038,00*7E
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184124,A,4124.7394,N,08152.2743,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184124,4124.7394,N,08152.2743,W,1,04,2.5,183.1,M,-34.0,M,,*7E
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.9,2.5,1.0*3A
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,39,35,34,141,44*75
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184125,A,4124.7395,N,08152.2741,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184125,4124.7395,N,08152.2741,W,1,04,2.5,183.1,M,-34.0,M,,*7C
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.9,2.5,1.0*3A
+$GPGSV,3,1,12,02,73,329,32,04,47,058,31,05,42,259,00,06,04,307,00*74
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184126,A,4124.7396,N,08152.2739,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184126,4124.7396,N,08152.2739,W,1,04,2.5,183.1,M,-34.0,M,,*73
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.9,2.5,1.0*3A
+$GPGSV,3,2,12,07,18,127,00,10,47,198,48,13,21,064,33,23,09,038,00*7F
+$PGRME,8.0,M,10.8,M,13.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184127,A,4124.7396,N,08152.2738,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184127,4124.7396,N,08152.2738,W,1,04,2.5,183.1,M,-34.0,M,,*73
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,44*7B
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184128,A,4124.7396,N,08152.2737,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184128,4124.7396,N,08152.2737,W,1,04,2.5,183.1,M,-34.0,M,,*73
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,1,12,02,73,329,33,04,47,058,00,05,42,259,00,06,04,307,00*77
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184129,A,4124.7397,N,08152.2735,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184129,4124.7397,N,08152.2735,W,1,04,2.5,183.1,M,-34.0,M,,*71
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,2,12,07,18,127,00,10,47,198,48,13,21,064,34,23,09,038,00*78
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184130,A,4124.7398,N,08152.2733,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184130,4124.7398,N,08152.2733,W,1,04,2.5,183.1,M,-34.0,M,,*70
+$GPGSA,A,3,,04,,,,10,,,24,,,35,2.7,2.5,1.0*34
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,44*7B
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184131,A,4124.7398,N,08152.2732,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184131,4124.7398,N,08152.2732,W,1,03,2.5,183.1,M,-34.0,M,,*77
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,1,12,02,73,329,32,04,47,059,00,05,42,259,00,06,04,307,00*77
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184132,A,4124.7399,N,08152.2731,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184132,4124.7399,N,08152.2731,W,1,03,2.5,183.1,M,-34.0,M,,*76
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,2,12,07,18,127,00,10,47,198,48,13,21,064,33,23,09,038,00*7F
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184133,A,4124.7399,N,08152.2729,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184133,4124.7399,N,08152.2729,W,1,03,2.5,183.1,M,-34.0,M,,*7E
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,44*7B
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184134,A,4124.7399,N,08152.2728,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184134,4124.7399,N,08152.2728,W,1,03,2.5,183.1,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,1,12,02,73,329,35,04,47,059,00,05,42,258,00,06,04,307,00*71
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184135,A,4124.7400,N,08152.2727,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184135,4124.7400,N,08152.2727,W,1,03,2.5,183.0,M,-34.0,M,,*70
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,2,12,07,18,127,00,10,47,198,49,13,21,064,00,23,09,038,00*7E
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184136,A,4124.7400,N,08152.2726,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184136,4124.7400,N,08152.2726,W,1,03,2.5,183.0,M,-34.0,M,,*72
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,44*7B
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184137,A,4124.7401,N,08152.2725,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184137,4124.7401,N,08152.2725,W,1,03,2.5,183.0,M,-34.0,M,,*71
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,1,12,02,73,329,36,04,47,059,00,05,42,258,32,06,04,307,00*73
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184138,A,4124.7401,N,08152.2723,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184138,4124.7401,N,08152.2723,W,1,03,2.5,183.0,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,2,12,07,18,127,00,10,47,198,49,13,21,064,00,23,09,038,00*7E
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184139,A,4124.7402,N,08152.2722,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184139,4124.7402,N,08152.2722,W,1,03,2.5,183.0,M,-34.0,M,,*7B
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,44*7B
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184140,A,4124.7402,N,08152.2721,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184140,4124.7402,N,08152.2721,W,1,03,2.5,183.0,M,-34.0,M,,*76
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,1,12,02,73,329,38,04,47,059,00,05,42,258,32,06,05,308,00*73
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184141,A,4124.7402,N,08152.2720,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184141,4124.7402,N,08152.2720,W,1,03,2.5,183.0,M,-34.0,M,,*76
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,47,198,49,13,21,064,00,23,09,038,00*7E
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184142,A,4124.7403,N,08152.2720,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184142,4124.7403,N,08152.2720,W,1,03,2.5,183.0,M,-34.0,M,,*74
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,44*7B
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184143,A,4124.7403,N,08152.2719,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184143,4124.7403,N,08152.2719,W,1,03,2.5,183.0,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,1,12,02,73,329,38,04,47,059,00,05,42,258,00,06,05,308,00*72
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184144,A,4124.7403,N,08152.2718,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184144,4124.7403,N,08152.2718,W,1,03,2.5,183.0,M,-34.0,M,,*79
+$GPGSA,A,3,,04,,,,10,,,,,,35,2.7,2.5,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,47,198,49,13,21,064,00,23,09,038,00*7E
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184145,A,4124.7404,N,08152.2717,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184145,4124.7404,N,08152.2717,W,1,00,2.5,183.0,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,43*7C
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184146,A,4124.7404,N,08152.2716,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184146,4124.7404,N,08152.2716,W,1,00,2.5,183.0,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,1,12,02,73,329,38,04,47,059,00,05,42,258,32,06,05,308,00*73
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184147,A,4124.7404,N,08152.2716,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184147,4124.7404,N,08152.2716,W,1,00,2.5,183.0,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,2,12,07,17,128,00,10,47,198,49,13,21,064,00,23,09,038,00*7E
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184148,A,4124.7404,N,08152.2715,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184148,4124.7404,N,08152.2715,W,1,00,2.5,183.0,M,-34.0,M,,*7C
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,43*7C
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184149,A,4124.7405,N,08152.2714,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184149,4124.7405,N,08152.2714,W,1,00,2.5,183.0,M,-34.0,M,,*7D
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,1,12,02,73,329,39,04,46,059,00,05,42,258,00,06,05,308,00*72
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184150,A,4124.7405,N,08152.2714,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184150,4124.7405,N,08152.2714,W,1,00,2.5,183.0,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,2,12,07,17,128,00,10,47,198,48,13,21,064,00,23,09,038,00*7F
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184151,A,4124.7405,N,08152.2713,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184151,4124.7405,N,08152.2713,W,1,00,2.5,183.0,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,44*7B
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184152,A,4124.7405,N,08152.2713,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184152,4124.7405,N,08152.2713,W,1,00,2.5,183.0,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,1,12,02,73,329,38,04,46,059,00,05,42,258,37,06,05,308,00*77
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184153,A,4124.7406,N,08152.2712,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184153,4124.7406,N,08152.2712,W,1,00,2.5,183.0,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,2,12,07,17,128,00,10,48,198,48,13,21,064,00,23,09,038,00*70
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184154,A,4124.7406,N,08152.2712,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184154,4124.7406,N,08152.2712,W,1,00,2.5,183.0,M,-34.0,M,,*74
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,44*7B
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184155,A,4124.7406,N,08152.2711,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184155,4124.7406,N,08152.2711,W,1,00,2.5,183.0,M,-34.0,M,,*76
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,1,12,02,73,329,38,04,46,059,00,05,42,258,36,06,05,308,00*76
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184156,A,4124.7406,N,08152.2711,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184156,4124.7406,N,08152.2711,W,1,00,2.5,183.0,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,2,12,07,17,128,00,10,48,198,48,13,21,064,00,23,09,038,00*70
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184157,A,4124.7406,N,08152.2710,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184157,4124.7406,N,08152.2710,W,1,00,2.5,183.0,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,39,35,34,141,44*75
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184158,A,4124.7407,N,08152.2710,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184158,4124.7407,N,08152.2710,W,1,00,2.5,183.0,M,-34.0,M,,*7B
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,1,12,02,73,329,37,04,46,059,00,05,42,258,35,06,05,308,00*7A
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184159,A,4124.7407,N,08152.2709,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184159,4124.7407,N,08152.2709,W,1,00,2.5,183.0,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,2,12,07,17,128,00,10,48,198,48,13,21,064,00,23,09,038,00*70
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184200,A,4124.7407,N,08152.2709,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184200,4124.7407,N,08152.2709,W,1,00,2.5,183.0,M,-34.0,M,,*7D
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,3,12,24,15,069,00,30,30,300,00,33,09,106,40,35,34,141,44*7B
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184201,A,4124.7407,N,08152.2709,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184201,4124.7407,N,08152.2709,W,1,00,2.5,183.0,M,-34.0,M,,*7C
+$GPGSA,A,3,,,,,,,,,,,,,2.7,2.5,1.0*31
+$GPGSV,3,1,12,02,73,329,35,04,46,059,00,05,42,258,35,06,05,308,00*78
+$PGRME,7.9,M,10.8,M,13.4,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184202,A,4124.7408,N,08152.2708,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184202,4124.7408,N,08152.2708,W,1,03,2.5,183.0,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,2,12,07,17,128,00,10,48,198,47,13,21,064,00,23,09,038,00*7F
+$PGRME,8.0,M,10.8,M,13.5,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184203,A,4124.7408,N,08152.2708,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184203,4124.7408,N,08152.2708,W,1,03,2.5,183.0,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,3,12,24,15,069,32,30,30,300,00,33,09,106,39,35,34,141,44*74
+$PGRME,8.0,M,10.8,M,13.5,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184204,A,4124.7409,N,08152.2708,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184204,4124.7409,N,08152.2708,W,1,03,2.5,183.0,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.7,2.5,1.0*30
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,258,34,06,05,308,00*7F
+$PGRME,8.0,M,10.8,M,13.5,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184205,A,4124.7409,N,08152.2708,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184205,4124.7409,N,08152.2708,W,1,04,3.9,188.7,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,07,10,,,24,,,35,6.1,3.9,1.7*3F
+$GPGSV,3,2,12,07,17,128,33,10,48,198,47,13,21,064,00,23,09,038,00*7F
+$PGRME,8.4,M,12.2,M,14.9,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184206,A,4124.7409,N,08152.2707,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184206,4124.7409,N,08152.2707,W,1,04,9.6,188.7,M,-34.0,M,,*7B
+$GPGSA,A,3,,,,,07,10,,,24,,,35,11.4,9.6,1.0*0E
+$GPGSV,3,3,12,24,15,069,33,30,30,300,00,33,09,106,39,35,34,141,44*75
+$PGRME,8.4,M,12.2,M,14.9,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184207,A,4124.7409,N,08152.2707,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184207,4124.7409,N,08152.2707,W,1,04,9.6,188.7,M,-34.0,M,,*7A
+$GPGSA,A,3,,,,,07,10,,,24,,,35,11.4,9.6,1.0*0E
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,258,38,06,05,308,00*73
+$PGRME,8.4,M,12.2,M,14.9,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184208,A,4124.7409,N,08152.2706,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184208,4124.7409,N,08152.2706,W,1,04,2.8,188.7,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,2,12,07,17,128,31,10,48,198,47,13,21,064,00,23,09,038,00*7D
+$PGRME,8.6,M,12.2,M,15.0,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184209,A,4124.7409,N,08152.2705,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184209,4124.7409,N,08152.2705,W,1,04,2.8,201.1,M,-34.0,M,,*77
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,3,12,24,15,069,35,30,30,300,00,33,09,106,39,35,34,141,44*73
+$PGRME,8.9,M,13.5,M,16.3,M*2C
+$PGRMM,WGS 84*06
+$GPRMC,184210,A,4124.7409,N,08152.2705,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184210,4124.7409,N,08152.2705,W,1,04,3.9,213.4,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,07,10,,,24,,,35,6.3,3.9,1.7*3D
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,258,38,06,05,308,00*73
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184211,A,4124.7409,N,08152.2705,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184211,4124.7409,N,08152.2705,W,1,04,2.8,213.4,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,2,12,07,17,128,31,10,48,198,47,13,21,064,00,23,09,038,00*7D
+$PGRME,9.3,M,14.7,M,17.5,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184212,A,4124.7410,N,08152.2704,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184212,4124.7410,N,08152.2704,W,1,04,2.8,213.4,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,3,12,24,15,069,35,30,30,300,00,33,09,106,39,35,34,141,44*73
+$PGRME,9.3,M,14.7,M,17.5,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184213,A,4124.7410,N,08152.2704,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184213,4124.7410,N,08152.2704,W,1,04,2.8,213.4,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,258,38,06,05,308,00*73
+$PGRME,9.3,M,14.7,M,17.5,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184214,A,4124.7410,N,08152.2704,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184214,4124.7410,N,08152.2704,W,1,04,2.8,213.4,M,-34.0,M,,*74
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,2,12,07,17,128,00,10,48,198,47,13,21,064,00,23,09,038,00*7F
+$PGRME,9.3,M,14.7,M,17.5,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184215,A,4124.7411,N,08152.2703,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184215,4124.7411,N,08152.2703,W,1,04,2.8,213.4,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,3,12,24,15,069,34,30,30,300,00,33,09,106,39,35,34,141,44*72
+$PGRME,9.4,M,14.7,M,17.5,M*22
+$PGRMM,WGS 84*06
+$GPRMC,184216,A,4124.7411,N,08152.2703,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184216,4124.7411,N,08152.2703,W,1,04,2.8,213.4,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,258,37,06,05,308,00*7C
+$PGRME,9.4,M,14.7,M,17.5,M*22
+$PGRMM,WGS 84*06
+$GPRMC,184217,A,4124.7411,N,08152.2702,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184217,4124.7411,N,08152.2702,W,1,04,2.8,213.4,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,2,12,07,17,128,00,10,48,198,47,13,21,064,00,23,09,038,00*7F
+$PGRME,9.5,M,14.7,M,17.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184218,A,4124.7412,N,08152.2702,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184218,4124.7412,N,08152.2702,W,1,04,2.8,213.4,M,-34.0,M,,*7C
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,3,12,24,15,069,35,30,30,300,00,33,09,106,39,35,34,141,44*73
+$PGRME,9.5,M,14.7,M,17.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184219,A,4124.7412,N,08152.2702,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184219,4124.7412,N,08152.2702,W,1,03,2.8,213.4,M,-34.0,M,,*7A
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.9,2.8,1.0*33
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,36,06,05,308,00*72
+$PGRME,9.5,M,14.7,M,17.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184220,A,4124.7412,N,08152.2701,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184220,4124.7412,N,08152.2701,W,1,03,2.8,213.4,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.9,2.8,1.0*33
+$GPGSV,3,2,12,07,17,128,00,10,48,198,46,13,21,064,00,23,09,038,00*7E
+$PGRME,9.5,M,14.7,M,17.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184221,A,4124.7412,N,08152.2701,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184221,4124.7412,N,08152.2701,W,1,03,2.8,213.4,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.9,2.8,1.0*33
+$GPGSV,3,3,12,24,15,069,35,30,30,300,00,33,09,106,39,35,34,141,44*73
+$PGRME,9.5,M,14.7,M,17.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184222,A,4124.7413,N,08152.2701,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184222,4124.7413,N,08152.2701,W,1,03,2.8,213.4,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.9,2.8,1.0*33
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,35,06,05,308,00*71
+$PGRME,9.5,M,14.7,M,17.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184223,A,4124.7414,N,08152.2700,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184223,4124.7414,N,08152.2700,W,1,03,2.8,213.4,M,-34.0,M,,*77
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.9,2.8,1.0*33
+$GPGSV,3,2,12,07,17,128,00,10,48,198,46,13,21,064,00,23,09,038,00*7E
+$PGRME,9.5,M,14.7,M,17.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184224,A,4124.7414,N,08152.2700,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184224,4124.7414,N,08152.2700,W,1,03,2.8,213.4,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.9,2.8,1.0*33
+$GPGSV,3,3,12,24,15,069,34,30,30,300,00,33,09,106,40,35,34,141,44*7C
+$PGRME,9.5,M,14.7,M,17.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184225,A,4124.7415,N,08152.2700,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184225,4124.7415,N,08152.2700,W,1,03,2.8,213.4,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,,10,,,24,,,35,2.9,2.8,1.0*33
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,36,06,05,308,00*72
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184226,A,4124.7415,N,08152.2698,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184226,4124.7415,N,08152.2698,W,1,03,2.8,213.4,M,-34.0,M,,*73
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,46,13,21,064,00,23,09,038,00*7E
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184227,A,4124.7415,N,08152.2698,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184227,4124.7415,N,08152.2698,W,1,03,2.8,213.4,M,-34.0,M,,*72
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,15,069,35,30,30,300,00,33,09,106,40,35,34,141,43*7A
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184228,A,4124.7416,N,08152.2697,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184228,4124.7416,N,08152.2697,W,1,03,2.8,213.4,M,-34.0,M,,*71
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,35,06,05,308,00*71
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184229,A,4124.7416,N,08152.2697,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184229,4124.7416,N,08152.2697,W,1,03,2.8,213.4,M,-34.0,M,,*70
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,46,13,21,064,00,23,09,038,00*7E
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184230,A,4124.7417,N,08152.2696,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184230,4124.7417,N,08152.2696,W,1,03,2.8,213.4,M,-34.0,M,,*78
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,15,069,35,30,30,300,00,33,09,106,39,35,34,141,43*74
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184231,A,4124.7417,N,08152.2696,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184231,4124.7417,N,08152.2696,W,1,03,2.8,213.4,M,-34.0,M,,*79
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,34,06,05,308,00*70
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184232,A,4124.7418,N,08152.2696,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184232,4124.7418,N,08152.2696,W,1,03,2.8,213.4,M,-34.0,M,,*75
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,47,13,21,064,00,23,09,038,00*7F
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184233,A,4124.7418,N,08152.2695,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184233,4124.7418,N,08152.2695,W,1,03,2.8,213.4,M,-34.0,M,,*77
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,15,069,38,30,30,300,00,33,09,106,39,35,34,141,43*79
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184234,A,4124.7419,N,08152.2695,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184234,4124.7419,N,08152.2695,W,1,03,2.8,213.4,M,-34.0,M,,*71
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,35,06,05,308,00*71
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184235,A,4124.7419,N,08152.2694,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184235,4124.7419,N,08152.2694,W,1,03,2.8,213.4,M,-34.0,M,,*71
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,47,13,21,064,00,23,09,038,00*7F
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184236,A,4124.7419,N,08152.2693,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184236,4124.7419,N,08152.2693,W,1,03,2.8,213.4,M,-34.0,M,,*75
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,15,069,39,30,30,300,00,33,09,106,39,35,34,141,43*78
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184237,A,4124.7420,N,08152.2693,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184237,4124.7420,N,08152.2693,W,1,03,2.8,213.4,M,-34.0,M,,*7E
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,37,06,05,308,00*73
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184238,A,4124.7420,N,08152.2692,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184238,4124.7420,N,08152.2692,W,1,03,2.8,213.4,M,-34.0,M,,*70
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,46,13,21,064,00,23,09,038,00*7E
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184239,A,4124.7421,N,08152.2691,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184239,4124.7421,N,08152.2691,W,1,03,2.8,213.4,M,-34.0,M,,*73
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,15,069,39,30,30,300,00,33,09,106,40,35,34,141,43*76
+$PGRME,9.6,M,14.7,M,17.6,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184240,A,4124.7421,N,08152.2691,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184240,4124.7421,N,08152.2691,W,1,03,2.8,213.4,M,-34.0,M,,*7D
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,39,06,05,308,00*7D
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184241,A,4124.7422,N,08152.2690,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184241,4124.7422,N,08152.2690,W,1,03,2.8,213.4,M,-34.0,M,,*7E
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,45,13,21,064,00,23,08,037,00*73
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184242,A,4124.7422,N,08152.2690,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184242,4124.7422,N,08152.2690,W,1,03,2.8,213.4,M,-34.0,M,,*7D
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,15,069,39,30,30,300,00,33,09,106,40,35,34,141,43*76
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184243,A,4124.7423,N,08152.2689,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184243,4124.7423,N,08152.2689,W,1,03,2.8,213.4,M,-34.0,M,,*75
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,40,06,05,308,00*73
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184244,A,4124.7423,N,08152.2688,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184244,4124.7423,N,08152.2688,W,1,03,2.8,213.4,M,-34.0,M,,*73
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,44,13,21,064,00,23,08,037,00*72
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184245,A,4124.7424,N,08152.2688,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184245,4124.7424,N,08152.2688,W,1,03,2.8,213.4,M,-34.0,M,,*75
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,14,070,39,30,30,300,00,33,09,106,40,35,34,141,43*7F
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184246,A,4124.7424,N,08152.2688,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184246,4124.7424,N,08152.2688,W,1,03,2.8,213.4,M,-34.0,M,,*76
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,38,06,05,308,00*7C
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184247,A,4124.7425,N,08152.2687,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184247,4124.7425,N,08152.2687,W,1,03,2.8,213.4,M,-34.0,M,,*79
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,43,13,21,064,00,23,08,037,00*75
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184248,A,4124.7425,N,08152.2686,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184248,4124.7425,N,08152.2686,W,1,03,2.8,213.4,M,-34.0,M,,*77
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,14,070,40,30,30,300,00,33,09,106,40,35,34,141,43*71
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184249,A,4124.7426,N,08152.2686,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184249,4124.7426,N,08152.2686,W,1,03,2.8,213.4,M,-34.0,M,,*75
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,36,06,06,308,00*71
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184250,A,4124.7426,N,08152.2685,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184250,4124.7426,N,08152.2685,W,1,03,2.8,213.4,M,-34.0,M,,*7E
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,44,13,21,064,00,23,08,037,00*72
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184251,A,4124.7427,N,08152.2685,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184251,4124.7427,N,08152.2685,W,1,03,2.8,213.4,M,-34.0,M,,*7E
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,14,070,39,30,30,300,00,33,09,106,40,35,34,141,43*7F
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184252,A,4124.7427,N,08152.2684,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184252,4124.7427,N,08152.2684,W,1,03,2.8,213.4,M,-34.0,M,,*7C
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,31,06,06,308,00*76
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184253,A,4124.7427,N,08152.2684,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184253,4124.7427,N,08152.2684,W,1,03,2.8,213.4,M,-34.0,M,,*7D
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,44,13,21,064,00,23,08,037,00*72
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184254,A,4124.7428,N,08152.2683,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184254,4124.7428,N,08152.2683,W,1,03,2.8,213.4,M,-34.0,M,,*72
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,14,070,38,30,30,300,00,33,09,106,40,35,34,141,43*7E
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184255,A,4124.7429,N,08152.2683,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184255,4124.7429,N,08152.2683,W,1,03,2.8,213.4,M,-34.0,M,,*72
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,31,06,06,308,00*76
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184256,A,4124.7429,N,08152.2682,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184256,4124.7429,N,08152.2682,W,1,03,2.8,213.4,M,-34.0,M,,*70
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,43,13,21,064,00,23,08,037,00*75
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184257,A,4124.7429,N,08152.2681,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184257,4124.7429,N,08152.2681,W,1,03,2.8,213.4,M,-34.0,M,,*72
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,14,070,38,30,30,300,00,33,09,106,40,35,34,141,43*7E
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184258,A,4124.7430,N,08152.2681,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184258,4124.7430,N,08152.2681,W,1,03,2.8,213.4,M,-34.0,M,,*75
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,34,06,06,308,00*73
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184259,A,4124.7430,N,08152.2680,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184259,4124.7430,N,08152.2680,W,1,03,2.8,213.4,M,-34.0,M,,*75
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,43,13,21,064,00,23,08,037,00*75
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184300,A,4124.7431,N,08152.2680,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184300,4124.7431,N,08152.2680,W,1,03,2.8,213.4,M,-34.0,M,,*79
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,14,070,39,30,30,300,00,33,09,106,40,35,34,141,44*78
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184301,A,4124.7431,N,08152.2679,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184301,4124.7431,N,08152.2679,W,1,03,2.8,213.4,M,-34.0,M,,*7E
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,34,06,06,308,00*73
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184302,A,4124.7431,N,08152.2678,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184302,4124.7431,N,08152.2678,W,1,03,2.8,213.4,M,-34.0,M,,*7C
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,00,10,48,198,43,13,21,064,00,23,08,037,00*75
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184303,A,4124.7431,N,08152.2678,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184303,4124.7431,N,08152.2678,W,1,03,2.8,213.4,M,-34.0,M,,*7D
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,3,12,24,14,070,39,30,30,300,00,33,09,106,40,35,34,141,43*7F
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184304,A,4124.7432,N,08152.2677,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184304,4124.7432,N,08152.2677,W,1,03,2.8,213.4,M,-34.0,M,,*76
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,36,06,06,308,00*71
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184305,A,4124.7432,N,08152.2676,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184305,4124.7432,N,08152.2676,W,1,03,2.8,213.4,M,-34.0,M,,*76
+$GPGSA,A,2,,,,,,10,,,24,,,35,2.9,2.8,1.0*32
+$GPGSV,3,2,12,07,17,128,35,10,48,198,43,13,21,064,00,23,08,037,00*73
+$PGRME,9.3,M,14.7,M,17.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184306,A,4124.7433,N,08152.2676,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184306,4124.7433,N,08152.2676,W,1,04,2.8,216.3,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,3,12,24,14,070,38,30,30,300,00,33,09,106,40,35,34,141,43*7E
+$PGRME,9.5,M,15.5,M,18.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184307,A,4124.7433,N,08152.2675,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184307,4124.7433,N,08152.2675,W,1,04,2.9,219.6,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,07,10,,,24,,,35,3.5,2.9,1.7*3F
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,37,06,06,308,00*70
+$PGRME,9.5,M,15.5,M,18.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184308,A,4124.7434,N,08152.2675,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184308,4124.7434,N,08152.2675,W,1,04,9.1,219.7,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.6,9.1,1.0*32
+$GPGSV,3,2,12,07,17,128,37,10,48,198,42,13,21,064,00,23,08,037,00*70
+$PGRME,9.5,M,15.5,M,18.2,M*28
+$PGRMM,WGS 84*06
+$GPRMC,184309,A,4124.7434,N,08152.2674,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184309,4124.7434,N,08152.2674,W,1,04,3.9,225.4,M,-34.0,M,,*7C
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.5,3.9,1.7*35
+$GPGSV,3,3,12,24,14,070,36,30,31,299,00,33,09,106,39,35,34,141,43*7E
+$PGRME,9.7,M,16.2,M,18.9,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184310,A,4124.7435,N,08152.2673,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184310,4124.7435,N,08152.2673,W,1,04,3.9,225.5,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.5,3.9,1.7*35
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,36,06,06,308,00*71
+$PGRME,9.7,M,16.2,M,18.9,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184311,A,4124.7435,N,08152.2673,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184311,4124.7435,N,08152.2673,W,1,04,3.9,225.6,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.5,3.9,1.7*35
+$GPGSV,3,2,12,07,17,128,36,10,48,198,41,13,21,064,00,23,08,037,00*72
+$PGRME,9.7,M,16.2,M,18.9,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184312,A,4124.7436,N,08152.2672,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184312,4124.7436,N,08152.2672,W,1,04,4.2,225.7,M,-34.0,M,,*7D
+$GPGSA,A,3,,,,,07,10,,,24,,,35,6.9,4.2,1.0*3C
+$GPGSV,3,3,12,24,14,070,36,30,31,299,00,33,09,106,39,35,34,141,43*7E
+$PGRME,11.6,M,16.2,M,20.3,M*1C
+$PGRMM,WGS 84*06
+$GPRMC,184313,A,4124.7436,N,08152.2672,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184313,4124.7436,N,08152.2672,W,1,04,2.8,225.7,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,1,12,02,73,329,00,04,46,059,00,05,42,257,36,06,06,308,00*71
+$PGRME,9.7,M,16.2,M,18.8,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184314,A,4124.7437,N,08152.2671,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184314,4124.7437,N,08152.2671,W,1,04,2.8,226.8,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,2,12,07,17,128,35,10,48,198,41,13,21,064,00,23,08,037,00*71
+$PGRME,9.8,M,16.8,M,19.5,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,184315,A,4124.7437,N,08152.2670,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184315,4124.7437,N,08152.2670,W,1,04,2.8,226.8,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,3,12,24,14,070,36,30,31,299,00,33,09,106,40,35,34,141,43*70
+$PGRME,9.8,M,16.8,M,19.5,M*2D
+$PGRMM,WGS 84*06
+$GPRMC,184316,A,4124.7438,N,08152.2669,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184316,4124.7438,N,08152.2669,W,1,04,3.9,230.3,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,07,10,,,24,,,35,6.4,3.9,1.7*3A
+$GPGSV,3,1,12,02,73,329,31,04,46,059,00,05,42,257,36,06,06,308,00*73
+$PGRME,10.0,M,17.4,M,20.0,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184317,A,4124.7438,N,08152.2667,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184317,4124.7438,N,08152.2667,W,1,04,4.2,234.1,M,-34.0,M,,*74
+$GPGSA,A,3,,,,,07,10,,,24,,,35,6.5,4.2,1.0*30
+$GPGSV,3,2,12,07,17,128,35,10,48,198,42,13,21,064,00,23,08,037,00*72
+$PGRME,10.0,M,17.4,M,20.0,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184318,A,4124.7439,N,08152.2667,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184318,4124.7439,N,08152.2667,W,1,04,3.9,237.0,M,-34.0,M,,*74
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.5,3.9,1.7*35
+$GPGSV,3,3,12,24,14,070,35,30,31,299,00,33,09,106,40,35,34,141,43*73
+$PGRME,10.1,M,17.9,M,20.5,M*16
+$PGRMM,WGS 84*06
+$GPRMC,184319,A,4124.7439,N,08152.2666,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184319,4124.7439,N,08152.2666,W,1,04,9.9,236.9,M,-34.0,M,,*76
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.7,9.9,1.0*00
+$GPGSV,3,1,12,02,73,329,32,04,46,059,00,05,42,257,36,06,06,308,00*70
+$PGRME,10.1,M,17.9,M,20.5,M*16
+$PGRMM,WGS 84*06
+$GPRMC,184320,A,4124.7440,N,08152.2666,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184320,4124.7440,N,08152.2666,W,1,04,3.9,237.0,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.5,3.9,1.7*35
+$GPGSV,3,2,12,07,16,128,34,10,48,198,41,13,21,064,00,23,08,037,00*71
+$PGRME,10.2,M,18.3,M,21.0,M*14
+$PGRMM,WGS 84*06
+$GPRMC,184321,A,4124.7440,N,08152.2665,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184321,4124.7440,N,08152.2665,W,1,04,3.9,236.8,M,-34.0,M,,*7B
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.5,3.9,1.7*35
+$GPGSV,3,3,12,24,14,070,34,30,31,299,00,33,09,106,40,35,34,141,43*72
+$PGRME,10.2,M,18.3,M,21.0,M*14
+$PGRMM,WGS 84*06
+$GPRMC,184322,A,4124.7441,N,08152.2664,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184322,4124.7441,N,08152.2664,W,1,04,4.2,236.7,M,-34.0,M,,*7B
+$GPGSA,A,3,,,,,07,10,,,24,,,35,6.9,4.2,1.0*3C
+$GPGSV,3,1,12,02,73,329,34,04,46,059,00,05,42,257,35,06,06,308,00*75
+$PGRME,12.3,M,18.3,M,22.5,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184323,A,4124.7442,N,08152.2664,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184323,4124.7442,N,08152.2664,W,1,04,10.2,236.6,M,-34.0,M,,*4D
+$GPGSA,A,3,,,,,07,10,,,24,,,35,12.4,10.2,1.0*31
+$GPGSV,3,2,12,07,16,128,36,10,48,198,39,13,21,064,00,23,08,037,00*7C
+$PGRME,12.3,M,18.3,M,22.5,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184324,A,4124.7442,N,08152.2663,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184324,4124.7442,N,08152.2663,W,1,04,15.1,236.5,M,-34.0,M,,*48
+$GPGSA,A,3,,,,,07,10,,,24,,,35,16.9,15.1,1.0*3E
+$GPGSV,3,3,12,24,14,070,33,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,12.3,M,18.3,M,22.5,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184325,A,4124.7443,N,08152.2662,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184325,4124.7443,N,08152.2662,W,1,04,3.9,239.8,M,-34.0,M,,*74
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.5,3.9,1.7*35
+$GPGSV,3,1,12,02,73,332,34,04,46,059,00,05,42,257,34,06,06,308,00*7E
+$PGRME,11.3,M,18.7,M,22.8,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184326,A,4124.7443,N,08152.2661,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184326,4124.7443,N,08152.2661,W,1,04,10.0,239.7,M,-34.0,M,,*40
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.7,10.0,1.0*31
+$GPGSV,3,2,12,07,16,128,37,10,48,198,38,13,21,064,00,23,08,037,00*7C
+$PGRME,11.3,M,18.7,M,22.8,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184327,A,4124.7444,N,08152.2661,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184327,4124.7444,N,08152.2661,W,1,04,6.8,239.7,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,07,10,,,24,,,35,6.9,6.8,1.0*34
+$GPGSV,3,3,12,24,14,070,33,30,31,299,00,33,09,106,39,35,34,141,43*7B
+$PGRME,13.3,M,18.7,M,24.2,M*15
+$PGRMM,WGS 84*06
+$GPRMC,184328,A,4124.7444,N,08152.2660,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184328,4124.7444,N,08152.2660,W,1,04,2.8,239.6,M,-34.0,M,,*72
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,1,12,02,73,332,34,04,46,059,00,05,42,257,34,06,06,308,00*7E
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184329,A,4124.7445,N,08152.2659,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184329,4124.7445,N,08152.2659,W,1,04,2.8,239.6,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,2,12,07,16,128,36,10,48,198,39,13,21,064,00,23,08,037,00*7C
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184330,A,4124.7445,N,08152.2658,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184330,4124.7445,N,08152.2658,W,1,04,9.1,239.6,M,-34.0,M,,*73
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.2,9.1,1.0*36
+$GPGSV,3,3,12,24,14,070,32,30,31,299,00,33,09,106,40,35,34,141,43*74
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184331,A,4124.7446,N,08152.2658,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184331,4124.7446,N,08152.2658,W,1,04,9.1,239.6,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.2,9.1,1.0*36
+$GPGSV,3,1,12,02,73,332,34,04,46,060,00,05,42,257,34,06,06,308,00*74
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184332,A,4124.7446,N,08152.2657,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184332,4124.7446,N,08152.2657,W,1,04,9.1,239.5,M,-34.0,M,,*7E
+$GPGSA,A,3,,,,,07,10,,,24,,,35,9.2,9.1,1.0*36
+$GPGSV,3,2,12,07,16,128,38,10,48,198,38,13,21,064,00,23,08,037,00*73
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184333,A,4124.7447,N,08152.2657,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184333,4124.7447,N,08152.2657,W,1,04,14.2,239.5,M,-34.0,M,,*41
+$GPGSA,A,3,,,,,07,10,,,24,,,35,14.4,14.2,1.0*33
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184334,A,4124.7448,N,08152.2656,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184334,4124.7448,N,08152.2656,W,1,04,18.4,239.5,M,-34.0,M,,*42
+$GPGSA,A,3,,,,,07,10,,,24,,,35,18.5,18.4,1.0*34
+$GPGSV,3,1,12,02,73,332,33,04,46,060,00,05,41,257,00,06,06,308,00*77
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184335,A,4124.7448,N,08152.2656,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184335,4124.7448,N,08152.2656,W,1,04,21.8,239.5,M,-34.0,M,,*45
+$GPGSA,A,3,,,,,07,10,,,24,,,35,21.9,21.8,1.0*34
+$GPGSV,3,2,12,07,16,128,39,10,48,198,38,13,21,064,00,23,08,037,00*72
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184336,A,4124.7449,N,08152.2655,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184336,4124.7449,N,08152.2655,W,1,03,24.5,239.5,M,-34.0,M,,*4B
+$GPGSA,A,3,,,,,,10,,,24,,,35,24.6,24.5,1.0*31
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184337,A,4124.7449,N,08152.2655,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184337,4124.7449,N,08152.2655,W,1,00,26.8,239.5,M,-34.0,M,,*46
+$GPGSA,A,3,,,,,,,,,,,,,26.8,26.8,1.0*33
+$GPGSV,3,1,12,02,73,332,34,04,46,060,00,05,41,257,32,06,06,308,00*71
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184338,A,4124.7450,N,08152.2654,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184338,4124.7450,N,08152.2654,W,1,00,28.6,239.5,M,-34.0,M,,*40
+$GPGSA,A,3,,,,,,,,,,,,,28.6,28.6,1.0*33
+$GPGSV,3,2,12,07,16,128,40,10,48,198,37,13,21,064,00,23,08,037,00*73
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184339,A,4124.7450,N,08152.2654,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184339,4124.7450,N,08152.2654,W,1,00,28.6,239.5,M,-34.0,M,,*41
+$GPGSA,A,3,,,,,,,,,,,,,28.6,28.6,1.0*33
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184340,A,4124.7451,N,08152.2653,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184340,4124.7451,N,08152.2653,W,1,00,30.0,239.5,M,-34.0,M,,*46
+$GPGSA,A,3,,,,,,,,,,,,,30.1,30.0,1.0*32
+$GPGSV,3,1,12,02,73,332,34,04,46,060,00,05,41,257,00,06,06,308,00*70
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184341,A,4124.7451,N,08152.2653,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184341,4124.7451,N,08152.2653,W,1,00,31.2,239.5,M,-34.0,M,,*44
+$GPGSA,A,3,,,,,,,,,,,,,31.3,31.2,1.0*32
+$GPGSV,3,2,12,07,16,128,40,10,48,198,39,13,21,064,00,23,08,037,00*7D
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184342,A,4124.7452,N,08152.2652,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184342,4124.7452,N,08152.2652,W,1,00,32.2,239.5,M,-34.0,M,,*46
+$GPGSA,A,3,,,,,,,,,,,,,32.2,32.2,1.0*33
+$GPGSV,3,3,12,24,14,070,36,30,31,299,00,33,09,106,40,35,34,141,44*77
+$PGRME,10.2,M,18.7,M,21.3,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184343,A,4124.7452,N,08152.2651,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184343,4124.7452,N,08152.2651,W,1,04,3.9,240.3,M,-34.0,M,,*71
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.4,3.9,1.6*35
+$GPGSV,3,1,12,02,73,332,34,04,46,060,00,05,41,257,37,06,06,308,00*74
+$PGRME,10.3,M,19.1,M,21.7,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184344,A,4124.7453,N,08152.2651,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184344,4124.7453,N,08152.2651,W,1,04,2.8,240.4,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,07,10,,,24,,,35,2.9,2.8,1.0*34
+$GPGSV,3,2,12,07,16,128,39,10,48,198,39,13,21,064,00,23,08,037,00*73
+$PGRME,10.3,M,19.1,M,21.7,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184345,A,4124.7453,N,08152.2650,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184345,4124.7453,N,08152.2650,W,1,04,3.9,242.3,M,-34.0,M,,*75
+$GPGSA,A,3,,,,,07,10,,,24,,,35,6.5,3.9,1.6*3A
+$GPGSV,3,3,12,24,14,070,36,30,31,299,00,33,09,106,40,35,34,141,43*70
+$PGRME,10.4,M,19.4,M,22.0,M*17
+$PGRMM,WGS 84*06
+$GPRMC,184346,A,4124.7453,N,08152.2649,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184346,4124.7453,N,08152.2649,W,1,04,3.9,244.0,M,-34.0,M,,*7B
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.4,3.9,1.6*35
+$GPGSV,3,1,12,02,73,332,34,04,46,060,00,05,41,257,35,06,06,308,00*76
+$PGRME,10.5,M,19.7,M,22.3,M*16
+$PGRMM,WGS 84*06
+$GPRMC,184347,A,4124.7454,N,08152.2650,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184347,4124.7454,N,08152.2650,W,1,04,4.2,244.1,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,07,10,,,24,,,35,6.9,4.2,1.0*3C
+$GPGSV,3,2,12,07,16,128,38,10,48,198,40,13,21,064,00,23,08,037,00*7C
+$PGRME,12.7,M,19.7,M,23.9,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,184348,A,4124.7455,N,08152.2649,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184348,4124.7455,N,08152.2649,W,1,04,3.9,245.8,M,-34.0,M,,*7A
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.4,3.9,1.6*35
+$GPGSV,3,3,12,24,14,070,35,30,31,299,00,33,09,106,40,35,34,141,43*73
+$PGRME,11.3,M,20.0,M,24.0,M*19
+$PGRMM,WGS 84*06
+$GPRMC,184349,A,4124.7455,N,08152.2649,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184349,4124.7455,N,08152.2649,W,1,04,3.9,247.1,M,-34.0,M,,*70
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.4,3.9,1.6*35
+$GPGSV,3,1,12,02,73,332,37,04,46,060,00,05,41,257,37,06,06,308,00*77
+$PGRME,11.3,M,20.2,M,24.1,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,184350,A,4124.7456,N,08152.2649,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184350,4124.7456,N,08152.2649,W,1,04,10.1,247.0,M,-34.0,M,,*40
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.8,10.1,1.0*3F
+$GPGSV,3,2,12,07,16,128,36,10,48,198,42,13,21,064,00,23,08,037,00*70
+$PGRME,11.3,M,20.2,M,24.1,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,184351,A,4124.7456,N,08152.2648,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184351,4124.7456,N,08152.2648,W,1,04,15.1,247.0,M,-34.0,M,,*45
+$GPGSA,A,3,,,,,07,10,,,24,,,35,18.1,15.1,1.0*38
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,11.3,M,20.2,M,24.1,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,184352,A,4124.7457,N,08152.2648,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184352,4124.7457,N,08152.2648,W,1,04,19.2,247.0,M,-34.0,M,,*48
+$GPGSA,A,3,,,,,07,10,,,24,,,35,21.6,19.2,1.0*3A
+$GPGSV,3,1,12,02,73,332,39,04,46,060,00,05,41,257,37,06,06,308,00*79
+$PGRME,11.3,M,20.2,M,24.1,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,184353,A,4124.7457,N,08152.2647,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184353,4124.7457,N,08152.2647,W,1,04,3.9,248.0,M,-34.0,M,,*79
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.4,3.9,1.6*35
+$GPGSV,3,2,12,07,16,128,35,10,49,198,43,13,21,064,00,23,08,037,00*73
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184354,A,4124.7457,N,08152.2647,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184354,4124.7457,N,08152.2647,W,1,04,3.9,247.9,M,-34.0,M,,*78
+$GPGSA,A,3,,,,,07,10,,,24,,,35,8.4,3.9,1.6*35
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,43*7B
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184355,A,4124.7457,N,08152.2646,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184355,4124.7457,N,08152.2646,W,1,04,10.1,247.9,M,-34.0,M,,*42
+$GPGSA,A,3,,,,,07,10,,,24,,,35,13.8,10.1,1.0*3F
+$GPGSV,3,1,12,02,73,332,40,04,46,060,00,05,41,257,37,06,06,308,00*77
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184356,A,4124.7458,N,08152.2646,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184356,4124.7458,N,08152.2646,W,1,04,15.2,247.9,M,-34.0,M,,*48
+$GPGSA,A,3,,,,,07,10,,,24,,,35,18.1,15.2,1.0*3B
+$GPGSV,3,2,12,07,16,128,35,10,49,198,43,13,21,064,00,23,08,037,00*73
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184357,A,4124.7458,N,08152.2645,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184357,4124.7458,N,08152.2645,W,1,04,19.3,247.9,M,-34.0,M,,*47
+$GPGSA,A,3,,,,,07,10,,,24,,,35,21.7,19.3,1.0*3A
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,44*7C
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184358,A,4124.7458,N,08152.2645,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184358,4124.7458,N,08152.2645,W,1,04,22.6,247.9,M,-34.0,M,,*45
+$GPGSA,A,3,,,,,07,10,,,24,,,35,24.5,22.6,1.0*30
+$GPGSV,3,1,12,02,73,332,40,04,46,060,00,05,41,257,37,06,06,308,00*77
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184359,A,4124.7459,N,08152.2644,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184359,4124.7459,N,08152.2644,W,1,04,25.3,247.9,M,-34.0,M,,*46
+$GPGSA,A,3,,,,,07,10,,,24,,,35,26.9,25.3,1.0*3C
+$GPGSV,3,2,12,07,16,128,37,10,49,198,43,13,21,064,00,23,08,037,00*71
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184400,A,4124.7459,N,08152.2644,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184400,4124.7459,N,08152.2644,W,1,04,27.5,247.9,M,-34.0,M,,*49
+$GPGSA,A,3,,,,,07,10,,,24,,,35,28.8,27.5,1.0*37
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184401,A,4124.7459,N,08152.2643,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184401,4124.7459,N,08152.2643,W,1,04,29.3,247.9,M,-34.0,M,,*47
+$GPGSA,A,3,,,,,07,10,,,24,,,35,30.3,29.3,1.0*3D
+$GPGSV,3,1,12,02,73,332,40,04,46,060,00,05,41,257,37,06,06,308,00*77
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184402,A,4124.7460,N,08152.2643,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184402,4124.7460,N,08152.2643,W,1,00,30.7,247.9,M,-34.0,M,,*46
+$GPGSA,A,3,,,,,,,,,,,,,31.6,30.7,1.0*33
+$GPGSV,3,2,12,07,16,128,38,10,49,198,44,13,21,064,00,23,08,037,00*79
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184403,A,4124.7460,N,08152.2643,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184403,4124.7460,N,08152.2643,W,1,00,31.9,247.9,M,-34.0,M,,*48
+$GPGSA,A,3,,,,,,,,,,,,,32.6,31.9,1.0*3F
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184404,A,4124.7460,N,08152.2642,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184404,4124.7460,N,08152.2642,W,1,00,32.8,247.9,M,-34.0,M,,*4C
+$GPGSA,A,3,,,,,,,,,,,,,33.4,32.8,1.0*3E
+$GPGSV,3,1,12,02,73,332,40,04,46,060,00,05,41,257,39,06,06,308,00*79
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184405,A,4124.7461,N,08152.2642,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184405,4124.7461,N,08152.2642,W,1,00,33.6,247.9,M,-34.0,M,,*43
+$GPGSA,A,3,,,,,,,,,,,,,34.1,33.6,1.0*33
+$GPGSV,3,2,12,07,16,128,38,10,49,198,44,13,21,063,00,23,08,037,00*7E
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184406,A,4124.7461,N,08152.2641,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184406,4124.7461,N,08152.2641,W,1,00,34.3,247.9,M,-34.0,M,,*41
+$GPGSA,A,3,,,,,,,,,,,,,34.6,34.3,1.0*36
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,11.3,M,20.4,M,24.2,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184407,A,4124.7461,N,08152.2641,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184407,4124.7461,N,08152.2641,W,2,04,4.1,247.3,M,-34.0,M,,*7C
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,1.6*3B
+$GPGSV,3,1,12,02,73,332,40,04,46,060,00,05,41,257,38,06,06,308,00*78
+$PGRME,11.5,M,20.8,M,24.5,M*12
+$PGRMM,WGS 84*06
+$GPRMC,184408,A,4124.7462,N,08152.2641,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184408,4124.7462,N,08152.2641,W,2,04,4.1,246.6,M,-34.0,M,,*74
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,2.1*3F
+$GPGSV,3,2,12,07,16,128,39,10,49,198,45,13,21,063,00,23,08,037,00*7E
+$PGRME,11.5,M,20.8,M,24.5,M*12
+$PGRMM,WGS 84*06
+$GPRMC,184409,A,4124.7462,N,08152.2641,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184409,4124.7462,N,08152.2641,W,2,04,2.5,246.3,M,-34.0,M,,*72
+$GPGSA,A,3,02,,,,07,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,9.8,M,20.8,M,23.0,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184410,A,4124.7463,N,08152.2641,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184410,4124.7463,N,08152.2641,W,2,04,2.7,247.2,M,-34.0,M,,*79
+$GPGSA,A,3,02,,,,07,10,,,,,,35,3.2,2.7,1.6*33
+$GPGSV,3,1,12,02,73,332,40,04,46,060,00,05,41,257,39,06,06,308,00*79
+$PGRME,10.1,M,21.1,M,23.4,M*19
+$PGRMM,WGS 84*06
+$GPRMC,184411,A,4124.7463,N,08152.2640,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184411,4124.7463,N,08152.2640,W,2,04,2.8,247.7,M,-34.0,M,,*73
+$GPGSA,A,3,02,,,,07,10,,,,,,35,3.7,2.8,2.1*3D
+$GPGSV,3,2,12,07,16,128,39,10,49,198,45,13,21,063,00,23,08,037,00*7E
+$PGRME,10.1,M,21.1,M,23.4,M*19
+$PGRMM,WGS 84*06
+$GPRMC,184412,A,4124.7463,N,08152.2640,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184412,4124.7463,N,08152.2640,W,2,04,2.8,247.9,M,-34.0,M,,*7E
+$GPGSA,A,3,02,,,,07,10,,,,,,35,3.7,2.8,2.1*3D
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,10.1,M,21.1,M,23.4,M*19
+$PGRMM,WGS 84*06
+$GPRMC,184413,A,4124.7463,N,08152.2639,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184413,4124.7463,N,08152.2639,W,2,04,2.8,248.3,M,-34.0,M,,*74
+$GPGSA,A,3,02,,,,07,10,,,,,,35,3.7,2.8,2.1*3D
+$GPGSV,3,1,12,02,73,332,39,04,46,060,00,05,41,257,39,06,06,308,00*77
+$PGRME,10.1,M,21.1,M,23.4,M*19
+$PGRMM,WGS 84*06
+$GPRMC,184414,A,4124.7463,N,08152.2638,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184414,4124.7463,N,08152.2638,W,2,04,2.5,248.2,M,-34.0,M,,*7E
+$GPGSA,A,3,02,,,,07,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,2,12,07,16,128,38,10,49,198,45,13,21,063,00,23,08,037,00*7F
+$PGRME,9.9,M,21.1,M,23.3,M*2E
+$PGRMM,WGS 84*06
+$GPRMC,184415,A,4124.7463,N,08152.2637,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184415,4124.7463,N,08152.2637,W,2,04,2.5,247.8,M,-34.0,M,,*75
+$GPGSA,A,3,02,,,,07,10,,,,,,35,2.7,2.5,1.0*33
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184416,A,4124.7463,N,08152.2637,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184416,4124.7463,N,08152.2637,W,2,04,2.7,247.4,M,-34.0,M,,*78
+$GPGSA,A,3,02,,,,07,10,,,,,,35,3.2,2.7,1.6*33
+$GPGSV,3,1,12,02,73,332,39,04,46,060,00,05,41,257,38,06,06,308,00*76
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184417,A,4124.7463,N,08152.2637,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184417,4124.7463,N,08152.2637,W,2,04,2.7,246.9,M,-34.0,M,,*75
+$GPGSA,A,3,02,,,,07,10,,,,,,35,3.2,2.7,1.6*33
+$GPGSV,3,2,12,07,16,128,38,10,49,198,46,13,21,063,00,23,08,037,00*7C
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184418,A,4124.7464,N,08152.2636,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184418,4124.7464,N,08152.2636,W,2,04,9.2,246.9,M,-34.0,M,,*72
+$GPGSA,A,3,02,,,,07,10,,,,,,35,9.7,9.2,1.0*34
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184419,A,4124.7464,N,08152.2636,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184419,4124.7464,N,08152.2636,W,2,04,4.1,245.5,M,-34.0,M,,*72
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,1.6*3B
+$GPGSV,3,1,12,02,73,332,38,04,46,060,00,05,41,257,38,06,06,308,00*77
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,184420,A,4124.7464,N,08152.2635,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184420,4124.7464,N,08152.2635,W,2,04,4.1,245.0,M,-34.0,M,,*7E
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,2.1*3F
+$GPGSV,3,2,12,07,16,128,39,10,49,198,45,13,21,063,00,23,08,037,00*7E
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,184421,A,4124.7464,N,08152.2635,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184421,4124.7464,N,08152.2635,W,2,04,4.1,245.1,M,-34.0,M,,*7E
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,2.1*3F
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,43*7B
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,184422,A,4124.7464,N,08152.2634,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184422,4124.7464,N,08152.2634,W,2,04,4.1,245.0,M,-34.0,M,,*7D
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,2.6*38
+$GPGSV,3,1,12,02,73,332,37,04,46,060,00,05,41,257,39,06,06,308,00*79
+$PGRME,10.0,M,17.4,M,20.1,M*1E
+$PGRMM,WGS 84*06
+$GPRMC,184423,A,4124.7464,N,08152.2634,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184423,4124.7464,N,08152.2634,W,2,04,10.4,245.1,M,-34.0,M,,*4D
+$GPGSA,A,3,02,,,,07,10,,,,,,35,13.7,10.4,1.0*31
+$GPGSV,3,2,12,07,16,128,39,10,49,198,45,13,21,063,00,23,08,037,00*7E
+$PGRME,10.0,M,17.4,M,20.1,M*1E
+$PGRMM,WGS 84*06
+$GPRMC,184424,A,4124.7464,N,08152.2633,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184424,4124.7464,N,08152.2633,W,2,04,4.1,244.5,M,-34.0,M,,*78
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,1.6*3B
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,10.4,M,18.1,M,20.8,M*19
+$PGRMM,WGS 84*06
+$GPRMC,184425,A,4124.7465,N,08152.2633,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184425,4124.7465,N,08152.2633,W,2,04,4.4,244.6,M,-34.0,M,,*7E
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.2,4.4,1.0*34
+$GPGSV,3,1,12,02,73,332,36,04,46,060,00,05,41,257,40,06,06,308,00*76
+$PGRME,12.7,M,18.1,M,22.5,M*17
+$PGRMM,WGS 84*06
+$GPRMC,184426,A,4124.7465,N,08152.2632,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184426,4124.7465,N,08152.2632,W,2,04,10.7,244.7,M,-34.0,M,,*4B
+$GPGSA,A,3,02,,,,07,10,,,,,,35,13.0,10.7,1.0*35
+$GPGSV,3,2,12,07,16,128,40,10,49,198,44,13,21,063,00,23,08,037,00*71
+$PGRME,12.7,M,18.1,M,22.5,M*17
+$PGRMM,WGS 84*06
+$GPRMC,184427,A,4124.7465,N,08152.2632,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184427,4124.7465,N,08152.2632,W,2,04,4.1,243.9,M,-34.0,M,,*70
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,1.6*3B
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,12.7,M,18.7,M,23.0,M*15
+$PGRMM,WGS 84*06
+$GPRMC,184428,A,4124.7466,N,08152.2631,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184428,4124.7466,N,08152.2631,W,2,04,4.1,243.4,M,-34.0,M,,*72
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,2.1*3F
+$GPGSV,3,1,12,02,73,332,36,04,46,060,00,05,41,257,40,06,06,308,00*76
+$PGRME,12.8,M,19.2,M,23.5,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184429,A,4124.7466,N,08152.2632,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184429,4124.7466,N,08152.2632,W,2,04,4.1,242.9,M,-34.0,M,,*7C
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,2.6*38
+$GPGSV,3,2,12,07,16,128,42,10,49,198,44,13,21,063,00,23,08,037,00*73
+$PGRME,12.8,M,19.2,M,23.5,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184430,A,4124.7466,N,08152.2631,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184430,4124.7466,N,08152.2631,W,2,04,4.1,242.9,M,-34.0,M,,*77
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,2.6*38
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,43*75
+$PGRME,12.8,M,19.2,M,23.5,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184431,A,4124.7466,N,08152.2630,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184431,4124.7466,N,08152.2630,W,2,04,10.5,243.1,M,-34.0,M,,*4F
+$GPGSA,A,3,02,,,,07,10,,,,,,35,13.7,10.5,1.0*30
+$GPGSV,3,1,12,02,73,332,36,04,46,060,00,05,41,257,39,06,06,308,00*78
+$PGRME,12.8,M,19.2,M,23.5,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184432,A,4124.7467,N,08152.2630,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184432,4124.7467,N,08152.2630,W,2,04,7.2,243.2,M,-34.0,M,,*7F
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.2,7.2,1.0*31
+$GPGSV,3,2,12,07,16,128,42,10,49,198,43,13,21,063,00,23,08,037,00*74
+$PGRME,14.9,M,19.2,M,25.1,M*1E
+$PGRMM,WGS 84*06
+$GPRMC,184433,A,4124.7467,N,08152.2630,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184433,4124.7467,N,08152.2630,W,2,04,7.2,243.3,M,-34.0,M,,*7F
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.2,7.2,1.0*31
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184434,A,4124.7467,N,08152.2630,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184434,4124.7467,N,08152.2630,W,2,04,4.1,243.4,M,-34.0,M,,*7F
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.3,4.1,1.6*36
+$GPGSV,3,1,12,02,73,332,36,04,46,060,00,05,41,257,39,06,06,308,00*78
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184435,A,4124.7467,N,08152.2630,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184435,4124.7467,N,08152.2630,W,2,04,4.1,243.4,M,-34.0,M,,*7E
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.3,4.1,1.6*36
+$GPGSV,3,2,12,07,16,128,42,10,49,198,42,13,21,063,00,23,08,037,00*75
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184436,A,4124.7468,N,08152.2630,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184436,4124.7468,N,08152.2630,W,2,04,4.1,243.1,M,-34.0,M,,*77
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.3,4.1,1.6*36
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184437,A,4124.7468,N,08152.2629,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184437,4124.7468,N,08152.2629,W,2,04,4.1,242.6,M,-34.0,M,,*78
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.3,4.1,1.6*36
+$GPGSV,3,1,12,02,73,332,36,04,46,060,00,05,41,257,39,06,06,308,00*78
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184438,A,4124.7468,N,08152.2628,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184438,4124.7468,N,08152.2628,W,2,04,4.1,242.8,M,-34.0,M,,*78
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.3,4.1,1.6*36
+$GPGSV,3,2,12,07,16,128,41,10,49,198,42,13,21,063,00,23,08,037,00*76
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184439,A,4124.7468,N,08152.2628,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184439,4124.7468,N,08152.2628,W,2,04,4.1,242.7,M,-34.0,M,,*76
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.3,4.1,1.6*36
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,43*7B
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184440,A,4124.7468,N,08152.2627,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184440,4124.7468,N,08152.2627,W,2,04,4.1,242.7,M,-34.0,M,,*77
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.3,4.1,1.6*36
+$GPGSV,3,1,12,02,73,332,35,04,46,060,00,05,41,257,37,06,06,308,00*75
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184441,A,4124.7469,N,08152.2627,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184441,4124.7469,N,08152.2627,W,2,04,4.1,242.6,M,-34.0,M,,*76
+$GPGSA,A,2,02,,,,07,10,,,,,,35,7.3,4.1,1.6*37
+$GPGSV,3,2,12,07,16,128,41,10,49,198,42,13,21,063,00,23,08,037,00*76
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184442,A,4124.7469,N,08152.2627,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184442,4124.7469,N,08152.2627,W,2,04,4.1,242.2,M,-34.0,M,,*71
+$GPGSA,A,2,02,,,,07,10,,,,,,35,7.3,4.1,1.6*37
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,43*7B
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184443,A,4124.7469,N,08152.2627,W,000.0,348.3,010305,007.9,W*7D
+$GPGGA,184443,4124.7469,N,08152.2627,W,2,04,4.1,241.8,M,-34.0,M,,*79
+$GPGSA,A,2,02,,,,07,10,,,,,,35,7.3,4.1,1.6*37
+$GPGSV,3,1,12,02,73,332,34,04,46,060,00,05,41,257,38,06,06,308,00*7B
+$PGRME,8.9,M,15.0,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184444,A,4124.7469,N,08152.2626,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184444,4124.7469,N,08152.2626,W,2,04,4.1,240.9,M,-34.0,M,,*7F
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.4,4.1,2.1*35
+$GPGSV,3,2,12,07,16,128,40,10,49,198,42,13,21,063,00,23,08,036,00*76
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184445,A,4124.7469,N,08152.2627,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184445,4124.7469,N,08152.2627,W,2,04,4.1,239.5,M,-34.0,M,,*7D
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.4,4.1,2.1*35
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,43*7B
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184446,A,4124.7470,N,08152.2627,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184446,4124.7470,N,08152.2627,W,2,04,4.1,238.9,M,-34.0,M,,*7B
+$GPGSA,A,3,02,,,,07,10,,,,,,35,7.4,4.1,2.1*35
+$GPGSV,3,1,12,02,73,332,33,04,46,060,00,05,41,257,38,06,06,308,00*7C
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184447,A,4124.7470,N,08152.2626,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184447,4124.7470,N,08152.2626,W,2,04,10.6,238.8,M,-34.0,M,,*48
+$GPGSA,A,3,02,,,,07,10,,,,,,35,13.2,10.6,1.0*36
+$GPGSV,3,2,12,07,16,128,40,10,49,198,42,13,21,063,00,23,08,036,00*76
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184448,A,4124.7470,N,08152.2626,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184448,4124.7470,N,08152.2626,W,2,04,15.8,238.8,M,-34.0,M,,*4C
+$GPGSA,A,3,02,,,,07,10,,,,,,35,17.9,15.8,1.0*32
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,44*7C
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184449,A,4124.7470,N,08152.2626,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184449,4124.7470,N,08152.2626,W,2,04,15.8,238.7,M,-34.0,M,,*42
+$GPGSA,A,3,02,,,,07,10,,,,,,35,17.9,15.8,1.0*32
+$GPGSV,3,1,12,02,73,332,33,04,46,060,00,05,41,257,38,06,06,308,00*7C
+$PGRME,9.3,M,15.9,M,18.4,M*24
+$PGRMM,WGS 84*06
+$GPRMC,184450,A,4124.7471,N,08152.2626,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184450,4124.7471,N,08152.2626,W,2,04,4.1,236.5,M,-34.0,M,,*7E
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,1.6*3B
+$GPGSV,3,2,12,07,16,128,40,10,49,198,41,13,21,063,00,23,08,036,00*75
+$PGRME,9.7,M,16.7,M,19.3,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,184451,A,4124.7471,N,08152.2626,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184451,4124.7471,N,08152.2626,W,2,04,4.1,235.1,M,-34.0,M,,*78
+$GPGSA,A,3,02,,,,07,10,,,,,,35,8.1,4.1,2.1*3F
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,10.1,M,17.4,M,20.1,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184452,A,4124.7471,N,08152.2626,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184452,4124.7471,N,08152.2626,W,2,04,10.6,235.0,M,-34.0,M,,*48
+$GPGSA,A,3,02,,,,07,10,,,,,,35,13.8,10.6,1.0*3C
+$GPGSV,3,1,12,02,73,332,00,04,46,060,00,05,41,257,39,06,06,308,00*7D
+$PGRME,10.1,M,17.4,M,20.1,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184453,A,4124.7471,N,08152.2626,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184453,4124.7471,N,08152.2626,W,2,04,15.8,235.0,M,-34.0,M,,*42
+$GPGSA,A,3,02,,,,07,10,,,,,,35,18.4,15.8,1.0*30
+$GPGSV,3,2,12,07,16,128,41,10,49,198,41,13,21,063,00,23,08,036,00*74
+$PGRME,10.1,M,17.4,M,20.1,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184454,A,4124.7471,N,08152.2625,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184454,4124.7471,N,08152.2625,W,2,04,20.1,234.9,M,-34.0,M,,*41
+$GPGSA,A,3,02,,,,07,10,,,,,,35,22.2,20.1,1.0*30
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,44*7C
+$PGRME,10.1,M,17.4,M,20.1,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184455,A,4124.7471,N,08152.2625,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184455,4124.7471,N,08152.2625,W,2,04,23.5,234.9,M,-34.0,M,,*47
+$GPGSA,A,3,02,,,,07,10,,,,,,35,25.2,23.5,1.0*30
+$GPGSV,3,1,12,02,73,332,00,04,46,060,00,05,41,257,38,06,06,308,00*7C
+$PGRME,10.1,M,17.4,M,20.1,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184456,A,4124.7471,N,08152.2625,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184456,4124.7471,N,08152.2625,W,2,04,26.3,234.9,M,-34.0,M,,*47
+$GPGSA,A,3,02,,,,07,10,,,,,,35,27.7,26.3,1.0*34
+$GPGSV,3,2,12,07,16,128,41,10,49,198,40,13,21,063,00,23,08,036,00*75
+$PGRME,10.1,M,17.4,M,20.1,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184457,A,4124.7472,N,08152.2625,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184457,4124.7472,N,08152.2625,W,2,04,28.6,234.9,M,-34.0,M,,*4E
+$GPGSA,A,3,02,,,,07,10,,,,,,35,29.7,28.6,1.0*31
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,44*7C
+$PGRME,10.1,M,17.4,M,20.1,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184458,A,4124.7472,N,08152.2625,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184458,4124.7472,N,08152.2625,W,2,04,30.5,234.9,M,-34.0,M,,*4B
+$GPGSA,A,3,02,,,,07,10,,,,,,35,31.4,30.5,1.0*31
+$GPGSV,3,1,12,02,73,332,00,04,46,060,00,05,41,257,38,06,06,308,00*7C
+$PGRME,10.1,M,17.4,M,20.1,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184459,A,4124.7472,N,08152.2625,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184459,4124.7472,N,08152.2625,W,2,04,32.0,234.8,M,-34.0,M,,*4C
+$GPGSA,A,3,02,,,,07,10,,,,,,35,32.7,32.0,1.0*36
+$GPGSV,3,2,12,07,16,128,41,10,49,198,41,13,21,063,00,23,08,036,00*74
+$PGRME,10.1,M,17.4,M,20.1,M*1F
+$PGRMM,WGS 84*06
+$GPRMC,184500,A,4124.7472,N,08152.2624,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184500,4124.7472,N,08152.2624,W,2,04,4.2,234.5,M,-34.0,M,,*7A
+$GPGSA,A,3,,04,,,07,10,,,,,,35,8.0,4.2,1.6*3F
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,39,35,34,141,44*7C
+$PGRME,10.4,M,17.9,M,20.7,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184501,A,4124.7472,N,08152.2624,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184501,4124.7472,N,08152.2624,W,2,04,4.2,233.5,M,-34.0,M,,*7C
+$GPGSA,A,3,,04,,,07,10,,,,,,35,8.0,4.2,2.1*3B
+$GPGSV,3,1,12,02,73,332,00,04,46,060,35,05,41,257,37,06,06,308,00*75
+$PGRME,10.4,M,17.9,M,20.7,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184502,A,4124.7473,N,08152.2625,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184502,4124.7473,N,08152.2625,W,2,04,4.4,233.4,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,07,10,,,,,,35,6.3,4.4,1.0*32
+$GPGSV,3,2,12,07,16,128,40,10,49,198,42,13,21,063,00,23,08,036,00*76
+$PGRME,12.5,M,17.9,M,22.2,M*15
+$PGRMM,WGS 84*06
+$GPRMC,184503,A,4124.7473,N,08152.2624,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184503,4124.7473,N,08152.2624,W,2,04,4.4,233.5,M,-34.0,M,,*79
+$GPGSA,A,3,,04,,,07,10,,,,,,35,6.3,4.4,1.0*32
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,12.6,M,18.3,M,22.6,M*17
+$PGRMM,WGS 84*06
+$GPRMC,184504,A,4124.7473,N,08152.2624,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184504,4124.7473,N,08152.2624,W,2,04,4.2,233.5,M,-34.0,M,,*78
+$GPGSA,A,3,,04,,,07,10,,,,,,35,6.5,4.2,1.6*34
+$GPGSV,3,1,12,02,73,332,00,04,46,060,35,05,41,257,37,06,06,308,00*75
+$PGRME,12.6,M,18.3,M,22.6,M*17
+$PGRMM,WGS 84*06
+$GPRMC,184505,A,4124.7473,N,08152.2624,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184505,4124.7473,N,08152.2624,W,2,04,4.2,233.3,M,-34.0,M,,*7F
+$GPGSA,A,3,,04,,,07,10,,,,,,35,6.5,4.2,1.6*34
+$GPGSV,3,2,12,07,16,128,40,10,49,198,43,13,21,063,00,23,08,036,00*77
+$PGRME,12.6,M,18.3,M,22.6,M*17
+$PGRMM,WGS 84*06
+$GPRMC,184506,A,4124.7473,N,08152.2623,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184506,4124.7473,N,08152.2623,W,2,04,10.7,233.2,M,-34.0,M,,*4A
+$GPGSA,A,3,,04,,,07,10,,,,,,35,12.6,10.7,1.0*34
+$GPGSV,3,3,12,24,14,070,00,30,31,299,00,33,09,106,40,35,34,141,44*72
+$PGRME,12.6,M,18.3,M,22.6,M*17
+$PGRMM,WGS 84*06
+$GPRMC,184507,A,4124.7473,N,08152.2623,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184507,4124.7473,N,08152.2623,W,2,04,4.2,232.2,M,-34.0,M,,*7A
+$GPGSA,A,3,,04,,,07,10,,,,,,35,8.0,4.2,1.6*3F
+$GPGSV,3,1,12,02,73,332,00,04,46,060,35,05,41,257,37,06,06,308,00*75
+$PGRME,12.7,M,18.7,M,22.9,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,184508,A,4124.7472,N,08152.2622,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184508,4124.7472,N,08152.2622,W,2,04,4.2,232.0,M,-34.0,M,,*77
+$GPGSA,A,3,,04,,,07,10,,,,,,35,8.0,4.2,2.1*3B
+$GPGSV,3,2,12,07,16,128,40,10,49,198,44,13,21,063,00,23,08,036,00*70
+$PGRME,12.7,M,18.7,M,22.9,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,184509,A,4124.7473,N,08152.2622,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184509,4124.7473,N,08152.2622,W,2,04,4.2,231.6,M,-34.0,M,,*72
+$GPGSA,A,3,,04,,,07,10,,,,,,35,8.0,4.2,2.1*3B
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,44*7D
+$PGRME,12.7,M,18.7,M,22.9,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,184510,A,4124.7472,N,08152.2622,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184510,4124.7472,N,08152.2622,W,1,04,4.2,232.0,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,07,10,,,,,,35,8.0,4.2,2.1*3B
+$GPGSV,3,1,12,02,73,332,00,04,46,060,35,05,41,257,38,06,06,308,00*7A
+$PGRME,12.7,M,18.7,M,22.9,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,184511,A,4124.7472,N,08152.2621,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184511,4124.7472,N,08152.2621,W,1,04,10.7,232.4,M,-34.0,M,,*4B
+$GPGSA,A,3,,04,,,07,10,,,,,,35,13.8,10.7,1.0*3B
+$GPGSV,3,2,12,07,16,128,41,10,49,198,44,13,21,063,00,23,08,036,00*71
+$PGRME,12.7,M,18.7,M,22.9,M*1D
+$PGRMM,WGS 84*06
+$GPRMC,184512,A,4124.7472,N,08152.2621,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184512,4124.7472,N,08152.2621,W,1,04,4.2,232.5,M,-34.0,M,,*79
+$GPGSA,A,3,,04,,,07,10,,,,,,35,8.0,4.2,1.6*3F
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,44*73
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184513,A,4124.7473,N,08152.2622,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184513,4124.7473,N,08152.2622,W,1,04,4.2,232.2,M,-34.0,M,,*7D
+$GPGSA,A,3,,04,,,07,10,,,,,,35,8.0,4.2,2.1*3B
+$GPGSV,3,1,12,02,73,332,00,04,46,060,00,05,41,257,38,06,06,308,00*7C
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184514,A,4124.7473,N,08152.2621,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184514,4124.7473,N,08152.2621,W,1,04,10.8,232.4,M,-34.0,M,,*40
+$GPGSA,A,3,,04,,,07,10,,,,,,35,13.8,10.8,1.0*34
+$GPGSV,3,2,12,07,16,128,40,10,49,198,44,13,21,063,00,23,08,036,00*70
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184515,A,4124.7473,N,08152.2621,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184515,4124.7473,N,08152.2621,W,1,04,16.1,232.5,M,-34.0,M,,*4F
+$GPGSA,A,3,,04,,,07,10,,,,,,35,18.6,16.1,1.0*3E
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,44*73
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184516,A,4124.7473,N,08152.2621,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184516,4124.7473,N,08152.2621,W,1,04,20.4,232.6,M,-34.0,M,,*4F
+$GPGSA,A,3,,04,,,07,10,,,,,,35,22.4,20.4,1.0*35
+$GPGSV,3,1,12,02,73,332,00,04,46,060,00,05,41,257,38,06,06,308,00*7C
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184517,A,4124.7473,N,08152.2621,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184517,4124.7473,N,08152.2621,W,1,04,23.9,232.7,M,-34.0,M,,*41
+$GPGSA,A,3,,04,,,07,10,,,,,,35,25.6,23.9,1.0*3E
+$GPGSV,3,2,12,07,16,128,40,10,49,198,44,13,21,063,00,23,08,036,00*70
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184518,A,4124.7473,N,08152.2621,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184518,4124.7473,N,08152.2621,W,1,04,26.8,232.7,M,-34.0,M,,*4A
+$GPGSA,A,3,,04,,,07,10,,,,,,35,28.1,26.8,1.0*30
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,43*74
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184519,A,4124.7473,N,08152.2621,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184519,4124.7473,N,08152.2621,W,1,04,29.1,232.8,M,-34.0,M,,*42
+$GPGSA,A,3,,04,,,07,10,,,,,,35,30.1,29.1,1.0*3F
+$GPGSV,3,1,12,02,73,332,00,04,46,060,00,05,41,257,38,06,06,308,00*7C
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184520,A,4124.7473,N,08152.2620,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184520,4124.7473,N,08152.2620,W,1,04,30.9,232.8,M,-34.0,M,,*49
+$GPGSA,A,3,,04,,,07,10,,,,,,35,31.8,30.9,1.0*37
+$GPGSV,3,2,12,07,16,128,40,10,49,198,43,13,21,063,36,23,08,036,00*72
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184521,A,4124.7473,N,08152.2620,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184521,4124.7473,N,08152.2620,W,1,04,32.5,232.8,M,-34.0,M,,*46
+$GPGSA,A,3,,04,,,07,10,,,,,,35,33.2,32.5,1.0*31
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,44*73
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184522,A,4124.7473,N,08152.2620,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184522,4124.7473,N,08152.2620,W,1,00,33.7,232.8,M,-34.0,M,,*42
+$GPGSA,A,3,,,,,,,,,,,,,34.3,33.7,1.0*30
+$GPGSV,3,1,12,02,73,332,00,04,46,060,00,05,41,257,38,06,06,308,00*7C
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184523,A,4124.7473,N,08152.2620,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184523,4124.7473,N,08152.2620,W,1,00,34.7,232.9,M,-34.0,M,,*45
+$GPGSA,A,3,,,,,,,,,,,,,35.2,34.7,1.0*37
+$GPGSV,3,2,12,07,16,128,41,10,49,198,42,13,21,063,36,23,08,036,00*72
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184524,A,4124.7473,N,08152.2620,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184524,4124.7473,N,08152.2620,W,1,00,35.5,232.9,M,-34.0,M,,*41
+$GPGSA,A,3,,,,,,,,,,,,,35.9,35.5,1.0*3F
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,43*7A
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184525,A,4124.7473,N,08152.2619,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184525,4124.7473,N,08152.2619,W,1,00,36.2,232.9,M,-34.0,M,,*4E
+$GPGSA,A,3,,,,,,,,,,,,,36.5,36.2,1.0*34
+$GPGSV,3,1,12,02,73,335,00,04,46,060,00,05,41,257,36,06,06,308,00*75
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184526,A,4124.7473,N,08152.2619,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184526,4124.7473,N,08152.2619,W,1,00,36.8,232.9,M,-34.0,M,,*47
+$GPGSA,A,3,,,,,,,,,,,,,37.0,36.8,1.0*3A
+$GPGSV,3,2,12,07,16,128,42,10,49,198,42,13,21,063,35,23,08,036,00*72
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184527,A,4124.7472,N,08152.2619,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184527,4124.7472,N,08152.2619,W,1,00,37.2,232.9,M,-34.0,M,,*4C
+$GPGSA,A,3,,,,,,,,,,,,,37.4,37.2,1.0*35
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,43*7A
+$PGRME,12.7,M,19.1,M,23.3,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184528,A,4124.7473,N,08152.2619,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184528,4124.7473,N,08152.2619,W,2,03,7.2,232.9,M,-34.0,M,,*71
+$GPGSA,A,2,02,,,,07,,,,,,,35,7.3,7.2,1.0*30
+$GPGSV,3,1,12,02,73,335,34,04,46,060,31,05,41,257,37,06,06,308,00*71
+$PGRME,15.0,M,19.1,M,24.9,M*1C
+$PGRMM,WGS 84*06
+$GPRMC,184529,A,4124.7474,N,08152.2617,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184529,4124.7474,N,08152.2617,W,2,04,7.2,233.3,M,-34.0,M,,*75
+$GPGSA,A,2,02,,,,07,10,,,,,,35,7.3,7.2,1.0*31
+$GPGSV,3,2,12,07,16,128,42,10,49,198,42,13,21,063,35,23,08,036,00*72
+$PGRME,9.0,M,14.8,M,17.3,M*2F
+$PGRMM,WGS 84*06
+$GPRMC,184530,A,4124.7474,N,08152.2618,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184530,4124.7474,N,08152.2618,W,2,05,4.2,233.8,M,-34.0,M,,*7B
+$GPGSA,A,2,02,04,,,07,10,,,,,,35,7.9,4.2,1.6*3A
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,43*7A
+$PGRME,9.4,M,15.6,M,18.2,M*2A
+$PGRMM,WGS 84*06
+$GPRMC,184531,A,4124.7474,N,08152.2618,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184531,4124.7474,N,08152.2618,W,2,05,4.1,234.0,M,-34.0,M,,*76
+$GPGSA,A,3,02,04,,,07,10,,,,,,35,7.9,4.1,2.1*3C
+$GPGSV,3,1,12,02,73,335,35,04,45,060,00,05,41,257,37,06,06,308,00*71
+$PGRME,9.8,M,16.4,M,19.1,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184532,A,4124.7473,N,08152.2619,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184532,4124.7473,N,08152.2619,W,2,05,4.1,233.9,M,-34.0,M,,*7D
+$GPGSA,A,3,02,04,,,07,10,,,,,,35,7.9,4.1,2.6*3B
+$GPGSV,3,2,12,07,16,128,42,10,49,198,42,13,21,063,35,23,08,036,00*72
+$PGRME,9.8,M,16.4,M,19.1,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184533,A,4124.7473,N,08152.2618,W,000.0,348.3,010305,007.9,W*7C
+$GPGGA,184533,4124.7473,N,08152.2618,W,2,05,4.1,234.2,M,-34.0,M,,*71
+$GPGSA,A,3,02,04,,,07,10,,,,,,35,7.9,4.1,2.6*3B
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,43*7A
+$PGRME,9.8,M,16.4,M,19.1,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184534,A,4124.7473,N,08152.2618,W,000.0,348.3,010305,007.9,W*7B
+$GPGGA,184534,4124.7473,N,08152.2618,W,2,05,4.2,234.1,M,-34.0,M,,*76
+$GPGSA,A,3,02,04,,,07,10,,,,,,35,7.9,4.2,1.6*3B
+$GPGSV,3,1,12,02,73,335,36,04,45,060,31,05,41,256,37,06,06,308,00*71
+$PGRME,10.1,M,17.0,M,19.8,M*18
+$PGRMM,WGS 84*06
+$GPRMC,184535,A,4124.7473,N,08152.2618,W,000.0,348.3,010305,007.9,W*7A
+$GPGGA,184535,4124.7473,N,08152.2618,W,2,05,4.1,233.6,M,-34.0,M,,*74
+$GPGSA,A,3,02,04,,,07,10,,,,,,35,7.9,4.1,2.1*3C
+$GPGSV,3,2,12,07,16,128,42,10,49,198,42,13,21,063,34,23,08,036,00*73
+$PGRME,10.4,M,17.6,M,20.5,M*1C
+$PGRMM,WGS 84*06
+$GPRMC,184536,A,4124.7473,N,08152.2617,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184536,4124.7473,N,08152.2617,W,2,05,4.1,233.0,M,-34.0,M,,*7E
+$GPGSA,A,3,02,04,,,07,10,,,,,,35,7.9,4.1,2.6*3B
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,43*7A
+$PGRME,10.4,M,17.6,M,20.5,M*1C
+$PGRMM,WGS 84*06
+$GPRMC,184537,A,4124.7472,N,08152.2617,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184537,4124.7472,N,08152.2617,W,2,06,4.1,232.6,M,-34.0,M,,*7A
+$GPGSA,A,3,02,04,,,07,10,13,,,,,35,7.9,4.1,2.6*39
+$GPGSV,3,1,12,02,73,335,38,04,45,060,00,05,41,256,35,06,06,308,00*7F
+$PGRME,10.4,M,16.7,M,19.8,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184538,A,4124.7472,N,08152.2617,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184538,4124.7472,N,08152.2617,W,2,06,4.1,230.4,M,-34.0,M,,*75
+$GPGSA,A,3,02,04,,,07,10,13,,,,,35,7.9,4.1,2.6*39
+$GPGSV,3,2,12,07,16,128,41,10,49,198,41,13,21,063,34,23,08,036,00*73
+$PGRME,10.4,M,16.7,M,19.8,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184539,A,4124.7472,N,08152.2616,W,000.0,348.3,010305,007.9,W*79
+$GPGGA,184539,4124.7472,N,08152.2616,W,2,06,3.6,227.9,M,-34.0,M,,*7E
+$GPGSA,A,3,02,04,,,07,10,13,,,,,35,6.9,3.6,2.9*37
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,44*7D
+$PGRME,10.4,M,16.7,M,19.8,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184540,A,4124.7472,N,08152.2617,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184540,4124.7472,N,08152.2617,W,2,06,4.0,223.3,M,-34.0,M,,*7E
+$GPGSA,A,3,02,04,,,07,10,13,,,,,35,6.9,4.0,1.0*3C
+$GPGSV,3,1,12,02,73,335,39,04,45,060,00,05,41,256,35,06,07,308,00*7F
+$PGRME,10.4,M,16.7,M,19.8,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184541,A,4124.7472,N,08152.2616,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184541,4124.7472,N,08152.2616,W,2,06,4.0,219.3,M,-34.0,M,,*77
+$GPGSA,A,3,02,04,,,07,10,13,,,,,35,7.0,4.0,1.6*32
+$GPGSV,3,2,12,07,16,128,41,10,49,198,40,13,21,063,33,23,08,036,00*75
+$PGRME,10.4,M,16.7,M,19.8,M*1B
+$PGRMM,WGS 84*06
+$GPRMC,184542,A,4124.7473,N,08152.2615,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184542,4124.7473,N,08152.2615,W,2,06,4.3,219.6,M,-34.0,M,,*70
+$GPGSA,A,3,02,04,,,07,10,13,,,,,35,7.1,4.3,1.0*36
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,43*7A
+$PGRME,10.5,M,14.8,M,18.2,M*1C
+$PGRMM,WGS 84*06
+$GPRMC,184543,A,4124.7473,N,08152.2615,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184543,4124.7473,N,08152.2615,W,2,05,4.3,219.6,M,-34.0,M,,*72
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,7.1,4.3,1.0*32
+$GPGSV,3,1,12,02,73,335,39,04,45,060,00,05,41,256,34,06,07,308,00*7E
+$PGRME,7.9,M,12.5,M,14.8,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,184544,A,4124.7472,N,08152.2616,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184544,4124.7472,N,08152.2616,W,2,05,4.1,219.5,M,-34.0,M,,*76
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,7.2,4.1,1.6*35
+$GPGSV,3,2,12,07,15,129,42,10,49,198,41,13,21,063,00,23,08,036,00*75
+$PGRME,7.9,M,12.5,M,14.8,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,184545,A,4124.7472,N,08152.2616,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184545,4124.7472,N,08152.2616,W,2,05,4.1,219.5,M,-34.0,M,,*77
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,7.2,4.1,2.1*31
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,43*74
+$PGRME,8.4,M,13.6,M,16.0,M*21
+$PGRMM,WGS 84*06
+$GPRMC,184546,A,4124.7472,N,08152.2616,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184546,4124.7472,N,08152.2616,W,2,05,4.1,220.1,M,-34.0,M,,*7A
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,7.3,4.1,2.6*37
+$GPGSV,3,1,12,02,73,335,38,04,45,060,00,05,41,256,33,06,07,308,00*78
+$PGRME,8.4,M,13.6,M,16.0,M*21
+$PGRMM,WGS 84*06
+$GPRMC,184547,A,4124.7472,N,08152.2616,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184547,4124.7472,N,08152.2616,W,2,05,4.1,221.0,M,-34.0,M,,*7B
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,7.3,4.1,2.6*37
+$GPGSV,3,2,12,07,15,129,42,10,49,198,42,13,21,063,00,23,08,036,00*76
+$PGRME,8.4,M,13.6,M,16.0,M*21
+$PGRMM,WGS 84*06
+$GPRMC,184548,A,4124.7472,N,08152.2616,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184548,4124.7472,N,08152.2616,W,2,05,4.1,221.7,M,-34.0,M,,*73
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,7.3,4.1,2.6*37
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,44*7D
+$PGRME,8.4,M,13.6,M,16.0,M*21
+$PGRMM,WGS 84*06
+$GPRMC,184549,A,4124.7473,N,08152.2616,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184549,4124.7473,N,08152.2616,W,2,05,3.8,222.1,M,-34.0,M,,*78
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,7.4,3.8,3.0*39
+$GPGSV,3,1,12,02,73,335,37,04,45,060,00,05,41,256,34,06,07,308,00*70
+$PGRME,8.8,M,14.7,M,17.1,M*2B
+$PGRMM,WGS 84*06
+$GPRMC,184550,A,4124.7472,N,08152.2615,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184550,4124.7472,N,08152.2615,W,2,05,3.8,224.1,M,-34.0,M,,*74
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,7.4,3.8,3.4*3D
+$GPGSV,3,2,12,07,15,129,43,10,49,198,41,13,21,063,35,23,08,036,00*72
+$PGRME,9.0,M,14.9,M,17.4,M*29
+$PGRMM,WGS 84*06
+$GPRMC,184551,A,4124.7472,N,08152.2615,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184551,4124.7472,N,08152.2615,W,2,05,3.8,224.9,M,-34.0,M,,*7D
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,7.4,3.8,3.4*3D
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,44*7D
+$PGRME,9.3,M,15.8,M,18.4,M*25
+$PGRMM,WGS 84*06
+$GPRMC,184552,A,4124.7472,N,08152.2615,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184552,4124.7472,N,08152.2615,W,2,05,2.1,225.4,M,-34.0,M,,*7A
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,2.3,2.1,1.0*31
+$GPGSV,3,1,12,02,73,335,36,04,45,060,00,05,41,256,35,06,07,308,00*70
+$PGRME,9.5,M,15.9,M,18.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184553,A,4124.7472,N,08152.2615,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184553,4124.7472,N,08152.2615,W,2,05,2.2,225.5,M,-34.0,M,,*79
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,2.7,2.2,1.5*33
+$GPGSV,3,2,12,07,15,129,42,10,50,199,41,13,21,063,35,23,08,036,00*7A
+$PGRME,9.5,M,15.9,M,18.5,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184554,A,4124.7472,N,08152.2615,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184554,4124.7472,N,08152.2615,W,2,05,2.4,225.8,M,-34.0,M,,*75
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,3.3,2.4,2.0*36
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,39,35,34,141,44*7D
+$PGRME,9.8,M,16.7,M,19.4,M*23
+$PGRMM,WGS 84*06
+$GPRMC,184555,A,4124.7472,N,08152.2615,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184555,4124.7472,N,08152.2615,W,2,05,2.4,225.6,M,-34.0,M,,*7A
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,3.3,2.4,2.0*36
+$GPGSV,3,1,12,02,73,335,37,04,45,060,00,05,41,256,34,06,07,308,00*70
+$PGRME,9.8,M,16.6,M,19.4,M*22
+$PGRMM,WGS 84*06
+$GPRMC,184556,A,4124.7471,N,08152.2614,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184556,4124.7471,N,08152.2614,W,2,05,2.5,226.2,M,-34.0,M,,*7D
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,3.7,2.5,2.5*36
+$GPGSV,3,2,12,07,15,129,42,10,50,199,39,13,21,063,00,23,08,036,00*73
+$PGRME,10.2,M,17.3,M,20.2,M*18
+$PGRMM,WGS 84*06
+$GPRMC,184557,A,4124.7472,N,08152.2613,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184557,4124.7472,N,08152.2613,W,2,05,3.0,226.3,M,-34.0,M,,*7D
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,4.1,3.0,1.0*35
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,44*73
+$PGRME,12.6,M,17.3,M,22.0,M*1E
+$PGRMM,WGS 84*06
+$GPRMC,184558,A,4124.7471,N,08152.2613,W,000.0,348.3,010305,007.9,W*78
+$GPGGA,184558,4124.7471,N,08152.2613,W,2,05,3.0,223.6,M,-34.0,M,,*71
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,4.1,3.0,1.0*35
+$GPGSV,3,1,12,02,73,335,38,04,45,060,00,05,41,256,00,06,07,308,00*78
+$PGRME,10.5,M,16.6,M,19.7,M*14
+$PGRMM,WGS 84*06
+$GPRMC,184559,A,4124.7471,N,08152.2614,W,000.0,348.3,010305,007.9,W*7E
+$GPGGA,184559,4124.7471,N,08152.2614,W,2,05,3.1,224.2,M,-34.0,M,,*75
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,4.5,3.1,1.6*36
+$GPGSV,3,2,12,07,15,129,42,10,50,199,39,13,21,063,33,23,08,036,00*73
+$PGRME,10.8,M,17.3,M,20.4,M*14
+$PGRMM,WGS 84*06
+$GPRMC,184600,A,4124.7471,N,08152.2614,W,000.0,348.3,010305,007.9,W*71
+$GPGGA,184600,4124.7471,N,08152.2614,W,2,05,3.2,224.2,M,-34.0,M,,*79
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,4.8,3.2,2.1*3C
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,43*74
+$PGRME,11.0,M,17.9,M,21.1,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184601,A,4124.7471,N,08152.2613,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184601,4124.7471,N,08152.2613,W,2,05,3.3,224.3,M,-34.0,M,,*7F
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,5.1,3.3,2.6*32
+$GPGSV,3,1,12,02,73,335,38,04,45,060,00,05,41,256,00,06,07,308,00*78
+$PGRME,11.0,M,17.9,M,21.1,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184602,A,4124.7471,N,08152.2613,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184602,4124.7471,N,08152.2613,W,2,05,3.3,224.2,M,-34.0,M,,*7D
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,5.1,3.3,2.6*32
+$GPGSV,3,2,12,07,15,129,42,10,50,199,38,13,21,063,32,23,08,036,00*73
+$PGRME,11.0,M,17.9,M,21.1,M*13
+$PGRMM,WGS 84*06
+$GPRMC,184603,A,4124.7471,N,08152.2613,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184603,4124.7471,N,08152.2613,W,2,05,3.7,224.7,M,-34.0,M,,*7D
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,5.4,3.7,1.0*36
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,43*74
+$PGRME,11.1,M,15.5,M,19.2,M*14
+$PGRMM,WGS 84*06
+$GPRMC,184604,A,4124.7471,N,08152.2613,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184604,4124.7471,N,08152.2613,W,2,05,3.7,220.1,M,-34.0,M,,*78
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,5.4,3.7,1.0*36
+$GPGSV,3,1,12,02,73,335,38,04,45,060,00,05,41,256,00,06,07,308,00*78
+$PGRME,10.5,M,15.6,M,19.2,M*12
+$PGRMM,WGS 84*06
+$GPRMC,184605,A,4124.7471,N,08152.2613,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184605,4124.7471,N,08152.2613,W,2,05,3.8,219.7,M,-34.0,M,,*7A
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,5.6,3.8,1.6*3D
+$GPGSV,3,2,12,07,15,129,41,10,50,199,39,13,21,062,32,23,08,036,00*70
+$PGRME,10.8,M,16.4,M,20.0,M*16
+$PGRMM,WGS 84*06
+$GPRMC,184606,A,4124.7471,N,08152.2613,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184606,4124.7471,N,08152.2613,W,2,05,4.1,219.9,M,-34.0,M,,*79
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,5.8,4.1,1.0*3B
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,43*74
+$PGRME,10.8,M,16.4,M,20.0,M*16
+$PGRMM,WGS 84*06
+$GPRMC,184607,A,4124.7471,N,08152.2612,W,000.0,348.3,010305,007.9,W*70
+$GPGGA,184607,4124.7471,N,08152.2612,W,2,05,4.1,221.0,M,-34.0,M,,*7B
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.0,4.1,1.6*36
+$GPGSV,3,1,12,02,73,335,38,04,45,060,00,05,41,256,00,06,07,308,00*78
+$PGRME,10.5,M,16.4,M,19.7,M*16
+$PGRMM,WGS 84*06
+$GPRMC,184608,A,4124.7471,N,08152.2612,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184608,4124.7471,N,08152.2612,W,2,05,4.1,221.4,M,-34.0,M,,*70
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.0,4.1,1.6*36
+$GPGSV,3,2,12,07,15,129,41,10,50,199,40,13,21,062,33,23,08,036,00*7F
+$PGRME,10.8,M,17.1,M,20.4,M*16
+$PGRMM,WGS 84*06
+$GPRMC,184609,A,4124.7471,N,08152.2613,W,000.0,348.3,010305,007.9,W*7F
+$GPGGA,184609,4124.7471,N,08152.2613,W,2,05,4.4,221.5,M,-34.0,M,,*74
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.1,4.4,1.0*34
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,43*74
+$PGRME,10.8,M,15.0,M,18.6,M*1C
+$PGRMM,WGS 84*06
+$GPRMC,184610,A,4124.7471,N,08152.2612,W,000.0,348.3,010305,007.9,W*76
+$GPGGA,184610,4124.7471,N,08152.2612,W,2,05,4.7,223.8,M,-34.0,M,,*71
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.3,4.7,1.0*35
+$GPGSV,3,1,12,02,73,335,38,04,45,060,36,05,41,256,00,06,07,308,00*7D
+$PGRME,10.5,M,15.2,M,18.7,M*12
+$PGRMM,WGS 84*06
+$GPRMC,184611,A,4124.7471,N,08152.2612,W,000.0,348.3,010305,007.9,W*77
+$GPGGA,184611,4124.7471,N,08152.2612,W,2,05,4.7,223.8,M,-34.0,M,,*70
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.3,4.7,1.0*35
+$GPGSV,3,2,12,07,15,129,41,10,50,199,40,13,21,062,34,23,08,036,00*78
+$PGRME,12.7,M,15.2,M,20.4,M*1A
+$PGRMM,WGS 84*06
+$GPRMC,184612,A,4124.7471,N,08152.2612,W,000.0,348.3,010305,007.9,W*74
+$GPGGA,184612,4124.7471,N,08152.2612,W,2,05,5.0,222.5,M,-34.0,M,,*79
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.4,5.0,1.0*34
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,40,35,34,141,43*74
+$PGRME,10.6,M,15.3,M,19.7,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184613,A,4124.7471,N,08152.2612,W,000.0,348.3,010305,007.9,W*75
+$GPGGA,184613,4124.7471,N,08152.2612,W,2,05,3.6,221.2,M,-34.0,M,,*7C
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.4,3.6,1.5*31
+$GPGSV,3,1,12,02,73,335,37,04,45,060,36,05,41,256,33,06,07,308,00*72
+$PGRME,10.6,M,15.3,M,19.7,M*11
+$PGRMM,WGS 84*06
+$GPRMC,184614,A,4124.7471,N,08152.2612,W,000.0,348.3,010305,007.9,W*72
+$GPGGA,184614,4124.7471,N,08152.2612,W,2,05,3.7,222.1,M,-34.0,M,,*7A
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.6,3.7,2.0*34
+$GPGSV,3,2,12,07,15,129,42,10,50,199,41,13,21,062,34,23,08,036,00*7A
+$PGRME,10.8,M,16.1,M,20.4,M*17
+$PGRMM,WGS 84*06
+$GPRMC,184615,A,4124.7471,N,08152.2612,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184615,4124.7471,N,08152.2612,W,2,05,3.7,223.9,M,-34.0,M,,*72
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.7,3.7,2.5*30
+$GPGSV,3,3,12,24,14,070,00,30,31,298,00,33,09,106,41,35,34,141,44*72
+$PGRME,11.0,M,16.9,M,21.1,M*12
+$PGRMM,WGS 84*06
+$GPRMC,184616,A,4124.7471,N,08152.2611,W,000.0,348.3,010305,007.9,W*73
+$GPGGA,184616,4124.7471,N,08152.2611,W,2,05,3.7,227.2,M,-34.0,M,,*7D
+$GPGSA,A,3,02,,,,07,10,13,,,,,35,6.8,3.7,3.0*3B
+$GPGSV,3,1,12,02,73,335,36,04,45,060,36,05,41,256,33,06,07,308,00*73
+$PGRME,10.6,M,16.6,M,19.7,M*17
+$PGRMM,WGS 84*06
+$GPRMC,184617,A,4124.7471,N,08152.2610,W,000.3,348.3,010305,007.9,W*70
+$GPGGA,184617,4124.7471,N,08152.2610,W,2
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/resources/data/Garmin-GPS76.txt b/java/net.sf.marineapi.test/resources/data/Garmin-GPS76.txt
new file mode 100644
index 00000000000..e78a80b5805
--- /dev/null
+++ b/java/net.sf.marineapi.test/resources/data/Garmin-GPS76.txt
@@ -0,0 +1 @@
+$GPGSA,A,3,03,05,07,08,10,15,18,19,21,28,,,1.4,0.9,1.1*3A
$GPGSV,3,1,12,03,02,011,37,05,20,210,38,07,14,084,41,08,50,084,48*74
$GPGSV,3,2,12,10,01,189,38,15,55,282,37,18,18,325,40,19,19,032,00*79
$GPGSV,3,3,12,21,07,305,00,28,63,127,47,33,16,220,00,37,28,178,36*72
$GPGLL,6003.9421,N,01940.2829,E,131548,A,A*4B
$GPBOD,,T,,M,,*47
$PGRME,3.7,M,5.6,M,6.7,M*28
$PGRMZ,-6,f,3*30
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131550,A,6003.9425,N,01940.2853,E,2.3,76.6,280510,4.8,E,A*23
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,131550,6003.9425,N,01940.2853,E,1,10,0.9,-1.6,M,21.7,M,,*68
$GPGSA,A,3,03,05,07,08,10,15,18,19,21,28,,,1.4,0.9,1.1*3A
$GPGSV,3,1,12,03,02,011,36,05,20,210,39,07,14,084,41,08,50,084,48*74
$GPGSV,3,2,12,10,01,189,37,15,55,282,38,18,18,325,41,19,19,032,31*7A
$GPGSV,3,3,12,21,07,305,00,28,63,127,47,33,16,220,00,37,28,178,36*72
$GPGLL,6003.9425,N,01940.2853,E,131550,A,A*4B
$GPBOD,,T,,M,,*47
$PGRME,3.3,M,4.9,M,5.9,M*2F
$PGRMZ,-5,f,3*33
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131552,A,6003.9428,N,01940.2876,E,2.1,75.8,280510,4.8,E,A*24
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,131552,6003.9428,N,01940.2876,E,1,10,0.8,-1.4,M,21.7,M,,*63
$GPGSA,A,3,03,05,07,08,10,15,18,19,21,28,,,1.4,0.8,1.1*3B
$GPGSV,3,1,12,03,02,011,36,05,20,210,40,07,14,084,40,08,50,084,48*7B
$GPGSV,3,2,12,10,01,189,38,15,55,282,37,18,18,325,42,19,19,032,33*7B
$GPGSV,3,3,12,21,07,305,00,28,63,127,46,33,16,220,00,37,28,178,00*76
$GPGLL,6003.9428,N,01940.2876,E,131552,A,A*43
$GPBOD,,T,,M,,*47
$PGRME,3.4,M,5.0,M,6.0,M*2A
$PGRMZ,-4,f,3*32
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131554,A,6003.9431,N,01940.2901,E,2.2,76.2,280510,4.8,E,A*21
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,131554,6003.9431,N,01940.2901,E,1,10,0.8,-1.2,M,21.7,M,,*6A
$GPGSA,A,3,03,05,07,08,10,15,18,19,21,28,,,1.3,0.8,1.0*3D
$GPGSV,3,1,12,03,02,011,38,05,20,210,41,07,14,084,39,08,50,084,48*7A
$GPGSV,3,2,12,10,01,189,38,15,55,282,37,18,18,325,42,19,19,032,32*7A
$GPGSV,3,3,12,21,07,305,35,28,63,127,46,33,16,220,00,37,28,178,00*70
$GPGLL,6003.9431,N,01940.2901,E,131554,A,A*4C
$GPBOD,,T,,M,,*47
$PGRME,3.4,M,5.0,M,6.0,M*2A
$PGRMZ,-4,f,3*32
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131556,A,6003.9433,N,01940.2926,E,2.2,81.9,280510,4.8,E,A*27
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,131556,6003.9433,N,01940.2926,E,1,10,0.9,-1.3,M,21.7,M,,*6F
$GPGSA,A,3,03,05,07,08,10,15,18,19,21,28,,,1.4,0.9,1.1*3A
$GPGSV,3,1,12,03,02,011,37,05,20,210,42,07,14,084,39,08,50,084,48*76
$GPGSV,3,2,12,10,01,189,38,15,55,282,38,18,18,325,40,19,19,032,00*76
$GPGSV,3,3,12,21,07,305,38,28,63,127,46,33,16,220,00,37,28,178,00*7D
$GPGLL,6003.9433,N,01940.2926,E,131556,A,A*49
$GPBOD,,T,,M,,*47
$PGRME,3.4,M,5.0,M,6.0,M*2A
$PGRMZ,-4,f,3*32
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131558,A,6003.9436,N,01940.2949,E,2.2,78.0,280510,4.8,E,A*2A
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,131558,6003.9436,N,01940.2949,E,1,10,0.8,-1.5,M,21.7,M,,*6A
$GPGSA,A,3,03,05,07,08,10,15,18,19,21,28,,,1.3,0.8,1.0*3D
$GPGSV,3,1,12,03,02,011,35,05,20,210,43,07,14,084,38,08,50,084,48*74
$GPGSV,3,2,12,10,01,189,39,15,55,282,37,18,18,325,39,19,19,032,00*76
$GPGSV,3,3,12,21,07,305,38,28,63,127,46,33,16,220,00,37,28,178,00*7D
$GPGLL,6003.9436,N,01940.2949,E,131558,A,A*4B
$GPBOD,,T,,M,,*47
$PGRME,3.3,M,4.7,M,5.8,M*20
$PGRMZ,-5,f,3*33
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131600,A,6003.9438,N,01940.2973,E,2.1,79.9,280510,4.8,E,A*28
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,131600,6003.9438,N,01940.2973,E,1,10,0.8,-1.3,M,21.7,M,,*65
$GPGSA,A,3,03,05,07,08,10,15,18,19,21,28,,,1.4,0.8,1.1*3B
$GPGSV,3,1,12,03,02,011,35,05,20,210,43,07,14,084,37,08,50,084,48*7B
$GPGSV,3,2,12,10,01,189,39,15,55,282,38,18,18,325,38,19,19,032,39*72
$GPGSV,3,3,12,21,07,305,39,28,63,127,46,33,16,220,00,37,28,178,00*7C
$GPGLL,6003.9438,N,01940.2973,E,131600,A,A*42
$GPBOD,,T,,M,,*47
$PGRME,3.4,M,4.8,M,5.8,M*28
$PGRMZ,-4,f,3*32
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131602,A,6003.9439,N,01940.2996,E,2.1,83.9,280510,4.8,E,A*25
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,131602,6003.9439,N,01940.2996,E,1,10,0.9,-1.4,M,21.7,M,,*6B
$GPGSA,A,3,03,05,07,08,10,15,18,19,21,28,,,1.4,0.9,1.1*3A
$GPGSV,3,1,12,03,02,011,34,05,20,210,43,07,14,084,36,08,50,084,47*74
$GPGSV,3,2,12,10,01,189,39,15,55,282,38,18,18,325,37,19,19,032,37*73
$GPGSV,3,3,12,21,07,305,39,28,63,127,47,33,16,220,00,37,28,178,00*7D
$GPGLL,6003.9439,N,01940.2996,E,131602,A,A*4A
$GPBOD,,T,,M,,*47
$PGRME,3.3,M,4.7,M,5.7,M*2F
$PGRMZ,-4,f,3*32
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/resources/data/Garmin-GPS76_diff.txt b/java/net.sf.marineapi.test/resources/data/Garmin-GPS76_diff.txt
new file mode 100644
index 00000000000..a5b438ec890
--- /dev/null
+++ b/java/net.sf.marineapi.test/resources/data/Garmin-GPS76_diff.txt
@@ -0,0 +1 @@
+$GPGSA,A,3,,05,,08,,,18,19,21,,,,1.7,1.3,1.0*38
$GPGSV,3,1,12,03,01,010,34,05,19,210,43,07,13,084,38,08,49,085,49*72
$GPGSV,3,2,12,10,00,189,00,15,56,281,39,18,19,323,41,19,18,030,00*78
$GPGSV,3,3,12,21,06,304,30,28,63,125,47,33,16,220,00,37,28,178,38*7D
$GPGLL,6003.9499,N,01940.4863,E,131838,A,D*4F
$GPBOD,,T,,M,,*47
$PGRME,6.0,M,11.3,M,12.8,M*20
$PGRMZ,-4,f,3*32
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131840,A,6003.9502,N,01940.4884,E,2.2,72.4,280510,4.8,E,D*25
$GPRMB,A,,,,,,,,,,,,A,D*0E
$GPGGA,131840,6003.9502,N,01940.4884,E,2,05,1.3,-0.8,M,21.7,M,,*6F
$GPGSA,A,3,,05,,08,,,18,19,21,,,,1.7,1.3,1.0*38
$GPGSV,3,1,12,03,01,010,00,05,19,210,41,07,13,084,39,08,49,085,49*76
$GPGSV,3,2,12,10,00,189,00,15,56,281,39,18,19,323,40,19,18,030,37*7D
$GPGSV,3,3,12,21,06,304,30,28,63,125,47,33,16,220,00,37,28,178,37*72
$GPGLL,6003.9502,N,01940.4884,E,131840,A,D*4A
$GPBOD,,T,,M,,*47
$PGRME,6.0,M,11.4,M,13.0,M*2E
$PGRMZ,-3,f,3*35
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131842,A,6003.9505,N,01940.4904,E,1.9,76.3,280510,4.8,E,D*22
$GPRMB,A,,,,,,,,,,,,A,D*0E
$GPGGA,131842,6003.9505,N,01940.4904,E,2,05,1.2,-0.6,M,21.7,M,,*6C
$GPGSA,A,3,,05,,08,,,18,19,21,,,,1.6,1.2,1.0*38
$GPGSV,3,1,12,03,01,010,00,05,19,210,40,07,13,084,38,08,49,085,48*77
$GPGSV,3,2,12,10,00,189,00,15,56,281,40,18,19,323,39,19,18,030,36*7C
$GPGSV,3,3,12,21,06,304,34,28,63,125,47,33,16,220,00,37,28,178,00*72
$GPGLL,6003.9505,N,01940.4904,E,131842,A,D*46
$GPBOD,,T,,M,,*47
$PGRME,5.9,M,11.7,M,13.2,M*25
$PGRMZ,-2,f,3*34
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131844,A,6003.9510,N,01940.4927,E,2.1,75.0,280510,4.8,E,D*2A
$GPRMB,A,,,,,,,,,,,,A,D*0E
$GPGGA,131844,6003.9510,N,01940.4927,E,2,05,1.6,-0.6,M,21.7,M,,*6B
$GPGSA,A,3,,05,,08,,,18,19,21,,,,1.9,1.6,1.0*33
$GPGSV,3,1,12,03,01,010,00,05,19,210,39,07,13,084,37,08,49,085,48*76
$GPGSV,3,2,12,10,00,189,00,15,56,281,40,18,19,323,38,19,18,030,00*78
$GPGSV,3,3,12,21,06,304,35,28,63,124,47,33,16,220,00,37,28,178,00*72
$GPGLL,6003.9510,N,01940.4927,E,131844,A,D*45
$GPBOD,,T,,M,,*47
$PGRME,6.0,M,11.2,M,12.8,M*21
$PGRMZ,-2,f,3*34
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131846,A,6003.9513,N,01940.4948,E,2.1,77.6,280510,4.8,E,D*26
$GPRMB,A,,,,,,,,,,,,A,D*0E
$GPGGA,131846,6003.9513,N,01940.4948,E,2,08,1.4,-0.8,M,21.7,M,,*62
$GPGSA,A,3,,05,07,08,,15,18,19,21,28,,,1.8,1.4,1.1*38
$GPGSV,3,1,12,03,01,010,00,05,19,210,38,07,13,084,36,08,49,085,47*79
$GPGSV,3,2,12,10,00,189,00,15,56,281,41,18,19,323,38,19,18,030,41*7C
$GPGSV,3,3,12,21,06,304,35,28,63,124,48,33,16,220,00,37,28,178,00*7D
$GPGLL,6003.9513,N,01940.4948,E,131846,A,D*4D
$GPBOD,,T,,M,,*47
$PGRME,3.7,M,5.2,M,6.4,M*2F
$PGRMZ,-3,f,3*35
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131848,A,6003.9517,N,01940.4969,E,2.2,67.8,280510,4.8,E,D*23
$GPRMB,A,,,,,,,,,,,,A,D*0E
$GPGGA,131848,6003.9517,N,01940.4969,E,2,08,2.0,-0.3,M,21.7,M,,*67
$GPGSA,A,3,,05,07,08,,15,18,19,21,28,,,2.5,2.0,1.0*30
$GPGSV,3,1,12,03,01,010,00,05,19,210,37,07,13,084,35,08,49,085,47*75
$GPGSV,3,2,12,10,00,189,00,15,56,281,42,18,19,323,37,19,18,030,41*70
$GPGSV,3,3,12,21,06,304,35,28,63,124,47,33,16,220,00,37,28,178,00*72
$GPGLL,6003.9517,N,01940.4969,E,131848,A,D*44
$GPBOD,,T,,M,,*47
$PGRME,4.1,M,5.6,M,6.9,M*27
$PGRMZ,-1,f,3*37
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131850,A,6003.9521,N,01940.4991,E,2.2,69.9,280510,4.8,E,D*27
$GPRMB,A,,,,,,,,,,,,A,D*0E
$GPGGA,131850,6003.9521,N,01940.4991,E,2,08,1.0,-0.1,M,21.7,M,,*6D
$GPGSA,A,3,,05,07,08,,15,18,19,21,28,,,1.7,1.0,1.2*30
$GPGSV,3,1,12,03,01,010,00,05,19,210,37,07,13,084,39,08,49,085,47*79
$GPGSV,3,2,12,10,00,189,00,15,56,281,41,18,19,323,36,19,18,030,40*73
$GPGSV,3,3,12,21,06,304,36,28,63,124,48,33,16,220,00,37,28,178,00*7E
$GPGLL,6003.9521,N,01940.4991,E,131850,A,D*4F
$GPBOD,,T,,M,,*47
$PGRME,3.3,M,4.7,M,5.7,M*2F
$PGRMZ,0,f,3*1B
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,131852,A,6003.9525,N,01940.5014,E,2.2,73.4,280510,4.8,E,A*27
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,131852,6003.9525,N,01940.5014,E,1,08,0.9,-0.2,M,21.7,M,,*66
$GPGSA,A,3,,05,07,08,,15,18,19,21,28,,,1.6,0.9,1.2*39
$GPGSV,3,1,12,03,01,010,00,05,19,210,38,07,13,084,39,08,49,085,46*77
$GPGSV,3,2,12,10,00,189,00,15,56,281,42,18,19,323,38,19,18,030,40*7E
$GPGSV,3,3,12,21,06,304,37,28,63,124,47,33,16,220,00,37,28,178,38*7B
$GPGLL,6003.9525,N,01940.5014,E,131852,A,A*49
$GPBOD,,T,,M,,*47
$PGRME,3.3,M,4.7,M,5.7,M*2F
$PGRMZ,-1,f,3*37
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/resources/data/Garmin-GPS76_goto.txt b/java/net.sf.marineapi.test/resources/data/Garmin-GPS76_goto.txt
new file mode 100644
index 00000000000..f6ddcff8d13
--- /dev/null
+++ b/java/net.sf.marineapi.test/resources/data/Garmin-GPS76_goto.txt
@@ -0,0 +1 @@
+$GPGSA,A,3,02,04,05,07,08,10,13,16,23,,,,2.3,1.4,1.6*38
$GPGSV,3,1,12,02,25,252,45,04,06,214,33,05,39,299,36,07,68,165,45*7E
$GPGSV,3,2,12,08,37,205,43,10,63,258,39,13,47,095,45,16,19,031,37*73
$GPGSV,3,3,12,23,21,097,44,29,06,325,34,37,21,178,44,39,24,173,39*72
$GPGLL,6004.3035,N,01940.9139,E,095200,A,D*45
$GPBOD,54.6,T,49.7,M,Fl.W.3s,*77
$PGRME,3.3,M,4.5,M,5.8,M*22
$PGRMZ,-6,f,3*30
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,095202,A,6004.3030,N,01940.9154,E,1.7,124.6,030610,4.9,E,D*1B
$GPRMB,A,0.03,L,,Fl.W.3s,6004.899,N,01942.501,E,0.993,53.0,0.4,V,D*51
$GPGGA,095202,6004.3030,N,01940.9154,E,2,09,1.3,-2.0,M,21.7,M,,*6A
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,,,,2.2,1.3,1.6*3E
$GPGSV,3,1,12,02,25,252,45,04,06,214,34,05,39,299,36,07,68,165,46*7A
$GPGSV,3,2,12,08,37,205,43,10,63,258,39,13,47,095,45,16,19,031,38*7C
$GPGSV,3,3,12,23,21,097,44,29,06,325,35,37,21,178,44,39,24,173,39*73
$GPGLL,6004.3030,N,01940.9154,E,095202,A,D*49
$GPBOD,54.6,T,49.7,M,Fl.W.3s,*77
$PGRME,3.1,M,4.3,M,5.6,M*28
$PGRMZ,-6,f,3*30
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,095204,A,6004.3024,N,01940.9169,E,1.7,127.0,030610,4.9,E,D*13
$GPRMB,A,0.03,L,,Fl.W.3s,6004.899,N,01942.501,E,0.992,52.9,0.3,V,D*5F
$GPGGA,095204,6004.3024,N,01940.9169,E,2,09,1.3,-1.9,M,21.7,M,,*6D
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,,,,2.2,1.3,1.6*3E
$GPGSV,3,1,12,02,25,252,44,04,06,214,34,05,39,299,00,07,68,165,46*7E
$GPGSV,3,2,12,08,37,205,43,10,63,258,39,13,47,095,45,16,19,031,39*7D
$GPGSV,3,3,12,23,21,097,44,29,06,325,34,37,21,178,44,39,24,173,39*72
$GPGLL,6004.3024,N,01940.9169,E,095204,A,D*44
$GPBOD,54.6,T,49.7,M,Fl.W.3s,*77
$PGRME,3.2,M,4.4,M,5.7,M*2D
$PGRMZ,-6,f,3*30
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,095206,A,6004.3021,N,01940.9176,E,1.7,124.9,030610,4.9,E,D*10
$GPRMB,A,0.03,L,,Fl.W.3s,6004.899,N,01942.501,E,0.992,52.9,0.5,V,D*59
$GPGGA,095206,6004.3021,N,01940.9176,E,2,09,1.6,-2.3,M,21.7,M,,*68
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,,,,2.5,1.6,1.7*3D
$GPGSV,3,1,12,02,25,252,44,04,06,214,33,05,39,299,00,07,68,165,45*7A
$GPGSV,3,2,12,08,37,205,41,10,63,258,39,13,47,095,46,16,19,031,00*76
$GPGSV,3,3,12,23,21,097,43,29,06,325,00,37,21,178,42,39,24,173,39*74
$GPGLL,6004.3021,N,01940.9176,E,095206,A,D*4D
$GPBOD,54.6,T,49.7,M,Fl.W.3s,*77
$PGRME,4.0,M,4.5,M,6.4,M*29
$PGRMZ,-7,f,3*31
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,095208,A,6004.3011,N,01940.9197,E,1.7,131.4,030610,4.9,E,D*1B
$GPRMB,A,0.03,L,,Fl.W.3s,6004.899,N,01942.501,E,0.992,52.8,0.3,V,D*5E
$GPGGA,095208,6004.3011,N,01940.9197,E,2,09,1.7,-2.0,M,21.7,M,,*68
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,,,,2.5,1.7,1.7*3C
$GPGSV,3,1,12,02,25,252,44,04,06,214,00,05,39,299,34,07,68,165,45*7D
$GPGSV,3,2,12,08,37,205,41,10,63,258,39,13,47,095,46,16,19,031,40*72
$GPGSV,3,3,12,23,21,097,42,29,06,325,00,37,21,178,43,39,24,173,40*7A
$GPGLL,6004.3011,N,01940.9197,E,095208,A,D*4F
$GPBOD,54.6,T,49.7,M,Fl.W.3s,*77
$PGRME,3.0,M,4.4,M,5.3,M*2B
$PGRMZ,-6,f,3*30
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,095210,A,6004.3005,N,01940.9210,E,1.6,126.2,030610,4.9,E,D*1A
$GPRMB,A,0.03,L,,Fl.W.3s,6004.899,N,01942.501,E,0.992,52.8,0.2,V,D*5F
$GPGGA,095210,6004.3005,N,01940.9210,E,2,09,1.3,-1.8,M,21.7,M,,*67
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,,,,2.2,1.3,1.7*3F
$GPGSV,3,1,12,02,25,252,44,04,06,214,00,05,39,299,33,07,68,165,45*7A
$GPGSV,3,2,12,08,37,205,42,10,63,258,40,13,47,095,46,16,19,031,42*7D
$GPGSV,3,3,12,23,21,097,42,29,06,325,00,37,21,178,43,39,24,173,40*7A
$GPGLL,6004.3005,N,01940.9210,E,095210,A,D*4F
$GPBOD,54.6,T,49.7,M,Fl.W.3s,*77
$PGRME,3.0,M,4.4,M,5.3,M*2B
$PGRMZ,-6,f,3*30
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,095212,A,6004.2999,N,01940.9223,E,1.7,130.3,030610,4.9,E,D*12
$GPRMB,A,0.03,L,,Fl.W.3s,6004.899,N,01942.501,E,0.992,52.7,0.2,V,D*50
$GPGGA,095212,6004.2999,N,01940.9223,E,2,09,1.3,-1.7,M,21.7,M,,*67
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,,,,2.2,1.3,1.7*3F
$GPGSV,3,1,12,02,25,252,44,04,06,214,00,05,39,299,00,07,68,165,45*7A
$GPGSV,3,2,12,08,37,205,43,10,63,258,40,13,47,095,47,16,19,031,41*7E
$GPGSV,3,3,12,23,21,097,42,29,06,325,31,37,21,178,43,39,24,173,40*78
$GPGLL,6004.2999,N,01940.9223,E,095212,A,D*40
$GPBOD,54.6,T,49.7,M,Fl.W.3s,*77
$PGRME,3.1,M,4.4,M,5.4,M*2D
$PGRMZ,-6,f,3*30
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
$GPRMC,095214,A,6004.2993,N,01940.9236,E,1.8,136.0,030610,4.9,E,D*10
$GPRMB,A,0.03,L,,Fl.W.3s,6004.899,N,01942.501,E,0.991,52.7,0.3,V,D*52
$GPGGA,095214,6004.2993,N,01940.9236,E,2,09,1.4,-1.7,M,21.7,M,,*68
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,,,,2.3,1.4,1.7*39
$GPGSV,3,1,12,02,25,252,44,04,06,214,00,05,39,299,00,07,68,165,45*7A
$GPGSV,3,2,12,08,37,205,43,10,63,258,39,13,47,095,47,16,19,031,40*71
$GPGSV,3,3,12,23,21,097,42,29,06,325,33,37,21,178,44,39,24,173,41*7C
$GPGLL,6004.2993,N,01940.9236,E,095214,A,D*48
$GPBOD,54.6,T,49.7,M,Fl.W.3s,*77
$PGRME,3.2,M,4.5,M,5.5,M*2E
$PGRMZ,-6,f,3*30
$PGRMM,WGS 84*06
$GPRTE,1,1,c,*37
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/resources/data/Garmin-GPS76_route.txt b/java/net.sf.marineapi.test/resources/data/Garmin-GPS76_route.txt
new file mode 100644
index 00000000000..aa01b2040df
--- /dev/null
+++ b/java/net.sf.marineapi.test/resources/data/Garmin-GPS76_route.txt
@@ -0,0 +1 @@
+$GPRMB,A,0.20,R,A003,A002,6004.099,N,01940.515,E,0.310,180.1,-0.3,V,D*68
$GPGGA,094140,6004.4083,N,01940.5157,E,2,10,1.0,0.1,M,21.7,M,,*4B
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,29,,,1.7,1.0,1.3*35
$GPGSV,3,1,12,02,28,256,34,04,10,216,39,05,35,301,00,07,65,172,43*7A
$GPGSV,3,2,12,08,33,205,43,10,61,267,42,13,52,094,49,16,22,035,43*73
$GPGSV,3,3,12,23,27,095,39,29,08,329,37,37,21,178,38,39,24,173,00*7C
$GPGLL,6004.4083,N,01940.5157,E,094140,A,D*4D
$GPBOD,139.7,T,134.9,M,A002,A003*45
$PGRME,2.9,M,4.3,M,5.2,M*25
$PGRMZ,0,f,3*1B
$PGRMM,WGS 84*06
$GPRTE,1,1,c,A003-A001 1,A003,A002,A001*54
$GPRMC,094142,A,6004.4085,N,01940.5176,E,1.8,80.0,030610,4.8,E,D*2F
$GPRMB,A,0.20,R,A003,A002,6004.099,N,01940.515,E,0.310,180.3,-0.5,V,D*6C
$GPGGA,094142,6004.4085,N,01940.5176,E,2,10,1.0,0.1,M,21.7,M,,*4C
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,29,,,1.7,1.0,1.4*32
$GPGSV,3,1,12,02,28,256,34,04,10,216,39,05,35,301,00,07,65,172,42*7B
$GPGSV,3,2,12,08,33,205,44,10,61,267,41,13,52,094,48,16,22,035,43*76
$GPGSV,3,3,12,23,27,095,38,29,08,329,36,37,21,178,38,39,24,173,40*78
$GPGLL,6004.4085,N,01940.5176,E,094142,A,D*4A
$GPBOD,139.7,T,134.9,M,A002,A003*45
$PGRME,3.0,M,4.2,M,5.3,M*2D
$PGRMZ,0,f,3*1B
$PGRMM,WGS 84*06
$GPWPL,6004.407,N,01939.993,E,A003*39
$GPRMC,094144,A,6004.4087,N,01940.5195,E,1.7,74.9,030610,4.8,E,D*2B
$GPRMB,A,0.20,R,A003,A002,6004.099,N,01940.515,E,0.310,180.4,-0.5,V,D*6B
$GPGGA,094144,6004.4087,N,01940.5195,E,2,10,1.2,0.2,M,21.7,M,,*44
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,29,,,1.9,1.2,1.5*3F
$GPGSV,3,1,12,02,28,256,00,04,10,216,38,05,35,301,31,07,65,172,43*7E
$GPGSV,3,2,12,08,33,205,44,10,61,267,41,13,52,094,48,16,22,035,42*77
$GPGSV,3,3,12,23,27,095,38,29,08,329,35,37,21,178,38,39,24,173,39*75
$GPGLL,6004.4087,N,01940.5195,E,094144,A,D*43
$GPBOD,139.7,T,134.9,M,A002,A003*45
$PGRME,3.4,M,4.7,M,5.9,M*26
$PGRMZ,1,f,3*1A
$PGRMM,WGS 84*06
$GPWPL,6004.099,N,01940.515,E,A002*37
$GPRMC,094146,A,6004.4089,N,01940.5214,E,1.7,75.7,030610,4.8,E,D*22
$GPRMB,A,0.20,R,A003,A002,6004.099,N,01940.515,E,0.310,180.6,-0.3,V,D*6F
$GPGGA,094146,6004.4089,N,01940.5214,E,2,10,1.2,0.3,M,21.7,M,,*43
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,29,,,2.0,1.2,1.6*36
$GPGSV,3,1,12,02,28,256,00,04,10,216,37,05,35,301,34,07,65,172,42*75
$GPGSV,3,2,12,08,33,205,44,10,61,267,42,13,52,094,48,16,22,035,40*76
$GPGSV,3,3,12,23,27,095,40,29,08,329,34,37,21,178,38,39,24,173,38*7A
$GPGLL,6004.4089,N,01940.5214,E,094146,A,D*45
$GPBOD,139.7,T,134.9,M,A002,A003*45
$PGRME,3.5,M,4.9,M,6.1,M*22
$PGRMZ,1,f,3*1A
$PGRMM,WGS 84*06
$GPWPL,6003.958,N,01940.872,E,A001*3B
$GPRMC,094148,A,6004.4090,N,01940.5232,E,1.7,79.4,030610,4.8,E,D*2F
$GPRMB,A,0.20,R,A003,A002,6004.099,N,01940.515,E,0.310,180.8,-0.4,V,D*66
$GPGGA,094148,6004.4090,N,01940.5232,E,2,10,1.4,0.5,M,21.7,M,,*41
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,29,,,2.2,1.4,1.7*33
$GPGSV,3,1,12,02,28,256,00,04,10,216,36,05,35,301,35,07,65,172,43*74
$GPGSV,3,2,12,08,33,205,44,10,61,267,42,13,52,094,48,16,22,035,40*76
$GPGSV,3,3,12,23,27,095,39,29,08,329,35,37,21,178,38,39,24,173,37*7A
$GPGLL,6004.4090,N,01940.5232,E,094148,A,D*47
$GPBOD,139.7,T,134.9,M,A002,A003*45
$PGRME,3.6,M,5.1,M,6.3,M*2A
$PGRMZ,2,f,3*19
$PGRMM,WGS 84*06
$GPRTE,1,1,c,A003-A001 1,A003,A002,A001*54
$GPRMC,094150,A,6004.4092,N,01940.5251,E,1.7,76.3,030610,4.8,E,D*29
$GPRMB,A,0.20,R,A003,A002,6004.099,N,01940.515,E,0.310,180.9,-0.3,V,D*60
$GPGGA,094150,6004.4092,N,01940.5251,E,2,10,1.5,0.6,M,21.7,M,,*4D
$GPGSA,A,3,02,04,05,07,08,10,13,16,23,29,,,2.6,1.5,2.1*33
$GPGSV,3,1,12,02,28,256,00,04,10,216,35,05,35,301,35,07,65,172,43*77
$GPGSV,3,2,12,08,33,205,43,10,61,267,41,13,52,094,48,16,22,035,39*7C
$GPGSV,3,3,12,23,27,095,39,29,08,329,35,37,21,178,38,39,24,173,38*75
$GPGLL,6004.4092,N,01940.5251,E,094150,A,D*49
$GPBOD,139.7,T,134.9,M,A002,A003*45
$PGRME,3.6,M,5.4,M,6.5,M*29
$PGRMZ,2,f,3*19
$PGRMM,WGS 84*06
$GPWPL,6004.407,N,01939.993,E,A003*39
$GPRMC,094152,A,6004.4093,N,01940.5271,E,1.8,80.8,030610,4.8,E,D*25
$GPRMB,A,0.21,R,A003,A002,6004.099,N,01940.515,E,0.310,181.1,-0.2,V,D*69
$GPGGA,094152,6004.4093,N,01940.5271,E,2,07,1.5,0.7,M,21.7,M,,*4B
$GPGSA,A,3,,04,05,07,08,10,13,,,29,,,2.6,1.5,2.1*37
$GPGSV,3,1,12,02,28,256,00,04,10,216,34,05,35,301,34,07,65,172,43*77
$GPGSV,3,2,12,08,33,205,43,10,61,267,41,13,52,094,48,16,22,035,40*72
$GPGSV,3,3,12,23,27,095,38,29,08,329,37,37,21,178,38,39,24,173,38*76
$GPGLL,6004.4093,N,01940.5271,E,094152,A,D*48
$GPBOD,139.7,T,134.9,M,A002,A003*45
$PGRME,3.9,M,6.1,M,7.3,M*27
$PGRMZ,2,f,3*19
$PGRMM,WGS 84*06
$GPWPL,6004.099,N,01940.515,E,A002*37
$GPRMC,094154,A,6004.4095,N,01940.5289,E,1.8,82.1,030610,4.8,E,D*29
$GPRMB,A,0.21,R,A003,A002,6004.099,N,01940.515,E,0.311,181.3,-0.3,V,D*6B
$GPGGA,094154,6004.4095,N,01940.5289,E,2,08,1.6,0.7,M,21.7,M,,*40
$GPGSA,A,3,,04,05,07,08,10,13,16,,29,,,2.7,1.6,2.2*31
$GPGSV,3,1,12,02,28,256,00,04,10,216,33,05,35,301,34,07,65,172,43*70
$GPGSV,3,2,12,08,33,205,42,10,61,267,41,13,52,094,48,16,22,035,41*72
$GPGSV,3,3,12,23,26,095,37,29,08,329,36,37,21,178,38,39,24,173,37*76
$GPGLL,6004.4095,N,01940.5289,E,094154,A,D*4F
$GPBOD,139.7,T,134.9,M,A002,A003*45
$PGRME,3.4,M,6.2,M,7.3,M*29
$PGRMZ,2,f,3*19
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/resources/data/Navibe-GM720.txt b/java/net.sf.marineapi.test/resources/data/Navibe-GM720.txt
new file mode 100644
index 00000000000..dcb2453b6c6
--- /dev/null
+++ b/java/net.sf.marineapi.test/resources/data/Navibe-GM720.txt
@@ -0,0 +1,217 @@
+=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2010.02.13 13:08:23 =~=~=~=~=~=~=~=~=~=~=~=
+2,14,52,083,45,07,,,00,05,,,27*71
+$GPGSV,3,3,12,02,,,26,24,,,00,26,30,047,48,06,,,25*43
+$GPRMC,110728,A,6013.0600,N,02453.5376,E,000.0,000.0,130210,,,A*79
+$GPGGA,110729,6013.0599,N,02453.5376,E,1,04,03.4,-00016.6,M,045.5,M,,*63
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,08,03,,,00,19,25,189,51,22,22,075,51,14,52,083,45*44
+$GPGSV,2,2,08,07,,,00,24,,,00,26,30,047,48,06,,,26*4A
+$GPRMC,110729,A,6013.0599,N,02453.5376,E,000.0,000.0,130210,,,A*7B
+$GPGGA,110730,6013.0599,N,02453.5377,E,1,04,03.4,-00016.6,M,045.5,M,,*6A
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,07,03,,,00,19,25,189,51,22,22,075,50,14,52,083,45*4A
+$GPGSV,2,2,07,07,,,00,24,,,00,26,30,047,48,,,,*47
+$GPRMC,110730,A,6013.0599,N,02453.5377,E,000.0,000.0,130210,,,A*72
+$GPGGA,110731,6013.0599,N,02453.5376,E,1,04,03.4,-00016.6,M,045.5,M,,*6A
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,07,03,,,26,19,25,189,51,22,22,075,51,14,52,083,46*4C
+$GPGSV,2,2,07,07,,,26,24,,,26,26,30,047,49,,,,*46
+$GPRMC,110731,A,6013.0599,N,02453.5376,E,000.0,000.0,130210,,,A*72
+$GPGGA,110732,6013.0599,N,02453.5376,E,1,04,03.4,-00016.7,M,045.5,M,,*68
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,3,1,12,03,,,00,11,,,00,19,25,189,51,17,,,00*46
+$GPGSV,3,2,12,22,22,075,51,14,52,083,45,07,,,00,04,,,00*76
+$GPGSV,3,3,12,15,,,00,24,,,00,26,30,047,48,20,,,00*42
+$GPRMC,110732,A,6013.0599,N,02453.5376,E,000.0,000.0,130210,,,A*71
+$GPGGA,110733,6013.0599,N,02453.5375,E,1,04,03.4,-00016.8,M,045.5,M,,*65
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,08,11,,,00,19,25,189,50,17,,,00,22,22,075,51*78
+$GPGSV,2,2,08,14,52,083,44,04,,,00,26,30,047,47,20,,,00*79
+$GPRMC,110733,A,6013.0599,N,02453.5375,E,000.0,000.0,130210,,,A*73
+$GPGGA,110734,6013.0600,N,02453.5374,E,1,04,03.4,-00016.9,M,045.5,M,,*61
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,08,11,60,262,23,19,25,189,50,17,12,327,31,22,22,075,51*7E
+$GPGSV,2,2,08,14,52,083,44,04,,,00,26,30,047,47,20,,,00*79
+$GPRMC,110734,A,6013.0600,N,02453.5374,E,000.0,000.0,130210,,,A*76
+$GPGGA,110735,6013.0600,N,02453.5373,E,1,04,03.4,-00016.9,M,045.5,M,,*67
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,3,1,12,10,,,00,11,60,262,26,19,25,189,50,17,12,327,28*4E
+$GPGSV,3,2,12,22,22,075,51,14,52,083,45,18,,,00,04,,,26*7C
+$GPGSV,3,3,12,23,,,00,13,,,00,26,30,047,48,20,19,247,27*7F
+$GPRMC,110735,A,6013.0600,N,02453.5373,E,000.0,000.0,130210,,,A*70
+$GPGGA,110736,6013.0600,N,02453.5373,E,1,04,03.4,-00016.9,M,045.5,M,,*64
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,05,19,25,189,51,22,22,075,51,14,52,083,45,23,,,27*4E
+$GPGSV,2,2,05,26,30,047,48,,,,,,,,,,,,*44
+$GPRMC,110736,A,6013.0600,N,02453.5373,E,000.0,000.0,130210,,,A*73
+$GPGGA,110737,6013.0600,N,02453.5373,E,1,04,03.4,-00016.8,M,045.5,M,,*64
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,3,1,10,01,,,00,29,,,00,19,25,189,50,12,,,00*49
+$GPGSV,3,2,10,22,22,075,51,14,52,083,44,21,,,00,32,,,00*74
+$GPGSV,3,3,10,23,,,00,26,30,047,48,,,,,,,,*41
+$GPRMC,110737,A,6013.0600,N,02453.5373,E,000.0,000.0,130210,,,A*72
+$GPGGA,110738,6013.0599,N,02453.5373,E,1,04,03.4,-00016.8,M,045.5,M,,*68
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,07,01,,,00,29,,,00,19,25,189,50,22,22,075,51*7B
+$GPGSV,2,2,07,14,52,083,43,32,,,00,26,30,047,48,,,,*79
+$GPRMC,110738,A,6013.0599,N,02453.5373,E,000.0,000.0,130210,,,A*7E
+$GPGGA,110739,6013.0599,N,02453.5374,E,1,04,03.4,-00016.7,M,045.5,M,,*61
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,07,01,,,25,29,,,25,19,25,189,50,22,22,075,51*7B
+$GPGSV,2,2,07,14,52,083,45,32,49,234,27,26,30,047,48,,,,*42
+$GPRMC,110739,A,6013.0599,N,02453.5374,E,000.0,000.0,130210,,,A*78
+$GPGGA,110740,6013.0599,N,02453.5374,E,1,04,03.4,-00016.6,M,045.5,M,,*6E
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,3,1,12,01,,,00,29,,,00,19,25,189,50,09,,,00*41
+$GPGSV,3,2,12,22,22,075,51,14,52,083,44,25,,,00,32,,,00*72
+$GPGSV,3,3,12,08,,,00,27,,,00,26,30,047,49,16,,,00*49
+$GPRMC,110740,A,6013.0599,N,02453.5374,E,000.0,000.0,130210,,,A*76
+$GPGGA,110741,6013.0599,N,02453.5374,E,1,04,03.4,-00016.6,M,045.5,M,,*6F
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,07,19,25,189,50,09,,,00,22,22,075,51,14,52,083,45*40
+$GPGSV,2,2,07,25,,,00,27,,,00,26,30,047,49,,,,*45
+$GPRMC,110741,A,6013.0599,N,02453.5374,E,000.0,000.0,130210,,,A*77
+$GPGGA,110742,6013.0599,N,02453.5374,E,1,04,03.4,-00016.5,M,045.5,M,,*6F
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,2,1,07,19,25,189,51,09,,,00,22$GPGGA,110826,6013.0600,N,02453.5359,E,1,04,03.4,-00015.9,M,045.5,M,,*61
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,3,1,09,28,,,00,19,24,189,49,22,21,075,51,14,52,082,47*45
+$GPGSV,3,2,09,05,,,00,02,,,00,06,,,00,26,30,047,48*48
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110826,A,6013.0600,N,02453.5359,E,000.0,000.0,130210,,,A*75
+$GPGGA,110827,6013.0600,N,02453.5358,E,1,04,03.4,-00015.9,M,045.5,M,,*61
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,3,1,09,28,,,00,19,24,189,48,22,21,075,50,14,52,082,46*44
+$GPGSV,3,2,09,05,,,00,02,,,00,06,,,00,26,30,047,47*47
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110827,A,6013.0600,N,02453.5358,E,000.0,000.0,130210,,,A*75
+$GPGGA,110828,6013.0600,N,02453.5358,E,1,04,03.4,-00015.9,M,045.5,M,,*6E
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.1*0C
+$GPGSV,3,1,09,28,,,00,19,24,189,47,22,21,075,50,14,52,082,45*48
+$GPGSV,3,2,09,05,,,00,02,,,00,06,,,00,26,30,047,47*47
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110828,A,6013.0600,N,02453.5358,E,000.0,000.0,130210,,,A*7A
+$GPGGA,110829,6013.0600,N,02453.5357,E,1,04,03.4,-00015.9,M,045.5,M,,*60
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,28,,,00,19,24,189,47,22,21,075,49,14,52,082,45*40
+$GPGSV,3,2,09,05,,,00,02,,,00,06,,,00,26,30,047,47*47
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110829,A,6013.0600,N,02453.5357,E,000.0,000.0,130210,,,A*74
+$GPGGA,110830,6013.0600,N,02453.5356,E,1,04,03.4,-00015.9,M,045.5,M,,*69
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,28,,,00,19,24,189,47,22,21,075,50,14,52,082,46*4B
+$GPGSV,3,2,09,05,,,00,02,,,00,06,,,00,26,30,047,47*47
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110830,A,6013.0600,N,02453.5356,E,000.0,000.0,130210,,,A*7D
+$GPGGA,110831,6013.0600,N,02453.5356,E,1,04,03.4,-00016.0,M,045.5,M,,*62
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,28,,,00,19,24,189,47,22,21,075,50,14,52,082,45*48
+$GPGSV,3,2,09,05,,,00,02,,,00,06,,,00,26,30,047,47*47
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110831,A,6013.0600,N,02453.5356,E,000.0,000.0,130210,,,A*7C
+$GPGGA,110832,6013.0600,N,02453.5355,E,1,04,03.4,-00016.0,M,045.5,M,,*62
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,28,,,00,19,24,189,47,22,21,075,50,14,52,082,45*48
+$GPGSV,3,2,09,05,,,00,02,,,00,06,,,00,26,30,047,47*47
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110832,A,6013.0600,N,02453.5355,E,000.0,000.0,130210,,,A*7C
+$GPGGA,110833,6013.0600,N,02453.5354,E,1,04,03.4,-00016.0,M,045.5,M,,*62
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,28,,,00,19,24,189,47,22,21,075,49,14,52,082,45*40
+$GPGSV,3,2,09,05,,,00,02,,,00,06,,,00,26,30,047,47*47
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110833,A,6013.0600,N,02453.5354,E,000.0,000.0,130210,,,A*7C
+$GPGGA,110834,6013.0600,N,02453.5353,E,1,04,03.4,-00016.1,M,045.5,M,,*63
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,28,,,00,19,24,189,47,22,21,075,50,14,52,082,45*48
+$GPGSV,3,2,09,05,,,00,02,,,00,06,,,00,26,30,047,47*47
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110834,A,6013.0600,N,02453.5353,E,000.0,000.0,130210,,,A*7C
+$GPGGA,110835,6013.0601,N,02453.5352,E,1,04,03.4,-00016.1,M,045.5,M,,*62
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,28,,,27,19,24,189,47,22,21,075,50,14,52,082,45*4D
+$GPGSV,3,2,09,05,,,27,02,,,30,06,,,00,26,30,047,47*41
+$GPGSV,3,3,09,03,,,00,,,,,,,,,,,,*73
+$GPRMC,110835,A,6013.0601,N,02453.5352,E,000.0,000.0,130210,,,A*7D
+$GPGGA,110836,6013.0601,N,02453.5351,E,1,04,03.4,-00016.1,M,045.5,M,,*62
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,12,28,,,00,31,,,00,19,24,189,48,07,,,00*45
+$GPGSV,3,2,12,22,21,075,51,14,52,082,45,05,,,27,02,,,27*70
+$GPGSV,3,3,12,24,,,00,06,,,26,26,30,047,47,03,,,27*4F
+$GPRMC,110836,A,6013.0601,N,02453.5351,E,000.0,000.0,130210,,,A*7D
+$GPGGA,110837,6013.0602,N,02453.5350,E,1,04,03.4,-00016.1,M,045.5,M,,*61
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,2,1,08,31,,,00,19,24,189,47,07,,,00,22,21,075,51*7F
+$GPGSV,2,2,08,14,52,082,45,24,,,00,26,30,047,47,03,,,00*7A
+$GPRMC,110837,A,6013.0602,N,02453.5350,E,000.0,000.0,130210,,,A*7E
+$GPGGA,110838,6013.0602,N,02453.5349,E,1,04,03.4,-00016.1,M,045.5,M,,*66
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,2,1,07,31,,,00,19,24,189,48,07,,,00,22,21,075,51*7F
+$GPGSV,2,2,07,14,52,082,45,24,,,00,26,30,047,47,,,,*76
+$GPRMC,110838,A,6013.0602,N,02453.5349,E,000.0,000.0,130210,,,A*79
+$GPGGA,110839,6013.0602,N,02453.5348,E,1,04,03.4,-00016.1,M,045.5,M,,*66
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,2,1,07,31,,,00,19,24,189,48,07,,,00,22,21,075,50*7E
+$GPGSV,2,2,07,14,52,082,44,24,,,00,26,30,047,47,,,,*77
+$GPRMC,110839,A,6013.0602,N,02453.5348,E,000.0,000.0,130210,,,A*79
+$GPGGA,110840,6013.0602,N,02453.5348,E,1,04,03.4,-00016.1,M,045.5,M,,*68
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,2,1,07,31,,,00,19,24,189,48,07,,,00,22,21,075,49*76
+$GPGSV,2,2,07,14,52,082,44,24,,,00,26,30,047,47,,,,*77
+$GPRMC,110840,A,6013.0602,N,02453.5348,E,000.0,000.0,130210,,,A*77
+$GPGGA,110841,6013.0602,N,02453.5348,E,1,04,03.4,-00016.0,M,045.5,M,,*68
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,2,1,07,31,,,00,19,24,189,47,07,,,00,22,21,075,50*71
+$GPGSV,2,2,07,14,52,082,44,24,,,00,26,30,047,47,,,,*77
+$GPRMC,110841,A,6013.0602,N,02453.5348,E,000.0,000.0,130210,,,A*76
+$GPGGA,110842,6013.0602,N,02453.5347,E,1,04,03.4,-00016.0,M,045.5,M,,*64
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,2,1,07,31,,,00,19,24,189,47,07,,,00,22,21,075,50*71
+$GPGSV,2,2,07,14,52,082,44,24,,,00,26,30,047,47,,,,*77
+$GPRMC,110842,A,6013.0602,N,02453.5347,E,000.0,000.0,130210,,,A*7A
+$GPGGA,110843,6013.0602,N,02453.5347,E,1,04,03.4,-00015.9,M,045.5,M,,*6F
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,2,1,07,31,,,00,19,24,189,48,07,,,00,22,21,075,50*7E
+$GPGSV,2,2,07,14,52,082,45,24,,,00,26,30,047,46,,,,*77
+$GPRMC,110843,A,6013.0602,N,02453.5347,E,000.0,000.0,130210,,,A*7B
+$GPGGA,110844,6013.0602,N,02453.5347,E,1,04,03.4,-00015.9,M,045.5,M,,*68
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,2,1,07,31,00,128,26,19,24,189,48,07,,,29,22,21,075,50*4A
+$GPGSV,2,2,07,14,52,082,45,24,,,00,26,30,047,47,,,,*76
+$GPRMC,110844,A,6013.0602,N,02453.5347,E,000.0,000.0,130210,,,A*7C
+$GPGGA,110845,6013.0603,N,02453.5346,E,1,04,03.4,-00015.8,M,045.5,M,,*68
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,12,11,,,00,31,00,128,28,19,24,189,48,07,,,27*7B
+$GPGSV,3,2,12,22,21,075,51,14,52,082,45,17,,,00,04,,,00*75
+$GPGSV,3,3,12,24,,,25,15,,,00,26,30,047,47,20,,,00*4A
+$GPRMC,110845,A,6013.0603,N,02453.5346,E,000.0,000.0,130210,,,A*7D
+$GPGGA,110846,6013.0603,N,02453.5345,E,1,04,03.4,-00015.8,M,045.5,M,,*68
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,11,,,00,19,24,189,48,22,21,075,51,14,52,082,45*4C
+$GPGSV,3,2,09,17,,,00,04,,,00,24,,,00,26,30,047,47*42
+$GPGSV,3,3,09,20,,,00,,,,,,,,,,,,*72
+$GPRMC,110846,A,6013.0603,N,02453.5345,E,000.0,000.0,130210,,,A*7D
+$GPGGA,110847,6013.0603,N,02453.5345,E,1,04,03.4,-00015.7,M,045.5,M,,*66
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,11,,,00,19,24,189,48,22,21,075,50,14,52,082,45*4D
+$GPGSV,3,2,09,17,,,00,04,,,00,24,,,00,26,30,047,46*43
+$GPGSV,3,3,09,20,,,00,,,,,,,,,,,,*72
+$GPRMC,110847,A,6013.0603,N,02453.5345,E,000.0,000.0,130210,,,A*7C
+$GPGGA,110848,6013.0603,N,02453.5344,E,1,04,03.4,-00015.7,M,045.5,M,,*68
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,11,,,00,19,24,189,48,22,21,075,50,14,52,082,45*4D
+$GPGSV,3,2,09,17,,,00,04,,,00,24,,,00,26,30,047,47*42
+$GPGSV,3,3,09,20,,,00,,,,,,,,,,,,*72
+$GPRMC,110848,A,6013.0603,N,02453.5344,E,000.0,000.0,130210,,,A*72
+$GPGGA,110849,6013.0603,N,02453.5343,E,1,04,03.4,-00015.7,M,045.5,M,,*6E
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,11,,,00,19,24,189,48,22,21,075,50,14,52,082,45*4D
+$GPGSV,3,2,09,17,,,00,04,,,00,24,,,00,26,30,047,47*42
+$GPGSV,3,3,09,20,,,00,,,,,,,,,,,,*72
+$GPRMC,110849,A,6013.0603,N,02453.5343,E,000.0,000.0,130210,,,A*74
+$GPGGA,110850,6013.0603,N,02453.5343,E,1,04,03.4,-00015.7,M,045.5,M,,*66
+$GPGSA,A,3,14,19,22,26,,,,,,,,,04.6,03.4,03.0*0D
+$GPGSV,3,1,09,11,,,00,19,24,189,48,22,21,075,50,14,52,082,46*4E
+$GPGSV,3,2,09,17,,,00,04,,,00,24,,,00,26,30,047,47*42
+$GPGSV,3,3,09,20,,,00,,,,,,,,,,,,*72
+$GPRMC,110850,A,6013.0603,N,02453.5343,E,000.0,000.0,130210,,,A*7C
diff --git a/java/net.sf.marineapi.test/resources/data/sample1.txt b/java/net.sf.marineapi.test/resources/data/sample1.txt
new file mode 100644
index 00000000000..e46c67a092b
--- /dev/null
+++ b/java/net.sf.marineapi.test/resources/data/sample1.txt
@@ -0,0 +1,44 @@
+$IIMWV,273,R,24.3,N,A*10
+$IIVHW,,,347,M,0.00,N,,*64
+$IIVLW,1958.64,N,1958.64,N*4D
+$IIVPW,00.00,N,,*31
+$IIVTG,,T,312,M,0.0,N,,*0C
+$IIVWR,088,L,24.5,N,12.6,M,,*2A
+$IIVWT,088,L,24.7,N,12.6,M,,*2E
+$IIXTE,A,A,5.36,R,N*67
+$IIDBT,013.4,f,04.1,M,02.2,F*12
+$IIGLL,3748.4051,N,12226.618,W,,A*1D
+$IIHDM,348,M*33
+$IIMTA,39.4,C*0B
+$IIMTW,016,C*3A
+$IIMWD,,T,258,M,24.6,N,12.6,M*7E
+$IIMWV,272,R,24.6,N,A*14
+$IIVHW,,,348,M,0.00,N,,*6B
+$IIVLW,1958.64,N,1958.64,N*4D
+$IIVPW,00.00,N,,*31
+$IIVTG,,T,315,M,0.0,N,,*0B
+$IIVWR,091,L,24.9,N,12.8,M,,*20
+$IIVWT,090,L,24.6,N,12.6,M,,*26
+$IIXTE,A,A,5.36,R,N*67
+$IIDBT,013.2,f,04.0,M,02.2,F*15
+$IIGLL,3748.4052,N,12226.618,W,,A*1E
+$IIHDM,348,M*33
+$IIMTA,17.9,C*0A
+$IIMTW,016,C*3A
+$IIMWD,,T,254,M,26.4,N,13.5,M*70
+$IIMWV,267,R,26.0,N,A*14
+$IIVHW,,,348,M,0.00,N,,*6B
+$IIVLW,1958.64,N,1958.64,N*4D
+$IIVPW,00.00,N,,*31
+$IIVTG,,T,295,M,0.0,N,,*02
+$IIVWR,093,L,26.5,N,13.6,M,,*23
+$IIVWT,094,L,26.7,N,13.7,M,,*21
+$IIXTE,A,A,5.36,R,N*67
+$IIDBT,013.3,f,04.0,M,02.2,F*14
+$IIGLL,3748.4051,N,12226.618,W,,A*1D
+$IIHDM,348,M*33
+$IIMTA,3.6,C*30
+$IIMTW,016,C*3A
+$IIMWD,,T,250,M,27.0,N,13.8,M*7C
+$IIMWV,265,R,26.4,N,A*12
+$IIDPT,03.3,00.3,00.7*76
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/example/AISListenerExample.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/AISListenerExample.java
new file mode 100755
index 00000000000..99b4f13466c
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/AISListenerExample.java
@@ -0,0 +1,92 @@
+/*
+ * AISListenerExample.java
+ * Copyright (C) 2015 Jozéph Lázár
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.example;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.sf.marineapi.ais.message.AISMessage01;
+import net.sf.marineapi.ais.event.AbstractAISMessageListener;
+import net.sf.marineapi.nmea.io.SentenceReader;
+
+/**
+ * Simple example application that takes a filename as command-line argument and
+ * prints position from VDM sentences.
+ *
+ * @author Jozéph Lázár
+ */
+public class AISListenerExample extends AbstractAISMessageListener {
+
+ private SentenceReader reader;
+
+ /**
+ * Creates a new instance of AISExample
+ *
+ * @param file File containing NMEA data
+ */
+ public AISListenerExample(File file) throws IOException {
+
+ // create sentence reader and provide input stream
+ InputStream stream = new FileInputStream(file);
+ reader = new SentenceReader(stream);
+
+ // listen for for all AIS VDM messages
+ reader.addSentenceListener(this);
+ reader.start();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * net.sf.marineapi.ais.event.AbstractAISMessageListener#onMessage(net
+ * .sf.marineapi.ais.sentence.AISMessage)
+ */
+ @Override
+ public void onMessage(AISMessage01 msg) {
+ System.out.println(msg.getMMSI() + ": " + msg.getLatitudeInDegrees());
+ System.out.println("onMessage: " + msg.toString());
+ }
+
+ /**
+ * Main method takes one command-line argument, the name of the file to
+ * read.
+ *
+ * @param args Command-line arguments
+ */
+ public static void main(String[] args) {
+
+ if (args.length != 1) {
+ System.out.println("Example usage:\njava AISExample ais.log");
+ System.exit(1);
+ }
+
+ try {
+ new AISListenerExample(new File(args[0]));
+ System.out.println("Running, press CTRL-C to stop..");
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/example/FileExample.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/FileExample.java
new file mode 100755
index 00000000000..a7747ab96ef
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/FileExample.java
@@ -0,0 +1,123 @@
+/*
+ * FileExample.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.example;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.sf.marineapi.nmea.event.SentenceEvent;
+import net.sf.marineapi.nmea.event.SentenceListener;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.sentence.GGASentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+
+/**
+ * Simple example application that takes a filename as command-line argument and
+ * prints Position from received GGA sentences.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class FileExample implements SentenceListener {
+
+ private SentenceReader reader;
+
+ /**
+ * Creates a new instance of FileExample
+ *
+ * @param file File containing NMEA data
+ */
+ public FileExample(File file) throws IOException {
+
+ // create sentence reader and provide input stream
+ InputStream stream = new FileInputStream(file);
+ reader = new SentenceReader(stream);
+
+ // register self as a listener for GGA sentences
+ reader.addSentenceListener(this, SentenceId.GGA);
+ reader.start();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see net.sf.marineapi.nmea.event.SentenceListener#readingPaused()
+ */
+ public void readingPaused() {
+ System.out.println("-- Paused --");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see net.sf.marineapi.nmea.event.SentenceListener#readingStarted()
+ */
+ public void readingStarted() {
+ System.out.println("-- Started --");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see net.sf.marineapi.nmea.event.SentenceListener#readingStopped()
+ */
+ public void readingStopped() {
+ System.out.println("-- Stopped --");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * net.sf.marineapi.nmea.event.SentenceListener#sentenceRead(net.sf.marineapi
+ * .nmea.event.SentenceEvent)
+ */
+ public void sentenceRead(SentenceEvent event) {
+
+ // Safe to cast as we are registered only for GGA updates. Could
+ // also cast to PositionSentence if interested only in position data.
+ // When receiving all sentences without filtering, you should check the
+ // sentence type before casting (e.g. with Sentence.getSentenceId()).
+ GGASentence s = (GGASentence) event.getSentence();
+
+ // Do something with sentence data..
+ System.out.println(s.getPosition());
+ }
+
+ /**
+ * Main method takes one command-line argument, the name of the file to
+ * read.
+ *
+ * @param args Command-line arguments
+ */
+ public static void main(String[] args) {
+
+ if (args.length != 1) {
+ System.out.println("Example usage:\njava FileExample nmea.log");
+ System.exit(1);
+ }
+
+ try {
+ new FileExample(new File(args[0]));
+ System.out.println("Running, press CTRL-C to stop..");
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/example/HeadingProviderExample.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/HeadingProviderExample.java
new file mode 100755
index 00000000000..3f5924ad359
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/HeadingProviderExample.java
@@ -0,0 +1,93 @@
+/*
+ * HeadingProviderExample.java
+ * Copyright (C) 2012 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.example;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.provider.HeadingProvider;
+import net.sf.marineapi.provider.event.HeadingEvent;
+import net.sf.marineapi.provider.event.HeadingListener;
+
+/**
+ * Demonstrates the usage of HeadingProvider.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class HeadingProviderExample implements HeadingListener {
+
+ private SentenceReader reader;
+ private HeadingProvider provider;
+
+ /**
+ * Creates a new instance of FileExample
+ *
+ * @param file File from which to read Checksum data
+ */
+ public HeadingProviderExample(File file) throws IOException {
+
+ // create sentence reader and provide input stream
+ InputStream stream = new FileInputStream(file);
+ reader = new SentenceReader(stream);
+
+ // create provider and register listener
+ provider = new HeadingProvider(reader);
+ provider.addListener(this);
+
+ reader.start();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * net.sf.marineapi.provider.event.HeadingListener#providerUpdate(net.sf
+ * .marineapi.provider.event.HeadingEvent)
+ */
+ public void providerUpdate(HeadingEvent evt) {
+ System.out.println(evt.toString());
+ }
+
+ /**
+ * Main method takes one command-line argument, the name of the file to
+ * read.
+ *
+ * @param args Command-line arguments
+ */
+ public static void main(String[] args) {
+
+ if (args.length != 1) {
+ String msg = "Example usage:\njava HeadingProviderExample nmea.log";
+ System.out.println(msg);
+ System.exit(0);
+ }
+
+ try {
+ new HeadingProviderExample(new File(args[0]));
+ System.out.println("Running, press CTRL-C to stop..");
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/example/OutputExample.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/OutputExample.java
new file mode 100755
index 00000000000..afc78261dc3
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/OutputExample.java
@@ -0,0 +1,38 @@
+package net.sf.marineapi.example;
+
+import net.sf.marineapi.nmea.parser.SentenceFactory;
+import net.sf.marineapi.nmea.sentence.MWVSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.DataStatus;
+import net.sf.marineapi.nmea.util.Units;
+
+/**
+ * Demonstrates the usage of sentence parsers for data output.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class OutputExample {
+
+ public static void main(String[] args) {
+
+ // Create a fresh MWV parser
+ SentenceFactory sf = SentenceFactory.getInstance();
+ MWVSentence mwv = (MWVSentence) sf.createParser(TalkerId.II, "MWV");
+
+ // should output "$IIMWV,,,,,V*36"
+ System.out.println(mwv.toSentence());
+
+ // Be sure to set all needed values correctly. For instance, in this
+ // example setAngle() and setTrue() have mutual dependency. Likewise,
+ // pay attention to set units correctly.
+ mwv.setAngle(43.7);
+ mwv.setTrue(true);
+ mwv.setSpeed(4.54);
+ mwv.setSpeedUnit(Units.METER);
+ mwv.setStatus(DataStatus.ACTIVE);
+
+ // should output "$IIMWV,043.7,T,4.5,M,A*39"
+ System.out.println(mwv.toSentence());
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/example/PositionProviderExample.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/PositionProviderExample.java
new file mode 100755
index 00000000000..cb15b570aae
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/PositionProviderExample.java
@@ -0,0 +1,89 @@
+/*
+ * PositionProviderExample.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.example;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.sf.marineapi.nmea.io.ExceptionListener;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.provider.PositionProvider;
+import net.sf.marineapi.provider.event.PositionEvent;
+import net.sf.marineapi.provider.event.PositionListener;
+
+/**
+ * Demonstrates the usage of PositionProvider.
+ *
+ * @author Kimmo Tuukkanen
+ * @see PositionProvider
+ */
+public class PositionProviderExample implements PositionListener, ExceptionListener {
+
+ PositionProvider provider;
+
+ public PositionProviderExample(File f) throws FileNotFoundException {
+ InputStream stream = new FileInputStream(f);
+ SentenceReader reader = new SentenceReader(stream);
+ reader.setExceptionListener(this);
+ provider = new PositionProvider(reader);
+ provider.addListener(this);
+ reader.start();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * net.sf.marineapi.provider.event.PositionListener#providerUpdate(net.sf.marineapi
+ * .provider.event.PositionEvent)
+ */
+ public void providerUpdate(PositionEvent evt) {
+ // do something with the data..
+ System.out.println("TPV: " + evt.toString());
+ }
+
+ public void onException(Exception e) {
+ // supress warnings..
+ }
+
+ /**
+ * Startup method.
+ *
+ * @param args NMEA log file
+ */
+ public static void main(String[] args) {
+
+ if (args.length != 1) {
+ System.out.println("Usage:\njava PositionProviderExample nmea.log");
+ System.exit(1);
+ }
+
+ try {
+ new PositionProviderExample(new File(args[0]));
+ System.out.println("Running, press CTRL-C to stop..");
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/example/SatelliteInfoProviderExample.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/SatelliteInfoProviderExample.java
new file mode 100755
index 00000000000..61333078bee
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/SatelliteInfoProviderExample.java
@@ -0,0 +1,94 @@
+/*
+ * SatelliteInfoProviderExample.java
+ * Copyright (C) 2013 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.example;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.util.SatelliteInfo;
+import net.sf.marineapi.provider.SatelliteInfoProvider;
+import net.sf.marineapi.provider.event.SatelliteInfoEvent;
+import net.sf.marineapi.provider.event.SatelliteInfoListener;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class SatelliteInfoProviderExample implements SatelliteInfoListener {
+
+ SentenceReader reader;
+ SatelliteInfoProvider provider;
+
+ public SatelliteInfoProviderExample(File file) throws IOException {
+
+ // create sentence reader and provide input stream
+ InputStream stream = new FileInputStream(file);
+ reader = new SentenceReader(stream);
+
+ // create provider and register listener
+ provider = new SatelliteInfoProvider(reader);
+ provider.addListener(this);
+
+ reader.start();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * net.sf.marineapi.provider.event.SatelliteInfoListener#providerUpdate(net.sf.marineapi
+ * .provider.event.SatelliteInfoEvent)
+ */
+ public void providerUpdate(SatelliteInfoEvent event) {
+ System.out.println("-- GSV report --");
+ for (SatelliteInfo si : event.getSatelliteInfo()) {
+ String ptrn = "%s: %d, %d";
+ String msg = String.format(ptrn, si.getId(), si.getAzimuth(), si
+ .getElevation());
+ System.out.println(msg);
+ }
+ System.out.println("-----");
+ }
+
+ /**
+ * Main method takes one command-line argument, the name of the file to
+ * read.
+ *
+ * @param args Command-line arguments
+ */
+ public static void main(String[] args) {
+
+ if (args.length != 1) {
+ String msg = "Example usage:\njava SatelliteInfoProviderExample nmea.log";
+ System.out.println(msg);
+ System.exit(0);
+ }
+
+ try {
+ new SatelliteInfoProviderExample(new File(args[0]));
+ System.out.println("Running, press CTRL-C to stop..");
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/example/SentenceListenerExamples.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/SentenceListenerExamples.java
new file mode 100755
index 00000000000..197a0221b73
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/SentenceListenerExamples.java
@@ -0,0 +1,127 @@
+/*
+ * SentenceListenerExamples.java
+ * Copyright (C) 2014 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.example;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.sf.marineapi.nmea.event.AbstractSentenceListener;
+import net.sf.marineapi.nmea.event.SentenceEvent;
+import net.sf.marineapi.nmea.event.SentenceListener;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.sentence.GGASentence;
+import net.sf.marineapi.nmea.sentence.GLLSentence;
+import net.sf.marineapi.nmea.sentence.GSASentence;
+import net.sf.marineapi.nmea.sentence.GSVSentence;
+import net.sf.marineapi.nmea.sentence.Sentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+
+/**
+ * Demonstrates the different ways to use SentenceListeners.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class SentenceListenerExamples {
+
+ /**
+ * @param args File to read
+ */
+ public static void main(String[] args) {
+
+ if (args.length != 1) {
+ System.out.println("Example usage:\njava FileExample nmea.log");
+ System.exit(1);
+ }
+
+ try {
+ new SentenceListenerExamples(new File(args[0]));
+ System.out.println("Running, press CTRL-C to stop..");
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ /**
+ * Constructor
+ */
+ public SentenceListenerExamples(File file) throws IOException {
+
+ InputStream stream = new FileInputStream(file);
+ SentenceReader reader = new SentenceReader(stream);
+
+ reader.addSentenceListener(new GSAListener());
+ reader.addSentenceListener(new MultiSentenceListener());
+ reader.addSentenceListener(new SingleSentenceListener(), SentenceId.GSV);
+
+ reader.start();
+ }
+
+
+ public class MultiSentenceListener implements SentenceListener {
+ @Override
+ public void readingPaused() {
+ }
+ @Override
+ public void readingStarted() {
+ }
+ @Override
+ public void readingStopped() {
+ }
+ @Override
+ public void sentenceRead(SentenceEvent event) {
+ Sentence s = event.getSentence();
+ if("GLL".equals(s.getSentenceId())) {
+ GLLSentence gll = (GLLSentence) s;
+ System.out.println("GLL position: " + gll.getPosition());
+ } else if ("GGA".equals(s.getSentenceId())) {
+ GGASentence gga = (GGASentence) s;
+ System.out.println("GGA position: " + gga.getPosition());
+ }
+ }
+ }
+
+ public class SingleSentenceListener implements SentenceListener {
+ @Override
+ public void readingPaused() {
+ }
+ @Override
+ public void readingStarted() {
+ }
+ @Override
+ public void readingStopped() {
+ }
+ @Override
+ public void sentenceRead(SentenceEvent event) {
+ GSVSentence gsv = (GSVSentence) event.getSentence();
+ System.out.println("GSV satellites in view: " + gsv.getSatelliteCount());
+ }
+ }
+
+ public class GSAListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(GSASentence gsa) {
+ System.out.println("GSA position DOP: " + gsa.getPositionDOP());
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/example/TypedSentenceListenerExample.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/TypedSentenceListenerExample.java
new file mode 100755
index 00000000000..9494470de10
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/example/TypedSentenceListenerExample.java
@@ -0,0 +1,89 @@
+/*
+ * TypedSentenceListenerExample.java
+ * Copyright (C) 2014 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.example;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.sf.marineapi.nmea.event.AbstractSentenceListener;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.sentence.RMCSentence;
+
+/**
+ * Example application demonstrating the usage of AbstractSentenceListener.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class TypedSentenceListenerExample
+ extends AbstractSentenceListener {
+
+ private SentenceReader reader;
+
+ /**
+ * Creates a new instance.
+ *
+ * @param file File containing NMEA data
+ */
+ public TypedSentenceListenerExample(File file) throws IOException {
+ // create reader and provide input stream
+ InputStream stream = new FileInputStream(file);
+ reader = new SentenceReader(stream);
+ // register self as a generic listener
+ reader.addSentenceListener(this);
+ reader.start();
+ }
+
+ @Override
+ public void sentenceRead(RMCSentence sentence) {
+
+ // AbstractSentenceListener requires you to implement this method.
+ // Only RMC sentences are broadcasted here as abstract listener is
+ // filtering all the others. Thus, no need for checking sentence type
+ // and casting. You can also override sentenceRead(SentenceEvent e),
+ // but you really shouldn't.
+
+ System.out.println(sentence.getPosition());
+
+ }
+
+ /**
+ * Main method that takes single file name as argument.
+ *
+ * @param args Command-line arguments
+ */
+ public static void main(String[] args) {
+ if (args.length != 1) {
+ System.out.println("Usage:\njava TypedSentenceListenerExample ");
+ System.exit(1);
+ }
+
+ try {
+ new TypedSentenceListenerExample(new File(args[0]));
+ System.out.println("Running, press CTRL-C to stop..");
+ } catch (IOException e) {
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/event/AbstractSentenceListenerTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/event/AbstractSentenceListenerTest.java
new file mode 100755
index 00000000000..68e562a0244
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/event/AbstractSentenceListenerTest.java
@@ -0,0 +1,54 @@
+package net.sf.marineapi.nmea.event;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import net.sf.marineapi.nmea.parser.BODTest;
+import net.sf.marineapi.nmea.parser.GGATest;
+import net.sf.marineapi.nmea.parser.SentenceFactory;
+import net.sf.marineapi.nmea.sentence.BODSentence;
+import net.sf.marineapi.nmea.sentence.Sentence;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class AbstractSentenceListenerTest {
+
+ private BODSentence result;
+ private TestListener listener;
+ private SentenceFactory factory;
+
+
+ @Before
+ public void setUp() throws Exception {
+ result = null;
+ listener = new TestListener();
+ factory = SentenceFactory.getInstance();
+ }
+
+ @Test
+ public void testExpectedSentenceRead() {
+ Sentence bod = factory.createParser(BODTest.EXAMPLE);
+ SentenceEvent evt = new SentenceEvent(this, bod);
+ listener.sentenceRead(evt);
+ assertNotNull(result);
+ assertEquals(BODTest.EXAMPLE, result.toSentence());
+ }
+
+ @Test
+ public void testUnexpectedSentenceRead() {
+ Sentence gga = factory.createParser(GGATest.EXAMPLE);
+ SentenceEvent evt = new SentenceEvent(this, gga);
+ listener.sentenceRead(evt);
+ assertNull(result);
+ }
+
+
+ private class TestListener extends AbstractSentenceListener {
+ @Override
+ public void sentenceRead(BODSentence sentence) {
+ result = sentence;
+ }
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/io/SentenceReaderTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/io/SentenceReaderTest.java
new file mode 100755
index 00000000000..94a3b05a9f0
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/io/SentenceReaderTest.java
@@ -0,0 +1,221 @@
+package net.sf.marineapi.nmea.io;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+import net.sf.marineapi.nmea.event.SentenceEvent;
+import net.sf.marineapi.nmea.event.SentenceListener;
+import net.sf.marineapi.nmea.parser.BODTest;
+import net.sf.marineapi.nmea.parser.GGATest;
+import net.sf.marineapi.nmea.parser.SentenceFactory;
+import net.sf.marineapi.nmea.sentence.Sentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class SentenceReaderTest {
+
+ public final static String TEST_DATA =
+ "resources/data/Navibe-GM720.txt";
+
+ private Sentence sentence;
+ private SentenceReader reader;
+ private SentenceListener dummyListener;
+ private SentenceListener testListener;
+ private boolean paused;
+ private boolean started;
+ private boolean stopped;
+ private InputStream stream;
+
+ @Before
+ public void setUp() throws Exception {
+ File file = new File(TEST_DATA);
+ stream = new FileInputStream(file);
+ reader = new SentenceReader(stream);
+
+ dummyListener = new DummySentenceListener();
+ testListener = new TestSentenceListener();
+ reader.addSentenceListener(dummyListener);
+ reader.addSentenceListener(testListener, SentenceId.GGA);
+ }
+
+ @Test
+ public void testAddSentenceListenerSentenceListenerString() {
+ DummySentenceListener dummy = new DummySentenceListener();
+ reader.addSentenceListener(dummy, "GLL");
+ }
+
+ @Test
+ public void testGetPauseTimeout() {
+ assertEquals(SentenceReader.DEFAULT_TIMEOUT, reader.getPauseTimeout());
+ }
+
+ @Test
+ public void testRemoveSentenceListener() {
+ assertFalse(started);
+ reader.removeSentenceListener(testListener);
+ reader.fireReadingStarted();
+ assertFalse(started);
+ }
+
+ @Test
+ public void testSetInputStream() throws Exception {
+ File file = new File("resources/data/Garmin-GPS76.txt");
+ InputStream stream = new FileInputStream(file);
+ reader.setInputStream(stream);
+ }
+
+ @Test
+ @Ignore
+ public void testSetDatagramSocket() {
+ // TODO mock socket
+ }
+
+ @Test
+ public void testSetPauseTimeout() {
+ final int timeout = 2500;
+ reader.setPauseTimeout(timeout);
+ assertEquals(timeout, reader.getPauseTimeout());
+ }
+
+ @Test
+ public void testFireReadingPaused() {
+ assertFalse(paused);
+ reader.fireReadingPaused();
+ assertTrue(paused);
+ }
+
+ @Test
+ public void testFireReadingStarted() {
+ assertFalse(started);
+ reader.fireReadingStarted();
+ assertTrue(started);
+ }
+
+ @Test
+ public void testFireReadingStopped() {
+ assertFalse(stopped);
+ reader.fireReadingStopped();
+ assertTrue(stopped);
+ }
+
+ @Test
+ public void testFireSentenceEventWithExpectedType() {
+ assertNull(sentence);
+ SentenceFactory sf = SentenceFactory.getInstance();
+ Sentence s = sf.createParser(GGATest.EXAMPLE);
+ reader.fireSentenceEvent(s);
+ assertEquals(s, sentence);
+ }
+
+ @Test
+ public void testFireSentenceEventWithUnexpectedType() {
+ assertNull(sentence);
+ SentenceFactory sf = SentenceFactory.getInstance();
+ Sentence s = sf.createParser(BODTest.EXAMPLE);
+ reader.fireSentenceEvent(s);
+ assertNull(sentence);
+ }
+
+ @Test
+ public void testStartAndStop() {
+ try {
+ assertNull(sentence);
+ assertFalse(started);
+ assertFalse(paused);
+ assertFalse(stopped);
+
+ reader.start();
+ Thread.sleep(500);
+
+ assertNotNull(sentence);
+ assertTrue(started);
+ assertFalse(paused);
+
+ reader.stop();
+ Thread.sleep(100);
+
+ assertFalse(paused);
+ assertTrue(stopped);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testHandleException() {
+
+ final String ERR_MSG = "test error";
+
+ reader.setExceptionListener(new ExceptionListener() {
+ private int calls = 0;
+ @Override
+ public void onException(Exception e) {
+ assertEquals(calls++, 0);
+ assertTrue(e instanceof IllegalStateException);
+ assertEquals(ERR_MSG, e.getMessage());
+ }
+ });
+
+ reader.handleException("test", new IllegalStateException(ERR_MSG));
+ }
+
+ @Test
+ public void testDataListener() {
+
+ // expected non-NMEA line in TEST_DATA
+ final String expected = "=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2010.02.13 13:08:23 =~=~=~=~=~=~=~=~=~=~=~=";
+
+ DataListener listener = new DataListener() {
+ @Override
+ public void dataRead(String data) {
+ assertEquals(expected, data);
+ reader.stop();
+ }
+ };
+ reader.setDataListener(listener);
+ reader.start();
+ }
+
+ public class DummySentenceListener implements SentenceListener {
+ public void readingPaused() {
+ }
+
+ public void readingStarted() {
+ }
+
+ public void readingStopped() {
+ }
+
+ public void sentenceRead(SentenceEvent event) {
+ }
+ }
+
+ public class TestSentenceListener implements SentenceListener {
+ public void readingPaused() {
+ paused = true;
+ }
+
+ public void readingStarted() {
+ started = true;
+ }
+
+ public void readingStopped() {
+ stopped = true;
+ }
+
+ public void sentenceRead(SentenceEvent event) {
+ sentence = event.getSentence();
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/APBTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/APBTest.java
new file mode 100755
index 00000000000..127c822f55e
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/APBTest.java
@@ -0,0 +1,130 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.sentence.APBSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.DataStatus;
+import net.sf.marineapi.nmea.util.Direction;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class APBTest {
+
+ public static final String EXAMPLE = "$GPAPB,A,A,0.10,R,N,V,V,011,M,DEST,011,M,011,M";
+
+ private APBSentence apb;
+ private APBSentence empty;
+
+ @Before
+ public void setUp() throws Exception {
+ apb = new APBParser(EXAMPLE);
+ empty = new APBParser(TalkerId.AG);
+ }
+
+ @Test
+ public void testAPBParserString() {
+ assertEquals(TalkerId.GP, apb.getTalkerId());
+ assertEquals("APB", apb.getSentenceId());
+ assertEquals(14, apb.getFieldCount());
+ }
+
+ @Test
+ public void testAPBParserTalkerId() {
+ assertEquals(TalkerId.AG, empty.getTalkerId());
+ assertEquals("APB", empty.getSentenceId());
+ assertEquals(14, empty.getFieldCount());
+ }
+
+ @Test
+ public void testGetBearingPositionToDestination() {
+ empty.setBearingPositionToDestination(123.45);
+ assertEquals(123.5, empty.getBearingPositionToDestination(), 0.1);
+ }
+
+ @Test
+ public void testGetBearingOriginToDestination() {
+ empty.setBearingOriginToDestination(234.56);
+ assertEquals(234.6, empty.getBearingOriginToDestination(), 0.1);
+ }
+
+ @Test
+ public void testGetCrossTrackError() {
+ empty.setCrossTrackError(12.345);
+ assertEquals(12.3, empty.getCrossTrackError(), 0.1);
+ }
+
+ @Test
+ public void testGetCrossTrackUnits() {
+ empty.setCrossTrackUnits(APBSentence.NM);
+ assertEquals(APBSentence.NM, empty.getCrossTrackUnits());
+ }
+
+ @Test
+ public void testGetCycleLockStatus() {
+ empty.setCycleLockStatus(DataStatus.ACTIVE);
+ assertEquals(DataStatus.ACTIVE, empty.getCycleLockStatus());
+ }
+
+ @Test
+ public void testGetDestionationWaypointId() {
+ empty.setDestinationWaypointId("WP001");
+ assertEquals("WP001", empty.getDestionationWaypointId());
+ }
+
+ @Test
+ public void testGetHeadingToDestionation() {
+ empty.setHeadingToDestination(98.765);
+ assertEquals(98.8, empty.getHeadingToDestionation(), 0.1);
+ }
+
+ @Test
+ public void testGetStatus() {
+ empty.setStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, empty.getStatus());
+ }
+
+ @Test
+ public void testGetSteerTo() {
+ empty.setSteerTo(Direction.LEFT);
+ assertEquals(Direction.LEFT, empty.getSteerTo());
+ }
+
+ @Test
+ public void testIsArrivalCircleEntered() {
+ empty.setArrivalCircleEntered(true);
+ assertTrue(empty.isArrivalCircleEntered());
+ }
+
+ @Test
+ public void testIsBearingOriginToDestionationTrue() {
+ empty.setBearingOriginToDestionationTrue(true);
+ assertTrue(empty.isBearingOriginToDestionationTrue());
+ }
+
+ @Test
+ public void testIsBearingPositionToDestinationTrue() {
+ empty.setBearingPositionToDestinationTrue(false);
+ assertFalse(empty.isBearingPositionToDestinationTrue());
+ }
+
+ @Test
+ public void testIsHeadingToDestinationTrue() {
+ empty.setHeadingToDestinationTrue(true);
+ assertTrue(empty.isHeadingToDestinationTrue());
+ }
+
+ @Test
+ public void testIsPerpendicularPassed() {
+ empty.setPerpendicularPassed(false);
+ assertFalse(empty.isPerpendicularPassed());
+ }
+
+ @Test
+ public void testSetArrivalCircleEntered() {
+ empty.setArrivalCircleEntered(true);
+ assertTrue(empty.isArrivalCircleEntered());
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/BODTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/BODTest.java
new file mode 100755
index 00000000000..2b24eab41d5
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/BODTest.java
@@ -0,0 +1,353 @@
+package net.sf.marineapi.nmea.parser;
+
+import junit.framework.TestCase;
+import net.sf.marineapi.nmea.sentence.BODSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the BOD sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class BODTest extends TestCase {
+
+ public static final String EXAMPLE = "$GPBOD,234.9,T,228.8,M,RUSKI,*1D";
+
+ private BODSentence empty;
+ private BODSentence bod;
+
+ /**
+ * setUp
+ */
+ @Override
+ @Before
+ public void setUp() throws Exception {
+ try {
+ empty = new BODParser(TalkerId.GP);
+ bod = new BODParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * tearDown
+ */
+ @Override
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#BODParser()} .
+ */
+ @Test
+ public void testConstructor() {
+ assertEquals(6, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#BODParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testConstructorWithInvalidSentence() {
+ try {
+ new BODParser("$HUBBA,habba,doo,dah,doo");
+ } catch (IllegalArgumentException e) {
+ // OK
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#BODParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testConstructorWithNullString() {
+ try {
+ new BODParser((String) null);
+ } catch (IllegalArgumentException e) {
+ // OK
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#BODParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testConstructorWithNullTalkerId() {
+ try {
+ new BODParser((TalkerId) null);
+ } catch (IllegalArgumentException e) {
+ // OK
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#BODParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testConstructorWithRandomString() {
+ try {
+ new BODParser("foobar and haystack");
+ } catch (IllegalArgumentException e) {
+ // OK
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getDestinationWaypointId()}
+ * .
+ */
+ @Test
+ public void testGetDestinationWaypointId() {
+ try {
+ String id = bod.getDestinationWaypointId();
+ assertEquals("RUSKI", id);
+ } catch (ParseException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getMagneticBearing()}.
+ */
+ @Test
+ public void testGetMagneticBearing() {
+ try {
+ double b = bod.getMagneticBearing();
+ assertEquals(228.8, b, 0.001);
+ } catch (ParseException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getOriginWaypointId()}.
+ */
+ @Test
+ public void testGetOriginWaypointId() {
+
+ try {
+ bod.getOriginWaypointId();
+ } catch (DataNotAvailableException e) {
+ // ok, field is empty
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getTrueBearing()}.
+ */
+ @Test
+ public void testGetTrueBearing() {
+ try {
+ double b = bod.getTrueBearing();
+ assertEquals(234.9, b, 0.001);
+ } catch (ParseException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getDestinationWaypointId()}
+ * .
+ */
+ @Test
+ public void testSetDestinationWaypointId() {
+ try {
+ bod.setDestinationWaypointId("TIISKERI");
+ assertEquals("TIISKERI", bod.getDestinationWaypointId());
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getDestinationWaypointId()}
+ * .
+ */
+ @Test
+ public void testSetDestinationWaypointIdWithEmptyStr() {
+ try {
+ bod.setDestinationWaypointId("");
+ bod.getDestinationWaypointId();
+ } catch (Exception e) {
+ assertTrue(e instanceof DataNotAvailableException);
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getDestinationWaypointId()}
+ * .
+ */
+ @Test
+ public void testSetDestinationWaypointIdWithNull() {
+ try {
+ bod.setDestinationWaypointId(null);
+ bod.getDestinationWaypointId();
+ } catch (Exception e) {
+ assertTrue(e instanceof DataNotAvailableException);
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getMagneticBearing()}.
+ */
+ @Test
+ public void testSetMagneticBearing() {
+ final double bearing = 180.0;
+ try {
+ bod.setMagneticBearing(bearing);
+ assertEquals(bearing, bod.getMagneticBearing());
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getMagneticBearing()}.
+ */
+ @Test
+ public void testSetMagneticBearingWithRounding() {
+ final double bearing = 65.654321;
+ try {
+ bod.setMagneticBearing(bearing);
+ assertTrue(bod.toString().contains(",065.7,"));
+ assertEquals(bearing, bod.getMagneticBearing(), 0.1);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getMagneticBearing()}.
+ */
+ @Test
+ public void testSetMagneticBearingWithGreaterThanAllowed() {
+ try {
+ bod.setMagneticBearing(360.01);
+ fail("Did not throw exception");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getMagneticBearing()}.
+ */
+ @Test
+ public void testSetMagneticBearingWithNegativeValue() {
+ try {
+ bod.setMagneticBearing(-0.01);
+ fail("Did not throw exception");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getOriginWaypointId()}.
+ */
+ @Test
+ public void testSetOriginWaypointId() {
+ try {
+ bod.setOriginWaypointId("TAINIO");
+ assertEquals("TAINIO", bod.getOriginWaypointId());
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getTrueBearing()}.
+ */
+ @Test
+ public void testSetTrueBearing() {
+ final double bearing = 180.0;
+ try {
+ bod.setTrueBearing(bearing);
+ assertEquals(bearing, bod.getTrueBearing());
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getTrueBearing()}.
+ */
+ @Test
+ public void testSetTrueBearingWithRounding() {
+ final double bearing = 90.654321;
+ try {
+ bod.setTrueBearing(bearing);
+ assertTrue(bod.toString().contains(",090.7,"));
+ assertEquals(bearing, bod.getTrueBearing(), 0.1);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getTrueBearing()}.
+ */
+ @Test
+ public void testSetTrueBearingGreaterThanAllowed() {
+ try {
+ bod.setTrueBearing(360.01);
+ fail("Did not throw exception");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.BODParser#getTrueBearing()}.
+ */
+ @Test
+ public void testSetTrueBearingWithNegativeValue() {
+ try {
+ bod.setTrueBearing(-0.01);
+ fail("Did not throw exception");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/ChecksumTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/ChecksumTest.java
new file mode 100755
index 00000000000..272c574c891
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/ChecksumTest.java
@@ -0,0 +1,72 @@
+/*
+ * ChecksumTest.java
+ * Copyright (C) 2010 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import net.sf.marineapi.nmea.sentence.Checksum;
+
+import org.junit.Test;
+
+/**
+ * Tests the Checksum class.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class ChecksumTest {
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.sentence.Checksum#add(java.lang.String)}.
+ */
+ @Test
+ public void testAdd() {
+ String a = "$GPGLL,6011.552,N,02501.941,E,120045,A";
+ String b = "$GPGLL,6011.552,N,02501.941,E,120045,A*";
+ String c = "$GPGLL,6011.552,N,02501.941,E,120045,A*00";
+ final String expected = a.concat("*26");
+ assertEquals(expected, Checksum.add(a));
+ assertEquals(expected, Checksum.add(b));
+ assertEquals(expected, Checksum.add(c));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.sentence.Checksum#calculate(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testCalculate() {
+ assertEquals("1D", Checksum.calculate(BODTest.EXAMPLE));
+ assertEquals("63", Checksum.calculate(GGATest.EXAMPLE));
+ assertEquals("26", Checksum.calculate(GLLTest.EXAMPLE));
+ assertEquals("0B", Checksum.calculate(RMCTest.EXAMPLE));
+ assertEquals("3D", Checksum.calculate(GSATest.EXAMPLE));
+ assertEquals("73", Checksum.calculate(GSVTest.EXAMPLE));
+ assertEquals("58", Checksum.calculate(RMBTest.EXAMPLE));
+ assertEquals("25", Checksum.calculate(RTETest.EXAMPLE));
+ }
+
+ @Test
+ public void testDelimiterIndex() {
+ assertEquals(13, Checksum.index("$GPGGA,,,,,,,"));
+ assertEquals(13, Checksum.index("$GPGGA,,,,,,,*00"));
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/DBTTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/DBTTest.java
new file mode 100755
index 00000000000..43e64211715
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/DBTTest.java
@@ -0,0 +1,62 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import net.sf.marineapi.nmea.sentence.DBTSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class DBTTest {
+
+ public static final String EXAMPLE = "$IIDBT,013.4,f,04.1,M,02.2,F*12";
+ private DBTSentence dbt;
+ private DBTSentence empty;
+
+ @Before
+ public void setUp() throws Exception {
+ empty = new DBTParser(TalkerId.II);
+ dbt = new DBTParser(EXAMPLE);
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals("DBT", empty.getSentenceId());
+ assertEquals(TalkerId.II, empty.getTalkerId());
+ assertEquals(6, empty.getFieldCount());
+ }
+
+ @Test
+ public void testGetFathoms() {
+ assertEquals(2.2, dbt.getFathoms(), 0.01);
+ }
+
+ @Test
+ public void testGetFeet() {
+ assertEquals(13.4, dbt.getFeet(), 0.01);
+ }
+
+ @Test
+ public void testGetMeters() {
+ assertEquals(4.1, dbt.getDepth(), 0.01);
+ }
+
+ @Test
+ public void testSetFathoms() {
+ empty.setFathoms(7.33333);
+ assertEquals(7.3, empty.getFathoms(), 0.1);
+ }
+
+ @Test
+ public void testSetFeet() {
+ empty.setFeet(12.33333);
+ assertEquals(12.3, empty.getFeet(), 0.1);
+ }
+
+ @Test
+ public void testSetMeters() {
+ empty.setDepth(23.654321);
+ assertEquals(23.7, empty.getDepth(), 0.1);
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/DPTTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/DPTTest.java
new file mode 100755
index 00000000000..5c9ff04e8ce
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/DPTTest.java
@@ -0,0 +1,73 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import net.sf.marineapi.nmea.sentence.DPTSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class DPTTest {
+
+ public static final String EXAMPLE = "$IIDPT,012.6,-1.0,100";
+ DPTSentence empty;
+ DPTSentence dpt;
+
+ @Before
+ public void setUp() throws Exception {
+ empty = new DPTParser(TalkerId.II);
+ dpt = new DPTParser(EXAMPLE);
+ }
+
+ @Test
+ public void testDPTParser() {
+ assertEquals(TalkerId.II, empty.getTalkerId());
+ assertEquals("DPT", empty.getSentenceId());
+ assertEquals(3, empty.getFieldCount());
+
+ }
+
+ @Test
+ public void testDPTParserString() {
+ assertEquals(TalkerId.II, dpt.getTalkerId());
+ assertEquals("DPT", dpt.getSentenceId());
+ assertEquals(3, dpt.getFieldCount());
+ }
+
+ @Test
+ public void testGetDepth() {
+ assertEquals(12.6, dpt.getDepth(), 0.01);
+ }
+
+ @Test
+ public void testGetOffset() {
+ assertEquals(-1.0, dpt.getOffset(), 0.01);
+ }
+
+ @Test
+ public void testSetDepth() {
+ final double depth = 1.2333333;
+ empty.setDepth(depth);
+ assertEquals(depth, empty.getDepth(), 0.1);
+ }
+
+ @Test
+ public void testSetOffset() {
+ final double offset = 1.555555;
+ empty.setOffset(offset);
+ assertEquals(offset, empty.getOffset(), 0.1);
+ }
+
+ @Test
+ public void testGetMaximum() {
+ assertEquals(100, dpt.getMaximum(), 1);
+ }
+
+ @Test
+ public void testSetMaximum() {
+ final int max = 123;
+ dpt.setMaximum(max);
+ assertEquals(max, dpt.getMaximum(), 1);
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/DTMTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/DTMTest.java
new file mode 100755
index 00000000000..e207d2cd1d4
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/DTMTest.java
@@ -0,0 +1,103 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.DTMSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class DTMTest {
+
+ public static final String EXAMPLE = "$GPDTM,W84,,0.000000,N,0.000000,E,0.0,W84*6F";
+
+ private DTMSentence dtm;
+ private DTMSentence empty;
+
+ @Before
+ public void setUp() throws Exception {
+ dtm = new DTMParser(EXAMPLE);
+ empty = new DTMParser(TalkerId.GP);
+ }
+
+ @Test
+ public void testDTMParserString() {
+ assertEquals("DTM", dtm.getSentenceId());
+ assertEquals(TalkerId.GP, dtm.getTalkerId());
+ assertEquals(8, dtm.getFieldCount());
+ }
+
+ @Test
+ public void testDTMParserTalkerId() {
+ assertEquals("DTM", empty.getSentenceId());
+ assertEquals(TalkerId.GP, empty.getTalkerId());
+ assertEquals(8, empty.getFieldCount());
+ }
+
+ @Test
+ public void testGetAltitudeOffset() {
+ assertEquals(0.0, dtm.getAltitudeOffset(), 0.1);
+ }
+
+ @Test
+ public void testGetDatumCode() {
+ assertEquals("W84", dtm.getDatumCode());
+ }
+
+ @Test
+ public void testGetDatumSubCode() {
+ try {
+ dtm.getDatumSubCode();
+ fail("didn't throw exception");
+ } catch (Exception e) {
+ // pass
+ }
+ }
+
+ @Test
+ public void testGetLatitudeOffset() {
+ assertEquals(0.0, dtm.getLatitudeOffset(), 0.1);
+ }
+
+ @Test
+ public void testGetLongitudeOffset() {
+ assertEquals(0.0, dtm.getLongitudeOffset(), 0.1);
+ }
+
+ @Test
+ public void testGetName() {
+ assertEquals("W84", dtm.getName());
+ }
+
+ @Test
+ public void testSetDatumCode() {
+ dtm.setDatumCode("W72");
+ assertEquals("W72", dtm.getDatumCode());
+ }
+
+ @Test
+ public void testSetDatumSubCode() {
+ dtm.setDatumSubCode("123");
+ assertEquals("123", dtm.getDatumSubCode());
+ }
+
+ @Test
+ public void testSetLatitudeOffset() {
+ dtm.setLatitudeOffset(0.12345678);
+ assertEquals(0.1235, dtm.getLatitudeOffset(), 0.0001);
+ }
+
+ @Test
+ public void testSetLongitudeOffset() {
+ dtm.setLongitudeOffset(1.23456789);
+ assertEquals(1.2346, dtm.getLongitudeOffset(), 0.0001);
+ }
+
+ @Test
+ public void testSetName() {
+ dtm.setName("S83");
+ assertEquals("S83", dtm.getName());
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GGATest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GGATest.java
new file mode 100755
index 00000000000..dfd8034ac1c
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GGATest.java
@@ -0,0 +1,245 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.CompassPoint;
+import net.sf.marineapi.nmea.util.Datum;
+import net.sf.marineapi.nmea.util.GpsFixQuality;
+import net.sf.marineapi.nmea.util.Position;
+import net.sf.marineapi.nmea.util.Time;
+import net.sf.marineapi.nmea.util.Units;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test the GGA sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class GGATest {
+
+ public static final String EXAMPLE = "$GPGGA,120044.567,6011.552,N,02501.941,E,1,00,2.0,28.0,M,19.6,M,,*63";
+
+ private GGAParser gga;
+ private GGAParser empty;
+
+ @Before
+ public void setUp() {
+ try {
+ empty = new GGAParser(TalkerId.GP);
+ gga = new GGAParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(14, empty.getFieldCount());
+ }
+
+ @Test
+ public void testGetAltitude() {
+ assertEquals(28.0, gga.getAltitude(), 0.001);
+ }
+
+ @Test
+ public void testGetAltitudeUnits() {
+ assertEquals(Units.METER, gga.getAltitudeUnits());
+ }
+
+ @Test
+ public void testGetDgpsAge() {
+ try {
+ gga.getDgpsAge();
+ fail("Did not throw ParseException");
+ } catch (DataNotAvailableException e) {
+ // ok
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testGetDgpsStationId() {
+ try {
+ gga.getDgpsStationId();
+ fail("Did not throw ParseException");
+ } catch (DataNotAvailableException e) {
+ // ok
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testGetFixQuality() {
+ assertEquals(GpsFixQuality.NORMAL, gga.getFixQuality());
+ }
+
+ @Test
+ public void testGetGeoidalHeight() {
+ assertEquals(19.6, gga.getGeoidalHeight(), 0.001);
+ }
+
+ @Test
+ public void testGetGeoidalHeightUnits() {
+ assertEquals(Units.METER, gga.getGeoidalHeightUnits());
+ }
+
+ @Test
+ public void testGetHorizontalDOP() {
+ assertEquals(2.0, gga.getHorizontalDOP(), 0.001);
+ }
+
+ @Test
+ public void testGetNumberOfSatellites() {
+ assertEquals(0, gga.getSatelliteCount());
+ }
+
+ @Test
+ public void testGetPosition() {
+ // expected lat/lon values
+ final double lat = 60 + (11.552 / 60);
+ final double lon = 25 + (1.941 / 60);
+ final double alt = 28.0;
+
+ Position p = gga.getPosition();
+ assertNotNull(p);
+ assertEquals(lat, p.getLatitude(), 0.0000001);
+ assertEquals(CompassPoint.NORTH, p.getLatitudeHemisphere());
+ assertEquals(lon, p.getLongitude(), 0.0000001);
+ assertEquals(CompassPoint.EAST, p.getLongitudeHemisphere());
+ assertEquals(Datum.WGS84, p.getDatum());
+ assertEquals(alt, p.getAltitude(), 0.01);
+ }
+
+ @Test
+ public void testGetTime() {
+ Time t = gga.getTime();
+ assertNotNull(t);
+ assertEquals(12, t.getHour());
+ assertEquals(0, t.getMinutes());
+ assertEquals(44.567, t.getSeconds(), 0.001);
+ }
+
+ /**
+ *
+ */
+ @Test
+ public void testGGAParser() {
+ GGAParser instance = new GGAParser(EXAMPLE);
+ SentenceId sid = SentenceId.valueOf(instance.getSentenceId());
+ assertEquals(SentenceId.GGA, sid);
+ }
+
+ @Test
+ public void testSetAltitude() {
+ final double alt = 11.11111;
+ gga.setAltitude(alt);
+ assertEquals(alt, gga.getAltitude(), 0.1);
+ }
+
+ @Test
+ public void testSetAltitudeUnits() {
+ assertEquals(Units.METER, gga.getAltitudeUnits());
+ gga.setAltitudeUnits(Units.FEET);
+ assertEquals(Units.FEET, gga.getAltitudeUnits());
+ }
+
+ @Test
+ public void testSetDgpsAge() {
+ final double age = 33.333333;
+ gga.setDgpsAge(age);
+ assertEquals(age, gga.getDgpsAge(), 0.1);
+ }
+
+ @Test
+ public void testSetDgpsStationId() {
+ gga.setDgpsStationId("0001");
+ assertEquals("0001", gga.getDgpsStationId());
+ }
+
+ @Test
+ public void testSetFixQuality() {
+ assertEquals(GpsFixQuality.NORMAL, gga.getFixQuality());
+ gga.setFixQuality(GpsFixQuality.INVALID);
+ assertEquals(GpsFixQuality.INVALID, gga.getFixQuality());
+ }
+
+ @Test
+ public void testSetGeoidalHeight() {
+ final double height = 3.987654;
+ gga.setGeoidalHeight(height);
+ assertEquals(height, gga.getGeoidalHeight(), 0.1);
+ }
+
+ @Test
+ public void testSetGeoidalHeightUnits() {
+ assertEquals(Units.METER, gga.getGeoidalHeightUnits());
+ gga.setGeoidalHeightUnits(Units.FEET);
+ assertEquals(Units.FEET, gga.getGeoidalHeightUnits());
+ }
+
+ @Test
+ public void testSetHorizontalDOP() {
+ final double hdop = 0.123456;
+ gga.setHorizontalDOP(hdop);
+ assertEquals(hdop, gga.getHorizontalDOP(), 0.1);
+ }
+
+ @Test
+ public void testSetPosition() {
+ final double lat = 61 + (1.111 / 60);
+ final double lon = 27 + (7.777 / 60);
+ final double alt = 11.1;
+ Position p = new Position(lat, lon);
+ p.setAltitude(alt);
+ gga.setPosition(p);
+
+ final String str = gga.toString();
+ assertTrue(str.contains(",6101.111,N,"));
+ assertTrue(str.contains(",02707.777,E,"));
+
+ Position wp = gga.getPosition();
+ assertNotNull(wp);
+ assertEquals(lat, wp.getLatitude(), 0.0000001);
+ assertEquals(lon, wp.getLongitude(), 0.0000001);
+ assertEquals(CompassPoint.NORTH, wp.getLatitudeHemisphere());
+ assertEquals(CompassPoint.EAST, wp.getLongitudeHemisphere());
+ assertEquals(alt, wp.getAltitude(), 0.01);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.GGAParser#getTime()}.
+ */
+ @Test
+ public void testSetTime() {
+ Time t = new Time(1, 2, 3.456);
+ gga.setTime(t);
+ assertTrue(gga.toString().contains("GPGGA,010203.456,6011"));
+ }
+
+ @Test
+ public void testSetNumberOfSatellites() {
+ gga.setSatelliteCount(5);
+ assertEquals(5, gga.getSatelliteCount());
+ assertTrue(gga.toString().contains(",E,1,05,2.0,28.0,"));
+ }
+
+ @Test
+ public void testSetNumberOfSatellitesThrows() {
+ try {
+ gga.setSatelliteCount(-1);
+ fail("setSatelliteCount() did not throw exception");
+ } catch(IllegalArgumentException e) {
+ assertEquals(0, gga.getSatelliteCount());
+ assertEquals("Satelite count cannot be negative", e.getMessage());
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GLLTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GLLTest.java
new file mode 100755
index 00000000000..122cf12c7cd
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GLLTest.java
@@ -0,0 +1,151 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.CompassPoint;
+import net.sf.marineapi.nmea.util.DataStatus;
+import net.sf.marineapi.nmea.util.Position;
+import net.sf.marineapi.nmea.util.Time;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the GLL sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class GLLTest {
+
+ /**
+ * Example sentence
+ */
+ public static final String EXAMPLE = "$GPGLL,6011.552,N,02501.941,E,120045,A*26";
+
+ private GLLParser empty;
+ private GLLParser instance;
+
+ /**
+ * setUp
+ */
+ @Before
+ public void setUp() {
+ try {
+ empty = new GLLParser(TalkerId.GP);
+ instance = new GLLParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(6, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GLLParser#getDataStatus()}.
+ */
+ @Test
+ public void testGetDataStatus() {
+ assertEquals(DataStatus.ACTIVE, instance.getStatus());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GLLParser#getPosition()}.
+ */
+ @Test
+ public void testGetPosition() {
+ final double lat = 60 + (11.552 / 60);
+ final double lon = 25 + (1.941 / 60);
+
+ Position p = instance.getPosition();
+ assertNotNull(p);
+ assertEquals(lat, p.getLatitude(), 0.0000001);
+ assertEquals(lon, p.getLongitude(), 0.0000001);
+ assertEquals(CompassPoint.NORTH, p.getLatitudeHemisphere());
+ assertEquals(CompassPoint.EAST, p.getLongitudeHemisphere());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.GLLParser#getTime()}.
+ */
+ @Test
+ public void testGetTime() {
+ Time t = instance.getTime();
+ assertNotNull(t);
+ assertEquals(12, t.getHour());
+ assertEquals(0, t.getMinutes());
+ assertEquals(45.0, t.getSeconds(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GLLParser#setDataStatus(DataStatus)}.
+ */
+ @Test
+ public void testSetDataStatus() {
+ assertEquals(DataStatus.ACTIVE, instance.getStatus());
+ instance.setStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, instance.getStatus());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GLLParser#setPosition(Position)}.
+ */
+ @Test
+ public void testSetPositionWithNonZeroValues() {
+
+ final double lat = 60 + (11.552 / 60);
+ final double lon = 25 + (1.941 / 60);
+ Position p2 = new Position(lat, lon);
+ instance.setPosition(p2);
+
+ final String s2 = instance.toString();
+ final Position p = instance.getPosition();
+
+ assertTrue(s2.contains(",6011.552,N,"));
+ assertTrue(s2.contains(",02501.941,E,"));
+ assertNotNull(p);
+ assertEquals(lat, p.getLatitude(), 0.0000001);
+ assertEquals(lon, p.getLongitude(), 0.0000001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GLLParser#setPosition(Position)}.
+ */
+ @Test
+ public void testSetPositionWithZeroValues() {
+
+ Position p1 = new Position(0.0, 0.0);
+ instance.setPosition(p1);
+
+ String s1 = instance.toString();
+ Position p = instance.getPosition();
+
+ assertTrue(s1.contains(",0000.000,N,"));
+ assertTrue(s1.contains(",00000.000,E,"));
+ assertNotNull(p);
+ assertEquals(0.0, p.getLatitude(), 0.0000001);
+ assertEquals(0.0, p.getLongitude(), 0.0000001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GLLParser#setTime(Time)}.
+ */
+ @Test
+ public void testSetTime() {
+ Time t = new Time(1, 2, 3.4);
+ instance.setTime(t);
+ assertTrue(instance.toString().contains(",E,010203.400,A*"));
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GNSTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GNSTest.java
new file mode 100755
index 00000000000..7931f0ba1a2
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GNSTest.java
@@ -0,0 +1,211 @@
+/*
+ * GNSTest.java
+ * Copyright (C) 2016 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import net.sf.marineapi.nmea.sentence.GNSSentence;
+import net.sf.marineapi.nmea.sentence.GNSSentence.Mode;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.CompassPoint;
+import net.sf.marineapi.nmea.util.Position;
+import net.sf.marineapi.nmea.util.Time;
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ * GNS parser tests
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class GNSTest {
+
+ public static final String EXAMPLE = "$GNGNS,014035.00,4332.69262,S,17235.48549,E,RR,13,0.9,25.63,11.24,,*70";
+
+ GNSSentence gns;
+ GNSSentence empty;
+
+ @Before
+ public void setUp() throws Exception {
+
+ gns = new GNSParser(EXAMPLE);
+ assertEquals(TalkerId.GN, gns.getTalkerId());
+ assertEquals(SentenceId.GNS.name(), gns.getSentenceId());
+ assertEquals(12, gns.getFieldCount());
+
+ empty = new GNSParser(TalkerId.GP);
+ assertEquals(TalkerId.GP, empty.getTalkerId());
+ assertEquals(SentenceId.GNS.name(), empty.getSentenceId());
+ assertEquals(12, empty.getFieldCount());
+ }
+
+ @Test
+ public void getTime() throws Exception {
+ Time t = gns.getTime();
+ assertEquals(1, t.getHour());
+ assertEquals(40, t.getMinutes());
+ assertEquals(35.00, t.getSeconds(), 0.001);
+ }
+
+ @Test
+ public void setTime() throws Exception {
+ gns.setTime(new Time(10, 20, 30));
+ assertEquals(10, gns.getTime().getHour());
+ assertEquals(20, gns.getTime().getMinutes());
+ assertEquals(30.0, gns.getTime().getSeconds(), 0.1);
+ }
+
+ @Test
+ public void getPosition() throws Exception {
+
+ // 4332.69262,S,17235.48549,E
+ final double LAT = -(43 + 32.69262 / 60);
+ final double LON = 172 + 35.48549 / 60;
+ Position p = gns.getPosition();
+
+ assertEquals(LAT, p.getLatitude(), 0.00001);
+ assertEquals(CompassPoint.SOUTH, p.getLatitudeHemisphere());
+ assertEquals(LON, p.getLongitude(), 0.00001);
+ assertEquals(CompassPoint.EAST, p.getLongitudeHemisphere());
+ }
+
+ @Test
+ public void setPosition() throws Exception {
+
+ final double LAT = 61.23456;
+ final double LON = 21.23456;
+
+ empty.setPosition(new Position(LAT, LON));
+ Position p = empty.getPosition();
+
+ assertEquals(LAT, p.getLatitude(), 0.00001);
+ assertEquals(CompassPoint.NORTH, p.getLatitudeHemisphere());
+ assertEquals(LON, p.getLongitude(), 0.00001);
+ assertEquals(CompassPoint.EAST, p.getLongitudeHemisphere());
+ }
+
+ @Test
+ public void getGpsMode() throws Exception {
+ assertEquals(Mode.RTK, gns.getGpsMode());
+ assertEquals(Mode.NONE, empty.getGpsMode());
+ }
+
+ @Test
+ public void setGpsMode() throws Exception {
+ gns.setGpsMode(Mode.DGPS);
+ assertTrue(gns.toString().contains(",DR,"));
+ assertEquals(Mode.DGPS, gns.getGpsMode());
+ assertEquals(Mode.RTK, gns.getGlonassMode());
+ assertEquals(0, gns.getAdditionalModes().length);
+ }
+
+ @Test
+ public void getGlonassMode() throws Exception {
+ assertEquals(Mode.RTK, gns.getGlonassMode());
+ assertEquals(Mode.NONE, empty.getGlonassMode());
+ }
+
+ @Test
+ public void setGlonassMode() throws Exception {
+ gns.setGlonassMode(Mode.FRTK);
+ assertTrue(gns.toString().contains(",RF,"));
+ assertEquals(Mode.FRTK, gns.getGlonassMode());
+ assertEquals(Mode.RTK, gns.getGpsMode());
+ assertEquals(0, gns.getAdditionalModes().length);
+ }
+
+ @Test
+ public void setAdditionalModes() throws Exception {
+ gns.setAdditionalModes(Mode.AUTOMATIC, Mode.ESTIMATED);
+ assertTrue(gns.toString().contains(",RRAE,"));
+ assertEquals(Mode.RTK, gns.getGpsMode());
+ assertEquals(Mode.RTK, gns.getGlonassMode());
+ }
+
+ @Test
+ public void getAdditionalModes() throws Exception {
+ gns.setAdditionalModes(Mode.AUTOMATIC, Mode.ESTIMATED);
+ Mode[] additional = gns.getAdditionalModes();
+ assertEquals(2, additional.length);
+ assertEquals(Mode.AUTOMATIC, additional[0]);
+ assertEquals(Mode.ESTIMATED, additional[1]);
+ }
+
+ @Test
+ public void getSatelliteCount() throws Exception {
+ assertEquals(13, gns.getSatelliteCount());
+ }
+
+ @Test
+ public void setSatelliteCount() throws Exception {
+ gns.setSatelliteCount(8);
+ assertTrue(gns.toString().contains(",08,"));
+ assertEquals(8, gns.getSatelliteCount());
+ }
+
+ @Test
+ public void getHorizontalDOP() throws Exception {
+ assertEquals(0.9, gns.getHorizontalDOP(), 0.001);
+ }
+
+ @Test
+ public void setHorizontalDOP() throws Exception {
+ gns.setHorizontalDOP(0.123);
+ assertEquals(0.12, gns.getHorizontalDOP(), 0.001);
+ }
+
+ @Test
+ public void getOrthometricHeight() throws Exception {
+ assertEquals(25.63, gns.getOrthometricHeight(), 0.001);
+ }
+
+ @Test
+ public void setOrthometricHeight() throws Exception {
+ gns.setOrthometricHeight(12.342);
+ assertEquals(12.34, gns.getOrthometricHeight(), 0.0001);
+ }
+
+ @Test
+ public void getGeoidalSeparation() throws Exception {
+ assertEquals(11.24, gns.getGeoidalSeparation(), 0.001);
+ }
+
+ @Test
+ public void setGeoidalSeparation() throws Exception {
+ gns.setGeoidalSeparation(1.234);
+ assertEquals(1.23, gns.getGeoidalSeparation(), 0.001);
+ }
+
+ @Test
+ public void testDgpsAge() throws Exception {
+ empty.setDgpsAge(10);
+ assertTrue(empty.toString().contains(",10.0,*"));
+ assertEquals(10, empty.getDgpsAge(), 0.1);
+ }
+
+ @Test
+ public void testDgpsStationId() throws Exception {
+ gns.setDgpsStationId("1234");
+ assertTrue(gns.toString().contains(",1234*"));
+ assertEquals("1234", gns.getDgpsStationId());
+ }
+
+}
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GSATest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GSATest.java
new file mode 100755
index 00000000000..734bb76bef0
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GSATest.java
@@ -0,0 +1,191 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.GSASentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.FaaMode;
+import net.sf.marineapi.nmea.util.GpsFixStatus;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the GSA sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class GSATest {
+
+ /** Example sentence */
+ public static final String EXAMPLE = "$GPGSA,A,3,02,,,07,,09,24,26,,,,,1.6,1.6,1.0*3D";
+
+ private GSASentence empty;
+ private GSASentence instance;
+
+ @Before
+ public void setUp() {
+ try {
+ empty = new GSAParser(TalkerId.GP);
+ instance = new GSAParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(17, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#getFixStatus()} .
+ */
+ @Test
+ public void testGetFixStatus() {
+ assertEquals(GpsFixStatus.GPS_3D, instance.getFixStatus());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.GSAParser#getMode()}.
+ */
+ @Test
+ public void testGetFaaMode() {
+ assertEquals(FaaMode.AUTOMATIC, instance.getMode());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#getHorizontalDOP()}.
+ */
+ @Test
+ public void testGetHorizontalDOP() {
+ double hdop = instance.getHorizontalDOP();
+ assertEquals(1.6, hdop, 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#getPositionDOP()}.
+ */
+ @Test
+ public void testGetPositionDOP() {
+ double pdop = instance.getPositionDOP();
+ assertEquals(1.6, pdop, 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#getSatelliteIds()}.
+ */
+ @Test
+ public void testGetSatelliteIds() {
+ String[] satellites = instance.getSatelliteIds();
+ assertEquals(5, satellites.length);
+ assertEquals("02", satellites[0]);
+ assertEquals("07", satellites[1]);
+ assertEquals("09", satellites[2]);
+ assertEquals("24", satellites[3]);
+ assertEquals("26", satellites[4]);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#getVerticalDOP()}.
+ */
+ @Test
+ public void testGetVerticalDOP() {
+ double vdop = instance.getVerticalDOP();
+ assertEquals(1.0, vdop, 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#setFixStatus(GpsFixStatus)}
+ * .
+ */
+ @Test
+ public void testSetFixStatus() {
+ instance.setFixStatus(GpsFixStatus.GPS_NA);
+ assertTrue(instance.toString().contains(",A,1,"));
+ assertEquals(GpsFixStatus.GPS_NA, instance.getFixStatus());
+
+ instance.setFixStatus(GpsFixStatus.GPS_2D);
+ assertTrue(instance.toString().contains(",A,2,"));
+ assertEquals(GpsFixStatus.GPS_2D, instance.getFixStatus());
+
+ instance.setFixStatus(GpsFixStatus.GPS_3D);
+ assertTrue(instance.toString().contains(",A,3,"));
+ assertEquals(GpsFixStatus.GPS_3D, instance.getFixStatus());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#setMode(FaaMode)}.
+ */
+ @Test
+ public void testSetFaaMode() {
+ instance.setMode(FaaMode.DGPS);
+ assertTrue(instance.toString().contains(",D,"));
+ assertEquals(FaaMode.DGPS, instance.getMode());
+
+ instance.setMode(FaaMode.SIMULATED);
+ assertTrue(instance.toString().contains(",S,"));
+ assertEquals(FaaMode.SIMULATED, instance.getMode());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#setHorizontalDOP(double)}.
+ */
+ @Test
+ public void testSetHorizontalDOP() {
+ final double hdop = 1.98765;
+ instance.setHorizontalDOP(hdop);
+ assertEquals(hdop, instance.getHorizontalDOP(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#setPositionDOP(double)}.
+ */
+ @Test
+ public void testSetPositionDOP() {
+ final double pdop = 1.56788;
+ instance.setPositionDOP(pdop);
+ assertEquals(pdop, instance.getPositionDOP(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#setSatellitesIds(String[])}
+ * .
+ */
+ @Test
+ public void testSetSatelliteIds() {
+
+ String[] ids = { "02", "04", "06", "08", "10", "12" };
+ instance.setSatelliteIds(ids);
+
+ String[] satellites = instance.getSatelliteIds();
+ assertEquals(ids.length, satellites.length);
+
+ int i = 0;
+ for (String id : ids) {
+ assertEquals(id, satellites[i++]);
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSAParser#setVerticalDOP(double)}.
+ */
+ @Test
+ public void testSetVerticalDOP() {
+ final double vdop = 1.56789;
+ instance.setVerticalDOP(vdop);
+ assertEquals(vdop, instance.getVerticalDOP(), 0.1);
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GSVTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GSVTest.java
new file mode 100755
index 00000000000..48782aea4a3
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/GSVTest.java
@@ -0,0 +1,194 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.marineapi.nmea.sentence.GSVSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.SatelliteInfo;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test the GSV sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class GSVTest {
+
+ /** Example sentence */
+ public static final String EXAMPLE = "$GPGSV,3,2,12,15,56,182,51,17,38,163,47,18,63,058,50,21,53,329,47*73";
+
+ private GSVSentence empty;
+ private GSVSentence gsv;
+
+ @Before
+ public void setUp() {
+ try {
+ empty = new GSVParser(TalkerId.GP);
+ gsv = new GSVParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(19, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSVParser#getSatelliteCount()}.
+ */
+ @Test
+ public void testGetSatelliteCount() {
+ assertEquals(12, gsv.getSatelliteCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSVParser#getSatelliteInfo()}.
+ */
+ @Test
+ public void testGetSatelliteInfo() {
+ List sat = gsv.getSatelliteInfo();
+ assertEquals(4, sat.size());
+ testSatelliteInfo(sat.get(0), "15", 56, 182, 51);
+ testSatelliteInfo(sat.get(1), "17", 38, 163, 47);
+ testSatelliteInfo(sat.get(2), "18", 63, 58, 50);
+ testSatelliteInfo(sat.get(3), "21", 53, 329, 47);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSVParser#getSatelliteInfo()}.
+ */
+ @Test
+ public void testGetSatelliteInfoWithEmptyFields() {
+
+ GSVSentence g = new GSVParser("$GPGSV,3,2,12,15,56,182,51,17,38,163,47,18,,,,21,53,329,47");
+ List sat = g.getSatelliteInfo();
+
+ assertEquals(3, sat.size());
+ testSatelliteInfo(sat.get(0), "15", 56, 182, 51);
+ testSatelliteInfo(sat.get(1), "17", 38, 163, 47);
+ testSatelliteInfo(sat.get(2), "21", 53, 329, 47);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSVParser#getSatelliteInfo()}.
+ */
+ @Test
+ public void testGetSatelliteInfoWithShortSentence() {
+
+ GSVSentence g = new GSVParser("$GPGSV,3,2,12,15,56,182,51,17,38,163,47");
+ List sat = g.getSatelliteInfo();
+
+ assertEquals(2, sat.size());
+ testSatelliteInfo(sat.get(0), "15", 56, 182, 51);
+ testSatelliteInfo(sat.get(1), "17", 38, 163, 47);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSVParser#getSentenceCount()}.
+ */
+ @Test
+ public void testGetSentenceCount() {
+ assertEquals(3, gsv.getSentenceCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSVParser#getSentenceIndex()}.
+ */
+ @Test
+ public void testGetSentenceIndex() {
+ assertEquals(2, gsv.getSentenceIndex());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.GSVParser#isFirst()}.
+ */
+ @Test
+ public void testIsFirst() {
+ assertFalse(gsv.isFirst());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.GSVParser#isLast()} .
+ */
+ @Test
+ public void testIsLast() {
+ assertFalse(gsv.isLast());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSVParser#setSatelliteCount(int)}.
+ */
+ @Test
+ public void testSetSatelliteCount() {
+ gsv.setSatelliteCount(5);
+ assertEquals(5, gsv.getSatelliteCount());
+ gsv.setSatelliteCount(10);
+ assertEquals(10, gsv.getSatelliteCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSVParser#getSatelliteInfo()}.
+ */
+ @Test
+ public void testSetSatelliteInfo() {
+ List si = new ArrayList();
+ si.add(new SatelliteInfo("01", 11, 12, 13));
+ si.add(new SatelliteInfo("02", 21, 22, 23));
+ si.add(new SatelliteInfo("03", 31, 32, 33));
+ gsv.setSatelliteInfo(si);
+
+ assertTrue(gsv.toString().contains(",03,31,032,33,,,,*"));
+ List sat = gsv.getSatelliteInfo();
+ assertEquals(3, sat.size());
+ testSatelliteInfo(sat.get(0), "01", 11, 12, 13);
+ testSatelliteInfo(sat.get(1), "02", 21, 22, 23);
+ testSatelliteInfo(sat.get(2), "03", 31, 32, 33);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.GSVParser#setSentenceCount(int)}.
+ */
+ @Test
+ public void testSetSentenceCount() {
+ gsv.setSentenceCount(1);
+ assertEquals(1, gsv.getSentenceCount());
+ gsv.setSentenceCount(2);
+ assertEquals(2, gsv.getSentenceCount());
+ }
+
+ @Test
+ public void testParserGlonassGSV() {
+ GSVParser gl = new GSVParser("$GLGSV,2,1,07,70,28,145,44,71,67,081,46,72,34,359,40,77,16,245,35,1*76");
+ assertEquals(TalkerId.GL, gl.getTalkerId());
+ }
+
+ /**
+ * Tests the given SatelliteInfo against specified values.
+ */
+ private void testSatelliteInfo(SatelliteInfo si, String id, int elevation,
+ int azimuth, int noise) {
+ assertEquals(id, si.getId());
+ assertEquals(elevation, si.getElevation(), 0.1);
+ assertEquals(azimuth, si.getAzimuth(), 0.1);
+ assertEquals(noise, si.getNoise(), 0.1);
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/HDGTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/HDGTest.java
new file mode 100755
index 00000000000..05e37e59773
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/HDGTest.java
@@ -0,0 +1,289 @@
+/*
+ * HDGTest.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.HDGSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class HDGTest {
+
+ public static final String EXAMPLE = "$HCHDG,123.4,1.2,E,1.2,W";
+
+ HDGSentence hdg;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ hdg = new HDGParser(EXAMPLE);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.HDGParser(TalkerId)}.
+ */
+ @Test
+ public void testConstructor() {
+ HDGSentence empty = new HDGParser(TalkerId.HC);
+ assertEquals(TalkerId.HC, empty.getTalkerId());
+ assertEquals(SentenceId.HDG.toString(), empty.getSentenceId());
+ try {
+ empty.getHeading();
+ } catch (DataNotAvailableException e) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.HDTParser#isTrue()}.
+ */
+ @Test
+ public void testIsTrue() {
+ assertFalse(hdg.isTrue());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#HDGParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testHDGParserString() {
+ assertTrue(hdg.isValid());
+ assertEquals(TalkerId.HC, hdg.getTalkerId());
+ assertEquals("HDG", hdg.getSentenceId());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#HDGParser(net.sf.marineapi.nmea.sentence.TalkerId)}
+ * .
+ */
+ @Test
+ public void testHDGParserTalkerId() {
+ HDGParser hdgp = new HDGParser(TalkerId.HC);
+ assertTrue(hdgp.isValid());
+ assertEquals(TalkerId.HC, hdgp.getTalkerId());
+ assertEquals("HDG", hdgp.getSentenceId());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#getDeviation()}.
+ */
+ @Test
+ public void testGetDeviation() {
+ assertEquals(1.2, hdg.getDeviation(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#getHeading()}.
+ */
+ @Test
+ public void testGetHeading() {
+ assertEquals(123.4, hdg.getHeading(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#getVariation()}.
+ */
+ @Test
+ public void testGetVariation() {
+ // 1.2 degrees west -> -1.2
+ assertEquals(-1.2, hdg.getVariation(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setDeviation(double)}.
+ */
+ @Test
+ public void testSetDeviationWest() {
+ final double dev = -5.5;
+ hdg.setDeviation(dev);
+ assertEquals(dev, hdg.getDeviation(), 0.1);
+ assertTrue(hdg.toString().contains(",005.5,W,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setDeviation(double)}.
+ */
+ @Test
+ public void testSetDeviationEast() {
+ final double dev = 5.5;
+ hdg.setDeviation(dev);
+ assertEquals(dev, hdg.getDeviation(), 0.1);
+ assertTrue(hdg.toString().contains(",005.5,E,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setDeviation(double)}.
+ */
+ @Test
+ public void testSetDeviationTooHigh() {
+ final double value = 180.000001;
+ try {
+ hdg.setDeviation(value);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setDeviation(double)}.
+ */
+ @Test
+ public void testSetDeviationTooLow() {
+ final double value = -180.000001;
+ try {
+ hdg.setHeading(value);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetHeading() {
+ final double value = 359.9;
+ hdg.setHeading(value);
+ assertEquals(value, hdg.getHeading(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetHeadingTooHigh() {
+ final double value = 360.000001;
+ try {
+ hdg.setHeading(value);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetHeadingTooLow() {
+ final double value = -0.000001;
+ try {
+ hdg.setHeading(value);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setVariation(double)}.
+ */
+ @Test
+ public void testSetVariationEast() {
+ final double var = 179.9;
+ hdg.setVariation(var);
+ assertEquals(var, hdg.getVariation(), 0.1);
+ assertTrue(hdg.toString().contains(",179.9,E*"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setVariation(double)}.
+ */
+ @Test
+ public void testSetVariationWest() {
+ final double var = -0.1;
+ hdg.setVariation(var);
+ assertEquals(var, hdg.getVariation(), 0.1);
+ assertTrue(hdg.toString().contains(",000.1,W*"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setVariation(double)}.
+ */
+ @Test
+ public void testSetVariationTooHigh() {
+ final double var = 180.00001;
+ try {
+ hdg.setVariation(var);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDGParser#setVariation(double)}.
+ */
+ @Test
+ public void testSetVariationTooLow() {
+ final double var = -180.00001;
+ try {
+ hdg.setVariation(var);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/HDMTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/HDMTest.java
new file mode 100755
index 00000000000..f6a90c3d3c3
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/HDMTest.java
@@ -0,0 +1,128 @@
+/*
+ * HDMTest.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.HDMSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * HDM parser tests.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class HDMTest {
+
+ public static final String EXAMPLE = "$GPHDM,90.0,M";
+
+ HDMSentence hdm;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ hdm = new HDMParser(EXAMPLE);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.HDMParser(TalkerId)}.
+ */
+ @Test
+ public void testConstructor() {
+ HDMSentence empty = new HDMParser(TalkerId.HC);
+ assertEquals(TalkerId.HC, empty.getTalkerId());
+ assertEquals(SentenceId.HDM.toString(), empty.getSentenceId());
+ try {
+ empty.getHeading();
+ } catch (DataNotAvailableException e) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.HDTParser#isTrue()}.
+ */
+ @Test
+ public void testIsTrue() {
+ assertFalse(hdm.isTrue());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDMParser#getHeading()}.
+ */
+ @Test
+ public void testGetHeading() {
+ double value = hdm.getHeading();
+ assertEquals(90.0, value, 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDMParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetHeading() {
+ hdm.setHeading(123.45);
+ assertEquals(123.5, hdm.getHeading(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDMParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetNegativeHeading() {
+ try {
+ hdm.setHeading(-0.005);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDMParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetHeadingTooHigh() {
+ try {
+ hdm.setHeading(360.0001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/HDTTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/HDTTest.java
new file mode 100755
index 00000000000..905ea5c082a
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/HDTTest.java
@@ -0,0 +1,126 @@
+/*
+ * HDTTest.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.HDTSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class HDTTest {
+
+ public static final String EXAMPLE = "$HCHDT,90.1,T";
+ HDTSentence hdt;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ hdt = new HDTParser(EXAMPLE);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.HDTParser(TalkerId)}.
+ */
+ @Test
+ public void testConstructor() {
+ HDTSentence empty = new HDTParser(TalkerId.HE);
+ assertEquals(TalkerId.HE, empty.getTalkerId());
+ assertEquals(SentenceId.HDT.toString(), empty.getSentenceId());
+ try {
+ empty.getHeading();
+ } catch (DataNotAvailableException e) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.HDTParser#isTrue()}.
+ */
+ @Test
+ public void testIsTrue() {
+ assertTrue(hdt.isTrue());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDTParser#getHeading()}.
+ */
+ @Test
+ public void testGetHeading() {
+ double value = hdt.getHeading();
+ assertEquals(90.0, value, 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDTParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetHeading() {
+ hdt.setHeading(123.45);
+ assertEquals(123.5, hdt.getHeading(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDTParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetNegativeHeading() {
+ try {
+ hdt.setHeading(-0.005);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.HDTParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetHeadingTooHigh() {
+ try {
+ hdt.setHeading(360.0001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MDATest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MDATest.java
new file mode 100755
index 00000000000..ae113ccf63d
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MDATest.java
@@ -0,0 +1,180 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.sentence.MDASentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Richard van Nieuwenhoven
+ */
+public class MDATest {
+
+ public static final String EXAMPLE = "$IIMDA,99700.0,P,1.00,B,3.2,C,,C,,,,C,295.19,T,,M,5.70,N,2.93,M*08";
+
+ public static final String EXAMPLE2 = "$IIMDA,30.0,I,1.0149,B,26.8,C,,C,64.2,16.4,19.5,C,,T,38.7,M,10.88,N,5.60,M*36";
+
+ private MDASentence mda;
+
+ private MDASentence mda2;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ mda = new MDAParser(EXAMPLE);
+ mda2 = new MDAParser(EXAMPLE2);
+ }
+
+ @Test
+ public void testMDAParserTalkerId() {
+ MDAParser mwdp = new MDAParser(TalkerId.II);
+ assertEquals(TalkerId.II, mwdp.getTalkerId());
+ assertEquals(SentenceId.MDA.toString(), mwdp.getSentenceId());
+ }
+
+ @Test
+ public void testGetMagneticWindDirection() {
+ assertTrue(Double.isNaN(mda.getMagneticWindDirection()));
+ assertEquals(38.7, mda2.getMagneticWindDirection(), 0.1);
+ }
+
+ @Test
+ public void testGetTrueWindDirection() {
+ assertEquals(295.19, mda.getTrueWindDirection(), 0.1);
+ assertTrue(Double.isNaN(mda2.getTrueWindDirection()));
+ }
+
+ @Test
+ public void testGetWindSpeed() {
+ assertEquals(2.93, mda.getWindSpeed(), 0.1);
+ assertEquals(5.6, mda2.getWindSpeed(), 0.1);
+ }
+
+ @Test
+ public void testGetWindSpeedKnots() {
+ assertEquals(5.7, mda.getWindSpeedKnots(), 0.1);
+ assertEquals(10.88, mda2.getWindSpeedKnots(), 0.1);
+ }
+
+ @Test
+ public void testGetAbsoluteHumidity() {
+ assertTrue(Double.isNaN(mda.getAbsoluteHumidity()));
+ assertEquals(16.4, mda2.getAbsoluteHumidity(), 0.1);
+ }
+
+ @Test
+ public void testGetAirTemperature() {
+ assertEquals(3.2, mda.getAirTemperature(), 0.1);
+ assertEquals(26.8, mda2.getAirTemperature(), 0.1);
+ }
+
+ @Test
+ public void testGetSecondaryBarometricPressure() {
+ assertEquals(1.0, mda.getSecondaryBarometricPressure(), 0.1);
+ assertEquals('B', mda.getSecondaryBarometricPressureUnit());
+ assertEquals(1.0, mda2.getSecondaryBarometricPressure(), 0.1);
+ assertEquals('B', mda2.getSecondaryBarometricPressureUnit());
+ }
+
+ @Test
+ public void testGetPrimaryBarometricPressure() {
+ assertEquals(99700.0, mda.getPrimaryBarometricPressure(), 0.1);
+ assertEquals('P', mda.getPrimaryBarometricPressureUnit());
+ assertEquals(30.0, mda2.getPrimaryBarometricPressure(), 0.1);
+ assertEquals('I', mda2.getPrimaryBarometricPressureUnit());
+ }
+
+ @Test
+ public void testGetRelativeHumidity() {
+ assertTrue(Double.isNaN(mda.getRelativeHumidity()));
+ assertEquals(64.2, mda2.getRelativeHumidity(), 0.1);
+ }
+
+ @Test
+ public void testGetDewPoint() {
+ assertTrue(Double.isNaN(mda.getDewPoint()));
+ assertEquals(19.5, mda2.getDewPoint(), 0.1);
+ }
+
+ @Test
+ public void testGetWaterTemperature() {
+ assertTrue(Double.isNaN(mda.getWaterTemperature()));
+ assertTrue(Double.isNaN(mda2.getWaterTemperature()));
+ }
+
+ @Test
+ public void testSetMagneticWindDirection() {
+ mda.setMagneticWindDirection(123.4);
+ assertEquals(123.4, mda.getMagneticWindDirection(), 0.1);
+ }
+
+ @Test
+ public void testSetTrueWindDirection() {
+ mda.setTrueWindDirection(234.5);
+ assertEquals(234.5, mda.getTrueWindDirection(), 0.1);
+ }
+
+ @Test
+ public void testSetWindSpeed() {
+ mda.setWindSpeed(12.3);
+ assertEquals(12.3, mda.getWindSpeed(), 0.1);
+ }
+
+ @Test
+ public void testSetWindSpeedKnots() {
+ mda.setWindSpeedKnots(6.78);
+ assertEquals(6.78, mda.getWindSpeedKnots(), 0.01);
+ }
+
+ @Test
+ public void testSetAbsoluteHumidity() {
+ mda.setAbsoluteHumidity(34.5);
+ assertEquals(34.5, mda.getAbsoluteHumidity(), 0.1);
+ }
+
+ @Test
+ public void testSetAirTemperature() {
+ mda.setAirTemperature(18.9);
+ assertEquals(18.9, mda.getAirTemperature(), 0.1);
+ }
+
+ @Test
+ public void testSetSecondaryBarometricPressure() {
+ mda.setSecondaryBarometricPressure(0.99);
+ mda.setSecondaryBarometricPressureUnit('B');
+ assertEquals(0.99, mda.getSecondaryBarometricPressure(), 0.01);
+ assertEquals('B', mda.getSecondaryBarometricPressureUnit());
+ }
+
+ @Test
+ public void testSetPrimaryBarometricPressure() {
+ mda.setPrimaryBarometricPressure(29.53);
+ mda.setPrimaryBarometricPressureUnit('I');
+ assertEquals(29.53, mda.getPrimaryBarometricPressure(), 0.01);
+ assertEquals('I', mda.getPrimaryBarometricPressureUnit());
+ }
+
+ @Test
+ public void testSetRelativeHumidity() {
+ mda.setRelativeHumidity(55.5);
+ assertEquals(55.5, mda.getRelativeHumidity(), 0.1);
+ }
+
+ @Test
+ public void testSetDewPoint() {
+ mda.setDewPoint(6.7);
+ assertEquals(6.7, mda.getDewPoint(), 0.1);
+ }
+
+ @Test
+ public void testSetWaterTemperature() {
+ mda.setWaterTemperature(8.9);
+ assertEquals(8.9, mda.getWaterTemperature(), 0.1);
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MHUTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MHUTest.java
new file mode 100755
index 00000000000..6d3357b43c5
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MHUTest.java
@@ -0,0 +1,101 @@
+/*
+ * MHUTest.java
+ * Copyright (C) 2016 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import net.sf.marineapi.nmea.sentence.MHUSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import org.junit.Before;
+import org.junit.Test;
+
+import static junit.framework.Assert.assertEquals;
+
+/**
+ * MHU parser tests.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class MHUTest {
+
+ public static final String EXAMPLE = "$IIMHU,66.0,5.0,3.0,C";
+
+ private MHUSentence mhu;
+ private MHUSentence empty;
+
+ @Before
+ public void setUp() {
+ mhu = new MHUParser(EXAMPLE);
+ empty = new MHUParser(TalkerId.II);
+ assertEquals(4, mhu.getFieldCount());
+ }
+
+ @Test
+ public void testEmptySentenceConstructor() {
+ assertEquals(TalkerId.II, empty.getTalkerId());
+ assertEquals(SentenceId.MHU.toString(), empty.getSentenceId());
+ assertEquals(4, empty.getFieldCount());
+ assertEquals('C', empty.getDewPointUnit());
+ }
+
+ @Test
+ public void testGetRelativeHumidity() throws Exception {
+ assertEquals(66.0, mhu.getRelativeHumidity(), 0.1);
+ }
+
+ @Test
+ public void testGetAbsoluteHumidity() throws Exception {
+ assertEquals(5.0, mhu.getAbsoluteHumidity(), 0.1);
+ }
+
+ @Test
+ public void testGetDewPoint() throws Exception {
+ assertEquals(3.0, mhu.getDewPoint(), 0.1);
+ }
+
+ @Test
+ public void testGetDewPointUnit() throws Exception {
+ assertEquals('C', mhu.getDewPointUnit());
+ }
+
+ @Test
+ public void testSetRelativeHumidity() throws Exception {
+ mhu.setRelativeHumidity(55.55555);
+ assertEquals(55.6, mhu.getRelativeHumidity(), 0.1);
+ }
+
+ @Test
+ public void testSetAbsoluteHumidity() throws Exception {
+ mhu.setAbsoluteHumidity(6.1234);
+ assertEquals(6.1, mhu.getAbsoluteHumidity(), 0.1);
+ }
+
+ @Test
+ public void testSetDewPoint() throws Exception {
+ mhu.setDewPoint(1.2356);
+ assertEquals(1.2, mhu.getDewPoint(), 0.1);
+ }
+
+ @Test
+ public void testSetDewPointUnit() throws Exception {
+ mhu.setDewPointUnit('F');
+ assertEquals('F', mhu.getDewPointUnit());
+ }
+}
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MMBTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MMBTest.java
new file mode 100755
index 00000000000..40d8d36e2c3
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MMBTest.java
@@ -0,0 +1,59 @@
+package net.sf.marineapi.nmea.parser;
+
+import net.sf.marineapi.nmea.sentence.MMBSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * MMBTest
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class MMBTest {
+
+ public static final String EXAMPLE = "$IIMMB,29.9870,I,1.0154,B*75";
+
+ MMBSentence mmb;
+ MMBSentence empty;
+
+ @Before
+ public void setUp() throws Exception {
+ mmb = new MMBParser(EXAMPLE);
+ empty = new MMBParser(TalkerId.WI);
+ }
+
+ @Test
+ public void testConstructors() {
+ assertEquals(4, mmb.getFieldCount());
+ assertEquals(4, empty.getFieldCount());
+ assertEquals(TalkerId.II, mmb.getTalkerId());
+ assertEquals(TalkerId.WI, empty.getTalkerId());
+ assertEquals(SentenceId.MMB.name(), empty.getSentenceId());
+ }
+
+ @Test
+ public void testGetInchesOfMercury() throws Exception {
+ assertEquals(29.9870, mmb.getInchesOfMercury(), 0.0001);
+ }
+
+ @Test
+ public void testGetBars() throws Exception {
+ assertEquals(1.0154, mmb.getBars(), 0.0001);
+ }
+
+ @Test
+ public void testSetInchesOfMercury() throws Exception {
+ mmb.setInchesOfMercury(29.9999);
+ assertEquals(29.9999, mmb.getInchesOfMercury(), 0.0001);
+ }
+
+ @Test
+ public void testSetBars() throws Exception {
+ mmb.setBars(1.1234);
+ assertEquals(1.1234, mmb.getBars(), 0.0001);
+ }
+}
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MTATest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MTATest.java
new file mode 100755
index 00000000000..d23bccb19d0
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MTATest.java
@@ -0,0 +1,48 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.sentence.MTASentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class MTATest {
+
+ public static final String EXAMPLE = "$IIMTA,21.5,C";
+
+ private MTASentence mta;
+
+ @Before
+ public void setUp() throws Exception {
+ mta = new MTAParser(EXAMPLE);
+ }
+
+ @Test
+ public void testMTAParserString() {
+ assertEquals(TalkerId.II, mta.getTalkerId());
+ assertEquals(SentenceId.MTA.name(), mta.getSentenceId());
+ }
+
+ @Test
+ public void testMTAParserTalkerId() {
+ MTAParser empty = new MTAParser(TalkerId.WI);
+ assertEquals(TalkerId.WI, empty.getTalkerId());
+ assertEquals(SentenceId.MTA.name(), empty.getSentenceId());
+ assertTrue(empty.getCharValue(1) == 'C');
+ }
+
+ @Test
+ public void testGetTemperature() {
+ assertEquals(21.5, mta.getTemperature(), 0.01);
+ }
+
+ @Test
+ public void testSetTemperature() {
+ mta.setTemperature(15.3335);
+ assertEquals(15.33, mta.getTemperature(), 0.01);
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MTWTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MTWTest.java
new file mode 100755
index 00000000000..5a2408a23c6
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MTWTest.java
@@ -0,0 +1,73 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import net.sf.marineapi.nmea.sentence.MTWSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * MTW parser tests.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class MTWTest {
+
+ public static final String EXAMPLE = "$IIMTW,17.75,C";
+
+ private MTWSentence mtw;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ mtw = new MTWParser(EXAMPLE);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MTWParser#MTWParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testMTWParserString() {
+ assertEquals("MTW", mtw.getSentenceId());
+ assertEquals(TalkerId.II, mtw.getTalkerId());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MTWParser#MTWParser(net.sf.marineapi.nmea.sentence.TalkerId)}
+ * .
+ */
+ @Test
+ public void testMTWParserTalkerId() {
+ MTWParser empty = new MTWParser(TalkerId.II);
+ assertEquals("MTW", empty.getSentenceId());
+ assertEquals(TalkerId.II, empty.getTalkerId());
+ assertEquals(2, empty.getFieldCount());
+ assertEquals('C', empty.getCharValue(1));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MTWParser#getTemperature()}.
+ */
+ @Test
+ public void testGetTemperature() {
+ assertEquals(17.75, mtw.getTemperature(), 0.01);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MTWParser#setTemperature(double)}.
+ */
+ @Test
+ public void testSetTemperature() {
+ mtw.setTemperature(12.345);
+ assertEquals(12.345, mtw.getTemperature(), 0.01);
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MWDTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MWDTest.java
new file mode 100755
index 00000000000..cc563294542
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MWDTest.java
@@ -0,0 +1,79 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.sentence.MWDSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Richard van Nieuwenhoven
+ */
+public class MWDTest {
+
+ public static final String EXAMPLE = "$IIMWD,295.19,T,,M,5.09,N,2.62,M*56";
+
+ private MWDSentence mwd;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ mwd = new MWDParser(EXAMPLE);
+ }
+
+ @Test
+ public void testMWDParserTalkerId() {
+ MWDParser mwdp = new MWDParser(TalkerId.II);
+ assertEquals(TalkerId.II, mwdp.getTalkerId());
+ assertEquals(SentenceId.MWD.toString(), mwdp.getSentenceId());
+ }
+
+ @Test
+ public void testGetMagneticWindDirection() {
+ assertTrue(Double.isNaN(mwd.getMagneticWindDirection()));
+ }
+
+ @Test
+ public void testGetTrueWindDirection() {
+ assertEquals(295.19, mwd.getTrueWindDirection(), 0.1);
+ }
+
+ @Test
+ public void testGetWindSpeed() {
+ assertEquals(2.62, mwd.getWindSpeed(), 0.1);
+ }
+
+ @Test
+ public void testGetWindSpeedKnots() {
+ assertEquals(5.09, mwd.getWindSpeedKnots(), 0.1);
+ }
+
+ @Test
+ public void testSetMagneticWindDirection() {
+ mwd.setMagneticWindDirection(123.4);
+ assertEquals(123.4, mwd.getMagneticWindDirection(), 0.1);
+ }
+
+ @Test
+ public void testSetTrueWindDirection() {
+ mwd.setTrueWindDirection(234.5);
+ assertEquals(234.5, mwd.getTrueWindDirection(), 0.1);
+ }
+
+ @Test
+ public void testSetWindSpeed() {
+ mwd.setWindSpeed(12.3);
+ assertEquals(12.3, mwd.getWindSpeed(), 0.1);
+ }
+
+ @Test
+ public void testSetWindSpeedKnots() {
+ mwd.setWindSpeedKnots(6.2);
+ assertEquals(6.2, mwd.getWindSpeedKnots(), 0.1);
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MWVTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MWVTest.java
new file mode 100755
index 00000000000..5d8e283e7ee
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/MWVTest.java
@@ -0,0 +1,233 @@
+/*
+ * MWVTest.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.MWVSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.DataStatus;
+import net.sf.marineapi.nmea.util.Units;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class MWVTest {
+
+ public static final String EXAMPLE = "$IIMWV,125.1,T,5.5,M,A";
+
+ private MWVSentence mwv;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ mwv = new MWVParser(EXAMPLE);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#MWVParser(net.sf.marineapi.nmea.sentence.TalkerId)}
+ * .
+ */
+ @Test
+ public void testMWVParserTalkerId() {
+ MWVParser mwvp = new MWVParser(TalkerId.II);
+ assertEquals(TalkerId.II, mwvp.getTalkerId());
+ assertEquals(SentenceId.MWV.toString(), mwvp.getSentenceId());
+ assertEquals(DataStatus.VOID, mwvp.getStatus());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.MWVParser#getAngle()}
+ * .
+ */
+ @Test
+ public void testGetAngle() {
+ assertEquals(125.1, mwv.getAngle(), 0.1); // "$IIMWV,125.1,T,5.5,A"
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.MWVParser#getSpeed()}
+ * .
+ */
+ @Test
+ public void testGetSpeed() {
+ assertEquals(5.5, mwv.getSpeed(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#getSpeedUnit()}.
+ */
+ @Test
+ public void testGetSpeedUnit() {
+ assertEquals(Units.METER, mwv.getSpeedUnit());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#getStatus()}.
+ */
+ @Test
+ public void testGetStatus() {
+ assertEquals(DataStatus.ACTIVE, mwv.getStatus());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.MWVParser#isTrue()}.
+ */
+ @Test
+ public void testIsTrue() {
+ assertTrue(mwv.isTrue());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#setAngle(double)}.
+ */
+ @Test
+ public void testSetAngle() {
+ final double angle = 88.123;
+ mwv.setAngle(angle);
+ assertEquals(angle, mwv.getAngle(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#setAngle(double)}.
+ */
+ @Test
+ public void testSetNegativeAngle() {
+ final double angle = -0.1;
+ try {
+ mwv.setAngle(angle);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#setAngle(double)}.
+ */
+ @Test
+ public void testSetAngleOutOfRange() {
+ final double angle = 360.1;
+ try {
+ mwv.setAngle(angle);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#setSpeed(double)}.
+ */
+ @Test
+ public void testSetSpeed() {
+ final double speed = 7.75;
+ mwv.setSpeed(speed);
+ assertEquals(speed, mwv.getSpeed(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#setSpeed(double)}.
+ */
+ @Test
+ public void testSetNegativeSpeed() {
+ final double speed = -0.01;
+ try {
+ mwv.setSpeed(speed);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#setSpeedUnit(net.sf.marineapi.nmea.util.Units)}
+ * .
+ */
+ @Test
+ public void testSetSpeedUnit() {
+ mwv.setSpeedUnit(Units.KMH);
+ assertEquals(Units.KMH, mwv.getSpeedUnit());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#setSpeedUnit(net.sf.marineapi.nmea.util.Units)}
+ * .
+ */
+ @Test
+ public void testSetInvalidSpeedUnit() {
+ try {
+ mwv.setSpeedUnit(Units.FATHOMS);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#setStatus(net.sf.marineapi.nmea.util.DataStatus)}
+ * .
+ */
+ @Test
+ public void testSetStatus() {
+ mwv.setStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, mwv.getStatus());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.MWVParser#setTrue(boolean)}.
+ */
+ @Test
+ public void testSetTrue() {
+ assertTrue(mwv.isTrue());
+ mwv.setTrue(false);
+ assertFalse(mwv.isTrue());
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/PositionParserTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/PositionParserTest.java
new file mode 100755
index 00000000000..7e0a31fd694
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/PositionParserTest.java
@@ -0,0 +1,188 @@
+/*
+ * PositionParserTest.java
+ * Copyright (C) 2010 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.util.CompassPoint;
+import net.sf.marineapi.nmea.util.Position;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for PositionParser class.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class PositionParserTest {
+
+ private PositionParser instance;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ instance = new PositionParser(GLLTest.EXAMPLE, SentenceId.GLL) {
+ };
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#parseHemisphereLat(int)}
+ * .
+ */
+ @Test
+ public void testParseHemisphereLat() {
+ assertEquals(CompassPoint.NORTH, instance.parseHemisphereLat(1));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#parseHemisphereLon(int)}
+ * .
+ */
+ @Test
+ public void testParseHemisphereLon() {
+ assertEquals(CompassPoint.EAST, instance.parseHemisphereLon(3));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#parseLatitude(int)}.
+ */
+ @Test
+ public void testParseLatitude() {
+ // 6011.552
+ final double lat = 60 + (11.552 / 60);
+ assertEquals(lat, instance.parseLatitude(0), 0.000001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#parseLongitude(int)}.
+ */
+ @Test
+ public void testParseLongitude() {
+ // 02501.941
+ final double lat = 25 + (01.941 / 60);
+ assertEquals(lat, instance.parseLongitude(2), 0.000001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#setLatHemisphere(int, net.sf.marineapi.nmea.util.CompassPoint)}
+ * .
+ */
+ @Test
+ public void testSetLatHemisphere() {
+ instance.setLatHemisphere(1, CompassPoint.SOUTH);
+ assertTrue(instance.toString().contains(",S,"));
+ assertEquals(CompassPoint.SOUTH, instance.parseHemisphereLat(1));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#setLatitude(int, double)}
+ * .
+ */
+ @Test
+ public void testSetLatitude() {
+ // 2501.941
+ final double lat = 25 + (01.941 / 60);
+ instance.setLatitude(0, lat);
+ assertTrue(instance.toString().contains(",02501.941"));
+ assertEquals(lat, instance.parseLatitude(0), 0.000001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#setLongitude(int, double)}
+ * .
+ */
+ @Test
+ public void testSetLongitude() {
+ // 02801.941
+ final double lon = 28 + (01.941 / 60);
+ instance.setLongitude(2, lon);
+ assertTrue(instance.toString().contains(",02801.941"));
+ assertEquals(lon, instance.parseLongitude(2), 0.000001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#setLonHemisphere(int, net.sf.marineapi.nmea.util.CompassPoint)}
+ * .
+ */
+ @Test
+ public void testSetLonHemisphere() {
+ instance.setLonHemisphere(3, CompassPoint.WEST);
+ assertTrue(instance.toString().contains(",W,"));
+ assertEquals(CompassPoint.WEST, instance.parseHemisphereLon(3));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#setPositionValues(Position, int, int, int, int)
+ */
+ @Test
+ public void testSetPositionValuesNE() {
+
+ final double lat = 60 + (11.552 / 60);
+ final double lon = 25 + (1.941 / 60);
+ Position p2 = new Position(lat, lon);
+ instance.setPositionValues(p2, 0, 1, 2, 3);
+
+ final String s2 = instance.toString();
+ final Position p = instance.parsePosition(0, 1, 2, 3);
+
+ assertTrue(s2.contains(",6011.552,N,"));
+ assertTrue(s2.contains(",02501.941,E,"));
+ assertNotNull(p);
+ assertEquals(lat, p.getLatitude(), 0.0000001);
+ assertEquals(lon, p.getLongitude(), 0.0000001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.PositionParser#setPositionValues(Position, int, int, int, int)
+ */
+ @Test
+ public void testSetPositionValuesSW() {
+
+ final double lat = -60 - (11.552 / 60);
+ final double lon = -25 - (1.941 / 60);
+ Position p2 = new Position(lat, lon);
+ instance.setPositionValues(p2, 0, 1, 2, 3);
+
+ final String s2 = instance.toString();
+ final Position p = instance.parsePosition(0, 1, 2, 3);
+
+ assertTrue(s2.contains(",6011.552,S,"));
+ assertTrue(s2.contains(",02501.941,W,"));
+ assertNotNull(p);
+ assertEquals(lat, p.getLatitude(), 0.0000001);
+ assertEquals(lon, p.getLongitude(), 0.0000001);
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RMBTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RMBTest.java
new file mode 100755
index 00000000000..c965ddf5be2
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RMBTest.java
@@ -0,0 +1,326 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.RMBSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.CompassPoint;
+import net.sf.marineapi.nmea.util.DataStatus;
+import net.sf.marineapi.nmea.util.Direction;
+import net.sf.marineapi.nmea.util.Waypoint;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the RMB sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class RMBTest {
+
+ /** Example sentence */
+ public static final String EXAMPLE = "$GPRMB,A,0.00,R,,RUSKI,5536.200,N,01436.500,E,432.3,234.9,,V*58";
+
+ private RMBSentence empty;
+ private RMBSentence rmb;
+
+ /**
+ * setUp
+ */
+ @Before
+ public void setUp() {
+ try {
+ empty = new RMBParser(TalkerId.GP);
+ rmb = new RMBParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(13, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#getArrivalStatus()}.
+ */
+ @Test
+ public void testArrivalStatus() {
+
+ assertEquals(DataStatus.VOID, rmb.getArrivalStatus());
+ assertFalse(rmb.hasArrived());
+
+ rmb.setArrivalStatus(DataStatus.ACTIVE);
+ assertEquals(DataStatus.ACTIVE, rmb.getArrivalStatus());
+ assertTrue(rmb.hasArrived());
+
+ rmb.setArrivalStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, rmb.getArrivalStatus());
+ assertFalse(rmb.hasArrived());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#getBearing()} .
+ */
+ @Test
+ public void testGetBearing() {
+ assertEquals(234.9, rmb.getBearing(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#getCrossTrackError()}.
+ */
+ @Test
+ public void testGetCrossTrackError() {
+ assertEquals(0.0, rmb.getCrossTrackError(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#getDestination()} .
+ */
+ @Test
+ public void testGetDestination() {
+ final String id = "RUSKI";
+ final double lat = 55 + (36.200 / 60);
+ final double lon = 14 + (36.500 / 60);
+
+ Waypoint wp = rmb.getDestination();
+ assertNotNull(wp);
+ assertEquals(id, wp.getId());
+ assertEquals(lat, wp.getLatitude(), 0.0000001);
+ assertEquals(lon, wp.getLongitude(), 0.0000001);
+ assertEquals(CompassPoint.NORTH, wp.getLatitudeHemisphere());
+ assertEquals(CompassPoint.EAST, wp.getLongitudeHemisphere());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#getOriginId()}.
+ */
+ @Test
+ public void testGetOriginId() {
+ // FIXME test data should contain ID
+ try {
+ assertEquals("", rmb.getOriginId());
+ fail("Did not throw ParseException");
+ } catch (Exception e) {
+ assertTrue(e instanceof DataNotAvailableException);
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RMBParser#getRange()}
+ * .
+ */
+ @Test
+ public void testGetRange() {
+ assertEquals(432.3, rmb.getRange(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#getStatus()}.
+ */
+ @Test
+ public void testGetStatus() {
+ assertEquals(DataStatus.ACTIVE, rmb.getStatus());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#getSteerTo()}.
+ */
+ @Test
+ public void testGetSteerTo() {
+ assertEquals(Direction.RIGHT, rmb.getSteerTo());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#getVelocity()}.
+ */
+ @Test
+ public void testGetVelocity() {
+ // FIXME test data should contain velocity
+ try {
+ assertEquals(0.0, rmb.getVelocity(), 0.001);
+ fail("Did not throw ParseException");
+ } catch (Exception e) {
+ assertTrue(e instanceof DataNotAvailableException);
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setBearing(double)} .
+ */
+ @Test
+ public void testSetBearing() {
+ final double brg = 90.56789;
+ rmb.setBearing(brg);
+ assertTrue(rmb.toString().contains(",090.6,"));
+ assertEquals(brg, rmb.getBearing(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setBearing(double)} .
+ */
+ @Test
+ public void testSetBearingWithNegativeValue() {
+ try {
+ rmb.setBearing(-0.001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("0..360"));
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setBearing(double)} .
+ */
+ @Test
+ public void testSetBearingWithValueGreaterThanAllowed() {
+ try {
+ rmb.setBearing(360.001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("0..360"));
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setCrossTrackError(double)}
+ * .
+ */
+ @Test
+ public void testSetCrossTrackError() {
+ final double xte = 2.56789;
+ rmb.setCrossTrackError(xte);
+ assertTrue(rmb.toString().contains(",2.57,"));
+ assertEquals(xte, rmb.getCrossTrackError(), 0.2);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setDestination(Waypoint)} .
+ */
+ @Test
+ public void testSetDestination() {
+
+ final String id = "MYDEST";
+ final double lat = 61 + (1.111 / 60);
+ final double lon = 27 + (7.777 / 60);
+ Waypoint d = new Waypoint(id, lat, lon);
+
+ rmb.setDestination(d);
+
+ String str = rmb.toString();
+ Waypoint wp = rmb.getDestination();
+
+ assertTrue(str.contains(",MYDEST,6101.111,N,02707.777,E,"));
+ assertNotNull(wp);
+ assertEquals(id, wp.getId());
+ assertEquals(lat, wp.getLatitude(), 0.0000001);
+ assertEquals(lon, wp.getLongitude(), 0.0000001);
+ assertEquals(CompassPoint.NORTH, wp.getLatitudeHemisphere());
+ assertEquals(CompassPoint.EAST, wp.getLongitudeHemisphere());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setOriginId(String)}.
+ */
+ @Test
+ public void testSetOriginId() {
+ rmb.setOriginId("ORIGIN");
+ assertTrue(rmb.toString().contains(",ORIGIN,RUSKI,"));
+ assertEquals("ORIGIN", rmb.getOriginId());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setRange(double)} .
+ */
+ @Test
+ public void testSetRange() {
+ final double range = 12.3456;
+ rmb.setRange(range);
+ assertTrue(rmb.toString().contains(",12.3,"));
+ assertEquals(range, rmb.getRange(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setStatus(DataStatus)}.
+ */
+ @Test
+ public void testSetStatus() {
+ rmb.setStatus(DataStatus.ACTIVE);
+ assertEquals(DataStatus.ACTIVE, rmb.getStatus());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setSteerTo(CompassPoint)}.
+ */
+ @Test
+ public void testSetSteerTo() {
+ rmb.setSteerTo(Direction.LEFT);
+ assertTrue(rmb.toString().contains(",L,"));
+ assertEquals(Direction.LEFT, rmb.getSteerTo());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setSteerTo(CompassPoint)}.
+ */
+ @Test
+ public void testSetSteerToWithNull() {
+ try {
+ rmb.setSteerTo(null);
+ fail("Did not throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("LEFT or RIGHT"));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setVelocity()}.
+ */
+ @Test
+ public void testSetVelocity() {
+ final double v = 40.66666;
+ rmb.setVelocity(v);
+ assertTrue(rmb.toString().contains(",40.7,"));
+ assertEquals(v, rmb.getVelocity(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMBParser#setVelocity()}.
+ */
+ @Test
+ public void testSetVelocityWithNegativeValue() {
+ final double v = -0.123;
+ rmb.setVelocity(v);
+ assertTrue(rmb.toString().contains(",-0.1,"));
+ assertEquals(v, rmb.getVelocity(), 0.1);
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RMCTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RMCTest.java
new file mode 100755
index 00000000000..c2681401e8a
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RMCTest.java
@@ -0,0 +1,322 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.CompassPoint;
+import net.sf.marineapi.nmea.util.DataStatus;
+import net.sf.marineapi.nmea.util.Date;
+import net.sf.marineapi.nmea.util.FaaMode;
+import net.sf.marineapi.nmea.util.Position;
+import net.sf.marineapi.nmea.util.Time;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the RMC sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class RMCTest {
+
+ /** Example sentence */
+ public static final String EXAMPLE = "$GPRMC,120044.567,A,6011.552,N,02501.941,E,000.0,360.0,160705,006.1,E,A*0B";
+
+ /** Example of legacy format (short by one field) */
+ public static final String EXAMPLE_LEGACY = "$GPRMC,183729,A,3907.356,N,12102.482,W,000.0,360.0,080301,015.5,E*6F";
+
+ RMCParser empty;
+ RMCParser rmc;
+ RMCParser legacy;
+
+ @Before
+ public void setUp() {
+ try {
+ empty = new RMCParser(TalkerId.GP);
+ rmc = new RMCParser(EXAMPLE);
+ legacy = new RMCParser(EXAMPLE_LEGACY);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(12, empty.getFieldCount());
+ assertEquals(11, legacy.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#getCourse()} .
+ */
+ @Test
+ public void testGetCorrectedCourse() {
+ double expected = rmc.getCourse() + rmc.getVariation();
+ assertEquals(expected, rmc.getCorrectedCourse(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#getCourse()} .
+ */
+ @Test
+ public void testGetCourse() {
+ assertEquals(360.0, rmc.getCourse(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#getDataStatus()}.
+ */
+ @Test
+ public void testGetDataStatus() {
+ assertEquals(DataStatus.ACTIVE, rmc.getStatus());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RMCParser#getDate()}.
+ */
+ @Test
+ public void testGetDate() {
+ Date expected = new Date(2005, 7, 16);
+ Date parsed = rmc.getDate();
+ assertEquals(expected, parsed);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RMCParser#getDay()}.
+ */
+ @Test
+ public void testGetDay() {
+ assertEquals(16, rmc.getDate().getDay());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#getDirectionOfVariation()}
+ * .
+ */
+ @Test
+ public void testGetDirectionOfVariation() {
+ assertTrue(rmc.getVariation() < 0);
+ assertEquals(CompassPoint.EAST, rmc.getDirectionOfVariation());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RMCParser#getMode()}.
+ */
+ @Test
+ public void testGetFaaMode() {
+ assertEquals(FaaMode.AUTOMATIC, rmc.getMode());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#getVariation()} .
+ */
+ @Test
+ public void testGetMagneticVariation() {
+ assertEquals(-6.1, rmc.getVariation(), 0.001);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RMCParser#getMonth()}
+ * .
+ */
+ @Test
+ public void testGetMonth() {
+ assertEquals(7, rmc.getDate().getMonth());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#getPosition()}.
+ */
+ @Test
+ public void testGetPosition() {
+ final double lat = 60 + (11.552 / 60);
+ final double lon = 25 + (1.941 / 60);
+
+ Position p = rmc.getPosition();
+ assertNotNull(p);
+ assertEquals(lat, p.getLatitude(), 0.0000001);
+ assertEquals(lon, p.getLongitude(), 0.0000001);
+ assertEquals(CompassPoint.NORTH, p.getLatitudeHemisphere());
+ assertEquals(CompassPoint.EAST, p.getLongitudeHemisphere());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RMCParser#getSpeed()}
+ * .
+ */
+ @Test
+ public void testGetSpeed() {
+ assertEquals(0.0, rmc.getSpeed(), 0.001);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RMCParser#getTime()}.
+ */
+ @Test
+ public void testGetTime() {
+ Time t = rmc.getTime();
+ assertNotNull(t);
+ assertEquals(12, t.getHour());
+ assertEquals(0, t.getMinutes());
+ assertEquals(44.567, t.getSeconds(), 0.001);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RMCParser#getYear()}.
+ */
+ @Test
+ public void testGetYear() {
+ assertEquals(2005, rmc.getDate().getYear());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#setCourse(double)} .
+ */
+ @Test
+ public void testSetCourse() {
+ final double cog = 90.55555;
+ rmc.setCourse(cog);
+ assertTrue(rmc.toString().contains(",090.6,"));
+ assertEquals(cog, rmc.getCourse(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#setDataStatus(DataStatus)}.
+ */
+ @Test
+ public void testSetDataStatus() {
+ rmc.setStatus(DataStatus.ACTIVE);
+ assertEquals(DataStatus.ACTIVE, rmc.getStatus());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#getTime()}.
+ */
+ @Test
+ public void testSetDate() {
+ rmc.setDate(new Date(2010, 6, 9));
+ assertTrue(rmc.toString().contains(",360.0,090610,006.1,"));
+ rmc.setDate(new Date(2010, 11, 12));
+ assertTrue(rmc.toString().contains(",360.0,121110,006.1,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#getDirectionOfVariation()}
+ * .
+ */
+ @Test
+ public void testSetDirectionOfVariation() {
+ rmc.setDirectionOfVariation(CompassPoint.WEST);
+ assertEquals(CompassPoint.WEST, rmc.getDirectionOfVariation());
+ rmc.setDirectionOfVariation(CompassPoint.EAST);
+ assertEquals(CompassPoint.EAST, rmc.getDirectionOfVariation());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#getDirectionOfVariation()}
+ * .
+ */
+ @Test
+ public void testSetDirectionOfVariationWithInvalidDirection() {
+ try {
+ rmc.setDirectionOfVariation(CompassPoint.NORTH);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#setFaaMode()}.
+ */
+ @Test
+ public void testSetFaaMode() {
+ rmc.setMode(FaaMode.SIMULATED);
+ assertEquals(FaaMode.SIMULATED, rmc.getMode());
+ rmc.setMode(FaaMode.ESTIMATED);
+ assertEquals(FaaMode.ESTIMATED, rmc.getMode());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#setFaaMode()}.
+ */
+ @Test
+ public void testSetFaaModeWhenOmitted() {
+ RMCParser parser = new RMCParser("$GPRMC,120044.567,A,6011.552,N,02501.941,E,000.0,360.0,160705,006.1,E");
+ parser.setMode(FaaMode.SIMULATED);
+ assertEquals(FaaMode.SIMULATED, parser.getMode());
+ parser.setMode(FaaMode.ESTIMATED);
+ assertEquals(FaaMode.ESTIMATED, parser.getMode());
+ }
+
+ @Test
+ public void testSetPosition() {
+ final double lat = 61 + (1.111 / 60);
+ final double lon = 27 + (7.777 / 60);
+ Position p = new Position(lat, lon);
+ rmc.setPosition(p);
+
+ String str = rmc.toString();
+ Position wp = rmc.getPosition();
+
+ assertTrue(str.contains(",6101.111,N,02707.777,E,"));
+ assertNotNull(wp);
+ assertEquals(lat, wp.getLatitude(), 0.0000001);
+ assertEquals(lon, wp.getLongitude(), 0.0000001);
+ assertEquals(CompassPoint.NORTH, wp.getLatitudeHemisphere());
+ assertEquals(CompassPoint.EAST, wp.getLongitudeHemisphere());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#setSpeed(double)} .
+ */
+ @Test
+ public void testSetSpeed() {
+ final double sog = 35.23456;
+ rmc.setSpeed(sog);
+ assertTrue(rmc.toString().contains(",35.2,"));
+ assertEquals(sog, rmc.getSpeed(), 0.1);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RMCParser#getTime()}.
+ */
+ @Test
+ public void testSetTime() {
+ Time t = new Time(1, 2, 3.456);
+ rmc.setTime(t);
+ assertTrue(rmc.toString().contains("$GPRMC,010203.456,A,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RMCParser#setVariation(double)} .
+ */
+ @Test
+ public void testSetVariation() {
+ final double var = 1.55555;
+ rmc.setVariation(var);
+ rmc.setDirectionOfVariation(CompassPoint.WEST);
+ assertTrue(rmc.toString().contains(",001.6,W,"));
+ assertEquals(var, rmc.getVariation(), 0.1);
+ assertEquals(CompassPoint.WEST, rmc.getDirectionOfVariation());
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/ROTTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/ROTTest.java
new file mode 100755
index 00000000000..69ac43440eb
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/ROTTest.java
@@ -0,0 +1,67 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.ROTSentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.DataStatus;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by SJK on 22/01/14.
+ */
+public class ROTTest {
+
+ public static final String EXAMPLE = "$HCROT,-0.3,A";
+ public static final String INVALID_EXAMPLE = "$HCROT,-0.3,V";
+ ROTSentence rot;
+ ROTSentence irot;
+
+ @Before
+ public void setUp() throws Exception {
+ rot = new ROTParser(EXAMPLE);
+ irot = new ROTParser(INVALID_EXAMPLE);
+ }
+
+ @Test
+ public void testConstructor() {
+ ROTSentence empty = new ROTParser(TalkerId.HE);
+ assertEquals(TalkerId.HE, empty.getTalkerId());
+ assertEquals(SentenceId.ROT.toString(), empty.getSentenceId());
+ try {
+ empty.getRateOfTurn();
+ } catch (DataNotAvailableException e) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testGetStatus() {
+ assertEquals(DataStatus.ACTIVE, rot.getStatus());
+ assertEquals(DataStatus.VOID, irot.getStatus());
+ }
+
+ @Test
+ public void testSetStatus() {
+ rot.setStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, rot.getStatus());
+ }
+
+ @Test
+ public void testGetRateOfTurn() {
+ double value = rot.getRateOfTurn();
+ assertEquals(-0.3, value, 0.1);
+ }
+
+ @Test
+ public void testSetRateOfTurn() {
+ final double newValue = 0.5;
+ rot.setRateOfTurn(newValue);
+ assertEquals(newValue, rot.getRateOfTurn(), 0.1);
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RPMTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RPMTest.java
new file mode 100755
index 00000000000..ee35963907c
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RPMTest.java
@@ -0,0 +1,111 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.RPMSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.DataStatus;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class RPMTest {
+
+ public static final String EXAMPLE = "$IIRPM,E,1,2418.2,10.5,A";
+
+ RPMSentence rpm;
+ RPMSentence empty;
+
+ @Before
+ public void setUp() throws Exception {
+ rpm = new RPMParser(EXAMPLE);
+ empty = new RPMParser(TalkerId.II);
+ }
+
+ @Test
+ public void testRPMParserString() {
+ assertEquals(TalkerId.II, rpm.getTalkerId());
+ assertEquals("RPM", rpm.getSentenceId());
+ assertEquals(5, rpm.getFieldCount());
+ }
+
+ @Test
+ public void testRPMParserTalkerId() {
+ assertEquals(TalkerId.II, empty.getTalkerId());
+ assertEquals("RPM", empty.getSentenceId());
+ assertEquals(5, empty.getFieldCount());
+ }
+
+ @Test
+ public void testGetId() {
+ assertEquals(1, rpm.getId());
+ }
+
+ @Test
+ public void testGetPitch() {
+ assertEquals(10.5, rpm.getPitch(), 0.1);
+ }
+
+ @Test
+ public void testGetRPM() {
+ assertEquals(2418.2, rpm.getRPM(), 0.1);
+ }
+
+ @Test
+ public void testGetSource() {
+ assertEquals('E', rpm.getSource());
+ }
+
+ @Test
+ public void testGetStatus() {
+ assertEquals(DataStatus.ACTIVE, rpm.getStatus());
+ }
+
+ @Test
+ public void testIsEngine() {
+ assertTrue(rpm.isEngine());
+ }
+
+ @Test
+ public void testIsShaft() {
+ assertFalse(rpm.isShaft());
+ }
+
+ @Test
+ public void testSetId() {
+ empty.setId(2);
+ assertEquals(2, empty.getId());
+ }
+
+ @Test
+ public void testSetPitch() {
+ empty.setPitch(3.14);
+ assertEquals(3.1, empty.getPitch(), 0.1);
+ }
+
+ @Test
+ public void testSetSource() {
+ empty.setSource(RPMSentence.SHAFT);
+ assertTrue(empty.isShaft());
+ assertEquals(RPMSentence.SHAFT, empty.getSource());
+ }
+
+ @Test
+ public void testSetInvalidSource() {
+ try {
+ empty.setSource('A');
+ fail("Didn't throw exception");
+ } catch (Exception e) {
+ // pass
+ }
+ }
+
+ @Test
+ public void testSetStatus() {
+ empty.setStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, empty.getStatus());
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RSATest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RSATest.java
new file mode 100755
index 00000000000..93a3259dcff
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RSATest.java
@@ -0,0 +1,73 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import net.sf.marineapi.nmea.sentence.RSASentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.DataStatus;
+import net.sf.marineapi.nmea.util.Side;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class RSATest {
+
+ public static final String EXAMPLE = "$IIRSA,1.2,A,2.3,V";
+
+ RSASentence empty;
+ RSASentence instance;
+
+ @Before
+ public void setUp() throws Exception {
+ empty = new RSAParser(TalkerId.II);
+ instance = new RSAParser(EXAMPLE);
+ }
+
+ @Test
+ public void testRSAParserString() {
+ assertEquals(TalkerId.II, instance.getTalkerId());
+ assertEquals(SentenceId.RSA.name(), instance.getSentenceId());
+ }
+
+ @Test
+ public void testRSAParserTalkerId() {
+ assertEquals(TalkerId.II, empty.getTalkerId());
+ assertEquals(SentenceId.RSA.name(), empty.getSentenceId());
+ assertEquals(DataStatus.VOID, empty.getStatus(Side.STARBOARD));
+ assertEquals(DataStatus.VOID, empty.getStatus(Side.PORT));
+ }
+
+ @Test
+ public void testGetRudderAngle() {
+ assertEquals(1.2, instance.getRudderAngle(Side.STARBOARD), 0.1);
+ assertEquals(2.3, instance.getRudderAngle(Side.PORT), 0.1);
+ }
+
+ @Test
+ public void testSetRudderAngle() {
+ final double portAngle = 4.5;
+ final double starboardAngle = 5.6;
+ instance.setRudderAngle(Side.PORT, portAngle);
+ instance.setRudderAngle(Side.STARBOARD, starboardAngle);
+ assertEquals(portAngle, instance.getRudderAngle(Side.PORT), 0.1);
+ assertEquals(starboardAngle, instance.getRudderAngle(Side.STARBOARD), 0.1);
+ }
+
+ @Test
+ public void testGetStatus() {
+ assertEquals(DataStatus.ACTIVE, instance.getStatus(Side.STARBOARD));
+ assertEquals(DataStatus.VOID, instance.getStatus(Side.PORT));
+ }
+
+ @Test
+ public void testSetStatusPort() {
+ empty.setStatus(Side.PORT, DataStatus.ACTIVE);
+ assertEquals(DataStatus.ACTIVE, empty.getStatus(Side.PORT));
+ }
+
+ @Test
+ public void testSetStatusStarboard() {
+ empty.setStatus(Side.STARBOARD, DataStatus.ACTIVE);
+ assertEquals(DataStatus.ACTIVE, empty.getStatus(Side.STARBOARD));
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RTETest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RTETest.java
new file mode 100755
index 00000000000..a73f24acd07
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/RTETest.java
@@ -0,0 +1,250 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Arrays;
+
+import net.sf.marineapi.nmea.sentence.RTESentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.RouteType;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * RTETest
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class RTETest {
+
+ /** Example sentence */
+ public static final String EXAMPLE = "$GPRTE,1,1,c,0,MELIN,RUSKI,KNUDAN*25";
+
+ private RTESentence empty;
+ private RTESentence rte;
+
+ @Before
+ public void setUp() {
+ try {
+ empty = new RTEParser(TalkerId.GP);
+ rte = new RTEParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(4, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#addWaypointId(String)}.
+ */
+ @Test
+ public void testAddWaypointId() {
+ empty.addWaypointId("1ST");
+ assertTrue(empty.toString().contains(",1ST*"));
+
+ empty.addWaypointId("2ND");
+ assertTrue(empty.toString().contains(",1ST,2ND*"));
+
+ empty.addWaypointId("3RD");
+ assertTrue(empty.toString().contains(",1ST,2ND,3RD*"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#getRouteId()}.
+ */
+ @Test
+ public void testGetRouteId() {
+ assertEquals("0", rte.getRouteId());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#getSentenceCount()}.
+ */
+ @Test
+ public void testGetSentenceCount() {
+ assertEquals(1, rte.getSentenceCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#getSentenceIndex()}.
+ */
+ @Test
+ public void testGetSentenceIndex() {
+ assertEquals(1, rte.getSentenceIndex());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#getWaypointCount()}.
+ */
+ @Test
+ public void testGetWaypointCount() {
+ assertEquals(3, rte.getWaypointCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#getWaypointIds()}.
+ */
+ @Test
+ public void testGetWaypointIds() {
+ String[] ids = rte.getWaypointIds();
+ assertNotNull(ids);
+ assertEquals(3, ids.length);
+ assertEquals("MELIN", ids[0]);
+ assertEquals("RUSKI", ids[1]);
+ assertEquals("KNUDAN", ids[2]);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#isActiveRoute()}.
+ */
+ @Test
+ public void testIsActiveRoute() {
+ assertTrue(rte.isActiveRoute());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RTEParser#isFirst()}.
+ */
+ @Test
+ public void testIsFirst() {
+ assertTrue(rte.isFirst());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.RTEParser#isLast()}.
+ */
+ @Test
+ public void testIsLast() {
+ assertTrue(rte.isLast());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#isWorkingRoute()}.
+ */
+ @Test
+ public void testIsWorkingRoute() {
+ assertFalse(rte.isWorkingRoute());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#getRouteId()}.
+ */
+ @Test
+ public void testSetRouteId() {
+ rte.setRouteId("ID");
+ assertEquals("ID", rte.getRouteId());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#isActiveRoute()}.
+ */
+ @Test
+ public void testSetRouteTypeActive() {
+ rte.setRouteType(RouteType.ACTIVE);
+ assertTrue(rte.isActiveRoute());
+ assertFalse(rte.isWorkingRoute());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#isActiveRoute()}.
+ */
+ @Test
+ public void testSetRouteTypeWorking() {
+ rte.setRouteType(RouteType.WORKING);
+ assertTrue(rte.isWorkingRoute());
+ assertFalse(rte.isActiveRoute());
+
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#setSentenceCount(int)}.
+ */
+ @Test
+ public void testSetSentenceCount() {
+ rte.setSentenceCount(3);
+ assertEquals(3, rte.getSentenceCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#setSentenceCount(int)}.
+ */
+ @Test
+ public void testSetSentenceCountWithNegativeValue() {
+ try {
+ rte.setSentenceCount(-1);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("cannot be negative"));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#setSentenceIndex(int)}.
+ */
+ @Test
+ public void testSetSentenceIndex() {
+ rte.setSentenceIndex(2);
+ assertEquals(2, rte.getSentenceIndex());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#setSentenceIndex(int)}.
+ */
+ @Test
+ public void testSetSentenceIndexWithNegativeValue() {
+ try {
+ rte.setSentenceIndex(-1);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("cannot be negative"));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.RTEParser#setWaypointIds(String[])}.
+ */
+ @Test
+ public void testSetWaypointIds() {
+ final String[] ids = { "ONE", "TWO", "THREE", "FOUR", "FIVE" };
+ final String expected = "$GPRTE,1,1,c,0,ONE,TWO,THREE,FOUR,FIVE*7F";
+ rte.setWaypointIds(ids);
+ assertEquals(5, rte.getWaypointCount());
+ assertEquals(expected, rte.toString());
+ assertTrue(Arrays.equals(ids, rte.getWaypointIds()));
+
+ empty.setWaypointIds(ids);
+ assertEquals(5, empty.getWaypointCount());
+ assertTrue(empty.toString().startsWith(
+ "$GPRTE,,,,,ONE,TWO,THREE,FOUR,FIVE*"));
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/SentenceFactoryTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/SentenceFactoryTest.java
new file mode 100755
index 00000000000..91225bfc98d
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/SentenceFactoryTest.java
@@ -0,0 +1,304 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.List;
+
+import net.sf.marineapi.nmea.sentence.BODSentence;
+import net.sf.marineapi.nmea.sentence.Sentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.test.util.BARParser;
+import net.sf.marineapi.test.util.FOOParser;
+import net.sf.marineapi.test.util.FOOSentence;
+import net.sf.marineapi.test.util.VDMParser;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class SentenceFactoryTest {
+
+ private final SentenceFactory instance = SentenceFactory.getInstance();
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ instance.reset();
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testSupportedTypesRegistered() {
+ for (SentenceId id : SentenceId.values()) {
+ String msg = "Parser not registered: " + id;
+ assertTrue(msg, instance.hasParser(id.toString()));
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testCreateParser() {
+ Sentence bod = instance.createParser(BODTest.EXAMPLE);
+ assertNotNull(bod);
+ assertTrue(bod instanceof Sentence);
+ assertTrue(bod instanceof BODSentence);
+ assertTrue(bod instanceof BODParser);
+ assertEquals(BODTest.EXAMPLE, bod.toSentence());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(TalkerId, SentenceId)
+ * .
+ */
+ @Test
+ public void testCreateEmptyParserWithSentenceId() {
+ for (SentenceId id : SentenceId.values()) {
+ Sentence s = instance.createParser(TalkerId.II, id);
+ assertNotNull(s);
+ assertTrue(s instanceof Sentence);
+ assertTrue(s instanceof SentenceParser);
+ assertEquals(TalkerId.II, s.getTalkerId());
+ assertEquals(id.name(), s.getSentenceId());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testCreateEmptyParserWithSentenceIdStr() {
+ for (SentenceId id : SentenceId.values()) {
+ Sentence s = instance.createParser(TalkerId.II, id.name());
+ assertNotNull(s);
+ assertTrue(s instanceof Sentence);
+ assertTrue(s instanceof SentenceParser);
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testCreateCustomParser() {
+
+ try {
+ instance.registerParser("FOO", FOOParser.class);
+ assertTrue(instance.hasParser("FOO"));
+ } catch (Exception e) {
+ fail("parser registering failed");
+ }
+
+ Sentence s = null;
+ try {
+ s = instance.createParser("$IIFOO,aa,bb,cc");
+ } catch (Exception e) {
+ fail("sentence parsing failed");
+ }
+
+ assertNotNull(s);
+ assertTrue(s instanceof Sentence);
+ assertTrue(s instanceof SentenceParser);
+ assertTrue(s instanceof FOOParser);
+ assertEquals(TalkerId.II, s.getTalkerId());
+ assertEquals("FOO", s.getSentenceId());
+ assertEquals("aa", ((FOOSentence)s).getValueA());
+ assertEquals("bb", ((FOOSentence)s).getValueB());
+ assertEquals("cc", ((FOOSentence)s).getValueC());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testCreateEmptyCustomParser() {
+
+ try {
+ instance.registerParser("FOO", FOOParser.class);
+ assertTrue(instance.hasParser("FOO"));
+ } catch (Exception e) {
+ fail("parser registering failed");
+ }
+
+ Sentence s = instance.createParser(TalkerId.II, "FOO");
+ assertNotNull(s);
+ assertTrue(s instanceof Sentence);
+ assertTrue(s instanceof SentenceParser);
+ assertTrue(s instanceof FOOParser);
+ assertEquals("FOO", s.getSentenceId());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testCreateParserWithEmptyString() {
+ try {
+ instance.createParser("");
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testCreateParserWithNull() {
+ try {
+ instance.createParser(null);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testCreateParserWithRandom() {
+ try {
+ instance.createParser("asdqas,dwersa,dsdfas,das");
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testCreateParserWithUnregistered() {
+ try {
+ instance.createParser("$GPXYZ,1,2,3,4,5,6,7,8");
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#registerParser(java.lang.String, java.lang.Class)}
+ * .
+ */
+ @Test
+ public void testRegisterParserWithAlternativeBeginChar() {
+
+ try {
+ instance.registerParser("VDM", VDMParser.class);
+ assertTrue(instance.hasParser("VDM"));
+ } catch (Exception e) {
+ fail("parser registering failed");
+ }
+
+ Sentence s = instance.createParser("!AIVDM,1,2,3");
+ assertNotNull(s);
+ assertTrue(s instanceof Sentence);
+ assertTrue(s instanceof SentenceParser);
+ assertTrue(s instanceof VDMParser);
+ instance.unregisterParser(VDMParser.class);
+ assertFalse(instance.hasParser("VDM"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#registerParser(java.lang.String, java.lang.Class)}
+ * .
+ */
+ @Test
+ public void testRegisterInvalidParser() {
+ try {
+ instance.registerParser("BAR", BARParser.class);
+ fail("did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#registerParser(java.lang.String, java.lang.Class)}
+ * .
+ */
+ @Test
+ public void testUnregisterParser() {
+ instance.registerParser("FOO", FOOParser.class);
+ assertTrue(instance.hasParser("FOO"));
+ instance.unregisterParser(FOOParser.class);
+ assertFalse(instance.hasParser("FOO"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#hasParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testHasParser() {
+ assertTrue(instance.hasParser("GLL"));
+ assertFalse(instance.hasParser("ABC"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#createParser(TalkerId, SentenceId)
+ * .
+ */
+ @Test
+ public void testListParsers() {
+ List types = instance.listParsers();
+ assertEquals(SentenceId.values().length, types.size());
+ for (SentenceId id : SentenceId.values()) {
+ assertTrue(types.contains(id.name()));
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceFactory#getInstance()}.
+ */
+ @Test
+ public void testGetInstance() {
+ assertNotNull(instance);
+ assertTrue(instance == SentenceFactory.getInstance());
+ assertEquals(instance, SentenceFactory.getInstance());
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/SentenceParserTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/SentenceParserTest.java
new file mode 100755
index 00000000000..c71b1c9907d
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/SentenceParserTest.java
@@ -0,0 +1,598 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.Sentence;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.test.util.FOOParser;
+import net.sf.marineapi.test.util.FOOSentence;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the sentence parser base class.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class SentenceParserTest {
+
+ public static final String VDO_EXAMPLE = "!AIVDO,1,1,,,13:r`R5P1orpG60JeHgRSj4l0000,0*56";
+ public static final String VDM_EXAMPLE = "!AIVDM,1,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0*5C";
+
+ private SentenceParser instance;
+
+ /**
+ * setUp
+ */
+ @Before
+ public void setUp() {
+ instance = new SentenceParser(RMCTest.EXAMPLE);
+ }
+
+ /**
+ * Test method for SenteceParser constructor.
+ */
+ @Test
+ public void testConstructorForEmptySentence() {
+ Sentence s = new SentenceParser(TalkerId.GP, SentenceId.GLL, 5);
+ assertEquals("$GPGLL,,,,,*7C", s.toString());
+ }
+
+ /**
+ * Test method for SentenceParser constructors called from derived custom
+ * parsers.
+ */
+ @Test
+ public void testConstructorWithCustomParser() {
+
+ final String foo = "FOO";
+ SentenceFactory sf = SentenceFactory.getInstance();
+ sf.registerParser(foo, FOOParser.class);
+
+ final String fooSentence = "$GPFOO,B,A,R";
+ final FOOSentence fp = new FOOParser(fooSentence);
+ final Sentence s = sf.createParser(fooSentence);
+
+ assertTrue(s instanceof SentenceParser);
+ assertTrue(s instanceof FOOParser);
+ assertEquals(foo, s.getSentenceId());
+ assertEquals(TalkerId.GP, s.getTalkerId());
+ assertEquals(s, fp);
+ }
+
+ /**
+ * Test method for SenteceParser constructor.
+ */
+ @Test
+ public void testConstructorWithInvalidSentence() {
+ try {
+ String sent = "GPBOD,234.9,T,228.8,M,RUSKI,*1D";
+ new SentenceParser(sent);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException se) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for SenteceParser constructor.
+ */
+ @Test
+ public void testConstructorWithAIVDO() {
+ Sentence s = new SentenceParser(VDO_EXAMPLE);
+ assertTrue(s.isValid());
+ assertFalse(s.isProprietary());
+ assertEquals(Sentence.ALTERNATIVE_BEGIN_CHAR, s.getBeginChar());
+ assertEquals(VDO_EXAMPLE, s.toString());
+ }
+
+ /**
+ * Test method for SenteceParser constructor.
+ */
+ @Test
+ public void testConstructorWithAIVDM() {
+ Sentence s = new SentenceParser(VDM_EXAMPLE);
+ assertTrue(s.isValid());
+ assertFalse(s.isProprietary());
+ assertEquals(Sentence.ALTERNATIVE_BEGIN_CHAR, s.getBeginChar());
+ assertEquals(VDM_EXAMPLE, s.toString());
+ }
+
+ /**
+ * Test method for SenteceParser constructor.
+ */
+ @Test
+ public void testConstructorWithNulls() {
+ try {
+ new SentenceParser((String) null, (String) null);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // OK
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for SenteceParser constructor.
+ */
+ @Test
+ public void testConstructorWithNullType() {
+
+ try {
+ new SentenceParser(RMCTest.EXAMPLE, (String) null);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // OK
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for SenteceParser constructor.
+ */
+ @Test
+ public void testConstructorWithUnsupportedTalker() {
+ try {
+ new SentenceParser("$XZGGA,VALID,BUT,TALKER,NOT,SUPPORTED");
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException se) {
+ assertTrue(se.getMessage().endsWith(".TalkerId.XZ"));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for SenteceParser constructor.
+ */
+ @Test
+ public void testConstructorWithWrongType() {
+ try {
+ new SentenceParser(BODTest.EXAMPLE, SentenceId.GLL.toString());
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException iae) {
+ // OK
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getCharValue(int)}.
+ */
+ @Test
+ public void testGetCharValueWithEmptyFields() {
+ String nmea = "$GPGLL,,,,,,";
+ SentenceParser s = new SentenceParser(nmea);
+ try {
+ s.getCharValue(3);
+ fail("Did not throw exception");
+ } catch (DataNotAvailableException ex) {
+ // pass
+ } catch (Exception ex) {
+ fail(ex.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getDoubleValue(int)}.
+ */
+ @Test
+ public void testGetDoubleValueWithEmptyFields() {
+ String nmea = "$GPGLL,,,,,,";
+ SentenceParser s = new SentenceParser(nmea);
+ try {
+ s.getDoubleValue(2);
+ fail("Did not throw exception");
+ } catch (DataNotAvailableException ex) {
+ // pass
+ } catch (Exception ex) {
+ fail(ex.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getDoubleValue(int)}.
+ */
+ @Test
+ public void testGetDoubleValueWithInvalidValue() {
+ String nmea = "$GPGLL,a,b,c,d,e,f";
+ SentenceParser s = new SentenceParser(nmea);
+ try {
+ s.getDoubleValue(2);
+ fail("Did not throw exception");
+ } catch (ParseException ex) {
+ // pass
+ } catch (Exception ex) {
+ fail(ex.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getSentenceId()}.
+ */
+ @Test
+ public void testGetSentenceId() {
+ SentenceId sid = SentenceId.valueOf(instance.getSentenceId());
+ assertEquals(SentenceId.RMC, sid);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getStringValue(int)}.
+ */
+ @Test
+ public void testGetStringValue() {
+ final String nmea = "$GPGLL,6011.552,N,02501.941,E,120045,A";
+ final SentenceParser s = new SentenceParser(nmea);
+ final String data = "6011.552,N,02501.941,E,120045,A";
+ final String[] expected = data.split(",", -1);
+
+ for (int i = 0; i < expected.length; i++) {
+ assertEquals(expected[i], s.getStringValue(i));
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getStringValue(int)}.
+ */
+ @Test
+ public void testGetStringValueWithEmptyFields() {
+ String nmea = "$GPGLL,,,,,,";
+ SentenceParser s = new SentenceParser(nmea);
+ try {
+ s.getStringValue(2);
+ fail("Did not throw exception");
+ } catch (DataNotAvailableException ex) {
+ // pass
+ } catch (Exception ex) {
+ fail(ex.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getStringValue(int)}.
+ */
+ @Test
+ public void testGetStringValueWithIndexGreaterThanAllowed() {
+ try {
+ instance.getStringValue(instance.getFieldCount());
+ fail("Did not throw IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ // pass
+ } catch (Exception e) {
+ fail("Unexpected exception was thrown");
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getStringValue(int)}.
+ */
+ @Test
+ public void testGetStringValueWithNegativeIndex() {
+
+ try {
+ instance.getStringValue(-1);
+ fail("Did not throw IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ // pass
+ } catch (Exception e) {
+ fail("Unexpected exception was thrown");
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getStringValue(int)}.
+ */
+ @Test
+ public void testGetStringValueWithValidIndex() {
+ try {
+ String val = instance.getStringValue(0);
+ assertEquals("120044.567", val);
+ val = instance.getStringValue(instance.getFieldCount() - 1);
+ assertEquals("A", val);
+ } catch (IndexOutOfBoundsException e) {
+ fail("Unexpected IndexOutOfBoundsException");
+ } catch (Exception e) {
+ fail("Unexpected exception was thrown");
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#getTalkerId()}.
+ */
+ @Test
+ public void testGetTalkerId() {
+ assertEquals(TalkerId.GP, instance.getTalkerId());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#isProprietary()}.
+ */
+ public void testIsProprietary() {
+ assertFalse(instance.isProprietary());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#setBeginChar()}.
+ */
+ public void testSetBeginChar() {
+ assertEquals(Sentence.BEGIN_CHAR, instance.getBeginChar());
+ instance.setBeginChar(Sentence.ALTERNATIVE_BEGIN_CHAR);
+ assertEquals(Sentence.ALTERNATIVE_BEGIN_CHAR, instance.getBeginChar());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#isValid()}.
+ */
+ @Test
+ public void testIsValid() {
+ assertTrue(instance.isValid());
+ instance.setStringValue(0, "\t");
+ assertFalse(instance.isValid());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#setDoubleValue(int, double, int, int)}
+ * .
+ */
+ @Test
+ public void testSetDoubleValue() {
+ final int field = 0;
+ final double value = 123.456789;
+ instance.setDoubleValue(field, value);
+ assertEquals(String.valueOf(value), instance.getStringValue(field));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#setDoubleValue(int, double, int, int)}
+ * .
+ */
+ @Test
+ public void testSetDoubleValueWithPrecision() {
+
+ instance.setDoubleValue(0, 3.14, 0, 0);
+ assertEquals("3", instance.getStringValue(0));
+
+ instance.setDoubleValue(0, 3.14, 2, 0);
+ assertEquals("03", instance.getStringValue(0));
+
+ instance.setDoubleValue(0, 3.14, 1, 4);
+ assertEquals("3.1400", instance.getStringValue(0));
+
+ instance.setDoubleValue(0, 678.910, 3, 3);
+ assertEquals("678.910", instance.getStringValue(0));
+
+ instance.setDoubleValue(0, 123.456, 4, 1);
+ assertEquals("0123.5", instance.getStringValue(0));
+
+ instance.setDoubleValue(0, 78.910, 1, 1);
+ assertEquals("78.9", instance.getStringValue(0));
+
+ instance.setDoubleValue(0, 0.910, 0, 3);
+ assertEquals(".910", instance.getStringValue(0));
+
+ instance.setDoubleValue(0, 0.910, 3, 2);
+ assertEquals("000.91", instance.getStringValue(0));
+
+ instance.setDoubleValue(0, 0.910, 0, 2);
+ assertEquals(".91", instance.getStringValue(0));
+ }
+
+ @Test
+ public void testSetDoubleValueJDK7RoundingIssue() {
+
+ // 2016-11-06: open-jdk7 has rounding issues that were not caught by this test
+ // until now. All good in jdk8, thus testing conditionally.
+ // https://bugs.openjdk.java.net/browse/JDK-8029896
+ // https://bugs.openjdk.java.net/browse/JDK-8039915
+
+ String version = System.getProperty("java.version");
+ org.junit.Assume.assumeTrue(!version.startsWith("1.7."));
+
+ // would fail in jdk7 claiming "12.35" not equal to "12.34"
+ instance.setDoubleValue(0, 12.345, 1, 2);
+ assertEquals("12.35", instance.getStringValue(0));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#setIntValue(int, int, int)}
+ * .
+ */
+ @Test
+ public void testSetIntValueWithLeading() {
+
+ instance.setIntValue(0, 0, 0);
+ assertEquals("0", instance.getStringValue(0));
+
+ instance.setIntValue(0, 0, 1);
+ assertEquals("0", instance.getStringValue(0));
+
+ instance.setIntValue(0, 1, 2);
+ assertEquals("01", instance.getStringValue(0));
+
+ instance.setIntValue(0, 1, 3);
+ assertEquals("001", instance.getStringValue(0));
+
+ instance.setIntValue(0, 12, 1);
+ assertEquals("12", instance.getStringValue(0));
+
+ instance.setIntValue(0, 12, 2);
+ assertEquals("12", instance.getStringValue(0));
+
+ instance.setIntValue(0, 12, 3);
+ assertEquals("012", instance.getStringValue(0));
+
+ instance.setIntValue(0, -1, 3);
+ assertEquals("-01", instance.getStringValue(0));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#toString()}.
+ */
+ @Test
+ public void testToString() {
+ assertEquals(RMCTest.EXAMPLE, instance.toString());
+ assertEquals(instance.toString(), instance.toSentence());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#toSentence(int)}.
+ */
+ @Test
+ public void testToSentenceWithMaxLength() {
+ int max = instance.toString().length() + 1;
+ assertEquals(RMCTest.EXAMPLE, instance.toSentence(max));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#§(int)}.
+ */
+ @Test
+ public void testToSentenceWithMaxLengthOnLimit() {
+ int max = instance.toString().length();
+ assertEquals(RMCTest.EXAMPLE, instance.toSentence(max));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#toSentence(int)}.
+ */
+ @Test
+ public void testToSentenceWithMaxLengthExceeded() {
+ try {
+ int max = instance.toString().length() - 1;
+ assertEquals(RMCTest.EXAMPLE, instance.toSentence(max));
+ fail("didn't throw exception");
+ } catch (Exception e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#equals(Object)
+ */
+ @Test
+ public void testEquals() {
+ assertTrue(instance.equals(new SentenceParser(RMCTest.EXAMPLE)));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#equals(Object)
+ */
+ @Test
+ public void testEqualsWithNonEqual() {
+ assertFalse(instance.equals(new SentenceParser(RMBTest.EXAMPLE)));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#equals(Object)
+ */
+ @Test
+ public void testEqualsWithNull() {
+ assertFalse(instance.equals(null));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.SentenceParser#equals(Object)
+ */
+ @Test
+ public void testEqualsWithSelf() {
+ assertTrue(instance.equals(instance));
+ }
+
+ @Test
+ public void testSetFieldCountLowerByOne() {
+
+ final int count = instance.getFieldCount() - 1;
+ final int lastIndex = instance.getFieldCount() - 2;
+ final String value = instance.getStringValue(lastIndex);
+
+ instance.setFieldCount(count);
+ assertEquals(count, instance.getFieldCount());
+ assertEquals(value, instance.getStringValue(lastIndex));
+ }
+
+ @Test
+ public void testSetFieldCountLower() {
+ SentenceParser parser = new SentenceParser("$GPGGA,1,2,3,4");
+ parser.setFieldCount(2);
+ assertEquals(2, parser.getFieldCount());
+ assertEquals("1", parser.getStringValue(0));
+ assertEquals("2", parser.getStringValue(1));
+ assertTrue(parser.toString().startsWith("$GPGGA,1,2*"));
+ }
+
+ @Test
+ public void testSetFieldCountHigherByOne() {
+
+ final int count = instance.getFieldCount() + 1;
+ final int lastIndex = instance.getFieldCount() - 1;
+ final String value = instance.getStringValue(lastIndex);
+
+ instance.setFieldCount(count);
+ assertEquals(count, instance.getFieldCount());
+ assertEquals(value, instance.getStringValue(lastIndex));
+ }
+
+ @Test
+ public void testSetFieldCountHigher() {
+ SentenceParser parser = new SentenceParser("$GPGGA,1,2,3,4");
+ parser.setFieldCount(8);
+ assertEquals(8, parser.getFieldCount());
+ assertTrue(parser.toString().startsWith("$GPGGA,1,2,3,4,,,,*"));
+ }
+
+ @Test
+ public void testSetStringValuesReplaceAll() {
+ SentenceParser parser = new SentenceParser("$GPGGA,1,2,3,4");
+ String[] values = { "5", "6", "7" };
+ parser.setStringValues(0, values);
+ assertEquals(3, parser.getFieldCount());
+ assertEquals("5", parser.getStringValue(0));
+ assertEquals("6", parser.getStringValue(1));
+ assertEquals("7", parser.getStringValue(2));
+ }
+
+ @Test
+ public void testSetStringValuesReplaceTail() {
+ SentenceParser parser = new SentenceParser("$GPGGA,1,2,3,4");
+ String[] values = { "5", "6", "7" };
+ parser.setStringValues(1, values);
+ assertEquals(4, parser.getFieldCount());
+ assertEquals("1", parser.getStringValue(0));
+ assertEquals("5", parser.getStringValue(1));
+ assertEquals("6", parser.getStringValue(2));
+ assertEquals("7", parser.getStringValue(3));
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/TTMTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/TTMTest.java
new file mode 100755
index 00000000000..dc54f065f03
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/TTMTest.java
@@ -0,0 +1,275 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.AcquisitionType;
+import net.sf.marineapi.nmea.util.TargetStatus;
+import net.sf.marineapi.nmea.util.Time;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the RMC sentence parser.
+ *
+ * @author Johan Bergkvist
+ */
+public class TTMTest {
+
+ /** Example sentence */
+ public static final String EXAMPLE = "$RATTM,11,25.3,13.7,T,7.0,20.0,T,10.1,20.2,N,NAME,Q,,175550.24,A*34";
+
+ TTMParser empty;
+ TTMParser ttm;
+
+ @Before
+ public void setUp() {
+ try {
+ empty = new TTMParser(TalkerId.RA);
+ ttm = new TTMParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(15, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getNumber()} .
+ */
+ @Test
+ public void testGetNumber() {
+ assertEquals(11, ttm.getNumber());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getDistance()} .
+ */
+ @Test
+ public void testGetDistance() {
+ assertEquals(25.3, ttm.getDistance(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getBearing()} .
+ */
+ @Test
+ public void testGetBearing() {
+ assertEquals(13.7, ttm.getBearing(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getSpeed()} .
+ */
+ @Test
+ public void testGetSpeed() {
+ assertEquals(7.0, ttm.getSpeed(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getCourse()} .
+ */
+ @Test
+ public void testGetCourse() {
+ assertEquals(20.0, ttm.getCourse(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getDistanceOfCPA()} .
+ */
+ @Test
+ public void testGetDistanceOfCPA() {
+ assertEquals(10.1, ttm.getDistanceOfCPA(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getTimeToCPA()} .
+ */
+ @Test
+ public void testGetTimeToCPA() {
+ assertEquals(20.2, ttm.getTimeToCPA(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getTimeToCPA()} .
+ */
+ @Test
+ public void testGetName() {
+ assertEquals("NAME", ttm.getName());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getStatus()} .
+ */
+ @Test
+ public void testGetStatus() {
+ assertEquals(TargetStatus.QUERY, ttm.getStatus());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getTime()} .
+ */
+ @Test
+ public void testGetTime() {
+ Time t = ttm.getTime();
+ assertNotNull(t);
+ assertEquals(17, t.getHour());
+ assertEquals(55, t.getMinutes());
+ assertEquals(50.24, t.getSeconds(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#getAcquisitionType()} .
+ */
+ @Test
+ public void testGetAcquisitionType() {
+ assertEquals(AcquisitionType.AUTO, ttm.getAcquisitionType());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setNumber()} .
+ */
+ @Test
+ public void testSetNumber() {
+ final int number = 90;
+ ttm.setNumber(number);
+ assertTrue(ttm.toString().contains(",90,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setDistance()} .
+ */
+ @Test
+ public void testSetDistance() {
+ ttm.setDistance(56.4);
+ assertTrue(ttm.toString().contains(",56.4,"));
+ assertTrue(ttm.toString().contains(",N,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setBearing()} .
+ */
+ @Test
+ public void testSetBearing() {
+ ttm.setBearing(34.1);
+ assertTrue(ttm.toString().contains(",34.1,T,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setSpeed()} .
+ */
+ @Test
+ public void testSetSpeed() {
+ ttm.setBearing(44.1);
+ assertTrue(ttm.toString().contains(",44.1,"));
+ assertTrue(ttm.toString().contains(",N,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setCourse()} .
+ */
+ @Test
+ public void testSetCourse() {
+ ttm.setCourse(234.9);
+ assertTrue(ttm.toString().contains(",234.9,T,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setDistanceOfCPA()} .
+ */
+ @Test
+ public void testSetDistanceOfCPA() {
+ ttm.setDistanceOfCPA(55.2);
+ assertTrue(ttm.toString().contains(",55.2,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setTimeToCPA()} .
+ */
+ @Test
+ public void testSetTimeToCPA() {
+ ttm.setTimeToCPA(15.0);
+ assertTrue(ttm.toString().contains(",15.0,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setName()} .
+ */
+ @Test
+ public void testSetName() {
+ ttm.setName("FRED");
+ assertTrue(ttm.toString().contains(",FRED,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setStatus()} .
+ */
+ @Test
+ public void testSetStatus() {
+ ttm.setStatus(TargetStatus.LOST);
+ assertTrue(ttm.toString().contains(",T,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setStatus()} .
+ */
+ @Test
+ public void testSetReferenceTrue() {
+ ttm.setReference(true);
+ assertTrue(ttm.toString().contains(",R,"));
+ }
+ @Test
+ public void testSetReferenceFalse() {
+ ttm.setReference(false);
+ assertTrue(!ttm.toString().contains(",R,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setTime()} .
+ */
+ @Test
+ public void testSetTime() {
+ Time t = new Time(1, 2, 3.45);
+ ttm.setTime(t);
+ assertTrue(ttm.toString().contains(",010203.45,"));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.TTMParser#setAcquisitionType()} .
+ */
+ @Test
+ public void testSetAcquisitionType() {
+ ttm.setAcquisitionType(AcquisitionType.MANUAL);
+ assertTrue(ttm.toString().contains(",M*"));
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VBWTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VBWTest.java
new file mode 100755
index 00000000000..c55fcc407c3
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VBWTest.java
@@ -0,0 +1,156 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.sentence.VBWSentence;
+import net.sf.marineapi.nmea.util.DataStatus;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class VBWTest {
+
+ public static final String EXAMPLE = "$IIVBW,11.0,02.0,A,07.5,13.3,A,06.65,A,12.3,A";
+
+ private VBWSentence vbw;
+ private VBWSentence empty;
+
+ @Before
+ public void setUp() throws Exception {
+ vbw = new VBWParser(EXAMPLE);
+ empty = new VBWParser(TalkerId.II);
+ }
+
+ @Test
+ public void testVBWParserString() {
+ assertEquals(TalkerId.II, vbw.getTalkerId());
+ assertEquals(SentenceId.VBW.name(), vbw.getSentenceId());
+ assertEquals(10, vbw.getFieldCount());
+ }
+
+ @Test
+ public void testVBWParserTalkerId() {
+ assertEquals(TalkerId.II, empty.getTalkerId());
+ assertEquals(SentenceId.VBW.name(), empty.getSentenceId());
+ assertEquals(10, empty.getFieldCount());
+ assertTrue(empty.toString().startsWith("$IIVBW,"));
+ }
+
+ @Test
+ public void testGetLongWaterSpeed() {
+ assertEquals(11.0, vbw.getLongWaterSpeed(), 0.1);
+ }
+
+ @Test
+ public void testGetTravWaterSpeed() {
+ assertEquals(2.0, vbw.getTravWaterSpeed(), 0.1);
+ }
+
+ @Test
+ public void testGetWaterSpeedStatus() {
+ assertEquals(DataStatus.ACTIVE, vbw.getWaterSpeedStatus());
+ }
+
+ @Test
+ public void testGetLongGroundSpeed() {
+ assertEquals(07.5, vbw.getLongGroundSpeed(), 0.1);
+ }
+
+ @Test
+ public void testGetTravGroundSpeed() {
+ assertEquals(13.3, vbw.getTravGroundSpeed(), 0.1);
+ }
+
+ @Test
+ public void testGetGroundSpeedStatus() {
+ assertEquals(DataStatus.ACTIVE, vbw.getGroundSpeedStatus());
+ }
+
+ @Test
+ public void testGetSternWaterSpeed() {
+ assertEquals(06.65, vbw.getSternWaterSpeed(), 0.1);
+ }
+
+ @Test
+ public void testGetSternWaterSpeedStatus() {
+ assertEquals(DataStatus.ACTIVE, vbw.getSternWaterSpeedStatus());
+ }
+
+ @Test
+ public void testGetSternGroundSpeed() {
+ assertEquals(12.3, vbw.getSternGroundSpeed(), 0.1);
+ }
+
+ @Test
+ public void testGetSternGroundSpeedStatus() {
+ assertEquals(DataStatus.ACTIVE, vbw.getSternGroundSpeedStatus());
+ }
+
+ @Test
+ public void testSetLongWaterSpeed() {
+ final double dir = 23.3;
+ empty.setLongWaterSpeed(dir);
+ assertEquals(dir, empty.getLongWaterSpeed(), 0.1);
+ }
+
+ @Test
+ public void testSetTravWaterSpeed() {
+ final double dir = 23.3;
+ empty.setTravWaterSpeed(dir);
+ assertEquals(dir, empty.getTravWaterSpeed(), 0.1);
+ }
+
+ @Test
+ public void testSetWaterSpeedStatus() {
+ empty.setWaterSpeedStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, empty.getWaterSpeedStatus());
+ }
+
+ @Test
+ public void testSetLongGroundSpeed() {
+ final double dir = 23.3;
+ empty.setLongGroundSpeed(dir);
+ assertEquals(dir, empty.getLongGroundSpeed(), 0.1);
+ }
+
+ @Test
+ public void testSetTravGroundSpeed() {
+ final double dir = 23.3;
+ empty.setTravGroundSpeed(dir);
+ assertEquals(dir, empty.getTravGroundSpeed(), 0.1);
+ }
+
+ @Test
+ public void testSetGroundSpeedStatus() {
+ empty.setGroundSpeedStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, empty.getGroundSpeedStatus());
+ }
+
+ @Test
+ public void testSetSternWaterSpeed() {
+ final double dir = 23.3;
+ empty.setSternWaterSpeed(dir);
+ assertEquals(dir, empty.getSternWaterSpeed(), 0.1);
+ }
+
+ @Test
+ public void testSetSternWaterSpeedStatus() {
+ empty.setSternWaterSpeedStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, empty.getSternWaterSpeedStatus());
+ }
+
+ @Test
+ public void testSetSternGroundSpeed() {
+ final double dir = 23.3;
+ empty.setSternGroundSpeed(dir);
+ assertEquals(dir, empty.getSternGroundSpeed(), 0.1);
+ }
+
+ @Test
+ public void testSetSternGroundSpeedStatus() {
+ empty.setSternGroundSpeedStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, empty.getSternGroundSpeedStatus());
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VDMTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VDMTest.java
new file mode 100755
index 00000000000..93cf604cc43
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VDMTest.java
@@ -0,0 +1,167 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.sentence.AISSentence;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class VDMTest {
+
+ public static final String EXAMPLE = "!AIVDM,1,1,,A,403OviQuMGCqWrRO9>E6fE700@GO,0*4D";
+ public static final String PART1 = "!AIVDM,2,1,1,A,55?MbV02;H;sE6fE700@GO", vdm.getPayload());
+ assertEquals("88888888880", frag2.getPayload());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VDMParser#getFillBits()}.
+ */
+ @Test
+ public void testGetFillBits() {
+ assertEquals(0, vdm.getFillBits());
+ assertEquals(0, frag1.getFillBits());
+ assertEquals(2, frag2.getFillBits());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VDMParser#isFragmented()}.
+ */
+ @Test
+ public void testIsFragmented() {
+ assertFalse(vdm.isFragmented());
+ assertTrue(frag1.isFragmented());
+ assertTrue(frag2.isFragmented());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VDMParser#isFirstFragment()}.
+ */
+ @Test
+ public void testIsFirstFragment() {
+ assertTrue(vdm.isFirstFragment());
+ assertTrue(frag1.isFirstFragment());
+ assertFalse(frag2.isFirstFragment());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VDMParser#isLastFragment()}.
+ */
+ @Test
+ public void testIsLastFragment() {
+ assertTrue(vdm.isLastFragment());
+ assertFalse(frag1.isLastFragment());
+ assertTrue(frag2.isLastFragment());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VDMParser#isPartOfMessage(net.sf.marineapi.nmea.sentence.AISSentence)}
+ * .
+ */
+ @Test
+ public void testIsPartOfMessage() {
+ assertFalse(vdm.isPartOfMessage(frag1));
+ assertFalse(vdm.isPartOfMessage(frag2));
+ assertFalse(frag1.isPartOfMessage(vdm));
+ assertFalse(frag2.isPartOfMessage(vdm));
+ assertTrue(frag1.isPartOfMessage(frag2));
+ assertFalse(frag2.isPartOfMessage(frag1));
+ }
+
+ @Test
+ public void testToStringWithAIS() {
+ AISSentence vdm = new VDMParser(EXAMPLE);
+ AISSentence empty = new VDMParser(TalkerId.AI);
+ assertEquals(EXAMPLE, vdm.toString());
+ assertEquals("!AIVDM,,,,,,*57", empty.toString());
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VDOTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VDOTest.java
new file mode 100755
index 00000000000..669066c1cde
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VDOTest.java
@@ -0,0 +1,194 @@
+/*
+ * VDOTest.java
+ * Copyright (C) 2016 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import net.sf.marineapi.nmea.sentence.AISSentence;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * VDOTest
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class VDOTest {
+
+ public static final String EXAMPLE = "!AIVDO,1,1,,B,H1c2;qA@PU>0U>0600:1Dp,2*7D";
+ public static final String PART1 = "!AIVDO,2,1,5,B,E1c2;q@b44ah4ah0h:2ab@70VRpU
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class VHWTest {
+
+ public static final String EXAMPLE = "$VWVHW,000.0,T,001.5,M,1.0,N,1.85,K";
+
+ private VHWParser vhw;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ vhw = new VHWParser(EXAMPLE);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#VHWParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testConstructorString() {
+ assertTrue(vhw.getTalkerId() == TalkerId.VW);
+ assertTrue(SentenceId.valueOf(vhw.getSentenceId()) == SentenceId.VHW);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#VHWParser(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testConstructorTalkerId() {
+ VHWParser empty = new VHWParser(TalkerId.II);
+ assertEquals(8, empty.getFieldCount());
+ assertTrue('T' == empty.getCharValue(1));
+ assertTrue('M' == empty.getCharValue(3));
+ assertTrue('N' == empty.getCharValue(5));
+ assertTrue('K' == empty.getCharValue(7));
+ assertEquals("VHW", empty.getSentenceId());
+ assertTrue(empty.getTalkerId() == TalkerId.II);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#getHeading()}.
+ */
+ @Test
+ public void testGetHeading() {
+ assertEquals(0.0, vhw.getHeading(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#getMagneticHeading()}.
+ */
+ @Test
+ public void testGetMagneticHeading() {
+ assertEquals(1.5, vhw.getMagneticHeading(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#getSpeedKmh()}.
+ */
+ @Test
+ public void testGetSpeedKilometres() {
+ assertEquals(1.85, vhw.getSpeedKmh(), 0.01);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#getSpeedKnots()}.
+ */
+ @Test
+ public void testGetSpeedKnots() {
+ assertEquals(1.0, vhw.getSpeedKnots(), 0.1);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.VHWParser#isTrue()}.
+ */
+ @Test
+ public void testIsTrue() {
+ // should always return true
+ assertTrue(vhw.isTrue());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#setHeading(double)}.
+ */
+ @Test
+ public void testSetHeading() {
+ vhw.setHeading(90.456);
+ assertEquals(90.5, vhw.getHeading(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#setMagneticHeading()}.
+ */
+ @Test
+ public void testSetMagneticHeading() {
+ vhw.setMagneticHeading(123.4567);
+ assertEquals(123.5, vhw.getMagneticHeading(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#setSpeedKilometres()}.
+ */
+ @Test
+ public void testSetSpeedKilometres() {
+ vhw.setSpeedKmh(5.5555);
+ assertEquals(5.6, vhw.getSpeedKmh(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VHWParser#setSpeedKnots()}.
+ */
+ @Test
+ public void testSetSpeedKnots() {
+ vhw.setSpeedKnots(12.155);
+ assertEquals(12.2, vhw.getSpeedKnots(), 0.1);
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VLWTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VLWTest.java
new file mode 100755
index 00000000000..407e9fc22bf
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VLWTest.java
@@ -0,0 +1,81 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.sentence.VLWSentence;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class VLWTest {
+
+ public static final String EXAMPLE = "$VWVLW,2.8,N,0.8,N";
+
+ VLWSentence vlw;
+ VLWSentence empty;
+
+ @Before
+ public void setUp() throws Exception {
+ vlw = new VLWParser(EXAMPLE);
+ empty = new VLWParser(TalkerId.VD);
+ }
+
+ @Test
+ public void testVLWParserString() {
+ assertEquals(TalkerId.VW, vlw.getTalkerId());
+ assertEquals("VLW", vlw.getSentenceId());
+ assertEquals(4, vlw.getFieldCount());
+ }
+
+ @Test
+ public void testVLWParserTalkerId() {
+ assertEquals(TalkerId.VD, empty.getTalkerId());
+ assertEquals("VLW", empty.getSentenceId());
+ assertEquals(4, empty.getFieldCount());
+ }
+
+ @Test
+ public void testGetTotal() {
+ assertEquals(2.8, vlw.getTotal(), 0.1);
+ }
+
+ @Test
+ public void testGetTotalUnits() {
+ assertEquals('N', vlw.getTotalUnits());
+ }
+
+ @Test
+ public void testGetTrip() {
+ assertEquals(0.8, vlw.getTrip(), 0.1);
+ }
+
+ @Test
+ public void testGetTripUnits() {
+ assertEquals('N', vlw.getTripUnits());
+ }
+
+ @Test
+ public void testSetTotal() {
+ empty.setTotal(3.14);
+ assertEquals(3.1, empty.getTotal(), 0.1);
+ }
+
+ @Test
+ public void testSetTotalUnits() {
+ empty.setTotalUnits(VLWSentence.KM);
+ assertEquals(VLWSentence.KM, empty.getTotalUnits());
+ }
+
+ @Test
+ public void testSetTrip() {
+ empty.setTrip(0.0);
+ assertEquals(0.0, empty.getTrip(), 0.1);
+ }
+
+ @Test
+ public void testSetTripUnits() {
+ empty.setTripUnits(VLWSentence.NM);
+ assertEquals(VLWSentence.NM, empty.getTripUnits());
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VTGTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VTGTest.java
new file mode 100755
index 00000000000..7c9aa91d8a4
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/VTGTest.java
@@ -0,0 +1,248 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.sentence.VTGSentence;
+import net.sf.marineapi.nmea.util.FaaMode;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the VTG sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class VTGTest {
+
+ /** Example sentence */
+ public static final String EXAMPLE = "$GPVTG,360.0,T,348.7,M,16.89,N,31.28,K,A";
+
+ private VTGSentence empty;
+ private VTGSentence vtg;
+
+ @Before
+ public void setUp() {
+ try {
+ empty = new VTGParser(TalkerId.GP);
+ vtg = new VTGParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(9, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#getMagneticCourse()}.
+ */
+ @Test
+ public void testGetMagneticCourse() {
+ assertEquals(348.7, vtg.getMagneticCourse(), 0.001);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.VTGParser#getMode()}.
+ */
+ @Test
+ public void testGetMode() {
+ assertEquals(FaaMode.AUTOMATIC, vtg.getMode());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#getSpeedKmh()}.
+ */
+ @Test
+ public void testGetSpeedKmh() {
+ assertEquals(31.28, vtg.getSpeedKmh(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#getSpeedKnots()}.
+ */
+ @Test
+ public void testGetSpeedKnots() {
+ assertEquals(16.89, vtg.getSpeedKnots(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#getTrueCourse()}.
+ */
+ @Test
+ public void testGetTrueCourse() {
+ assertEquals(360.0, vtg.getTrueCourse(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setMagneticCourse(double)}.
+ */
+ @Test
+ public void testSetMagneticCourse() {
+ final double mcog = 95.56789;
+ vtg.setMagneticCourse(mcog);
+ assertTrue(vtg.toString().contains(",095.6,M,"));
+ assertEquals(mcog, vtg.getMagneticCourse(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setMagneticCourse(double)}.
+ */
+ @Test
+ public void testSetMagneticCourseWithNegativeValue() {
+ try {
+ vtg.setMagneticCourse(-0.001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("0..360"));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setMagneticCourse(double)}.
+ */
+ @Test
+ public void testSetMagneticCourseWithValueGreaterThanAllowed() {
+ try {
+ vtg.setMagneticCourse(360.001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("0..360"));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setMode(FaaMode)}.
+ */
+ @Test
+ public void testSetMode() {
+ vtg.setMode(FaaMode.MANUAL);
+ assertEquals(FaaMode.MANUAL, vtg.getMode());
+ vtg.setMode(FaaMode.SIMULATED);
+ assertEquals(FaaMode.SIMULATED, vtg.getMode());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setMode(FaaMode)}.
+ */
+ @Test
+ public void testSetModeWhenOmitted() {
+ VTGParser parser = new VTGParser("$GPVTG,360.0,T,348.7,M,16.89,N,31.28,K");
+ parser.setMode(FaaMode.MANUAL);
+ assertEquals(FaaMode.MANUAL, parser.getMode());
+ parser.setMode(FaaMode.SIMULATED);
+ assertEquals(FaaMode.SIMULATED, parser.getMode());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setSpeedKmh(double)}.
+ */
+ @Test
+ public void testSetSpeedKmh() {
+ final double kmh = 12.56789;
+ vtg.setSpeedKmh(kmh);
+ assertTrue(vtg.toString().contains(",12.57,K,"));
+ assertEquals(kmh, vtg.getSpeedKmh(), 0.01);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setSpeedKmh(double)}.
+ */
+ @Test
+ public void testSetSpeedKmhWithNegativeValue() {
+ try {
+ vtg.setSpeedKmh(-0.0001);
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("cannot be negative"));
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setSpeedKnots(double)}.
+ */
+ @Test
+ public void testSetSpeedKnots() {
+ final double kn = 11.6789;
+ vtg.setSpeedKnots(kn);
+ assertTrue(vtg.toString().contains(",11.68,N,"));
+ assertEquals(kn, vtg.getSpeedKnots(), 0.01);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setSpeedKnots(double)}.
+ */
+ @Test
+ public void testSetSpeedKnotsWithNegativeValue() {
+ try {
+ vtg.setSpeedKnots(-0.0001);
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("cannot be negative"));
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setTrueCourse(double)}.
+ */
+ @Test
+ public void testSetTrueCourse() {
+ final double tcog = 90.56789;
+ vtg.setTrueCourse(tcog);
+ assertTrue(vtg.toString().contains(",090.6,T,"));
+ assertEquals(tcog, vtg.getTrueCourse(), 0.1);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setTrueCourse(double)}.
+ */
+ @Test
+ public void testSetTrueCourseWithNegativeValue() {
+ try {
+ vtg.setTrueCourse(-0.001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("0..360"));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.VTGParser#setTrueCourse(double)}.
+ */
+ @Test
+ public void testSetTrueCourseWithValueGreaterThanAllowed() {
+ try {
+ vtg.setTrueCourse(360.001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ assertTrue(e.getMessage().contains("0..360"));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/WPLTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/WPLTest.java
new file mode 100755
index 00000000000..873133646f8
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/WPLTest.java
@@ -0,0 +1,103 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.sentence.WPLSentence;
+import net.sf.marineapi.nmea.util.CompassPoint;
+import net.sf.marineapi.nmea.util.Waypoint;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * WPLTest
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class WPLTest {
+
+ /** Example sentence */
+ public static final String EXAMPLE = "$GPWPL,5536.200,N,01436.500,E,RUSKI*1F";
+
+ private WPLSentence empty;
+ private WPLSentence wpl;
+
+ @Before
+ public void setUp() {
+ try {
+ empty = new WPLParser(TalkerId.GP);
+ wpl = new WPLParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(5, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.WPLParser#getWaypoint()}.
+ */
+ @Test
+ public void testGetWaypoint() {
+ final Double lat = new Double(55 + (36.200 / 60));
+ final Double lon = new Double(14 + (36.500 / 60));
+
+ Waypoint wp = wpl.getWaypoint();
+
+ assertNotNull(wp);
+ assertEquals("RUSKI", wp.getId());
+ assertEquals(CompassPoint.NORTH, wp.getLatitudeHemisphere());
+ assertEquals(CompassPoint.EAST, wp.getLongitudeHemisphere());
+ assertEquals(lat, new Double(wp.getLatitude()));
+ assertEquals(lon, new Double(wp.getLongitude()));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.WPLParser#setWaypoint(Waypoint)}.
+ */
+ @Test
+ public void testSetWaypointWithNonZeroValues() {
+
+ final double lat = 60 + (11.552 / 60);
+ final double lon = 25 + (1.941 / 60);
+
+ Waypoint p2 = new Waypoint("WAYP2", lat, lon);
+
+ wpl.setWaypoint(p2);
+
+ String s2 = wpl.toString();
+ assertTrue(s2.contains(",6011.552,N,02501.941,E,WAYP2*"));
+
+ Waypoint p = wpl.getWaypoint();
+ assertNotNull(p);
+ assertEquals(lat, p.getLatitude(), 0.0000001);
+ assertEquals(lon, p.getLongitude(), 0.0000001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.WPLParser#setWaypoint(Waypoint)}.
+ */
+ @Test
+ public void testSetWaypointWithZeroValues() {
+
+ Waypoint p1 = new Waypoint("WAYP1", 0.0, 0.0);
+ wpl.setWaypoint(p1);
+
+ String s1 = wpl.toString();
+ assertTrue(s1.contains(",0000.000,N,00000.000,E,WAYP1*"));
+
+ Waypoint p = wpl.getWaypoint();
+ assertNotNull(p);
+ assertEquals(0.0, p.getLatitude(), 0.0000001);
+ assertEquals(0.0, p.getLongitude(), 0.0000001);
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/XDRTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/XDRTest.java
new file mode 100755
index 00000000000..0dc0e3fa520
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/XDRTest.java
@@ -0,0 +1,201 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.Measurement;
+
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class XDRTest {
+
+ public static final String EXAMPLE = "$IIXDR,P,1.02481,B,Barometer";
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.XDRParser#XDRParser(String)}.
+ */
+ @Test
+ public void testConstructor() {
+ XDRParser xdr = new XDRParser(EXAMPLE);
+ assertTrue(xdr.isValid());
+ assertEquals("XDR", xdr.getSentenceId());
+ assertEquals(4, xdr.getFieldCount());
+ assertEquals('P', xdr.getCharValue(0));
+ assertEquals(1.02481, xdr.getDoubleValue(1), 0.00001);
+ assertEquals('B', xdr.getCharValue(2));
+ assertEquals("Barometer", xdr.getStringValue(3));
+ }
+
+
+ @Test
+ public void testConstructorWithThreeFields() {
+
+ XDRParser xdr = new XDRParser("$WIXDR,U,014.9,V,");
+
+ List ml = xdr.getMeasurements();
+ assertEquals(1, ml.size());
+
+ Measurement m = ml.get(0);
+ assertEquals("U", m.getType());
+ assertEquals(14.9, m.getValue(), 0.1);
+ assertEquals("V", m.getUnits());
+ assertNull(m.getName());
+ }
+
+ @Test
+ public void testConstructorWithMultipleMeasurements() {
+
+ XDRParser xdr = new XDRParser("$WIXDR,P,111.1,B,3,C,222.2,C,0,H,333.3,P,2,C,444.4,C,1");
+
+ List ml = xdr.getMeasurements();
+ assertEquals(4, ml.size());
+
+ Measurement m1 = ml.get(0);
+ assertEquals("P", m1.getType());
+ assertEquals(111.1, m1.getValue(), 0.1);
+ assertEquals("B", m1.getUnits());
+ assertEquals("3", m1.getName());
+
+
+ Measurement m2 = ml.get(1);
+ assertEquals("C", m2.getType());
+ assertEquals(222.2, m2.getValue(), 0.1);
+ assertEquals("C", m2.getUnits());
+ assertEquals("0", m2.getName());
+
+ Measurement m3 = ml.get(2);
+ assertEquals("H", m3.getType());
+ assertEquals(333.3, m3.getValue(), 0.1);
+ assertEquals("P", m3.getUnits());
+ assertEquals("2", m3.getName());
+
+ Measurement m4 = ml.get(3);
+ assertEquals("C", m4.getType());
+ assertEquals(444.4, m4.getValue(), 0.1);
+ assertEquals("C", m4.getUnits());
+ assertEquals("1", m4.getName());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.XDRParser#addMeasurement(Measurement...))}.
+ */
+ @Test
+ public void testAddAnotherMeasurement() {
+
+ XDRParser xdr = new XDRParser(EXAMPLE);
+ Measurement value = new Measurement("C", 19.9, "C", "TempAir");
+
+ xdr.addMeasurement(value);
+
+ assertEquals(8, xdr.getFieldCount());
+ assertTrue(xdr.toString().startsWith("$IIXDR,P,1.02481,B,Barometer,C,19.9,C,TempAir*"));
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.XDRParser#addMeasurement(Measurement...))}.
+ */
+ @Test
+ public void testAddMeasurementToEmpty() {
+
+ XDRParser xdr = new XDRParser(TalkerId.II);
+ Measurement value = new Measurement("C", 19.9, "C", "TempAir");
+
+ xdr.addMeasurement(value);
+
+ assertEquals(4, xdr.getFieldCount());
+ assertTrue(xdr.toString().startsWith("$IIXDR,C,19.9,C,TempAir*"));
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.XDRParser#addMeasurement(Measurement...))))}.
+ */
+ @Test
+ public void testAddMultipleMeasurements() {
+
+ XDRParser xdr = new XDRParser(TalkerId.II);
+ Measurement m1 = new Measurement("C", 19.9, "C", "TempAir");
+ Measurement m2 = new Measurement("P", 1.08, "B", "Barometer");
+
+ xdr.addMeasurement(m1, m2);
+
+ assertEquals(8, xdr.getFieldCount());
+ assertTrue(xdr.toString().startsWith("$IIXDR,C,19.9,C,TempAir,P,1.08,B,Barometer*"));
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.XDRParser#getMeasurements()}.
+ */
+ @Test
+ public void testGetMeasurements() {
+
+ XDRParser xdr = new XDRParser(EXAMPLE);
+
+ List values = xdr.getMeasurements();
+ assertEquals(1, values.size());
+
+ Measurement value = values.get(0);
+ assertEquals("P", value.getType());
+ assertEquals(1.02481, value.getValue(), 0.00001);
+ assertEquals("B", value.getUnits());
+ assertEquals("Barometer", value.getName());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.XDRParser#setMeasurement(java.util.List)}.
+ */
+ @Test
+ public void testSetMeasurement() {
+
+ XDRParser xdr = new XDRParser(TalkerId.II);
+ Measurement value = new Measurement("C", 19.9, "C", "TempAir");
+
+ xdr.setMeasurement(value);
+
+ assertEquals(4, xdr.getFieldCount());
+ assertTrue(xdr.toString().startsWith("$IIXDR,C,19.9,C,TempAir*"));
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.XDRParser#setMeasurements(java.util.List)}.
+ */
+ @Test
+ public void testSetMeasurementAsList() {
+
+ XDRParser xdr = new XDRParser(TalkerId.II);
+ Measurement value = new Measurement("C", 19.9, "C", "TempAir");
+ List values = new ArrayList();
+ values.add(value);
+
+ xdr.setMeasurements(values);
+
+ assertEquals(4, xdr.getFieldCount());
+ assertTrue(xdr.toString().startsWith("$IIXDR,C,19.9,C,TempAir*"));
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.XDRParser#setMeasurements(java.util.List)}.
+ */
+ @Test
+ public void testSetMeasurementsList() {
+
+ XDRParser xdr = new XDRParser(TalkerId.II);
+ Measurement v1 = new Measurement("C", 19.9, "C", "TempAir");
+ Measurement v2 = new Measurement("P", 1.08, "B", "Barometer");
+ List values = new ArrayList();
+ values.add(v1);
+ values.add(v2);
+
+ xdr.setMeasurements(values);
+
+ assertEquals(8, xdr.getFieldCount());
+ assertTrue(xdr.toString().startsWith("$IIXDR,C,19.9,C,TempAir,P,1.08,B,Barometer*"));
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/XTETest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/XTETest.java
new file mode 100755
index 00000000000..062b5a7749f
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/XTETest.java
@@ -0,0 +1,100 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.sentence.SentenceId;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.sentence.XTESentence;
+import net.sf.marineapi.nmea.util.DataStatus;
+import net.sf.marineapi.nmea.util.Direction;
+import net.sf.marineapi.nmea.util.FaaMode;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class XTETest {
+
+ public static final String EXAMPLE = "$IIXTE,A,A,5.36,R,N*67";
+
+ private XTESentence empty;
+ private XTESentence instance;
+
+ @Before
+ public void setUp() throws Exception {
+ instance = new XTEParser(EXAMPLE);
+ empty = new XTEParser(TalkerId.GP);
+ }
+
+ @Test
+ public void testXTEParserString() {
+ assertEquals(TalkerId.II, instance.getTalkerId());
+ assertEquals(SentenceId.XTE.name(), instance.getSentenceId());
+ assertEquals(6, instance.getFieldCount());
+ assertTrue(instance.isValid());
+ }
+
+ @Test
+ public void testXTEParserTalkerId() {
+ assertEquals(TalkerId.GP, empty.getTalkerId());
+ assertEquals(SentenceId.XTE.name(), empty.getSentenceId());
+ assertEquals(6, empty.getFieldCount());
+ assertTrue(empty.isValid());
+ }
+
+ @Test
+ public void testGetCycleLockStatus() {
+ assertEquals(DataStatus.ACTIVE, instance.getCycleLockStatus());
+ }
+
+ @Test
+ public void testGetMagnitude() {
+ assertEquals(5.36, instance.getMagnitude(), 0.001);
+ }
+
+ @Test
+ public void testGetMode() {
+ assertEquals(FaaMode.NONE, empty.getMode());
+ }
+
+ @Test
+ public void testGetStatus() {
+ assertEquals(DataStatus.VOID, empty.getStatus());
+ }
+
+ @Test
+ public void testGetSteerTo() {
+ assertEquals(Direction.RIGHT, instance.getSteerTo());
+ }
+
+ @Test
+ public void testSetCycleLockStatus() {
+ instance.setCycleLockStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, instance.getCycleLockStatus());
+ }
+
+ @Test
+ public void testSetMagnitude() {
+ final double distance = 1.234;
+ empty.setMagnitude(1.234);
+ assertEquals(distance, empty.getMagnitude(), 0.01);
+ }
+
+ @Test
+ public void testSetMode() {
+ instance.setMode(FaaMode.DGPS);
+ assertEquals(FaaMode.DGPS, instance.getMode());
+ }
+
+ @Test
+ public void testSetStatus() {
+ instance.setStatus(DataStatus.VOID);
+ assertEquals(DataStatus.VOID, instance.getStatus());
+ }
+
+ @Test
+ public void testSetSteerTo() {
+ instance.setSteerTo(Direction.LEFT);
+ assertEquals(Direction.LEFT, instance.getSteerTo());
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/ZDATest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/ZDATest.java
new file mode 100755
index 00000000000..7767aba932d
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/parser/ZDATest.java
@@ -0,0 +1,197 @@
+package net.sf.marineapi.nmea.parser;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import net.sf.marineapi.nmea.sentence.TalkerId;
+import net.sf.marineapi.nmea.util.Date;
+import net.sf.marineapi.nmea.util.Time;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the ZDA sentence parser.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class ZDATest {
+
+ /** Example sentence */
+ public static final String EXAMPLE = "$GPZDA,032915,07,08,2004,00,00*4D";
+
+ private ZDAParser empty;
+ private ZDAParser zda;
+
+ @Before
+ public void setUp() {
+ try {
+ empty = new ZDAParser(TalkerId.GP);
+ zda = new ZDAParser(EXAMPLE);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(6, empty.getFieldCount());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#getDate()}.
+ */
+ @Test
+ public void testGetDate() {
+ Date expected = new Date(2004, 8, 7);
+ Date parsed = zda.getDate();
+ assertEquals(expected, parsed);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#getDay()}.
+ */
+ @Test
+ public void testGetDay() {
+ assertEquals(7, zda.getDate().getDay());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.ZDAParser#getLocalZoneHours()}.
+ */
+ @Test
+ public void testGetLocalZoneHours() {
+ assertEquals(0, zda.getLocalZoneHours());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.ZDAParser#setLocalZoneHours()}.
+ */
+ @Test
+ public void testSetLocalZoneHours() {
+ final int hours = 7;
+ zda.setLocalZoneHours(hours);
+ assertTrue(zda.toString().contains(",2004,07,00*"));
+ assertEquals(hours, zda.getLocalZoneHours());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.ZDAParser#getLocalZoneMinutes()}.
+ */
+ @Test
+ public void testGetLocalZoneMinutes() {
+ assertEquals(0, zda.getLocalZoneMinutes());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.parser.ZDAParser#setLocalZoneMinutes()}.
+ */
+ @Test
+ public void testSetLocalZoneMinutes() {
+ final int min = 9;
+ zda.setLocalZoneMinutes(min);
+ assertTrue(zda.toString().contains(",2004,00,09*"));
+ assertEquals(min, zda.getLocalZoneMinutes());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#getMonth()}
+ * .
+ */
+ @Test
+ public void testGetMonth() {
+ assertEquals(8, zda.getDate().getMonth());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#getTime()}.
+ */
+ @Test
+ public void testGetTime() {
+ Time t = zda.getTime();
+ assertNotNull(t);
+ assertEquals(3, t.getHour());
+ assertEquals(29, t.getMinutes());
+ assertEquals(15.0, t.getSeconds(), 0.1);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#getYear()}.
+ */
+ @Test
+ public void testGetYear() {
+ assertEquals(2004, zda.getDate().getYear());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#getTime()}.
+ */
+ @Test
+ public void testSetDate() {
+ zda.setDate(new Date(10, 6, 9));
+ assertTrue(zda.toString().contains(",032915,09,06,2010,00,"));
+ zda.setDate(new Date(85, 12, 11));
+ assertTrue(zda.toString().contains(",032915,11,12,1985,00,"));
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#setTime()}.
+ */
+ @Test
+ public void testSetTime() {
+ // 09:08:07.6
+ Time t = new Time(9, 8, 7.6);
+ zda.setTime(t);
+ assertTrue(zda.toString().startsWith("$GPZDA,090807.600,07,"));
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#setTimeAndLocalZone()}.
+ */
+ @Test
+ public void testSetTimeAndLocalZone() {
+ // 09:08:07.6+01:02
+ Time t = new Time(9, 8, 7.6, 1, 2);
+ zda.setTimeAndLocalZone(t);
+ assertEquals(1, zda.getLocalZoneHours());
+ assertEquals(2, zda.getLocalZoneMinutes());
+ assertTrue(zda.toString().startsWith("$GPZDA,090807.600,07,"));
+ assertTrue(zda.toString().contains("2004,01,02*"));
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.parser.ZDAParser#toDate()}.
+ */
+ @Test
+ public void testToDate() {
+
+ Date d = new Date(2010, 6, 15);
+ Time t = new Time(12, 15, 30.246, 2, 0);
+ zda.setDate(d);
+ zda.setTime(t);
+
+ GregorianCalendar cal = new GregorianCalendar();
+ cal.set(Calendar.YEAR, 2010);
+ cal.set(Calendar.MONTH, 5);
+ cal.set(Calendar.DAY_OF_MONTH, 15);
+ cal.set(Calendar.HOUR_OF_DAY, 12);
+ cal.set(Calendar.MINUTE, 15);
+ cal.set(Calendar.SECOND, 30);
+ cal.set(Calendar.MILLISECOND, 246);
+
+ java.util.Date result = zda.toDate();
+ java.util.Date expected = cal.getTime();
+
+ assertEquals(expected, result);
+ assertEquals(expected.getTime(), result.getTime());
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/sentence/SentenceIdTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/sentence/SentenceIdTest.java
new file mode 100755
index 00000000000..340692bc77d
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/sentence/SentenceIdTest.java
@@ -0,0 +1,78 @@
+/*
+ * SentenceIdTest.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.sentence;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class SentenceIdTest {
+
+ @Test
+ public void testParseKnownId() {
+ SentenceId s = SentenceId.parse("$GPGLL,,,,,,,");
+ assertEquals(SentenceId.GLL, s);
+ }
+
+ @Test
+ public void testParseUnknownId() {
+ try {
+ SentenceId.parse("$ABCDE,,,,,,");
+ fail("Did not throw exception");
+ } catch (Exception e) {
+ // pass
+ }
+ }
+
+ @Test
+ public void testParseStrStandardId() {
+ String s = SentenceId.parseStr("$GPGLL,,,,,,,");
+ assertEquals("GLL", s);
+ }
+
+ @Test
+ public void testParseStrNormalLengthProprietaryId() {
+ String s = SentenceId.parseStr("$PGRMZ,,,,,,,");
+ assertEquals("GRMZ", s);
+ }
+
+ @Test
+ public void testParseStrShortProprietaryId() {
+ String s = SentenceId.parseStr("$PBVE,,,,,,,");
+ assertEquals("BVE", s);
+ }
+
+ @Test
+ public void testParseStrShortestPossibleProprietaryId() {
+ String s = SentenceId.parseStr("$PAB,,,,,,,");
+ assertEquals("AB", s);
+ }
+
+ @Test
+ public void testParseStrLongestPossibleProprietaryId() {
+ String s = SentenceId.parseStr("$PABCDEFGHI,,,,,,,");
+ assertEquals("ABCDEFGHI", s);
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/sentence/SentenceValidatorTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/sentence/SentenceValidatorTest.java
new file mode 100755
index 00000000000..09b40510a89
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/sentence/SentenceValidatorTest.java
@@ -0,0 +1,185 @@
+/*
+ * SentenceValidatorTest.java
+ * Copyright (C) 2010 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.sentence;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import net.sf.marineapi.nmea.parser.BODTest;
+import net.sf.marineapi.nmea.parser.GGATest;
+import net.sf.marineapi.nmea.parser.GLLTest;
+import net.sf.marineapi.nmea.parser.GSATest;
+import net.sf.marineapi.nmea.parser.GSVTest;
+import net.sf.marineapi.nmea.parser.RMBTest;
+import net.sf.marineapi.nmea.parser.RMCTest;
+import net.sf.marineapi.nmea.parser.RTETest;
+import net.sf.marineapi.nmea.parser.VTGTest;
+import net.sf.marineapi.nmea.parser.WPLTest;
+import net.sf.marineapi.nmea.parser.ZDATest;
+
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class SentenceValidatorTest {
+
+ @Test
+ public void testIsValid() {
+
+ // "normal"
+ String a = "$ABCDE,1,2,3,4,5,6,7,8,9";
+ assertTrue(SentenceValidator.isValid(a));
+ assertTrue(SentenceValidator.isValid(Checksum.add(a)));
+
+ // empty sentence, single field
+ String b = "$ABCDE,";
+ assertTrue(SentenceValidator.isValid(b));
+ assertTrue(SentenceValidator.isValid(Checksum.add(b)));
+
+ // empty sentence, multiple fields
+ String c = "$ABCDE,,,,,,";
+ assertTrue(SentenceValidator.isValid(c));
+ assertTrue(SentenceValidator.isValid(Checksum.add(c)));
+
+ String d = "$ABCDE,1,TWO,three,FOUR?,5,6.0,-7.0,Eigth-8,N1N3,#T3n";
+ assertTrue(SentenceValidator.isValid(d));
+ assertTrue(SentenceValidator.isValid(Checksum.add(d)));
+
+ // '!' begin char
+ String e = "!ABCDE,1,2,3,4,5,6,7,8,9";
+ assertTrue(SentenceValidator.isValid(e));
+ assertTrue(SentenceValidator.isValid(Checksum.add(e)));
+ }
+
+ @Test
+ public void testIsValidWithInvalidInput() {
+ // invalid checksum, otherwise valid
+ assertFalse(SentenceValidator.isValid("$ABCDE,1,2,3,4,5,6,7,8,9*00"));
+ // something weird
+ assertFalse(SentenceValidator.isValid(null));
+ assertFalse(SentenceValidator.isValid(""));
+ assertFalse(SentenceValidator.isValid("$"));
+ assertFalse(SentenceValidator.isValid("*"));
+ assertFalse(SentenceValidator.isValid("$,*"));
+ assertFalse(SentenceValidator.isValid("$GPGSV*"));
+ assertFalse(SentenceValidator.isValid("foobar"));
+ assertFalse(SentenceValidator.isValid("$gpgga,1,2,3,4,5,6,7,8,9"));
+ assertFalse(SentenceValidator.isValid("GPGGA,1,2,3,4,5,6,7,8,9"));
+ assertFalse(SentenceValidator.isValid("$GpGGA,1,2,3,4,5,6,7,8,9"));
+ assertFalse(SentenceValidator.isValid("$GPGGa,1,2,3,4,5,6,7,8,9"));
+ assertFalse(SentenceValidator.isValid("$GPGG#,1,2,3,4,5,6,7,8,9"));
+ assertFalse(SentenceValidator.isValid("$AB,1,2,3,4,5,6,7,8,9"));
+ assertFalse(SentenceValidator.isValid("$ABCDEFGHIJK,1,2,3,4,5,6,7,8,9"));
+ assertFalse(SentenceValidator.isValid("$GPGGA,1,2,3,4,5,6,7,8,9*00"));
+ }
+
+ @Test
+ public void testIsValidWithValidInput() {
+ assertTrue(SentenceValidator.isValid(BODTest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(GGATest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(GLLTest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(GSATest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(GSVTest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(RMBTest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(RMCTest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(RTETest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(VTGTest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(WPLTest.EXAMPLE));
+ assertTrue(SentenceValidator.isValid(ZDATest.EXAMPLE));
+ }
+
+ @Test
+ public void testIsValidWithLongProprietaryId() {
+ String str = "$PRWIILOG,GGA,A,T,1,0";
+ assertTrue(SentenceValidator.isSentence(str));
+ assertTrue(SentenceValidator.isValid(str));
+ }
+
+ @Test
+ public void testIsValidWithShortProprietaryId() {
+ String str = "$PUBX,03,GT{,ID,s,AZM,EL,SN,LK},";
+ assertTrue(SentenceValidator.isSentence(str));
+ assertTrue(SentenceValidator.isValid(str));
+ }
+
+ @Test
+ public void testIsSentenceWithChecksum() {
+
+ String nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*20";
+ assertTrue(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*20xy";
+ assertFalse(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*201";
+ assertFalse(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*2";
+ assertFalse(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*";
+ assertFalse(SentenceValidator.isSentence(nmea));
+ }
+
+ @Test
+ public void testIsSentenceWithoutChecksum() {
+ String nmea = "$GPRMC,142312.000,V,,,,,,,080514,,";
+ assertTrue(SentenceValidator.isSentence(nmea));
+ }
+
+ @Test
+ public void testIsSentenceWithChecksumAndNewline() {
+
+ String nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*20\r\n";
+ assertTrue(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*20\n\r";
+ assertTrue(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*20\r";
+ assertTrue(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*20\n";
+ assertTrue(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,*20\r\n\r\n";
+ assertFalse(SentenceValidator.isSentence(nmea));
+ }
+
+ @Test
+ public void testIsSentenceNoChecksumWithNewline() {
+
+ String nmea = "$GPRMC,142312.000,V,,,,,,,080514,,\r\n";
+ assertTrue(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,\n\r";
+ assertTrue(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,\r";
+ assertTrue(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,\n";
+ assertTrue(SentenceValidator.isSentence(nmea));
+
+ nmea = "$GPRMC,142312.000,V,,,,,,,080514,,\r\n\r\n";
+ assertFalse(SentenceValidator.isSentence(nmea));
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/sentence/TalkerIdTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/sentence/TalkerIdTest.java
new file mode 100755
index 00000000000..4efcd621a04
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/sentence/TalkerIdTest.java
@@ -0,0 +1,75 @@
+package net.sf.marineapi.nmea.sentence;
+
+/*
+ * TalkerIdTest.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class TalkerIdTest {
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.sentence.TalkerId#parse(java.lang.String)}.
+ */
+ @Test
+ public void testParse() {
+ assertEquals(TalkerId.GP, TalkerId.parse("$GPGLL,,,,,,,"));
+ assertEquals(TalkerId.GL, TalkerId.parse("$GLGSV,,,,,,,"));
+ assertEquals(TalkerId.GN, TalkerId.parse("$GNGSV,,,,,,,"));
+ assertEquals(TalkerId.II, TalkerId.parse("$IIDPT,,,,,,,"));
+ }
+
+ @Test
+ public void testParseProprietary() {
+ assertEquals(TalkerId.P, TalkerId.parse("$PRWIILOG,GGA,A,T,1,0"));
+ }
+
+ @Test
+ public void testParseAIS() {
+ assertEquals(TalkerId.AI, TalkerId.parse("!AIVDM,,,,,,,"));
+ assertEquals(TalkerId.AB, TalkerId.parse("!ABVDM,,,,,,,"));
+ assertEquals(TalkerId.BS, TalkerId.parse("!BSVDM,,,,,,,"));
+ }
+
+ @Test
+ public void testParseUnknown() {
+ try {
+ TalkerId.parse("$XXXXX,,,,,,");
+ fail("Did not throw exception");
+ } catch (Exception e) {
+ // pass
+ }
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/DateTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/DateTest.java
new file mode 100755
index 00000000000..d18c0281218
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/DateTest.java
@@ -0,0 +1,363 @@
+/*
+ * DateTest.java
+ * Copyright (C) 2010 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class DateTest {
+
+ private Date instance;
+
+ private GregorianCalendar cal;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ instance = new Date();
+ cal = new GregorianCalendar();
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#Date()}.
+ */
+ @Test
+ public void testConstructor() {
+ assertEquals(cal.get(Calendar.YEAR), instance.getYear());
+ assertEquals(cal.get(Calendar.MONTH) + 1, instance.getMonth());
+ assertEquals(cal.get(Calendar.DAY_OF_MONTH), instance.getDay());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Date#Date(int, int, int)}.
+ */
+ @Test
+ public void testConstructorWithValues() {
+ Date d = new Date(2010, 6, 15);
+ assertEquals(2010, d.getYear());
+ assertEquals(6, d.getMonth());
+ assertEquals(15, d.getDay());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Date#Date(String)}.
+ */
+ @Test
+ public void testConstructorWithString() {
+ Date d = new Date("150610");
+ assertEquals(2010, d.getYear());
+ assertEquals(6, d.getMonth());
+ assertEquals(15, d.getDay());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Date#equals(java.lang.Object)}.
+ */
+ @Test
+ public void testEqualsAfterInit() {
+ Date d = new Date();
+ assertTrue(d.equals(instance));
+ Date one = new Date(2010, 6, 15);
+ Date two = new Date(2010, 6, 15);
+ assertTrue(one.equals(two));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Date#equals(java.lang.Object)}.
+ */
+ @Test
+ public void testEqualsItself() {
+ assertTrue(instance.equals(instance));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Date#equals(java.lang.Object)}.
+ */
+ @Test
+ public void testEqualsWhenChanged() {
+
+ final int y = 2011;
+ final int m = 6;
+ final int d = 15;
+ final Date a = new Date(y, m, d);
+ final Date b = new Date(y, m, d);
+
+ a.setDay(b.getDay() - 1);
+ assertFalse(a.equals(b));
+
+ b.setDay(a.getDay());
+ assertTrue(a.equals(b));
+
+ a.setMonth(b.getMonth() - 1);
+ assertFalse(a.equals(b));
+
+ b.setMonth(a.getMonth());
+ assertTrue(a.equals(b));
+
+ a.setYear(b.getYear() - 1);
+ assertFalse(a.equals(b));
+
+ b.setYear(a.getYear());
+ assertTrue(a.equals(b));
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Date#equals(java.lang.Object)}.
+ */
+ @Test
+ public void testEqualsWrongType() {
+ Object str = new String("foobar");
+ Object dbl = new Double(123);
+ assertFalse(instance.equals(str));
+ assertFalse(instance.equals(dbl));
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#getDay()}.
+ */
+ @Test
+ public void testGetDay() {
+ assertEquals(cal.get(Calendar.DAY_OF_MONTH), instance.getDay());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#getMonth()}.
+ */
+ @Test
+ public void testGetMonth() {
+ assertEquals(cal.get(Calendar.MONTH) + 1, instance.getMonth());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#getYear()}.
+ */
+ @Test
+ public void testGetYear() {
+ assertEquals(cal.get(Calendar.YEAR), instance.getYear());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#setDay(int)}.
+ */
+ @Test
+ public void testSetDay() {
+ final int day = 10;
+ instance.setDay(day);
+ assertEquals(day, instance.getDay());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#setDay(int)}.
+ */
+ @Test
+ public void testSetDayOutOfBounds() {
+ int day = 0;
+ try {
+ instance.setDay(day);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+
+ day = 32;
+ try {
+ instance.setDay(day);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#setMonth(int)}.
+ */
+ @Test
+ public void testSetMonth() {
+ final int month = 10;
+ instance.setMonth(month);
+ assertEquals(month, instance.getMonth());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#setMonth(int)}.
+ */
+ @Test
+ public void testSetMonthOutOfBounds() {
+ int month = 0;
+ try {
+ instance.setMonth(month);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+
+ month = 32;
+ try {
+ instance.setMonth(month);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#setYear(int)}.
+ */
+ @Test
+ public void testSetYearFiveDigits() {
+ try {
+ instance.setYear(10000);
+ fail("Did not throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#setYear(int)}.
+ */
+ @Test
+ public void testSetYearFourDigit() {
+ for (int year = 1000; year < 10000; year++) {
+ instance.setYear(year);
+ assertEquals(year, instance.getYear());
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#setYear(int)}.
+ */
+ @Test
+ public void testSetYearNegative() {
+ try {
+ instance.setYear(-1);
+ fail("Did not throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#setYear(int)}.
+ */
+ @Test
+ public void testSetYearThreeDigits() {
+ try {
+ instance.setYear(100);
+ fail("Did not throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+
+ try {
+ instance.setYear(999);
+ fail("Did not throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Date#setYear(int)}.
+ */
+ @Test
+ public void testSetYearTwoDigit() {
+ int century = 2000;
+ for (int year = 0; year < 100; year++) {
+ instance.setYear(year);
+ assertEquals((century + year), instance.getYear());
+ if (year == Date.PIVOT_YEAR) {
+ century = 1900;
+ }
+ }
+ }
+
+ @Test
+ public void testToStringTwoDigitYear() {
+ Date d = new Date(13, 9, 2);
+ assertEquals("020913", d.toString());
+ }
+
+ @Test
+ public void testToStringFourDigitYear() {
+ Date d = new Date(2013, 9, 2);
+ assertEquals("020913", d.toString());
+ }
+
+ @Test
+ public void testToISO8601TwoDigitYear() {
+ Date d = new Date(13, 9, 2);
+ assertEquals("2013-09-02", d.toISO8601());
+ }
+
+ @Test
+ public void testToISO8601FourDigitYear() {
+ Date d = new Date(2013, 9, 2);
+ assertEquals("2013-09-02", d.toISO8601());
+ }
+
+ @Test
+ public void testToISO8601WithTime() {
+ Date d = new Date(2013, 9, 2);
+ Time t = new Time(2, 7, 9);
+ assertEquals("2013-09-02T02:07:09+00:00", d.toISO8601(t));
+ }
+
+ @Test
+ public void testToISO8601WithTimeAndZeroZone() {
+ Date d = new Date(2013, 9, 2);
+ Time t = new Time(2, 7, 9, 0, 0);
+ assertEquals("2013-09-02T02:07:09+00:00", d.toISO8601(t));
+ }
+
+ @Test
+ public void testToISO8601WithTimeAndPositiveOffset() {
+ Date d = new Date(2013, 9, 2);
+ Time t = new Time(2, 7, 9, 2, 0);
+ assertEquals("2013-09-02T02:07:09+02:00", d.toISO8601(t));
+ }
+
+ @Test
+ public void testToISO8601WithTimeAndNegativeOffset() {
+ Date d = new Date(2013, 9, 2);
+ Time t = new Time(2, 7, 9, -2, 5);
+ assertEquals("2013-09-02T02:07:09-02:05", d.toISO8601(t));
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/PositionTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/PositionTest.java
new file mode 100755
index 00000000000..38a77a5d1c2
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/PositionTest.java
@@ -0,0 +1,209 @@
+package net.sf.marineapi.nmea.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class PositionTest {
+
+ Position instance;
+
+ /**
+ * Setup
+ */
+ @Before
+ public void setUp() {
+ instance = new Position(60.0, 25.0, Datum.WGS84);
+ }
+
+ /**
+ * Test for distanceTo()
+ */
+ @Test
+ public void testDistanceTo() {
+
+ // TODO: not exactly correct as 1 degree is *approximately* 60 NM
+
+ Position origin = new Position(0.123, 25.0);
+
+ for (int n = 0; n < 90; n++) {
+
+ // 1 degree north from instance's position
+ Position destination = new Position(0.123 + n, 25.0);
+
+ double distance = origin.distanceTo(destination);
+
+ // one degree equals 60 NM
+ double expected = (60 * n * 1852.0);
+
+ assertEquals(expected, distance, 1.0);
+ }
+ }
+
+ /**
+ * Test for distanceTo()
+ */
+ @Test
+ public void testDistanceToSelf() {
+ Position origin = new Position(60.567, 26.123);
+ assertEquals(0.0, origin.distanceTo(origin), 0.00001);
+ }
+
+ /**
+ * Test for getDatum()
+ */
+ @Test
+ public void testGetDatum() {
+ assertEquals(Datum.WGS84, instance.getDatum());
+ }
+
+ /**
+ * Test for getLatitude()
+ */
+ @Test
+ public void testGetLatitude() {
+ assertEquals(60.0, instance.getLatitude(), 0.0000001);
+ }
+
+ /**
+ * Test for getLatHemisphere()
+ */
+ @Test
+ public void testGetLatitudeHemisphere() {
+ assertEquals(CompassPoint.NORTH, instance.getLatitudeHemisphere());
+ }
+
+ /**
+ * Test for getLongitude()
+ */
+ @Test
+ public void testGetLongitude() {
+ assertEquals(25.0, instance.getLongitude(), 0.0000001);
+ }
+
+ /**
+ * Test for getLonHemisphere()
+ */
+ @Test
+ public void testGetLongitudeHemisphere() {
+ assertEquals(CompassPoint.EAST, instance.getLongitudeHemisphere());
+ }
+
+ /**
+ * Test for setLatitude()
+ */
+ @Test
+ public void testSetIllegalLatitudeNorth() {
+ try {
+ instance.setLatitude(90.001);
+ fail("Did not throw IllegalArgumentExcetpion");
+ } catch (IllegalArgumentException e) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test for setLatitude()
+ */
+ @Test
+ public void testSetIllegalLatitudeSouth() {
+ try {
+ instance.setLatitude(-90.001);
+ fail("Did not throw IllegalArgumentExcetpion");
+ } catch (IllegalArgumentException e) {
+ // pass
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ /**
+ * Test for setLongitude()
+ */
+ @Test
+ public void testSetIllegalLongitudeEast() {
+ try {
+ instance.setLongitude(180.0001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test for setLongitude()
+ */
+ @Test
+ public void testSetIllegalLongitudeWest() {
+ try {
+ instance.setLongitude(-180.0001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test for setLatitude()
+ */
+ @Test
+ public void testSetLatitudeNorth() {
+ assertEquals(60.0, instance.getLatitude(), 0.0000001);
+ instance.setLatitude(90.0);
+ assertEquals(90.0, instance.getLatitude(), 0.0000001);
+ assertEquals(CompassPoint.NORTH, instance.getLatitudeHemisphere());
+ }
+
+ /**
+ * Test for setLatitude()
+ */
+ @Test
+ public void testSetLatitudeSouth() {
+ assertEquals(60.0, instance.getLatitude(), 0.0000001);
+ instance.setLatitude(-90.0);
+ assertEquals(-90.0, instance.getLatitude(), 0.0000001);
+ assertEquals(CompassPoint.SOUTH, instance.getLatitudeHemisphere());
+ }
+
+ /**
+ * Test for setLongitude()
+ */
+ @Test
+ public void testSetLongitudeEast() {
+ assertEquals(25.0, instance.getLongitude(), 0.0000001);
+ instance.setLongitude(180.0);
+ assertEquals(180, instance.getLongitude(), 0.0000001);
+ assertEquals(CompassPoint.EAST, instance.getLongitudeHemisphere());
+ }
+
+ /**
+ * Test for setLongitude()
+ */
+ @Test
+ public void testSetLongitudeWest() {
+ assertEquals(25.0, instance.getLongitude(), 0.0000001);
+ instance.setLongitude(-180.0);
+ assertEquals(-180, instance.getLongitude(), 0.0000001);
+ assertEquals(CompassPoint.WEST, instance.getLongitudeHemisphere());
+ }
+
+ /**
+ * Test for toWaypoint()
+ */
+ @Test
+ public void testToWaypoint() {
+ final String name = "TEST";
+ final Waypoint wp = instance.toWaypoint(name);
+ assertEquals(name, wp.getId());
+ assertEquals("", wp.getDescription());
+ assertEquals(instance.getLatitude(), wp.getLatitude(), 0.00001);
+ assertEquals(instance.getLongitude(), wp.getLongitude(), 0.00001);
+ assertEquals(instance.getLatitudeHemisphere(), wp.getLatitudeHemisphere());
+ assertEquals(instance.getLongitudeHemisphere(), wp.getLongitudeHemisphere());
+ assertEquals(instance.getDatum(), wp.getDatum());
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/TimeTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/TimeTest.java
new file mode 100755
index 00000000000..59e2bee9ac3
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/TimeTest.java
@@ -0,0 +1,355 @@
+/*
+ * TimeTest.java
+ * Copyright (C) 2010 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class TimeTest {
+
+ private Time time;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ time = new Time(1, 2, 3.4, 0, 0);
+ }
+
+ /**
+ * Test method for setTime() and toDate() round-trip.
+ */
+ @Test
+ public void testDateRoundTrip() {
+
+ Date now = new Date();
+ time.setTime(now);
+
+ Date result = time.toDate(now);
+
+ assertEquals(now, result);
+ assertEquals(now.getTime(), result.getTime());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Time#toString(net.sf.marineapi.nmea.util.Time)}
+ * .
+ */
+ @Test
+ public void testFormatTimeNoDecimals() {
+ Time t = new Time(1, 2, 3);
+ assertEquals("010203.000", t.toString());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Time#toString(net.sf.marineapi.nmea.util.Time)}
+ * .
+ */
+ @Test
+ public void testFormatTimeWithDecimals() {
+ Time t = new Time(1, 2, 3.456);
+ assertEquals("010203.456", t.toString());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Time#toString(net.sf.marineapi.nmea.util.Time)}
+ * .
+ */
+ @Test
+ public void testFormatTimeWithOneDecimal() {
+ Time t = new Time(1, 2, 3.4);
+ assertEquals("010203.400", t.toString());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#getHour()}.
+ */
+ @Test
+ public void testGetHour() {
+ assertEquals(1, time.getHour());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#getMilliseconds()}
+ * .
+ */
+ @Test
+ public void testGetMilliseconds() {
+ time.setHour(12);
+ time.setMinutes(1);
+ time.setSeconds(1.0);
+ assertEquals(43261000, time.getMilliseconds());
+ time.setHour(18);
+ time.setMinutes(1);
+ time.setSeconds(1.123);
+ assertEquals(64861123, time.getMilliseconds());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#getMinutes()}.
+ */
+ @Test
+ public void testGetMinutes() {
+ assertEquals(2, time.getMinutes());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#getSeconds()}.
+ */
+ @Test
+ public void testGetSeconds() {
+ assertEquals(3.4, time.getSeconds(), 0.001);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testParseTimeWithDecimals() {
+ Time t = new Time("010203.456");
+ assertEquals(1, t.getHour());
+ assertEquals(2, t.getMinutes());
+ assertEquals(3.456, t.getSeconds(), 0.001);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testParseTimeWithOneDecimal() {
+ Time t = new Time("010203.4");
+ assertEquals(1, t.getHour());
+ assertEquals(2, t.getMinutes());
+ assertEquals(3.4, t.getSeconds(), 0.001);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testParseTimeWithoutDecimals() {
+ Time t = new Time("010203");
+ assertEquals(1, t.getHour());
+ assertEquals(2, t.getMinutes());
+ assertEquals(3.0, t.getSeconds(), 0.001);
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#setHour(int)}.
+ */
+ @Test
+ public void testSetHour() {
+ time.setHour(12);
+ assertEquals(12, time.getHour());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#setHour(int)}.
+ */
+ @Test
+ public void testSetInvalidHour() {
+ try {
+ time.setHour(60);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#setMinutes(int)}.
+ */
+ @Test
+ public void testSetInvalidMinutes() {
+ try {
+ time.setMinutes(60);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Time#setSeconds(double)}.
+ */
+ @Test
+ public void testSetInvalidSeconds() {
+ try {
+ time.setSeconds(60.0);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#setMinutes(int)}.
+ */
+ @Test
+ public void testSetMinutes() {
+ time.setMinutes(30);
+ assertEquals(30, time.getMinutes());
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#setHour(int)}.
+ */
+ @Test
+ public void testSetNegativeHour() {
+ try {
+ time.setHour(-1);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#setMinutes(int)}.
+ */
+ @Test
+ public void testSetNegativeMinutes() {
+ try {
+ time.setMinutes(-1);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Time#setSeconds(double)}.
+ */
+ @Test
+ public void testSetNegativeSeconds() {
+ try {
+ time.setSeconds(-0.001);
+ fail("Did not throw exception");
+ } catch (IllegalArgumentException e) {
+ // pass
+ }
+ }
+
+ /**
+ * Test method for {@link net.sf.marineapi.nmea.util.Time#setSeconds(int)}.
+ */
+ @Test
+ public void testSetSeconds() {
+ time.setSeconds(45.12345);
+ assertEquals(45.12345, time.getSeconds(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Time#setTime(java.util.Date)}.
+ */
+ @Test
+ public void testSetTime() {
+
+ Date now = new Date();
+ time.setTime(now);
+
+ GregorianCalendar cal = new GregorianCalendar();
+ cal.setTime(now);
+ int hours = cal.get(Calendar.HOUR_OF_DAY);
+ int minutes = cal.get(Calendar.MINUTE);
+ int fullSeconds = cal.get(Calendar.SECOND);
+ int milliSeconds = cal.get(Calendar.MILLISECOND);
+ double seconds = fullSeconds + (milliSeconds / 1000.0);
+
+ assertEquals(hours, time.getHour());
+ assertEquals(minutes, time.getMinutes());
+ assertEquals(seconds, time.getSeconds(), 0.001);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Time#toDate(java.util.Date)}.
+ */
+ @Test
+ public void testToDate() {
+
+ Calendar cal = new GregorianCalendar();
+ Calendar result = new GregorianCalendar();
+
+ // set cal to reference date/time (date portion not significant)
+ cal.set(Calendar.HOUR_OF_DAY, 0);
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 3);
+ cal.set(Calendar.MILLISECOND, 400);
+
+ // convert Time to Date and insert to result Calendar for comparison
+ Date d = time.toDate(cal.getTime());
+ result.setTime(d);
+
+ int resultHour = result.get(Calendar.HOUR_OF_DAY);
+ int resultMinute = result.get(Calendar.MINUTE);
+ int resultFullSeconds = result.get(Calendar.SECOND);
+ int resultMilliseconds = result.get(Calendar.MILLISECOND);
+ double resultSeconds = resultFullSeconds + (resultMilliseconds / 1000.0);
+
+ // Time portion, should match values in Time exactly
+ assertEquals(time.getHour(), resultHour);
+ assertEquals(time.getMinutes(), resultMinute);
+ assertEquals(time.getSeconds(), resultSeconds, 0.001);
+
+ // Date portion should not have changed
+ assertEquals(cal.get(Calendar.YEAR), result.get(Calendar.YEAR));
+ assertEquals(cal.get(Calendar.MONTH), result.get(Calendar.MONTH));
+ assertEquals(cal.get(Calendar.DAY_OF_YEAR),
+ result.get(Calendar.DAY_OF_YEAR));
+ }
+
+ @Test
+ public void testEquals() {
+
+ Time a = new Time(1, 2, 3.456);
+ Time b = new Time(1, 2, 3.456);
+ Time c = new Time(2, 3, 4.567);
+
+ assertTrue(a.equals(a));
+ assertTrue(a.equals(b));
+ assertFalse(a.equals(c));
+ assertFalse(a.equals(new Object()));
+ assertEquals(a.hashCode(), b.hashCode());
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/WaypointTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/WaypointTest.java
new file mode 100755
index 00000000000..a006c09501f
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/nmea/util/WaypointTest.java
@@ -0,0 +1,68 @@
+/*
+ * WaypointTest.java
+ * Copyright 2010 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.nmea.util;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * WaypointTest
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class WaypointTest {
+
+ private final String id1 = "FOO";
+ private final String id2 = "BAR";
+ private final String desc = "Description text";
+ Waypoint point;
+
+ @Before
+ public void setUp() {
+ point = new Waypoint(id1, 60.0, 25.0, Datum.WGS84);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Waypoint#setDescription(java.lang.String)}
+ * .
+ */
+ @Test
+ public void testDescription() {
+ assertEquals("", point.getDescription());
+ point.setDescription(desc);
+ assertEquals(desc, point.getDescription());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.nmea.util.Waypoint#setId(java.lang.String)}.
+ */
+ @Test
+ public void testId() {
+ assertEquals(id1, point.getId());
+ point.setId(id2);
+ assertEquals(id2, point.getId());
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/provider/HeadingProviderTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/provider/HeadingProviderTest.java
new file mode 100755
index 00000000000..14b4b1792b9
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/provider/HeadingProviderTest.java
@@ -0,0 +1,120 @@
+package net.sf.marineapi.provider;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import net.sf.marineapi.nmea.event.SentenceEvent;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.parser.HDGTest;
+import net.sf.marineapi.nmea.parser.HDMTest;
+import net.sf.marineapi.nmea.parser.HDTTest;
+import net.sf.marineapi.nmea.parser.SentenceFactory;
+import net.sf.marineapi.nmea.sentence.Sentence;
+import net.sf.marineapi.provider.event.HeadingEvent;
+import net.sf.marineapi.provider.event.HeadingListener;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class HeadingProviderTest implements HeadingListener {
+
+ private SentenceFactory factory;
+
+ private HeadingProvider instance;
+
+ private HeadingEvent event;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ factory = SentenceFactory.getInstance();
+ File file = new File("resources/data/sample1.txt");
+ FileInputStream str = new FileInputStream(file);
+ SentenceReader r = new SentenceReader(str);
+ instance = new HeadingProvider(r);
+ instance.addListener(this);
+ event = null;
+ }
+
+ @After
+ public void tearDown() {
+ instance.removeListener(this);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.provider.AbstractProvider#sentenceRead(net.sf.marineapi.nmea.event.SentenceEvent)}
+ * .
+ */
+ @Test
+ public void testHDMSentenceRead() {
+
+ Sentence s = factory.createParser(HDMTest.EXAMPLE);
+ assertNull(event);
+
+ instance.sentenceRead(new SentenceEvent(this, s));
+
+ assertNotNull(event);
+ assertEquals(90.0, event.getHeading(), 0.1);
+ assertFalse(event.isTrue());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.provider.AbstractProvider#sentenceRead(net.sf.marineapi.nmea.event.SentenceEvent)}
+ * .
+ */
+ @Test
+ public void testHDTSentenceRead() {
+
+ Sentence s = factory.createParser(HDTTest.EXAMPLE);
+ assertNull(event);
+
+ instance.sentenceRead(new SentenceEvent(this, s));
+
+ assertNotNull(event);
+ assertEquals(90.1, event.getHeading(), 0.1);
+ assertTrue(event.isTrue());
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.provider.AbstractProvider#sentenceRead(net.sf.marineapi.nmea.event.SentenceEvent)}
+ * .
+ */
+ @Test
+ public void testHDGSentenceRead() {
+
+ Sentence s = factory.createParser(HDGTest.EXAMPLE);
+ assertNull(event);
+
+ instance.sentenceRead(new SentenceEvent(this, s));
+
+ assertNotNull(event);
+ assertEquals(123.4, event.getHeading(), 0.1);
+ assertFalse(event.isTrue());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * net.sf.marineapi.provider.event.HeadingListener#providerUpdate(net.sf
+ * .marineapi.provider.event.HeadingEvent)
+ */
+ public void providerUpdate(HeadingEvent evt) {
+ this.event = evt;
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/provider/PositionProviderTest.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/provider/PositionProviderTest.java
new file mode 100755
index 00000000000..d043f3ada1f
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/provider/PositionProviderTest.java
@@ -0,0 +1,141 @@
+/*
+ * PositionProviderTest.java
+ * Copyright (C) 2012 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.provider;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import net.sf.marineapi.nmea.event.SentenceEvent;
+import net.sf.marineapi.nmea.io.SentenceReader;
+import net.sf.marineapi.nmea.parser.GGATest;
+import net.sf.marineapi.nmea.parser.GLLTest;
+import net.sf.marineapi.nmea.parser.RMCTest;
+import net.sf.marineapi.nmea.parser.SentenceFactory;
+import net.sf.marineapi.nmea.sentence.Sentence;
+import net.sf.marineapi.provider.event.PositionEvent;
+import net.sf.marineapi.provider.event.PositionListener;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Kimmo Tuukkanen
+ */
+public class PositionProviderTest implements PositionListener {
+
+ PositionEvent event;
+ PositionProvider instance;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ File f = new File("resources/data/Navibe-GM720.txt");
+ FileInputStream str = new FileInputStream(f);
+ SentenceReader r = new SentenceReader(str);
+ instance = new PositionProvider(r);
+ instance.addListener(this);
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @After
+ public void tearDown() throws Exception {
+ instance.removeListener(this);
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.provider.AbstractProvider#sentenceRead(net.sf.marineapi.nmea.event.SentenceEvent)}
+ * .
+ */
+ @Test
+ public void testSentenceReadWithGGA() {
+
+ SentenceFactory sf = SentenceFactory.getInstance();
+ Sentence gga = sf.createParser(GGATest.EXAMPLE);
+
+ assertNull(event);
+ instance.sentenceRead(new SentenceEvent(this, gga));
+ assertNull(event);
+
+ Sentence rmc = sf.createParser(RMCTest.EXAMPLE);
+
+ assertNull(event);
+ instance.sentenceRead(new SentenceEvent(this, rmc));
+ assertNotNull(event);
+
+ }
+
+ /**
+ * Test method for
+ * {@link net.sf.marineapi.provider.AbstractProvider#sentenceRead(net.sf.marineapi.nmea.event.SentenceEvent)}
+ * .
+ */
+ @Test
+ public void testSentenceReadWithGLL() {
+
+ SentenceFactory sf = SentenceFactory.getInstance();
+ Sentence gll = sf.createParser(GLLTest.EXAMPLE);
+
+ assertNull(event);
+ instance.sentenceRead(new SentenceEvent(this, gll));
+ assertNull(event);
+
+ Sentence rmc = sf.createParser(RMCTest.EXAMPLE);
+ instance.sentenceRead(new SentenceEvent(this, rmc));
+ assertNotNull(event);
+
+ }
+
+ @Test
+ public void testSentenceReadWithLegacyRMC() {
+
+ SentenceFactory sf = SentenceFactory.getInstance();
+ Sentence gll = sf.createParser(GLLTest.EXAMPLE);
+
+ assertNull(event);
+ instance.sentenceRead(new SentenceEvent(this, gll));
+ assertNull(event);
+
+ Sentence rmc = sf.createParser(RMCTest.EXAMPLE_LEGACY);
+ instance.sentenceRead(new SentenceEvent(this, rmc));
+ assertNotNull(event);
+
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * net.sf.marineapi.provider.event.PositionListener#providerUpdate(net.sf.marineapi
+ * .provider.event.PositionEvent)
+ */
+ public void providerUpdate(PositionEvent evt) {
+ event = evt;
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/BARParser.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/BARParser.java
new file mode 100755
index 00000000000..cad4e3ba140
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/BARParser.java
@@ -0,0 +1,40 @@
+/*
+ * BARParser.java
+ * Copyright (C) 2011 Kimmo Tuukkanen
+ *
+ * This file is part of Java Marine API.
+ *
+ *
+ * Java Marine API is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Java Marine API is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Java Marine API. If not, see .
+ */
+package net.sf.marineapi.test.util;
+
+import net.sf.marineapi.nmea.parser.SentenceParser;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+/**
+ * Invalid parser implementation, no constructor with String param.
+ *
+ * @author Kimmo Tuukkanen
+ */
+public class BARParser extends SentenceParser {
+
+ /**
+ * Constructor
+ */
+ public BARParser() {
+ super(TalkerId.GP, "BAR", 5);
+ }
+
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/FOOParser.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/FOOParser.java
new file mode 100755
index 00000000000..98b798ae4de
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/FOOParser.java
@@ -0,0 +1,31 @@
+package net.sf.marineapi.test.util;
+
+import net.sf.marineapi.nmea.parser.SentenceParser;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+/**
+ * Dummy parser imaginary sentence type, for testing the inheritance of
+ * SentenceParser.
+ */
+public class FOOParser extends SentenceParser implements FOOSentence {
+
+ public FOOParser(String s) {
+ super(s, "FOO");
+ }
+
+ public FOOParser(TalkerId tid) {
+ super(tid, "FOO", 3);
+ }
+
+ public String getValueA() {
+ return getStringValue(0);
+ }
+
+ public String getValueB() {
+ return getStringValue(1);
+ }
+
+ public String getValueC() {
+ return getStringValue(2);
+ }
+}
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/FOOSentence.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/FOOSentence.java
new file mode 100755
index 00000000000..0cb992ec487
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/FOOSentence.java
@@ -0,0 +1,11 @@
+package net.sf.marineapi.test.util;
+
+public interface FOOSentence {
+
+ public abstract String getValueA();
+
+ public abstract String getValueB();
+
+ public abstract String getValueC();
+
+}
\ No newline at end of file
diff --git a/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/VDMParser.java b/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/VDMParser.java
new file mode 100755
index 00000000000..9f5888c8160
--- /dev/null
+++ b/java/net.sf.marineapi.test/src/net/sf/marineapi/test/util/VDMParser.java
@@ -0,0 +1,34 @@
+package net.sf.marineapi.test.util;
+
+import net.sf.marineapi.nmea.parser.SentenceParser;
+import net.sf.marineapi.nmea.sentence.TalkerId;
+
+/**
+ * Dummy parser simulating AIVDM parser with alternative begin character, for
+ * testing the inheritance of SentenceParser and custom parsers registering in
+ * SentenceFactory.
+ */
+public class VDMParser extends SentenceParser {
+
+ public VDMParser(String s) {
+ // just like any other parser, begin char comes in String param
+ super(s, "VDM");
+ }
+
+ public VDMParser(TalkerId tid) {
+ // alternative begin char is set here for empty sentences
+ super('!', tid, "VDM", 3);
+ }
+
+ public String getValueA() {
+ return getStringValue(0);
+ }
+
+ public String getValueB() {
+ return getStringValue(1);
+ }
+
+ public String getValueC() {
+ return getStringValue(2);
+ }
+}
diff --git a/java/net.sf.marineapi/.classpath b/java/net.sf.marineapi/.classpath
new file mode 100644
index 00000000000..eca7bdba8f0
--- /dev/null
+++ b/java/net.sf.marineapi/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/java/net.sf.marineapi/.gitignore b/java/net.sf.marineapi/.gitignore
new file mode 100644
index 00000000000..092357e47d3
--- /dev/null
+++ b/java/net.sf.marineapi/.gitignore
@@ -0,0 +1 @@
+bin
diff --git a/java/net.sf.marineapi/.project b/java/net.sf.marineapi/.project
new file mode 100755
index 00000000000..4dec2646755
--- /dev/null
+++ b/java/net.sf.marineapi/.project
@@ -0,0 +1,28 @@
+
+
+ net.sf.marineapi
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/java/net.sf.marineapi/.settings/org.eclipse.jdt.core.prefs b/java/net.sf.marineapi/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..a698e59674f
--- /dev/null
+++ b/java/net.sf.marineapi/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/java/net.sf.marineapi/.settings/org.eclipse.pde.core.prefs b/java/net.sf.marineapi/.settings/org.eclipse.pde.core.prefs
new file mode 100755
index 00000000000..f29e940a005
--- /dev/null
+++ b/java/net.sf.marineapi/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/java/net.sf.marineapi/META-INF/MANIFEST.MF b/java/net.sf.marineapi/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..6266f03ca47
--- /dev/null
+++ b/java/net.sf.marineapi/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Marineapi
+Bundle-SymbolicName: net.sf.marineapi
+Bundle-Version: 0.5.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: net.sf.marineapi.nmea.event,
+ net.sf.marineapi.nmea.io,
+ net.sf.marineapi.nmea.parser,
+ net.sf.marineapi.nmea.sentence,
+ net.sf.marineapi.nmea.util,
+ net.sf.marineapi.provider,
+ net.sf.marineapi.provider.event
+Bundle-ActivationPolicy: lazy
diff --git a/java/net.sf.marineapi/build.gradle b/java/net.sf.marineapi/build.gradle
new file mode 100644
index 00000000000..f0a8d88d703
--- /dev/null
+++ b/java/net.sf.marineapi/build.gradle
@@ -0,0 +1,7 @@
+apply plugin: "java"
+
+sourceSets {
+ main {
+ java.srcDirs = ["src"]
+ }
+}
diff --git a/java/net.sf.marineapi/build.properties b/java/net.sf.marineapi/build.properties
new file mode 100644
index 00000000000..34d2e4d2dad
--- /dev/null
+++ b/java/net.sf.marineapi/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/java/net.sf.marineapi/build.xml b/java/net.sf.marineapi/build.xml
new file mode 100644
index 00000000000..67238d88033
--- /dev/null
+++ b/java/net.sf.marineapi/build.xml
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/net.sf.marineapi/doc/gpl.txt b/java/net.sf.marineapi/doc/gpl.txt
new file mode 100644
index 00000000000..94a9ed024d3
--- /dev/null
+++ b/java/net.sf.marineapi/doc/gpl.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+ .
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/java/net.sf.marineapi/doc/html/index.html b/java/net.sf.marineapi/doc/html/index.html
new file mode 100644
index 00000000000..8fa26cbf9d4
--- /dev/null
+++ b/java/net.sf.marineapi/doc/html/index.html
@@ -0,0 +1,195 @@
+
+
+ Java Marine API - NMEA 0183 library for Java
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Java Marine API
+
+
About
+
+Java Marine API is an
+NMEA
+0183 parser library for Java
+1.5 and newer. The goal of the project is to enable easy access to data
+provided by various marine instruments, such as GPS, sonar or autopilot. The
+library reads NMEA sentences from any source that can be accessed through input
+stream, e.g. serial port, file, TCP/IP socket etc. The plain ASCII data is
+converted to events that can be listened in your application. Library provides
+interfaces and parser implementations for selected sentences and you can also
+implement and integrate your own parsers by extending the provided base parser.
+
+
+Currently the following sentences are supported:
+
+ BOD - Bearing from origin to destination
+ DBT - Water depth below transducer in meters, feet and fathoms.
+ DPT - Water depth in meters with offset to transducer.
+ GGA - GPS fix data
+ GLL - Current geographic position and time
+ GSA - Precision of GPS fix
+ GSV - Detailed GPS satellite data
+ HDG - Heading with magnetic deviation and variation
+ HDM - Magnetic heading in degrees
+ HDT - True heading in degrees
+ MTA - Air temperature in degrees Celcius
+ MTW - Water temperature in degrees Celcius
+ MWV - Wind speed and angle
+ RMB - Recommended minimum navigation information "type B"
+ RMC - Recommended minimum navigation information "type C"
+ RTE - GPS route data with list of waypoints
+ VHW - Water speed and heading
+ VTG - Course and speed over ground
+ WPL - Destination waypoint location and ID
+ ZDA - UTC time and date with local time offset
+
+
+
+In addition to data reading, the library also supports modifying the sentence
+contents and provides data field formatting and validation.
+
+
+
Licensing
+
+Java Marine API is open source software and licensed under the
+GNU Lesser
+General Public License . The source code is freely available in the project's
+SVN
+repository . See latest distribution package and readme.txt within it for
+more information.
+
+
+
Releases
+
+
Latest
+
v0.5 pre-alpha, released on 2012-04-19:
+
+
+
+Show
+Hide
+older versions.
+
+
+
+
+
v0.4 pre-alpha, released on 2011-07-12:
+
+
+
v0.3 pre-alpha, released on 2011-05-08:
+
+
+
v0.2 pre-alpha, released on 2010-12-08:
+
+
+
v0.1 pre-alpha, released on 2010-08-21:
+
+
+
+
+
Examples and sample data
+
+Check out the files section at Sourceforge. Also included in the distribution
+package since v0.4.
+
+
+
Contact
+
+Please visit the project
+page at SourceForge.net for contact and support. Any kind of feedback or
+contribution is welcome.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/java/net.sf.marineapi/doc/html/jquery-1.4.4.min.js b/java/net.sf.marineapi/doc/html/jquery-1.4.4.min.js
new file mode 100644
index 00000000000..c2dcfe7bfa5
--- /dev/null
+++ b/java/net.sf.marineapi/doc/html/jquery-1.4.4.min.js
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;kd)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;Ha ";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML=" ";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="
";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n
";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML=" ";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="
";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1,
+""," "],legend:[1,""," "],thead:[1,""],tr:[2,""],td:[3,""],col:[2,""],area:[1,""," "],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>$2>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===""&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/