public SessionSummaryDto GetSummary(SessionSummaryRequestDto sessionSummaryRequestDto) { var requestedUnitIsMetric = sessionSummaryRequestDto.Unit == 0; var sessionData = _context.SessionData.Where(s => s.SessionId == sessionSummaryRequestDto.SessionId).ToList(); var session = _context.Sessions.Single(s => s.Id == sessionSummaryRequestDto.SessionId); var sModeIsMetric = session.SMode.ToString("D9").IsMetric(); // pad int to 9 decimals if zero var totalCount = sessionData.Count(); double maximumSpeed; double averageSpeed; double totalDistance; double averageAltitude; double maximumAltitude; if (requestedUnitIsMetric) // return metric values { if (sModeIsMetric) { // calculate speed - divided speed by 10 as speed is *10 in file var totalSpeed = sessionData.Sum(s => s.Speed); averageSpeed = Math.Round((totalSpeed / 10) / totalCount, 2, MidpointRounding.AwayFromZero); maximumSpeed = Math.Round(sessionData.MaxBy(s => s.Speed).Speed / 10, 2, MidpointRounding.AwayFromZero); // calculate distance var totalTimeInHours = session.Length.TimeOfDay.TotalSeconds / 3600; totalDistance = Math.Round(averageSpeed * totalTimeInHours, 2, MidpointRounding.AwayFromZero); // calculate altitiude var totalAltitude = sessionData.Sum(s => s.Altitude / 10); averageAltitude = Math.Round(totalAltitude / totalCount, 2, MidpointRounding.AwayFromZero); maximumAltitude = Math.Round(sessionData.MaxBy(s => s.Altitude).Altitude / 10, 2, MidpointRounding.AwayFromZero); } else { // calculate speed - divided speed by 10 as speed is *10 in file - converted kilometres to miles var totalSpeed = sessionData.Sum(s => s.Speed); averageSpeed = ((totalSpeed / 10) / totalCount).ConvertToKilometres(); maximumSpeed = (sessionData.MaxBy(s => s.Speed).Speed / 10).ConvertToKilometres(); // calculate distance var totalTimeInHours = session.Length.TimeOfDay.TotalSeconds / 3600; totalDistance = ((totalSpeed / 10) / totalCount * totalTimeInHours).ConvertToKilometres(); // calculate altitiude - convert metres to feet var totalAltitude = sessionData.Sum(s => s.Altitude / 10); averageAltitude = (totalAltitude / totalCount).ConvertToMetres(); maximumAltitude = (sessionData.MaxBy(s => s.Altitude).Altitude / 10).ConvertToMetres(); } } else // return imperial values { if (sModeIsMetric) { // calculate speed - divided speed by 10 as speed is *10 in file - converted kilometres to miles var totalSpeed = sessionData.Sum(s => s.Speed); averageSpeed = ((totalSpeed / 10) / totalCount).ConvertToMiles(); maximumSpeed = (sessionData.MaxBy(s => s.Speed).Speed / 10).ConvertToMiles(); // calculate distance var totalTimeInHours = session.Length.TimeOfDay.TotalSeconds / 3600; totalDistance = ((totalSpeed / 10) / totalCount * totalTimeInHours).ConvertToMiles(); // calculate altitiude - convert metres to feet var totalAltitude = sessionData.Sum(s => s.Altitude / 10); averageAltitude = (totalAltitude / totalCount).ConvertToFeet(); maximumAltitude = (sessionData.MaxBy(s => s.Altitude).Altitude / 10).ConvertToFeet(); } else { // calculate speed - divided speed by 10 as speed is *10 in file var totalSpeed = sessionData.Sum(s => s.Speed); averageSpeed = Math.Round((totalSpeed / 10) / totalCount, 2, MidpointRounding.AwayFromZero); maximumSpeed = Math.Round( sessionData.MaxBy(s => s.Speed).Speed / 10, 2, MidpointRounding.AwayFromZero); // calculate distance var totalTimeInHours = session.Length.TimeOfDay.TotalSeconds / 3600; totalDistance = Math.Round(averageSpeed * totalTimeInHours, 2, MidpointRounding.AwayFromZero); // calculate altitiude var totalAltitude = sessionData.Sum(s => s.Altitude / 10); averageAltitude = Math.Round(totalAltitude / totalCount, 2, MidpointRounding.AwayFromZero); maximumAltitude = Math.Round(sessionData.MaxBy(s => s.Altitude).Altitude / 10, 2, MidpointRounding.AwayFromZero); } } // calculate heart rate var totalHeartRate = sessionData.Sum(s => s.HeartRate); var averageHeartRate = Math.Round(totalHeartRate / totalCount, 2, MidpointRounding.AwayFromZero); var minimumHeartRate = sessionData.MinBy(s => s.HeartRate).HeartRate; var maximumHeartRate = sessionData.MaxBy(s => s.HeartRate).HeartRate; // calculate power var totalPower = sessionData.Sum(s => s.Power); var averagePower = Math.Round(totalPower / totalCount, 2, MidpointRounding.AwayFromZero); var maximumPower = Math.Round(sessionData.MaxBy(s => s.Power).Power, 2, MidpointRounding.AwayFromZero); // calculate cadence var totalCadence = sessionData.Sum(s => s.Cadence); var averageCadence = Math.Round(totalCadence / totalCount, 2, MidpointRounding.AwayFromZero); var maximumCadence = Math.Round(sessionData.MaxBy(s => s.Cadence).Cadence, 2, MidpointRounding.AwayFromZero); // calculate normalized power var sessionDto = GetSingle(sessionSummaryRequestDto.SessionId); var normalizedPower = sessionDto.CalculateNormalizedPower(); // calculate intensity factor var functionalThresholdPower = _context.Athletes.Single(a => a.Id == session.AthleteId).FunctionalThresholdPower; var intensityFactor = normalizedPower.CalculateIntensityFactor(functionalThresholdPower); // calculate training stress score var sessionTimeInSeconds = session.Length.TimeOfDay.TotalSeconds; double trainingStressScore = 0; string trainingStressScoreStatus = ""; if (normalizedPower != 0) { trainingStressScore = Metrics.CalculateTrainingStressScore(sessionTimeInSeconds, normalizedPower, intensityFactor, functionalThresholdPower); trainingStressScoreStatus = Metrics.TrainingStressScoreStatus(trainingStressScore); } var sessionSummaryDto = new SessionSummaryDto() { Title = session.Title, AverageAltitude = averageAltitude, MaximumAltitude = maximumAltitude, AverageCadence = averageCadence, MaximumCadence = maximumCadence, AverageHeartRate = averageHeartRate, MinimumHeartRate = minimumHeartRate, MaximumHeartRate = maximumHeartRate, AverageSpeed = averageSpeed, MaximumSpeed = maximumSpeed, AveragePower = averagePower, MaximumPower = maximumPower, TotalDistance = totalDistance, Date = session.Date, NormalizedPower = normalizedPower, IntensityFactor = intensityFactor, TrainingStressScore = trainingStressScore, TrainingStressScoreStatus = trainingStressScoreStatus, SessionId = sessionSummaryRequestDto.SessionId }; return sessionSummaryDto; }
public void CorrectDistanceIsCalculated() { var sessionSummaryRequestDtoMetric = new SessionSummaryRequestDto() { SessionId = 1, Unit = 0 }; var sessionSummaryRequestDtoImperial = new SessionSummaryRequestDto() { SessionId = 2, Unit = 0 }; var sessionSummaryMetric = _sessionRepository.GetSummary(sessionSummaryRequestDtoMetric); var sessionSummaryImperial = _sessionRepository.GetSummary(sessionSummaryRequestDtoImperial); var totalDistanceKilometres = sessionSummaryMetric.TotalDistance; var totalDistanceMiles = sessionSummaryImperial.TotalDistance; Assert.AreEqual(36.66, totalDistanceKilometres); Assert.AreEqual(64.43m, totalDistanceMiles); }
public void CorrectMinimumValuesAreFound() { var sessionSummaryRequestDto = new SessionSummaryRequestDto() { SessionId = 1, Unit = 0 }; var sessionSummary = _sessionRepository.GetSummary(sessionSummaryRequestDto); var minimumHeartRate = sessionSummary.MinimumHeartRate; Assert.AreEqual(125, minimumHeartRate); }
public void CorrectMaximumValuesAreFound() { var sessionSummaryRequestDto = new SessionSummaryRequestDto() { SessionId = 1, Unit = 0 }; var sessionSummary = _sessionRepository.GetSummary(sessionSummaryRequestDto); var maximumSpeed = sessionSummary.MaximumSpeed; var maximumHeatRate = sessionSummary.MaximumHeartRate; var maximumAltitude = sessionSummary.MaximumAltitude; var maximumPower = sessionSummary.MaximumPower; Assert.AreEqual(33.8m, maximumSpeed); Assert.AreEqual(145, maximumHeatRate); Assert.AreEqual(3.3, maximumAltitude); Assert.AreEqual(837, maximumPower); }
public void CorrectAveragesAreCalculated() { var sessionSummaryRequestDto = new SessionSummaryRequestDto() { SessionId = 1, Unit = 0 }; var sessionSummary = _sessionRepository.GetSummary(sessionSummaryRequestDto); var averageSpeed = sessionSummary.AverageSpeed; var averageHeatRate = sessionSummary.AverageHeartRate; var averageAltitude = sessionSummary.AverageAltitude; var averagePower = sessionSummary.AveragePower; Assert.AreEqual(29.58m, averageSpeed); Assert.AreEqual(134.17, averageHeatRate); Assert.AreEqual(3.22d, averageAltitude); Assert.AreEqual(601.17m, averagePower); }
public HttpResponseMessage GetSummary(HttpRequestMessage request, SessionSummaryRequestDto sessionSummaryRequestDto) { return CreateHttpResponse(request, () => { var sessionSummaryDto = _sessionRepository.GetSummary(sessionSummaryRequestDto); HttpResponseMessage response = request.CreateResponse(HttpStatusCode.OK, sessionSummaryDto); return response; }); }