/// <summary> /// Presents this message as output /// </summary> public override string ToNmeaParameterList() { if (Valid) { StringBuilder b = new StringBuilder(); double? degrees; CardinalDirection?direction; (degrees, direction) = RecommendedMinimumNavigationInformation.DegreesToNmea0183(Position.Latitude, true); if (degrees.HasValue && direction.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:0000.00000},{1},", degrees.Value, (char)direction); } else { b.Append(",,"); } (degrees, direction) = RecommendedMinimumNavigationInformation.DegreesToNmea0183(Position.Longitude, false); if (degrees.HasValue && direction.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:00000.00000},{1},", degrees.Value, (char)direction); } else { b.Append(",,"); } b.Append(Name); return(b.ToString()); } return(string.Empty); }
/// <summary> /// Date and time message (ZDA). This should not normally need the last time as argument, because it defines it. /// </summary> public Waypoint(TalkerId talkerId, IEnumerable <string> fields, DateTimeOffset time) : base(talkerId, Id, time) { IEnumerator <string> field = fields.GetEnumerator(); Position = new GeographicPosition(); Name = string.Empty; double? wayPointLatitude = ReadValue(field); CardinalDirection?wayPointHemisphere = (CardinalDirection?)ReadChar(field); double? wayPointLongitude = ReadValue(field); CardinalDirection?wayPointDirection = (CardinalDirection?)ReadChar(field); string waypointName = ReadString(field); if (wayPointLatitude.HasValue && wayPointLongitude.HasValue) { double?latitude = RecommendedMinimumNavigationInformation.Nmea0183ToDegrees(wayPointLatitude, wayPointHemisphere); double?longitude = RecommendedMinimumNavigationInformation.Nmea0183ToDegrees(wayPointLongitude, wayPointDirection); if (latitude.HasValue && longitude.HasValue) { Position = new GeographicPosition(latitude.Value, longitude.Value, 0); Valid = true; } Name = waypointName; } }
/// <summary> /// Internal ctor /// </summary> public BearingAndDistanceToWayPoint(TalkerId talkerId, IEnumerable <string> fields, DateTimeOffset time) : base(talkerId, Id, time) { IEnumerator <string> field = fields.GetEnumerator(); string timeString = ReadString(field); DateTimeOffset now = ParseDateTime(time, timeString); DateTime = now; NextWayPointName = string.Empty; NextWayPoint = new GeographicPosition(); double? nextWayPointLatitude = ReadValue(field); CardinalDirection?nextWayPointHemisphere = (CardinalDirection?)ReadChar(field); double? nextWayPointLongitude = ReadValue(field); CardinalDirection?nextWayPointDirection = (CardinalDirection?)ReadChar(field); double? bearingTrue = ReadValue(field); string bearingTrueIdentifier = ReadString(field); double? bearingMagnetic = ReadValue(field); string bearingMagneticIdentifier = ReadString(field); double? distance = ReadValue(field); string nm = ReadString(field); string wayPointName = ReadString(field); if (nextWayPointLongitude.HasValue && nextWayPointLatitude.HasValue) { Valid = true; double?latitude = RecommendedMinimumNavigationInformation.Nmea0183ToDegrees(nextWayPointLatitude, nextWayPointHemisphere); double?longitude = RecommendedMinimumNavigationInformation.Nmea0183ToDegrees(nextWayPointLongitude, nextWayPointDirection); if (latitude.HasValue && longitude.HasValue) { NextWayPoint = new GeographicPosition(latitude.Value, longitude.Value, 0); } NextWayPointName = wayPointName; if (bearingTrue.HasValue && bearingTrueIdentifier == "T") { BearingTrueToWayPoint = Angle.FromDegrees(bearingTrue.Value); } if (bearingMagnetic.HasValue && bearingMagneticIdentifier == "M") { BearingMagneticToWayPoint = Angle.FromDegrees(bearingMagnetic.Value); } if (distance.HasValue && nm == "N") { DistanceToWayPoint = Length.FromNauticalMiles(distance.Value); } } }
/// <inheritdoc /> public override string ToNmeaParameterList() { if (Valid) { StringBuilder b = new StringBuilder(256); string time = DateTime.ToString("HHmmss.fff", CultureInfo.InvariantCulture); b.Append(time + ","); double? degrees; CardinalDirection?direction; (degrees, direction) = RecommendedMinimumNavigationInformation.DegreesToNmea0183(NextWayPoint.Latitude, true); if (degrees.HasValue && direction.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:0000.00000},{1},", degrees.Value, (char)direction); } else { b.Append(",,"); } (degrees, direction) = RecommendedMinimumNavigationInformation.DegreesToNmea0183(NextWayPoint.Longitude, false); if (degrees.HasValue && direction.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:00000.00000},{1},", degrees.Value, (char)direction); } else { b.Append(",,"); } if (BearingTrueToWayPoint.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:F1},T,", BearingTrueToWayPoint.Value.Normalize(true).Degrees); } else { b.Append(",T,"); } if (BearingMagneticToWayPoint.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:F1},M,", BearingMagneticToWayPoint.Value.Normalize(true).Degrees); } else { b.Append(",M,"); } if (DistanceToWayPoint.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:F3},N,", DistanceToWayPoint.Value.NauticalMiles); } else { b.Append(",N,"); } b.AppendFormat(CultureInfo.InvariantCulture, "{0},D", NextWayPointName); return(b.ToString()); } return(string.Empty); }
/// <summary> /// See <see cref="NmeaSentence"/> for constructor usage /// </summary> public RecommendedMinimumNavToDestination(TalkerId talkerId, IEnumerable <string> fields, DateTimeOffset time) : base(talkerId, Id, time) { IEnumerator <string> field = fields.GetEnumerator(); PreviousWayPointName = string.Empty; NextWayPointName = String.Empty; NextWayPoint = new GeographicPosition(); string overallStatus = ReadString(field); double? crossTrackError = ReadValue(field); string directionToSteer = ReadString(field); string previousWayPoint = ReadString(field); string nextWayPoint = ReadString(field); double? nextWayPointLatitude = ReadValue(field); CardinalDirection?nextWayPointHemisphere = (CardinalDirection?)ReadChar(field); double? nextWayPointLongitude = ReadValue(field); CardinalDirection?nextWayPointDirection = (CardinalDirection?)ReadChar(field); double? rangeToWayPoint = ReadValue(field); double? bearing = ReadValue(field); double? approachSpeed = ReadValue(field); string arrivalStatus = ReadString(field); if (overallStatus == "A") { Valid = true; if (directionToSteer == "R") { CrossTrackError = -Length.FromNauticalMiles(crossTrackError.GetValueOrDefault(0)); } else { CrossTrackError = Length.FromNauticalMiles(crossTrackError.GetValueOrDefault(0)); } PreviousWayPointName = previousWayPoint ?? string.Empty; NextWayPointName = nextWayPoint ?? string.Empty; double?latitude = RecommendedMinimumNavigationInformation.Nmea0183ToDegrees(nextWayPointLatitude, nextWayPointHemisphere); double?longitude = RecommendedMinimumNavigationInformation.Nmea0183ToDegrees(nextWayPointLongitude, nextWayPointDirection); if (latitude.HasValue && longitude.HasValue) { NextWayPoint = new GeographicPosition(latitude.Value, longitude.Value, 0); } if (rangeToWayPoint.HasValue) { DistanceToWayPoint = Length.FromNauticalMiles(rangeToWayPoint.Value); } if (bearing.HasValue) { BearingToWayPoint = Angle.FromDegrees(bearing.Value); } if (approachSpeed.HasValue) { ApproachSpeed = Speed.FromKnots(approachSpeed.Value); } if (arrivalStatus == "A") { Arrived = true; } else { Arrived = false; } } }
/// <inheritdoc /> public override string ToNmeaParameterList() { if (Valid) { StringBuilder b = new StringBuilder(256); b.Append("A,"); // Status = Valid if (CrossTrackError >= Length.Zero) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:F3},L,", CrossTrackError.NauticalMiles); } else { b.AppendFormat(CultureInfo.InvariantCulture, "{0:F3},R,", -CrossTrackError.NauticalMiles); } b.AppendFormat(CultureInfo.InvariantCulture, "{0},{1},", PreviousWayPointName, NextWayPointName); double? degrees = null; CardinalDirection?direction = null; if (NextWayPoint != null) { (degrees, direction) = RecommendedMinimumNavigationInformation.DegreesToNmea0183(NextWayPoint.Latitude, true); } if (degrees.HasValue && direction.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:0000.00000},{1},", degrees.Value, (char)direction); } else { b.Append(",,"); } degrees = null; direction = null; if (NextWayPoint != null) { (degrees, direction) = RecommendedMinimumNavigationInformation.DegreesToNmea0183(NextWayPoint.Longitude, false); } if (degrees.HasValue && direction.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:00000.00000},{1},", degrees.Value, (char)direction); } else { b.Append(",,"); } if (DistanceToWayPoint.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:F3},", DistanceToWayPoint.Value.NauticalMiles); } else { b.Append(","); } if (BearingToWayPoint.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:F1},", BearingToWayPoint.Value.Normalize(true).Degrees); } else { b.Append(","); } if (ApproachSpeed.HasValue) { b.AppendFormat(CultureInfo.InvariantCulture, "{0:F1},", ApproachSpeed.Value.Knots); } else { b.Append(","); } if (Arrived) { // Not sure what the final D means here. My receiver sends it, but it is not documented. b.Append("A,D"); } else { b.Append("V,D"); } return(b.ToString()); } return(string.Empty); }