Re-hashing how we manage watch settings to make sure watch always uses the settings requested in the phone app - not working yet - not receiving data back from watch for some reason - too much settings traffic maybe?

This commit is contained in:
Graham Jones
2016-05-08 10:43:21 +01:00
parent 51c277f691
commit 6267745152
8 changed files with 170 additions and 63 deletions

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="24"
android:versionName="2.0.3" >
android:versionCode="25"
android:versionName="2.0.4" >
<uses-sdk android:minSdkVersion="14" />

View File

@@ -43,6 +43,13 @@ public class SdData implements Parcelable {
/* Analysis settings */
public boolean haveSettings = false; // flag to say if we have received settings or not.
public boolean haveData = false; // flag to say we have received data.
public short mDataUpdatePeriod;
public short mMutePeriod;
public short mManAlarmPeriod;
public boolean mFallActive;
public short mFallThreshMin;
public short mFallThreshMax;
public short mFallWindow;
public long alarmFreqMin;
public long alarmFreqMax;
public long nMin;

View File

@@ -50,6 +50,7 @@ import java.util.UUID;
* network data source.
*/
public class SdDataSourcePebble extends SdDataSource {
private Handler mHandler = new Handler();
private Timer mSettingsTimer;
private Timer mStatusTimer;
private Time mPebbleStatusTime;
@@ -99,6 +100,20 @@ public class SdDataSourcePebble extends SdDataSource {
private int DATA_TYPE_RESULTS = 1; // Analysis Results
private int DATA_TYPE_SETTINGS = 2; // Settings
private int DATA_TYPE_SPEC = 3; // FFT Spectrum (or part of a spectrum)
private short mDataUpdatePeriod;
private short mMutePeriod;
private short mManAlarmPeriod;
private short mAlarmFreqMin;
private short mAlarmFreqMax;
private short mWarnTime;
private short mAlarmTime;
private short mAlarmThresh;
private short mAlarmRatioThresh;
private boolean mFallActive;
private short mFallThreshMin;
private short mFallThreshMax;
private short mFallWindow;
public SdDataSourcePebble(Context context, SdDataReceiver sdDataReceiver) {
super(context,sdDataReceiver);
mName = "Pebble";
@@ -224,82 +239,59 @@ public class SdDataSourcePebble extends SdDataSource {
// Watch Settings
PebbleDictionary setDict = new PebbleDictionary();
short intVal;
String prefStr;
prefStr = SP.getString("DataUpdatePeriod", "5");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() DataUpdatePeriod = " + intVal);
setDict.addInt16(KEY_DATA_UPDATE_PERIOD, intVal);
mDataUpdatePeriod = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() DataUpdatePeriod = " + mDataUpdatePeriod);
prefStr = SP.getString("MutePeriod", "300");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() MutePeriod = " + intVal);
setDict.addInt16(KEY_MUTE_PERIOD, intVal);
mMutePeriod = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() MutePeriod = " + mMutePeriod);
prefStr = SP.getString("ManAlarmPeriod", "30");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() ManAlarmPeriod = " + intVal);
setDict.addInt16(KEY_MAN_ALARM_PERIOD, intVal);
mManAlarmPeriod = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() ManAlarmPeriod = " + mManAlarmPeriod);
prefStr = SP.getString("AlarmFreqMin", "5");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmFreqMin = " + intVal);
setDict.addInt16(KEY_ALARM_FREQ_MIN, intVal);
prefStr = SP.getString("AlarmFreqMin","3");
mAlarmFreqMin = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmFreqMin = " + mAlarmFreqMin);
prefStr = SP.getString("AlarmFreqMax", "10");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmFreqMax = " + intVal);
setDict.addUint16(KEY_ALARM_FREQ_MAX, (short) intVal);
mAlarmFreqMax = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmFreqMax = " + mAlarmFreqMax);
prefStr = SP.getString("WarnTime", "5");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() WarnTime = " + intVal);
setDict.addUint16(KEY_WARN_TIME, (short) intVal);
mWarnTime = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() WarnTime = " + mWarnTime);
prefStr = SP.getString("AlarmTime", "10");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmTime = " + intVal);
setDict.addUint16(KEY_ALARM_TIME, (short) intVal);
mAlarmTime = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmTime = " + mAlarmTime);
prefStr = SP.getString("AlarmThresh", "70");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmThresh = " + intVal);
setDict.addUint16(KEY_ALARM_THRESH, (short) intVal);
mAlarmThresh = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmThresh = " + mAlarmThresh);
prefStr = SP.getString("AlarmRatioThresh", "30");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmRatioThresh = " + intVal);
setDict.addUint16(KEY_ALARM_RATIO_THRESH, (short) intVal);
mAlarmRatioThresh = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmRatioThresh = " + mAlarmRatioThresh);
boolean fallActiveBool = SP.getBoolean("FallActive", false);
Log.v(TAG, "updatePrefs() FallActive = " + fallActiveBool);
if (fallActiveBool)
setDict.addUint16(KEY_FALL_ACTIVE, (short) 1);
else
setDict.addUint16(KEY_FALL_ACTIVE, (short) 0);
mFallActive = SP.getBoolean("FallActive", false);
Log.v(TAG, "updatePrefs() FallActive = " + mFallActive);
prefStr = SP.getString("FallThreshMin", "200");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() FallThreshMin = " + intVal);
setDict.addUint16(KEY_FALL_THRESH_MIN, (short) intVal);
mFallThreshMin = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() FallThreshMin = " + mFallThreshMin);
prefStr = SP.getString("FallThreshMax", "1200");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() FallThreshMax = " + intVal);
setDict.addUint16(KEY_FALL_THRESH_MAX, (short) intVal);
mFallThreshMax = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() FallThreshMax = " + mFallThreshMax);
prefStr = SP.getString("FallWindow", "1500");
intVal = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() FallWindow = " + intVal);
setDict.addUint16(KEY_FALL_WINDOW, (short) intVal);
mFallWindow = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() FallWindow = " + mFallWindow);
// Send Watch Settings to Pebble
Log.v(TAG, "updatePrefs() - setDict = " + setDict.toJsonString());
PebbleKit.sendDataToPebble(mContext, SD_UUID, setDict);
} catch (Exception ex) {
Log.v(TAG, "updatePrefs() - Problem parsing preferences!");
Toast toast = Toast.makeText(mContext, "Problem Parsing Preferences - Something won't work - Please go back to Settings and correct it!", Toast.LENGTH_SHORT);
@@ -342,13 +334,12 @@ public class SdDataSourcePebble extends SdDataSource {
mSdData.alarmPhrase = "Unknown";
mSdData.haveData = true;
mSdDataReceiver.onSdDataReceived(mSdData);
}
// Read the data that has been sent, and convert it into
// an integer array.
byte[] byteArr = data.getBytes(KEY_SPEC_DATA);
if ((byteArr!=null) && (byteArr.length!=0)) {
if ((byteArr != null) && (byteArr.length != 0)) {
IntBuffer intBuf = ByteBuffer.wrap(byteArr)
.order(ByteOrder.LITTLE_ENDIAN)
.asIntBuffer();
@@ -358,9 +349,9 @@ public class SdDataSourcePebble extends SdDataSource {
mSdData.simpleSpec[i] = intArray[i];
}
} else {
Log.v(TAG,"***** zero length spectrum received - error!!!!");
Log.v(TAG, "***** zero length spectrum received - error!!!!");
}
}
if (data.getUnsignedIntegerAsLong(KEY_DATA_TYPE)
== DATA_TYPE_SETTINGS) {
@@ -416,10 +407,13 @@ public class SdDataSourcePebble extends SdDataSource {
/**
* Request Pebble App to send us its latest settings.
* Send our latest settings to the watch, then request Pebble App to send
* us its latest settings so we can check it has been set up correctly..
* Will be received as a message by the receiveData handler
*/
public void getPebbleSdSettings() {
Log.v(TAG, "getPebbleSdSettings() - sending required settings to pebble");
sendPebbleSdSettings();
Log.v(TAG, "getPebbleSdSettings() - requesting settings from pebble");
PebbleDictionary data = new PebbleDictionary();
data.addUint8(KEY_SETTINGS, (byte) 1);
@@ -429,6 +423,101 @@ public class SdDataSourcePebble extends SdDataSource {
data);
}
/**
* Send the pebble watch settings that are stored as class member
* variables to the watch.
*/
public void sendPebbleSdSettings() {
Log.v(TAG, "sendPebblSdSettings() - preparing settings dictionary..");
// Watch Settings
final PebbleDictionary setDict = new PebbleDictionary();
setDict.addInt16(KEY_DATA_UPDATE_PERIOD, mDataUpdatePeriod);
setDict.addInt16(KEY_MUTE_PERIOD, mMutePeriod);
setDict.addInt16(KEY_MAN_ALARM_PERIOD, mManAlarmPeriod);
setDict.addInt16(KEY_ALARM_FREQ_MIN, mAlarmFreqMin);
setDict.addInt16(KEY_ALARM_FREQ_MAX, mAlarmFreqMax);
setDict.addUint16(KEY_WARN_TIME, mWarnTime);
setDict.addUint16(KEY_ALARM_TIME, mAlarmTime);
setDict.addUint16(KEY_ALARM_THRESH, mAlarmThresh);
setDict.addUint16(KEY_ALARM_RATIO_THRESH, mAlarmRatioThresh);
if (mFallActive)
setDict.addUint16(KEY_FALL_ACTIVE, (short) 1);
else
setDict.addUint16(KEY_FALL_ACTIVE, (short) 0);
setDict.addUint16(KEY_FALL_THRESH_MIN, mFallThreshMin);
setDict.addUint16(KEY_FALL_THRESH_MAX, mFallThreshMax);
setDict.addUint16(KEY_FALL_WINDOW, mFallWindow);
// Send Watch Settings to Pebble
Log.v(TAG, "sendPebbleSdSettings() - setDict = " + setDict.toJsonString());
PebbleKit.sendDataToPebble(mContext, SD_UUID, setDict);
}
/**
* Compares the watch settings retrieved from the watch (stored in mSdData)
* to the required settings stored as member variables to this class.
*
* @return true if they are all the same, or false if there are discrepancies.
*/
public boolean checkWatchSettings() {
boolean settingsOk = true;
if (mDataUpdatePeriod != mSdData.mDataUpdatePeriod) {
Log.v(TAG,"checkWatchSettings - mDataUpdatePeriod Wrong");
settingsOk = false;
}
if (mMutePeriod != mSdData.mMutePeriod) {
Log.v(TAG,"checkWatchSettings - mMutePeriod Wrong");
settingsOk = false;
}
if (mManAlarmPeriod != mSdData.mManAlarmPeriod) {
Log.v(TAG,"checkWatchSettings - mManAlarmPeriod Wrong");
settingsOk = false;
}
if (mAlarmFreqMin != mSdData.alarmFreqMin) {
Log.v(TAG,"checkWatchSettings - mAlarmFreqMin Wrong");
settingsOk = false;
}
if (mAlarmFreqMax != mSdData.alarmFreqMax) {
Log.v(TAG,"checkWatchSettings - mAlarmFreqMax Wrong");
settingsOk = false;
}
if (mWarnTime != mSdData.warnTime) {
Log.v(TAG,"checkWatchSettings - mWarnTime Wrong");
settingsOk = false;
}
if (mAlarmTime != mSdData.alarmTime) {
Log.v(TAG,"checkWatchSettings - mAlarmTime Wrong");
settingsOk = false;
}
if (mAlarmThresh != mSdData.alarmThresh) {
Log.v(TAG,"checkWatchSettings - mAlarmThresh Wrong");
settingsOk = false;
}
if (mAlarmRatioThresh != mSdData.alarmRatioThresh) {
Log.v(TAG,"checkWatchSettings - mAlarmRatioThresh Wrong");
settingsOk = false;
}
if (mFallActive != mSdData.mFallActive) {
Log.v(TAG,"checkWatchSettings - mAlarmFreqMin Wrong");
settingsOk = false;
}
if (mFallThreshMin != mSdData.mFallThreshMin) {
Log.v(TAG,"checkWatchSettings - mFallThreshMin Wrong");
settingsOk = false;
}
if (mFallThreshMax != mSdData.mFallThreshMax) {
Log.v(TAG,"checkWatchSettings - mFallThreshMax Wrong");
settingsOk = false;
}
if (mFallWindow != mSdData.mFallWindow) {
Log.v(TAG,"checkWatchSettings - mFallWindow Wrong");
settingsOk = false;
}
return settingsOk;
}
/**
* Request Pebble App to send us its latest data.
* Will be received as a message by the receiveData handler

View File

@@ -75,6 +75,14 @@ public class StartupActivity extends Activity {
setContentView(R.layout.startup_activity);
mUtil = new OsdUtil(this);
// Read the default settings from the xml preferences files, so we do
// not have to use the hard coded ones in the java files.
PreferenceManager.setDefaultValues(this, R.xml.alarm_prefs, true);
PreferenceManager.setDefaultValues(this, R.xml.camera_prefs, true);
PreferenceManager.setDefaultValues(this, R.xml.general_prefs, true);
PreferenceManager.setDefaultValues(this, R.xml.network_datasource_prefs, true);
PreferenceManager.setDefaultValues(this, R.xml.pebble_datasource_prefs, false);
Button b = (Button)findViewById(R.id.settingsButton);
b.setOnClickListener(new View.OnClickListener() {
@Override

View File

@@ -20,9 +20,9 @@
</PreferenceCategory>
<PreferenceCategory android:title="Seizure Detector Settings">
<EditTextPreference
android:defaultValue="5"
android:defaultValue="3"
android:key="AlarmFreqMin"
android:summary="Minimum Frequency of ROI (Hz) (Default = 5 Hz)"
android:summary="Minimum Frequency of ROI (Hz) (Default = 3 Hz)"
android:title="AlarmFreqMin (Hz)" />
<EditTextPreference
android:defaultValue="10"
@@ -47,7 +47,7 @@
<EditTextPreference
android:defaultValue="30"
android:key="AlarmRatioThresh"
android:summary="Alarm Ratio Threshold (Default = 30)"
android:summary="Alarm Ratio Threshold (Default = 30). Increase this value to reduce sensitivity if false alarms are a problem."
android:title="AlarmRatioThresh" />
</PreferenceCategory>