From 6267745152d57d5912210b056df1d21c2fa7b268 Mon Sep 17 00:00:00 2001 From: Graham Jones Date: Sun, 8 May 2016 10:43:21 +0100 Subject: [PATCH] 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? --- .gitignore | 2 + app/src/main/AndroidManifest.xml | 4 +- .../uk/org/openseizuredetector/SdData.java | 7 + .../SdDataSourcePebble.java | 199 +++++++++++++----- .../openseizuredetector/StartupActivity.java | 8 + .../main/res/xml/pebble_datasource_prefs.xml | 6 +- build.gradle | 2 +- local.properties | 5 +- 8 files changed, 170 insertions(+), 63 deletions(-) diff --git a/.gitignore b/.gitignore index 128a207..429ea8a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ build .gradle .idea +local.properties +app/app-release.apk app/build app/app.iml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 89b4f24..01016aa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="25" + android:versionName="2.0.4" > diff --git a/app/src/main/java/uk/org/openseizuredetector/SdData.java b/app/src/main/java/uk/org/openseizuredetector/SdData.java index 282710e..fde9b08 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdData.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdData.java @@ -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; diff --git a/app/src/main/java/uk/org/openseizuredetector/SdDataSourcePebble.java b/app/src/main/java/uk/org/openseizuredetector/SdDataSourcePebble.java index ee498ce..36a09f5 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdDataSourcePebble.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdDataSourcePebble.java @@ -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 diff --git a/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java b/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java index 66a64d8..05f5657 100644 --- a/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java @@ -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 diff --git a/app/src/main/res/xml/pebble_datasource_prefs.xml b/app/src/main/res/xml/pebble_datasource_prefs.xml index 7cd83ae..f0c7d0b 100644 --- a/app/src/main/res/xml/pebble_datasource_prefs.xml +++ b/app/src/main/res/xml/pebble_datasource_prefs.xml @@ -20,9 +20,9 @@ diff --git a/build.gradle b/build.gradle index 93ed0d9..f6dda36 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0' + classpath 'com.android.tools.build:gradle:2.1.0' } } allprojects { diff --git a/local.properties b/local.properties index 7e7f3cb..900d5b0 100644 --- a/local.properties +++ b/local.properties @@ -7,5 +7,6 @@ # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. -#Sat Apr 23 18:39:21 BST 2016 -sdk.dir=/home/graham/Android/Sdk +#Tue May 03 19:40:01 BST 2016 +ndk.dir=/usr/local/android-sdk-linux/ndk-bundle +sdk.dir=/usr/local/android-sdk-linux