Allow skipping checksums and better handle missing checksum after *

As discussed in #74
This commit is contained in:
Morten Nielsen 2020-08-01 11:03:24 -07:00
parent 9461d79bad
commit fbfe89c704
2 changed files with 37 additions and 6 deletions

View file

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

View file

@ -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()
{