Change SMS logic and style

This commit is contained in:
2026-05-08 13:37:31 +00:00
parent 25529056d4
commit fba1bbef80
4 changed files with 78 additions and 10 deletions
@@ -31,7 +31,7 @@ public class LocationFinder implements LocationListener {
Timer mTimeoutTimer = null; Timer mTimeoutTimer = null;
LocationManager mLocationManager = null; LocationManager mLocationManager = null;
LocationListener mLocationListener; LocationListener mLocationListener;
int mTimeoutPeriod = 60; // Location search timeout period in seconds. int mTimeoutPeriod = 7; // Location search timeout period in seconds.
String TAG = "LocationFinder"; String TAG = "LocationFinder";
@@ -116,6 +116,9 @@ public abstract class SdDataSource {
private Time mHrStatusTime; private Time mHrStatusTime;
private double mHrFrozenPeriod = 60; // seconds private double mHrFrozenPeriod = 60; // seconds
private boolean mHrFrozenAlarm; private boolean mHrFrozenAlarm;
private boolean mRequireHrForSeizureAlarm = false;
private int mHrConfirmationWindowSecs = 0;
private long mLastHrAlarmMillis = 0;
private boolean mFidgetDetectorEnabled; private boolean mFidgetDetectorEnabled;
private double mFidgetPeriod; private double mFidgetPeriod;
private double mFidgetThreshold; private double mFidgetThreshold;
@@ -734,9 +737,22 @@ public abstract class SdDataSource {
// set the alarmState to Alarm, Warning or OK, depending on the current state and previous ones. // set the alarmState to Alarm, Warning or OK, depending on the current state and previous ones.
if (inAlarm) { if (inAlarm) {
mAlarmCount += mSamplePeriod; mAlarmCount += mSamplePeriod;
if (mAlarmCount > mAlarmTime) { if (mAlarmCount > mAlarmTime) {
// full alarm if (mRequireHrForSeizureAlarm) {
if (hasRecentHrConfirmation()) {
mSdData.alarmState = 2; mSdData.alarmState = 2;
mSdData.alarmCause = mSdData.alarmCause + "HR_CONFIRM ";
} else {
// Motion algorithm reached alarm, but HR has not confirmed it.
// Keep warning state rather than raising seizure alarm.
mSdData.alarmState = 1;
mSdData.alarmCause = mSdData.alarmCause + "NO_HR_CONFIRM ";
}
} else {
// Existing behavior
mSdData.alarmState = 2;
}
} else if (mAlarmCount > mWarnTime) { } else if (mAlarmCount > mWarnTime) {
// warning // warning
mSdData.alarmState = 1; mSdData.alarmState = 1;
@@ -761,7 +777,24 @@ public abstract class SdDataSource {
+ " mAlarmTime=" + mAlarmTime); + " mAlarmTime=" + mAlarmTime);
} }
private boolean isHrAlarmStanding() {
return mSdData.mHRAlarmStanding
|| mSdData.mAdaptiveHrAlarmStanding
|| mSdData.mAverageHrAlarmStanding;
}
private boolean hasRecentHrConfirmation() {
if (mHrConfirmationWindowSecs <= 0) {
return isHrAlarmStanding();
}
if (mLastHrAlarmMillis <= 0) {
return false;
}
long ageMillis = System.currentTimeMillis() - mLastHrAlarmMillis;
return ageMillis <= (mHrConfirmationWindowSecs * 1000L);
}
public void muteCheck() { public void muteCheck() {
if (mMute != 0) { if (mMute != 0) {
Log.v(TAG, "Mute Active - setting alarms to mute"); Log.v(TAG, "Mute Active - setting alarms to mute");
@@ -816,11 +849,16 @@ public abstract class SdDataSource {
mSdData.mAverageHrAlarmStanding = checkResults.get(2); mSdData.mAverageHrAlarmStanding = checkResults.get(2);
if (mSdData.mAverageHrAlarmStanding) if (mSdData.mAverageHrAlarmStanding)
mSdData.alarmCause = mSdData.alarmCause + "HR_AVG "; mSdData.alarmCause = mSdData.alarmCause + "HR_AVG ";
// Show an ALARM state if any of the HR alarms is standing. // Record HR alarm timing. In HR-confirmation mode, HR is used to confirm
if (mSdData.mHRAlarmStanding | mSdData.mAdaptiveHrAlarmStanding | mSdData.mAverageHrAlarmStanding) { // a motion/OSD seizure alarm rather than independently raising seizure alarm.
if (isHrAlarmStanding()) {
mLastHrAlarmMillis = System.currentTimeMillis();
if (!mRequireHrForSeizureAlarm) {
mSdData.alarmState = 2; mSdData.alarmState = 2;
} }
} }
}
} else { } else {
mSdData.mHRFaultStanding = false; mSdData.mHRFaultStanding = false;
mSdData.mHRAlarmStanding = false; mSdData.mHRAlarmStanding = false;
@@ -1320,6 +1358,17 @@ public abstract class SdDataSource {
Log.d(TAG, "updatePrefs(): mAverageHrAlarmThreshMin=" + mSdData.mAverageHrAlarmThreshMin); Log.d(TAG, "updatePrefs(): mAverageHrAlarmThreshMin=" + mSdData.mAverageHrAlarmThreshMin);
Log.d(TAG, "updatePrefs(): mAverageHrAlarmThreshMax=" + mSdData.mAverageHrAlarmThreshMax); Log.d(TAG, "updatePrefs(): mAverageHrAlarmThreshMax=" + mSdData.mAverageHrAlarmThreshMax);
mRequireHrForSeizureAlarm = SP.getBoolean("RequireHrForSeizureAlarm", false);
try {
String hrConfirmWindowStr = SP.getString("HrConfirmationWindowSecs", "0");
mHrConfirmationWindowSecs = Integer.parseInt(hrConfirmWindowStr);
} catch (Exception ex) {
mHrConfirmationWindowSecs = 0;
}
Log.d(TAG, "updatePrefs(): mRequireHrForSeizureAlarm=" + mRequireHrForSeizureAlarm);
Log.d(TAG, "updatePrefs(): mHrConfirmationWindowSecs=" + mHrConfirmationWindowSecs);
mSdData.mO2SatAlarmActive = SP.getBoolean("O2SatAlarmActive", false); mSdData.mO2SatAlarmActive = SP.getBoolean("O2SatAlarmActive", false);
Log.v(TAG, "updatePrefs() O2SatAlarmActive = " + mSdData.mO2SatAlarmActive); Log.v(TAG, "updatePrefs() O2SatAlarmActive = " + mSdData.mO2SatAlarmActive);
@@ -1442,7 +1442,8 @@ public class SdServer extends Service implements SdDataReceiver {
// SmsManager sm = SmsManager.getDefault(); // SmsManager sm = SmsManager.getDefault();
for (int i = 0; i < mSMSNumbers.length; i++) { for (int i = 0; i < mSMSNumbers.length; i++) {
Log.i(TAG, "SmsTimer.onFinish() - Sending to " + mSMSNumbers[i]); Log.i(TAG, "SmsTimer.onFinish() - Sending to " + mSMSNumbers[i]);
sendSMS(new String(mSMSNumbers[i]), mSMSMsgStr + " - " + dateStr + " " + shortUuidStr); sendSMS(new String(mSMSNumbers[i]),
mSMSMsgStr + " at " + dateStr + ". Location pending. Device: " + shortUuidStr);
} }
} }
@@ -1510,8 +1511,11 @@ public class SdServer extends Service implements SdDataReceiver {
+ ll.getLatitude() + "%2C" + ll.getLongitude(); + ll.getLatitude() + "%2C" + ll.getLongitude();
String shortUuidStr = mUuidStr.substring(mUuidStr.length() - 6); String shortUuidStr = mUuidStr.substring(mUuidStr.length() - 6);
String messageStr = mSMSMsgStr + " - " + String messageStr = "Location update for seizure detected at "
dateStr + " - " + googleUrl + " " + shortUuidStr; + dateStr + ": "
+ googleUrl
+ " Device: "
+ shortUuidStr;
Log.i(TAG, "onSdLocationReceived() - Message is " + messageStr); Log.i(TAG, "onSdLocationReceived() - Message is " + messageStr);
mUtil.showToast(messageStr); mUtil.showToast(messageStr);
for (int i = 0; i < mSMSNumbers.length; i++) { for (int i = 0; i < mSMSNumbers.length; i++) {
+16 -1
View File
@@ -12,8 +12,23 @@
android:summary="@string/latch_timer_period_summary" android:summary="@string/latch_timer_period_summary"
android:numeric="integer" android:numeric="integer"
android:defaultValue="10" /> android:defaultValue="10" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="Seizure Alarm Confirmation">
<CheckBoxPreference
android:defaultValue="false"
android:key="RequireHrForSeizureAlarm"
android:summary="Only raise a seizure alarm when the motion seizure algorithm is confirmed by a recent heart-rate alarm."
android:title="Require heart-rate confirmation" />
<EditTextPreference
android:key="HrConfirmationWindowSecs"
android:title="Heart-rate confirmation window"
android:summary="Seconds after an HR alarm that can confirm a motion seizure alarm. Use 0 for strict same-cycle confirmation."
android:inputType="number"
android:defaultValue="0" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/AudibleAlarmSettingsTitle"> <PreferenceCategory android:title="@string/AudibleAlarmSettingsTitle">
<CheckBoxPreference <CheckBoxPreference
android:defaultValue="true" android:defaultValue="true"