mirror of https://github.com/espruino/BangleApps
bthrm - Allow scanning for sensors in settings
parent
24a0496109
commit
7250f4f230
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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());
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue