bthrm - Implement mode selection

master
Martin Boonk 2022-02-13 18:05:21 +01:00
parent 8d0c4a904c
commit c58a23f3be
6 changed files with 121 additions and 149 deletions

View File

@ -18,3 +18,5 @@
Fix bug if no connection data was cached Fix bug if no connection data was cached
Fix error during disconnect Fix error during disconnect
0.07: Recorder icon only blue if values actually arive 0.07: Recorder icon only blue if values actually arive
Adds some preset modes and a custom one
Restructure the settings menu

View File

@ -29,6 +29,7 @@ Heart Rate Service (`180D`) and characteristic (`2A37`).
So far it has been tested on: So far it has been tested on:
* CooSpo Bluetooth Heart Rate Monitor * CooSpo Bluetooth Heart Rate Monitor
* Wahoo TICKR X 2
## Internals ## Internals
@ -36,7 +37,6 @@ This replaces `Bangle.setHRMPower` with its own implementation.
## TODO ## 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? * A widget to show connection state?
* Specify a specific device by address? * Specify a specific device by address?

View File

@ -548,9 +548,7 @@
E.on("kill", ()=>{ E.on("kill", ()=>{
if (gatt && gatt.connected){ if (gatt && gatt.connected){
log("Got killed, trying to disconnect"); log("Got killed, trying to disconnect");
var promise = gatt.disconnect(); var promise = gatt.disconnect().then(()=>log("Disconnected on kill")).catch((e)=>log("Error during disconnnect on kill", e));
promise.then(()=>log("Disconnected on kill"));
promise.catch((e)=>log("Error during disconnnect on kill", e));
} }
}); });
} }

View File

@ -1,4 +1,5 @@
{ {
"mode": 1,
"enabled": true, "enabled": true,
"replace": true, "replace": true,
"debuglog": false, "debuglog": false,
@ -6,6 +7,12 @@
"allowFallback": true, "allowFallback": true,
"warnDisconnect": false, "warnDisconnect": false,
"fallbackTimeout": 10, "fallbackTimeout": 10,
"custom_replace": false,
"custom_debuglog": false,
"custom_startWithHrm": false,
"custom_allowFallback": false,
"custom_warnDisconnect": false,
"custom_fallbackTimeout": 10,
"gracePeriodNotification": 0, "gracePeriodNotification": 0,
"gracePeriodConnect": 0, "gracePeriodConnect": 0,
"gracePeriodService": 0, "gracePeriodService": 0,

View File

@ -2,7 +2,7 @@
"id": "bthrm", "id": "bthrm",
"name": "Bluetooth Heart Rate Monitor", "name": "Bluetooth Heart Rate Monitor",
"shortName": "BT HRM", "shortName": "BT HRM",
"version": "0.06", "version": "0.07",
"description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.", "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.",
"icon": "app.png", "icon": "app.png",
"type": "app", "type": "app",

View File

@ -20,182 +20,147 @@
var mainmenu = { var mainmenu = {
'': { 'title': 'Bluetooth HRM' }, '': { 'title': 'Bluetooth HRM' },
'< Back': back, '< Back': back,
'Use BT HRM': { 'Mode': {
value: !!settings.enabled, value: 0 | settings.mode,
format: v => settings.enabled ? "On" : "Off", min: 0,
max: 3,
format: v => ["Off", "Default", "Both", "Custom"][v],
onchange: 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': { 'Custom Mode': function() { E.showMenu(submenu_custom); },
value: !!settings.replace, 'Debug': function() { E.showMenu(submenu_debug); }
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();
}
function readSettings(){ var submenu_debug = {
settings = Object.assign( '' : { title: "Debug"},
require('Storage').readJSON("bthrm.default.json", true) || {}, '< Back': function() { E.showMenu(mainmenu); },
require('Storage').readJSON(FILE, true) || {} 'Alert on disconnect': {
); value: !!settings.warnDisconnect,
} format: v => settings.warnDisconnect ? "On" : "Off",
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",
onchange: v => { onchange: v => {
writeSettings("enabled",v); writeSettings("warnDisconnect",v);
} }
}, },
'Replace HRM': { 'Debug log': {
value: !!settings.replace, value: !!settings.debuglog,
format: v => settings.replace ? "On" : "Off", format: v => settings.debuglog ? "On" : "Off",
onchange: v => { 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': { 'Start w. HRM': {
value: !!settings.startWithHrm, value: !!settings.custom_startWithHrm,
format: v => settings.startWithHrm ? "On" : "Off", format: v => settings.custom_startWithHrm ? "On" : "Off",
onchange: v => { onchange: v => {
writeSettings("startWithHrm",v); writeSettings("custom_startWithHrm",v);
} }
}, },
'HRM Fallback': { 'HRM Fallback': {
value: !!settings.allowFallback, value: !!settings.custom_allowFallback,
format: v => settings.allowFallback ? "On" : "Off", format: v => settings.custom_allowFallback ? "On" : "Off",
onchange: v => { onchange: v => {
writeSettings("allowFallback",v); writeSettings("custom_allowFallback",v);
} }
}, },
'Fallback Timeout': { 'Fallback Timeout': {
value: settings.fallbackTimeout, value: settings.custom_fallbackTimeout,
min: 5, min: 5,
max: 60, max: 60,
step: 5, step: 5,
format: v=>v+"s", format: v=>v+"s",
onchange: v => { 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 => { onchange: v => {
writeSettings("warnDisconnect",v); writeSettings("gracePeriodRequest",v);
} }
}, },
'Debug log': { 'Connect': {
value: !!settings.debuglog, value: settings.gracePeriodConnect,
format: v => settings.debuglog ? "On" : "Off", min: 0,
max: 3000,
step: 100,
format: v=>v+"ms",
onchange: v => { onchange: v => {
writeSettings("debuglog",v); writeSettings("gracePeriodConnect",v);
} }
}, },
'Grace periods >': function() { E.showMenu(submenu); } 'Notification': {
}; value: settings.gracePeriodNotification,
min: 0,
var submenu = { max: 3000,
'' : { title: "Grace periods"}, step: 100,
'< Back': function() { E.showMenu(mainmenu); }, format: v=>v+"ms",
'Request': { onchange: v => {
value: settings.gracePeriodRequest, writeSettings("gracePeriodNotification",v);
min: 0, }
max: 3000, },
step: 100, 'Service': {
format: v=>v+"ms", value: settings.gracePeriodService,
onchange: v => { min: 0,
writeSettings("gracePeriodRequest",v); max: 3000,
} step: 100,
}, format: v=>v+"ms",
'Connect': { onchange: v => {
value: settings.gracePeriodConnect, writeSettings("gracePeriodService",v);
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); }
}; };
var submenu = { var submenu = {