Improved multi-message handling and updated all code necessary

This commit is contained in:
Morten Nielsen 2020-01-15 23:41:51 -08:00
parent be31b94f9c
commit a142c9b0da
11 changed files with 587 additions and 458 deletions

View file

@ -25,19 +25,15 @@ namespace NmeaParser.Tests
count++;
try
{
Assert.IsTrue(e.IsMultipart, "IsMultiPart");
Assert.IsInstanceOfType(e.Message, typeof(NmeaParser.Nmea.Gsv));
Assert.IsInstanceOfType(e.Message, typeof(Gsv));
var msg = (NmeaParser.Nmea.Gsv)e.Message;
if (msg.TotalMessages == msg.MessageNumber)
{
Assert.IsNotNull(e.MessageParts);
Assert.AreEqual(e.MessageParts.Count, 3, "MessageParts.Length");
tcs.SetResult(true);
}
else
Assert.IsNull(e.MessageParts);
if (count > 3)
Assert.IsTrue(((IMultiSentenceMessage)e.Message).IsComplete);
Assert.AreEqual(9, msg.SVsInView);
Assert.AreEqual(9, msg.SVs.Count);
if (count > 1)
Assert.Fail();
tcs.SetResult(true);
}
catch(System.Exception ex)
{
@ -61,40 +57,24 @@ $GLGSV,4,3,14,73,52,022,47,74,62,248,47,72,44,331,42,71,78,111,49*6A
$GAGSV,4,4,14,19,82,349,40,1,44,220,40,4,24,314,38*5F";
NmeaDevice dev = new BufferedStringDevice(message);
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
int count = 0;
dev.MessageReceived += (s, e) =>
{
count++;
try
{
Assert.IsTrue(e.IsMultipart, "IsMultiPart");
Assert.IsInstanceOfType(e.Message, typeof(NmeaParser.Nmea.Gsv));
var msg = (NmeaParser.Nmea.Gsv)e.Message;
if (msg.TotalMessages == msg.MessageNumber)
{
Assert.IsNotNull(e.MessageParts);
Assert.AreEqual(e.MessageParts.Count, 4, "MessageParts.Length");
Assert.IsInstanceOfType(e.MessageParts[0], typeof(NmeaParser.Nmea.Gsv));
Assert.IsInstanceOfType(e.MessageParts[1], typeof(NmeaParser.Nmea.Gsv));
Assert.IsInstanceOfType(e.MessageParts[2], typeof(NmeaParser.Nmea.Gsv));
Assert.IsInstanceOfType(e.MessageParts[3], typeof(NmeaParser.Nmea.Gsv));
Assert.AreEqual(Talker.GlobalPositioningSystem, e.MessageParts[0].TalkerId);
Assert.AreEqual(Talker.GlobalPositioningSystem, e.MessageParts[1].TalkerId);
Assert.AreEqual(Talker.GlonassReceiver, e.MessageParts[2].TalkerId);
Assert.AreEqual(Talker.GalileoPositioningSystem, e.MessageParts[3].TalkerId);
tcs.SetResult(true);
}
else
Assert.IsNull(e.MessageParts);
if (count > 3)
Assert.Fail();
}
catch (System.Exception ex)
{
tcs.SetException(ex);
}
};
dev.MessageReceived += (s, e) =>
{
try
{
Assert.IsInstanceOfType(e.Message, typeof(NmeaParser.Nmea.Gsv));
Assert.AreEqual(Talker.Multiple, e.Message.TalkerId);
var msg = (NmeaParser.Nmea.Gsv)e.Message;
Assert.AreEqual(Talker.GlobalPositioningSystem, msg.SVs[0].TalkerId);
Assert.AreEqual(Talker.GlobalPositioningSystem, msg.SVs[4].TalkerId);
Assert.AreEqual(Talker.GlonassReceiver, msg.SVs[8].TalkerId);
Assert.AreEqual(Talker.GalileoPositioningSystem, msg.SVs[12].TalkerId);
tcs.SetResult(true);
}
catch (System.Exception ex)
{
tcs.SetException(ex);
}
};
await dev.OpenAsync();
await tcs.Task;
var _ = dev.CloseAsync();
@ -108,27 +88,16 @@ $GAGSV,4,4,14,19,82,349,40,1,44,220,40,4,24,314,38*5F";
var message = "$GPGSV,3,2,9,00,30,055,48,00,19,281,00,27,19,275,00,12,16,319,00*4D\n$GPGSV,3,2,9,00,30,055,48,00,19,281,00,27,19,275,00,12,16,319,00*4F\n$GPGSV,3,3,9,32,10,037,00,,,,,,,,,,,,*74";
NmeaDevice dev = new BufferedStringDevice(message);
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
int count = 0;
bool messageRecieved = false;
dev.MessageReceived += (s, e) =>
{
count++;
try
{
Assert.IsTrue(e.IsMultipart, "IsMultiPart");
Assert.IsInstanceOfType(e.Message, typeof(NmeaParser.Nmea.Gsv));
var msg = e.Message as NmeaParser.Nmea.Gsv;
Assert.IsNull(e.MessageParts);
if (count > 6)
tcs.SetResult(true);
}
catch (System.Exception ex)
{
tcs.SetException(ex);
}
messageRecieved = true;
};
await dev.OpenAsync();
await tcs.Task;
await Task.Delay(100);
var _ = dev.CloseAsync();
if (messageRecieved)
Assert.Fail("Event shouldn't be raised for incomplete messages");
}
}
}

View file

@ -302,8 +302,8 @@ namespace NmeaParser.Tests
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gsv));
Gsv gsv = (Gsv)msg;
Assert.AreEqual(3, gsv.TotalMessages);
Assert.AreEqual(3, gsv.MessageNumber);
Assert.IsInstanceOfType(msg, typeof(IMultiSentenceMessage));
Assert.IsFalse(((IMultiSentenceMessage)msg).IsComplete);
Assert.AreEqual(11, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(3, gsv.SVs.Count);
@ -336,13 +336,75 @@ namespace NmeaParser.Tests
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Gsv));
Gsv gsv = (Gsv)msg;
Assert.AreEqual(1, gsv.TotalMessages);
Assert.AreEqual(1, gsv.MessageNumber);
Assert.IsTrue(((IMultiSentenceMessage)gsv).IsComplete);
Assert.AreEqual(0, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(0, gsv.SVs.Count);
}
[TestMethod]
public void TestGpgsv_Multi()
{
var input1 = "$GPGSV,3,1,9,00,30,055,48,00,19,281,00,27,19,275,00,12,16,319,00*4C";
var input2 = "$GPGSV,3,2,9,00,30,055,48,00,19,281,00,27,19,275,00,12,16,319,00*4F";
var input3 = "$GPGSV,3,3,9,32,10,037,00,,,,,,,,,,,,*74";
var msg1 = NmeaMessage.Parse(input1);
Assert.IsFalse(((IMultiSentenceMessage)msg1).IsComplete);
var msg2 = NmeaMessage.Parse(input2, msg1 as IMultiSentenceMessage);
Assert.IsFalse(((IMultiSentenceMessage)msg2).IsComplete);
var msg3 = NmeaMessage.Parse(input3, msg2 as IMultiSentenceMessage);
Assert.IsTrue(((IMultiSentenceMessage)msg3).IsComplete);
Assert.IsInstanceOfType(msg1, typeof(Gsv));
Assert.AreSame(msg1, msg2);
Assert.AreSame(msg1, msg3);
Gsv gsv = (Gsv)msg1;
Assert.AreEqual(9, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(9, gsv.SVs.Count);
}
[TestMethod]
public void TestGpgsv_MultiMissing()
{
var input1 = "$GPGSV,2,1,9,00,30,055,48,00,19,281,00,27,19,275,00,12,16,319,00*4D";
var input2 = "$GPGSV,2,2,8,00,30,055,48,00,19,281,00,27,19,275,00,12,16,319,00*4F"; //Satellite count doesn't match, so append will fail
var msg1 = NmeaMessage.Parse(input1);
Assert.IsFalse(((IMultiSentenceMessage)msg1).IsComplete);
var msg2 = NmeaMessage.Parse(input2, msg1 as IMultiSentenceMessage);
Assert.IsFalse(((IMultiSentenceMessage)msg2).IsComplete);
Assert.IsInstanceOfType(msg2, typeof(Gsv));
Assert.AreNotSame(msg1, msg2);
Gsv gsv1 = (Gsv)msg1;
Assert.AreEqual(9, gsv1.SVsInView);
Assert.IsNotNull(gsv1.SVs);
Assert.AreEqual(4, gsv1.SVs.Count);
Gsv gsv2 = (Gsv)msg2;
Assert.AreEqual(8, gsv2.SVsInView);
Assert.IsNotNull(gsv2.SVs);
Assert.AreEqual(4, gsv2.SVs.Count);
}
[TestMethod]
public void TestGpgsv_MultiNotMatching()
{
var input2 = "$GPGSV,3,2,9,00,30,055,48,00,19,281,00,27,19,275,00,12,16,319,00*4F";
var input3 = "$GPGSV,3,3,9,32,10,037,00,,,,,,,,,,,,*74";
var msg2 = NmeaMessage.Parse(input2);
Assert.IsFalse(((IMultiSentenceMessage)msg2).IsComplete);
var msg3 = NmeaMessage.Parse(input3, msg2 as IMultiSentenceMessage);
Assert.IsFalse(((IMultiSentenceMessage)msg3).IsComplete);
Assert.IsInstanceOfType(msg2, typeof(Gsv));
Assert.AreNotSame(msg2, msg3);
Gsv gsv2 = (Gsv)msg2;
Assert.AreEqual(9, gsv2.SVsInView);
Assert.IsNotNull(gsv2.SVs);
Assert.AreEqual(4, gsv2.SVs.Count);
Gsv gsv3 = (Gsv)msg3;
Assert.AreEqual(9, gsv3.SVsInView);
Assert.IsNotNull(gsv3.SVs);
Assert.AreEqual(1, gsv3.SVs.Count);
}
[TestMethod]
[WorkItem(53)]
@ -352,8 +414,7 @@ namespace NmeaParser.Tests
var msg = NmeaMessage.Parse(msgstr);
Assert.IsInstanceOfType(msg, typeof(Gsv));
Gsv gsv = (Gsv)msg;
Assert.AreEqual(3, gsv.TotalMessages);
Assert.AreEqual(1, gsv.MessageNumber);
Assert.IsFalse(((IMultiSentenceMessage)gsv).IsComplete);
Assert.AreEqual(12, gsv.SVsInView);
Assert.IsNotNull(gsv.SVs);
Assert.AreEqual(4, gsv.SVs.Count);
@ -581,16 +642,15 @@ namespace NmeaParser.Tests
string input = "$GPRTE,2,1,c,0,W3IWI,DRIVWY,32CEDR,32-29,32BKLD,32-I95,32-US1,BW-32,BW-198*69";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Rte));
Rte gsv = (Rte)msg;
Assert.AreEqual(2, gsv.TotalMessages);
Assert.AreEqual(1, gsv.MessageNumber);
Assert.AreEqual(Rte.WaypointListType.CompleteWaypointsList, gsv.ListType);
Assert.AreEqual("0", gsv.RouteId);
Assert.AreEqual("0", gsv.RouteId);
Assert.AreEqual(9, gsv.Waypoints.Count);
Assert.AreEqual("W3IWI", gsv.Waypoints[0]);
Assert.AreEqual("32BKLD", gsv.Waypoints[4]);
Assert.AreEqual("BW-198", gsv.Waypoints[8]);
Rte rte = (Rte)msg;
Assert.IsFalse(((IMultiSentenceMessage)rte).IsComplete);
Assert.AreEqual(Rte.WaypointListType.CompleteWaypointsList, rte.ListType);
Assert.AreEqual("0", rte.RouteId);
Assert.AreEqual("0", rte.RouteId);
Assert.AreEqual(9, rte.Waypoints.Count);
Assert.AreEqual("W3IWI", rte.Waypoints[0]);
Assert.AreEqual("32BKLD", rte.Waypoints[4]);
Assert.AreEqual("BW-198", rte.Waypoints[8]);
}
[TestMethod]