Ejemplo n.º 1
0
        public static FixQuality parseFixQuality(string fix_quality_string)
        {
            FixQuality fq = FixQuality.invalid;

            switch (fix_quality_string)
            {
            case "0": fq = FixQuality.invalid; break;

            case "1": fq = FixQuality.GPS_Fix; break;

            case "2": fq = FixQuality.DGPS_Fix; break;

            case "3": fq = FixQuality.PPS_Fix; break;

            case "4": fq = FixQuality.Real_Time_Kinematic; break;

            case "5": fq = FixQuality.Float_RTK; break;

            case "6": fq = FixQuality.estimated; break;

            case "7": fq = FixQuality.manual_input_mode; break;

            case "8": fq = FixQuality.simulation_mode; break;
            }
            return(fq);
        }
Ejemplo n.º 2
0
        private static string FixQuality_ToString(FixQuality fq)
        {
            string result = String.Empty;

            switch (fq)
            {
            case FixQuality.invalid:   result = "invalid"; break;

            case FixQuality.GPS_Fix:   result = "GPS fix (SPS)"; break;

            case FixQuality.DGPS_Fix:  result = "DGPS fix"; break;

            case FixQuality.PPS_Fix:   result = "PPS fix"; break;

            case FixQuality.Real_Time_Kinematic: result = "Real Time Kinematic"; break;

            case FixQuality.Float_RTK: result = "Float RTK"; break;

            case FixQuality.estimated: result = "estimated (dead reckoning)"; break;

            case FixQuality.manual_input_mode: result = "Manual input mode"; break;

            case FixQuality.simulation_mode: result = "Simulation mode"; break;
            }
            return(result);
        }
Ejemplo n.º 3
0
 private void HandleSentence(GGA data)
 {
     lock (m_lock)
     {
         m_altitude        = data.Altitude;
         m_activeSatelites = data.ActiveSatellites;
         m_fixQuality      = data.Quality;
     }
 }
Ejemplo n.º 4
0
        public void Read(string[] fields)
        {
            if (fields.Length != 15)
            {
                throw new InvalidDataException(string.Format("$GPGGA sentence needs to have 15 fields, but {0} were found.", fields.Length));
            }

            int n = 0;

            if (fields[n] != "$GPGGA")
                throw new InvalidDataException(string.Format("Expected \"$GPGGA\", found \"{0}\"", fields[n]));
            n++;

            Time = ParseTime(fields[n]);
            n++;

            Latitude = ParseLatitude(fields[n], fields[n + 1]);
            n += 2;

            Longitude = ParseLongitude(fields[n], fields[n + 1]);
            n += 2;

            int quality = int.Parse(fields[n]);
            if (quality >= 0 && quality <= 8)
                Quality = (FixQuality)quality;
            else
                throw new InvalidDataException(string.Format("Fix quality is an unknown value: {0}", fields[n]));
            n++;

            NumberOfSatellites = int.Parse(fields[n]);
            n++;

            HDOP = double.Parse(fields[n]);
            n++;

            double altitude;
            if (double.TryParse(fields[n], out altitude))
                Altitude = altitude;
            n++;

            if (Altitude.HasValue && fields[n] != "M")
                throw new InvalidDataException(string.Format("Altitude must be in meters (\"M\"), got \"{0}\" instead.", fields[n]));
            n++;

            double heightOfGeoid;
            if (double.TryParse(fields[n], out heightOfGeoid))
                HeightOfGeoid = heightOfGeoid;
            n++;

            if (HeightOfGeoid.HasValue && fields[n] != "M")
                throw new InvalidDataException(string.Format("Height of Geoid must be in meters (\"M\"), got \"{0}\" instead.", fields[n]));

            // DGPS not implemented
        }
Ejemplo n.º 5
0
 public static string Format(GPSPosition pos, FixQuality Quality)
 {
     return(string.Format(
                "{0}\n" +
                "X {1:0.00}\n" +
                "Y {2:0.00}\n" +
                "Z {3:0.00}\n" +
                "Q {4}",
                pos.Projection.Replace("_", " "),
                pos.North, pos.East, pos.Altitude,
                Quality.ToString()));
 }
 internal NmeaFixMessage(
     DateTime time,
     LatLonCoord coords,
     double altitude,  // Above sea level
     FixQuality quality,
     int sateliteCount)
 {
     this.Time = time;
     this.Coords = coords;
     this.Altitude = altitude;
     this.Quality = quality;
     this.SateliteCount = sateliteCount;
 }
Ejemplo n.º 7
0
        /// <summary>
        /// Initializes a new instance of the <see cref="GgaLine"/> class.
        /// </summary>
        /// <param name="type">The message type</param>
        /// <param name="message">The NMEA message values.</param>
        public GgaLine(string nmeaLine) : base(NmeaType.Gga, nmeaLine)
        {
            FixTime = Helper.StringToTimeSpan(message[0]);

            var latitude  = Helper.StringToLatitude(message[1], message[2]);
            var longitude = Helper.StringToLongitude(message[3], message[4]);

            message[8].TryToDouble(out var altitude);
            var altitudeUnits = message[9];

            Position = new GeoCoordinate(latitude, longitude, altitude, altitudeUnits);

            FixQuality quality = message[5].TryToInt32(out var fixQuality) ? (FixQuality)fixQuality : FixQuality.Invalid;

            Quality = quality;

            message[7].TryToDouble(out var hdop);
            Hdop = hdop;

            if (message[12].TryToDouble(out var timeInSeconds))
            {
                TimeSinceLastDgpsUpdate = timeInSeconds.Seconds();
            }
            else
            {
                TimeSinceLastDgpsUpdate = TimeSpan.MaxValue;
            }

            if (message[13].Length > 0)
            {
                DgpsStationId = int.Parse(message[13], CultureInfo.InvariantCulture);
            }
            else
            {
                DgpsStationId = -1;
            }


            message[6].TryToInt32(out var numberOfSatellites);
            NumberOfSatellites = numberOfSatellites;

            message[10].TryToDouble(out var geoidalSeparation);
            GeoidalSeparation = geoidalSeparation;

            var geoidalSeparationUnits = message[11];

            GeoidalSeparationUnits = geoidalSeparationUnits;
        }
Ejemplo n.º 8
0
 public void Decode(Tokenizer tok)
 {
     m_time               = tok.GetTime();
     m_latitude           = tok.GetLatitude();
     m_longtitude         = tok.GetLongitude();
     m_fixQuality         = (FixQuality)tok.GetInt();
     m_nSatellites        = tok.GetInt();
     m_horizontalDilution = tok.GetDouble();
     m_altitude           = tok.GetDouble();
     tok.Skip();
     m_heightOfGeoid = tok.GetDouble();
     tok.Skip();
     m_lastDGPSUpdate = tok.GetDouble();
     tok.Skip();
     m_dgpsStationId = tok.GetInt();
 }
Ejemplo n.º 9
0
        protected Emulator(string name)
        {
            _Name = name;

            // Create new buffers for reading and writing
            _ReadBuffer  = new List <byte>(_DefaultReadBufferSize);
            _WriteBuffer = new List <byte>(_DefaultWriteBufferSize);

            // Initialize simulated values
            _ReadDataAvailableWaitHandle  = new ManualResetEvent(false);
            _WriteDataAvailableWaitHandle = new ManualResetEvent(false);
            _EmulationIntervalWaitHandle  = new ManualResetEvent(false);

            // Default timeouts for reading and writing
            _ReadTimeout  = _DefaultReadTimeout;
            _WriteTimeout = _DefaultWriteTimeout;

            // Simulated values
            _seed            = new Random();
            _UtcDateTime     = DateTime.UtcNow;
            _CurrentPosition = Positioning.Position.Empty;
            _Altitude        = Distance.FromFeet(1000);
            _Route           = new List <Position>();
            _Satellites      = new List <Satellite>();
            _FixQuality      = FixQuality.GpsFix;
            _FixMode         = FixMode.Automatic;
            _FixMethod       = FixMethod.Fix3D;
            _FixStatus       = FixStatus.Fix;
            _HorizontalDop   = DilutionOfPrecision.Good;
            _VerticalDop     = DilutionOfPrecision.Good;
            _MeanDop         = DilutionOfPrecision.Good;

            _Speed     = Speed.FromStatuteMilesPerHour(20);
            _speedLow  = Speed.FromKilometersPerSecond(10).Value;
            _speedHigh = Speed.FromKilometersPerSecond(25).Value;

            _Bearing      = Azimuth.Southwest;
            _bearingStart = _seed.NextDouble() * 360;
            _bearingArc   = 10;
        }
