mirror of
https://github.com/dotMorten/NmeaParser.git
synced 2026-01-20 15:40:16 +01:00
Allow skipping checksums and better handle missing checksum after *
As discussed in #74
This commit is contained in:
parent
9461d79bad
commit
fbfe89c704
|
|
@ -138,28 +138,33 @@ namespace NmeaParser.Messages
|
|||
/// </summary>
|
||||
/// <param name="message">The NMEA message string.</param>
|
||||
/// <param name="previousSentence">The previously received message (only used if parsing multi-sentence messages)</param>
|
||||
/// <param name="ignoreChecksum">If <c>true</c> ignores the checksum completely, if <c>false</c> validates the checksum if present.</param>
|
||||
/// <returns>The nmea message that was parsed.</returns>
|
||||
/// <exception cref="System.ArgumentException">
|
||||
/// Invalid nmea message: Missing starting character '$'
|
||||
/// or checksum failure
|
||||
/// </exception>
|
||||
public static NmeaMessage Parse(string message, IMultiSentenceMessage? previousSentence = null)
|
||||
public static NmeaMessage Parse(string message, IMultiSentenceMessage? previousSentence = null, bool ignoreChecksum = false)
|
||||
{
|
||||
if (string.IsNullOrEmpty(message))
|
||||
throw new ArgumentNullException(nameof(message));
|
||||
|
||||
int checksum = -1;
|
||||
if (message[0] != '$')
|
||||
throw new ArgumentException("Invalid NMEA message: Missing starting character '$'");
|
||||
if (message[0] != '$')
|
||||
throw new ArgumentException("Invalid NMEA message: Missing starting character '$'");
|
||||
var idx = message.IndexOf('*');
|
||||
if (idx >= 0)
|
||||
{
|
||||
checksum = Convert.ToInt32(message.Substring(idx + 1), 16);
|
||||
if (message.Length > idx + 1)
|
||||
{
|
||||
if (int.TryParse(message.Substring(idx + 1), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int c))
|
||||
checksum = c;
|
||||
else
|
||||
throw new ArgumentException("Invalid checksum string");
|
||||
}
|
||||
message = message.Substring(0, message.IndexOf('*'));
|
||||
}
|
||||
if (checksum > -1)
|
||||
if (!ignoreChecksum && checksum > -1)
|
||||
{
|
||||
int checksumTest = 0;
|
||||
for (int i = 1; i < message.Length; i++)
|
||||
|
|
|
|||
|
|
@ -97,7 +97,33 @@ namespace NmeaParser.Tests
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void MissingChecksumAfterStar()
|
||||
{
|
||||
string input = "$GPRMA,A,4917.24,S,12309.57,W,1000.0,2000.0,123.4,321.0,10,E,A*";
|
||||
var msg = NmeaMessage.Parse(input);
|
||||
Assert.IsNotNull(msg);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MissingChecksum()
|
||||
{
|
||||
string input = "$GPRMA,A,4917.24,S,12309.57,W,1000.0,2000.0,123.4,321.0,10,E,A";
|
||||
var msg = NmeaMessage.Parse(input);
|
||||
Assert.IsNotNull(msg);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void IgnoreChecksum()
|
||||
{
|
||||
string input = "$GPRMA,A,4917.24,S,12309.57,W,1000.0,2000.0,123.4,321.0,10,E,A*00";
|
||||
var msg = NmeaMessage.Parse(input, ignoreChecksum: true);
|
||||
Assert.IsNotNull(msg);
|
||||
|
||||
Assert.ThrowsException<ArgumentException>(() => NmeaMessage.Parse(input, ignoreChecksum: false));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void TestGprma()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue