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