diff --git a/code/arduino/Movement-sensor-code/Connectivity.cpp b/code/arduino/Movement-sensor-code/Connectivity.cpp new file mode 100644 index 0000000..ea3515b --- /dev/null +++ b/code/arduino/Movement-sensor-code/Connectivity.cpp @@ -0,0 +1,23 @@ +#include "Connectivity.h" + +void Connectivity::connectWiFi(char* ssid, char* pass){ + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, pass); + while (WiFi.status() != WL_CONNECTED) { + Serial.println("connecting to wifi"); + delay(1000); + } + Serial.println(WiFi.localIP()); +} + +void Connectivity::websocketSetup(){ + //ws server address, port and URL + webSocket.begin("192.168.137.1", 8001, ""); + // try every 500 again if connection has failed + webSocket.setReconnectInterval(500); +} + +void Connectivity::sendData(float roll, float pitch, float yaw){ + String message = "{\"Sensor\": 1, \"roll\":\"" + String(roll) + "\",\"pitch\":\"" + String(pitch) + "\",\"yaw\":\"" + String(yaw) + "\"}"; + webSocket.sendTXT(message); +} \ No newline at end of file diff --git a/code/arduino/Movement-sensor-code/Connectivity.h b/code/arduino/Movement-sensor-code/Connectivity.h new file mode 100644 index 0000000..624eccd --- /dev/null +++ b/code/arduino/Movement-sensor-code/Connectivity.h @@ -0,0 +1,30 @@ +#ifndef Connectivity_h +#define Connectivity_h + +#include "Arduino.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Connectivity { +public: + void connectWiFi(char* ssid, char* pass); + void websocketSetup(); + void sendData(float roll, float pitch, float yaw); + +private: + ESP8266WiFiMulti wifi; + WebSocketsClient webSocket; +}; + +#endif \ No newline at end of file diff --git a/code/arduino/Movement-sensor-code/Movement-sensor-code.ino b/code/arduino/Movement-sensor-code/Movement-sensor-code.ino index f889f39..28eb441 100644 --- a/code/arduino/Movement-sensor-code/Movement-sensor-code.ino +++ b/code/arduino/Movement-sensor-code/Movement-sensor-code.ino @@ -1,22 +1,26 @@ #include "headerFile.h" -SensorManager sensorManager; -ESP8266WiFiMulti wifi; -WebSocketsClient webSocket; -#define USE_SERIAL Serial +SensorManager::Rotation offset; void setup() { Serial.begin(9600); Serial.println("startup"); delay(5000); - connectWiFi(); + + connectivity.connectWiFi(ssid, pass); sensorManager.sensorSetup(); - websocketSetup(); + connectivity.websocketSetup(); } void loop() { SensorManager::Rotation rotation = sensorManager.readLoop(); + // Subtract offset + rotation.i -= offset.i; + rotation.j -= offset.j; + rotation.k -= offset.k; + rotation.w -= offset.w; + // Convert quaternion to Euler angles in radians float roll = atan2(2.0f * (rotation.w * rotation.i + rotation.j * rotation.k), 1.0f - 2.0f * (rotation.i * rotation.i + rotation.j * rotation.j)); float pitch = asin(2.0f * (rotation.w * rotation.j - rotation.k * rotation.i)); @@ -32,34 +36,19 @@ void loop() { Serial.print(pitch); Serial.print(" "); Serial.print(yaw); - sendData(roll, pitch, yaw); + connectivity.sendData(roll, pitch, yaw); Serial.println(); webSocket.loop(); -} - -void connectWiFi(){ - - WiFi.mode(WIFI_STA); - wifi.addAP(ssid, pass); - WiFi.begin(); - while (WiFi.status() != WL_CONNECTED) { - Serial.println("connecting to wifi"); - delay(1000); + if (Serial.available()) { + String command = Serial.readStringUntil('\n'); + command.trim(); // remove any trailing whitespace + if (command == "setZeroPoint") { + setZeroPoint(); + } } - Serial.println(WiFi.localIP()); - } - -void websocketSetup(){ - //ws server address, port and URL - webSocket.begin("192.168.178.118", 8001, ""); - // try every 500 again if connection has failed - webSocket.setReconnectInterval(500); +void setZeroPoint() { + offset = sensorManager.readLoop(); } - -void sendData(float roll, float pitch, float yaw){ - String message = "{\"Sensor\": 1, \"roll\":\"" + String(roll) + "\",\"pitch\":\"" + String(pitch) + "\",\"yaw\":\"" + String(yaw) + "\"}"; - webSocket.sendTXT(message); -} \ No newline at end of file diff --git a/code/arduino/Movement-sensor-code/SensorManager.cpp b/code/arduino/Movement-sensor-code/SensorManager.cpp index 4ca3d62..063f0da 100644 --- a/code/arduino/Movement-sensor-code/SensorManager.cpp +++ b/code/arduino/Movement-sensor-code/SensorManager.cpp @@ -1,6 +1,7 @@ #include "SensorManager.h" #include + SensorManager::SensorManager() {} void SensorManager::sensorSetup() { diff --git a/code/arduino/Movement-sensor-code/headerFIle.h b/code/arduino/Movement-sensor-code/headerFIle.h index cd3f6ae..b7b8220 100644 --- a/code/arduino/Movement-sensor-code/headerFIle.h +++ b/code/arduino/Movement-sensor-code/headerFIle.h @@ -1,20 +1,13 @@ -#include +//classes +#include "SensorManager.h" +#include "Connectivity.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +//define +SensorManager sensorManager; +Connectivity connectivity; +WebSocketsClient webSocket; +#define USE_SERIAL Serial -#define ssid "ObsidianAmstelveen" -#define pass "drijversstraatmaastricht" -//custom classes -#include "SensorManager.h" \ No newline at end of file +#define ssid "1235678i" +#define pass "12345678" diff --git a/code/src/Fitbot/app/src/main/AndroidManifest.xml b/code/src/Fitbot/app/src/main/AndroidManifest.xml index bd9a6b6..2c2784b 100644 --- a/code/src/Fitbot/app/src/main/AndroidManifest.xml +++ b/code/src/Fitbot/app/src/main/AndroidManifest.xml @@ -11,24 +11,12 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Fitbot" > - - - - diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/Animations.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/Animations.java index 33a3e3e..3bfff8a 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/Animations.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/Animations.java @@ -1,6 +1,7 @@ package com.example.fitbot; import android.support.v7.app.AppCompatActivity; + import com.aldebaran.qi.sdk.QiContext; import com.aldebaran.qi.sdk.builder.AnimateBuilder; import com.aldebaran.qi.sdk.builder.AnimationBuilder; diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/BicepVideo.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/BicepVideo.java deleted file mode 100644 index 3016b0a..0000000 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/BicepVideo.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.example.fitbot; - -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.widget.Button; -import android.widget.MediaController; -import android.widget.VideoView; - -import com.aldebaran.qi.sdk.QiContext; -import com.aldebaran.qi.sdk.builder.AnimateBuilder; -import com.aldebaran.qi.sdk.builder.AnimationBuilder; -import com.aldebaran.qi.sdk.object.actuation.Animate; -import com.aldebaran.qi.sdk.object.actuation.Animation; - -public class BicepVideo extends AppCompatActivity { - -// private QiContext qiContext; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_bicepvideo); - setupButtons(); - } - - public void Video(QiContext qiContext) { - VideoView videoView = findViewById(R.id.videoView); - videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.bicepvideo)); - - MediaController mediaController = new MediaController(this); - videoView.setMediaController(mediaController); - videoView.setOnCompletionListener(mp -> videoView.start()); - videoView.start(); - - Animation animation = AnimationBuilder.with(qiContext) - .withResources(R.raw.bicepcurl) - .build(); - - Animate animate = AnimateBuilder.with(qiContext) - .withAnimation(animation) - .build(); - - - animate.async().run(); - - } - private void setupButtons() { - Button backButton = findViewById(R.id.buttonback); - backButton.setOnClickListener(v -> finish()); - - Button completeButton = findViewById(R.id.buttoncomplete); - completeButton.setOnClickListener(v -> { - Intent intent = new Intent(BicepVideo.this, Completion_Screen.class); - startActivity(intent); - }); - } -} \ No newline at end of file diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/Completion_Screen.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/Completion_Screen.java deleted file mode 100644 index 092c65a..0000000 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/Completion_Screen.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.fitbot; - -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; - -public class Completion_Screen extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_completion_screen); - } -} \ No newline at end of file diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/MainActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/MainActivity.java index e90e88c..e69de29 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/MainActivity.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/MainActivity.java @@ -1,87 +0,0 @@ -package com.example.fitbot; - -import android.content.Intent; -import android.os.Bundle; -import android.widget.Button; - -import com.aldebaran.qi.sdk.QiContext; -import com.aldebaran.qi.sdk.QiSDK; -import com.aldebaran.qi.sdk.RobotLifecycleCallbacks; -import com.aldebaran.qi.sdk.builder.SayBuilder; -import com.aldebaran.qi.sdk.design.activity.RobotActivity; -import com.aldebaran.qi.sdk.object.conversation.Phrase; -import com.aldebaran.qi.sdk.object.conversation.Say; -import com.aldebaran.qi.sdk.object.locale.Language; -import com.aldebaran.qi.sdk.object.locale.Locale; -import com.aldebaran.qi.sdk.object.locale.Region; -import com.example.fitbot.ui.SportMenuActivity; - -public class MainActivity extends RobotActivity implements RobotLifecycleCallbacks { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - // Register the RobotLifecycleCallbacks to this Activity. - Button button = findViewById(R.id.menu_switch_btn); - button.setOnClickListener(v -> { - startActivity(new Intent(MainActivity.this, SportMenuActivity.class)); - }); - QiSDK.register(this, this); - - } - - @Override - protected void onDestroy() { - // Unregister the RobotLifecycleCallbacks for this Activity. - QiSDK.unregister(this, this); - super.onDestroy(); - } - - @Override - public void onRobotFocusGained(QiContext qiContext) { - Locale locale = new Locale(Language.DUTCH, Region.NETHERLANDS); - - // Create a new say action. - Say say = SayBuilder.with(qiContext) // Create the builder with the context. - .withText("Hallo hoe gaat het?") // Set the text to say. - .build(); // Build the say action. - - String locationName = ("de hogeschool van amsterdam"); - String locationDescription = ("0 bitches"); - - Phrase namePhrase = new Phrase("Deze locatie is " + locationName); - Say sayName = SayBuilder.with(qiContext) - .withPhrase(namePhrase) - .withLocale(locale) - .build(); - - Phrase descriptionPhrase = new Phrase(locationDescription); - Say sayDescription = SayBuilder.with(qiContext) - .withPhrase(descriptionPhrase) - .withLocale(locale) - .build(); - - sayName.run(); - sayDescription.run(); - - // Create a new BicepVideo with the qiContext -// BicepVideo BicepVideo = new BicepVideo(); -// -// // Call the videoPlayer method -// BicepVideo.Video(qiContext); - - // Execute the action. - say.run(); - } - - - @Override - public void onRobotFocusLost() { - // Nothing here. - } - - @Override - public void onRobotFocusRefused(String reason) { - // The robot focus is refused. - } -} \ No newline at end of file diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/PowerScreen.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/PowerScreen.java deleted file mode 100644 index ff1f891..0000000 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/PowerScreen.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.example.fitbot; - -import android.content.Intent; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.widget.ImageButton; - -public class PowerScreen extends AppCompatActivity { - ImageButton openBicepVideo; - ImageButton openSquatVideo; - ImageButton openTricepVideo; - ImageButton goToHome; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_power_screen); - - openBicepVideo = findViewById(R.id.open_BicepVideo); - openSquatVideo = findViewById(R.id.open_SquatVideo); - openTricepVideo = findViewById(R.id.open_TricepVideo); - goToHome = findViewById(R.id.GoToHome); - - openBicepVideo.setOnClickListener(v -> { - Intent intent = new Intent(PowerScreen.this, BicepVideo.class); - startActivity(intent); - }); -// openSquatVideo.setOnClickListener(v -> { -// Intent intent = new Intent(PowerScreen.this, SquatVideo.class); -// startActivity(intent); -// }); -// -// openTricepVideo.setOnClickListener(v -> { -// Intent intent = new Intent(PowerScreen.this, TricepVideo.class); -// startActivity(intent); -// }); - - goToHome.setOnClickListener(v -> { - Intent intent = new Intent(PowerScreen.this, MainActivity.class); - startActivity(intent); - }); - } -} \ No newline at end of file diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/CompletionActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/CompletionActivity.java new file mode 100644 index 0000000..8cc269b --- /dev/null +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/CompletionActivity.java @@ -0,0 +1,4 @@ +package com.example.fitbot.ui.activities; + +public class CompletionActivity { +} diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/MainScreen.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/MainActivity.java similarity index 89% rename from code/src/Fitbot/app/src/main/java/com/example/fitbot/MainScreen.java rename to code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/MainActivity.java index 323641c..1ed3962 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/MainScreen.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/MainActivity.java @@ -11,7 +11,10 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.widget.Button; -import com.example.fitbot.ui.SportMenuActivity; +import com.example.fitbot.R; +import com.example.fitbot.util.processing.GesturePath; +import com.example.fitbot.util.processing.MotionProcessor; +import com.example.fitbot.util.processing.Vector3; public class MainScreen extends AppCompatActivity { diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/SportPreviewActivity.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/SportPreviewActivity.java new file mode 100644 index 0000000..02e289f --- /dev/null +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/activities/SportPreviewActivity.java @@ -0,0 +1,24 @@ +package com.example.fitbot.ui.activities; + +import com.aldebaran.qi.sdk.QiContext; +import com.aldebaran.qi.sdk.RobotLifecycleCallbacks; +import com.aldebaran.qi.sdk.design.activity.RobotActivity; + +public class SportPreviewActivity extends RobotActivity implements RobotLifecycleCallbacks { + + + @Override + public void onRobotFocusGained(QiContext qiContext) { + + } + + @Override + public void onRobotFocusLost() { + + } + + @Override + public void onRobotFocusRefused(String reason) { + + } +} 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 new file mode 100644 index 0000000..b5161d8 --- /dev/null +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/ui/components/PersonalMotionPreviewElement.java @@ -0,0 +1,43 @@ +package com.example.fitbot.ui.components; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Path; +import android.view.View; + +import com.example.fitbot.util.processing.GesturePath; +import com.example.fitbot.util.processing.MotionData; +import com.example.fitbot.util.processing.MotionProcessor; +import com.example.fitbot.util.processing.Vector3; + +public class PersonalMotionPreviewElement extends View { + + private GesturePath path; + private double pathTime = 0.0D; // The timestamp at which the path is currently at. + private MotionProcessor motionProcessor; + private Path targetPath, personalPath; + + /** + * Method that calculates the path that will be drawn on the + * canvas. This method will be called every time new motion data is received. + */ + private void calculateDrawingPath(Vector3 transformedVector, MotionData motionData, int sampleIndex, double sampleRate) { + + } + + + public PersonalMotionPreviewElement(Context context, GesturePath path) { + super(context); + this.path = path; + this.motionProcessor = new MotionProcessor(); + this.motionProcessor.startListening(); + this.motionProcessor.setMotionDataEventHandler(this::calculateDrawingPath); + this.targetPath = new Path(); + this.personalPath = new Path(); + } + + @Override + public void onDraw(Canvas canvas) { + // Draw the sport preview canvas + } +} diff --git a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/MotionProcessor.java b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/MotionProcessor.java index 8f6d049..7879807 100644 --- a/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/MotionProcessor.java +++ b/code/src/Fitbot/app/src/main/java/com/example/fitbot/util/processing/MotionProcessor.java @@ -9,7 +9,6 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.function.Consumer; import java.util.stream.Collectors; public class MotionProcessor { @@ -20,7 +19,7 @@ public class MotionProcessor { private final List relativePath = new ArrayList<>(); // Relative path of the motion data private Vector3 ZERO = new Vector3(0, 0, 0); private double sampleRate = 1.0D; // samples/second - private Consumer motionDataConsumer = (data) -> {}; + private DataConsumer motionDataConsumer = (p1, p2, p3, p4) -> {}; private GesturePath path; private WebSocket socket; @@ -108,7 +107,7 @@ public class MotionProcessor { Vector3 previous = this.relativePath.isEmpty() ? ZERO : this.relativePath.get(this.relativePath.size() - 1); Vector3 relativeVector = getRelativeVector(data).add(previous); this.relativePath.add(relativeVector); - motionDataConsumer.accept(relativeVector); + motionDataConsumer.accept(relativeVector, data, this.relativePath.size(), this.sampleRate); } /** @@ -125,7 +124,7 @@ public class MotionProcessor { * Function for setting the motion data receiver. * @param consumer The consumer to set. */ - public void setMotionDataEventHandler(Consumer consumer) { + public void setMotionDataEventHandler(DataConsumer consumer) { if ( consumer != null) this.motionDataConsumer = consumer; } @@ -242,5 +241,18 @@ public class MotionProcessor { Log.i("MotionProcessor", "Sample rate: " + sampleRate); Log.i("MotionProcessor", "Calibration point: " + ZERO.toString()); + /** + * Interface that accepts motion data and the transformed vector. + */ + public interface DataConsumer { + + /** + * Function for accepting motion data and the transformed vector. + * @param transformedVector The transformed vector. + * @param motionData The input motion data. + * @param sampleIndex The index of the current sample + * @param sampleRate The sample rate. + */ + void accept(Vector3 transformedVector, MotionData motionData, int sampleIndex, double sampleRate); } } diff --git a/code/src/Fitbot/app/src/main/res/drawable/ic_launcher_background.xml b/code/src/Fitbot/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..3050a42 100644 --- a/code/src/Fitbot/app/src/main/res/drawable/ic_launcher_background.xml +++ b/code/src/Fitbot/app/src/main/res/drawable/ic_launcher_background.xml @@ -5,8 +5,8 @@ android:viewportWidth="108" android:viewportHeight="108"> + android:fillColor="#FF0000" + android:pathData="M0,0h108v108h-108z" /> - - - - -