bthrm - Implement mode selection
parent
8d0c4a904c
commit
c58a23f3be
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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?
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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 = {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue