From ae865c120320e588b288e724c4c680e70648bd5f Mon Sep 17 00:00:00 2001 From: Daniel Vassdal Date: Tue, 2 Oct 2018 12:53:51 +0200 Subject: [PATCH] Add ZDA message --- src/NmeaParser/Nmea/Glonass/Glzda.cs | 8 ++++ src/NmeaParser/Nmea/Gnss/Gnzda.cs | 8 ++++ src/NmeaParser/Nmea/Gps/GPZDA.cs | 8 ++++ src/NmeaParser/Nmea/Zda.cs | 38 +++++++++++++++++++ .../NmeaParser.Tests/NmeaMessages.cs | 30 +++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 src/NmeaParser/Nmea/Glonass/Glzda.cs create mode 100644 src/NmeaParser/Nmea/Gnss/Gnzda.cs create mode 100644 src/NmeaParser/Nmea/Gps/GPZDA.cs create mode 100644 src/NmeaParser/Nmea/Zda.cs diff --git a/src/NmeaParser/Nmea/Glonass/Glzda.cs b/src/NmeaParser/Nmea/Glonass/Glzda.cs new file mode 100644 index 0000000..c0cb0fd --- /dev/null +++ b/src/NmeaParser/Nmea/Glonass/Glzda.cs @@ -0,0 +1,8 @@ +namespace NmeaParser.Nmea.Glonass +{ + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Glzda")] + [NmeaMessageType("GLZDA")] + public class Glzda : Zda + { + } +} diff --git a/src/NmeaParser/Nmea/Gnss/Gnzda.cs b/src/NmeaParser/Nmea/Gnss/Gnzda.cs new file mode 100644 index 0000000..00e96eb --- /dev/null +++ b/src/NmeaParser/Nmea/Gnss/Gnzda.cs @@ -0,0 +1,8 @@ +namespace NmeaParser.Nmea.Gnss +{ + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gnzda")] + [NmeaMessageType("GNZDA")] + public class Gnzda : Zda + { + } +} diff --git a/src/NmeaParser/Nmea/Gps/GPZDA.cs b/src/NmeaParser/Nmea/Gps/GPZDA.cs new file mode 100644 index 0000000..6ca6949 --- /dev/null +++ b/src/NmeaParser/Nmea/Gps/GPZDA.cs @@ -0,0 +1,8 @@ +namespace NmeaParser.Nmea.Gps +{ + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpzda")] + [NmeaMessageType("GPZDA")] + public class Gpzda : Zda + { + } +} diff --git a/src/NmeaParser/Nmea/Zda.cs b/src/NmeaParser/Nmea/Zda.cs new file mode 100644 index 0000000..7d2b851 --- /dev/null +++ b/src/NmeaParser/Nmea/Zda.cs @@ -0,0 +1,38 @@ +using System; +using System.Globalization; + +namespace NmeaParser.Nmea +{ + /// + /// Date and time of fix + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Zda")] + public abstract class Zda : NmeaMessage + { + /// + /// Called when the message is being loaded. + /// + /// The NMEA message values. + protected override void OnLoadMessage(string[] message) + { + if (message?.Length != 6) + { + throw new ArgumentException("Invalid GNGST", nameof(message)); + } + + var time = StringToTimeSpan(message[0]); + var day = int.Parse(message[1], CultureInfo.InvariantCulture); + var month = int.Parse(message[2], CultureInfo.InvariantCulture); + var year = int.Parse(message[3], CultureInfo.InvariantCulture); + + FixDateTime = new DateTime(year, month, day, time.Hours, time.Minutes, + time.Seconds, DateTimeKind.Utc); + + // Index 4 and 5 is used to specify a local time zone. + // However I haven't come across any receiver that actually + // specify this, so we're just ignoring it. + } + + public DateTime FixDateTime { get; private set; } + } +} diff --git a/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs b/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs index ef6da1e..23a375d 100644 --- a/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs +++ b/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs @@ -614,5 +614,35 @@ namespace NmeaParser.Tests Assert.AreEqual(0.0, vtg.SpeedInKnots); Assert.AreEqual(0.0, vtg.SpeedInKph); } + + [TestMethod] + public void TestGnzda() + { + var input = "$GNZDA,075451.00,02,10,2018,00,00*72"; + var msg = NmeaMessage.Parse(input); + Assert.IsInstanceOfType(msg, typeof(Gnzda)); + var zda = (Gnzda)msg; + Assert.AreEqual(new DateTime(2018, 10, 02, 07, 54, 51, 00, DateTimeKind.Utc), zda.FixDateTime); + } + + [TestMethod] + public void TestGpzda() + { + var input = "$GPZDA,143042.00,25,08,2005,,*6E"; + var msg = NmeaMessage.Parse(input); + Assert.IsInstanceOfType(msg, typeof(Gpzda)); + var zda = (Gpzda)msg; + Assert.AreEqual(new DateTime(2005, 08, 25, 14, 30, 42, 00, DateTimeKind.Utc), zda.FixDateTime); + } + + [TestMethod] + public void TestGlzda() + { + var input = "$GLZDA,225627.00,21,09,2015,00,00*70"; + var msg = NmeaMessage.Parse(input); + Assert.IsInstanceOfType(msg, typeof(Glzda)); + var zda = (Glzda)msg; + Assert.AreEqual(new DateTime(2015, 09, 21, 22, 56, 27, 00, DateTimeKind.Utc), zda.FixDateTime); + } } }