From 63c87a95d0c50f606d934b391fbab5f6d7b453dc Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 12 Nov 2022 22:47:03 +0100 Subject: [PATCH 1/5] bthrm - Fix recording internal sensor --- apps/bthrm/recorder.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/apps/bthrm/recorder.js b/apps/bthrm/recorder.js index ed36b5aef..fcfed47c3 100644 --- a/apps/bthrm/recorder.js +++ b/apps/bthrm/recorder.js @@ -38,35 +38,32 @@ recorders.hrmint = function() { var active = false; var bpmTimeout; - var bpm = "", bpmConfidence = "", src=""; + var bpm = "", bpmConfidence = ""; function onHRM(h) { bpmConfidence = h.confidence; bpm = h.bpm; - srv = h.src; if (h.bpm > 0){ active = true; - print("active" + h.bpm); if (bpmTimeout) clearTimeout(bpmTimeout); bpmTimeout = setTimeout(()=>{ - print("inactive"); active = false; },3000); } } return { name : "HR int", - fields : ["Heartrate", "Confidence"], + fields : ["Int Heartrate", "Int Confidence"], getValues : () => { - var r = [bpm,bpmConfidence,src]; - bpm = ""; bpmConfidence = ""; src=""; + var r = [bpm,bpmConfidence]; + bpm = ""; bpmConfidence = ""; return r; }, start : () => { - Bangle.origOn('HRM', onHRM); + Bangle.on('HRM_int', onHRM); if (Bangle.origSetHRMPower) Bangle.origSetHRMPower(1,"recorder"); }, stop : () => { - Bangle.removeListener('HRM', onHRM); + Bangle.removeListener('HRM_int', onHRM); if (Bangle.origSetHRMPower) Bangle.origSetHRMPower(0,"recorder"); }, draw : (x,y) => g.setColor(( Bangle.origIsHRMOn && Bangle.origIsHRMOn() && active)?"#0f0":"#8f8").drawImage(atob("DAwBAAAAMMeef+f+f+P8H4DwBgAA"),x,y) From 08de2c9ad670d3943f6789a7a9d466a00173ea2f Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 12 Nov 2022 23:14:55 +0100 Subject: [PATCH 2/5] bthrm - Handle fallback consistently if bt bpm is 0 --- apps/bthrm/lib.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/bthrm/lib.js b/apps/bthrm/lib.js index 13e8b0383..291976b33 100644 --- a/apps/bthrm/lib.js +++ b/apps/bthrm/lib.js @@ -106,7 +106,7 @@ exports.enable = () => { 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(); + switchFallback(); if (bpmTimeout) clearTimeout(bpmTimeout); bpmTimeout = setTimeout(()=>{ bpmTimeout = undefined; @@ -148,14 +148,14 @@ exports.enable = () => { battery = lastReceivedData["0x180f"]["0x2a19"]; } - if (settings.replace){ + if (settings.replace && bpm > 0){ var repEvent = { bpm: bpm, confidence: (sensorContact || sensorContact === undefined)? 100 : 0, src: "bthrm" }; - log("Emitting aggregated HRM", repEvent); + log("Emitting HRM_R(bt)", repEvent); Bangle.emit("HRM_R", repEvent); } @@ -544,9 +544,11 @@ exports.enable = () => { // register a listener for original HRM events and emit as HRM_int Bangle.on("HRM", (e) => { e.modified = true; + log("Emitting HRM_int", e); Bangle.emit("HRM_int", e); if (fallbackActive){ // if fallback to internal HRM is active, emit as HRM_R to which everyone listens + log("Emitting HRM_R(int)", e); Bangle.emit("HRM_R", e); } }); From 637e161a944432e6fbcb237776db5a4e6110330f Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 12 Nov 2022 23:15:50 +0100 Subject: [PATCH 3/5] bthrm - Bump version --- apps/bthrm/ChangeLog | 2 ++ apps/bthrm/metadata.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/bthrm/ChangeLog b/apps/bthrm/ChangeLog index c7b5a865f..5bf8d5074 100644 --- a/apps/bthrm/ChangeLog +++ b/apps/bthrm/ChangeLog @@ -34,3 +34,5 @@ Prevent mixing of BT and internal HRM events if both are enabled Always use a grace period (default 0 ms) to decouple some connection steps Device not found errors now utilize increasing timeouts +0.15: Fix recording internal sensor + Handle fallback to internal sensor consistently if BT bpm is 0 diff --git a/apps/bthrm/metadata.json b/apps/bthrm/metadata.json index df0ac1fc1..2803de5cf 100644 --- a/apps/bthrm/metadata.json +++ b/apps/bthrm/metadata.json @@ -2,7 +2,7 @@ "id": "bthrm", "name": "Bluetooth Heart Rate Monitor", "shortName": "BT HRM", - "version": "0.14", + "version": "0.15", "description": "Overrides Bangle.js's build in heart rate monitor with an external Bluetooth one.", "icon": "app.png", "type": "app", From 8c1fce695b25eca4014b5c48fed81aeb257183ea Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 12 Nov 2022 23:20:50 +0100 Subject: [PATCH 4/5] bthrm - Mark internal HRM events as e.src="int" --- apps/bthrm/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/bthrm/lib.js b/apps/bthrm/lib.js index 291976b33..19206de60 100644 --- a/apps/bthrm/lib.js +++ b/apps/bthrm/lib.js @@ -543,7 +543,7 @@ exports.enable = () => { if (settings.replace){ // register a listener for original HRM events and emit as HRM_int Bangle.on("HRM", (e) => { - e.modified = true; + e.src = "int"; log("Emitting HRM_int", e); Bangle.emit("HRM_int", e); if (fallbackActive){ From 5644f44f3f94e5530a5d5c6a8ef809dcdab33772 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 13 Nov 2022 00:19:11 +0100 Subject: [PATCH 5/5] bthrm - Disable fallback correctly --- apps/bthrm/ChangeLog | 1 + apps/bthrm/lib.js | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/apps/bthrm/ChangeLog b/apps/bthrm/ChangeLog index 5bf8d5074..e5b41482f 100644 --- a/apps/bthrm/ChangeLog +++ b/apps/bthrm/ChangeLog @@ -36,3 +36,4 @@ Device not found errors now utilize increasing timeouts 0.15: Fix recording internal sensor Handle fallback to internal sensor consistently if BT bpm is 0 + Power internal sensor down if not needed for fallback diff --git a/apps/bthrm/lib.js b/apps/bthrm/lib.js index 19206de60..32a0f5a40 100644 --- a/apps/bthrm/lib.js +++ b/apps/bthrm/lib.js @@ -255,7 +255,7 @@ exports.enable = () => { var retry = function() { log("Retry"); - if (!currentRetryTimeout){ + if (!currentRetryTimeout && !powerdownRequested){ var clampedTime = retryTime < 100 ? 100 : retryTime; @@ -281,13 +281,13 @@ exports.enable = () => { log("Disconnect: " + reason); log("GATT", gatt); log("Characteristics", characteristics); - + var retryTimeResetNeeded = true; retryTimeResetNeeded &= reason != "Connection Timeout"; retryTimeResetNeeded &= reason != "No device found matching filters"; clearRetryTimeout(retryTimeResetNeeded); supportedCharacteristics["0x2a37"].active = false; - startFallback(); + if (!powerdownRequested) startFallback(); blockInit = false; if (settings.warnDisconnect && !buzzing){ buzzing = true; @@ -369,7 +369,7 @@ exports.enable = () => { var initBt = function () { log("initBt with blockInit: " + blockInit); - if (blockInit){ + if (blockInit && !powerdownRequested){ retry(); return; } @@ -508,6 +508,8 @@ exports.enable = () => { }); }; + var powerdownRequested = false; + Bangle.setBTHRMPower = function(isOn, app) { // Do app power handling if (!app) app="?"; @@ -522,7 +524,9 @@ exports.enable = () => { if (!Bangle.isBTHRMConnected()) initBt(); } else { // not on log("Power off for " + app); + powerdownRequested = true; clearRetryTimeout(true); + stopFallback(); if (gatt) { if (gatt.connected){ log("Disconnect with gatt", gatt); @@ -543,7 +547,7 @@ exports.enable = () => { if (settings.replace){ // register a listener for original HRM events and emit as HRM_int Bangle.on("HRM", (e) => { - e.src = "int"; + e.modified = true; log("Emitting HRM_int", e); Bangle.emit("HRM_int", e); if (fallbackActive){ @@ -574,6 +578,11 @@ exports.enable = () => { log("setHRMPower for " + app + ": " + (isOn?"on":"off")); if (settings.enabled){ Bangle.setBTHRMPower(isOn, app); + if (Bangle._PWR && Bangle._PWR.HRM && Object.keys(Bangle._PWR.HRM).length == 0) { + Bangle._PWR.BTHRM = []; + Bangle.setBTHRMPower(0); + if (!isOn) stopFallback(); + } } if ((settings.enabled && !settings.replace) || !settings.enabled){ Bangle.origSetHRMPower(isOn, app);