BangleApps/apps/btadv/app.js

388 lines
12 KiB
JavaScript
Raw Normal View History

2023-01-20 21:04:11 +00:00
"use strict";
2023-01-20 22:28:14 +00:00
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);
};
2023-01-22 21:59:27 +00:00
var services = ["0x180d", "0x181a", "0x1819"];
2023-01-20 21:04:11 +00:00
var acc;
var bar;
var gps;
var hrm;
var mag;
2023-01-26 23:03:40 +00:00
var curMenuName = "main";
var curMenu;
2023-01-20 21:04:11 +00:00
var mainMenuScroll = 0;
var settings = {
barEnabled: false,
gpsEnabled: false,
hrmEnabled: false,
magEnabled: false,
};
var showMainMenu = function () {
var onOff = function (b) { return b ? " (on)" : " (off)"; };
var mainMenu = {};
var showMenu = function (menu, scroll, cur) { return function () {
mainMenuScroll = scroll;
2023-01-26 23:03:40 +00:00
curMenu = E.showMenu(menu);
curMenuName = cur;
2023-01-20 21:04:11 +00:00
}; };
mainMenu[""] = {
2023-01-20 22:28:14 +00:00
"title": "BLE Advert",
2023-01-20 21:04:11 +00:00
};
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(); };
2023-01-26 23:03:40 +00:00
curMenu = E.showMenu(mainMenu);
curMenuName = "main";
2023-01-20 21:04:11 +00:00
};
2023-01-20 22:28:14 +00:00
var optionsCommon = {
back: showMainMenu,
};
2023-01-20 21:04:11 +00:00
var accMenu = {
2023-01-22 21:59:27 +00:00
"": __assign({ "title": "Acceleration" }, optionsCommon),
2023-01-20 21:04:11 +00:00
"Active": { value: "true (fixed)" },
"x": { value: "" },
"y": { value: "" },
"z": { value: "" },
};
var barMenu = {
2023-01-20 22:28:14 +00:00
"": __assign({ "title": "Barometer" }, optionsCommon),
2023-01-20 21:04:11 +00:00
"Active": {
value: settings.barEnabled,
onchange: function (v) { return updateSetting('barEnabled', v); },
},
"Altitude": { value: "" },
"Press": { value: "" },
"Temp": { value: "" },
};
var gpsMenu = {
2023-01-20 22:28:14 +00:00
"": __assign({ "title": "GPS" }, optionsCommon),
2023-01-20 21:04:11 +00:00
"Active": {
value: settings.gpsEnabled,
onchange: function (v) { return updateSetting('gpsEnabled', v); },
},
"Lat": { value: "" },
"Lon": { value: "" },
"Altitude": { value: "" },
"Satellites": { value: "" },
"HDOP": { value: "" },
};
var hrmMenu = {
2023-01-22 21:59:27 +00:00
"": __assign({ "title": "Heart Rate" }, optionsCommon),
2023-01-20 21:04:11 +00:00
"Active": {
value: settings.hrmEnabled,
onchange: function (v) { return updateSetting('hrmEnabled', v); },
},
"BPM": { value: "" },
"Confidence": { value: "" },
};
var magMenu = {
2023-01-20 22:28:14 +00:00
"": __assign({ "title": "Magnetometer" }, optionsCommon),
2023-01-20 21:04:11 +00:00
"Active": {
value: settings.magEnabled,
onchange: function (v) { return updateSetting('magEnabled', v); },
},
"x": { value: "" },
"y": { value: "" },
"z": { value: "" },
"Heading": { value: "" },
};
2023-01-26 23:03:40 +00:00
var redrawMenu = function (newMenu) {
var scroll = curMenu.scroller.scroll;
curMenu = E.showMenu(newMenu);
curMenu.scroller.scroll = scroll;
curMenu.draw();
};
2023-01-20 21:04:11 +00:00
var updateMenu = function () {
2023-01-26 23:03:40 +00:00
switch (curMenuName) {
2023-01-20 21:04:11 +00:00
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);
2023-01-26 23:03:40 +00:00
redrawMenu(accMenu);
2023-01-20 21:04:11 +00:00
}
2023-01-21 00:14:02 +00:00
else if (accMenu.x.value !== "...") {
accMenu.x.value = accMenu.y.value = accMenu.z.value = "...";
2023-01-26 23:03:40 +00:00
redrawMenu(accMenu);
2023-01-21 00:14:02 +00:00
}
2023-01-20 21:04:11 +00:00
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';
2023-01-26 23:03:40 +00:00
redrawMenu(barMenu);
2023-01-20 21:04:11 +00:00
}
2023-01-21 00:14:02 +00:00
else if (barMenu.Altitude.value !== "...") {
barMenu.Altitude.value = barMenu.Press.value = barMenu.Temp.value = "...";
2023-01-26 23:03:40 +00:00
redrawMenu(accMenu);
2023-01-21 00:14:02 +00:00
}
2023-01-20 21:04:11 +00:00
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';
2023-01-26 23:03:40 +00:00
redrawMenu(gpsMenu);
2023-01-20 21:04:11 +00:00
}
2023-01-21 00:14:02 +00:00
else if (gpsMenu.Lat.value !== "...") {
gpsMenu.Lat.value = gpsMenu.Lon.value = gpsMenu.Altitude.value =
gpsMenu.Satellites.value = gpsMenu.HDOP.value = "...";
2023-01-26 23:03:40 +00:00
redrawMenu(gpsMenu);
2023-01-21 00:14:02 +00:00
}
2023-01-20 21:04:11 +00:00
break;
case "hrm":
if (hrm) {
hrmMenu.BPM.value = "" + hrm.bpm;
hrmMenu.Confidence.value = hrm.confidence + '%';
2023-01-26 23:03:40 +00:00
redrawMenu(hrmMenu);
2023-01-20 21:04:11 +00:00
}
2023-01-21 00:14:02 +00:00
else if (hrmMenu.BPM.value !== "...") {
hrmMenu.BPM.value = hrmMenu.Confidence.value = "...";
2023-01-26 23:03:40 +00:00
redrawMenu(hrmMenu);
2023-01-21 00:14:02 +00:00
}
2023-01-20 21:04:11 +00:00
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);
2023-01-26 23:03:40 +00:00
redrawMenu(magMenu);
2023-01-20 21:04:11 +00:00
}
2023-01-21 00:14:02 +00:00
else if (magMenu.x.value !== "...") {
magMenu.x.value = magMenu.y.value = magMenu.z.value = magMenu.Heading.value = "...";
2023-01-26 23:03:40 +00:00
redrawMenu(magMenu);
2023-01-21 00:14:02 +00:00
}
2023-01-20 21:04:11 +00:00
break;
}
2023-01-13 22:06:02 +00:00
};
2023-01-22 21:59:27 +00:00
var encodeHrm = function (hrm) {
2023-01-26 23:03:40 +00:00
return [0, hrm.bpm];
2023-01-20 21:04:11 +00:00
};
2023-01-26 23:03:40 +00:00
encodeHrm.maxLen = 2;
2023-01-22 21:59:27 +00:00
var encodePressure = function (data) {
return toByteArray(Math.round(data.pressure * 1000), 4, false);
};
2023-01-26 23:03:40 +00:00
encodePressure.maxLen = 4;
2023-01-22 21:59:27 +00:00
var encodeElevation = function (data) {
return toByteArray(Math.round(data.altitude * 100), 3, true);
2023-01-20 21:04:11 +00:00
};
2023-01-26 23:03:40 +00:00
encodeElevation.maxLen = 3;
2023-01-22 21:59:27 +00:00
var encodeTemp = function (data) {
return toByteArray(Math.round(data.temperature * 100), 2, true);
};
2023-01-26 23:03:40 +00:00
encodeTemp.maxLen = 2;
2023-01-22 21:59:27 +00:00
var encodeGps = function (data) {
var speed = toByteArray(Math.round(1000 * data.speed / 36), 2, false);
2023-01-20 21:04:11 +00:00
var lat = toByteArray(Math.round(data.lat * 10000000), 4, true);
var lon = toByteArray(Math.round(data.lon * 10000000), 4, true);
2023-01-22 21:59:27 +00:00
var elevation = toByteArray(Math.round(data.alt * 100), 3, true);
var heading = toByteArray(Math.round(data.course * 100), 2, false);
2023-01-20 21:04:11 +00:00
return [
2023-01-22 21:59:27 +00:00
0x9d,
0x2,
speed[0], speed[1],
lat[0], lat[1], lat[2], lat[3],
lon[0], lon[1], lon[2], lon[3],
elevation[0], elevation[1], elevation[2],
heading[0], heading[1]
2023-01-20 21:04:11 +00:00
];
};
2023-01-26 23:03:40 +00:00
encodeGps.maxLen = 17;
2023-01-22 21:59:27 +00:00
var encodeMag = function (data) {
2023-01-20 21:04:11 +00:00
var x = toByteArray(data.x, 2, true);
var y = toByteArray(data.y, 2, true);
var z = toByteArray(data.z, 2, true);
2023-01-22 21:59:27 +00:00
return [x[0], x[1], y[0], y[1], z[0], z[1]];
2023-01-20 21:04:11 +00:00
};
2023-01-26 23:03:40 +00:00
encodeMag.maxLen = 6;
2023-01-20 21:04:11 +00:00
var toByteArray = function (value, numberOfBytes, isSigned) {
var byteArray = new Array(numberOfBytes);
if (isSigned && (value < 0)) {
value += 1 << (numberOfBytes * 8);
}
for (var index = 0; index < numberOfBytes; index++) {
byteArray[index] = (value >> (index * 8)) & 0xff;
}
return byteArray;
2023-01-13 22:06:02 +00:00
};
2023-01-20 21:04:11 +00:00
var enableSensors = function () {
Bangle.setBarometerPower(settings.barEnabled, "btadv");
2023-01-21 00:14:02 +00:00
if (!settings.barEnabled)
bar = undefined;
2023-01-20 21:04:11 +00:00
Bangle.setGPSPower(settings.gpsEnabled, "btadv");
2023-01-21 00:14:02 +00:00
if (!settings.gpsEnabled)
gps = undefined;
2023-01-20 21:04:11 +00:00
Bangle.setHRMPower(settings.hrmEnabled, "btadv");
2023-01-21 00:14:02 +00:00
if (!settings.hrmEnabled)
hrm = undefined;
2023-01-20 21:04:11 +00:00
Bangle.setCompassPower(settings.magEnabled, "btadv");
2023-01-21 00:14:02 +00:00
if (!settings.magEnabled)
mag = undefined;
2023-01-13 22:06:02 +00:00
};
2023-01-20 21:04:11 +00:00
var updateSetting = function (name, value) {
settings[name] = value;
enableSensors();
2023-01-13 22:06:02 +00:00
};
2023-01-22 21:59:27 +00:00
var serviceActive = function (serv) {
switch (serv) {
case "0x180d": return !!hrm;
case "0x181a": return !!(bar || mag);
case "0x1819": return !!(gps && gps.lat && gps.lon);
}
};
2023-01-26 23:03:40 +00:00
var serviceToAdvert = function (serv, initial) {
2023-01-20 22:28:14 +00:00
var _a, _b;
2023-01-26 23:03:40 +00:00
if (initial === void 0) { initial = false; }
2023-01-22 21:59:27 +00:00
switch (serv) {
case "0x180d":
2023-01-26 23:03:40 +00:00
if (hrm || initial) {
var o = {
maxLen: encodeHrm.maxLen,
readable: true,
notify: true,
};
if (hrm) {
o.value = encodeHrm(hrm);
}
return _a = {}, _a["0x2a37"] = o, _a;
2023-01-22 21:59:27 +00:00
}
return {};
case "0x1819":
2023-01-26 23:03:40 +00:00
if (gps || initial) {
var o = {
maxLen: encodeGps.maxLen,
readable: true,
notify: true,
};
if (gps) {
o.value = encodeGps(gps);
}
return _b = {}, _b["0x2a67"] = o, _b;
2023-01-22 21:59:27 +00:00
}
return {};
case "0x181a": {
var o = {};
2023-01-26 23:03:40 +00:00
if (bar || initial) {
2023-01-22 21:59:27 +00:00
o["0x2a6c"] = {
2023-01-26 23:03:40 +00:00
maxLen: encodeElevation.maxLen,
2023-01-22 21:59:27 +00:00
readable: true,
notify: true,
};
o["0x2A1F"] = {
2023-01-26 23:03:40 +00:00
maxLen: encodeTemp.maxLen,
2023-01-22 21:59:27 +00:00
readable: true,
notify: true,
};
o["0x2a6d"] = {
2023-01-26 23:03:40 +00:00
maxLen: encodePressure.maxLen,
2023-01-22 21:59:27 +00:00
readable: true,
notify: true,
};
2023-01-26 23:03:40 +00:00
if (bar) {
o["0x2a6c"].value = encodeElevation(bar);
o["0x2A1F"].value = encodeTemp(bar);
o["0x2a6d"].value = encodePressure(bar);
}
2023-01-22 21:59:27 +00:00
}
2023-01-26 23:03:40 +00:00
if (mag || initial) {
2023-01-22 21:59:27 +00:00
o["0x2aa1"] = {
2023-01-26 23:03:40 +00:00
maxLen: encodeMag.maxLen,
2023-01-22 21:59:27 +00:00
readable: true,
notify: true,
};
2023-01-26 23:03:40 +00:00
if (mag) {
o["0x2aa1"].value = encodeMag(mag);
}
2023-01-22 21:59:27 +00:00
}
return o;
}
}
};
2023-01-26 23:03:40 +00:00
var getBleAdvert = function (map, all) {
if (all === void 0) { all = false; }
2023-01-22 21:59:27 +00:00
var advert = {};
for (var _i = 0, services_1 = services; _i < services_1.length; _i++) {
var serv = services_1[_i];
2023-01-26 23:03:40 +00:00
if (all || serviceActive(serv)) {
2023-01-22 21:59:27 +00:00
advert[serv] = map(serv);
}
}
return advert;
};
var updateBleAdvert = function () {
var bleAdvert;
if (!(bleAdvert = Bangle.bleAdvert)) {
bleAdvert = getBleAdvert(function (_) { return undefined; });
Bangle.bleAdvert = bleAdvert;
}
try {
NRF.setAdvertising(bleAdvert);
}
catch (e) {
console.log("setAdvertising(): " + e);
}
2023-01-13 22:06:02 +00:00
};
2023-01-22 21:59:27 +00:00
var updateServices = function () {
var newAdvert = getBleAdvert(serviceToAdvert);
2023-01-26 23:03:40 +00:00
NRF.updateServices(newAdvert);
2023-01-22 21:59:27 +00:00
};
2023-01-26 23:03:40 +00:00
Bangle.on('accel', function (newAcc) { return acc = newAcc; });
Bangle.on('pressure', function (newBar) { return bar = newBar; });
Bangle.on('GPS', function (newGps) { return gps = newGps; });
Bangle.on('HRM', function (newHrm) { return hrm = newHrm; });
Bangle.on('mag', function (newMag) { return mag = newMag; });
2023-01-21 00:14:02 +00:00
Bangle.loadWidgets();
Bangle.drawWidgets();
2023-01-13 22:06:02 +00:00
showMainMenu();
2023-01-21 00:14:02 +00:00
var menuInterval = setInterval(updateMenu, 1000);
Bangle.on("lock", function (locked) {
changeInterval(menuInterval, locked ? 30000 : 1000);
});
2023-01-22 21:59:27 +00:00
enableSensors();
2023-01-26 23:03:40 +00:00
{
var ad = getBleAdvert(function (serv) { return serviceToAdvert(serv, true); }, true);
NRF.setServices(ad, {
advertise: Object
.keys(ad)
.map(function (k) { return k.replace("0x", ""); })
});
}
2023-01-22 21:59:27 +00:00
var iv;
var setIntervals = function (connected) {
if (connected) {
if (iv) {
changeInterval(iv, 1000);
}
else {
2023-01-26 23:03:40 +00:00
iv = setInterval(updateServices, 1000);
2023-01-22 21:59:27 +00:00
}
}
else if (iv) {
clearInterval(iv);
2023-01-26 23:03:40 +00:00
iv = undefined;
2023-01-22 21:59:27 +00:00
}
};
setIntervals(NRF.getSecurityStatus().connected);
2023-01-20 21:04:11 +00:00
NRF.on("connect", function () {
2023-01-22 21:59:27 +00:00
setIntervals(true);
2023-01-13 22:06:02 +00:00
});
2023-01-20 21:04:11 +00:00
NRF.on("disconnect", function () {
2023-01-22 21:59:27 +00:00
setIntervals(false);
2023-01-13 22:06:02 +00:00
});