bthrm - Allow scanning for sensors in settings

pull/1554/head
Martin Boonk 2022-03-09 20:30:39 +01:00
parent 24a0496109
commit 7250f4f230
4 changed files with 118 additions and 54 deletions

View File

@ -20,3 +20,4 @@
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 Adds some preset modes and a custom one
Restructure the settings menu Restructure the settings menu
0.08: Allow scanning for devices in settings

View File

@ -23,7 +23,10 @@
} }
function getCache(){ function getCache(){
return require('Storage').readJSON("bthrm.cache.json", true) || {}; var cache = require('Storage').readJSON("bthrm.cache.json", true) || {};
if (settings.btname && settings.btname == cache.name) return cache;
clearCache();
return {};
} }
function addNotificationHandler(characteristic){ function addNotificationHandler(characteristic){
@ -361,7 +364,13 @@
var promise; var promise;
if (!device){ if (!device){
promise = NRF.requestDevice({ filters: serviceFilters }); var filters = serviceFilters;
if (settings.btname){
log("Configured device name", settings.btname);
filters = [{name: settings.btname}];
}
log("Requesting device with filters", filters);
promise = NRF.requestDevice({ filters: filters });
if (settings.gracePeriodRequest){ if (settings.gracePeriodRequest){
log("Add " + settings.gracePeriodRequest + "ms grace period after request"); log("Add " + settings.gracePeriodRequest + "ms grace period after request");
@ -488,11 +497,15 @@
if (gatt) { if (gatt) {
if (gatt.connected){ if (gatt.connected){
log("Disconnect with gatt: ", gatt); log("Disconnect with gatt: ", gatt);
gatt.disconnect().then(()=>{ try{
log("Successful disconnect"); gatt.disconnect().then(()=>{
}).catch((e)=>{ log("Successful disconnect");
log("Error during disconnect", e); }).catch((e)=>{
}); log("Error during disconnect promise", e);
});
} catch (e){
log("Error during disconnect attempt", e);
}
} }
} }
} }

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.07", "version": "0.08",
"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

@ -17,54 +17,73 @@
var settings; var settings;
readSettings(); readSettings();
var mainmenu = { function buildMainMenu(){
'': { 'title': 'Bluetooth HRM' }, var mainmenu = {
'< Back': back, '': { 'title': 'Bluetooth HRM' },
'Mode': { '< Back': back,
value: 0 | settings.mode, 'Mode': {
min: 0, value: 0 | settings.mode,
max: 3, min: 0,
format: v => ["Off", "Default", "Both", "Custom"][v], max: 3,
onchange: v => { format: v => ["Off", "Default", "Both", "Custom"][v],
settings.mode = v; onchange: v => {
switch (v){ settings.mode = v;
case 0: switch (v){
writeSettings("enabled",false); case 0:
break; writeSettings("enabled",false);
case 1: break;
writeSettings("enabled",true); case 1:
writeSettings("replace",true); writeSettings("enabled",true);
writeSettings("debuglog",false); writeSettings("replace",true);
writeSettings("startWithHrm",true); writeSettings("debuglog",false);
writeSettings("allowFallback",true); writeSettings("startWithHrm",true);
writeSettings("fallbackTimeout",10); writeSettings("allowFallback",true);
break; writeSettings("fallbackTimeout",10);
case 2: break;
writeSettings("enabled",true); case 2:
writeSettings("replace",false); writeSettings("enabled",true);
writeSettings("debuglog",false); writeSettings("replace",false);
writeSettings("startWithHrm",false); writeSettings("debuglog",false);
writeSettings("allowFallback",false); writeSettings("startWithHrm",false);
break; writeSettings("allowFallback",false);
case 3: break;
writeSettings("enabled",true); case 3:
writeSettings("replace",settings.custom_replace); writeSettings("enabled",true);
writeSettings("debuglog",settings.custom_debuglog); writeSettings("replace",settings.custom_replace);
writeSettings("startWithHrm",settings.custom_startWithHrm); writeSettings("debuglog",settings.custom_debuglog);
writeSettings("allowFallback",settings.custom_allowFallback); writeSettings("startWithHrm",settings.custom_startWithHrm);
writeSettings("fallbackTimeout",settings.custom_fallbackTimeout); writeSettings("allowFallback",settings.custom_allowFallback);
break; writeSettings("fallbackTimeout",settings.custom_fallbackTimeout);
break;
}
writeSettings("mode",v);
} }
writeSettings("mode",v);
} }
}, };
'Custom Mode': function() { E.showMenu(submenu_custom); },
'Debug': function() { E.showMenu(submenu_debug); } if (settings.btname){
}; var name = "Clear " + settings.btname;
mainmenu[name] = function() {
E.showPrompt("Clear current device name?").then((r)=>{
if (r) {
writeSettings("btname",undefined);
}
E.showMenu(buildMainMenu());
});
};
}
mainmenu["BLE Scan"] = ()=> createMenuFromScan();
mainmenu["Custom Mode"] = function() { E.showMenu(submenu_custom); };
mainmenu.Debug = function() { E.showMenu(submenu_debug); };
return mainmenu;
}
var submenu_debug = { var submenu_debug = {
'' : { title: "Debug"}, '' : { title: "Debug"},
'< Back': function() { E.showMenu(mainmenu); }, '< Back': function() { E.showMenu(buildMainMenu()); },
'Alert on disconnect': { 'Alert on disconnect': {
value: !!settings.warnDisconnect, value: !!settings.warnDisconnect,
format: v => settings.warnDisconnect ? "On" : "Off", format: v => settings.warnDisconnect ? "On" : "Off",
@ -81,10 +100,41 @@
}, },
'Grace periods': function() { E.showMenu(submenu_grace); } 'Grace periods': function() { E.showMenu(submenu_grace); }
}; };
function createMenuFromScan(){
E.showMenu();
E.showMessage("Scanning");
var submenu_scan = {
'' : { title: "Scan"},
'< Back': function() { E.showMenu(buildMainMenu()); }
};
var packets=10;
var scanStart=Date.now();
NRF.setScan(function(d) {
packets--;
if (packets<=0 || Date.now() - scanStart > 5000){
NRF.setScan();
E.showMenu(submenu_scan);
} else if (d.name){
print("Found device", d);
submenu_scan[d.name] = function(){
E.showPrompt("Set "+d.name+"?").then((r)=>{
if (r) {
writeSettings("btname",d.name);
}
E.showMenu(buildMainMenu());
});
};
}
}, { filters: [{services: [ "180d" ]}]});
}
var submenu_custom = { var submenu_custom = {
'' : { title: "Custom mode"}, '' : { title: "Custom mode"},
'< Back': function() { E.showMenu(mainmenu); }, '< Back': function() { E.showMenu(buildMainMenu()); },
'Replace HRM': { 'Replace HRM': {
value: !!settings.custom_replace, value: !!settings.custom_replace,
format: v => settings.custom_replace ? "On" : "Off", format: v => settings.custom_replace ? "On" : "Off",
@ -165,7 +215,7 @@
var submenu = { var submenu = {
'' : { title: "Grace periods"}, '' : { title: "Grace periods"},
'< Back': function() { E.showMenu(mainmenu); }, '< Back': function() { E.showMenu(buildMainMenu()); },
'Request': { 'Request': {
value: settings.gracePeriodRequest, value: settings.gracePeriodRequest,
min: 0, min: 0,
@ -208,5 +258,5 @@
} }
}; };
E.showMenu(mainmenu); E.showMenu(buildMainMenu());
}) })