Added support for millisecond accuracy when parsing dates and timespans

This commit is contained in:
mort5161 2015-03-20 16:53:17 -07:00
parent 6fcd2ebca4
commit bddc6d7a29
6 changed files with 18 additions and 20 deletions

View file

@ -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

View file

@ -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");
}

View file

@ -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]);

View file

@ -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]);

View file

@ -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;
}
}
}

View file

@ -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]