diff --git a/app/src/main/java/uk/org/openseizuredetector/MainActivity.java b/app/src/main/java/uk/org/openseizuredetector/MainActivity.java
index d6cd7dd..2a6b7ac 100644
--- a/app/src/main/java/uk/org/openseizuredetector/MainActivity.java
+++ b/app/src/main/java/uk/org/openseizuredetector/MainActivity.java
@@ -709,10 +709,14 @@ public class MainActivity extends AppCompatActivity {
} else
specRatio = 0;
+ long pSeizurePc;
+ pSeizurePc = (long)(mConnection.mSdServer.mSdData.mPseizure * 100);
+ Log.d(TAG,"pSeizurePc="+pSeizurePc+", mPseizure="+mConnection.mSdServer.mSdData.mPseizure);
((TextView) findViewById(R.id.powerTv)).setText(getString(R.string.PowerEquals) + mConnection.mSdServer.mSdData.roiPower +
" (" + getString(R.string.Threshold) + "=" + mConnection.mSdServer.mSdData.alarmThresh + ")");
((TextView) findViewById(R.id.spectrumTv)).setText(getString(R.string.SpectrumRatioEquals) + specRatio +
" (" + getString(R.string.Threshold) + "=" + mConnection.mSdServer.mSdData.alarmRatioThresh + ")");
+ ((TextView) findViewById(R.id.pSeizureTv)).setText("Seizure Probability = "+pSeizurePc+"%");
ProgressBar pb;
Drawable pbDrawable;
@@ -740,6 +744,18 @@ public class MainActivity extends AppCompatActivity {
//pb.getProgressDrawable().setColorFilter(colour, PorterDuff.Mode.SRC_IN);
pb.setProgressDrawable(pbDrawable);
+ pb = ((ProgressBar) findViewById(R.id.pSeizureProgressBar));
+ pb.setMax(100);
+ pb.setProgress((int) pSeizurePc);
+ pbDrawable = getResources().getDrawable(R.drawable.progress_bar_blue);
+ if (pSeizurePc > 30)
+ pbDrawable = getResources().getDrawable(R.drawable.progress_bar_yellow);
+ if (pSeizurePc > 50)
+ pbDrawable = getResources().getDrawable(R.drawable.progress_bar_red);
+ //pb.getProgressDrawable().setColorFilter(colour, PorterDuff.Mode.SRC_IN);
+ pb.setProgressDrawable(pbDrawable);
+
+
// Fault Conditions - We override the values in the UI because we do not know
// if the stored ones are correct or not with a fault present.
diff --git a/app/src/main/java/uk/org/openseizuredetector/SdAlgNn.java b/app/src/main/java/uk/org/openseizuredetector/SdAlgNn.java
index 7305b8a..01d66bf 100644
--- a/app/src/main/java/uk/org/openseizuredetector/SdAlgNn.java
+++ b/app/src/main/java/uk/org/openseizuredetector/SdAlgNn.java
@@ -66,7 +66,7 @@ public class SdAlgNn {
interpreter.close();
}
- public int run(SdData sdData) {
+ public float getPseizure(SdData sdData) {
int i;
float[][][] modelInput = new float[1][125][1];
float[][] modelOutput = new float[1][2];
@@ -75,9 +75,6 @@ public class SdAlgNn {
}
interpreter.run(modelInput, modelOutput);
Log.d(TAG,"run - pSeizure="+modelOutput[0][1]);
- if (modelOutput[0][1]>0.5)
- return 1;
- else
- return 0;
+ return(modelOutput[0][1]);
}
}
diff --git a/app/src/main/java/uk/org/openseizuredetector/SdData.java b/app/src/main/java/uk/org/openseizuredetector/SdData.java
index fd73a29..1171ca1 100644
--- a/app/src/main/java/uk/org/openseizuredetector/SdData.java
+++ b/app/src/main/java/uk/org/openseizuredetector/SdData.java
@@ -37,6 +37,11 @@ import org.json.JSONArray;
public class SdData implements Parcelable {
private final static String TAG = "SdData";
private final static int N_RAW_DATA = 500; // 5 seconds at 100 Hz.
+
+ // Seizure Detection Algorithm Selection
+ public boolean mOsdAlarmActive;
+ public boolean mCnnAlarmActive;
+
/* Analysis settings */
public String phoneAppVersion = "";
public boolean haveSettings = false; // flag to say if we have received settings or not.
@@ -107,6 +112,7 @@ public class SdData implements Parcelable {
public boolean mO2SatFaultStanding = false;
public double mO2Sat = 0;
+ public double mPseizure = 0.;
public SdData() {
simpleSpec = new int[10];
@@ -196,6 +202,7 @@ public class SdData implements Parcelable {
jsonObj.put("alarmPhrase", alarmPhrase);
jsonObj.put("hr", mHR);
jsonObj.put("o2Sat", mO2Sat);
+ jsonObj.put("pSeizure", mPseizure);
JSONArray arr = new JSONArray();
for (int i = 0; i < simpleSpec.length; i++) {
arr.put(simpleSpec[i]);
@@ -247,6 +254,8 @@ public class SdData implements Parcelable {
jsonObj.put("alarmFreqMax", alarmFreqMax);
jsonObj.put("alarmThresh", alarmThresh);
jsonObj.put("alarmRatioThresh", alarmRatioThresh);
+ jsonObj.put("osdAlarmActive", mOsdAlarmActive);
+ jsonObj.put("cnnAlarmActive", mCnnAlarmActive);
jsonObj.put("hrAlarmActive", mHRAlarmActive);
jsonObj.put("hrAlarmStanding", mHRAlarmStanding);
jsonObj.put("hrThreshMin", mHRThreshMin);
diff --git a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java
index 12c5be1..ab81759 100644
--- a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java
+++ b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java
@@ -220,6 +220,8 @@ public abstract class SdDataSource {
mUtil.writeToSysLogFile("SDDataSource.stop() - error - " + e.toString());
}
+ mSdAlgNn.close();
+
}
/**
@@ -485,9 +487,12 @@ public abstract class SdDataSource {
mWatchAppRunningCheck = false;
}
+ // Use the neural network algorithm to calculate the probability of the data
+ // being representative of a seizure (sets mSdData.mPseizure)
+ nnAnalysis();
+
// Check this data to see if it represents an alarm state.
alarmCheck();
- nnCheck();
hrCheck();
o2SatCheck();
fallCheck();
@@ -505,16 +510,23 @@ public abstract class SdDataSource {
* Sets mSdData.alarmState and mSdData.hrAlarmStanding
*/
private void alarmCheck() {
- boolean inAlarm;
+ boolean inAlarm = false;
// Avoid potential divide by zero issue
if (mSdData.specPower == 0)
mSdData.specPower = 1;
Log.v(TAG, "alarmCheck() - roiPower="+mSdData.roiPower+" specPower="+ mSdData.specPower+" ratio="+10*mSdData.roiPower/ mSdData.specPower);
- // Is the current set of data representing an alarm state?
- if ((mSdData.roiPower > mAlarmThresh) && ((10 * mSdData.roiPower / mSdData.specPower) > mAlarmRatioThresh)) {
- inAlarm = true;
- } else {
- inAlarm = false;
+
+ if (mSdData.mOsdAlarmActive) {
+ // Is the current set of data representing an alarm state?
+ if ((mSdData.roiPower > mAlarmThresh) && ((10 * mSdData.roiPower / mSdData.specPower) > mAlarmRatioThresh)) {
+ inAlarm = true;
+ }
+ }
+
+ if (mSdData.mCnnAlarmActive) {
+ if (mSdData.mPseizure > 0.5) {
+ inAlarm = true;
+ }
}
// set the alarmState to Alarm, Warning or OK, depending on the current state and previous ones.
@@ -728,11 +740,12 @@ public abstract class SdDataSource {
}
}
- void nnCheck() {
+ void nnAnalysis() {
//Check the current set of data using the neural network model to look for alarms.
- Log.d(TAG,"nnCheck");
- int nnResult = mSdAlgNn.run(mSdData);
- Log.d(TAG,"nnCheck - nnResult="+nnResult);
+ Log.d(TAG,"nnAnalysis");
+ float pSeizure = mSdAlgNn.getPseizure(mSdData);
+ Log.d(TAG,"nnAnalysis - nnResult="+pSeizure);
+ mSdData.mPseizure = pSeizure;
}
/**
@@ -873,6 +886,15 @@ public abstract class SdDataSource {
Log.v(TAG, "updatePrefs() FallWindow = " + mFallWindow);
mUtil.writeToSysLogFile( "updatePrefs() FallWindow = " + mFallWindow);
+ mSdData.mOsdAlarmActive = SP.getBoolean("OsdAlarmActive", false);
+ Log.v(TAG, "updatePrefs() OsdAlarmActive = " + mSdData.mOsdAlarmActive);
+ mUtil.writeToSysLogFile( "updatePrefs() OsdAlarmActive = " + mSdData.mOsdAlarmActive);
+
+ mSdData.mCnnAlarmActive = SP.getBoolean("CnnAlarmActive", false);
+ Log.v(TAG, "updatePrefs() CnnAlarmActive = " + mSdData.mCnnAlarmActive);
+ mUtil.writeToSysLogFile( "updatePrefs() CnnAlarmActive = " + mSdData.mCnnAlarmActive);
+
+
mSdData.mHRAlarmActive = SP.getBoolean("HRAlarmActive", false);
Log.v(TAG, "updatePrefs() HRAlarmActive = " + mSdData.mHRAlarmActive);
mUtil.writeToSysLogFile( "updatePrefs() HRAlarmActive = " + mSdData.mHRAlarmActive);
diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml
index ccb06c7..433738a 100644
--- a/app/src/main/res/layout/main.xml
+++ b/app/src/main/res/layout/main.xml
@@ -119,6 +119,21 @@
android:indeterminate="false"
android:minHeight="20dp" />
+
+
+
+
+
Not Logged in to Data Sharing
You must be logged in to the Data Sharing system to be able to report seizures.
Include Warnings
+ Enable the original deterministic OpenSeizureDetector Algorithm to generate alarms.
+ Enable Original OSD Algorithm
+ Enable AI (Neural Network) Algorithm
+ Enable the Artificial Intelligence (Neural Network) algorithm to generate alarms.
diff --git a/app/src/main/res/xml/seizure_detector_prefs.xml b/app/src/main/res/xml/seizure_detector_prefs.xml
index 3f1460f..d7d1f84 100644
--- a/app/src/main/res/xml/seizure_detector_prefs.xml
+++ b/app/src/main/res/xml/seizure_detector_prefs.xml
@@ -3,6 +3,16 @@
+
+