mirror of
https://github.com/dotMorten/NmeaParser.git
synced 2026-02-04 06:44:27 +01:00
Added $GPRTE.
Implemented common interface for multi-part messages.
This commit is contained in:
parent
c5c07e15ae
commit
b2e4d7c2a6
19
src/NmeaParser.Shared/IMultiPartMessage.cs
Normal file
19
src/NmeaParser.Shared/IMultiPartMessage.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
76
src/NmeaParser.Shared/Nmea/Gps/GPRTE.cs
Normal file
76
src/NmeaParser.Shared/Nmea/Gps/GPRTE.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue