Added $GPRTE.

Implemented common interface for multi-part messages.
This commit is contained in:
unknown 2014-07-31 00:37:30 -07:00
parent c5c07e15ae
commit b2e4d7c2a6
9 changed files with 151 additions and 14 deletions

View file

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NmeaParser
{
interface IMultiPartMessage<T> : IEnumerable<T>
{
/// <summary>
/// Total number of messages of this type in this cycle
/// </summary>
int TotalMessages { get; }
/// <summary>
/// Message number
/// </summary>
int MessageNumber { get; }
}
}

View file

@ -27,7 +27,7 @@ namespace NmeaParser.Nmea.Gps
/// GPS Satellites in view
/// </summary>
[NmeaMessageType(Type = "GPGSV")]
public sealed class Gpgsv : NmeaMessage
public sealed class Gpgsv : NmeaMessage, IMultiPartMessage<SatelitteVehicle>
{
protected override void LoadMessage(string[] message)
{
@ -65,6 +65,17 @@ namespace NmeaParser.Nmea.Gps
/// Dilution of precision
/// </summary>
public SatelitteVehicle[] SVs { get; private set; }
public IEnumerator<SatelitteVehicle> GetEnumerator()
{
foreach(var sv in SVs)
yield return sv;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public sealed class SatelitteVehicle

View file

@ -0,0 +1,76 @@
//
// Copyright (c) 2014 Morten Nielsen
//
// Licensed under the Microsoft Public License (Ms-PL) (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://opensource.org/licenses/Ms-PL.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NmeaParser.Nmea.Gps
{
/// <summary>
/// Routes
/// </summary>
[NmeaMessageType(Type = "GPRTE")]
public sealed class Gprte : NmeaMessage, IMultiPartMessage<string>
{
public enum WaypointListType
{
CompleteWaypointsList,
RemainingWaypointsList
}
protected override void LoadMessage(string[] message)
{
TotalMessages = int.Parse(message[0]);
MessageNumber = int.Parse(message[1]);
ListType = message[2] == "c" ? WaypointListType.CompleteWaypointsList : WaypointListType.RemainingWaypointsList;
RouteID = message[3];
Waypoints = message.Skip(4).ToArray();
}
/// <summary>
/// Total number of messages of this type in this cycle
/// </summary>
public int TotalMessages { get; private set; }
/// <summary>
/// Message number
/// </summary>
public int MessageNumber { get; private set; }
public WaypointListType ListType { get; private set; }
public string RouteID { get; set; }
/// <summary>
/// Waypoints
/// </summary>
public string[] Waypoints { get; private set; }
IEnumerator<string> IEnumerable<string>.GetEnumerator()
{
foreach (string waypoint in Waypoints)
yield return waypoint;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return ((IEnumerable<string>)this).GetEnumerator();
}
}
}

View file

@ -119,10 +119,10 @@ namespace NmeaParser
private void OnMessageReceived(Nmea.NmeaMessage msg)
{
if (MessageReceived != null)
MessageReceived(this, msg);
MessageReceived(this, new NmeaMessageReceivedEventArgs(msg));
}
public event TypedEventHandler<NmeaDevice, Nmea.NmeaMessage> MessageReceived;
public event EventHandler<NmeaMessageReceivedEventArgs> MessageReceived;
public void Dispose()
{
@ -142,4 +142,15 @@ namespace NmeaParser
}
}
}
public sealed class NmeaMessageReceivedEventArgs : EventArgs
{
internal NmeaMessageReceivedEventArgs(Nmea.NmeaMessage message) {
Message = message;
MessageList = new[] { message };
}
public Nmea.NmeaMessage Message { get; private set; }
public bool IsMultiPart { get; internal set; }
public Nmea.NmeaMessage[] MessageList { get; internal set; }
}
}

View file

@ -9,12 +9,14 @@
<Import_RootNamespace>NmeaParser</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)IMultiPartMessage.cs" />
<Compile Include="$(MSBuildThisFileDirectory)NmeaDevice.cs" />
<Compile Include="$(MSBuildThisFileDirectory)NmeaFileDevice.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Nmea\Gps\Garmin\PGRMZ.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Nmea\Gps\Garmin\PGRME.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Nmea\Gps\GPGLL.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Nmea\Gps\GPBOD.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Nmea\Gps\GPRTE.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Nmea\Gps\GPGSV.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Nmea\Gps\GPGSA.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Nmea\Gps\GPGGA.cs" />

View file

@ -39,9 +39,9 @@ namespace NmeaParser.Tests
var line = reader.ReadLine();
if(line.StartsWith("$"))
{
var msg = NmeaMessage.Parse(line);
Assert.IsNotNull(msg);
Assert.IsNotInstanceOfType(msg, typeof(Nmea.UnknownMessage), "Type " + msg.MessageType + " not supported");
var msg = NmeaMessage.Parse(line);
Assert.IsNotNull(msg);
Assert.IsNotInstanceOfType(msg, typeof(Nmea.UnknownMessage), "Type " + msg.MessageType + " not supported");
}
}
}
@ -330,5 +330,22 @@ namespace NmeaParser.Tests
Assert.AreEqual(NmeaParser.Nmea.Gps.Garmin.Pgrmz.PositionFixDimension.GpsAltitude, rmz.FixDimension, "FixDimension");
}
[TestMethod]
public void TestGprte()
{
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(Gprte));
Gprte gsv = (Gprte)msg;
Assert.AreEqual(2, gsv.TotalMessages);
Assert.AreEqual(1, gsv.MessageNumber);
Assert.AreEqual(NmeaParser.Nmea.Gps.Gprte.WaypointListType.CompleteWaypointsList, gsv.ListType);
Assert.AreEqual("0", gsv.RouteID);
Assert.AreEqual("0", gsv.RouteID);
Assert.AreEqual(9, gsv.Waypoints.Length);
Assert.AreEqual("W3IWI", gsv.Waypoints[0]);
Assert.AreEqual("32BKLD", gsv.Waypoints[4]);
Assert.AreEqual("BW-198", gsv.Waypoints[8]);
}
}
}

View file

@ -15039,7 +15039,8 @@ $GPBOD,,T,,M,,*47
$PGRME,5.3,M,9.2,M,10.6,M*14
$PGRMZ,7867,f,3*25
$GPRTE,1,1,c,*37$GPRMC,003108,A,3916.3063,N,11955.9906,W,0.0,163.5,260905,15.2,E,A*38
$GPRTE,1,1,c,*37
$GPRMC,003108,A,3916.3063,N,11955.9906,W,0.0,163.5,260905,15.2,E,A*38
$GPRMB,A,,,,,,,,,,,,A,A*0B
$GPGGA,003108,3916.3063,N,11955.9906,W,1,08,1.7,2397.3,M,-22.5,M,,*44
$GPGSA,A,3,,04,07,08,09,,24,26,28,29,,,3.4,1.7,3.0*31

View file

@ -32,13 +32,13 @@ namespace SampleApp.Store
var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///NmeaSampleData.txt"));
var device = new NmeaParser.NmeaFileDevice(file);
device.MessageReceived += device_MessageReceived;
device.OpenAsync();
var _ = device.OpenAsync();
}
private void device_MessageReceived(NmeaParser.NmeaDevice sender, NmeaParser.Nmea.NmeaMessage args)
private void device_MessageReceived(object sender, NmeaParser.NmeaMessageReceivedEventArgs args)
{
Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
output.Text += args.MessageType + ": " + args.ToString() + '\n';
output.Text += args.Message.MessageType + ": " + args.Message.ToString() + '\n';
});
}
}

View file

@ -29,17 +29,17 @@ namespace SampleApp.WinDesktop
}
Dictionary<int, NmeaParser.Nmea.Gps.Gpgsv> gpgsvList = new Dictionary<int,NmeaParser.Nmea.Gps.Gpgsv>();
private void device_MessageReceived(NmeaParser.NmeaDevice sender, NmeaParser.Nmea.NmeaMessage args)
private void device_MessageReceived(object sender, NmeaParser.NmeaMessageReceivedEventArgs args)
{
Dispatcher.BeginInvoke((Action) delegate()
{
output.Text += args.MessageType + ": " + args.ToString() + '\n';
output.Text += args.Message.MessageType + ": " + args.ToString() + '\n';
output.Select(output.Text.Length - 1, 0); //scroll to bottom
//Merge all gpgsv satellite messages
if(args is NmeaParser.Nmea.Gps.Gpgsv)
if(args.Message is NmeaParser.Nmea.Gps.Gpgsv)
{
var gpgsv = (NmeaParser.Nmea.Gps.Gpgsv)args;
var gpgsv = (NmeaParser.Nmea.Gps.Gpgsv)args.Message;
if(gpgsv.MessageNumber == 1)
{
gpgsvList = new Dictionary<int,NmeaParser.Nmea.Gps.Gpgsv>(); //first one. Replace list