mirror of
https://github.com/dotMorten/NmeaParser.git
synced 2026-04-05 22:45:42 +00:00
Improved multi-message handling and updated all code necessary
This commit is contained in:
parent
be31b94f9c
commit
a142c9b0da
11 changed files with 587 additions and 458 deletions
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue