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()); })); }
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()); })); }
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); }
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); }