btadv: fix menus, avoid magic numbers

pull/2587/head
Rob Pilling 2023-01-20 22:28:14 +00:00
parent f8ef58b48b
commit eaed0f8215
2 changed files with 97 additions and 65 deletions

View File

@ -1,5 +1,19 @@
"use strict"; "use strict";
var UPDATE_MILLISECONDS = 30 * 1000; var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var _a, _b;
Bangle.loadWidgets();
Bangle.drawWidgets();
var ADVERT_MS = 30 * 1000;
var acc; var acc;
var bar; var bar;
var gps; var gps;
@ -23,8 +37,7 @@ var showMainMenu = function () {
curMenu = cur; curMenu = cur;
}; }; }; };
mainMenu[""] = { mainMenu[""] = {
"title": "-- btadv --", "title": "BLE Advert",
back: showMainMenu,
}; };
mainMenu[""].scroll = mainMenuScroll; mainMenu[""].scroll = mainMenuScroll;
mainMenu["Acceleration"] = showMenu(accMenu, 0, "acc"); mainMenu["Acceleration"] = showMenu(accMenu, 0, "acc");
@ -36,15 +49,18 @@ var showMainMenu = function () {
E.showMenu(mainMenu); E.showMenu(mainMenu);
curMenu = "main"; curMenu = "main";
}; };
var optionsCommon = {
back: showMainMenu,
};
var accMenu = { var accMenu = {
"": { "title": "- Acceleration -" }, "": __assign({ "title": "Acceleration -" }, optionsCommon),
"Active": { value: "true (fixed)" }, "Active": { value: "true (fixed)" },
"x": { value: "" }, "x": { value: "" },
"y": { value: "" }, "y": { value: "" },
"z": { value: "" }, "z": { value: "" },
}; };
var barMenu = { var barMenu = {
"": { "title": "- Barometer -" }, "": __assign({ "title": "Barometer" }, optionsCommon),
"Active": { "Active": {
value: settings.barEnabled, value: settings.barEnabled,
onchange: function (v) { return updateSetting('barEnabled', v); }, onchange: function (v) { return updateSetting('barEnabled', v); },
@ -54,7 +70,7 @@ var barMenu = {
"Temp": { value: "" }, "Temp": { value: "" },
}; };
var gpsMenu = { var gpsMenu = {
"": { "title": "- GPS -" }, "": __assign({ "title": "GPS" }, optionsCommon),
"Active": { "Active": {
value: settings.gpsEnabled, value: settings.gpsEnabled,
onchange: function (v) { return updateSetting('gpsEnabled', v); }, onchange: function (v) { return updateSetting('gpsEnabled', v); },
@ -66,7 +82,7 @@ var gpsMenu = {
"HDOP": { value: "" }, "HDOP": { value: "" },
}; };
var hrmMenu = { var hrmMenu = {
"": { "title": "- Heart Rate -" }, "": __assign({ "title": "- Heart Rate -" }, optionsCommon),
"Active": { "Active": {
value: settings.hrmEnabled, value: settings.hrmEnabled,
onchange: function (v) { return updateSetting('hrmEnabled', v); }, onchange: function (v) { return updateSetting('hrmEnabled', v); },
@ -75,7 +91,7 @@ var hrmMenu = {
"Confidence": { value: "" }, "Confidence": { value: "" },
}; };
var magMenu = { var magMenu = {
"": { "title": "- Magnetometer -" }, "": __assign({ "title": "Magnetometer" }, optionsCommon),
"Active": { "Active": {
value: settings.magEnabled, value: settings.magEnabled,
onchange: function (v) { return updateSetting('magEnabled', v); }, onchange: function (v) { return updateSetting('magEnabled', v); },
@ -132,26 +148,26 @@ var updateMenu = function () {
} }
}; };
var updateBleAdvert = function () { var updateBleAdvert = function () {
var _a, _b;
var bleAdvert; var bleAdvert;
if (!(bleAdvert = Bangle.bleAdvert)) if (!(bleAdvert = Bangle.bleAdvert))
bleAdvert = Bangle.bleAdvert = {}; bleAdvert = Bangle.bleAdvert = {};
if (hrm) { if (hrm) {
bleAdvert[0x180d] = undefined; bleAdvert["0x180d"] = undefined;
if (NRF.getSecurityStatus().connected) { if (NRF.getSecurityStatus().connected) {
NRF.updateServices({ NRF.updateServices((_a = {},
0x180d: { _a["0x180d"] = (_b = {},
0x2a37: { _b["0x2a37"] = {
value: [0, hrm.bpm], value: [0, hrm.bpm],
notify: true, notify: true,
} },
} _b),
}); _a));
return; return;
} }
} }
var interval = UPDATE_MILLISECONDS;
NRF.setAdvertising(Bangle.bleAdvert, { NRF.setAdvertising(Bangle.bleAdvert, {
interval: interval, interval: ADVERT_MS,
}); });
}; };
var encodeHrm = function () { return [0, hrm ? hrm.bpm : 0]; }; var encodeHrm = function () { return [0, hrm ? hrm.bpm : 0]; };
@ -207,28 +223,30 @@ var updateSetting = function (name, value) {
settings[name] = value; settings[name] = value;
enableSensors(); enableSensors();
}; };
NRF.setServices({ NRF.setServices((_a = {},
0x180d: { _a["0x180d"] = (_b = {},
0x2a37: { _b["0x2a37"] = {
value: encodeHrm(), value: encodeHrm(),
readable: true, readable: true,
notify: true, notify: true,
}, },
}, _b),
}, { _a), {
advertise: [ advertise: [
'180d', '180d',
] ]
}); });
var updateServices = function () { var updateServices = function () {
NRF.updateServices({ var _a, _b;
0x180d: { NRF.updateServices((_a = {},
0x2a37: { _a["0x180d"] = (_b = {},
_b["0x2a37"] = {
value: encodeHrm(), value: encodeHrm(),
notify: true, notify: true,
} dog: 1,
} },
}); _b),
_a));
}; };
Bangle.on('accel', function (newAcc) { return acc = newAcc; }); Bangle.on('accel', function (newAcc) { return acc = newAcc; });
Bangle.on('pressure', function (newBar) { return bar = newBar; }); Bangle.on('pressure', function (newBar) { return bar = newBar; });

View File

@ -1,4 +1,11 @@
const UPDATE_MILLISECONDS = 30 * 1000; // TODO: emit other data beside HRM (via set/updateServices)
const enum Intervals {
BLE_ADVERT = 30 * 1000,
BLE = 1000,
MENU_WAKE = 1000,
MENU_SLEEP = 30 * 1000,
}
let acc: undefined | AccelData; let acc: undefined | AccelData;
let bar: undefined | PressureData; let bar: undefined | PressureData;
@ -8,7 +15,6 @@ let mag: undefined | CompassData;
type BtAdvMenu = "acc" | "bar" | "gps" | "hrm" | "mag" | "main"; type BtAdvMenu = "acc" | "bar" | "gps" | "hrm" | "mag" | "main";
let curMenu: BtAdvMenu = "main"; let curMenu: BtAdvMenu = "main";
let updateInterval: undefined | number;
let mainMenuScroll = 0; let mainMenuScroll = 0;
const settings = { const settings = {
barEnabled: false, barEnabled: false,
@ -28,8 +34,7 @@ const showMainMenu = () => {
}; };
mainMenu[""] = { mainMenu[""] = {
"title": "-- btadv --", "title": "BLE Advert",
back: showMainMenu,
}; };
(mainMenu[""] as any).scroll = mainMenuScroll; // typehack (mainMenu[""] as any).scroll = mainMenuScroll; // typehack
@ -44,8 +49,12 @@ const showMainMenu = () => {
curMenu = "main"; curMenu = "main";
}; };
const optionsCommon = {
back: showMainMenu,
};
const accMenu = { const accMenu = {
"": { "title" : "- Acceleration -" }, "": { "title" : "Acceleration -", ...optionsCommon },
"Active": { value: "true (fixed)" }, "Active": { value: "true (fixed)" },
"x": { value: "" }, "x": { value: "" },
"y": { value: "" }, "y": { value: "" },
@ -53,7 +62,7 @@ const accMenu = {
}; };
const barMenu = { const barMenu = {
"": { "title" : "- Barometer -" }, "": { "title" : "Barometer", ...optionsCommon },
"Active": { "Active": {
value: settings.barEnabled, value: settings.barEnabled,
onchange: (v: boolean) => updateSetting('barEnabled', v), onchange: (v: boolean) => updateSetting('barEnabled', v),
@ -64,7 +73,7 @@ const barMenu = {
}; };
const gpsMenu = { const gpsMenu = {
"": { "title" : "- GPS -" }, "": { "title" : "GPS", ...optionsCommon },
"Active": { "Active": {
value: settings.gpsEnabled, value: settings.gpsEnabled,
onchange: (v: boolean) => updateSetting('gpsEnabled', v), onchange: (v: boolean) => updateSetting('gpsEnabled', v),
@ -77,7 +86,7 @@ const gpsMenu = {
}; };
const hrmMenu = { const hrmMenu = {
"": { "title" : "- Heart Rate -" }, "": { "title" : "- Heart Rate -", ...optionsCommon },
"Active": { "Active": {
value: settings.hrmEnabled, value: settings.hrmEnabled,
onchange: (v: boolean) => updateSetting('hrmEnabled', v), onchange: (v: boolean) => updateSetting('hrmEnabled', v),
@ -87,7 +96,7 @@ const hrmMenu = {
}; };
const magMenu = { const magMenu = {
"": { "title" : "- Magnetometer -" }, "": { "title" : "Magnetometer", ...optionsCommon },
"Active": { "Active": {
value: settings.magEnabled, value: settings.magEnabled,
onchange: (v: boolean) => updateSetting('magEnabled', v), onchange: (v: boolean) => updateSetting('magEnabled', v),
@ -149,8 +158,15 @@ const updateMenu = () => {
} }
}; };
const enum BleServ {
HRM = "0x180d",
}
const enum BleChar {
HRM = "0x2a37",
}
const updateBleAdvert = () => { const updateBleAdvert = () => {
let bleAdvert: { [key: number]: undefined }; let bleAdvert: { [key: string]: undefined };
if (!(bleAdvert = (Bangle as any).bleAdvert)) if (!(bleAdvert = (Bangle as any).bleAdvert))
bleAdvert = (Bangle as any).bleAdvert = {}; bleAdvert = (Bangle as any).bleAdvert = {};
@ -168,13 +184,13 @@ const updateBleAdvert = () => {
// } // }
if (hrm) { if (hrm) {
bleAdvert[0x180d] = undefined; // Advertise HRM bleAdvert[BleServ.HRM] = undefined; // Advertise HRM
// hack // hack
if (NRF.getSecurityStatus().connected) { if (NRF.getSecurityStatus().connected) {
NRF.updateServices({ NRF.updateServices({
0x180d: { [BleServ.HRM]: {
0x2a37: { [BleChar.HRM]: {
value: [0, hrm.bpm], value: [0, hrm.bpm],
notify: true, notify: true,
} }
@ -192,14 +208,7 @@ const updateBleAdvert = () => {
// mag = undefined; // mag = undefined;
// } // }
const interval = UPDATE_MILLISECONDS; // / data.length; NRF.setAdvertising((Bangle as any).bleAdvert);
NRF.setAdvertising(
(Bangle as any).bleAdvert,
{
interval,
},
);
}; };
// { // {
@ -288,8 +297,8 @@ const updateSetting = (
NRF.setServices( NRF.setServices(
{ {
0x180d: { [BleServ.HRM]: {
0x2a37: { [BleChar.HRM]: {
value: encodeHrm(), value: encodeHrm(),
readable: true, readable: true,
notify: true, notify: true,
@ -306,8 +315,8 @@ NRF.setServices(
const updateServices = () => { const updateServices = () => {
NRF.updateServices({ NRF.updateServices({
0x180d: { [BleServ.HRM]: {
0x2a37: { [BleChar.HRM]: {
value: encodeHrm(), value: encodeHrm(),
notify: true, notify: true,
} }
@ -321,22 +330,27 @@ Bangle.on('GPS', newGps => gps = newGps);
Bangle.on('HRM', newHrm => hrm = newHrm); Bangle.on('HRM', newHrm => hrm = newHrm);
Bangle.on('mag', newMag => mag = newMag); Bangle.on('mag', newMag => mag = newMag);
enableSensors(); // show menu first to have it reserve space for widgets (appRect)
Bangle.loadWidgets();
Bangle.drawWidgets();
showMainMenu(); showMainMenu();
enableSensors();
// setInterval(updateAdvert, 10000); setInterval(updateBleAdvert, Intervals.BLE_ADVERT);
setInterval(updateMenu, 1000);
const menuInterval = setInterval(updateMenu, Intervals.MENU_WAKE);
Bangle.on("lock", locked => {
changeInterval(
menuInterval,
locked ? Intervals.MENU_SLEEP : Intervals.MENU_WAKE,
);
});
let serviceInterval: undefined | number;
NRF.on("connect", () => { NRF.on("connect", () => {
updateInterval = setInterval(updateServices, 1000); serviceInterval = setInterval(updateServices, Intervals.BLE);
}); });
NRF.on("disconnect", () => { NRF.on("disconnect", () => {
clearInterval(updateInterval); clearInterval(serviceInterval);
updateInterval = undefined; serviceInterval = undefined;
}); });
// TODO debounce
// TODO: emit other data beside HRM (via set/updateServices)
// FIXME: ui overlap
// Bangle.loadWidgets();
// Bangle.drawWidgets();