Ejemplo n.º 10
0
        protected Emulator(string name)
        {
            _Name = name;

            // Create new buffers for reading and writing
            _ReadBuffer = new List<byte>(_DefaultReadBufferSize);
            _WriteBuffer = new List<byte>(_DefaultWriteBufferSize);

            // Initialize simulated values
            _ReadDataAvailableWaitHandle = new ManualResetEvent(false);
            _WriteDataAvailableWaitHandle = new ManualResetEvent(false);
            _EmulationIntervalWaitHandle = new ManualResetEvent(false);

            // Default timeouts for reading and writing
            _ReadTimeout = _DefaultReadTimeout;
            _WriteTimeout = _DefaultWriteTimeout;
            
            // Simulated values
            _seed = new Random();
            _UtcDateTime = DateTime.UtcNow;
            _CurrentPosition = GeoFramework.Position.Empty;            
            _Altitude = Distance.FromFeet(1000);
            _Route = new List<Position>();
            _Satellites = new List<Satellite>();
            _FixQuality = FixQuality.GpsFix;
            _FixMode = FixMode.Automatic;
            _FixMethod = FixMethod.Fix3D;
            _FixStatus = FixStatus.Fix;
            _HorizontalDop = DilutionOfPrecision.Good;
            _VerticalDop = DilutionOfPrecision.Good;
            _MeanDop = DilutionOfPrecision.Good;

            _Speed = Speed.FromStatuteMilesPerHour(20);
            _speedLow = Speed.FromKilometersPerSecond(10).Value;
            _speedHigh = Speed.FromKilometersPerSecond(25).Value;

            _Bearing = Azimuth.Southwest;
            _bearingStart = _seed.NextDouble() * 360;
            _bearingArc = 10;

        }
Ejemplo n.º 11
0
 /// <summary>
 /// Creates a new instance with the specified fix quality measurement.
 /// </summary>
 /// <param name="fixQuality">A value from the <strong>FixQuality</strong> enumeration.</param>
 /// <remarks></remarks>
 public FixQualityEventArgs(FixQuality fixQuality)
 {
     _FixQuality = fixQuality;
 }
Ejemplo n.º 12
0
        /// <summary>
        /// OnSentanceChanged event handler
        /// </summary>
        protected override void OnSentenceChanged()
        {
            base.OnSentenceChanged();

            // Cache the sentence words
            string[] words = Words;
            int wordCount = words.Length;

            /*
             *  Garmin produces several embedded GPS systems. They are easy to setup because Garmin provides a nice utility for uploading configuration data to the GPS. You first load the utility to a PC. Connect the PC to the GPS through one of the serial ports. The utility will check each baud rate until it communicates with the GPS.

                The common configuration parameters are output sentences from the GPS unit, the communication baud rate with a host, and the required pulse per second.

                Each sentence is preceded with a ‘$’ symbol and ends with a line-feed character. At one sentence per second, the following is out put in four seconds:

                $PGRMF, 223, 424798, 041203, 215945, 13, 0000.0000, N, 00000.0000, W, A, 2, 0, 62, 2, 1*3B
                $PGRMF, 223, 424799, 041203, 215946, 13, 00000.0000, N, 00000.0000, W, A, 2, 0, 62, 2, 1*39
                $PGRMF, 223, 424800, 041203, 215947, 13, 00000.0000, N, 00000.0000, W, A, 2, 0, 62, 2, 1*34
                $PGRMF, 223, 424801, 041203, 215948, 13, 00000.0000, N, 00000.0000, W, A, 2, 0, 62, 2, 1*35

                The sentence is proprietary to the Garmin GPS Global Positioning System and is translated below.

                $PGRMF
                <1>GPS Week Number(0-1023)
                <2>GPS Seconds (0 - 604799)
                <3>UTC Date of position fix, ddmmyy format
                <4>UTC time of position fix, hhmmss format
                <5>GPS leap second count
                <6>Latitude, ddmm.mmmm format (leading zeros transmitted)
                <7>Latitude hemisphere N or S
                <8>Longitude, ddmm.mmmm format (leading zeros transmitted)
                <9>Longitude hemisphere N or S
                <10>Mode M = Manual, A automatic
                <11>Fix type 0 = No Fix, 1 = 2D Fix, 2 = 3D fix
                <12>Speed over ground, 0 to 359 degrees true
                <13>Course over ground, 0 to 9 (rounded to nearest intvalue)
                <14>Time dilution of precision, 0 to 9 (rnded nearest int val)
                <15>Time dilution of precision, 0 to 9 (rnded nearest int val)
                *hh <CR><LF>
             */

            // TODO: Convert GPS week number/seconds to UTC date/time

            // Do we have enough words to parse the fix status?
            if (wordCount >= 4 && words[2].Length != 0 && words[3].Length != 0)
            {
                // Build a UTC date/time object.
                _utcDateTime = new DateTime(
                    int.Parse(words[2].Substring(4, 2), NmeaCultureInfo) + 2000, // Year
                    int.Parse(words[2].Substring(2, 2), NmeaCultureInfo), // Month
                    int.Parse(words[2].Substring(0, 2), NmeaCultureInfo), // Day
                    int.Parse(words[3].Substring(0, 2), NmeaCultureInfo), // Hour
                    int.Parse(words[3].Substring(2, 2), NmeaCultureInfo), // Minute
                    int.Parse(words[3].Substring(4, 2), NmeaCultureInfo), // Second
                    DateTimeKind.Utc);
            }

            #region Position

            // Can we parse the latitude and longitude?
            if (wordCount >= 8 && words[5].Length != 0 && words[6].Length != 0 && words[7].Length != 0 && words[8].Length != 0)
            {
                #region Parse the latitude

                string latitudeWord = words[5];
                int latitudeHours = int.Parse(latitudeWord.Substring(0, 2), NmeaCultureInfo);
                double latitudeDecimalMinutes = double.Parse(latitudeWord.Substring(2), NmeaCultureInfo);
                LatitudeHemisphere latitudeHemisphere =
                    words[6].Equals("N", StringComparison.Ordinal) ? LatitudeHemisphere.North : LatitudeHemisphere.South;

                #endregion Parse the latitude

                #region Parse the longitude

                string longitudeWord = words[7];
                int longitudeHours = int.Parse(longitudeWord.Substring(0, 3), NmeaCultureInfo);
                double longitudeDecimalMinutes = double.Parse(longitudeWord.Substring(3), NmeaCultureInfo);
                LongitudeHemisphere longitudeHemisphere =
                    words[8].Equals("E", StringComparison.Ordinal) ? LongitudeHemisphere.East : LongitudeHemisphere.West;

                #endregion Parse the longitude

                #region Build a Position from the latitude and longitude

                _position = new Position(
                                new Latitude(latitudeHours, latitudeDecimalMinutes, latitudeHemisphere),
                                new Longitude(longitudeHours, longitudeDecimalMinutes, longitudeHemisphere));

                #endregion Build a Position from the latitude and longitude
            }
            else
            {
                _position = Position.Invalid;
            }

            #endregion Position

            #region Fix Mode

            if (wordCount >= 9 && words[9].Length != 0)
            {
                _fixMode = words[9] == "A" ? FixMode.Automatic : FixMode.Manual;
            }
            else
            {
                _fixMode = FixMode.Unknown;
            }

            #endregion Fix Mode

            #region Fix Quality

            // Do we have enough data for fix quality?
            if (wordCount >= 10 && words[10].Length != 0)
            {
                switch (int.Parse(words[10], NmeaCultureInfo))
                {
                    case 0:
                        _fixQuality = FixQuality.NoFix;
                        break;
                    case 1:
                        _fixQuality = FixQuality.GpsFix;
                        break;
                    case 2:
                        _fixQuality = FixQuality.DifferentialGpsFix;
                        break;
                    case 3:
                        _fixQuality = FixQuality.PulsePerSecond;
                        break;
                    case 4:
                        _fixQuality = FixQuality.FixedRealTimeKinematic;
                        break;
                    case 5:
                        _fixQuality = FixQuality.FloatRealTimeKinematic;
                        break;
                    case 6:
                        _fixQuality = FixQuality.Estimated;
                        break;
                    case 7:
                        _fixQuality = FixQuality.ManualInput;
                        break;
                    case 8:
                        _fixQuality = FixQuality.Simulated;
                        break;
                    default:
                        _fixQuality = FixQuality.Unknown;
                        break;
                }
            }
            else
            {
                // This fix quality is invalid
                _fixQuality = FixQuality.Unknown;
            }

            #endregion Fix Quality

            #region Bearing

            // Do we have enough data for fix quality?
            if (wordCount >= 13 && words[12].Length != 0)
            {
                _bearing = new Azimuth(words[12], NmeaCultureInfo);
            }
            else
            {
                _bearing = Azimuth.Invalid;
            }

            #endregion Bearing

            #region Speed

            // Do we have enough data for fix quality?
            if (wordCount >= 12 && words[11].Length != 0)
            {
                _speed = Speed.FromKilometersPerHour(double.Parse(words[11], NmeaCultureInfo));
            }
            else
            {
                _speed = Speed.Invalid;
            }

            #endregion Speed

            #region Position Dilution of Precision

            // Do we have enough data for fix quality?
            if (wordCount >= 13 && words[13].Length != 0)
            {
                _positionDop = new DilutionOfPrecision(float.Parse(words[13], NmeaCultureInfo));
            }
            else
            {
                _positionDop = DilutionOfPrecision.Invalid;
            }

            #endregion Position Dilution of Precision
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Called when [sentence changed].
        /// </summary>
        protected override void OnSentenceChanged()
        {
            // Process the basic sentence elements
            base.OnSentenceChanged();

            // Cache the word array
            string[] words = Words;
            int wordCount = words.Length;

            // Do we have enough words to parse the UTC date/time?
            if (wordCount >= 2 && words[0].Length != 0 && words[1].Length != 0)
            {
                #region Parse the UTC time

                string utcTimeWord = words[0];
                int utcHours = int.Parse(utcTimeWord.Substring(0, 2), NmeaCultureInfo);
                int utcMinutes = int.Parse(utcTimeWord.Substring(2, 2), NmeaCultureInfo);
                int utcSeconds = int.Parse(utcTimeWord.Substring(4, 2), NmeaCultureInfo);
                int utcMilliseconds = Convert.ToInt32(float.Parse(utcTimeWord.Substring(6), NmeaCultureInfo) * 1000, NmeaCultureInfo);

                #endregion Parse the UTC time

                #region Parse the UTC date

                string utcDateWord = words[1];
                int utcMonth = int.Parse(utcDateWord.Substring(0, 2), NmeaCultureInfo);
                int utcDay = int.Parse(utcDateWord.Substring(2, 2), NmeaCultureInfo);
                int utcYear = int.Parse(utcDateWord.Substring(4, 2), NmeaCultureInfo) + 2000;

                #endregion Parse the UTC date

                #region Build a UTC date/time

                _utcDateTime = new DateTime(utcYear, utcMonth, utcDay, utcHours, utcMinutes, utcSeconds, utcMilliseconds, DateTimeKind.Utc);

                #endregion Build a UTC date/time
            }
            else
            {
                // The UTC date/time is invalid
                _utcDateTime = DateTime.MinValue;
            }

            // Do we have enough data to parse the location?
            if (wordCount >= 6 && words[2].Length != 0 && words[3].Length != 0 && words[4].Length != 0 && words[5].Length != 0)
            {
                #region Parse the latitude

                string latitudeWord = words[2];
                int latitudeHours = int.Parse(latitudeWord.Substring(0, 2), NmeaCultureInfo);
                double latitudeDecimalMinutes = double.Parse(latitudeWord.Substring(2), NmeaCultureInfo);
                LatitudeHemisphere latitudeHemisphere =
                    words[3].Equals("N", StringComparison.OrdinalIgnoreCase) ? LatitudeHemisphere.North : LatitudeHemisphere.South;

                #endregion Parse the latitude

                #region Parse the longitude

                string longitudeWord = words[4];
                int longitudeHours = int.Parse(longitudeWord.Substring(0, 3), NmeaCultureInfo);
                double longitudeDecimalMinutes = double.Parse(longitudeWord.Substring(3), NmeaCultureInfo);
                LongitudeHemisphere longitudeHemisphere =
                    words[5].Equals("E", StringComparison.OrdinalIgnoreCase) ? LongitudeHemisphere.East : LongitudeHemisphere.West;

                #endregion Parse the longitude

                #region Build a Position from the latitude and longitude

                _position = new Position(
                                new Latitude(latitudeHours, latitudeDecimalMinutes, latitudeHemisphere),
                                new Longitude(longitudeHours, longitudeDecimalMinutes, longitudeHemisphere));

                #endregion Build a Position from the latitude and longitude
            }

            // Do we have enough data for the fix quality?
            if (wordCount > 7 && words[7].Length != 0)
            {
                switch (Convert.ToInt32(words[7], NmeaCultureInfo))
                {
                    case 0:
                        _fixQuality = FixQuality.NoFix;
                        break;
                    case 1:
                        _fixQuality = FixQuality.GpsFix;
                        break;
                    case 2:
                        _fixQuality = FixQuality.DifferentialGpsFix;
                        break;
                    case 3:
                        _fixQuality = FixQuality.PulsePerSecond;
                        break;
                    case 4:
                        _fixQuality = FixQuality.FixedRealTimeKinematic;
                        break;
                    case 5:
                        _fixQuality = FixQuality.FloatRealTimeKinematic;
                        break;
                    case 6:
                        _fixQuality = FixQuality.Estimated;
                        break;
                    case 7:
                        _fixQuality = FixQuality.ManualInput;
                        break;
                    case 8:
                        _fixQuality = FixQuality.Simulated;
                        break;
                    default:
                        _fixQuality = FixQuality.Unknown;
                        break;
                }
            }
            else
            {
                // The fix quality is invalid
                _fixQuality = FixQuality.Unknown;
            }

            // Process the fixed satellite count
            //_fixedSatelliteCount = wordCount > 8 ? int.Parse(Words[8], NmeaCultureInfo) : 0;

            // Process the mean DOP
            if (wordCount > 9 && Words[9].Length != 0)
                _meanDilutionOfPrecision = new DilutionOfPrecision(float.Parse(Words[9], NmeaCultureInfo));
            else
                _meanDilutionOfPrecision = DilutionOfPrecision.Maximum;

            // Altitude above ellipsoid
            if (wordCount > 10 && Words[10].Length != 0)
                _altitudeAboveEllipsoid = new Distance(double.Parse(Words[10], NmeaCultureInfo), DistanceUnit.Meters).ToLocalUnitType();
            else
                _altitudeAboveEllipsoid = Distance.Empty;
        }
Ejemplo n.º 14
0
        void UpdateData(object sender, System.EventArgs args)
        {
            try
            {
                if (gps.Opened)
                {
                    string str = "";
                    if (device != null)
                    {
                        str = "Name: '" + device.FriendlyName + "' Svc: '" + device.ServiceState + "', Dvc: '" + device.DeviceState + "'\r\n";
                    }
                    else
                    {
                        str = "Name: '' Svc:''\r\n";
                    }

                    if (position != null)
                    {
                        //if all valid
                        if ((((((this.position.LatitudeValid && this.position.LongitudeValid) && this.position.SatellitesInSolutionValid) && this.position.SatellitesInViewValid) && this.position.SatelliteCountValid) && this.position.TimeValid) && (this.position.SatelliteCount > 2))
                        {
                            m_FixValid = true;
                            if (m_XMLLogging)
                            {
                                this.position2XMLFile(this.position);
                            }
                        }
                        else
                        {
                            m_FixValid = false;
                        }

                        //Latitude
                        if (position.LatitudeValid)
                        {
                            str += "Lat: " + position.Latitude.ToString("00.000") + " ";
                            //str += "Lat (D,M,S): " + position.LatitudeInDegreesMinutesSeconds + "\r\n";
                        }
                        else
                        {
                            str += "Lat: --.--- ";
                        }

                        //Longitude
                        if (position.LongitudeValid)
                        {
                            str += "Lon: " + position.Longitude.ToString("00.000") + "\r\n";
                            //str += "Lon (D,M,S): " + position.LongitudeInDegreesMinutesSeconds + "\r\n";
                        }
                        else
                        {
                            str += "Lon: --.---\r\n";
                        }

                        //sat in view and in solution
                        if (position.SatellitesInSolutionValid &&
                            position.SatellitesInViewValid &&
                            position.SatelliteCountValid)
                        {
                            str += "Sat. Count: " + position.GetSatellitesInSolution().Length + "/" +
                                   position.GetSatellitesInView().Length + " (" +
                                   position.SatelliteCount + ")\r\n";
                        }
                        //list sats in solution
                        if (position.SatellitesInSolutionValid)
                        {
                            satSol = position.GetSatellitesInSolution();
                        }
                        //list sats in view and there signal
                        if (position.SatellitesInViewValid)
                        {
                            /* Satellite[] */
                            sats = position.GetSatellitesInView();
                            str += "SV:";
                            foreach (Satellite sat in sats)
                            {
                                str += sat.Id.ToString("00") + " ";
                            }
                            str += "\r\nSN:";
                            foreach (Satellite sat in sats)
                            {
                                str += sat.SignalStrength.ToString("00") + " ";
                            }
                            str += "\r\n";
                            panel1.Invalidate();
                        }
                        else
                        {
                            //panel1.Invalidate();
                        }
                        //time
                        if (position.TimeValid)
                        {
                            str += "Time: " + position.Time.ToString() + "\r\n";
                            if (m_FixValid)
                            {
                                SetTimeToGPS(position.Time);
                            }
                        }

                        //fixtype
                        FixType fx = position.eFixType;
                        switch (fx)
                        {
                        case FixType.Unknown: str += "FixType: Unknown\r\n";
                            break;

                        case FixType.XyD: str += "FixType: 2D\r\n";
                            break;

                        case FixType.XyzD: str += "FixType: 3D\r\n";
                            break;
                        }
                        //fix quality
                        FixQuality fq = position.eFixQuality;
                        switch (fq)
                        {
                        case FixQuality.Unknown: str += "FixQuality: Unknown\r\n";
                            break;

                        case FixQuality.Gps: str += "FixQuality: GPS\r\n";
                            break;

                        case FixQuality.DGps: str += "FixQuality: DGPS\r\n";
                            break;
                        }
                    }
                    panel1.Invalidate();

                    status.Text = str;
                }
            }
            catch (NullReferenceException)
            {
            }
        }
Ejemplo n.º 15
0
		/// <summary>
		/// Creates a new instance with the specified fix quality measurement.
		/// </summary>
		/// <param name="fixQuality">A value from the <strong>FixQuality</strong> enumeration.</param>
		/// <remarks></remarks>
		public FixQualityEventArgs(FixQuality fixQuality)
		{
			_FixQuality = fixQuality;
		}
Ejemplo n.º 16
0
        protected override void OnSentenceChanged()
        {
            // Parse the basic sentence information
            base.OnSentenceChanged();

            // Cache the words
            string[] words = base.Words;
            int wordCount = words.Length;

            // Do we have enough data to process the UTC time?
            if (wordCount >= 1 && words[0].Length != 0)
            {
                #region UTC Time

                string utcTimeWord = words[0];
                int utcHours = int.Parse(utcTimeWord.Substring(0, 2), NmeaCultureInfo);
                int utcMinutes = int.Parse(utcTimeWord.Substring(2, 2), NmeaCultureInfo);
                int utcSeconds = int.Parse(utcTimeWord.Substring(4, 2), NmeaCultureInfo);
                int utcMilliseconds = 0;
                if(utcTimeWord.Length > 6)
                    utcMilliseconds = Convert.ToInt32(float.Parse(utcTimeWord.Substring(6), NmeaCultureInfo) * 1000, NmeaCultureInfo);

                // Build a TimeSpan for this value
                _UtcTime = new TimeSpan(0, utcHours, utcMinutes, utcSeconds, utcMilliseconds);

                #endregion
            }
            else
            {
                // The UTC time is invalid
                _UtcTime = TimeSpan.MinValue;
            }

            // Do we have enough data for locations?
            if (wordCount >= 5 && words[1].Length != 0 && words[2].Length != 0 && words[3].Length != 0 && words[4].Length != 0)
            {
                #region Latitude

                string latitudeWord = words[1];
                int latitudeHours = int.Parse(latitudeWord.Substring(0, 2), NmeaCultureInfo);
                double latitudeDecimalMinutes = double.Parse(latitudeWord.Substring(2), NmeaCultureInfo);
                LatitudeHemisphere latitudeHemisphere =
                    words[2].Equals("N", StringComparison.OrdinalIgnoreCase) ? LatitudeHemisphere.North : LatitudeHemisphere.South;

                #endregion

                #region Longitude

                string longitudeWord = words[3];
                int longitudeHours = int.Parse(longitudeWord.Substring(0, 3), NmeaCultureInfo);
                double longitudeDecimalMinutes = double.Parse(longitudeWord.Substring(3), NmeaCultureInfo);
                LongitudeHemisphere longitudeHemisphere =
                    words[4].Equals("E", StringComparison.OrdinalIgnoreCase) ? LongitudeHemisphere.East : LongitudeHemisphere.West;

                #endregion

                #region Position

                _Position = new Position(
                                new Latitude(latitudeHours, latitudeDecimalMinutes, latitudeHemisphere),
                                new Longitude(longitudeHours, longitudeDecimalMinutes, longitudeHemisphere));

                #endregion
            }
            else
            {
                _Position = Position.Invalid;
            }

            // Do we have enough data for fix quality?
            if (wordCount >= 6 && words[5].Length != 0)
            {
                #region Fix Quality

                switch (int.Parse(words[5], NmeaCultureInfo))
                {
                    case 0:
                        _FixQuality = FixQuality.NoFix;
                        break;
                    case 1:
                        _FixQuality = FixQuality.GpsFix;
                        break;
                    case 2:
                        _FixQuality = FixQuality.DifferentialGpsFix;
                        break;
                    case 3:
                        _FixQuality = FixQuality.PulsePerSecond;
                        break;
                    case 4:
                        _FixQuality = FixQuality.FixedRealTimeKinematic;
                        break;
                    case 5:
                        _FixQuality = FixQuality.FloatRealTimeKinematic;
                        break;
                    case 6:
                        _FixQuality = FixQuality.Estimated;
                        break;
                    case 7:
                        _FixQuality = FixQuality.ManualInput;
                        break;
                    case 8:
                        _FixQuality = FixQuality.Simulated;
                        break;
                    default:
                        _FixQuality = FixQuality.Unknown;
                        break;
                }

                #endregion
            }
            else
            {
                // This fix quality is invalid
                _FixQuality = FixQuality.Unknown;
            }

            // Number of satellites in view is skipped.  We'll work off of GPGSV data.
            if (wordCount >= 7 && words[6].Length != 0)
            {
                _FixedSatelliteCount = int.Parse(words[6], NmeaCultureInfo);
            }

            // Is there enough information to process horizontal dilution of precision?
            if (wordCount >= 8 && words[7].Length != 0)
            {   
                #region Horizontal Dilution of Precision

                _HorizontalDilutionOfPrecision =
                    new DilutionOfPrecision(float.Parse(words[7], NmeaCultureInfo));
            
                #endregion
            }
            else
            {
                // The HDOP is invalid
                _HorizontalDilutionOfPrecision = DilutionOfPrecision.Invalid;
            }

            // Is there enough information to process altitude?
            if (wordCount >= 9 && words[8].Length != 0)
            {
                #region Altitude

                // Altitude is the 8th NMEA word
                _Altitude = new Distance(float.Parse(words[8], NmeaCultureInfo), DistanceUnit.Meters);

                #endregion
            }
            else
            {
                // The altitude is invalid
                _Altitude = Distance.Invalid;
            }

            // Is there enough information to process geoidal separation?
            if (wordCount >= 11 && words[10].Length != 0)
            {
                #region Geoidal Separation

                // Parse the geoidal separation
                _GeoidalSeparation = new Distance(float.Parse(words[10], NmeaCultureInfo), DistanceUnit.Meters);

                #endregion
            }
            else
            {
                // The geoidal separation is invalid
                _GeoidalSeparation = Distance.Invalid;
            }

            // Is there enough info to process Differential GPS info?
            if (wordCount >= 14 && words[12].Length != 0 && words[13].Length != 0)
            {
                #region Differential GPS information

                if (words[12].Length != 0)
                    _DifferentialGpsAge = TimeSpan.FromSeconds(float.Parse(words[12], NmeaCultureInfo));
                else
                    _DifferentialGpsAge = TimeSpan.MinValue;

                if (words[13].Length != 0)
                    _DifferentialGpsStationID = int.Parse(words[13], NmeaCultureInfo);
                else
                    _DifferentialGpsStationID = -1;

                #endregion
            }
            else
            {
                _DifferentialGpsStationID = -1;
                _DifferentialGpsAge = TimeSpan.MinValue;
            }
        }
Ejemplo n.º 17
0
        public GpggaSentence(TimeSpan utcTime, Position position, FixQuality fixQuality, int trackedSatelliteCount,
                            DilutionOfPrecision horizontalDilutionOfPrecision, Distance altitude, Distance geoidalSeparation,
                            TimeSpan differentialGpsAge, int differentialGpsStationID)
        {        
            // Use a string builder to create the sentence text
            StringBuilder builder = new StringBuilder(128);

            #region Append the command word

            // Append the command word
            builder.Append("$GPGGA");

            #endregion

            // Append a comma
            builder.Append(',');

            #region Append the UTC time

            /* Convert UTC time to a string in the form HHMMSS.SSSS. Any value less than 10 will be
             * padded with a zero.
             */

            builder.Append(_UtcTime.Hours.ToString("0#", NmeaCultureInfo));
            builder.Append(_UtcTime.Minutes.ToString("0#", NmeaCultureInfo));
            builder.Append(_UtcTime.Seconds.ToString("0#", NmeaCultureInfo));
            builder.Append(".");
            builder.Append(_UtcTime.Milliseconds.ToString("00#", NmeaCultureInfo));

            #endregion

            // Append a comma
            builder.Append(',');

            #region Append the position

            // Append latitude in the format HHMM.MMMM. 
            builder.Append(position.Latitude.ToString("HHMM.MMMM,I,", NmeaCultureInfo));
            // Append Longitude in the format HHHMM.MMMM.
            builder.Append(position.Longitude.ToString("HHHMM.MMMM,I,", NmeaCultureInfo));

            #endregion

            #region Append fix quality

            switch (fixQuality)
            {
                case FixQuality.NoFix:
                    builder.Append("0");
                    break;
                case FixQuality.GpsFix:
                    builder.Append("1");
                    break;
                case FixQuality.DifferentialGpsFix:
                    builder.Append("2");
                    break;
                case FixQuality.PulsePerSecond:
                    builder.Append("3");
                    break;
                case FixQuality.FixedRealTimeKinematic:
                    builder.Append("4");
                    break;
                case FixQuality.FloatRealTimeKinematic:
                    builder.Append("5");
                    break;
                case FixQuality.Estimated:
                    builder.Append("6");
                    break;
                case FixQuality.ManualInput:
                    builder.Append("7");
                    break;
                case FixQuality.Simulated:
                    builder.Append("8");
                    break;              
            }

            #endregion

            // Append a comma
            builder.Append(",");

            // Append the tracked (signal strength is > 0) satellite count
            builder.Append(trackedSatelliteCount.ToString(NmeaCultureInfo));

            // Append a comma
            builder.Append(",");

            // Append the numerical value of HDOP
            builder.Append(horizontalDilutionOfPrecision.Value.ToString(NmeaCultureInfo));

            // Append a comma
            builder.Append(",");

            #region Altitude above sea level

            // Append the numerical value in meters
            builder.Append(altitude.ToMeters().Value.ToString(NmeaCultureInfo));

            // Append a comma, the unit (M = meters), and another comma
            builder.Append(",M,"); 

            #endregion

            #region Geoidal separation

            // Append the numerical value in meters
            builder.Append(geoidalSeparation.ToMeters().Value.ToString(NmeaCultureInfo));

            // Append a comma
            builder.Append(",M,");

            #endregion

            #region Differential GPS information

            // Differnetial signal age in seconds
            if (!differentialGpsAge.Equals(TimeSpan.MinValue))
                builder.Append(differentialGpsAge.TotalSeconds.ToString(NmeaCultureInfo));

            // Append a comma
            builder.Append(",");

            // Station ID
            if (differentialGpsStationID != -1)
                builder.Append(differentialGpsStationID.ToString(NmeaCultureInfo));

            #endregion

            // Set this object's sentence
            SetSentence(builder.ToString());

            // Finally, append the checksum
            AppendChecksum();
        }
Ejemplo n.º 18
0
        /// <summary>
        /// OnSentanceChanged event handler
        /// </summary>
        protected override void OnSentenceChanged()
        {
            base.OnSentenceChanged();

            // Cache the sentence words
            string[] words     = Words;
            int      wordCount = words.Length;

            /*
             *  Garmin produces several embedded GPS systems. They are easy to setup because Garmin provides a nice utility for uploading configuration data to the GPS. You first load the utility to a PC. Connect the PC to the GPS through one of the serial ports. The utility will check each baud rate until it communicates with the GPS.
             *
             *  The common configuration parameters are output sentences from the GPS unit, the communication baud rate with a host, and the required pulse per second.
             *
             *  Each sentence is preceded with a ‘$’ symbol and ends with a line-feed character. At one sentence per second, the following is out put in four seconds:
             *
             *  $PGRMF, 223, 424798, 041203, 215945, 13, 0000.0000, N, 00000.0000, W, A, 2, 0, 62, 2, 1*3B
             *  $PGRMF, 223, 424799, 041203, 215946, 13, 00000.0000, N, 00000.0000, W, A, 2, 0, 62, 2, 1*39
             *  $PGRMF, 223, 424800, 041203, 215947, 13, 00000.0000, N, 00000.0000, W, A, 2, 0, 62, 2, 1*34
             *  $PGRMF, 223, 424801, 041203, 215948, 13, 00000.0000, N, 00000.0000, W, A, 2, 0, 62, 2, 1*35
             *
             *  The sentence is proprietary to the Garmin GPS Global Positioning System and is translated below.
             *
             *  $PGRMF
             *  <1>GPS Week Number(0-1023)
             *  <2>GPS Seconds (0 - 604799)
             *  <3>UTC Date of position fix, ddmmyy format
             *  <4>UTC time of position fix, hhmmss format
             *  <5>GPS leap second count
             *  <6>Latitude, ddmm.mmmm format (leading zeros transmitted)
             *  <7>Latitude hemisphere N or S
             *  <8>Longitude, ddmm.mmmm format (leading zeros transmitted)
             *  <9>Longitude hemisphere N or S
             *  <10>Mode M = Manual, A automatic
             *  <11>Fix type 0 = No Fix, 1 = 2D Fix, 2 = 3D fix
             *  <12>Speed over ground, 0 to 359 degrees true
             *  <13>Course over ground, 0 to 9 (rounded to nearest intvalue)
             *  <14>Time dilution of precision, 0 to 9 (rnded nearest int val)
             *  <15>Time dilution of precision, 0 to 9 (rnded nearest int val)
             * hh <CR><LF>
             */

            // TODO: Convert GPS week number/seconds to UTC date/time

            // Do we have enough words to parse the fix status?
            if (wordCount >= 4 && words[2].Length != 0 && words[3].Length != 0)
            {
                // Build a UTC date/time object.
                _utcDateTime = new DateTime(
                    int.Parse(words[2].Substring(4, 2), NmeaCultureInfo) + 2000, // Year
                    int.Parse(words[2].Substring(2, 2), NmeaCultureInfo),        // Month
                    int.Parse(words[2].Substring(0, 2), NmeaCultureInfo),        // Day
                    int.Parse(words[3].Substring(0, 2), NmeaCultureInfo),        // Hour
                    int.Parse(words[3].Substring(2, 2), NmeaCultureInfo),        // Minute
                    int.Parse(words[3].Substring(4, 2), NmeaCultureInfo),        // Second
                    DateTimeKind.Utc);
            }

            #region Position

            // Can we parse the latitude and longitude?
            if (wordCount >= 8 && words[5].Length != 0 && words[6].Length != 0 && words[7].Length != 0 && words[8].Length != 0)
            {
                #region Parse the latitude

                string             latitudeWord           = words[5];
                int                latitudeHours          = int.Parse(latitudeWord.Substring(0, 2), NmeaCultureInfo);
                double             latitudeDecimalMinutes = double.Parse(latitudeWord.Substring(2), NmeaCultureInfo);
                LatitudeHemisphere latitudeHemisphere     =
                    words[6].Equals("N", StringComparison.Ordinal) ? LatitudeHemisphere.North : LatitudeHemisphere.South;

                #endregion Parse the latitude

                #region Parse the longitude

                string longitudeWord                    = words[7];
                int    longitudeHours                   = int.Parse(longitudeWord.Substring(0, 3), NmeaCultureInfo);
                double longitudeDecimalMinutes          = double.Parse(longitudeWord.Substring(3), NmeaCultureInfo);
                LongitudeHemisphere longitudeHemisphere =
                    words[8].Equals("E", StringComparison.Ordinal) ? LongitudeHemisphere.East : LongitudeHemisphere.West;

                #endregion Parse the longitude

                #region Build a Position from the latitude and longitude

                _position = new Position(
                    new Latitude(latitudeHours, latitudeDecimalMinutes, latitudeHemisphere),
                    new Longitude(longitudeHours, longitudeDecimalMinutes, longitudeHemisphere));

                #endregion Build a Position from the latitude and longitude
            }
            else
            {
                _position = Position.Invalid;
            }

            #endregion Position

            #region Fix Mode

            if (wordCount >= 9 && words[9].Length != 0)
            {
                _fixMode = words[9] == "A" ? FixMode.Automatic : FixMode.Manual;
            }
            else
            {
                _fixMode = FixMode.Unknown;
            }

            #endregion Fix Mode

            #region Fix Quality

            // Do we have enough data for fix quality?
            if (wordCount >= 10 && words[10].Length != 0)
            {
                switch (int.Parse(words[10], NmeaCultureInfo))
                {
                case 0:
                    _fixQuality = FixQuality.NoFix;
                    break;

                case 1:
                    _fixQuality = FixQuality.GpsFix;
                    break;

                case 2:
                    _fixQuality = FixQuality.DifferentialGpsFix;
                    break;

                case 3:
                    _fixQuality = FixQuality.PulsePerSecond;
                    break;

                case 4:
                    _fixQuality = FixQuality.FixedRealTimeKinematic;
                    break;

                case 5:
                    _fixQuality = FixQuality.FloatRealTimeKinematic;
                    break;

                case 6:
                    _fixQuality = FixQuality.Estimated;
                    break;

                case 7:
                    _fixQuality = FixQuality.ManualInput;
                    break;

                case 8:
                    _fixQuality = FixQuality.Simulated;
                    break;

                default:
                    _fixQuality = FixQuality.Unknown;
                    break;
                }
            }
            else
            {
                // This fix quality is invalid
                _fixQuality = FixQuality.Unknown;
            }

            #endregion Fix Quality

            #region Bearing

            // Do we have enough data for fix quality?
            if (wordCount >= 13 && words[12].Length != 0)
            {
                _bearing = new Azimuth(words[12], NmeaCultureInfo);
            }
            else
            {
                _bearing = Azimuth.Invalid;
            }

            #endregion Bearing

            #region Speed

            // Do we have enough data for fix quality?
            if (wordCount >= 12 && words[11].Length != 0)
            {
                _speed = Speed.FromKilometersPerHour(double.Parse(words[11], NmeaCultureInfo));
            }
            else
            {
                _speed = Speed.Invalid;
            }

            #endregion Speed

            #region Position Dilution of Precision

            // Do we have enough data for fix quality?
            if (wordCount >= 13 && words[13].Length != 0)
            {
                _positionDop = new DilutionOfPrecision(float.Parse(words[13], NmeaCultureInfo));
            }
            else
            {
                _positionDop = DilutionOfPrecision.Invalid;
            }

            #endregion Position Dilution of Precision
        }
        public static byte[] GetBytes(DateTimeOffset timestamp, float latitude, float longitude, float speed, float heading, TypeOfFix fix, FixQuality quality, string vehicleRef, string driverRef, string taskRef, string accountRef, UInt64?unitId, UInt16?sequenceNumber, Signal powerOn, Signal doorReleased, Signal stopRequested, Signal inService)
        {
            var outputStream = new MemoryStream();

            using (var writer = new BinaryWriter(outputStream))
            {
                // Message type, always 2 for Hogia Extended Position Message.
                writer.Write((byte)0x02);
                // Message priority, default 127. Note that priority is not supported, its for future use.
                writer.Write((byte)127);
                // Device id that is globally unique, e.g. MAC adress. If not provided (=0), a a vehicleRef must be provided.
                writer.Write((UInt64)(unitId ?? 0UL));
                // Sequence number of message. Shall be reset to zero at device start.
                writer.Write((UInt16)(sequenceNumber ?? 0));
                // Timestamp is in milliseconds from midnight
                writer.Write((UInt32)((timestamp.UtcDateTime - timestamp.UtcDateTime.Date).TotalMilliseconds));
                // Latitude and longitude is in IEEE single precision floating number. A 0,0 position is always regarded as invalid.
                writer.Write(latitude);
                writer.Write(longitude);
                // Speed is in meters per second times 100.
                writer.Write((UInt16)(speed * 100.0f));
                // Heading is in degrees 0 <= value < 360 times 100.
                writer.Write((UInt16)((heading * 100.0f) % 36000));
                // Fix type and quality is combined into one byte
                writer.Write((byte)(fix + (int)quality * 16));
                // The four signals is compined into one byte
                writer.Write((byte)((int)powerOn + (int)doorReleased * 4 + (int)stopRequested * 16 + (int)inService * 64));
                // Distance is a special feature that normally is not sent from vehicles, so write an zero value.
                writer.Write((UInt32)0);
                // The id of the vehicle, unique within a customers context, i.e. TransitCloud account. This field must be provided if unit id is not provided. It can also be provided when a unit id is provided.
                writer.WriteString(vehicleRef);
                // The current id of the driver. Optional.
                writer.WriteString(driverRef);
                // The task id that the vehicle is currently working. See the documentation for how to populate this field. If empty, it is assumed that the vehicle is not working any task.
                writer.WriteString(taskRef);
                // Account id is normally not used. Optional.
                writer.WriteString(accountRef);
            }
            return(outputStream.ToArray());
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Called when [sentence changed].
        /// </summary>
        /// <remarks></remarks>
        protected override void OnSentenceChanged()
        {
            // Process the basic sentence elements
            base.OnSentenceChanged();

            // Cache the word array
            string[] words     = Words;
            int      wordCount = words.Length;

            // Do we have enough words to parse the UTC date/time?
            if (wordCount >= 2 && words[0].Length != 0 && words[1].Length != 0)
            {
                #region Parse the UTC time

                string utcTimeWord     = words[0];
                int    utcHours        = 0;
                int    utcMinutes      = 0;
                int    utcSeconds      = 0;
                int    utcMilliseconds = 0;

                int.TryParse(utcTimeWord.Substring(0, 2), out utcHours);
                int.TryParse(utcTimeWord.Substring(2, 2), out utcMinutes);
                int.TryParse(utcTimeWord.Substring(4, 2), out utcSeconds);

                try
                {
                    utcMilliseconds = Convert.ToInt32(float.Parse(utcTimeWord.Substring(6), NmeaCultureInfo) * 1000, NmeaCultureInfo);
                }
                catch (Exception) { }


                #endregion Parse the UTC time

                #region Parse the UTC date

                string utcDateWord = words[1];
                int    utcMonth    = 0;
                int    utcDay      = 0;
                int    utcYear     = 0;

                int.TryParse(utcDateWord.Substring(0, 2), out utcMonth);
                int.TryParse(utcDateWord.Substring(2, 2), out utcDay);
                int.TryParse(utcDateWord.Substring(4, 2), out utcYear);

                utcYear += 2000;

                #endregion Parse the UTC date

                #region Build a UTC date/time

                _utcDateTime = new DateTime(utcYear, utcMonth, utcDay, utcHours, utcMinutes, utcSeconds, utcMilliseconds, DateTimeKind.Utc);

                #endregion Build a UTC date/time
            }
            else
            {
                // The UTC date/time is invalid
                _utcDateTime = DateTime.MinValue;
            }

            // Do we have enough data to parse the location?
            if (wordCount >= 6 && words[2].Length != 0 && words[3].Length != 0 && words[4].Length != 0 && words[5].Length != 0)
            {
                #region Parse the latitude

                string latitudeWord           = words[2];
                int    latitudeHours          = 0;
                double latitudeDecimalMinutes = 0.0;

                int.TryParse(latitudeWord.Substring(0, 2), out latitudeHours);
                double.TryParse(latitudeWord.Substring(2), out latitudeDecimalMinutes);

                LatitudeHemisphere latitudeHemisphere =
                    words[3].Equals("N", StringComparison.OrdinalIgnoreCase) ? LatitudeHemisphere.North : LatitudeHemisphere.South;

                #endregion Parse the latitude

                #region Parse the longitude

                string longitudeWord           = words[4];
                int    longitudeHours          = 0;
                double longitudeDecimalMinutes = 0.0;

                int.TryParse(longitudeWord.Substring(0, 3), out longitudeHours);
                double.TryParse(longitudeWord.Substring(3), out longitudeDecimalMinutes);

                LongitudeHemisphere longitudeHemisphere =
                    words[5].Equals("E", StringComparison.OrdinalIgnoreCase) ? LongitudeHemisphere.East : LongitudeHemisphere.West;

                #endregion Parse the longitude

                #region Build a Position from the latitude and longitude

                _position = new Position(
                    new Latitude(latitudeHours, latitudeDecimalMinutes, latitudeHemisphere),
                    new Longitude(longitudeHours, longitudeDecimalMinutes, longitudeHemisphere));

                #endregion Build a Position from the latitude and longitude
            }

            // Do we have enough data for the fix quality?
            if (wordCount > 7 && words[7].Length != 0)
            {
                switch (Convert.ToInt32(words[7], NmeaCultureInfo))
                {
                case 0:
                    _fixQuality = FixQuality.NoFix;
                    break;

                case 1:
                    _fixQuality = FixQuality.GpsFix;
                    break;

                case 2:
                    _fixQuality = FixQuality.DifferentialGpsFix;
                    break;

                case 3:
                    _fixQuality = FixQuality.PulsePerSecond;
                    break;

                case 4:
                    _fixQuality = FixQuality.FixedRealTimeKinematic;
                    break;

                case 5:
                    _fixQuality = FixQuality.FloatRealTimeKinematic;
                    break;

                case 6:
                    _fixQuality = FixQuality.Estimated;
                    break;

                case 7:
                    _fixQuality = FixQuality.ManualInput;
                    break;

                case 8:
                    _fixQuality = FixQuality.Simulated;
                    break;

                default:
                    _fixQuality = FixQuality.Unknown;
                    break;
                }
            }
            else
            {
                // The fix quality is invalid
                _fixQuality = FixQuality.Unknown;
            }

            // Process the fixed satellite count
            //_fixedSatelliteCount = wordCount > 8 ? int.Parse(Words[8], NmeaCultureInfo) : 0;

            // Process the mean DOP
            if (wordCount > 9 && Words[9].Length != 0)
            {
                try
                {
                    _meanDilutionOfPrecision = new DilutionOfPrecision(float.Parse(Words[9], NmeaCultureInfo));
                }
                catch (Exception)
                {
                    _meanDilutionOfPrecision = DilutionOfPrecision.Maximum;
                }
            }
            else
            {
                _meanDilutionOfPrecision = DilutionOfPrecision.Maximum;
            }

            // Altitude above ellipsoid
            if (wordCount > 10 && Words[10].Length != 0)
            {
                try
                {
                    _altitudeAboveEllipsoid = new Distance(double.Parse(Words[10], NmeaCultureInfo), DistanceUnit.Meters).ToLocalUnitType();
                }
                catch (Exception)
                {
                    _altitudeAboveEllipsoid = Distance.Empty;
                }
            }
            else
            {
                _altitudeAboveEllipsoid = Distance.Empty;
            }
        }
Ejemplo n.º 21
0
 internal SateliteInfo(int activeSatelites, FixQuality fixQuality)
 {
     m_activeSatelites = activeSatelites;
     m_fixQuality      = fixQuality;
 }
Ejemplo n.º 22
0
        /// <summary>
        /// Updates the fix quality to the specified value.
        /// </summary>
        /// <param name="value">The value.</param>
        protected virtual void SetFixQuality(FixQuality value)
        {
            // If the new value is the same or it's invalid, ignore it
            if (value == _fixQuality || value == FixQuality.Unknown)
                return;

            // Set the new value
            _fixQuality = value;

            // And notify
            if (FixQualityChanged != null)
                FixQualityChanged(this, new FixQualityEventArgs(_fixQuality));
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Creates a new sentence
        /// </summary>
        /// <param name="utcTime">The UTC time.</param>
        /// <param name="position">The position.</param>
        /// <param name="fixQuality">The fix quality.</param>
        /// <param name="trackedSatelliteCount">The tracked satellite count.</param>
        /// <param name="horizontalDilutionOfPrecision">The horizontal dilution of precision.</param>
        /// <param name="altitude">The altitude.</param>
        /// <param name="geoidalSeparation">The geoidal separation.</param>
        /// <param name="differentialGpsAge">The differential GPS age.</param>
        /// <param name="differentialGpsStationID">The differential GPS station ID.</param>
        /// <remarks></remarks>
        public GpggaSentence(TimeSpan utcTime, Position position, FixQuality fixQuality, int trackedSatelliteCount,
                             DilutionOfPrecision horizontalDilutionOfPrecision, Distance altitude, Distance geoidalSeparation,
                             TimeSpan differentialGpsAge, int differentialGpsStationID)
        {
            // Use a string builder to create the sentence text
            StringBuilder builder = new StringBuilder(128);

            #region Append the command word

            // Append the command word
            builder.Append("$GPGGA");

            #endregion Append the command word

            // Append a comma
            builder.Append(',');

            #region Append the UTC time

            /* Convert UTC time to a string in the form HHMMSS.SSSS. Any value less than 10 will be
             * padded with a zero.
             */

            builder.Append(utcTime.Hours.ToString("0#", NmeaCultureInfo));
            builder.Append(utcTime.Minutes.ToString("0#", NmeaCultureInfo));
            builder.Append(utcTime.Seconds.ToString("0#", NmeaCultureInfo));
            builder.Append(".");
            builder.Append(utcTime.Milliseconds.ToString("00#", NmeaCultureInfo));

            #endregion Append the UTC time

            // Append a comma
            builder.Append(',');

            #region Append the position

            // Append latitude in the format HHMM.MMMM.
            builder.Append(position.Latitude.ToString("HHMM.MMMM, I,", NmeaCultureInfo));
            // Append Longitude in the format HHHMM.MMMM.
            builder.Append(position.Longitude.ToString("HHHMM.MMMM, I,", NmeaCultureInfo));

            #endregion Append the position

            #region Append fix quality

            switch (fixQuality)
            {
            case FixQuality.NoFix:
                builder.Append("0");
                break;

            case FixQuality.GpsFix:
                builder.Append("1");
                break;

            case FixQuality.DifferentialGpsFix:
                builder.Append("2");
                break;

            case FixQuality.PulsePerSecond:
                builder.Append("3");
                break;

            case FixQuality.FixedRealTimeKinematic:
                builder.Append("4");
                break;

            case FixQuality.FloatRealTimeKinematic:
                builder.Append("5");
                break;

            case FixQuality.Estimated:
                builder.Append("6");
                break;

            case FixQuality.ManualInput:
                builder.Append("7");
                break;

            case FixQuality.Simulated:
                builder.Append("8");
                break;
            }

            #endregion Append fix quality

            // Append a comma
            builder.Append(",");

            // Append the tracked (signal strength is > 0) satellite count
            builder.Append(trackedSatelliteCount.ToString(NmeaCultureInfo));

            // Append a comma
            builder.Append(",");

            // Append the numerical value of HDOP
            builder.Append(horizontalDilutionOfPrecision.Value.ToString(NmeaCultureInfo));

            // Append a comma
            builder.Append(",");

            #region Altitude above sea level

            // Append the numerical value in meters
            builder.Append(altitude.ToMeters().Value.ToString(NmeaCultureInfo));

            // Append a comma, the unit (M = meters), and another comma
            builder.Append(", M,");

            #endregion Altitude above sea level

            #region Geoidal separation

            // Append the numerical value in meters
            builder.Append(geoidalSeparation.ToMeters().Value.ToString(NmeaCultureInfo));

            // Append a comma
            builder.Append(", M,");

            #endregion Geoidal separation

            #region Differential GPS information

            // Differnetial signal age in seconds
            if (!differentialGpsAge.Equals(TimeSpan.MinValue))
            {
                builder.Append(differentialGpsAge.TotalSeconds.ToString(NmeaCultureInfo));
            }

            // Append a comma
            builder.Append(",");

            // Station ID
            if (differentialGpsStationID != -1)
            {
                builder.Append(differentialGpsStationID.ToString(NmeaCultureInfo));
            }

            #endregion Differential GPS information

            // Set this object's sentence
            SetSentence(builder.ToString());

            // Finally, append the checksum
            AppendChecksum();
        }
Ejemplo n.º 24
0
        /// <summary>
        /// Called when [sentence changed].
        /// </summary>
        /// <remarks></remarks>
        protected override void OnSentenceChanged()
        {
            // Parse the basic sentence information
            base.OnSentenceChanged();

            // Cache the words
            string[] words     = Words;
            int      wordCount = words.Length;

            // Do we have enough data to process the UTC time?
            if (wordCount >= 1 && words[0].Length != 0)
            {
                #region UTC Time

                string utcTimeWord     = words[0];
                int    utcHours        = 0;
                int    utcMinutes      = 0;
                int    utcSeconds      = 0;
                int    utcMilliseconds = 0;

                if (utcTimeWord.Length >= 6)
                {
                    int.TryParse(utcTimeWord.Substring(0, 2), out utcHours);
                    int.TryParse(utcTimeWord.Substring(2, 2), out utcMinutes);
                    int.TryParse(utcTimeWord.Substring(4, 2), out utcSeconds);
                }

                if (utcTimeWord.Length > 6)
                {
                    try
                    {
                        utcMilliseconds = Convert.ToInt32(float.Parse(utcTimeWord.Substring(6), NmeaCultureInfo) * 1000, NmeaCultureInfo);
                    }
                    catch (Exception) { }
                }


                // Build a TimeSpan for this value
                _utcTime = new TimeSpan(0, utcHours, utcMinutes, utcSeconds, utcMilliseconds);

                #endregion UTC Time
            }
            else
            {
                // The UTC time is invalid
                _utcTime = TimeSpan.MinValue;
            }

            // Do we have enough data for locations?
            if (wordCount >= 5 && words[1].Length != 0 && words[2].Length != 0 && words[3].Length != 0 && words[4].Length != 0)
            {
                #region Latitude

                string latitudeWord           = words[1];
                int    latitudeHours          = 0;
                double latitudeDecimalMinutes = 0.0;
                if (latitudeWord.Length > 3)
                {
                    int.TryParse(latitudeWord.Substring(0, 2), out latitudeHours);
                    double.TryParse(latitudeWord.Substring(2), out latitudeDecimalMinutes);
                }

                LatitudeHemisphere latitudeHemisphere =
                    words[2].Equals("N", StringComparison.OrdinalIgnoreCase) ? LatitudeHemisphere.North : LatitudeHemisphere.South;

                #endregion Latitude

                #region Longitude

                string longitudeWord           = words[3];
                int    longitudeHours          = 0;
                double longitudeDecimalMinutes = 0.0;
                if (longitudeWord.Length > 4)
                {
                    int.TryParse(longitudeWord.Substring(0, 3), out longitudeHours);
                    double.TryParse(longitudeWord.Substring(3), out longitudeDecimalMinutes);
                }

                LongitudeHemisphere longitudeHemisphere =
                    words[4].Equals("E", StringComparison.OrdinalIgnoreCase) ? LongitudeHemisphere.East : LongitudeHemisphere.West;

                #endregion Longitude

                #region Position

                _position = new Position(
                    new Latitude(latitudeHours, latitudeDecimalMinutes, latitudeHemisphere),
                    new Longitude(longitudeHours, longitudeDecimalMinutes, longitudeHemisphere));

                #endregion Position
            }
            else
            {
                _position = Position.Invalid;
            }

            // Do we have enough data for fix quality?
            if (wordCount >= 6 && words[5].Length != 0)
            {
                #region Fix Quality

                int fixQual = -1;
                int.TryParse(words[5], out fixQual);

                switch (fixQual)
                {
                case 0:
                    _fixQuality = FixQuality.NoFix;
                    break;

                case 1:
                    _fixQuality = FixQuality.GpsFix;
                    break;

                case 2:
                    _fixQuality = FixQuality.DifferentialGpsFix;
                    break;

                case 3:
                    _fixQuality = FixQuality.PulsePerSecond;
                    break;

                case 4:
                    _fixQuality = FixQuality.FixedRealTimeKinematic;
                    break;

                case 5:
                    _fixQuality = FixQuality.FloatRealTimeKinematic;
                    break;

                case 6:
                    _fixQuality = FixQuality.Estimated;
                    break;

                case 7:
                    _fixQuality = FixQuality.ManualInput;
                    break;

                case 8:
                    _fixQuality = FixQuality.Simulated;
                    break;

                default:
                    _fixQuality = FixQuality.Unknown;
                    break;
                }

                #endregion Fix Quality
            }
            else
            {
                // This fix quality is invalid
                _fixQuality = FixQuality.Unknown;
            }

            // Number of satellites in view is skipped.  We'll work off of GPGSV data.
            if (wordCount >= 7 && words[6].Length != 0)
            {
                int.TryParse(words[6], out _fixedSatelliteCount);
            }

            // Is there enough information to process horizontal dilution of precision?
            if (wordCount >= 8 && words[7].Length != 0)
            {
                #region Horizontal Dilution of Precision

                try
                {
                    _horizontalDilutionOfPrecision =
                        new DilutionOfPrecision(float.Parse(words[7], NmeaCultureInfo));
                }
                catch (Exception)
                {
                    _horizontalDilutionOfPrecision = DilutionOfPrecision.Invalid;
                }

                #endregion Horizontal Dilution of Precision
            }
            else
            {
                // The HDOP is invalid
                _horizontalDilutionOfPrecision = DilutionOfPrecision.Invalid;
            }

            // Is there enough information to process altitude?
            if (wordCount >= 9 && words[8].Length != 0)
            {
                #region Altitude

                try
                {
                    // Altitude is the 8th NMEA word
                    _altitude = new Distance(float.Parse(words[8], NmeaCultureInfo), DistanceUnit.Meters);
                }
                catch (Exception)
                {
                    _altitude = Distance.Invalid;
                }

                #endregion Altitude
            }
            else
            {
                // The altitude is invalid
                _altitude = Distance.Invalid;
            }

            // Is there enough information to process geoidal separation?
            if (wordCount >= 11 && words[10].Length != 0)
            {
                #region Geoidal Separation

                try
                {
                    // Parse the geoidal separation
                    _geoidalSeparation = new Distance(float.Parse(words[10], NmeaCultureInfo), DistanceUnit.Meters);
                }
                catch (Exception)
                {
                    _geoidalSeparation = Distance.Invalid;
                }

                #endregion Geoidal Separation
            }
            else
            {
                // The geoidal separation is invalid
                _geoidalSeparation = Distance.Invalid;
            }

            // Is there enough info to process Differential GPS info?
            if (wordCount >= 14 && words[12].Length != 0 && words[13].Length != 0)
            {
                #region Differential GPS information

                try
                {
                    _differentialGpsAge = words[12].Length != 0 ? TimeSpan.FromSeconds(float.Parse(words[12], NmeaCultureInfo)) : TimeSpan.MinValue;
                }
                catch (Exception) { }

                if (words[13].Length != 0)
                {
                    if (!int.TryParse(words[13], out _differentialGpsStationID))
                    {
                        _differentialGpsStationID = -1;
                    }
                }
                else
                {
                    _differentialGpsStationID = -1;
                }


                #endregion Differential GPS information
            }
            else
            {
                _differentialGpsStationID = -1;
                _differentialGpsAge       = TimeSpan.MinValue;
            }
        }