From a8cb9c360767b8cef8336811e0b5a2334aa63900 Mon Sep 17 00:00:00 2001 From: mort5161 Date: Wed, 12 Nov 2014 10:58:58 -0800 Subject: [PATCH] Improved parsing of values not available in NMEA message --- src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs | 6 ++--- src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs | 23 +++++++++++-------- .../Nmea/Gps/Garmin/PGRME.cs | 6 ++--- src/NmeaParser.Shared/Nmea/NmeaMessage.cs | 13 +++++++++++ 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs b/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs index be3704b..d25d25c 100644 --- a/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs +++ b/src/NmeaParser.Shared/Nmea/Gps/GPGGA.cs @@ -49,10 +49,10 @@ namespace NmeaParser.Nmea.Gps Longitude = NmeaMessage.StringToLongitude(message[3], message[4]); Quality = (FixQuality)int.Parse(message[5], CultureInfo.InvariantCulture); NumberOfSatellites = int.Parse(message[6], CultureInfo.InvariantCulture); - Hdop = double.Parse(message[7], CultureInfo.InvariantCulture); - Altitude = double.Parse(message[8], CultureInfo.InvariantCulture); + Hdop = NmeaMessage.StringToDouble(message[7]); + Altitude = NmeaMessage.StringToDouble(message[8]); AltitudeUnits = message[9]; - HeightOfGeoid = double.Parse(message[10], CultureInfo.InvariantCulture); + HeightOfGeoid = NmeaMessage.StringToDouble(message[10]); HeightOfGeoidUnits = message[11]; if (message[0].Length == 6) { diff --git a/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs b/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs index 1919c02..8fadae0 100644 --- a/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs +++ b/src/NmeaParser.Shared/Nmea/Gps/GPRMC.cs @@ -31,19 +31,22 @@ namespace NmeaParser.Nmea.Gps { protected override void LoadMessage(string[] message) { - FixTime = new DateTime(int.Parse(message[8].Substring(4, 2)) + 2000, - int.Parse(message[8].Substring(2, 2)), - int.Parse(message[8].Substring(0, 2)), - int.Parse(message[0].Substring(0, 2)), - int.Parse(message[0].Substring(2, 2)), - int.Parse(message[0].Substring(4, 2)), DateTimeKind.Utc); + if (message[8].Length == 6 && message[0].Length == 6) + { + FixTime = new DateTime(int.Parse(message[8].Substring(4, 2)) + 2000, + int.Parse(message[8].Substring(2, 2)), + int.Parse(message[8].Substring(0, 2)), + int.Parse(message[0].Substring(0, 2)), + int.Parse(message[0].Substring(2, 2)), + int.Parse(message[0].Substring(4, 2)), DateTimeKind.Utc); + } Active = (message[1] == "A"); Latitude = NmeaMessage.StringToLatitude(message[2], message[3]); Longitude = NmeaMessage.StringToLongitude(message[4], message[5]); - Speed = double.Parse(message[6], CultureInfo.InvariantCulture); - Course = double.Parse(message[7], CultureInfo.InvariantCulture); - MagneticVariation = double.Parse(message[9], CultureInfo.InvariantCulture); - if (message[10] == "W") + Speed = NmeaMessage.StringToDouble(message[6]); + Course = NmeaMessage.StringToDouble(message[7]); + MagneticVariation = NmeaMessage.StringToDouble(message[9]); + if (!double.IsNaN(MagneticVariation) && message[10] == "W") MagneticVariation *= -1; } diff --git a/src/NmeaParser.Shared/Nmea/Gps/Garmin/PGRME.cs b/src/NmeaParser.Shared/Nmea/Gps/Garmin/PGRME.cs index e5d4c62..b0ae016 100644 --- a/src/NmeaParser.Shared/Nmea/Gps/Garmin/PGRME.cs +++ b/src/NmeaParser.Shared/Nmea/Gps/Garmin/PGRME.cs @@ -31,11 +31,11 @@ namespace NmeaParser.Nmea.Gps.Garmin { protected override void LoadMessage(string[] message) { - HorizontalError = double.Parse(message[0], CultureInfo.InvariantCulture); + HorizontalError = NmeaMessage.StringToDouble(message[0]); HorizontalErrorUnits = message[1]; - VerticalError = double.Parse(message[2], CultureInfo.InvariantCulture); + VerticalError = NmeaMessage.StringToDouble(message[2]); VerticalErrorUnits = message[3]; - SphericalError = double.Parse(message[4], CultureInfo.InvariantCulture); + SphericalError = NmeaMessage.StringToDouble(message[4]); SphericalErrorUnits = message[5]; } diff --git a/src/NmeaParser.Shared/Nmea/NmeaMessage.cs b/src/NmeaParser.Shared/Nmea/NmeaMessage.cs index c856a9a..f769755 100644 --- a/src/NmeaParser.Shared/Nmea/NmeaMessage.cs +++ b/src/NmeaParser.Shared/Nmea/NmeaMessage.cs @@ -137,5 +137,18 @@ namespace NmeaParser.Nmea } catch { return double.NaN; } } + internal static double StringToDouble(string value) + { + try + { + double result = double.NaN; + if(double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out result)) + { + return result; + } + return double.NaN; + } + catch { return double.NaN; } + } } }