v1.9.0. Added more message types and tests.

This commit is contained in:
dotMorten 2017-12-21 11:03:40 -08:00
parent 7926e0c8e0
commit b9d94a2f8c
25 changed files with 1846 additions and 483 deletions

View file

@ -7,12 +7,15 @@ It makes it easy to connect and listen for NMEA messages coming from various dev
The following inputs are supported:
- System.IO.Stream (all platforms)
- Emulation from NMEA log file (all platforms)
- Bluetooth: Windows Store, Windows Phone, Windows Universal. Desktop is supported using the bluetooth device via the SerialPortDevice.
- Bluetooth: Windows Universal. Desktop is supported using the bluetooth device via the SerialPortDevice.
- Serial Device: Windows Desktop and Windows Universal.
Currently supported NMEA messages:
- Generic GPS NMEA (GPRMC, GPGGA, GPGLL, GPGSA, GPGSCV, GPRMB, GPRMC, GPBOD, GPRTE, GPGST)
- GPS: GPBOD, GPGGA, GPGLL, GPGNS, GPGSA, GPGST, GPGSV, GPRMB, GPRMC, GPRTE
- GLONASS: GLGNS, GLGSV
- GALILEO: GAGSV
- Generic GNSS: GNGGA, GNGLL, GNGNS, GNGSA, GNGST, GNRMC
- Garmin GPS NMEA (PGRME, PGRMZ)
- Trimble Laser Range Finder (PTNLA, PTNLB)
- TruePulse Laser Range Finder (PLTIT)

View file

@ -1,13 +1,16 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2010
VisualStudioVersion = 15.0.27130.2003
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NmeaParser", "NmeaParser", "{1701F3BA-A09C-4706-A612-24FD9340FC18}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{CF767486-305D-40EE-8845-58EF76C16D85}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleApp.WinDesktop", "SampleApp.WinDesktop\SampleApp.WinDesktop.csproj", "{5DB6C7C7-A19C-4BE3-AFE6-26E3061DA01F}"
ProjectSection(ProjectDependencies) = postProject
{1ADC3666-1DDB-48C4-9811-1E58B6D09A7C} = {1ADC3666-1DDB-48C4-9811-1E58B6D09A7C}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Desktop", "Desktop", "{7ABA337E-6748-484E-A0F4-E1715E1C95F1}"
EndProject
@ -31,8 +34,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NmeaParser.Tests.UWP", "Uni
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "NmeaParser.Tests", "UnitTests\NmeaParser.Tests\NmeaParser.Tests.shproj", "{979AE182-EB59-4181-9D45-3FD6E4817F11}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NmeaParser.Tests.NET45", "UnitTests\NmeaParser.Tests.NET45\NmeaParser.Tests.NET45.csproj", "{170EE734-37F0-425F-822B-B865348ECEC6}"
ProjectSection(ProjectDependencies) = postProject
{1ADC3666-1DDB-48C4-9811-1E58B6D09A7C} = {1ADC3666-1DDB-48C4-9811-1E58B6D09A7C}
EndProjectSection
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
UnitTests\NmeaParser.Tests\NmeaParser.Tests.projitems*{170ee734-37f0-425f-822b-b865348ecec6}*SharedItemsImports = 4
UnitTests\NmeaParser.Tests\NmeaParser.Tests.projitems*{92cad93b-6c3b-45a0-a723-be046de50fec}*SharedItemsImports = 4
UnitTests\NmeaParser.Tests\NmeaParser.Tests.projitems*{979ae182-eb59-4181-9d45-3fd6e4817f11}*SharedItemsImports = 13
EndGlobalSection
@ -125,6 +134,22 @@ Global
{92CAD93B-6C3B-45A0-A723-BE046DE50FEC}.Release|x86.ActiveCfg = Release|x86
{92CAD93B-6C3B-45A0-A723-BE046DE50FEC}.Release|x86.Build.0 = Release|x86
{92CAD93B-6C3B-45A0-A723-BE046DE50FEC}.Release|x86.Deploy.0 = Release|x86
{170EE734-37F0-425F-822B-B865348ECEC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Debug|ARM.ActiveCfg = Debug|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Debug|ARM.Build.0 = Debug|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Debug|x64.ActiveCfg = Debug|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Debug|x64.Build.0 = Debug|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Debug|x86.ActiveCfg = Debug|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Debug|x86.Build.0 = Debug|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Release|Any CPU.Build.0 = Release|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Release|ARM.ActiveCfg = Release|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Release|ARM.Build.0 = Release|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Release|x64.ActiveCfg = Release|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Release|x64.Build.0 = Release|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Release|x86.ActiveCfg = Release|Any CPU
{170EE734-37F0-425F-822B-B865348ECEC6}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -138,6 +163,7 @@ Global
{1ADC3666-1DDB-48C4-9811-1E58B6D09A7C} = {1701F3BA-A09C-4706-A612-24FD9340FC18}
{92CAD93B-6C3B-45A0-A723-BE046DE50FEC} = {28B8E327-C504-4E08-B2CE-09D1CBB8B904}
{979AE182-EB59-4181-9D45-3FD6E4817F11} = {28B8E327-C504-4E08-B2CE-09D1CBB8B904}
{170EE734-37F0-425F-822B-B865348ECEC6} = {28B8E327-C504-4E08-B2CE-09D1CBB8B904}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {03788B53-C0BF-485B-AA19-A9EAB0E9AF7B}

View file

@ -0,0 +1,35 @@
//
// Copyright (c) 2014 Morten Nielsen
//
// Licensed under the Microsoft Public License (Ms-PL) (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://opensource.org/licenses/Ms-PL.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NmeaParser.Nmea.Galileo
{
/// <summary>
/// GALILEO Satellites in view
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gagsv")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
[NmeaMessageType("GAGSV")]
public sealed class Gagsv : Gsv
{
}
}

View file

@ -0,0 +1,73 @@
//
// Copyright (c) 2014 Morten Nielsen
//
// Licensed under the Microsoft Public License (Ms-PL) (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://opensource.org/licenses/Ms-PL.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NmeaParser.Nmea
{
/// <summary>
/// Geographic position, latitude / longitude
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gll")]
public abstract class Gll : NmeaMessage
{
/// <summary>
/// Called when the message is being loaded.
/// </summary>
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 4)
throw new ArgumentException("Invalid GPGLL", "message");
Latitude = NmeaMessage.StringToLatitude(message[0], message[1]);
Longitude = NmeaMessage.StringToLongitude(message[2], message[3]);
if (message.Length >= 5) //Some older GPS doesn't broadcast fix time
{
FixTime = StringToTimeSpan(message[4]);
}
DataActive = (message.Length < 6 || message[5] == "A");
}
/// <summary>
/// Latitude
/// </summary>
public double Latitude { get; private set; }
/// <summary>
/// Longitude
/// </summary>
public double Longitude { get; private set; }
/// <summary>
/// Time since last DGPS update
/// </summary>
public TimeSpan FixTime { get; private set; }
/// <summary>
/// Gets a value indicating whether data is active.
/// </summary>
/// <value>
/// <c>true</c> if data is active; otherwise, <c>false</c>.
/// </value>
public bool DataActive { get; private set; }
}
}

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NmeaParser.Nmea.Glonass
{
/// <summary>
/// Fix data for GLONASS satellite navigation systems
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Glgns")]
[NmeaMessageType("GLGNS")]
public class Glgns : Gns
{
}
}

View file

@ -0,0 +1,35 @@
//
// Copyright (c) 2014 Morten Nielsen
//
// Licensed under the Microsoft Public License (Ms-PL) (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://opensource.org/licenses/Ms-PL.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NmeaParser.Nmea.Glonass
{
/// <summary>
/// GLONASS Satellites in view
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Glgsv")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
[NmeaMessageType("GLGSV")]
public sealed class Glgsv : Gsv
{
}
}

241
src/NmeaParser/Nmea/Gns.cs Normal file
View file

@ -0,0 +1,241 @@
//
// Copyright (c) 2014 Morten Nielsen
//
// Licensed under the Microsoft Public License (Ms-PL) (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://opensource.org/licenses/Ms-PL.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NmeaParser.Nmea
{
/// <summary>
/// Fixes data for single or combined (GPS, GLONASS, possible future satellite systems, and systems combining these) satellite navigation systems
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gns")]
public abstract class Gns : NmeaMessage
{
/*
* Example of GNS messages:
* $GNGNS,014035.00,4332.69262,S,17235.48549,E,RR,13,0.9,25.63,11.24,,*70 //GLONASS
* $GPGNS,014035.00,,,,,,8,,,,1.0,23*76 //GPS
* $GLGNS,014035.00,,,,,,5,,,,1.0,23*67 //GALILEO
*/
/// <summary>
/// GNS Mode Indicator
/// </summary>
public enum Mode
{
/// <summary>
/// No fix. Satellite system not used in position fix, or fix not valid
/// </summary>
NoFix,
/// <summary>
/// Autonomous. Satellite system used in non-differential mode in position fix
/// </summary>
Autonomous,
/// <summary>
/// Differential (including all OmniSTAR services). Satellite system used in differential mode in position fix
/// </summary>
Differential,
/// <summary>
/// Precise. Satellite system used in precision mode. Precision mode is defined as no deliberate degradation (such as Selective Availability) and higher resolution code (P-code) is used to compute position fix.
/// </summary>
Precise,
/// <summary>
/// Real Time Kinematic. Satellite system used in RTK mode with fixed integers
/// </summary>
RealTimeKinematic,
/// <summary>
/// Float RTK. Satellite system used in real time kinematic mode with floating integers
/// </summary>
FloatRtk,
/// <summary>
/// Estimated (dead reckoning) mode
/// </summary>
Estimated,
/// <summary>
/// Manual input mode
/// </summary>
Manual,
/// <summary>
/// Simulator mode
/// </summary>
Simulator
}
/// <summary>
/// Navigational status
/// </summary>
public enum NavigationalStatus
{
/// <summary>
/// Not valid for navigation
/// </summary>
NotValid,
/// <summary>
/// Safe
/// </summary>
Safe,
/// <summary>
/// Caution
/// </summary>
Caution,
/// <summary>
/// Unsafe
/// </summary>
Unsafe
}
private static Mode ParseModeIndicator(char c)
{
switch (c)
{
case 'A': return Mode.Autonomous;
case 'D': return Mode.Differential;
case 'P': return Mode.Precise;
case 'R': return Mode.RealTimeKinematic;
case 'F': return Mode.FloatRtk;
case 'E': return Mode.Estimated;
case 'M': return Mode.Manual;
case 'S': return Mode.Simulator;
case 'N':
default: return Mode.NoFix;
}
}
/// <summary>
/// Called when the message is being loaded.
/// </summary>
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 12)
throw new ArgumentException("Invalid GNS", "message");
FixTime = StringToTimeSpan(message[0]);
Latitude = NmeaMessage.StringToLatitude(message[1], message[2]);
Longitude = NmeaMessage.StringToLongitude(message[3], message[4]);
if (message[5].Length > 0)
GpsModeIndicator = ParseModeIndicator(message[5][0]);
if (message[5].Length > 1)
GlonassModeIndicator = ParseModeIndicator(message[5][1]);
if (message[5].Length > 2)
{
FutureModeIndicator = message[5].Skip(2).Select(t => ParseModeIndicator(t)).ToArray();
}
else
FutureModeIndicator = new Mode[] { };
NumberOfSatellites = int.Parse(message[6], CultureInfo.InvariantCulture);
Hdop = NmeaMessage.StringToDouble(message[7]);
OrhometricHeight = NmeaMessage.StringToDouble(message[8]);
GeoidalSeparation = NmeaMessage.StringToDouble(message[9]);
var timeInSeconds = StringToDouble(message[10]);
if (!double.IsNaN(timeInSeconds))
TimeSinceLastDgpsUpdate = TimeSpan.FromSeconds(timeInSeconds);
else
TimeSinceLastDgpsUpdate = TimeSpan.MaxValue;
if (message[11].Length > 0)
DgpsStationId = message[11];
if (message.Length > 12)
{
switch (message[12])
{
case "S": Status = NavigationalStatus.Safe; break;
case "C": Status = NavigationalStatus.Caution; break;
case "U": Status = NavigationalStatus.Unsafe; break;
case "V":
default: Status = NavigationalStatus.NotValid; break;
}
}
}
/// <summary>
/// Time of day fix was taken
/// </summary>
public TimeSpan FixTime { get; private set; }
/// <summary>
/// Latitude
/// </summary>
public double Latitude { get; private set; }
/// <summary>
/// Longitude
/// </summary>
public double Longitude { get; private set; }
/// <summary>
/// Mode indicator for GPS
/// </summary>
/// <seealso cref="GlonassModeIndicator"/>
/// <see cref="FutureModeIndicator"/>
public Mode GpsModeIndicator { get; private set; }
/// <summary>
/// Mode indicator for GLONASS
/// </summary>
/// <seealso cref="GpsModeIndicator"/>
/// <see cref="FutureModeIndicator"/>
public Mode GlonassModeIndicator { get; private set; }
/// <summary>
/// Mode indicator for future constallations
/// </summary>
/// <seealso cref="GlonassModeIndicator"/>
/// <seealso cref="GpsModeIndicator"/>
public Mode[] FutureModeIndicator { get; private set; }
/// <summary>
/// Number of satellites (SVs) in use
/// </summary>
public int NumberOfSatellites { get; private set; }
/// <summary>
/// Horizontal Dilution of Precision (HDOP), calculated using all the satellites (GPS, GLONASS, and any future satellites) used in computing the solution reported in each GNS sentence.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Hdop")]
public double Hdop { get; private set; }
/// <summary>
/// Orthometric height in meters (MSL reference)
/// </summary>
public double OrhometricHeight { get; private set; }
/// <summary>
/// Geoidal separation in meters - the difference between the earth ellipsoid surface and mean-sea-level (geoid) surface defined by the reference datum used in the position solution<br/>
/// '-' = mean-sea-level surface below ellipsoid.
/// </summary>
public double GeoidalSeparation { get; private set; }
/// <summary>
/// Age of differential data - <see cref="TimeSpan.MaxValue"/> if talker ID is GN, additional GNS messages follow with GP and/or GL Age of differential data
/// </summary>
public TimeSpan TimeSinceLastDgpsUpdate { get; private set; }
/// <summary>
/// eference station ID1, range 0000-4095 - Null if talker ID is GN, additional GNS messages follow with GP and/or GL Reference station ID
/// </summary>
public string DgpsStationId { get; private set; }
/// <summary>
/// Navigational status
/// </summary>
public NavigationalStatus Status { get; private set; }
}
}

