diff --git a/CHANGELOG.md b/CHANGELOG.md index 79bb3f6..5366663 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ OpenSeizureDetector Android App - Change Log ============================================ + V4.2.3 - Uses 3d accelerometer data to calculate magnitude if vector magnitude is not sent from data source. V4.2.2 - Added support for PineTime OSD Status reporting. V4.2.1 - Added support for PineTime wathes using the Bluetooth Data Source V4.1.0 - Added experimental support for neural network based seizure detector. diff --git a/app/release/app-release-4.2.2.apk b/app/release/app-release-4.2.3a.apk similarity index 84% rename from app/release/app-release-4.2.2.apk rename to app/release/app-release-4.2.3a.apk index 67f5e2b..fb30812 100644 Binary files a/app/release/app-release-4.2.2.apk and b/app/release/app-release-4.2.3a.apk differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 28bcc5d..b825c69 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="137" + android:versionName="4.2.3a"> diff --git a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java index 921c398..f995b31 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java @@ -287,6 +287,7 @@ public abstract class SdDataSource { String watchFwVersion; String sdVersion; String sdName; + boolean have3dData = false; JSONArray accelVals = null; JSONArray accelVals3D = null; Log.v(TAG, "updateFromJSON - " + jsonStr); @@ -317,17 +318,6 @@ public abstract class SdDataSource { // if we get 'null' HR (For example if the heart rate is not working) mMute = 0; } - accelVals = dataObject.getJSONArray("data"); - Log.v(TAG, "Received " + accelVals.length() + " acceleration values, rawData Length is " + mSdData.rawData.length); - if (accelVals.length() > mSdData.rawData.length) { - mUtil.writeToSysLogFile("ERROR: Received " + accelVals.length() + " acceleration values, but rawData storage length is " - + mSdData.rawData.length); - } - int i; - for (i = 0; i < accelVals.length(); i++) { - mSdData.rawData[i] = accelVals.getDouble(i); - } - mSdData.mNsamp = accelVals.length(); //Log.d(TAG,"accelVals[0]="+accelVals.getDouble(0)+", mSdData.rawData[0]="+mSdData.rawData[0]); try { accelVals3D = dataObject.getJSONArray("data3D"); @@ -336,16 +326,55 @@ public abstract class SdDataSource { mUtil.writeToSysLogFile("ERROR: Received " + accelVals3D.length() + " 3D acceleration values, but rawData3D storage length is " + mSdData.rawData3D.length); } - for (i = 0; i < accelVals3D.length(); i++) { + for (int i = 0; i < accelVals3D.length(); i++) { mSdData.rawData3D[i] = accelVals3D.getDouble(i); } + have3dData = true; } catch (JSONException e) { // If we get an error, just set rawData3D to zero Log.i(TAG, "updateFromJSON - error parsing 3D data - setting it to zero"); - for (i = 0; i < mSdData.rawData3D.length; i++) { + for (int i = 0; i < mSdData.rawData3D.length; i++) { mSdData.rawData3D[i] = 0.; } + have3dData = false; } + // Try to read the vector magnitude data from the JSON string. + try { + accelVals = dataObject.getJSONArray("data"); + Log.v(TAG, "Received " + accelVals.length() + " acceleration values, rawData Length is " + mSdData.rawData.length); + if (accelVals.length() > mSdData.rawData.length) { + mUtil.writeToSysLogFile("ERROR: Received " + accelVals.length() + " acceleration values, but rawData storage length is " + + mSdData.rawData.length); + } + int i; + for (i = 0; i < accelVals.length(); i++) { + mSdData.rawData[i] = accelVals.getDouble(i); + } + mSdData.mNsamp = accelVals.length(); + } catch (JSONException e) { + // If we do not have vector magnitude data, calculate it from the 3d data. + if (have3dData) { + Log.i(TAG,"Deriving Vector Magnitudes from 3d accelerometer data"); + int i; + for (i = 0; i < 125; i++) { + double x, y, z; + x = mSdData.rawData3D[i*3 + 0]; + y = mSdData.rawData3D[i*3 + 1]; + z = mSdData.rawData3D[i*3 + 2]; + mSdData.rawData[i] = Math.sqrt(x*x + y*y + z*z); + } + } else { + // If we do not have vector magnitude or 3d data, set the vector magnitude array to zero. + Log.e(TAG, "ERROR - no accelerometer data received - setting it to zero"); + int i; + // FIXME - assumed fixed length of array!! + for (i = 0; i < 125; i++) { + mSdData.rawData[i] = 0.0; + } + mSdData.mNsamp = 125; + } + } + mWatchAppRunningCheck = true; doAnalysis();