diff --git a/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs b/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs index 3c78958..8fdade3 100644 --- a/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs +++ b/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs @@ -76,12 +76,7 @@ namespace NmeaParser.Nmea.Gps AltitudeUnits = message[9]; HeightOfGeoid = NmeaMessage.StringToDouble(message[10]); HeightOfGeoidUnits = message[11]; - if (message[0].Length == 6) - { - TimeSinceLastDgpsUpdate = new TimeSpan(int.Parse(message[0].Substring(0, 2), CultureInfo.InvariantCulture), - int.Parse(message[0].Substring(2, 2), CultureInfo.InvariantCulture), - int.Parse(message[0].Substring(4, 2), CultureInfo.InvariantCulture)); - } + TimeSinceLastDgpsUpdate = StringToTimeSpan(message[0]); if (message[13].Length > 0) DgpsStationId = int.Parse(message[13], CultureInfo.InvariantCulture); else diff --git a/src/NmeaParser.Shared/Nmea/Gps/GPGLL.cs b/src/NmeaParser.Shared/Nmea/Gps/GPGLL.cs index 07e2b56..c5a2dc0 100644 --- a/src/NmeaParser.Shared/Nmea/Gps/GPGLL.cs +++ b/src/NmeaParser.Shared/Nmea/Gps/GPGLL.cs @@ -40,11 +40,9 @@ namespace NmeaParser.Nmea.Gps throw new ArgumentException("Invalid GPGLL", "message"); Latitude = NmeaMessage.StringToLatitude(message[0], message[1]); Longitude = NmeaMessage.StringToLongitude(message[2], message[3]); - if (message.Length >= 5 && message[4].Length == 6) //Some older GPS doesn't broadcast fix time + if (message.Length >= 5) //Some older GPS doesn't broadcast fix time { - FixTime = new TimeSpan(int.Parse(message[4].Substring(0, 2), CultureInfo.InvariantCulture), - int.Parse(message[4].Substring(2, 2), CultureInfo.InvariantCulture), - int.Parse(message[4].Substring(4, 2), CultureInfo.InvariantCulture)); + FixTime = StringToTimeSpan(message[4]); } DataActive = (message.Length < 6 || message[5] == "A"); } diff --git a/src/NmeaParser.Shared/Nmea/Gps/GPGST.cs b/src/NmeaParser.Shared/Nmea/Gps/GPGST.cs index 253622c..d1a19d4 100644 --- a/src/NmeaParser.Shared/Nmea/Gps/GPGST.cs +++ b/src/NmeaParser.Shared/Nmea/Gps/GPGST.cs @@ -38,12 +38,7 @@ namespace NmeaParser.Nmea.Gps { if (message == null || message.Length < 8) throw new ArgumentException("Invalid GPGST", "message"); - if (message[0].Length >= 6) - { - FixTime = new TimeSpan(int.Parse(message[0].Substring(0, 2), CultureInfo.InvariantCulture), - int.Parse(message[0].Substring(2, 2), CultureInfo.InvariantCulture), 0) - .Add(TimeSpan.FromSeconds(double.Parse(message[0].Substring(4), CultureInfo.InvariantCulture))); - } + FixTime = StringToTimeSpan(message[0]); Rms = NmeaMessage.StringToDouble(message[1]); SemiMajorError = NmeaMessage.StringToDouble(message[2]); SemiMinorError = NmeaMessage.StringToDouble(message[3]); diff --git a/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs b/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs index 3455716..d99fd1f 100644 --- a/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs +++ b/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs @@ -39,14 +39,14 @@ namespace NmeaParser.Nmea.Gps if (message == null || message.Length < 11) throw new ArgumentException("Invalid GPRMC", "message"); - if (message[8].Length == 6 && message[0].Length == 6) + if (message[8].Length == 6 && message[0].Length >= 6) { FixTime = new DateTime(int.Parse(message[8].Substring(4, 2), CultureInfo.InvariantCulture) + 2000, int.Parse(message[8].Substring(2, 2), CultureInfo.InvariantCulture), int.Parse(message[8].Substring(0, 2), CultureInfo.InvariantCulture), int.Parse(message[0].Substring(0, 2), CultureInfo.InvariantCulture), int.Parse(message[0].Substring(2, 2), CultureInfo.InvariantCulture), - int.Parse(message[0].Substring(4, 2), CultureInfo.InvariantCulture), DateTimeKind.Utc); + 0, DateTimeKind.Utc).AddSeconds(double.Parse(message[0].Substring(4), CultureInfo.InvariantCulture)); } Active = (message[1] == "A"); Latitude = NmeaMessage.StringToLatitude(message[2], message[3]); diff --git a/src/NmeaParser.Shared/Nmea/NmeaMessage.cs b/src/NmeaParser.Shared/Nmea/NmeaMessage.cs index b484eb1..ad492e7 100644 --- a/src/NmeaParser.Shared/Nmea/NmeaMessage.cs +++ b/src/NmeaParser.Shared/Nmea/NmeaMessage.cs @@ -213,5 +213,15 @@ namespace NmeaParser.Nmea } return double.NaN; } + internal static TimeSpan StringToTimeSpan(string value) + { + if (value != null && value.Length >= 6) + { + return new TimeSpan(int.Parse(value.Substring(0, 2), CultureInfo.InvariantCulture), + int.Parse(value.Substring(2, 2), CultureInfo.InvariantCulture), 0) + .Add(TimeSpan.FromSeconds(double.Parse(value.Substring(4), CultureInfo.InvariantCulture))); + } + return TimeSpan.Zero; + } } } diff --git a/src/NmeaParser.Tests/NmeaMessages.cs b/src/NmeaParser.Tests/NmeaMessages.cs index 544dc58..77ad5d7 100644 --- a/src/NmeaParser.Tests/NmeaMessages.cs +++ b/src/NmeaParser.Tests/NmeaMessages.cs @@ -250,14 +250,14 @@ namespace NmeaParser.Tests [TestMethod] public void TestGpgll() { - string input = "$GPGLL,4916.45,N,12311.12,W,225444,A,*1D"; + 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(22,54,44), gll.FixTime); + Assert.AreEqual(new TimeSpan(0,22,54,44,120), gll.FixTime); } [TestMethod]