Skip to content

Commit 3026be0

Browse files
ST BLE Sensor v4.6.1 source code
add support for opus streaming mobilde -> board add support for MLC / FSM demos
1 parent 82fbced commit 3026be0

105 files changed

Lines changed: 4235 additions & 302 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,8 @@ proguard/
3333

3434
#mac file
3535
.DS_Store
36+
37+
#hprof file
38+
*.hprof
39+
40+
!gradle.properties

BlueMS/build.gradle

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
*/
3737

3838
apply plugin: 'com.android.application'
39+
apply plugin: 'kotlin-android-extensions'
40+
apply plugin: 'kotlin-android'
3941

4042
static def getDate() {
4143
def date = new Date()
@@ -61,8 +63,8 @@ android {
6163

6264
minSdkVersion rootProject.ext.minSdkVersion
6365
targetSdkVersion rootProject.ext.targetSdkVersion
64-
versionCode 37
65-
versionName '4.5.2'
66+
versionCode 40
67+
versionName '4.6.1'
6668
applicationId "com.st.bluems"
6769
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
6870
vectorDrawables.useSupportLibrary = true
@@ -109,6 +111,11 @@ android {
109111
sourceCompatibility JavaVersion.VERSION_1_8
110112
targetCompatibility JavaVersion.VERSION_1_8
111113
}
114+
115+
kotlinOptions {
116+
jvmTarget = "1.8"
117+
}
118+
112119
packagingOptions {
113120
exclude "thirdpartynotice.txt"
114121
}
@@ -120,9 +127,28 @@ ext {
120127

121128
repositories {
122129
maven { url 'https://jitpack.io' }
130+
mavenCentral()
123131
}
124132

125133
dependencies {
134+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
135+
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutineVersion"
136+
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutineAndroidVersion"
137+
138+
components.all {
139+
allVariants {
140+
withDependencies { deps ->
141+
deps.each { dep ->
142+
if (dep.group == 'org.eclipse.paho' && dep.name =='org.eclipse.paho.client.mqttv3') {
143+
dep.version {
144+
require "1.2.0"
145+
}
146+
dep.because "require api 24: https://github.com/eclipse/paho.mqtt.java/issues/633"
147+
}
148+
}
149+
}
150+
}
151+
}
126152

127153
implementation project(':BlueSTSDK')
128154
implementation project(':BlueSTSDK_Gui_Android')
@@ -147,22 +173,23 @@ dependencies {
147173
annotationProcessor group:'androidx.room', name:'room-compiler', version: "$rootProject.androidx_roomVersion"
148174

149175
// Lifecycle components
150-
implementation group: 'androidx.lifecycle', name: 'lifecycle-viewmodel-ktx', version: "$rootProject.androidx_lifecycleExtVersion"
151176
implementation group: 'androidx.lifecycle', name: 'lifecycle-extensions', version: "$rootProject.androidx_lifecycleExtVersion"
177+
implementation group: 'androidx.lifecycle', name: 'lifecycle-viewmodel-ktx', version: "$rootProject.androidx_lifecycleExtVersion"
178+
implementation group: 'androidx.lifecycle', name: 'lifecycle-viewmodel-savedstate', version: "$rootProject.androidx_lifecycleSaveStateVersion"
179+
152180

153181
// ibm speech to text
154-
implementation(group: 'com.ibm.watson', name: 'speech-to-text', version: '8.0.0'){
182+
implementation(group: 'com.ibm.watson', name: 'speech-to-text', version: '8.1.0'){
155183
exclude group: 'com.google.code.findbugs', module: 'annotations'
156184
}
157185

158-
159-
//generic websocket speech to cloud, keep 3.12.x to be compatible with device < api 21
160-
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.12.2'
186+
//use the v 3.11 to avoid chrash with ibm
187+
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.11.0'
161188

162189
// crashlytics
163190
implementation group: 'com.crashlytics.sdk.android', name: 'crashlytics', version: '2.10.1'
164191
//keep the 16.x to avoid android x to avoid new support library that will break the plot
165-
implementation group: 'com.google.firebase', name: 'firebase-core', version: '17.2.0'
192+
implementation group: 'com.google.firebase', name: 'firebase-core', version: '17.2.1'
166193

167194
//memory leak detector
168195
debugImplementation group: 'com.squareup.leakcanary', name: 'leakcanary-android', version: "$leakcanaryVersion"
@@ -178,8 +205,6 @@ dependencies {
178205
androidTestImplementation group:'androidx.test', name:'rules', version:"$rootProject.androidx_rulesVersion"
179206
androidTestImplementation group:'androidx.test.espresso', name: 'espresso-core', version:"$rootProject.androidx_espressoVersion"
180207

181-
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
182-
183208
}
184209

185210
apply plugin: 'kotlin-android'

BlueMS/proguard-rules.pro

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,37 +16,20 @@
1616
# public *;
1717
#}
1818

19-
-keep class com.androidplot.xy.** { *; }
20-
-keep class com.androidplot.ui.** { *; }
21-
22-
#retrofit proguard rules http://square.github.io/retrofit/
23-
# Platform calls Class.forName on types which do not exist on Android to determine platform.
24-
-dontnote retrofit2.Platform
25-
# Platform used when running on Java 8 VMs. Will not be used at runtime
26-
-dontwarn retrofit2.Platform$Java8
27-
# Retain generic type information for use by reflection by converters and adapters.
28-
-keepattributes Signature
29-
# Retain declared checked exceptions for use by a Proxy instance.
30-
-keepattributes Exceptions
31-
#retrofit 2.3 & co
32-
-dontwarn javax.annotation.**
33-
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
34-
3519
#ibm watson
3620
#keep the class member name to avoid problems with json to java objects
37-
-keepclassmembers class com.ibm.watson.developer_cloud.speech_to_text.v1.** { <fields>; }
21+
-keepclassmembers class com.ibm.watson.speech_to_text.v1.** { <fields>; }
3822
#ingore warnings about class that do not exist in android
3923
-dontwarn javax.naming.InitialContext
4024
-dontwarn javax.naming.Context
4125

4226
#need for okhttp (audio websocket)
4327
# https://github.com/square/okhttp/blob/master/okhttp/src/main/resources/META-INF/proguard/okhttp3.pro
4428
# JSR 305 annotations are for embedding nullability information.
45-
-dontwarn javax.annotation.**
46-
29+
#-dontwarn javax.annotation.**
4730
# A resource is loaded with a relative path so the package of this class must be preserved.
48-
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
31+
#-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
4932
# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
50-
-dontwarn org.codehaus.mojo.animal_sniffer.*
33+
#-dontwarn org.codehaus.mojo.animal_sniffer.*
5134
# OkHttp platform used only on JVM and when Conscrypt dependency is available.
52-
-dontwarn okhttp3.internal.platform.ConscryptPlatform
35+
#-dontwarn okhttp3.internal.platform.ConscryptPlatform

BlueMS/src/main/AndroidManifest.xml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@
4444
<!-- Memes Sensor Fusion vibrate when a free fall is detected -->
4545
<uses-permission android:name="android.permission.VIBRATE" />
4646

47+
<!-- needed for the Sensor fusion demo demos -->
4748
<uses-feature
4849
android:glEsVersion="0x00020000"
49-
android:required="true" /> <!-- needed for the BlueVoice demos -->
50+
android:required="true" />
51+
<!-- needed for the BlueVoice demos -->
5052
<uses-feature
5153
android:name="android.hardware.audio.low_latency"
5254
android:required="false" />
@@ -57,11 +59,10 @@
5759
android:icon="@mipmap/ic_launcher"
5860
android:label="@string/app_name"
5961
android:logo="@drawable/app_logo"
60-
android:theme="@style/AppTheme">
61-
<!-- thanks to iFlytek library
62-
https://developer.android.com/about/versions/pie/android-9.0-changes-28#apache-p
63-
-->
64-
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
62+
android:theme="@style/AppTheme"
63+
android:requestLegacyExternalStorage="true"
64+
>
65+
<!-- requestLegacyExternalStorage = true to disable the scoped storage on android 10 -->
6566

6667
<service
6768
android:name=".demos.fftAmpitude.FFTExportedService"
436 KB
Binary file not shown.

BlueMS/src/main/java/com/st/BlueMS/DemosActivity.java

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,15 @@
4141
import android.content.Intent;
4242
import android.os.Bundle;
4343
import androidx.annotation.NonNull;
44+
45+
import android.util.Log;
4446
import android.view.MenuItem;
4547

4648
import com.st.BlueMS.demos.AccEvent.AccEventFragment;
4749
import com.st.BlueMS.demos.ActivityRecognition.ActivityRecognitionFragment;
4850
import com.st.BlueMS.demos.Audio.Beamforming.BeamformingFragment;
4951
import com.st.BlueMS.demos.Audio.BlueVoice.BlueVoiceFragment;
52+
import com.st.BlueMS.demos.Audio.BlueVoice.fullBand.BlueVoiceFullBandFragment;
5053
import com.st.BlueMS.demos.Audio.SpeechToText.SpeechToTextFragment;
5154
import com.st.BlueMS.demos.AudioClassification.AudioClassificationFragment;
5255
import com.st.BlueMS.demos.COSensor.COSensorDemoFragment;
@@ -58,6 +61,8 @@
5861
import com.st.BlueMS.demos.aiDataLog.AIDataLogDemoFragment;
5962
import com.st.BlueMS.demos.fftAmpitude.FFTAmplitudeFragment;
6063
import com.st.BlueMS.demos.fitnessActivity.FitnessActivityFragment;
64+
import com.st.BlueMS.demos.machineLearningCore.FiniteStateMachineFragment;
65+
import com.st.BlueMS.demos.machineLearningCore.MachineLearningCoreFragment;
6166
import com.st.BlueMS.demos.memsSensorFusion.CompassFragment;
6267
import com.st.BlueMS.demos.EnvironmentalSensorsFragment;
6368
import com.st.BlueMS.demos.HeartRateFragment;
@@ -73,7 +78,11 @@
7378
import com.st.BlueMS.demos.multiNN.MultiNeuralNetworkFragment;
7479
import com.st.BlueMS.demos.plot.PlotFeatureFragment;
7580
import com.st.BlueMS.preference.nucleo.SettingsWithNucleoConfiguration;
81+
import com.st.BlueSTSDK.Debug;
82+
import com.st.BlueSTSDK.ExportedFeature;
83+
import com.st.BlueSTSDK.Features.Audio.Opus.ExportedFeatureAudioOpus;
7684
import com.st.BlueSTSDK.Node;
85+
import com.st.BlueSTSDK.NodeServer;
7786
import com.st.BlueSTSDK.Utils.ConnectionOption;
7887
import com.st.BlueSTSDK.gui.demos.DemoDescriptionAnnotation;
7988
import com.st.BlueSTSDK.gui.demos.DemoFragment;
@@ -85,6 +94,11 @@
8594
import java.util.ArrayList;
8695
import java.util.Arrays;
8796

97+
import java.util.ArrayList;
98+
import java.util.Arrays;
99+
import java.util.Collections;
100+
import java.util.List;
101+
88102
/**
89103
* Activity that display all the demo available for the node
90104
*/
@@ -133,6 +147,7 @@ public static class LedButtonControlFragment extends com.st.STM32WB.p2pDemo.LedB
133147
FFTAmplitudeFragment.class,
134148
PlotFeatureFragment.class,
135149
SDLogFragment.class,
150+
MultiNeuralNetworkFragment.class,
136151
ActivityRecognitionFragment.class,
137152
CarryPositionFragment.class,
138153
ProximityGestureRecognitionFragment.class,
@@ -153,27 +168,51 @@ public static class LedButtonControlFragment extends com.st.STM32WB.p2pDemo.LedB
153168
LedButtonControlFragment.class,
154169
StartOtaRebootFragment.class,
155170
AIDataLogDemoFragment.class,
156-
MultiNeuralNetworkFragment.class,
157171
CloudLogFragment.class,
158172
PredictiveMaintenanceFragment.class,
159173
MotionAlgorithmFragment.class,
160174
FitnessActivityFragment.class,
175+
MachineLearningCoreFragment.class,
176+
FiniteStateMachineFragment.class,
161177
NodeStatusFragment.class,
162178
//FeatureDebugFragment.class
163179
};
164180

165181
@SuppressWarnings("unchecked")
166182
@Override
167183
protected Class<? extends DemoFragment>[] getAllDemos() {
168-
return ALL_DEMOS;
184+
ArrayList<Class<? extends DemoFragment>> demoList = new ArrayList<>(Arrays.asList(ALL_DEMOS));
185+
if(getNode().getType() == Node.Type.STEVAL_BCN002V1){
186+
demoList.remove(SpeechToTextFragment.class);
187+
}
188+
189+
List<Class<? extends DemoFragment>> serverDemos = getServerSizeDemos();
190+
if(!serverDemos.isEmpty()) {
191+
demoList.addAll(0,serverDemos);
192+
}
193+
return demoList.toArray(new Class[0]);
194+
}
195+
196+
private List<Class<? extends DemoFragment>> getServerSizeDemos(){
197+
NodeServer server = getNode().getNodeServer();
198+
if(server == null){
199+
return Collections.emptyList();
200+
}
201+
ArrayList<Class<? extends DemoFragment>> demos = new ArrayList<>();
202+
203+
ExportedFeature opusAudio = server.getExportedFeature(ExportedFeatureAudioOpus.class);
204+
if(opusAudio!=null && opusAudio.isNotificationEnabled()){
205+
demos.add(BlueVoiceFullBandFragment.class);
206+
}
207+
208+
return demos;
169209
}
170210

171211
@Override
172212
protected boolean enableFwUploading() {
173213
return true;
174214
}
175215

176-
177216
@Override
178217
public boolean onOptionsItemSelected(MenuItem item) {
179218
int id = item.getItemId();
@@ -187,4 +226,48 @@ public boolean onOptionsItemSelected(MenuItem item) {
187226
return super.onOptionsItemSelected(item);
188227
}
189228

229+
230+
@Override
231+
protected void onStart() {
232+
enableServerSideDemo();
233+
super.onStart();
234+
}
235+
236+
private ExportedFeature.ExportedFeatureCallback mRefreshDemoList = new ExportedFeature.ExportedFeatureCallback() {
237+
@Override
238+
public void onNotificationDisabled(@NonNull ExportedFeature onFeature) {
239+
Log.d("DEmoActivity","reload demos");
240+
reloadDemoList();
241+
}
242+
243+
@Override
244+
public void onNotificationEnabled(@NonNull ExportedFeature onFeature) {
245+
Log.d("DEmoActivity","reload demos");
246+
reloadDemoList();
247+
}
248+
};
249+
250+
private void enableServerSideDemo() {
251+
NodeServer server = getNode().getNodeServer();
252+
if(server == null)
253+
return;
254+
ExportedFeature f = server.getExportedFeature(ExportedFeatureAudioOpus.class);
255+
if(f!=null)
256+
f.addListener(mRefreshDemoList);
257+
}
258+
259+
@Override
260+
protected void onStop() {
261+
disableServerSideDemo();
262+
super.onStop();
263+
}
264+
265+
private void disableServerSideDemo() {
266+
NodeServer server = getNode().getNodeServer();
267+
if(server == null)
268+
return;
269+
ExportedFeature f = server.getExportedFeature(ExportedFeatureAudioOpus.class);
270+
if(f!=null)
271+
f.removeListener(mRefreshDemoList);
272+
}
190273
}

BlueMS/src/main/java/com/st/BlueMS/NodeListActivity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,14 @@
3737

3838
package com.st.BlueMS;
3939

40+
4041
import androidx.annotation.NonNull;
4142

4243
import com.st.BlueNRG.fwUpgrade.BlueNRGAdvertiseFilter;
4344
import com.st.BlueNRG.fwUpgrade.feature.BlueNRGOTASupport;
4445
import com.st.BlueSTSDK.Features.standardCharacteristics.StdCharToFeatureMap;
4546
import com.st.BlueSTSDK.Node;
47+
import com.st.BlueSTSDK.Utils.BLENodeDefines;
4648
import com.st.BlueSTSDK.Utils.ConnectionOption;
4749
import com.st.BlueSTSDK.Utils.advertise.AdvertiseFilter;
4850
import com.st.BlueSTSDK.gui.fwUpgrade.FwUpgradeActivity;
@@ -85,6 +87,8 @@ public void onNodeSelected(@NonNull Node n) {
8587

8688
ConnectionOption options = optionsBuilder.build();
8789

90+
n.enableNodeServer(BLENodeDefines.FeatureCharacteristics.getDefaultExportedFeature());
91+
8892
if(n.getAdvertiseInfo() instanceof BlueNRGAdvertiseFilter.BlueNRGAdvertiseInfo)
8993
startActivity(FwUpgradeActivity.getStartIntent(this, n,false,options));
9094
else if(n.getType()== Node.Type.STEVAL_WESU1)

BlueMS/src/main/java/com/st/BlueMS/demos/AccEvent/AccEventFragment.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public class AccEventFragment extends BaseDemoFragment implements AdapterView.On
8686
DetectableEvent.WAKE_UP
8787
};
8888

89-
private static final DetectableEvent SENSORTILE101_SUPPORTED_EVENT[] = {
89+
private static final DetectableEvent SENSORTILEBOX_SUPPORTED_EVENT[] = {
9090
DetectableEvent.NONE,
9191
DetectableEvent.ORIENTATION,
9292
DetectableEvent.DOUBLE_TAP,
@@ -132,7 +132,7 @@ private static DetectableEvent[] getDetectableEvent(Node.Type type){
132132
case NUCLEO:
133133
return NUCLEO_SUPPORTED_EVENT;
134134
case SENSOR_TILE_BOX:
135-
return SENSORTILE101_SUPPORTED_EVENT;
135+
return SENSORTILEBOX_SUPPORTED_EVENT;
136136
default:
137137
return new DetectableEvent[0];
138138
}

0 commit comments

Comments
 (0)