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 1867cad..0087588 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 @@ -45,6 +45,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall GesturePath.Builder gesturePathBuilder = new GesturePath.Builder(); + /* Generate a random path to test the tracking system */ for ( int i = 0; i < 40; i++) { gesturePathBuilder.addVector( diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/components/PersonalMotionPreviewElement.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/components/PersonalMotionPreviewElement.java index 113bdc7..1601899 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/components/PersonalMotionPreviewElement.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/components/PersonalMotionPreviewElement.java @@ -22,13 +22,16 @@ import org.joml.Vector2f; import org.joml.Vector3f; import org.joml.Vector4f; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + public class PersonalMotionPreviewElement extends View { private GesturePath[] paths; private MotionProcessor motionProcessor; private double pathTime = 0.0D; // The timestamp at which the path is currently at. - private double exerciseProgress = 0.0D; // The progress of the exercise. Ranges from 0 to 1. + private final AtomicInteger exerciseProgress = new AtomicInteger(0); // The progress of the exercise. Ranges from 0 to 1000. private QiContext qiContext; @@ -86,7 +89,6 @@ public class PersonalMotionPreviewElement extends View { this.targetPath = new Path(); this.startingTime = System.nanoTime(); // Set the last time to the current time - this.exerciseProgress = 0.0d; this.exercise = exercise; this.paths = exercise.getPath(); @@ -103,14 +105,14 @@ public class PersonalMotionPreviewElement extends View { this.qiContext = context; if ( this.motionProcessor != null ) this.motionProcessor.stopListening(); + this.motionProcessor = new MotionProcessor(); this.motionProcessor.startListening(); // Handler that is called every time the motion processor receives new data. this.motionProcessor.setMotionDataEventHandler((processed, preprocessed, sampleIndex, sampleRate, deviceId) -> { - double progress = this.motionProcessor.getAverageError(this.paths[0], 0); - this.exerciseProgress = Math.min(1, Math.max(0, progress)); - this.invalidate(); + int progress = (int)this.motionProcessor.getError(this.paths[0], processed); + this.exerciseProgress.set(Math.min(1000, Math.max(0, progress))); Log.i("MotionProcessor", "Processed data: " + progress + " (" + preprocessed + ")"); }); saySomethingNice(); @@ -147,16 +149,18 @@ public class PersonalMotionPreviewElement extends View { // Draw target circle float targetRadius = (this.screenDimensions.x + this.screenDimensions.y) / 5.0f; canvas.drawCircle(this.screenDimensions.x / 2, this.screenDimensions.y / 2, targetRadius, this.targetPaint); - canvas.drawCircle(this.screenDimensions.x / 2, this.screenDimensions.y / 2, (float)(targetRadius * exerciseProgress), this.referencePaint); + canvas.drawCircle(this.screenDimensions.x / 2, this.screenDimensions.y / 2, (targetRadius * exerciseProgress.get()/1000.0f), this.referencePaint); referencePaint.setColor( Color.argb( 255, - (int)(255 * (1.0 - exerciseProgress)), - (int)(255 * exerciseProgress), + (int)(255 * (1.0 - exerciseProgress.get()/1000.0f)), + (int)(255 * exerciseProgress.get()/1000.0f), 0 ) ); + this.invalidate(); + timePassed = (System.nanoTime() - startingTime) / 1E9D; } }