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

2
.gitignore vendored
View File

@@ -1,6 +1,8 @@
build build
.gradle .gradle
.idea .idea
local.properties
app/app-release.apk
app/build app/build
app/app.iml app/app.iml

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

View File

@@ -43,6 +43,13 @@ public class SdData implements Parcelable {
/* Analysis settings */ /* Analysis settings */
public boolean haveSettings = false; // flag to say if we have received settings or not. 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 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 alarmFreqMin;
public long alarmFreqMax; public long alarmFreqMax;
public long nMin; public long nMin;

View File

@@ -50,6 +50,7 @@ import java.util.UUID;
* network data source. * network data source.
*/ */
public class SdDataSourcePebble extends SdDataSource { public class SdDataSourcePebble extends SdDataSource {
private Handler mHandler = new Handler();
private Timer mSettingsTimer; private Timer mSettingsTimer;
private Timer mStatusTimer; private Timer mStatusTimer;
private Time mPebbleStatusTime; private Time mPebbleStatusTime;
@@ -99,6 +100,20 @@ public class SdDataSourcePebble extends SdDataSource {
private int DATA_TYPE_RESULTS = 1; // Analysis Results private int DATA_TYPE_RESULTS = 1; // Analysis Results
private int DATA_TYPE_SETTINGS = 2; // Settings private int DATA_TYPE_SETTINGS = 2; // Settings
private int DATA_TYPE_SPEC = 3; // FFT Spectrum (or part of a spectrum) 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) { public SdDataSourcePebble(Context context, SdDataReceiver sdDataReceiver) {
super(context,sdDataReceiver); super(context,sdDataReceiver);
mName = "Pebble"; mName = "Pebble";
@@ -224,82 +239,59 @@ public class SdDataSourcePebble extends SdDataSource {
// Watch Settings // Watch Settings
PebbleDictionary setDict = new PebbleDictionary();
short intVal;
String prefStr; String prefStr;
prefStr = SP.getString("DataUpdatePeriod", "5"); prefStr = SP.getString("DataUpdatePeriod", "5");
intVal = (short) Integer.parseInt(prefStr); mDataUpdatePeriod = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() DataUpdatePeriod = " + intVal); Log.v(TAG, "updatePrefs() DataUpdatePeriod = " + mDataUpdatePeriod);
setDict.addInt16(KEY_DATA_UPDATE_PERIOD, intVal);
prefStr = SP.getString("MutePeriod", "300"); prefStr = SP.getString("MutePeriod", "300");
intVal = (short) Integer.parseInt(prefStr); mMutePeriod = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() MutePeriod = " + intVal); Log.v(TAG, "updatePrefs() MutePeriod = " + mMutePeriod);
setDict.addInt16(KEY_MUTE_PERIOD, intVal);
prefStr = SP.getString("ManAlarmPeriod", "30"); prefStr = SP.getString("ManAlarmPeriod", "30");
intVal = (short) Integer.parseInt(prefStr); mManAlarmPeriod = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() ManAlarmPeriod = " + intVal); Log.v(TAG, "updatePrefs() ManAlarmPeriod = " + mManAlarmPeriod);
setDict.addInt16(KEY_MAN_ALARM_PERIOD, intVal);
prefStr = SP.getString("AlarmFreqMin","3");
prefStr = SP.getString("AlarmFreqMin", "5"); mAlarmFreqMin = (short) Integer.parseInt(prefStr);
intVal = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() AlarmFreqMin = " + mAlarmFreqMin);
Log.v(TAG, "updatePrefs() AlarmFreqMin = " + intVal);
setDict.addInt16(KEY_ALARM_FREQ_MIN, intVal);
prefStr = SP.getString("AlarmFreqMax", "10"); prefStr = SP.getString("AlarmFreqMax", "10");
intVal = (short) Integer.parseInt(prefStr); mAlarmFreqMax = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmFreqMax = " + intVal); Log.v(TAG, "updatePrefs() AlarmFreqMax = " + mAlarmFreqMax);
setDict.addUint16(KEY_ALARM_FREQ_MAX, (short) intVal);
prefStr = SP.getString("WarnTime", "5"); prefStr = SP.getString("WarnTime", "5");
intVal = (short) Integer.parseInt(prefStr); mWarnTime = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() WarnTime = " + intVal); Log.v(TAG, "updatePrefs() WarnTime = " + mWarnTime);
setDict.addUint16(KEY_WARN_TIME, (short) intVal);
prefStr = SP.getString("AlarmTime", "10"); prefStr = SP.getString("AlarmTime", "10");
intVal = (short) Integer.parseInt(prefStr); mAlarmTime = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmTime = " + intVal); Log.v(TAG, "updatePrefs() AlarmTime = " + mAlarmTime);
setDict.addUint16(KEY_ALARM_TIME, (short) intVal);
prefStr = SP.getString("AlarmThresh", "70"); prefStr = SP.getString("AlarmThresh", "70");
intVal = (short) Integer.parseInt(prefStr); mAlarmThresh = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmThresh = " + intVal); Log.v(TAG, "updatePrefs() AlarmThresh = " + mAlarmThresh);
setDict.addUint16(KEY_ALARM_THRESH, (short) intVal);
prefStr = SP.getString("AlarmRatioThresh", "30"); prefStr = SP.getString("AlarmRatioThresh", "30");
intVal = (short) Integer.parseInt(prefStr); mAlarmRatioThresh = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() AlarmRatioThresh = " + intVal); Log.v(TAG, "updatePrefs() AlarmRatioThresh = " + mAlarmRatioThresh);
setDict.addUint16(KEY_ALARM_RATIO_THRESH, (short) intVal);
boolean fallActiveBool = SP.getBoolean("FallActive", false); mFallActive = SP.getBoolean("FallActive", false);
Log.v(TAG, "updatePrefs() FallActive = " + fallActiveBool); Log.v(TAG, "updatePrefs() FallActive = " + mFallActive);
if (fallActiveBool)
setDict.addUint16(KEY_FALL_ACTIVE, (short) 1);
else
setDict.addUint16(KEY_FALL_ACTIVE, (short) 0);
prefStr = SP.getString("FallThreshMin", "200"); prefStr = SP.getString("FallThreshMin", "200");
intVal = (short) Integer.parseInt(prefStr); mFallThreshMin = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() FallThreshMin = " + intVal); Log.v(TAG, "updatePrefs() FallThreshMin = " + mFallThreshMin);
setDict.addUint16(KEY_FALL_THRESH_MIN, (short) intVal);
prefStr = SP.getString("FallThreshMax", "1200"); prefStr = SP.getString("FallThreshMax", "1200");
intVal = (short) Integer.parseInt(prefStr); mFallThreshMax = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() FallThreshMax = " + intVal); Log.v(TAG, "updatePrefs() FallThreshMax = " + mFallThreshMax);
setDict.addUint16(KEY_FALL_THRESH_MAX, (short) intVal);
prefStr = SP.getString("FallWindow", "1500"); prefStr = SP.getString("FallWindow", "1500");
intVal = (short) Integer.parseInt(prefStr); mFallWindow = (short) Integer.parseInt(prefStr);
Log.v(TAG, "updatePrefs() FallWindow = " + intVal); Log.v(TAG, "updatePrefs() FallWindow = " + mFallWindow);
setDict.addUint16(KEY_FALL_WINDOW, (short) intVal);
// Send Watch Settings to Pebble
Log.v(TAG, "updatePrefs() - setDict = " + setDict.toJsonString());
PebbleKit.sendDataToPebble(mContext, SD_UUID, setDict);
} catch (Exception ex) { } catch (Exception ex) {
Log.v(TAG, "updatePrefs() - Problem parsing preferences!"); 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); 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.alarmPhrase = "Unknown";
mSdData.haveData = true; mSdData.haveData = true;
mSdDataReceiver.onSdDataReceived(mSdData); mSdDataReceiver.onSdDataReceived(mSdData);
}
// Read the data that has been sent, and convert it into // Read the data that has been sent, and convert it into
// an integer array. // an integer array.
byte[] byteArr = data.getBytes(KEY_SPEC_DATA); byte[] byteArr = data.getBytes(KEY_SPEC_DATA);
if ((byteArr!=null) && (byteArr.length!=0)) { if ((byteArr != null) && (byteArr.length != 0)) {
IntBuffer intBuf = ByteBuffer.wrap(byteArr) IntBuffer intBuf = ByteBuffer.wrap(byteArr)
.order(ByteOrder.LITTLE_ENDIAN) .order(ByteOrder.LITTLE_ENDIAN)
.asIntBuffer(); .asIntBuffer();
@@ -358,9 +349,9 @@ public class SdDataSourcePebble extends SdDataSource {
mSdData.simpleSpec[i] = intArray[i]; mSdData.simpleSpec[i] = intArray[i];
} }
} else { } else {
Log.v(TAG,"***** zero length spectrum received - error!!!!"); Log.v(TAG, "***** zero length spectrum received - error!!!!");
} }
}
if (data.getUnsignedIntegerAsLong(KEY_DATA_TYPE) if (data.getUnsignedIntegerAsLong(KEY_DATA_TYPE)
== DATA_TYPE_SETTINGS) { == 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 * Will be received as a message by the receiveData handler
*/ */
public void getPebbleSdSettings() { public void getPebbleSdSettings() {
Log.v(TAG, "getPebbleSdSettings() - sending required settings to pebble");
sendPebbleSdSettings();
Log.v(TAG, "getPebbleSdSettings() - requesting settings from pebble"); Log.v(TAG, "getPebbleSdSettings() - requesting settings from pebble");
PebbleDictionary data = new PebbleDictionary(); PebbleDictionary data = new PebbleDictionary();
data.addUint8(KEY_SETTINGS, (byte) 1); data.addUint8(KEY_SETTINGS, (byte) 1);
@@ -429,6 +423,101 @@ public class SdDataSourcePebble extends SdDataSource {
data); 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. * Request Pebble App to send us its latest data.
* Will be received as a message by the receiveData handler * 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); setContentView(R.layout.startup_activity);
mUtil = new OsdUtil(this); 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); Button b = (Button)findViewById(R.id.settingsButton);
b.setOnClickListener(new View.OnClickListener() { b.setOnClickListener(new View.OnClickListener() {
@Override @Override

View File

@@ -20,9 +20,9 @@
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="Seizure Detector Settings"> <PreferenceCategory android:title="Seizure Detector Settings">
<EditTextPreference <EditTextPreference
android:defaultValue="5" android:defaultValue="3"
android:key="AlarmFreqMin" 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)" /> android:title="AlarmFreqMin (Hz)" />
<EditTextPreference <EditTextPreference
android:defaultValue="10" android:defaultValue="10"
@@ -47,7 +47,7 @@
<EditTextPreference <EditTextPreference
android:defaultValue="30" android:defaultValue="30"
android:key="AlarmRatioThresh" 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" /> android:title="AlarmRatioThresh" />
</PreferenceCategory> </PreferenceCategory>

View File

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

View File

@@ -7,5 +7,6 @@
# Location of the SDK. This is only used by Gradle. # Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the # For customization when using a Version Control System, please read the
# header note. # header note.
#Sat Apr 23 18:39:21 BST 2016 #Tue May 03 19:40:01 BST 2016
sdk.dir=/home/graham/Android/Sdk ndk.dir=/usr/local/android-sdk-linux/ndk-bundle
sdk.dir=/usr/local/android-sdk-linux