From b8f20ec8d9c0762c024cacd6e90e77d964b21ece Mon Sep 17 00:00:00 2001 From: toni Date: Fri, 20 Jul 2018 19:14:38 +0200 Subject: [PATCH] made mSensor App ready for recording session at manfreds house --- .../conductorssensor/MainActivity.java | 2 +- .../estimation/Estimator.java | 21 ++++++-- .../conductorssensor/sensor/SensorBoard.java | 52 ++++++++++++++++++- android/ConductorsWatch/app/build.gradle | 2 +- matlab/AutoCorrMethodNew_Watch.m | 6 +-- 5 files changed, 73 insertions(+), 10 deletions(-) diff --git a/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/MainActivity.java b/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/MainActivity.java index fb8bcc9..9c6d423 100644 --- a/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/MainActivity.java +++ b/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/MainActivity.java @@ -51,7 +51,7 @@ public class MainActivity extends FragmentActivity implements PopupMenu.OnMenuIt //textview to show the bpm estimation mBpmTextView = (TextView) findViewById(R.id.bpmText); - mEstimator = new Estimator(); + mEstimator = new Estimator(this); mEstimator.addListener(this); // ensures the connection to the bt sensor board diff --git a/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/estimation/Estimator.java b/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/estimation/Estimator.java index 16eec0b..740c840 100644 --- a/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/estimation/Estimator.java +++ b/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/estimation/Estimator.java @@ -1,5 +1,6 @@ package de.tonifetzer.conductorssensor.estimation; +import android.content.Context; import android.util.Log; import java.util.LinkedList; @@ -9,6 +10,7 @@ import java.util.TimerTask; import java.util.concurrent.CopyOnWriteArrayList; import de.tonifetzer.conductorssensor.sensor.SensorBoard; +import de.tonifetzer.conductorssensor.utilities.SensorDataFileWriter; import de.tonifetzer.conductorssensor.utilities.Utils; public class Estimator implements SensorBoard.OnSensorBoardDataListener { @@ -18,18 +20,25 @@ public class Estimator implements SensorBoard.OnSensorBoardDataListener { private BpmEstimator mBpmEstimator; private Timer mTimer = new Timer(); + private SensorDataFileWriter mFileWriter; + private Context mContext; - public Estimator(){ + public Estimator(Context context){ mAccelerometerWindowBuffer = new AccelerometerWindowBuffer(6000, 750); mBpmEstimator = new BpmEstimator(mAccelerometerWindowBuffer, 0, 5000); + + mContext = context; } public void start(SensorBoard sensorBoard){ if(sensorBoard != null){ mSensorBoard = sensorBoard; mSensorBoard.addListener(this); - mSensorBoard.startAccelerometer(); + //mSensorBoard.startAccelerometer(); + mSensorBoard.startLinearAccelerometer(); + + mFileWriter = new SensorDataFileWriter(mContext); startWorker(); @@ -41,11 +50,14 @@ public class Estimator implements SensorBoard.OnSensorBoardDataListener { public void stop(){ if(mSensorBoard != null){ mSensorBoard.removeListener(this); - mSensorBoard.stopAccelerometer(); + //mSensorBoard.stopAccelerometer(); + mSensorBoard.stopLinearAccelerometer(); mAccelerometerWindowBuffer.clear(); mBpmEstimator.reset(); + mFileWriter.toDisk(); + } else { Log.i("Estimator","Cant stop estimator. SensorBoard is null."); } @@ -55,8 +67,11 @@ public class Estimator implements SensorBoard.OnSensorBoardDataListener { public void onAccelerometerChanged(AccelerometerData data) { mAccelerometerWindowBuffer.add(data); + //Log.d("Acc: ", "x: " + data.x + " y: " + data.y + " z: " + data.z); + //todo: save data into stream and write on disk + mFileWriter.writeVector3D(data.ts, 2, data.x, data.y, data.z); } private void startWorker() { diff --git a/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/sensor/SensorBoard.java b/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/sensor/SensorBoard.java index 9e6ab2f..f298fab 100644 --- a/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/sensor/SensorBoard.java +++ b/android/ConductorsSensor/app/src/main/java/de/tonifetzer/conductorssensor/sensor/SensorBoard.java @@ -9,8 +9,6 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.util.Log; -import android.view.View; -import android.widget.ProgressBar; import android.widget.Toast; import com.mbientlab.metawear.Data; @@ -22,6 +20,8 @@ import com.mbientlab.metawear.builder.RouteBuilder; import com.mbientlab.metawear.builder.RouteComponent; import com.mbientlab.metawear.data.Acceleration; import com.mbientlab.metawear.module.Accelerometer; +import com.mbientlab.metawear.module.SensorFusionBosch; +import com.mbientlab.metawear.module.SensorFusionBosch.*; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -36,7 +36,9 @@ public class SensorBoard implements ServiceConnection { private BtleService.LocalBinder serviceBinder; private MetaWearBoard mMetaBoard; private BluetoothDevice mBluetoothDevice; + private Accelerometer mAccelerometer; + private SensorFusionBosch mSensorFusion; private boolean mBoardConnected = false; @@ -203,6 +205,7 @@ public class SensorBoard implements ServiceConnection { mAccelerometer.configure() .odr(75f) // 75hz + .range(4f) .commit(); mAccelerometer.acceleration().addRouteAsync(new RouteBuilder() { @@ -243,6 +246,51 @@ public class SensorBoard implements ServiceConnection { } + public void startLinearAccelerometer(){ + + if(mMetaBoard.isConnected()){ + mSensorFusion = mMetaBoard.getModule(SensorFusionBosch.class); + + mSensorFusion.configure() + .mode(Mode.NDOF) + .accRange(AccRange.AR_16G) + .gyroRange(GyroRange.GR_2000DPS) + .commit(); + + mSensorFusion.linearAcceleration().addRouteAsync(new RouteBuilder() { + @Override + public void configure(RouteComponent source) { + source.stream(new Subscriber() { + @Override + public void apply(Data data, Object... env) { + for(OnSensorBoardDataListener listener : mDataListeners){ + listener.onAccelerometerChanged(new AccelerometerData( + System.currentTimeMillis(), + data.value(Acceleration.class).x(), + data.value(Acceleration.class).y(), + data.value(Acceleration.class).z())); + } + } + }); + } + }).continueWith(new Continuation() { + @Override + public Void then(Task task) throws Exception { + mSensorFusion.linearAcceleration().start(); + mSensorFusion.start(); + return null; + } + }); + } + } + + public void stopLinearAccelerometer(){ + + if(mMetaBoard.isConnected()){ + mSensorFusion.stop(); + } + } + /** * Interface for callback onConnectionInfos diff --git a/android/ConductorsWatch/app/build.gradle b/android/ConductorsWatch/app/build.gradle index 2494041..7cd9fa1 100644 --- a/android/ConductorsWatch/app/build.gradle +++ b/android/ConductorsWatch/app/build.gradle @@ -47,5 +47,5 @@ dependencies { implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.android.support:wear:26.1.0' compileOnly 'com.google.android.wearable:wearable:2.2.0' - compile 'com.github.wendykierp:JTransforms:3.1' + api 'com.github.wendykierp:JTransforms:3.1' } diff --git a/matlab/AutoCorrMethodNew_Watch.m b/matlab/AutoCorrMethodNew_Watch.m index dbf4f76..b13ee1b 100644 --- a/matlab/AutoCorrMethodNew_Watch.m +++ b/matlab/AutoCorrMethodNew_Watch.m @@ -40,8 +40,8 @@ %measurements = dlmread('../measurements/wearR/recording_180bpm_4-4_177011641.csv', ';'); * %measurements = dlmread('../measurements/wearR/recording_180bpm_4-4_177064915.csv', ';'); * - -files = dir(fullfile('../../measurements/lgWear/', '*.csv')); +files = dir(fullfile('../../measurements/mSensor/', '*.csv')); +%files = dir(fullfile('../../measurements/lgWear/', '*.csv')); %files = dir(fullfile('../../measurements/wearR/', '*.csv')); %files = dir(fullfile('../../measurements/peter_failed/', '*.csv')); @@ -52,7 +52,7 @@ for file = files' %draw the raw acc data m_idx = []; - m_idx = (measurements(:,2)==2); %Android App: 10, Normal Data: 2 + m_idx = (measurements(:,2)==3); %Android App: 10, Normal Data: 2 m = measurements(m_idx, :); %Interpolate to generate a constant sample rate to 250hz (4ms per sample)