mirror of
https://github.com/dotMorten/NmeaParser.git
synced 2025-12-06 07:12:04 +01:00
Added support for millisecond accuracy when parsing dates and timespans
This commit is contained in:
parent
6fcd2ebca4
commit
bddc6d7a29
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
Loading…
Reference in a new issue