Added faulty movement checking function

This commit is contained in:
Luca Warmenhoven
2024-06-05 14:06:57 +02:00
parent b811187f5c
commit 0a2999afa1

View File

@@ -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;
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;
}
/**
* 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);
}
return error / this.exerciseRepetitionDurationInSeconds;
return false;
}
public float secondsPassed() {