Ejemplo n.º 1
0
        /// <summary>
        /// Get the distance track of an activity.  In order of priority, gets the actual distance track, or creates a track from GPS, or returns an empty track if no data exists.
        /// </summary>
        /// <param name="activity">Activity to get a distance track for</param>
        /// <returns>Distance track for an activity.  Returns an empty track if none can be found/calculated.</returns>
        public static IDistanceDataTrack GetDistanceTrack(IActivity activity)
        {
            IDistanceDataTrack distanceTrack;

            if (activity.DistanceMetersTrack != null)
            {
                // #1 Use Distance track from activity
                distanceTrack = activity.DistanceMetersTrack;
            }
            else
            {
                if (activity.GPSRoute != null)
                {
                    // #2 Otherwise create a distance track from GPS
                    distanceTrack = GearUtils.CreateDistanceDataTrack(activity);
                }
                else
                {
                    // Else, no distance track, and cannot create one.
                    distanceTrack = new DistanceDataTrack();
                }
            }

            return(distanceTrack);
        }
Ejemplo n.º 2
0
        public IDistanceDataTrack populateDistanceDataTrack(float[,] activityData, DateTime activityStartTime)
        {
            IDistanceDataTrack dataSeries = new DistanceDataTrack();

            for (int i = 0; i < activityData.GetLength(1); i++)
            {
                DateTime activityDataPointTime = activityStartTime.AddMilliseconds((double)activityData[0, i]);;
                dataSeries.Add(activityDataPointTime, activityData[1, i]);
            }
            return(dataSeries);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Create a distance track from an activity's GPS Route
        /// </summary>
        /// <param name="gpsActivity"></param>
        /// <returns>A distance track created from the GPS route</returns>
        public static IDistanceDataTrack CreateDistanceDataTrack(IActivity gpsActivity)
        {
            IDistanceDataTrack distanceTrack = new DistanceDataTrack();

            if (gpsActivity.GPSRoute != null && gpsActivity.GPSRoute.Count > 0)
            {
                float distance = 0;

                // First Point
                distanceTrack.Add(gpsActivity.GPSRoute.StartTime, 0);

                for (int i = 1; i < gpsActivity.GPSRoute.Count; i++)
                {
                    DateTime pointTime = gpsActivity.GPSRoute.StartTime.AddSeconds(gpsActivity.GPSRoute[i].ElapsedSeconds);
                    distance += gpsActivity.GPSRoute[i].Value.DistanceMetersToPoint(gpsActivity.GPSRoute[i - 1].Value);
                    distanceTrack.Add(pointTime, distance);
                }
            }

            return(distanceTrack);
        }
Ejemplo n.º 4
0
        private static Record GetDistancePaceRecord(IActivity activity, RecordCategory category)
        {
            float fastestSpeed = 0;
            float currentSpeed;
            float currentDistance = 0;

            if (activity.GPSRoute != null && activity.GPSRoute.TotalElapsedSeconds > 0 && ActivityInfoCache.Instance.GetInfo(activity).DistanceMetersMoving >= category.Meters)
            {
                int           recordStart = 0, recordEnd = 0, startIndex, endIndex = 0;
                List <double> p2pDistance = new List <double>();

                // Go through each starting point
                for (startIndex = 0; startIndex < activity.GPSRoute.Count; startIndex++)
                {
                    // Find end GPS point that's the proper distance away
                    while (currentDistance <= category.Meters)
                    {
                        endIndex += 1;

                        // Typical return point.  End has exceeded route.  Construct and return record for this activity/category.
                        if (endIndex >= activity.GPSRoute.Count)
                        {
                            // Construct record GPS route
                            GPSRoute recordGPS = new GPSRoute();
                            NumericTimeDataSeries recordHRTrack = new NumericTimeDataSeries();
                            NumericTimeDataSeries pwrTrack      = new NumericTimeDataSeries();
                            NumericTimeDataSeries elevTrack     = new NumericTimeDataSeries();
                            NumericTimeDataSeries cadTrack      = new NumericTimeDataSeries();
                            DistanceDataTrack     distTrack     = new DistanceDataTrack();

                            for (int i = recordStart; i <= recordEnd; i++)
                            {
                                // Record information/statistics
                                DateTime time = activity.GPSRoute.EntryDateTime(activity.GPSRoute[i]);

                                recordGPS.Add(time, activity.GPSRoute[i].Value);
                                if (activity.HeartRatePerMinuteTrack != null &&
                                    activity.HeartRatePerMinuteTrack.StartTime <= time &&
                                    activity.HeartRatePerMinuteTrack.StartTime.AddSeconds(activity.HeartRatePerMinuteTrack.TotalElapsedSeconds) >= time)
                                {
                                    recordHRTrack.Add(time, activity.HeartRatePerMinuteTrack.GetInterpolatedValue(time).Value);
                                }

                                if (activity.PowerWattsTrack != null &&
                                    activity.PowerWattsTrack.StartTime <= time &&
                                    activity.PowerWattsTrack.StartTime.AddSeconds(activity.PowerWattsTrack.TotalElapsedSeconds) >= time)
                                {
                                    pwrTrack.Add(time, activity.PowerWattsTrack.GetInterpolatedValue(time).Value);
                                }

                                if (activity.CadencePerMinuteTrack != null &&
                                    activity.CadencePerMinuteTrack.StartTime <= time &&
                                    activity.CadencePerMinuteTrack.StartTime.AddSeconds(activity.CadencePerMinuteTrack.TotalElapsedSeconds) >= time)
                                {
                                    cadTrack.Add(time, activity.CadencePerMinuteTrack.GetInterpolatedValue(time).Value);
                                }

                                if (activity.DistanceMetersTrack != null &&
                                    activity.DistanceMetersTrack.StartTime <= time &&
                                    activity.DistanceMetersTrack.StartTime.AddSeconds(activity.DistanceMetersTrack.TotalElapsedSeconds) >= time)
                                {
                                    distTrack.Add(time, activity.DistanceMetersTrack.GetInterpolatedValue(time).Value);
                                }

                                if (activity.ElevationMetersTrack != null &&
                                    activity.ElevationMetersTrack.StartTime <= time &&
                                    activity.ElevationMetersTrack.StartTime.AddSeconds(activity.ElevationMetersTrack.TotalElapsedSeconds) >= time)
                                {
                                    elevTrack.Add(time, activity.ElevationMetersTrack.GetInterpolatedValue(time).Value);
                                }
                            }

                            // Return record
                            Record record = new Record(activity, category, recordGPS, recordHRTrack, pwrTrack, cadTrack, distTrack, elevTrack);
                            return(record);
                        }
                        else
                        {
                            // Add to end of route until category distance is found
                            currentDistance += activity.GPSRoute[endIndex].Value.DistanceMetersToPoint(activity.GPSRoute[endIndex - 1].Value);
                        }
                    }

                    // In meters / second
                    currentSpeed = currentDistance / (activity.GPSRoute[endIndex].ElapsedSeconds - activity.GPSRoute[startIndex].ElapsedSeconds);

                    // Store fastest info (in meters / second)
                    if (fastestSpeed < currentSpeed)
                    {
                        fastestSpeed = currentSpeed;
                        recordStart  = startIndex;
                        recordEnd    = endIndex;
                    }

                    // Remove first point from routeDistance, and go to next starting point.
                    currentDistance -= activity.GPSRoute[startIndex].Value.DistanceMetersToPoint(activity.GPSRoute[startIndex + 1].Value);
                }
            }

            // Activity does not contain GPS data or not long enough
            return(null);
        }
Ejemplo n.º 5
0
        //public IDistanceDataTrack GetSmoothedDistanceTrack(int seconds, out float min, out float max)
        //{
        //    IDistanceDataTrack distanceTrack;
        //    if (record.Activity.DistanceMetersTrack != null)
        //    {
        //        // #1 Use Distance track from activity
        //        distanceTrack = record.Activity.DistanceMetersTrack;
        //    }
        //    else
        //    {
        //        if (record.Activity.GPSRoute != null)
        //        {
        //            // #2 Otherwise create a distance track from GPS
        //            distanceTrack = Utilities.CreateDistanceDataTrack(record.Activity);
        //            return Utilities.STSmooth(distanceTrack, seconds, min, max);
        //        }
        //        else
        //        {
        //            // Else, no distance track, and cannot create one.
        //            distanceTrack = new DistanceDataTrack();
        //        }
        //    }
        //}

        //public INumericTimeDataSeries GetSmoothedGradeTrack(int seconds, out float min, out float max)
        //{
        //    NumericTimeDataSeries gradeTrack = new NumericTimeDataSeries();
        //    for (int i = 0; i < record.Activity.ElevationMetersTrack.Count; i++)
        //    {
        //        if (i == 0)
        //        {
        //            gradeTrack.Add(record.Activity.ElevationMetersTrack[i].ElapsedSeconds, 0);
        //        }
        //    }
        //}

        #region Constructors

        public Feature(IActivity activity, feature_type type, DateTime inStartTime, DateTime inEndTime)
        {
            startTime        = inStartTime;
            endTime          = inEndTime;
            added            = false;
            hillNumber       = 0;
            _feature_type    = type;
            masterActivityID = activity.ReferenceId;

            // Default fill and line color
            fillColor     = Color.FromArgb(125, 146, 94, 9);
            lineColor     = Color.FromArgb(255, 146, 94, 9);
            lineWidth     = 1;
            selectedColor = Color.Empty;
            routeWidth    = PluginMain.GetApplication().SystemPreferences.RouteSettings.RouteWidth;

            IGPSRoute recordGPS = new GPSRoute();
            INumericTimeDataSeries recordHRTrack = new NumericTimeDataSeries();
            INumericTimeDataSeries pwrTrack      = new NumericTimeDataSeries();
            INumericTimeDataSeries elevTrack     = new NumericTimeDataSeries();
            INumericTimeDataSeries cadTrack      = new NumericTimeDataSeries();
            IDistanceDataTrack     distTrack     = new DistanceDataTrack();
            RecordCategory         category      = new RecordCategory();

            ActivityInfo ai    = ActivityInfoCache.Instance.GetInfo(activity);
            DateTime     start = activity.StartTime;

            if (activity.GPSRoute != null)
            {
                // Check and make sure the route has points
                if (activity.GPSRoute.Count > 0)
                {
                    // If the time passed in is before the start of the gps track, get the first value
                    if (activity.GPSRoute.StartTime > inStartTime)
                    {
                        startPoint = activity.GPSRoute[0].Value;
                    }
                    else
                    {
                        // Set the start point
                        ITimeValueEntry <IGPSPoint> sPoint = activity.GPSRoute.GetInterpolatedValue(inStartTime);
                        if (sPoint != null)
                        {
                            startPoint = sPoint.Value;
                        }
                    }

                    // If the time passed in is after the end of the gps track, get the last value
                    if (activity.GPSRoute.StartTime.AddSeconds(activity.GPSRoute[activity.GPSRoute.Count - 1].ElapsedSeconds) < inEndTime)
                    {
                        endPoint = activity.GPSRoute[activity.GPSRoute.Count - 1].Value;
                    }
                    else
                    {
                        // Set the end point
                        ITimeValueEntry <IGPSPoint> ePoint = activity.GPSRoute.GetInterpolatedValue(inEndTime);
                        if (ePoint != null)
                        {
                            endPoint = ePoint.Value;
                        }
                    }
                }


                // Create the GPSRoute
                for (int i = 0; i < activity.GPSRoute.Count; i++)
                {
                    if (activity.GPSRoute.StartTime.AddSeconds(activity.GPSRoute[i].ElapsedSeconds) >= inStartTime &&
                        activity.GPSRoute.StartTime.AddSeconds(activity.GPSRoute[i].ElapsedSeconds) <= inEndTime)
                    {
                        recordGPS.Add(activity.GPSRoute.StartTime.AddSeconds(activity.GPSRoute[i].ElapsedSeconds), activity.GPSRoute[i].Value);
                    }
                }
            }

            // Create the Distance Track
            INumericTimeDataSeries allDistanceTrack  = ai.MovingDistanceMetersTrack; // Utilities.GetDistanceTrack(activity);
            INumericTimeDataSeries allElevationTrack = ai.SmoothedElevationTrack;    // Utilities.GetElevationTrack(activity);

            // Work your way through the moving meters track to create all others
            if (allDistanceTrack != null)
            {
                for (int i = 0; i < allDistanceTrack.Count; i++)
                {
                    DateTime time = allDistanceTrack.StartTime.AddSeconds(allDistanceTrack[i].ElapsedSeconds);
                    if (time >= inStartTime &&
                        time <= inEndTime)
                    {
                        // Add the distance point
                        distTrack.Add(time, allDistanceTrack[i].Value);
                        ITimeValueEntry <float> point = null;

                        // Find the elevation point at this time and add it
                        if (allElevationTrack != null && allElevationTrack.Count > 0)
                        {
                            point = allElevationTrack.GetInterpolatedValue(time);
                            if (point != null)
                            {
                                elevTrack.Add(time, point.Value);
                            }
                        }

                        // Find the HR point at this time and add it
                        if (activity.HeartRatePerMinuteTrack != null && activity.HeartRatePerMinuteTrack.Count > 0)
                        {
                            point = activity.HeartRatePerMinuteTrack.GetInterpolatedValue(time);
                            if (point != null)
                            {
                                recordHRTrack.Add(time, point.Value);
                            }
                        }

                        // Find the power point at this time and add it
                        if (activity.PowerWattsTrack != null && activity.PowerWattsTrack.Count > 0)
                        {
                            point = activity.PowerWattsTrack.GetInterpolatedValue(time);
                            if (point != null)
                            {
                                pwrTrack.Add(time, point.Value);
                            }
                        }

                        // Find the cadence point at this time and add it
                        if (activity.CadencePerMinuteTrack != null && activity.CadencePerMinuteTrack.Count > 0)
                        {
                            point = activity.CadencePerMinuteTrack.GetInterpolatedValue(time);
                            if (point != null)
                            {
                                cadTrack.Add(time, point.Value);
                            }
                        }
                    }
                    else if (allDistanceTrack.StartTime.AddSeconds(allDistanceTrack[i].ElapsedSeconds) > inEndTime)
                    {
                        break;
                    }
                }
            }

            // Get the start/end distance
            if (distTrack != null && distTrack.Count > 0)
            {
                startDistance = distTrack[0].Value;
                endDistance   = distTrack[distTrack.Count - 1].Value;
            }
            else
            {
                startDistance = 0;
                endDistance   = 0;
            }

            // Get the start/end elevation
            if (elevTrack != null && elevTrack.Count > 0)
            {
                startElevation = elevTrack[0].Value;
                endElevation   = elevTrack[elevTrack.Count - 1].Value;
            }
            else
            {
                startElevation = 0;
                endElevation   = 0;
            }

            // Build the record
            record = new Record(activity, category, recordGPS, recordHRTrack, pwrTrack, cadTrack, distTrack, elevTrack, inStartTime);

            // Create a reference id for this hill
            refId = Guid.NewGuid().ToString("D");

            double distanceX = endDistance - startDistance;

            distance = distanceX;

            double elev = endElevation - startElevation;

            elevGain = elev;

            // Find the start percents from the distance track
            if (allDistanceTrack != null && allDistanceTrack.Count > 0)
            {
                startPercentDistance = startDistance / allDistanceTrack[allDistanceTrack.Count - 1].Value;
                endPercentDistance   = endDistance / allDistanceTrack[allDistanceTrack.Count - 1].Value;

                startPercentTime = ((inStartTime - allDistanceTrack.StartTime).TotalSeconds / allDistanceTrack[allDistanceTrack.Count - 1].ElapsedSeconds);
                endPercentTime   = ((inEndTime - allDistanceTrack.StartTime).TotalSeconds / allDistanceTrack[allDistanceTrack.Count - 1].ElapsedSeconds);
            }

            // Calculate the VAM (Velocity Ascended, Meters per hour)
            // Calculate the W/kg (Relative power)
            vam = 0;
            wKg = 0;
            if (elevGain > 0)
            {
                vam = (elevGain * 60f * 60f) / record.TotalTime.TotalSeconds;
                wKg = vam / ((2 + (avgGrade * 10f)) * 100f);
            }

            ActivityInfo aiRec = ActivityInfoCache.Instance.GetInfo(record.Activity);

            stoppedTime = aiRec.TimeNotMoving;
        }