View file

@ -26,7 +26,7 @@ namespace NmeaParser.Nmea.Gnss
/// <summary>
/// Global Positioning System Fix Data
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgga")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gngga")]
[NmeaMessageType("GNGGA")]
public class Gngga : Gga
{

View file

@ -0,0 +1,34 @@
//
// Copyright (c) 2014 Morten Nielsen
//
// Licensed under the Microsoft Public License (Ms-PL) (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://opensource.org/licenses/Ms-PL.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NmeaParser.Nmea.Gnss
{
/// <summary>
/// Geographic position, latitude / longitude
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gngll")]
[NmeaMessageType("GNGLL")]
public class Gngll : Gll
{
}
}

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NmeaParser.Nmea.Gps
{
/// <summary>
/// Fixes data for single or combined (GPS, GLONASS, possible future satellite systems, and systems combining these) satellite navigation systems
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gngns")]
[NmeaMessageType("GNGNS")]
public class Gngns : Gns
{
}
}

View file

@ -0,0 +1,34 @@
//
// Copyright (c) 2014 Morten Nielsen
//
// Licensed under the Microsoft Public License (Ms-PL) (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://opensource.org/licenses/Ms-PL.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NmeaParser.Nmea.Gnss
{
/// <summary>
/// Global Positioning System Fix Data
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gngsa")]
[NmeaMessageType("GNGSA")]
public class Gngsa : Gsa
{
}
}

View file

@ -26,7 +26,7 @@ namespace NmeaParser.Nmea.Gnss
/// <summary>
/// Recommended Minimum
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gprmc")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gnrmc")]
[NmeaMessageType("GNRMC")]
public class Gnrmc : Rmc
{

View file

@ -28,47 +28,7 @@ namespace NmeaParser.Nmea.Gps
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgll")]
[NmeaMessageType("GPGLL")]
public class Gpgll : NmeaMessage
public class Gpgll : Gll
{
/// <summary>
/// Called when the message is being loaded.
/// </summary>
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 4)
throw new ArgumentException("Invalid GPGLL", "message");
Latitude = NmeaMessage.StringToLatitude(message[0], message[1]);
Longitude = NmeaMessage.StringToLongitude(message[2], message[3]);
if (message.Length >= 5) //Some older GPS doesn't broadcast fix time
{
FixTime = StringToTimeSpan(message[4]);
}
DataActive = (message.Length < 6 || message[5] == "A");
}
/// <summary>
/// Latitude
/// </summary>
public double Latitude { get; private set; }
/// <summary>
/// Longitude
/// </summary>
public double Longitude { get; private set; }
/// <summary>
/// Time since last DGPS update
/// </summary>
public TimeSpan FixTime { get; private set; }
/// <summary>
/// Gets a value indicating whether data is active.
/// </summary>
/// <value>
/// <c>true</c> if data is active; otherwise, <c>false</c>.
/// </value>
public bool DataActive { get; private set; }
}
}

View file

