From e38c7832c674ab7bb11a65edb6a271aadcefb6a7 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 2 Jul 2022 09:46:10 +0200 Subject: [PATCH] bthrm - Better mechanism for HRM fallback --- apps/bthrm/boot.js | 62 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/apps/bthrm/boot.js b/apps/bthrm/boot.js index 81d837bdc..b7f0dcbbd 100644 --- a/apps/bthrm/boot.js +++ b/apps/bthrm/boot.js @@ -94,13 +94,24 @@ "0x180f", // Battery ]; + var bpmTimeout; + var supportedCharacteristics = { "0x2a37": { //Heart rate measurement + active: false, handler: function (dv){ var flags = dv.getUint8(0); 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; @@ -202,6 +213,10 @@ }; if (settings.enabled){ + Bangle.isBTHRMActive = function (){ + return supportedCharacteristics["0x2a37"].active; + }; + Bangle.isBTHRMOn = function(){ return (Bangle._PWR && Bangle._PWR.BTHRM && Bangle._PWR.BTHRM.length > 0); }; @@ -263,7 +278,8 @@ log("GATT", gatt); log("Characteristics", characteristics); clearRetryTimeout(); - switchInternalHrm(); + supportedCharacteristics["0x2a37"].active = false; + startFallback(); blockInit = false; if (settings.warnDisconnect && !buzzing){ buzzing = true; @@ -496,7 +512,7 @@ isOn = Bangle._PWR.BTHRM.length; // so now we know if we're really on if (isOn) { - switchInternalHrm(); + switchFallback(); if (!Bangle.isBTHRMConnected()) initBt(); } else { // not on log("Power off for " + app); @@ -543,7 +559,7 @@ }; } - + var origSetHRMPower = Bangle.setHRMPower; if (settings.startWithHrm){ @@ -559,28 +575,38 @@ }; } - var fallbackInterval; var fallbackActive = false; + var inSwitch = false; - var switchInternalHrm = function() { - log("Try falling back to HRM"); - if (!fallbackActive && Bangle.isBTHRMOn() && settings.allowFallback && !fallbackInterval){ - log("Fallback to HRM enabled"); + var stopFallback = function(){ + if (fallbackActive){ + origSetHRMPower(0, "bthrm_fallback"); + fallbackActive = false; + log("Fallback to HRM disabled"); + } + }; + + var startFallback = function(){ + if (!fallbackActive && settings.allowFallback) { fallbackActive = true; origSetHRMPower(1, "bthrm_fallback"); - fallbackInterval = setInterval(()=>{ - 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); + log("Fallback to HRM enabled"); } }; + var switchFallback = function() { + log("Check falling back to HRM"); + if (!inSwitch){ + inSwitch = true; + if (Bangle.isBTHRMActive()){ + stopFallback(); + } else { + startFallback(); + } + } + inSwitch = false; + }; + if (settings.replace){ log("Replace HRM event"); if (Bangle._PWR && Bangle._PWR.HRM){