mirror of
https://github.com/dotMorten/NmeaParser.git
synced 2025-12-06 07:12:04 +01:00
Added RMA message
This commit is contained in:
parent
013749c4fb
commit
d5b89fef5f
168
src/NmeaParser/Nmea/Rma.cs
Normal file
168
src/NmeaParser/Nmea/Rma.cs
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
// *******************************************************************************
|
||||
// * Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// * you may not use this file except in compliance with the License.
|
||||
// * You may obtain a copy of the License at
|
||||
// *
|
||||
// * http://www.apache.org/licenses/LICENSE-2.0
|
||||
// *
|
||||
// * 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.Globalization;
|
||||
|
||||
namespace NmeaParser.Nmea
|
||||
{
|
||||
/// <summary>
|
||||
/// Recommended minimum specific Loran-C Data
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>Position, course and speed data provided by a Loran-C receiver. Time differences A and B are those used in computing latitude/longitude.
|
||||
/// This sentence is transmitted at intervals not exceeding 2-seconds and is always accompanied by <see cref="Rmb"/> when a destination waypoint is active.</para>
|
||||
/// </remarks>
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gprmb")]
|
||||
[NmeaMessageType("--RMA")]
|
||||
public class Rma : NmeaMessage
|
||||
{
|
||||
/// <summary>
|
||||
/// Positioning system status field
|
||||
/// </summary>
|
||||
public enum PositioningStatus
|
||||
{
|
||||
/// <summary>
|
||||
/// Data not valid
|
||||
/// </summary>
|
||||
Invalid = 0,
|
||||
/// <summary>
|
||||
/// Autonomous
|
||||
/// </summary>
|
||||
Autonomous,
|
||||
/// <summary>
|
||||
/// Differential
|
||||
/// </summary>
|
||||
Differential
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Positioning system mode indicator
|
||||
/// </summary>
|
||||
public enum PositioningMode
|
||||
{
|
||||
/// <summary>
|
||||
/// Data not valid
|
||||
/// </summary>
|
||||
NotValid = 0,
|
||||
/// <summary>
|
||||
/// Autonomous mode
|
||||
/// </summary>
|
||||
Autonomous,
|
||||
/// <summary>
|
||||
/// Differential mode
|
||||
/// </summary>
|
||||
Differential,
|
||||
/// <summary>
|
||||
/// Estimated (dead reckoning) mode
|
||||
/// </summary>
|
||||
Estimated,
|
||||
/// <summary>
|
||||
/// Manual input mode
|
||||
/// </summary>
|
||||
Manual,
|
||||
/// <summary>
|
||||
/// Simulator mode
|
||||
/// </summary>
|
||||
Simulator,
|
||||
}
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="Rma"/> class.
|
||||
/// </summary>
|
||||
/// <param name="type">The message type</param>
|
||||
/// <param name="message">The NMEA message values.</param>
|
||||
public Rma(string type, string[] message) : base(type, message)
|
||||
{
|
||||
if (message == null || message.Length < 12)
|
||||
throw new ArgumentException("Invalid RMA", "message");
|
||||
|
||||
Status = message[0] == "A" ? PositioningStatus.Autonomous : (message[0] == "D" ? PositioningStatus.Differential : PositioningStatus.Invalid);
|
||||
Latitude = NmeaMessage.StringToLatitude(message[1], message[2]);
|
||||
Longitude = NmeaMessage.StringToLongitude(message[3], message[4]);
|
||||
if (double.TryParse(message[5], NumberStyles.Float, CultureInfo.InvariantCulture, out double tmp))
|
||||
TimeDifferenceA = TimeSpan.FromMilliseconds(tmp / 1000);
|
||||
if (double.TryParse(message[6], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
|
||||
TimeDifferenceB = TimeSpan.FromMilliseconds(tmp / 1000);
|
||||
if (double.TryParse(message[7], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
|
||||
Speed = tmp;
|
||||
else
|
||||
Speed = double.NaN;
|
||||
if (double.TryParse(message[8], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
|
||||
Course = tmp;
|
||||
else
|
||||
Course = double.NaN;
|
||||
if (double.TryParse(message[9], NumberStyles.Float, CultureInfo.InvariantCulture, out tmp))
|
||||
MagneticVariation = tmp * (message[10] == "E" ? -1 : 1);
|
||||
else
|
||||
MagneticVariation = double.NaN;
|
||||
|
||||
switch (message[11])
|
||||
{
|
||||
case "A": Mode = PositioningMode.Autonomous; break;
|
||||
case "D": Mode = PositioningMode.Autonomous; break;
|
||||
case "E": Mode = PositioningMode.Estimated; break;
|
||||
case "M": Mode = PositioningMode.Manual; break;
|
||||
case "S": Mode = PositioningMode.Simulator; break;
|
||||
case "N":
|
||||
default:
|
||||
Mode = PositioningMode.Autonomous; break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Positioning system status
|
||||
/// </summary>
|
||||
public PositioningStatus Status { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Latitude
|
||||
/// </summary>
|
||||
public double Latitude { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Longitude
|
||||
/// </summary>
|
||||
public double Longitude { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Time difference A
|
||||
/// </summary>
|
||||
public TimeSpan TimeDifferenceA { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Time difference B
|
||||
/// </summary>
|
||||
public TimeSpan TimeDifferenceB { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Speed over ground in knots.
|
||||
/// </summary>
|
||||
public double Speed { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Course over ground in degrees from true north
|
||||
/// </summary>
|
||||
public double Course { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Magnetic variation in degrees.
|
||||
/// </summary>
|
||||
public double MagneticVariation { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Positioning system mode indicator
|
||||
/// </summary>
|
||||
public PositioningMode Mode { get; }
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue