diff --git a/apps/bthrm/ChangeLog b/apps/bthrm/ChangeLog index d4b2f4615..58d002f22 100644 --- a/apps/bthrm/ChangeLog +++ b/apps/bthrm/ChangeLog @@ -18,3 +18,5 @@ Fix bug if no connection data was cached Fix error during disconnect 0.07: Recorder icon only blue if values actually arive + Adds some preset modes and a custom one + Restructure the settings menu diff --git a/apps/bthrm/README.md b/apps/bthrm/README.md index f0c7775c2..42ad619bd 100644 --- a/apps/bthrm/README.md +++ b/apps/bthrm/README.md @@ -29,6 +29,7 @@ Heart Rate Service (`180D`) and characteristic (`2A37`). So far it has been tested on: * CooSpo Bluetooth Heart Rate Monitor +* Wahoo TICKR X 2 ## Internals @@ -36,7 +37,6 @@ This replaces `Bangle.setHRMPower` with its own implementation. ## TODO -* Maybe a `bthrm.settings.js` and app (that calls it) to enable it to be turned on and off * A widget to show connection state? * Specify a specific device by address? diff --git a/apps/bthrm/boot.js b/apps/bthrm/boot.js index 6ac6382d6..339f6f8c6 100644 --- a/apps/bthrm/boot.js +++ b/apps/bthrm/boot.js @@ -548,9 +548,7 @@ E.on("kill", ()=>{ if (gatt && gatt.connected){ log("Got killed, trying to disconnect"); - var promise = gatt.disconnect(); - promise.then(()=>log("Disconnected on kill")); - promise.catch((e)=>log("Error during disconnnect on kill", e)); + var promise = gatt.disconnect().then(()=>log("Disconnected on kill")).catch((e)=>log("Error during disconnnect on kill", e)); } }); } diff --git a/apps/bthrm/default.json b/apps/bthrm/default.json index c973eef25..64e638b8a 100644 --- a/apps/bthrm/default.json +++ b/apps/bthrm/default.json @@ -1,4 +1,5 @@ { + "mode": 1, "enabled": true, "replace": true, "debuglog": false, @@ -6,6 +7,12 @@ "allowFallback": true, "warnDisconnect": false, "fallbackTimeout": 10, + "custom_replace": false, + "custom_debuglog": false, + "custom_startWithHrm": false, + "custom_allowFallback": false, + "custom_warnDisconnect": false, + "custom_fallbackTimeout": 10, "gracePeriodNotification": 0, "gracePeriodConnect": 0, "gracePeriodService": 0, diff --git a/apps/bthrm/metadata.json b/apps/bthrm/metadata.json index 943e3635c..1c21269e2 100644 --- a/apps/bthrm/metadata.json +++ b/apps/bthrm/metadata.json @@ -2,7 +2,7 @@ "id": "bthrm", "name": "Bluetooth Heart Rate Monitor", "shortName": "BT HRM", - "version": "0.06", + "version": "0.07", "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.", "icon": "app.png", "type": "app", diff --git a/apps/bthrm/settings.js b/apps/bthrm/settings.js index 62d2e7ea3..beefb00e9 100644 --- a/apps/bthrm/settings.js +++ b/apps/bthrm/settings.js @@ -20,182 +20,147 @@ var mainmenu = { '': { 'title': 'Bluetooth HRM' }, '< Back': back, - 'Use BT HRM': { - value: !!settings.enabled, - format: v => settings.enabled ? "On" : "Off", + 'Mode': { + value: 0 | settings.mode, + min: 0, + max: 3, + format: v => ["Off", "Default", "Both", "Custom"][v], onchange: v => { - writeSettings("enabled",v); + settings.mode = v; + switch (v){ + case 0: + writeSettings("enabled",false); + break; + case 1: + writeSettings("enabled",true); + writeSettings("replace",true); + writeSettings("debuglog",false); + writeSettings("startWithHrm",true); + writeSettings("allowFallback",true); + writeSettings("fallbackTimeout",10); + break; + case 2: + writeSettings("enabled",true); + writeSettings("replace",false); + writeSettings("debuglog",false); + writeSettings("startWithHrm",false); + writeSettings("allowFallback",false); + break; + case 3: + writeSettings("enabled",true); + writeSettings("replace",settings.custom_replace); + writeSettings("debuglog",settings.custom_debuglog); + writeSettings("startWithHrm",settings.custom_startWithHrm); + writeSettings("allowFallback",settings.custom_allowFallback); + writeSettings("fallbackTimeout",settings.custom_fallbackTimeout); + break; + } + writeSettings("mode",v); } }, - 'Replace HRM': { - value: !!settings.replace, - format: v => settings.replace ? "On" : "Off", - onchange: v => { - writeSettings("replace",v); - } - }, - 'Start with HRM': { - value: !!settings.startWithHrm, - format: v => settings.startWithHrm ? "On" : "Off", - onchange: v => {(function(back) { - function writeSettings(key, value) { - var s = require('Storage').readJSON(FILE, true) || {}; - s[key] = value; - require('Storage').writeJSON(FILE, s); - readSettings(); - } + 'Custom Mode': function() { E.showMenu(submenu_custom); }, + 'Debug': function() { E.showMenu(submenu_debug); } + }; - function readSettings(){ - settings = Object.assign( - require('Storage').readJSON("bthrm.default.json", true) || {}, - require('Storage').readJSON(FILE, true) || {} - ); - } - - var FILE="bthrm.json"; - var settings; - readSettings(); - - var mainmenu = { - '': { 'title': 'Bluetooth HRM' }, - '< Back': back, - 'Use BT HRM': { - value: !!settings.enabled, - format: v => settings.enabled ? "On" : "Off", + var submenu_debug = { + '' : { title: "Debug"}, + '< Back': function() { E.showMenu(mainmenu); }, + 'Alert on disconnect': { + value: !!settings.warnDisconnect, + format: v => settings.warnDisconnect ? "On" : "Off", onchange: v => { - writeSettings("enabled",v); + writeSettings("warnDisconnect",v); } }, - 'Replace HRM': { - value: !!settings.replace, - format: v => settings.replace ? "On" : "Off", + 'Debug log': { + value: !!settings.debuglog, + format: v => settings.debuglog ? "On" : "Off", onchange: v => { - writeSettings("replace",v); + writeSettings("debuglog",v); + } + }, + 'Grace periods': function() { E.showMenu(submenu_grace); } + }; + + var submenu_custom = { + '' : { title: "Custom mode"}, + '< Back': function() { E.showMenu(mainmenu); }, + 'Replace HRM': { + value: !!settings.custom_replace, + format: v => settings.custom_replace ? "On" : "Off", + onchange: v => { + writeSettings("custom_replace",v); } }, 'Start w. HRM': { - value: !!settings.startWithHrm, - format: v => settings.startWithHrm ? "On" : "Off", + value: !!settings.custom_startWithHrm, + format: v => settings.custom_startWithHrm ? "On" : "Off", onchange: v => { - writeSettings("startWithHrm",v); + writeSettings("custom_startWithHrm",v); } }, 'HRM Fallback': { - value: !!settings.allowFallback, - format: v => settings.allowFallback ? "On" : "Off", + value: !!settings.custom_allowFallback, + format: v => settings.custom_allowFallback ? "On" : "Off", onchange: v => { - writeSettings("allowFallback",v); + writeSettings("custom_allowFallback",v); } }, 'Fallback Timeout': { - value: settings.fallbackTimeout, + value: settings.custom_fallbackTimeout, min: 5, max: 60, step: 5, format: v=>v+"s", onchange: v => { - writeSettings("fallbackTimout",v*1000); + writeSettings("custom_fallbackTimout",v*1000); } }, - 'Conn. Alert': { - value: !!settings.warnDisconnect, - format: v => settings.warnDisconnect ? "On" : "Off", + }; + + var submenu_grace = { + '' : { title: "Grace periods"}, + '< Back': function() { E.showMenu(submenu_debug); }, + 'Request': { + value: settings.gracePeriodRequest, + min: 0, + max: 3000, + step: 100, + format: v=>v+"ms", onchange: v => { - writeSettings("warnDisconnect",v); + writeSettings("gracePeriodRequest",v); } }, - 'Debug log': { - value: !!settings.debuglog, - format: v => settings.debuglog ? "On" : "Off", + 'Connect': { + value: settings.gracePeriodConnect, + min: 0, + max: 3000, + step: 100, + format: v=>v+"ms", onchange: v => { - writeSettings("debuglog",v); + writeSettings("gracePeriodConnect",v); } }, - 'Grace periods >': function() { E.showMenu(submenu); } - }; - - var submenu = { - '' : { title: "Grace periods"}, - '< Back': function() { E.showMenu(mainmenu); }, - 'Request': { - value: settings.gracePeriodRequest, - min: 0, - max: 3000, - step: 100, - format: v=>v+"ms", - onchange: v => { - writeSettings("gracePeriodRequest",v); - } - }, - 'Connect': { - value: settings.gracePeriodConnect, - min: 0, - max: 3000, - step: 100, - format: v=>v+"ms", - onchange: v => { - writeSettings("gracePeriodConnect",v); - } - }, - 'Notification': { - value: settings.gracePeriodNotification, - min: 0, - max: 3000, - step: 100, - format: v=>v+"ms", - onchange: v => { - writeSettings("gracePeriodNotification",v); - } - }, - 'Service': { - value: settings.gracePeriodService, - min: 0, - max: 3000, - step: 100, - format: v=>v+"ms", - onchange: v => { - writeSettings("gracePeriodService",v); - } - } - }; - - E.showMenu(mainmenu); -}) - writeSettings("startWithHrm",v); - } - }, - 'Fallback to HRM': { - value: !!settings.allowFallback, - format: v => settings.allowFallback ? "On" : "Off", - onchange: v => { - writeSettings("allowFallback",v); - } - }, - 'Fallback Timeout': { - value: settings.fallbackTimeout, - min: 5, - max: 60, - step: 5, - format: v=>v+"s", - onchange: v => { - writeSettings("fallbackTimout",v*1000); - } - }, - 'Conn. Alert': { - value: !!settings.warnDisconnect, - format: v => settings.warnDisconnect ? "On" : "Off", - onchange: v => { - writeSettings("warnDisconnect",v); - } - }, - 'Debug log': { - value: !!settings.debuglog, - format: v => settings.debuglog ? "On" : "Off", - onchange: v => { - writeSettings("debuglog",v); - } - }, - 'Grace periods': function() { E.showMenu(submenu); } + 'Notification': { + value: settings.gracePeriodNotification, + min: 0, + max: 3000, + step: 100, + format: v=>v+"ms", + onchange: v => { + writeSettings("gracePeriodNotification",v); + } + }, + 'Service': { + value: settings.gracePeriodService, + min: 0, + max: 3000, + step: 100, + format: v=>v+"ms", + onchange: v => { + writeSettings("gracePeriodService",v); + } + } }; var submenu = {