Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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;
            }
        }
Beispiel #3
0
        /// <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);
                }
            }
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        /// <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;
                }
            }
        }
Beispiel #6
0
        /// <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);
        }