protected void ProcessGPSTimeout()
 {
     mStatus = GPS_STATUS.OFFLINE;
     mGPSPosition.Invalidate();
     OnRaiseGPSStatusChangedEvent(new GPSStatusEvent(mStatus));
 }
Exemple #2
0
        private void ProcessNewSentence(string sentence)
        {
            if (sentence.Length < 6)
            {
                OnRaiseGPSStatusChangedEvent(new GPSStatusEvent(GPS_STATUS.OFFLINE));
                CNXLog.ErrorFormat("NMEAClient short sentence {0}", sentence);
                return;
            }

            try
            {
                //CNXLog.InfoFormat("NMEAClient ProcessNewSentence {0}", sentence);
                bool   updateAvailable = false;
                string sentenceType    = "";

                if (sentence.Contains("RMC"))
                {
                    sentenceType = "RMC";
                }
                else if (sentence.Contains("GGA"))
                {
                    sentenceType = "GGA";
                }
                else if (sentence.Contains("GSA"))
                {
                    sentenceType = "GSA";
                }

                // Determine the type of sentence.
                // The NMEA specification states that the first two letters of a sentence may change.
                // For example, for "$GPGSV" there may be variations such as "$__GSV" where the first two letters change.
                // As a result, we need only test the last three characters.

                // Is this a GPRMC sentence?
                if (sentenceType.Equals("RMC", StringComparison.Ordinal))
                {
                    updateAvailable = mGPSPosition.ParseRMC(sentence);
                    if (!updateAvailable)
                    {
                        OnRaiseGPSPositionChangedEvent(new GPSPositionEvent(mGPSPosition));
                    }
                }
                else if (sentenceType.Equals("GGA", StringComparison.Ordinal))
                {
                    // dont update on GGA, only augment error estimates.
                    updateAvailable = mGPSPosition.ParseGGA(sentence);
                }
                else if (sentenceType.Equals("GSA", StringComparison.Ordinal))
                {
                    updateAvailable = mGPSPosition.ParseGSA(sentence);
                }

                if (updateAvailable)
                {
                    mLastNMEASentenceType = sentenceType;

                    // report any status changes
                    GPS_STATUS status = GPS_STATUS.OFFLINE;
                    switch (mGPSPosition.NMEAMode)
                    {
                    case GPSPosition.NMEAMODE.NO_FIX:
                        status           = GPS_STATUS.Connected;
                        mTravellingState = MovingState.Unknown;
                        break;

                    case GPSPosition.NMEAMODE.NO_MODE:
                        status           = GPS_STATUS.Connected | GPS_STATUS.GPSResponding;
                        mTravellingState = MovingState.Unknown;
                        break;

                    case GPSPosition.NMEAMODE.TWO_DIMENSION:
                    case GPSPosition.NMEAMODE.THREE_DIMENSION:
                        status = GPS_STATUS.Connected | GPS_STATUS.GPSResponding | GPS_STATUS.Fix;
                        // set the travelling state
                        mAverageVelocity.Value = mGPSPosition.SpeedOverGround;

                        //lat = mG
                        mTravellingState = (mAverageVelocity.Value > mMovingThreshold) ? MovingState.Moving : MovingState.Stationary;
                        break;
                    }
                    if (status != mStatus)
                    {
                        mStatus = status;
                        OnRaiseGPSStatusChangedEvent(new GPSStatusEvent(mStatus));
                        //Console.WriteLine("Fired Status Changed.");
                    }
                    // only update from RMC sentences as other sentences dont have date & time.
                    if (sentenceType.Equals("RMC", StringComparison.Ordinal))
                    {
                        //Console.WriteLine("Firing Position Changed.");
                        //CNXLog.InfoFormat("GPS State {0}, {1}", mStatus, mGPSPosition.CurrentPosition.ToString());
                        //if (mGPSPosition.Tag.EndsWith("RMC", StringComparison.Ordinal))
                        if ((mStatus & GPS_STATUS.Fix) == GPS_STATUS.Fix)
                        {
                            //CNXLog.InfoFormat(mGPSPosition.CurrentPosition.ToString());
                            OnRaiseGPSPositionChangedEvent(new GPSPositionEvent(mGPSPosition));
                            //CNXLog.InfoFormat("OnRaiseGPSPositionChangedEvent completed.");
                            //CNXLog.InfoFormat(mGPSPosition.CurrentPosition.ToString());
                            //Console.WriteLine("Fired Position Changed.");
                        }
                    }
                }
                //CNXLog.InfoFormat("GPS State {0}, {1}", mStatus, mGPSPosition.CurrentPosition.ToString());
            }
            catch (Exception e)
            {
                CNXLog.Error(String.Format("NMEAClient ProcessNewSentence {0}", sentence), e);
            }
        }
 public GPSStatusEvent(GPS_STATUS status)
 {
     Status = status;
 }