First go at adding support for O2 Saturation Data - it expects it to be included in the JSON data string as "O2Sat" in a similar way to heart rate.

This commit is contained in:
Graham Jones
2021-11-08 21:10:00 +00:00
parent eb2aff577f
commit d822fcf2e9
9 changed files with 139 additions and 10 deletions

View File

@@ -460,11 +460,12 @@ public class MainActivity extends AppCompatActivity {
// Pebble Connected Phrase - use for HR if active instead.
tv = (TextView) findViewById(R.id.pebbleTv);
if (mConnection.mSdServer.mSdData.mHRAlarmActive) {
tv.setText(getString(R.string.HR_Equals) + mConnection.mSdServer.mSdData.mHR);
if (mConnection.mSdServer.mSdData.mHRAlarmStanding) {
tv.setText(getString(R.string.HR_Equals) + mConnection.mSdServer.mSdData.mHR +" bpm\n"
+ "O2 Sat = " + mConnection.mSdServer.mSdData.mO2Sat + "%");
if (mConnection.mSdServer.mSdData.mHRAlarmStanding || mConnection.mSdServer.mSdData.mO2SatAlarmStanding) {
tv.setBackgroundColor(alarmColour);
tv.setTextColor(alarmTextColour);
} else if (mConnection.mSdServer.mSdData.mHRFaultStanding) {
} else if (mConnection.mSdServer.mSdData.mHRFaultStanding || mConnection.mSdServer.mSdData.mO2SatFaultStanding) {
tv.setBackgroundColor(warnColour);
tv.setTextColor(warnTextColour);
} else {
@@ -589,7 +590,7 @@ public class MainActivity extends AppCompatActivity {
tv.setTextColor(warnTextColour);
tv = (TextView) findViewById(R.id.pebbleTv);
tv.setText(getString(R.string.HR_Equals)+"---");
tv.setText(getString(R.string.HR_Equals)+" --- bpm\nO2 Sat = --- %");
tv.setBackgroundColor(warnColour);
tv.setTextColor(warnTextColour);

View File

@@ -65,6 +65,13 @@ public class SdData implements Parcelable {
public boolean mHRNullAsAlarm = false;
public double mHRThreshMin = 40.0;
public double mHRThreshMax = 150.0;
/* Oxygen Saturation Alarm Settings */
public boolean mO2SatAlarmActive = false;
public boolean mO2SatNullAsAlarm = false;
public double mO2SatThreshMin = 80.0;
public double rawData[];
int mNsamp = 0;
@@ -87,6 +94,11 @@ public class SdData implements Parcelable {
public boolean mHRFaultStanding = false;
public double mHR = 0;
public boolean mO2SatAlarmStanding = false;
public boolean mO2SatFaultStanding = false;
public double mO2Sat = 0;
public SdData() {
simpleSpec = new int[10];
rawData = new double[N_RAW_DATA];
@@ -95,6 +107,7 @@ public class SdData implements Parcelable {
/*
* Intialise this SdData object from a JSON String
* FIXME - add O2saturation with checking in case it is not included in the data
*/
public boolean fromJSON(String jsonStr) {
Log.v(TAG, "fromJSON() - parsing jsonString - " + jsonStr);
@@ -182,6 +195,10 @@ public class SdData implements Parcelable {
jsonObj.put("hrThreshMin",mHRThreshMin);
jsonObj.put("hrThreshMax", mHRThreshMax);
jsonObj.put("hr",mHR);
jsonObj.put("o2SatAlarmActive", mO2SatAlarmActive);
jsonObj.put("o2SatAlarmStanding", mO2SatAlarmStanding);
jsonObj.put("o2SatThreshMin",mO2SatThreshMin);
jsonObj.put("o2Sat",mO2Sat);
JSONArray arr = new JSONArray();
for (int i = 0; i < simpleSpec.length; i++) {
arr.put(simpleSpec[i]);
@@ -220,6 +237,7 @@ public class SdData implements Parcelable {
retval = retval + ", " + mSampleFreq;
retval = retval + ", " + alarmPhrase;
retval = retval + ", " + mHR;
retval = retval + ", " + mO2Sat;
if (includeRawData) {
for (int i = 0; i< mNsamp;i++) {
retval = retval + ", " + rawData[i];

View File

@@ -270,6 +270,12 @@ public abstract class SdDataSource {
// if we get 'null' HR (For example if the heart rate is not working)
mSdData.mHR = -1;
}
try {
mSdData.mO2Sat = dataObject.getDouble("O2Sat");
} catch (JSONException e) {
// if we get 'null' O2 Saturation (For example if the oxygen sensor is not working)
mSdData.mO2Sat = -1;
}
try {
mMute = dataObject.getInt("Mute");
} catch (JSONException e) {
@@ -455,6 +461,7 @@ public abstract class SdDataSource {
// Check this data to see if it represents an alarm state.
alarmCheck();
hrCheck();
o2SatCheck();
fallCheck();
muteCheck();
Log.v(TAG,"after fallCheck, mSdData.fallAlarmStanding="+mSdData.fallAlarmStanding);
@@ -544,9 +551,39 @@ public abstract class SdDataSource {
mSdData.mHRAlarmStanding = false;
}
}
}
/**
* hrCheck - check the Heart rate data in mSdData to see if it represents an alarm condition.
* Sets mSdData.mHRAlarmStanding
*/
public void o2SatCheck() {
Log.v(TAG, "o2SatCheck()");
/* Check Oxygen Saturation against alarm settings */
if (mSdData.mO2SatAlarmActive) {
if (mSdData.mO2Sat < 0) {
if (mSdData.mO2SatNullAsAlarm) {
Log.i(TAG, "Oxygen Saturation Null - Alarming");
mSdData.mO2SatFaultStanding = false;
mSdData.mO2SatAlarmStanding = true;
} else {
Log.i(TAG, "Oxygen Saturation Fault (O2Sat<0)");
mSdData.mO2SatFaultStanding = true;
mSdData.mO2SatAlarmStanding = false;
}
} else if (mSdData.mO2Sat < mSdData.mO2SatThreshMin) {
Log.i(TAG, "Oxygen Saturation Abnormal - " + mSdData.mO2Sat + " %");
mSdData.mO2SatFaultStanding = false;
mSdData.mO2SatAlarmStanding = true;
} else {
mSdData.mO2SatFaultStanding = false;
mSdData.mO2SatAlarmStanding = false;
}
}
}
/****************************************************************
* Simple threshold analysis to chech for fall.
* Called from clock_tick_handler()
@@ -816,6 +853,19 @@ public abstract class SdDataSource {
Log.v(TAG, "updatePrefs() HRThreshMax = " + mSdData.mHRThreshMax);
mUtil.writeToSysLogFile( "updatePrefs() HRThreshMax = " + mSdData.mHRThreshMax);
mSdData.mO2SatAlarmActive = SP.getBoolean("O2SatAlarmActive", false);
Log.v(TAG, "updatePrefs() O2SatAlarmActive = " + mSdData.mO2SatAlarmActive);
mUtil.writeToSysLogFile( "updatePrefs() O2SatAlarmActive = " + mSdData.mO2SatAlarmActive);
mSdData.mO2SatNullAsAlarm = SP.getBoolean("O2SatNullAsAlarm", false);
Log.v(TAG, "updatePrefs() O2SatNullAsAlarm = " + mSdData.mO2SatNullAsAlarm);
mUtil.writeToSysLogFile( "updatePrefs() O2SatNullAsAlarm = " + mSdData.mO2SatNullAsAlarm);
prefStr = SP.getString("O2SatThreshMin", "SET_FROM_XML");
mSdData.mO2SatThreshMin = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() O2SatThreshMin = " + mSdData.mO2SatThreshMin);
mUtil.writeToSysLogFile( "updatePrefs() O2SatThreshMin = " + mSdData.mO2SatThreshMin);
} else {
Log.v(TAG, "updatePrefs() - prefStr is null - WHY????");
mUtil.writeToSysLogFile("SDDataSource.updatePrefs() - prefStr is null - WHY??");

View File

@@ -672,9 +672,43 @@ public class SdServer extends Service implements SdDataReceiver {
mUtil.showToast(getString(R.string.SMSAlarmDisabledNotSendingMsg));
Log.v(TAG, "mSMSAlarm is false - not sending");
}
}
// Handle Oxygen Saturation alarm
if ((sdData.mO2SatAlarmActive) && (sdData.mO2SatAlarmStanding)) {
sdData.alarmPhrase = "Oxygen Saturation ABNORMAL";
if (mLogAlarms) {
Log.v(TAG, "***OXYGEN SATURATION*** - Logging to SD Card");
writeAlarmToSD();
} else {
Log.v(TAG, "***OXYGEN SATURATION***");
}
// Make alarm beep tone
alarmBeep();
showNotification(2);
// Display MainActvity
showMainActivity();
// Send SMS Alarm.
if (mSMSAlarm) {
Time tnow = new Time(Time.getCurrentTimezone());
tnow.setToNow();
// limit SMS alarms to one per minute
if ((tnow.toMillis(false)
- mSMSTime.toMillis(false))
> 60000) {
sendSMSAlarm();
mSMSTime = tnow;
} else {
mUtil.showToast("SMS Alarm already sent - not re-sending");
Log.v(TAG, "SMS Alarm already sent - not re-sending");
}
} else {
mUtil.showToast(getString(R.string.SMSAlarmDisabledNotSendingMsg));
Log.v(TAG, "mSMSAlarm is false - not sending");
}
}
// Fault
if ((sdData.alarmState) == 4 || (sdData.alarmState == 7) || (sdData.mHRFaultStanding)) {
sdData.alarmPhrase = "FAULT";