private ExerciseAmountRecommendation GetRecommendationForExerciseNotPerformedRecently(
            List <ExecutedExercise> executedExercises,
            UserSettings userSettings)
        {
            var firstExerciseOfSet = GetFirstExerciseBySequence(executedExercises);

            //How did they do last time?
            if (HadAdequateRating(firstExerciseOfSet.FormRating) &&
                HadAdequateRating(firstExerciseOfSet.RangeOfMotionRating) &&
                firstExerciseOfSet.ActualRepCount >= firstExerciseOfSet.TargetRepCount)
            {
                //They did well enough last time, but since they haven't done this one
                //recently, have them do what they did last time.
                var recommendation = new ExerciseAmountRecommendation();

                recommendation.ExerciseId       = firstExerciseOfSet.ExerciseId;
                recommendation.Reps             = firstExerciseOfSet.TargetRepCount;
                recommendation.ResistanceAmount = firstExerciseOfSet.ResistanceAmount;
                recommendation.ResistanceMakeup = firstExerciseOfSet.ResistanceMakeup;

                return(recommendation);
            }
            else
            {
                return(_adjustmentRecommendationService.GetAdjustmentRecommendation(firstExerciseOfSet, userSettings));
            }
        }
コード例 #2
0
        /// <summary>
        /// Provides an adjustment recommendation for an exercise. This adjustment will suggest to decrease
        /// the resistance amount and/or target reps.
        /// </summary>
        /// <param name="executedExercise">The exercise which needs adjustment</param>
        /// <param name="userSettings">The user's settings</param>
        /// <returns>An ExerciseAmountRecommendation with recommendations regarding reps and resistance</returns>
        public ExerciseAmountRecommendation GetAdjustmentRecommendation(
            ExecutedExercise executedExercise,
            UserSettings userSettings)
        {
            //Adjust target reps, resistance, or both.

            if (executedExercise == null)
            {
                throw new ArgumentNullException(nameof(executedExercise));
            }
            if (userSettings == null)
            {
                throw new ArgumentNullException(nameof(userSettings));
            }

            ExerciseAmountRecommendation recommendation;

            bool inadequateForm          = !HadAdequateRating(executedExercise.FormRating);
            bool inadequateRangeOfMotion = !HadAdequateRating(executedExercise.RangeOfMotionRating);
            bool actualRepsSignificantlyLessThanTarget = ActualRepsSignificantlyLessThanTarget(executedExercise.SetType, executedExercise.TargetRepCount, executedExercise.ActualRepCount);
            bool actualRepsLessThanTarget = ActualRepsLessThanTarget(executedExercise.SetType, executedExercise.TargetRepCount, executedExercise.ActualRepCount);

            //If form or range of motion was lacking, reduce resistance.
            if (inadequateForm || inadequateRangeOfMotion || actualRepsSignificantlyLessThanTarget || actualRepsLessThanTarget)
            {
                recommendation =
                    GetDecreaseRecommendation(
                        executedExercise,
                        userSettings,
                        inadequateForm,
                        inadequateRangeOfMotion,
                        actualRepsSignificantlyLessThanTarget,
                        actualRepsLessThanTarget);
            }
            //Otherwise, they didn't meet their goals last time, but they should remain the same.
            else
            {
                recommendation        = new ExerciseAmountRecommendation(executedExercise);
                recommendation.Reason = "";
            }

            return(recommendation);
        }
コード例 #3
0
        private ExerciseAmountRecommendation GetTimedSetIncreaseRecommendation(
            ExecutedExercise executedExercise,
            UserSettings userSettings)
        {
            var recommendation = new ExerciseAmountRecommendation();
            var repSettings    =
                GetRepSettings(
                    userSettings.RepSettings,
                    executedExercise.SetType,
                    executedExercise.Duration);

            //Increase reps or resistance?
            if (executedExercise.ActualRepCount >= repSettings.MaxReps)
            {
                //User met or exceeded max reps. Let's bump up the resistance and set reps to min.
                string resistanceMakeup;
                recommendation.Reps             = repSettings.MinReps;
                recommendation.ResistanceAmount =
                    GetIncreasedResistanceAmount(
                        executedExercise.TargetRepCount,
                        executedExercise.ActualRepCount,
                        executedExercise.ResistanceAmount,
                        executedExercise.Exercise,
                        out resistanceMakeup);
                recommendation.ResistanceMakeup = resistanceMakeup;
            }
            else
            {
                //Increase reps, but keep resistance amounts the same.
                recommendation.Reps =
                    GetIncreasedTargetRepCount(
                        executedExercise.TargetRepCount,
                        executedExercise.ActualRepCount,
                        repSettings.MaxReps);

                recommendation.ResistanceAmount = executedExercise.ResistanceAmount;
                recommendation.ResistanceMakeup = executedExercise.ResistanceMakeup; //TODO: Add constructor to recommendation to default this stuff from an ExecutedExercise
            }

            return(recommendation);
        }
