Пример #1
0
        private Task <ActivityHeaderViewModel> CreateHeaderViewModelAsync(Activity activity)
        {
            return(Task.Run(
                       () =>
            {
                var lap = activity.Lap[0];

                double maxSpeed = lap.MaximumSpeed * 3.6;
                EffortComputer effortComputer = lap.AverageHeartRateBpm != null
                            ? HumanEffortComputer.ByHeartBeat
                            : HumanEffortComputer.BySpeed.OverrideDefaultMaxValue(maxSpeed);

                var dispersion = new SortedDictionary <double, IDispersionSpan>();
                Trackpoint previousPoint = lap.Track[0];
                DateTime startTime = lap.Track[0].Time;
                for (int index = 0; index < lap.Track.Count; index++)
                {
                    Trackpoint currentPoint = lap.Track[index];

                    TimeSpan elapsedTime = currentPoint.Time - startTime;

                    double?speed = null;
                    if (previousPoint != null && previousPoint.Position != null &&
                        previousPoint.DistanceMeters > 0 && currentPoint.Position != null &&
                        currentPoint.DistanceMeters > 0 && elapsedTime.TotalSeconds > 0)
                    {
                        double kilometersTraveled = GeoCalculation.HaversineDistance(
                            new LatLong(
                                previousPoint.Position.LatitudeDegrees,
                                previousPoint.Position.LongitudeDegrees),
                            new LatLong(
                                currentPoint.Position.LatitudeDegrees,
                                currentPoint.Position.LongitudeDegrees));
                        double hoursElapsed = (elapsedTime - (previousPoint.Time - startTime)).TotalHours;
                        speed = kilometersTraveled / hoursElapsed;
                    }

                    double?value = lap.AverageHeartRateBpm != null ? currentPoint.HeartRateBpm?.Value : speed;
                    if (value == null)
                    {
                        previousPoint = currentPoint;
                        continue;
                    }

                    var elapsedTimeSinceLastPoint = currentPoint.Time - previousPoint.Time;
                    EffortSpan effortSpan = effortComputer.GetSpan(value);
                    if (!dispersion.ContainsKey(effortSpan.Threshold))
                    {
                        dispersion.Add(effortSpan.Threshold, new DispersionSpan(effortSpan.Color, 0));
                    }

                    dispersion[effortSpan.Threshold]
                    .IncrementValue(elapsedTimeSinceLastPoint.TotalMilliseconds);

                    previousPoint = currentPoint;
                }

                return new ActivityHeaderViewModel(activity.ToActivityHeader(), dispersion.Values.ToList());
            }));
        }
Пример #2
0
        protected Task <ActivityHeaderModel> CreateHeaderViewModelAsync(RideModel ride)
        {
            return(Task.Run(
                       () =>
            {
                var lap = ride.Laps[0];

                double maxSpeed = lap.MaximumSpeed * 3.6;
                EffortComputer effortComputer = HumanEffortComputer.BySpeed.OverrideDefaultMaxValue(maxSpeed);

                var dispersion = new SortedDictionary <double, IDispersionSpan>();
                var previousPoint = lap.Trackpoints[0];
                DateTime startTime = lap.Trackpoints[0].CreatedDate.Value;
                for (int index = 0; index < lap.Trackpoints.Count; index++)
                {
                    var currentPoint = lap.Trackpoints[index];

                    TimeSpan elapsedTime = currentPoint.CreatedDate.Value - startTime;

                    double?speed = null;
                    if (previousPoint != null && previousPoint.Latitude != null && previousPoint.Longitude != null &&

                        /*previousPoint.DistanceMeters > 0 && currentPoint.Position != null
                         * && currentPoint.DistanceMeters > 0 &&*/elapsedTime.TotalSeconds > 0)
                    {
                        double kilometersTraveled = GeoCalculation.HaversineDistance(
                            new LatLong(
                                previousPoint.Latitude,
                                previousPoint.Longitude),
                            new LatLong(
                                currentPoint.Latitude,
                                currentPoint.Longitude));
                        double hoursElapsed = (elapsedTime - (previousPoint.CreatedDate.Value - startTime)).TotalHours;
                        speed = kilometersTraveled / hoursElapsed;
                    }

                    //double? value = lap.AverageHeartRateBpm != null ? currentPoint.HeartRateBpm?.Value : speed;
                    //if (value == null)
                    //{
                    //    previousPoint = currentPoint;
                    //    continue;
                    //}

                    //var elapsedTimeSinceLastPoint = currentPoint.CreatedDate - previousPoint.CreatedDate;
                    //EffortSpan effortSpan = effortComputer.GetSpan(value);
                    //if (!dispersion.ContainsKey(effortSpan.Threshold))
                    //{
                    //    dispersion.Add(effortSpan.Threshold, new DispersionSpan(effortSpan.Color, 0));
                    //}

                    //dispersion[effortSpan.Threshold]
                    //   .IncrementValue(elapsedTimeSinceLastPoint.TotalMilliseconds);

                    previousPoint = currentPoint;
                }

                return new ActivityHeaderModel(ride.ToActivityHeader(), dispersion.Values.ToList());
            }));
        }
Пример #3
0
 static HumanEffortComputer()
 {
     BySpeed = new EffortComputer(
         new List <EffortSpan>
     {
         new EffortSpan(0f, ResourcesHelper.GetResourceColor("ColorEffortSpeedMin"), /*Functions.Resources.GetLocalisedRes(typeof(Resx.resources),nameof(Resx.resources.PaceVeryLight)*/ "VERY LIGHT"),
         new EffortSpan(0.7f, ResourcesHelper.GetResourceColor("ColorEffortAnaerobic"), /*Functions.Resources.GetLocalisedRes(typeof(Resx.resources),nameof(Resx.resources.PaceAnaerobic)*/ "ANAEROBIC"),
         new EffortSpan(0.95f, ResourcesHelper.GetResourceColor("ColorEffortMax"), /*Functions.Resources.GetLocalisedRes(typeof(Resx.resources),nameof(Resx.resources.PaceMax)*/ "MAX"),
     },
         40);
 }
Пример #4
0
        static HumanEffortComputer()
        {
            ByHeartBeat = new EffortComputer(
                new List <EffortSpan>
            {
                new EffortSpan(0f, GetResourceColor("ColorEffortUnknown"), AppResources.PaceUnknown),
                new EffortSpan(0.3f, GetResourceColor("ColorEffortLightest"), AppResources.PaceVeryLight),
                new EffortSpan(0.6f, GetResourceColor("ColorEffortLight"), AppResources.PaceLight),
                new EffortSpan(0.7f, GetResourceColor("ColorEffortAerobic"), AppResources.PaceAerobic),
                new EffortSpan(0.8f, GetResourceColor("ColorEffortAnaerobic"), AppResources.PaceAnaerobic),
                new EffortSpan(0.9f, GetResourceColor("ColorEffortMax"), AppResources.PaceMax),
            },
                180);

            BySpeed = new EffortComputer(
                new List <EffortSpan>
            {
                new EffortSpan(0f, GetResourceColor("ColorEffortSpeedMin"), AppResources.PaceVeryLight),
                new EffortSpan(0.7f, GetResourceColor("ColorEffortAnaerobic"), AppResources.PaceAnaerobic),
                new EffortSpan(0.95f, GetResourceColor("ColorEffortMax"), AppResources.PaceMax),
            },
                40);
        }