BangleApps/apps/bootgatthrm/boot.js

69 lines
1.7 KiB
JavaScript

(() => {
function setupHRMAdvertising() {
/*
* This function prepares BLE heart rate Advertisement.
*/
require("ble_advert").set(0x180d, undefined, {
// We need custom Advertisement settings for Apps like OpenTracks
connectable: true,
discoverable: true,
scannable: true,
whenConnected: true,
});
NRF.setServices({
0x180D: { // heart_rate
0x2A37: { // heart_rate_measurement
notify: true,
value: [0x06, 0],
},
0x2A38: { // Sensor Location: Wrist
value: 0x02,
}
}
});
}
const keepConnected = (require("Storage").readJSON("gatthrm.settings.json", 1) || {}).keepConnected;
function updateBLEHeartRate(hrm) {
/*
* Send updated heart rate measurement via BLE
*/
if (hrm === undefined || hrm.confidence < 50) return;
try {
NRF.updateServices({
0x180D: {
0x2A37: {
value: [0x06, hrm.bpm],
notify: true
},
0x2A38: {
value: 0x02,
}
}
});
} catch (error) {
if (error.message.includes("BLE restart")) {
/*
* BLE has to restart after service setup.
*/
if(!keepConnected)
NRF.disconnect();
}
else if (error.message.includes("UUID 0x2a37")) {
/*
* Setup service if it wasn't setup correctly for some reason
*/
setupHRMAdvertising();
} else {
console.log("[bootgatthrm]: Unexpected error occured while updating HRM over BLE! Error: " + error.message);
}
}
}
setupHRMAdvertising();
Bangle.on("HRM", updateBLEHeartRate);
})();