From 3b65fffec8bd4adc16dd9badc084189b13b3b07c Mon Sep 17 00:00:00 2001 From: Sam Hos Date: Tue, 4 Jun 2024 10:31:24 +0200 Subject: [PATCH] motion processing stuff + logs + fix crash (luca) --- .../fitbot/ui/activities/FitnessActivity.java | 22 +++++++++++-------- .../example/fitbot/util/path/GesturePath.java | 6 ++++- .../util/processing/InputProcessor.java | 17 +++++++------- 3 files changed, 27 insertions(+), 18 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 fb84abd..9339f71 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 @@ -40,6 +40,8 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall private TextView exerciseShortDescriptionTextView; private TextView exerciseDescriptionTextView; + private final Object lock = new Object(); + // Some nice little messages for the user private static final String[] EXERCISE_NOT_FOUND_MESSAGES = new String[]{ "Ik heb momenteel helaas wat moeite met het ophalen van oefeningen, sorry.", @@ -58,16 +60,14 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); QiSDK.register(this, this); - setContentView(R.layout.activity_fitness); - // Remove the ugly ass bar on top of the view - setSpeechBarDisplayStrategy(SpeechBarDisplayStrategy.IMMERSIVE); - // Fill empty objects with exercise data this.exerciseNameTextView = findViewById(R.id.textViewFitnessTitle); - this.exerciseDescriptionTextView = findViewById(R.id.textViewDialogDescription); + //this.exerciseDescriptionTextView = findViewById(R.id.textViewDialogDescription); this.exerciseShortDescriptionTextView = findViewById(R.id.textViewFitnessShortDescription); + // Remove the ugly ass bar on top of the view + setSpeechBarDisplayStrategy(SpeechBarDisplayStrategy.IMMERSIVE); // Find the VideoView by its ID VideoView videoView = findViewById(R.id.videoView); @@ -84,6 +84,7 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall @Override public void onClick(View v) { showInfoDialog(); + } }); } @@ -109,8 +110,8 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall exerciseStatusElement.initialize(exercise, motionProcessor, EXERCISE_COUNT); motionProcessor.useExercise(exercise); /* TODO: Remove if not needed */motionProcessor.setRecording(true, 10); - motionProcessor.startListening(); motionProcessor.setInputHandler(exerciseStatusElement); + motionProcessor.startListening(); }, (n) -> { int randomMessageIndex = (int) Math.floor(Math.random() * EXERCISE_NOT_FOUND_MESSAGES.length); @@ -136,14 +137,17 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall if (exercise == null) { onFailedFetch.handle(null); } else { - exerciseNameTextView.setText(exercise.name); - exerciseShortDescriptionTextView.setText(exercise.shortDescription); - exerciseDescriptionTextView.setText(exercise.description); onSuccessfulFetch.handle(exercise); + this.runOnUiThread(() -> { + exerciseNameTextView.setText(exercise.name); + exerciseShortDescriptionTextView.setText(exercise.shortDescription); + // exerciseDescriptionTextView.setText(exercise.description); + }); } })).start(); } + /** * Function for playing a video in a VideoView * diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/path/GesturePath.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/path/GesturePath.java index 9f9decd..f3b8cb3 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/path/GesturePath.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/path/GesturePath.java @@ -14,7 +14,11 @@ public class GesturePath { */ public GesturePath(Vector3f[] vectors) { if (vectors.length < 2) { - this.segments = new PathSegment[0]; + this.segments = new PathSegment[1]; + this.segments[0] = new PathSegment( + new Vector3f(0, 0, 0), + new Vector3f(0, 0, 0) + ); return; } 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 a39dad6..e95008a 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 @@ -160,6 +160,8 @@ public class InputProcessor { try { + Log.i("MotionProcessor", "Time passed: " + this.secondsPassed + "s"); + Log.i("MotionProcessor", "Recording: " + this.recordingMovement + ", " + this.secondsPassed + " / " + this.recordingDurationInSeconds); Log.i("MotionProcessor", "Received packet data: " + data); JsonElement json = JsonParser.parseString(data); @@ -198,18 +200,12 @@ public class InputProcessor { // Re-calculate time for index calculation secondsPassed = (System.currentTimeMillis() - lastTime) / 1000.0d; - lastTime = System.currentTimeMillis(); + // Supposed index of the current rotation vector in the `rotationVectorPaths` array int selfIndex = (int) (secondsPassed * sampleRate); - motionDataConsumer.accept(rotation, deviceId); - if (selfIndex >= selfRotationVectorPaths[deviceId].length || selfIndex < 0) - return; - - selfRotationVectorPaths[deviceId][selfIndex] = rotation; - - if ( this.recordingMovement && this.hasFinished()) { + if ( this.recordingMovement && this.secondsPassed >= this.recordingDurationInSeconds) { // Do something with the recorded data. this.recordingMovement = false; // Convert recorded data from `selfRotationVectorPaths` to string, and @@ -221,6 +217,11 @@ public class InputProcessor { Log.i("MotionProcessor", "Converted data: "); Log.i("MotionProcessor", converted); } + motionDataConsumer.accept(rotation, deviceId); + if (selfIndex >= selfRotationVectorPaths[deviceId].length || selfIndex < 0) + return; + + selfRotationVectorPaths[deviceId][selfIndex] = rotation; } }