From 7334e28d593517b410819489eb00197d1d2d4a27 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Fri, 4 Jan 2019 13:17:02 -0600 Subject: [PATCH 001/207] remove Dex workaround for including external lib under javax --- sensorhub-android-app/build.gradle | 2 +- .../src/org/sensorhub/android/SensorHubService.java | 3 --- sensorhub-android-lib/build.gradle | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/sensorhub-android-app/build.gradle b/sensorhub-android-app/build.gradle index 63afa809..1ea484ff 100644 --- a/sensorhub-android-app/build.gradle +++ b/sensorhub-android-app/build.gradle @@ -5,7 +5,7 @@ ext.details = 'OSH demo app for Android' dependencies { api project(':sensorhub-android-lib') - compileOnly 'javax.xml.stream:stax-api:1.0-2' + implementation 'javax.xml.stream:stax-api:1.0-2' } android { diff --git a/sensorhub-android-app/src/org/sensorhub/android/SensorHubService.java b/sensorhub-android-app/src/org/sensorhub/android/SensorHubService.java index 8bfb5fcd..2e221cc0 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SensorHubService.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SensorHubService.java @@ -67,9 +67,6 @@ public void onCreate() { try { - // load external dex file containing stax API - Dexter.loadFromAssets(this.getApplicationContext(), "stax-api-1.0-2.dex"); - // set default StAX implementation XMLImplFinder.setStaxInputFactory(com.ctc.wstx.stax.WstxInputFactory.class.newInstance()); XMLImplFinder.setStaxOutputFactory(com.ctc.wstx.stax.WstxOutputFactory.class.newInstance()); diff --git a/sensorhub-android-lib/build.gradle b/sensorhub-android-lib/build.gradle index 9d861881..11cae075 100644 --- a/sensorhub-android-lib/build.gradle +++ b/sensorhub-android-lib/build.gradle @@ -18,7 +18,7 @@ dependencies { api project(':sensorhub-android-flirone') //api project(':sensorhub-android-dji') implementation 'org.slf4j:slf4j-android:1.6.1-RC1' - compileOnly 'javax.xml.stream:stax-api:1.0-2' + implementation 'javax.xml.stream:stax-api:1.0-2' } configurations { From f16ff5ac909e29d2425e1e7094d4fd2627d97a12 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 7 Jan 2019 11:24:56 -0600 Subject: [PATCH 002/207] test adding jetty upon updating config --- .../org/sensorhub/android/MainActivity.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 28689156..6930e6ca 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -28,12 +28,19 @@ import java.util.Map.Entry; import android.view.*; + + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.handler.HandlerList; import org.sensorhub.android.comm.BluetoothCommProvider; import org.sensorhub.android.comm.BluetoothCommProviderConfig; import org.sensorhub.android.comm.ble.BleConfig; import org.sensorhub.android.comm.ble.BleNetwork; import org.sensorhub.api.common.Event; import org.sensorhub.api.common.IEventListener; +import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleEvent; import org.sensorhub.api.sensor.ISensorDataInterface; @@ -66,6 +73,11 @@ import android.widget.EditText; import android.widget.TextView; +/** + * Jetty + */ + +import org.eclipse.jetty.server.HttpConfiguration; public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener { @@ -79,6 +91,8 @@ public class MainActivity extends Activity implements TextureView.SurfaceTexture ArrayList sostClients = new ArrayList(); URL sosUrl = null; boolean showVideo; + + Server server; private ServiceConnection sConn = new ServiceConnection() @@ -99,6 +113,27 @@ protected void updateConfig(SharedPreferences prefs, String runName) { sensorhubConfig = new InMemoryConfigDb(); + try { + server = new Server(); + ServerConnector http = null; + ServerConnector https = null; + HandlerList handlers = new HandlerList(); + + HttpConfiguration httpConfig = new HttpConfiguration(); + httpConfig.setSecureScheme("https"); + httpConfig.setSecurePort(3443); // TODO: Change me to non-fixed port + + http = new ServerConnector(server, + new HttpConnectionFactory(httpConfig)); + http.setPort(3080); // TODO: Change me to non-fixed port + http.setIdleTimeout(300000); + + server.addConnector(http); + server.start(); + } catch (Exception e) { + e.printStackTrace(); + } + // get SOS URL from config String sosUriConfig = prefs.getString("sos_uri", ""); String sosUser = prefs.getString("sos_username", null); From ab72e6ee40587c603cb021ff0475ec89d275346b Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 7 Jan 2019 11:27:36 -0600 Subject: [PATCH 003/207] update to auto import vs manual import --- .../src/org/sensorhub/android/MainActivity.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 6930e6ca..a2885656 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -30,6 +30,7 @@ import android.view.*; +import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.ServerConnector; @@ -73,11 +74,6 @@ import android.widget.EditText; import android.widget.TextView; -/** - * Jetty - */ - -import org.eclipse.jetty.server.HttpConfiguration; public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener { From 2deb1447c521f7d7a9af369b329f23308b87c010 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 15 Jan 2019 09:56:40 -0600 Subject: [PATCH 004/207] test HTTP Server config and SOS config in sensorhub config --- .../org/sensorhub/android/MainActivity.java | 78 ++++++++++++------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index a2885656..0a8ebb28 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -18,6 +18,7 @@ import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; +import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.text.SimpleDateFormat; @@ -27,14 +28,21 @@ import java.util.Map; import java.util.Map.Entry; +import android.util.Log; import android.view.*; - +import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.server.HttpConfiguration; -import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.SecureRequestCustomizer; +import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.SslConnectionFactory; +import org.eclipse.jetty.server.handler.AllowSymLinkAliasChecker; +import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.HandlerList; +import org.eclipse.jetty.server.handler.ResourceHandler; +import org.eclipse.jetty.util.ssl.SslContextFactory; import org.sensorhub.android.comm.BluetoothCommProvider; import org.sensorhub.android.comm.BluetoothCommProviderConfig; import org.sensorhub.android.comm.ble.BleConfig; @@ -45,16 +53,28 @@ import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleEvent; import org.sensorhub.api.sensor.ISensorDataInterface; +import org.sensorhub.api.sensor.ISensorModule; import org.sensorhub.api.sensor.SensorConfig; +import org.sensorhub.impl.SensorHub; import org.sensorhub.impl.client.sost.SOSTClient; import org.sensorhub.impl.client.sost.SOSTClient.StreamInfo; import org.sensorhub.impl.client.sost.SOSTClientConfig; import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; import org.sensorhub.impl.module.InMemoryConfigDb; +import org.sensorhub.impl.module.ModuleRegistry; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; +import org.sensorhub.impl.service.sos.ISOSDataProviderFactory; +import org.sensorhub.impl.service.sos.SOSProviderConfig; +import org.sensorhub.impl.service.sos.SOSService; +import org.sensorhub.impl.service.sos.SOSServiceConfig; +import org.sensorhub.impl.service.sos.SOSServlet; +import org.sensorhub.impl.service.sos.SensorDataProvider; +import org.sensorhub.impl.service.sos.SensorDataProviderConfig; import org.sensorhub.test.sensor.trupulse.SimulatedDataStream; +import org.sensorhub.impl.service.HttpServerConfig; +import org.sensorhub.impl.service.HttpServer; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; @@ -73,7 +93,7 @@ import android.text.Html; import android.widget.EditText; import android.widget.TextView; - +import org.vast.util.Asserts; public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener { @@ -88,9 +108,6 @@ public class MainActivity extends Activity implements TextureView.SurfaceTexture URL sosUrl = null; boolean showVideo; - Server server; - - private ServiceConnection sConn = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) @@ -109,26 +126,18 @@ protected void updateConfig(SharedPreferences prefs, String runName) { sensorhubConfig = new InMemoryConfigDb(); - try { - server = new Server(); - ServerConnector http = null; - ServerConnector https = null; - HandlerList handlers = new HandlerList(); - - HttpConfiguration httpConfig = new HttpConfiguration(); - httpConfig.setSecureScheme("https"); - httpConfig.setSecurePort(3443); // TODO: Change me to non-fixed port - - http = new ServerConnector(server, - new HttpConnectionFactory(httpConfig)); - http.setPort(3080); // TODO: Change me to non-fixed port - http.setIdleTimeout(300000); - - server.addConnector(http); - server.start(); - } catch (Exception e) { - e.printStackTrace(); - } + /** + * TODO: Test this first + * TODO: Test if one phone can connect to another via SOS-T + */ + + // Sensorhub HTTP Server Config + HttpServerConfig serverConfig = new HttpServerConfig(); + sensorhubConfig.add(serverConfig); + + // SOS Config + SOSServiceConfig sosConfig = new SOSServiceConfig(); + sosConfig.enableTransactional = true; // get SOS URL from config String sosUriConfig = prefs.getString("sos_uri", ""); @@ -174,6 +183,12 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(sensorsConfig); addSosTConfig(sensorsConfig, sosUser, sosPwd); + /** + * I want sensor data provider config + * then I want to give sensor ID and ID of storage. only sensor for now + * + */ + // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); if (enabled) @@ -192,6 +207,13 @@ protected void updateConfig(SharedPreferences prefs, String runName) trupulseConfig.commSettings = btConf; sensorhubConfig.add(trupulseConfig); addSosTConfig(trupulseConfig, sosUser, sosPwd); + + /* + SensorDataProviderConfig truPulseDataProviderConfig = new SensorDataProviderConfig(); + truPulseDataProviderConfig.sensorID = trupulseConfig.id; + truPulseDataProviderConfig.enabled = true; + sosConfig.dataProviders.add(truPulseDataProviderConfig); + */ } // AngelSensor @@ -231,6 +253,8 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(flironeConfig); addSosTConfig(flironeConfig, sosUser, sosPwd); } + + sensorhubConfig.add(sosConfig); } @@ -445,7 +469,7 @@ protected void stopRefreshingStatus() displayCallback = null; } } - + protected synchronized void displayStatus() { From ce7c4f0115f83dd4bd9c1bddd891ff3f69050cb5 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 15 Jan 2019 14:25:45 -0600 Subject: [PATCH 005/207] wip --- sensorhub-android-app/res/values/strings.xml | 13 +- .../res/xml/pref_sensors.xml | 125 ++++++++++++++++-- 2 files changed, 125 insertions(+), 13 deletions(-) diff --git a/sensorhub-android-app/res/values/strings.xml b/sensorhub-android-app/res/values/strings.xml index 78cf09cc..95d25b4e 100644 --- a/sensorhub-android-app/res/values/strings.xml +++ b/sensorhub-android-app/res/values/strings.xml @@ -6,9 +6,20 @@ Start SensorHub Stop SensorHub About - + JPEG H264 + + + SOS + No + + + + 1 + 0 + + diff --git a/sensorhub-android-app/res/xml/pref_sensors.xml b/sensorhub-android-app/res/xml/pref_sensors.xml index af85dd9b..b3b25136 100644 --- a/sensorhub-android-app/res/xml/pref_sensors.xml +++ b/sensorhub-android-app/res/xml/pref_sensors.xml @@ -1,53 +1,114 @@ + - + + + - + + + + + + + + + - + + + + + + + + + - + + + + + + + + + - + + + + + + + + + - + + + + + + + + + - + + + - + + + - + + + - + + + - + + + - + + + From 8745ab9c612b35e0acdc678e97595c48daaf010c Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 15 Jan 2019 18:04:45 -0600 Subject: [PATCH 006/207] implement sensorhub http server and sos service --- .../src/org/sensorhub/android/MainActivity.java | 16 ++++++---------- sensorhub-android-lib/build.gradle | 4 ++-- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 0a8ebb28..e232ce04 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -127,16 +127,16 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig = new InMemoryConfigDb(); /** - * TODO: Test this first * TODO: Test if one phone can connect to another via SOS-T */ - // Sensorhub HTTP Server Config HttpServerConfig serverConfig = new HttpServerConfig(); + serverConfig.autoStart = true; sensorhubConfig.add(serverConfig); // SOS Config SOSServiceConfig sosConfig = new SOSServiceConfig(); + sosConfig.autoStart = true; sosConfig.enableTransactional = true; // get SOS URL from config @@ -183,12 +183,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(sensorsConfig); addSosTConfig(sensorsConfig, sosUser, sosPwd); - /** - * I want sensor data provider config - * then I want to give sensor ID and ID of storage. only sensor for now - * - */ - // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); if (enabled) @@ -208,12 +202,14 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(trupulseConfig); addSosTConfig(trupulseConfig, sosUser, sosPwd); - /* + /** + * I want sensor data provider config + * then I want to give sensor ID and ID of storage. only sensor for now + */ SensorDataProviderConfig truPulseDataProviderConfig = new SensorDataProviderConfig(); truPulseDataProviderConfig.sensorID = trupulseConfig.id; truPulseDataProviderConfig.enabled = true; sosConfig.dataProviders.add(truPulseDataProviderConfig); - */ } // AngelSensor diff --git a/sensorhub-android-lib/build.gradle b/sensorhub-android-lib/build.gradle index 11cae075..2815927c 100644 --- a/sensorhub-android-lib/build.gradle +++ b/sensorhub-android-lib/build.gradle @@ -25,9 +25,9 @@ configurations { compile { // exclude stuff from APK exclude group: "javax.xml.stream" - exclude group: "javax.servlet" + //exclude group: "javax.servlet" exclude group: "xml-apis" - exclude group: "org.eclipse.jetty" + //exclude group: "org.eclipse.jetty" exclude group: "org.n52.amused" exclude group: "ch.qos.logback" exclude group: "org.apache.felix" From 9f644d3cea28191ac8d8548313406da6989a871e Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Wed, 23 Jan 2019 09:36:46 -0600 Subject: [PATCH 007/207] add h2 support --- sensorhub-android-lib/build.gradle | 1 + settings.gradle | 1 + 2 files changed, 2 insertions(+) diff --git a/sensorhub-android-lib/build.gradle b/sensorhub-android-lib/build.gradle index 2815927c..273b5a7c 100644 --- a/sensorhub-android-lib/build.gradle +++ b/sensorhub-android-lib/build.gradle @@ -10,6 +10,7 @@ dependencies { //compile 'org.sensorhub:sensorhub-driver-trupulse:[0.1,2.0)' //compile 'org.sensorhub:sensorhub-driver-angelsensor:[0.1,2.0)' api project(':sensorhub-core') + api project(':sensorhub-storage-h2') api project(':sensorhub-service-swe') api project(':sensorhub-comm-ble') api project(':sensorhub-driver-trupulse') diff --git a/settings.gradle b/settings.gradle index 35ef9dd1..95fca99a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,6 +4,7 @@ def oshMainDir = "$rootDir/.." // include builds from other repos def repos = [ 'osh-core':['lib-swe-common', 'lib-sensorml', 'lib-ows', 'sensorhub-core', 'sensorhub-service-swe', 'sensorhub-storage-perst'], + 'osh-persistence':['sensorhub-storage-h2'], 'osh-comm':['sensorhub-comm-ble'], 'osh-sensors':['sensorhub-driver-angelsensor'], 'osh-video':['sensorhub-driver-videocam'], From 65ad7a4422f2a615fa22e6da5663e1a428241b54 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Wed, 23 Jan 2019 09:37:29 -0600 Subject: [PATCH 008/207] wip for adding video --- sensorhub-android-lib/build.gradle | 1 + settings.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sensorhub-android-lib/build.gradle b/sensorhub-android-lib/build.gradle index 273b5a7c..19680f3e 100644 --- a/sensorhub-android-lib/build.gradle +++ b/sensorhub-android-lib/build.gradle @@ -12,6 +12,7 @@ dependencies { api project(':sensorhub-core') api project(':sensorhub-storage-h2') api project(':sensorhub-service-swe') + api project(':sensorhub-service-video') api project(':sensorhub-comm-ble') api project(':sensorhub-driver-trupulse') api project(':sensorhub-driver-angelsensor') diff --git a/settings.gradle b/settings.gradle index 95fca99a..04839ccd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,7 +7,7 @@ def repos = [ 'osh-persistence':['sensorhub-storage-h2'], 'osh-comm':['sensorhub-comm-ble'], 'osh-sensors':['sensorhub-driver-angelsensor'], - 'osh-video':['sensorhub-driver-videocam'], + 'osh-video':['sensorhub-driver-videocam', 'sensorhub-service-video'], 'osh-positioning':['sensorhub-driver-trupulse'], 'osh-processing':['sensorhub-process-vecmath', 'sensorhub-process-geoloc']] From dd981837f721140a2b6fb80c3c7c03c53f2a419b Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 28 Jan 2019 08:06:37 -0600 Subject: [PATCH 009/207] alex defaulted quat orientation --- sensorhub-android-app/res/xml/pref_sensors.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/sensorhub-android-app/res/xml/pref_sensors.xml b/sensorhub-android-app/res/xml/pref_sensors.xml index b3b25136..c81d64d3 100644 --- a/sensorhub-android-app/res/xml/pref_sensors.xml +++ b/sensorhub-android-app/res/xml/pref_sensors.xml @@ -2,8 +2,6 @@ Date: Tue, 29 Jan 2019 04:55:41 -0600 Subject: [PATCH 010/207] remove old SOS options from settings --- .../res/xml/pref_sensors.xml | 97 ------------------- 1 file changed, 97 deletions(-) diff --git a/sensorhub-android-app/res/xml/pref_sensors.xml b/sensorhub-android-app/res/xml/pref_sensors.xml index c81d64d3..dd3f5caa 100644 --- a/sensorhub-android-app/res/xml/pref_sensors.xml +++ b/sensorhub-android-app/res/xml/pref_sensors.xml @@ -9,98 +9,42 @@ android:summary="Enable streaming of accelerometer data" android:title="Accelerometer Data" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 151be070eb1314372ccb1e6f5df8e9eb28a36498 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 29 Jan 2019 05:12:41 -0600 Subject: [PATCH 011/207] test new settings ui --- sensorhub-android-app/AndroidManifest.xml | 9 +- .../res/layout/activity_settings.xml | 20 ++++ .../res/layout/settings_group.xml | 14 +++ .../res/layout/settings_item.xml | 13 +++ sensorhub-android-app/res/menu/main.xml | 8 +- sensorhub-android-app/res/values/strings.xml | 15 +-- .../org/sensorhub/android/MainActivity.java | 4 + .../sensorhub/android/SettingsActivity.java | 72 +++++++++++++ .../SettingsExpandableListAdapter.java | 102 ++++++++++++++++++ 9 files changed, 243 insertions(+), 14 deletions(-) create mode 100644 sensorhub-android-app/res/layout/activity_settings.xml create mode 100644 sensorhub-android-app/res/layout/settings_group.xml create mode 100644 sensorhub-android-app/res/layout/settings_item.xml create mode 100644 sensorhub-android-app/src/org/sensorhub/android/SettingsActivity.java create mode 100644 sensorhub-android-app/src/org/sensorhub/android/SettingsExpandableListAdapter.java diff --git a/sensorhub-android-app/AndroidManifest.xml b/sensorhub-android-app/AndroidManifest.xml index 1ddef0e1..04b9ae07 100644 --- a/sensorhub-android-app/AndroidManifest.xml +++ b/sensorhub-android-app/AndroidManifest.xml @@ -18,7 +18,10 @@ android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" - android:theme="@style/AppTheme" > + android:theme="@style/AppTheme"> + - + android:label="@string/title_activity_user_settings"> + diff --git a/sensorhub-android-app/res/layout/activity_settings.xml b/sensorhub-android-app/res/layout/activity_settings.xml new file mode 100644 index 00000000..05c9065f --- /dev/null +++ b/sensorhub-android-app/res/layout/activity_settings.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/sensorhub-android-app/res/layout/settings_group.xml b/sensorhub-android-app/res/layout/settings_group.xml new file mode 100644 index 00000000..ed309d64 --- /dev/null +++ b/sensorhub-android-app/res/layout/settings_group.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/sensorhub-android-app/res/layout/settings_item.xml b/sensorhub-android-app/res/layout/settings_item.xml new file mode 100644 index 00000000..b11e077c --- /dev/null +++ b/sensorhub-android-app/res/layout/settings_item.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/sensorhub-android-app/res/menu/main.xml b/sensorhub-android-app/res/menu/main.xml index 066b90d2..ed89f0eb 100644 --- a/sensorhub-android-app/res/menu/main.xml +++ b/sensorhub-android-app/res/menu/main.xml @@ -7,7 +7,13 @@ android:orderInCategory="100" android:showAsAction="never" android:title="@string/action_settings"/> - + + + SensorHubConnect Please configure and start SensorHub using the Options Menu Settings + Testing Start SensorHub Stop SensorHub About - JPEG H264 - - SOS - No + Real-time + Archive + Push - - - 1 - 0 - - + Settings diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index e232ce04..d9d298c5 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -318,6 +318,10 @@ public boolean onOptionsItemSelected(MenuItem item) startActivity(new Intent(this, UserSettingsActivity.class)); return true; } + else if (id == R.id.action_test) { + startActivity(new Intent(this, SettingsActivity.class)); + return true; + } else if (id == R.id.action_start) { if (boundService != null && boundService.getSensorHub() == null) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SettingsActivity.java b/sensorhub-android-app/src/org/sensorhub/android/SettingsActivity.java new file mode 100644 index 00000000..b176e45f --- /dev/null +++ b/sensorhub-android-app/src/org/sensorhub/android/SettingsActivity.java @@ -0,0 +1,72 @@ +package org.sensorhub.android; + +import android.content.Intent; +import android.os.Bundle; +import android.app.Activity; +import android.view.View; +import android.widget.ExpandableListAdapter; +import android.widget.ExpandableListView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class SettingsActivity extends Activity { + + ExpandableListView expandableListView; + ExpandableListAdapter expandableListAdapter; + List expandableListTitle; + HashMap> expandableListDetail; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + Intent intent = getIntent(); + + expandableListView = (ExpandableListView) findViewById(R.id.settingsListView); + expandableListDetail = getSettings(); + expandableListTitle = new ArrayList(expandableListDetail.keySet()); + expandableListAdapter = new SettingsExpandableListAdapter(this, expandableListTitle, expandableListDetail); + expandableListView.setAdapter(expandableListAdapter); + expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { + @Override + public void onGroupExpand(int groupPosition) { + } + }); + expandableListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() { + @Override + public void onGroupCollapse(int groupPosition) { + } + }); + expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { + @Override + public boolean onChildClick(ExpandableListView expandableListView, View view, + int groupPosition, int childPosition, long id) { + return false; + } + }); + } + + private HashMap> getSettings() { + HashMap> expandableListDetail = new HashMap>(); + + List generalSettings = new ArrayList(); + generalSettings.add("Device Name"); + generalSettings.add("SOS Endpoint URL"); + generalSettings.add("SOS Username"); + generalSettings.add("SOS Password"); + + List football = new ArrayList(); + football.add("Brazil"); + football.add("Spain"); + football.add("Germany"); + football.add("Netherlands"); + football.add("Italy"); + + expandableListDetail.put("General", generalSettings); + expandableListDetail.put("Sensors", football); + + return expandableListDetail; + } +} diff --git a/sensorhub-android-app/src/org/sensorhub/android/SettingsExpandableListAdapter.java b/sensorhub-android-app/src/org/sensorhub/android/SettingsExpandableListAdapter.java new file mode 100644 index 00000000..6f710d16 --- /dev/null +++ b/sensorhub-android-app/src/org/sensorhub/android/SettingsExpandableListAdapter.java @@ -0,0 +1,102 @@ +package org.sensorhub.android; + +import android.content.Context; +import android.graphics.Typeface; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseExpandableListAdapter; +import android.widget.TextView; + +import java.util.HashMap; +import java.util.List; + +public class SettingsExpandableListAdapter extends BaseExpandableListAdapter { + private Context context; + private List expandableListTitle; + private HashMap> expandableListDetail; + + public SettingsExpandableListAdapter( + Context context, List expandableListTitle, + HashMap> expandableListDetail + ) { + this.context = context; + this.expandableListTitle = expandableListTitle; + this.expandableListDetail = expandableListDetail; + } + + @Override + public Object getChild(int listPosition, int expandedListPosition) { + return this.expandableListDetail + .get(this.expandableListTitle.get(listPosition)) + .get(expandedListPosition); + } + + @Override + public long getChildId(int listPosition, int expandedListPosition) { + return expandedListPosition; + } + + @Override + public View getChildView(int listPosition, final int expandedListPosition, + boolean isLastChild, View view, ViewGroup viewGroup) { + final String expandedListText = (String) getChild(listPosition, expandedListPosition); + if (view == null) { + LayoutInflater layoutInflater = (LayoutInflater) this.context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = layoutInflater.inflate(R.layout.settings_item, null); + } + + TextView expandedListTextView = (TextView) view.findViewById(R.id.expandedListItem); + expandedListTextView.setText(expandedListText); + + return view; + } + + @Override + public int getChildrenCount(int listPosition) { + return this.expandableListDetail.get(this.expandableListTitle.get(listPosition)).size(); + } + + @Override + public Object getGroup(int listPosition) { + return this.expandableListTitle.get(listPosition); + } + + @Override + public int getGroupCount() { + return this.expandableListTitle.size(); + } + + @Override + public long getGroupId(int listPosition) { + return listPosition; + } + + @Override + public View getGroupView(int listPosition, boolean isExpanded, + View view, ViewGroup viewGroup) { + final String listTitle = (String) getGroup(listPosition); + if (view == null) { + LayoutInflater layoutInflater = (LayoutInflater) this.context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = layoutInflater.inflate(R.layout.settings_group, null); + } + + TextView listTitleTextView = (TextView) view.findViewById(R.id.listTitle); + listTitleTextView.setTypeface(null, Typeface.BOLD); + listTitleTextView.setText(listTitle); + + return view; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public boolean isChildSelectable(int listPosition, int expandedListPosition) { + return true; + } +} From caeeb2c4f98aec4f48c84be450216a11b4f8d88f Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 29 Jan 2019 05:14:18 -0600 Subject: [PATCH 012/207] wip refactoring configs for sensorhubconfig --- .../org/sensorhub/android/MainActivity.java | 112 +++++++++++------- 1 file changed, 66 insertions(+), 46 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index d9d298c5..a7d75026 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -18,7 +18,7 @@ import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; -import java.io.File; +import java.io.FileOutputStream; import java.net.MalformedURLException; import java.net.URL; import java.text.SimpleDateFormat; @@ -31,50 +31,34 @@ import android.util.Log; import android.view.*; -import org.eclipse.jetty.http.HttpVersion; -import org.eclipse.jetty.server.HttpConfiguration; -import org.eclipse.jetty.server.HttpConnectionFactory; -import org.eclipse.jetty.server.SecureRequestCustomizer; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.SslConnectionFactory; -import org.eclipse.jetty.server.handler.AllowSymLinkAliasChecker; -import org.eclipse.jetty.server.handler.ContextHandler; -import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.server.handler.ResourceHandler; -import org.eclipse.jetty.util.ssl.SslContextFactory; import org.sensorhub.android.comm.BluetoothCommProvider; import org.sensorhub.android.comm.BluetoothCommProviderConfig; import org.sensorhub.android.comm.ble.BleConfig; import org.sensorhub.android.comm.ble.BleNetwork; import org.sensorhub.api.common.Event; import org.sensorhub.api.common.IEventListener; -import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleEvent; import org.sensorhub.api.sensor.ISensorDataInterface; -import org.sensorhub.api.sensor.ISensorModule; import org.sensorhub.api.sensor.SensorConfig; -import org.sensorhub.impl.SensorHub; import org.sensorhub.impl.client.sost.SOSTClient; import org.sensorhub.impl.client.sost.SOSTClient.StreamInfo; import org.sensorhub.impl.client.sost.SOSTClientConfig; import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; import org.sensorhub.impl.module.InMemoryConfigDb; -import org.sensorhub.impl.module.ModuleRegistry; +import org.sensorhub.impl.persistence.StreamStorageConfig; +import org.sensorhub.impl.persistence.h2.MVStorageConfig; +import org.sensorhub.impl.persistence.perst.BasicStorageConfig; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; -import org.sensorhub.impl.service.sos.ISOSDataProviderFactory; -import org.sensorhub.impl.service.sos.SOSProviderConfig; -import org.sensorhub.impl.service.sos.SOSService; +import org.sensorhub.impl.service.sos.SOSCustomFormatConfig; import org.sensorhub.impl.service.sos.SOSServiceConfig; -import org.sensorhub.impl.service.sos.SOSServlet; -import org.sensorhub.impl.service.sos.SensorDataProvider; import org.sensorhub.impl.service.sos.SensorDataProviderConfig; +import org.sensorhub.impl.service.sos.video.MP4Serializer; +import org.sensorhub.impl.service.sos.video.MJPEGSerializer; import org.sensorhub.test.sensor.trupulse.SimulatedDataStream; import org.sensorhub.impl.service.HttpServerConfig; -import org.sensorhub.impl.service.HttpServer; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; @@ -92,8 +76,8 @@ import android.provider.Settings.Secure; import android.text.Html; import android.widget.EditText; +import android.widget.ExpandableListView; import android.widget.TextView; -import org.vast.util.Asserts; public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener { @@ -124,20 +108,11 @@ public void onServiceDisconnected(ComponentName className) protected void updateConfig(SharedPreferences prefs, String runName) { - sensorhubConfig = new InMemoryConfigDb(); - /** - * TODO: Test if one phone can connect to another via SOS-T + * TODO: H2 in sensorhubconfig + * TODO: Test video from phone1 to phone2. Get video on web browser from phone2 (perf) */ - // Sensorhub HTTP Server Config - HttpServerConfig serverConfig = new HttpServerConfig(); - serverConfig.autoStart = true; - sensorhubConfig.add(serverConfig); - - // SOS Config - SOSServiceConfig sosConfig = new SOSServiceConfig(); - sosConfig.autoStart = true; - sosConfig.enableTransactional = true; + sensorhubConfig = new InMemoryConfigDb(); // get SOS URL from config String sosUriConfig = prefs.getString("sos_uri", ""); @@ -161,11 +136,36 @@ protected void updateConfig(SharedPreferences prefs, String runName) if (deviceName == null || deviceName.length() < 2) deviceName = deviceID; - // Android sensors + // HTTP Server Config + HttpServerConfig serverConfig = new HttpServerConfig(); + serverConfig.autoStart = true; + sensorhubConfig.add(serverConfig); + + // SOS Config + SOSServiceConfig sosConfig = new SOSServiceConfig(); + sosConfig.autoStart = true; + sosConfig.enableTransactional = true; + sosConfig.customFormats.add(new SOSCustomFormatConfig("video/mp4", "org.sensorhub.impl.service.sos.video.MP4Serializer")); + sosConfig.customFormats.add(new SOSCustomFormatConfig("video/x-motion-jpeg", "org.sensorhub.impl.service.sos.video.MJPEGSerializer")); + + // Storage Config + MVStorageConfig storageConfig = new MVStorageConfig(); + storageConfig.autoStart = true; + storageConfig.storagePath = getFilesDir().getAbsolutePath() + + "/oshAndroid_h2.dat"; + Log.d("MAIN_ACTIVITY", storageConfig.storagePath); + /* + TODO: Fix this... + sosConfig.newStorageConfig = storageConfig; + */ + + // Sensors Config AndroidSensorsConfig sensorsConfig = new AndroidSensorsConfig(); sensorsConfig.name = "Android Sensors [" + deviceName + "]"; sensorsConfig.id = "ANDROID_SENSORS"; sensorsConfig.autoStart = true; + + // (Simple) Sensors sensorsConfig.activateAccelerometer = prefs.getBoolean("accel_enabled", false); sensorsConfig.activateGyrometer = prefs.getBoolean("gyro_enabled", false); sensorsConfig.activateMagnetometer = prefs.getBoolean("mag_enabled", false); @@ -174,8 +174,9 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorsConfig.activateGpsLocation = prefs.getBoolean("gps_enabled", false); sensorsConfig.activateNetworkLocation = prefs.getBoolean("netloc_enabled", false); sensorsConfig.activateBackCamera = prefs.getBoolean("cam_enabled", false); - if (sensorsConfig.activateBackCamera || sensorsConfig.activateFrontCamera) + if (sensorsConfig.activateBackCamera || sensorsConfig.activateFrontCamera) { showVideo = true; + } sensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); sensorsConfig.androidContext = this.getApplicationContext(); sensorsConfig.camPreviewTexture = boundService.getVideoTexture(); @@ -183,6 +184,27 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(sensorsConfig); addSosTConfig(sensorsConfig, sosUser, sosPwd); + // Android Data Provider + SensorDataProviderConfig androidDataProviderConfig = new SensorDataProviderConfig(); + androidDataProviderConfig.sensorID = sensorsConfig.id; + androidDataProviderConfig.offeringID = sensorsConfig.id+"-sos"; + androidDataProviderConfig.enabled = true; + /* + TODO: Fix this... + sosConfig.dataProviders.add(androidDataProviderConfig); + */ + + // Android Stream Storage + StreamStorageConfig androidStreamStorageConfig = new StreamStorageConfig(); + androidStreamStorageConfig.name = "Android Sensor Storage"; + androidStreamStorageConfig.autoStart = true; + androidStreamStorageConfig.storageConfig = storageConfig; + androidStreamStorageConfig.dataSourceID = androidDataProviderConfig.sensorID; + /* + TODO: Fix this... + sensorhubConfig.add(androidStreamStorageConfig); + */ + // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); if (enabled) @@ -202,14 +224,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(trupulseConfig); addSosTConfig(trupulseConfig, sosUser, sosPwd); - /** - * I want sensor data provider config - * then I want to give sensor ID and ID of storage. only sensor for now - */ - SensorDataProviderConfig truPulseDataProviderConfig = new SensorDataProviderConfig(); - truPulseDataProviderConfig.sensorID = trupulseConfig.id; - truPulseDataProviderConfig.enabled = true; - sosConfig.dataProviders.add(truPulseDataProviderConfig); + // TODO: Add TruPulse to SOS Config } // AngelSensor @@ -233,6 +248,8 @@ protected void updateConfig(SharedPreferences prefs, String runName) angelConfig.btAddress = prefs.getString("angel_address", null); sensorhubConfig.add(angelConfig); addSosTConfig(angelConfig, sosUser, sosPwd); + + // TODO: Add Angel to SOS Config } // FLIR One sensor @@ -248,8 +265,11 @@ protected void updateConfig(SharedPreferences prefs, String runName) showVideo = true; sensorhubConfig.add(flironeConfig); addSosTConfig(flironeConfig, sosUser, sosPwd); + + // TODO: Add FLIR One to SOS Config } + Log.d("MAIN_ACTIVITY", sosConfig.toString()); sensorhubConfig.add(sosConfig); } From ed8162a186405dfb2775d9ca143c99dacd7dca29 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 29 Jan 2019 06:27:56 -0600 Subject: [PATCH 013/207] wip storage --- .../org/sensorhub/android/MainActivity.java | 71 +++++++++++++++---- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 2280e0a8..555cef5e 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -48,13 +48,17 @@ import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; import org.sensorhub.impl.module.InMemoryConfigDb; import org.sensorhub.impl.persistence.StreamStorageConfig; +import org.sensorhub.impl.persistence.h2.MVMultiStorageImpl; +import org.sensorhub.impl.persistence.h2.MVObsStorageImpl; import org.sensorhub.impl.persistence.h2.MVStorageConfig; import org.sensorhub.impl.persistence.perst.BasicStorageConfig; +import org.sensorhub.impl.persistence.perst.BasicStorageImpl; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; import org.sensorhub.impl.service.sos.SOSCustomFormatConfig; import org.sensorhub.impl.service.sos.SOSServiceConfig; +import org.sensorhub.impl.service.sos.SensorConsumerConfig; import org.sensorhub.impl.service.sos.SensorDataProviderConfig; import org.sensorhub.impl.service.sos.video.MP4Serializer; import org.sensorhub.impl.service.sos.video.MJPEGSerializer; @@ -111,7 +115,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) { /** * TODO: H2 in sensorhubconfig - * TODO: Test video from phone1 to phone2. Get video on web browser from phone2 (perf) */ sensorhubConfig = new InMemoryConfigDb(); @@ -146,19 +149,23 @@ protected void updateConfig(SharedPreferences prefs, String runName) SOSServiceConfig sosConfig = new SOSServiceConfig(); sosConfig.autoStart = true; sosConfig.enableTransactional = true; - sosConfig.customFormats.add(new SOSCustomFormatConfig("video/mp4", "org.sensorhub.impl.service.sos.video.MP4Serializer")); - sosConfig.customFormats.add(new SOSCustomFormatConfig("video/x-motion-jpeg", "org.sensorhub.impl.service.sos.video.MJPEGSerializer")); // Storage Config + /* + FIXME: Which StorageImpl class use for moduleClass? + Example from working config: + BasicStorageConfig storageConfig = new BasicStorageConfig(); + storageConfig.moduleClass = BasicStorageImpl.class.getCanonicalName(); + */ MVStorageConfig storageConfig = new MVStorageConfig(); storageConfig.autoStart = true; + storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); + //storageConfig.moduleClass = MVObsStorageImpl.class.getCanonicalName(); storageConfig.storagePath = getFilesDir().getAbsolutePath() + "/oshAndroid_h2.dat"; - Log.d("MAIN_ACTIVITY", storageConfig.storagePath); - /* - TODO: Fix this... sosConfig.newStorageConfig = storageConfig; - */ + Log.d("MAIN_ACTIVITY", storageConfig.storagePath); + Log.d("MAIN_ACTIVITY", String.valueOf(getFilesDir().canWrite())); // Sensors Config AndroidSensorsConfig sensorsConfig = new AndroidSensorsConfig(); @@ -186,13 +193,30 @@ protected void updateConfig(SharedPreferences prefs, String runName) addSosTConfig(sensorsConfig, sosUser, sosPwd); // Android Data Provider + /* + FIXME: How to get procedure after it is added to as data provider? + Adding android via SOS-T properly adds to hub, but this programatic route doesn't work... + */ SensorDataProviderConfig androidDataProviderConfig = new SensorDataProviderConfig(); androidDataProviderConfig.sensorID = sensorsConfig.id; androidDataProviderConfig.offeringID = sensorsConfig.id+"-sos"; + // TODO: Add hidden inputs list based off pref/settings logic + androidDataProviderConfig.liveDataTimeout = 600.0; + androidDataProviderConfig.maxFois = 10; androidDataProviderConfig.enabled = true; - /* - TODO: Fix this... sosConfig.dataProviders.add(androidDataProviderConfig); + + // Android Data Consumer + /* + FIXME: How to get procedure after it is added to as data provider? + Adding android via SOS-T properly adds to hub, but this programatic route doesn't work... + */ + /* TODO: Check to see if I need to implement data consumer. It's from android working using SOS-T + SensorConsumerConfig androidDataConsumerConfig = new SensorConsumerConfig(); + androidDataConsumerConfig.sensorID = sensorsConfig.id; + androidDataConsumerConfig.offeringID = sensorsConfig.id+"-sos"; + androidDataConsumerConfig.enabled = true; + sosConfig.dataConsumers.add(androidDataConsumerConfig); */ // Android Stream Storage @@ -200,11 +224,8 @@ protected void updateConfig(SharedPreferences prefs, String runName) androidStreamStorageConfig.name = "Android Sensor Storage"; androidStreamStorageConfig.autoStart = true; androidStreamStorageConfig.storageConfig = storageConfig; - androidStreamStorageConfig.dataSourceID = androidDataProviderConfig.sensorID; - /* - TODO: Fix this... + androidStreamStorageConfig.dataSourceID = sensorsConfig.id; sensorhubConfig.add(androidStreamStorageConfig); - */ // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); @@ -225,7 +246,13 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(trupulseConfig); addSosTConfig(trupulseConfig, sosUser, sosPwd); + // TODO: Add TruPulse to SOS Config + SensorDataProviderConfig trupulseDataProviderConfig = new SensorDataProviderConfig(); + trupulseDataProviderConfig.sensorID = trupulseConfig.id; + trupulseDataProviderConfig.offeringID = trupulseConfig.id+"-sos"; + trupulseDataProviderConfig.enabled = true; + sosConfig.dataProviders.add(trupulseDataProviderConfig); } // AngelSensor @@ -251,6 +278,11 @@ protected void updateConfig(SharedPreferences prefs, String runName) addSosTConfig(angelConfig, sosUser, sosPwd); // TODO: Add Angel to SOS Config + SensorDataProviderConfig angelDataProviderConfig = new SensorDataProviderConfig(); + angelDataProviderConfig.sensorID = angelConfig.id; + angelDataProviderConfig.offeringID = angelConfig.id+"-sos"; + angelDataProviderConfig.enabled = true; + sosConfig.dataProviders.add(angelDataProviderConfig); } // FLIR One sensor @@ -268,6 +300,11 @@ protected void updateConfig(SharedPreferences prefs, String runName) addSosTConfig(flironeConfig, sosUser, sosPwd); // TODO: Add FLIR One to SOS Config + SensorDataProviderConfig flironeDataProviderConfig = new SensorDataProviderConfig(); + flironeDataProviderConfig.sensorID = flironeConfig.id; + flironeDataProviderConfig.offeringID = flironeConfig.id+"-sos"; + flironeDataProviderConfig.enabled = true; + sosConfig.dataProviders.add(flironeDataProviderConfig); } // DJI Drone @@ -284,12 +321,16 @@ protected void updateConfig(SharedPreferences prefs, String runName) showVideo = true; sensorhubConfig.add(djiConfig); addSosTConfig(djiConfig, sosUser, sosPwd); + + SensorDataProviderConfig djiDataProviderConfig = new SensorDataProviderConfig(); + djiDataConsumerConfig.sensorID = djiConfig.id; + djiDataConsumerConfig.offeringID = djiConfig.id+"-sos"; + djiDataConsumerConfig.enabled = true; + sosConfig.dataConsumers.add(djiDataConsumerConfig); } */ - Log.d("MAIN_ACTIVITY", sosConfig.toString()); sensorhubConfig.add(sosConfig); - } From c1740693605e75fd529ba6641be5e5fd77c84f28 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 29 Jan 2019 06:36:50 -0600 Subject: [PATCH 014/207] wip storage not working --- .../src/org/sensorhub/android/MainActivity.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 555cef5e..f4ccf468 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -159,11 +159,11 @@ protected void updateConfig(SharedPreferences prefs, String runName) */ MVStorageConfig storageConfig = new MVStorageConfig(); storageConfig.autoStart = true; - storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); - //storageConfig.moduleClass = MVObsStorageImpl.class.getCanonicalName(); +// storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); + storageConfig.moduleClass = MVObsStorageImpl.class.getCanonicalName(); storageConfig.storagePath = getFilesDir().getAbsolutePath() + "/oshAndroid_h2.dat"; - sosConfig.newStorageConfig = storageConfig; +// sosConfig.newStorageConfig = storageConfig; Log.d("MAIN_ACTIVITY", storageConfig.storagePath); Log.d("MAIN_ACTIVITY", String.valueOf(getFilesDir().canWrite())); @@ -204,7 +204,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) androidDataProviderConfig.liveDataTimeout = 600.0; androidDataProviderConfig.maxFois = 10; androidDataProviderConfig.enabled = true; - sosConfig.dataProviders.add(androidDataProviderConfig); +// sosConfig.dataProviders.add(androidDataProviderConfig); // Android Data Consumer /* @@ -225,7 +225,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) androidStreamStorageConfig.autoStart = true; androidStreamStorageConfig.storageConfig = storageConfig; androidStreamStorageConfig.dataSourceID = sensorsConfig.id; - sensorhubConfig.add(androidStreamStorageConfig); +// sensorhubConfig.add(androidStreamStorageConfig); // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); From e870748b032a95f86aaf18fb6e4641a5157bfe3f Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 29 Jan 2019 06:38:02 -0600 Subject: [PATCH 015/207] fix typo in comment --- .../src/org/sensorhub/android/MainActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index f4ccf468..c9dc6ea6 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -195,7 +195,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) // Android Data Provider /* FIXME: How to get procedure after it is added to as data provider? - Adding android via SOS-T properly adds to hub, but this programatic route doesn't work... + Adding android via SOS-T properly adds to hub, but this programmatic way doesn't work... */ SensorDataProviderConfig androidDataProviderConfig = new SensorDataProviderConfig(); androidDataProviderConfig.sensorID = sensorsConfig.id; @@ -209,7 +209,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) // Android Data Consumer /* FIXME: How to get procedure after it is added to as data provider? - Adding android via SOS-T properly adds to hub, but this programatic route doesn't work... + Adding android via SOS-T properly adds to hub, but this programmatic route doesn't work... */ /* TODO: Check to see if I need to implement data consumer. It's from android working using SOS-T SensorConsumerConfig androidDataConsumerConfig = new SensorConsumerConfig(); From f874b4043b6a69dbbb825002a95735fd7cb13b56 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 29 Jan 2019 10:14:23 -0600 Subject: [PATCH 016/207] wip; post weekly tagup --- build.gradle | 2 + sensorhub-android-app/AndroidManifest.xml | 15 ++- .../res/layout/activity_settings.xml | 20 ---- .../res/layout/settings_group.xml | 14 --- .../res/layout/settings_item.xml | 13 --- sensorhub-android-app/res/menu/main.xml | 6 -- sensorhub-android-app/res/values/strings.xml | 2 - .../org/sensorhub/android/MainActivity.java | 59 ++++------ .../sensorhub/android/SettingsActivity.java | 72 ------------- .../SettingsExpandableListAdapter.java | 102 ------------------ sensorhub-android-lib/build.gradle | 5 +- settings.gradle | 4 +- 12 files changed, 31 insertions(+), 283 deletions(-) delete mode 100644 sensorhub-android-app/res/layout/activity_settings.xml delete mode 100644 sensorhub-android-app/res/layout/settings_group.xml delete mode 100644 sensorhub-android-app/res/layout/settings_item.xml delete mode 100644 sensorhub-android-app/src/org/sensorhub/android/SettingsActivity.java delete mode 100644 sensorhub-android-app/src/org/sensorhub/android/SettingsExpandableListAdapter.java diff --git a/build.gradle b/build.gradle index cef723f6..469313e4 100644 --- a/build.gradle +++ b/build.gradle @@ -47,6 +47,8 @@ subprojects { // force use of local projects substitute module('org.sensorhub:sensorhub-core') with project(':sensorhub-core') substitute module('org.sensorhub:sensorhub-comm-ble') with project(':sensorhub-comm-ble') + substitute module('org.sensorhub:sensorhub-service-swe') with project(':sensorhub-service-swe') + substitute module('org.sensorhub:sensorhub-service-video') with project(':sensorhub-service-video') substitute module('org.sensorhub:sensorhub-process-geoloc') with project(':sensorhub-process-geoloc') substitute module('org.vast.opengis:ogc-services-sps') with project(':ogc-services-sps') diff --git a/sensorhub-android-app/AndroidManifest.xml b/sensorhub-android-app/AndroidManifest.xml index 04b9ae07..5a2cfc21 100644 --- a/sensorhub-android-app/AndroidManifest.xml +++ b/sensorhub-android-app/AndroidManifest.xml @@ -13,20 +13,18 @@ + - + android:label="@string/app_name" + android:screenOrientation="portrait"> @@ -37,9 +35,8 @@ android:label="@string/title_activity_user_settings"> - + android:name=".SensorHubService" + android:enabled="true"> - + \ No newline at end of file diff --git a/sensorhub-android-app/res/layout/activity_settings.xml b/sensorhub-android-app/res/layout/activity_settings.xml deleted file mode 100644 index 05c9065f..00000000 --- a/sensorhub-android-app/res/layout/activity_settings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/sensorhub-android-app/res/layout/settings_group.xml b/sensorhub-android-app/res/layout/settings_group.xml deleted file mode 100644 index ed309d64..00000000 --- a/sensorhub-android-app/res/layout/settings_group.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - \ No newline at end of file diff --git a/sensorhub-android-app/res/layout/settings_item.xml b/sensorhub-android-app/res/layout/settings_item.xml deleted file mode 100644 index b11e077c..00000000 --- a/sensorhub-android-app/res/layout/settings_item.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - \ No newline at end of file diff --git a/sensorhub-android-app/res/menu/main.xml b/sensorhub-android-app/res/menu/main.xml index ed89f0eb..6b5b3c03 100644 --- a/sensorhub-android-app/res/menu/main.xml +++ b/sensorhub-android-app/res/menu/main.xml @@ -8,12 +8,6 @@ android:showAsAction="never" android:title="@string/action_settings"/> - - SensorHubConnect Please configure and start SensorHub using the Options Menu Settings - Testing Start SensorHub Stop SensorHub About @@ -16,5 +15,4 @@ Archive Push - Settings diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index c9dc6ea6..7cdc1778 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -18,7 +18,6 @@ import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; -import java.io.FileOutputStream; import java.net.MalformedURLException; import java.net.URL; import java.text.SimpleDateFormat; @@ -44,21 +43,16 @@ import org.sensorhub.impl.client.sost.SOSTClient; import org.sensorhub.impl.client.sost.SOSTClient.StreamInfo; import org.sensorhub.impl.client.sost.SOSTClientConfig; -//import org.sensorhub.impl.driver.dji.DjiConfig; import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; import org.sensorhub.impl.module.InMemoryConfigDb; import org.sensorhub.impl.persistence.StreamStorageConfig; import org.sensorhub.impl.persistence.h2.MVMultiStorageImpl; import org.sensorhub.impl.persistence.h2.MVObsStorageImpl; import org.sensorhub.impl.persistence.h2.MVStorageConfig; -import org.sensorhub.impl.persistence.perst.BasicStorageConfig; -import org.sensorhub.impl.persistence.perst.BasicStorageImpl; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; -import org.sensorhub.impl.service.sos.SOSCustomFormatConfig; import org.sensorhub.impl.service.sos.SOSServiceConfig; -import org.sensorhub.impl.service.sos.SensorConsumerConfig; import org.sensorhub.impl.service.sos.SensorDataProviderConfig; import org.sensorhub.impl.service.sos.video.MP4Serializer; import org.sensorhub.impl.service.sos.video.MJPEGSerializer; @@ -81,7 +75,6 @@ import android.provider.Settings.Secure; import android.text.Html; import android.widget.EditText; -import android.widget.ExpandableListView; import android.widget.TextView; public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener @@ -115,6 +108,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) { /** * TODO: H2 in sensorhubconfig + * TODO: Double check capabilities are only showing checked simple sensors */ sensorhubConfig = new InMemoryConfigDb(); @@ -151,19 +145,19 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.enableTransactional = true; // Storage Config - /* - FIXME: Which StorageImpl class use for moduleClass? - Example from working config: - BasicStorageConfig storageConfig = new BasicStorageConfig(); - storageConfig.moduleClass = BasicStorageImpl.class.getCanonicalName(); - */ + /** + * FIXME: Which StorageImpl class use for moduleClass? + * Example from working config: + * BasicStorageConfig storageConfig = new BasicStorageConfig(); + * storageConfig.moduleClass = BasicStorageImpl.class.getCanonicalName(); + */ MVStorageConfig storageConfig = new MVStorageConfig(); storageConfig.autoStart = true; -// storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); + //storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); storageConfig.moduleClass = MVObsStorageImpl.class.getCanonicalName(); storageConfig.storagePath = getFilesDir().getAbsolutePath() + "/oshAndroid_h2.dat"; -// sosConfig.newStorageConfig = storageConfig; + sosConfig.newStorageConfig = storageConfig; Log.d("MAIN_ACTIVITY", storageConfig.storagePath); Log.d("MAIN_ACTIVITY", String.valueOf(getFilesDir().canWrite())); @@ -193,10 +187,9 @@ protected void updateConfig(SharedPreferences prefs, String runName) addSosTConfig(sensorsConfig, sosUser, sosPwd); // Android Data Provider - /* - FIXME: How to get procedure after it is added to as data provider? - Adding android via SOS-T properly adds to hub, but this programmatic way doesn't work... - */ + /** + * FIXME: How to get procedure after it is added to as data provider? + */ SensorDataProviderConfig androidDataProviderConfig = new SensorDataProviderConfig(); androidDataProviderConfig.sensorID = sensorsConfig.id; androidDataProviderConfig.offeringID = sensorsConfig.id+"-sos"; @@ -204,28 +197,19 @@ protected void updateConfig(SharedPreferences prefs, String runName) androidDataProviderConfig.liveDataTimeout = 600.0; androidDataProviderConfig.maxFois = 10; androidDataProviderConfig.enabled = true; -// sosConfig.dataProviders.add(androidDataProviderConfig); - - // Android Data Consumer - /* - FIXME: How to get procedure after it is added to as data provider? - Adding android via SOS-T properly adds to hub, but this programmatic route doesn't work... - */ - /* TODO: Check to see if I need to implement data consumer. It's from android working using SOS-T - SensorConsumerConfig androidDataConsumerConfig = new SensorConsumerConfig(); - androidDataConsumerConfig.sensorID = sensorsConfig.id; - androidDataConsumerConfig.offeringID = sensorsConfig.id+"-sos"; - androidDataConsumerConfig.enabled = true; - sosConfig.dataConsumers.add(androidDataConsumerConfig); - */ + sosConfig.dataProviders.add(androidDataProviderConfig); // Android Stream Storage + /** + * TODO: Test deeper if stream storage at specified path is working. + * It's not erroring at current path but IS ERRORING at auto-generated path for SOS-T sensors + */ StreamStorageConfig androidStreamStorageConfig = new StreamStorageConfig(); androidStreamStorageConfig.name = "Android Sensor Storage"; androidStreamStorageConfig.autoStart = true; androidStreamStorageConfig.storageConfig = storageConfig; androidStreamStorageConfig.dataSourceID = sensorsConfig.id; -// sensorhubConfig.add(androidStreamStorageConfig); + sensorhubConfig.add(androidStreamStorageConfig); // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); @@ -247,7 +231,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) addSosTConfig(trupulseConfig, sosUser, sosPwd); - // TODO: Add TruPulse to SOS Config SensorDataProviderConfig trupulseDataProviderConfig = new SensorDataProviderConfig(); trupulseDataProviderConfig.sensorID = trupulseConfig.id; trupulseDataProviderConfig.offeringID = trupulseConfig.id+"-sos"; @@ -277,7 +260,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(angelConfig); addSosTConfig(angelConfig, sosUser, sosPwd); - // TODO: Add Angel to SOS Config SensorDataProviderConfig angelDataProviderConfig = new SensorDataProviderConfig(); angelDataProviderConfig.sensorID = angelConfig.id; angelDataProviderConfig.offeringID = angelConfig.id+"-sos"; @@ -299,7 +281,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(flironeConfig); addSosTConfig(flironeConfig, sosUser, sosPwd); - // TODO: Add FLIR One to SOS Config SensorDataProviderConfig flironeDataProviderConfig = new SensorDataProviderConfig(); flironeDataProviderConfig.sensorID = flironeConfig.id; flironeDataProviderConfig.offeringID = flironeConfig.id+"-sos"; @@ -398,10 +379,6 @@ public boolean onOptionsItemSelected(MenuItem item) startActivity(new Intent(this, UserSettingsActivity.class)); return true; } - else if (id == R.id.action_test) { - startActivity(new Intent(this, SettingsActivity.class)); - return true; - } else if (id == R.id.action_start) { if (boundService != null && boundService.getSensorHub() == null) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SettingsActivity.java b/sensorhub-android-app/src/org/sensorhub/android/SettingsActivity.java deleted file mode 100644 index b176e45f..00000000 --- a/sensorhub-android-app/src/org/sensorhub/android/SettingsActivity.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.sensorhub.android; - -import android.content.Intent; -import android.os.Bundle; -import android.app.Activity; -import android.view.View; -import android.widget.ExpandableListAdapter; -import android.widget.ExpandableListView; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class SettingsActivity extends Activity { - - ExpandableListView expandableListView; - ExpandableListAdapter expandableListAdapter; - List expandableListTitle; - HashMap> expandableListDetail; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_settings); - Intent intent = getIntent(); - - expandableListView = (ExpandableListView) findViewById(R.id.settingsListView); - expandableListDetail = getSettings(); - expandableListTitle = new ArrayList(expandableListDetail.keySet()); - expandableListAdapter = new SettingsExpandableListAdapter(this, expandableListTitle, expandableListDetail); - expandableListView.setAdapter(expandableListAdapter); - expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { - @Override - public void onGroupExpand(int groupPosition) { - } - }); - expandableListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() { - @Override - public void onGroupCollapse(int groupPosition) { - } - }); - expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { - @Override - public boolean onChildClick(ExpandableListView expandableListView, View view, - int groupPosition, int childPosition, long id) { - return false; - } - }); - } - - private HashMap> getSettings() { - HashMap> expandableListDetail = new HashMap>(); - - List generalSettings = new ArrayList(); - generalSettings.add("Device Name"); - generalSettings.add("SOS Endpoint URL"); - generalSettings.add("SOS Username"); - generalSettings.add("SOS Password"); - - List football = new ArrayList(); - football.add("Brazil"); - football.add("Spain"); - football.add("Germany"); - football.add("Netherlands"); - football.add("Italy"); - - expandableListDetail.put("General", generalSettings); - expandableListDetail.put("Sensors", football); - - return expandableListDetail; - } -} diff --git a/sensorhub-android-app/src/org/sensorhub/android/SettingsExpandableListAdapter.java b/sensorhub-android-app/src/org/sensorhub/android/SettingsExpandableListAdapter.java deleted file mode 100644 index 6f710d16..00000000 --- a/sensorhub-android-app/src/org/sensorhub/android/SettingsExpandableListAdapter.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.sensorhub.android; - -import android.content.Context; -import android.graphics.Typeface; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseExpandableListAdapter; -import android.widget.TextView; - -import java.util.HashMap; -import java.util.List; - -public class SettingsExpandableListAdapter extends BaseExpandableListAdapter { - private Context context; - private List expandableListTitle; - private HashMap> expandableListDetail; - - public SettingsExpandableListAdapter( - Context context, List expandableListTitle, - HashMap> expandableListDetail - ) { - this.context = context; - this.expandableListTitle = expandableListTitle; - this.expandableListDetail = expandableListDetail; - } - - @Override - public Object getChild(int listPosition, int expandedListPosition) { - return this.expandableListDetail - .get(this.expandableListTitle.get(listPosition)) - .get(expandedListPosition); - } - - @Override - public long getChildId(int listPosition, int expandedListPosition) { - return expandedListPosition; - } - - @Override - public View getChildView(int listPosition, final int expandedListPosition, - boolean isLastChild, View view, ViewGroup viewGroup) { - final String expandedListText = (String) getChild(listPosition, expandedListPosition); - if (view == null) { - LayoutInflater layoutInflater = (LayoutInflater) this.context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = layoutInflater.inflate(R.layout.settings_item, null); - } - - TextView expandedListTextView = (TextView) view.findViewById(R.id.expandedListItem); - expandedListTextView.setText(expandedListText); - - return view; - } - - @Override - public int getChildrenCount(int listPosition) { - return this.expandableListDetail.get(this.expandableListTitle.get(listPosition)).size(); - } - - @Override - public Object getGroup(int listPosition) { - return this.expandableListTitle.get(listPosition); - } - - @Override - public int getGroupCount() { - return this.expandableListTitle.size(); - } - - @Override - public long getGroupId(int listPosition) { - return listPosition; - } - - @Override - public View getGroupView(int listPosition, boolean isExpanded, - View view, ViewGroup viewGroup) { - final String listTitle = (String) getGroup(listPosition); - if (view == null) { - LayoutInflater layoutInflater = (LayoutInflater) this.context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = layoutInflater.inflate(R.layout.settings_group, null); - } - - TextView listTitleTextView = (TextView) view.findViewById(R.id.listTitle); - listTitleTextView.setTypeface(null, Typeface.BOLD); - listTitleTextView.setText(listTitle); - - return view; - } - - @Override - public boolean hasStableIds() { - return false; - } - - @Override - public boolean isChildSelectable(int listPosition, int expandedListPosition) { - return true; - } -} diff --git a/sensorhub-android-lib/build.gradle b/sensorhub-android-lib/build.gradle index 19680f3e..12a9a3c0 100644 --- a/sensorhub-android-lib/build.gradle +++ b/sensorhub-android-lib/build.gradle @@ -10,8 +10,9 @@ dependencies { //compile 'org.sensorhub:sensorhub-driver-trupulse:[0.1,2.0)' //compile 'org.sensorhub:sensorhub-driver-angelsensor:[0.1,2.0)' api project(':sensorhub-core') - api project(':sensorhub-storage-h2') api project(':sensorhub-service-swe') + api project(':sensorhub-storage-perst') + api project(':sensorhub-storage-h2') api project(':sensorhub-service-video') api project(':sensorhub-comm-ble') api project(':sensorhub-driver-trupulse') @@ -26,7 +27,7 @@ dependencies { configurations { compile { // exclude stuff from APK - exclude group: "javax.xml.stream" + //exclude group: "javax.xml.stream" //exclude group: "javax.servlet" exclude group: "xml-apis" //exclude group: "org.eclipse.jetty" diff --git a/settings.gradle b/settings.gradle index 04839ccd..9a7ee952 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,13 +3,13 @@ def oshMainDir = "$rootDir/.." // include builds from other repos def repos = [ - 'osh-core':['lib-swe-common', 'lib-sensorml', 'lib-ows', 'sensorhub-core', 'sensorhub-service-swe', 'sensorhub-storage-perst'], + 'osh-core':['lib-swe-common', 'lib-sensorml', 'lib-ows', 'sensorhub-core', 'sensorhub-service-swe', 'sensorhub-storage-perst', 'sensorhub-storage-h2'], 'osh-persistence':['sensorhub-storage-h2'], 'osh-comm':['sensorhub-comm-ble'], 'osh-sensors':['sensorhub-driver-angelsensor'], 'osh-video':['sensorhub-driver-videocam', 'sensorhub-service-video'], 'osh-positioning':['sensorhub-driver-trupulse'], - 'osh-processing':['sensorhub-process-vecmath', 'sensorhub-process-geoloc']] + 'osh-processing':['sensorhub-process-vecmath', 'sensorhub-process-geoloc', 'sensorhub-process-basicmath']] repos.each { repoName, modules -> File repoDir = new File(oshMainDir, repoName).getCanonicalFile() From be1567b09e8d2d065197950d1fb6d88e92cb058c Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Fri, 1 Feb 2019 17:00:50 -0600 Subject: [PATCH 017/207] refactor settings for different data pushing options, and troubleshoot h2 failure --- sensorhub-android-app/res/values/strings.xml | 37 +++ .../res/xml/pref_sensors.xml | 306 ++++++++++++------ .../org/sensorhub/android/MainActivity.java | 137 ++++++-- .../android/UserSettingsActivity.java | 175 ++++++---- .../sensor/android/AndroidSensorsConfig.java | 6 +- .../sensor/android/AndroidSensorsDriver.java | 4 + 6 files changed, 496 insertions(+), 169 deletions(-) diff --git a/sensorhub-android-app/res/values/strings.xml b/sensorhub-android-app/res/values/strings.xml index d6e932cc..759b5693 100644 --- a/sensorhub-android-app/res/values/strings.xml +++ b/sensorhub-android-app/res/values/strings.xml @@ -6,13 +6,50 @@ Start SensorHub Stop SensorHub About + Android Sensor + TruPulse Range Finder Sensor + Angel Sensor + Flirone Sensor JPEG H264 + + + Quaternion + Euler + + + QUATERNION + EULER + + + QUATERNION + + + + GPS + Network + + + GPS + NETWORK + + + GPS + + Real-time Archive Push + + REALTIME + ARCHIVE + PUSH + + + PUSH + diff --git a/sensorhub-android-app/res/xml/pref_sensors.xml b/sensorhub-android-app/res/xml/pref_sensors.xml index a4bf5156..95be65d3 100644 --- a/sensorhub-android-app/res/xml/pref_sensors.xml +++ b/sensorhub-android-app/res/xml/pref_sensors.xml @@ -1,94 +1,220 @@ - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 7cdc1778..1159d5ae 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -18,14 +18,18 @@ import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; +import java.io.File; +import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import android.util.Log; import android.view.*; @@ -77,6 +81,8 @@ import android.widget.EditText; import android.widget.TextView; +import static android.content.ContentValues.TAG; + public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener { TextView textArea; @@ -108,7 +114,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) { /** * TODO: H2 in sensorhubconfig - * TODO: Double check capabilities are only showing checked simple sensors */ sensorhubConfig = new InMemoryConfigDb(); @@ -151,23 +156,56 @@ protected void updateConfig(SharedPreferences prefs, String runName) * BasicStorageConfig storageConfig = new BasicStorageConfig(); * storageConfig.moduleClass = BasicStorageImpl.class.getCanonicalName(); */ + File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", "oshAndroid_h2.dat"); + dbFile.getParentFile().mkdirs(); + if(!dbFile.exists()) { + try { + dbFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + Log.d(TAG, "updateConfig: Exist - " + dbFile.exists()); + Log.d(TAG, "updateConfig: Read - " + dbFile.canRead()); + Log.d(TAG, "updateConfig: Write - " + dbFile.canWrite()); + Log.d(TAG, "updateConfig: Execute - " + dbFile.canExecute()); + MVStorageConfig storageConfig = new MVStorageConfig(); storageConfig.autoStart = true; - //storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); - storageConfig.moduleClass = MVObsStorageImpl.class.getCanonicalName(); - storageConfig.storagePath = getFilesDir().getAbsolutePath() - + "/oshAndroid_h2.dat"; + storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); + //storageConfig.moduleClass = MVObsStorageImpl.class.getCanonicalName(); + storageConfig.storagePath = dbFile.getPath(); sosConfig.newStorageConfig = storageConfig; - Log.d("MAIN_ACTIVITY", storageConfig.storagePath); - Log.d("MAIN_ACTIVITY", String.valueOf(getFilesDir().canWrite())); - // Sensors Config - AndroidSensorsConfig sensorsConfig = new AndroidSensorsConfig(); - sensorsConfig.name = "Android Sensors [" + deviceName + "]"; - sensorsConfig.id = "ANDROID_SENSORS"; - sensorsConfig.autoStart = true; + // Push Sensors Config + AndroidSensorsConfig pushSensorsConfig = new AndroidSensorsConfig(); + pushSensorsConfig.name = "Android Sensors [" + deviceName + "]"; + pushSensorsConfig.id = "PUSH_ANDROID_SENSORS"; + pushSensorsConfig.autoStart = true; + pushSensorsConfig.androidContext = this.getApplicationContext(); + pushSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); + pushSensorsConfig.runName = runName; + + // Realtime Sensors Config + AndroidSensorsConfig realtimeSensorsConfig = new AndroidSensorsConfig(); + realtimeSensorsConfig.name = "Android Sensors [" + deviceName + "]"; + realtimeSensorsConfig.id = "REALTIME_ANDROID_SENSORS"; + realtimeSensorsConfig.autoStart = true; + realtimeSensorsConfig.androidContext = this.getApplicationContext(); + realtimeSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); + realtimeSensorsConfig.runName = runName; + + // Archive Sensors Config + AndroidSensorsConfig archiveSensorsConfig = new AndroidSensorsConfig(); + archiveSensorsConfig.name = "Android Sensors [" + deviceName + "]"; + archiveSensorsConfig.id = "ARCHIVE_ANDROID_SENSORS"; + archiveSensorsConfig.autoStart = true; + archiveSensorsConfig.androidContext = this.getApplicationContext(); + archiveSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); + archiveSensorsConfig.runName = runName; // (Simple) Sensors + /* sensorsConfig.activateAccelerometer = prefs.getBoolean("accel_enabled", false); sensorsConfig.activateGyrometer = prefs.getBoolean("gyro_enabled", false); sensorsConfig.activateMagnetometer = prefs.getBoolean("mag_enabled", false); @@ -180,20 +218,75 @@ protected void updateConfig(SharedPreferences prefs, String runName) showVideo = true; } sensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); - sensorsConfig.androidContext = this.getApplicationContext(); - sensorsConfig.camPreviewTexture = boundService.getVideoTexture(); - sensorsConfig.runName = runName; - sensorhubConfig.add(sensorsConfig); - addSosTConfig(sensorsConfig, sosUser, sosPwd); + */ + + // (Simple) Sensors + if (prefs.getBoolean("accelerometer_enable", false)) { + pushSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH"); + realtimeSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME"); + archiveSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE"); + } + if (prefs.getBoolean("gyroscope_enable", false)) { + pushSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH"); + realtimeSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME"); + archiveSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE"); + } + if (prefs.getBoolean("magnetometer_enable", false)) { + pushSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH"); + realtimeSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME"); + archiveSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE"); + } + if (prefs.getBoolean("orientation_enable", false)) { + if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) { + pushSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); + pushSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); + } + if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME")) { + realtimeSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); + realtimeSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); + } + if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) { + archiveSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); + archiveSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); + } + } + if (prefs.getBoolean("location_enable", false)) { + if (prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH")) { + pushSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); + pushSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); + } + if (prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME")) { + realtimeSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); + realtimeSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); + } + if (prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE")) { + archiveSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); + archiveSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); + } + } + if (prefs.getBoolean("video_enable", false)) { + showVideo = true; + pushSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH"); + pushSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); + realtimeSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME"); + realtimeSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); + archiveSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE"); + archiveSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); + } + + + sensorhubConfig.add(pushSensorsConfig); + sensorhubConfig.add(realtimeSensorsConfig); + sensorhubConfig.add(archiveSensorsConfig); + addSosTConfig(pushSensorsConfig, sosUser, sosPwd); // Android Data Provider /** * FIXME: How to get procedure after it is added to as data provider? */ SensorDataProviderConfig androidDataProviderConfig = new SensorDataProviderConfig(); - androidDataProviderConfig.sensorID = sensorsConfig.id; - androidDataProviderConfig.offeringID = sensorsConfig.id+"-sos"; - // TODO: Add hidden inputs list based off pref/settings logic + androidDataProviderConfig.sensorID = realtimeSensorsConfig.id; + androidDataProviderConfig.offeringID = realtimeSensorsConfig.id+"-sos"; androidDataProviderConfig.liveDataTimeout = 600.0; androidDataProviderConfig.maxFois = 10; androidDataProviderConfig.enabled = true; @@ -205,10 +298,10 @@ protected void updateConfig(SharedPreferences prefs, String runName) * It's not erroring at current path but IS ERRORING at auto-generated path for SOS-T sensors */ StreamStorageConfig androidStreamStorageConfig = new StreamStorageConfig(); + androidStreamStorageConfig.storageConfig = storageConfig; + androidStreamStorageConfig.dataSourceID = realtimeSensorsConfig.id; androidStreamStorageConfig.name = "Android Sensor Storage"; androidStreamStorageConfig.autoStart = true; - androidStreamStorageConfig.storageConfig = storageConfig; - androidStreamStorageConfig.dataSourceID = sensorsConfig.id; sensorhubConfig.add(androidStreamStorageConfig); // TruPulse sensor diff --git a/sensorhub-android-app/src/org/sensorhub/android/UserSettingsActivity.java b/sensorhub-android-app/src/org/sensorhub/android/UserSettingsActivity.java index 35dc3c3d..2202a131 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/UserSettingsActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/UserSettingsActivity.java @@ -1,31 +1,39 @@ -/***************************** BEGIN LICENSE BLOCK *************************** - -The contents of this file are subject to the Mozilla Public License, v. 2.0. -If a copy of the MPL was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -for the specific language governing rights and limitations under the License. - -Copyright (C) 2012-2015 Sensia Software LLC. All Rights Reserved. - -******************************* END LICENSE BLOCK ***************************/ - +/***************************** BEGIN LICENSE BLOCK *************************** + +The contents of this file are subject to the Mozilla Public License, v. 2.0. +If a copy of the MPL was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +Copyright (C) 2012-2015 Sensia Software LLC. All Rights Reserved. + +******************************* END LICENSE BLOCK ***************************/ + package org.sensorhub.android; -import android.annotation.TargetApi; -import android.app.AlertDialog; +import android.annotation.TargetApi; +import android.app.AlertDialog; +import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; -import java.net.URL; +import android.preference.PreferenceGroup; +import android.preference.PreferenceManager; +import android.util.Log; + +import com.esotericsoftware.kryo.util.MapReferenceResolver; + +import java.net.URL; import java.util.List; +import static android.content.ContentValues.TAG; + public class UserSettingsActivity extends PreferenceActivity { @@ -35,7 +43,7 @@ public void onBuildHeaders(List
target) { loadHeadersFromResource(R.xml.pref_headers, target); } - + /* * A preference value change listener that updates the preference's summary to reflect its new value. @@ -56,26 +64,26 @@ public boolean onPreferenceChange(Preference preference, Object value) else { preference.setSummary(stringValue); - } - - // detect errors - if (preference.getKey().equals("sos_uri")) - { - try - { - URL url = new URL(value.toString()); - if (!url.getProtocol().equals("http") && !url.getProtocol().equals("https")) - throw new Exception("SOS URL must be HTTP or HTTPS"); - } - catch (Exception e) - { - AlertDialog.Builder dlgAlert = new AlertDialog.Builder(preference.getContext()); - dlgAlert.setMessage("Invalid SOS URL"); - dlgAlert.setTitle(e.getMessage()); - dlgAlert.setPositiveButton("OK", null); - dlgAlert.setCancelable(true); - dlgAlert.create().show(); - } + } + + // detect errors + if (preference.getKey().equals("sos_uri")) + { + try + { + URL url = new URL(value.toString()); + if (!url.getProtocol().equals("http") && !url.getProtocol().equals("https")) + throw new Exception("SOS URL must be HTTP or HTTPS"); + } + catch (Exception e) + { + AlertDialog.Builder dlgAlert = new AlertDialog.Builder(preference.getContext()); + dlgAlert.setMessage("Invalid SOS URL"); + dlgAlert.setTitle(e.getMessage()); + dlgAlert.setPositiveButton("OK", null); + dlgAlert.setCancelable(true); + dlgAlert.create().show(); + } } return true; @@ -100,7 +108,7 @@ private static void bindPreferenceSummaryToValue(Preference preference) // Trigger the listener immediately with the preference's // current value. sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager.getDefaultSharedPreferences(preference.getContext()).getString(preference.getKey(), "")); - } + } /* @@ -113,14 +121,14 @@ public static class GeneralPreferenceFragment extends PreferenceFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.pref_general); + addPreferencesFromResource(R.xml.pref_general); bindPreferenceSummaryToValue(findPreference("device_name")); - bindPreferenceSummaryToValue(findPreference("sos_uri")); + bindPreferenceSummaryToValue(findPreference("sos_uri")); bindPreferenceSummaryToValue(findPreference("sos_username")); } - } - - + } + + /* * Fragment for sensor preferences */ @@ -131,16 +139,75 @@ public static class SensorPreferenceFragment extends PreferenceFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.pref_sensors); - bindPreferenceSummaryToValue(findPreference("video_codec")); + addPreferencesFromResource(R.xml.pref_sensors); + bindPreferenceSummaryToValue(findPreference("video_codec")); bindPreferenceSummaryToValue(findPreference("angel_address")); + + SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); + + Preference accelerometerEnable = getPreferenceScreen().findPreference("accelerometer_enable"); + Preference accelerometerOptions = getPreferenceScreen().findPreference("accelerometer_options"); + accelerometerOptions.setEnabled(prefs.getBoolean(accelerometerEnable.getKey(), false)); + accelerometerEnable.setOnPreferenceChangeListener((preference, newValue) -> { + accelerometerOptions.setEnabled((boolean) newValue); + return true; + }); + + Preference gyroscopeEnable = getPreferenceScreen().findPreference("gyroscope_enable"); + Preference gyroscopeOptions = getPreferenceScreen().findPreference("gyroscope_options"); + gyroscopeOptions.setEnabled(prefs.getBoolean(gyroscopeEnable.getKey(), false)); + gyroscopeEnable.setOnPreferenceChangeListener((preference, newValue) -> { + gyroscopeOptions.setEnabled((boolean) newValue); + return true; + }); + + Preference magnetometerEnable = getPreferenceScreen().findPreference("magnetometer_enable"); + Preference magnetometerOptions = getPreferenceScreen().findPreference("magnetometer_options"); + magnetometerOptions.setEnabled(prefs.getBoolean(magnetometerEnable.getKey(), false)); + magnetometerEnable.setOnPreferenceChangeListener((preference, newValue) -> { + magnetometerOptions.setEnabled((boolean) newValue); + return true; + }); + + Preference orientationEnable = getPreferenceScreen().findPreference("orientation_enable"); + Preference orientationOptions = getPreferenceScreen().findPreference("orientation_options"); + Preference orientationAngles = getPreferenceScreen().findPreference("orientation_angles"); + orientationOptions.setEnabled(prefs.getBoolean(orientationEnable.getKey(), false)); + orientationAngles.setEnabled(prefs.getBoolean(orientationEnable.getKey(), false)); + orientationEnable.setOnPreferenceChangeListener((preference, newValue) -> { + orientationOptions.setEnabled((boolean) newValue); + orientationAngles.setEnabled((boolean) newValue); + return true; + }); + + Preference locationEnable = getPreferenceScreen().findPreference("location_enable"); + Preference locationOptions = getPreferenceScreen().findPreference("location_options"); + Preference locationType = getPreferenceScreen().findPreference("location_type"); + locationOptions.setEnabled(prefs.getBoolean(locationEnable.getKey(), false)); + locationType.setEnabled(prefs.getBoolean(locationEnable.getKey(), false)); + locationEnable.setOnPreferenceChangeListener((preference, newValue) -> { + locationOptions.setEnabled((boolean) newValue); + locationType.setEnabled((boolean) newValue); + return true; + }); + + Preference videoEnable = getPreferenceScreen().findPreference("video_enable"); + Preference videoOptions = getPreferenceScreen().findPreference("video_options"); + Preference videoCodec = getPreferenceScreen().findPreference("video_codec"); + videoOptions.setEnabled(prefs.getBoolean(videoEnable.getKey(), false)); + videoCodec.setEnabled(prefs.getBoolean(videoEnable.getKey(), false)); + videoEnable.setOnPreferenceChangeListener((preference, newValue) -> { + videoOptions.setEnabled((boolean) newValue); + videoCodec.setEnabled((boolean) newValue); + return true; + }); } - } - - - @Override - protected boolean isValidFragment(String fragmentName) - { - return true; + } + + + @Override + protected boolean isValidFragment(String fragmentName) + { + return true; } } diff --git a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsConfig.java b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsConfig.java index 834769dc..7ad682f5 100644 --- a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsConfig.java +++ b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsConfig.java @@ -36,9 +36,9 @@ public class AndroidSensorsConfig extends SensorConfig public boolean activateAccelerometer = false; public boolean activateGyrometer = false; public boolean activateMagnetometer = false; - public boolean activateOrientationQuat = true; - public boolean activateOrientationEuler = true; - public boolean activateGpsLocation = true; + public boolean activateOrientationQuat = false; + public boolean activateOrientationEuler = false; + public boolean activateGpsLocation = false; public boolean activateNetworkLocation = false; public boolean activateBackCamera = false; public boolean activateFrontCamera = false; diff --git a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java index 24090ed5..2130ba72 100644 --- a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java +++ b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java @@ -139,6 +139,10 @@ public synchronized void init() throws SensorHubException @Override public void start() throws SensorException { + /** + * TODO: What thread does Jetty run on? Reduce the number of threads Jetty is using first. + * TODO: Are each sensor on their own thread? Look into how android handles threads + */ // start event handling thread eventThread = new HandlerThread("SensorThread " + getName()); eventThread.start(); From 48a8271f019ec00b79d2275a6337db037be7445e Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 4 Feb 2019 23:13:49 -0600 Subject: [PATCH 018/207] fix storage and stream storage config --- sensorhub-android-app/res/values/strings.xml | 4 +- .../org/sensorhub/android/MainActivity.java | 90 ++++--------------- 2 files changed, 20 insertions(+), 74 deletions(-) diff --git a/sensorhub-android-app/res/values/strings.xml b/sensorhub-android-app/res/values/strings.xml index 759b5693..1892e062 100644 --- a/sensorhub-android-app/res/values/strings.xml +++ b/sensorhub-android-app/res/values/strings.xml @@ -41,12 +41,12 @@ Real-time - Archive + Push REALTIME - ARCHIVE + PUSH diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 1159d5ae..f8de4d32 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -49,6 +49,8 @@ import org.sensorhub.impl.client.sost.SOSTClientConfig; import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; import org.sensorhub.impl.module.InMemoryConfigDb; +import org.sensorhub.impl.persistence.GenericStreamStorage; +import org.sensorhub.impl.persistence.MaxAgeAutoPurgeConfig; import org.sensorhub.impl.persistence.StreamStorageConfig; import org.sensorhub.impl.persistence.h2.MVMultiStorageImpl; import org.sensorhub.impl.persistence.h2.MVObsStorageImpl; @@ -112,17 +114,13 @@ public void onServiceDisconnected(ComponentName className) protected void updateConfig(SharedPreferences prefs, String runName) { - /** - * TODO: H2 in sensorhubconfig - */ sensorhubConfig = new InMemoryConfigDb(); // get SOS URL from config String sosUriConfig = prefs.getString("sos_uri", ""); String sosUser = prefs.getString("sos_username", null); String sosPwd = prefs.getString("sos_password", null); - if (sosUriConfig != null && sosUriConfig.trim().length() > 0) - { + if (sosUriConfig != null && sosUriConfig.trim().length() > 0) { try { sosUrl = new URL(sosUriConfig); @@ -150,12 +148,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.enableTransactional = true; // Storage Config - /** - * FIXME: Which StorageImpl class use for moduleClass? - * Example from working config: - * BasicStorageConfig storageConfig = new BasicStorageConfig(); - * storageConfig.moduleClass = BasicStorageImpl.class.getCanonicalName(); - */ File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", "oshAndroid_h2.dat"); dbFile.getParentFile().mkdirs(); if(!dbFile.exists()) { @@ -165,22 +157,16 @@ protected void updateConfig(SharedPreferences prefs, String runName) e.printStackTrace(); } } - Log.d(TAG, "updateConfig: Exist - " + dbFile.exists()); - Log.d(TAG, "updateConfig: Read - " + dbFile.canRead()); - Log.d(TAG, "updateConfig: Write - " + dbFile.canWrite()); - Log.d(TAG, "updateConfig: Execute - " + dbFile.canExecute()); - MVStorageConfig storageConfig = new MVStorageConfig(); storageConfig.autoStart = true; storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); - //storageConfig.moduleClass = MVObsStorageImpl.class.getCanonicalName(); storageConfig.storagePath = dbFile.getPath(); sosConfig.newStorageConfig = storageConfig; // Push Sensors Config AndroidSensorsConfig pushSensorsConfig = new AndroidSensorsConfig(); - pushSensorsConfig.name = "Android Sensors [" + deviceName + "]"; - pushSensorsConfig.id = "PUSH_ANDROID_SENSORS"; + pushSensorsConfig.id = "urn:device:android:"+deviceID; + pushSensorsConfig.name = "Android Sensors [" + deviceName + "] via SOST"; pushSensorsConfig.autoStart = true; pushSensorsConfig.androidContext = this.getApplicationContext(); pushSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); @@ -188,53 +174,25 @@ protected void updateConfig(SharedPreferences prefs, String runName) // Realtime Sensors Config AndroidSensorsConfig realtimeSensorsConfig = new AndroidSensorsConfig(); + realtimeSensorsConfig.id = "urn:device:android-realtime:"+deviceID; realtimeSensorsConfig.name = "Android Sensors [" + deviceName + "]"; - realtimeSensorsConfig.id = "REALTIME_ANDROID_SENSORS"; realtimeSensorsConfig.autoStart = true; realtimeSensorsConfig.androidContext = this.getApplicationContext(); realtimeSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); realtimeSensorsConfig.runName = runName; - // Archive Sensors Config - AndroidSensorsConfig archiveSensorsConfig = new AndroidSensorsConfig(); - archiveSensorsConfig.name = "Android Sensors [" + deviceName + "]"; - archiveSensorsConfig.id = "ARCHIVE_ANDROID_SENSORS"; - archiveSensorsConfig.autoStart = true; - archiveSensorsConfig.androidContext = this.getApplicationContext(); - archiveSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); - archiveSensorsConfig.runName = runName; - - // (Simple) Sensors - /* - sensorsConfig.activateAccelerometer = prefs.getBoolean("accel_enabled", false); - sensorsConfig.activateGyrometer = prefs.getBoolean("gyro_enabled", false); - sensorsConfig.activateMagnetometer = prefs.getBoolean("mag_enabled", false); - sensorsConfig.activateOrientationQuat = prefs.getBoolean("orient_quat_enabled", false); - sensorsConfig.activateOrientationEuler = prefs.getBoolean("orient_euler_enabled", false); - sensorsConfig.activateGpsLocation = prefs.getBoolean("gps_enabled", false); - sensorsConfig.activateNetworkLocation = prefs.getBoolean("netloc_enabled", false); - sensorsConfig.activateBackCamera = prefs.getBoolean("cam_enabled", false); - if (sensorsConfig.activateBackCamera || sensorsConfig.activateFrontCamera) { - showVideo = true; - } - sensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); - */ - // (Simple) Sensors if (prefs.getBoolean("accelerometer_enable", false)) { pushSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH"); realtimeSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME"); - archiveSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE"); } if (prefs.getBoolean("gyroscope_enable", false)) { pushSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH"); realtimeSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME"); - archiveSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE"); } if (prefs.getBoolean("magnetometer_enable", false)) { pushSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH"); realtimeSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME"); - archiveSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE"); } if (prefs.getBoolean("orientation_enable", false)) { if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) { @@ -245,10 +203,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) realtimeSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); realtimeSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); } - if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) { - archiveSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); - archiveSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); - } } if (prefs.getBoolean("location_enable", false)) { if (prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH")) { @@ -259,10 +213,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) realtimeSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); realtimeSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); } - if (prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE")) { - archiveSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); - archiveSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); - } } if (prefs.getBoolean("video_enable", false)) { showVideo = true; @@ -270,38 +220,34 @@ protected void updateConfig(SharedPreferences prefs, String runName) pushSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); realtimeSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME"); realtimeSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); - archiveSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE"); - archiveSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); } - + addSosTConfig(pushSensorsConfig, sosUser, sosPwd); sensorhubConfig.add(pushSensorsConfig); sensorhubConfig.add(realtimeSensorsConfig); - sensorhubConfig.add(archiveSensorsConfig); - addSosTConfig(pushSensorsConfig, sosUser, sosPwd); // Android Data Provider - /** - * FIXME: How to get procedure after it is added to as data provider? - */ SensorDataProviderConfig androidDataProviderConfig = new SensorDataProviderConfig(); androidDataProviderConfig.sensorID = realtimeSensorsConfig.id; androidDataProviderConfig.offeringID = realtimeSensorsConfig.id+"-sos"; + androidDataProviderConfig.storageID = realtimeSensorsConfig.id+"#storage"; + androidDataProviderConfig.enabled = true; androidDataProviderConfig.liveDataTimeout = 600.0; androidDataProviderConfig.maxFois = 10; - androidDataProviderConfig.enabled = true; sosConfig.dataProviders.add(androidDataProviderConfig); // Android Stream Storage - /** - * TODO: Test deeper if stream storage at specified path is working. - * It's not erroring at current path but IS ERRORING at auto-generated path for SOS-T sensors - */ + MaxAgeAutoPurgeConfig autoPurgeConfig = new MaxAgeAutoPurgeConfig(); + autoPurgeConfig.enabled = true; + autoPurgeConfig.purgePeriod = 600.0; StreamStorageConfig androidStreamStorageConfig = new StreamStorageConfig(); - androidStreamStorageConfig.storageConfig = storageConfig; - androidStreamStorageConfig.dataSourceID = realtimeSensorsConfig.id; + androidStreamStorageConfig.moduleClass = GenericStreamStorage.class.getCanonicalName(); androidStreamStorageConfig.name = "Android Sensor Storage"; + androidStreamStorageConfig.id = androidDataProviderConfig.storageID; + androidStreamStorageConfig.dataSourceID = realtimeSensorsConfig.id; androidStreamStorageConfig.autoStart = true; + androidStreamStorageConfig.autoPurgeConfig = autoPurgeConfig; + androidStreamStorageConfig.storageConfig = storageConfig; sensorhubConfig.add(androidStreamStorageConfig); // TruPulse sensor @@ -381,8 +327,8 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.dataProviders.add(flironeDataProviderConfig); } - // DJI Drone /* + // DJI Drone enabled = prefs.getBoolean("dji_enabled", false); if (enabled) { From bb47d6bd7fd6f13fe5b36eb4bd67460bc53b87d0 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 5 Feb 2019 16:20:01 -0600 Subject: [PATCH 019/207] cronjob --- sensorhub-android-app/res/values/strings.xml | 4 +- .../org/sensorhub/android/MainActivity.java | 174 +++++++++++++++--- 2 files changed, 150 insertions(+), 28 deletions(-) diff --git a/sensorhub-android-app/res/values/strings.xml b/sensorhub-android-app/res/values/strings.xml index 1892e062..759b5693 100644 --- a/sensorhub-android-app/res/values/strings.xml +++ b/sensorhub-android-app/res/values/strings.xml @@ -41,12 +41,12 @@ Real-time - + Archive Push REALTIME - + ARCHIVE PUSH diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index f8de4d32..476c7f14 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -40,6 +40,7 @@ import org.sensorhub.android.comm.ble.BleNetwork; import org.sensorhub.api.common.Event; import org.sensorhub.api.common.IEventListener; +import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleEvent; import org.sensorhub.api.sensor.ISensorDataInterface; @@ -58,8 +59,14 @@ import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; +import org.sensorhub.impl.service.sos.ISOSDataProviderFactory; import org.sensorhub.impl.service.sos.SOSServiceConfig; +import org.sensorhub.impl.service.sos.SOSServlet; +import org.sensorhub.impl.service.sos.SensorDataProvider; import org.sensorhub.impl.service.sos.SensorDataProviderConfig; +import org.sensorhub.impl.service.sos.StorageDataProvider; +import org.sensorhub.impl.service.sos.StorageDataProviderConfig; +import org.sensorhub.impl.service.sos.StreamDataProviderConfig; import org.sensorhub.impl.service.sos.video.MP4Serializer; import org.sensorhub.impl.service.sos.video.MJPEGSerializer; import org.sensorhub.test.sensor.trupulse.SimulatedDataStream; @@ -87,6 +94,14 @@ public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener { + String deviceID; + String deviceName; + String runName; + + enum SimpleSensors { + Accelerometer + } + TextView textArea; SensorHubService boundService; IModuleConfigRepository sensorhubConfig; @@ -114,6 +129,13 @@ public void onServiceDisconnected(ComponentName className) protected void updateConfig(SharedPreferences prefs, String runName) { + // get device name + deviceID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); + deviceName = prefs.getString("device_name", null); + if (deviceName == null || deviceName.length() < 2) + deviceName = deviceID; + this.runName = runName; + sensorhubConfig = new InMemoryConfigDb(); // get SOS URL from config @@ -131,12 +153,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) } } - // get device name - String deviceID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); - String deviceName = prefs.getString("device_name", null); - if (deviceName == null || deviceName.length() < 2) - deviceName = deviceID; - // HTTP Server Config HttpServerConfig serverConfig = new HttpServerConfig(); serverConfig.autoStart = true; @@ -147,6 +163,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.autoStart = true; sosConfig.enableTransactional = true; + /* // Storage Config File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", "oshAndroid_h2.dat"); dbFile.getParentFile().mkdirs(); @@ -161,16 +178,17 @@ protected void updateConfig(SharedPreferences prefs, String runName) storageConfig.autoStart = true; storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); storageConfig.storagePath = dbFile.getPath(); - sosConfig.newStorageConfig = storageConfig; + sosConfig.newStorageConfig = storageConfig; // FIXME: Alex will fix this in the core. + */ // Push Sensors Config - AndroidSensorsConfig pushSensorsConfig = new AndroidSensorsConfig(); - pushSensorsConfig.id = "urn:device:android:"+deviceID; - pushSensorsConfig.name = "Android Sensors [" + deviceName + "] via SOST"; - pushSensorsConfig.autoStart = true; - pushSensorsConfig.androidContext = this.getApplicationContext(); - pushSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); - pushSensorsConfig.runName = runName; + AndroidSensorsConfig androidSensorsConfig = new AndroidSensorsConfig(); + androidSensorsConfig.id = "urn:device:android:"+deviceID; + androidSensorsConfig.name = "Android Sensors [" + deviceName + "] via SOST"; + androidSensorsConfig.autoStart = true; + androidSensorsConfig.androidContext = this.getApplicationContext(); + androidSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); + androidSensorsConfig.runName = runName; // Realtime Sensors Config AndroidSensorsConfig realtimeSensorsConfig = new AndroidSensorsConfig(); @@ -183,21 +201,26 @@ protected void updateConfig(SharedPreferences prefs, String runName) // (Simple) Sensors if (prefs.getBoolean("accelerometer_enable", false)) { - pushSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH"); - realtimeSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME"); + androidSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH"); + if (prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME")) { + addSosProviderConfig(sosConfig, SimpleSensors.Accelerometer); + } + if (prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) { + addSosStreamStorageConfig(SimpleSensors.Accelerometer); + } } if (prefs.getBoolean("gyroscope_enable", false)) { - pushSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH"); + androidSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH"); realtimeSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME"); } if (prefs.getBoolean("magnetometer_enable", false)) { - pushSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH"); + androidSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH"); realtimeSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME"); } if (prefs.getBoolean("orientation_enable", false)) { if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) { - pushSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); - pushSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); + androidSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); + androidSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); } if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME")) { realtimeSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); @@ -206,8 +229,8 @@ protected void updateConfig(SharedPreferences prefs, String runName) } if (prefs.getBoolean("location_enable", false)) { if (prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH")) { - pushSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); - pushSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); + androidSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); + androidSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); } if (prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME")) { realtimeSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); @@ -216,14 +239,18 @@ protected void updateConfig(SharedPreferences prefs, String runName) } if (prefs.getBoolean("video_enable", false)) { showVideo = true; - pushSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH"); - pushSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); + + // TODO: create androidsensorsconfig here (one with androidsensor that's going sost and one with dataprovider for local sensorhub) + androidSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH"); + androidSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); realtimeSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME"); realtimeSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); } - addSosTConfig(pushSensorsConfig, sosUser, sosPwd); - sensorhubConfig.add(pushSensorsConfig); + sensorhubConfig.add(androidSensorsConfig); + addSosTConfig(androidSensorsConfig, sosUser, sosPwd); + + /* sensorhubConfig.add(realtimeSensorsConfig); // Android Data Provider @@ -249,6 +276,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) androidStreamStorageConfig.autoPurgeConfig = autoPurgeConfig; androidStreamStorageConfig.storageConfig = storageConfig; sensorhubConfig.add(androidStreamStorageConfig); + */ // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); @@ -353,6 +381,100 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(sosConfig); } + protected void addSosStreamStorageConfig(SimpleSensors sensor) { + String sensorName = ""; + String sensorId = ""; + if (sensor.equals(SimpleSensors.Accelerometer)) { + sensorName = "Accelerometer"; + sensorId = "accelerometer"; + } + + // Sensors Config + AndroidSensorsConfig sensorConfig = new AndroidSensorsConfig(); + sensorConfig.id = "urn:device:android:sensor:"+sensorId; + sensorConfig.name = "Android " + sensorName + " Sensor (Archive)"; + sensorConfig.autoStart = true; + sensorConfig.androidContext = this.getApplicationContext(); + sensorConfig.camPreviewTexture = boundService.getVideoTexture(); + sensorConfig.runName = runName; + + if (sensor.equals(SimpleSensors.Accelerometer)) { + sensorConfig.activateAccelerometer = true; + } + sensorhubConfig.add(sensorConfig); + + // H2 Storage Config + File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", deviceID+"_"+sensorId+"_h2.dat"); + dbFile.getParentFile().mkdirs(); + if(!dbFile.exists()) { + try { + dbFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + MVStorageConfig storageConfig = new MVStorageConfig(); + storageConfig.id = "urn:storage:h2:device:android:sensor:"+sensorId; + storageConfig.moduleClass = MVObsStorageImpl.class.getCanonicalName(); + storageConfig.storagePath = dbFile.getPath(); + storageConfig.autoStart = true; + + // Stream Storage Config + MaxAgeAutoPurgeConfig autoPurgeConfig = new MaxAgeAutoPurgeConfig(); + autoPurgeConfig.enabled = true; + autoPurgeConfig.purgePeriod = 600.0; + autoPurgeConfig.maxRecordAge = 864000; + StreamStorageConfig streamStorageConfig = new StreamStorageConfig(); + streamStorageConfig.id = "urn:stream-storage:android:sensor:"+sensorId; + streamStorageConfig.name = "Android " + sensorName + " Storage"; + streamStorageConfig.moduleClass = GenericStreamStorage.class.getCanonicalName(); + streamStorageConfig.dataSourceID = sensorConfig.id; + streamStorageConfig.autoStart = true; + streamStorageConfig.processEvents = true; + streamStorageConfig.autoPurgeConfig = autoPurgeConfig; + streamStorageConfig.storageConfig = storageConfig; + sensorhubConfig.add(streamStorageConfig); + + // Storage Data Provider + SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); + dataProviderConfig.storageID = streamStorageConfig.id; + dataProviderConfig.offeringID = streamStorageConfig.id+":offering"; + dataProviderConfig.enabled = true; + } + + protected void addSosProviderConfig(SOSServiceConfig sosConfig, SimpleSensors sensor) { + String sensorName = ""; + String sensorId = ""; + if (sensor.equals(SimpleSensors.Accelerometer)) { + sensorName = "Accelerometer"; + sensorId = "accelerometer"; + } + + // Realtime Sensors Config + AndroidSensorsConfig sensorConfig = new AndroidSensorsConfig(); + sensorConfig.id = "urn:device:android:"+deviceID+":sensor:"+sensorId+":realtime"; + sensorConfig.name = "Android " + sensorName + " Sensor"; + sensorConfig.autoStart = true; + sensorConfig.androidContext = this.getApplicationContext(); + sensorConfig.camPreviewTexture = boundService.getVideoTexture(); + sensorConfig.runName = runName; + + if (sensor.equals(SimpleSensors.Accelerometer)) { + sensorConfig.activateAccelerometer = true; + } + + sensorhubConfig.add(sensorConfig); + + // Android Data Provider + SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); + dataProviderConfig.sensorID = sensorConfig.id; + dataProviderConfig.offeringID = sensorConfig.id+"-sos"; + dataProviderConfig.enabled = true; + dataProviderConfig.liveDataTimeout = 600.0; + dataProviderConfig.maxFois = 10; + + sosConfig.dataProviders.add(dataProviderConfig); + } protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sosPwd) { From 0fbb6a8c2778dad5825439bedaf58c4da98ba013 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Wed, 6 Feb 2019 09:58:02 -0600 Subject: [PATCH 020/207] test using one config for each simple sensor --- .../org/sensorhub/android/MainActivity.java | 273 +++++++++--------- 1 file changed, 136 insertions(+), 137 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 476c7f14..d618c299 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -98,8 +98,16 @@ public class MainActivity extends Activity implements TextureView.SurfaceTexture String deviceName; String runName; - enum SimpleSensors { - Accelerometer + enum Sensors { + Android, + Accelerometer, + Gyroscope, + Magnetometer, + Orientation_Quat, + Orientation_Euler, + Location_GPS, + Location_Network, + Video } TextView textArea; @@ -163,59 +171,66 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.autoStart = true; sosConfig.enableTransactional = true; - /* - // Storage Config - File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", "oshAndroid_h2.dat"); - dbFile.getParentFile().mkdirs(); - if(!dbFile.exists()) { - try { - dbFile.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - } - MVStorageConfig storageConfig = new MVStorageConfig(); - storageConfig.autoStart = true; - storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); - storageConfig.storagePath = dbFile.getPath(); - sosConfig.newStorageConfig = storageConfig; // FIXME: Alex will fix this in the core. - */ - // Push Sensors Config - AndroidSensorsConfig androidSensorsConfig = new AndroidSensorsConfig(); - androidSensorsConfig.id = "urn:device:android:"+deviceID; - androidSensorsConfig.name = "Android Sensors [" + deviceName + "] via SOST"; - androidSensorsConfig.autoStart = true; - androidSensorsConfig.androidContext = this.getApplicationContext(); - androidSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); - androidSensorsConfig.runName = runName; - - // Realtime Sensors Config - AndroidSensorsConfig realtimeSensorsConfig = new AndroidSensorsConfig(); - realtimeSensorsConfig.id = "urn:device:android-realtime:"+deviceID; - realtimeSensorsConfig.name = "Android Sensors [" + deviceName + "]"; - realtimeSensorsConfig.autoStart = true; - realtimeSensorsConfig.androidContext = this.getApplicationContext(); - realtimeSensorsConfig.camPreviewTexture = boundService.getVideoTexture(); - realtimeSensorsConfig.runName = runName; + AndroidSensorsConfig androidSensorsConfig = createSensorConfig(Sensors.Android, prefs); // (Simple) Sensors if (prefs.getBoolean("accelerometer_enable", false)) { - androidSensorsConfig.activateAccelerometer = prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH"); - if (prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME")) { - addSosProviderConfig(sosConfig, SimpleSensors.Accelerometer); - } - if (prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) { - addSosStreamStorageConfig(SimpleSensors.Accelerometer); + Set options = prefs.getStringSet("accelerometer_options", Collections.emptySet()); + + androidSensorsConfig.activateAccelerometer = options.contains("PUSH"); + if (options.contains("REALTIME")) { + AndroidSensorsConfig sensorConfig = createSensorConfig(Sensors.Accelerometer, prefs); + sensorhubConfig.add(sensorConfig); + + StreamStorageConfig streamStorageConfig = createStreamStorageConfig(sensorConfig); + sensorhubConfig.add(streamStorageConfig); + + SensorDataProviderConfig dataProviderConfig = createDataProviderConfig(sensorConfig); + + if (options.contains("ARCHIVE")) + dataProviderConfig.storageID = streamStorageConfig.id; + + sosConfig.dataProviders.add(dataProviderConfig); } } if (prefs.getBoolean("gyroscope_enable", false)) { - androidSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH"); - realtimeSensorsConfig.activateGyrometer = prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME"); + Set options = prefs.getStringSet("gyroscope_options", Collections.emptySet()); + + androidSensorsConfig.activateGyrometer = options.contains("PUSH"); + if (options.contains("REALTIME")) { + AndroidSensorsConfig sensorConfig = createSensorConfig(Sensors.Gyroscope, prefs); + sensorhubConfig.add(sensorConfig); + + StreamStorageConfig streamStorageConfig = createStreamStorageConfig(sensorConfig); + sensorhubConfig.add(streamStorageConfig); + + SensorDataProviderConfig dataProviderConfig = createDataProviderConfig(sensorConfig); + + if (options.contains("ARCHIVE")) + dataProviderConfig.storageID = streamStorageConfig.id; + + sosConfig.dataProviders.add(dataProviderConfig); + } } if (prefs.getBoolean("magnetometer_enable", false)) { - androidSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH"); - realtimeSensorsConfig.activateMagnetometer = prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME"); + Set options = prefs.getStringSet("magnetometer_options", Collections.emptySet()); + + androidSensorsConfig.activateMagnetometer = options.contains("PUSH"); + if (options.contains("REALTIME")) { + AndroidSensorsConfig sensorConfig = createSensorConfig(Sensors.Magnetometer, prefs); + sensorhubConfig.add(sensorConfig); + + StreamStorageConfig streamStorageConfig = createStreamStorageConfig(sensorConfig); + sensorhubConfig.add(streamStorageConfig); + + SensorDataProviderConfig dataProviderConfig = createDataProviderConfig(sensorConfig); + + if (options.contains("ARCHIVE")) + dataProviderConfig.storageID = streamStorageConfig.id; + + sosConfig.dataProviders.add(dataProviderConfig); + } } if (prefs.getBoolean("orientation_enable", false)) { if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) { @@ -223,8 +238,10 @@ protected void updateConfig(SharedPreferences prefs, String runName) androidSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); } if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME")) { - realtimeSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); - realtimeSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); + if (prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION")) { + } + if (prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER")) { + } } } if (prefs.getBoolean("location_enable", false)) { @@ -233,8 +250,10 @@ protected void updateConfig(SharedPreferences prefs, String runName) androidSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); } if (prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME")) { - realtimeSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); - realtimeSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); + if (prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS")) { + } + if (prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK")) { + } } } if (prefs.getBoolean("video_enable", false)) { @@ -243,41 +262,13 @@ protected void updateConfig(SharedPreferences prefs, String runName) // TODO: create androidsensorsconfig here (one with androidsensor that's going sost and one with dataprovider for local sensorhub) androidSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH"); androidSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); - realtimeSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME"); - realtimeSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); +// realtimeSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME"); +// realtimeSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); } sensorhubConfig.add(androidSensorsConfig); addSosTConfig(androidSensorsConfig, sosUser, sosPwd); - /* - sensorhubConfig.add(realtimeSensorsConfig); - - // Android Data Provider - SensorDataProviderConfig androidDataProviderConfig = new SensorDataProviderConfig(); - androidDataProviderConfig.sensorID = realtimeSensorsConfig.id; - androidDataProviderConfig.offeringID = realtimeSensorsConfig.id+"-sos"; - androidDataProviderConfig.storageID = realtimeSensorsConfig.id+"#storage"; - androidDataProviderConfig.enabled = true; - androidDataProviderConfig.liveDataTimeout = 600.0; - androidDataProviderConfig.maxFois = 10; - sosConfig.dataProviders.add(androidDataProviderConfig); - - // Android Stream Storage - MaxAgeAutoPurgeConfig autoPurgeConfig = new MaxAgeAutoPurgeConfig(); - autoPurgeConfig.enabled = true; - autoPurgeConfig.purgePeriod = 600.0; - StreamStorageConfig androidStreamStorageConfig = new StreamStorageConfig(); - androidStreamStorageConfig.moduleClass = GenericStreamStorage.class.getCanonicalName(); - androidStreamStorageConfig.name = "Android Sensor Storage"; - androidStreamStorageConfig.id = androidDataProviderConfig.storageID; - androidStreamStorageConfig.dataSourceID = realtimeSensorsConfig.id; - androidStreamStorageConfig.autoStart = true; - androidStreamStorageConfig.autoPurgeConfig = autoPurgeConfig; - androidStreamStorageConfig.storageConfig = storageConfig; - sensorhubConfig.add(androidStreamStorageConfig); - */ - // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); if (enabled) @@ -381,30 +372,21 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(sosConfig); } - protected void addSosStreamStorageConfig(SimpleSensors sensor) { - String sensorName = ""; - String sensorId = ""; - if (sensor.equals(SimpleSensors.Accelerometer)) { - sensorName = "Accelerometer"; - sensorId = "accelerometer"; - } - - // Sensors Config - AndroidSensorsConfig sensorConfig = new AndroidSensorsConfig(); - sensorConfig.id = "urn:device:android:sensor:"+sensorId; - sensorConfig.name = "Android " + sensorName + " Sensor (Archive)"; - sensorConfig.autoStart = true; - sensorConfig.androidContext = this.getApplicationContext(); - sensorConfig.camPreviewTexture = boundService.getVideoTexture(); - sensorConfig.runName = runName; + private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig sensorConfig) { + SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); + dataProviderConfig.offeringID = sensorConfig.id+":offering"; + dataProviderConfig.sensorID = sensorConfig.id; + dataProviderConfig.enabled = true; + dataProviderConfig.liveDataTimeout = 600.0; + dataProviderConfig.maxFois = 10; - if (sensor.equals(SimpleSensors.Accelerometer)) { - sensorConfig.activateAccelerometer = true; - } - sensorhubConfig.add(sensorConfig); + return dataProviderConfig; + } + private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig sensorConfig) { // H2 Storage Config - File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", deviceID+"_"+sensorId+"_h2.dat"); + File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", + deviceID+"_"+sensorConfig.name.replace(" ", "")+"_h2.dat"); dbFile.getParentFile().mkdirs(); if(!dbFile.exists()) { try { @@ -414,66 +396,83 @@ protected void addSosStreamStorageConfig(SimpleSensors sensor) { } } MVStorageConfig storageConfig = new MVStorageConfig(); - storageConfig.id = "urn:storage:h2:device:android:sensor:"+sensorId; - storageConfig.moduleClass = MVObsStorageImpl.class.getCanonicalName(); + storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); storageConfig.storagePath = dbFile.getPath(); storageConfig.autoStart = true; + storageConfig.memoryCacheSize = 102400; + storageConfig.autoCommitBufferSize = 1024; - // Stream Storage Config + // Auto Purge Config MaxAgeAutoPurgeConfig autoPurgeConfig = new MaxAgeAutoPurgeConfig(); autoPurgeConfig.enabled = true; autoPurgeConfig.purgePeriod = 600.0; autoPurgeConfig.maxRecordAge = 864000; + + // Stream Storage Config StreamStorageConfig streamStorageConfig = new StreamStorageConfig(); - streamStorageConfig.id = "urn:stream-storage:android:sensor:"+sensorId; - streamStorageConfig.name = "Android " + sensorName + " Storage"; streamStorageConfig.moduleClass = GenericStreamStorage.class.getCanonicalName(); + streamStorageConfig.id = sensorConfig.id + ":stream-storage"; + streamStorageConfig.name = sensorConfig.name + " Storage"; streamStorageConfig.dataSourceID = sensorConfig.id; streamStorageConfig.autoStart = true; streamStorageConfig.processEvents = true; + streamStorageConfig.minCommitPeriod = 10000; streamStorageConfig.autoPurgeConfig = autoPurgeConfig; streamStorageConfig.storageConfig = storageConfig; - sensorhubConfig.add(streamStorageConfig); - - // Storage Data Provider - SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); - dataProviderConfig.storageID = streamStorageConfig.id; - dataProviderConfig.offeringID = streamStorageConfig.id+":offering"; - dataProviderConfig.enabled = true; + return streamStorageConfig; } - protected void addSosProviderConfig(SOSServiceConfig sosConfig, SimpleSensors sensor) { + private AndroidSensorsConfig createSensorConfig(Sensors sensor, SharedPreferences prefs) { String sensorName = ""; String sensorId = ""; - if (sensor.equals(SimpleSensors.Accelerometer)) { - sensorName = "Accelerometer"; - sensorId = "accelerometer"; - } - // Realtime Sensors Config + // Sensor Config AndroidSensorsConfig sensorConfig = new AndroidSensorsConfig(); - sensorConfig.id = "urn:device:android:"+deviceID+":sensor:"+sensorId+":realtime"; - sensorConfig.name = "Android " + sensorName + " Sensor"; - sensorConfig.autoStart = true; - sensorConfig.androidContext = this.getApplicationContext(); - sensorConfig.camPreviewTexture = boundService.getVideoTexture(); - sensorConfig.runName = runName; - if (sensor.equals(SimpleSensors.Accelerometer)) { + if (Sensors.Android.equals(sensor)) { + sensorName = "Sensors [" + deviceName + "]"; + } else if (Sensors.Accelerometer.equals(sensor)) { + sensorName = "Accelerometer Sensor"; + sensorId = ":sensor:accelerometer"; sensorConfig.activateAccelerometer = true; + } else if (Sensors.Gyroscope.equals(sensor)) { + sensorName = "Gyroscope Sensor"; + sensorId = ":sensor:gyroscope"; + sensorConfig.activateGyrometer = true; + } else if (Sensors.Magnetometer.equals(sensor)) { + sensorName = "Magnetometer Sensor"; + sensorId = ":sensor:magnetometer"; + sensorConfig.activateMagnetometer = true; + } else if (Sensors.Orientation_Quat.equals(sensor)) { + sensorName = "Quaternion Orientation Sensor"; + sensorId = ":sensor:orientationQuaternion"; + sensorConfig.activateOrientationQuat = true; + } else if (Sensors.Orientation_Euler.equals(sensor)) { + sensorName = "Euler Orientation Sensor"; + sensorId = ":sensor:orientationEuler"; + sensorConfig.activateOrientationEuler = true; + } else if (Sensors.Location_GPS.equals(sensor)) { + sensorName = "GPS Location Sensor"; + sensorId = ":sensor:locationGps"; + sensorConfig.activateGpsLocation = true; + } else if (Sensors.Location_Network.equals(sensor)) { + sensorName = "Network Location Sensor"; + sensorId = ":sensor:locationNetwork"; + sensorConfig.activateNetworkLocation = true; + } else if (Sensors.Video.equals(sensor)) { + sensorName = "Video Sensor"; + sensorId = ":sensor:video"; + sensorConfig.activateBackCamera = true; + sensorConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); } - sensorhubConfig.add(sensorConfig); - - // Android Data Provider - SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); - dataProviderConfig.sensorID = sensorConfig.id; - dataProviderConfig.offeringID = sensorConfig.id+"-sos"; - dataProviderConfig.enabled = true; - dataProviderConfig.liveDataTimeout = 600.0; - dataProviderConfig.maxFois = 10; - - sosConfig.dataProviders.add(dataProviderConfig); + sensorConfig.id = "urn:device:android:"+deviceID+sensorId; + sensorConfig.name = "Android " + sensorName; + sensorConfig.autoStart = true; + sensorConfig.androidContext = this.getApplicationContext(); + sensorConfig.camPreviewTexture = boundService.getVideoTexture(); + sensorConfig.runName = runName+"_"+sensorId; + return sensorConfig; } protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sosPwd) From b365ec0ea7209b567f8651010d8c7a935bbb1796 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Wed, 6 Feb 2019 10:46:19 -0600 Subject: [PATCH 021/207] test using one config only --- .../org/sensorhub/android/MainActivity.java | 49 +++++-------------- 1 file changed, 13 insertions(+), 36 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index d618c299..ba3b7fef 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -176,6 +176,9 @@ protected void updateConfig(SharedPreferences prefs, String runName) // (Simple) Sensors if (prefs.getBoolean("accelerometer_enable", false)) { + androidSensorsConfig.activateAccelerometer = true; + + /* TODO: Remove me if single sensor doesn't work... Set options = prefs.getStringSet("accelerometer_options", Collections.emptySet()); androidSensorsConfig.activateAccelerometer = options.contains("PUSH"); @@ -193,44 +196,13 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.dataProviders.add(dataProviderConfig); } + */ } if (prefs.getBoolean("gyroscope_enable", false)) { - Set options = prefs.getStringSet("gyroscope_options", Collections.emptySet()); - - androidSensorsConfig.activateGyrometer = options.contains("PUSH"); - if (options.contains("REALTIME")) { - AndroidSensorsConfig sensorConfig = createSensorConfig(Sensors.Gyroscope, prefs); - sensorhubConfig.add(sensorConfig); - - StreamStorageConfig streamStorageConfig = createStreamStorageConfig(sensorConfig); - sensorhubConfig.add(streamStorageConfig); - - SensorDataProviderConfig dataProviderConfig = createDataProviderConfig(sensorConfig); - - if (options.contains("ARCHIVE")) - dataProviderConfig.storageID = streamStorageConfig.id; - - sosConfig.dataProviders.add(dataProviderConfig); - } + androidSensorsConfig.activateGyrometer = true; } if (prefs.getBoolean("magnetometer_enable", false)) { - Set options = prefs.getStringSet("magnetometer_options", Collections.emptySet()); - - androidSensorsConfig.activateMagnetometer = options.contains("PUSH"); - if (options.contains("REALTIME")) { - AndroidSensorsConfig sensorConfig = createSensorConfig(Sensors.Magnetometer, prefs); - sensorhubConfig.add(sensorConfig); - - StreamStorageConfig streamStorageConfig = createStreamStorageConfig(sensorConfig); - sensorhubConfig.add(streamStorageConfig); - - SensorDataProviderConfig dataProviderConfig = createDataProviderConfig(sensorConfig); - - if (options.contains("ARCHIVE")) - dataProviderConfig.storageID = streamStorageConfig.id; - - sosConfig.dataProviders.add(dataProviderConfig); - } + androidSensorsConfig.activateMagnetometer = true; } if (prefs.getBoolean("orientation_enable", false)) { if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) { @@ -269,6 +241,12 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(androidSensorsConfig); addSosTConfig(androidSensorsConfig, sosUser, sosPwd); + StreamStorageConfig androidStreamStorageConfig = createStreamStorageConfig(androidSensorsConfig); + sensorhubConfig.add(androidStreamStorageConfig); + SensorDataProviderConfig androidDataProviderConfig = createDataProviderConfig(androidSensorsConfig); + androidDataProviderConfig.storageID = androidStreamStorageConfig.id; + sosConfig.dataProviders.add(androidDataProviderConfig); + // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); if (enabled) @@ -385,8 +363,7 @@ private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig s private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig sensorConfig) { // H2 Storage Config - File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", - deviceID+"_"+sensorConfig.name.replace(" ", "")+"_h2.dat"); + File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", deviceID+"_h2.dat"); dbFile.getParentFile().mkdirs(); if(!dbFile.exists()) { try { From 1be92779b91775215a171381d69618fb38c32243 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Wed, 6 Feb 2019 14:11:32 -0600 Subject: [PATCH 022/207] use one androidSensorsConfig --- .../org/sensorhub/android/MainActivity.java | 61 +++---------------- 1 file changed, 7 insertions(+), 54 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index ba3b7fef..77f21081 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -174,68 +174,21 @@ protected void updateConfig(SharedPreferences prefs, String runName) // Push Sensors Config AndroidSensorsConfig androidSensorsConfig = createSensorConfig(Sensors.Android, prefs); - // (Simple) Sensors - if (prefs.getBoolean("accelerometer_enable", false)) { - androidSensorsConfig.activateAccelerometer = true; - - /* TODO: Remove me if single sensor doesn't work... - Set options = prefs.getStringSet("accelerometer_options", Collections.emptySet()); - - androidSensorsConfig.activateAccelerometer = options.contains("PUSH"); - if (options.contains("REALTIME")) { - AndroidSensorsConfig sensorConfig = createSensorConfig(Sensors.Accelerometer, prefs); - sensorhubConfig.add(sensorConfig); - - StreamStorageConfig streamStorageConfig = createStreamStorageConfig(sensorConfig); - sensorhubConfig.add(streamStorageConfig); - - SensorDataProviderConfig dataProviderConfig = createDataProviderConfig(sensorConfig); - - if (options.contains("ARCHIVE")) - dataProviderConfig.storageID = streamStorageConfig.id; - - sosConfig.dataProviders.add(dataProviderConfig); - } - */ - } - if (prefs.getBoolean("gyroscope_enable", false)) { - androidSensorsConfig.activateGyrometer = true; - } - if (prefs.getBoolean("magnetometer_enable", false)) { - androidSensorsConfig.activateMagnetometer = true; - } + androidSensorsConfig.activateAccelerometer = prefs.getBoolean("accelerometer_enable", false); + androidSensorsConfig.activateGyrometer = prefs.getBoolean("gyroscope_enable", false); + androidSensorsConfig.activateMagnetometer = prefs.getBoolean("magnetometer_enable", false); if (prefs.getBoolean("orientation_enable", false)) { - if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) { - androidSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); - androidSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); - } - if (prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME")) { - if (prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION")) { - } - if (prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER")) { - } - } + androidSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); + androidSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); } if (prefs.getBoolean("location_enable", false)) { - if (prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH")) { - androidSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); - androidSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); - } - if (prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME")) { - if (prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS")) { - } - if (prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK")) { - } - } + androidSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); + androidSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); } if (prefs.getBoolean("video_enable", false)) { showVideo = true; - - // TODO: create androidsensorsconfig here (one with androidsensor that's going sost and one with dataprovider for local sensorhub) androidSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH"); androidSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); -// realtimeSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME"); -// realtimeSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); } sensorhubConfig.add(androidSensorsConfig); From 9b8a9d5538cb3f99728ca8427000fd25f6133650 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Wed, 6 Feb 2019 17:01:01 -0600 Subject: [PATCH 023/207] cronjob --- .../org/sensorhub/android/MainActivity.java | 228 +++++++++--------- 1 file changed, 112 insertions(+), 116 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 77f21081..6622ceee 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -100,14 +100,10 @@ public class MainActivity extends Activity implements TextureView.SurfaceTexture enum Sensors { Android, - Accelerometer, - Gyroscope, - Magnetometer, - Orientation_Quat, - Orientation_Euler, - Location_GPS, - Location_Network, - Video + TruPulse, + TruPulseSim, + Angel, + FlirOne, } TextView textArea; @@ -150,7 +146,8 @@ protected void updateConfig(SharedPreferences prefs, String runName) String sosUriConfig = prefs.getString("sos_uri", ""); String sosUser = prefs.getString("sos_username", null); String sosPwd = prefs.getString("sos_password", null); - if (sosUriConfig != null && sosUriConfig.trim().length() > 0) { + if (sosUriConfig != null && sosUriConfig.trim().length() > 0) + { try { sosUrl = new URL(sosUriConfig); @@ -172,22 +169,25 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.enableTransactional = true; // Push Sensors Config - AndroidSensorsConfig androidSensorsConfig = createSensorConfig(Sensors.Android, prefs); + AndroidSensorsConfig androidSensorsConfig = (AndroidSensorsConfig) createSensorConfig(Sensors.Android); androidSensorsConfig.activateAccelerometer = prefs.getBoolean("accelerometer_enable", false); androidSensorsConfig.activateGyrometer = prefs.getBoolean("gyroscope_enable", false); androidSensorsConfig.activateMagnetometer = prefs.getBoolean("magnetometer_enable", false); - if (prefs.getBoolean("orientation_enable", false)) { + if (prefs.getBoolean("orientation_enable", false)) + { androidSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); androidSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); } - if (prefs.getBoolean("location_enable", false)) { + if (prefs.getBoolean("location_enable", false)) + { androidSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); androidSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); } - if (prefs.getBoolean("video_enable", false)) { + if (prefs.getBoolean("video_enable", false)) + { showVideo = true; - androidSensorsConfig.activateBackCamera = prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH"); + androidSensorsConfig.activateBackCamera = true; androidSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); } @@ -196,6 +196,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) StreamStorageConfig androidStreamStorageConfig = createStreamStorageConfig(androidSensorsConfig); sensorhubConfig.add(androidStreamStorageConfig); + SensorDataProviderConfig androidDataProviderConfig = createDataProviderConfig(androidSensorsConfig); androidDataProviderConfig.storageID = androidStreamStorageConfig.id; sosConfig.dataProviders.add(androidDataProviderConfig); @@ -204,77 +205,34 @@ protected void updateConfig(SharedPreferences prefs, String runName) boolean enabled = prefs.getBoolean("trupulse_enabled", false); if (enabled) { - TruPulseConfig trupulseConfig = new TruPulseConfig(); - trupulseConfig.id = "TRUPULSE_SENSOR"; - trupulseConfig.name = "TruPulse Range Finder [" + deviceName + "]"; - trupulseConfig.autoStart = true; - trupulseConfig.serialNumber = deviceID; - BluetoothCommProviderConfig btConf = new BluetoothCommProviderConfig(); - btConf.protocol.deviceName = "TP360RB.*"; - if (prefs.getBoolean("trupulse_simu", false)) - btConf.moduleClass = SimulatedDataStream.class.getCanonicalName(); - else - btConf.moduleClass = BluetoothCommProvider.class.getCanonicalName(); - trupulseConfig.commSettings = btConf; - sensorhubConfig.add(trupulseConfig); - addSosTConfig(trupulseConfig, sosUser, sosPwd); - - - SensorDataProviderConfig trupulseDataProviderConfig = new SensorDataProviderConfig(); - trupulseDataProviderConfig.sensorID = trupulseConfig.id; - trupulseDataProviderConfig.offeringID = trupulseConfig.id+"-sos"; - trupulseDataProviderConfig.enabled = true; - sosConfig.dataProviders.add(trupulseDataProviderConfig); + TruPulseConfig truPulseConfig= prefs.getBoolean("trupulse_simu", false) + ? (TruPulseConfig) createSensorConfig(Sensors.TruPulse) + : (TruPulseConfig) createSensorConfig(Sensors.TruPulse); + sensorhubConfig.add(truPulseConfig); + addSosTConfig(truPulseConfig, sosUser, sosPwd); } // AngelSensor enabled = prefs.getBoolean("angel_enabled", false); if (enabled) { - BleConfig bleConf = new BleConfig(); - bleConf.id = "BLE"; - bleConf.moduleClass = BleNetwork.class.getCanonicalName(); - bleConf.androidContext = this.getApplicationContext(); - bleConf.autoStart = true; - sensorhubConfig.add(bleConf); - - AngelSensorConfig angelConfig = new AngelSensorConfig(); - angelConfig.id = "ANGEL_SENSOR"; - angelConfig.name = "Angel Sensor [" + deviceName + "]"; - angelConfig.autoStart = true; - angelConfig.networkID = bleConf.id; + AngelSensorConfig angelConfig = (AngelSensorConfig) createSensorConfig(Sensors.Angel); //angelConfig.btAddress = "00:07:80:79:04:AF"; // mike //angelConfig.btAddress = "00:07:80:03:0E:0A"; // alex angelConfig.btAddress = prefs.getString("angel_address", null); sensorhubConfig.add(angelConfig); addSosTConfig(angelConfig, sosUser, sosPwd); - - SensorDataProviderConfig angelDataProviderConfig = new SensorDataProviderConfig(); - angelDataProviderConfig.sensorID = angelConfig.id; - angelDataProviderConfig.offeringID = angelConfig.id+"-sos"; - angelDataProviderConfig.enabled = true; - sosConfig.dataProviders.add(angelDataProviderConfig); } // FLIR One sensor enabled = prefs.getBoolean("flirone_enabled", false); if (enabled) { - FlirOneCameraConfig flironeConfig = new FlirOneCameraConfig(); - flironeConfig.id = "FLIRONE_SENSOR"; - flironeConfig.name = "FLIR One Camera [" + deviceName + "]"; - flironeConfig.autoStart = true; - flironeConfig.androidContext = this.getApplicationContext(); - flironeConfig.camPreviewTexture = boundService.getVideoTexture(); showVideo = true; + + FlirOneCameraConfig flironeConfig = (FlirOneCameraConfig) createSensorConfig(Sensors.FlirOne); sensorhubConfig.add(flironeConfig); addSosTConfig(flironeConfig, sosUser, sosPwd); - - SensorDataProviderConfig flironeDataProviderConfig = new SensorDataProviderConfig(); - flironeDataProviderConfig.sensorID = flironeConfig.id; - flironeDataProviderConfig.offeringID = flironeConfig.id+"-sos"; - flironeDataProviderConfig.enabled = true; - sosConfig.dataProviders.add(flironeDataProviderConfig); } /* @@ -318,10 +276,14 @@ private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig senso // H2 Storage Config File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", deviceID+"_h2.dat"); dbFile.getParentFile().mkdirs(); - if(!dbFile.exists()) { - try { + if(!dbFile.exists()) + { + try + { dbFile.createNewFile(); - } catch (IOException e) { + } + catch (IOException e) + { e.printStackTrace(); } } @@ -352,59 +314,85 @@ private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig senso return streamStorageConfig; } - private AndroidSensorsConfig createSensorConfig(Sensors sensor, SharedPreferences prefs) { - String sensorName = ""; - String sensorId = ""; - - // Sensor Config - AndroidSensorsConfig sensorConfig = new AndroidSensorsConfig(); - - if (Sensors.Android.equals(sensor)) { - sensorName = "Sensors [" + deviceName + "]"; - } else if (Sensors.Accelerometer.equals(sensor)) { - sensorName = "Accelerometer Sensor"; - sensorId = ":sensor:accelerometer"; - sensorConfig.activateAccelerometer = true; - } else if (Sensors.Gyroscope.equals(sensor)) { - sensorName = "Gyroscope Sensor"; - sensorId = ":sensor:gyroscope"; - sensorConfig.activateGyrometer = true; - } else if (Sensors.Magnetometer.equals(sensor)) { - sensorName = "Magnetometer Sensor"; - sensorId = ":sensor:magnetometer"; - sensorConfig.activateMagnetometer = true; - } else if (Sensors.Orientation_Quat.equals(sensor)) { - sensorName = "Quaternion Orientation Sensor"; - sensorId = ":sensor:orientationQuaternion"; - sensorConfig.activateOrientationQuat = true; - } else if (Sensors.Orientation_Euler.equals(sensor)) { - sensorName = "Euler Orientation Sensor"; - sensorId = ":sensor:orientationEuler"; - sensorConfig.activateOrientationEuler = true; - } else if (Sensors.Location_GPS.equals(sensor)) { - sensorName = "GPS Location Sensor"; - sensorId = ":sensor:locationGps"; - sensorConfig.activateGpsLocation = true; - } else if (Sensors.Location_Network.equals(sensor)) { - sensorName = "Network Location Sensor"; - sensorId = ":sensor:locationNetwork"; - sensorConfig.activateNetworkLocation = true; - } else if (Sensors.Video.equals(sensor)) { - sensorName = "Video Sensor"; - sensorId = ":sensor:video"; - sensorConfig.activateBackCamera = true; - sensorConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); + private SensorConfig createSensorConfig(Sensors sensor) { + SensorConfig sensorConfig; + if (Sensors.Android.equals(sensor)) + { + sensorConfig = new AndroidSensorsConfig(); + sensorConfig.id = "urn:device:android:" + deviceID; + sensorConfig.name = "Android Sensors [" + deviceName + "]"; + sensorConfig.autoStart = true; + + ((AndroidSensorsConfig) sensorConfig).androidContext = this.getApplicationContext(); + ((AndroidSensorsConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); + ((AndroidSensorsConfig) sensorConfig).runName = runName; + } + else if (Sensors.TruPulse.equals(sensor)) + { + sensorConfig = new TruPulseConfig(); + sensorConfig.id = "TRUPULSE_SENSOR"; + sensorConfig.name = "TruPulse Range Finder [" + deviceName + "]"; + sensorConfig.autoStart = true; + + BluetoothCommProviderConfig btConf = new BluetoothCommProviderConfig(); + btConf.protocol.deviceName = "TP360RB.*"; + btConf.moduleClass = BluetoothCommProvider.class.getCanonicalName(); + ((TruPulseConfig) sensorConfig).commSettings = btConf; + ((TruPulseConfig) sensorConfig).serialNumber = deviceID; + } + else if (Sensors.TruPulseSim.equals(sensor)) + { + sensorConfig = new TruPulseConfig(); + sensorConfig.id = "TRUPULSE_SENSOR_SIMULATED"; + sensorConfig.name = "Simulated TruPulse Range Finder [" + deviceName + "]"; + sensorConfig.autoStart = true; + + BluetoothCommProviderConfig btConf = new BluetoothCommProviderConfig(); + btConf.protocol.deviceName = "TP360RB.*"; + btConf.moduleClass = SimulatedDataStream.class.getCanonicalName(); + ((TruPulseConfig) sensorConfig).commSettings = btConf; + ((TruPulseConfig) sensorConfig).serialNumber = deviceID; + } + else if (Sensors.Angel.equals(sensor)) + { + sensorConfig = new AngelSensorConfig(); + sensorConfig.id = "ANGEL_SENSOR"; + sensorConfig.name = "Angel Sensor [" + deviceName + "]"; + sensorConfig.autoStart = true; + + BleConfig bleConf = new BleConfig(); + bleConf.id = "BLE"; + bleConf.moduleClass = BleNetwork.class.getCanonicalName(); + bleConf.androidContext = this.getApplicationContext(); + bleConf.autoStart = true; + sensorhubConfig.add(bleConf); + + ((AngelSensorConfig) sensorConfig).networkID = bleConf.id; + } + else if (Sensors.FlirOne.equals(sensor)) + { + sensorConfig = new FlirOneCameraConfig(); + sensorConfig.id = "FLIRONE_SENSOR"; + sensorConfig.name = "FLIR One Camera [" + deviceName + "]"; + sensorConfig.autoStart = true; + + ((FlirOneCameraConfig) sensorConfig).androidContext = this.getApplicationContext(); + ((FlirOneCameraConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); + } + else + { + sensorConfig = new SensorConfig(); } - sensorConfig.id = "urn:device:android:"+deviceID+sensorId; - sensorConfig.name = "Android " + sensorName; - sensorConfig.autoStart = true; - sensorConfig.androidContext = this.getApplicationContext(); - sensorConfig.camPreviewTexture = boundService.getVideoTexture(); - sensorConfig.runName = runName+"_"+sensorId; return sensorConfig; } + protected void addStorageConfig() { + } + + protected void addSosServerConfig() { + } + protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sosPwd) { if (sosUrl == null) @@ -424,6 +412,14 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos sosConfig.connection.connectTimeout = 10000; sosConfig.connection.usePersistentConnection = true; sosConfig.connection.reconnectAttempts = 9; + + if (sensorConf instanceof AndroidSensorsConfig) + { + /* + sosConfig.excludeOutputs.add( + */ + } + sensorhubConfig.add(sosConfig); } From 4e71054fcc8bebba23879bc576e804caeebd96a4 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Fri, 8 Feb 2019 11:53:44 -0600 Subject: [PATCH 024/207] add methods for addStorageConfig and addSosServerConfig --- .../org/sensorhub/android/MainActivity.java | 152 ++++++++++++++++-- 1 file changed, 142 insertions(+), 10 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 6622ceee..712a16ec 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -31,6 +31,7 @@ import java.util.Map.Entry; import java.util.Set; +import android.hardware.Sensor; import android.util.Log; import android.view.*; @@ -43,6 +44,7 @@ import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleEvent; +import org.sensorhub.api.persistence.StorageConfig; import org.sensorhub.api.sensor.ISensorDataInterface; import org.sensorhub.api.sensor.SensorConfig; import org.sensorhub.impl.client.sost.SOSTClient; @@ -104,6 +106,7 @@ enum Sensors { TruPulseSim, Angel, FlirOne, + DJIDrone } TextView textArea; @@ -187,6 +190,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) if (prefs.getBoolean("video_enable", false)) { showVideo = true; + androidSensorsConfig.activateBackCamera = true; androidSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); } @@ -195,11 +199,11 @@ protected void updateConfig(SharedPreferences prefs, String runName) addSosTConfig(androidSensorsConfig, sosUser, sosPwd); StreamStorageConfig androidStreamStorageConfig = createStreamStorageConfig(androidSensorsConfig); - sensorhubConfig.add(androidStreamStorageConfig); + addStorageConfig(androidSensorsConfig, androidStreamStorageConfig); SensorDataProviderConfig androidDataProviderConfig = createDataProviderConfig(androidSensorsConfig); androidDataProviderConfig.storageID = androidStreamStorageConfig.id; - sosConfig.dataProviders.add(androidDataProviderConfig); + addSosServerConfig(sosConfig, androidDataProviderConfig, androidSensorsConfig); // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); @@ -261,7 +265,8 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(sosConfig); } - private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig sensorConfig) { + private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig sensorConfig) + { SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); dataProviderConfig.offeringID = sensorConfig.id+":offering"; dataProviderConfig.sensorID = sensorConfig.id; @@ -272,7 +277,8 @@ private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig s return dataProviderConfig; } - private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig sensorConfig) { + private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig sensorConfig) + { // H2 Storage Config File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", deviceID+"_h2.dat"); dbFile.getParentFile().mkdirs(); @@ -314,7 +320,8 @@ private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig senso return streamStorageConfig; } - private SensorConfig createSensorConfig(Sensors sensor) { + private SensorConfig createSensorConfig(Sensors sensor) + { SensorConfig sensorConfig; if (Sensors.Android.equals(sensor)) { @@ -387,10 +394,101 @@ else if (Sensors.FlirOne.equals(sensor)) return sensorConfig; } - protected void addStorageConfig() { + protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig storageConf) + { + if (sensorConf instanceof AndroidSensorsConfig) + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + + String sensorName = ""; + if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) + { + storageConf.excludedOutputs.add(sensorName); + } + if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) + { + storageConf.excludedOutputs.add(sensorName); + } + if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) + { + storageConf.excludedOutputs.add(sensorName); + } + if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + { + if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) + { + storageConf.excludedOutputs.add(sensorName); + } + if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) + { + storageConf.excludedOutputs.add(sensorName); + } + } + if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE")) + { + if (((AndroidSensorsConfig) sensorConf).activateGpsLocation) + { + storageConf.excludedOutputs.add(sensorName); + } + if (((AndroidSensorsConfig) sensorConf).activateNetworkLocation) + { + storageConf.excludedOutputs.add(sensorName); + } + } + if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) + { + storageConf.excludedOutputs.add(sensorName); + } + } + + sensorhubConfig.add(storageConf); } - protected void addSosServerConfig() { + protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderConfig dataProviderConf, SensorConfig sensorConf) + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + + String sensorName = ""; + if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME")) + { + dataProviderConf.excludedOutputs.add(sensorName); + } + if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME")) + { + dataProviderConf.excludedOutputs.add(sensorName); + } + if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME")) + { + dataProviderConf.excludedOutputs.add(sensorName); + } + if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME")) + { + if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) + { + dataProviderConf.excludedOutputs.add(sensorName); + } + if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) + { + dataProviderConf.excludedOutputs.add(sensorName); + } + } + if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME")) + { + if (((AndroidSensorsConfig) sensorConf).activateGpsLocation) + { + dataProviderConf.excludedOutputs.add(sensorName); + } + if (((AndroidSensorsConfig) sensorConf).activateNetworkLocation) + { + dataProviderConf.excludedOutputs.add(sensorName); + } + } + if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME")) + { + dataProviderConf.excludedOutputs.add(sensorName); + } + + sosConf.dataProviders.add(dataProviderConf); } protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sosPwd) @@ -415,9 +513,43 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos if (sensorConf instanceof AndroidSensorsConfig) { - /* - sosConfig.excludeOutputs.add( - */ + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + + String sensorName; + if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH")) + { + sensorName = Sensor.STRING_TYPE_ACCELEROMETER.replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + } + if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH")) + { + sensorName = Sensor.STRING_TYPE_GYROSCOPE.replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + } + if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH")) + { + sensorName = Sensor.STRING_TYPE_MAGNETIC_FIELD.replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + } + if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) + { + if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) + { + sensorName = "quat_orientation_data"; + sosConfig.excludedOutputs.add(sensorName); + } + if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) + { + sensorName = "euler_orientation_data"; + sosConfig.excludedOutputs.add(sensorName); + } + } + if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH")) + { + } + if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH")) + { + } } sensorhubConfig.add(sosConfig); From eaf279d0c9c34a9b57ac64fbc18342feab74a5ef Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Fri, 8 Feb 2019 11:56:37 -0600 Subject: [PATCH 025/207] add methods for addStorageConfig and addSosServerConfig --- .../org/sensorhub/android/MainActivity.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 712a16ec..69595be1 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -449,19 +449,27 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); String sensorName = ""; - if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME")) + if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE") + ) { dataProviderConf.excludedOutputs.add(sensorName); } - if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME")) + if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE") + ) { dataProviderConf.excludedOutputs.add(sensorName); } - if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME")) + if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE") + ) { dataProviderConf.excludedOutputs.add(sensorName); } - if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME")) + if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE") + ) { if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) { @@ -472,7 +480,9 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo dataProviderConf.excludedOutputs.add(sensorName); } } - if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME")) + if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE") + ) { if (((AndroidSensorsConfig) sensorConf).activateGpsLocation) { @@ -483,7 +493,9 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo dataProviderConf.excludedOutputs.add(sensorName); } } - if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME")) + if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE") + ) { dataProviderConf.excludedOutputs.add(sensorName); } From b7132abb4ccd56ae2a3f7870f1baf1fa2c414430 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 11 Feb 2019 09:38:13 -0600 Subject: [PATCH 026/207] comment out for testing --- .../org/sensorhub/android/MainActivity.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 69595be1..0aff9cc6 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -403,41 +403,41 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto String sensorName = ""; if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) { - storageConf.excludedOutputs.add(sensorName); +// storageConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) { - storageConf.excludedOutputs.add(sensorName); +// storageConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) { - storageConf.excludedOutputs.add(sensorName); +// storageConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) { if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) { - storageConf.excludedOutputs.add(sensorName); +// storageConf.excludedOutputs.add(sensorName); } if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) { - storageConf.excludedOutputs.add(sensorName); +// storageConf.excludedOutputs.add(sensorName); } } if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE")) { if (((AndroidSensorsConfig) sensorConf).activateGpsLocation) { - storageConf.excludedOutputs.add(sensorName); +// storageConf.excludedOutputs.add(sensorName); } if (((AndroidSensorsConfig) sensorConf).activateNetworkLocation) { - storageConf.excludedOutputs.add(sensorName); +// storageConf.excludedOutputs.add(sensorName); } } if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) { - storageConf.excludedOutputs.add(sensorName); +// storageConf.excludedOutputs.add(sensorName); } } @@ -453,19 +453,19 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE") ) { - dataProviderConf.excludedOutputs.add(sensorName); +// dataProviderConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME") || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE") ) { - dataProviderConf.excludedOutputs.add(sensorName); +// dataProviderConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME") || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE") ) { - dataProviderConf.excludedOutputs.add(sensorName); +// dataProviderConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME") || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE") @@ -473,11 +473,11 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo { if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) { - dataProviderConf.excludedOutputs.add(sensorName); +// dataProviderConf.excludedOutputs.add(sensorName); } if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) { - dataProviderConf.excludedOutputs.add(sensorName); +// dataProviderConf.excludedOutputs.add(sensorName); } } if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME") @@ -486,18 +486,18 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo { if (((AndroidSensorsConfig) sensorConf).activateGpsLocation) { - dataProviderConf.excludedOutputs.add(sensorName); +// dataProviderConf.excludedOutputs.add(sensorName); } if (((AndroidSensorsConfig) sensorConf).activateNetworkLocation) { - dataProviderConf.excludedOutputs.add(sensorName); +// dataProviderConf.excludedOutputs.add(sensorName); } } if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME") || !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE") ) { - dataProviderConf.excludedOutputs.add(sensorName); +// dataProviderConf.excludedOutputs.add(sensorName); } sosConf.dataProviders.add(dataProviderConf); From 8b198fdefce8e226cbdfa38062e110c0339de66d Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 11 Feb 2019 11:14:44 -0600 Subject: [PATCH 027/207] example for receiving org.sofwerx.ogc.ACTION_SOS broadcast --- sensorhub-android-app/AndroidManifest.xml | 7 ++++++ .../org/sensorhub/android/IPCReciever.java | 25 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java diff --git a/sensorhub-android-app/AndroidManifest.xml b/sensorhub-android-app/AndroidManifest.xml index 5a2cfc21..01dc9450 100644 --- a/sensorhub-android-app/AndroidManifest.xml +++ b/sensorhub-android-app/AndroidManifest.xml @@ -20,6 +20,13 @@ android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> + + + + + Date: Mon, 11 Feb 2019 11:27:47 -0600 Subject: [PATCH 028/207] uncomment adding excluded outputs to storageConf and DataProviderConf --- .../org/sensorhub/android/MainActivity.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 0aff9cc6..8d2d50d6 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -403,25 +403,30 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto String sensorName = ""; if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) { -// storageConf.excludedOutputs.add(sensorName); + sensorName = Sensor.STRING_TYPE_ACCELEROMETER.replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) { -// storageConf.excludedOutputs.add(sensorName); + sensorName = Sensor.STRING_TYPE_GYROSCOPE.replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) { -// storageConf.excludedOutputs.add(sensorName); + sensorName = Sensor.STRING_TYPE_MAGNETIC_FIELD.replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) { if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) { -// storageConf.excludedOutputs.add(sensorName); + sensorName = "quat_orientation_data"; + storageConf.excludedOutputs.add(sensorName); } if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) { -// storageConf.excludedOutputs.add(sensorName); + sensorName = "euler_orientation_data"; + storageConf.excludedOutputs.add(sensorName); } } if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE")) @@ -453,19 +458,22 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE") ) { -// dataProviderConf.excludedOutputs.add(sensorName); + sensorName = Sensor.STRING_TYPE_ACCELEROMETER.replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME") || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE") ) { -// dataProviderConf.excludedOutputs.add(sensorName); + sensorName = Sensor.STRING_TYPE_GYROSCOPE.replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME") || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE") ) { -// dataProviderConf.excludedOutputs.add(sensorName); + sensorName = Sensor.STRING_TYPE_MAGNETIC_FIELD.replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME") || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE") @@ -473,11 +481,13 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo { if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) { -// dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "quat_orientation_data"; + dataProviderConf.excludedOutputs.add(sensorName); } if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) { -// dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "euler_orientation_data"; + dataProviderConf.excludedOutputs.add(sensorName); } } if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME") From 786063aee3bba0ef815c464c7f15e51fbbdd76b2 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 11 Feb 2019 14:47:16 -0600 Subject: [PATCH 029/207] prevent wakeup/no-wakeup sensors from being added and duping data --- .../sensor/android/AndroidSensorsDriver.java | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java index 2130ba72..492bd459 100644 --- a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java +++ b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java @@ -80,6 +80,11 @@ public synchronized void init() throws SensorHubException this.localFrameURI = this.uniqueID + "#" + LOCAL_REF_FRAME; // create data interfaces for sensors + boolean isUsingAccelerometer = false; + boolean isUsingGyrscope = false; + boolean isUsingMagnetometer = false; + boolean isUsingOrientationQuat = false; + boolean isUsingOrientationEuler = false; this.sensorManager = (SensorManager)androidContext.getSystemService(Context.SENSOR_SERVICE); List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); for (Sensor sensor: deviceSensors) @@ -89,25 +94,40 @@ public synchronized void init() throws SensorHubException switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: - if (config.activateAccelerometer) - useSensor(new AndroidAcceleroOutput(this, sensorManager, sensor), sensor); + if (config.activateAccelerometer && !isUsingAccelerometer) + { + useSensor(new AndroidAcceleroOutput(this, sensorManager, sensor), sensor); + isUsingAccelerometer = true; + } break; case Sensor.TYPE_GYROSCOPE: - if (config.activateGyrometer) + if (config.activateGyrometer && !isUsingGyrscope) + { useSensor(new AndroidGyroOutput(this, sensorManager, sensor), sensor); + isUsingGyrscope = true; + } break; case Sensor.TYPE_MAGNETIC_FIELD: - if (config.activateMagnetometer) + if (config.activateMagnetometer && !isUsingMagnetometer) + { useSensor(new AndroidMagnetoOutput(this, sensorManager, sensor), sensor); + isUsingMagnetometer = true; + } break; case Sensor.TYPE_ROTATION_VECTOR: - if (config.activateOrientationQuat) + if (config.activateOrientationQuat && !isUsingOrientationQuat) + { useSensor(new AndroidOrientationQuatOutput(this, sensorManager, sensor), sensor); - if (config.activateOrientationEuler) + isUsingOrientationQuat = true; + } + if (config.activateOrientationEuler && !isUsingOrientationEuler) + { useSensor(new AndroidOrientationEulerOutput(this, sensorManager, sensor), sensor); + isUsingOrientationEuler = true; + } break; } } From b491905242e525d6f940202c937584095518f2b3 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 11 Feb 2019 16:26:19 -0600 Subject: [PATCH 030/207] refactor new way of getting sensorName for excludedOutputs --- .../org/sensorhub/android/IPCReciever.java | 25 +- .../org/sensorhub/android/MainActivity.java | 251 ++++++++++-------- 2 files changed, 160 insertions(+), 116 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java b/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java index 8f57cd49..2755d090 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java +++ b/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java @@ -3,23 +3,28 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.util.Log; import android.widget.Toast; +import org.vast.ows.OWSRequest; +import org.vast.ows.sos.InsertSensorRequest; + public class IPCReciever extends BroadcastReceiver { private static final String TAG = "MyBroadcastReceiver"; + @Override public void onReceive(Context context, Intent intent) { - StringBuilder sb = new StringBuilder(); - - sb.append('\n'); - sb.append("Action: " + intent.getAction()); - sb.append('\n'); - sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString()); - sb.append('\n'); + String action = intent.getAction(); + Bundle extras = intent.getExtras(); + + String origin = extras.getString("src"); + String payload = extras.getString("SOS"); - String log = sb.toString(); - Log.d(TAG, log); - Toast.makeText(context, log, Toast.LENGTH_LONG).show(); + String log; + log = origin; + Log.d(TAG, '\n'+log); + log = payload; + Log.d(TAG, '\n'+log); } } diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 8d2d50d6..67a96ede 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -26,12 +26,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import android.hardware.Sensor; +import android.hardware.SensorManager; import android.util.Log; import android.view.*; @@ -58,6 +60,7 @@ import org.sensorhub.impl.persistence.h2.MVMultiStorageImpl; import org.sensorhub.impl.persistence.h2.MVObsStorageImpl; import org.sensorhub.impl.persistence.h2.MVStorageConfig; +import org.sensorhub.impl.sensor.android.AndroidAcceleroOutput; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; @@ -203,7 +206,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) SensorDataProviderConfig androidDataProviderConfig = createDataProviderConfig(androidSensorsConfig); androidDataProviderConfig.storageID = androidStreamStorageConfig.id; - addSosServerConfig(sosConfig, androidDataProviderConfig, androidSensorsConfig); + addSosServerConfig(sosConfig, androidDataProviderConfig); // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enabled", false); @@ -399,115 +402,131 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto if (sensorConf instanceof AndroidSensorsConfig) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); + List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); - String sensorName = ""; - if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) - { - sensorName = Sensor.STRING_TYPE_ACCELEROMETER.replaceAll(" ", "_") + "_data"; - storageConf.excludedOutputs.add(sensorName); - } - if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) - { - sensorName = Sensor.STRING_TYPE_GYROSCOPE.replaceAll(" ", "_") + "_data"; - storageConf.excludedOutputs.add(sensorName); - } - if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) - { - sensorName = Sensor.STRING_TYPE_MAGNETIC_FIELD.replaceAll(" ", "_") + "_data"; - storageConf.excludedOutputs.add(sensorName); - } - if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + String sensorName; + for (Sensor sensor: deviceSensors) { - if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) - { - sensorName = "quat_orientation_data"; - storageConf.excludedOutputs.add(sensorName); - } - if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) + switch (sensor.getType()) { - sensorName = "euler_orientation_data"; - storageConf.excludedOutputs.add(sensorName); + case Sensor.TYPE_ACCELEROMETER: + if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); + } + break; + case Sensor.TYPE_GYROSCOPE: + if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); + } + break; + case Sensor.TYPE_MAGNETIC_FIELD: + if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); + } + break; + case Sensor.TYPE_ROTATION_VECTOR: + if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); + sensorName = "quat_orientation_data"; + storageConf.excludedOutputs.add(sensorName); + sensorName = "euler_orientation_data"; + storageConf.excludedOutputs.add(sensorName); + } + break; } } if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE")) { - if (((AndroidSensorsConfig) sensorConf).activateGpsLocation) - { -// storageConf.excludedOutputs.add(sensorName); - } - if (((AndroidSensorsConfig) sensorConf).activateNetworkLocation) - { -// storageConf.excludedOutputs.add(sensorName); - } + sensorName = "gps_data"; + storageConf.excludedOutputs.add(sensorName); + sensorName = "network_data"; + storageConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) { -// storageConf.excludedOutputs.add(sensorName); + sensorName = "camera0_MJPEG"; + storageConf.excludedOutputs.add(sensorName); + sensorName = "camera0_H264"; + storageConf.excludedOutputs.add(sensorName); } } sensorhubConfig.add(storageConf); } - protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderConfig dataProviderConf, SensorConfig sensorConf) + protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderConfig dataProviderConf) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); + List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); - String sensorName = ""; - if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE") - ) - { - sensorName = Sensor.STRING_TYPE_ACCELEROMETER.replaceAll(" ", "_") + "_data"; - dataProviderConf.excludedOutputs.add(sensorName); - } - if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE") - ) - { - sensorName = Sensor.STRING_TYPE_GYROSCOPE.replaceAll(" ", "_") + "_data"; - dataProviderConf.excludedOutputs.add(sensorName); - } - if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE") - ) - { - sensorName = Sensor.STRING_TYPE_MAGNETIC_FIELD.replaceAll(" ", "_") + "_data"; - dataProviderConf.excludedOutputs.add(sensorName); - } - if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE") - ) + String sensorName; + for (Sensor sensor: deviceSensors) { - if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) - { - sensorName = "quat_orientation_data"; - dataProviderConf.excludedOutputs.add(sensorName); - } - if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) + switch (sensor.getType()) { - sensorName = "euler_orientation_data"; - dataProviderConf.excludedOutputs.add(sensorName); + case Sensor.TYPE_ACCELEROMETER: + if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); + } + break; + case Sensor.TYPE_GYROSCOPE: + if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); + } + break; + case Sensor.TYPE_MAGNETIC_FIELD: + if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); + } + break; + case Sensor.TYPE_ROTATION_VECTOR: + if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME") + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "quat_orientation_data"; + dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "euler_orientation_data"; + dataProviderConf.excludedOutputs.add(sensorName); + } + break; } } if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE") - ) + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) { - if (((AndroidSensorsConfig) sensorConf).activateGpsLocation) - { -// dataProviderConf.excludedOutputs.add(sensorName); - } - if (((AndroidSensorsConfig) sensorConf).activateNetworkLocation) - { -// dataProviderConf.excludedOutputs.add(sensorName); - } + sensorName = "gps_data"; + dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "network_data"; + dataProviderConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE") - ) + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) { -// dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "camera0_MJPEG"; + dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "camera0_H264"; + dataProviderConf.excludedOutputs.add(sensorName); } sosConf.dataProviders.add(dataProviderConf); @@ -536,41 +555,61 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos if (sensorConf instanceof AndroidSensorsConfig) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); + List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); String sensorName; - if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH")) + for (Sensor sensor: deviceSensors) { - sensorName = Sensor.STRING_TYPE_ACCELEROMETER.replaceAll(" ", "_") + "_data"; - sosConfig.excludedOutputs.add(sensorName); - } - if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH")) - { - sensorName = Sensor.STRING_TYPE_GYROSCOPE.replaceAll(" ", "_") + "_data"; - sosConfig.excludedOutputs.add(sensorName); - } - if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH")) - { - sensorName = Sensor.STRING_TYPE_MAGNETIC_FIELD.replaceAll(" ", "_") + "_data"; - sosConfig.excludedOutputs.add(sensorName); - } - if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) - { - if (((AndroidSensorsConfig) sensorConf).activateOrientationQuat) - { - sensorName = "quat_orientation_data"; - sosConfig.excludedOutputs.add(sensorName); - } - if (((AndroidSensorsConfig) sensorConf).activateOrientationEuler) + switch (sensor.getType()) { - sensorName = "euler_orientation_data"; - sosConfig.excludedOutputs.add(sensorName); + case Sensor.TYPE_ACCELEROMETER: + if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + } + break; + case Sensor.TYPE_GYROSCOPE: + if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + } + break; + case Sensor.TYPE_MAGNETIC_FIELD: + if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + } + break; + case Sensor.TYPE_ROTATION_VECTOR: + if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) + { + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + sensorName = "quat_orientation_data"; + sosConfig.excludedOutputs.add(sensorName); + sensorName = "euler_orientation_data"; + sosConfig.excludedOutputs.add(sensorName); + } + break; } } if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH")) { + sensorName = "gps_data"; + sosConfig.excludedOutputs.add(sensorName); + sensorName = "network_data"; + sosConfig.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH")) { + sensorName = "camera0_MJPEG"; + sosConfig.excludedOutputs.add(sensorName); + sensorName = "camera0_H264"; + sosConfig.excludedOutputs.add(sensorName); } } From f5b095c39a4f44ab0d8be2b8ae884018366b8001 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Thu, 14 Feb 2019 16:17:04 -0600 Subject: [PATCH 031/207] wip --- .../org/sensorhub/android/MainActivity.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 67a96ede..ea0c0f85 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -171,6 +171,8 @@ protected void updateConfig(SharedPreferences prefs, String runName) // SOS Config SOSServiceConfig sosConfig = new SOSServiceConfig(); + sosConfig.id = "SOS_SERVICE"; + sosConfig.name = "SOS Service"; sosConfig.autoStart = true; sosConfig.enableTransactional = true; @@ -205,7 +207,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) addStorageConfig(androidSensorsConfig, androidStreamStorageConfig); SensorDataProviderConfig androidDataProviderConfig = createDataProviderConfig(androidSensorsConfig); - androidDataProviderConfig.storageID = androidStreamStorageConfig.id; addSosServerConfig(sosConfig, androidDataProviderConfig); // TruPulse sensor @@ -271,8 +272,9 @@ protected void updateConfig(SharedPreferences prefs, String runName) private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig sensorConfig) { SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); - dataProviderConfig.offeringID = sensorConfig.id+":offering"; dataProviderConfig.sensorID = sensorConfig.id; + dataProviderConfig.offeringID = sensorConfig.id + ":offering"; + dataProviderConfig.storageID = sensorConfig.id + "#storage"; dataProviderConfig.enabled = true; dataProviderConfig.liveDataTimeout = 600.0; dataProviderConfig.maxFois = 10; @@ -312,7 +314,7 @@ private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig senso // Stream Storage Config StreamStorageConfig streamStorageConfig = new StreamStorageConfig(); streamStorageConfig.moduleClass = GenericStreamStorage.class.getCanonicalName(); - streamStorageConfig.id = sensorConfig.id + ":stream-storage"; + streamStorageConfig.id = sensorConfig.id + "#storage"; streamStorageConfig.name = sensorConfig.name + " Storage"; streamStorageConfig.dataSourceID = sensorConfig.id; streamStorageConfig.autoStart = true; @@ -476,7 +478,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo { case Sensor.TYPE_ACCELEROMETER: if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) + && !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) { sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; dataProviderConf.excludedOutputs.add(sensorName); @@ -484,7 +486,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo break; case Sensor.TYPE_GYROSCOPE: if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) + && !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) { sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; dataProviderConf.excludedOutputs.add(sensorName); @@ -492,7 +494,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo break; case Sensor.TYPE_MAGNETIC_FIELD: if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) + && !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) { sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; dataProviderConf.excludedOutputs.add(sensorName); @@ -500,7 +502,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo break; case Sensor.TYPE_ROTATION_VECTOR: if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + && !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) { sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; dataProviderConf.excludedOutputs.add(sensorName); @@ -513,7 +515,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo } } if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + && !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) { sensorName = "gps_data"; dataProviderConf.excludedOutputs.add(sensorName); @@ -521,7 +523,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo dataProviderConf.excludedOutputs.add(sensorName); } if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME") - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) + && !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) { sensorName = "camera0_MJPEG"; dataProviderConf.excludedOutputs.add(sensorName); From 0c99135835f604898b9378e2cd48f931fe738570 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Thu, 14 Feb 2019 17:01:18 -0600 Subject: [PATCH 032/207] add check to ignore non-wakeup sensors --- .../impl/sensor/android/AndroidSensorsDriver.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java index 492bd459..ca5973dd 100644 --- a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java +++ b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java @@ -94,7 +94,8 @@ public synchronized void init() throws SensorHubException switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: - if (config.activateAccelerometer && !isUsingAccelerometer) + if (config.activateAccelerometer && !isUsingAccelerometer + && !sensor.getName().toLowerCase().contains("non-wakeup")) { useSensor(new AndroidAcceleroOutput(this, sensorManager, sensor), sensor); isUsingAccelerometer = true; @@ -102,7 +103,8 @@ public synchronized void init() throws SensorHubException break; case Sensor.TYPE_GYROSCOPE: - if (config.activateGyrometer && !isUsingGyrscope) + if (config.activateGyrometer && !isUsingGyrscope + && !sensor.getName().toLowerCase().contains("non-wakeup")) { useSensor(new AndroidGyroOutput(this, sensorManager, sensor), sensor); isUsingGyrscope = true; @@ -110,7 +112,8 @@ public synchronized void init() throws SensorHubException break; case Sensor.TYPE_MAGNETIC_FIELD: - if (config.activateMagnetometer && !isUsingMagnetometer) + if (config.activateMagnetometer && !isUsingMagnetometer + && !sensor.getName().toLowerCase().contains("non-wakeup")) { useSensor(new AndroidMagnetoOutput(this, sensorManager, sensor), sensor); isUsingMagnetometer = true; @@ -118,12 +121,14 @@ public synchronized void init() throws SensorHubException break; case Sensor.TYPE_ROTATION_VECTOR: - if (config.activateOrientationQuat && !isUsingOrientationQuat) + if (config.activateOrientationQuat && !isUsingOrientationQuat + && !sensor.getName().toLowerCase().contains("non-wakeup")) { useSensor(new AndroidOrientationQuatOutput(this, sensorManager, sensor), sensor); isUsingOrientationQuat = true; } - if (config.activateOrientationEuler && !isUsingOrientationEuler) + if (config.activateOrientationEuler && !isUsingOrientationEuler + && !sensor.getName().toLowerCase().contains("non-wakeup")) { useSensor(new AndroidOrientationEulerOutput(this, sensorManager, sensor), sensor); isUsingOrientationEuler = true; From ee9e75204e4702731e2399c5b0d180c03db42a2d Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 19 Feb 2019 11:09:03 -0600 Subject: [PATCH 033/207] add better proof of concept for handling IPC --- .../src/org/sensorhub/android/IPCReciever.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java b/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java index 2755d090..458c7e9e 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java +++ b/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java @@ -15,16 +15,16 @@ public class IPCReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - Bundle extras = intent.getExtras(); + StringBuilder sb = new StringBuilder(); - String origin = extras.getString("src"); - String payload = extras.getString("SOS"); + sb.append('\n'); + sb.append("Action: " + intent.getAction()); + sb.append('\n'); + sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME)); + sb.append('\n'); - String log; - log = origin; - Log.d(TAG, '\n'+log); - log = payload; - Log.d(TAG, '\n'+log); + String log = sb.toString(); + Log.d(TAG, log); + Toast.makeText(context, log, Toast.LENGTH_LONG).show(); } } From 0669f00e8b910190dd6574b6fed86e627491b82d Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 19 Feb 2019 11:11:48 -0600 Subject: [PATCH 034/207] fix realtime not show up in capabilities output --- .../src/org/sensorhub/android/MainActivity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index ea0c0f85..ccdee6e8 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -403,6 +403,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto { if (sensorConf instanceof AndroidSensorsConfig) { + /* SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); @@ -460,6 +461,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto sensorName = "camera0_H264"; storageConf.excludedOutputs.add(sensorName); } + */ } sensorhubConfig.add(storageConf); From 329c3daf91439278e0b8a482b723346c65e461b0 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 19 Feb 2019 11:12:25 -0600 Subject: [PATCH 035/207] change logic for selecting wake sensor --- .../impl/sensor/android/AndroidSensorsDriver.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java index ca5973dd..d0aeaa58 100644 --- a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java +++ b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java @@ -94,8 +94,7 @@ public synchronized void init() throws SensorHubException switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: - if (config.activateAccelerometer && !isUsingAccelerometer - && !sensor.getName().toLowerCase().contains("non-wakeup")) + if (config.activateAccelerometer && !isUsingAccelerometer && sensor.isWakeUpSensor()) { useSensor(new AndroidAcceleroOutput(this, sensorManager, sensor), sensor); isUsingAccelerometer = true; @@ -103,8 +102,7 @@ public synchronized void init() throws SensorHubException break; case Sensor.TYPE_GYROSCOPE: - if (config.activateGyrometer && !isUsingGyrscope - && !sensor.getName().toLowerCase().contains("non-wakeup")) + if (config.activateGyrometer && !isUsingGyrscope && sensor.isWakeUpSensor()) { useSensor(new AndroidGyroOutput(this, sensorManager, sensor), sensor); isUsingGyrscope = true; @@ -112,8 +110,7 @@ public synchronized void init() throws SensorHubException break; case Sensor.TYPE_MAGNETIC_FIELD: - if (config.activateMagnetometer && !isUsingMagnetometer - && !sensor.getName().toLowerCase().contains("non-wakeup")) + if (config.activateMagnetometer && !isUsingMagnetometer && sensor.isWakeUpSensor()) { useSensor(new AndroidMagnetoOutput(this, sensorManager, sensor), sensor); isUsingMagnetometer = true; @@ -121,14 +118,12 @@ public synchronized void init() throws SensorHubException break; case Sensor.TYPE_ROTATION_VECTOR: - if (config.activateOrientationQuat && !isUsingOrientationQuat - && !sensor.getName().toLowerCase().contains("non-wakeup")) + if (config.activateOrientationQuat && !isUsingOrientationQuat && sensor.isWakeUpSensor()) { useSensor(new AndroidOrientationQuatOutput(this, sensorManager, sensor), sensor); isUsingOrientationQuat = true; } - if (config.activateOrientationEuler && !isUsingOrientationEuler - && !sensor.getName().toLowerCase().contains("non-wakeup")) + if (config.activateOrientationEuler && !isUsingOrientationEuler && sensor.isWakeUpSensor()) { useSensor(new AndroidOrientationEulerOutput(this, sensorManager, sensor), sensor); isUsingOrientationEuler = true; From 4c47e50c70e7215b12a7b62994684c0180dad249 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 19 Feb 2019 12:44:32 -0600 Subject: [PATCH 036/207] Add IP Address to general settings preference. --- sensorhub-android-app/AndroidManifest.xml | 1 + .../res/xml/pref_general.xml | 9 +++++- .../android/UserSettingsActivity.java | 32 +++++++++++++++---- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/sensorhub-android-app/AndroidManifest.xml b/sensorhub-android-app/AndroidManifest.xml index 01dc9450..b332e109 100644 --- a/sensorhub-android-app/AndroidManifest.xml +++ b/sensorhub-android-app/AndroidManifest.xml @@ -14,6 +14,7 @@ + - + + + target) { @@ -125,6 +123,26 @@ public void onCreate(Bundle savedInstanceState) bindPreferenceSummaryToValue(findPreference("device_name")); bindPreferenceSummaryToValue(findPreference("sos_uri")); bindPreferenceSummaryToValue(findPreference("sos_username")); + + WifiManager wifiManager = (WifiManager) getActivity().getApplicationContext().getSystemService(WIFI_SERVICE); + int ipAddress = wifiManager.getConnectionInfo().getIpAddress(); + + // Convert little-endian to big-endianif needed + if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) { + ipAddress = Integer.reverseBytes(ipAddress); + } + + byte[] ipByteArray = BigInteger.valueOf(ipAddress).toByteArray(); + + String ipAddressString; + try { + ipAddressString = InetAddress.getByAddress(ipByteArray).getHostAddress(); + } catch (UnknownHostException ex) { + ipAddressString = "Unable to get IP Address"; + } + + Preference ipAddressLabel = getPreferenceScreen().findPreference("nop_ipAddress"); + ipAddressLabel.setSummary(ipAddressString); } } From be399a41b849b14c523b3da4310750af09e62027 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 19 Feb 2019 12:45:50 -0600 Subject: [PATCH 037/207] clean up unused imports and add current TODOs --- .../res/xml/pref_general.xml | 1 - .../org/sensorhub/android/MainActivity.java | 20 +++++-------------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/sensorhub-android-app/res/xml/pref_general.xml b/sensorhub-android-app/res/xml/pref_general.xml index 384bbeea..fa890b05 100644 --- a/sensorhub-android-app/res/xml/pref_general.xml +++ b/sensorhub-android-app/res/xml/pref_general.xml @@ -1,5 +1,4 @@ - Date: Tue, 26 Feb 2019 14:39:25 -0600 Subject: [PATCH 038/207] add wake/nonwake logic at beginning of looping through sensors --- .../sensor/android/AndroidSensorsDriver.java | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java index d0aeaa58..d7ef1c8b 100644 --- a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java +++ b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidSensorsDriver.java @@ -45,6 +45,9 @@ import android.os.Build; import android.os.Looper; import android.provider.Settings.Secure; +import android.util.Log; + +import static android.content.ContentValues.TAG; public class AndroidSensorsDriver extends AbstractSensorModule @@ -80,53 +83,48 @@ public synchronized void init() throws SensorHubException this.localFrameURI = this.uniqueID + "#" + LOCAL_REF_FRAME; // create data interfaces for sensors - boolean isUsingAccelerometer = false; - boolean isUsingGyrscope = false; - boolean isUsingMagnetometer = false; - boolean isUsingOrientationQuat = false; - boolean isUsingOrientationEuler = false; this.sensorManager = (SensorManager)androidContext.getSystemService(Context.SENSOR_SERVICE); List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); for (Sensor sensor: deviceSensors) { - log.debug("Detected sensor " + sensor.getName()); - + if (sensor.isWakeUpSensor()) + { + continue; + } + + Log.d(TAG, "init: Detected sensor: " + sensor.getName()); + switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: - if (config.activateAccelerometer && !isUsingAccelerometer && sensor.isWakeUpSensor()) + if (config.activateAccelerometer) { useSensor(new AndroidAcceleroOutput(this, sensorManager, sensor), sensor); - isUsingAccelerometer = true; } break; case Sensor.TYPE_GYROSCOPE: - if (config.activateGyrometer && !isUsingGyrscope && sensor.isWakeUpSensor()) + if (config.activateGyrometer) { useSensor(new AndroidGyroOutput(this, sensorManager, sensor), sensor); - isUsingGyrscope = true; } break; case Sensor.TYPE_MAGNETIC_FIELD: - if (config.activateMagnetometer && !isUsingMagnetometer && sensor.isWakeUpSensor()) + if (config.activateMagnetometer) { useSensor(new AndroidMagnetoOutput(this, sensorManager, sensor), sensor); - isUsingMagnetometer = true; } break; case Sensor.TYPE_ROTATION_VECTOR: - if (config.activateOrientationQuat && !isUsingOrientationQuat && sensor.isWakeUpSensor()) + if (config.activateOrientationQuat) { useSensor(new AndroidOrientationQuatOutput(this, sensorManager, sensor), sensor); - isUsingOrientationQuat = true; } - if (config.activateOrientationEuler && !isUsingOrientationEuler && sensor.isWakeUpSensor()) + if (config.activateOrientationEuler) { useSensor(new AndroidOrientationEulerOutput(this, sensorManager, sensor), sensor); - isUsingOrientationEuler = true; } break; } From e2141afd39602d720da35a71af96095e65ca2f10 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 26 Feb 2019 14:40:14 -0600 Subject: [PATCH 039/207] add more logging to excludes output and base logic entirely off of prefs only --- .../res/xml/pref_general.xml | 2 +- .../org/sensorhub/android/MainActivity.java | 235 ++++++++++++++---- 2 files changed, 185 insertions(+), 52 deletions(-) diff --git a/sensorhub-android-app/res/xml/pref_general.xml b/sensorhub-android-app/res/xml/pref_general.xml index fa890b05..5bf744b0 100644 --- a/sensorhub-android-app/res/xml/pref_general.xml +++ b/sensorhub-android-app/res/xml/pref_general.xml @@ -17,7 +17,7 @@ android:summary="" /> 0) { try @@ -163,28 +166,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) // Push Sensors Config AndroidSensorsConfig androidSensorsConfig = (AndroidSensorsConfig) createSensorConfig(Sensors.Android); - - androidSensorsConfig.activateAccelerometer = prefs.getBoolean("accelerometer_enable", false); - androidSensorsConfig.activateGyrometer = prefs.getBoolean("gyroscope_enable", false); - androidSensorsConfig.activateMagnetometer = prefs.getBoolean("magnetometer_enable", false); - if (prefs.getBoolean("orientation_enable", false)) - { - androidSensorsConfig.activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); - androidSensorsConfig.activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); - } - if (prefs.getBoolean("location_enable", false)) - { - androidSensorsConfig.activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); - androidSensorsConfig.activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); - } - if (prefs.getBoolean("video_enable", false)) - { - showVideo = true; - - androidSensorsConfig.activateBackCamera = true; - androidSensorsConfig.videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); - } - sensorhubConfig.add(androidSensorsConfig); addSosTConfig(androidSensorsConfig, sosUser, sosPwd); @@ -320,11 +301,36 @@ private SensorConfig createSensorConfig(Sensors sensor) SensorConfig sensorConfig; if (Sensors.Android.equals(sensor)) { + Log.d(TAG, "createSensorConfig: Creating android sensor"); + sensorConfig = new AndroidSensorsConfig(); sensorConfig.id = "urn:device:android:" + deviceID; sensorConfig.name = "Android Sensors [" + deviceName + "]"; sensorConfig.autoStart = true; + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + + ((AndroidSensorsConfig) sensorConfig).activateAccelerometer = prefs.getBoolean("accelerometer_enable", false); + ((AndroidSensorsConfig) sensorConfig).activateGyrometer = prefs.getBoolean("gyroscope_enable", false); + ((AndroidSensorsConfig) sensorConfig).activateMagnetometer = prefs.getBoolean("magnetometer_enable", false); + if (prefs.getBoolean("orientation_enable", false)) + { + ((AndroidSensorsConfig) sensorConfig).activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); + ((AndroidSensorsConfig) sensorConfig).activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); + } + if (prefs.getBoolean("location_enable", false)) + { + ((AndroidSensorsConfig) sensorConfig).activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); + ((AndroidSensorsConfig) sensorConfig).activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); + } + if (prefs.getBoolean("video_enable", false)) + { + showVideo = true; + + ((AndroidSensorsConfig) sensorConfig).activateBackCamera = true; + ((AndroidSensorsConfig) sensorConfig).videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); + } + ((AndroidSensorsConfig) sensorConfig).androidContext = this.getApplicationContext(); ((AndroidSensorsConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); ((AndroidSensorsConfig) sensorConfig).runName = runName; @@ -393,7 +399,6 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto { if (sensorConf instanceof AndroidSensorsConfig) { - /* SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); @@ -401,57 +406,99 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto String sensorName; for (Sensor sensor: deviceSensors) { + if (sensor.isWakeUpSensor()) + { + continue; + } + + Log.d(TAG, "addStorageConfig: sensor: " + sensor.getName()); + switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: - if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("accelerometer_enable", false) + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) { + + Log.d(TAG, "addStorageConfig: excluding accelerometer"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding accelerometer"); } break; case Sensor.TYPE_GYROSCOPE: - if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("gyroscope_enable", false) + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) { + + Log.d(TAG, "addStorageConfig: excluding gyroscope"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding gyroscope"); } break; case Sensor.TYPE_MAGNETIC_FIELD: - if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("magnetometer_enable", false) + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) { + + Log.d(TAG, "addStorageConfig: excluding magnetometer"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding magnetometer"); } break; case Sensor.TYPE_ROTATION_VECTOR: - if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("orientation_enable", false) + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) { + + Log.d(TAG, "addStorageConfig: excluding orientation"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; storageConf.excludedOutputs.add(sensorName); sensorName = "quat_orientation_data"; storageConf.excludedOutputs.add(sensorName); sensorName = "euler_orientation_data"; storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding orientation"); } break; } } - if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("location_enable", false) + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE")) { + + Log.d(TAG, "addStorageConfig: excluding location"); + sensorName = "gps_data"; storageConf.excludedOutputs.add(sensorName); sensorName = "network_data"; storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding location"); } - if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("video_enable", false) + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) { + + Log.d(TAG, "addStorageConfig: excluding video"); + sensorName = "camera0_MJPEG"; storageConf.excludedOutputs.add(sensorName); sensorName = "camera0_H264"; storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding video"); } - */ } sensorhubConfig.add(storageConf); @@ -466,61 +513,104 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo String sensorName; for (Sensor sensor: deviceSensors) { + if (sensor.isWakeUpSensor()) + { + continue; + } + + Log.d(TAG, "addSosServerConfig: sensor: " + sensor.getName()); + switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: - if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("accelerometer_enable", false) + || (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME") + && !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE"))) { + + Log.d(TAG, "addSosServerConfig: excluding accelerometer"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding accelerometer"); } break; case Sensor.TYPE_GYROSCOPE: - if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("gyroscope_enable", false) + || (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME") + && !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE"))) { + + Log.d(TAG, "addSosServerConfig: excluding gyroscope"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding gyroscope"); } break; case Sensor.TYPE_MAGNETIC_FIELD: - if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("magnetometer_enable", false) + || (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME") + && !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE"))) { + + Log.d(TAG, "addSosServerConfig: excluding magnetometer"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding magnetometer"); } break; case Sensor.TYPE_ROTATION_VECTOR: - if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("orientation_enable", false) + || (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME") + && !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE"))) { + + Log.d(TAG, "addSosServerConfig: excluding orientation"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; dataProviderConf.excludedOutputs.add(sensorName); sensorName = "quat_orientation_data"; dataProviderConf.excludedOutputs.add(sensorName); sensorName = "euler_orientation_data"; dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding orientation"); } break; } } - if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("location_enable", false) + || (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME") + && !prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE"))) { + + Log.d(TAG, "addSosServerConfig: excluding location"); + sensorName = "gps_data"; dataProviderConf.excludedOutputs.add(sensorName); sensorName = "network_data"; dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding location"); } - if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) + if (!prefs.getBoolean("video_enable", false) + || (!prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME") + && !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE"))) { + + Log.d(TAG, "addSosServerConfig: excluding video"); + sensorName = "camera0_MJPEG"; dataProviderConf.excludedOutputs.add(sensorName); sensorName = "camera0_H264"; dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding video"); } sosConf.dataProviders.add(dataProviderConf); @@ -555,55 +645,98 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos String sensorName; for (Sensor sensor: deviceSensors) { + if (sensor.isWakeUpSensor()) + { + continue; + } + + Log.d(TAG, "addSosTConfig: sensor: " + sensor.getName()); + switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: - if (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH")) + if (!prefs.getBoolean("accelerometer_enable", false) + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH")) { + + Log.d(TAG, "addSosTConfig: excluding accelerometer"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding accelerometer"); } break; case Sensor.TYPE_GYROSCOPE: - if (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH")) + if (!prefs.getBoolean("gyroscope_enable", false) + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH")) { + + Log.d(TAG, "addSosTConfig: excluding gyroscope"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding gyroscope"); } break; case Sensor.TYPE_MAGNETIC_FIELD: - if (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH")) + if (!prefs.getBoolean("magnetometer_enable", false) + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH")) { + + Log.d(TAG, "addSosTConfig: excluding magnetometer"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding magnetometer"); } break; case Sensor.TYPE_ROTATION_VECTOR: - if (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) + if (!prefs.getBoolean("orientation_enable", false) + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) { + + Log.d(TAG, "addSosTConfig: excluding orientation"); + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; sosConfig.excludedOutputs.add(sensorName); sensorName = "quat_orientation_data"; sosConfig.excludedOutputs.add(sensorName); sensorName = "euler_orientation_data"; sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding orientation"); } break; } } - if (!prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH")) + if (!prefs.getBoolean("location_enable", false) + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH")) { + + Log.d(TAG, "addSosTConfig: excluding location"); + sensorName = "gps_data"; sosConfig.excludedOutputs.add(sensorName); sensorName = "network_data"; sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding location"); } - if (!prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH")) + if (!prefs.getBoolean("video_enable", false) + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH")) { + + Log.d(TAG, "addSosTConfig: excluding video"); + sensorName = "camera0_MJPEG"; sosConfig.excludedOutputs.add(sensorName); sensorName = "camera0_H264"; sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding video"); } } From 7d5ca37f3f0c6a8adfb56eb8c32f6d00af93cca2 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Thu, 28 Feb 2019 10:14:53 -0600 Subject: [PATCH 040/207] cleanly and properly cleanup the HttpServer --- .../src/org/sensorhub/android/SensorHubService.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SensorHubService.java b/sensorhub-android-app/src/org/sensorhub/android/SensorHubService.java index 2e221cc0..27e3d723 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SensorHubService.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SensorHubService.java @@ -26,12 +26,14 @@ import android.view.SurfaceView; import android.view.WindowManager; import org.sensorhub.api.common.IEventListener; +import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleConfig; import org.sensorhub.impl.SensorHub; import org.sensorhub.impl.SensorHubConfig; import org.sensorhub.impl.common.EventBus; import org.sensorhub.impl.module.ModuleRegistry; +import org.sensorhub.impl.service.HttpServer; import org.vast.xml.XMLImplFinder; import android.app.Service; import android.content.Intent; @@ -125,6 +127,14 @@ public void run() { sensorhub.stop(); SensorHub.clearInstance(); sensorhub = null; + + try { + if (HttpServer.getInstance() != null) { + HttpServer.getInstance().cleanup(); + } + } catch (SensorHubException e) { + e.printStackTrace(); + } } }); } From d1854d7823181e164b751cfa0ac8c12bc1ee27ea Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 5 Mar 2019 17:05:56 -0600 Subject: [PATCH 041/207] wip - IPC BroadcastReceiver registered programatically not via manifest --- sensorhub-android-app/AndroidManifest.xml | 8 -- sensorhub-android-app/res/values/strings.xml | 12 ++- .../org/sensorhub/android/IPCReciever.java | 30 ------- .../org/sensorhub/android/MainActivity.java | 61 +++++++------ .../sensorhub/android/SOSServiceWithIPC.java | 87 +++++++++++++++++++ 5 files changed, 127 insertions(+), 71 deletions(-) delete mode 100644 sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java create mode 100644 sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java diff --git a/sensorhub-android-app/AndroidManifest.xml b/sensorhub-android-app/AndroidManifest.xml index b332e109..e26e2c54 100644 --- a/sensorhub-android-app/AndroidManifest.xml +++ b/sensorhub-android-app/AndroidManifest.xml @@ -21,13 +21,6 @@ android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> - - - - - - diff --git a/sensorhub-android-app/res/values/strings.xml b/sensorhub-android-app/res/values/strings.xml index 759b5693..0f2750e7 100644 --- a/sensorhub-android-app/res/values/strings.xml +++ b/sensorhub-android-app/res/values/strings.xml @@ -40,16 +40,14 @@ - Real-time - Archive - Push + Store Local + Push Remote - REALTIME - ARCHIVE - PUSH + STORE_LOCAL + PUSH_REMOTE - PUSH + PUSH_REMOTE diff --git a/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java b/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java deleted file mode 100644 index 458c7e9e..00000000 --- a/sensorhub-android-app/src/org/sensorhub/android/IPCReciever.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.sensorhub.android; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.util.Log; -import android.widget.Toast; - -import org.vast.ows.OWSRequest; -import org.vast.ows.sos.InsertSensorRequest; - -public class IPCReciever extends BroadcastReceiver { - private static final String TAG = "MyBroadcastReceiver"; - - @Override - public void onReceive(Context context, Intent intent) { - StringBuilder sb = new StringBuilder(); - - sb.append('\n'); - sb.append("Action: " + intent.getAction()); - sb.append('\n'); - sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME)); - sb.append('\n'); - - String log = sb.toString(); - Log.d(TAG, log); - Toast.makeText(context, log, Toast.LENGTH_LONG).show(); - } -} diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 4f8be175..16e4f78f 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -14,10 +14,14 @@ package org.sensorhub.android; +import android.content.BroadcastReceiver; +import android.content.IntentFilter; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; @@ -42,6 +46,7 @@ import org.sensorhub.android.comm.ble.BleNetwork; import org.sensorhub.api.common.Event; import org.sensorhub.api.common.IEventListener; +import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleEvent; import org.sensorhub.api.sensor.ISensorDataInterface; @@ -59,10 +64,18 @@ import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; +import org.sensorhub.impl.service.sos.SOSService; import org.sensorhub.impl.service.sos.SOSServiceConfig; import org.sensorhub.impl.service.sos.SensorDataProviderConfig; import org.sensorhub.test.sensor.trupulse.SimulatedDataStream; import org.sensorhub.impl.service.HttpServerConfig; +import org.vast.ows.OWSException; +import org.vast.ows.OWSRequest; +import org.vast.ows.OWSUtils; +import org.vast.xml.DOMHelper; +import org.vast.xml.DOMHelperException; +import org.w3c.dom.Element; + import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; @@ -81,6 +94,7 @@ import android.text.Html; import android.widget.EditText; import android.widget.TextView; +import android.widget.Toast; import static android.content.ContentValues.TAG; @@ -163,6 +177,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.name = "SOS Service"; sosConfig.autoStart = true; sosConfig.enableTransactional = true; + sosConfig.moduleClass = SOSServiceWithIPC.class.getCanonicalName(); // Push Sensors Config AndroidSensorsConfig androidSensorsConfig = (AndroidSensorsConfig) createSensorConfig(Sensors.Android); @@ -279,8 +294,8 @@ private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig senso // Auto Purge Config MaxAgeAutoPurgeConfig autoPurgeConfig = new MaxAgeAutoPurgeConfig(); autoPurgeConfig.enabled = true; - autoPurgeConfig.purgePeriod = 600.0; - autoPurgeConfig.maxRecordAge = 864000; + autoPurgeConfig.purgePeriod = 24.0 * 60.0 * 60.0; + autoPurgeConfig.maxRecordAge = 24.0 * 60.0 * 60.0; // Stream Storage Config StreamStorageConfig streamStorageConfig = new StreamStorageConfig(); @@ -417,7 +432,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto { case Sensor.TYPE_ACCELEROMETER: if (!prefs.getBoolean("accelerometer_enable", false) - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE")) + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding accelerometer"); @@ -430,7 +445,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto break; case Sensor.TYPE_GYROSCOPE: if (!prefs.getBoolean("gyroscope_enable", false) - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE")) + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding gyroscope"); @@ -443,7 +458,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto break; case Sensor.TYPE_MAGNETIC_FIELD: if (!prefs.getBoolean("magnetometer_enable", false) - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE")) + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding magnetometer"); @@ -456,7 +471,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto break; case Sensor.TYPE_ROTATION_VECTOR: if (!prefs.getBoolean("orientation_enable", false) - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE")) + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding orientation"); @@ -474,7 +489,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto } } if (!prefs.getBoolean("location_enable", false) - || !prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE")) + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding location"); @@ -487,7 +502,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto Log.d(TAG, "addStorageConfig: NOT excluding location"); } if (!prefs.getBoolean("video_enable", false) - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE")) + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding video"); @@ -524,8 +539,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo { case Sensor.TYPE_ACCELEROMETER: if (!prefs.getBoolean("accelerometer_enable", false) - || (!prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("ARCHIVE"))) + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding accelerometer"); @@ -538,8 +552,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo break; case Sensor.TYPE_GYROSCOPE: if (!prefs.getBoolean("gyroscope_enable", false) - || (!prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("ARCHIVE"))) + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding gyroscope"); @@ -552,8 +565,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo break; case Sensor.TYPE_MAGNETIC_FIELD: if (!prefs.getBoolean("magnetometer_enable", false) - || (!prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("ARCHIVE"))) + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding magnetometer"); @@ -566,8 +578,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo break; case Sensor.TYPE_ROTATION_VECTOR: if (!prefs.getBoolean("orientation_enable", false) - || (!prefs.getStringSet("orientation_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("ARCHIVE"))) + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding orientation"); @@ -585,8 +596,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo } } if (!prefs.getBoolean("location_enable", false) - || (!prefs.getStringSet("location_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("location_options", Collections.emptySet()).contains("ARCHIVE"))) + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding location"); @@ -599,8 +609,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo Log.d(TAG, "addSosServerConfig: NOT excluding location"); } if (!prefs.getBoolean("video_enable", false) - || (!prefs.getStringSet("video_options", Collections.emptySet()).contains("REALTIME") - && !prefs.getStringSet("video_options", Collections.emptySet()).contains("ARCHIVE"))) + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding video"); @@ -656,7 +665,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos { case Sensor.TYPE_ACCELEROMETER: if (!prefs.getBoolean("accelerometer_enable", false) - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH")) + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding accelerometer"); @@ -669,7 +678,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos break; case Sensor.TYPE_GYROSCOPE: if (!prefs.getBoolean("gyroscope_enable", false) - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH")) + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding gyroscope"); @@ -682,7 +691,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos break; case Sensor.TYPE_MAGNETIC_FIELD: if (!prefs.getBoolean("magnetometer_enable", false) - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH")) + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding magnetometer"); @@ -695,7 +704,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos break; case Sensor.TYPE_ROTATION_VECTOR: if (!prefs.getBoolean("orientation_enable", false) - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH")) + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding orientation"); @@ -713,7 +722,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos } } if (!prefs.getBoolean("location_enable", false) - || !prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH")) + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding location"); @@ -726,7 +735,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos Log.d(TAG, "addSosTConfig: NOT excluding location"); } if (!prefs.getBoolean("video_enable", false) - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH")) + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding video"); diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java new file mode 100644 index 00000000..4ccd2129 --- /dev/null +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -0,0 +1,87 @@ +package org.sensorhub.android; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.util.Log; +import android.widget.Toast; + +import org.sensorhub.api.common.SensorHubException; +import org.sensorhub.impl.service.sos.SOSService; +import org.vast.ows.OWSException; +import org.vast.ows.OWSRequest; +import org.vast.ows.OWSUtils; +import org.vast.xml.DOMHelper; +import org.vast.xml.DOMHelperException; +import org.w3c.dom.Element; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import static android.content.ContentValues.TAG; + +class SOSServiceWithIPC extends SOSService { + @Override + public void start() throws SensorHubException + { + super.start(); + // FUTURE: If we don't want to use HTTPServlet don't call this. + // Could be set as a preference in the sharedPreference + + Context androidContext = config.androidContext; + + BroadcastReceiver receiver = new BroadcastReceiver() + { + @Override + public void onReceive(Context context, Intent intent) + { + StringBuilder sb = new StringBuilder(); + + sb.append('\n'); + sb.append("Action: " + intent.getAction()); + sb.append('\n'); + sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME)); + sb.append('\n'); + + String sosPayload = intent.getStringExtra("SOS"); + ipcHandler(sosPayload); + + String log = sb.toString(); + Log.d(TAG, log); + Toast.makeText(context, log, Toast.LENGTH_LONG).show(); + } + }; + IntentFilter filter = new IntentFilter(); + filter.addAction("org.sofwerx.ogc.ACTION_SOS"); + androidContext.registerReceiver(receiver, filter); + } + + private void ipcHandler(String body) { + OWSUtils owsUtils = new OWSUtils(); + + ByteArrayInputStream is = new ByteArrayInputStream(body.getBytes()); + + try { + DOMHelper dom = new DOMHelper(is, false); + Element requestElt = dom.getBaseElement(); + OWSRequest req = owsUtils.readXMLQuery(dom, requestElt); + // Subclass of OWSRequest (InsertSensor Object) + + // process request and get response + ByteArrayOutputStream os = new ByteArrayOutputStream(); + req.setResponseStream(os); + servlet.handleRequest(req); + + // send response + // convert back outputstream 'os' into something you can broadcast via IPC + } catch (DOMHelperException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (OWSException e) { + e.printStackTrace(); + } + } +} From 4d6cc13b68f97ef6b6685471e4ae3c935894ad17 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 5 Mar 2019 17:32:22 -0600 Subject: [PATCH 042/207] wip - IPC create SOSConfig to hold android context --- .../org/sensorhub/android/MainActivity.java | 3 +- .../sensorhub/android/SOSServiceWithIPC.java | 32 +++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 16e4f78f..cf386222 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -172,11 +172,12 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(serverConfig); // SOS Config - SOSServiceConfig sosConfig = new SOSServiceConfig(); + SOSServiceConfig sosConfig = new SOSServiceWithIPCConfig(); sosConfig.id = "SOS_SERVICE"; sosConfig.name = "SOS Service"; sosConfig.autoStart = true; sosConfig.enableTransactional = true; + ((SOSServiceWithIPCConfig) sosConfig).androidContext = this.getApplicationContext(); sosConfig.moduleClass = SOSServiceWithIPC.class.getCanonicalName(); // Push Sensors Config diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index 4ccd2129..4271b654 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -8,7 +8,9 @@ import android.widget.Toast; import org.sensorhub.api.common.SensorHubException; +import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.service.sos.SOSService; +import org.sensorhub.impl.service.sos.SOSServiceConfig; import org.vast.ows.OWSException; import org.vast.ows.OWSRequest; import org.vast.ows.OWSUtils; @@ -22,7 +24,8 @@ import static android.content.ContentValues.TAG; -class SOSServiceWithIPC extends SOSService { +class SOSServiceWithIPC extends SOSService +{ @Override public void start() throws SensorHubException { @@ -30,7 +33,7 @@ public void start() throws SensorHubException // FUTURE: If we don't want to use HTTPServlet don't call this. // Could be set as a preference in the sharedPreference - Context androidContext = config.androidContext; + Context androidContext = ((SOSServiceWithIPCConfig) config).androidContext; BroadcastReceiver receiver = new BroadcastReceiver() { @@ -46,6 +49,7 @@ public void onReceive(Context context, Intent intent) sb.append('\n'); String sosPayload = intent.getStringExtra("SOS"); + Log.d(TAG, "onReceive: sosPayload: "+sosPayload); ipcHandler(sosPayload); String log = sb.toString(); @@ -58,7 +62,8 @@ public void onReceive(Context context, Intent intent) androidContext.registerReceiver(receiver, filter); } - private void ipcHandler(String body) { + private void ipcHandler(String body) + { OWSUtils owsUtils = new OWSUtils(); ByteArrayInputStream is = new ByteArrayInputStream(body.getBytes()); @@ -76,12 +81,27 @@ private void ipcHandler(String body) { // send response // convert back outputstream 'os' into something you can broadcast via IPC - } catch (DOMHelperException e) { + } + catch (DOMHelperException e) + { e.printStackTrace(); - } catch (IOException e) { + } + catch (IOException e) + { e.printStackTrace(); - } catch (OWSException e) { + } + catch (OWSException e) + { e.printStackTrace(); } } } + +class SOSServiceWithIPCConfig extends SOSServiceConfig +{ + Context androidContext; + + public SOSServiceWithIPCConfig() { + super(); + } +} From d7fb50c7de32282133828c3f9b4f73172baec95d Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Thu, 7 Mar 2019 15:33:40 -0600 Subject: [PATCH 043/207] WIP to fix cloning/crashing/stackoverflow error --- sensorhub-android-app/AndroidManifest.xml | 10 ++++++---- .../src/org/sensorhub/android/MainActivity.java | 7 +++++-- .../src/org/sensorhub/android/SOSServiceWithIPC.java | 12 +----------- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/sensorhub-android-app/AndroidManifest.xml b/sensorhub-android-app/AndroidManifest.xml index e26e2c54..9c677be5 100644 --- a/sensorhub-android-app/AndroidManifest.xml +++ b/sensorhub-android-app/AndroidManifest.xml @@ -9,18 +9,20 @@ - - + + + - + + android:theme="@style/AppTheme" + android:largeHeap="true"> Date: Thu, 7 Mar 2019 15:38:41 -0600 Subject: [PATCH 044/207] WIP to fix cloning/crashing/stackoverflow error --- .../sensorhub/android/SOSServiceWithIPCConfig.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java new file mode 100644 index 00000000..a64c9439 --- /dev/null +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java @@ -0,0 +1,14 @@ +package org.sensorhub.android; + +import android.content.Context; + +import org.sensorhub.impl.service.sos.SOSServiceConfig; + +public class SOSServiceWithIPCConfig extends SOSServiceConfig +{ + Context androidContext; + + public SOSServiceWithIPCConfig() { + super(); + } +} From d18e6b7d6b93dac85592b0af306c4f9601256662 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Thu, 7 Mar 2019 16:41:52 -0600 Subject: [PATCH 045/207] add transient --- .../src/org/sensorhub/android/SOSServiceWithIPCConfig.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java index a64c9439..d2238525 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java @@ -6,9 +6,10 @@ public class SOSServiceWithIPCConfig extends SOSServiceConfig { - Context androidContext; + public transient Context androidContext; - public SOSServiceWithIPCConfig() { + public SOSServiceWithIPCConfig() + { super(); } } From 18f7a01e32c43245c02098ed13fc3877b6d19d43 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 12 Mar 2019 10:27:00 -0500 Subject: [PATCH 046/207] WIP for androidContext for IPC and storage for new sensors via SOS-T --- build.gradle | 2 +- .../src/org/sensorhub/android/MainActivity.java | 15 ++++++++++++++- .../org/sensorhub/android/SOSServiceWithIPC.java | 4 ++-- settings.gradle | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 469313e4..8679a18c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -ext.oshCoreVersion = '1.3.2' +ext.oshCoreVersion = '1.3.3' ext.compileSdkVersion = 21 ext.minSdkVersion = 21 ext.targetSdkVersion = 21 diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 343bb5dd..808d2654 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -61,6 +61,7 @@ import org.sensorhub.impl.persistence.StreamStorageConfig; import org.sensorhub.impl.persistence.h2.MVMultiStorageImpl; import org.sensorhub.impl.persistence.h2.MVStorageConfig; +import org.sensorhub.impl.persistence.perst.BasicStorageConfig; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; @@ -174,7 +175,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) // SOS Config SOSServiceConfig sosConfig = new SOSServiceWithIPCConfig(); sosConfig.moduleClass = SOSServiceWithIPC.class.getCanonicalName(); - ((SOSServiceWithIPCConfig) sosConfig).androidContext = getApplicationContext(); +// ((SOSServiceWithIPCConfig) sosConfig).androidContext = getApplicationContext(); /* SOSServiceConfig sosConfig = new SOSServiceConfig(); */ @@ -183,6 +184,18 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.autoStart = true; sosConfig.enableTransactional = true; + + File dbFile = new File(getApplicationContext().getFilesDir()+"/db/"); + dbFile.mkdirs(); + MVStorageConfig basicStorageConfig = new MVStorageConfig(); + basicStorageConfig.moduleClass = "org.sensorhub.impl.persistence.h2.MVObsStorageImpl"; + basicStorageConfig.storagePath = dbFile.getAbsolutePath() + "/${STORAGE_ID}.dat"; + basicStorageConfig.autoStart = true; + sosConfig.newStorageConfig = basicStorageConfig; + Log.d(TAG, "updateConfig: storagePath: " + basicStorageConfig.storagePath); + Log.d(TAG, "updateConfig: canWrite: " + dbFile.canWrite()); + + // Push Sensors Config AndroidSensorsConfig androidSensorsConfig = (AndroidSensorsConfig) createSensorConfig(Sensors.Android); sensorhubConfig.add(androidSensorsConfig); diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index 836582ac..f7e7ef3d 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -31,7 +31,7 @@ public void start() throws SensorHubException // FUTURE: If we don't want to use HTTPServlet don't call this. // Could be set as a preference in the sharedPreference - Context androidContext = ((SOSServiceWithIPCConfig) config).androidContext; +// Context androidContext = ((SOSServiceWithIPCConfig) config).androidContext; BroadcastReceiver receiver = new BroadcastReceiver() { @@ -57,7 +57,7 @@ public void onReceive(Context context, Intent intent) }; IntentFilter filter = new IntentFilter(); filter.addAction("org.sofwerx.ogc.ACTION_SOS"); - androidContext.registerReceiver(receiver, filter); +// androidContext.registerReceiver(receiver, filter); } private void ipcHandler(String body) diff --git a/settings.gradle b/settings.gradle index 9a7ee952..f34b7f96 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,7 +5,7 @@ def oshMainDir = "$rootDir/.." def repos = [ 'osh-core':['lib-swe-common', 'lib-sensorml', 'lib-ows', 'sensorhub-core', 'sensorhub-service-swe', 'sensorhub-storage-perst', 'sensorhub-storage-h2'], 'osh-persistence':['sensorhub-storage-h2'], - 'osh-comm':['sensorhub-comm-ble'], + 'osh-comm':['sensorhub-comm-ble', 'sensorhub-comm-ble-dbus'], 'osh-sensors':['sensorhub-driver-angelsensor'], 'osh-video':['sensorhub-driver-videocam', 'sensorhub-service-video'], 'osh-positioning':['sensorhub-driver-trupulse'], From f8b7d1ef05749703bac64523a7e28dd863248c32 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 12 Mar 2019 10:58:39 -0500 Subject: [PATCH 047/207] update build and settings for sensorhub-service-swe and video stuff --- build.gradle | 2 ++ settings.gradle | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9bebae3c..8679a18c 100644 --- a/build.gradle +++ b/build.gradle @@ -47,6 +47,8 @@ subprojects { // force use of local projects substitute module('org.sensorhub:sensorhub-core') with project(':sensorhub-core') substitute module('org.sensorhub:sensorhub-comm-ble') with project(':sensorhub-comm-ble') + substitute module('org.sensorhub:sensorhub-service-swe') with project(':sensorhub-service-swe') + substitute module('org.sensorhub:sensorhub-service-video') with project(':sensorhub-service-video') substitute module('org.sensorhub:sensorhub-process-geoloc') with project(':sensorhub-process-geoloc') substitute module('org.vast.opengis:ogc-services-sps') with project(':ogc-services-sps') diff --git a/settings.gradle b/settings.gradle index 100d8c27..557d9496 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ def repos = [ 'osh-addons/sensors/health':['sensorhub-driver-angelsensor'], 'osh-addons/sensors/video':['sensorhub-driver-videocam', 'sensorhub-service-video'], 'osh-addons/sensors/positioning':['sensorhub-driver-trupulse'], - 'osh-addons/processing':['sensorhub-process-vecmath', 'sensorhub-process-geoloc']] + 'osh-addons/processing':['sensorhub-process-vecmath', 'sensorhub-process-geoloc', 'sensorhub-process-basicmath']] repos.each { repoName, modules -> File repoDir = new File(oshMainDir, repoName).getCanonicalFile() From ddc47b655f4a672d90c0ab18061fade1e3a27101 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 19 Mar 2019 11:02:00 -0500 Subject: [PATCH 048/207] clean code some --- .../src/org/sensorhub/android/MainActivity.java | 15 +++++---------- sensorhub-android-lib/build.gradle | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 808d2654..4d1b84e0 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -151,10 +151,9 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig = new InMemoryConfigDb(); // get SOS URL from config - // TODO: Undo hardcoding String sosUriConfig = prefs.getString("sos_uri", "http://127.0.0.1:8080/sensorhub/sos"); - String sosUser = prefs.getString("sos_username", "admin"); - String sosPwd = prefs.getString("sos_password", "admin"); + String sosUser = prefs.getString("sos_username", ""); + String sosPwd = prefs.getString("sos_password", ""); if (sosUriConfig != null && sosUriConfig.trim().length() > 0) { try @@ -173,18 +172,17 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(serverConfig); // SOS Config + /* SOSServiceConfig sosConfig = new SOSServiceWithIPCConfig(); sosConfig.moduleClass = SOSServiceWithIPC.class.getCanonicalName(); -// ((SOSServiceWithIPCConfig) sosConfig).androidContext = getApplicationContext(); - /* - SOSServiceConfig sosConfig = new SOSServiceConfig(); + ((SOSServiceWithIPCConfig) sosConfig).androidContext = this; */ + SOSServiceConfig sosConfig = new SOSServiceConfig(); sosConfig.id = "SOS_SERVICE"; sosConfig.name = "SOS Service"; sosConfig.autoStart = true; sosConfig.enableTransactional = true; - File dbFile = new File(getApplicationContext().getFilesDir()+"/db/"); dbFile.mkdirs(); MVStorageConfig basicStorageConfig = new MVStorageConfig(); @@ -192,9 +190,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) basicStorageConfig.storagePath = dbFile.getAbsolutePath() + "/${STORAGE_ID}.dat"; basicStorageConfig.autoStart = true; sosConfig.newStorageConfig = basicStorageConfig; - Log.d(TAG, "updateConfig: storagePath: " + basicStorageConfig.storagePath); - Log.d(TAG, "updateConfig: canWrite: " + dbFile.canWrite()); - // Push Sensors Config AndroidSensorsConfig androidSensorsConfig = (AndroidSensorsConfig) createSensorConfig(Sensors.Android); diff --git a/sensorhub-android-lib/build.gradle b/sensorhub-android-lib/build.gradle index 12a9a3c0..279f0a57 100644 --- a/sensorhub-android-lib/build.gradle +++ b/sensorhub-android-lib/build.gradle @@ -11,7 +11,7 @@ dependencies { //compile 'org.sensorhub:sensorhub-driver-angelsensor:[0.1,2.0)' api project(':sensorhub-core') api project(':sensorhub-service-swe') - api project(':sensorhub-storage-perst') +// api project(':sensorhub-storage-perst') api project(':sensorhub-storage-h2') api project(':sensorhub-service-video') api project(':sensorhub-comm-ble') From 77bbee470f63b2b35efc9332764128eeaa874ee5 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 19 Mar 2019 11:05:51 -0500 Subject: [PATCH 049/207] revert SOSServiceWithIPC.java --- .../src/org/sensorhub/android/SOSServiceWithIPC.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index f7e7ef3d..cb337279 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -31,7 +31,7 @@ public void start() throws SensorHubException // FUTURE: If we don't want to use HTTPServlet don't call this. // Could be set as a preference in the sharedPreference -// Context androidContext = ((SOSServiceWithIPCConfig) config).androidContext; + Context androidContext = ((SOSServiceWithIPCConfig) config).androidContext; BroadcastReceiver receiver = new BroadcastReceiver() { @@ -57,7 +57,8 @@ public void onReceive(Context context, Intent intent) }; IntentFilter filter = new IntentFilter(); filter.addAction("org.sofwerx.ogc.ACTION_SOS"); -// androidContext.registerReceiver(receiver, filter); + + androidContext.registerReceiver(receiver, filter); } private void ipcHandler(String body) From 83ceaebb1f021373f454f16c88f3812771247717 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 19 Mar 2019 11:11:22 -0500 Subject: [PATCH 050/207] fix broken import --- .../src/org/sensorhub/android/MainActivity.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 4d1b84e0..cb717977 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -61,7 +61,6 @@ import org.sensorhub.impl.persistence.StreamStorageConfig; import org.sensorhub.impl.persistence.h2.MVMultiStorageImpl; import org.sensorhub.impl.persistence.h2.MVStorageConfig; -import org.sensorhub.impl.persistence.perst.BasicStorageConfig; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; From 5038e1813a1a78ddf3a6bd112fbe8139bbd245cb Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 19 Mar 2019 14:37:51 -0500 Subject: [PATCH 051/207] use getApplicationContext --- .../src/org/sensorhub/android/MainActivity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index cb717977..696c80ae 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -171,12 +171,12 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(serverConfig); // SOS Config - /* SOSServiceConfig sosConfig = new SOSServiceWithIPCConfig(); sosConfig.moduleClass = SOSServiceWithIPC.class.getCanonicalName(); - ((SOSServiceWithIPCConfig) sosConfig).androidContext = this; - */ + ((SOSServiceWithIPCConfig) sosConfig).androidContext = this.getApplicationContext(); + /* SOSServiceConfig sosConfig = new SOSServiceConfig(); + */ sosConfig.id = "SOS_SERVICE"; sosConfig.name = "SOS Service"; sosConfig.autoStart = true; From f334cdec914cad1ecc9b4064ead419a8a13c8678 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Wed, 20 Mar 2019 14:21:06 -0500 Subject: [PATCH 052/207] fix cloning bug that keeps crashing app --- .../src/org/sensorhub/android/SOSServiceWithIPC.java | 4 ++-- .../src/org/sensorhub/android/SOSServiceWithIPCConfig.java | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index cb337279..f7619b20 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -48,11 +48,11 @@ public void onReceive(Context context, Intent intent) String sosPayload = intent.getStringExtra("SOS"); Log.d(TAG, "onReceive: sosPayload: "+sosPayload); - ipcHandler(sosPayload); - String log = sb.toString(); Log.d(TAG, log); Toast.makeText(context, log, Toast.LENGTH_LONG).show(); + +// ipcHandler(sosPayload); } }; IntentFilter filter = new IntentFilter(); diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java index d2238525..a9701650 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPCConfig.java @@ -2,6 +2,7 @@ import android.content.Context; +import org.sensorhub.api.module.ModuleConfig; import org.sensorhub.impl.service.sos.SOSServiceConfig; public class SOSServiceWithIPCConfig extends SOSServiceConfig @@ -12,4 +13,10 @@ public SOSServiceWithIPCConfig() { super(); } + + @Override + public ModuleConfig clone() + { + return this; // disable clone for now as it crashes Android app + } } From 6c2156a48cf5c024f4df3b6929c9c2781d2ddc0e Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 26 Mar 2019 11:27:40 -0500 Subject: [PATCH 053/207] add initial IPC handler --- .../sensorhub/android/SOSServiceWithIPC.java | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index f7619b20..9e7d17d2 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -4,8 +4,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.util.Log; -import android.widget.Toast; import org.sensorhub.api.common.SensorHubException; import org.sensorhub.impl.service.sos.SOSService; @@ -20,10 +18,12 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; -import static android.content.ContentValues.TAG; - public class SOSServiceWithIPC extends SOSService { + public static final String ACTION_SOS = "org.sofwerx.ogc.ACTION_SOS"; + private static final String EXTRA_PAYLOAD = "SOS"; + private static final String EXTRA_ORIGIN = "src"; + @Override public void start() throws SensorHubException { @@ -38,26 +38,12 @@ public void start() throws SensorHubException @Override public void onReceive(Context context, Intent intent) { - StringBuilder sb = new StringBuilder(); - - sb.append('\n'); - sb.append("Action: " + intent.getAction()); - sb.append('\n'); - sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME)); - sb.append('\n'); - - String sosPayload = intent.getStringExtra("SOS"); - Log.d(TAG, "onReceive: sosPayload: "+sosPayload); - String log = sb.toString(); - Log.d(TAG, log); - Toast.makeText(context, log, Toast.LENGTH_LONG).show(); - -// ipcHandler(sosPayload); + String sosPayload = intent.getStringExtra(EXTRA_PAYLOAD); + ipcHandler(sosPayload); } }; IntentFilter filter = new IntentFilter(); - filter.addAction("org.sofwerx.ogc.ACTION_SOS"); - + filter.addAction(ACTION_SOS); androidContext.registerReceiver(receiver, filter); } From ea8387687bc5b93ea64f9ec6114c06d4343ea06b Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 26 Mar 2019 11:35:56 -0500 Subject: [PATCH 054/207] clean up code --- .../src/org/sensorhub/android/SOSServiceWithIPC.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index 9e7d17d2..c6358b94 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -56,13 +56,13 @@ private void ipcHandler(String body) try { DOMHelper dom = new DOMHelper(is, false); Element requestElt = dom.getBaseElement(); - OWSRequest req = owsUtils.readXMLQuery(dom, requestElt); + OWSRequest request = owsUtils.readXMLQuery(dom, requestElt); // Subclass of OWSRequest (InsertSensor Object) // process request and get response - ByteArrayOutputStream os = new ByteArrayOutputStream(); - req.setResponseStream(os); - servlet.handleRequest(req); + ByteArrayOutputStream requestOutputStream = new ByteArrayOutputStream(); + request.setResponseStream(requestOutputStream); + servlet.handleRequest(request); // send response // convert back outputstream 'os' into something you can broadcast via IPC From 6fb270e9df5b383b36853f63e3e43664338b444f Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 26 Mar 2019 11:53:46 -0500 Subject: [PATCH 055/207] extrct payload for response --- .../src/org/sensorhub/android/SOSServiceWithIPC.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index c6358b94..2f897152 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -60,12 +60,13 @@ private void ipcHandler(String body) // Subclass of OWSRequest (InsertSensor Object) // process request and get response - ByteArrayOutputStream requestOutputStream = new ByteArrayOutputStream(); - request.setResponseStream(requestOutputStream); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + request.setResponseStream(responseStream); servlet.handleRequest(request); // send response // convert back outputstream 'os' into something you can broadcast via IPC + String responsePayload = responseStream.toString(); } catch (DOMHelperException e) { From 6c4e7255c82cc22fabd161c49cfbc965295f8666 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 26 Mar 2019 13:17:51 -0500 Subject: [PATCH 056/207] add IPC response --- .../sensorhub/android/SOSServiceWithIPC.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index 2f897152..03502542 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -23,6 +23,7 @@ public class SOSServiceWithIPC extends SOSService public static final String ACTION_SOS = "org.sofwerx.ogc.ACTION_SOS"; private static final String EXTRA_PAYLOAD = "SOS"; private static final String EXTRA_ORIGIN = "src"; + private Context androidContext; @Override public void start() throws SensorHubException @@ -31,15 +32,19 @@ public void start() throws SensorHubException // FUTURE: If we don't want to use HTTPServlet don't call this. // Could be set as a preference in the sharedPreference - Context androidContext = ((SOSServiceWithIPCConfig) config).androidContext; + androidContext = ((SOSServiceWithIPCConfig) config).androidContext; BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - String sosPayload = intent.getStringExtra(EXTRA_PAYLOAD); - ipcHandler(sosPayload); + String origin = intent.getStringExtra(EXTRA_ORIGIN); + if (!context.getPackageName().equalsIgnoreCase(origin)) + { + String requestPayload = intent.getStringExtra(EXTRA_PAYLOAD); + handleIPCRequest(requestPayload); + } } }; IntentFilter filter = new IntentFilter(); @@ -47,10 +52,9 @@ public void onReceive(Context context, Intent intent) androidContext.registerReceiver(receiver, filter); } - private void ipcHandler(String body) + private void handleIPCRequest(String body) { OWSUtils owsUtils = new OWSUtils(); - ByteArrayInputStream is = new ByteArrayInputStream(body.getBytes()); try { @@ -64,9 +68,13 @@ private void ipcHandler(String body) request.setResponseStream(responseStream); servlet.handleRequest(request); - // send response - // convert back outputstream 'os' into something you can broadcast via IPC + // send response; String responsePayload = responseStream.toString(); + Intent responseIntent = new Intent(); + responseIntent.setAction(ACTION_SOS); + responseIntent.putExtra(EXTRA_ORIGIN, androidContext.getPackageName()); + responseIntent.putExtra(EXTRA_PAYLOAD, responsePayload); + androidContext.sendBroadcast(responseIntent); } catch (DOMHelperException e) { From b26629a408a8ecfc2528e558d0baf98604ed579c Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 9 Apr 2019 11:47:49 -0500 Subject: [PATCH 057/207] check if pushing sensor before adding SOS-T Config --- .../org/sensorhub/android/MainActivity.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 696c80ae..cc394b30 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -193,7 +193,10 @@ protected void updateConfig(SharedPreferences prefs, String runName) // Push Sensors Config AndroidSensorsConfig androidSensorsConfig = (AndroidSensorsConfig) createSensorConfig(Sensors.Android); sensorhubConfig.add(androidSensorsConfig); - addSosTConfig(androidSensorsConfig, sosUser, sosPwd); + if (isPushingSensor()) { + Log.d(TAG, "updateConfig: HERE"); + addSosTConfig(androidSensorsConfig, sosUser, sosPwd); + } StreamStorageConfig androidStreamStorageConfig = createStreamStorageConfig(androidSensorsConfig); addStorageConfig(androidSensorsConfig, androidStreamStorageConfig); @@ -258,13 +261,35 @@ protected void updateConfig(SharedPreferences prefs, String runName) } */ - // TODO - // - Derive a new class from SOS service in the same package as sos service. - // - This is a class that instantiates the servlet. - // - Derive from that and add IPC receiver logic. sensorhubConfig.add(sosConfig); } + private boolean isPushingSensor() + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + + if (prefs.getBoolean("accelerometer_enable", false) + && prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (prefs.getBoolean("gyroscope_enable", false) + && prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (prefs.getBoolean("magnetometer_enable", false) + && prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (!prefs.getBoolean("orientation_enable", false) + && prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (!prefs.getBoolean("location_enable", false) + && prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (!prefs.getBoolean("video_enable", false) + && prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + + return false; + } + private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig sensorConfig) { SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); From 1f942d2faa5ed2f2d636702da76fa4f37d97fcb9 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 9 Apr 2019 11:50:08 -0500 Subject: [PATCH 058/207] change default port to 8585 --- sensorhub-android-app/res/xml/pref_general.xml | 2 +- .../src/org/sensorhub/android/MainActivity.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sensorhub-android-app/res/xml/pref_general.xml b/sensorhub-android-app/res/xml/pref_general.xml index 5bf744b0..610e40fe 100644 --- a/sensorhub-android-app/res/xml/pref_general.xml +++ b/sensorhub-android-app/res/xml/pref_general.xml @@ -17,7 +17,7 @@ android:summary="" /> 0) @@ -167,6 +167,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) // HTTP Server Config HttpServerConfig serverConfig = new HttpServerConfig(); + serverConfig.httpPort = 8585; serverConfig.autoStart = true; sensorhubConfig.add(serverConfig); From 990d90afe264a1bd822605300a22b3e50eb9b83d Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 22 Apr 2019 10:09:16 -0500 Subject: [PATCH 059/207] update trupulse sensor settings and fuctionality to new datasource and ouput options --- sensorhub-android-app/res/values/strings.xml | 10 +++ .../res/xml/pref_sensors.xml | 31 ++++++--- .../org/sensorhub/android/MainActivity.java | 63 +++++++++++-------- .../android/UserSettingsActivity.java | 11 ++++ 4 files changed, 80 insertions(+), 35 deletions(-) diff --git a/sensorhub-android-app/res/values/strings.xml b/sensorhub-android-app/res/values/strings.xml index 0f2750e7..99de9f5f 100644 --- a/sensorhub-android-app/res/values/strings.xml +++ b/sensorhub-android-app/res/values/strings.xml @@ -50,4 +50,14 @@ PUSH_REMOTE + + + Streaming Physical Device + Simulate Virtual Device + + + STREAM + SIMULATE + + STREAM diff --git a/sensorhub-android-app/res/xml/pref_sensors.xml b/sensorhub-android-app/res/xml/pref_sensors.xml index 95be65d3..8b6d9a44 100644 --- a/sensorhub-android-app/res/xml/pref_sensors.xml +++ b/sensorhub-android-app/res/xml/pref_sensors.xml @@ -180,17 +180,28 @@ - + - + + + { + trupulseOptions.setEnabled((boolean) newValue); + trupulseDatasource.setEnabled((boolean) newValue); + return true; + }); } } From a46b6124ea206574bfe63a827a4c285abf6262ca Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 22 Apr 2019 10:10:12 -0500 Subject: [PATCH 060/207] clean code --- .../res/xml/pref_sensors.xml | 61 ------------------- 1 file changed, 61 deletions(-) diff --git a/sensorhub-android-app/res/xml/pref_sensors.xml b/sensorhub-android-app/res/xml/pref_sensors.xml index 8b6d9a44..4231c454 100644 --- a/sensorhub-android-app/res/xml/pref_sensors.xml +++ b/sensorhub-android-app/res/xml/pref_sensors.xml @@ -115,67 +115,6 @@ android:entries="@array/sos_option_list" android:entryValues="@array/sos_option_values" android:defaultValue="@array/sos_option_defaults" /> - - - Date: Mon, 20 May 2019 09:45:32 -0500 Subject: [PATCH 061/207] add sqan situational awareness broadcast listener --- .../org/sensorhub/android/MainActivity.java | 1 + .../sensorhub/android/SOSServiceWithIPC.java | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 1ac981e8..3cc64896 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -167,6 +167,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) // HTTP Server Config HttpServerConfig serverConfig = new HttpServerConfig(); + serverConfig.proxyBaseUrl = ""; serverConfig.httpPort = 8585; serverConfig.autoStart = true; sensorhubConfig.add(serverConfig); diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index 03502542..4de90793 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.util.Log; import org.sensorhub.api.common.SensorHubException; import org.sensorhub.impl.service.sos.SOSService; @@ -18,8 +19,12 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; +import static android.content.ContentValues.TAG; + public class SOSServiceWithIPC extends SOSService { + public static final String SQAN_TEST = "SA"; + private static final String SQAN_EXTRA = "channel"; public static final String ACTION_SOS = "org.sofwerx.ogc.ACTION_SOS"; private static final String EXTRA_PAYLOAD = "SOS"; private static final String EXTRA_ORIGIN = "src"; @@ -43,6 +48,12 @@ public void onReceive(Context context, Intent intent) if (!context.getPackageName().equalsIgnoreCase(origin)) { String requestPayload = intent.getStringExtra(EXTRA_PAYLOAD); + + StringBuilder sb = new StringBuilder(); + sb.append('\n' + requestPayload + '\n'); + String log = sb.toString(); + Log.d(TAG, "onReceive: " + log); + handleIPCRequest(requestPayload); } } @@ -50,6 +61,24 @@ public void onReceive(Context context, Intent intent) IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_SOS); androidContext.registerReceiver(receiver, filter); + + BroadcastReceiver testReceiver = new BroadcastReceiver() + { + @Override + public void onReceive(Context context, Intent intent) + { + Log.d(TAG, "onReceive: SQAN"); + String channel = intent.getStringExtra(SQAN_EXTRA); + StringBuilder sb = new StringBuilder(); + sb.append('\n' + channel + '\n'); + String log = sb.toString(); + Log.d(TAG, "testReceive: " + log); + } + }; + IntentFilter testFilter = new IntentFilter(); + testFilter.addAction(SQAN_TEST); + androidContext.registerReceiver(testReceiver, testFilter); + Log.d(TAG, "start: "); } private void handleIPCRequest(String body) @@ -68,6 +97,11 @@ private void handleIPCRequest(String body) request.setResponseStream(responseStream); servlet.handleRequest(request); + Log.d(TAG, "handleIPCRequest: " + request.toString()); + + /** + * request are small usually, but responses can be really large. There is a limit to the size of response + */ // send response; String responsePayload = responseStream.toString(); Intent responseIntent = new Intent(); @@ -88,6 +122,10 @@ private void handleIPCRequest(String body) { e.printStackTrace(); } + // OGCException e + /** + * TODO: Look how server is handling the this exception + */ } } From 3a17c80297589b486be88dc4baf303c372c644b3 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Mon, 20 May 2019 12:03:19 -0500 Subject: [PATCH 062/207] add SOS-T interface --- sensorhub-android-app/res/values/strings.xml | 2 + .../res/xml/pref_general.xml | 75 +++++++++++++------ .../org/sensorhub/android/MainActivity.java | 53 +++++++++++-- .../android/UserSettingsActivity.java | 2 + 4 files changed, 103 insertions(+), 29 deletions(-) diff --git a/sensorhub-android-app/res/values/strings.xml b/sensorhub-android-app/res/values/strings.xml index 99de9f5f..3fb3e3c3 100644 --- a/sensorhub-android-app/res/values/strings.xml +++ b/sensorhub-android-app/res/values/strings.xml @@ -6,6 +6,8 @@ Start SensorHub Stop SensorHub About + SOS Settings (Required) + SOS-T Settings (Optional) Android Sensor TruPulse Range Finder Sensor Angel Sensor diff --git a/sensorhub-android-app/res/xml/pref_general.xml b/sensorhub-android-app/res/xml/pref_general.xml index 610e40fe..86ab91af 100644 --- a/sensorhub-android-app/res/xml/pref_general.xml +++ b/sensorhub-android-app/res/xml/pref_general.xml @@ -16,29 +16,56 @@ android:title="Current IP Address" android:summary="" /> - - - - - + + + + + + + + + + + + + diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 3cc64896..66d8cfe4 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -54,6 +54,7 @@ import org.sensorhub.impl.client.sost.SOSTClient; import org.sensorhub.impl.client.sost.SOSTClient.StreamInfo; import org.sensorhub.impl.client.sost.SOSTClientConfig; +import org.sensorhub.impl.comm.HTTPConfig; import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; import org.sensorhub.impl.module.InMemoryConfigDb; import org.sensorhub.impl.persistence.GenericStreamStorage; @@ -122,6 +123,7 @@ enum Sensors { boolean oshStarted = false; ArrayList sostClients = new ArrayList(); URL sosUrl = null; + URL sostUrl = null; boolean showVideo; private ServiceConnection sConn = new ServiceConnection() @@ -176,9 +178,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) SOSServiceConfig sosConfig = new SOSServiceWithIPCConfig(); sosConfig.moduleClass = SOSServiceWithIPC.class.getCanonicalName(); ((SOSServiceWithIPCConfig) sosConfig).androidContext = this.getApplicationContext(); - /* - SOSServiceConfig sosConfig = new SOSServiceConfig(); - */ sosConfig.id = "SOS_SERVICE"; sosConfig.name = "SOS Service"; sosConfig.autoStart = true; @@ -268,6 +267,51 @@ protected void updateConfig(SharedPreferences prefs, String runName) */ sensorhubConfig.add(sosConfig); + + // Get SOS-T URL from config + String sostUriConfig = prefs.getString("sost_uri", ""); + String sostUser = prefs.getString("sost_username", ""); + String sostPwd = prefs.getString("sost_password", ""); + if (sostUriConfig != null && sostUriConfig.trim().length() > 0) + { + try { + sostUrl = new URL(sostUriConfig); + } + catch (MalformedURLException e) + { + e.printStackTrace(); + } + } + + if (!sostUriConfig.contentEquals("")) { + // SOS-T Client Config + SOSTClientConfig sostConfig = new SOSTClientConfig(); + sostConfig.sensorID = androidSensorsConfig.id; + sostConfig.moduleClass = SOSTClient.class.getCanonicalName(); + sostConfig.id = "SOST_CLIENT"; + sostConfig.name = "SOS-T Client"; + sostConfig.autoStart = true; + + // SOS-T Client HTTP Config + sostConfig.sos = new HTTPConfig(); + sostConfig.sos.enableTLS = sostUrl.getProtocol().toUpperCase().contains("HTTPS") ? true : false; + sostConfig.sos.remoteHost = sostUrl.getHost(); + sostConfig.sos.remotePort = sostUrl.getPort(); + sostConfig.sos.resourcePath = sostUrl.getPath(); + sostConfig.sos.user = sostUser; + sostConfig.sos.password = sostPwd; + + sostConfig.connection = new SOSTClientConfig.SOSConnectionConfig(); + sostConfig.connection.usePersistentConnection = true; + sostConfig.connection.maxQueueSize = 10; + sostConfig.connection.maxConnectErrors = 10; + sostConfig.connection.checkReachability = true; + sostConfig.connection.connectTimeout = 3000; + sostConfig.connection.reconnectPeriod = 10000; + sostConfig.connection.reconnectAttempts = 10; + + sensorhubConfig.add(sostConfig); + } } private boolean isPushingSensor(Sensors sensor) @@ -365,10 +409,9 @@ private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig senso private SensorConfig createSensorConfig(Sensors sensor) { SensorConfig sensorConfig; + if (Sensors.Android.equals(sensor)) { - Log.d(TAG, "createSensorConfig: Creating android sensor"); - sensorConfig = new AndroidSensorsConfig(); sensorConfig.id = "urn:device:android:" + deviceID; sensorConfig.name = "Android Sensors [" + deviceName + "]"; diff --git a/sensorhub-android-app/src/org/sensorhub/android/UserSettingsActivity.java b/sensorhub-android-app/src/org/sensorhub/android/UserSettingsActivity.java index a8ab8f17..91639492 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/UserSettingsActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/UserSettingsActivity.java @@ -123,6 +123,8 @@ public void onCreate(Bundle savedInstanceState) bindPreferenceSummaryToValue(findPreference("device_name")); bindPreferenceSummaryToValue(findPreference("sos_uri")); bindPreferenceSummaryToValue(findPreference("sos_username")); + bindPreferenceSummaryToValue(findPreference("sost_uri")); + bindPreferenceSummaryToValue(findPreference("sost_username")); WifiManager wifiManager = (WifiManager) getActivity().getApplicationContext().getSystemService(WIFI_SERVICE); int ipAddress = wifiManager.getConnectionInfo().getIpAddress(); From 13f08690f5214d656c739df769e2408b0ccbac11 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 18 Jun 2019 12:28:47 -0500 Subject: [PATCH 063/207] wip --- sensorhub-android-app/AndroidManifest.xml | 4 +- .../org/sensorhub/android/MainActivity.java | 97 ++++++++++++++++++- .../sensorhub/android/SOSServiceWithIPC.java | 35 +------ 3 files changed, 97 insertions(+), 39 deletions(-) diff --git a/sensorhub-android-app/AndroidManifest.xml b/sensorhub-android-app/AndroidManifest.xml index 9c677be5..bf4cff68 100644 --- a/sensorhub-android-app/AndroidManifest.xml +++ b/sensorhub-android-app/AndroidManifest.xml @@ -13,9 +13,11 @@ - + + + sostClients = new ArrayList(); + ArrayList sweVirtualSensorConfigs = new ArrayList(); URL sosUrl = null; URL sostUrl = null; boolean showVideo; @@ -266,8 +274,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) } */ - sensorhubConfig.add(sosConfig); - + /* // Get SOS-T URL from config String sostUriConfig = prefs.getString("sost_uri", ""); String sostUser = prefs.getString("sost_username", ""); @@ -283,7 +290,8 @@ protected void updateConfig(SharedPreferences prefs, String runName) } } - if (!sostUriConfig.contentEquals("")) { + if (!sostUriConfig.contentEquals("")) + { // SOS-T Client Config SOSTClientConfig sostConfig = new SOSTClientConfig(); sostConfig.sensorID = androidSensorsConfig.id; @@ -312,6 +320,22 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(sostConfig); } + */ + + // SOS Data Providers + for (SWEVirtualSensorConfig sweVirtualSensorConfig : sweVirtualSensorConfigs) { + sensorhubConfig.add(sweVirtualSensorConfig); + + SensorDataProviderConfig sweVirtualSensorDataProviderConfig = new SensorDataProviderConfig(); + sweVirtualSensorDataProviderConfig.name = sweVirtualSensorConfig.id; + sweVirtualSensorDataProviderConfig.sensorID = sweVirtualSensorConfig.id; + sweVirtualSensorDataProviderConfig.offeringID = sweVirtualSensorConfig.id+"-sos"; + sweVirtualSensorDataProviderConfig.enabled = true; + + sosConfig.dataProviders.add(sweVirtualSensorDataProviderConfig); + } + + sensorhubConfig.add(sosConfig); } private boolean isPushingSensor(Sensors sensor) @@ -496,6 +520,10 @@ else if (Sensors.FlirOne.equals(sensor)) ((FlirOneCameraConfig) sensorConfig).androidContext = this.getApplicationContext(); ((FlirOneCameraConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); } + else if (Sensors.SWEVirtualSensor.equals(sensor)) + { + sensorConfig = new SWEVirtualSensorConfig(); + } else { sensorConfig = new SensorConfig(); @@ -865,6 +893,65 @@ protected void onCreate(Bundle savedInstanceState) // handler to refresh sensor status in UI displayHandler = new Handler(Looper.getMainLooper()); + + setupBroadcastReceivers(); + } + + + private void setupBroadcastReceivers() { + BroadcastReceiver receiver = new BroadcastReceiver() + { + @Override + public void onReceive(Context context, Intent intent) + { + String origin = intent.getStringExtra("src"); + if (!context.getPackageName().equalsIgnoreCase(origin)) + { + String sosEndpointUrl = intent.getStringExtra("sosEndpointUrl"); + String name = intent.getStringExtra("name"); + String sensorId = intent.getStringExtra("sensorId"); + ArrayList properties = intent.getStringArrayListExtra("properties"); + + if (sosEndpointUrl== null || name == null || sensorId == null || properties.size() == 0) + { + return; + } + + SWEVirtualSensorConfig sweVirtualSensorConfig = (SWEVirtualSensorConfig) createSensorConfig(Sensors.SWEVirtualSensor); + sweVirtualSensorConfig.sosEndpointUrl = sosEndpointUrl; + sweVirtualSensorConfig.name = name; + sweVirtualSensorConfig.id = sensorId; + sweVirtualSensorConfig.sensorUID = sensorId; + for (String property : properties) + { + sweVirtualSensorConfig.observedProperties.add(property); + } + sweVirtualSensorConfig.sosUseWebsockets = true; + sweVirtualSensorConfig.autoStart = true; + sweVirtualSensorConfigs.add(sweVirtualSensorConfig); + } + } + }; + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_BROADCAST_RECEIVER); + + registerReceiver(receiver, filter); + } + + + private void testBroadcastReceiver() { + ArrayList testProperties = new ArrayList(); + testProperties.add("http://sensorml.com/ont/swe/property/Acceleration"); + testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); + testProperties.add("http://sensorml.com/ont/swe/property/AngularRate"); + + Intent testIntent = new Intent(); + testIntent.setAction(ACTION_BROADCAST_RECEIVER); + testIntent.putExtra("sosEndpointUrl", "http://192.168.0.43:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); + testIntent.putExtra("name", "Android Sensors [Pocophone]"); + testIntent.putExtra("sensorId", "urn:android:device:a0b0515feaa872a4"); + testIntent.putStringArrayListExtra("properties", testProperties); + sendBroadcast(testIntent); } @@ -935,7 +1022,7 @@ protected void showRunNamePopup() public void onClick(DialogInterface dialog, int whichButton) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - String runName = input.getText().toString(); + runName = input.getText().toString(); newStatusMessage("Starting SensorHub..."); updateConfig(PreferenceManager.getDefaultSharedPreferences(MainActivity.this), runName); diff --git a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java index 4de90793..f3016065 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java +++ b/sensorhub-android-app/src/org/sensorhub/android/SOSServiceWithIPC.java @@ -4,7 +4,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.util.Log; import org.sensorhub.api.common.SensorHubException; import org.sensorhub.impl.service.sos.SOSService; @@ -34,9 +33,6 @@ public class SOSServiceWithIPC extends SOSService public void start() throws SensorHubException { super.start(); - // FUTURE: If we don't want to use HTTPServlet don't call this. - // Could be set as a preference in the sharedPreference - androidContext = ((SOSServiceWithIPCConfig) config).androidContext; BroadcastReceiver receiver = new BroadcastReceiver() @@ -48,37 +44,14 @@ public void onReceive(Context context, Intent intent) if (!context.getPackageName().equalsIgnoreCase(origin)) { String requestPayload = intent.getStringExtra(EXTRA_PAYLOAD); - - StringBuilder sb = new StringBuilder(); - sb.append('\n' + requestPayload + '\n'); - String log = sb.toString(); - Log.d(TAG, "onReceive: " + log); - handleIPCRequest(requestPayload); } } }; IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_SOS); - androidContext.registerReceiver(receiver, filter); - BroadcastReceiver testReceiver = new BroadcastReceiver() - { - @Override - public void onReceive(Context context, Intent intent) - { - Log.d(TAG, "onReceive: SQAN"); - String channel = intent.getStringExtra(SQAN_EXTRA); - StringBuilder sb = new StringBuilder(); - sb.append('\n' + channel + '\n'); - String log = sb.toString(); - Log.d(TAG, "testReceive: " + log); - } - }; - IntentFilter testFilter = new IntentFilter(); - testFilter.addAction(SQAN_TEST); - androidContext.registerReceiver(testReceiver, testFilter); - Log.d(TAG, "start: "); + androidContext.registerReceiver(receiver, filter); } private void handleIPCRequest(String body) @@ -90,24 +63,20 @@ private void handleIPCRequest(String body) DOMHelper dom = new DOMHelper(is, false); Element requestElt = dom.getBaseElement(); OWSRequest request = owsUtils.readXMLQuery(dom, requestElt); - // Subclass of OWSRequest (InsertSensor Object) - // process request and get response ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); request.setResponseStream(responseStream); servlet.handleRequest(request); - Log.d(TAG, "handleIPCRequest: " + request.toString()); - /** * request are small usually, but responses can be really large. There is a limit to the size of response */ - // send response; String responsePayload = responseStream.toString(); Intent responseIntent = new Intent(); responseIntent.setAction(ACTION_SOS); responseIntent.putExtra(EXTRA_ORIGIN, androidContext.getPackageName()); responseIntent.putExtra(EXTRA_PAYLOAD, responsePayload); + androidContext.sendBroadcast(responseIntent); } catch (DOMHelperException e) From f1f08a8f1dcf30d5170be19e8e54bb2884c9a091 Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Wed, 19 Jun 2019 12:51:56 -0500 Subject: [PATCH 064/207] import basic usage of ProxySensor --- .../org/sensorhub/android/MainActivity.java | 61 +++++++------------ 1 file changed, 23 insertions(+), 38 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 3963724b..92fa6537 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -20,8 +20,6 @@ import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; @@ -46,7 +44,6 @@ import org.sensorhub.android.comm.ble.BleNetwork; import org.sensorhub.api.common.Event; import org.sensorhub.api.common.IEventListener; -import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleEvent; import org.sensorhub.api.sensor.ISensorDataInterface; @@ -54,7 +51,6 @@ import org.sensorhub.impl.client.sost.SOSTClient; import org.sensorhub.impl.client.sost.SOSTClient.StreamInfo; import org.sensorhub.impl.client.sost.SOSTClientConfig; -import org.sensorhub.impl.comm.HTTPConfig; import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; import org.sensorhub.impl.module.InMemoryConfigDb; import org.sensorhub.impl.persistence.GenericStreamStorage; @@ -64,22 +60,12 @@ import org.sensorhub.impl.persistence.h2.MVStorageConfig; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; -import org.sensorhub.impl.sensor.swe.SWEVirtualSensor; -import org.sensorhub.impl.sensor.swe.SWEVirtualSensorConfig; +import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; -import org.sensorhub.impl.service.sos.SOSProviderConfig; -import org.sensorhub.impl.service.sos.SOSService; import org.sensorhub.impl.service.sos.SOSServiceConfig; import org.sensorhub.impl.service.sos.SensorDataProviderConfig; -import org.sensorhub.impl.service.swe.OfferingList; import org.sensorhub.test.sensor.trupulse.SimulatedDataStream; import org.sensorhub.impl.service.HttpServerConfig; -import org.vast.ows.OWSException; -import org.vast.ows.OWSRequest; -import org.vast.ows.OWSUtils; -import org.vast.xml.DOMHelper; -import org.vast.xml.DOMHelperException; -import org.w3c.dom.Element; import android.annotation.SuppressLint; import android.app.Activity; @@ -99,7 +85,6 @@ import android.text.Html; import android.widget.EditText; import android.widget.TextView; -import android.widget.Toast; import static android.content.ContentValues.TAG; @@ -118,7 +103,7 @@ enum Sensors { Angel, FlirOne, DJIDrone, - SWEVirtualSensor + ProxySensor } TextView textArea; @@ -128,8 +113,8 @@ enum Sensors { Runnable displayCallback; StringBuffer displayText = new StringBuffer(); boolean oshStarted = false; - ArrayList sostClients = new ArrayList(); - ArrayList sweVirtualSensorConfigs = new ArrayList(); + ArrayList sostClients = new ArrayList<>(); + ArrayList proxySensorConfigs = new ArrayList<>(); URL sosUrl = null; URL sostUrl = null; boolean showVideo; @@ -323,16 +308,16 @@ protected void updateConfig(SharedPreferences prefs, String runName) */ // SOS Data Providers - for (SWEVirtualSensorConfig sweVirtualSensorConfig : sweVirtualSensorConfigs) { - sensorhubConfig.add(sweVirtualSensorConfig); + for (ProxySensorConfig proxySensorConfig : proxySensorConfigs) { + sensorhubConfig.add(proxySensorConfig); - SensorDataProviderConfig sweVirtualSensorDataProviderConfig = new SensorDataProviderConfig(); - sweVirtualSensorDataProviderConfig.name = sweVirtualSensorConfig.id; - sweVirtualSensorDataProviderConfig.sensorID = sweVirtualSensorConfig.id; - sweVirtualSensorDataProviderConfig.offeringID = sweVirtualSensorConfig.id+"-sos"; - sweVirtualSensorDataProviderConfig.enabled = true; + SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); + dataProviderConfig.name = proxySensorConfig.id; + dataProviderConfig.sensorID = proxySensorConfig.id; + dataProviderConfig.offeringID = proxySensorConfig.id+"-sos"; + dataProviderConfig.enabled = true; - sosConfig.dataProviders.add(sweVirtualSensorDataProviderConfig); + sosConfig.dataProviders.add(dataProviderConfig); } sensorhubConfig.add(sosConfig); @@ -520,9 +505,9 @@ else if (Sensors.FlirOne.equals(sensor)) ((FlirOneCameraConfig) sensorConfig).androidContext = this.getApplicationContext(); ((FlirOneCameraConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); } - else if (Sensors.SWEVirtualSensor.equals(sensor)) + else if (Sensors.ProxySensor.equals(sensor)) { - sensorConfig = new SWEVirtualSensorConfig(); + sensorConfig = new ProxySensorConfig(); } else { @@ -917,18 +902,18 @@ public void onReceive(Context context, Intent intent) return; } - SWEVirtualSensorConfig sweVirtualSensorConfig = (SWEVirtualSensorConfig) createSensorConfig(Sensors.SWEVirtualSensor); - sweVirtualSensorConfig.sosEndpointUrl = sosEndpointUrl; - sweVirtualSensorConfig.name = name; - sweVirtualSensorConfig.id = sensorId; - sweVirtualSensorConfig.sensorUID = sensorId; + ProxySensorConfig proxySensorConfig = (ProxySensorConfig) createSensorConfig(Sensors.ProxySensor); + proxySensorConfig.sosEndpointUrl = sosEndpointUrl; + proxySensorConfig.name = name; + proxySensorConfig.id = sensorId; + proxySensorConfig.sensorUID = sensorId; for (String property : properties) { - sweVirtualSensorConfig.observedProperties.add(property); + proxySensorConfig.observedProperties.add(property); } - sweVirtualSensorConfig.sosUseWebsockets = true; - sweVirtualSensorConfig.autoStart = true; - sweVirtualSensorConfigs.add(sweVirtualSensorConfig); + proxySensorConfig.sosUseWebsockets = true; + proxySensorConfig.autoStart = true; + proxySensorConfigs.add(proxySensorConfig); } } }; From e02d52568dd6bf473d27b8356d804cb3b2005a2e Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Wed, 19 Jun 2019 12:52:24 -0500 Subject: [PATCH 065/207] import basic usage of ProxySensor --- .../sensor/swe/ProxySensor/ProxySensor.java | 10 ++++++ .../swe/ProxySensor/ProxySensorConfig.java | 11 +++++++ .../ProxySensor/ProxySensorDescriptor.java | 33 +++++++++++++++++++ .../swe/ProxySensor/ProxySensorOutput.java | 24 ++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java create mode 100644 sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java create mode 100644 sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorDescriptor.java create mode 100644 sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java new file mode 100644 index 00000000..57141156 --- /dev/null +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java @@ -0,0 +1,10 @@ +package org.sensorhub.impl.sensor.swe.ProxySensor; + +import org.sensorhub.impl.sensor.swe.SWEVirtualSensor; + +public class ProxySensor extends SWEVirtualSensor { + public ProxySensor() + { + super(); + } +} diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java new file mode 100644 index 00000000..cb5e482d --- /dev/null +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java @@ -0,0 +1,11 @@ +package org.sensorhub.impl.sensor.swe.ProxySensor; + +import org.sensorhub.impl.sensor.swe.SWEVirtualSensorConfig; + +public class ProxySensorConfig extends SWEVirtualSensorConfig +{ + public ProxySensorConfig() + { + this.moduleClass = ProxySensorConfig.class.getCanonicalName(); + } +} diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorDescriptor.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorDescriptor.java new file mode 100644 index 00000000..0c1024a2 --- /dev/null +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorDescriptor.java @@ -0,0 +1,33 @@ +package org.sensorhub.impl.sensor.swe.ProxySensor; + +import org.sensorhub.api.module.IModule; +import org.sensorhub.api.module.IModuleProvider; +import org.sensorhub.api.module.ModuleConfig; +import org.sensorhub.impl.module.JarModuleProvider; + +public class ProxySensorDescriptor extends JarModuleProvider implements IModuleProvider +{ + @Override + public String getModuleName() + { + return "Proxy Sensor"; + } + + @Override + public String getModuleDescription() + { + return "Altered SWEVirtualSensor with changes to event listeners implementation sending data."; + } + + @Override + public Class> getModuleClass() + { + return ProxySensor.class; + } + + @Override + public Class getModuleConfigClass() + { + return ProxySensorConfig.class; + } +} diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java new file mode 100644 index 00000000..c60f45f2 --- /dev/null +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java @@ -0,0 +1,24 @@ +package org.sensorhub.impl.sensor.swe.ProxySensor; + +import android.util.Log; + +import net.opengis.swe.v20.DataBlock; +import net.opengis.swe.v20.DataComponent; +import net.opengis.swe.v20.DataEncoding; + +import org.sensorhub.impl.sensor.swe.SWEVirtualSensor; +import org.sensorhub.impl.sensor.swe.SWEVirtualSensorOutput; + +import static android.content.ContentValues.TAG; + +public class ProxySensorOutput extends SWEVirtualSensorOutput +{ + public ProxySensorOutput(SWEVirtualSensor sensor, DataComponent recordStructure, DataEncoding recordEncoding) { + super(sensor, recordStructure, recordEncoding); + } + + @Override + public void publishNewRecord(DataBlock dataBlock) { + Log.d(TAG, "publishNewRecord"); + } +} From bd1281c5db9e1f9ee73cb241364cc37aecc54e7a Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Fri, 21 Jun 2019 14:19:17 -0500 Subject: [PATCH 066/207] Start building modified start method --- .../sensor/swe/ProxySensor/ProxySensor.java | 119 +++++++++++++++++- 1 file changed, 117 insertions(+), 2 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java index 57141156..6a650fbf 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java @@ -1,10 +1,125 @@ package org.sensorhub.impl.sensor.swe.ProxySensor; +import android.util.Log; +import org.sensorhub.api.common.SensorHubException; import org.sensorhub.impl.sensor.swe.SWEVirtualSensor; +import java.util.ArrayList; +import java.util.List; +import net.opengis.gml.v32.AbstractFeature; +import net.opengis.sensorml.v20.AbstractPhysicalProcess; +import net.opengis.swe.v20.DataBlock; +import net.opengis.swe.v20.DataChoice; +import net.opengis.swe.v20.DataComponent; +import org.sensorhub.api.common.SensorHubException; +import org.sensorhub.impl.client.sos.SOSClient; +import org.sensorhub.impl.client.sos.SOSClient.SOSRecordListener; +import org.sensorhub.impl.client.sps.SPSClient; +import org.sensorhub.impl.sensor.AbstractSensorModule; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +import org.vast.ows.GetCapabilitiesRequest; +import org.vast.ows.OWSException; +import org.vast.ows.OWSUtils; +import org.vast.ows.sos.GetResultRequest; +import org.vast.ows.sos.SOSOfferingCapabilities; +import org.vast.ows.sos.SOSServiceCapabilities; +import org.vast.ows.sos.SOSUtils; +import org.vast.util.TimeExtent; public class ProxySensor extends SWEVirtualSensor { - public ProxySensor() - { +// protected static final Logger log = LoggerFactory.getLogger(ProxySensor.class); + private static final String TAG = "OSHProxySensor"; + private static final String SOS_VERSION = "2.0"; + private static final String SPS_VERSION = "2.0"; + private static final double STREAM_END_TIME = 2e9; // + + AbstractFeature currentFoi; + List sosClients; + SPSClient spsClient; + + + public ProxySensor() { super(); } + + @Override + public void start() throws SensorHubException { + checkConfig(); + removeAllOutputs(); + removeAllControlInputs(); + OWSUtils owsUtils = new OWSUtils(); + + // create SOS clients, to be started by a different event + if (config.sosEndpointUrl != null) { + // find matching offering(s) for sensor UID + SOSServiceCapabilities caps = null; + try { + GetCapabilitiesRequest getCap = new GetCapabilitiesRequest(); + getCap.setService(SOSUtils.SOS); + getCap.setVersion(SOS_VERSION); + getCap.setGetServer(config.sosEndpointUrl); + caps = owsUtils.sendRequest(getCap, false); + } catch (OWSException e) { + throw new SensorHubException("Cannot retrieve SOS capabilities", e); + } + + // scan all offerings and connect to selected ones + int outputNum = 1; + sosClients = new ArrayList(config.observedProperties.size()); + for (SOSOfferingCapabilities offering : caps.getLayers()) { + if (offering.getMainProcedure().equals(config.sensorUID)) { + String offeringID = offering.getIdentifier(); + + for (String obsProp : config.observedProperties) { + if (offering.getObservableProperties().contains(obsProp)) { + // create data request + GetResultRequest req = new GetResultRequest(); + req.setGetServer(config.sosEndpointUrl); + req.setVersion(SOS_VERSION); + req.setOffering(offeringID); + req.getObservables().add(obsProp); + req.setTime(TimeExtent.getPeriodStartingNow(STREAM_END_TIME)); + req.setXmlWrapper(false); + + // create client and retrieve result template + SOSClient sos = new SOSClient(req, config.sosUseWebsockets); + sosClients.add(sos); + sos.retrieveStreamDescription(); + DataComponent recordDef = sos.getRecordDescription(); + if (recordDef.getName() == null) + recordDef.setName("output" + outputNum); + + // retrieve sensor description from remote SOS if available (first time only) + try { + if (outputNum == 1 && config.sensorML == null) + this.sensorDescription = (AbstractPhysicalProcess) sos.getSensorDescription(config.sensorUID); + } catch (SensorHubException e) { +// log.warn("Cannot get remote sensor description", e); + Log.d(TAG, "Cannot get remote sensor description.", e); + } + + // create output + final ProxySensorOutput output = new ProxySensorOutput(this, recordDef, sos.getRecommendedEncoding()); + this.addOutput(output, false); + + // TODO: Move to event based start + sos.startStream(new SOSRecordListener() { + @Override + public void newRecord(DataBlock data) { + output.publishNewRecord(data); + } + }); + + outputNum++; + } + } + } + } + + if (sosClients.isEmpty()) + throw new SensorHubException("Requested observation data is not available from SOS " + config.sosEndpointUrl + + ". Check Sensor UID and observed properties have valid values."); + } + + } } From 2a1ede04022cc6cbf72f6c0f9138f7e752411d04 Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Mon, 24 Jun 2019 00:26:54 -0500 Subject: [PATCH 067/207] WIP: Proxy Sensor testing --- .../org/sensorhub/android/MainActivity.java | 2623 +++++++++-------- .../sensor/swe/ProxySensor/ProxySensor.java | 24 +- .../swe/ProxySensor/ProxySensorOutput.java | 19 + 3 files changed, 1352 insertions(+), 1314 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 92fa6537..24d7e117 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -1,1311 +1,1312 @@ -/*************************** BEGIN LICENSE BLOCK *************************** - -The contents of this file are subject to the Mozilla Public License, v. 2.0. -If a copy of the MPL was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -for the specific language governing rights and limitations under the License. - -Copyright (C) 2012-2015 Sensia Software LLC. All Rights Reserved. - -******************************* END LICENSE BLOCK ***************************/ - -package org.sensorhub.android; - -import android.content.BroadcastReceiver; -import android.content.IntentFilter; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.graphics.SurfaceTexture; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; - -import android.hardware.Sensor; -import android.hardware.SensorManager; -import android.util.Log; -import android.view.*; - -import org.sensorhub.android.comm.BluetoothCommProvider; -import org.sensorhub.android.comm.BluetoothCommProviderConfig; -import org.sensorhub.android.comm.ble.BleConfig; -import org.sensorhub.android.comm.ble.BleNetwork; -import org.sensorhub.api.common.Event; -import org.sensorhub.api.common.IEventListener; -import org.sensorhub.api.module.IModuleConfigRepository; -import org.sensorhub.api.module.ModuleEvent; -import org.sensorhub.api.sensor.ISensorDataInterface; -import org.sensorhub.api.sensor.SensorConfig; -import org.sensorhub.impl.client.sost.SOSTClient; -import org.sensorhub.impl.client.sost.SOSTClient.StreamInfo; -import org.sensorhub.impl.client.sost.SOSTClientConfig; -import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; -import org.sensorhub.impl.module.InMemoryConfigDb; -import org.sensorhub.impl.persistence.GenericStreamStorage; -import org.sensorhub.impl.persistence.MaxAgeAutoPurgeConfig; -import org.sensorhub.impl.persistence.StreamStorageConfig; -import org.sensorhub.impl.persistence.h2.MVMultiStorageImpl; -import org.sensorhub.impl.persistence.h2.MVStorageConfig; -import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; -import org.sensorhub.impl.sensor.angel.AngelSensorConfig; -import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensorConfig; -import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; -import org.sensorhub.impl.service.sos.SOSServiceConfig; -import org.sensorhub.impl.service.sos.SensorDataProviderConfig; -import org.sensorhub.test.sensor.trupulse.SimulatedDataStream; -import org.sensorhub.impl.service.HttpServerConfig; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.ComponentName; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.ServiceConnection; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.Looper; -import android.preference.PreferenceManager; -import android.provider.Settings.Secure; -import android.text.Html; -import android.widget.EditText; -import android.widget.TextView; - -import static android.content.ContentValues.TAG; - -public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener -{ - public static final String ACTION_BROADCAST_RECEIVER = "org.sensorhub.android.BROADCAST_RECEIVER"; - - String deviceID; - String deviceName; - String runName; - - enum Sensors { - Android, - TruPulse, - TruPulseSim, - Angel, - FlirOne, - DJIDrone, - ProxySensor - } - - TextView textArea; - SensorHubService boundService; - IModuleConfigRepository sensorhubConfig; - Handler displayHandler; - Runnable displayCallback; - StringBuffer displayText = new StringBuffer(); - boolean oshStarted = false; - ArrayList sostClients = new ArrayList<>(); - ArrayList proxySensorConfigs = new ArrayList<>(); - URL sosUrl = null; - URL sostUrl = null; - boolean showVideo; - - private ServiceConnection sConn = new ServiceConnection() - { - public void onServiceConnected(ComponentName className, IBinder service) - { - boundService = ((SensorHubService.LocalBinder) service).getService(); - } - - public void onServiceDisconnected(ComponentName className) - { - boundService = null; - } - }; - - - protected void updateConfig(SharedPreferences prefs, String runName) - { - // get device name - deviceID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); - deviceName = prefs.getString("device_name", null); - if (deviceName == null || deviceName.length() < 2) - deviceName = deviceID; - this.runName = runName; - - sensorhubConfig = new InMemoryConfigDb(); - - // get SOS URL from config - String sosUriConfig = prefs.getString("sos_uri", "http://127.0.0.1:8585/sensorhub/sos"); - String sosUser = prefs.getString("sos_username", ""); - String sosPwd = prefs.getString("sos_password", ""); - if (sosUriConfig != null && sosUriConfig.trim().length() > 0) - { - try - { - sosUrl = new URL(sosUriConfig); - } - catch (MalformedURLException e) - { - e.printStackTrace(); - } - } - - // HTTP Server Config - HttpServerConfig serverConfig = new HttpServerConfig(); - serverConfig.proxyBaseUrl = ""; - serverConfig.httpPort = 8585; - serverConfig.autoStart = true; - sensorhubConfig.add(serverConfig); - - // SOS Config - SOSServiceConfig sosConfig = new SOSServiceWithIPCConfig(); - sosConfig.moduleClass = SOSServiceWithIPC.class.getCanonicalName(); - ((SOSServiceWithIPCConfig) sosConfig).androidContext = this.getApplicationContext(); - sosConfig.id = "SOS_SERVICE"; - sosConfig.name = "SOS Service"; - sosConfig.autoStart = true; - sosConfig.enableTransactional = true; - - File dbFile = new File(getApplicationContext().getFilesDir()+"/db/"); - dbFile.mkdirs(); - MVStorageConfig basicStorageConfig = new MVStorageConfig(); - basicStorageConfig.moduleClass = "org.sensorhub.impl.persistence.h2.MVObsStorageImpl"; - basicStorageConfig.storagePath = dbFile.getAbsolutePath() + "/${STORAGE_ID}.dat"; - basicStorageConfig.autoStart = true; - sosConfig.newStorageConfig = basicStorageConfig; - - // Push Sensors Config - AndroidSensorsConfig androidSensorsConfig = (AndroidSensorsConfig) createSensorConfig(Sensors.Android); - sensorhubConfig.add(androidSensorsConfig); - if (isPushingSensor(Sensors.Android)) - { - addSosTConfig(androidSensorsConfig, sosUser, sosPwd); - } - - StreamStorageConfig androidStreamStorageConfig = createStreamStorageConfig(androidSensorsConfig); - addStorageConfig(androidSensorsConfig, androidStreamStorageConfig); - - SensorDataProviderConfig androidDataProviderConfig = createDataProviderConfig(androidSensorsConfig); - addSosServerConfig(sosConfig, androidDataProviderConfig); - - // TruPulse sensor - boolean enabled = prefs.getBoolean("trupulse_enable", false); - if (enabled) - { - String truPulseDevice = prefs.getString("trupulse_datasource", "SIMULATED"); - TruPulseConfig truPulseConfig = truPulseDevice == "SIMULATED" - ? (TruPulseConfig) createSensorConfig(Sensors.TruPulseSim) - : (TruPulseConfig) createSensorConfig(Sensors.TruPulse); - sensorhubConfig.add(truPulseConfig); - if (isPushingSensor(Sensors.TruPulse)) - { - addSosTConfig(truPulseConfig, sosUser, sosPwd); - } - } - - // AngelSensor - enabled = prefs.getBoolean("angel_enabled", false); - if (enabled) - { - AngelSensorConfig angelConfig = (AngelSensorConfig) createSensorConfig(Sensors.Angel); - //angelConfig.btAddress = "00:07:80:79:04:AF"; // mike - //angelConfig.btAddress = "00:07:80:03:0E:0A"; // alex - angelConfig.btAddress = prefs.getString("angel_address", null); - sensorhubConfig.add(angelConfig); - addSosTConfig(angelConfig, sosUser, sosPwd); - } - - // FLIR One sensor - enabled = prefs.getBoolean("flirone_enabled", false); - if (enabled) - { - showVideo = true; - - FlirOneCameraConfig flironeConfig = (FlirOneCameraConfig) createSensorConfig(Sensors.FlirOne); - sensorhubConfig.add(flironeConfig); - addSosTConfig(flironeConfig, sosUser, sosPwd); - } - - /* - // DJI Drone - enabled = prefs.getBoolean("dji_enabled", false); - if (enabled) - { - DjiConfig djiConfig = new DjiConfig(); - djiConfig.id = "DJI_DRONE"; - djiConfig.name = "DJI Aircraft [" + deviceName + "]"; - djiConfig.autoStart = true; - djiConfig.androidContext = this.getApplicationContext(); - djiConfig.camPreviewTexture = boundService.getVideoTexture(); - showVideo = true; - sensorhubConfig.add(djiConfig); - addSosTConfig(djiConfig, sosUser, sosPwd); - - SensorDataProviderConfig djiDataProviderConfig = new SensorDataProviderConfig(); - djiDataConsumerConfig.sensorID = djiConfig.id; - djiDataConsumerConfig.offeringID = djiConfig.id+"-sos"; - djiDataConsumerConfig.enabled = true; - sosConfig.dataConsumers.add(djiDataConsumerConfig); - } - */ - - /* - // Get SOS-T URL from config - String sostUriConfig = prefs.getString("sost_uri", ""); - String sostUser = prefs.getString("sost_username", ""); - String sostPwd = prefs.getString("sost_password", ""); - if (sostUriConfig != null && sostUriConfig.trim().length() > 0) - { - try { - sostUrl = new URL(sostUriConfig); - } - catch (MalformedURLException e) - { - e.printStackTrace(); - } - } - - if (!sostUriConfig.contentEquals("")) - { - // SOS-T Client Config - SOSTClientConfig sostConfig = new SOSTClientConfig(); - sostConfig.sensorID = androidSensorsConfig.id; - sostConfig.moduleClass = SOSTClient.class.getCanonicalName(); - sostConfig.id = "SOST_CLIENT"; - sostConfig.name = "SOS-T Client"; - sostConfig.autoStart = true; - - // SOS-T Client HTTP Config - sostConfig.sos = new HTTPConfig(); - sostConfig.sos.enableTLS = sostUrl.getProtocol().toUpperCase().contains("HTTPS") ? true : false; - sostConfig.sos.remoteHost = sostUrl.getHost(); - sostConfig.sos.remotePort = sostUrl.getPort(); - sostConfig.sos.resourcePath = sostUrl.getPath(); - sostConfig.sos.user = sostUser; - sostConfig.sos.password = sostPwd; - - sostConfig.connection = new SOSTClientConfig.SOSConnectionConfig(); - sostConfig.connection.usePersistentConnection = true; - sostConfig.connection.maxQueueSize = 10; - sostConfig.connection.maxConnectErrors = 10; - sostConfig.connection.checkReachability = true; - sostConfig.connection.connectTimeout = 3000; - sostConfig.connection.reconnectPeriod = 10000; - sostConfig.connection.reconnectAttempts = 10; - - sensorhubConfig.add(sostConfig); - } - */ - - // SOS Data Providers - for (ProxySensorConfig proxySensorConfig : proxySensorConfigs) { - sensorhubConfig.add(proxySensorConfig); - - SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); - dataProviderConfig.name = proxySensorConfig.id; - dataProviderConfig.sensorID = proxySensorConfig.id; - dataProviderConfig.offeringID = proxySensorConfig.id+"-sos"; - dataProviderConfig.enabled = true; - - sosConfig.dataProviders.add(dataProviderConfig); - } - - sensorhubConfig.add(sosConfig); - } - - private boolean isPushingSensor(Sensors sensor) - { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - - if (Sensors.Android.equals(sensor)) - { - if (prefs.getBoolean("accelerometer_enable", false) - && prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) - return true; - if (prefs.getBoolean("gyroscope_enable", false) - && prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH_REMOTE")) - return true; - if (prefs.getBoolean("magnetometer_enable", false) - && prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) - return true; - if (prefs.getBoolean("orientation_enable", false) - && prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH_REMOTE")) - return true; - if (prefs.getBoolean("location_enable", false) - && prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH_REMOTE")) - return true; - if (prefs.getBoolean("video_enable", false) - && prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) - return true; - } - else if (Sensors.TruPulse.equals(sensor) || Sensors.TruPulseSim.equals(sensor)) - { - if (prefs.getBoolean("trupulse_enable", false) - && prefs.getStringSet("trupulse_options", Collections.emptySet()).contains("PUSH_REMOTE")) - return true; - } - - return false; - } - - private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig sensorConfig) - { - SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); - dataProviderConfig.sensorID = sensorConfig.id; - dataProviderConfig.offeringID = sensorConfig.id + ":offering"; - dataProviderConfig.storageID = sensorConfig.id + "#storage"; - dataProviderConfig.enabled = true; - dataProviderConfig.liveDataTimeout = 600.0; - dataProviderConfig.maxFois = 10; - - return dataProviderConfig; - } - - private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig sensorConfig) - { - // H2 Storage Config - File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", deviceID+"_h2.dat"); - dbFile.getParentFile().mkdirs(); - if(!dbFile.exists()) - { - try - { - dbFile.createNewFile(); - } - catch (IOException e) - { - e.printStackTrace(); - } - } - MVStorageConfig storageConfig = new MVStorageConfig(); - storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); - storageConfig.storagePath = dbFile.getPath(); - storageConfig.autoStart = true; - storageConfig.memoryCacheSize = 102400; - storageConfig.autoCommitBufferSize = 1024; - - // TODO: Base this on size instead of time. This might error when earliest record is purged and then requested. Test if the capabilities updates... - // Auto Purge Config - MaxAgeAutoPurgeConfig autoPurgeConfig = new MaxAgeAutoPurgeConfig(); - autoPurgeConfig.enabled = true; - autoPurgeConfig.purgePeriod = 24.0 * 60.0 * 60.0; - autoPurgeConfig.maxRecordAge = 24.0 * 60.0 * 60.0; - - // Stream Storage Config - StreamStorageConfig streamStorageConfig = new StreamStorageConfig(); - streamStorageConfig.moduleClass = GenericStreamStorage.class.getCanonicalName(); - streamStorageConfig.id = sensorConfig.id + "#storage"; - streamStorageConfig.name = sensorConfig.name + " Storage"; - streamStorageConfig.dataSourceID = sensorConfig.id; - streamStorageConfig.autoStart = true; - streamStorageConfig.processEvents = true; - streamStorageConfig.minCommitPeriod = 10000; - streamStorageConfig.autoPurgeConfig = autoPurgeConfig; - streamStorageConfig.storageConfig = storageConfig; - return streamStorageConfig; - } - - private SensorConfig createSensorConfig(Sensors sensor) - { - SensorConfig sensorConfig; - - if (Sensors.Android.equals(sensor)) - { - sensorConfig = new AndroidSensorsConfig(); - sensorConfig.id = "urn:device:android:" + deviceID; - sensorConfig.name = "Android Sensors [" + deviceName + "]"; - sensorConfig.autoStart = true; - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - - ((AndroidSensorsConfig) sensorConfig).activateAccelerometer = prefs.getBoolean("accelerometer_enable", false); - ((AndroidSensorsConfig) sensorConfig).activateGyrometer = prefs.getBoolean("gyroscope_enable", false); - ((AndroidSensorsConfig) sensorConfig).activateMagnetometer = prefs.getBoolean("magnetometer_enable", false); - if (prefs.getBoolean("orientation_enable", false)) - { - ((AndroidSensorsConfig) sensorConfig).activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); - ((AndroidSensorsConfig) sensorConfig).activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); - } - if (prefs.getBoolean("location_enable", false)) - { - ((AndroidSensorsConfig) sensorConfig).activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); - ((AndroidSensorsConfig) sensorConfig).activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); - } - if (prefs.getBoolean("video_enable", false)) - { - showVideo = true; - - ((AndroidSensorsConfig) sensorConfig).activateBackCamera = true; - ((AndroidSensorsConfig) sensorConfig).videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); - } - - ((AndroidSensorsConfig) sensorConfig).androidContext = this.getApplicationContext(); - ((AndroidSensorsConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); - ((AndroidSensorsConfig) sensorConfig).runName = runName; - } - else if (Sensors.TruPulse.equals(sensor)) - { - sensorConfig = new TruPulseConfig(); - sensorConfig.id = "TRUPULSE_SENSOR"; - sensorConfig.name = "TruPulse Range Finder [" + deviceName + "]"; - sensorConfig.autoStart = true; - - BluetoothCommProviderConfig btConf = new BluetoothCommProviderConfig(); - btConf.protocol.deviceName = "TP360RB.*"; - btConf.moduleClass = BluetoothCommProvider.class.getCanonicalName(); - ((TruPulseConfig) sensorConfig).commSettings = btConf; - ((TruPulseConfig) sensorConfig).serialNumber = deviceID; - } - else if (Sensors.TruPulseSim.equals(sensor)) - { - sensorConfig = new TruPulseConfig(); - sensorConfig.id = "TRUPULSE_SENSOR_SIMULATED"; - sensorConfig.name = "Simulated TruPulse Range Finder [" + deviceName + "]"; - sensorConfig.autoStart = true; - - BluetoothCommProviderConfig btConf = new BluetoothCommProviderConfig(); - btConf.protocol.deviceName = "TP360RB.*"; - btConf.moduleClass = SimulatedDataStream.class.getCanonicalName(); - ((TruPulseConfig) sensorConfig).commSettings = btConf; - ((TruPulseConfig) sensorConfig).serialNumber = deviceID; - } - else if (Sensors.Angel.equals(sensor)) - { - sensorConfig = new AngelSensorConfig(); - sensorConfig.id = "ANGEL_SENSOR"; - sensorConfig.name = "Angel Sensor [" + deviceName + "]"; - sensorConfig.autoStart = true; - - BleConfig bleConf = new BleConfig(); - bleConf.id = "BLE"; - bleConf.moduleClass = BleNetwork.class.getCanonicalName(); - bleConf.androidContext = this.getApplicationContext(); - bleConf.autoStart = true; - sensorhubConfig.add(bleConf); - - ((AngelSensorConfig) sensorConfig).networkID = bleConf.id; - } - else if (Sensors.FlirOne.equals(sensor)) - { - sensorConfig = new FlirOneCameraConfig(); - sensorConfig.id = "FLIRONE_SENSOR"; - sensorConfig.name = "FLIR One Camera [" + deviceName + "]"; - sensorConfig.autoStart = true; - - ((FlirOneCameraConfig) sensorConfig).androidContext = this.getApplicationContext(); - ((FlirOneCameraConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); - } - else if (Sensors.ProxySensor.equals(sensor)) - { - sensorConfig = new ProxySensorConfig(); - } - else - { - sensorConfig = new SensorConfig(); - } - - return sensorConfig; - } - - protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig storageConf) - { - if (sensorConf instanceof AndroidSensorsConfig) - { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); - List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); - - String sensorName; - for (Sensor sensor: deviceSensors) - { - if (sensor.isWakeUpSensor()) - { - continue; - } - - Log.d(TAG, "addStorageConfig: sensor: " + sensor.getName()); - - switch (sensor.getType()) - { - case Sensor.TYPE_ACCELEROMETER: - if (!prefs.getBoolean("accelerometer_enable", false) - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addStorageConfig: excluding accelerometer"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - storageConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addStorageConfig: NOT excluding accelerometer"); - } - break; - case Sensor.TYPE_GYROSCOPE: - if (!prefs.getBoolean("gyroscope_enable", false) - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addStorageConfig: excluding gyroscope"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - storageConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addStorageConfig: NOT excluding gyroscope"); - } - break; - case Sensor.TYPE_MAGNETIC_FIELD: - if (!prefs.getBoolean("magnetometer_enable", false) - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addStorageConfig: excluding magnetometer"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - storageConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addStorageConfig: NOT excluding magnetometer"); - } - break; - case Sensor.TYPE_ROTATION_VECTOR: - if (!prefs.getBoolean("orientation_enable", false) - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addStorageConfig: excluding orientation"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - storageConf.excludedOutputs.add(sensorName); - sensorName = "quat_orientation_data"; - storageConf.excludedOutputs.add(sensorName); - sensorName = "euler_orientation_data"; - storageConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addStorageConfig: NOT excluding orientation"); - } - break; - } - } - if (!prefs.getBoolean("location_enable", false) - || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addStorageConfig: excluding location"); - - sensorName = "gps_data"; - storageConf.excludedOutputs.add(sensorName); - sensorName = "network_data"; - storageConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addStorageConfig: NOT excluding location"); - } - if (!prefs.getBoolean("video_enable", false) - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addStorageConfig: excluding video"); - - sensorName = "camera0_MJPEG"; - storageConf.excludedOutputs.add(sensorName); - sensorName = "camera0_H264"; - storageConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addStorageConfig: NOT excluding video"); - } - } - - sensorhubConfig.add(storageConf); - } - - protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderConfig dataProviderConf) - { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); - List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); - - String sensorName; - for (Sensor sensor: deviceSensors) - { - if (sensor.isWakeUpSensor()) - { - continue; - } - - Log.d(TAG, "addSosServerConfig: sensor: " + sensor.getName()); - - switch (sensor.getType()) - { - case Sensor.TYPE_ACCELEROMETER: - if (!prefs.getBoolean("accelerometer_enable", false) - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addSosServerConfig: excluding accelerometer"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - dataProviderConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosServerConfig: NOT excluding accelerometer"); - } - break; - case Sensor.TYPE_GYROSCOPE: - if (!prefs.getBoolean("gyroscope_enable", false) - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addSosServerConfig: excluding gyroscope"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - dataProviderConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosServerConfig: NOT excluding gyroscope"); - } - break; - case Sensor.TYPE_MAGNETIC_FIELD: - if (!prefs.getBoolean("magnetometer_enable", false) - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addSosServerConfig: excluding magnetometer"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - dataProviderConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosServerConfig: NOT excluding magnetometer"); - } - break; - case Sensor.TYPE_ROTATION_VECTOR: - if (!prefs.getBoolean("orientation_enable", false) - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addSosServerConfig: excluding orientation"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - dataProviderConf.excludedOutputs.add(sensorName); - sensorName = "quat_orientation_data"; - dataProviderConf.excludedOutputs.add(sensorName); - sensorName = "euler_orientation_data"; - dataProviderConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosServerConfig: NOT excluding orientation"); - } - break; - } - } - if (!prefs.getBoolean("location_enable", false) - || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addSosServerConfig: excluding location"); - - sensorName = "gps_data"; - dataProviderConf.excludedOutputs.add(sensorName); - sensorName = "network_data"; - dataProviderConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosServerConfig: NOT excluding location"); - } - if (!prefs.getBoolean("video_enable", false) - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) - { - - Log.d(TAG, "addSosServerConfig: excluding video"); - - sensorName = "camera0_MJPEG"; - dataProviderConf.excludedOutputs.add(sensorName); - sensorName = "camera0_H264"; - dataProviderConf.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosServerConfig: NOT excluding video"); - } - - sosConf.dataProviders.add(dataProviderConf); - } - - protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sosPwd) - { - if (sosUrl == null) - return; - - SOSTClientConfig sosConfig = new SOSTClientConfig(); - sosConfig.id = sensorConf.id + "_SOST"; - sosConfig.name = sensorConf.name.replaceAll("\\[.*\\]", "");// + "SOS-T Client"; - sosConfig.autoStart = true; - sosConfig.sensorID = sensorConf.id; - sosConfig.sos.remoteHost = sosUrl.getHost(); - sosConfig.sos.remotePort = sosUrl.getPort(); - sosConfig.sos.resourcePath = sosUrl.getPath(); - sosConfig.sos.enableTLS = sosUrl.getProtocol().equals("https"); - sosConfig.sos.user = sosUser; - sosConfig.sos.password = sosPwd; - sosConfig.connection.connectTimeout = 10000; - sosConfig.connection.usePersistentConnection = true; - sosConfig.connection.reconnectAttempts = 9; - - if (sensorConf instanceof AndroidSensorsConfig) - { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); - List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); - - String sensorName; - for (Sensor sensor: deviceSensors) - { - if (sensor.isWakeUpSensor()) - { - continue; - } - - Log.d(TAG, "addSosTConfig: sensor: " + sensor.getName()); - - switch (sensor.getType()) - { - case Sensor.TYPE_ACCELEROMETER: - if (!prefs.getBoolean("accelerometer_enable", false) - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { - - Log.d(TAG, "addSosTConfig: excluding accelerometer"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - sosConfig.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosTConfig: NOT excluding accelerometer"); - } - break; - case Sensor.TYPE_GYROSCOPE: - if (!prefs.getBoolean("gyroscope_enable", false) - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { - - Log.d(TAG, "addSosTConfig: excluding gyroscope"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - sosConfig.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosTConfig: NOT excluding gyroscope"); - } - break; - case Sensor.TYPE_MAGNETIC_FIELD: - if (!prefs.getBoolean("magnetometer_enable", false) - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { - - Log.d(TAG, "addSosTConfig: excluding magnetometer"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - sosConfig.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosTConfig: NOT excluding magnetometer"); - } - break; - case Sensor.TYPE_ROTATION_VECTOR: - if (!prefs.getBoolean("orientation_enable", false) - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { - - Log.d(TAG, "addSosTConfig: excluding orientation"); - - sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; - sosConfig.excludedOutputs.add(sensorName); - sensorName = "quat_orientation_data"; - sosConfig.excludedOutputs.add(sensorName); - sensorName = "euler_orientation_data"; - sosConfig.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosTConfig: NOT excluding orientation"); - } - break; - } - } - if (!prefs.getBoolean("location_enable", false) - || !prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { - - Log.d(TAG, "addSosTConfig: excluding location"); - - sensorName = "gps_data"; - sosConfig.excludedOutputs.add(sensorName); - sensorName = "network_data"; - sosConfig.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosTConfig: NOT excluding location"); - } - if (!prefs.getBoolean("video_enable", false) - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { - - Log.d(TAG, "addSosTConfig: excluding video"); - - sensorName = "camera0_MJPEG"; - sosConfig.excludedOutputs.add(sensorName); - sensorName = "camera0_H264"; - sosConfig.excludedOutputs.add(sensorName); - } else { - Log.d(TAG, "addSosTConfig: NOT excluding video"); - } - } - - sensorhubConfig.add(sosConfig); - } - - - @SuppressLint("HandlerLeak") - @Override - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - textArea = (TextView) findViewById(R.id.text); - - // listen to texture view lifecycle - TextureView textureView = (TextureView) findViewById(R.id.video); - textureView.setSurfaceTextureListener(this); - - // bind to SensorHub service - Intent intent = new Intent(this, SensorHubService.class); - bindService(intent, sConn, Context.BIND_AUTO_CREATE); - - // handler to refresh sensor status in UI - displayHandler = new Handler(Looper.getMainLooper()); - - setupBroadcastReceivers(); - } - - - private void setupBroadcastReceivers() { - BroadcastReceiver receiver = new BroadcastReceiver() - { - @Override - public void onReceive(Context context, Intent intent) - { - String origin = intent.getStringExtra("src"); - if (!context.getPackageName().equalsIgnoreCase(origin)) - { - String sosEndpointUrl = intent.getStringExtra("sosEndpointUrl"); - String name = intent.getStringExtra("name"); - String sensorId = intent.getStringExtra("sensorId"); - ArrayList properties = intent.getStringArrayListExtra("properties"); - - if (sosEndpointUrl== null || name == null || sensorId == null || properties.size() == 0) - { - return; - } - - ProxySensorConfig proxySensorConfig = (ProxySensorConfig) createSensorConfig(Sensors.ProxySensor); - proxySensorConfig.sosEndpointUrl = sosEndpointUrl; - proxySensorConfig.name = name; - proxySensorConfig.id = sensorId; - proxySensorConfig.sensorUID = sensorId; - for (String property : properties) - { - proxySensorConfig.observedProperties.add(property); - } - proxySensorConfig.sosUseWebsockets = true; - proxySensorConfig.autoStart = true; - proxySensorConfigs.add(proxySensorConfig); - } - } - }; - IntentFilter filter = new IntentFilter(); - filter.addAction(ACTION_BROADCAST_RECEIVER); - - registerReceiver(receiver, filter); - } - - - private void testBroadcastReceiver() { - ArrayList testProperties = new ArrayList(); - testProperties.add("http://sensorml.com/ont/swe/property/Acceleration"); - testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); - testProperties.add("http://sensorml.com/ont/swe/property/AngularRate"); - - Intent testIntent = new Intent(); - testIntent.setAction(ACTION_BROADCAST_RECEIVER); - testIntent.putExtra("sosEndpointUrl", "http://192.168.0.43:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); - testIntent.putExtra("name", "Android Sensors [Pocophone]"); - testIntent.putExtra("sensorId", "urn:android:device:a0b0515feaa872a4"); - testIntent.putStringArrayListExtra("properties", testProperties); - sendBroadcast(testIntent); - } - - - @Override - public boolean onCreateOptionsMenu(Menu menu) - { - getMenuInflater().inflate(R.menu.main, menu); - return true; - } - - - @Override - public boolean onOptionsItemSelected(MenuItem item) - { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - if (id == R.id.action_settings) - { - startActivity(new Intent(this, UserSettingsActivity.class)); - return true; - } - else if (id == R.id.action_start) - { - if (boundService != null && boundService.getSensorHub() == null) - showRunNamePopup(); - return true; - } - else if (id == R.id.action_stop) - { - stopListeningForEvents(); - stopRefreshingStatus(); - sostClients.clear(); - if (boundService != null) - boundService.stopSensorHub(); - textArea.setBackgroundColor(0xFFFFFFFF); - oshStarted = false; - newStatusMessage("SensorHub Stopped"); - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - return true; - } - else if (id == R.id.action_about) - { - showAboutPopup(); - } - - return super.onOptionsItemSelected(item); - } - - - protected void showRunNamePopup() - { - AlertDialog.Builder alert = new AlertDialog.Builder(this); - - alert.setTitle("Run Name"); - alert.setMessage("Please enter the name for this run"); - - // Set an EditText view to get user input - final EditText input = new EditText(this); - input.getText().append("Run-"); - SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.US); - input.getText().append(formatter.format(new Date())); - alert.setView(input); - - alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - runName = input.getText().toString(); - newStatusMessage("Starting SensorHub..."); - - updateConfig(PreferenceManager.getDefaultSharedPreferences(MainActivity.this), runName); - sostClients.clear(); - boundService.startSensorHub(sensorhubConfig, showVideo, MainActivity.this); - - if (boundService.hasVideo()) - textArea.setBackgroundColor(0x80FFFFFF); - } - }); - - alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - } - }); - - alert.show(); - } - - - protected void showAboutPopup() - { - String version = "?"; - - try - { - PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0); - version = pInfo.versionName; - } - catch (PackageManager.NameNotFoundException e) - { - } - - String message = "A software platform for building smart sensor networks and the Internet of Things\n\n"; - message += "Version: " + version + "\n"; - - AlertDialog.Builder alert = new AlertDialog.Builder(this); - alert.setTitle("OpenSensorHub"); - alert.setMessage(message); - alert.setIcon(R.drawable.ic_launcher); - alert.show(); - } - - - @Override - public void handleEvent(Event e) - { - if (e instanceof ModuleEvent) - { - // start refreshing status on first module loaded - if (!oshStarted && ((ModuleEvent) e).getType() == ModuleEvent.Type.LOADED) - { - oshStarted = true; - startRefreshingStatus(); - return; - } - - // detect when SOS-T modules are connected - else if (e.getSource() instanceof SOSTClient && ((ModuleEvent)e).getType() == ModuleEvent.Type.STATE_CHANGED) - { - switch (((ModuleEvent)e).getNewState()) - { - case INITIALIZING: - sostClients.add((SOSTClient)e.getSource()); - break; - } - } - } - } - - - protected void startRefreshingStatus() - { - if (displayCallback != null) - return; - - // handler to display async messages in UI - displayCallback = new Runnable() - { - public void run() - { - displayStatus(); - textArea.setText(Html.fromHtml(displayText.toString())); - displayHandler.postDelayed(this, 1000); - } - }; - - displayHandler.post(displayCallback); - } - - - protected void stopRefreshingStatus() - { - if (displayCallback != null) - { - displayHandler.removeCallbacks(displayCallback); - displayCallback = null; - } - } - - - protected synchronized void displayStatus() - { - displayText.setLength(0); - - // first display error messages if any - for (SOSTClient client: sostClients) - { - Map dataStreams = client.getDataStreams(); - boolean showError = (client.getCurrentError() != null); - boolean showMsg = (dataStreams.size() == 0) && (client.getStatusMessage() != null); - - if (showError || showMsg) - { - displayText.append("

" + client.getName() + ":
"); - if (showMsg) - displayText.append(client.getStatusMessage() + "
"); - if (showError) - { - Throwable errorObj = client.getCurrentError(); - String errorMsg = errorObj.getMessage().trim(); - if (!errorMsg.endsWith(".")) - errorMsg += ". "; - if (errorObj.getCause() != null && errorObj.getCause().getMessage() != null) - errorMsg += errorObj.getCause().getMessage(); - displayText.append("" + errorMsg + ""); - } - displayText.append("

"); - } - } - - // then display streams status - displayText.append("

"); - for (SOSTClient client: sostClients) - { - Map dataStreams = client.getDataStreams(); - long now = System.currentTimeMillis(); - - for (Entry stream : dataStreams.entrySet()) - { - displayText.append("" + stream.getKey().getName() + " : "); - - long lastEventTime = stream.getValue().lastEventTime; - long dt = now - lastEventTime; - if (lastEventTime == Long.MIN_VALUE) - displayText.append("NO OBS"); - else if (dt > stream.getValue().measPeriodMs) - displayText.append("NOK (" + dt + "ms ago)"); - else - displayText.append("OK (" + dt + "ms ago)"); - - if (stream.getValue().errorCount > 0) - { - displayText.append(" ("); - displayText.append(stream.getValue().errorCount); - displayText.append(")"); - } - - displayText.append("
"); - } - } - - if (displayText.length() > 5) - displayText.setLength(displayText.length()-5); // remove last
- displayText.append("

"); - } - - - protected synchronized void newStatusMessage(String msg) - { - displayText.setLength(0); - appendStatusMessage(msg); - } - - - protected synchronized void appendStatusMessage(String msg) - { - displayText.append(msg); - - displayHandler.post(new Runnable() - { - public void run() - { - textArea.setText(displayText.toString()); - } - }); - } - - - protected void startListeningForEvents() - { - if (boundService == null || boundService.getSensorHub() == null) - return; - - boundService.getSensorHub().getModuleRegistry().registerListener(this); - } - - - protected void stopListeningForEvents() - { - if (boundService == null || boundService.getSensorHub() == null) - return; - - boundService.getSensorHub().getModuleRegistry().unregisterListener(this); - } - - - protected void showVideo() - { - if (boundService.getVideoTexture() != null) - { - TextureView textureView = (TextureView) findViewById(R.id.video); - if (textureView.getSurfaceTexture() != boundService.getVideoTexture()) - textureView.setSurfaceTexture(boundService.getVideoTexture()); - } - } - - - protected void hideVideo() - { - } - - - @Override - protected void onStart() - { - super.onStart(); - } - - - @Override - protected void onResume() - { - super.onResume(); - - TextureView textureView = (TextureView) findViewById(R.id.video); - textureView.setSurfaceTextureListener(this); - - if (oshStarted) - { - startListeningForEvents(); - startRefreshingStatus(); - - if (boundService.hasVideo()) - textArea.setBackgroundColor(0x80FFFFFF); - } - } - - - @Override - protected void onPause() - { - stopListeningForEvents(); - stopRefreshingStatus(); - hideVideo(); - super.onPause(); - } - - - @Override - protected void onStop() - { - stopListeningForEvents(); - stopRefreshingStatus(); - super.onStop(); - } - - - @Override - protected void onDestroy() - { - stopService(new Intent(this, SensorHubService.class)); - super.onDestroy(); - } - - - @Override - public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) - { - showVideo(); - } - - - @Override - public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) - { - } - - - @Override - public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) - { - return false; - } - - - @Override - public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) - { - } -} +/*************************** BEGIN LICENSE BLOCK *************************** + +The contents of this file are subject to the Mozilla Public License, v. 2.0. +If a copy of the MPL was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. + +Software distributed under the License is distributed on an "AS IS" basis, +WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +for the specific language governing rights and limitations under the License. + +Copyright (C) 2012-2015 Sensia Software LLC. All Rights Reserved. + +******************************* END LICENSE BLOCK ***************************/ + +package org.sensorhub.android; + +import android.content.BroadcastReceiver; +import android.content.IntentFilter; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.SurfaceTexture; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; + +import android.hardware.Sensor; +import android.hardware.SensorManager; +import android.util.Log; +import android.view.*; + +import org.sensorhub.android.comm.BluetoothCommProvider; +import org.sensorhub.android.comm.BluetoothCommProviderConfig; +import org.sensorhub.android.comm.ble.BleConfig; +import org.sensorhub.android.comm.ble.BleNetwork; +import org.sensorhub.api.common.Event; +import org.sensorhub.api.common.IEventListener; +import org.sensorhub.api.module.IModuleConfigRepository; +import org.sensorhub.api.module.ModuleEvent; +import org.sensorhub.api.sensor.ISensorDataInterface; +import org.sensorhub.api.sensor.SensorConfig; +import org.sensorhub.impl.client.sost.SOSTClient; +import org.sensorhub.impl.client.sost.SOSTClient.StreamInfo; +import org.sensorhub.impl.client.sost.SOSTClientConfig; +import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; +import org.sensorhub.impl.module.InMemoryConfigDb; +import org.sensorhub.impl.persistence.GenericStreamStorage; +import org.sensorhub.impl.persistence.MaxAgeAutoPurgeConfig; +import org.sensorhub.impl.persistence.StreamStorageConfig; +import org.sensorhub.impl.persistence.h2.MVMultiStorageImpl; +import org.sensorhub.impl.persistence.h2.MVStorageConfig; +import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; +import org.sensorhub.impl.sensor.angel.AngelSensorConfig; +import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensorConfig; +import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; +import org.sensorhub.impl.service.sos.SOSServiceConfig; +import org.sensorhub.impl.service.sos.SensorDataProviderConfig; +import org.sensorhub.test.sensor.trupulse.SimulatedDataStream; +import org.sensorhub.impl.service.HttpServerConfig; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.ServiceConnection; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.preference.PreferenceManager; +import android.provider.Settings.Secure; +import android.text.Html; +import android.widget.EditText; +import android.widget.TextView; + +import static android.content.ContentValues.TAG; + +public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener +{ + public static final String ACTION_BROADCAST_RECEIVER = "org.sensorhub.android.BROADCAST_RECEIVER"; + + String deviceID; + String deviceName; + String runName; + + enum Sensors { + Android, + TruPulse, + TruPulseSim, + Angel, + FlirOne, + DJIDrone, + ProxySensor + } + + TextView textArea; + SensorHubService boundService; + IModuleConfigRepository sensorhubConfig; + Handler displayHandler; + Runnable displayCallback; + StringBuffer displayText = new StringBuffer(); + boolean oshStarted = false; + ArrayList sostClients = new ArrayList<>(); + ArrayList proxySensorConfigs = new ArrayList<>(); + URL sosUrl = null; + URL sostUrl = null; + boolean showVideo; + + private ServiceConnection sConn = new ServiceConnection() + { + public void onServiceConnected(ComponentName className, IBinder service) + { + boundService = ((SensorHubService.LocalBinder) service).getService(); + } + + public void onServiceDisconnected(ComponentName className) + { + boundService = null; + } + }; + + + protected void updateConfig(SharedPreferences prefs, String runName) + { + // get device name + deviceID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); + deviceName = prefs.getString("device_name", null); + if (deviceName == null || deviceName.length() < 2) + deviceName = deviceID; + this.runName = runName; + + sensorhubConfig = new InMemoryConfigDb(); + + // get SOS URL from config + String sosUriConfig = prefs.getString("sos_uri", "http://127.0.0.1:8585/sensorhub/sos"); + String sosUser = prefs.getString("sos_username", ""); + String sosPwd = prefs.getString("sos_password", ""); + if (sosUriConfig != null && sosUriConfig.trim().length() > 0) + { + try + { + sosUrl = new URL(sosUriConfig); + } + catch (MalformedURLException e) + { + e.printStackTrace(); + } + } + + // HTTP Server Config + HttpServerConfig serverConfig = new HttpServerConfig(); + serverConfig.proxyBaseUrl = ""; + serverConfig.httpPort = 8585; + serverConfig.autoStart = true; + sensorhubConfig.add(serverConfig); + + // SOS Config + SOSServiceConfig sosConfig = new SOSServiceWithIPCConfig(); + sosConfig.moduleClass = SOSServiceWithIPC.class.getCanonicalName(); + ((SOSServiceWithIPCConfig) sosConfig).androidContext = this.getApplicationContext(); + sosConfig.id = "SOS_SERVICE"; + sosConfig.name = "SOS Service"; + sosConfig.autoStart = true; + sosConfig.enableTransactional = true; + + File dbFile = new File(getApplicationContext().getFilesDir()+"/db/"); + dbFile.mkdirs(); + MVStorageConfig basicStorageConfig = new MVStorageConfig(); + basicStorageConfig.moduleClass = "org.sensorhub.impl.persistence.h2.MVObsStorageImpl"; + basicStorageConfig.storagePath = dbFile.getAbsolutePath() + "/${STORAGE_ID}.dat"; + basicStorageConfig.autoStart = true; + sosConfig.newStorageConfig = basicStorageConfig; + + // Push Sensors Config + AndroidSensorsConfig androidSensorsConfig = (AndroidSensorsConfig) createSensorConfig(Sensors.Android); + sensorhubConfig.add(androidSensorsConfig); + if (isPushingSensor(Sensors.Android)) + { + addSosTConfig(androidSensorsConfig, sosUser, sosPwd); + } + + StreamStorageConfig androidStreamStorageConfig = createStreamStorageConfig(androidSensorsConfig); + addStorageConfig(androidSensorsConfig, androidStreamStorageConfig); + + SensorDataProviderConfig androidDataProviderConfig = createDataProviderConfig(androidSensorsConfig); + addSosServerConfig(sosConfig, androidDataProviderConfig); + + // TruPulse sensor + boolean enabled = prefs.getBoolean("trupulse_enable", false); + if (enabled) + { + String truPulseDevice = prefs.getString("trupulse_datasource", "SIMULATED"); + TruPulseConfig truPulseConfig = truPulseDevice == "SIMULATED" + ? (TruPulseConfig) createSensorConfig(Sensors.TruPulseSim) + : (TruPulseConfig) createSensorConfig(Sensors.TruPulse); + sensorhubConfig.add(truPulseConfig); + if (isPushingSensor(Sensors.TruPulse)) + { + addSosTConfig(truPulseConfig, sosUser, sosPwd); + } + } + + // AngelSensor + enabled = prefs.getBoolean("angel_enabled", false); + if (enabled) + { + AngelSensorConfig angelConfig = (AngelSensorConfig) createSensorConfig(Sensors.Angel); + //angelConfig.btAddress = "00:07:80:79:04:AF"; // mike + //angelConfig.btAddress = "00:07:80:03:0E:0A"; // alex + angelConfig.btAddress = prefs.getString("angel_address", null); + sensorhubConfig.add(angelConfig); + addSosTConfig(angelConfig, sosUser, sosPwd); + } + + // FLIR One sensor + enabled = prefs.getBoolean("flirone_enabled", false); + if (enabled) + { + showVideo = true; + + FlirOneCameraConfig flironeConfig = (FlirOneCameraConfig) createSensorConfig(Sensors.FlirOne); + sensorhubConfig.add(flironeConfig); + addSosTConfig(flironeConfig, sosUser, sosPwd); + } + + /* + // DJI Drone + enabled = prefs.getBoolean("dji_enabled", false); + if (enabled) + { + DjiConfig djiConfig = new DjiConfig(); + djiConfig.id = "DJI_DRONE"; + djiConfig.name = "DJI Aircraft [" + deviceName + "]"; + djiConfig.autoStart = true; + djiConfig.androidContext = this.getApplicationContext(); + djiConfig.camPreviewTexture = boundService.getVideoTexture(); + showVideo = true; + sensorhubConfig.add(djiConfig); + addSosTConfig(djiConfig, sosUser, sosPwd); + + SensorDataProviderConfig djiDataProviderConfig = new SensorDataProviderConfig(); + djiDataConsumerConfig.sensorID = djiConfig.id; + djiDataConsumerConfig.offeringID = djiConfig.id+"-sos"; + djiDataConsumerConfig.enabled = true; + sosConfig.dataConsumers.add(djiDataConsumerConfig); + } + */ + + /* + // Get SOS-T URL from config + String sostUriConfig = prefs.getString("sost_uri", ""); + String sostUser = prefs.getString("sost_username", ""); + String sostPwd = prefs.getString("sost_password", ""); + if (sostUriConfig != null && sostUriConfig.trim().length() > 0) + { + try { + sostUrl = new URL(sostUriConfig); + } + catch (MalformedURLException e) + { + e.printStackTrace(); + } + } + + if (!sostUriConfig.contentEquals("")) + { + // SOS-T Client Config + SOSTClientConfig sostConfig = new SOSTClientConfig(); + sostConfig.sensorID = androidSensorsConfig.id; + sostConfig.moduleClass = SOSTClient.class.getCanonicalName(); + sostConfig.id = "SOST_CLIENT"; + sostConfig.name = "SOS-T Client"; + sostConfig.autoStart = true; + + // SOS-T Client HTTP Config + sostConfig.sos = new HTTPConfig(); + sostConfig.sos.enableTLS = sostUrl.getProtocol().toUpperCase().contains("HTTPS") ? true : false; + sostConfig.sos.remoteHost = sostUrl.getHost(); + sostConfig.sos.remotePort = sostUrl.getPort(); + sostConfig.sos.resourcePath = sostUrl.getPath(); + sostConfig.sos.user = sostUser; + sostConfig.sos.password = sostPwd; + + sostConfig.connection = new SOSTClientConfig.SOSConnectionConfig(); + sostConfig.connection.usePersistentConnection = true; + sostConfig.connection.maxQueueSize = 10; + sostConfig.connection.maxConnectErrors = 10; + sostConfig.connection.checkReachability = true; + sostConfig.connection.connectTimeout = 3000; + sostConfig.connection.reconnectPeriod = 10000; + sostConfig.connection.reconnectAttempts = 10; + + sensorhubConfig.add(sostConfig); + } + */ + + // SOS Data Providers + for (ProxySensorConfig proxySensorConfig : proxySensorConfigs) { + sensorhubConfig.add(proxySensorConfig); + + SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); + dataProviderConfig.name = proxySensorConfig.id; + dataProviderConfig.sensorID = proxySensorConfig.id; + dataProviderConfig.offeringID = proxySensorConfig.id+"-sos"; + dataProviderConfig.enabled = true; + + sosConfig.dataProviders.add(dataProviderConfig); + } + + sensorhubConfig.add(sosConfig); + } + + private boolean isPushingSensor(Sensors sensor) + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + + if (Sensors.Android.equals(sensor)) + { + if (prefs.getBoolean("accelerometer_enable", false) + && prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (prefs.getBoolean("gyroscope_enable", false) + && prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (prefs.getBoolean("magnetometer_enable", false) + && prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (prefs.getBoolean("orientation_enable", false) + && prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (prefs.getBoolean("location_enable", false) + && prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + if (prefs.getBoolean("video_enable", false) + && prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + } + else if (Sensors.TruPulse.equals(sensor) || Sensors.TruPulseSim.equals(sensor)) + { + if (prefs.getBoolean("trupulse_enable", false) + && prefs.getStringSet("trupulse_options", Collections.emptySet()).contains("PUSH_REMOTE")) + return true; + } + + return false; + } + + private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig sensorConfig) + { + SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); + dataProviderConfig.sensorID = sensorConfig.id; + dataProviderConfig.offeringID = sensorConfig.id + ":offering"; + dataProviderConfig.storageID = sensorConfig.id + "#storage"; + dataProviderConfig.enabled = true; + dataProviderConfig.liveDataTimeout = 600.0; + dataProviderConfig.maxFois = 10; + + return dataProviderConfig; + } + + private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig sensorConfig) + { + // H2 Storage Config + File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", deviceID+"_h2.dat"); + dbFile.getParentFile().mkdirs(); + if(!dbFile.exists()) + { + try + { + dbFile.createNewFile(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + MVStorageConfig storageConfig = new MVStorageConfig(); + storageConfig.moduleClass = MVMultiStorageImpl.class.getCanonicalName(); + storageConfig.storagePath = dbFile.getPath(); + storageConfig.autoStart = true; + storageConfig.memoryCacheSize = 102400; + storageConfig.autoCommitBufferSize = 1024; + + // TODO: Base this on size instead of time. This might error when earliest record is purged and then requested. Test if the capabilities updates... + // Auto Purge Config + MaxAgeAutoPurgeConfig autoPurgeConfig = new MaxAgeAutoPurgeConfig(); + autoPurgeConfig.enabled = true; + autoPurgeConfig.purgePeriod = 24.0 * 60.0 * 60.0; + autoPurgeConfig.maxRecordAge = 24.0 * 60.0 * 60.0; + + // Stream Storage Config + StreamStorageConfig streamStorageConfig = new StreamStorageConfig(); + streamStorageConfig.moduleClass = GenericStreamStorage.class.getCanonicalName(); + streamStorageConfig.id = sensorConfig.id + "#storage"; + streamStorageConfig.name = sensorConfig.name + " Storage"; + streamStorageConfig.dataSourceID = sensorConfig.id; + streamStorageConfig.autoStart = true; + streamStorageConfig.processEvents = true; + streamStorageConfig.minCommitPeriod = 10000; + streamStorageConfig.autoPurgeConfig = autoPurgeConfig; + streamStorageConfig.storageConfig = storageConfig; + return streamStorageConfig; + } + + private SensorConfig createSensorConfig(Sensors sensor) + { + SensorConfig sensorConfig; + + if (Sensors.Android.equals(sensor)) + { + sensorConfig = new AndroidSensorsConfig(); + sensorConfig.id = "urn:device:android:" + deviceID; + sensorConfig.name = "Android Sensors [" + deviceName + "]"; + sensorConfig.autoStart = true; + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + + ((AndroidSensorsConfig) sensorConfig).activateAccelerometer = prefs.getBoolean("accelerometer_enable", false); + ((AndroidSensorsConfig) sensorConfig).activateGyrometer = prefs.getBoolean("gyroscope_enable", false); + ((AndroidSensorsConfig) sensorConfig).activateMagnetometer = prefs.getBoolean("magnetometer_enable", false); + if (prefs.getBoolean("orientation_enable", false)) + { + ((AndroidSensorsConfig) sensorConfig).activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); + ((AndroidSensorsConfig) sensorConfig).activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); + } + if (prefs.getBoolean("location_enable", false)) + { + ((AndroidSensorsConfig) sensorConfig).activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); + ((AndroidSensorsConfig) sensorConfig).activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); + } + if (prefs.getBoolean("video_enable", false)) + { + showVideo = true; + + ((AndroidSensorsConfig) sensorConfig).activateBackCamera = true; + ((AndroidSensorsConfig) sensorConfig).videoCodec = prefs.getString("video_codec", AndroidSensorsConfig.JPEG_CODEC); + } + + ((AndroidSensorsConfig) sensorConfig).androidContext = this.getApplicationContext(); + ((AndroidSensorsConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); + ((AndroidSensorsConfig) sensorConfig).runName = runName; + } + else if (Sensors.TruPulse.equals(sensor)) + { + sensorConfig = new TruPulseConfig(); + sensorConfig.id = "TRUPULSE_SENSOR"; + sensorConfig.name = "TruPulse Range Finder [" + deviceName + "]"; + sensorConfig.autoStart = true; + + BluetoothCommProviderConfig btConf = new BluetoothCommProviderConfig(); + btConf.protocol.deviceName = "TP360RB.*"; + btConf.moduleClass = BluetoothCommProvider.class.getCanonicalName(); + ((TruPulseConfig) sensorConfig).commSettings = btConf; + ((TruPulseConfig) sensorConfig).serialNumber = deviceID; + } + else if (Sensors.TruPulseSim.equals(sensor)) + { + sensorConfig = new TruPulseConfig(); + sensorConfig.id = "TRUPULSE_SENSOR_SIMULATED"; + sensorConfig.name = "Simulated TruPulse Range Finder [" + deviceName + "]"; + sensorConfig.autoStart = true; + + BluetoothCommProviderConfig btConf = new BluetoothCommProviderConfig(); + btConf.protocol.deviceName = "TP360RB.*"; + btConf.moduleClass = SimulatedDataStream.class.getCanonicalName(); + ((TruPulseConfig) sensorConfig).commSettings = btConf; + ((TruPulseConfig) sensorConfig).serialNumber = deviceID; + } + else if (Sensors.Angel.equals(sensor)) + { + sensorConfig = new AngelSensorConfig(); + sensorConfig.id = "ANGEL_SENSOR"; + sensorConfig.name = "Angel Sensor [" + deviceName + "]"; + sensorConfig.autoStart = true; + + BleConfig bleConf = new BleConfig(); + bleConf.id = "BLE"; + bleConf.moduleClass = BleNetwork.class.getCanonicalName(); + bleConf.androidContext = this.getApplicationContext(); + bleConf.autoStart = true; + sensorhubConfig.add(bleConf); + + ((AngelSensorConfig) sensorConfig).networkID = bleConf.id; + } + else if (Sensors.FlirOne.equals(sensor)) + { + sensorConfig = new FlirOneCameraConfig(); + sensorConfig.id = "FLIRONE_SENSOR"; + sensorConfig.name = "FLIR One Camera [" + deviceName + "]"; + sensorConfig.autoStart = true; + + ((FlirOneCameraConfig) sensorConfig).androidContext = this.getApplicationContext(); + ((FlirOneCameraConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); + } + else if (Sensors.ProxySensor.equals(sensor)) + { + sensorConfig = new ProxySensorConfig(); + } + else + { + sensorConfig = new SensorConfig(); + } + + return sensorConfig; + } + + protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig storageConf) + { + if (sensorConf instanceof AndroidSensorsConfig) + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); + List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); + + String sensorName; + for (Sensor sensor: deviceSensors) + { + if (sensor.isWakeUpSensor()) + { + continue; + } + + Log.d(TAG, "addStorageConfig: sensor: " + sensor.getName()); + + switch (sensor.getType()) + { + case Sensor.TYPE_ACCELEROMETER: + if (!prefs.getBoolean("accelerometer_enable", false) + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addStorageConfig: excluding accelerometer"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding accelerometer"); + } + break; + case Sensor.TYPE_GYROSCOPE: + if (!prefs.getBoolean("gyroscope_enable", false) + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addStorageConfig: excluding gyroscope"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding gyroscope"); + } + break; + case Sensor.TYPE_MAGNETIC_FIELD: + if (!prefs.getBoolean("magnetometer_enable", false) + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addStorageConfig: excluding magnetometer"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding magnetometer"); + } + break; + case Sensor.TYPE_ROTATION_VECTOR: + if (!prefs.getBoolean("orientation_enable", false) + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addStorageConfig: excluding orientation"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + storageConf.excludedOutputs.add(sensorName); + sensorName = "quat_orientation_data"; + storageConf.excludedOutputs.add(sensorName); + sensorName = "euler_orientation_data"; + storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding orientation"); + } + break; + } + } + if (!prefs.getBoolean("location_enable", false) + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addStorageConfig: excluding location"); + + sensorName = "gps_data"; + storageConf.excludedOutputs.add(sensorName); + sensorName = "network_data"; + storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding location"); + } + if (!prefs.getBoolean("video_enable", false) + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addStorageConfig: excluding video"); + + sensorName = "camera0_MJPEG"; + storageConf.excludedOutputs.add(sensorName); + sensorName = "camera0_H264"; + storageConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addStorageConfig: NOT excluding video"); + } + } + + sensorhubConfig.add(storageConf); + } + + protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderConfig dataProviderConf) + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); + List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); + + String sensorName; + for (Sensor sensor: deviceSensors) + { + if (sensor.isWakeUpSensor()) + { + continue; + } + + Log.d(TAG, "addSosServerConfig: sensor: " + sensor.getName()); + + switch (sensor.getType()) + { + case Sensor.TYPE_ACCELEROMETER: + if (!prefs.getBoolean("accelerometer_enable", false) + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addSosServerConfig: excluding accelerometer"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding accelerometer"); + } + break; + case Sensor.TYPE_GYROSCOPE: + if (!prefs.getBoolean("gyroscope_enable", false) + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addSosServerConfig: excluding gyroscope"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding gyroscope"); + } + break; + case Sensor.TYPE_MAGNETIC_FIELD: + if (!prefs.getBoolean("magnetometer_enable", false) + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addSosServerConfig: excluding magnetometer"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding magnetometer"); + } + break; + case Sensor.TYPE_ROTATION_VECTOR: + if (!prefs.getBoolean("orientation_enable", false) + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addSosServerConfig: excluding orientation"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "quat_orientation_data"; + dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "euler_orientation_data"; + dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding orientation"); + } + break; + } + } + if (!prefs.getBoolean("location_enable", false) + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addSosServerConfig: excluding location"); + + sensorName = "gps_data"; + dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "network_data"; + dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding location"); + } + if (!prefs.getBoolean("video_enable", false) + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) + { + + Log.d(TAG, "addSosServerConfig: excluding video"); + + sensorName = "camera0_MJPEG"; + dataProviderConf.excludedOutputs.add(sensorName); + sensorName = "camera0_H264"; + dataProviderConf.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosServerConfig: NOT excluding video"); + } + + sosConf.dataProviders.add(dataProviderConf); + } + + protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sosPwd) + { + if (sosUrl == null) + return; + + SOSTClientConfig sosConfig = new SOSTClientConfig(); + sosConfig.id = sensorConf.id + "_SOST"; + sosConfig.name = sensorConf.name.replaceAll("\\[.*\\]", "");// + "SOS-T Client"; + sosConfig.autoStart = true; + sosConfig.sensorID = sensorConf.id; + sosConfig.sos.remoteHost = sosUrl.getHost(); + sosConfig.sos.remotePort = sosUrl.getPort(); + sosConfig.sos.resourcePath = sosUrl.getPath(); + sosConfig.sos.enableTLS = sosUrl.getProtocol().equals("https"); + sosConfig.sos.user = sosUser; + sosConfig.sos.password = sosPwd; + sosConfig.connection.connectTimeout = 10000; + sosConfig.connection.usePersistentConnection = true; + sosConfig.connection.reconnectAttempts = 9; + + if (sensorConf instanceof AndroidSensorsConfig) + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); + SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); + List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); + + String sensorName; + for (Sensor sensor: deviceSensors) + { + if (sensor.isWakeUpSensor()) + { + continue; + } + + Log.d(TAG, "addSosTConfig: sensor: " + sensor.getName()); + + switch (sensor.getType()) + { + case Sensor.TYPE_ACCELEROMETER: + if (!prefs.getBoolean("accelerometer_enable", false) + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) + { + + Log.d(TAG, "addSosTConfig: excluding accelerometer"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding accelerometer"); + } + break; + case Sensor.TYPE_GYROSCOPE: + if (!prefs.getBoolean("gyroscope_enable", false) + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH_REMOTE")) + { + + Log.d(TAG, "addSosTConfig: excluding gyroscope"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding gyroscope"); + } + break; + case Sensor.TYPE_MAGNETIC_FIELD: + if (!prefs.getBoolean("magnetometer_enable", false) + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) + { + + Log.d(TAG, "addSosTConfig: excluding magnetometer"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding magnetometer"); + } + break; + case Sensor.TYPE_ROTATION_VECTOR: + if (!prefs.getBoolean("orientation_enable", false) + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH_REMOTE")) + { + + Log.d(TAG, "addSosTConfig: excluding orientation"); + + sensorName = sensor.getName().replaceAll(" ", "_") + "_data"; + sosConfig.excludedOutputs.add(sensorName); + sensorName = "quat_orientation_data"; + sosConfig.excludedOutputs.add(sensorName); + sensorName = "euler_orientation_data"; + sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding orientation"); + } + break; + } + } + if (!prefs.getBoolean("location_enable", false) + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH_REMOTE")) + { + + Log.d(TAG, "addSosTConfig: excluding location"); + + sensorName = "gps_data"; + sosConfig.excludedOutputs.add(sensorName); + sensorName = "network_data"; + sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding location"); + } + if (!prefs.getBoolean("video_enable", false) + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) + { + + Log.d(TAG, "addSosTConfig: excluding video"); + + sensorName = "camera0_MJPEG"; + sosConfig.excludedOutputs.add(sensorName); + sensorName = "camera0_H264"; + sosConfig.excludedOutputs.add(sensorName); + } else { + Log.d(TAG, "addSosTConfig: NOT excluding video"); + } + } + + sensorhubConfig.add(sosConfig); + } + + + @SuppressLint("HandlerLeak") + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + textArea = (TextView) findViewById(R.id.text); + + // listen to texture view lifecycle + TextureView textureView = (TextureView) findViewById(R.id.video); + textureView.setSurfaceTextureListener(this); + + // bind to SensorHub service + Intent intent = new Intent(this, SensorHubService.class); + bindService(intent, sConn, Context.BIND_AUTO_CREATE); + + // handler to refresh sensor status in UI + displayHandler = new Handler(Looper.getMainLooper()); + + setupBroadcastReceivers(); + } + + + private void setupBroadcastReceivers() { + BroadcastReceiver receiver = new BroadcastReceiver() + { + @Override + public void onReceive(Context context, Intent intent) + { + String origin = intent.getStringExtra("src"); + if (!context.getPackageName().equalsIgnoreCase(origin)) + { + String sosEndpointUrl = intent.getStringExtra("sosEndpointUrl"); + String name = intent.getStringExtra("name"); + String sensorId = intent.getStringExtra("sensorId"); + ArrayList properties = intent.getStringArrayListExtra("properties"); + + if (sosEndpointUrl== null || name == null || sensorId == null || properties.size() == 0) + { + return; + } + + ProxySensorConfig proxySensorConfig = (ProxySensorConfig) createSensorConfig(Sensors.ProxySensor); + proxySensorConfig.sosEndpointUrl = sosEndpointUrl; + proxySensorConfig.name = name; + proxySensorConfig.id = sensorId; + proxySensorConfig.sensorUID = sensorId; + for (String property : properties) + { + proxySensorConfig.observedProperties.add(property); + } + proxySensorConfig.sosUseWebsockets = true; + proxySensorConfig.autoStart = true; + proxySensorConfigs.add(proxySensorConfig); + } + } + }; + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_BROADCAST_RECEIVER); + + registerReceiver(receiver, filter); + } + + + private void testBroadcastReceiver() { + ArrayList testProperties = new ArrayList(); + testProperties.add("http://sensorml.com/ont/swe/property/Acceleration"); + testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); + testProperties.add("http://sensorml.com/ont/swe/property/AngularRate"); + + Intent testIntent = new Intent(); + testIntent.setAction(ACTION_BROADCAST_RECEIVER); + testIntent.putExtra("sosEndpointUrl", "http://192.168.0.43:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); + testIntent.putExtra("name", "Android Sensors [Pocophone]"); + testIntent.putExtra("sensorId", "urn:android:device:a0b0515feaa872a4"); + testIntent.putStringArrayListExtra("properties", testProperties); + sendBroadcast(testIntent); + } + + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + if (id == R.id.action_settings) + { + startActivity(new Intent(this, UserSettingsActivity.class)); + return true; + } + else if (id == R.id.action_start) + { + if (boundService != null && boundService.getSensorHub() == null) + showRunNamePopup(); + return true; + } + else if (id == R.id.action_stop) + { + stopListeningForEvents(); + stopRefreshingStatus(); + sostClients.clear(); + if (boundService != null) + boundService.stopSensorHub(); + textArea.setBackgroundColor(0xFFFFFFFF); + oshStarted = false; + newStatusMessage("SensorHub Stopped"); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + return true; + } + else if (id == R.id.action_about) + { +// showAboutPopup(); + testBroadcastReceiver(); + } + + return super.onOptionsItemSelected(item); + } + + + protected void showRunNamePopup() + { + AlertDialog.Builder alert = new AlertDialog.Builder(this); + + alert.setTitle("Run Name"); + alert.setMessage("Please enter the name for this run"); + + // Set an EditText view to get user input + final EditText input = new EditText(this); + input.getText().append("Run-"); + SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.US); + input.getText().append(formatter.format(new Date())); + alert.setView(input); + + alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int whichButton) + { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + runName = input.getText().toString(); + newStatusMessage("Starting SensorHub..."); + + updateConfig(PreferenceManager.getDefaultSharedPreferences(MainActivity.this), runName); + sostClients.clear(); + boundService.startSensorHub(sensorhubConfig, showVideo, MainActivity.this); + + if (boundService.hasVideo()) + textArea.setBackgroundColor(0x80FFFFFF); + } + }); + + alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + } + }); + + alert.show(); + } + + + protected void showAboutPopup() + { + String version = "?"; + + try + { + PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0); + version = pInfo.versionName; + } + catch (PackageManager.NameNotFoundException e) + { + } + + String message = "A software platform for building smart sensor networks and the Internet of Things\n\n"; + message += "Version: " + version + "\n"; + + AlertDialog.Builder alert = new AlertDialog.Builder(this); + alert.setTitle("OpenSensorHub"); + alert.setMessage(message); + alert.setIcon(R.drawable.ic_launcher); + alert.show(); + } + + + @Override + public void handleEvent(Event e) + { + if (e instanceof ModuleEvent) + { + // start refreshing status on first module loaded + if (!oshStarted && ((ModuleEvent) e).getType() == ModuleEvent.Type.LOADED) + { + oshStarted = true; + startRefreshingStatus(); + return; + } + + // detect when SOS-T modules are connected + else if (e.getSource() instanceof SOSTClient && ((ModuleEvent)e).getType() == ModuleEvent.Type.STATE_CHANGED) + { + switch (((ModuleEvent)e).getNewState()) + { + case INITIALIZING: + sostClients.add((SOSTClient)e.getSource()); + break; + } + } + } + } + + + protected void startRefreshingStatus() + { + if (displayCallback != null) + return; + + // handler to display async messages in UI + displayCallback = new Runnable() + { + public void run() + { + displayStatus(); + textArea.setText(Html.fromHtml(displayText.toString())); + displayHandler.postDelayed(this, 1000); + } + }; + + displayHandler.post(displayCallback); + } + + + protected void stopRefreshingStatus() + { + if (displayCallback != null) + { + displayHandler.removeCallbacks(displayCallback); + displayCallback = null; + } + } + + + protected synchronized void displayStatus() + { + displayText.setLength(0); + + // first display error messages if any + for (SOSTClient client: sostClients) + { + Map dataStreams = client.getDataStreams(); + boolean showError = (client.getCurrentError() != null); + boolean showMsg = (dataStreams.size() == 0) && (client.getStatusMessage() != null); + + if (showError || showMsg) + { + displayText.append("

" + client.getName() + ":
"); + if (showMsg) + displayText.append(client.getStatusMessage() + "
"); + if (showError) + { + Throwable errorObj = client.getCurrentError(); + String errorMsg = errorObj.getMessage().trim(); + if (!errorMsg.endsWith(".")) + errorMsg += ". "; + if (errorObj.getCause() != null && errorObj.getCause().getMessage() != null) + errorMsg += errorObj.getCause().getMessage(); + displayText.append("" + errorMsg + ""); + } + displayText.append("

"); + } + } + + // then display streams status + displayText.append("

"); + for (SOSTClient client: sostClients) + { + Map dataStreams = client.getDataStreams(); + long now = System.currentTimeMillis(); + + for (Entry stream : dataStreams.entrySet()) + { + displayText.append("" + stream.getKey().getName() + " : "); + + long lastEventTime = stream.getValue().lastEventTime; + long dt = now - lastEventTime; + if (lastEventTime == Long.MIN_VALUE) + displayText.append("NO OBS"); + else if (dt > stream.getValue().measPeriodMs) + displayText.append("NOK (" + dt + "ms ago)"); + else + displayText.append("OK (" + dt + "ms ago)"); + + if (stream.getValue().errorCount > 0) + { + displayText.append(" ("); + displayText.append(stream.getValue().errorCount); + displayText.append(")"); + } + + displayText.append("
"); + } + } + + if (displayText.length() > 5) + displayText.setLength(displayText.length()-5); // remove last
+ displayText.append("

"); + } + + + protected synchronized void newStatusMessage(String msg) + { + displayText.setLength(0); + appendStatusMessage(msg); + } + + + protected synchronized void appendStatusMessage(String msg) + { + displayText.append(msg); + + displayHandler.post(new Runnable() + { + public void run() + { + textArea.setText(displayText.toString()); + } + }); + } + + + protected void startListeningForEvents() + { + if (boundService == null || boundService.getSensorHub() == null) + return; + + boundService.getSensorHub().getModuleRegistry().registerListener(this); + } + + + protected void stopListeningForEvents() + { + if (boundService == null || boundService.getSensorHub() == null) + return; + + boundService.getSensorHub().getModuleRegistry().unregisterListener(this); + } + + + protected void showVideo() + { + if (boundService.getVideoTexture() != null) + { + TextureView textureView = (TextureView) findViewById(R.id.video); + if (textureView.getSurfaceTexture() != boundService.getVideoTexture()) + textureView.setSurfaceTexture(boundService.getVideoTexture()); + } + } + + + protected void hideVideo() + { + } + + + @Override + protected void onStart() + { + super.onStart(); + } + + + @Override + protected void onResume() + { + super.onResume(); + + TextureView textureView = (TextureView) findViewById(R.id.video); + textureView.setSurfaceTextureListener(this); + + if (oshStarted) + { + startListeningForEvents(); + startRefreshingStatus(); + + if (boundService.hasVideo()) + textArea.setBackgroundColor(0x80FFFFFF); + } + } + + + @Override + protected void onPause() + { + stopListeningForEvents(); + stopRefreshingStatus(); + hideVideo(); + super.onPause(); + } + + + @Override + protected void onStop() + { + stopListeningForEvents(); + stopRefreshingStatus(); + super.onStop(); + } + + + @Override + protected void onDestroy() + { + stopService(new Intent(this, SensorHubService.class)); + super.onDestroy(); + } + + + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) + { + showVideo(); + } + + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) + { + } + + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) + { + return false; + } + + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) + { + } +} diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java index 6a650fbf..1c5d309e 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java @@ -2,9 +2,12 @@ import android.util.Log; import org.sensorhub.api.common.SensorHubException; +import org.sensorhub.api.sensor.ISensorDataInterface; import org.sensorhub.impl.sensor.swe.SWEVirtualSensor; import java.util.ArrayList; import java.util.List; +import java.util.Map; + import net.opengis.gml.v32.AbstractFeature; import net.opengis.sensorml.v20.AbstractPhysicalProcess; import net.opengis.swe.v20.DataBlock; @@ -36,7 +39,7 @@ public class ProxySensor extends SWEVirtualSensor { AbstractFeature currentFoi; List sosClients; SPSClient spsClient; - + Map recordListeners; public ProxySensor() { super(); @@ -44,6 +47,8 @@ public ProxySensor() { @Override public void start() throws SensorHubException { + Log.d(TAG, "Starting Proxy Sensor"); + checkConfig(); removeAllOutputs(); removeAllControlInputs(); @@ -102,14 +107,21 @@ public void start() throws SensorHubException { final ProxySensorOutput output = new ProxySensorOutput(this, recordDef, sos.getRecommendedEncoding()); this.addOutput(output, false); - // TODO: Move to event based start - sos.startStream(new SOSRecordListener() { + recordListeners.put(sos.toString(), new SOSRecordListener() { @Override public void newRecord(DataBlock data) { output.publishNewRecord(data); } }); +// // TODO: Move to event based start +// sos.startStream(new SOSRecordListener() { +// @Override +// public void newRecord(DataBlock data) { +// output.publishNewRecord(data); +// } +// }); + outputNum++; } } @@ -122,4 +134,10 @@ public void newRecord(DataBlock data) { } } + + public void startSOSStreams() throws SensorHubException { + for (SOSClient client: sosClients){ + client.startStream(recordListeners.get(client.toString())); + } + } } diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java index c60f45f2..191564f4 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java @@ -6,6 +6,8 @@ import net.opengis.swe.v20.DataComponent; import net.opengis.swe.v20.DataEncoding; +import org.sensorhub.api.common.IEventListener; +import org.sensorhub.api.common.SensorHubException; import org.sensorhub.impl.sensor.swe.SWEVirtualSensor; import org.sensorhub.impl.sensor.swe.SWEVirtualSensorOutput; @@ -13,6 +15,10 @@ public class ProxySensorOutput extends SWEVirtualSensorOutput { + ProxySensor parentSensor; + DataComponent recordStructure; + DataEncoding recordEncoding; + public ProxySensorOutput(SWEVirtualSensor sensor, DataComponent recordStructure, DataEncoding recordEncoding) { super(sensor, recordStructure, recordEncoding); } @@ -21,4 +27,17 @@ public ProxySensorOutput(SWEVirtualSensor sensor, DataComponent recordStructure, public void publishNewRecord(DataBlock dataBlock) { Log.d(TAG, "publishNewRecord"); } + + @Override + public void registerListener(IEventListener listener) + { + Log.d(TAG, "Registering Proxy Sensor Listener"); + //TODO: How to start the SOS stream at this point? + try { + this.parentSensor.startSOSStreams(); + } catch (SensorHubException e) { + Log.d(TAG, "Error Starting Stream while registering Proxy Sensor", e); + } + eventHandler.registerListener(listener); + } } From e93c5d7a91dc24805bdbd956e4c5fa80092f2b3b Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 25 Jun 2019 11:11:20 -0500 Subject: [PATCH 068/207] working wip --- .../src/org/sensorhub/android/MainActivity.java | 5 +++-- .../impl/sensor/swe/ProxySensor/ProxySensorConfig.java | 2 +- .../impl/sensor/swe/ProxySensor/ProxySensorOutput.java | 5 ----- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 92fa6537..e5c7c523 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -422,7 +422,7 @@ private SensorConfig createSensorConfig(Sensors sensor) if (Sensors.Android.equals(sensor)) { sensorConfig = new AndroidSensorsConfig(); - sensorConfig.id = "urn:device:android:" + deviceID; + sensorConfig.id = "urn:android:device:" + deviceID; sensorConfig.name = "Android Sensors [" + deviceName + "]"; sensorConfig.autoStart = true; @@ -981,7 +981,8 @@ else if (id == R.id.action_stop) } else if (id == R.id.action_about) { - showAboutPopup(); +// showAboutPopup(); + testBroadcastReceiver(); } return super.onOptionsItemSelected(item); diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java index cb5e482d..26108c1a 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java @@ -6,6 +6,6 @@ public class ProxySensorConfig extends SWEVirtualSensorConfig { public ProxySensorConfig() { - this.moduleClass = ProxySensorConfig.class.getCanonicalName(); + super(); } } diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java index c60f45f2..8cb4b549 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java @@ -16,9 +16,4 @@ public class ProxySensorOutput extends SWEVirtualSensorOutput public ProxySensorOutput(SWEVirtualSensor sensor, DataComponent recordStructure, DataEncoding recordEncoding) { super(sensor, recordStructure, recordEncoding); } - - @Override - public void publishNewRecord(DataBlock dataBlock) { - Log.d(TAG, "publishNewRecord"); - } } From fa05e1caef062a6a8291f62ef96bb1cb00dae47f Mon Sep 17 00:00:00 2001 From: Joshua Wolfe Date: Tue, 25 Jun 2019 15:15:18 -0500 Subject: [PATCH 069/207] add ui element for testing proxy broadcast --- sensorhub-android-app/res/menu/main.xml | 9 ++++- sensorhub-android-app/res/values/strings.xml | 1 + .../org/sensorhub/android/MainActivity.java | 39 ++++++++++--------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/sensorhub-android-app/res/menu/main.xml b/sensorhub-android-app/res/menu/main.xml index 6b5b3c03..5d9d37aa 100644 --- a/sensorhub-android-app/res/menu/main.xml +++ b/sensorhub-android-app/res/menu/main.xml @@ -20,10 +20,15 @@ android:showAsAction="never" android:title="@string/action_stop"/> + + - diff --git a/sensorhub-android-app/res/values/strings.xml b/sensorhub-android-app/res/values/strings.xml index 3fb3e3c3..24776d0c 100644 --- a/sensorhub-android-app/res/values/strings.xml +++ b/sensorhub-android-app/res/values/strings.xml @@ -6,6 +6,7 @@ Start SensorHub Stop SensorHub About + Test Proxy SOS Settings (Required) SOS-T Settings (Optional) Android Sensor diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index e5c7c523..f659766a 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -924,22 +924,6 @@ public void onReceive(Context context, Intent intent) } - private void testBroadcastReceiver() { - ArrayList testProperties = new ArrayList(); - testProperties.add("http://sensorml.com/ont/swe/property/Acceleration"); - testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); - testProperties.add("http://sensorml.com/ont/swe/property/AngularRate"); - - Intent testIntent = new Intent(); - testIntent.setAction(ACTION_BROADCAST_RECEIVER); - testIntent.putExtra("sosEndpointUrl", "http://192.168.0.43:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); - testIntent.putExtra("name", "Android Sensors [Pocophone]"); - testIntent.putExtra("sensorId", "urn:android:device:a0b0515feaa872a4"); - testIntent.putStringArrayListExtra("properties", testProperties); - sendBroadcast(testIntent); - } - - @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -981,8 +965,11 @@ else if (id == R.id.action_stop) } else if (id == R.id.action_about) { -// showAboutPopup(); - testBroadcastReceiver(); + showAboutPopup(); + } + else if (id == R.id.action_proxy) + { + testProxyBroadcast(); } return super.onOptionsItemSelected(item); @@ -1053,6 +1040,22 @@ protected void showAboutPopup() } + protected void testProxyBroadcast() + { + ArrayList testProperties = new ArrayList(); + testProperties.add("http://sensorml.com/ont/swe/property/Acceleration"); + testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); + testProperties.add("http://sensorml.com/ont/swe/property/AngularRate"); + + Intent testIntent = new Intent(); + testIntent.setAction(ACTION_BROADCAST_RECEIVER); + testIntent.putExtra("sosEndpointUrl", "http://192.168.0.43:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); + testIntent.putExtra("name", "Android Sensors [Pocophone]"); + testIntent.putExtra("sensorId", "urn:android:device:a0b0515feaa872a4"); + testIntent.putStringArrayListExtra("properties", testProperties); + sendBroadcast(testIntent); + } + @Override public void handleEvent(Event e) { From bb1cb0ac2c2591d84f3f847094f9b4b4ff5cd665 Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Wed, 26 Jun 2019 22:29:33 -0500 Subject: [PATCH 070/207] WIP: Auto Hub Restart on Proxy Add --- .../org/sensorhub/android/MainActivity.java | 91 ++++++++++++++----- 1 file changed, 66 insertions(+), 25 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 045d3575..0961ad59 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -44,6 +44,7 @@ import org.sensorhub.android.comm.ble.BleNetwork; import org.sensorhub.api.common.Event; import org.sensorhub.api.common.IEventListener; +import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleEvent; import org.sensorhub.api.sensor.ISensorDataInterface; @@ -53,6 +54,7 @@ import org.sensorhub.impl.client.sost.SOSTClientConfig; import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; import org.sensorhub.impl.module.InMemoryConfigDb; +import org.sensorhub.impl.module.ModuleRegistry; import org.sensorhub.impl.persistence.GenericStreamStorage; import org.sensorhub.impl.persistence.MaxAgeAutoPurgeConfig; import org.sensorhub.impl.persistence.StreamStorageConfig; @@ -914,6 +916,45 @@ public void onReceive(Context context, Intent intent) proxySensorConfig.sosUseWebsockets = true; proxySensorConfig.autoStart = true; proxySensorConfigs.add(proxySensorConfig); + + // register and "start" new sensor, data stream doesn't begin until someone requests data + ModuleRegistry mr = boundService.sensorhub.getInstance().getModuleRegistry(); + + try { + mr.loadModule(proxySensorConfig); + Log.d("OSHApp", "Loading Proxy Sensor " + proxySensorConfig.name); + sensorhubConfig.add(proxySensorConfig); + SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); + dataProviderConfig.name = proxySensorConfig.name; + dataProviderConfig.sensorID = proxySensorConfig.id; + dataProviderConfig.offeringID = proxySensorConfig.id + "-sos"; + dataProviderConfig.enabled = true; + + SOSServiceWithIPCConfig sosConf = (SOSServiceWithIPCConfig) mr.getModuleById("SOS_SERVICE").getConfiguration(); + sosConf.dataProviders.add(dataProviderConfig); + +// mr.loadModule(proxySensorConfig); +// mr.startModule(proxySensorConfig.id); + + // reload SOS? +// mr.stopModule(sosConf.id); +// mr.loadModule(sosConf); +// mr.startModule(sosConf.id); + + boundService.stopSensorHub(); + Thread.sleep(2000); + Log.d("OSHApp", "Starting Sensorhub Again"); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + updateConfig(PreferenceManager.getDefaultSharedPreferences(MainActivity.this), runName); + sostClients.clear(); + boundService.startSensorHub(sensorhubConfig, showVideo, MainActivity.this); + if (boundService.hasVideo()) + textArea.setBackgroundColor(0x80FFFFFF); +// showRunNamePopup(); + } catch (SensorHubException | InterruptedException e) { + Log.e("OSHApp", "Error Loading Proxy Sensor", e); + } + } } }; @@ -1044,14 +1085,14 @@ protected void testProxyBroadcast() { ArrayList testProperties = new ArrayList(); testProperties.add("http://sensorml.com/ont/swe/property/Acceleration"); - testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); - testProperties.add("http://sensorml.com/ont/swe/property/AngularRate"); +// testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); +// testProperties.add("http://sensorml.com/ont/swe/property/AngularRate"); Intent testIntent = new Intent(); testIntent.setAction(ACTION_BROADCAST_RECEIVER); - testIntent.putExtra("sosEndpointUrl", "http://192.168.0.43:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); - testIntent.putExtra("name", "Android Sensors [Pocophone]"); - testIntent.putExtra("sensorId", "urn:android:device:a0b0515feaa872a4"); + testIntent.putExtra("sosEndpointUrl", "http://192.168.1.195:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); + testIntent.putExtra("name", "Android Sensors [S9]"); + testIntent.putExtra("sensorId", "urn:android:device:aa3de549fc5ae2c3"); testIntent.putStringArrayListExtra("properties", testProperties); sendBroadcast(testIntent); } @@ -1081,8 +1122,8 @@ else if (e.getSource() instanceof SOSTClient && ((ModuleEvent)e).getType() == Mo } } } - - + + protected void startRefreshingStatus() { if (displayCallback != null) @@ -1101,8 +1142,8 @@ public void run() displayHandler.post(displayCallback); } - - + + protected void stopRefreshingStatus() { if (displayCallback != null) @@ -1112,18 +1153,18 @@ protected void stopRefreshingStatus() } } - + protected synchronized void displayStatus() { displayText.setLength(0); - + // first display error messages if any for (SOSTClient client: sostClients) { Map dataStreams = client.getDataStreams(); boolean showError = (client.getCurrentError() != null); boolean showMsg = (dataStreams.size() == 0) && (client.getStatusMessage() != null); - + if (showError || showMsg) { displayText.append("

" + client.getName() + ":
"); @@ -1142,14 +1183,14 @@ protected synchronized void displayStatus() displayText.append("

"); } } - + // then display streams status displayText.append("

"); for (SOSTClient client: sostClients) { - Map dataStreams = client.getDataStreams(); + Map dataStreams = client.getDataStreams(); long now = System.currentTimeMillis(); - + for (Entry stream : dataStreams.entrySet()) { displayText.append("" + stream.getKey().getName() + " : "); @@ -1169,7 +1210,7 @@ else if (dt > stream.getValue().measPeriodMs) displayText.append(stream.getValue().errorCount); displayText.append(")"); } - + displayText.append("
"); } } @@ -1178,15 +1219,15 @@ else if (dt > stream.getValue().measPeriodMs) displayText.setLength(displayText.length()-5); // remove last
displayText.append("

"); } - - + + protected synchronized void newStatusMessage(String msg) { displayText.setLength(0); appendStatusMessage(msg); } - - + + protected synchronized void appendStatusMessage(String msg) { displayText.append(msg); @@ -1199,17 +1240,17 @@ public void run() } }); } - - + + protected void startListeningForEvents() { if (boundService == null || boundService.getSensorHub() == null) return; - + boundService.getSensorHub().getModuleRegistry().registerListener(this); } - - + + protected void stopListeningForEvents() { if (boundService == null || boundService.getSensorHub() == null) From 25588db9d8552d259090918f5538087f515ed062 Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Thu, 27 Jun 2019 15:49:42 -0500 Subject: [PATCH 071/207] Update Config in Place --- .../src/org/sensorhub/android/MainActivity.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 0961ad59..34ef0553 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -937,11 +937,15 @@ public void onReceive(Context context, Intent intent) // mr.startModule(proxySensorConfig.id); // reload SOS? + mr.updateModuleConfigAsync(sosConf); // mr.stopModule(sosConf.id); +// Thread.sleep(2000); +// sensorhubConfig.update(sosConf); // mr.loadModule(sosConf); // mr.startModule(sosConf.id); - boundService.stopSensorHub(); + // Stop and Restart SensorHub + /*boundService.stopSensorHub(); Thread.sleep(2000); Log.d("OSHApp", "Starting Sensorhub Again"); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); @@ -949,9 +953,9 @@ public void onReceive(Context context, Intent intent) sostClients.clear(); boundService.startSensorHub(sensorhubConfig, showVideo, MainActivity.this); if (boundService.hasVideo()) - textArea.setBackgroundColor(0x80FFFFFF); + textArea.setBackgroundColor(0x80FFFFFF);*/ // showRunNamePopup(); - } catch (SensorHubException | InterruptedException e) { + } catch (SensorHubException e) { Log.e("OSHApp", "Error Loading Proxy Sensor", e); } From d203c2ba76c08c81e2a12d1e1c4dfc33fb243c75 Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Wed, 10 Jul 2019 14:46:55 -0500 Subject: [PATCH 072/207] Start Proxy Sensor Stream on GetResult --- .../org/sensorhub/android/MainActivity.java | 11 +----- .../sensor/swe/ProxySensor/ProxySensor.java | 38 +++++++++---------- .../swe/ProxySensor/ProxySensorConfig.java | 1 + .../swe/ProxySensor/ProxySensorOutput.java | 25 +++++++----- 4 files changed, 35 insertions(+), 40 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 0961ad59..ce4a5dd8 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -933,14 +933,6 @@ public void onReceive(Context context, Intent intent) SOSServiceWithIPCConfig sosConf = (SOSServiceWithIPCConfig) mr.getModuleById("SOS_SERVICE").getConfiguration(); sosConf.dataProviders.add(dataProviderConfig); -// mr.loadModule(proxySensorConfig); -// mr.startModule(proxySensorConfig.id); - - // reload SOS? -// mr.stopModule(sosConf.id); -// mr.loadModule(sosConf); -// mr.startModule(sosConf.id); - boundService.stopSensorHub(); Thread.sleep(2000); Log.d("OSHApp", "Starting Sensorhub Again"); @@ -950,7 +942,6 @@ public void onReceive(Context context, Intent intent) boundService.startSensorHub(sensorhubConfig, showVideo, MainActivity.this); if (boundService.hasVideo()) textArea.setBackgroundColor(0x80FFFFFF); -// showRunNamePopup(); } catch (SensorHubException | InterruptedException e) { Log.e("OSHApp", "Error Loading Proxy Sensor", e); } @@ -1090,7 +1081,7 @@ protected void testProxyBroadcast() Intent testIntent = new Intent(); testIntent.setAction(ACTION_BROADCAST_RECEIVER); - testIntent.putExtra("sosEndpointUrl", "http://192.168.1.195:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); + testIntent.putExtra("sosEndpointUrl", "http://192.168.0.46:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); testIntent.putExtra("name", "Android Sensors [S9]"); testIntent.putExtra("sensorId", "urn:android:device:aa3de549fc5ae2c3"); testIntent.putStringArrayListExtra("properties", testProperties); diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java index 1c5d309e..495c27e1 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java @@ -1,18 +1,25 @@ package org.sensorhub.impl.sensor.swe.ProxySensor; import android.util.Log; + import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.sensor.ISensorDataInterface; import org.sensorhub.impl.sensor.swe.SWEVirtualSensor; + import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; import java.util.List; +import java.util.ListIterator; import java.util.Map; +import java.util.Set; import net.opengis.gml.v32.AbstractFeature; import net.opengis.sensorml.v20.AbstractPhysicalProcess; import net.opengis.swe.v20.DataBlock; import net.opengis.swe.v20.DataChoice; import net.opengis.swe.v20.DataComponent; + import org.sensorhub.api.common.SensorHubException; import org.sensorhub.impl.client.sos.SOSClient; import org.sensorhub.impl.client.sos.SOSClient.SOSRecordListener; @@ -30,7 +37,7 @@ import org.vast.util.TimeExtent; public class ProxySensor extends SWEVirtualSensor { -// protected static final Logger log = LoggerFactory.getLogger(ProxySensor.class); + // protected static final Logger log = LoggerFactory.getLogger(ProxySensor.class); private static final String TAG = "OSHProxySensor"; private static final String SOS_VERSION = "2.0"; private static final String SPS_VERSION = "2.0"; @@ -39,7 +46,6 @@ public class ProxySensor extends SWEVirtualSensor { AbstractFeature currentFoi; List sosClients; SPSClient spsClient; - Map recordListeners; public ProxySensor() { super(); @@ -99,7 +105,6 @@ public void start() throws SensorHubException { if (outputNum == 1 && config.sensorML == null) this.sensorDescription = (AbstractPhysicalProcess) sos.getSensorDescription(config.sensorUID); } catch (SensorHubException e) { -// log.warn("Cannot get remote sensor description", e); Log.d(TAG, "Cannot get remote sensor description.", e); } @@ -107,21 +112,6 @@ public void start() throws SensorHubException { final ProxySensorOutput output = new ProxySensorOutput(this, recordDef, sos.getRecommendedEncoding()); this.addOutput(output, false); - recordListeners.put(sos.toString(), new SOSRecordListener() { - @Override - public void newRecord(DataBlock data) { - output.publishNewRecord(data); - } - }); - -// // TODO: Move to event based start -// sos.startStream(new SOSRecordListener() { -// @Override -// public void newRecord(DataBlock data) { -// output.publishNewRecord(data); -// } -// }); - outputNum++; } } @@ -136,8 +126,16 @@ public void newRecord(DataBlock data) { } public void startSOSStreams() throws SensorHubException { - for (SOSClient client: sosClients){ - client.startStream(recordListeners.get(client.toString())); + for (int i = 0; i < sosClients.size(); i++) { + String name = sosClients.get(i).getRecordDescription().getName(); + SOSRecordListener rl = new SOSRecordListener() { + @Override + public void newRecord(DataBlock data) { + ProxySensorOutput output = (ProxySensorOutput)getObservationOutputs().get(name); + output.publishNewRecord(data); + } + }; + sosClients.get(i).startStream(rl); } } } diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java index 26108c1a..9bf47b25 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java @@ -7,5 +7,6 @@ public class ProxySensorConfig extends SWEVirtualSensorConfig public ProxySensorConfig() { super(); + this.moduleClass = ProxySensor.class.getCanonicalName(); } } diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java index 191564f4..7c515bda 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java @@ -19,25 +19,30 @@ public class ProxySensorOutput extends SWEVirtualSensorOutput DataComponent recordStructure; DataEncoding recordEncoding; - public ProxySensorOutput(SWEVirtualSensor sensor, DataComponent recordStructure, DataEncoding recordEncoding) { + public ProxySensorOutput(ProxySensor sensor, DataComponent recordStructure, DataEncoding recordEncoding) { super(sensor, recordStructure, recordEncoding); - } - - @Override - public void publishNewRecord(DataBlock dataBlock) { - Log.d(TAG, "publishNewRecord"); + this.parentSensor = sensor; + this.recordStructure = recordStructure; + this.recordEncoding = recordEncoding; } @Override public void registerListener(IEventListener listener) { +// super.registerListener(listener); Log.d(TAG, "Registering Proxy Sensor Listener"); //TODO: How to start the SOS stream at this point? try { - this.parentSensor.startSOSStreams(); - } catch (SensorHubException e) { - Log.d(TAG, "Error Starting Stream while registering Proxy Sensor", e); - } + this.parentSensor.startSOSStreams(); + } catch (SensorHubException e) { + Log.d(TAG, "Error Starting Stream while registering Proxy Sensor", e); + } eventHandler.registerListener(listener); } + + @Override + public void publishNewRecord(DataBlock dataBlock) { + super.publishNewRecord(dataBlock); + Log.d(TAG, "publishNewRecord: "); + } } From 4510ec62c8814a046ccd5556d028221890e1e628 Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Wed, 10 Jul 2019 15:29:33 -0500 Subject: [PATCH 073/207] Stop Proxy Sensor stream manually --- sensorhub-android-app/res/menu/main.xml | 8 +++- sensorhub-android-app/res/values/strings.xml | 3 +- .../org/sensorhub/android/MainActivity.java | 12 ++++++ .../sensor/swe/ProxySensor/ProxySensor.java | 40 +++++++++++++++++++ .../swe/ProxySensor/ProxySensorConfig.java | 11 +++++ 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/sensorhub-android-app/res/menu/main.xml b/sensorhub-android-app/res/menu/main.xml index 5d9d37aa..a3a51dca 100644 --- a/sensorhub-android-app/res/menu/main.xml +++ b/sensorhub-android-app/res/menu/main.xml @@ -26,9 +26,15 @@ android:showAsAction="never" android:title="@string/action_proxy"/> + + diff --git a/sensorhub-android-app/res/values/strings.xml b/sensorhub-android-app/res/values/strings.xml index 24776d0c..d018250d 100644 --- a/sensorhub-android-app/res/values/strings.xml +++ b/sensorhub-android-app/res/values/strings.xml @@ -6,7 +6,8 @@ Start SensorHub Stop SensorHub About - Test Proxy + Start Proxy + Stop Proxy SOS Settings (Required) SOS-T Settings (Optional) Android Sensor diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index ce4a5dd8..e6cebc10 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -62,6 +62,7 @@ import org.sensorhub.impl.persistence.h2.MVStorageConfig; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; +import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensor; import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; import org.sensorhub.impl.service.sos.SOSServiceConfig; @@ -311,6 +312,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) // SOS Data Providers for (ProxySensorConfig proxySensorConfig : proxySensorConfigs) { +// proxySensorConfig.androidContext = this.getApplicationContext(); sensorhubConfig.add(proxySensorConfig); SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); @@ -905,6 +907,7 @@ public void onReceive(Context context, Intent intent) } ProxySensorConfig proxySensorConfig = (ProxySensorConfig) createSensorConfig(Sensors.ProxySensor); + proxySensorConfig.androidContext = getApplicationContext(); proxySensorConfig.sosEndpointUrl = sosEndpointUrl; proxySensorConfig.name = name; proxySensorConfig.id = sensorId; @@ -1003,6 +1006,9 @@ else if (id == R.id.action_proxy) { testProxyBroadcast(); } + else if(id == R.id.action_stop_proxy){ + testStopProxyBroadcast(); + } return super.onOptionsItemSelected(item); } @@ -1088,6 +1094,12 @@ protected void testProxyBroadcast() sendBroadcast(testIntent); } + protected void testStopProxyBroadcast(){ + Intent testIntent = new Intent(); + testIntent.setAction("org.sofwerx.ogc.ACTION_PROXY"); + sendBroadcast(testIntent); + } + @Override public void handleEvent(Event e) { diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java index 495c27e1..dfff50ee 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java @@ -1,7 +1,12 @@ package org.sensorhub.impl.sensor.swe.ProxySensor; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.util.Log; +import org.sensorhub.android.SOSServiceWithIPCConfig; import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.sensor.ISensorDataInterface; import org.sensorhub.impl.sensor.swe.SWEVirtualSensor; @@ -47,12 +52,41 @@ public class ProxySensor extends SWEVirtualSensor { List sosClients; SPSClient spsClient; + public static final String ACTION_PROXY = "org.sofwerx.ogc.ACTION_PROXY"; + private static final String EXTRA_PAYLOAD = "PROXY"; + private static final String EXTRA_ORIGIN = "src"; + private Context androidContext; + public ProxySensor() { super(); } @Override public void start() throws SensorHubException { + androidContext = ((ProxySensorConfig) config).androidContext; + + BroadcastReceiver receiver = new BroadcastReceiver() + { + @Override + public void onReceive(Context context, Intent intent) + { + String origin = intent.getStringExtra(EXTRA_ORIGIN); + if (!context.getPackageName().equalsIgnoreCase(origin)) + { + String requestPayload = intent.getStringExtra(EXTRA_PAYLOAD); // TODO: Can be observable property string + try { + stopSOSStreams(); + } catch (SensorHubException e) { + e.printStackTrace(); + } + } + } + }; + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_PROXY); + + androidContext.registerReceiver(receiver, filter); + Log.d(TAG, "Starting Proxy Sensor"); checkConfig(); @@ -138,4 +172,10 @@ public void newRecord(DataBlock data) { sosClients.get(i).startStream(rl); } } + + public void stopSOSStreams() throws SensorHubException { + for (int i = 0; i < sosClients.size(); i++) { + sosClients.get(i).stopStream(); + } + } } diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java index 9bf47b25..5737b520 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorConfig.java @@ -1,12 +1,23 @@ package org.sensorhub.impl.sensor.swe.ProxySensor; +import android.content.Context; + +import org.sensorhub.api.module.ModuleConfig; import org.sensorhub.impl.sensor.swe.SWEVirtualSensorConfig; public class ProxySensorConfig extends SWEVirtualSensorConfig { + public transient Context androidContext; + public ProxySensorConfig() { super(); this.moduleClass = ProxySensor.class.getCanonicalName(); } + + @Override + public ModuleConfig clone() + { + return this; // disable clone for now as it crashes Android app + } } From 38a9f91c5dfe73b76c92efb89a40170760400b00 Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Wed, 10 Jul 2019 16:01:44 -0500 Subject: [PATCH 074/207] Fix proxy sensor time error, remove autorestart --- .../org/sensorhub/android/MainActivity.java | 56 +++++++++---------- .../sensor/swe/ProxySensor/ProxySensor.java | 9 +++ 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index e6cebc10..40b01b8f 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -312,7 +312,6 @@ protected void updateConfig(SharedPreferences prefs, String runName) // SOS Data Providers for (ProxySensorConfig proxySensorConfig : proxySensorConfigs) { -// proxySensorConfig.androidContext = this.getApplicationContext(); sensorhubConfig.add(proxySensorConfig); SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); @@ -920,34 +919,35 @@ public void onReceive(Context context, Intent intent) proxySensorConfig.autoStart = true; proxySensorConfigs.add(proxySensorConfig); + // TODO: clean up later to fix restarting the hub on proxy sensor insert // register and "start" new sensor, data stream doesn't begin until someone requests data - ModuleRegistry mr = boundService.sensorhub.getInstance().getModuleRegistry(); - - try { - mr.loadModule(proxySensorConfig); - Log.d("OSHApp", "Loading Proxy Sensor " + proxySensorConfig.name); - sensorhubConfig.add(proxySensorConfig); - SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); - dataProviderConfig.name = proxySensorConfig.name; - dataProviderConfig.sensorID = proxySensorConfig.id; - dataProviderConfig.offeringID = proxySensorConfig.id + "-sos"; - dataProviderConfig.enabled = true; - - SOSServiceWithIPCConfig sosConf = (SOSServiceWithIPCConfig) mr.getModuleById("SOS_SERVICE").getConfiguration(); - sosConf.dataProviders.add(dataProviderConfig); - - boundService.stopSensorHub(); - Thread.sleep(2000); - Log.d("OSHApp", "Starting Sensorhub Again"); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - updateConfig(PreferenceManager.getDefaultSharedPreferences(MainActivity.this), runName); - sostClients.clear(); - boundService.startSensorHub(sensorhubConfig, showVideo, MainActivity.this); - if (boundService.hasVideo()) - textArea.setBackgroundColor(0x80FFFFFF); - } catch (SensorHubException | InterruptedException e) { - Log.e("OSHApp", "Error Loading Proxy Sensor", e); - } +// ModuleRegistry mr = boundService.sensorhub.getInstance().getModuleRegistry(); + +// try { +// mr.loadModule(proxySensorConfig); +// Log.d("OSHApp", "Loading Proxy Sensor " + proxySensorConfig.name); +// sensorhubConfig.add(proxySensorConfig); +// SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); +// dataProviderConfig.name = proxySensorConfig.name; +// dataProviderConfig.sensorID = proxySensorConfig.id; +// dataProviderConfig.offeringID = proxySensorConfig.id + "-sos"; +// dataProviderConfig.enabled = true; +// +// SOSServiceWithIPCConfig sosConf = (SOSServiceWithIPCConfig) mr.getModuleById("SOS_SERVICE").getConfiguration(); +// sosConf.dataProviders.add(dataProviderConfig); +// +// boundService.stopSensorHub(); +// Thread.sleep(2000); +// Log.d("OSHApp", "Starting Sensorhub Again"); +// getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); +// updateConfig(PreferenceManager.getDefaultSharedPreferences(MainActivity.this), runName); +// sostClients.clear(); +// boundService.startSensorHub(sensorhubConfig, showVideo, MainActivity.this); +// if (boundService.hasVideo()) +// textArea.setBackgroundColor(0x80FFFFFF); +// } catch (SensorHubException | InterruptedException e) { +// Log.e("OSHApp", "Error Loading Proxy Sensor", e); +// } } } diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java index dfff50ee..295e0f9a 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java @@ -146,6 +146,15 @@ public void onReceive(Context context, Intent intent) final ProxySensorOutput output = new ProxySensorOutput(this, recordDef, sos.getRecommendedEncoding()); this.addOutput(output, false); + // HACK TO PREVENT GETRESULT TIME ERROR + sos.startStream((data) -> output.publishNewRecord(data)); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + sos.stopStream(); + outputNum++; } } From 53353a3f3a98ad3a7da56c43a10a898fb77091bd Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Thu, 11 Jul 2019 19:06:50 -0500 Subject: [PATCH 075/207] Fix PhenomTime error. --- .../org/sensorhub/android/MainActivity.java | 3 +- .../sensor/swe/ProxySensor/ProxySensor.java | 14 ++++----- .../swe/ProxySensor/ProxySensorOutput.java | 29 ++++++++++++++----- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 40b01b8f..2add7b15 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -1087,7 +1087,8 @@ protected void testProxyBroadcast() Intent testIntent = new Intent(); testIntent.setAction(ACTION_BROADCAST_RECEIVER); - testIntent.putExtra("sosEndpointUrl", "http://192.168.0.46:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); +// testIntent.putExtra("sosEndpointUrl", "http://192.168.0.46:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); + testIntent.putExtra("sosEndpointUrl", "http://192.168.1.195:8585/sensorhub/sos?service=SOS&version=2.0&request=GetCapabilities"); testIntent.putExtra("name", "Android Sensors [S9]"); testIntent.putExtra("sensorId", "urn:android:device:aa3de549fc5ae2c3"); testIntent.putStringArrayListExtra("properties", testProperties); diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java index 295e0f9a..cec78848 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java @@ -147,13 +147,13 @@ public void onReceive(Context context, Intent intent) this.addOutput(output, false); // HACK TO PREVENT GETRESULT TIME ERROR - sos.startStream((data) -> output.publishNewRecord(data)); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - sos.stopStream(); +// sos.startStream((data) -> output.publishNewRecord(data)); +// try { +// Thread.sleep(1000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// sos.stopStream(); outputNum++; } diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java index 7c515bda..f2bee0b2 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java @@ -26,6 +26,17 @@ public ProxySensorOutput(ProxySensor sensor, DataComponent recordStructure, Data this.recordEncoding = recordEncoding; } + @Override + public void publishNewRecord(DataBlock dataBlock) { + super.publishNewRecord(dataBlock); + Log.d(TAG, "publishNewRecord: "); + } + + @Override + public long getLatestRecordTime() { + return System.currentTimeMillis(); + } + @Override public void registerListener(IEventListener listener) { @@ -33,16 +44,20 @@ public void registerListener(IEventListener listener) Log.d(TAG, "Registering Proxy Sensor Listener"); //TODO: How to start the SOS stream at this point? try { - this.parentSensor.startSOSStreams(); - } catch (SensorHubException e) { - Log.d(TAG, "Error Starting Stream while registering Proxy Sensor", e); - } + this.parentSensor.startSOSStreams(); + } catch (SensorHubException e) { + Log.d(TAG, "Error Starting Stream while registering Proxy Sensor", e); + } eventHandler.registerListener(listener); } @Override - public void publishNewRecord(DataBlock dataBlock) { - super.publishNewRecord(dataBlock); - Log.d(TAG, "publishNewRecord: "); + public void unregisterListener(IEventListener listener) { + try { + this.parentSensor.stopSOSStreams(); + Log.d(TAG, "unregisterListener: Stopping streams"); + } catch (SensorHubException e) { + e.printStackTrace(); + } } } From 70d59124d999f470d4f62ed7e77072705fdd9080 Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Thu, 11 Jul 2019 19:18:19 -0500 Subject: [PATCH 076/207] Reinstate Auto Restart + small refactoring --- .../org/sensorhub/android/MainActivity.java | 48 ++++++------------- .../swe/ProxySensor/ProxySensorOutput.java | 3 +- 2 files changed, 16 insertions(+), 35 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 2add7b15..8cebce91 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -911,43 +911,25 @@ public void onReceive(Context context, Intent intent) proxySensorConfig.name = name; proxySensorConfig.id = sensorId; proxySensorConfig.sensorUID = sensorId; - for (String property : properties) - { - proxySensorConfig.observedProperties.add(property); - } + proxySensorConfig.observedProperties.addAll(properties); proxySensorConfig.sosUseWebsockets = true; proxySensorConfig.autoStart = true; proxySensorConfigs.add(proxySensorConfig); - // TODO: clean up later to fix restarting the hub on proxy sensor insert - // register and "start" new sensor, data stream doesn't begin until someone requests data -// ModuleRegistry mr = boundService.sensorhub.getInstance().getModuleRegistry(); - -// try { -// mr.loadModule(proxySensorConfig); -// Log.d("OSHApp", "Loading Proxy Sensor " + proxySensorConfig.name); -// sensorhubConfig.add(proxySensorConfig); -// SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); -// dataProviderConfig.name = proxySensorConfig.name; -// dataProviderConfig.sensorID = proxySensorConfig.id; -// dataProviderConfig.offeringID = proxySensorConfig.id + "-sos"; -// dataProviderConfig.enabled = true; -// -// SOSServiceWithIPCConfig sosConf = (SOSServiceWithIPCConfig) mr.getModuleById("SOS_SERVICE").getConfiguration(); -// sosConf.dataProviders.add(dataProviderConfig); -// -// boundService.stopSensorHub(); -// Thread.sleep(2000); -// Log.d("OSHApp", "Starting Sensorhub Again"); -// getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); -// updateConfig(PreferenceManager.getDefaultSharedPreferences(MainActivity.this), runName); -// sostClients.clear(); -// boundService.startSensorHub(sensorhubConfig, showVideo, MainActivity.this); -// if (boundService.hasVideo()) -// textArea.setBackgroundColor(0x80FFFFFF); -// } catch (SensorHubException | InterruptedException e) { -// Log.e("OSHApp", "Error Loading Proxy Sensor", e); -// } + // register and "start" new sensor, data stream doesn't begin until someone requests data; + try { + boundService.stopSensorHub(); + Thread.sleep(2000); + Log.d("OSHApp", "Starting Sensorhub Again"); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + updateConfig(PreferenceManager.getDefaultSharedPreferences(MainActivity.this), runName); + sostClients.clear(); + boundService.startSensorHub(sensorhubConfig, showVideo, MainActivity.this); + if (boundService.hasVideo()) + textArea.setBackgroundColor(0x80FFFFFF); + } catch (InterruptedException e) { + Log.e("OSHApp", "Error Loading Proxy Sensor", e); + } } } diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java index f2bee0b2..0bd52860 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java @@ -40,9 +40,8 @@ public long getLatestRecordTime() { @Override public void registerListener(IEventListener listener) { -// super.registerListener(listener); + // TODO: Start the SOS Stream of only requested data Log.d(TAG, "Registering Proxy Sensor Listener"); - //TODO: How to start the SOS stream at this point? try { this.parentSensor.startSOSStreams(); } catch (SensorHubException e) { From b73bf6bbc71ed42eec13255516abfc5d0edd09ea Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Thu, 11 Jul 2019 22:09:22 -0500 Subject: [PATCH 077/207] Stop streams on unregisterListener --- .../org/sensorhub/android/MainActivity.java | 2 +- .../sensor/swe/ProxySensor/ProxySensor.java | 36 +++++++++++++++---- .../swe/ProxySensor/ProxySensorOutput.java | 9 +++-- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 8cebce91..ffd97ac2 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -1064,7 +1064,7 @@ protected void testProxyBroadcast() { ArrayList testProperties = new ArrayList(); testProperties.add("http://sensorml.com/ont/swe/property/Acceleration"); -// testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); + testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); // testProperties.add("http://sensorml.com/ont/swe/property/AngularRate"); Intent testIntent = new Intent(); diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java index cec78848..6e0b9e20 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensor.java @@ -65,14 +65,11 @@ public ProxySensor() { public void start() throws SensorHubException { androidContext = ((ProxySensorConfig) config).androidContext; - BroadcastReceiver receiver = new BroadcastReceiver() - { + BroadcastReceiver receiver = new BroadcastReceiver() { @Override - public void onReceive(Context context, Intent intent) - { + public void onReceive(Context context, Intent intent) { String origin = intent.getStringExtra(EXTRA_ORIGIN); - if (!context.getPackageName().equalsIgnoreCase(origin)) - { + if (!context.getPackageName().equalsIgnoreCase(origin)) { String requestPayload = intent.getStringExtra(EXTRA_PAYLOAD); // TODO: Can be observable property string try { stopSOSStreams(); @@ -174,7 +171,7 @@ public void startSOSStreams() throws SensorHubException { SOSRecordListener rl = new SOSRecordListener() { @Override public void newRecord(DataBlock data) { - ProxySensorOutput output = (ProxySensorOutput)getObservationOutputs().get(name); + ProxySensorOutput output = (ProxySensorOutput) getObservationOutputs().get(name); output.publishNewRecord(data); } }; @@ -182,9 +179,34 @@ public void newRecord(DataBlock data) { } } + public void startSOSStream(String outputName) throws SensorHubException { + for (SOSClient client : sosClients) { + if (client.getRecordDescription().getName().equals(outputName)) { + SOSRecordListener recordListener = new SOSRecordListener() { + @Override + public void newRecord(DataBlock data) { + ProxySensorOutput output = (ProxySensorOutput) getObservationOutputs().get(outputName); + output.publishNewRecord(data); + } + }; + client.startStream(recordListener); + break; + } + } + } + public void stopSOSStreams() throws SensorHubException { for (int i = 0; i < sosClients.size(); i++) { sosClients.get(i).stopStream(); } } + + public void stopSOSStream(String outputName) throws SensorHubException { + for (SOSClient client : sosClients) { + if (client.getRecordDescription().getName().equals(outputName)) { + client.stopStream(); + break; + } + } + } } diff --git a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java index 0bd52860..36397598 100644 --- a/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java +++ b/sensorhub-android-app/src/org/sensorhub/impl/sensor/swe/ProxySensor/ProxySensorOutput.java @@ -40,10 +40,9 @@ public long getLatestRecordTime() { @Override public void registerListener(IEventListener listener) { - // TODO: Start the SOS Stream of only requested data - Log.d(TAG, "Registering Proxy Sensor Listener"); + Log.d(TAG, "Registering Proxy Sensor Listener for: " + this.name); try { - this.parentSensor.startSOSStreams(); + this.parentSensor.startSOSStream(this.name); } catch (SensorHubException e) { Log.d(TAG, "Error Starting Stream while registering Proxy Sensor", e); } @@ -53,8 +52,8 @@ public void registerListener(IEventListener listener) @Override public void unregisterListener(IEventListener listener) { try { - this.parentSensor.stopSOSStreams(); - Log.d(TAG, "unregisterListener: Stopping streams"); + this.parentSensor.stopSOSStream(this.name); + Log.d(TAG, "unregisterListener: Stopping stream: " + this.name); } catch (SensorHubException e) { e.printStackTrace(); } From d2ded8555a93eff18842731e96d8d6120b8cb8f6 Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Mon, 23 Sep 2019 19:18:41 -0500 Subject: [PATCH 078/207] Testing BLE Beacon Usage --- sensorhub-android-app/AndroidManifest.xml | 1 + .../org/sensorhub/android/MainActivity.java | 547 +++++++++--------- sensorhub-android-blebeacon/.gitignore | 1 + sensorhub-android-blebeacon/build.gradle | 34 ++ .../consumer-rules.pro | 0 sensorhub-android-blebeacon/docs/BLEDoc.txt | 12 + .../proguard-rules.pro | 21 + .../blebeacon/ExampleInstrumentedTest.java | 26 + .../src/main/AndroidManifest.xml | 2 + .../sensor/blebeacon/BLEBeaconConfig.java | 6 + .../impl/sensor/blebeacon/BLETest.java | 4 + .../src/main/res/values/strings.xml | 3 + .../sensor/blebeacon/ExampleUnitTest.java | 17 + settings.gradle | 1 + 14 files changed, 401 insertions(+), 274 deletions(-) create mode 100644 sensorhub-android-blebeacon/.gitignore create mode 100644 sensorhub-android-blebeacon/build.gradle create mode 100644 sensorhub-android-blebeacon/consumer-rules.pro create mode 100644 sensorhub-android-blebeacon/docs/BLEDoc.txt create mode 100644 sensorhub-android-blebeacon/proguard-rules.pro create mode 100644 sensorhub-android-blebeacon/src/androidTest/java/org/sensorhub/impl/sensor/blebeacon/ExampleInstrumentedTest.java create mode 100644 sensorhub-android-blebeacon/src/main/AndroidManifest.xml create mode 100644 sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconConfig.java create mode 100644 sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLETest.java create mode 100644 sensorhub-android-blebeacon/src/main/res/values/strings.xml create mode 100644 sensorhub-android-blebeacon/src/test/java/org/sensorhub/impl/sensor/blebeacon/ExampleUnitTest.java diff --git a/sensorhub-android-app/AndroidManifest.xml b/sensorhub-android-app/AndroidManifest.xml index bf4cff68..d61bc395 100644 --- a/sensorhub-android-app/AndroidManifest.xml +++ b/sensorhub-android-app/AndroidManifest.xml @@ -7,6 +7,7 @@ + diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index ffd97ac2..693adf17 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -1,19 +1,25 @@ /*************************** BEGIN LICENSE BLOCK *************************** -The contents of this file are subject to the Mozilla Public License, v. 2.0. -If a copy of the MPL was not distributed with this file, You can obtain one -at http://mozilla.org/MPL/2.0/. - -Software distributed under the License is distributed on an "AS IS" basis, -WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -for the specific language governing rights and limitations under the License. - -Copyright (C) 2012-2015 Sensia Software LLC. All Rights Reserved. - -******************************* END LICENSE BLOCK ***************************/ + The contents of this file are subject to the Mozilla Public License, v. 2.0. + If a copy of the MPL was not distributed with this file, You can obtain one + at http://mozilla.org/MPL/2.0/. + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + Copyright (C) 2012-2015 Sensia Software LLC. All Rights Reserved. + ******************************* END LICENSE BLOCK ***************************/ package org.sensorhub.android; +import android.app.ListActivity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.bluetooth.le.BluetoothLeScanner; +import android.bluetooth.le.ScanCallback; +import android.bluetooth.le.ScanResult; import android.content.BroadcastReceiver; import android.content.IntentFilter; import android.content.pm.PackageInfo; @@ -86,13 +92,13 @@ import android.preference.PreferenceManager; import android.provider.Settings.Secure; import android.text.Html; +import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.TextView; import static android.content.ContentValues.TAG; -public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener -{ +public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, IEventListener { public static final String ACTION_BROADCAST_RECEIVER = "org.sensorhub.android.BROADCAST_RECEIVER"; String deviceID; @@ -122,22 +128,18 @@ enum Sensors { URL sostUrl = null; boolean showVideo; - private ServiceConnection sConn = new ServiceConnection() - { - public void onServiceConnected(ComponentName className, IBinder service) - { + private ServiceConnection sConn = new ServiceConnection() { + public void onServiceConnected(ComponentName className, IBinder service) { boundService = ((SensorHubService.LocalBinder) service).getService(); } - public void onServiceDisconnected(ComponentName className) - { + public void onServiceDisconnected(ComponentName className) { boundService = null; } }; - protected void updateConfig(SharedPreferences prefs, String runName) - { + protected void updateConfig(SharedPreferences prefs, String runName) { // get device name deviceID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); deviceName = prefs.getString("device_name", null); @@ -151,14 +153,10 @@ protected void updateConfig(SharedPreferences prefs, String runName) String sosUriConfig = prefs.getString("sos_uri", "http://127.0.0.1:8585/sensorhub/sos"); String sosUser = prefs.getString("sos_username", ""); String sosPwd = prefs.getString("sos_password", ""); - if (sosUriConfig != null && sosUriConfig.trim().length() > 0) - { - try - { + if (sosUriConfig != null && sosUriConfig.trim().length() > 0) { + try { sosUrl = new URL(sosUriConfig); - } - catch (MalformedURLException e) - { + } catch (MalformedURLException e) { e.printStackTrace(); } } @@ -179,7 +177,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) sosConfig.autoStart = true; sosConfig.enableTransactional = true; - File dbFile = new File(getApplicationContext().getFilesDir()+"/db/"); + File dbFile = new File(getApplicationContext().getFilesDir() + "/db/"); dbFile.mkdirs(); MVStorageConfig basicStorageConfig = new MVStorageConfig(); basicStorageConfig.moduleClass = "org.sensorhub.impl.persistence.h2.MVObsStorageImpl"; @@ -190,8 +188,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) // Push Sensors Config AndroidSensorsConfig androidSensorsConfig = (AndroidSensorsConfig) createSensorConfig(Sensors.Android); sensorhubConfig.add(androidSensorsConfig); - if (isPushingSensor(Sensors.Android)) - { + if (isPushingSensor(Sensors.Android)) { addSosTConfig(androidSensorsConfig, sosUser, sosPwd); } @@ -203,23 +200,20 @@ protected void updateConfig(SharedPreferences prefs, String runName) // TruPulse sensor boolean enabled = prefs.getBoolean("trupulse_enable", false); - if (enabled) - { + if (enabled) { String truPulseDevice = prefs.getString("trupulse_datasource", "SIMULATED"); TruPulseConfig truPulseConfig = truPulseDevice == "SIMULATED" ? (TruPulseConfig) createSensorConfig(Sensors.TruPulseSim) : (TruPulseConfig) createSensorConfig(Sensors.TruPulse); sensorhubConfig.add(truPulseConfig); - if (isPushingSensor(Sensors.TruPulse)) - { + if (isPushingSensor(Sensors.TruPulse)) { addSosTConfig(truPulseConfig, sosUser, sosPwd); } } // AngelSensor enabled = prefs.getBoolean("angel_enabled", false); - if (enabled) - { + if (enabled) { AngelSensorConfig angelConfig = (AngelSensorConfig) createSensorConfig(Sensors.Angel); //angelConfig.btAddress = "00:07:80:79:04:AF"; // mike //angelConfig.btAddress = "00:07:80:03:0E:0A"; // alex @@ -230,8 +224,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) // FLIR One sensor enabled = prefs.getBoolean("flirone_enabled", false); - if (enabled) - { + if (enabled) { showVideo = true; FlirOneCameraConfig flironeConfig = (FlirOneCameraConfig) createSensorConfig(Sensors.FlirOne); @@ -317,7 +310,7 @@ protected void updateConfig(SharedPreferences prefs, String runName) SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); dataProviderConfig.name = proxySensorConfig.id; dataProviderConfig.sensorID = proxySensorConfig.id; - dataProviderConfig.offeringID = proxySensorConfig.id+"-sos"; + dataProviderConfig.offeringID = proxySensorConfig.id + "-sos"; dataProviderConfig.enabled = true; sosConfig.dataProviders.add(dataProviderConfig); @@ -326,12 +319,10 @@ protected void updateConfig(SharedPreferences prefs, String runName) sensorhubConfig.add(sosConfig); } - private boolean isPushingSensor(Sensors sensor) - { + private boolean isPushingSensor(Sensors sensor) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - if (Sensors.Android.equals(sensor)) - { + if (Sensors.Android.equals(sensor)) { if (prefs.getBoolean("accelerometer_enable", false) && prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) return true; @@ -350,9 +341,7 @@ private boolean isPushingSensor(Sensors sensor) if (prefs.getBoolean("video_enable", false) && prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) return true; - } - else if (Sensors.TruPulse.equals(sensor) || Sensors.TruPulseSim.equals(sensor)) - { + } else if (Sensors.TruPulse.equals(sensor) || Sensors.TruPulseSim.equals(sensor)) { if (prefs.getBoolean("trupulse_enable", false) && prefs.getStringSet("trupulse_options", Collections.emptySet()).contains("PUSH_REMOTE")) return true; @@ -361,8 +350,7 @@ else if (Sensors.TruPulse.equals(sensor) || Sensors.TruPulseSim.equals(sensor)) return false; } - private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig sensorConfig) - { + private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig sensorConfig) { SensorDataProviderConfig dataProviderConfig = new SensorDataProviderConfig(); dataProviderConfig.sensorID = sensorConfig.id; dataProviderConfig.offeringID = sensorConfig.id + ":offering"; @@ -374,19 +362,14 @@ private SensorDataProviderConfig createDataProviderConfig(AndroidSensorsConfig s return dataProviderConfig; } - private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig sensorConfig) - { + private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig sensorConfig) { // H2 Storage Config - File dbFile = new File(getApplicationContext().getFilesDir()+"/db/", deviceID+"_h2.dat"); + File dbFile = new File(getApplicationContext().getFilesDir() + "/db/", deviceID + "_h2.dat"); dbFile.getParentFile().mkdirs(); - if(!dbFile.exists()) - { - try - { + if (!dbFile.exists()) { + try { dbFile.createNewFile(); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } } @@ -418,12 +401,10 @@ private StreamStorageConfig createStreamStorageConfig(AndroidSensorsConfig senso return streamStorageConfig; } - private SensorConfig createSensorConfig(Sensors sensor) - { + private SensorConfig createSensorConfig(Sensors sensor) { SensorConfig sensorConfig; - if (Sensors.Android.equals(sensor)) - { + if (Sensors.Android.equals(sensor)) { sensorConfig = new AndroidSensorsConfig(); sensorConfig.id = "urn:android:device:" + deviceID; sensorConfig.name = "Android Sensors [" + deviceName + "]"; @@ -434,18 +415,15 @@ private SensorConfig createSensorConfig(Sensors sensor) ((AndroidSensorsConfig) sensorConfig).activateAccelerometer = prefs.getBoolean("accelerometer_enable", false); ((AndroidSensorsConfig) sensorConfig).activateGyrometer = prefs.getBoolean("gyroscope_enable", false); ((AndroidSensorsConfig) sensorConfig).activateMagnetometer = prefs.getBoolean("magnetometer_enable", false); - if (prefs.getBoolean("orientation_enable", false)) - { + if (prefs.getBoolean("orientation_enable", false)) { ((AndroidSensorsConfig) sensorConfig).activateOrientationQuat = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("QUATERNION"); ((AndroidSensorsConfig) sensorConfig).activateOrientationEuler = prefs.getStringSet("orientation_angles", Collections.emptySet()).contains("EULER"); } - if (prefs.getBoolean("location_enable", false)) - { + if (prefs.getBoolean("location_enable", false)) { ((AndroidSensorsConfig) sensorConfig).activateGpsLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("GPS"); ((AndroidSensorsConfig) sensorConfig).activateNetworkLocation = prefs.getStringSet("location_type", Collections.emptySet()).contains("NETWORK"); } - if (prefs.getBoolean("video_enable", false)) - { + if (prefs.getBoolean("video_enable", false)) { showVideo = true; ((AndroidSensorsConfig) sensorConfig).activateBackCamera = true; @@ -455,9 +433,7 @@ private SensorConfig createSensorConfig(Sensors sensor) ((AndroidSensorsConfig) sensorConfig).androidContext = this.getApplicationContext(); ((AndroidSensorsConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); ((AndroidSensorsConfig) sensorConfig).runName = runName; - } - else if (Sensors.TruPulse.equals(sensor)) - { + } else if (Sensors.TruPulse.equals(sensor)) { sensorConfig = new TruPulseConfig(); sensorConfig.id = "TRUPULSE_SENSOR"; sensorConfig.name = "TruPulse Range Finder [" + deviceName + "]"; @@ -468,9 +444,7 @@ else if (Sensors.TruPulse.equals(sensor)) btConf.moduleClass = BluetoothCommProvider.class.getCanonicalName(); ((TruPulseConfig) sensorConfig).commSettings = btConf; ((TruPulseConfig) sensorConfig).serialNumber = deviceID; - } - else if (Sensors.TruPulseSim.equals(sensor)) - { + } else if (Sensors.TruPulseSim.equals(sensor)) { sensorConfig = new TruPulseConfig(); sensorConfig.id = "TRUPULSE_SENSOR_SIMULATED"; sensorConfig.name = "Simulated TruPulse Range Finder [" + deviceName + "]"; @@ -481,9 +455,7 @@ else if (Sensors.TruPulseSim.equals(sensor)) btConf.moduleClass = SimulatedDataStream.class.getCanonicalName(); ((TruPulseConfig) sensorConfig).commSettings = btConf; ((TruPulseConfig) sensorConfig).serialNumber = deviceID; - } - else if (Sensors.Angel.equals(sensor)) - { + } else if (Sensors.Angel.equals(sensor)) { sensorConfig = new AngelSensorConfig(); sensorConfig.id = "ANGEL_SENSOR"; sensorConfig.name = "Angel Sensor [" + deviceName + "]"; @@ -497,9 +469,7 @@ else if (Sensors.Angel.equals(sensor)) sensorhubConfig.add(bleConf); ((AngelSensorConfig) sensorConfig).networkID = bleConf.id; - } - else if (Sensors.FlirOne.equals(sensor)) - { + } else if (Sensors.FlirOne.equals(sensor)) { sensorConfig = new FlirOneCameraConfig(); sensorConfig.id = "FLIRONE_SENSOR"; sensorConfig.name = "FLIR One Camera [" + deviceName + "]"; @@ -507,43 +477,33 @@ else if (Sensors.FlirOne.equals(sensor)) ((FlirOneCameraConfig) sensorConfig).androidContext = this.getApplicationContext(); ((FlirOneCameraConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); - } - else if (Sensors.ProxySensor.equals(sensor)) - { + } else if (Sensors.ProxySensor.equals(sensor)) { sensorConfig = new ProxySensorConfig(); - } - else - { + } else { sensorConfig = new SensorConfig(); } return sensorConfig; } - protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig storageConf) - { - if (sensorConf instanceof AndroidSensorsConfig) - { + protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig storageConf) { + if (sensorConf instanceof AndroidSensorsConfig) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); + SensorManager sensorManager = (SensorManager) getApplicationContext().getSystemService(Context.SENSOR_SERVICE); List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); String sensorName; - for (Sensor sensor: deviceSensors) - { - if (sensor.isWakeUpSensor()) - { + for (Sensor sensor : deviceSensors) { + if (sensor.isWakeUpSensor()) { continue; } Log.d(TAG, "addStorageConfig: sensor: " + sensor.getName()); - switch (sensor.getType()) - { + switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: if (!prefs.getBoolean("accelerometer_enable", false) - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding accelerometer"); @@ -555,8 +515,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto break; case Sensor.TYPE_GYROSCOPE: if (!prefs.getBoolean("gyroscope_enable", false) - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding gyroscope"); @@ -568,8 +527,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto break; case Sensor.TYPE_MAGNETIC_FIELD: if (!prefs.getBoolean("magnetometer_enable", false) - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding magnetometer"); @@ -581,8 +539,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto break; case Sensor.TYPE_ROTATION_VECTOR: if (!prefs.getBoolean("orientation_enable", false) - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding orientation"); @@ -599,8 +556,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto } } if (!prefs.getBoolean("location_enable", false) - || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding location"); @@ -612,8 +568,7 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto Log.d(TAG, "addStorageConfig: NOT excluding location"); } if (!prefs.getBoolean("video_enable", false) - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addStorageConfig: excluding video"); @@ -629,28 +584,23 @@ protected void addStorageConfig(SensorConfig sensorConf, StreamStorageConfig sto sensorhubConfig.add(storageConf); } - protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderConfig dataProviderConf) - { + protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderConfig dataProviderConf) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); + SensorManager sensorManager = (SensorManager) getApplicationContext().getSystemService(Context.SENSOR_SERVICE); List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); String sensorName; - for (Sensor sensor: deviceSensors) - { - if (sensor.isWakeUpSensor()) - { + for (Sensor sensor : deviceSensors) { + if (sensor.isWakeUpSensor()) { continue; } Log.d(TAG, "addSosServerConfig: sensor: " + sensor.getName()); - switch (sensor.getType()) - { + switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: if (!prefs.getBoolean("accelerometer_enable", false) - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding accelerometer"); @@ -662,8 +612,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo break; case Sensor.TYPE_GYROSCOPE: if (!prefs.getBoolean("gyroscope_enable", false) - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding gyroscope"); @@ -675,8 +624,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo break; case Sensor.TYPE_MAGNETIC_FIELD: if (!prefs.getBoolean("magnetometer_enable", false) - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding magnetometer"); @@ -688,8 +636,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo break; case Sensor.TYPE_ROTATION_VECTOR: if (!prefs.getBoolean("orientation_enable", false) - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding orientation"); @@ -706,8 +653,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo } } if (!prefs.getBoolean("location_enable", false) - || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding location"); @@ -719,8 +665,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo Log.d(TAG, "addSosServerConfig: NOT excluding location"); } if (!prefs.getBoolean("video_enable", false) - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) - { + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("STORE_LOCAL")) { Log.d(TAG, "addSosServerConfig: excluding video"); @@ -735,8 +680,7 @@ protected void addSosServerConfig(SOSServiceConfig sosConf, SensorDataProviderCo sosConf.dataProviders.add(dataProviderConf); } - protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sosPwd) - { + protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sosPwd) { if (sosUrl == null) return; @@ -755,28 +699,23 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos sosConfig.connection.usePersistentConnection = true; sosConfig.connection.reconnectAttempts = 9; - if (sensorConf instanceof AndroidSensorsConfig) - { + if (sensorConf instanceof AndroidSensorsConfig) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); - SensorManager sensorManager = (SensorManager)getApplicationContext().getSystemService(Context.SENSOR_SERVICE); + SensorManager sensorManager = (SensorManager) getApplicationContext().getSystemService(Context.SENSOR_SERVICE); List deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL); String sensorName; - for (Sensor sensor: deviceSensors) - { - if (sensor.isWakeUpSensor()) - { + for (Sensor sensor : deviceSensors) { + if (sensor.isWakeUpSensor()) { continue; } Log.d(TAG, "addSosTConfig: sensor: " + sensor.getName()); - switch (sensor.getType()) - { + switch (sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: if (!prefs.getBoolean("accelerometer_enable", false) - || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { + || !prefs.getStringSet("accelerometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding accelerometer"); @@ -788,8 +727,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos break; case Sensor.TYPE_GYROSCOPE: if (!prefs.getBoolean("gyroscope_enable", false) - || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { + || !prefs.getStringSet("gyroscope_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding gyroscope"); @@ -801,8 +739,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos break; case Sensor.TYPE_MAGNETIC_FIELD: if (!prefs.getBoolean("magnetometer_enable", false) - || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { + || !prefs.getStringSet("magnetometer_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding magnetometer"); @@ -814,8 +751,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos break; case Sensor.TYPE_ROTATION_VECTOR: if (!prefs.getBoolean("orientation_enable", false) - || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { + || !prefs.getStringSet("orientation_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding orientation"); @@ -832,8 +768,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos } } if (!prefs.getBoolean("location_enable", false) - || !prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { + || !prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding location"); @@ -845,8 +780,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos Log.d(TAG, "addSosTConfig: NOT excluding location"); } if (!prefs.getBoolean("video_enable", false) - || !prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) - { + || !prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) { Log.d(TAG, "addSosTConfig: excluding video"); @@ -865,8 +799,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos @SuppressLint("HandlerLeak") @Override - protected void onCreate(Bundle savedInstanceState) - { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textArea = (TextView) findViewById(R.id.text); @@ -883,25 +816,78 @@ protected void onCreate(Bundle savedInstanceState) displayHandler = new Handler(Looper.getMainLooper()); setupBroadcastReceivers(); + + // TODO: Integrate into BLEBeacon Sensor after POC + BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + Log.d(TAG, bluetoothAdapter.getName()); + BluetoothLeScanner bleScanner = bluetoothAdapter.getBluetoothLeScanner(); + ScanCallback scb = new ScanCallback() { + @Override + public void onScanResult(int callbackType, ScanResult result) { + super.onScanResult(callbackType, result); + Log.d(TAG, result.toString()); + } + }; + bleScanner.startScan(scb); + + + // Listen to and Log from nearby BLE beacons + /*int REQUEST_ENABLE_BT = 1; // Make sure this is the correct usage + + BluetoothAdapter bluetoothAdapter; + // Initializes Bluetooth adapter. + final BluetoothManager bluetoothManager = + (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); + bluetoothAdapter = bluetoothManager.getAdapter(); + + // Ensures Bluetooth is available on the device and it is enabled. If not, + // displays a dialog requesting user permission to enable Bluetooth. + if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) { + Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); + startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); + } + + final boolean[] mScanning = new boolean[1]; + Handler handler = new Handler(); + LeDeviceListAdapter leDeviceListAdapter; + BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() { + @Override + public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { + runOnUiThread(new Runnable() { + @Override + public void run() { + leDe + } + }); + } + }; + + final long SCAN_PERIOD = 10000; + handler.postDelayed(new Runnable() { + @Override + public void run() { + mScanning[0] = false; + bluetoothAdapter.stopLeScan(leScanCallback); + } + }, SCAN_PERIOD); + + mScanning[0] = true; + bluetoothAdapter.startLeScan(leScanCallback);*/ } private void setupBroadcastReceivers() { - BroadcastReceiver receiver = new BroadcastReceiver() - { + BroadcastReceiver receiver = new BroadcastReceiver() { @Override - public void onReceive(Context context, Intent intent) - { + public void onReceive(Context context, Intent intent) { String origin = intent.getStringExtra("src"); - if (!context.getPackageName().equalsIgnoreCase(origin)) - { + if (!context.getPackageName().equalsIgnoreCase(origin)) { String sosEndpointUrl = intent.getStringExtra("sosEndpointUrl"); String name = intent.getStringExtra("name"); String sensorId = intent.getStringExtra("sensorId"); ArrayList properties = intent.getStringArrayListExtra("properties"); - if (sosEndpointUrl== null || name == null || sensorId == null || properties.size() == 0) - { + if (sosEndpointUrl == null || name == null || sensorId == null || properties.size() == 0) { return; } @@ -942,33 +928,26 @@ public void onReceive(Context context, Intent intent) @Override - public boolean onCreateOptionsMenu(Menu menu) - { + public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override - public boolean onOptionsItemSelected(MenuItem item) - { + public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); - if (id == R.id.action_settings) - { + if (id == R.id.action_settings) { startActivity(new Intent(this, UserSettingsActivity.class)); return true; - } - else if (id == R.id.action_start) - { + } else if (id == R.id.action_start) { if (boundService != null && boundService.getSensorHub() == null) showRunNamePopup(); return true; - } - else if (id == R.id.action_stop) - { + } else if (id == R.id.action_stop) { stopListeningForEvents(); stopRefreshingStatus(); sostClients.clear(); @@ -979,16 +958,11 @@ else if (id == R.id.action_stop) newStatusMessage("SensorHub Stopped"); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); return true; - } - else if (id == R.id.action_about) - { + } else if (id == R.id.action_about) { showAboutPopup(); - } - else if (id == R.id.action_proxy) - { + } else if (id == R.id.action_proxy) { testProxyBroadcast(); - } - else if(id == R.id.action_stop_proxy){ + } else if (id == R.id.action_stop_proxy) { testStopProxyBroadcast(); } @@ -996,8 +970,7 @@ else if(id == R.id.action_stop_proxy){ } - protected void showRunNamePopup() - { + protected void showRunNamePopup() { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Run Name"); @@ -1010,10 +983,8 @@ protected void showRunNamePopup() input.getText().append(formatter.format(new Date())); alert.setView(input); - alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int whichButton) - { + alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); runName = input.getText().toString(); newStatusMessage("Starting SensorHub..."); @@ -1036,17 +1007,13 @@ public void onClick(DialogInterface dialog, int whichButton) { } - protected void showAboutPopup() - { + protected void showAboutPopup() { String version = "?"; - try - { + try { PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0); version = pInfo.versionName; - } - catch (PackageManager.NameNotFoundException e) - { + } catch (PackageManager.NameNotFoundException e) { } String message = "A software platform for building smart sensor networks and the Internet of Things\n\n"; @@ -1060,8 +1027,7 @@ protected void showAboutPopup() } - protected void testProxyBroadcast() - { + protected void testProxyBroadcast() { ArrayList testProperties = new ArrayList(); testProperties.add("http://sensorml.com/ont/swe/property/Acceleration"); testProperties.add("http://sensorml.com/ont/swe/property/MagneticField"); @@ -1077,32 +1043,27 @@ protected void testProxyBroadcast() sendBroadcast(testIntent); } - protected void testStopProxyBroadcast(){ + protected void testStopProxyBroadcast() { Intent testIntent = new Intent(); testIntent.setAction("org.sofwerx.ogc.ACTION_PROXY"); sendBroadcast(testIntent); } @Override - public void handleEvent(Event e) - { - if (e instanceof ModuleEvent) - { + public void handleEvent(Event e) { + if (e instanceof ModuleEvent) { // start refreshing status on first module loaded - if (!oshStarted && ((ModuleEvent) e).getType() == ModuleEvent.Type.LOADED) - { + if (!oshStarted && ((ModuleEvent) e).getType() == ModuleEvent.Type.LOADED) { oshStarted = true; startRefreshingStatus(); return; } // detect when SOS-T modules are connected - else if (e.getSource() instanceof SOSTClient && ((ModuleEvent)e).getType() == ModuleEvent.Type.STATE_CHANGED) - { - switch (((ModuleEvent)e).getNewState()) - { + else if (e.getSource() instanceof SOSTClient && ((ModuleEvent) e).getType() == ModuleEvent.Type.STATE_CHANGED) { + switch (((ModuleEvent) e).getNewState()) { case INITIALIZING: - sostClients.add((SOSTClient)e.getSource()); + sostClients.add((SOSTClient) e.getSource()); break; } } @@ -1110,16 +1071,13 @@ else if (e.getSource() instanceof SOSTClient && ((ModuleEvent)e).getType() == Mo } - protected void startRefreshingStatus() - { + protected void startRefreshingStatus() { if (displayCallback != null) return; // handler to display async messages in UI - displayCallback = new Runnable() - { - public void run() - { + displayCallback = new Runnable() { + public void run() { displayStatus(); textArea.setText(Html.fromHtml(displayText.toString())); displayHandler.postDelayed(this, 1000); @@ -1130,34 +1088,28 @@ public void run() } - protected void stopRefreshingStatus() - { - if (displayCallback != null) - { + protected void stopRefreshingStatus() { + if (displayCallback != null) { displayHandler.removeCallbacks(displayCallback); displayCallback = null; } } - protected synchronized void displayStatus() - { + protected synchronized void displayStatus() { displayText.setLength(0); // first display error messages if any - for (SOSTClient client: sostClients) - { + for (SOSTClient client : sostClients) { Map dataStreams = client.getDataStreams(); boolean showError = (client.getCurrentError() != null); boolean showMsg = (dataStreams.size() == 0) && (client.getStatusMessage() != null); - if (showError || showMsg) - { + if (showError || showMsg) { displayText.append("

" + client.getName() + ":
"); if (showMsg) displayText.append(client.getStatusMessage() + "
"); - if (showError) - { + if (showError) { Throwable errorObj = client.getCurrentError(); String errorMsg = errorObj.getMessage().trim(); if (!errorMsg.endsWith(".")) @@ -1172,13 +1124,11 @@ protected synchronized void displayStatus() // then display streams status displayText.append("

"); - for (SOSTClient client: sostClients) - { + for (SOSTClient client : sostClients) { Map dataStreams = client.getDataStreams(); long now = System.currentTimeMillis(); - for (Entry stream : dataStreams.entrySet()) - { + for (Entry stream : dataStreams.entrySet()) { displayText.append("" + stream.getKey().getName() + " : "); long lastEventTime = stream.getValue().lastEventTime; @@ -1190,8 +1140,7 @@ else if (dt > stream.getValue().measPeriodMs) else displayText.append("OK (" + dt + "ms ago)"); - if (stream.getValue().errorCount > 0) - { + if (stream.getValue().errorCount > 0) { displayText.append(" ("); displayText.append(stream.getValue().errorCount); displayText.append(")"); @@ -1202,34 +1151,29 @@ else if (dt > stream.getValue().measPeriodMs) } if (displayText.length() > 5) - displayText.setLength(displayText.length()-5); // remove last
+ displayText.setLength(displayText.length() - 5); // remove last
displayText.append("

"); } - protected synchronized void newStatusMessage(String msg) - { + protected synchronized void newStatusMessage(String msg) { displayText.setLength(0); appendStatusMessage(msg); } - protected synchronized void appendStatusMessage(String msg) - { + protected synchronized void appendStatusMessage(String msg) { displayText.append(msg); - displayHandler.post(new Runnable() - { - public void run() - { + displayHandler.post(new Runnable() { + public void run() { textArea.setText(displayText.toString()); } }); } - protected void startListeningForEvents() - { + protected void startListeningForEvents() { if (boundService == null || boundService.getSensorHub() == null) return; @@ -1237,8 +1181,7 @@ protected void startListeningForEvents() } - protected void stopListeningForEvents() - { + protected void stopListeningForEvents() { if (boundService == null || boundService.getSensorHub() == null) return; @@ -1246,10 +1189,8 @@ protected void stopListeningForEvents() } - protected void showVideo() - { - if (boundService.getVideoTexture() != null) - { + protected void showVideo() { + if (boundService.getVideoTexture() != null) { TextureView textureView = (TextureView) findViewById(R.id.video); if (textureView.getSurfaceTexture() != boundService.getVideoTexture()) textureView.setSurfaceTexture(boundService.getVideoTexture()); @@ -1257,28 +1198,24 @@ protected void showVideo() } - protected void hideVideo() - { + protected void hideVideo() { } @Override - protected void onStart() - { + protected void onStart() { super.onStart(); } @Override - protected void onResume() - { + protected void onResume() { super.onResume(); TextureView textureView = (TextureView) findViewById(R.id.video); textureView.setSurfaceTextureListener(this); - if (oshStarted) - { + if (oshStarted) { startListeningForEvents(); startRefreshingStatus(); @@ -1289,8 +1226,7 @@ protected void onResume() @Override - protected void onPause() - { + protected void onPause() { stopListeningForEvents(); stopRefreshingStatus(); hideVideo(); @@ -1299,8 +1235,7 @@ protected void onPause() @Override - protected void onStop() - { + protected void onStop() { stopListeningForEvents(); stopRefreshingStatus(); super.onStop(); @@ -1308,35 +1243,99 @@ protected void onStop() @Override - protected void onDestroy() - { + protected void onDestroy() { stopService(new Intent(this, SensorHubService.class)); super.onDestroy(); } @Override - public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) - { + public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) { showVideo(); } @Override - public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) - { + public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) { } @Override - public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) - { + public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { return false; } @Override - public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) - { + public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { } } + + +// TODO: Deal with this in BLEBeacon's own module later + + +/* +public class LeDeviceListAdapter extends BaseAdapter { + private ArrayList mLeDevices; + private LayoutInflater mInflator; + + + public LeDeviceListAdapter() { + super(); + mLeDevices = new ArrayList(); + mInflator = this.getLayoutInflater(); + } + + public void addDevice(BluetoothDevice device) { + if (!mLeDevices.contains(device)) { + mLeDevices.add(device); + } + } + + public BluetoothDevice getDevice(int position) { + return mLeDevices.get(position); + } + + public void clear() { + mLeDevices.clear(); + } + + @Override + public int getCount() { + return mLeDevices.size(); + } + + @Override + public Object getItem(int i) { + return mLeDevices.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + ViewHolder viewHolder; + // General ListView optimization code. + if (view == null) { + view = mInflator.inflate(R.layout.listitem_device, null); + viewHolder = new ViewHolder(); + viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address); + viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); + view.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) view.getTag(); + } + BluetoothDevice device = mLeDevices.get(i); + final String deviceName = device.getName(); + if (deviceName != null && deviceName.length() > 0) + viewHolder.deviceName.setText(deviceName); + else + viewHolder.deviceName.setText(R.string.unknown_device); + viewHolder.deviceAddress.setText(device.getAddress()); + return view; + } +}*/ diff --git a/sensorhub-android-blebeacon/.gitignore b/sensorhub-android-blebeacon/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/sensorhub-android-blebeacon/.gitignore @@ -0,0 +1 @@ +/build diff --git a/sensorhub-android-blebeacon/build.gradle b/sensorhub-android-blebeacon/build.gradle new file mode 100644 index 00000000..6ccfe595 --- /dev/null +++ b/sensorhub-android-blebeacon/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 28 + + + defaultConfig { + minSdkVersion 22 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'com.android.support:appcompat-v7:28.0.0' + 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' + compile project(path: ':sensorhub-core') +} diff --git a/sensorhub-android-blebeacon/consumer-rules.pro b/sensorhub-android-blebeacon/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/sensorhub-android-blebeacon/docs/BLEDoc.txt b/sensorhub-android-blebeacon/docs/BLEDoc.txt new file mode 100644 index 00000000..32ebfb29 --- /dev/null +++ b/sensorhub-android-blebeacon/docs/BLEDoc.txt @@ -0,0 +1,12 @@ +The BLE Beacon Sensor is a work in progress module designed to use the URL String gathered from +BLE Beacons using the Eddystone URL protocol with known locations to give an approximate location of +the phone when indoors. + +MODULE MUST: +1. Have a constellation of registered Beacons with UIDs that have known locations +2. Be able to triangulate based on the three strongest signals +3. Have the ability to add a new registered beacon through the App +4. Have the ability to remove a registered beacon through the app + +OPTIONAL: +1. Notify that a beacon has low battery life \ No newline at end of file diff --git a/sensorhub-android-blebeacon/proguard-rules.pro b/sensorhub-android-blebeacon/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/sensorhub-android-blebeacon/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/sensorhub-android-blebeacon/src/androidTest/java/org/sensorhub/impl/sensor/blebeacon/ExampleInstrumentedTest.java b/sensorhub-android-blebeacon/src/androidTest/java/org/sensorhub/impl/sensor/blebeacon/ExampleInstrumentedTest.java new file mode 100644 index 00000000..50c2ab2d --- /dev/null +++ b/sensorhub-android-blebeacon/src/androidTest/java/org/sensorhub/impl/sensor/blebeacon/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package org.sensorhub.impl.sensor.blebeacon; + +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.getInstrumentation().getTargetContext(); + + assertEquals("org.sensorhub.impl.sensor.blebeacon.test", appContext.getPackageName()); + } +} diff --git a/sensorhub-android-blebeacon/src/main/AndroidManifest.xml b/sensorhub-android-blebeacon/src/main/AndroidManifest.xml new file mode 100644 index 00000000..0a6f2047 --- /dev/null +++ b/sensorhub-android-blebeacon/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconConfig.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconConfig.java new file mode 100644 index 00000000..fdca8b59 --- /dev/null +++ b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconConfig.java @@ -0,0 +1,6 @@ +package org.sensorhub.impl.sensor.blebeacon; + +import org.sensorhub.api.sensor.SensorConfig; + +public class BLEBeaconConfig extends SensorConfig { +} diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLETest.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLETest.java new file mode 100644 index 00000000..55a44d33 --- /dev/null +++ b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLETest.java @@ -0,0 +1,4 @@ +package org.sensorhub.impl.sensor.blebeacon; + +public class BLETest { +} diff --git a/sensorhub-android-blebeacon/src/main/res/values/strings.xml b/sensorhub-android-blebeacon/src/main/res/values/strings.xml new file mode 100644 index 00000000..78b089d9 --- /dev/null +++ b/sensorhub-android-blebeacon/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + sensorhub-android-blebeacon + diff --git a/sensorhub-android-blebeacon/src/test/java/org/sensorhub/impl/sensor/blebeacon/ExampleUnitTest.java b/sensorhub-android-blebeacon/src/test/java/org/sensorhub/impl/sensor/blebeacon/ExampleUnitTest.java new file mode 100644 index 00000000..5ee2a7eb --- /dev/null +++ b/sensorhub-android-blebeacon/src/test/java/org/sensorhub/impl/sensor/blebeacon/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package org.sensorhub.impl.sensor.blebeacon; + +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); + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 3c0d243b..707c30e5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,4 @@ +include ':sensorhub-android-blebeacon' rootProject.name = 'osh-android' def oshMainDir = "$rootDir/.." From 9e419e36062b475bd99683ed5823d243c2daba9b Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Thu, 3 Oct 2019 14:55:50 -0500 Subject: [PATCH 079/207] Implementing BLE Beacon Sensor Driver --- sensorhub-android-blebeacon/build.gradle | 1 + .../impl/sensor/blebeacon/BLEBeacon.java | 96 +++++++++++++++++ .../sensor/blebeacon/BLEBeaconConfig.java | 20 ++++ .../sensor/blebeacon/BLEBeaconDriver.java | 70 ++++++++++++ .../sensor/blebeacon/BLEBeaconRawOutput.java | 100 ++++++++++++++++++ .../impl/sensor/blebeacon/BLETest.java | 4 - 6 files changed, 287 insertions(+), 4 deletions(-) create mode 100644 sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeacon.java create mode 100644 sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconDriver.java create mode 100644 sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconRawOutput.java delete mode 100644 sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLETest.java diff --git a/sensorhub-android-blebeacon/build.gradle b/sensorhub-android-blebeacon/build.gradle index 6ccfe595..e4e35ea8 100644 --- a/sensorhub-android-blebeacon/build.gradle +++ b/sensorhub-android-blebeacon/build.gradle @@ -31,4 +31,5 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' compile project(path: ':sensorhub-core') + compile 'org.altbeacon:android-beacon-library:2.16.2' } diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeacon.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeacon.java new file mode 100644 index 00000000..1d65ee3b --- /dev/null +++ b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeacon.java @@ -0,0 +1,96 @@ +package org.sensorhub.impl.sensor.blebeacon; + +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.RemoteException; +import android.util.Log; + +import org.altbeacon.beacon.Beacon; +import org.altbeacon.beacon.BeaconConsumer; +import org.altbeacon.beacon.BeaconManager; +import org.altbeacon.beacon.BeaconParser; +import org.altbeacon.beacon.Identifier; +import org.altbeacon.beacon.RangeNotifier; +import org.altbeacon.beacon.Region; +import org.altbeacon.beacon.utils.UrlBeaconUrlCompressor; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class BLEBeacon implements BeaconConsumer, RangeNotifier { + private Context parentContext; + private String TAG = "BLEBeacon-DeafultTAG"; + private BeaconManager mBeaconManager; + private Map beacons; + + public BLEBeacon(Context context){ + this.parentContext = context; + this.beacons = new HashMap(); + } + + public void BeaconManagerSetup(){ + mBeaconManager = BeaconManager.getInstanceForApplication(parentContext); + // Detect the URL frame: + mBeaconManager.getBeaconParsers().add(new BeaconParser(). + setBeaconLayout(BeaconParser.EDDYSTONE_URL_LAYOUT)); + mBeaconManager.bind(this); + } + + public void unbind(){ + try { + mBeaconManager.stopRangingBeaconsInRegion(new Region("all-beacons-region", null, null, null)); + } catch (RemoteException e){ + Log.d(TAG, "unbind: " + e); + } + + mBeaconManager.unbind(this); + } + + @Override + public void onBeaconServiceConnect() { + Region region = new Region("all-beacons-region", null, null, null); + try { + mBeaconManager.startRangingBeaconsInRegion(region); + } catch (RemoteException e) { + e.printStackTrace(); + } + mBeaconManager.setRangeNotifier(this); + } + + @Override + public Context getApplicationContext() { + return this.parentContext; + } + + @Override + public void unbindService(ServiceConnection serviceConnection) { + + } + + @Override + public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) { + return false; + } + + @Override + public void didRangeBeaconsInRegion(Collection beacons, Region region) { + for (Beacon beacon: beacons) { + if (beacon.getServiceUuid() == 0xfeaa && beacon.getBeaconTypeCode() == 0x10) { + // This is an Eddystone-URL frame + String url = UrlBeaconUrlCompressor.uncompress(beacon.getId1().toByteArray()); + Log.d(TAG, "Beacon ID: "+ beacon.getId1() + "Beacon URL: " + url + + " approximately " + beacon.getDistance() + " meters away."); + // TODO: Need to improve this to handle non-EsURL beacons that have info in the other ID slots + this.beacons.put(beacon.getId1(), beacon); + } + } + } + + public void printBeaconList(){ + Log.d(TAG, "printBeaconList: " + this.beacons); + } + + +} diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconConfig.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconConfig.java index fdca8b59..a898bdf1 100644 --- a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconConfig.java +++ b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconConfig.java @@ -1,6 +1,26 @@ package org.sensorhub.impl.sensor.blebeacon; +import android.content.Context; + +import org.sensorhub.api.module.ModuleConfig; import org.sensorhub.api.sensor.SensorConfig; public class BLEBeaconConfig extends SensorConfig { + public boolean activateBLEBeacon = false; + + public String deviceName; + public String runName; + public String runDescription; + + public transient Context androidContext; + + public BLEBeaconConfig(){ + this.moduleClass = BLEBeaconDriver.class.getCanonicalName(); + } + + // clone disabled as it causes crashes for now + @Override + public ModuleConfig clone(){ + return this; + } } diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconDriver.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconDriver.java new file mode 100644 index 00000000..8e735d49 --- /dev/null +++ b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconDriver.java @@ -0,0 +1,70 @@ +package org.sensorhub.impl.sensor.blebeacon; + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorManager; +import android.location.LocationManager; +import android.os.Build; +import android.os.HandlerThread; +import android.provider.Settings; + +import net.opengis.sensorml.v20.PhysicalComponent; + +import org.sensorhub.api.common.SensorHubException; +import org.sensorhub.api.sensor.ISensorDataInterface; +import org.sensorhub.impl.sensor.AbstractSensorModule; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class BLEBeaconDriver extends AbstractSensorModule { + private static final Logger log = LoggerFactory.getLogger(BLEBeaconDriver.class.getSimpleName()); + public static final String LOCAL_REF_FRAME = "LOCAL_FRAME"; + + String localFrameURI; + HandlerThread eventThread; + SensorManager sensorManager; + LocationManager locationManager; +// SensorMLBuilder sensorMLBuilder; + List smlComponents; + BLEBeaconRawOutput rawOutput; + + public BLEBeaconDriver(){} + + @Override + public synchronized void init() throws SensorHubException{ + Context androidContext = config.androidContext; + + String deviceID = Settings.Secure.getString(androidContext.getContentResolver(), Settings.Secure.ANDROID_ID); + this.xmlID = "ANDROID_SENSORS_" + Build.SERIAL; // Deprecated in API level 26 + this.uniqueID = "urn:android:device:" + deviceID; + this.localFrameURI = this.uniqueID + "#" + LOCAL_REF_FRAME; + + rawOutput = new BLEBeaconRawOutput(this); + addOutput(rawOutput, false); + } + + @Override + public void start() throws SensorHubException { + // start the BLEBeacon Manager scanning + + } + + @Override + public void stop() throws SensorHubException { + + } + + protected void useSensor(ISensorDataInterface output, Sensor sensor){ + addOutput(output, false); + } + + @Override + public boolean isConnected() { + return true; + } + + @Override + public Logger getLogger(){return log;} +} diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconRawOutput.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconRawOutput.java new file mode 100644 index 00000000..bfa8c7fe --- /dev/null +++ b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconRawOutput.java @@ -0,0 +1,100 @@ +package org.sensorhub.impl.sensor.blebeacon; + +import android.hardware.SensorEventListener; +import android.os.Handler; + +import net.opengis.swe.v20.DataBlock; +import net.opengis.swe.v20.DataComponent; +import net.opengis.swe.v20.DataEncoding; + +import org.sensorhub.api.sensor.SensorDataEvent; +import org.sensorhub.impl.sensor.AbstractSensorOutput; +import org.vast.swe.SWEHelper; + +public class BLEBeaconRawOutput extends AbstractSensorOutput implements { + private static final String BLE_BEACON_DEF = "http://sensorml.com/ont/swe/property/BLEBeacon"; + private static final String URL_DEF = "http://sensorml.com/ont/swe/property/"; + + String name = "BLE Beacon Raw Data"; + boolean enabled; + DataComponent bleData; + DataEncoding dataEncoding; + double samplingPeriod; + long systemTimeOffset = -1L; + BLEBeacon bleBeacon; + + + protected BLEBeaconRawOutput(BLEBeaconDriver parent) { + super(parent); + + // create output structure + SWEHelper fac = new SWEHelper(); + bleData = fac.newDataRecord(); + bleData.setName(getName()); + bleData.setDefinition(BLE_BEACON_DEF); + bleData.setDescription("Bluetooth Low Energy Beacon readings for commonly available data"); + + // add fields + bleData.addComponent("time", fac.newTimeStampIsoUTC()); + bleData.addComponent("id", fac.newCategory("http://sensorml.com/ont/swe/property/SensorID", null, null, null)); + bleData.addComponent("name", fac.newText(URL_DEF + "name", null, null)); + bleData.addComponent("ID1", fac.newText(URL_DEF + "Identifier_1", null, "First of the three ids used by most BLE beacons, in ES-URL, the only id")); + bleData.addComponent("ID2", fac.newText(URL_DEF + "Identifier_2", null, null)); + bleData.addComponent("ID3", fac.newText(URL_DEF + "Identifier_3", null, null)); + bleData.addComponent("txPower", fac.newQuantity(URL_DEF + "txPower", null, null, "dBm")); + bleData.addComponent("RSSI", fac.newQuantity(URL_DEF + "rssi", null, null, "dBm")); // Is this value measured, and is it affected by the settings in the beacon + bleData.addComponent("distance", fac.newQuantity(URL_DEF + "distance", null, null, "m")); + + dataEncoding = fac.newTextEncoding(",", "\n"); + + // Other fields that can be added + // Extra Data Fields + // Manufacturer + // Service UUID + // MultiFrameBeacon + // Parser Identifier // Note: this is part of ABL, not the beacon itself + + // BLEBeacon Initialization + bleBeacon = new BLEBeacon(parent.getConfiguration().androidContext); + } + + private void sendMeasurement(){ + // Get the data from the beacon manager + // Build the DataBlock + DataBlock dataBlock = bleData.createDataBlock(); +// dataBlock.setDoubleValue(0, time); + + // Push Data + latestRecord = dataBlock; + latestRecordTime = System.currentTimeMillis(); + eventHandler.publishEvent(new SensorDataEvent(latestRecordTime, BLEBeaconRawOutput.this, latestRecord)); + } + + public void start(Handler handler){ + bleBeacon.BeaconManagerSetup(); + } + + public void stop(){ + bleBeacon.unbind(); + } + + @Override + public String getName() { + return name; + } + + @Override + public DataComponent getRecordDescription() { + return bleData; + } + + @Override + public DataEncoding getRecommendedEncoding() { + return dataEncoding; + } + + @Override + public double getAverageSamplingPeriod() { + return 0; // TODO: implement a calculation for this + } +} diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLETest.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLETest.java deleted file mode 100644 index 55a44d33..00000000 --- a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLETest.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.sensorhub.impl.sensor.blebeacon; - -public class BLETest { -} From b6b567b63811dc7fe3dbb6803503e888113e3b2e Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Thu, 3 Oct 2019 15:30:44 -0500 Subject: [PATCH 080/207] Migrate previous code into BLEBeaconRawOutput for ease of handling for now --- .../impl/sensor/blebeacon/BLEBeacon.java | 2 +- .../sensor/blebeacon/BLEBeaconRawOutput.java | 104 ++++++++++++++++-- 2 files changed, 97 insertions(+), 9 deletions(-) diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeacon.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeacon.java index 1d65ee3b..eb9c3317 100644 --- a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeacon.java +++ b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeacon.java @@ -21,7 +21,7 @@ public class BLEBeacon implements BeaconConsumer, RangeNotifier { private Context parentContext; - private String TAG = "BLEBeacon-DeafultTAG"; + private String TAG = "BLEBeacon-DefaultTAG"; private BeaconManager mBeaconManager; private Map beacons; diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconRawOutput.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconRawOutput.java index bfa8c7fe..74133506 100644 --- a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconRawOutput.java +++ b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconRawOutput.java @@ -1,7 +1,12 @@ package org.sensorhub.impl.sensor.blebeacon; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; import android.hardware.SensorEventListener; import android.os.Handler; +import android.os.RemoteException; +import android.util.Log; import net.opengis.swe.v20.DataBlock; import net.opengis.swe.v20.DataComponent; @@ -11,9 +16,23 @@ import org.sensorhub.impl.sensor.AbstractSensorOutput; import org.vast.swe.SWEHelper; -public class BLEBeaconRawOutput extends AbstractSensorOutput implements { +import org.altbeacon.beacon.Beacon; +import org.altbeacon.beacon.BeaconConsumer; +import org.altbeacon.beacon.BeaconManager; +import org.altbeacon.beacon.BeaconParser; +import org.altbeacon.beacon.Identifier; +import org.altbeacon.beacon.RangeNotifier; +import org.altbeacon.beacon.Region; +import org.altbeacon.beacon.utils.UrlBeaconUrlCompressor; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class BLEBeaconRawOutput extends AbstractSensorOutput implements BeaconConsumer, RangeNotifier { private static final String BLE_BEACON_DEF = "http://sensorml.com/ont/swe/property/BLEBeacon"; private static final String URL_DEF = "http://sensorml.com/ont/swe/property/"; + private static final String TAG = "BLEBeaconOutputRaw"; String name = "BLE Beacon Raw Data"; boolean enabled; @@ -21,7 +40,9 @@ public class BLEBeaconRawOutput extends AbstractSensorOutput im DataEncoding dataEncoding; double samplingPeriod; long systemTimeOffset = -1L; - BLEBeacon bleBeacon; + + BeaconManager mBeaconManager; + private Map beacons; protected BLEBeaconRawOutput(BLEBeaconDriver parent) { @@ -53,9 +74,6 @@ protected BLEBeaconRawOutput(BLEBeaconDriver parent) { // Service UUID // MultiFrameBeacon // Parser Identifier // Note: this is part of ABL, not the beacon itself - - // BLEBeacon Initialization - bleBeacon = new BLEBeacon(parent.getConfiguration().androidContext); } private void sendMeasurement(){ @@ -70,12 +88,21 @@ private void sendMeasurement(){ eventHandler.publishEvent(new SensorDataEvent(latestRecordTime, BLEBeaconRawOutput.this, latestRecord)); } - public void start(Handler handler){ - bleBeacon.BeaconManagerSetup(); + public void start(){ + // BLE Beacon Initialization + mBeaconManager = BeaconManager.getInstanceForApplication(getParentModule().getConfiguration().androidContext); + mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_URL_LAYOUT)); + mBeaconManager.bind(this); } public void stop(){ - bleBeacon.unbind(); + try { + mBeaconManager.stopRangingBeaconsInRegion(new Region("url-beacons-region", null, null, null)); + } catch (RemoteException e){ + Log.d(TAG, "unbind: " + e); + } + + mBeaconManager.unbind(this); } @Override @@ -97,4 +124,65 @@ public DataEncoding getRecommendedEncoding() { public double getAverageSamplingPeriod() { return 0; // TODO: implement a calculation for this } + + // BLE Beacon Consumer/Range Notifier Require Implementations + @Override + public void onBeaconServiceConnect() { + Region region = new Region("all-beacons-region", null, null, null); + try { + mBeaconManager.startRangingBeaconsInRegion(region); + } catch (RemoteException e) { + e.printStackTrace(); + } + mBeaconManager.setRangeNotifier(this); + } + + @Override + public Context getApplicationContext() { + return getParentModule().getConfiguration().androidContext; + } + + @Override + public void unbindService(ServiceConnection serviceConnection) { + + } + + @Override + public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) { + return false; + } + + @Override + public void didRangeBeaconsInRegion(Collection beacons, Region region) { + for (Beacon beacon: beacons) { + if (beacon.getServiceUuid() == 0xfeaa && beacon.getBeaconTypeCode() == 0x10) { + // This is an Eddystone-URL frame + String url = UrlBeaconUrlCompressor.uncompress(beacon.getId1().toByteArray()); + Log.d(TAG, "Beacon ID: "+ beacon.getId1() + "Beacon URL: " + url + + " approximately " + beacon.getDistance() + " meters away."); + // TODO: Need to improve this to handle non-EsURL beacons that have info in the other ID slots + this.beacons.put(beacon.getId1(), beacon); + sendBeaconRecord(beacon); + } + } + } + + public void sendBeaconRecord(Beacon beacon){ + double time = System.currentTimeMillis() / 1000.; + DataBlock dataBlock = bleData.createDataBlock(); + + dataBlock.setDoubleValue(0, time); + dataBlock.setStringValue(1, "test-ble-beacon-id"); + dataBlock.setStringValue(2, beacon.getBluetoothName()); + dataBlock.setStringValue(3, beacon.getId1().toString()); + dataBlock.setStringValue(4, beacon.getId2().toString()); + dataBlock.setStringValue(5, beacon.getId3().toString()); + dataBlock.setDoubleValue(6, beacon.getTxPower()); + dataBlock.setDoubleValue(7, beacon.getRssi()); + dataBlock.setDoubleValue(8, beacon.getDistance()); + + // Push the data + latestRecordTime = System.currentTimeMillis(); + eventHandler.publishEvent(new SensorDataEvent(latestRecordTime, BLEBeaconRawOutput.this, dataBlock)); + } } From 61fb7dcc5a9c5e0e978d3a0e07e1c9c84a78779c Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Thu, 3 Oct 2019 17:06:55 -0500 Subject: [PATCH 081/207] Add BLE Beacon to MainActivity --- .../src/org/sensorhub/android/MainActivity.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 693adf17..665938ec 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -68,6 +68,7 @@ import org.sensorhub.impl.persistence.h2.MVStorageConfig; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; +import org.sensorhub.impl.sensor.blebeacon.BLEBeaconConfig; import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensor; import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; @@ -479,6 +480,14 @@ private SensorConfig createSensorConfig(Sensors sensor) { ((FlirOneCameraConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); } else if (Sensors.ProxySensor.equals(sensor)) { sensorConfig = new ProxySensorConfig(); + }else if(true){ + // TODO: Add option to UI after testing + // Add the BLE Beacon Scanner + sensorConfig = new BLEBeaconConfig(); + sensorConfig.id = "BLE_BEACON_SCANNER"; + sensorConfig.name = "BLE Beacon Scanner [" + deviceName + "]"; + sensorConfig.autoStart = true; + Log.d(TAG, "createSensorConfig: Added BLE Beacon Scanner"); } else { sensorConfig = new SensorConfig(); } From 0af5001c7bb57729f5bd402ea2f014b8465ee28f Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Thu, 3 Oct 2019 21:44:47 -0500 Subject: [PATCH 082/207] Pull BLE back out, trying to resolve dependency duplication issues --- .../org/sensorhub/android/MainActivity.java | 225 +++--------------- 1 file changed, 39 insertions(+), 186 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 665938ec..4e360ce0 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -13,36 +13,36 @@ package org.sensorhub.android; -import android.app.ListActivity; -import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothManager; -import android.bluetooth.le.BluetoothLeScanner; -import android.bluetooth.le.ScanCallback; -import android.bluetooth.le.ScanResult; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; import android.content.IntentFilter; +import android.content.ServiceConnection; +import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; - import android.hardware.Sensor; import android.hardware.SensorManager; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.preference.PreferenceManager; +import android.provider.Settings.Secure; +import android.text.Html; import android.util.Log; -import android.view.*; +import android.view.Menu; +import android.view.MenuItem; +import android.view.TextureView; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.TextView; import org.sensorhub.android.comm.BluetoothCommProvider; import org.sensorhub.android.comm.BluetoothCommProviderConfig; @@ -50,7 +50,6 @@ import org.sensorhub.android.comm.ble.BleNetwork; import org.sensorhub.api.common.Event; import org.sensorhub.api.common.IEventListener; -import org.sensorhub.api.common.SensorHubException; import org.sensorhub.api.module.IModuleConfigRepository; import org.sensorhub.api.module.ModuleEvent; import org.sensorhub.api.sensor.ISensorDataInterface; @@ -60,7 +59,6 @@ import org.sensorhub.impl.client.sost.SOSTClientConfig; import org.sensorhub.impl.driver.flir.FlirOneCameraConfig; import org.sensorhub.impl.module.InMemoryConfigDb; -import org.sensorhub.impl.module.ModuleRegistry; import org.sensorhub.impl.persistence.GenericStreamStorage; import org.sensorhub.impl.persistence.MaxAgeAutoPurgeConfig; import org.sensorhub.impl.persistence.StreamStorageConfig; @@ -68,34 +66,25 @@ import org.sensorhub.impl.persistence.h2.MVStorageConfig; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; -import org.sensorhub.impl.sensor.blebeacon.BLEBeaconConfig; -import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensor; import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; +import org.sensorhub.impl.service.HttpServerConfig; import org.sensorhub.impl.service.sos.SOSServiceConfig; import org.sensorhub.impl.service.sos.SensorDataProviderConfig; import org.sensorhub.test.sensor.trupulse.SimulatedDataStream; -import org.sensorhub.impl.service.HttpServerConfig; -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.ComponentName; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.ServiceConnection; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.Looper; -import android.preference.PreferenceManager; -import android.provider.Settings.Secure; -import android.text.Html; -import android.widget.BaseAdapter; -import android.widget.EditText; -import android.widget.TextView; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; import static android.content.ContentValues.TAG; @@ -339,13 +328,11 @@ private boolean isPushingSensor(Sensors sensor) { if (prefs.getBoolean("location_enable", false) && prefs.getStringSet("location_options", Collections.emptySet()).contains("PUSH_REMOTE")) return true; - if (prefs.getBoolean("video_enable", false) - && prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE")) - return true; + return prefs.getBoolean("video_enable", false) + && prefs.getStringSet("video_options", Collections.emptySet()).contains("PUSH_REMOTE"); } else if (Sensors.TruPulse.equals(sensor) || Sensors.TruPulseSim.equals(sensor)) { - if (prefs.getBoolean("trupulse_enable", false) - && prefs.getStringSet("trupulse_options", Collections.emptySet()).contains("PUSH_REMOTE")) - return true; + return prefs.getBoolean("trupulse_enable", false) + && prefs.getStringSet("trupulse_options", Collections.emptySet()).contains("PUSH_REMOTE"); } return false; @@ -480,14 +467,6 @@ private SensorConfig createSensorConfig(Sensors sensor) { ((FlirOneCameraConfig) sensorConfig).camPreviewTexture = boundService.getVideoTexture(); } else if (Sensors.ProxySensor.equals(sensor)) { sensorConfig = new ProxySensorConfig(); - }else if(true){ - // TODO: Add option to UI after testing - // Add the BLE Beacon Scanner - sensorConfig = new BLEBeaconConfig(); - sensorConfig.id = "BLE_BEACON_SCANNER"; - sensorConfig.name = "BLE Beacon Scanner [" + deviceName + "]"; - sensorConfig.autoStart = true; - Log.d(TAG, "createSensorConfig: Added BLE Beacon Scanner"); } else { sensorConfig = new SensorConfig(); } @@ -825,63 +804,6 @@ protected void onCreate(Bundle savedInstanceState) { displayHandler = new Handler(Looper.getMainLooper()); setupBroadcastReceivers(); - - // TODO: Integrate into BLEBeacon Sensor after POC - BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - Log.d(TAG, bluetoothAdapter.getName()); - BluetoothLeScanner bleScanner = bluetoothAdapter.getBluetoothLeScanner(); - ScanCallback scb = new ScanCallback() { - @Override - public void onScanResult(int callbackType, ScanResult result) { - super.onScanResult(callbackType, result); - Log.d(TAG, result.toString()); - } - }; - bleScanner.startScan(scb); - - - // Listen to and Log from nearby BLE beacons - /*int REQUEST_ENABLE_BT = 1; // Make sure this is the correct usage - - BluetoothAdapter bluetoothAdapter; - // Initializes Bluetooth adapter. - final BluetoothManager bluetoothManager = - (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); - bluetoothAdapter = bluetoothManager.getAdapter(); - - // Ensures Bluetooth is available on the device and it is enabled. If not, - // displays a dialog requesting user permission to enable Bluetooth. - if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) { - Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); - startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); - } - - final boolean[] mScanning = new boolean[1]; - Handler handler = new Handler(); - LeDeviceListAdapter leDeviceListAdapter; - BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() { - @Override - public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { - runOnUiThread(new Runnable() { - @Override - public void run() { - leDe - } - }); - } - }; - - final long SCAN_PERIOD = 10000; - handler.postDelayed(new Runnable() { - @Override - public void run() { - mScanning[0] = false; - bluetoothAdapter.stopLeScan(leScanCallback); - } - }, SCAN_PERIOD); - - mScanning[0] = true; - bluetoothAdapter.startLeScan(leScanCallback);*/ } @@ -1279,72 +1201,3 @@ public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { } } - - -// TODO: Deal with this in BLEBeacon's own module later - - -/* -public class LeDeviceListAdapter extends BaseAdapter { - private ArrayList mLeDevices; - private LayoutInflater mInflator; - - - public LeDeviceListAdapter() { - super(); - mLeDevices = new ArrayList(); - mInflator = this.getLayoutInflater(); - } - - public void addDevice(BluetoothDevice device) { - if (!mLeDevices.contains(device)) { - mLeDevices.add(device); - } - } - - public BluetoothDevice getDevice(int position) { - return mLeDevices.get(position); - } - - public void clear() { - mLeDevices.clear(); - } - - @Override - public int getCount() { - return mLeDevices.size(); - } - - @Override - public Object getItem(int i) { - return mLeDevices.get(i); - } - - @Override - public long getItemId(int i) { - return i; - } - - @Override - public View getView(int i, View view, ViewGroup viewGroup) { - ViewHolder viewHolder; - // General ListView optimization code. - if (view == null) { - view = mInflator.inflate(R.layout.listitem_device, null); - viewHolder = new ViewHolder(); - viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address); - viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); - view.setTag(viewHolder); - } else { - viewHolder = (ViewHolder) view.getTag(); - } - BluetoothDevice device = mLeDevices.get(i); - final String deviceName = device.getName(); - if (deviceName != null && deviceName.length() > 0) - viewHolder.deviceName.setText(deviceName); - else - viewHolder.deviceName.setText(R.string.unknown_device); - viewHolder.deviceAddress.setText(device.getAddress()); - return view; - } -}*/ From 85b1bee791dcac9bb22bb106d4b9ce8f678e6023 Mon Sep 17 00:00:00 2001 From: Alex Robin Date: Fri, 4 Oct 2019 09:29:48 +0200 Subject: [PATCH 083/207] Updated Gradle config to make it compile --- build.gradle | 6 +++--- settings.gradle | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 8679a18c..0acea4ed 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ ext.oshCoreVersion = '1.3.3' -ext.compileSdkVersion = 21 -ext.minSdkVersion = 21 -ext.targetSdkVersion = 21 +ext.compileSdkVersion = 26 +ext.minSdkVersion = 26 +ext.targetSdkVersion = 26 ext.buildToolsVersion = "28.0.3" version = oshCoreVersion diff --git a/settings.gradle b/settings.gradle index 707c30e5..f5007d1d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,7 +4,7 @@ def oshMainDir = "$rootDir/.." // include builds from other repos def repos = [ - 'osh-core':['lib-swe-common', 'lib-sensorml', 'lib-ows', 'sensorhub-core', 'sensorhub-service-swe', 'sensorhub-storage-h2'], + 'osh-core':['lib-swe-common', 'lib-sensorml', 'lib-ows', 'sensorhub-core', 'sensorhub-service-swe', 'sensorhub-storage-perst'], 'osh-addons/persistence':['sensorhub-storage-h2'], 'osh-addons/comm':['sensorhub-comm-ble', 'sensorhub-comm-ble-dbus'], 'osh-addons/sensors/health':['sensorhub-driver-angelsensor'], From f48a8f2f71bf6da712e01c6948c13bd85384ea39 Mon Sep 17 00:00:00 2001 From: Alex Robin Date: Fri, 4 Oct 2019 09:37:10 +0200 Subject: [PATCH 084/207] Added BLE beacon driver --- sensorhub-android-lib/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/sensorhub-android-lib/build.gradle b/sensorhub-android-lib/build.gradle index 279f0a57..40c76043 100644 --- a/sensorhub-android-lib/build.gradle +++ b/sensorhub-android-lib/build.gradle @@ -18,6 +18,7 @@ dependencies { api project(':sensorhub-driver-trupulse') api project(':sensorhub-driver-angelsensor') api project(':sensorhub-driver-android') + api project(':sensorhub-android-blebeacon') api project(':sensorhub-android-flirone') //api project(':sensorhub-android-dji') implementation 'org.slf4j:slf4j-android:1.6.1-RC1' From 0492fd8e5c29bd6f6995c106c16d6663b5d0239b Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Tue, 8 Oct 2019 14:08:39 -0500 Subject: [PATCH 085/207] fix crash on startup --- build.gradle | 2 +- .../src/org/sensorhub/android/MainActivity.java | 15 +++++++++++++++ sensorhub-android-blebeacon/build.gradle | 4 ++-- .../src/main/AndroidManifest.xml | 3 ++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 0acea4ed..8658622d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ ext.oshCoreVersion = '1.3.3' -ext.compileSdkVersion = 26 +ext.compileSdkVersion = 28 ext.minSdkVersion = 26 ext.targetSdkVersion = 26 ext.buildToolsVersion = "28.0.3" diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 4e360ce0..8b755774 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -66,6 +66,9 @@ import org.sensorhub.impl.persistence.h2.MVStorageConfig; import org.sensorhub.impl.sensor.android.AndroidSensorsConfig; import org.sensorhub.impl.sensor.angel.AngelSensorConfig; +import org.sensorhub.impl.sensor.blebeacon.BLEBeacon; +import org.sensorhub.impl.sensor.blebeacon.BLEBeaconConfig; +import org.sensorhub.impl.sensor.blebeacon.BLEBeaconDriver; import org.sensorhub.impl.sensor.swe.ProxySensor.ProxySensorConfig; import org.sensorhub.impl.sensor.trupulse.TruPulseConfig; import org.sensorhub.impl.service.HttpServerConfig; @@ -788,6 +791,7 @@ protected void addSosTConfig(SensorConfig sensorConf, String sosUser, String sos @SuppressLint("HandlerLeak") @Override protected void onCreate(Bundle savedInstanceState) { + Log.d(TAG, "onCreate: Should appear in logs"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textArea = (TextView) findViewById(R.id.text); @@ -804,6 +808,17 @@ protected void onCreate(Bundle savedInstanceState) { displayHandler = new Handler(Looper.getMainLooper()); setupBroadcastReceivers(); + + Log.d(TAG, "onCreate: Creating BLE Config"); + BLEBeaconConfig beaconConfig = new BLEBeaconConfig(); + beaconConfig.id = "BLE_BEACON_SCANNER"; + beaconConfig.name = "BLE Scanner [" + deviceName + "]"; +// beaconConfig.moduleClass = BLEBeaconDriver.class.getCanonicalName(); + beaconConfig.androidContext = this.getApplicationContext(); + beaconConfig.autoStart = true; + Log.d(TAG, "onCreate: Adding config to sensorhub config"); +// sensorhubConfig.add(beaconConfig); + Log.d(TAG, "onCreate: BLE Config Added"); } diff --git a/sensorhub-android-blebeacon/build.gradle b/sensorhub-android-blebeacon/build.gradle index e4e35ea8..0b21b602 100644 --- a/sensorhub-android-blebeacon/build.gradle +++ b/sensorhub-android-blebeacon/build.gradle @@ -5,8 +5,8 @@ android { defaultConfig { - minSdkVersion 22 - targetSdkVersion 28 + minSdkVersion 26 + targetSdkVersion 26 versionCode 1 versionName "1.0" diff --git a/sensorhub-android-blebeacon/src/main/AndroidManifest.xml b/sensorhub-android-blebeacon/src/main/AndroidManifest.xml index 0a6f2047..f6a6a09d 100644 --- a/sensorhub-android-blebeacon/src/main/AndroidManifest.xml +++ b/sensorhub-android-blebeacon/src/main/AndroidManifest.xml @@ -1,2 +1,3 @@ + package="org.sensorhub.impl.sensor.blebeacon"> + From 9b97d6b38b1ae8d40f3d52661ad348a46a4a85af Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Tue, 8 Oct 2019 14:19:38 -0500 Subject: [PATCH 086/207] change ble_beacon unique id to actually be unique --- .../org/sensorhub/android/MainActivity.java | 24 +++++++++++-------- .../sensor/blebeacon/BLEBeaconDriver.java | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java index 8b755774..5fba2b5d 100644 --- a/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java +++ b/sensorhub-android-app/src/org/sensorhub/android/MainActivity.java @@ -225,6 +225,19 @@ protected void updateConfig(SharedPreferences prefs, String runName) { addSosTConfig(flironeConfig, sosUser, sosPwd); } + if(true){ + Log.d(TAG, "onCreate: Creating BLE Config"); + BLEBeaconConfig beaconConfig = new BLEBeaconConfig(); + beaconConfig.id = "BLE_BEACON_SCANNER"; + beaconConfig.name = "BLE Scanner [" + deviceName + "]"; +// beaconConfig.moduleClass = BLEBeaconDriver.class.getCanonicalName(); + beaconConfig.androidContext = this.getApplicationContext(); + beaconConfig.autoStart = true; + Log.d(TAG, "onCreate: Adding config to sensorhub config"); + sensorhubConfig.add(beaconConfig); + Log.d(TAG, "onCreate: BLE Config Added"); + } + /* // DJI Drone enabled = prefs.getBoolean("dji_enabled", false); @@ -809,16 +822,7 @@ protected void onCreate(Bundle savedInstanceState) { setupBroadcastReceivers(); - Log.d(TAG, "onCreate: Creating BLE Config"); - BLEBeaconConfig beaconConfig = new BLEBeaconConfig(); - beaconConfig.id = "BLE_BEACON_SCANNER"; - beaconConfig.name = "BLE Scanner [" + deviceName + "]"; -// beaconConfig.moduleClass = BLEBeaconDriver.class.getCanonicalName(); - beaconConfig.androidContext = this.getApplicationContext(); - beaconConfig.autoStart = true; - Log.d(TAG, "onCreate: Adding config to sensorhub config"); -// sensorhubConfig.add(beaconConfig); - Log.d(TAG, "onCreate: BLE Config Added"); + } diff --git a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconDriver.java b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconDriver.java index 8e735d49..ec4e0cee 100644 --- a/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconDriver.java +++ b/sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconDriver.java @@ -38,7 +38,7 @@ public synchronized void init() throws SensorHubException{ String deviceID = Settings.Secure.getString(androidContext.getContentResolver(), Settings.Secure.ANDROID_ID); this.xmlID = "ANDROID_SENSORS_" + Build.SERIAL; // Deprecated in API level 26 - this.uniqueID = "urn:android:device:" + deviceID; + this.uniqueID = "urn:android:device:" + "ble_beacon"; this.localFrameURI = this.uniqueID + "#" + LOCAL_REF_FRAME; rawOutput = new BLEBeaconRawOutput(this); From 1ff73c83b8d6f7c63ba26ac4e8aede989727e14a Mon Sep 17 00:00:00 2001 From: Ian Patterson Date: Wed, 9 Oct 2019 16:30:06 -0500 Subject: [PATCH 087/207] Migrate some code from BLERawOutput to the driver itself --- .../res/xml/pref_sensors.xml | 8 +- .../org/sensorhub/android/MainActivity.java | 1 + .../sensor/blebeacon/BLEBeaconDriver.java | 87 +++++++++++++++++-- .../blebeacon/BLEBeaconLocationOutput.java | 68 +++++++++++++++ .../sensor/blebeacon/BLEBeaconRawOutput.java | 80 ++++++++--------- 5 files changed, 191 insertions(+), 53 deletions(-) create mode 100644 sensorhub-android-blebeacon/src/main/java/org/sensorhub/impl/sensor/blebeacon/BLEBeaconLocationOutput.java diff --git a/sensorhub-android-app/res/xml/pref_sensors.xml b/sensorhub-android-app/res/xml/pref_sensors.xml index 4231c454..4d9b4be0 100644 --- a/sensorhub-android-app/res/xml/pref_sensors.xml +++ b/sensorhub-android-app/res/xml/pref_sensors.xml @@ -1,4 +1,5 @@ - + + - - - -
\ No newline at end of file diff --git a/sensorhub-android-app/res/layout/activity_spot_report.xml b/sensorhub-android-app/res/layout/activity_spot_report.xml deleted file mode 100644 index 5243c93e..00000000 --- a/sensorhub-android-app/res/layout/activity_spot_report.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - -