public TruPulse360(IProvideSentences nmeaProvider)
        {
            _nmeaProvider = nmeaProvider;
            _nmeaProvider.SentenceReceived += sentence => {
                                                  Message message = _parser.Parse(sentence);
                                                  if (message == null) {
                                                      return;
                                                  }

                                                  Debug.WriteLine(message.Sentence);
                                              };
            _nmeaProvider.Open();
        }
Example #2
0
        public GpsUnit(IProvideSentences nmeaProvider)
        {
            MinimumFixForNotification = GpsFixType.ThreeD;
            CurrentLocation = new GeoPosition(0, 0, new Length(0, LengthUnit.Meter));
            CurrentHeading = Heading.Unknown;

            _nmeaProvider = nmeaProvider;
            _nmeaProvider.SentenceReceived += sentence => {
                                                  Message message = _parser.Parse(sentence);
                                                  if (message == null) {
                                                      return;
                                                  }
                                                  //NB set all values then raise all notifications
                                                  if (message.Value is IProvideSatelliteInfo) {
                                                      foreach (SatelliteInfo satellite in message.ValueAs<IProvideSatelliteInfo>()
                                                                                                 .Satellites) {
                                                          _satellites[satellite.Prn] = satellite;
                                                      }
                                                  }
                                                  if (message.Value is IProvideActiveSatellites) {
                                                      _activeSatellitePrns.Clear();
                                                      foreach (int prn in message.ValueAs<IProvideActiveSatellites>()
                                                                                 .ActiveSatellitePrns.Where(prn => prn != 0)) {
                                                          _activeSatellitePrns.Add(prn);
                                                      }
                                                  }
                                                  if (message.Value is IProvideFixType) {
                                                      CurentFixType = message.ValueAs<IProvideFixType>()
                                                                             .CurrentFix;
                                                  }
                                                  if (message.Value is IProvideDilutionOfPrecision) {
                                                      var dop = message.ValueAs<IProvideDilutionOfPrecision>();
                                                      _positionDop = dop.PositionDop;
                                                      _horizontalDop = dop.HorizontalDop;
                                                      _verticalDop = dop.VerticalDop;
                                                  }
                                                  if (message.Value is IProvideTime) {
                                                      CurrentTime = message.ValueAs<IProvideTime>()
                                                                           .CurrentTime;
                                                  }
                                                  if (message.Value is IProvideTrajectory) {
                                                      //NB heading and speed are correlated
                                                      IProvideTrajectory trajectory = message.ValueAs<IProvideTrajectory>();
                                                      CurrentSpeed = trajectory.CurrentSpeed;
                                                      // NB don't update heading when speed is near zero
                                                      if (CurrentSpeed > MinimumSpeedForHeadingUpdate) {
                                                          CurrentHeading = trajectory.CurrentHeading;
                                                      }
                                                  }
                                                  if (message.Value is IProvideGeoPosition) {
                                                      var newLocation = message.ValueAs<IProvideGeoPosition>()
                                                                               .CurrentLocation;
                                                      CurrentLocation = newLocation.Altitude == null
                                                                            ? new GeoPosition(newLocation.Latitude,
                                                                                              newLocation.Longitude,
                                                                                              CurrentLocation.Altitude)
                                                                            : newLocation;
                                                      RaiseLocationChanged();
                                                  }
                                              };

            _nmeaProvider.Open();
        }