Skip to content

Commit 3e61397

Browse files
committed
Added adaptive and average heart rate data to SdData so that it is logged to the data sharing database.
1 parent 968f1bf commit 3e61397

File tree

9 files changed

+130
-23
lines changed

9 files changed

+130
-23
lines changed

app/src/main/AndroidManifest.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools"
4-
android:versionCode="121"
5-
android:versionName="4.1.7">
4+
android:versionCode="122"
5+
android:versionName="4.1.8">
66
<!-- android:allowBackup="false" -->
77
<uses-permission android:name="android.permission.BLUETOOTH" />
88
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

app/src/main/java/uk/org/openseizuredetector/MainActivity.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -651,10 +651,16 @@ public void run() {
651651
tv = (TextView) findViewById(R.id.pebbleTv);
652652
//if (mConnection.mSdServer.mSdData.mHRAlarmActive) {
653653
if (mConnection.mSdServer.mSdData.mO2Sat > 0) {
654-
tv.setText(getString(R.string.HR_Equals) + mConnection.mSdServer.mSdData.mHR + " bpm\n"
655-
+ getString(R.string.SpO2)+" = " + mConnection.mSdServer.mSdData.mO2Sat + "%");
654+
tv.setText(getString(R.string.HR_Equals) + Math.round(mConnection.mSdServer.mSdData.mHR) + " bpm\n"
655+
+"(av="
656+
+Math.round(mConnection.mSdServer.mSdData.mAdaptiveHrAverage)+","
657+
+Math.round(mConnection.mSdServer.mSdData.mAverageHrAverage)+") bpm\n"
658+
+ getString(R.string.SpO2)+" = " + Math.round(mConnection.mSdServer.mSdData.mO2Sat) + "%");
656659
} else {
657-
tv.setText(getString(R.string.HR_Equals) + mConnection.mSdServer.mSdData.mHR + " bpm\n"
660+
tv.setText(getString(R.string.HR_Equals) + Math.round(mConnection.mSdServer.mSdData.mHR) + " bpm\n"
661+
+"(av="
662+
+Math.round(mConnection.mSdServer.mSdData.mAdaptiveHrAverage)+","
663+
+Math.round(mConnection.mSdServer.mSdData.mAverageHrAverage)+") bpm\n"
658664
+ getString(R.string.SpO2)+" = ---%");
659665
}
660666
if (mConnection.mSdServer.mSdData.mHRAlarmStanding || mConnection.mSdServer.mSdData.mO2SatAlarmStanding) {

app/src/main/java/uk/org/openseizuredetector/SdAlgHr.java

+27-2
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,36 @@ private boolean checkSimpleHr(double hrVal) {
111111
return(retVal);
112112
}
113113

114+
/**
115+
* Returns the average heart rate being used by the Adaptive heart rate algorithm
116+
* @return Average Heart reate in bpm.
117+
*/
118+
public double getAdaptiveHrAverage() {
119+
return mAdaptiveHrBuff.getAverageVal();
120+
}
121+
122+
public CircBuf getAverageHrBuff() {
123+
return mAverageHrBuff;
124+
}
125+
126+
public CircBuf getAdaptiveHrBuff() {
127+
return mAdaptiveHrBuff;
128+
}
129+
130+
/**
131+
* Returns the average heart rate being used by the Average heart rate algorithm
132+
* @return Average Heart rate in bpm.
133+
*/
134+
public double getAverageHrAverage() {
135+
return mAverageHrBuff.getAverageVal();
136+
}
137+
138+
114139
private boolean checkAdaptiveHr(double hrVal) {
115140
boolean retVal;
116141
double hrThreshMin;
117142
double hrThreshMax;
118-
double avHr = mAdaptiveHrBuff.getAverageVal();
143+
double avHr = getAdaptiveHrAverage();
119144
hrThreshMin = avHr - mAdaptiveHrAlarmThresh;
120145
hrThreshMax = avHr + mAdaptiveHrAlarmThresh;
121146

@@ -133,7 +158,7 @@ private boolean checkAdaptiveHr(double hrVal) {
133158

134159
private boolean checkAverageHr(double hrVal) {
135160
boolean retVal;
136-
double avHr = mAdaptiveHrBuff.getAverageVal();
161+
double avHr = getAverageHrAverage();
137162

138163
retVal = false;
139164
if (hrVal < mAverageHrAlarmThreshMin) {

app/src/main/java/uk/org/openseizuredetector/SdData.java

+29-4
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,18 @@ public class SdData implements Parcelable {
8787

8888
public double rawData[];
8989
public double rawData3D[];
90+
public boolean mAdaptiveHrAlarmActive;
91+
public double mAdaptiveHrAlarmWindowSecs;
92+
public double mAdaptiveHrAlarmThresh;
93+
public boolean mAverageHrAlarmActive;
94+
public double mAverageHrAlarmWindowSecs;
95+
public double mAverageHrAlarmThreshMin;
96+
public double mAverageHrAlarmThreshMax;
97+
public double mAverageHrAverage;
98+
public double mAdaptiveHrAverage;
99+
100+
public CircBuf mAdaptiveHrBuf;
101+
public CircBuf mAverageHrBuf;
90102
int mNsamp = 0;
91103

92104
/* Analysis results */
@@ -106,8 +118,8 @@ public class SdData implements Parcelable {
106118

107119
public boolean mHRAlarmStanding = false;
108120
public boolean mHRFaultStanding = false;
109-
public boolean mAdaptiveHRAlarmStanding = false;
110-
public boolean mAverageHRAlarmStanding = false;
121+
public boolean mAdaptiveHrAlarmStanding = false;
122+
public boolean mAverageHrAlarmStanding = false;
111123
public double mHR = 0;
112124

113125
public boolean mO2SatAlarmStanding = false;
@@ -210,6 +222,8 @@ public String toDatapointJSON() {
210222
jsonObj.put("alarmState", alarmState);
211223
jsonObj.put("alarmPhrase", alarmPhrase);
212224
jsonObj.put("hr", mHR);
225+
jsonObj.put("adaptiveHrAv", mAdaptiveHrAverage);
226+
jsonObj.put("averageHrAv", mAverageHrAverage);
213227
jsonObj.put("o2Sat", mO2Sat);
214228
jsonObj.put("pSeizure", mPseizure);
215229
JSONArray arr = new JSONArray();
@@ -269,6 +283,15 @@ public String toSettingsJSON() {
269283
jsonObj.put("hrAlarmStanding", mHRAlarmStanding);
270284
jsonObj.put("hrThreshMin", mHRThreshMin);
271285
jsonObj.put("hrThreshMax", mHRThreshMax);
286+
jsonObj.put("adaptiveHrAlarmActive", mAdaptiveHrAlarmActive);
287+
jsonObj.put("adaptiveHrAlarmStanding", mAdaptiveHrAlarmStanding);
288+
jsonObj.put("adaptiveHrAlarmWindow", mAdaptiveHrAlarmWindowSecs);
289+
jsonObj.put("adaptiveHrAlarmThresh", mAdaptiveHrAlarmThresh);
290+
jsonObj.put("averageHrAlarmActive", mAverageHrAlarmActive);
291+
jsonObj.put("averageHrAlarmStanding", mAverageHrAlarmStanding);
292+
jsonObj.put("averageHrAlarmThreshMin", mAverageHrAlarmThreshMin);
293+
jsonObj.put("averageHrAlarmThreshMax", mAverageHrAlarmThreshMax);
294+
272295
jsonObj.put("o2SatAlarmActive", mO2SatAlarmActive);
273296
jsonObj.put("o2SatAlarmStanding", mO2SatAlarmStanding);
274297
jsonObj.put("o2SatThreshMin", mO2SatThreshMin);
@@ -320,12 +343,14 @@ public String toDataString(boolean includeRawData) {
320343
jsonObj.put("alarmRatioThresh", alarmRatioThresh);
321344
jsonObj.put("hrAlarmActive", mHRAlarmActive);
322345
jsonObj.put("hrAlarmStanding", mHRAlarmStanding);
323-
jsonObj.put("adaptiveHrAlarmStanding", mAdaptiveHRAlarmStanding);
324-
jsonObj.put("averageHrAlarmStanding", mAverageHRAlarmStanding);
346+
jsonObj.put("adaptiveHrAlarmStanding", mAdaptiveHrAlarmStanding);
347+
jsonObj.put("averageHrAlarmStanding", mAverageHrAlarmStanding);
325348
jsonObj.put("hrAlarmStanding", mHRAlarmStanding);
326349
jsonObj.put("hrThreshMin", mHRThreshMin);
327350
jsonObj.put("hrThreshMax", mHRThreshMax);
328351
jsonObj.put("hr", mHR);
352+
jsonObj.put("adaptiveHrAv", mAdaptiveHrAverage);
353+
jsonObj.put("averageHrAv", mAverageHrAverage);
329354
jsonObj.put("o2SatAlarmActive", mO2SatAlarmActive);
330355
jsonObj.put("o2SatAlarmStanding", mO2SatAlarmStanding);
331356
jsonObj.put("o2SatThreshMin", mO2SatThreshMin);

app/src/main/java/uk/org/openseizuredetector/SdDataSource.java

+55-9
Original file line numberDiff line numberDiff line change
@@ -592,37 +592,44 @@ public void hrCheck() {
592592
Log.v(TAG, "hrCheck()");
593593
ArrayList<Boolean> checkResults;
594594
checkResults = mSdAlgHr.checkHr(mSdData.mHR);
595+
596+
// Populate mSdData so that the heart rate data is logged and is accessible to user interface components.
597+
mSdData.mAdaptiveHrAverage = mSdAlgHr.getAdaptiveHrAverage();
598+
mSdData.mAverageHrAverage = mSdAlgHr.getAverageHrAverage();
599+
mSdData.mAdaptiveHrBuf = mSdAlgHr.getAdaptiveHrBuff();
600+
mSdData.mAverageHrBuf = mSdAlgHr.getAverageHrBuff();
601+
595602
/* Check for heart rate fault condition */
596603
if (mSdData.mHRAlarmActive) {
597604
if (mSdData.mHR < 0) {
598605
if (mSdData.mHRNullAsAlarm) {
599606
Log.i(TAG, "Heart Rate Null - Alarming");
600607
mSdData.mHRFaultStanding = false;
601608
mSdData.mHRAlarmStanding = true;
602-
mSdData.mAdaptiveHRAlarmStanding = false;
603-
mSdData.mAverageHRAlarmStanding = false;
609+
mSdData.mAdaptiveHrAlarmStanding = false;
610+
mSdData.mAverageHrAlarmStanding = false;
604611
} else {
605612
Log.i(TAG, "Heart Rate Fault (HR<0)");
606613
mSdData.mHRFaultStanding = true;
607614
mSdData.mHRAlarmStanding = false;
608-
mSdData.mAdaptiveHRAlarmStanding = false;
609-
mSdData.mAverageHRAlarmStanding = false;
615+
mSdData.mAdaptiveHrAlarmStanding = false;
616+
mSdData.mAverageHrAlarmStanding = false;
610617
}
611618
} else {
612619
mSdData.mHRFaultStanding = false;
613620
mSdData.mHRAlarmStanding = checkResults.get(0);
614-
mSdData.mAdaptiveHRAlarmStanding = checkResults.get(1);
615-
mSdData.mAverageHRAlarmStanding = checkResults.get(2);
621+
mSdData.mAdaptiveHrAlarmStanding = checkResults.get(1);
622+
mSdData.mAverageHrAlarmStanding = checkResults.get(2);
616623
// Show an ALARM state if any of the HR alarms is standing.
617-
if (mSdData.mHRAlarmStanding | mSdData.mAdaptiveHRAlarmStanding | mSdData.mAverageHRAlarmStanding) {
624+
if (mSdData.mHRAlarmStanding | mSdData.mAdaptiveHrAlarmStanding | mSdData.mAverageHrAlarmStanding) {
618625
mSdData.alarmState = 2;
619626
}
620627
}
621628
} else {
622629
mSdData.mHRFaultStanding = false;
623630
mSdData.mHRAlarmStanding = false;
624-
mSdData.mAdaptiveHRAlarmStanding = false;
625-
mSdData.mAverageHRAlarmStanding = false;
631+
mSdData.mAdaptiveHrAlarmStanding = false;
632+
mSdData.mAverageHrAlarmStanding = false;
626633

627634
}
628635
}
@@ -787,6 +794,28 @@ void nnAnalysis() {
787794
}
788795
}
789796

797+
/**
798+
* Read a preference value, and return it as a double.
799+
* FIXME - this should be in osdUtil so other classes can use it.
800+
*
801+
* @param SP - Shared Preferences object
802+
* @param prefName - name of preference to read.
803+
* @param defVal - default value if it is not stored.
804+
* @return double value of the stored specified preference, or the default value.
805+
*/
806+
private double readDoublePref(SharedPreferences SP, String prefName, String defVal) {
807+
String prefValStr;
808+
double retVal = -1;
809+
try {
810+
prefValStr = SP.getString(prefName, defVal);
811+
retVal = Double.parseDouble(prefValStr);
812+
} catch (Exception ex) {
813+
Log.v(TAG, "readDoublePref() - Problem with preference!");
814+
//mUtil.showToast(TAG+":"+mContext.getString(R.string.problem_parsing_preferences));
815+
}
816+
return retVal;
817+
}
818+
790819
/**
791820
* updatePrefs() - update basic settings from the SharedPreferences
792821
* - defined in res/xml/SdDataSourceNetworkPassivePrefs.xml
@@ -952,6 +981,23 @@ public void updatePrefs() {
952981
Log.v(TAG, "updatePrefs() HRThreshMax = " + mSdData.mHRThreshMax);
953982
mUtil.writeToSysLogFile( "updatePrefs() HRThreshMax = " + mSdData.mHRThreshMax);
954983

984+
mSdData.mAdaptiveHrAlarmActive = SP.getBoolean("HRAdaptiveAlarmActive", false);
985+
mSdData.mAdaptiveHrAlarmWindowSecs = readDoublePref(SP, "HRAdaptiveAlarmWindowSecs", "30");
986+
mSdData.mAdaptiveHrAlarmThresh = readDoublePref(SP, "HRAdaptiveAlarmThresh", "20");
987+
Log.d(TAG,"updatePrefs(): mAdaptiveHrAlarmActive="+mSdData.mAdaptiveHrAlarmActive);
988+
Log.d(TAG,"updatePrefs(): mAdaptiveHrWindowSecs="+mSdData.mAdaptiveHrAlarmWindowSecs);
989+
Log.d(TAG,"updatePrefs(): mAdaptiveHrAlarmThresh="+mSdData.mAdaptiveHrAlarmThresh);
990+
991+
mSdData.mAverageHrAlarmActive = SP.getBoolean("HRAverageAlarmActive", false);
992+
mSdData.mAverageHrAlarmWindowSecs = readDoublePref(SP, "HRAverageAlarmWindowSecs", "120");
993+
mSdData.mAverageHrAlarmThreshMin = readDoublePref(SP, "HRAverageAlarmThreshMin", "40");
994+
mSdData.mAverageHrAlarmThreshMax = readDoublePref(SP, "HRAverageAlarmThreshMax", "120");
995+
Log.d(TAG,"updatePrefs(): mAverageHrAlarmActive="+mSdData.mAverageHrAlarmActive);
996+
Log.d(TAG,"updatePrefs(): mAverageHrAlarmWindowSecs="+mSdData.mAverageHrAlarmWindowSecs);
997+
Log.d(TAG,"updatePrefs(): mAverageHrAlarmThreshMin="+mSdData.mAverageHrAlarmThreshMin);
998+
Log.d(TAG,"updatePrefs(): mAverageHrAlarmThreshMax="+mSdData.mAverageHrAlarmThreshMax);
999+
1000+
9551001
mSdData.mO2SatAlarmActive = SP.getBoolean("O2SatAlarmActive", false);
9561002
Log.v(TAG, "updatePrefs() O2SatAlarmActive = " + mSdData.mO2SatAlarmActive);
9571003
mUtil.writeToSysLogFile( "updatePrefs() O2SatAlarmActive = " + mSdData.mO2SatAlarmActive);

app/src/main/java/uk/org/openseizuredetector/SdWebServer.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public Response serve(IHTTPSession session) {
128128
case GET:
129129
//Log.v(TAG,"WebServer.serve() - Returning settings");
130130
try {
131-
JSONObject jsonObj = new JSONObject();
131+
/*JSONObject jsonObj = new JSONObject();
132132
jsonObj.put("alarmFreqMin", mSdData.alarmFreqMin);
133133
jsonObj.put("alarmFreqMax", mSdData.alarmFreqMax);
134134
jsonObj.put("nMin", mSdData.nMin);
@@ -139,6 +139,8 @@ public Response serve(IHTTPSession session) {
139139
jsonObj.put("alarmRatioThresh", mSdData.alarmRatioThresh);
140140
jsonObj.put("batteryPc", mSdData.batteryPc);
141141
answer = jsonObj.toString();
142+
*/
143+
answer = mSdData.toSettingsJSON();
142144
} catch (Exception ex) {
143145
Log.v(TAG, "Error Creating Data Object - " + ex.toString());
144146
answer = "{'msg': 'Error Creating Data Object'}";

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ buildscript {
1010
mavenCentral()
1111
}
1212
dependencies {
13-
classpath 'com.android.tools.build:gradle:7.3.1'
13+
classpath 'com.android.tools.build:gradle:8.0.2'
1414
classpath 'com.google.gms:google-services:4.3.15'
1515
}
1616
}

gradle.properties

+3
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@
1414
org.gradle.jvmargs=-Xmx1536M -Dkotlin.daemon.jvm.options\="-Xmx1536M"
1515
android.enableJetifier=true
1616
android.useAndroidX=true
17+
android.defaults.buildfeatures.buildconfig=true
18+
android.nonTransitiveRClass=false
19+
android.nonFinalResIds=false

gradle/wrapper/gradle-wrapper.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip

0 commit comments

Comments
 (0)