forked from FOSS/BangleApps
Merge pull request #2266 from halemmerich/bthrm
bthrm - Fix internal recording and prevent bpm==0 BT-HRM-eventsmaster
commit
51bebcfaff
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue