protected void ProcessGPSTimeout() { mStatus = GPS_STATUS.OFFLINE; mGPSPosition.Invalidate(); OnRaiseGPSStatusChangedEvent(new GPSStatusEvent(mStatus)); }
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; }