public List <Models.GpsFix> GenerateLostFixes() { List <Models.GpsFix> result = new List <Models.GpsFix>(); //Milliseconds delay between each GPS fix TimeSpan tick = new TimeSpan(0, 0, 0, 0, Converters.HertzToMilliseconds(_gpsUpdateRate)); TimeSpan timestamp = _beforeFixLost.Time.Add(tick); int countMissingFix = 0; while (timestamp != _afterFixLost.Time) { countMissingFix++; timestamp = timestamp.Add(tick); } //Interpolate the missing values double[] lerpLatitude = InterpolateValues(_beforeFixLost.Latitude, _afterFixLost.Latitude, countMissingFix); double[] lerpLongitude = InterpolateValues(_beforeFixLost.Longitude, _afterFixLost.Longitude, countMissingFix); double[] lerpSpeed = InterpolateValues(_beforeFixLost.Speed, _afterFixLost.Speed, countMissingFix); double[] lerpAltitude = InterpolateValues(_beforeFixLost.Altitude, _afterFixLost.Altitude, countMissingFix); double[] lerpHeading = InterpolateValues(_beforeFixLost.Heading, _afterFixLost.Heading, countMissingFix); int index = 0; timestamp = _beforeFixLost.Time.Add(tick); while (timestamp != _afterFixLost.Time) { DateTime date = new DateTime(_beforeFixLost.Date.Year, _beforeFixLost.Date.Month, _beforeFixLost.Date.Day, timestamp.Hours, timestamp.Minutes, timestamp.Seconds, timestamp.Milliseconds); //New fix Models.GpsFix fix = new Models.GpsFix(lerpLatitude[index], lerpLongitude[index], 0, (float)lerpSpeed[index], (float)lerpAltitude[index], (float)lerpHeading[index], _afterFixLost.Temperature, 0, date, timestamp); result.Add(fix); timestamp = timestamp.Add(tick); index++; } result.Add(_afterFixLost); return(result); }
/// <summary> /// Counts the number of GPS fixes in a time interval of one second /// If it doesn't match the expected number of fixes according to the GPS update rate /// means we lost some data /// </summary> /// <param name="fix">GPS fix</param> public void Update(Models.GpsFix fix) { //Save the timestamp of the first fix if (FixesTotalNumber == 0) { _firstFixTime = _previousFixTime = fix.Time; } FixesTotalNumber++; //The very first second of logging is discarded because it may not be stable if (IsSameSecond(fix.Time, _firstFixTime)) { return; } //Increments the count until a new second starts if (IsSameSecond(fix.Time, _previousFixTime)) { _fixesInOneSecond++; return; } //When a new second starts count the number of lost GPS fixes in the previous time frame if (!IsSameSecond(_firstFixTime, _previousFixTime)) { if (_gpsUpdateRate - _fixesInOneSecond > 0) { //Console.WriteLine("Lost fix: " + (_gpsUpdateRate - _fixesInOneSecond)); //Console.WriteLine(fix.ToString()); } FixesLostNumber += _gpsUpdateRate - _fixesInOneSecond; } _previousFixTime = fix.Time; _fixesInOneSecond = 1; }
public LostFixesFiller(Models.GpsFix beforeFixLost, Models.GpsFix afterFixLost, int gpsUpdateRate) { _beforeFixLost = beforeFixLost; _afterFixLost = afterFixLost; _gpsUpdateRate = gpsUpdateRate; }
/// <summary> /// Calculates the statistics /// </summary> /// <param name="fix">GPS fix</param> /// <param name="prevFix">Previous GPS fix</param> public void Update(Models.GpsFix fix, Models.GpsFix prevFix) { if (fix.Speed > MaxSpeed) { MaxSpeed = fix.Speed; } if (fix.Speed < MinSpeed) { MinSpeed = fix.Speed; } if (fix.Altitude > MaxAltitude) { MaxAltitude = fix.Altitude; } if (fix.IsMoving() && fix.Altitude < MinAltitude && fix.Altitude != 0.0f) { MinAltitude = fix.Altitude; } if (Math.Abs(fix.LeanAngle) > MaxLeanAngle) { MaxLeanAngle = Math.Abs(fix.LeanAngle); } if (fix.LeanAngle > MaxLeanAngleRight) { MaxLeanAngleRight = fix.LeanAngle; } if (fix.LeanAngle < MaxLeanAngleLeft) { MaxLeanAngleLeft = fix.LeanAngle; } if (fix.HeartRate > MaxHeartRate) { MaxHeartRate = fix.HeartRate; } if (fix.HeartRate < MinHeartRate) { MinHeartRate = fix.HeartRate; } if (fix.Temperature > MaxTemperature) { MaxTemperature = fix.Temperature; } if (fix.Temperature < MinTemperature) { MinTemperature = fix.Temperature; } //Total fixes and lost fixes counter _fixCounter.Update(fix); if (prevFix == null) { return; } //Total time TimeSpan timeDiff = fix.Time - prevFix.Time; TotalTime += timeDiff; //Filtering out the fix when the GPS is not moving to reduce the measurement error if (fix.IsMoving() && prevFix.IsMoving()) { //Computes total trip time (only the distance in motion) TotalTripTime += timeDiff; //Computes lean angle fix.LeanAngle = (int)MathUtility.LeanAngleMath.Calculate(fix.Heading, prevFix.Heading, fix.Speed, prevFix.Speed, _gpsUpdateRate); //Calculates the distance between two coordinates using Haversine formula TotalTripDistance += MathUtility.Haversine.Calculate(fix.Latitude, fix.Longitude, prevFix.Latitude, prevFix.Longitude); } //Average speed (takes into account only the moving time) if (TotalTripTime.TotalHours != 0) { AverageSpeed = (float)(TotalTripDistance / TotalTripTime.TotalHours); fix.AverageSpeed = AverageSpeed; } }