Added alarm latch timer to release latch after a specified period even if Accept Alarm button is not pressed.

This commit is contained in:
Graham Jones
2017-05-07 19:56:24 +01:00
parent 00c335f70b
commit b0b61b9fd2
6 changed files with 112 additions and 28 deletions

View File

@@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
android { android {
compileSdkVersion 24 compileSdkVersion 24
buildToolsVersion '24.0.1' buildToolsVersion '25.0.0'
useLibrary 'org.apache.http.legacy' useLibrary 'org.apache.http.legacy'
defaultConfig { defaultConfig {

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="uk.org.openseizuredetector" package="uk.org.openseizuredetector"
android:versionCode="33" android:versionCode="34"
android:versionName="2.3.2"> android:versionName="2.5.0">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

View File

@@ -103,6 +103,8 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
public SdData mSdData = null; public SdData mSdData = null;
public String mSdDataSourceName = "undefined"; // The name of the data soruce specified in the preferences. public String mSdDataSourceName = "undefined"; // The name of the data soruce specified in the preferences.
private boolean mLatchAlarms = false; private boolean mLatchAlarms = false;
private int mLatchAlarmPeriod = 0;
private LatchAlarmTimer mLatchAlarmTimer = null;
private boolean mCancelAudible = false; private boolean mCancelAudible = false;
public boolean mAudibleAlarm = false; public boolean mAudibleAlarm = false;
private boolean mAudibleWarning = false; private boolean mAudibleWarning = false;
@@ -171,7 +173,6 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
//int i = 5/0; // Force exception to test handler. //int i = 5/0; // Force exception to test handler.
// Create a wake lock, but don't use it until the service is started. // Create a wake lock, but don't use it until the service is started.
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
@@ -300,6 +301,8 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
mCancelAudibleTimer = null; mCancelAudibleTimer = null;
} }
// Stop the Cancel Alarm Latch timer
stopLatchTimer();
try { try {
// Cancel the notification. // Cancel the notification.
@@ -384,7 +387,8 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
} }
/** /**
* Process the data received from the SdData source. * Process the data received from the SdData source. On exit, the mSdData structure is populated with
* the appropriate data.
* *
* @param sdData * @param sdData
*/ */
@@ -393,23 +397,25 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
if (sdData.alarmState == 0) { if (sdData.alarmState == 0) {
if ((!mLatchAlarms) || if ((!mLatchAlarms) ||
(mLatchAlarms && (mLatchAlarms &&
(!sdData.alarmStanding && !sdData.fallAlarmStanding))) { (!mSdData.alarmStanding && !mSdData.fallAlarmStanding))) {
sdData.alarmPhrase = "OK"; sdData.alarmPhrase = "OK";
sdData.alarmStanding = false; sdData.alarmStanding = false;
sdData.fallAlarmStanding = false; sdData.fallAlarmStanding = false;
showNotification(0); showNotification(0);
} }
} }
if (sdData.alarmState == 6) { // manual mute from watch buttons. // Handle manual mute from watch buttons.
if (sdData.alarmState == 6) {
sdData.alarmPhrase = "MUTE"; sdData.alarmPhrase = "MUTE";
sdData.alarmStanding = false; sdData.alarmStanding = false;
sdData.fallAlarmStanding = false; sdData.fallAlarmStanding = false;
showNotification(0); showNotification(0);
} }
// Handle warning alarm state
if (sdData.alarmState == 1) { if (sdData.alarmState == 1) {
if ((!mLatchAlarms) || if ((!mLatchAlarms) ||
(mLatchAlarms && (mLatchAlarms &&
(!sdData.alarmStanding && !sdData.fallAlarmStanding))) { (!mSdData.alarmStanding && !mSdData.fallAlarmStanding))) {
sdData.alarmPhrase = "WARNING"; sdData.alarmPhrase = "WARNING";
sdData.alarmStanding = false; sdData.alarmStanding = false;
sdData.fallAlarmStanding = false; sdData.fallAlarmStanding = false;
@@ -425,7 +431,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
showNotification(1); showNotification(1);
} }
// respond to normal alarms (2) and manual alarms (5) // respond to normal alarms (2) and manual alarms (5)
if ((sdData.alarmState == 2) || (sdData.alarmState == 5) || (sdData.alarmStanding)) { if ((sdData.alarmState == 2) || (sdData.alarmState == 5)) {
sdData.alarmPhrase = "ALARM"; sdData.alarmPhrase = "ALARM";
sdData.alarmStanding = true; sdData.alarmStanding = true;
if (mLogAlarms) { if (mLogAlarms) {
@@ -452,7 +458,9 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
mSMSTime = tnow; mSMSTime = tnow;
} }
} }
startLatchTimer();
} }
// Handle fall alarm
if ((sdData.alarmState == 3) || (sdData.fallAlarmStanding)) { if ((sdData.alarmState == 3) || (sdData.fallAlarmStanding)) {
sdData.alarmPhrase = "FALL"; sdData.alarmPhrase = "FALL";
sdData.fallAlarmStanding = true; sdData.fallAlarmStanding = true;
@@ -617,6 +625,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
/** /**
* onSdLocationReceived - called with the best estimate location after mLocationReceiver times out. * onSdLocationReceived - called with the best estimate location after mLocationReceiver times out.
*
* @param ll - location (may be null if no location found) * @param ll - location (may be null if no location found)
*/ */
@@ -665,6 +674,38 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
} }
} }
/*
* Start the timer that will automatically re-set a latched alarm after a given period.
*/
private void startLatchTimer() {
if (mLatchAlarms) {
if (mLatchAlarmTimer != null) {
Log.v(TAG, "startLatchTimer -timer already running - cancelling it");
mLatchAlarmTimer.cancel();
mLatchAlarmTimer = null;
}
Log.v(TAG, "startLatchTimer() - starting alarm latch release timer to time out in " + mLatchAlarmPeriod + " sec");
// set timer to timeout after mLatchAlarmPeriod, and Tick() function to be called every second.
mLatchAlarmTimer =
new LatchAlarmTimer(mLatchAlarmPeriod * 1000, 1000);
mLatchAlarmTimer.start();
} else {
Log.v(TAG, "startLatchTimer() - Latch Alarms disabled - not doing anything");
}
}
/*
* Cancel the automatic de-latch timer - called from onDestroy, or if the AcceptAlarm button is pressed.
*/
private void stopLatchTimer() {
if (mLatchAlarmTimer != null) {
Log.v(TAG, "stopLatchTimer(): cancelling LatchAlarm timer");
mLatchAlarmTimer.cancel();
mLatchAlarmTimer = null;
}
}
/** /**
* set the alarm standing flags to false to allow alarm phase to reset to current value. * set the alarm standing flags to false to allow alarm phase to reset to current value.
*/ */
@@ -672,6 +713,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
Log.v(TAG, "acceptAlarm()"); Log.v(TAG, "acceptAlarm()");
mSdData.alarmStanding = false; mSdData.alarmStanding = false;
mSdData.fallAlarmStanding = false; mSdData.fallAlarmStanding = false;
stopLatchTimer();
} }
@@ -767,6 +809,16 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
Log.v(TAG, "updatePrefs() - DataSource = " + mSdDataSourceName); Log.v(TAG, "updatePrefs() - DataSource = " + mSdDataSourceName);
mLatchAlarms = SP.getBoolean("LatchAlarms", false); mLatchAlarms = SP.getBoolean("LatchAlarms", false);
Log.v(TAG, "updatePrefs() - mLatchAlarms = " + mLatchAlarms); Log.v(TAG, "updatePrefs() - mLatchAlarms = " + mLatchAlarms);
// Parse the LatchAlarmPeriod setting.
try {
String latchAlarmPeriodStr = SP.getString("LatchAlarmTimerPeriod", "30");
mLatchAlarmPeriod = Integer.parseInt(latchAlarmPeriodStr);
Log.v(TAG, "updatePrefs() - mLatchAlarmTimerPeriod = " + mLatchAlarmPeriod);
} catch (Exception ex) {
Log.v(TAG, "updatePrefs() - Problem with LatchAlarmTimerPeriod preference!");
Toast toast = Toast.makeText(getApplicationContext(), "Problem Parsing LatchAlarmTimerPeriod Preference", Toast.LENGTH_SHORT);
toast.show();
}
mAudibleFaultWarning = SP.getBoolean("AudibleFaultWarning", true); mAudibleFaultWarning = SP.getBoolean("AudibleFaultWarning", true);
Log.v(TAG, "updatePrefs() - mAuidbleFaultWarning = " + mAudibleFaultWarning); Log.v(TAG, "updatePrefs() - mAuidbleFaultWarning = " + mAudibleFaultWarning);
// Parse the faultTimer period setting. // Parse the faultTimer period setting.
@@ -805,7 +857,6 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
} }
/** /**
* Write data to SD card alarm log * Write data to SD card alarm log
*/ */
@@ -856,6 +907,32 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
} }
} }
/*
* Latch alarm in alarm state for a given period (mLatchAlarmPeriod seconds) after the alarm is raised.
* This is to ensure multiple Alarm annunciations even if only a single Alarm signal is received.
*/
private class LatchAlarmTimer extends CountDownTimer {
public LatchAlarmTimer(long startTime, long interval) {
super(startTime, interval);
}
// called after startTime ms.
@Override
public void onFinish() {
Log.v(TAG, "LatchAlarmTimer.onFinish()");
// Do the equivalent of accept alarm push button.
acceptAlarm();
}
// Called every 'interval' ms.
@Override
public void onTick(long timeRemaining) {
Log.v(TAG, "LatchAlarmTimer.onTick() - time remaining = " + timeRemaining / 1000 + " sec");
alarmBeep();
}
}
/* /*
* Temporary cancel audible alarms, for the period specified by the * Temporary cancel audible alarms, for the period specified by the
* CancelAudiblePeriod setting. * CancelAudiblePeriod setting.

View File

@@ -6,6 +6,13 @@
android:key="LatchAlarms" android:key="LatchAlarms"
android:summary="Require manual reset of alarms to reset them to silence them." android:summary="Require manual reset of alarms to reset them to silence them."
android:title="Latch Alarms" /> android:title="Latch Alarms" />
<EditTextPreference
android:key="LatchAlarmTimerPeriod"
android:title="Latch Alarm Timer Duration (sec)"
android:summary="Duration in seconds that alarms will initiate for before being silenced automatically."
android:numeric="integer"
android:defaultValue="10" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="Audible Alarm Settings"> <PreferenceCategory android:title="Audible Alarm Settings">
<CheckBoxPreference <CheckBoxPreference

View File

@@ -4,7 +4,7 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.android.tools.build:gradle:2.3.1'
} }
} }
allprojects { allprojects {

View File

@@ -1,6 +1,6 @@
#Mon Sep 19 21:50:42 BST 2016 #Sun May 07 14:37:42 BST 2017
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip