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