Exemple #1
0
        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);
        }
Exemple #2
0
        /// <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;
        }
Exemple #3
0
 public LostFixesFiller(Models.GpsFix beforeFixLost, Models.GpsFix afterFixLost, int gpsUpdateRate)
 {
     _beforeFixLost = beforeFixLost;
     _afterFixLost  = afterFixLost;
     _gpsUpdateRate = gpsUpdateRate;
 }
Exemple #4
0
        /// <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;
            }
        }