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 {
compileSdkVersion 24
buildToolsVersion '24.0.1'
buildToolsVersion '25.0.0'
useLibrary 'org.apache.http.legacy'
defaultConfig {

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="uk.org.openseizuredetector"
android:versionCode="33"
android:versionName="2.3.2">
android:versionCode="34"
android:versionName="2.5.0">
<uses-permission android:name="android.permission.INTERNET" />
<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 String mSdDataSourceName = "undefined"; // The name of the data soruce specified in the preferences.
private boolean mLatchAlarms = false;
private int mLatchAlarmPeriod = 0;
private LatchAlarmTimer mLatchAlarmTimer = null;
private boolean mCancelAudible = false;
public boolean mAudibleAlarm = false;
private boolean mAudibleWarning = false;
@@ -162,7 +164,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
public void onCreate() {
Log.v(TAG, "onCreate()");
mHandler = new Handler();
mUtil = new OsdUtil(getApplicationContext(),mHandler);
mUtil = new OsdUtil(getApplicationContext(), mHandler);
mUtil.writeToSysLogFile("SdServer.onCreate()");
// Set our custom uncaught exception handler to report issues.
@@ -171,7 +173,6 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
//int i = 5/0; // Force exception to test handler.
// Create a wake lock, but don't use it until the service is started.
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
@@ -205,7 +206,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
break;
default:
Log.v(TAG, "Datasource " + mSdDataSourceName + " not recognised - Exiting");
mUtil.writeToSysLogFile("SdServer.onStartCommand() - Datasource "+mSdDataSourceName+" not recognised - exiting");
mUtil.writeToSysLogFile("SdServer.onStartCommand() - Datasource " + mSdDataSourceName + " not recognised - exiting");
mUtil.showToast("Datasource " + mSdDataSourceName + " not recognised - Exiting");
return 1;
}
@@ -300,6 +301,8 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
mCancelAudibleTimer = null;
}
// Stop the Cancel Alarm Latch timer
stopLatchTimer();
try {
// Cancel the notification.
@@ -317,7 +320,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
} catch (Exception e) {
Log.v(TAG, "Error in onDestroy() - " + e.toString());
mUtil.writeToSysLogFile("SdServer.onDestroy() -error "+e.toString());
mUtil.writeToSysLogFile("SdServer.onDestroy() -error " + e.toString());
}
mUtil.writeToSysLogFile("SdServer.onDestroy() - releasing mToneGenerator");
@@ -373,10 +376,10 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
if (componentInfo.getPackageName().equals("uk.org.openseizuredetector")) {
Log.v(TAG,"showMainActivity(): OpenSeizureDetector Activity is already shown on top - not doing anything");
Log.v(TAG, "showMainActivity(): OpenSeizureDetector Activity is already shown on top - not doing anything");
mUtil.writeToSysLogFile("SdServer.showMainActivity - Activity is already shown on top, not doing anything");
} else {
Log.v(TAG,"showMainActivity(): Showing Main Activity");
Log.v(TAG, "showMainActivity(): Showing Main Activity");
Intent i = new Intent(getApplicationContext(), MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(i);
@@ -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
*/
@@ -393,23 +397,25 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
if (sdData.alarmState == 0) {
if ((!mLatchAlarms) ||
(mLatchAlarms &&
(!sdData.alarmStanding && !sdData.fallAlarmStanding))) {
(!mSdData.alarmStanding && !mSdData.fallAlarmStanding))) {
sdData.alarmPhrase = "OK";
sdData.alarmStanding = false;
sdData.fallAlarmStanding = false;
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.alarmStanding = false;
sdData.fallAlarmStanding = false;
showNotification(0);
}
// Handle warning alarm state
if (sdData.alarmState == 1) {
if ((!mLatchAlarms) ||
(mLatchAlarms &&
(!sdData.alarmStanding && !sdData.fallAlarmStanding))) {
(!mSdData.alarmStanding && !mSdData.fallAlarmStanding))) {
sdData.alarmPhrase = "WARNING";
sdData.alarmStanding = false;
sdData.fallAlarmStanding = false;
@@ -425,7 +431,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
showNotification(1);
}
// 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.alarmStanding = true;
if (mLogAlarms) {
@@ -452,7 +458,9 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
mSMSTime = tnow;
}
}
startLatchTimer();
}
// Handle fall alarm
if ((sdData.alarmState == 3) || (sdData.fallAlarmStanding)) {
sdData.alarmPhrase = "FALL";
sdData.fallAlarmStanding = true;
@@ -511,7 +519,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
* beep for duration milliseconds, but only if mAudibleAlarm is set.
*/
private void beep(int duration) {
if (mToneGenerator!=null) {
if (mToneGenerator != null) {
mToneGenerator.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, duration);
Log.v(TAG, "beep()");
} else {
@@ -589,12 +597,12 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
if (mSMSAlarm) {
mLocationFinder.getLocation(this);
Location loc = mLocationFinder.getLastLocation();
if (loc!=null) {
if (loc != null) {
mUtil.showToast("Send SMS - last location is "
+ loc.getLongitude() + ","
+ loc.getLatitude());
} else {
Log.v(TAG,"sendSMSAlarm() - Last Location is Null so sending first SMS without location.");
Log.v(TAG, "sendSMSAlarm() - Last Location is Null so sending first SMS without location.");
}
Log.v(TAG, "sendSMSAlarm() - Sending to " + mSMSNumbers.length + " Numbers");
mUtil.writeToSysLogFile("SdServer.sendSMSAlarm()");
@@ -617,6 +625,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
/**
* onSdLocationReceived - called with the best estimate location after mLocationReceiver times out.
*
* @param ll - location (may be null if no location found)
*/
@@ -636,16 +645,16 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
String dateStr = tnow.format("%H:%M:%S %d/%m/%Y");
NumberFormat df = new DecimalFormat("#0.000");
String geoUri = "<a href='geo:"
+df.format(ll.getLatitude())+","+df.format(ll.getLongitude())
+";u="+df.format(ll.getAccuracy())+"'>here</a>";
+ df.format(ll.getLatitude()) + "," + df.format(ll.getLongitude())
+ ";u=" + df.format(ll.getAccuracy()) + "'>here</a>";
//String googleUrl = "https://www.google.com/maps/place?q="
// +ll.getLatitude()+"%2C"+ll.getLongitude()+
// "&key=AIzaSyDf-nbkfz9TrhyVRoeS8Mwtq6K2nBpUAts";
String googleUrl = "https://www.google.com/maps/place?q="
+ll.getLatitude()+"%2C"+ll.getLongitude();
+ ll.getLatitude() + "%2C" + ll.getLongitude();
String messageStr = mSMSMsgStr + " - " +
dateStr + " - "+googleUrl;
Log.v(TAG, "onSdLocationReceived() - Message is "+messageStr);
dateStr + " - " + googleUrl;
Log.v(TAG, "onSdLocationReceived() - Message is " + messageStr);
mUtil.showToast(messageStr);
SmsManager sm = SmsManager.getDefault();
for (int i = 0; i < mSMSNumbers.length; i++) {
@@ -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.
*/
@@ -672,6 +713,7 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
Log.v(TAG, "acceptAlarm()");
mSdData.alarmStanding = false;
mSdData.fallAlarmStanding = false;
stopLatchTimer();
}
@@ -767,6 +809,16 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
Log.v(TAG, "updatePrefs() - DataSource = " + mSdDataSourceName);
mLatchAlarms = SP.getBoolean("LatchAlarms", false);
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);
Log.v(TAG, "updatePrefs() - mAuidbleFaultWarning = " + mAudibleFaultWarning);
// Parse the faultTimer period setting.
@@ -798,14 +850,13 @@ public class SdServer extends Service implements SdDataReceiver, SdLocationRecei
} catch (Exception ex) {
Log.v(TAG, "updatePrefs() - Problem parsing preferences!");
mUtil.writeToSysLogFile("SdServer.updatePrefs() - Error "+ex.toString());
mUtil.writeToSysLogFile("SdServer.updatePrefs() - Error " + ex.toString());
Toast toast = Toast.makeText(getApplicationContext(), "Problem Parsing Preferences - Something won't work - Please go back to Settings and correct it!", Toast.LENGTH_SHORT);
toast.show();
}
}
/**
* 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
* CancelAudiblePeriod setting.

View File

@@ -6,6 +6,13 @@
android:key="LatchAlarms"
android:summary="Require manual reset of alarms to reset them to silence them."
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 android:title="Audible Alarm Settings">
<CheckBoxPreference

View File

@@ -4,7 +4,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.android.tools.build:gradle:2.3.1'
}
}
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
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
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