From 8c462e9f48c96d3610e31da874ea7eb13c377e66 Mon Sep 17 00:00:00 2001 From: Luca Warmenhoven Date: Wed, 5 Jun 2024 13:31:21 +0200 Subject: [PATCH 1/4] Poekseps --- .../fitbot/ui/activities/FitnessActivity.java | 11 ++++------- .../fitbot/util/processing/InputProcessor.java | 14 +++++++++----- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java index e01867a..d9a8255 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java @@ -281,13 +281,10 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall private void triggerColorBurst(boolean isGoodRep) { - if (isGoodRep) { - progressCircle.setProgressDrawable(ContextCompat.getDrawable(this, R.drawable.progress_circle_good)); - new MediaPlayer().create(this, R.raw.good_sound).start(); - } else { - progressCircle.setProgressDrawable(ContextCompat.getDrawable(this, R.drawable.progress_circle_bad)); - new MediaPlayer().create(this, R.raw.wrong_sound).start(); - } + int circleId = isGoodRep ? R.drawable.progress_circle_good : R.drawable.progress_circle_bad; + int soundId = isGoodRep ? R.raw.good_sound : R.raw.wrong_sound; + progressCircle.setProgressDrawable(ContextCompat.getDrawable(this, circleId)); + MediaPlayer.create(this, soundId).start(); ObjectAnimator animator = ObjectAnimator.ofFloat(progressCircle, "alpha", 1f, 0f, 1f); animator.setDuration(500); // Burst duration 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 f5742de..5d1700d 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 @@ -28,7 +28,7 @@ public class InputProcessor { private Vector3f[][] targetRotationVectorPaths; // Target path of the motion data private final float sampleRate; // The sample rate of the motion sensor - private float exerciseDurationInSeconds; + private float exerciseRepetitionDurationInSeconds = 0.0f; private int repetitionsRemaining = 0; private int exercisesRemaining = 0; private float exerciseScore = 0.0F; @@ -120,7 +120,7 @@ public class InputProcessor { this.targetRotationVectorPaths = new Vector3f[2][exercise.rightPath.getAngleVectors().length]; this.targetRotationVectorPaths[0] = exercise.leftPath.getAngleVectors(); this.targetRotationVectorPaths[1] = exercise.rightPath.getAngleVectors(); - this.exerciseDurationInSeconds = exercise.exerciseTimeInSeconds; + this.exerciseRepetitionDurationInSeconds = exercise.exerciseTimeInSeconds; this.secondsPassed = 0.0D; this.lastTime = System.currentTimeMillis(); } @@ -170,7 +170,7 @@ public class InputProcessor { public boolean hasFinished() { return this.recordingMovement ? (this.secondsPassed >= this.recordingDurationInSeconds) : - (this.secondsPassed >= this.exerciseDurationInSeconds); + (this.secondsPassed >= this.exerciseRepetitionDurationInSeconds); } /** @@ -356,6 +356,10 @@ public class InputProcessor { // Ensure the sensor ID is within the bounds of the array if (sensorId < 0 || sensorId >= selfRotationVectorPaths.length) return 0.0d; + + // Calculate the index of the rotational vector where we're currently at + int targetRotationIdx = + /* // Index of the current rotation vector @@ -383,10 +387,10 @@ public class InputProcessor { */ public double getAverageError(int sensorId) { double error = 0; - for (int i = 0; i < this.exerciseDurationInSeconds; i++) { + for (int i = 0; i < this.exerciseRepetitionDurationInSeconds; i++) { error += getError(sensorId, i); } - return error / this.exerciseDurationInSeconds; + return error / this.exerciseRepetitionDurationInSeconds; } public float secondsPassed() { From 65f4bb32b7f6c3d57137ab1fd56a1de3ea3c79c0 Mon Sep 17 00:00:00 2001 From: Niels Gras Date: Wed, 5 Jun 2024 13:40:30 +0200 Subject: [PATCH 2/4] fixed animation code placement --- .../fitbot/ui/activities/FitnessActivity.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java index e01867a..d1cb337 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java @@ -133,22 +133,6 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall motionProcessor.setRecording(true, 10); motionProcessor.startListening(); - if ( videoView.isPlaying() ) - { - Animation animationarmraise = AnimationBuilder.with(qiContext) // Create the builder with the context. - .withResources(R.raw.armraise) // Set the animation resource. - .build(); // Build the animation. - - animate = AnimateBuilder.with(qiContext) // Create the builder with the context. - .withAnimation(animationarmraise) // Set the animation. - .build(); // Build the animate action. - - Future animateFuture = animate.async().run(); - } - else - { - Log.e("FitnessActivity", "VideoView is null. Check your layout XML."); - } }, (n) -> { int randomMessageIndex = (int) Math.floor(Math.random() * EXERCISE_NOT_FOUND_MESSAGES.length); @@ -186,6 +170,24 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) { ProgressBar loadingCircle = findViewById(R.id.loadingCircle); loadingCircle.setVisibility(View.GONE); + + if ( videoView.isPlaying() ) + { + Animation animationarmraise = AnimationBuilder.with(qiContext) // Create the builder with the context. + .withResources(R.raw.armraise) // Set the animation resource. + .build(); // Build the animation. + + animate = AnimateBuilder.with(qiContext) // Create the builder with the context. + .withAnimation(animationarmraise) // Set the animation. + .build(); // Build the animate action. + + Future animateFuture = animate.async().run(); + } + else + { + Log.e("FitnessActivity", "VideoView is null. Check your layout XML."); + } + return true; } return false; From 8e7b8dbafe3e2c2ab625f06d20608ebb6b824760 Mon Sep 17 00:00:00 2001 From: SebasKoedam Date: Wed, 5 Jun 2024 13:43:11 +0200 Subject: [PATCH 3/4] added exercise rep increment to input processor --- .../fitbot/ui/activities/FitnessActivity.java | 6 ++---- .../fitbot/util/processing/InputProcessor.java | 5 ++--- .../app/src/main/res/layout/activity_fitness.xml | 15 +++------------ .../Fitbot/app/src/main/res/values/strings.xml | 4 ++-- 4 files changed, 9 insertions(+), 21 deletions(-) diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java index e01867a..5b4575e 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/FitnessActivity.java @@ -90,9 +90,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall progressCircle = findViewById(R.id.progressCircle); progressText = findViewById(R.id.progressText); - progressCircle.setMax(maxProgress); - updateProgress(); // Set color of loading circle ProgressBar loadingCircle = findViewById(R.id.loadingCircle); @@ -266,7 +264,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall dialog.show(); } - public void incrementProgress(View view) { + public void incrementProgress() { if (progress < maxProgress) { progress++; triggerColorBurst(true); @@ -279,7 +277,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall progressText.setText(progress + "/" + maxProgress); } - private void triggerColorBurst(boolean isGoodRep) { + public void triggerColorBurst(boolean isGoodRep) { if (isGoodRep) { progressCircle.setProgressDrawable(ContextCompat.getDrawable(this, R.drawable.progress_circle_good)); 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 6a3fd8a..30604fc 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 @@ -130,15 +130,14 @@ public class InputProcessor { */ public void onAdequateRepetition() { ExerciseManager.TOTAL_REPETITIONS_PERFORMED++; - // TODO: Add animation for correct repetition + new FitnessActivity().incrementProgress(); } /** * Method that is called whenever the user performs a bad repetition. */ public void onInadequateRepetition() { - - // TODO: Add animation for wrong repetition + new FitnessActivity().triggerColorBurst(false); } /** diff --git a/code/src/Fitbot/app/src/main/res/layout/activity_fitness.xml b/code/src/Fitbot/app/src/main/res/layout/activity_fitness.xml index b33ef19..641d8d9 100644 --- a/code/src/Fitbot/app/src/main/res/layout/activity_fitness.xml +++ b/code/src/Fitbot/app/src/main/res/layout/activity_fitness.xml @@ -77,7 +77,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" - android:text="@string/title" + android:text="@string/exerciseTitle" android:textAlignment="center" /> -