1
0
Fork 0

Merge pull request #2266 from halemmerich/bthrm

bthrm - Fix internal recording and prevent bpm==0 BT-HRM-events
master
Gordon Williams 2022-11-14 09:27:16 +00:00 committed by GitHub
commit 51bebcfaff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 17 deletions

View File

@ -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

View File

@ -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;
@ -287,7 +287,7 @@ exports.enable = () => {
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);

View File

@ -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",

View File

@ -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)