コード例 #1
0
        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;
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        public void CorrectMinimumValuesAreFound()
        {
            var sessionSummaryRequestDto = new SessionSummaryRequestDto() { SessionId = 1, Unit = 0 };
            var sessionSummary = _sessionRepository.GetSummary(sessionSummaryRequestDto);

            var minimumHeartRate = sessionSummary.MinimumHeartRate;

            Assert.AreEqual(125, minimumHeartRate);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        public HttpResponseMessage GetSummary(HttpRequestMessage request, SessionSummaryRequestDto sessionSummaryRequestDto)
        {
            return CreateHttpResponse(request, () =>
            {
                var sessionSummaryDto = _sessionRepository.GetSummary(sessionSummaryRequestDto);

                HttpResponseMessage response = request.CreateResponse(HttpStatusCode.OK, sessionSummaryDto);

                return response;
            });
        }