This commit is contained in:
Joachim Spange 2025-02-04 13:11:55 +00:00 committed by GitHub
commit 065f205bff
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 242 additions and 0 deletions

View file

@ -0,0 +1,71 @@
// *******************************************************************************
// * 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.Messages
{
/// <summary>
/// Water depth relative to the transducer, the depth offset of the transducer, and maximum depth that the sounder can detect a sea-bed (all in metres only).
/// Positive offsets provide distance from the transducer to the water line. Negative offsets provide distance from the transducer to the keel.
/// Not all NMEA 0183 devices that output this sentence can have their depth offset changed. In this case, the depth offset will always be zero, or not included.
/// NMEA 0183 v2.0 sentences will not include the maximum depth range value at all, as it was added in v3.0.
/// </summary>
/// <remarks>
/// <para>
/// Format: $xxDPT,DATA_METRES,OFFSET_METRES, MAXIMUM_METRES*hh
/// 1.: Data
/// 2.: Offset
/// 3.: Maximum
/// </para>
/// <para>
/// Depth
/// </para>
/// </remarks>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "SdDpt")]
[NmeaMessageType("--DPT")]
public class Dpt : NmeaMessage
{
/// <summary>
/// Initializes a new instance of the <see cref="Dpt"/> class.
/// </summary>
/// <param name="type">The message type</param>
/// <param name="message">The NMEA message values.</param>
public Dpt(string type, string[] message) : base(type, message)
{
if (message == null || message.Length < 3)
throw new ArgumentException("Invalid Dpt", "message");
DepthMeters = double.Parse(message[0], CultureInfo.InvariantCulture);
DepthOffsetMeters = double.Parse(message[1], CultureInfo.InvariantCulture);
MaxDepthRangeMeters = double.Parse(message[2], CultureInfo.InvariantCulture);
}
/// <summary>
/// Depth, in meters
/// </summary>
public double DepthMeters { get; }
/// <summary>
/// Depth offset, in meters
/// </summary>
public double DepthOffsetMeters { get; }
/// <summary>
/// Maximum depth range, in meters
/// </summary>
public double MaxDepthRangeMeters { get; }
}
}

View file

@ -0,0 +1,64 @@
// *******************************************************************************
// * 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.Messages
{
/// <summary>
/// Heading from True North
/// </summary>
/// <remarks>
/// <para>
/// 1.: Heading in degrees
/// 2.: Indicates heading relative to True North
/// </para>
/// <para>
/// Actual vessel heading in degrees True produced by any device or system producing true heading
/// </para>
/// </remarks>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "HeHdt")]
[NmeaMessageType("--HDT")]
public class Hdt : NmeaMessage
{
/// <summary>
/// Initializes a new instance of the <see cref="Hdt"/> class.
/// </summary>
/// <param name="type">The message type</param>
/// <param name="message">The NMEA message values.</param>
public Hdt(string type, string[] message) : base(type, message)
{
if (message == null || message.Length < 2)
throw new ArgumentException("Invalid Hdt", "message");
// Extract the heading in degrees
HeadingInDeg = double.TryParse(message[0], NumberStyles.Float, CultureInfo.InvariantCulture, out var heading)
? heading
: double.NaN;
HeadingRelToTrueNorth = message[1] == "T";
}
/// <summary>
/// Heading in degrees
/// </summary>
public double HeadingInDeg { get; }
/// <summary>
/// T: Indicates heading relative to True North
/// </summary>
public bool HeadingRelToTrueNorth { get; }
}
}

View file

@ -0,0 +1,71 @@
// *******************************************************************************
// * 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;
namespace NmeaParser.Messages
{
/// <summary>
/// Measurement data from transducers that measure physical quantities such as
/// temperature, force, pressure, frequency, angular or linear displacement, etc.
/// Four fields 'Type-Data-Units-ID'
/// </summary>
/// <remarks>
/// <para>
/// 1.: Transducer type
/// 2.: Measurement data
/// 3.: units of measure
/// 4.: transducer ID
/// </para>
/// </remarks>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Xdr")]
[NmeaMessageType("--XDR")]
public class Xdr : NmeaMessage
{
/// <summary>
/// Initializes a new instance of the <see cref="Xdr"/> class.
/// </summary>
/// <param name="type">The message type</param>
/// <param name="message">The NMEA message values.</param>
public Xdr(string type, string[] message) : base(type, message)
{
if (message == null || message.Length < 4)
throw new ArgumentException("Invalid Xdr", "message");
Type = message[0];
Data = StringToDouble(message[1]);
Unit = message[2];
ID = message[3];
}
/// <summary>
/// Transducer Type
/// </summary>
public string Type { get; }
/// <summary>
/// Measurement data
/// </summary>
public double Data { get; }
/// <summary>
/// Unit of measure
/// </summary>
public string Unit { get; }
/// <summary>
/// ID
/// </summary>
public string ID { get; }
}
}

View file

@ -124,6 +124,18 @@ namespace NmeaParser.Tests
Assert.ThrowsException<ArgumentException>(() => NmeaMessage.Parse(input, ignoreChecksum: false));
}
[TestMethod]
public void TestDPT()
{
string input = "$--DPT,149.5,000.5,1000.0*7F";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Dpt));
Dpt dpt = (Dpt)msg;
Assert.AreEqual(149.5, dpt.DepthMeters);
Assert.AreEqual(0.5, dpt.DepthOffsetMeters);
Assert.AreEqual(1000, dpt.MaxDepthRangeMeters);
}
[TestMethod]
public void TestGprma()
{
@ -296,6 +308,30 @@ namespace NmeaParser.Tests
Assert.AreEqual(-1, gga.DgpsStationId);
}
[TestMethod]
public void TestHEHDT()
{
const string input = "$HEHDT,13.37,T*29";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Hdt));
Hdt hdt = (Hdt)msg;
Assert.AreEqual(13.37, hdt.HeadingInDeg);
Assert.IsTrue(hdt.HeadingRelToTrueNorth);
}
[TestMethod]
public void TestKMXDR()
{
string input = "$KMXDR,P,123.4,M,DEPTH*32";
var msg = NmeaMessage.Parse(input);
Assert.IsInstanceOfType(msg, typeof(Xdr));
Xdr xdr = (Xdr)msg;
Assert.AreEqual("P", xdr.Type);
Assert.AreEqual(123.4, xdr.Data);
Assert.AreEqual("M", xdr.Unit);
Assert.AreEqual("DEPTH", xdr.ID);
}
[TestMethod]
public void TestPtlna()
{