btadv: togglable layouts

pull/2587/head
Rob Pilling 2023-01-27 22:08:28 +00:00
parent d0245f0c64
commit 9e8bba280b
2 changed files with 482 additions and 352 deletions

View File

@ -10,166 +10,207 @@ var __assign = (this && this.__assign) || function () {
};
return __assign.apply(this, arguments);
};
var Layout = require("Layout");
var services = ["0x180d", "0x181a", "0x1819"];
var acc;
var bar;
var gps;
var hrm;
var mag;
var curMenuName = "main";
var curMenu;
var mainMenuScroll = 0;
var btnsShown = false;
var prevBtnsShown = undefined;
var settings = {
barEnabled: false,
gpsEnabled: false,
hrmEnabled: false,
magEnabled: false,
bar: false,
gps: false,
hrm: false,
mag: false,
};
var showMainMenu = function () {
var onOff = function (b) { return b ? " (on)" : " (off)"; };
var mainMenu = {};
var showMenu = function (menu, scroll, cur) { return function () {
mainMenuScroll = scroll;
curMenu = E.showMenu(menu);
curMenuName = cur;
}; };
mainMenu[""] = {
"title": "BLE Advert",
};
mainMenu[""].scroll = mainMenuScroll;
mainMenu["Acceleration"] = showMenu(accMenu, 0, "acc");
mainMenu["Barometer" + onOff(settings.barEnabled)] = showMenu(barMenu, 1, "bar");
mainMenu["GPS" + onOff(settings.gpsEnabled)] = showMenu(gpsMenu, 2, "gps");
mainMenu["Heart Rate" + onOff(settings.hrmEnabled)] = showMenu(hrmMenu, 3, "hrm");
mainMenu["Magnetometer" + onOff(settings.magEnabled)] = showMenu(magMenu, 4, "mag");
mainMenu["Exit"] = function () { return load(); };
curMenu = E.showMenu(mainMenu);
curMenuName = "main";
var idToName = {
acc: "Acceleration",
bar: "Barometer",
gps: "GPS",
hrm: "HRM",
mag: "Magnetometer",
};
var optionsCommon = {
back: showMainMenu,
var colour = {
on: "#0f0",
off: "#fff",
};
var accMenu = {
"": __assign({ "title": "Acceleration" }, optionsCommon),
"Active": { value: "true (fixed)" },
"x": { value: "" },
"y": { value: "" },
"z": { value: "" },
var makeToggle = function (id) { return function () {
settings[id] = !settings[id];
var entry = btnLayout[id];
var col = settings[id] ? colour.on : colour.off;
entry.btnBorder = entry.col = col;
btnLayout.update();
btnLayout.render();
enableSensors();
}; };
var btnStyle = {
font: "Vector:14",
fillx: 1,
filly: 1,
col: g.theme.fg,
bgCol: g.theme.bg,
btnBorder: "#fff",
};
var barMenu = {
"": __assign({ "title": "Barometer" }, optionsCommon),
"Active": {
value: settings.barEnabled,
onchange: function (v) { return updateSetting('barEnabled', v); },
var btnLayout = new Layout({
type: "v",
c: [
{
type: "h",
c: [
__assign({ type: "btn", label: idToName.bar, id: "bar", cb: makeToggle('bar') }, btnStyle),
__assign({ type: "btn", label: idToName.gps, id: "gps", cb: makeToggle('gps') }, btnStyle),
]
},
{
type: "h",
c: [
__assign({ type: "btn", label: idToName.hrm, id: "hrm", cb: makeToggle('hrm') }, btnStyle),
__assign({ type: "btn", label: idToName.mag, id: "mag", cb: makeToggle('mag') }, btnStyle),
]
},
{
type: "h",
c: [
__assign(__assign({ type: "btn", label: idToName.acc, id: "acc", cb: function () { } }, btnStyle), { col: colour.on, btnBorder: colour.on }),
__assign({ type: "btn", label: "Back", cb: function () {
setBtnsShown(false);
} }, btnStyle),
]
}
]
}, {
lazy: true,
back: function () {
setBtnsShown(false);
},
"Altitude": { value: "" },
"Press": { value: "" },
"Temp": { value: "" },
});
var setBtnsShown = function (b) {
btnsShown = b;
g.clearRect(Bangle.appRect);
redraw();
};
var gpsMenu = {
"": __assign({ "title": "GPS" }, optionsCommon),
"Active": {
value: settings.gpsEnabled,
onchange: function (v) { return updateSetting('gpsEnabled', v); },
},
"Lat": { value: "" },
"Lon": { value: "" },
"Altitude": { value: "" },
"Satellites": { value: "" },
"HDOP": { value: "" },
var infoFont = "6x8:2";
var infoCommon = {
type: "txt",
label: "",
font: infoFont,
pad: 5,
};
var hrmMenu = {
"": __assign({ "title": "Heart Rate" }, optionsCommon),
"Active": {
value: settings.hrmEnabled,
onchange: function (v) { return updateSetting('hrmEnabled', v); },
},
"BPM": { value: "" },
"Confidence": { value: "" },
var infoLayout = new Layout({
type: "v",
c: [
{
type: "h",
c: [
__assign({ id: "bar_alti" }, infoCommon),
__assign({ id: "bar_pres" }, infoCommon),
__assign({ id: "bar_temp" }, infoCommon),
]
},
{
type: "h",
c: [
__assign({ id: "gps_lat" }, infoCommon),
__assign({ id: "gps_lon" }, infoCommon),
__assign({ id: "gps_altitude" }, infoCommon),
__assign({ id: "gps_satellites" }, infoCommon),
__assign({ id: "gps_hdop" }, infoCommon),
]
},
{
type: "h",
c: [
__assign({ id: "hrm_bpm" }, infoCommon),
__assign({ id: "hrm_confidence" }, infoCommon),
]
},
{
type: "h",
c: [
__assign({ id: "mag_x" }, infoCommon),
__assign({ id: "mag_y" }, infoCommon),
__assign({ id: "mag_z" }, infoCommon),
__assign({ id: "mag_heading" }, infoCommon),
]
},
__assign({ type: "btn", label: "Set", cb: function () {
setBtnsShown(true);
} }, btnStyle),
]
}, {
lazy: true,
});
var showElem = function (layout, s) {
layout.label = s;
delete layout.height;
};
var magMenu = {
"": __assign({ "title": "Magnetometer" }, optionsCommon),
"Active": {
value: settings.magEnabled,
onchange: function (v) { return updateSetting('magEnabled', v); },
},
"x": { value: "" },
"y": { value: "" },
"z": { value: "" },
"Heading": { value: "" },
var hideElem = function (layout) {
layout.height = 0;
};
var redrawMenu = function (newMenu) {
var scroll = curMenu.scroller.scroll;
curMenu = E.showMenu(newMenu);
curMenu.scroller.scroll = scroll;
curMenu.draw();
};
var updateMenu = function () {
switch (curMenuName) {
case "acc":
if (acc) {
accMenu.x.value = acc.x.toFixed(2);
accMenu.y.value = acc.y.toFixed(2);
accMenu.z.value = acc.z.toFixed(2);
redrawMenu(accMenu);
}
else if (accMenu.x.value !== "...") {
accMenu.x.value = accMenu.y.value = accMenu.z.value = "...";
redrawMenu(accMenu);
}
break;
case "bar":
if (bar) {
barMenu.Altitude.value = bar.altitude.toFixed(1) + 'm';
barMenu.Press.value = bar.pressure.toFixed(1) + 'mbar';
barMenu.Temp.value = bar.temperature.toFixed(1) + 'C';
redrawMenu(barMenu);
}
else if (barMenu.Altitude.value !== "...") {
barMenu.Altitude.value = barMenu.Press.value = barMenu.Temp.value = "...";
redrawMenu(accMenu);
}
break;
case "gps":
if (gps) {
gpsMenu.Lat.value = gps.lat.toFixed(4);
gpsMenu.Lon.value = gps.lon.toFixed(4);
gpsMenu.Altitude.value = gps.alt + 'm';
gpsMenu.Satellites.value = "" + gps.satellites;
gpsMenu.HDOP.value = (gps.hdop * 5).toFixed(1) + 'm';
redrawMenu(gpsMenu);
}
else if (gpsMenu.Lat.value !== "...") {
gpsMenu.Lat.value = gpsMenu.Lon.value = gpsMenu.Altitude.value =
gpsMenu.Satellites.value = gpsMenu.HDOP.value = "...";
redrawMenu(gpsMenu);
}
break;
case "hrm":
if (hrm) {
hrmMenu.BPM.value = "" + hrm.bpm;
hrmMenu.Confidence.value = hrm.confidence + '%';
redrawMenu(hrmMenu);
}
else if (hrmMenu.BPM.value !== "...") {
hrmMenu.BPM.value = hrmMenu.Confidence.value = "...";
redrawMenu(hrmMenu);
}
break;
case "mag":
if (mag) {
magMenu.x.value = "" + mag.x;
magMenu.y.value = "" + mag.y;
magMenu.z.value = "" + mag.z;
magMenu.Heading.value = mag.heading.toFixed(1);
redrawMenu(magMenu);
}
else if (magMenu.x.value !== "...") {
magMenu.x.value = magMenu.y.value = magMenu.z.value = magMenu.Heading.value = "...";
redrawMenu(magMenu);
}
break;
var populateInfo = function () {
if (bar) {
showElem(infoLayout["bar_alti"], "".concat(bar.altitude.toFixed(1), "m"));
showElem(infoLayout["bar_pres"], "".concat(bar.pressure.toFixed(1), "mbar"));
showElem(infoLayout["bar_temp"], "".concat(bar.temperature.toFixed(1), "C"));
}
else {
hideElem(infoLayout["bar_alti"]);
hideElem(infoLayout["bar_pres"]);
hideElem(infoLayout["bar_temp"]);
}
if (gps) {
showElem(infoLayout["gps_lat"], gps.lat.toFixed(4));
showElem(infoLayout["gps_lon"], gps.lon.toFixed(4));
showElem(infoLayout["gps_altitude"], "".concat(gps.alt, "m"));
showElem(infoLayout["gps_satellites"], "".concat(gps.satellites));
showElem(infoLayout["gps_hdop"], "".concat((gps.hdop * 5).toFixed(1), "m"));
}
else {
hideElem(infoLayout["gps_lat"]);
hideElem(infoLayout["gps_lon"]);
hideElem(infoLayout["gps_altitude"]);
hideElem(infoLayout["gps_satellites"]);
hideElem(infoLayout["gps_hdop"]);
}
if (hrm) {
showElem(infoLayout["hrm_bpm"], "".concat(hrm.bpm));
showElem(infoLayout["hrm_confidence"], "".concat(hrm.confidence, "%"));
}
else {
hideElem(infoLayout["hrm_bpm"]);
hideElem(infoLayout["hrm_confidence"]);
}
if (mag) {
showElem(infoLayout["mag_x"], "".concat(mag.x));
showElem(infoLayout["mag_y"], "".concat(mag.y));
showElem(infoLayout["mag_z"], "".concat(mag.z));
showElem(infoLayout["mag_heading"], mag.heading.toFixed(1));
}
else {
hideElem(infoLayout["mag_x"]);
hideElem(infoLayout["mag_y"]);
hideElem(infoLayout["mag_z"]);
hideElem(infoLayout["mag_heading"]);
}
};
var redraw = function () {
var layout;
if (btnsShown) {
layout = btnLayout;
}
else {
populateInfo();
infoLayout.update();
layout = infoLayout;
}
if (btnsShown !== prevBtnsShown) {
prevBtnsShown = btnsShown;
layout.forgetLazyState();
layout.setUI();
}
layout.render();
};
var encodeHrm = function (hrm) {
return [0, hrm.bpm];
@ -222,22 +263,19 @@ var toByteArray = function (value, numberOfBytes, isSigned) {
return byteArray;
};
var enableSensors = function () {
Bangle.setBarometerPower(settings.barEnabled, "btadv");
if (!settings.barEnabled)
Bangle.setBarometerPower(settings.bar, "btadv");
if (!settings.bar)
bar = undefined;
Bangle.setGPSPower(settings.gpsEnabled, "btadv");
if (!settings.gpsEnabled)
Bangle.setGPSPower(settings.gps, "btadv");
if (!settings.gps)
gps = undefined;
Bangle.setHRMPower(settings.hrmEnabled, "btadv");
if (!settings.hrmEnabled)
Bangle.setHRMPower(settings.hrm, "btadv");
if (!settings.hrm)
hrm = undefined;
Bangle.setCompassPower(settings.magEnabled, "btadv");
if (!settings.magEnabled)
Bangle.setCompassPower(settings.mag, "btadv");
if (!settings.mag)
mag = undefined;
};
var updateSetting = function (name, value) {
settings[name] = value;
enableSensors();
console.log("enableSensors():", settings);
};
var serviceActive = function (serv) {
switch (serv) {
@ -349,10 +387,10 @@ Bangle.on('HRM', function (newHrm) { return hrm = newHrm; });
Bangle.on('mag', function (newMag) { return mag = newMag; });
Bangle.loadWidgets();
Bangle.drawWidgets();
showMainMenu();
var menuInterval = setInterval(updateMenu, 1000);
setBtnsShown(true);
var redrawInterval = setInterval(redraw, 1000);
Bangle.on("lock", function (locked) {
changeInterval(menuInterval, locked ? 30000 : 1000);
changeInterval(redrawInterval, locked ? 30000 : 1000);
});
enableSensors();
{
@ -378,10 +416,3 @@ var setIntervals = function (connected) {
iv = undefined;
}
};
setIntervals(NRF.getSecurityStatus().connected);
NRF.on("connect", function () {
setIntervals(true);
});
NRF.on("disconnect", function () {
setIntervals(false);
});

View File

@ -3,7 +3,9 @@
// [-] handle NaNs in data
// [x] fix sending of HRM / changing service?
// [.] fix menu scrolling/jumping
// [ ] fix resetting to accel menu
// [.] fix resetting to accel menu
const Layout = require("Layout") as Layout_.Layout;
const enum Intervals {
BLE_ADVERT = 60 * 1000,
@ -84,179 +86,283 @@ let bar: undefined | PressureData;
let gps: undefined | GPSFix;
let hrm: undefined | Hrm;
let mag: undefined | CompassData;
let btnsShown = false;
let prevBtnsShown: boolean | undefined = undefined;
type BtAdvMenu = "acc" | "bar" | "gps" | "hrm" | "mag" | "main";
let curMenuName: BtAdvMenu = "main";
let curMenu: MenuInstance;
let mainMenuScroll = 0;
const settings = {
barEnabled: false,
gpsEnabled: false,
hrmEnabled: false,
magEnabled: false,
type BtAdvType<IncludeAcc = false> = "bar" | "gps" | "hrm" | "mag" | (IncludeAcc extends true ? "acc" : never);
type BtAdvMap<T, IncludeAcc = false> = { [key in BtAdvType<IncludeAcc>]: T };
const settings: BtAdvMap<boolean> = {
bar: false,
gps: false,
hrm: false,
mag: false,
};
const showMainMenu = () => {
const onOff = (b: boolean) => b ? " (on)" : " (off)";
const mainMenu: Menu = {};
const showMenu = (menu: Menu, scroll: number, cur: BtAdvMenu) => () => {
mainMenuScroll = scroll; // int
curMenu = E.showMenu(menu);
curMenuName = cur;
};
mainMenu[""] = {
"title": "BLE Advert",
};
(mainMenu[""] as any).scroll = mainMenuScroll; // typehack
mainMenu["Acceleration"] = showMenu(accMenu, 0, "acc");
mainMenu["Barometer" + onOff(settings.barEnabled)] = showMenu(barMenu, 1, "bar");
mainMenu["GPS" + onOff(settings.gpsEnabled)] = showMenu(gpsMenu, 2, "gps");
mainMenu["Heart Rate" + onOff(settings.hrmEnabled)] = showMenu(hrmMenu, 3, "hrm");
mainMenu["Magnetometer" + onOff(settings.magEnabled)] = showMenu(magMenu, 4, "mag");
mainMenu["Exit"] = () => (load as any)(); // avoid `this` + typehack
curMenu = E.showMenu(mainMenu);
curMenuName = "main";
const idToName: BtAdvMap<string, true> = {
acc: "Acceleration",
bar: "Barometer",
gps: "GPS",
hrm: "HRM",
mag: "Magnetometer",
};
const optionsCommon = {
back: showMainMenu,
const colour = {
on: "#0f0",
off: "#fff",
} as const;
const makeToggle = (id: BtAdvType) => () => {
settings[id] = !settings[id];
const entry = btnLayout[id]!;
const col = settings[id] ? colour.on : colour.off;
entry.btnBorder = entry.col = col;
btnLayout.update();
btnLayout.render();
//require('Storage').writeJSON(SETTINGS_FILENAME, settings);
enableSensors();
};
const accMenu = {
"": { "title" : "Acceleration", ...optionsCommon },
"Active": { value: "true (fixed)" },
"x": { value: "" },
"y": { value: "" },
"z": { value: "" },
const btnStyle: {
font: FontNameWithScaleFactor,
fillx?: 1,
filly?: 1,
col: ColorResolvable,
bgCol: ColorResolvable,
btnBorder: ColorResolvable,
} = {
font: "Vector:14",
fillx: 1,
filly: 1,
col: g.theme.fg,
bgCol: g.theme.bg,
btnBorder: "#fff",
};
const barMenu = {
"": { "title" : "Barometer", ...optionsCommon },
"Active": {
value: settings.barEnabled,
onchange: (v: boolean) => updateSetting('barEnabled', v),
const btnLayout = new Layout(
{
type: "v",
c: [
{
type: "h",
c: [
{
type: "btn",
label: idToName.bar,
id: "bar",
cb: makeToggle('bar'),
...btnStyle,
},
{
type: "btn",
label: idToName.gps,
id: "gps",
cb: makeToggle('gps'),
...btnStyle,
},
]
},
{
type: "h",
c: [
// hrm, mag
{
type: "btn",
label: idToName.hrm,
id: "hrm",
cb: makeToggle('hrm'),
...btnStyle,
},
{
type: "btn",
label: idToName.mag,
id: "mag",
cb: makeToggle('mag'),
...btnStyle,
},
]
},
{
type: "h",
c: [
{
type: "btn",
label: idToName.acc,
id: "acc",
cb: () => {},
...btnStyle,
col: colour.on,
btnBorder: colour.on,
},
{
type: "btn",
label: "Back",
cb: () => {
setBtnsShown(false);
},
...btnStyle,
},
]
}
]
},
"Altitude": { value: "" },
"Press": { value: "" },
"Temp": { value: "" },
};
const gpsMenu = {
"": { "title" : "GPS", ...optionsCommon },
"Active": {
value: settings.gpsEnabled,
onchange: (v: boolean) => updateSetting('gpsEnabled', v),
{
lazy: true,
back: () => {
setBtnsShown(false);
},
},
"Lat": { value: "" },
"Lon": { value: "" },
"Altitude": { value: "" },
"Satellites": { value: "" },
"HDOP": { value: "" },
);
const setBtnsShown = (b: boolean) => {
btnsShown = b;
g.clearRect(Bangle.appRect);
redraw();
};
const hrmMenu = {
"": { "title" : "Heart Rate", ...optionsCommon },
"Active": {
value: settings.hrmEnabled,
onchange: (v: boolean) => updateSetting('hrmEnabled', v),
const infoFont: FontNameWithScaleFactor = "6x8:2";
const infoCommon = {
type: "txt",
label: "",
font: infoFont,
pad: 5,
} as const;
const infoLayout = new Layout(
{
type: "v",
c: [
{
type: "h",
c: [
{ id: "bar_alti", ...infoCommon },
{ id: "bar_pres", ...infoCommon },
{ id: "bar_temp", ...infoCommon },
]
},
{
type: "h",
c: [
{ id: "gps_lat", ...infoCommon },
{ id: "gps_lon", ...infoCommon },
{ id: "gps_altitude", ...infoCommon },
{ id: "gps_satellites", ...infoCommon },
{ id: "gps_hdop", ...infoCommon },
]
},
{
type: "h",
c: [
{ id: "hrm_bpm", ...infoCommon },
{ id: "hrm_confidence", ...infoCommon },
]
},
{
type: "h",
c: [
{ id: "mag_x", ...infoCommon },
{ id: "mag_y", ...infoCommon },
{ id: "mag_z", ...infoCommon },
{ id: "mag_heading", ...infoCommon },
]
},
{
type: "btn",
label: "Set",
cb: () => {
setBtnsShown(true);
},
...btnStyle,
},
]
},
"BPM": { value: "" },
"Confidence": { value: "" },
};
const magMenu = {
"": { "title" : "Magnetometer", ...optionsCommon },
"Active": {
value: settings.magEnabled,
onchange: (v: boolean) => updateSetting('magEnabled', v),
},
"x": { value: "" },
"y": { value: "" },
"z": { value: "" },
"Heading": { value: "" },
};
const redrawMenu = (newMenu: Menu) => {
const scroll = (curMenu as any).scroller.scroll;
curMenu = E.showMenu(newMenu);
// FIXME: doesn't work for promenu
(curMenu as any).scroller.scroll = scroll; // typehack
curMenu.draw();
};
const updateMenu = () => {
switch (curMenuName) {
case "acc":
if (acc) {
accMenu.x.value = acc.x.toFixed(2);
accMenu.y.value = acc.y.toFixed(2);
accMenu.z.value = acc.z.toFixed(2);
redrawMenu(accMenu);
} else if (accMenu.x.value !== "...") {
accMenu.x.value = accMenu.y.value = accMenu.z.value = "...";
redrawMenu(accMenu);
}
break;
case "bar":
if (bar) {
barMenu.Altitude.value = bar.altitude.toFixed(1) + 'm';
barMenu.Press.value = bar.pressure.toFixed(1) + 'mbar';
barMenu.Temp.value = bar.temperature.toFixed(1) + 'C';
redrawMenu(barMenu);
} else if (barMenu.Altitude.value !== "...") {
barMenu.Altitude.value = barMenu.Press.value = barMenu.Temp.value = "...";
redrawMenu(accMenu);
}
break;
case "gps":
if (gps) {
gpsMenu.Lat.value = gps.lat.toFixed(4);
gpsMenu.Lon.value = gps.lon.toFixed(4);
gpsMenu.Altitude.value = gps.alt + 'm';
gpsMenu.Satellites.value = "" + gps.satellites;
gpsMenu.HDOP.value = (gps.hdop * 5).toFixed(1) + 'm';
redrawMenu(gpsMenu);
} else if (gpsMenu.Lat.value !== "...") {
gpsMenu.Lat.value = gpsMenu.Lon.value = gpsMenu.Altitude.value =
gpsMenu.Satellites.value = gpsMenu.HDOP.value = "...";
redrawMenu(gpsMenu);
}
break;
case "hrm":
if (hrm) {
hrmMenu.BPM.value = "" + hrm.bpm;
hrmMenu.Confidence.value = hrm.confidence + '%';
redrawMenu(hrmMenu);
} else if (hrmMenu.BPM.value !== "...") {
hrmMenu.BPM.value = hrmMenu.Confidence.value = "...";
redrawMenu(hrmMenu);
}
break;
case "mag":
if (mag) {
magMenu.x.value = "" + mag.x;
magMenu.y.value = "" + mag.y;
magMenu.z.value = "" + mag.z;
magMenu.Heading.value = mag.heading.toFixed(1);
redrawMenu(magMenu);
} else if (magMenu.x.value !== "...") {
magMenu.x.value = magMenu.y.value = magMenu.z.value = magMenu.Heading.value = "...";
redrawMenu(magMenu);
}
break;
{
lazy: true,
// back: () => (load as any)(),
}
);
const showElem = (
layout: Layout_.Hierarchy & { type: "txt" },
s: string,
) => {
layout.label = s;
// delete layout.width; TODO?
delete layout.height;
};
const hideElem = (layout: Layout_.Hierarchy) => {
layout.height = 0;
};
const populateInfo = () => {
if (bar) {
showElem(infoLayout["bar_alti"]!, `${bar.altitude.toFixed(1)}m`);
showElem(infoLayout["bar_pres"]!, `${bar.pressure.toFixed(1)}mbar`);
showElem(infoLayout["bar_temp"]!, `${bar.temperature.toFixed(1)}C`);
} else {
hideElem(infoLayout["bar_alti"]!);
hideElem(infoLayout["bar_pres"]!);
hideElem(infoLayout["bar_temp"]!);
}
if (gps) {
showElem(infoLayout["gps_lat"]!, gps.lat.toFixed(4));
showElem(infoLayout["gps_lon"]!, gps.lon.toFixed(4));
showElem(infoLayout["gps_altitude"]!, `${gps.alt}m`);
showElem(infoLayout["gps_satellites"]!, `${gps.satellites}`);
showElem(infoLayout["gps_hdop"]!, `${(gps.hdop * 5).toFixed(1)}m`);
} else {
hideElem(infoLayout["gps_lat"]!);
hideElem(infoLayout["gps_lon"]!);
hideElem(infoLayout["gps_altitude"]!);
hideElem(infoLayout["gps_satellites"]!);
hideElem(infoLayout["gps_hdop"]!);
}
if (hrm) {
showElem(infoLayout["hrm_bpm"]!, `${hrm.bpm}`);
showElem(infoLayout["hrm_confidence"]!, `${hrm.confidence}%`);
} else {
hideElem(infoLayout["hrm_bpm"]!);
hideElem(infoLayout["hrm_confidence"]!);
}
if (mag) {
showElem(infoLayout["mag_x"]!, `${mag.x}`);
showElem(infoLayout["mag_y"]!, `${mag.y}`);
showElem(infoLayout["mag_z"]!, `${mag.z}`);
showElem(infoLayout["mag_heading"]!, mag.heading.toFixed(1));
} else {
hideElem(infoLayout["mag_x"]!);
hideElem(infoLayout["mag_y"]!);
hideElem(infoLayout["mag_z"]!);
hideElem(infoLayout["mag_heading"]!);
}
};
const redraw = () => {
let layout;
if (btnsShown) {
layout = btnLayout;
} else {
populateInfo();
infoLayout.update();
layout = infoLayout;
}
if (btnsShown !== prevBtnsShown) {
prevBtnsShown = btnsShown;
layout.forgetLazyState();
layout.setUI();
}
layout.render();
};
const encodeHrm: LenFunc<Hrm> = (hrm: Hrm) =>
@ -367,30 +473,23 @@ const toByteArray = (value: number, numberOfBytes: number, isSigned: boolean) =>
};
const enableSensors = () => {
Bangle.setBarometerPower(settings.barEnabled, "btadv");
if (!settings.barEnabled)
Bangle.setBarometerPower(settings.bar, "btadv");
if (!settings.bar)
bar = undefined;
Bangle.setGPSPower(settings.gpsEnabled, "btadv");
if (!settings.gpsEnabled)
Bangle.setGPSPower(settings.gps, "btadv");
if (!settings.gps)
gps = undefined;
Bangle.setHRMPower(settings.hrmEnabled, "btadv");
if (!settings.hrmEnabled)
Bangle.setHRMPower(settings.hrm, "btadv");
if (!settings.hrm)
hrm = undefined;
Bangle.setCompassPower(settings.magEnabled, "btadv");
if (!settings.magEnabled)
Bangle.setCompassPower(settings.mag, "btadv");
if (!settings.mag)
mag = undefined;
};
const updateSetting = (
name: keyof typeof settings,
value: boolean,
) => {
settings[name] = value;
//require('Storage').writeJSON(SETTINGS_FILENAME, settings);
enableSensors();
console.log("enableSensors():", settings);
};
// ----------------------------
@ -521,16 +620,16 @@ Bangle.on('GPS', newGps => gps = newGps);
Bangle.on('HRM', newHrm => hrm = newHrm);
Bangle.on('mag', newMag => mag = newMag);
// show widgets to affect appRect
// show UI
Bangle.loadWidgets();
Bangle.drawWidgets();
// show UI
showMainMenu();
const menuInterval = setInterval(updateMenu, Intervals.MENU_WAKE);
setBtnsShown(true);
const redrawInterval = setInterval(redraw, Intervals.MENU_WAKE);
Bangle.on("lock", locked => {
changeInterval(
menuInterval,
redrawInterval,
locked ? Intervals.MENU_SLEEP : Intervals.MENU_WAKE,
);
});
@ -573,10 +672,10 @@ const setIntervals = (connected: boolean) => {
}
};
setIntervals(NRF.getSecurityStatus().connected);
NRF.on("connect", () => {
setIntervals(true);
});
NRF.on("disconnect", () => {
setIntervals(false);
});
// setIntervals(NRF.getSecurityStatus().connected);
// NRF.on("connect", () => {
// setIntervals(true);
// });
// NRF.on("disconnect", () => {
// setIntervals(false);
// });