@ -28,7 +28,7 @@ namespace NmeaParser.Nmea.Gps
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgsa")]
[NmeaMessageType("GPGSA")]
public class Gpgsa : NmeaMessage
public class Gpgsa : Gsa
{
/// <summary>
/// Mode selection
@ -63,76 +63,5 @@ namespace NmeaParser.Nmea.Gps
/// </summary>
Fix3D = 3
}
/// <summary>
/// Called when the message is being loaded.
/// </summary>
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 17)
throw new ArgumentException("Invalid GPGSA", "message");
GpsMode = message[0] == "A" ? ModeSelection.Auto : ModeSelection.Manual;
FixMode = (Mode)int.Parse(message[1], CultureInfo.InvariantCulture);
List<int> svs = new List<int>();
for (int i = 2; i < 14; i++)
{
int id = -1;
if (message[i].Length > 0 && int.TryParse(message[i], out id))
svs.Add(id);
}
SVs = svs.ToArray();
double tmp;
if (double.TryParse(message[14], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
Pdop = tmp;
else
Pdop = double.NaN;
if (double.TryParse(message[15], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
Hdop = tmp;
else
Hdop = double.NaN;
if (double.TryParse(message[16], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
Vdop = tmp;
else
Vdop = double.NaN;
}
/// <summary>
/// Mode
/// </summary>
public ModeSelection GpsMode { get; private set; }
/// <summary>
/// Mode
/// </summary>
public Mode FixMode { get; private set; }
/// <summary>
/// IDs of SVs used in position fix
/// </summary>
public IReadOnlyList<int> SVs { get; private set; }
/// <summary>
/// Dilution of precision
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Pdop")]
public double Pdop { get; private set; }
/// <summary>
/// Horizontal dilution of precision
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Hdop")]
public double Hdop { get; private set; }
/// <summary>
/// Vertical dilution of precision
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Vdop")]
public double Vdop { get; private set; }
}
}

View file

@ -23,149 +23,92 @@ using System.Threading.Tasks;
namespace NmeaParser.Nmea.Gps
{
/// <summary>
/// GPS Satellites in view
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgsv")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
[NmeaMessageType("GPGSV")]
public sealed class Gpgsv : NmeaMessage, IMultiPartMessage<SatelliteVehicle>
{
/// <summary>
/// Called when the message is being loaded.
/// </summary>
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 3)
throw new ArgumentException("Invalid GPGSV", "message");
TotalMessages = int.Parse(message[0], CultureInfo.InvariantCulture);
MessageNumber = int.Parse(message[1], CultureInfo.InvariantCulture);
SVsInView = int.Parse(message[2], CultureInfo.InvariantCulture);
/// <summary>
/// GLONASS Satellites in view
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgsv")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
[NmeaMessageType("GPGSV")]
public sealed class Gpgsv : Gsv
{
}
List<SatelliteVehicle> svs = new List<SatelliteVehicle>();
for (int i = 3; i < message.Length - 3; i += 4)
{
if (message[i].Length == 0)
continue;
else
svs.Add(new SatelliteVehicle(message, i));
}
this.SVs = svs.ToArray();
}
/// <summary>
/// Satellite vehicle
/// </summary>
public sealed class SatelliteVehicle
{
internal SatelliteVehicle(string[] message, int startIndex)
{
PrnNumber = int.Parse(message[startIndex], CultureInfo.InvariantCulture);
Elevation = double.Parse(message[startIndex + 1], CultureInfo.InvariantCulture);
Azimuth = double.Parse(message[startIndex + 2], CultureInfo.InvariantCulture);
int snr = -1;
if (int.TryParse(message[startIndex + 3], out snr))
SignalToNoiseRatio = snr;
}
/// <summary>
/// SV PRN number
/// </summary>
public int PrnNumber { get; set; }
/// <summary>
/// Elevation in degrees, 90 maximum
/// </summary>
public double Elevation { get; private set; }
/// <summary>
/// Azimuth, degrees from true north, 000 to 359
/// </summary>
public double Azimuth { get; private set; }
/// <summary>
/// Signal-to-Noise ratio, 0-99 dB (-1 when not tracking)
/// </summary>
public int SignalToNoiseRatio { get; private set; }
/// <summary>
/// Total number of messages of this type in this cycle
/// </summary>
public int TotalMessages { get; private set; }
/// <summary>
/// Satellite system
/// </summary>
public SatelliteSystem System
{
get
{
if (PrnNumber >= 1 && PrnNumber <= 32)
return SatelliteSystem.Gps;
if (PrnNumber >= 33 && PrnNumber <= 64)
return SatelliteSystem.Waas;
if (PrnNumber >= 65 && PrnNumber <= 96)
return SatelliteSystem.Glonass;
return SatelliteSystem.Unknown;
}
}
}
/// <summary>
/// Message number
/// </summary>
public int MessageNumber { get; private set; }
/// <summary>
/// Total number of SVs in view
/// </summary>
public int SVsInView { get; private set; }
/// <summary>
/// Dilution of precision
/// </summary>
public IReadOnlyList<SatelliteVehicle> SVs { get; private set; }
/// <summary>
/// Returns an enumerator that iterates through the collection.
/// </summary>
/// <returns> A System.Collections.Generic.IEnumerator{SatelliteVehicle} that can be used to iterate through the collection.</returns>
public IEnumerator<SatelliteVehicle> GetEnumerator()
{
foreach(var sv in SVs)
yield return sv;
}
/// <summary>
/// Returns an enumerator that iterates through a collection.
/// </summary>
/// <returns> An System.Collections.IEnumerator object that can be used to iterate through the collection.</returns>
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
/// <summary>
/// Satellite vehicle
/// </summary>
public sealed class SatelliteVehicle
{
internal SatelliteVehicle(string[] message, int startIndex)
{
PrnNumber = int.Parse(message[startIndex], CultureInfo.InvariantCulture);
Elevation = double.Parse(message[startIndex+1], CultureInfo.InvariantCulture);
Azimuth = double.Parse(message[startIndex + 2], CultureInfo.InvariantCulture);
int snr = -1;
if (int.TryParse(message[startIndex + 3], out snr))
SignalToNoiseRatio = snr;
}
/// <summary>
/// SV PRN number
/// </summary>
public int PrnNumber { get; set; }
/// <summary>
/// Elevation in degrees, 90 maximum
/// </summary>
public double Elevation { get; private set; }
/// <summary>
/// Azimuth, degrees from true north, 000 to 359
/// </summary>
public double Azimuth { get; private set; }
/// <summary>
/// Signal-to-Noise ratio, 0-99 dB (-1 when not tracking)
/// </summary>
public int SignalToNoiseRatio { get; private set; }
/// <summary>
/// Satellite system
/// </summary>
public SatelliteSystem System
{
get
{
if (PrnNumber >= 1 && PrnNumber <= 32)
return SatelliteSystem.Gps;
if (PrnNumber >= 33 && PrnNumber <= 64)
return SatelliteSystem.Waas;
if (PrnNumber >= 65 && PrnNumber <= 96)
return SatelliteSystem.Glonass;
return SatelliteSystem.Unknown;
}
}
}
/// <summary>
/// Satellite system
/// </summary>
public enum SatelliteSystem
{
/// <summary>
/// Unknown
/// </summary>
Unknown,
/// <summary>
/// GPS - Global Positioning System (NAVSTAR)
/// </summary>
Gps,
/// <summary>
/// WAAS - Wide Area Augmentation System
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Waas")]
Waas,
/// <summary>
/// GLONASS - Globalnaya navigatsionnaya sputnikovaya sistema
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Glonass")]
Glonass
}
}
/// <summary>
/// Satellite system
/// </summary>
public enum SatelliteSystem
{
/// <summary>
/// Unknown
/// </summary>
Unknown,
/// <summary>
/// GPS - Global Positioning System (NAVSTAR)
/// </summary>
Gps,
/// <summary>
/// WAAS - Wide Area Augmentation System
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Waas")]
Waas,
/// <summary>
/// GLONASS - Globalnaya navigatsionnaya sputnikovaya sistema
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Glonass")]
Glonass,
/// <summary>
/// Galileo
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Galileo")]
Galileo
}
}

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NmeaParser.Nmea.Gps
{
/// <summary>
/// Fixes data for GPS satellite navigation systems
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpgns")]
[NmeaMessageType("GPGNS")]
public class Gpgns : Gns
{
}
}

103
src/NmeaParser/Nmea/Gsa.cs Normal file
View file

@ -0,0 +1,103 @@
//
// Copyright (c) 2014 Morten Nielsen
//
// Licensed under the Microsoft Public License (Ms-PL) (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://opensource.org/licenses/Ms-PL.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NmeaParser.Nmea
{
/// <summary>
/// Global Positioning System Fix Data
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gsa")]
public abstract class Gsa : NmeaMessage
{
/// <summary>
/// Called when the message is being loaded.
/// </summary>
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 17)
throw new ArgumentException("Invalid GPGSA", "message");
GpsMode = message[0] == "A" ? Gps.Gpgsa.ModeSelection.Auto : Gps.Gpgsa.ModeSelection.Manual;
FixMode = (Gps.Gpgsa.Mode)int.Parse(message[1], CultureInfo.InvariantCulture);
List<int> svs = new List<int>();
for (int i = 2; i < 14; i++)
{
int id = -1;
if (message[i].Length > 0 && int.TryParse(message[i], out id))
svs.Add(id);
}
SVs = svs.ToArray();
double tmp;
if (double.TryParse(message[14], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
Pdop = tmp;
else
Pdop = double.NaN;
if (double.TryParse(message[15], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
Hdop = tmp;
else
Hdop = double.NaN;
if (double.TryParse(message[16], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
Vdop = tmp;
else
Vdop = double.NaN;
}
/// <summary>
/// Mode
/// </summary>
public Gps.Gpgsa.ModeSelection GpsMode { get; private set; }
/// <summary>
/// Mode
/// </summary>
public Gps.Gpgsa.Mode FixMode { get; private set; }
/// <summary>
/// IDs of SVs used in position fix
/// </summary>
public IReadOnlyList<int> SVs { get; private set; }
/// <summary>
/// Dilution of precision
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Pdop")]
public double Pdop { get; private set; }
/// <summary>
/// Horizontal dilution of precision
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Hdop")]
public double Hdop { get; private set; }
/// <summary>
/// Vertical dilution of precision
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Vdop")]
public double Vdop { get; private set; }
}
}

View file

@ -0,0 +1,97 @@
//
// Copyright (c) 2014 Morten Nielsen
//
// Licensed under the Microsoft Public License (Ms-PL) (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://opensource.org/licenses/Ms-PL.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
using NmeaParser.Nmea.Gps;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NmeaParser.Nmea
{
/// <summary>
/// GPS Satellites in view
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gsv")]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
public abstract class Gsv : NmeaMessage, IMultiPartMessage<SatelliteVehicle>
{
/// <summary>
/// Called when the message is being loaded.
/// </summary>
/// <param name="message">The NMEA message values.</param>
protected override void OnLoadMessage(string[] message)
{
if (message == null || message.Length < 3)
throw new ArgumentException("Invalid GSV", "message");
TotalMessages = int.Parse(message[0], CultureInfo.InvariantCulture);
MessageNumber = int.Parse(message[1], CultureInfo.InvariantCulture);
SVsInView = int.Parse(message[2], CultureInfo.InvariantCulture);
List<SatelliteVehicle> svs = new List<SatelliteVehicle>();
for (int i = 3; i < message.Length - 3; i += 4)
{
if (message[i].Length == 0)
continue;
else
svs.Add(new SatelliteVehicle(message, i));
}
this.SVs = svs.ToArray();
}
/// <summary>
/// Total number of messages of this type in this cycle
/// </summary>
public int TotalMessages { get; private set; }
/// <summary>
/// Message number
/// </summary>
public int MessageNumber { get; private set; }
/// <summary>
/// Total number of SVs in view
/// </summary>
public int SVsInView { get; private set; }
/// <summary>
/// Dilution of precision
/// </summary>
public IReadOnlyList<SatelliteVehicle> SVs { get; private set; }
/// <summary>
/// Returns an enumerator that iterates through the collection.
/// </summary>
/// <returns> A System.Collections.Generic.IEnumerator{SatelliteVehicle} that can be used to iterate through the collection.</returns>
public IEnumerator<SatelliteVehicle> GetEnumerator()
{
foreach(var sv in SVs)
yield return sv;
}
/// <summary>
/// Returns an enumerator that iterates through a collection.
/// </summary>
/// <returns> An System.Collections.IEnumerator object that can be used to iterate through the collection.</returns>
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}

View file

@ -9,16 +9,19 @@
<Authors>Morten Nielsen</Authors>
<Company>Morten Nielsen</Company>
<Description>An NMEA stream parser for serial port, bluetooth and file-based nmea simulation.</Description>
<PackageTags>nmea winrt wpf win8 win8.1 wp8.1 uwp xamarin gps serialport bluetooth</PackageTags>
<PackageTags>nmea winrt wpf uwp xamarin gps serialport bluetooth</PackageTags>
<PackageId>SharpGIS.NmeaParser</PackageId>
<Version>1.8.0</Version>
<Version>1.9.0</Version>
<PackageLicenseUrl>http://opensource.org/licenses/ms-pl.html</PackageLicenseUrl>
<PackageProjectUrl>https://github.com/dotMorten/NmeaParser</PackageProjectUrl>
<RepositoryUrl>https://github.com/dotMorten/NmeaParser</RepositoryUrl>
<NeutralLanguage>en-US</NeutralLanguage>
<Copyright>Copyright © Morten Nielsen 2015-2017</Copyright>
<OutDir>$(MSBuildThisFileDirectory)..\Bin\$(Configuration)</OutDir>
<PackageOutputPath>$(OutDir)</PackageOutputPath>
<OutputPath>$(MSBuildThisFileDirectory)..\Bin\$(Configuration)</OutputPath>
<PackageOutputPath>$(OutDir)</PackageOutputPath>
<AssemblyVersion>1.9.0.0</AssemblyVersion>
<FileVersion>1.9.0.0</FileVersion>
<PackageReleaseNotes>Added new GLONASS and GALILEO. Moved more GPS message to abstract base classes for better handling of multiple satelitte constellations.</PackageReleaseNotes>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard1.4'">
@ -50,8 +53,8 @@
<ItemGroup Condition="'$(TargetFramework)' == 'uap10.0'">
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform" Version="5.1.0" />
<PackageReference Include="System.Numerics.Vectors" Version="4.1.0" />
<EmbeddedResource Include="**\*.rd.xml" />
<PackageReference Include="System.Numerics.Vectors" Version="4.1.0" />
<EmbeddedResource Include="**\*.rd.xml" />
</ItemGroup>
<ItemGroup>

View file

@ -38,10 +38,6 @@
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<ItemGroup>
<Reference Include="NmeaParser">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\NmeaParser\bin\$(Configuration)\net451\NmeaParser.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
@ -171,6 +167,12 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NmeaParser\NmeaParser.csproj">
<Project>{1adc3666-1ddb-48c4-9811-1e58b6d09a7c}</Project>
<Name>NmeaParser</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

544
src/TrimbleR2SampleData.txt Normal file
View file

@ -0,0 +1,544 @@
$GNGGA,235647.00,3403.47162394,N,11711.80927093,W,5,10,1.2,403.600,M,-32.133,M,1.0,0000*61
$PTNL,GGK,235647.00,122017,3403.47162394,N,11711.80927093,W,12,10,2.9,EHT371.467,M*54
$GNGLL,3403.47162394,N,11711.80927093,W,235647.00,A,D*64
$GNGNS,235647.00,3403.47162394,N,11711.80927093,W,FFNNN,10,1.2,403.600,-32.133,,*2E
$GPGNS,235647.00,,,,,,6,,,,1.0,0*4B
$GLGNS,235647.00,,,,,,4,,,,1.0,0*55
$GNGSA,A,3,26,9,3,16,7,23,,,,,,,2.9,1.2,2.6*1F
$GNGSA,A,3,73,74,72,71,,,,,,,,,2.9,1.2,2.6*24
$GNGST,235647.00,0.003,0.054,0.044,139.7,0.050,0.049,0.070*49
$GPGSV,4,1,13,26,33,050,38,9,40,314,43,3,55,188,44,23,68,354,50*72
$GPGSV,4,2,13,16,56,082,48,7,28,256,43*44
$GLGSV,4,3,13,73,52,022,52,74,62,247,50,72,44,331,50,71,78,111,51*6A
$GAGSV,4,4,13,19,82,349,44,1,44,220,44,4,24,314,45*52
$GNRMC,235647.00,A,3403.47162394,N,11711.80927093,W,0.003,0.000,201217,12.0194,E,D*33
$GNVTG,248.04,T,236.01,M,0.00,N,0.01,K,D*35
$GNZDA,235647.05,20,12,2017,00,00*79
$GNGGA,235648.00,3403.47162869,N,11711.80928436,W,5,10,1.2,403.633,M,-32.133,M,1.0,0000*63
$PTNL,GGK,235648.00,122017,3403.47162869,N,11711.80928436,W,12,10,2.9,EHT371.500,M*56
$GNGLL,3403.47162869,N,11711.80928436,W,235648.00,A,D*66
$GNGNS,235648.00,3403.47162869,N,11711.80928436,W,FFNNN,10,1.2,403.633,-32.133,,*2C
$GPGNS,235648.00,,,,,,6,,,,1.0,0*44
$GLGNS,235648.00,,,,,,4,,,,1.0,0*5A
$GNGSA,A,3,26,9,3,16,7,23,,,,,,,2.9,1.2,2.6*1F
$GNGSA,A,3,73,74,72,71,,,,,,,,,2.9,1.2,2.6*24
$GNGST,235648.00,0.003,0.054,0.044,139.7,0.050,0.049,0.070*46
$GPGSV,4,1,13,26,33,050,34,9,40,314,44,3,55,188,43,23,68,354,52*7C
$GPGSV,4,2,13,16,56,082,48,7,28,256,43*44
$GLGSV,4,3,13,73,52,022,52,74,62,247,50,72,44,331,50,71,78,111,52*69
$GAGSV,4,4,13,19,82,349,44,1,44,220,44,4,24,314,46*51
$GNRMC,235648.00,A,3403.47162869,N,11711.80928436,W,0.028,322.683,201217,12.0194,E,D*36
$GNVTG,322.68,T,310.66,M,0.03,N,0.05,K,D*31
$GNZDA,235648.05,20,12,2017,00,00*76
$GNGGA,235649.00,3403.47162781,N,11711.80928227,W,5,10,1.2,403.637,M,-32.133,M,1.0,0000*69
$PTNL,GGK,235649.00,122017,3403.47162781,N,11711.80928227,W,12,10,2.9,EHT371.504,M*5C
$GNGLL,3403.47162781,N,11711.80928227,W,235649.00,A,D*68
$GNGNS,235649.00,3403.47162781,N,11711.80928227,W,FFNNN,10,1.2,403.637,-32.133,,*26
$GPGNS,235649.00,,,,,,6,,,,1.0,0*45
$GLGNS,235649.00,,,,,,4,,,,1.0,0*5B
$GNGSA,A,3,26,9,3,16,7,23,,,,,,,2.9,1.2,2.6*1F
$GNGSA,A,3,73,74,72,71,,,,,,,,,2.9,1.2,2.6*24
$GNGST,235649.00,0.003,0.054,0.044,137.8,0.050,0.049,0.070*46
$GPGSV,4,1,14,26,33,050,34,9,40,314,43,3,55,188,43,23,68,354,51*7F
$GPGSV,4,2,14,16,56,082,48,7,28,256,43,6,8,295,37*77
$GLGSV,4,3,14,73,52,022,52,74,62,247,50,72,44,331,50,71,78,111,51*6D
$GAGSV,4,4,14,19,82,349,44,1,44,220,44,4,24,314,46*56
$GNRMC,235649.00,A,3403.47162781,N,11711.80928227,W,0.014,104.669,201217,12.0194,E,D*35
$GNVTG,104.67,T,92.64,M,0.01,N,0.03,K,D*07
$GNZDA,235649.05,20,12,2017,00,00*77
$GNGGA,235650.00,3403.47162865,N,11711.80928186,W,5,10,1.2,403.606,M,-32.133,M,1.0,0000*6E
$PTNL,GGK,235650.00,122017,3403.47162865,N,11711.80928186,W,12,10,2.9,EHT371.473,M*58
$GNGLL,3403.47162865,N,11711.80928186,W,235650.00,A,D*6D
$GNGNS,235650.00,3403.47162865,N,11711.80928186,W,FFNNN,10,1.2,403.606,-32.133,,*21
$GPGNS,235650.00,,,,,,6,,,,1.0,0*4D
$GLGNS,235650.00,,,,,,4,,,,1.0,0*53
$GNGSA,A,3,26,9,3,16,7,23,,,,,,,2.9,1.2,2.6*1F
$GNGSA,A,3,73,74,72,71,,,,,,,,,2.9,1.2,2.6*24
$GNGST,235650.00,0.003,0.054,0.044,139.6,0.050,0.049,0.070*4E
$GPGSV,4,1,14,26,33,050,36,9,40,314,41,3,55,188,43,23,68,354,51*7F
$GPGSV,4,2,14,16,56,082,48,7,28,256,42,6,8,295,36*77
$GLGSV,4,3,14,73,52,022,52,74,62,247,50,72,44,331,51,71,78,111,51*6C
$GAGSV,4,4,14,19,82,349,44,1,44,220,44,4,24,314,46*56
$GNRMC,235650.00,A,3403.47162865,N,11711.80928186,W,0.017,335.730,201217,12.0194,E,D*3E
$GNVTG,335.73,T,323.71,M,0.02,N,0.03,K,D*3C
$GNZDA,235650.05,20,12,2017,00,00*7F
$GNGGA,235651.00,3403.47162766,N,11711.80927378,W,5,10,1.2,403.594,M,-32.133,M,1.0,0000*67
$PTNL,GGK,235651.00,122017,3403.47162766,N,11711.80927378,W,12,10,2.9,EHT371.461,M*5A
$GNGLL,3403.47162766,N,11711.80927378,W,235651.00,A,D*6C
$GNGNS,235651.00,3403.47162766,N,11711.80927378,W,FFNNN,10,1.2,403.594,-32.133,,*28
$GPGNS,235651.00,,,,,,6,,,,1.0,0*4C
$GLGNS,235651.00,,,,,,4,,,,1.0,0*52
$GNGSA,A,3,26,9,3,16,7,23,,,,,,,2.9,1.2,2.6*1F
$GNGSA,A,3,73,74,72,71,,,,,,,,,2.9,1.2,2.6*24
$GNGST,235651.00,0.003,0.054,0.044,139.9,0.050,0.049,0.070*40
$GPGSV,4,1,14,26,33,050,35,9,40,314,44,3,55,187,44,23,68,354,51*71
$GPGSV,4,2,14,16,56,082,48,7,28,256,44,6,8,295,38*7F
$GLGSV,4,3,14,73,52,022,52,74,62,248,50,72,44,331,50,71,78,111,52*61
$GAGSV,4,4,14,19,82,349,44,1,44,220,44,4,24,314,45*55
$GNRMC,235651.00,A,3403.47162766,N,11711.80927378,W,0.015,51.337,201217,12.0194,E,D*0F
$GNVTG,51.34,T,39.31,M,0.01,N,0.03,K,D*31
$GNZDA,235651.05,20,12,2017,00,00*7E
$GNGGA,235652.00,3403.47162304,N,11711.80927561,W,5,10,1.2,403.585,M,-32.133,M,1.0,0000*6A
$PTNL,GGK,235652.00,122017,3403.47162304,N,11711.80927561,W,12,10,2.9,EHT371.453,M*56
$GNGLL,3403.47162304,N,11711.80927561,W,235652.00,A,D*61
$GNGNS,235652.00,3403.47162304,N,11711.80927561,W,FFNNN,10,1.2,403.585,-32.133,,*25
$GPGNS,235652.00,,,,,,6,,,,1.0,0*4F
$GLGNS,235652.00,,,,,,4,,,,1.0,0*51
$GNGSA,A,3,26,9,3,16,7,23,,,,,,,2.9,1.2,2.6*1F
$GNGSA,A,3,73,74,72,71,,,,,,,,,2.9,1.2,2.6*24
$GNGST,235652.00,0.003,0.054,0.044,139.8,0.050,0.049,0.070*42
$GPGSV,4,1,14,26,33,050,35,9,40,314,44,3,55,187,45,23,68,354,50*71
$GPGSV,4,2,14,16,56,082,47,7,28,256,44,6,8,295,36*7E
$GLGSV,4,3,14,73,52,022,52,74,62,248,51,72,44,331,51,71,78,111,51*62
$GAGSV,4,4,14,19,82,349,44,1,44,220,43,4,24,314,46*51
$GNRMC,235652.00,A,3403.47162304,N,11711.80927561,W,0.025,77.081,201217,12.0194,E,D*0B
$GNVTG,77.08,T,65.06,M,0.03,N,0.05,K,D*33
$GNZDA,235652.05,20,12,2017,00,00*7D
$GNGGA,235653.00,3403.47161868,N,11711.80928413,W,5,10,1.2,403.623,M,-32.133,M,1.0,0000*6D
$PTNL,GGK,235653.00,122017,3403.47161868,N,11711.80928413,W,12,10,2.9,EHT371.490,M*51
$GNGLL,3403.47161868,N,11711.80928413,W,235653.00,A,D*69
$GNGNS,235653.00,3403.47161868,N,11711.80928413,W,FFNNN,10,1.2,403.623,-32.133,,*22
$GPGNS,235653.00,,,,,,6,,,,1.0,0*4E
$GLGNS,235653.00,,,,,,4,,,,1.0,0*50
$GNGSA,A,3,26,9,3,16,7,23,,,,,,,2.9,1.2,2.6*1F
$GNGSA,A,3,73,74,72,71,,,,,,,,,2.9,1.2,2.6*24
$GNGST,235653.00,0.003,0.054,0.045,140.0,0.050,0.049,0.070*44
$GPGSV,4,1,14,26,33,050,38,9,40,314,43,3,55,187,45,23,68,354,51*7A
$GPGSV,4,2,14,16,56,082,47,7,28,256,46,6,8,295,37*7D
$GLGSV,4,3,14,73,52,022,52,74,62,248,49,72,44,331,51,71,78,111,51*6B
$GAGSV,4,4,14,19,82,349,44,1,44,220,44,4,24,314,46*56
$GNRMC,235653.00,A,3403.47161868,N,11711.80928413,W,0.071,278.869,201217,12.0194,E,D*31
$GNVTG,278.87,T,266.84,M,0.07,N,0.13,K,D*31
$GNZDA,235653.05,20,12,2017,00,00*7C
$GNGGA,235654.00,3403.47163916,N,11711.80927277,W,5,10,1.2,403.525,M,-32.133,M,1.0,0000*6E
$PTNL,GGK,235654.00,122017,3403.47163916,N,11711.80927277,W,12,10,2.9,EHT371.392,M*52
$GNGLL,3403.47163916,N,11711.80927277,W,235654.00,A,D*6F
$GNGNS,235654.00,3403.47163916,N,11711.80927277,W,FFNNN,10,1.2,403.525,-32.133,,*21
$GPGNS,235654.00,,,,,,6,,,,1.0,0*49
$GLGNS,235654.00,,,,,,4,,,,1.0,0*57
$GNGSA,A,3,26,9,3,16,7,23,,,,,,,2.9,1.2,2.6*1F
$GNGSA,A,3,73,74,72,71,,,,,,,,,2.9,1.2,2.6*24
$GNGST,235654.00,0.003,0.054,0.044,136.1,0.050,0.049,0.070*42
$GPGSV,4,1,14,26,33,050,38,9,40,314,33,3,55,187,40,23,68,354,43*7B
$GPGSV,4,2,14,16,56,082,45,7,28,256,32,6,8,295,27*7D
$GLGSV,4,3,14,73,52,022,44,74,62,248,45,72,44,331,42,71,78,111,47*65
$GAGSV,4,4,14,19,82,349,39,1,44,220,36,4,24,314,36*5E
$GNRMC,235654.00,A,3403.47163916,N,11711.80927277,W,0.047,13.239,201217,12.0194,E,D*02
$GNVTG,13.24,T,1.22,M,0.05,N,0.09,K,D*01
$GNZDA,235654.05,20,12,2017,00,00*7B
$GNGGA,235655.00,3403.47141462,N,11711.80952375,W,2,10,1.3,403.211,M,-32.133,M,1.0,0000*66
$PTNL,GGK,235655.00,122017,3403.47141462,N,11711.80952375,W,4,10,2.5,EHT371.078,M*60
$GNGLL,3403.47141462,N,11711.80952375,W,235655.00,A,D*61
$GNGNS,235655.00,3403.47141462,N,11711.80952375,W,DDNNN,10,1.3,403.211,-32.133,,*2E
$GPGNS,235655.00,,,,,,6,,,,1.0,0*48
$GLGNS,235655.00,,,,,,4,,,,1.0,0*56
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.3,2.2*16
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.3,2.2*2D
$GNGST,235655.00,0.868,0.858,0.554,126.5,0.677,0.764,4.471*49
$GPGSV,4,1,14,26,33,050,35,9,40,314,38,3,55,187,41,23,68,354,39*71
$GPGSV,4,2,14,16,56,082,41,7,28,256,31,6,8,295,20*7D
$GLGSV,4,3,14,73,52,022,38,74,62,248,35,72,44,331,38,71,78,111,34*60
$GAGSV,4,4,14,19,82,349,28,1,44,220,34,4,24,314,33*59
$GNRMC,235655.00,A,3403.47141462,N,11711.80952375,W,1.294,322.507,201217,12.0194,E,D*3A
$GNVTG,322.51,T,310.48,M,1.29,N,2.40,K,D*3D
$GNZDA,235655.04,20,12,2017,00,00*7B
$GNGGA,235656.00,3403.47147891,N,11711.80935006,W,2,10,1.4,403.689,M,-32.133,M,1.0,0000*67
$PTNL,GGK,235656.00,122017,3403.47147891,N,11711.80935006,W,4,10,3.5,EHT371.557,M*6A
$GNGLL,3403.47147891,N,11711.80935006,W,235656.00,A,D*62
$GNGNS,235656.00,3403.47147891,N,11711.80935006,W,DDNNN,10,1.4,403.689,-32.133,,*2F
$GPGNS,235656.00,,,,,,6,,,,1.0,0*4B
$GLGNS,235656.00,,,,,,4,,,,1.0,0*55
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,3.5,1.4,3.2*11
$GNGSA,A,3,71,72,73,74,,,,,,,,,3.5,1.4,3.2*2A
$GNGST,235656.00,0.308,0.770,0.545,126.4,0.633,0.699,3.491*49
$GPGSV,4,1,14,26,33,050,38,9,40,314,47,3,55,187,47,23,68,354,49*75
$GPGSV,4,2,14,16,56,082,50,7,28,256,36,6,8,295,34*7F
$GLGSV,4,3,14,73,52,022,48,74,62,248,47,72,44,331,42,71,78,111,50*6D
$GAGSV,4,4,14,19,82,349,39,1,44,220,38,4,24,314,34*52
$GNRMC,235656.00,A,3403.47147891,N,11711.80935006,W,1.551,69.844,201217,12.0194,E,D*01
$GNVTG,69.84,T,57.82,M,1.55,N,2.87,K,D*3F
$GNZDA,235656.04,20,12,2017,00,00*78
$GNGGA,235657.00,3403.47148352,N,11711.80892692,W,2,10,1.3,403.420,M,-32.133,M,1.0,0000*6C
$PTNL,GGK,235657.00,122017,3403.47148352,N,11711.80892692,W,4,10,2.5,EHT371.288,M*63
$GNGLL,3403.47148352,N,11711.80892692,W,235657.00,A,D*6F
$GNGNS,235657.00,3403.47148352,N,11711.80892692,W,DDNNN,10,1.3,403.420,-32.133,,*24
$GPGNS,235657.00,,,,,,6,,,,1.0,0*4A
$GLGNS,235657.00,,,,,,4,,,,1.0,0*54
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.3,2.2*16
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.3,2.2*2D
$GNGST,235657.00,0.101,0.757,0.466,111.8,0.516,0.724,1.861*4C
$GPGSV,4,1,14,26,33,050,43,9,40,314,47,3,55,187,49,23,68,354,48*76
$GPGSV,4,2,14,16,56,082,50,7,28,256,40,6,8,295,34*7E
$GLGSV,4,3,14,73,52,022,47,74,62,248,47,72,44,331,42,71,78,111,49*6A
$GAGSV,4,4,14,19,82,349,40,1,44,220,40,4,24,314,38*5F
$GNRMC,235657.00,A,3403.47148352,N,11711.80892692,W,1.280,83.250,201217,12.0194,E,D*0C
$GNVTG,83.25,T,71.23,M,1.28,N,2.37,K,D*3E
$GNZDA,235657.04,20,12,2017,00,00*79
$GNGGA,235658.00,3403.47147835,N,11711.80852392,W,2,10,1.3,403.183,M,-32.133,M,2.0,0000*60
$PTNL,GGK,235658.00,122017,3403.47147835,N,11711.80852392,W,4,10,2.5,EHT371.050,M*67
$GNGLL,3403.47147835,N,11711.80852392,W,235658.00,A,D*6C
$GNGNS,235658.00,3403.47147835,N,11711.80852392,W,DDNNN,10,1.3,403.183,-32.133,,*2B
$GPGNS,235658.00,,,,,,6,,,,2.0,0*46
$GLGNS,235658.00,,,,,,4,,,,2.0,0*58
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.3,2.2*16
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.3,2.2*2D
$GNGST,235658.00,0.079,0.577,0.429,131.2,0.499,0.518,1.219*40
$GPGSV,4,1,14,26,33,050,46,9,40,314,46,3,54,187,46,23,68,354,47*73
$GPGSV,4,2,14,16,56,082,48,7,28,256,36,6,8,295,30*72
$GLGSV,4,3,14,73,52,022,45,74,62,248,49,72,44,331,41,71,78,111,50*6D
$GAGSV,4,4,14,19,82,349,39,1,44,220,37,4,24,314,37*5E
$GNRMC,235658.00,A,3403.47147835,N,11711.80852392,W,0.899,93.058,201217,12.0194,E,D*07
$GNVTG,93.06,T,81.03,M,0.90,N,1.67,K,D*37
$GNZDA,235658.04,20,12,2017,00,00*76
$GNGGA,235659.00,3403.47147018,N,11711.80816037,W,2,10,1.1,402.866,M,-32.133,M,1.0,0000*68
$PTNL,GGK,235659.00,122017,3403.47147018,N,11711.80816037,W,4,10,2.5,EHT370.734,M*69
$GNGLL,3403.47147018,N,11711.80816037,W,235659.00,A,D*66
$GNGNS,235659.00,3403.47147018,N,11711.80816037,W,DDNNN,10,1.1,402.866,-32.133,,*20
$GPGNS,235659.00,,,,,,6,,,,1.0,0*44
$GLGNS,235659.00,,,,,,4,,,,1.0,0*5A
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235659.00,0.288,0.576,0.483,86.2,0.484,0.575,1.655*7A
$GPGSV,4,1,14,26,33,050,32,9,40,314,48,3,54,187,46,23,68,354,47*7E
$GPGSV,4,2,14,16,56,082,49,7,28,256,41,6,8,295,32*71
$GLGSV,4,3,14,73,52,022,45,74,62,248,48,72,44,331,45,71,78,111,50*68
$GAGSV,4,4,14,19,82,349,41,1,44,220,42,4,24,314,39*5D
$GNRMC,235659.00,A,3403.47147018,N,11711.80816037,W,1.188,94.957,201217,12.0184,E,D*05
$GNVTG,94.96,T,82.93,M,1.19,N,2.20,K,D*33
$GNZDA,235659.05,20,12,2017,00,00*76
$GNGGA,235700.00,3403.47149015,N,11711.80782461,W,2,10,1.5,402.571,M,-32.133,M,2.0,0000*6F
$PTNL,GGK,235700.00,122017,3403.47149015,N,11711.80782461,W,4,10,3.6,EHT370.438,M*6F
$GNGLL,3403.47149015,N,11711.80782461,W,235700.00,A,D*6D
$GNGNS,235700.00,3403.47149015,N,11711.80782461,W,DDNNN,10,1.5,402.571,-32.133,,*24
$GPGNS,235700.00,,,,,,6,,,,2.0,0*4A
$GLGNS,235700.00,,,,,,4,,,,2.0,0*54
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,3.6,1.5,3.2*13
$GNGSA,A,3,71,72,73,74,,,,,,,,,3.6,1.5,3.2*28
$GNGST,235700.00,0.117,0.777,0.549,132.0,0.661,0.684,3.716*4A
$GPGSV,4,1,14,26,33,050,42,9,40,314,45,3,54,187,45,23,68,354,49*79
$GPGSV,4,2,14,16,56,082,48,7,28,256,36,6,8,295,28*7B
$GLGSV,4,3,14,73,52,022,36,74,62,248,48,72,44,331,43,71,78,111,50*6A
$GAGSV,4,4,14,19,82,349,43,1,44,220,39,4,24,314,38*52
$GNRMC,235700.00,A,3403.47149015,N,11711.80782461,W,0.876,76.350,201217,12.0184,E,D*06
$GNVTG,76.35,T,64.33,M,0.88,N,1.62,K,D*38
$GNZDA,235700.05,20,12,2017,00,00*7B
$GNGGA,235701.00,3403.47148265,N,11711.80745363,W,2,10,1.1,402.097,M,-32.133,M,1.0,0000*6E
$PTNL,GGK,235701.00,122017,3403.47148265,N,11711.80745363,W,4,10,2.5,EHT369.965,M*6B
$GNGLL,3403.47148265,N,11711.80745363,W,235701.00,A,D*66
$GNGNS,235701.00,3403.47148265,N,11711.80745363,W,DDNNN,10,1.1,402.097,-32.133,,*26
$GPGNS,235701.00,,,,,,6,,,,1.0,0*48
$GLGNS,235701.00,,,,,,4,,,,1.0,0*56
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235701.00,0.405,0.649,0.466,115.2,0.504,0.620,1.590*4A
$GPGSV,4,1,14,26,33,050,44,9,40,314,42,3,54,187,43,23,68,354,47*70
$GPGSV,4,2,14,16,56,082,50,7,28,256,39,6,8,295,33*77
$GLGSV,4,3,14,73,52,022,46,74,62,248,47,72,44,331,41,71,78,111,50*60
$GAGSV,4,4,14,19,82,349,41,1,44,220,38,4,24,314,38*51
$GNRMC,235701.00,A,3403.47148265,N,11711.80745363,W,1.270,89.127,201217,12.0184,E,D*02
$GNVTG,89.13,T,77.10,M,1.27,N,2.35,K,D*3A
$GNZDA,235701.04,20,12,2017,00,00*7B
$GNGGA,235702.00,3403.47209507,N,11711.80732370,W,5,05,2.6,407.505,M,-32.133,M,1.0,0000*66
$PTNL,GGK,235702.00,122017,3403.47209507,N,11711.80732370,W,2,05,13.5,EHT375.372,M*5C
$GNGLL,3403.47209507,N,11711.80732370,W,235702.00,A,D*62
$GNGNS,235702.00,3403.47209507,N,11711.80732370,W,FFNNN,05,2.6,407.505,-32.133,,*29
$GPGNS,235702.00,,,,,,3,,,,1.0,0*4E
$GLGNS,235702.00,,,,,,2,,,,1.0,0*53
$GNGSA,A,3,3,23,16,,,,,,,,,,13.5,2.6,13.2*1A
$GNGSA,A,3,74,71,,,,,,,,,,,13.5,2.6,13.2*2A
$GNGST,235702.00,0.191,0.676,0.301,57.6,0.442,0.593,2.529*71
$GPGSV,4,1,14,26,33,050,43,9,40,314,48,3,54,187,43,23,68,354,47*7D
$GPGSV,4,2,14,16,56,082,48,7,28,256,44,6,8,295,32*75
$GLGSV,4,3,14,73,52,022,45,74,62,248,48,72,44,331,43,71,78,111,48*67
$GAGSV,4,4,14,19,82,349,42,1,44,220,31,4,24,314,38*5B
$GNRMC,235702.00,A,3403.47209507,N,11711.80732370,W,1.789,123.975,201217,12.0184,E,D*3B
$GNVTG,123.97,T,111.95,M,1.79,N,3.31,K,D*35
$GNZDA,235702.05,20,12,2017,00,00*79
$GNGGA,235703.00,3403.47120029,N,11711.80679221,W,2,10,1.1,401.881,M,-32.133,M,1.0,0000*6D
$PTNL,GGK,235703.00,122017,3403.47120029,N,11711.80679221,W,4,10,2.5,EHT369.748,M*65
$GNGLL,3403.47120029,N,11711.80679221,W,235703.00,A,D*69
$GNGNS,235703.00,3403.47120029,N,11711.80679221,W,DDNNN,10,1.1,401.881,-32.133,,*25
$GPGNS,235703.00,,,,,,6,,,,1.0,0*4A
$GLGNS,235703.00,,,,,,4,,,,1.0,0*54
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235703.00,0.172,0.571,0.507,130.8,0.535,0.545,1.547*46
$GPGSV,4,1,14,26,33,050,48,9,40,314,48,3,54,187,40,23,68,354,49*7B
$GPGSV,4,2,14,16,56,082,50,7,28,256,48,6,8,295,36*74
$GLGSV,4,3,14,73,52,022,48,74,62,248,51,72,44,331,36,71,78,111,48*60
$GAGSV,4,4,14,19,82,349,42,1,44,220,28,4,24,314,35*5E
$GNRMC,235703.00,A,3403.47120029,N,11711.80679221,W,0.436,232.424,201217,12.0184,E,D*3C
$GNVTG,232.42,T,220.40,M,0.44,N,0.81,K,D*30
$GNZDA,235703.04,20,12,2017,00,00*79
$GNGGA,235704.00,3403.47119518,N,11711.80687769,W,2,10,1.1,401.570,M,-32.133,M,1.0,0000*6C
$PTNL,GGK,235704.00,122017,3403.47119518,N,11711.80687769,W,4,10,2.5,EHT369.437,M*6C
$GNGLL,3403.47119518,N,11711.80687769,W,235704.00,A,D*6B
$GNGNS,235704.00,3403.47119518,N,11711.80687769,W,DDNNN,10,1.1,401.570,-32.133,,*24
$GPGNS,235704.00,,,,,,6,,,,1.0,0*4D
$GLGNS,235704.00,,,,,,4,,,,1.0,0*53
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235704.00,0.081,0.482,0.452,79.3,0.453,0.481,1.300*7A
$GPGSV,4,1,14,26,33,050,42,9,40,314,47,3,54,187,42,23,68,354,48*7D
$GPGSV,4,2,14,16,56,082,48,7,28,256,48,6,8,295,30*7B
$GLGSV,4,3,14,73,52,022,46,74,62,248,50,72,44,331,40,71,78,111,52*65
$GAGSV,4,4,14,19,82,349,44,1,45,220,27,4,24,314,39*5A
$GNRMC,235704.00,A,3403.47119518,N,11711.80687769,W,0.652,217.080,201217,12.0184,E,D*33
$GNVTG,217.08,T,205.06,M,0.65,N,1.21,K,D*34
$GNZDA,235704.04,20,12,2017,00,00*7E
$GNGGA,235705.00,3403.47106821,N,11711.80682894,W,2,10,1.1,401.365,M,-32.133,M,1.0,0000*6E
$PTNL,GGK,235705.00,122017,3403.47106821,N,11711.80682894,W,4,10,2.5,EHT369.233,M*6E
$GNGLL,3403.47106821,N,11711.80682894,W,235705.00,A,D*6B
$GNGNS,235705.00,3403.47106821,N,11711.80682894,W,DDNNN,10,1.1,401.365,-32.133,,*26
$GPGNS,235705.00,,,,,,6,,,,1.0,0*4C
$GLGNS,235705.00,,,,,,4,,,,1.0,0*52
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235705.00,0.184,0.604,0.511,110.3,0.523,0.594,2.302*49
$GPGSV,4,1,14,26,33,050,43,9,40,314,46,3,54,187,36,23,68,354,49*7F
$GPGSV,4,2,14,16,56,082,46,7,28,256,49,6,8,295,29*7C
$GLGSV,4,3,14,73,52,022,48,74,62,248,48,72,44,331,45,71,78,111,49*6D
$GAGSV,4,4,14,19,82,349,45,1,45,220,,4,24,314,36*51
$GNRMC,235705.00,A,3403.47106821,N,11711.80682894,W,0.302,182.019,201217,12.0184,E,D*3C
$GNVTG,182.02,T,170.00,M,0.30,N,0.56,K,D*37
$GNZDA,235705.04,20,12,2017,00,00*7F
$GNGGA,235706.00,3403.47081686,N,11711.80716414,W,2,10,1.1,401.142,M,-32.133,M,1.0,0000*6F
$PTNL,GGK,235706.00,122017,3403.47081686,N,11711.80716414,W,4,10,2.5,EHT369.009,M*63
$GNGLL,3403.47081686,N,11711.80716414,W,235706.00,A,D*6D
$GNGNS,235706.00,3403.47081686,N,11711.80716414,W,DDNNN,10,1.1,401.142,-32.133,,*27
$GPGNS,235706.00,,,,,,6,,,,1.0,0*4F
$GLGNS,235706.00,,,,,,4,,,,1.0,0*51
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235706.00,0.507,1.290,0.568,8.9,1.278,0.595,2.251*4F
$GPGSV,4,1,14,26,33,050,39,9,40,314,47,3,54,187,27,23,68,354,48*72
$GPGSV,4,2,14,16,56,082,49,7,28,256,44,6,8,295,31*77
$GLGSV,4,3,14,73,52,022,46,74,62,248,52,72,44,331,43,71,78,111,50*66
$GAGSV,4,4,14,19,82,349,45,1,45,220,,4,24,314,42*52
$GNRMC,235706.00,A,3403.47081686,N,11711.80716414,W,1.987,230.087,201217,12.0184,E,D*31
$GNVTG,230.09,T,218.06,M,1.99,N,3.68,K,D*31
$GNZDA,235706.04,20,12,2017,00,00*7C
$GNGGA,235707.00,3403.47081722,N,11711.80761938,W,2,10,1.1,401.175,M,-32.133,M,1.0,0000*66
$PTNL,GGK,235707.00,122017,3403.47081722,N,11711.80761938,W,4,10,2.5,EHT369.042,M*61
$GNGLL,3403.47081722,N,11711.80761938,W,235707.00,A,D*60
$GNGNS,235707.00,3403.47081722,N,11711.80761938,W,DDNNN,10,1.1,401.175,-32.133,,*2E
$GPGNS,235707.00,,,,,,6,,,,1.0,0*4E
$GLGNS,235707.00,,,,,,4,,,,1.0,0*50
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235707.00,0.344,0.696,0.431,0.2,0.696,0.431,1.028*47
$GPGSV,4,1,14,26,33,050,41,9,40,314,51,3,54,187,26,23,68,354,53*71
$GPGSV,4,2,14,16,56,082,47,7,28,256,41,6,8,295,33*7E
$GLGSV,4,3,14,73,52,022,49,74,62,248,50,72,44,331,45,71,78,111,49*65
$GAGSV,4,4,14,19,82,349,44,1,45,220,,4,24,314,40*51
$GNRMC,235707.00,A,3403.47081722,N,11711.80761938,W,0.761,260.972,201217,12.0184,E,D*3D
$GNVTG,260.97,T,248.95,M,0.76,N,1.41,K,D*35
$GNZDA,235707.04,20,12,2017,00,00*7D
$GNGGA,235708.00,3403.47103245,N,11711.80785783,W,2,10,1.1,400.346,M,-32.133,M,1.0,0000*61
$PTNL,GGK,235708.00,122017,3403.47103245,N,11711.80785783,W,4,10,2.5,EHT368.213,M*62
$GNGLL,3403.47103245,N,11711.80785783,W,235708.00,A,D*64
$GNGNS,235708.00,3403.47103245,N,11711.80785783,W,DDNNN,10,1.1,400.346,-32.133,,*29
$GPGNS,235708.00,,,,,,6,,,,1.0,0*41
$GLGNS,235708.00,,,,,,4,,,,1.0,0*5F
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235708.00,0.403,1.848,0.759,95.0,0.773,1.842,3.363*7E
$GPGSV,4,1,14,26,33,050,39,9,40,314,49,3,54,187,29,23,68,354,50*7B
$GPGSV,4,2,14,16,56,082,43,7,28,256,40,6,8,295,27*7E
$GLGSV,4,3,14,73,52,022,42,74,62,248,51,72,44,331,48,71,78,111,48*63
$GAGSV,4,4,14,19,82,349,45,1,45,220,,4,24,314,40*50
$GNRMC,235708.00,A,3403.47103245,N,11711.80785783,W,0.499,282.930,201217,12.0184,E,D*37
$GNVTG,282.93,T,270.91,M,0.50,N,0.92,K,D*39
$GNZDA,235708.04,20,12,2017,00,00*72
$GNGGA,235709.00,3403.47114843,N,11711.80761413,W,2,10,1.1,400.362,M,-32.133,M,1.0,0000*6C
$PTNL,GGK,235709.00,122017,3403.47114843,N,11711.80761413,W,4,10,2.5,EHT368.229,M*60
$GNGLL,3403.47114843,N,11711.80761413,W,235709.00,A,D*6F
$GNGNS,235709.00,3403.47114843,N,11711.80761413,W,DDNNN,10,1.1,400.362,-32.133,,*24
$GPGNS,235709.00,,,,,,6,,,,1.0,0*40
$GLGNS,235709.00,,,,,,4,,,,1.0,0*5E
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235709.00,0.772,1.495,1.358,166.5,1.487,1.366,2.879*4F
$GPGSV,4,1,14,26,33,050,43,9,40,314,48,3,54,187,23,23,68,354,52*7F
$GPGSV,4,2,14,16,56,082,48,7,28,256,39,6,8,295,29*75
$GLGSV,4,3,14,73,52,022,46,74,62,248,51,72,44,331,43,71,78,111,48*6C
$GAGSV,4,4,14,19,82,349,44,1,45,220,,4,24,314,30*56
$GNRMC,235709.00,A,3403.47114843,N,11711.80761413,W,2.000,64.782,201217,12.0184,E,D*07
$GNVTG,64.78,T,52.76,M,2.00,N,3.70,K,D*35
$GNZDA,235709.04,20,12,2017,00,00*73
$GNGGA,235710.00,3403.47131526,N,11711.80702946,W,2,10,1.1,400.482,M,-32.133,M,2.0,0000*6F
$PTNL,GGK,235710.00,122017,3403.47131526,N,11711.80702946,W,4,10,2.5,EHT368.349,M*6E
$GNGLL,3403.47131526,N,11711.80702946,W,235710.00,A,D*66
$GNGNS,235710.00,3403.47131526,N,11711.80702946,W,DDNNN,10,1.1,400.482,-32.133,,*24
$GPGNS,235710.00,,,,,,6,,,,2.0,0*4B
$GLGNS,235710.00,,,,,,4,,,,2.0,0*55
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235710.00,0.559,1.831,1.191,125.0,1.433,1.648,2.840*47
$GPGSV,4,1,14,26,33,050,43,9,40,314,47,3,54,187,32,23,68,354,51*73
$GPGSV,4,2,14,16,56,082,49,7,28,256,48,6,8,295,35*7F
$GLGSV,4,3,14,73,52,022,48,74,62,248,49,72,44,331,40,71,78,111,52*63
$GAGSV,4,4,14,19,82,349,46,1,45,220,,4,24,314,38*5C
$GNRMC,235710.00,A,3403.47131526,N,11711.80702946,W,2.040,39.208,201217,12.0184,E,D*05
$GNVTG,39.21,T,27.18,M,2.04,N,3.78,K,D*37
$GNZDA,235710.04,20,12,2017,00,00*7B
$GNGGA,235711.00,3403.47162424,N,11711.80748132,W,2,10,1.1,400.468,M,-32.133,M,1.0,0000*69
$PTNL,GGK,235711.00,122017,3403.47162424,N,11711.80748132,W,4,10,2.5,EHT368.336,M*67
$GNGLL,3403.47162424,N,11711.80748132,W,235711.00,A,D*67
$GNGNS,235711.00,3403.47162424,N,11711.80748132,W,DDNNN,10,1.1,400.468,-32.133,,*21
$GPGNS,235711.00,,,,,,6,,,,1.0,0*49
$GLGNS,235711.00,,,,,,4,,,,1.0,0*57
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235711.00,0.529,0.923,0.568,152.8,0.861,0.658,1.139*47
$GPGSV,4,1,14,26,33,050,45,9,40,314,44,3,54,187,41,23,68,354,52*71
$GPGSV,4,2,14,16,56,082,47,7,28,256,48,6,8,295,34*70
$GLGSV,4,3,14,73,52,022,44,74,62,248,50,72,44,331,40,71,78,111,50*65
$GAGSV,4,4,14,19,82,349,45,1,45,220,,4,24,314,41*51
$GNRMC,235711.00,A,3403.47162424,N,11711.80748132,W,2.862,279.601,201217,12.0184,E,D*37
$GNVTG,279.60,T,267.58,M,2.86,N,5.30,K,D*36
$GNZDA,235711.04,20,12,2017,00,00*7A
$GNGGA,235712.00,3403.47153718,N,11711.80785392,W,2,10,1.1,400.735,M,-32.133,M,1.0,0000*66
$PTNL,GGK,235712.00,122017,3403.47153718,N,11711.80785392,W,4,10,2.5,EHT368.603,M*60
$GNGLL,3403.47153718,N,11711.80785392,W,235712.00,A,D*63
$GNGNS,235712.00,3403.47153718,N,11711.80785392,W,DDNNN,10,1.1,400.735,-32.133,,*2E
$GPGNS,235712.00,,,,,,6,,,,1.0,0*4A
$GLGNS,235712.00,,,,,,4,,,,1.0,0*54
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235712.00,0.330,1.096,0.718,13.9,1.078,0.746,2.498*7E
$GPGSV,4,1,14,26,33,050,43,9,40,314,44,3,54,187,37,23,68,354,47*72
$GPGSV,4,2,14,16,56,082,46,7,28,256,45,6,8,295,31*79
$GLGSV,4,3,14,73,52,023,46,74,62,248,49,72,44,331,47,71,78,112,48*63
$GAGSV,4,4,14,19,82,349,44,1,45,220,,4,24,315,31*56
$GNRMC,235712.00,A,3403.47153718,N,11711.80785392,W,1.009,242.798,201217,12.0184,E,D*3C
$GNVTG,242.80,T,230.77,M,1.01,N,1.87,K,D*3B
$GNZDA,235712.04,20,12,2017,00,00*79
$GNGGA,235713.00,3403.47143216,N,11711.80816564,W,2,10,1.4,401.049,M,-32.133,M,1.0,0000*6F
$PTNL,GGK,235713.00,122017,3403.47143216,N,11711.80816564,W,4,10,2.6,EHT368.916,M*69
$GNGLL,3403.47143216,N,11711.80816564,W,235713.00,A,D*62
$GNGNS,235713.00,3403.47143216,N,11711.80816564,W,DDNNN,10,1.4,401.049,-32.133,,*27
$GPGNS,235713.00,,,,,,6,,,,1.0,0*4B
$GLGNS,235713.00,,,,,,4,,,,1.0,0*55
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.6,1.4,2.2*12
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.6,1.4,2.2*29
$GNGST,235713.00,0.224,1.291,0.567,6.3,1.284,0.581,2.139*4C
$GPGSV,4,1,14,26,33,050,35,9,40,314,39,3,54,187,42,23,68,354,49*75
$GPGSV,4,2,14,16,56,082,42,7,28,256,48,6,8,295,34*75
$GLGSV,4,3,14,73,52,023,46,74,62,248,52,72,44,331,44,71,78,112,47*65
$GAGSV,4,4,14,19,82,349,43,1,45,220,37,4,24,315,36*52
$GNRMC,235713.00,A,3403.47143216,N,11711.80816564,W,0.547,233.151,201217,12.0184,E,D*36
$GNVTG,233.15,T,221.13,M,0.55,N,1.01,K,D*3D
$GNZDA,235713.04,20,12,2017,00,00*78
$GNGGA,235714.00,3403.47131369,N,11711.80847586,W,2,10,1.6,401.413,M,-32.133,M,1.0,0000*65
$PTNL,GGK,235714.00,122017,3403.47131369,N,11711.80847586,W,4,10,3.6,EHT369.280,M*6E
$GNGLL,3403.47131369,N,11711.80847586,W,235714.00,A,D*61
$GNGNS,235714.00,3403.47131369,N,11711.80847586,W,DDNNN,10,1.6,401.413,-32.133,,*2D
$GPGNS,235714.00,,,,,,6,,,,1.0,0*4C
$GLGNS,235714.00,,,,,,4,,,,1.0,0*52
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,3.6,1.6,3.2*10
$GNGSA,A,3,71,72,73,74,,,,,,,,,3.6,1.6,3.2*2B
$GNGST,235714.00,0.019,1.196,0.567,7.1,1.189,0.582,2.045*47
$GPGSV,4,1,14,26,33,050,42,9,40,314,41,3,54,187,44,23,68,354,51*75
$GPGSV,4,2,14,16,56,082,42,7,28,256,48,6,8,295,24*74
$GLGSV,4,3,14,73,52,023,46,74,62,248,53,72,44,331,48,71,78,112,49*66
$GAGSV,4,4,14,19,82,349,43,1,45,220,39,4,24,315,31*5B
$GNRMC,235714.00,A,3403.47131369,N,11711.80847586,W,0.974,241.523,201217,12.0184,E,D*3D
$GNVTG,241.52,T,229.50,M,0.97,N,1.80,K,D*33
$GNZDA,235714.04,20,12,2017,00,00*7F
$GNGGA,235715.00,3403.47121040,N,11711.80878910,W,2,10,1.6,401.771,M,-32.133,M,2.0,0000*66
$PTNL,GGK,235715.00,122017,3403.47121040,N,11711.80878910,W,4,10,3.6,EHT369.639,M*6F
$GNGLL,3403.47121040,N,11711.80878910,W,235715.00,A,D*66
$GNGNS,235715.00,3403.47121040,N,11711.80878910,W,DDNNN,10,1.6,401.771,-32.133,,*2D
$GPGNS,235715.00,,,,,,6,,,,2.0,0*4E
$GLGNS,235715.00,,,,,,4,,,,2.0,0*50
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,3.6,1.6,3.2*10
$GNGSA,A,3,71,72,73,74,,,,,,,,,3.6,1.6,3.2*2B
$GNGST,235715.00,0.009,0.851,0.519,15.6,0.831,0.550,1.657*7B
$GPGSV,4,1,14,26,33,050,41,9,40,314,47,3,54,187,44,23,68,354,49*79
$GPGSV,4,2,14,16,56,082,46,7,28,256,46,6,8,295,24*7E
$GLGSV,4,3,14,73,52,023,46,74,62,248,52,72,44,331,43,71,78,112,50*64
$GAGSV,4,4,14,19,82,349,42,1,45,220,37,4,24,315,35*50
$GNRMC,235715.00,A,3403.47121040,N,11711.80878910,W,0.867,245.712,201217,12.0184,E,D*3D
$GNVTG,245.71,T,233.69,M,0.87,N,1.61,K,D*39
$GNZDA,235715.04,20,12,2017,00,00*7E
$GNGGA,235716.00,3403.47123240,N,11711.80919545,W,2,10,1.4,402.394,M,-32.133,M,1.0,0000*62
$PTNL,GGK,235716.00,122017,3403.47123240,N,11711.80919545,W,4,10,2.6,EHT370.261,M*66
$GNGLL,3403.47123240,N,11711.80919545,W,235716.00,A,D*6F
$GNGNS,235716.00,3403.47123240,N,11711.80919545,W,DDNNN,10,1.4,402.394,-32.133,,*2A
$GPGNS,235716.00,,,,,,6,,,,1.0,0*4E
$GLGNS,235716.00,,,,,,4,,,,1.0,0*50
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.6,1.4,2.2*12
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.6,1.4,2.2*29
$GNGST,235716.00,1.149,0.933,0.525,10.4,0.922,0.543,1.706*75
$GPGSV,4,1,14,26,33,050,41,9,40,314,44,3,54,187,43,23,68,354,50*75
$GPGSV,4,2,14,16,56,082,45,7,28,256,49,6,8,295,25*73
$GLGSV,4,3,14,73,52,023,48,74,62,248,49,72,44,331,42,71,78,112,50*61
$GAGSV,4,4,14,19,82,349,44,1,45,220,41,4,24,315,34*56
$GNRMC,235716.00,A,3403.47123240,N,11711.80919545,W,1.041,279.693,201217,12.0184,E,D*3E
$GNVTG,279.69,T,267.67,M,1.04,N,1.93,K,D*37
$GNZDA,235716.04,20,12,2017,00,00*7D
$GNGGA,235717.00,3403.47122464,N,11711.80959051,W,2,10,1.1,402.830,M,-32.133,M,1.0,0000*66
$PTNL,GGK,235717.00,122017,3403.47122464,N,11711.80959051,W,4,10,2.5,EHT370.697,M*6C
$GNGLL,3403.47122464,N,11711.80959051,W,235717.00,A,D*6B
$GNGNS,235717.00,3403.47122464,N,11711.80959051,W,DDNNN,10,1.1,402.830,-32.133,,*2E
$GPGNS,235717.00,,,,,,6,,,,1.0,0*4F
$GLGNS,235717.00,,,,,,4,,,,1.0,0*51
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,2.5,1.1,2.2*14
$GNGSA,A,3,71,72,73,74,,,,,,,,,2.5,1.1,2.2*2F
$GNGST,235717.00,1.067,0.652,0.509,170.5,0.649,0.513,1.360*4A
$GPGSV,4,1,14,26,33,050,39,9,40,314,44,3,54,187,42,23,68,354,49*73
$GPGSV,4,2,14,16,56,082,46,7,28,256,48,6,8,295,36*73
$GLGSV,4,3,14,73,52,023,47,74,62,248,50,72,44,331,43,71,78,112,49*6F
$GAGSV,4,4,14,19,82,349,44,1,45,220,44,4,25,315,37*51
$GNRMC,235717.00,A,3403.47122464,N,11711.80959051,W,1.097,253.709,201217,12.0184,E,D*3B
$GNVTG,253.71,T,241.69,M,1.10,N,2.03,K,D*33
$GNZDA,235717.04,20,12,2017,00,00*7C
$GNGGA,235718.00,3403.47114250,N,11711.80972779,W,2,10,1.4,402.377,M,-32.133,M,2.0,0000*67
$PTNL,GGK,235718.00,122017,3403.47114250,N,11711.80972779,W,4,10,3.5,EHT370.245,M*69
$GNGLL,3403.47114250,N,11711.80972779,W,235718.00,A,D*64
$GNGNS,235718.00,3403.47114250,N,11711.80972779,W,DDNNN,10,1.4,402.377,-32.133,,*2C
$GPGNS,235718.00,,,,,,6,,,,2.0,0*43
$GLGNS,235718.00,,,,,,4,,,,2.0,0*5D
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,3.5,1.4,3.2*11
$GNGSA,A,3,71,72,73,74,,,,,,,,,3.5,1.4,3.2*2A
$GNGST,235718.00,0.129,0.560,0.528,152.7,0.554,0.535,1.455*46
$GPGSV,4,1,14,26,33,050,38,9,40,314,47,3,54,187,41,23,68,354,47*7C
$GPGSV,4,2,14,16,56,082,47,7,28,256,48,6,8,295,38*7C
$GLGSV,4,3,14,73,52,023,48,74,62,248,49,72,44,331,47,71,78,112,50*64
$GAGSV,4,4,14,19,82,349,43,1,45,220,42,4,25,315,42*52
$GNRMC,235718.00,A,3403.47114250,N,11711.80972779,W,1.874,197.563,201217,12.0184,E,D*34
$GNVTG,197.56,T,185.54,M,1.87,N,3.47,K,D*37
$GNZDA,235718.04,20,12,2017,00,00*73
$GNGGA,235719.00,3403.47068778,N,11711.80950154,W,2,10,1.4,402.411,M,-32.133,M,1.0,0000*6E
$PTNL,GGK,235719.00,122017,3403.47068778,N,11711.80950154,W,4,10,3.5,EHT370.278,M*6A
$GNGLL,3403.47068778,N,11711.80950154,W,235719.00,A,D*69
$GNGNS,235719.00,3403.47068778,N,11711.80950154,W,DDNNN,10,1.4,402.411,-32.133,,*26
$GPGNS,235719.00,,,,,,6,,,,1.0,0*41
$GLGNS,235719.00,,,,,,4,,,,1.0,0*5F
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,3.5,1.4,3.2*11
$GNGSA,A,3,71,72,73,74,,,,,,,,,3.5,1.4,3.2*2A
$GNGST,235719.00,0.145,1.154,0.540,7.5,1.146,0.556,2.034*41
$GPGSV,4,1,14,26,33,050,45,9,40,314,42,3,54,187,33,23,68,354,46*77
$GPGSV,4,2,14,16,56,082,48,7,28,256,50,6,8,295,34*76
$GLGSV,4,3,14,73,52,023,48,74,62,248,51,72,44,331,41,71,78,112,48*62
$GAGSV,4,4,14,19,82,349,42,1,45,220,28,4,25,315,32*58
$GNRMC,235719.00,A,3403.47068778,N,11711.80950154,W,2.065,154.675,201217,12.0184,E,D*39
$GNVTG,154.67,T,142.65,M,2.06,N,3.82,K,D*30
$GNZDA,235719.04,20,12,2017,00,00*72
$GNGGA,235720.00,3403.47007871,N,11711.80931237,W,2,10,1.4,402.401,M,-32.133,M,2.0,0000*68
$PTNL,GGK,235720.00,122017,3403.47007871,N,11711.80931237,W,4,10,3.5,EHT370.269,M*6E
$GNGLL,3403.47007871,N,11711.80931237,W,235720.00,A,D*6D
$GNGNS,235720.00,3403.47007871,N,11711.80931237,W,DDNNN,10,1.4,402.401,-32.133,,*23
$GPGNS,235720.00,,,,,,6,,,,2.0,0*48
$GLGNS,235720.00,,,,,,4,,,,2.0,0*56
$GNGSA,A,3,3,7,16,23,9,26,,,,,,,3.5,1.4,3.2*11
$GNGSA,A,3,71,72,73,74,,,,,,,,,3.5,1.4,3.2*2A
$GNGST,235720.00,0.094,1.479,0.673,24.1,1.379,0.861,3.056*78
$GPGSV,4,1,14,26,33,050,45,9,40,314,41,3,54,187,26,23,68,354,49*7F
$GPGSV,4,2,14,16,56,082,50,7,28,256,37,6,8,295,33*79
$GLGSV,4,3,14,73,52,023,47,74,62,248,37,72,44,331,35,71,78,112,44*62
$GAGSV,4,4,14,19,82,349,40,1,45,220,,4,25,315,33*51
$GNRMC,235720.00,A,3403.47007871,N,11711.80931237,W,1.554,172.732,201217,12.0184,E,D*3F
$GNVTG,172.73,T,160.71,M,1.55,N,2.88,K,D*3A
$GNZDA,235720.04,20,12,2017,00,00*78

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="C:\GitHub\dotMorten\NmeaParser\src\packages\MSTest.TestAdapter.1.2.0\build\net45\MSTest.TestAdapter.props" Condition="Exists('C:\GitHub\dotMorten\NmeaParser\src\packages\MSTest.TestAdapter.1.2.0\build\net45\MSTest.TestAdapter.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{170EE734-37F0-425F-822B-B865348ECEC6}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NmeaParser.Tests.NET45</RootNamespace>
<AssemblyName>NmeaParser.Tests.NET45</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestFramework">
<Version>1.2.0</Version>
</PackageReference>
<PackageReference Include="MSTest.TestAdapter">
<Version>1.2.0</Version>
</PackageReference>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\NmeaParser\NmeaParser.csproj">
<Project>{1adc3666-1ddb-48c4-9811-1e58b6d09a7c}</Project>
<Name>NmeaParser</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="..\..\NmeaSampleData.txt">
<Link>NmeaSampleData.txt</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="..\..\TrimbleR2SampleData.txt">
<Link>TrimbleR2SampleData.txt</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<Import Project="..\NmeaParser.Tests\NmeaParser.Tests.projitems" Label="Shared" />
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View file

@ -0,0 +1,20 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("NmeaParser.Tests.NET45")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NmeaParser.Tests.NET45")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("170ee734-37f0-425f-822b-b865348ecec6")]
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View file

@ -116,6 +116,9 @@
<Content Include="..\..\NmeaSampleData.txt">
<Link>NmeaSampleData.txt</Link>
</Content>
<Content Include="..\..\TrimbleR2SampleData.txt">
<Link>TrimbleR2SampleData.txt</Link>
</Content>
<Content Include="Properties\UnitTestApp.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" />

View file

@ -23,6 +23,7 @@ using NmeaParser.Nmea.Gps;
using System.Threading.Tasks;
using System.IO;
using NmeaParser.Nmea.Gnss;
using NmeaParser.Nmea.Glonass;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace NmeaParser.Tests
@ -30,77 +31,109 @@ namespace NmeaParser.Tests
[TestClass]
public class NmeaMessages
{
[TestMethod]
public async Task ParseNmeaFile()
{
var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///NmeaSampleData.txt"));
System.IO.StreamReader reader = new System.IO.StreamReader(await file.OpenStreamForReadAsync());
while(!reader.EndOfStream)
{
var line = reader.ReadLine();
if (line.StartsWith("$"))
{
var msg = NmeaMessage.Parse(line);
Assert.IsNotNull(msg);
var idx = line.IndexOf('*');
if (idx >= 0)
{
byte checksum = (byte)Convert.ToInt32(line.Substring(idx + 1), 16);
Assert.AreEqual(checksum, msg.Checksum);
}
Assert.IsNotInstanceOfType(msg, typeof(Nmea.UnknownMessage), "Type " + msg.MessageType + " not supported");
}
}
}
[TestMethod]
public async Task ParseNmeaFile()
{
#if NETFX_CORE
var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///NmeaSampleData.txt"));
System.IO.StreamReader reader = new System.IO.StreamReader(await file.OpenStreamForReadAsync());
#else
System.IO.StreamReader reader = new System.IO.StreamReader("NmeaSampleData.txt");
#endif
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (line.StartsWith("$"))
{
var msg = NmeaMessage.Parse(line);
Assert.IsNotNull(msg);
var idx = line.IndexOf('*');
if (idx >= 0)
{
byte checksum = (byte)Convert.ToInt32(line.Substring(idx + 1), 16);
Assert.AreEqual(checksum, msg.Checksum);
}
Assert.IsNotInstanceOfType(msg, typeof(Nmea.UnknownMessage), "Type " + msg.MessageType + " not supported");
}
}
}
[TestMethod]
public async Task ParseTrimbleR2NmeaFile()
{
#if NETFX_CORE
var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///TrimbleR2SampleData.txt"));
System.IO.StreamReader reader = new System.IO.StreamReader(await file.OpenStreamForReadAsync());
#else
System.IO.StreamReader reader = new System.IO.StreamReader("TrimbleR2SampleData.txt");
#endif
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (line.StartsWith("$"))
{
var msg = NmeaMessage.Parse(line);
Assert.IsNotNull(msg);
var idx = line.IndexOf('*');
if (idx >= 0)
{
byte checksum = (byte)Convert.ToInt32(line.Substring(idx + 1), 16);
Assert.AreEqual(checksum, msg.Checksum);
}
if (msg.MessageType == "PTNL" || msg.MessageType == "GNVTG" || msg.MessageType == "GNZDA")
continue; //TODO
Assert.IsNotInstanceOfType(msg, typeof(Nmea.UnknownMessage), "Type " + msg.MessageType + " not supported");
}
}
}
[TestMethod]
public void TestGprmb_Empty()
{
string input = "$GPRMB,A,,,,,,,,,,,,A,A*0B";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gprmb));
Gprmb rmb = (Gprmb)msg;
Assert.AreEqual(true, rmb.Arrived);
Assert.AreEqual(double.NaN, rmb.CrossTrackError);
Assert.AreEqual(double.NaN, rmb.DestinationLatitude);
Assert.AreEqual(double.NaN, rmb.DestinationLongitude);
Assert.AreEqual(0, rmb.DestinationWaypointId);
Assert.AreEqual(0, rmb.OriginWaypointId);
Assert.AreEqual(double.NaN, rmb.RangeToDestination);
Assert.AreEqual(Gprmb.DataStatus.Ok, rmb.Status);
Assert.AreEqual(double.NaN, rmb.TrueBearing);
Assert.AreEqual(double.NaN, rmb.Velocity);
}
[TestMethod]
public void TestGprmb_Empty()
{
string input = "$GPRMB,A,,,,,,,,,,,,A,A*0B";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gprmb));
Gprmb rmb = (Gprmb)msg;
Assert.AreEqual(true, rmb.Arrived);
Assert.AreEqual(double.NaN, rmb.CrossTrackError);
Assert.AreEqual(double.NaN, rmb.DestinationLatitude);
Assert.AreEqual(double.NaN, rmb.DestinationLongitude);
Assert.AreEqual(0, rmb.DestinationWaypointId);
Assert.AreEqual(0, rmb.OriginWaypointId);
Assert.AreEqual(double.NaN, rmb.RangeToDestination);
Assert.AreEqual(Gprmb.DataStatus.Ok, rmb.Status);
Assert.AreEqual(double.NaN, rmb.TrueBearing);
Assert.AreEqual(double.NaN, rmb.Velocity);
}
[TestMethod]
public void TestGprmb()
{
string input = "$GPRMB,A,0.66,L,003,004,4917.24,S,12309.57,W,001.3,052.5,000.5,V*3D";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gprmb));
Gprmb rmb = (Gprmb)msg;
Assert.AreEqual(Gprmb.DataStatus.Ok, rmb.Status);
Assert.AreEqual(-.66, rmb.CrossTrackError);
Assert.AreEqual(3, rmb.OriginWaypointId);
Assert.AreEqual(4, rmb.DestinationWaypointId);
Assert.AreEqual(-49.287333333333333333, rmb.DestinationLatitude);
Assert.AreEqual(-123.1595, rmb.DestinationLongitude);
Assert.AreEqual(1.3, rmb.RangeToDestination);
Assert.AreEqual(52.5, rmb.TrueBearing);
Assert.AreEqual(.5, rmb.Velocity);
Assert.AreEqual(false, rmb.Arrived);
}
[TestMethod]
public void TestGprmb()
{
string input = "$GPRMB,A,0.66,L,003,004,4917.24,S,12309.57,W,001.3,052.5,000.5,V*3D";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gprmb));
Gprmb rmb = (Gprmb)msg;
Assert.AreEqual(Gprmb.DataStatus.Ok, rmb.Status);
Assert.AreEqual(-.66, rmb.CrossTrackError);
Assert.AreEqual(3, rmb.OriginWaypointId);
Assert.AreEqual(4, rmb.DestinationWaypointId);
Assert.AreEqual(-49.287333333333333333, rmb.DestinationLatitude);
Assert.AreEqual(-123.1595, rmb.DestinationLongitude);
Assert.AreEqual(1.3, rmb.RangeToDestination);
Assert.AreEqual(52.5, rmb.TrueBearing);
Assert.AreEqual(.5, rmb.Velocity);
Assert.AreEqual(false, rmb.Arrived);
}
[TestMethod]
public void TestGprmc()
{
string input = "$GPRMC,123519,A,4807.038,S,01131.000,W,022.4,084.4,230313,003.1,W*6A";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gprmc));
Gprmc rmc = (Gprmc)msg;
Assert.AreEqual(new DateTime(2013, 03, 23, 12, 35, 19, DateTimeKind.Utc), rmc.FixTime);
Assert.AreEqual(-48.1173, rmc.Latitude);
Assert.AreEqual(-11.516666666666667, rmc.Longitude, 0.0000000001);
string input = "$GPRMC,123519,A,4807.038,S,01131.000,W,022.4,084.4,230313,003.1,W*6A";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gprmc));
Gprmc rmc = (Gprmc)msg;
Assert.AreEqual(new DateTime(2013, 03, 23, 12, 35, 19, DateTimeKind.Utc), rmc.FixTime);
Assert.AreEqual(-48.1173, rmc.Latitude);
Assert.AreEqual(-11.516666666666667, rmc.Longitude, 0.0000000001);
}
[TestMethod]
@ -121,23 +154,23 @@ namespace NmeaParser.Tests
}
[TestMethod]
public void TestGpgga()
{
string input = "$GPGGA,235236,3925.9479,N,11945.9211,W,1,10,0.8,1378.0,M,-22.1,M,,*46";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgga));
Gpgga gga = (Gpgga)msg;
Assert.AreEqual(new TimeSpan(23, 52, 36), gga.FixTime);
Assert.AreEqual(39.432465, gga.Latitude);
Assert.AreEqual(-119.7653516666666667, gga.Longitude, 0.0000000001);
Assert.AreEqual(NmeaParser.Nmea.Gps.Gpgga.FixQuality.GpsFix, gga.Quality);
Assert.AreEqual(10, gga.NumberOfSatellites);
Assert.AreEqual(.8, gga.Hdop);
Assert.AreEqual(1378, gga.Altitude);
Assert.AreEqual("M", gga.AltitudeUnits);
Assert.AreEqual(-22.1, gga.HeightOfGeoid);
Assert.AreEqual("M", gga.HeightOfGeoidUnits);
Assert.AreEqual(-1, gga.DgpsStationId);
public void TestGpgga()
{
string input = "$GPGGA,235236,3925.9479,N,11945.9211,W,1,10,0.8,1378.0,M,-22.1,M,,*46";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgga));
Gpgga gga = (Gpgga)msg;
Assert.AreEqual(new TimeSpan(23, 52, 36), gga.FixTime);
Assert.AreEqual(39.432465, gga.Latitude);
Assert.AreEqual(-119.7653516666666667, gga.Longitude, 0.0000000001);
Assert.AreEqual(NmeaParser.Nmea.Gps.Gpgga.FixQuality.GpsFix, gga.Quality);
Assert.AreEqual(10, gga.NumberOfSatellites);
Assert.AreEqual(.8, gga.Hdop);
Assert.AreEqual(1378, gga.Altitude);
Assert.AreEqual("M", gga.AltitudeUnits);
Assert.AreEqual(-22.1, gga.HeightOfGeoid);
Assert.AreEqual("M", gga.HeightOfGeoidUnits);
Assert.AreEqual(-1, gga.DgpsStationId);
Assert.AreEqual(TimeSpan.MaxValue, gga.TimeSinceLastDgpsUpdate);
}
@ -163,144 +196,269 @@ namespace NmeaParser.Tests
}
[TestMethod]
public void TestPtlna()
{
string input = "$PTNLA,HV,002.94,M,288.1,D,008.6,D,002.98,M*74";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(NmeaParser.Nmea.LaserRange.Trimble.Ptnla));
NmeaParser.Nmea.LaserRange.Trimble.Ptnla ptlna = (NmeaParser.Nmea.LaserRange.Trimble.Ptnla)msg;
Assert.AreEqual(2.94, ptlna.HorizontalDistance);
Assert.AreEqual('M', ptlna.HorizontalDistanceUnits);
Assert.AreEqual(288.1, ptlna.HorizontalAngle);
Assert.AreEqual('D', ptlna.HorizontalAngleUnits);
Assert.AreEqual(8.6, ptlna.VerticalAngle);
Assert.AreEqual('D', ptlna.VerticalAngleUnits);
Assert.AreEqual(2.98, ptlna.SlopeDistance);
Assert.AreEqual('M', ptlna.SlopeDistanceUnits);
}
public void TestPtlna()
{
string input = "$PTNLA,HV,002.94,M,288.1,D,008.6,D,002.98,M*74";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(NmeaParser.Nmea.LaserRange.Trimble.Ptnla));
NmeaParser.Nmea.LaserRange.Trimble.Ptnla ptlna = (NmeaParser.Nmea.LaserRange.Trimble.Ptnla)msg;
Assert.AreEqual(2.94, ptlna.HorizontalDistance);
Assert.AreEqual('M', ptlna.HorizontalDistanceUnits);
Assert.AreEqual(288.1, ptlna.HorizontalAngle);
Assert.AreEqual('D', ptlna.HorizontalAngleUnits);
Assert.AreEqual(8.6, ptlna.VerticalAngle);
Assert.AreEqual('D', ptlna.VerticalAngleUnits);
Assert.AreEqual(2.98, ptlna.SlopeDistance);
Assert.AreEqual('M', ptlna.SlopeDistanceUnits);
}
[TestMethod]
public void TestPgrme()
{
string input = "$PGRME,2.3,M,3.3,M,4.0,M*2B";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(NmeaParser.Nmea.Gps.Garmin.Pgrme));
NmeaParser.Nmea.Gps.Garmin.Pgrme rme = (NmeaParser.Nmea.Gps.Garmin.Pgrme)msg;
Assert.AreEqual(2.3, rme.HorizontalError);
Assert.AreEqual("M", rme.HorizontalErrorUnits);
Assert.AreEqual(3.3, rme.VerticalError);
Assert.AreEqual("M", rme.VerticalErrorUnits);
Assert.AreEqual(4.0, rme.SphericalError);
Assert.AreEqual("M", rme.SphericalErrorUnits);
}
[TestMethod]
public void TestPgrme()
{
string input = "$PGRME,2.3,M,3.3,M,4.0,M*2B";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(NmeaParser.Nmea.Gps.Garmin.Pgrme));
NmeaParser.Nmea.Gps.Garmin.Pgrme rme = (NmeaParser.Nmea.Gps.Garmin.Pgrme)msg;
Assert.AreEqual(2.3, rme.HorizontalError);
Assert.AreEqual("M", rme.HorizontalErrorUnits);
Assert.AreEqual(3.3, rme.VerticalError);
Assert.AreEqual("M", rme.VerticalErrorUnits);
Assert.AreEqual(4.0, rme.SphericalError);
Assert.AreEqual("M", rme.SphericalErrorUnits);
}
[TestMethod]
public void TestGpgsa_Empty()
{
string input = "$GPGSA,A,3,,,,,,16,18,,22,24,,,,,*14";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgsa));
Gpgsa gsa = (Gpgsa)msg;
Assert.AreEqual(Gpgsa.ModeSelection.Auto, gsa.GpsMode);
Assert.AreEqual(Gpgsa.Mode.Fix3D, gsa.FixMode);
Assert.AreEqual(4, gsa.SVs.Count);
Assert.AreEqual(16, gsa.SVs[0]);
Assert.AreEqual(18, gsa.SVs[1]);
Assert.AreEqual(22, gsa.SVs[2]);
Assert.AreEqual(24, gsa.SVs[3]);
Assert.AreEqual(double.NaN, gsa.Pdop);
Assert.AreEqual(double.NaN, gsa.Hdop);
Assert.AreEqual(double.NaN, gsa.Vdop);
}
[TestMethod]
public void TestGpgsa()
{
string input = "$GPGSA,M,2,19,28,14,18,27,22,31,39,40,42,43,44,1.7,1.0,1.3*3C";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgsa));
Gpgsa gsa = (Gpgsa)msg;
Assert.AreEqual(Gpgsa.ModeSelection.Manual, gsa.GpsMode);
Assert.AreEqual(Gpgsa.Mode.Fix2D, gsa.FixMode);
Assert.AreEqual(12, gsa.SVs.Count);
Assert.AreEqual(19, gsa.SVs[0]);
Assert.AreEqual(28, gsa.SVs[1]);
Assert.AreEqual(14, gsa.SVs[2]);
Assert.AreEqual(18, gsa.SVs[3]);
Assert.AreEqual(27, gsa.SVs[4]);
Assert.AreEqual(22, gsa.SVs[5]);
Assert.AreEqual(31, gsa.SVs[6]);
Assert.AreEqual(39, gsa.SVs[7]);
Assert.AreEqual(40, gsa.SVs[8]);
Assert.AreEqual(42, gsa.SVs[9]);
Assert.AreEqual(43, gsa.SVs[10]);
Assert.AreEqual(44, gsa.SVs[11]);
Assert.AreEqual(1.7, gsa.Pdop);
Assert.AreEqual(1.0, gsa.Hdop);
Assert.AreEqual(1.3, gsa.Vdop);
}
[TestMethod]
public void TestGpgsa_Empty()
{
string input = "$GPGSA,A,3,,,,,,16,18,,22,24,,,,,*14";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgsa));
Gpgsa gsa = (Gpgsa)msg;
Assert.AreEqual(Gpgsa.ModeSelection.Auto, gsa.GpsMode);
Assert.AreEqual(Gpgsa.Mode.Fix3D, gsa.FixMode);
Assert.AreEqual(4, gsa.SVs.Count);
Assert.AreEqual(16, gsa.SVs[0]);
Assert.AreEqual(18, gsa.SVs[1]);
Assert.AreEqual(22, gsa.SVs[2]);
Assert.AreEqual(24, gsa.SVs[3]);
Assert.AreEqual(double.NaN, gsa.Pdop);
Assert.AreEqual(double.NaN, gsa.Hdop);
Assert.AreEqual(double.NaN, gsa.Vdop);
}
[TestMethod]
public void TestGpgsv()
{
string input = "$GPGSV,3,3,11,22,42,067,42,75,14,311,43,50,05,244,00,,,,*49";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgsv));
Gpgsv gsv = (Gpgsv)msg;
Assert.AreEqual(3, gsv.TotalMessages);
Assert.AreEqual(3, gsv.MessageNumber);
Assert.AreEqual(11, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(3, gsv.SVs.Count);
var sv = gsv.SVs[0];
Assert.AreEqual(22, sv.PrnNumber);
Assert.AreEqual(42, sv.Elevation);
Assert.AreEqual(67, sv.Azimuth);
Assert.AreEqual(42, sv.SignalToNoiseRatio);
Assert.AreEqual(SatelliteSystem.Gps, sv.System);
[TestMethod]
public void TestGpgsa()
{
string input = "$GPGSA,M,2,19,28,14,18,27,22,31,39,40,42,43,44,1.7,1.0,1.3*3C";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgsa));
Gpgsa gsa = (Gpgsa)msg;
Assert.AreEqual(Gpgsa.ModeSelection.Manual, gsa.GpsMode);
Assert.AreEqual(Gpgsa.Mode.Fix2D, gsa.FixMode);
Assert.AreEqual(12, gsa.SVs.Count);
Assert.AreEqual(19, gsa.SVs[0]);
Assert.AreEqual(28, gsa.SVs[1]);
Assert.AreEqual(14, gsa.SVs[2]);
Assert.AreEqual(18, gsa.SVs[3]);
Assert.AreEqual(27, gsa.SVs[4]);
Assert.AreEqual(22, gsa.SVs[5]);
Assert.AreEqual(31, gsa.SVs[6]);
Assert.AreEqual(39, gsa.SVs[7]);
Assert.AreEqual(40, gsa.SVs[8]);
Assert.AreEqual(42, gsa.SVs[9]);
Assert.AreEqual(43, gsa.SVs[10]);
Assert.AreEqual(44, gsa.SVs[11]);
Assert.AreEqual(1.7, gsa.Pdop);
Assert.AreEqual(1.0, gsa.Hdop);
Assert.AreEqual(1.3, gsa.Vdop);
}
sv = gsv.SVs[1];
Assert.AreEqual(75, sv.PrnNumber);
Assert.AreEqual(14, sv.Elevation);
Assert.AreEqual(311, sv.Azimuth);
Assert.AreEqual(43, sv.SignalToNoiseRatio);
Assert.AreEqual(SatelliteSystem.Glonass, sv.System);
[TestMethod]
public void TestGngsa()
{
string input = "$GNGSA,A,3,3,7,16,23,9,26,,,,,,,3.5,1.4,3.2*11";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gngsa));
Gngsa gsa = (Gngsa)msg;
Assert.AreEqual(Gpgsa.ModeSelection.Auto, gsa.GpsMode);
Assert.AreEqual(Gpgsa.Mode.Fix3D, gsa.FixMode);
Assert.AreEqual(6, gsa.SVs.Count);
Assert.AreEqual(3, gsa.SVs[0]);
Assert.AreEqual(7, gsa.SVs[1]);
Assert.AreEqual(16, gsa.SVs[2]);
Assert.AreEqual(23, gsa.SVs[3]);
Assert.AreEqual(9, gsa.SVs[4]);
Assert.AreEqual(26, gsa.SVs[5]);
Assert.AreEqual(3.5, gsa.Pdop);
Assert.AreEqual(1.4, gsa.Hdop);
Assert.AreEqual(3.2, gsa.Vdop);
}
sv = gsv.SVs[2];
Assert.AreEqual(50, sv.PrnNumber);
Assert.AreEqual(5, sv.Elevation);
Assert.AreEqual(244, sv.Azimuth);
Assert.AreEqual(00, sv.SignalToNoiseRatio);
Assert.AreEqual(SatelliteSystem.Waas, sv.System);
}
[TestMethod]
public void TestGpgsv()
{
string input = "$GPGSV,3,3,11,22,42,067,42,75,14,311,43,50,05,244,00,,,,*49";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgsv));
Gpgsv gsv = (Gpgsv)msg;
Assert.AreEqual(3, gsv.TotalMessages);
Assert.AreEqual(3, gsv.MessageNumber);
Assert.AreEqual(11, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(3, gsv.SVs.Count);
var sv = gsv.SVs[0];
Assert.AreEqual(22, sv.PrnNumber);
Assert.AreEqual(42, sv.Elevation);
Assert.AreEqual(67, sv.Azimuth);
Assert.AreEqual(42, sv.SignalToNoiseRatio);
Assert.AreEqual(SatelliteSystem.Gps, sv.System);
[TestMethod]
public void TestGpgsv_Empty()
{
string input = "$GPGSV,1,1,0,,,,,,,,,,,,,,,,*49";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgsv));
Gpgsv gsv = (Gpgsv)msg;
Assert.AreEqual(1, gsv.TotalMessages);
Assert.AreEqual(1, gsv.MessageNumber);
Assert.AreEqual(0, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(0, gsv.SVs.Count);
}
sv = gsv.SVs[1];
Assert.AreEqual(75, sv.PrnNumber);
Assert.AreEqual(14, sv.Elevation);
Assert.AreEqual(311, sv.Azimuth);
Assert.AreEqual(43, sv.SignalToNoiseRatio);
Assert.AreEqual(SatelliteSystem.Glonass, sv.System);
[TestMethod]
public void TestGpgll()
{
string input = "$GPGLL,4916.45,N,12311.12,W,225444.12,A,*30";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgll));
Gpgll gll = (Gpgll)msg;
Assert.IsTrue(gll.DataActive);
Assert.AreEqual(49.2741666666666666667, gll.Latitude);
Assert.AreEqual(-123.18533333333333333, gll.Longitude);
Assert.AreEqual(new TimeSpan(0,22,54,44,120), gll.FixTime);
}
sv = gsv.SVs[2];
Assert.AreEqual(50, sv.PrnNumber);
Assert.AreEqual(5, sv.Elevation);
Assert.AreEqual(244, sv.Azimuth);
Assert.AreEqual(00, sv.SignalToNoiseRatio);
Assert.AreEqual(SatelliteSystem.Waas, sv.System);
}
[TestMethod]
[TestMethod]
public void TestGpgsv_Empty()
{
string input = "$GPGSV,1,1,0,,,,,,,,,,,,,,,,*49";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgsv));
Gpgsv gsv = (Gpgsv)msg;
Assert.AreEqual(1, gsv.TotalMessages);
Assert.AreEqual(1, gsv.MessageNumber);
Assert.AreEqual(0, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(0, gsv.SVs.Count);
}
[TestMethod]
public void TestGpgll()
{
string input = "$GPGLL,4916.45,N,12311.12,W,225444.12,A,*30";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgll));
Gpgll gll = (Gpgll)msg;
Assert.IsTrue(gll.DataActive);
Assert.AreEqual(49.2741666666666666667, gll.Latitude);
Assert.AreEqual(-123.18533333333333333, gll.Longitude);
Assert.AreEqual(new TimeSpan(0, 22, 54, 44, 120), gll.FixTime);
}
[TestMethod]
public void TestGngll()
{
string input = "$GNGLL,3403.47121040,N,11711.80878910,W,235715.00,A,D*66";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gngll));
Gngll gll = (Gngll)msg;
Assert.IsTrue(gll.DataActive);
Assert.AreEqual(34.0578535066667, gll.Latitude, .000000000001);
Assert.AreEqual(-117.196813151667, gll.Longitude, .000000000001);
Assert.AreEqual(new TimeSpan(0, 23, 57, 15, 0), gll.FixTime);
}
[TestMethod]
public void TestGpgns()
{
string input = "$GPGNS,224749.00,3333.4268304,N,11153.3538273,W,D,19,0.6,406.110,-26.294,6.0,0138,S*6A";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgns));
Gpgns gns = (Gpgns)msg;
Assert.AreEqual(new TimeSpan(0, 22, 47, 49, 0), gns.FixTime);
Assert.AreEqual(33.55711384, gns.Latitude, .000000000001);
Assert.AreEqual(-111.889230455, gns.Longitude, .000000000001);
Assert.AreEqual(Gns.Mode.Differential, gns.GpsModeIndicator);
Assert.AreEqual(Gns.Mode.NoFix, gns.GlonassModeIndicator);
Assert.AreEqual(0, gns.FutureModeIndicator.Length);
Assert.AreEqual(19, gns.NumberOfSatellites);
Assert.AreEqual(.6, gns.Hdop);
Assert.AreEqual(406.110, gns.OrhometricHeight);
Assert.AreEqual(-26.294, gns.GeoidalSeparation);
Assert.AreEqual("0138", gns.DgpsStationId);
Assert.AreEqual(Gns.NavigationalStatus.Safe, gns.Status);
Assert.AreEqual(TimeSpan.FromSeconds(6), gns.TimeSinceLastDgpsUpdate);
}
[TestMethod]
public void TestGpgns_NoData()
{
string input = "$GPGNS,235720.00,,,,,,6,,,,2.0,0*48";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gpgns));
Gpgns gns = (Gpgns)msg;
Assert.AreEqual(new TimeSpan(0, 23, 57, 20, 0), gns.FixTime);
Assert.AreEqual(double.NaN, gns.Latitude);
Assert.AreEqual(double.NaN, gns.Longitude);
Assert.AreEqual(Gns.Mode.NoFix, gns.GpsModeIndicator);
Assert.AreEqual(Gns.Mode.NoFix, gns.GlonassModeIndicator);
Assert.AreEqual(0, gns.FutureModeIndicator.Length);
Assert.AreEqual(6, gns.NumberOfSatellites);
Assert.AreEqual(double.NaN, gns.Hdop);
Assert.AreEqual(double.NaN, gns.OrhometricHeight);
Assert.AreEqual(double.NaN, gns.GeoidalSeparation);
Assert.AreEqual(TimeSpan.FromSeconds(2), gns.TimeSinceLastDgpsUpdate);
Assert.AreEqual("0", gns.DgpsStationId);
}
[TestMethod]
public void TestGngns()
{
string input = "$GNGNS,235719.00,3403.47068778,N,11711.80950154,W,DDNNN,10,1.4,402.411,-32.133,,*26";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gngns));
Gngns gns = (Gngns)msg;
Assert.AreEqual(new TimeSpan(0, 23, 57, 19, 0), gns.FixTime);
Assert.AreEqual(34.0578447963333, gns.Latitude, .000000000001);
Assert.AreEqual(-117.196825025667, gns.Longitude, .00000000001);
Assert.AreEqual(Gns.Mode.Differential, gns.GpsModeIndicator);
Assert.AreEqual(Gns.Mode.Differential, gns.GlonassModeIndicator);
Assert.AreEqual(3, gns.FutureModeIndicator.Length);
Assert.AreEqual(Gns.Mode.NoFix, gns.FutureModeIndicator[0]);
Assert.AreEqual(Gns.Mode.NoFix, gns.FutureModeIndicator[1]);
Assert.AreEqual(Gns.Mode.NoFix, gns.FutureModeIndicator[2]);
Assert.AreEqual(10, gns.NumberOfSatellites);
Assert.AreEqual(1.4, gns.Hdop);
Assert.AreEqual(402.411, gns.OrhometricHeight);
Assert.AreEqual(-32.133, gns.GeoidalSeparation);
Assert.AreEqual(TimeSpan.MaxValue, gns.TimeSinceLastDgpsUpdate);
Assert.AreEqual(null, gns.DgpsStationId);
}
[TestMethod]
public void TestGlgns()
{
string input = "$GLGNS,235720.00,,,,,,4,,,,2.0,0*56";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Glgns));
Glgns gns = (Glgns)msg;
Assert.AreEqual(new TimeSpan(0, 23, 57, 20, 0), gns.FixTime);
Assert.AreEqual(double.NaN, gns.Latitude);
Assert.AreEqual(double.NaN, gns.Longitude);
Assert.AreEqual(Gns.Mode.NoFix, gns.GpsModeIndicator);
Assert.AreEqual(Gns.Mode.NoFix, gns.GlonassModeIndicator);
Assert.AreEqual(0, gns.FutureModeIndicator.Length);
Assert.AreEqual(4, gns.NumberOfSatellites);
Assert.AreEqual(double.NaN, gns.Hdop);
Assert.AreEqual(double.NaN, gns.OrhometricHeight);
Assert.AreEqual(double.NaN, gns.GeoidalSeparation);
Assert.AreEqual(TimeSpan.FromSeconds(2), gns.TimeSinceLastDgpsUpdate);
}
[TestMethod]
public void TestGpgll_NoFixTime_OrActiveIndicator()
{
string input = "$GPGLL,3751.65,S,14507.36,E*77";