コード例 #4
0
        private ExerciseAmountRecommendation GetRepititionSetIncreaseRecommendation(
            ExecutedExercise executedExercise)
        {
            var recommendation = new ExerciseAmountRecommendation();

            //For repitition sets, we'll increase the resistance amount

            string resistanceMakeup;

            recommendation.Reps             = executedExercise.TargetRepCount;
            recommendation.ResistanceAmount =
                GetIncreasedResistanceAmount(
                    executedExercise.TargetRepCount,
                    executedExercise.ActualRepCount,
                    executedExercise.ResistanceAmount,
                    executedExercise.Exercise,
                    out resistanceMakeup);
            recommendation.ResistanceMakeup = resistanceMakeup;

            return(recommendation);
        }
コード例 #5
0
        /// <summary>
        /// Gets a recommendation to decrease something about an exercise.
        /// </summary>
        /// <param name="executedExercise">The exercise which was executed and needs a decrease in reps or resistance</param>
        /// <param name="userSettings">The user's settings</param>
        /// <param name="inadequateForm">Indicates whether or not the exercise was last performed with inadequate form</param>
        /// <param name="inadequateRangeOfMotion">Indicates whether or not the exercise was last performed with inadequate range of motion</param>
        /// <param name="actualRepsSignificantlyLessThanTarget">Indicates whether or not the exercise was last performed with significantly less reps that targeted</param>
        /// <param name="actualRepsLessThanTarget">Indicates whether or not the exercise was last performed with less reps that targeted</param>
        /// <returns>An ExerciseAmountRecommendation with recommendations regarding reps and resistance</returns>
        /// <remarks>
        /// This abstracts the differences between getting a decrease recommendation for an exercise for a
        /// timed set versus a repetition set.
        /// </remarks>
        private ExerciseAmountRecommendation GetDecreaseRecommendation(
            ExecutedExercise executedExercise,
            UserSettings userSettings,
            bool inadequateForm,
            bool inadequateRangeOfMotion,
            bool actualRepsSignificantlyLessThanTarget,
            bool actualRepsLessThanTarget)
        {
            /*
             * If form and/or range of motion were inadequate, lower resistance.
             * If reps were less than target, decrease target.
             */

            string resistanceMakeup;
            bool   recommendingDecreasedResistance = false;

            var recommendation = new ExerciseAmountRecommendation(executedExercise);

            if (inadequateForm || inadequateRangeOfMotion) //Because we have both, we can make this more granular later if need be
            {
                recommendingDecreasedResistance = true;
                recommendation.ResistanceAmount =
                    GetDecreasedResistanceAmount(
                        executedExercise.SetType,
                        executedExercise.TargetRepCount,
                        executedExercise.ActualRepCount,
                        executedExercise.ResistanceAmount,
                        executedExercise.Exercise,
                        out resistanceMakeup);
                recommendation.ResistanceMakeup = resistanceMakeup;
            }

            if (ShouldRepCountBeLowered(actualRepsLessThanTarget, recommendingDecreasedResistance, actualRepsSignificantlyLessThanTarget))
            {
                recommendation.Reps = GetDecreasedRepCount(executedExercise.SetType, userSettings, executedExercise.TargetRepCount, executedExercise.ActualRepCount);
            }

            return(recommendation);
        }
        private ExerciseAmountRecommendation GetDefaultRecommendation(
            Exercise exercise)
        {
            var recommendation = new ExerciseAmountRecommendation();

            recommendation.ExerciseId = exercise.Id;
            recommendation.Reps       = 10; //TODO: Tailor to user's goals (bulk, weight loss, etc)
            recommendation.Reason     = "Exercise has never been performed. Starting recommendation at lowest resistance.";

            switch (exercise.ResistanceType)
            {
            case ResistanceType.BodyWeight:
                break;

            case ResistanceType.FreeWeight:
                recommendation.ResistanceAmount = 5;     //TODO: Get lowest available free-weight value
                break;

            case ResistanceType.MachineWeight:
                recommendation.ResistanceAmount = 10;     //TODO: Get lowest available machine weight value
                break;

            case ResistanceType.ResistanceBand:
                recommendation.ResistanceAmount = _resistanceBandService.GetLowestResistanceBand().MaxResistanceAmount;
                break;

            case ResistanceType.Other:
                recommendation.ResistanceAmount = 5;
                break;

            default:
                throw new ApplicationException($"Unhandled ResistanceType: {exercise.ResistanceType.ToString()}.");
            }

            return(recommendation);
        }