Exemplo n.º 1
0
        public ExerciseAmountRecommendation(ExecutedExercise executedExercise)
        {
            if (executedExercise == null)
            {
                throw new ArgumentNullException(nameof(executedExercise));
            }

            ExerciseId       = executedExercise.Exercise.Id;
            ResistanceAmount = executedExercise.ResistanceAmount;
            ResistanceMakeup = executedExercise.ResistanceMakeup;
            Reps             = executedExercise.TargetRepCount;
        }
Exemplo n.º 2
0
        private ExecutedWorkout CreateFromPlan(WorkoutPlan workoutPlan, DateTime?startDateTime, DateTime?endDateTime)
        {
            var executedWorkout = new ExecutedWorkout();

            executedWorkout.WorkoutId       = workoutPlan.WorkoutId;
            executedWorkout.CreatedByUserId = workoutPlan.UserId;
            executedWorkout.Exercises       = new List <ExecutedExercise>(); //TODO: Initialize by known size
            var workout = _workoutRepo.Get(workoutPlan.WorkoutId);

            byte exerciseSequence = 0;

            foreach (var exerciseInWorkout in workout.Exercises?.OrderBy(x => x.Sequence))
            {
                //Find the ExercisePlan in the submitted WorkoutPlan for this exercise
                var exercisePlan = workoutPlan.Exercises.First(exPlan => exPlan.ExerciseId == exerciseInWorkout.ExerciseId);

                for (byte x = 0; x < exerciseInWorkout.NumberOfSets; x++)
                {
                    //TODO: Add new constructor to ExecutedExercise which takes an ExercisePlan param
                    //and initialize that way instead.
                    var exerciseToExecute = new ExecutedExercise();
                    exerciseToExecute.CreatedByUserId = workout.CreatedByUserId;
                    exerciseToExecute.CreatedDateTime = workoutPlan.SubmittedDateTime.Value;
                    exerciseToExecute.Exercise        = exerciseInWorkout.Exercise;
                    exerciseToExecute.ExerciseId      = exerciseInWorkout.Exercise.Id;
                    exerciseToExecute.Sequence        = exerciseSequence;
                    exerciseToExecute.SetType         = exerciseInWorkout.SetType;

                    exerciseToExecute.TargetRepCount   = exercisePlan.TargetRepCount;
                    exerciseToExecute.ResistanceAmount = exercisePlan.ResistanceAmount;
                    exerciseToExecute.ResistanceMakeup = exercisePlan.ResistanceMakeup;

                    executedWorkout.Exercises.Add(exerciseToExecute);
                    exerciseSequence++;
                }
            }

            executedWorkout.StartDateTime = startDateTime;
            executedWorkout.EndDateTime   = endDateTime;

            _repo.Add(executedWorkout, true);

            return(executedWorkout);
        }
        /// <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);
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
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);
        }
Exemplo n.º 6
0
        public ExerciseAmountRecommendation GetIncreaseRecommendation(
            ExecutedExercise executedExercise,
            UserSettings userSettings)
        {
            if (executedExercise == null)
            {
                throw new ArgumentNullException(nameof(executedExercise));
            }
            if (userSettings == null)
            {
                throw new ArgumentNullException(nameof(userSettings));
            }

            if (executedExercise.SetType == SetType.Timed)
            {
                return(GetTimedSetIncreaseRecommendation(executedExercise, userSettings));
            }
            else //Repititon set
            {
                return(GetRepititionSetIncreaseRecommendation(executedExercise));
            }
        }
        /// <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);
        }