bthrm - Better mechanism for HRM fallback

master
Martin Boonk 2022-07-02 09:46:10 +02:00
parent 26a8940af0
commit e38c7832c6
1 changed files with 44 additions and 18 deletions

View File

@ -94,13 +94,24 @@
"0x180f", // Battery "0x180f", // Battery
]; ];
var bpmTimeout;
var supportedCharacteristics = { var supportedCharacteristics = {
"0x2a37": { "0x2a37": {
//Heart rate measurement //Heart rate measurement
active: false,
handler: function (dv){ handler: function (dv){
var flags = dv.getUint8(0); var flags = dv.getUint8(0);
var bpm = (flags & 1) ? (dv.getUint16(1) / 100 /* ? */ ) : dv.getUint8(1); // 8 or 16 bit var bpm = (flags & 1) ? (dv.getUint16(1) / 100 /* ? */ ) : dv.getUint8(1); // 8 or 16 bit
supportedCharacteristics["0x2a37"].active = bpm > 0;
log("BTHRM BPM " + supportedCharacteristics["0x2a37"].active);
if (supportedCharacteristics["0x2a37"].active) stopFallback();
if (bpmTimeout) clearTimeout(bpmTimeout);
bpmTimeout = setTimeout(()=>{
supportedCharacteristics["0x2a37"].active = false;
startFallback();
}, 3000);
var sensorContact; var sensorContact;
@ -202,6 +213,10 @@
}; };
if (settings.enabled){ if (settings.enabled){
Bangle.isBTHRMActive = function (){
return supportedCharacteristics["0x2a37"].active;
};
Bangle.isBTHRMOn = function(){ Bangle.isBTHRMOn = function(){
return (Bangle._PWR && Bangle._PWR.BTHRM && Bangle._PWR.BTHRM.length > 0); return (Bangle._PWR && Bangle._PWR.BTHRM && Bangle._PWR.BTHRM.length > 0);
}; };
@ -263,7 +278,8 @@
log("GATT", gatt); log("GATT", gatt);
log("Characteristics", characteristics); log("Characteristics", characteristics);
clearRetryTimeout(); clearRetryTimeout();
switchInternalHrm(); supportedCharacteristics["0x2a37"].active = false;
startFallback();
blockInit = false; blockInit = false;
if (settings.warnDisconnect && !buzzing){ if (settings.warnDisconnect && !buzzing){
buzzing = true; buzzing = true;
@ -496,7 +512,7 @@
isOn = Bangle._PWR.BTHRM.length; isOn = Bangle._PWR.BTHRM.length;
// so now we know if we're really on // so now we know if we're really on
if (isOn) { if (isOn) {
switchInternalHrm(); switchFallback();
if (!Bangle.isBTHRMConnected()) initBt(); if (!Bangle.isBTHRMConnected()) initBt();
} else { // not on } else { // not on
log("Power off for " + app); log("Power off for " + app);
@ -543,7 +559,7 @@
}; };
} }
var origSetHRMPower = Bangle.setHRMPower; var origSetHRMPower = Bangle.setHRMPower;
if (settings.startWithHrm){ if (settings.startWithHrm){
@ -559,28 +575,38 @@
}; };
} }
var fallbackInterval;
var fallbackActive = false; var fallbackActive = false;
var inSwitch = false;
var switchInternalHrm = function() { var stopFallback = function(){
log("Try falling back to HRM"); if (fallbackActive){
if (!fallbackActive && Bangle.isBTHRMOn() && settings.allowFallback && !fallbackInterval){ origSetHRMPower(0, "bthrm_fallback");
log("Fallback to HRM enabled"); fallbackActive = false;
log("Fallback to HRM disabled");
}
};
var startFallback = function(){
if (!fallbackActive && settings.allowFallback) {
fallbackActive = true; fallbackActive = true;
origSetHRMPower(1, "bthrm_fallback"); origSetHRMPower(1, "bthrm_fallback");
fallbackInterval = setInterval(()=>{ log("Fallback to HRM enabled");
log("Still in HRM fallback");
if (Bangle.isBTHRMConnected() || !Bangle.isBTHRMOn()){
origSetHRMPower(0, "bthrm_fallback");
clearInterval(fallbackInterval);
fallbackInterval = undefined;
fallbackActive = false;
log("Fallback to HRM disabled");
}
}, settings.fallbackTimeout * 1000);
} }
}; };
var switchFallback = function() {
log("Check falling back to HRM");
if (!inSwitch){
inSwitch = true;
if (Bangle.isBTHRMActive()){
stopFallback();
} else {
startFallback();
}
}
inSwitch = false;
};
if (settings.replace){ if (settings.replace){
log("Replace HRM event"); log("Replace HRM event");
if (Bangle._PWR && Bangle._PWR.HRM){ if (Bangle._PWR && Bangle._PWR.HRM){