made mSensor App ready for recording session at manfreds house
This commit is contained in:
@@ -51,7 +51,7 @@ public class MainActivity extends FragmentActivity implements PopupMenu.OnMenuIt
|
|||||||
//textview to show the bpm estimation
|
//textview to show the bpm estimation
|
||||||
mBpmTextView = (TextView) findViewById(R.id.bpmText);
|
mBpmTextView = (TextView) findViewById(R.id.bpmText);
|
||||||
|
|
||||||
mEstimator = new Estimator();
|
mEstimator = new Estimator(this);
|
||||||
mEstimator.addListener(this);
|
mEstimator.addListener(this);
|
||||||
|
|
||||||
// ensures the connection to the bt sensor board
|
// ensures the connection to the bt sensor board
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package de.tonifetzer.conductorssensor.estimation;
|
package de.tonifetzer.conductorssensor.estimation;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@@ -9,6 +10,7 @@ import java.util.TimerTask;
|
|||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
import de.tonifetzer.conductorssensor.sensor.SensorBoard;
|
import de.tonifetzer.conductorssensor.sensor.SensorBoard;
|
||||||
|
import de.tonifetzer.conductorssensor.utilities.SensorDataFileWriter;
|
||||||
import de.tonifetzer.conductorssensor.utilities.Utils;
|
import de.tonifetzer.conductorssensor.utilities.Utils;
|
||||||
|
|
||||||
public class Estimator implements SensorBoard.OnSensorBoardDataListener {
|
public class Estimator implements SensorBoard.OnSensorBoardDataListener {
|
||||||
@@ -18,18 +20,25 @@ public class Estimator implements SensorBoard.OnSensorBoardDataListener {
|
|||||||
private BpmEstimator mBpmEstimator;
|
private BpmEstimator mBpmEstimator;
|
||||||
|
|
||||||
private Timer mTimer = new Timer();
|
private Timer mTimer = new Timer();
|
||||||
|
private SensorDataFileWriter mFileWriter;
|
||||||
|
private Context mContext;
|
||||||
|
|
||||||
public Estimator(){
|
public Estimator(Context context){
|
||||||
|
|
||||||
mAccelerometerWindowBuffer = new AccelerometerWindowBuffer(6000, 750);
|
mAccelerometerWindowBuffer = new AccelerometerWindowBuffer(6000, 750);
|
||||||
mBpmEstimator = new BpmEstimator(mAccelerometerWindowBuffer, 0, 5000);
|
mBpmEstimator = new BpmEstimator(mAccelerometerWindowBuffer, 0, 5000);
|
||||||
|
|
||||||
|
mContext = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start(SensorBoard sensorBoard){
|
public void start(SensorBoard sensorBoard){
|
||||||
if(sensorBoard != null){
|
if(sensorBoard != null){
|
||||||
mSensorBoard = sensorBoard;
|
mSensorBoard = sensorBoard;
|
||||||
mSensorBoard.addListener(this);
|
mSensorBoard.addListener(this);
|
||||||
mSensorBoard.startAccelerometer();
|
//mSensorBoard.startAccelerometer();
|
||||||
|
mSensorBoard.startLinearAccelerometer();
|
||||||
|
|
||||||
|
mFileWriter = new SensorDataFileWriter(mContext);
|
||||||
|
|
||||||
startWorker();
|
startWorker();
|
||||||
|
|
||||||
@@ -41,11 +50,14 @@ public class Estimator implements SensorBoard.OnSensorBoardDataListener {
|
|||||||
public void stop(){
|
public void stop(){
|
||||||
if(mSensorBoard != null){
|
if(mSensorBoard != null){
|
||||||
mSensorBoard.removeListener(this);
|
mSensorBoard.removeListener(this);
|
||||||
mSensorBoard.stopAccelerometer();
|
//mSensorBoard.stopAccelerometer();
|
||||||
|
mSensorBoard.stopLinearAccelerometer();
|
||||||
|
|
||||||
mAccelerometerWindowBuffer.clear();
|
mAccelerometerWindowBuffer.clear();
|
||||||
mBpmEstimator.reset();
|
mBpmEstimator.reset();
|
||||||
|
|
||||||
|
mFileWriter.toDisk();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Log.i("Estimator","Cant stop estimator. SensorBoard is null.");
|
Log.i("Estimator","Cant stop estimator. SensorBoard is null.");
|
||||||
}
|
}
|
||||||
@@ -55,8 +67,11 @@ public class Estimator implements SensorBoard.OnSensorBoardDataListener {
|
|||||||
public void onAccelerometerChanged(AccelerometerData data) {
|
public void onAccelerometerChanged(AccelerometerData data) {
|
||||||
mAccelerometerWindowBuffer.add(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
|
//todo: save data into stream and write on disk
|
||||||
|
|
||||||
|
mFileWriter.writeVector3D(data.ts, 2, data.x, data.y, data.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startWorker() {
|
private void startWorker() {
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ import android.os.Handler;
|
|||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.mbientlab.metawear.Data;
|
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.builder.RouteComponent;
|
||||||
import com.mbientlab.metawear.data.Acceleration;
|
import com.mbientlab.metawear.data.Acceleration;
|
||||||
import com.mbientlab.metawear.module.Accelerometer;
|
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.List;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
@@ -36,7 +36,9 @@ public class SensorBoard implements ServiceConnection {
|
|||||||
private BtleService.LocalBinder serviceBinder;
|
private BtleService.LocalBinder serviceBinder;
|
||||||
private MetaWearBoard mMetaBoard;
|
private MetaWearBoard mMetaBoard;
|
||||||
private BluetoothDevice mBluetoothDevice;
|
private BluetoothDevice mBluetoothDevice;
|
||||||
|
|
||||||
private Accelerometer mAccelerometer;
|
private Accelerometer mAccelerometer;
|
||||||
|
private SensorFusionBosch mSensorFusion;
|
||||||
|
|
||||||
private boolean mBoardConnected = false;
|
private boolean mBoardConnected = false;
|
||||||
|
|
||||||
@@ -203,6 +205,7 @@ public class SensorBoard implements ServiceConnection {
|
|||||||
|
|
||||||
mAccelerometer.configure()
|
mAccelerometer.configure()
|
||||||
.odr(75f) // 75hz
|
.odr(75f) // 75hz
|
||||||
|
.range(4f)
|
||||||
.commit();
|
.commit();
|
||||||
|
|
||||||
mAccelerometer.acceleration().addRouteAsync(new RouteBuilder() {
|
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<Route, Void>() {
|
||||||
|
@Override
|
||||||
|
public Void then(Task<Route> task) throws Exception {
|
||||||
|
mSensorFusion.linearAcceleration().start();
|
||||||
|
mSensorFusion.start();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopLinearAccelerometer(){
|
||||||
|
|
||||||
|
if(mMetaBoard.isConnected()){
|
||||||
|
mSensorFusion.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for callback onConnectionInfos
|
* Interface for callback onConnectionInfos
|
||||||
|
|||||||
@@ -47,5 +47,5 @@ dependencies {
|
|||||||
implementation 'com.android.support:recyclerview-v7:26.1.0'
|
implementation 'com.android.support:recyclerview-v7:26.1.0'
|
||||||
implementation 'com.android.support:wear:26.1.0'
|
implementation 'com.android.support:wear:26.1.0'
|
||||||
compileOnly 'com.google.android.wearable:wearable:2.2.0'
|
compileOnly 'com.google.android.wearable:wearable:2.2.0'
|
||||||
compile 'com.github.wendykierp:JTransforms:3.1'
|
api 'com.github.wendykierp:JTransforms:3.1'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,8 +40,8 @@
|
|||||||
%measurements = dlmread('../measurements/wearR/recording_180bpm_4-4_177011641.csv', ';'); *
|
%measurements = dlmread('../measurements/wearR/recording_180bpm_4-4_177011641.csv', ';'); *
|
||||||
%measurements = dlmread('../measurements/wearR/recording_180bpm_4-4_177064915.csv', ';'); *
|
%measurements = dlmread('../measurements/wearR/recording_180bpm_4-4_177064915.csv', ';'); *
|
||||||
|
|
||||||
|
files = dir(fullfile('../../measurements/mSensor/', '*.csv'));
|
||||||
files = dir(fullfile('../../measurements/lgWear/', '*.csv'));
|
%files = dir(fullfile('../../measurements/lgWear/', '*.csv'));
|
||||||
%files = dir(fullfile('../../measurements/wearR/', '*.csv'));
|
%files = dir(fullfile('../../measurements/wearR/', '*.csv'));
|
||||||
%files = dir(fullfile('../../measurements/peter_failed/', '*.csv'));
|
%files = dir(fullfile('../../measurements/peter_failed/', '*.csv'));
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ for file = files'
|
|||||||
|
|
||||||
%draw the raw acc data
|
%draw the raw acc data
|
||||||
m_idx = [];
|
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, :);
|
m = measurements(m_idx, :);
|
||||||
|
|
||||||
%Interpolate to generate a constant sample rate to 250hz (4ms per sample)
|
%Interpolate to generate a constant sample rate to 250hz (4ms per sample)
|
||||||
|
|||||||
Reference in New Issue
Block a user