From cdbacd00c2b53dc2110a765e6603d12cb9cf5217 Mon Sep 17 00:00:00 2001 From: Graham Jones Date: Thu, 21 Dec 2023 17:40:03 +0000 Subject: [PATCH] Added alarm cause code. Fixes #111 --- .../org/openseizuredetector/MainActivity.java | 2 +- .../uk/org/openseizuredetector/SdData.java | 4 ++++ .../org/openseizuredetector/SdDataSource.java | 19 ++++++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/uk/org/openseizuredetector/MainActivity.java b/app/src/main/java/uk/org/openseizuredetector/MainActivity.java index a76ef88..7af64a6 100644 --- a/app/src/main/java/uk/org/openseizuredetector/MainActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/MainActivity.java @@ -632,7 +632,7 @@ public class MainActivity extends AppCompatActivity { tv.setTextColor(warnTextColour); } if (mConnection.mSdServer.mSdData.alarmStanding) { - tv.setText(R.string.Alarm); + tv.setText(getString(R.string.Alarm) + "\n" + mConnection.mSdServer.mSdData.alarmCause); tv.setBackgroundColor(alarmColour); tv.setTextColor(alarmTextColour); } diff --git a/app/src/main/java/uk/org/openseizuredetector/SdData.java b/app/src/main/java/uk/org/openseizuredetector/SdData.java index 74ab37e..bf5fb0c 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdData.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdData.java @@ -106,6 +106,7 @@ public class SdData implements Parcelable { /* Analysis results */ public Time dataTime = null; public long alarmState; + public String alarmCause = ""; public boolean alarmStanding = false; public boolean fallAlarmStanding = false; public long maxVal; @@ -223,6 +224,7 @@ public class SdData implements Parcelable { jsonObj.put("roiRatio", 10 * roiPower / specPower); jsonObj.put("alarmState", alarmState); jsonObj.put("alarmPhrase", alarmPhrase); + jsonObj.put("alarmCause", alarmCause); jsonObj.put("hr", mHR); jsonObj.put("adaptiveHrAv", mAdaptiveHrAverage); jsonObj.put("averageHrAv", mAverageHrAverage); @@ -273,6 +275,7 @@ public class SdData implements Parcelable { jsonObj.put("phoneBatteryPc", phoneBatteryPc); jsonObj.put("alarmState", alarmState); jsonObj.put("alarmPhrase", alarmPhrase); + jsonObj.put("alarmCause", alarmCause); jsonObj.put("sdMode", mSdMode); jsonObj.put("sampleFreq", mSampleFreq); jsonObj.put("analysisPeriod", analysisPeriod); @@ -338,6 +341,7 @@ public class SdData implements Parcelable { jsonObj.put("haveSettings", haveSettings); jsonObj.put("alarmState", alarmState); jsonObj.put("alarmPhrase", alarmPhrase); + jsonObj.put("alarmCause", alarmCause); jsonObj.put("sdMode", mSdMode); jsonObj.put("sampleFreq", mSampleFreq); jsonObj.put("analysisPeriod", analysisPeriod); diff --git a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java index 2aed61f..eadbded 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java @@ -541,6 +541,7 @@ public abstract class SdDataSource { } // Check this data to see if it represents an alarm state. + mSdData.alarmCause = ""; alarmCheck(); hrCheck(); o2SatCheck(); @@ -569,12 +570,14 @@ public abstract class SdDataSource { // Is the current set of data representing an alarm state? if ((mSdData.roiPower > mAlarmThresh) && ((10 * mSdData.roiPower / mSdData.specPower) > mAlarmRatioThresh)) { inAlarm = true; + mSdData.alarmCause = mSdData.alarmCause+"OsdAlg "; } } if (mSdData.mCnnAlarmActive) { if (mSdData.mPseizure > 0.5) { inAlarm = true; + mSdData.alarmCause = mSdData.alarmCause+"CnnAlg "; } } @@ -602,7 +605,10 @@ public abstract class SdDataSource { } } - Log.v(TAG, "alarmCheck(): inAlarm=" + inAlarm + ", alarmState = " + mSdData.alarmState + " alarmCount=" + mAlarmCount + " mWarnTime=" + mWarnTime+ " mAlarmTime=" + mAlarmTime); + Log.v(TAG, "alarmCheck(): inAlarm=" + inAlarm + ", alarmCause=" + + mSdData.alarmCause + ", alarmState = " + mSdData.alarmState + + " alarmCount=" + mAlarmCount + " mWarnTime=" + mWarnTime + + " mAlarmTime=" + mAlarmTime); } @@ -640,6 +646,8 @@ public abstract class SdDataSource { mSdData.mHRAlarmStanding = true; mSdData.mAdaptiveHrAlarmStanding = false; mSdData.mAverageHrAlarmStanding = false; + mSdData.alarmCause = mSdData.alarmCause+"HrNull "; + } else { Log.i(TAG, "Heart Rate Fault (HR<0)"); mSdData.mHRFaultStanding = true; @@ -650,8 +658,14 @@ public abstract class SdDataSource { } else { mSdData.mHRFaultStanding = false; mSdData.mHRAlarmStanding = checkResults.get(0); + if (mSdData.mHRAlarmStanding) + mSdData.alarmCause = mSdData.alarmCause+"HR "; mSdData.mAdaptiveHrAlarmStanding = checkResults.get(1); + if (mSdData.mAdaptiveHrAlarmStanding) + mSdData.alarmCause = mSdData.alarmCause+"HR_ADAPT "; mSdData.mAverageHrAlarmStanding = checkResults.get(2); + if (mSdData.mAverageHrAlarmStanding) + mSdData.alarmCause = mSdData.alarmCause+"HR_AVG "; // Show an ALARM state if any of the HR alarms is standing. if (mSdData.mHRAlarmStanding | mSdData.mAdaptiveHrAlarmStanding | mSdData.mAverageHrAlarmStanding) { mSdData.alarmState = 2; @@ -679,6 +693,7 @@ public abstract class SdDataSource { Log.i(TAG, "Oxygen Saturation Null - Alarming"); mSdData.mO2SatFaultStanding = false; mSdData.mO2SatAlarmStanding = true; + mSdData.alarmCause = mSdData.alarmCause+"O2_NULL "; } else { Log.i(TAG, "Oxygen Saturation Fault (O2Sat<0)"); mSdData.mO2SatFaultStanding = true; @@ -688,6 +703,7 @@ public abstract class SdDataSource { Log.i(TAG, "Oxygen Saturation Abnormal - " + mSdData.mO2Sat + " %"); mSdData.mO2SatFaultStanding = false; mSdData.mO2SatAlarmStanding = true; + mSdData.alarmCause = mSdData.alarmCause+"O2SAT "; } else { mSdData.mO2SatFaultStanding = false; mSdData.mO2SatAlarmStanding = false; @@ -729,6 +745,7 @@ public abstract class SdDataSource { Log.d(TAG, "check_fall() ****FALL DETECTED***** minAcc=" + minAcc + ", maxAcc=" + maxAcc); Log.d(TAG, "check_fall() - ****FALL DETECTED****"); mSdData.fallAlarmStanding = true; + mSdData.alarmCause = mSdData.alarmCause+"FALL "; return; } if (mMute != 0) {