protected override Task <IObservable <Core.AcquisitionProviders.Model.LocalisationData> > InitializeCore() { this.Frequency = this.ReaderFrequencyInMs <= 0 ? 50 : 1000 / this.ReaderFrequencyInMs; return(Task.Run( () => { // the raw value is used rather than the corrected value // because the Localisation provider with recalculate the correction as if it was receiving live values var gpxDataSource = GpxReader.LoadGpxData(this.FilePath, false) .Select( gpxData => { var currentGeoData = new GeoData { PositionData = gpxData.PositionData, PrecisionData = gpxData.PrecisionData, VelocityData = gpxData.VelocityData }; GpsStatus gpsStatus; if (gpxData.PositionData.InsData == null) { gpsStatus = (gpxData.PositionData.NbSatellites < 4 || gpxData.PositionData.Quality == FixType.None || gpxData.PrecisionData.Hdop > 4 ? GpsStatus.SignalLost : GpsStatus.Reliable); } else { gpsStatus = (gpxData.PositionData.InsData.Status != NavigationStatus.Locked ? GpsStatus.Initializing : gpxData.PositionData.Longitude == 0 && gpxData.PositionData.Latitude == 0 ? GpsStatus.SignalLost : GpsStatus.Reliable); } return new LocalisationData { RawData = currentGeoData, GpsStatus = gpsStatus }; }); // performance could be improved here, but good enough for now this.DataSourceCount = gpxDataSource.LongCount(); IObservable <LocalisationData> obs; if (this.ReaderFrequencyInMs == 0) { obs = gpxDataSource.ToObservable(); } else { obs = gpxDataSource.ToObservable() .Zip(Observable.Interval(TimeSpan.FromMilliseconds(this.ReaderFrequencyInMs)), (loc, ticks) => loc); } obs = obs.TakeWhile(_ => this.State > ProviderState.Initialized); if (this.AutoRepeatTrace) { obs = obs.Repeat(); } if (this.InitialDelayInMs > 0) { obs = obs.DelaySubscription(TimeSpan.FromMilliseconds(this.InitialDelayInMs)); } return obs; })); }