diff --git a/src/NmeaParser/Gnss/GnssMonitor.cs b/src/NmeaParser/Gnss/GnssMonitor.cs index 9695c1b..c78db20 100644 --- a/src/NmeaParser/Gnss/GnssMonitor.cs +++ b/src/NmeaParser/Gnss/GnssMonitor.cs @@ -65,8 +65,6 @@ namespace NmeaParser.Gnss m_supportGNMessages = true; // Support for GN* messages detected else if (m_supportGNMessages && message.TalkerId != NmeaParser.Talker.GlobalNavigationSatelliteSystem) return; // If device supports combined GN* messages, ignore non-GN messages - if (message is ITimestampedMessage ts) - FixTime = ts.Timestamp; if (message is NmeaParser.Messages.Garmin.Pgrme rme) { @@ -88,6 +86,7 @@ namespace NmeaParser.Gnss { lat = Rmc.Latitude; lon = Rmc.Longitude; + FixTime = Rmc.FixTime.TimeOfDay; isNewFix = true; } else @@ -122,6 +121,7 @@ namespace NmeaParser.Gnss { lostFix = true; } + FixTime = Gga.FixTime; isNewFix = true; } else if (message is Gsa gsa) @@ -249,7 +249,7 @@ namespace NmeaParser.Gnss /// /// Gets the current fix time /// - public TimeSpan FixTime { get; private set; } + public TimeSpan? FixTime { get; private set; } /// /// Gets a list of satellite vehicles in the sky diff --git a/src/SampleApp.WinDesktop/NmeaLocationDataSource.cs b/src/SampleApp.WinDesktop/NmeaLocationDataSource.cs index 19a0224..3422b8d 100644 --- a/src/SampleApp.WinDesktop/NmeaLocationDataSource.cs +++ b/src/SampleApp.WinDesktop/NmeaLocationDataSource.cs @@ -69,19 +69,39 @@ namespace SampleApp.WinDesktop return Task.CompletedTask; } + private Esri.ArcGISRuntime.Location.Location currentLocation; + private void OnLocationChanged(object sender, EventArgs e) { if (double.IsNaN(m_gnssMonitor.Longitude) || double.IsNaN(m_gnssMonitor.Latitude)) return; if (!double.IsNaN(m_gnssMonitor.Course)) lastCourse = m_gnssMonitor.Course; - UpdateLocation(new Esri.ArcGISRuntime.Location.Location( - timestamp: null, + DateTimeOffset? timestamp = null; + if(m_gnssMonitor.FixTime.HasValue) + timestamp = new DateTimeOffset(DateTime.UtcNow.Date.Add(m_gnssMonitor.FixTime.Value)); + var location = new Esri.ArcGISRuntime.Location.Location( + timestamp: timestamp, position: !double.IsNaN(m_gnssMonitor.Altitude) ? new MapPoint(m_gnssMonitor.Longitude, m_gnssMonitor.Latitude, m_gnssMonitor.Altitude, wgs84_ellipsoidHeight) : new MapPoint(m_gnssMonitor.Longitude, m_gnssMonitor.Latitude, SpatialReferences.Wgs84), horizontalAccuracy: m_gnssMonitor.HorizontalError, verticalAccuracy: m_gnssMonitor.VerticalError, velocity: double.IsNaN(m_gnssMonitor.Speed) ? 0 : m_gnssMonitor.Speed * 0.51444444, course: lastCourse, - !m_gnssMonitor.IsFixValid)); + !m_gnssMonitor.IsFixValid); + // Avoid raising additional location events if nothing changed + if (currentLocation == null || + currentLocation.Position.X != location.Position.X || + currentLocation.Position.Y != location.Position.Y || + currentLocation.Position.Z != location.Position.Z || + currentLocation.Course != location.Course || + currentLocation.Velocity != location.Velocity || + currentLocation.HorizontalAccuracy != location.HorizontalAccuracy || + currentLocation.VerticalAccuracy != location.VerticalAccuracy || + currentLocation.IsLastKnown != location.IsLastKnown || + timestamp != location.Timestamp) + { + currentLocation = location; + UpdateLocation(currentLocation); + } } } }