diff --git a/SensorLib/rxsensorlib/.gitignore b/SensorLib/rxsensorlib/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/SensorLib/rxsensorlib/.gitignore @@ -0,0 +1 @@ +/build diff --git a/SensorLib/rxsensorlib/build.gradle b/SensorLib/rxsensorlib/build.gradle new file mode 100644 index 00000000..95cba9b2 --- /dev/null +++ b/SensorLib/rxsensorlib/build.gradle @@ -0,0 +1,41 @@ +apply plugin: 'com.android.library' +apply plugin: 'com.github.dcendents.android-maven' + +group='com.github.gradlman.SensorLib' +version = '1.0' + +android { + compileSdkVersion 27 + + + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + api 'io.reactivex.rxjava2:rxandroid:2.1.0' + api 'io.reactivex.rxjava2:rxjava:2.2.6' + implementation 'com.android.support:appcompat-v7:27.1.1' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + api project(path: ':sensorlib') +} diff --git a/SensorLib/rxsensorlib/proguard-rules.pro b/SensorLib/rxsensorlib/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/SensorLib/rxsensorlib/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/SensorLib/rxsensorlib/src/androidTest/java/de/fau/sensorlib/rx/ExampleInstrumentedTest.java b/SensorLib/rxsensorlib/src/androidTest/java/de/fau/sensorlib/rx/ExampleInstrumentedTest.java new file mode 100644 index 00000000..2568659f --- /dev/null +++ b/SensorLib/rxsensorlib/src/androidTest/java/de/fau/sensorlib/rx/ExampleInstrumentedTest.java @@ -0,0 +1,28 @@ +package de.fau.sensorlib.rx; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest +{ + @Test + public void useAppContext() + { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("de.fau.sensorlib.rx.test", appContext.getPackageName()); + } +} diff --git a/SensorLib/rxsensorlib/src/main/AndroidManifest.xml b/SensorLib/rxsensorlib/src/main/AndroidManifest.xml new file mode 100644 index 00000000..b805ad33 --- /dev/null +++ b/SensorLib/rxsensorlib/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/SensorLib/rxsensorlib/src/main/java/de/fau/sensorlib/rx/RxSensorDataProcessor.java b/SensorLib/rxsensorlib/src/main/java/de/fau/sensorlib/rx/RxSensorDataProcessor.java new file mode 100644 index 00000000..e3ca9df4 --- /dev/null +++ b/SensorLib/rxsensorlib/src/main/java/de/fau/sensorlib/rx/RxSensorDataProcessor.java @@ -0,0 +1,123 @@ +package de.fau.sensorlib.rx; + +import de.fau.sensorlib.SensorDataProcessor; +import de.fau.sensorlib.dataframe.SensorDataFrame; +import de.fau.sensorlib.sensors.AbstractSensor; +import io.reactivex.Observable; +import io.reactivex.subjects.PublishSubject; + +public class RxSensorDataProcessor extends SensorDataProcessor +{ + + public enum SensorState + { + CREATED, CONNECTING, CONNECTED, DISCONNECTED, CONNECTION_LOST, STREAMING_STARTED, STREAMING_STOPPED + } + + public static class SensorNotification + { + private final AbstractSensor sensor; + private final T notification; + + public SensorNotification(AbstractSensor sensor, T notification) + { + this.sensor = sensor; + this.notification = notification; + } + + public AbstractSensor getSensor() + { + return sensor; + } + + public T getNotification() + { + return notification; + } + } + + private PublishSubject> sensorStateSubject = PublishSubject.create(); + private PublishSubject> sensorSamplingRateSubject = PublishSubject.create(); + private PublishSubject> sensorNotificationSubject = PublishSubject.create(); + private PublishSubject newDataSubject = PublishSubject.create(); + + + @Override + public void onSensorCreated(AbstractSensor sensor) + { + sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.CREATED)); + } + + @Override + public void onConnected(AbstractSensor sensor) + { + sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.CONNECTED)); + } + + @Override + public void onConnecting(AbstractSensor sensor) + { + sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.CONNECTING)); + } + + @Override + public void onDisconnected(AbstractSensor sensor) + { + sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.DISCONNECTED)); + } + + @Override + public void onConnectionLost(AbstractSensor sensor) + { + sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.CONNECTION_LOST)); + } + + @Override + public void onStartStreaming(AbstractSensor sensor) + { + sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.STREAMING_STARTED)); + } + + @Override + public void onStopStreaming(AbstractSensor sensor) + { + sensorStateSubject.onNext(new SensorNotification(sensor, SensorState.STREAMING_STOPPED)); + } + + @Override + public void onSamplingRateChanged(AbstractSensor sensor, double newSamplingRate) + { + sensorSamplingRateSubject.onNext(new SensorNotification(sensor, newSamplingRate)); + } + + @Override + public void onNotify(AbstractSensor sensor, Object notification) + { + sensorNotificationSubject.onNext(new SensorNotification(sensor, notification)); + } + + @Override + public void onNewData(SensorDataFrame data) + { + newDataSubject.onNext(data); + } + + public Observable> getSensorStateObservable() + { + return sensorStateSubject; + } + + public Observable> getSensorSamplingRateObservable() + { + return sensorSamplingRateSubject; + } + + public Observable> getSensorNotificationObservable() + { + return sensorNotificationSubject; + } + + public Observable getNewDataObservable() { + return (Observable) newDataSubject; + } +} diff --git a/SensorLib/rxsensorlib/src/main/res/values/strings.xml b/SensorLib/rxsensorlib/src/main/res/values/strings.xml new file mode 100644 index 00000000..1e7011e0 --- /dev/null +++ b/SensorLib/rxsensorlib/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + RxSensorLib + diff --git a/SensorLib/rxsensorlib/src/test/java/de/fau/sensorlib/rx/ExampleUnitTest.java b/SensorLib/rxsensorlib/src/test/java/de/fau/sensorlib/rx/ExampleUnitTest.java new file mode 100644 index 00000000..bc138e39 --- /dev/null +++ b/SensorLib/rxsensorlib/src/test/java/de/fau/sensorlib/rx/ExampleUnitTest.java @@ -0,0 +1,19 @@ +package de.fau.sensorlib.rx; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest +{ + @Test + public void addition_isCorrect() + { + assertEquals(4, 2 + 2); + } +} diff --git a/SensorLib/settings.gradle b/SensorLib/settings.gradle index 2afa4cbe..a72dbb30 100644 --- a/SensorLib/settings.gradle +++ b/SensorLib/settings.gradle @@ -1,4 +1,4 @@ -include ':app', ':sensorlibutils', ':sensorlib', ':sls-tek', ':sls-fitnessshirt', ':sls-shimmer', ':sls-smartwatch', ':sls-simblee', ':sls-smartband2', ':sls-bitalino', ':sls-portabiles' +include ':app', ':sensorlibutils', ':sensorlib', ':sls-tek', ':sls-fitnessshirt', ':sls-shimmer', ':sls-smartwatch', ':sls-simblee', ':sls-smartband2', ':sls-bitalino', ':sls-portabiles', ':rxsensorlib' if (!fileTree(dir: 'sls-empatica/libs', include: 'empalink*.aar').isEmpty()) { include ':sls-empatica' }