diff --git a/src/NmeaParser/Nmea/NmeaMultiSentenceMessage.cs b/src/NmeaParser/Nmea/NmeaMultiSentenceMessage.cs index a646a36..602f587 100644 --- a/src/NmeaParser/Nmea/NmeaMultiSentenceMessage.cs +++ b/src/NmeaParser/Nmea/NmeaMultiSentenceMessage.cs @@ -75,8 +75,8 @@ namespace NmeaParser.Nmea throw new ArgumentException("Invalid message", "message"); - int msgCount = int.Parse(message[0], CultureInfo.InvariantCulture); - int msgNumber = int.Parse(message[1], CultureInfo.InvariantCulture); + int msgCount = int.Parse(message[MessageCountIndex], CultureInfo.InvariantCulture); + int msgNumber = int.Parse(message[MessageNumberIndex], CultureInfo.InvariantCulture); if (initialized) { diff --git a/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs b/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs index 744e875..182d62f 100644 --- a/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs +++ b/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs @@ -22,6 +22,7 @@ using NmeaParser.Nmea; using System.Threading.Tasks; using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Reflection; namespace NmeaParser.Tests { @@ -815,7 +816,7 @@ namespace NmeaParser.Tests public void TestCustomMessageRegistration() { int count = NmeaMessage.RegisterAssembly(typeof(CustomMessage).Assembly, true); - Assert.AreEqual(1, count); + Assert.AreEqual(2, count); var input = "$PTEST,TEST*7C"; var msg = NmeaMessage.Parse(input); Assert.IsInstanceOfType(msg, typeof(CustomMessage)); @@ -828,8 +829,21 @@ namespace NmeaParser.Tests public void TestCustomMessageDuplicateRegistrationFailure() { int count = NmeaMessage.RegisterAssembly(typeof(CustomMessage).Assembly, true); - Assert.AreEqual(1, count); - count = NmeaMessage.RegisterAssembly(typeof(CustomMessage).Assembly, false); // This will throw + Assert.AreEqual(2, count); + NmeaMessage.RegisterAssembly(typeof(CustomMessage).Assembly, false); // This will throw + } + + [TestMethod] + public void TestCustomMultiMessage() + { + NmeaMessage.RegisterNmeaMessage(typeof(CustomMultiMessage).GetTypeInfo(), "", true); + var input1 = "$PTST2,2,1,123,A,B,C,D*2A"; + var input2 = "$PTST2,2,2,123,E,F,G,H*21"; + var msg1 = NmeaMessage.Parse(input1); + var msg2 = NmeaMessage.Parse(input2, msg1 as IMultiSentenceMessage); + Assert.IsInstanceOfType(msg2, typeof(CustomMultiMessage)); + var cmsg = (CustomMultiMessage)msg2; + Assert.AreEqual(8, cmsg.Values.Count); } [Nmea.NmeaMessageType("PTEST")] @@ -841,5 +855,26 @@ namespace NmeaParser.Tests } public string Value { get; } } + + [NmeaMessageType("PTST2")] + private class CustomMultiMessage : NmeaMultiSentenceMessage, IMultiSentenceMessage + { + public CustomMultiMessage(string type, string[] parameters) : base(type, parameters) + { + } + public string Id { get; private set; } + public List Values { get; } = new List(); + protected override int MessageCountIndex => 0; + protected override int MessageNumberIndex => 1; + protected override bool ParseSentences(Talker talkerType, string[] message) + { + if (Id == null) + Id = message[2]; //First time + else if (Id != message[2]) + return false; // This message doesn't match previous message + Values.AddRange(message.Skip(3)); + return true; + } + } } }