From 0a2999afa1143e3f6ca565479ccc1a6ba35e5e3b Mon Sep 17 00:00:00 2001 From: Luca Warmenhoven Date: Wed, 5 Jun 2024 14:06:57 +0200 Subject: [PATCH] Added faulty movement checking function --- .../util/processing/InputProcessor.java | 63 +++++++------------ 1 file changed, 21 insertions(+), 42 deletions(-) diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/InputProcessor.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/InputProcessor.java index dc46191..cd81be9 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/InputProcessor.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/InputProcessor.java @@ -112,6 +112,7 @@ public class InputProcessor { ExerciseManager.TOTAL_REPETITIONS_REQUIRED += ExerciseManager.DEFAULT_EXERCISE_REPETITIONS; ExerciseManager.TOTAL_EXERCISES_PREFORMED++; + this.selfRotationVectorPaths = new ArrayList[2]; this.selfRotationVectorPaths[0] = new ArrayList<>(); this.selfRotationVectorPaths[1] = new ArrayList<>(); @@ -130,14 +131,14 @@ public class InputProcessor { */ public void onAdequateRepetition() { ExerciseManager.TOTAL_REPETITIONS_PERFORMED++; - new FitnessActivity().incrementProgress(); + this.parentActivity.incrementProgress(); } /** * Method that is called whenever the user performs a bad repetition. */ public void onInadequateRepetition() { - new FitnessActivity().triggerColorBurst(false); + this.parentActivity.triggerColorBurst(false); } /** @@ -352,55 +353,33 @@ public class InputProcessor { }*/ /** - * Function for getting the error offsets of the user's path compared to the - * target path at a given point in time. * - * @param sensorId The sensor ID to get the error offsets from. - * @param time The time to get the error offsets from. - * This value must be >= 0 && <= exerciseTime, otherwise - * the error will be 0 by default. - * @return A list of error offsets of the motion data compared to the reference path. */ - public double getError(int sensorId, float time) { + public boolean isFaultyMovement(int sensorId, float time) { // Ensure the sensor ID is within the bounds of the array if (sensorId < 0 || sensorId >= selfRotationVectorPaths.length) - return 0.0d; + return false; - // Calculate the index of the rotational vector where we're currently at - int targetRotationIdx = + // Calculate the index of the reference rotation vector + // This is done by calculating the closest index of the last received vector + // to the current time. + // i = | (t % T) / T * N | - /* + int i, referenceIndex; - // Index of the current rotation vector - int targetIndex = (int) ((this.exerciseDurationInSeconds / this.targetRotationVectorPaths[sensorId].length) * time); - int selfIndex = (int) (this.selfRotationVectorPaths[sensorId].length / this.sampleRate * time); - - // Ensure the indexes are within the bounds of the array - if ( - targetIndex >= 0 && targetIndex <= this.targetRotationVectorPaths[sensorId].length - 1 && - selfIndex >= 0 && selfIndex <= this.selfRotationVectorPaths[sensorId].length - 1 && - this.selfRotationVectorPaths[sensorId][selfIndex] != null && - this.targetRotationVectorPaths[sensorId][targetIndex] != null - ) { - return this.selfRotationVectorPaths[sensorId][selfIndex].distance(this.targetRotationVectorPaths[sensorId][targetIndex]); - }*/ - return 0.0d; - } - - /** - * Method for getting the average error of the motion data - * compared to the reference path. - * - * @param sensorId The sensor ID to get the error offsets from. - * @return The average error of the motion data compared to the reference path. - */ - public double getAverageError(int sensorId) { - double error = 0; - for (int i = 0; i < this.exerciseRepetitionDurationInSeconds; i++) { - error += getError(sensorId, i); + for ( i = 0; i < selfRotationVectorPaths.length; i++) + { + referenceIndex = (int) (Math.round( + ((time % this.exerciseRepetitionDurationInSeconds) / + (this.exerciseRepetitionDurationInSeconds)) * this.targetRotationVectorPaths[i].length)) + % this.targetRotationVectorPaths[i].length; + // If distance is greater than the threshold, return true + if (this.selfRotationVectorPaths[i].get(this.selfRotationVectorPaths[i].size() - 1).distance( + this.targetRotationVectorPaths[i][referenceIndex]) > ExerciseManager.EXERCISE_ERROR_MARGIN) + return true; } - return error / this.exerciseRepetitionDurationInSeconds; + return false; } public float secondsPassed() {