diff --git a/apps/bthrm/ChangeLog b/apps/bthrm/ChangeLog index c7b5a865f..e5b41482f 100644 --- a/apps/bthrm/ChangeLog +++ b/apps/bthrm/ChangeLog @@ -34,3 +34,6 @@ 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 + Power internal sensor down if not needed for fallback diff --git a/apps/bthrm/lib.js b/apps/bthrm/lib.js index 13e8b0383..32a0f5a40 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); } @@ -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); @@ -544,9 +548,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); } }); @@ -572,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); 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", 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)