diff --git a/apps/lowpower/ChangeLog b/apps/lowpower/ChangeLog new file mode 100644 index 000000000..1a3bc1757 --- /dev/null +++ b/apps/lowpower/ChangeLog @@ -0,0 +1 @@ +0.01: New app! diff --git a/apps/lowpower/README.md b/apps/lowpower/README.md new file mode 100644 index 000000000..e139d3d23 --- /dev/null +++ b/apps/lowpower/README.md @@ -0,0 +1,25 @@ +# Low Power Mode + +With this app installed, your Bangle will automatically switch into low power mode when the battery reaches a specified threshold, displaying a simple clock. + +# Features + +## Time +[x] Show simple date/time +[ ] Disable alarms - with a setting? + +## No backlight (#2502) +[x] LCD brightness +[ ] LCD timeout + +## Peripherals +[x] Disable auto heart rate measurement in health app (#2502) +[x] Overwrite setGPSPower() function (#2502) +[ ] Turn off already-running GPS / HRM + +## Features +[ ] Wake on twist -> off (#2502) + +# Creator + +[bobrippling](https://github.com/bobrippling/) diff --git a/apps/lowpower/app.js b/apps/lowpower/app.js new file mode 100644 index 000000000..63709cc2b --- /dev/null +++ b/apps/lowpower/app.js @@ -0,0 +1,40 @@ +"use strict"; +if (typeof lowpowerInterval !== "undefined") + lowpowerInterval = clearInterval(lowpowerInterval); +Bangle.setLCDBrightness(0); +Bangle.setGPSPower = Bangle.setHRMPower = function (_val, _name) { return false; }; +Bangle.removeAllListeners(); +var nextDraw; +var draw = function () { + var x = g.getWidth() / 2; + var y = g.getHeight() / 2 - 48; + var date = new Date(); + var timeStr = require("locale").time(date, 1); + var dateStr = require("locale").date(date, 0).toUpperCase() + + "\n" + + require("locale").dow(date, 0).toUpperCase(); + g.reset() + .clearRect(Bangle.appRect) + .setFont("Vector", 32) + .setFontAlign(0, 0) + .drawString(timeStr, x, y) + .setFont("Vector", 24) + .drawString(dateStr, x, y + 56) + .drawString("".concat(E.getBattery(), "%"), x, y + 104); + if (nextDraw) + clearTimeout(nextDraw); + nextDraw = setTimeout(function () { + nextDraw = undefined; + draw(); + }, 60000 - (date.getTime() % 60000)); +}; +Bangle.setUI({ + mode: "clock", + remove: function () { + if (nextDraw) + clearTimeout(nextDraw); + nextDraw = undefined; + }, +}); +g.clear(); +draw(); diff --git a/apps/lowpower/app.ts b/apps/lowpower/app.ts new file mode 100644 index 000000000..fadc6ef4a --- /dev/null +++ b/apps/lowpower/app.ts @@ -0,0 +1,52 @@ +// from boot.js +if(typeof lowpowerInterval !== "undefined") + lowpowerInterval = clearInterval(lowpowerInterval) as undefined; + +// backlight +Bangle.setLCDBrightness(0); + +// peripherals +Bangle.setGPSPower = Bangle.setHRMPower = (_val: boolean, _name: string) => false; + +// events +Bangle.removeAllListeners(); + +// clock +let nextDraw: number | undefined; +const draw = () => { + const x = g.getWidth() / 2; + const y = g.getHeight() / 2 - 48; + + const date = new Date(); + + const timeStr = require("locale").time(date, 1); + const dateStr = require("locale").date(date, 0).toUpperCase() + + "\n" + + require("locale").dow(date, 0).toUpperCase(); + + g.reset() + .clearRect(Bangle.appRect) + .setFont("Vector", 32) + .setFontAlign(0, 0) + .drawString(timeStr, x, y) + .setFont("Vector", 24) + .drawString(dateStr, x, y + 56) + .drawString(`${E.getBattery()}%`, x, y + 104); + + if(nextDraw) clearTimeout(nextDraw); + nextDraw = setTimeout(() => { + nextDraw = undefined; + draw(); + }, 60000 - (date.getTime() % 60000)); +}; + +Bangle.setUI({ + mode: "clock", + remove: () => { + if (nextDraw) clearTimeout(nextDraw); + nextDraw = undefined; + }, +}); + +g.clear(); +draw(); diff --git a/apps/lowpower/boot.js b/apps/lowpower/boot.js new file mode 100644 index 000000000..56a02c6ad --- /dev/null +++ b/apps/lowpower/boot.js @@ -0,0 +1,8 @@ +"use strict"; +var lowpowerInterval = setInterval(function () { + if (Bangle.isCharging()) + return; + if (E.getBattery() > 5) + return; + load("lowpower.app.js"); +}, 5 * 60 * 1000); diff --git a/apps/lowpower/boot.ts b/apps/lowpower/boot.ts new file mode 100644 index 000000000..bb4cfa0b4 --- /dev/null +++ b/apps/lowpower/boot.ts @@ -0,0 +1,8 @@ +let lowpowerInterval: number | undefined = setInterval(() => { + if(Bangle.isCharging()) + return; + if(E.getBattery() > 5) + return; + + load("lowpower.app.js"); +}, 5 * 60 * 1000); diff --git a/apps/lowpower/metadata.json b/apps/lowpower/metadata.json new file mode 100644 index 000000000..c231bd495 --- /dev/null +++ b/apps/lowpower/metadata.json @@ -0,0 +1,15 @@ +{ + "id": "lowpower", + "name": "Low Power Mode", + "version": "0.01", + "description": "Switches to displaying a simple clock when the battery percentage is low, nothing more", + "readme": "README.md", + "icon": "TODOOOOOOOOOOOOOOOO.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"lowpower.boot.js","url":"boot.js"}, + {"name":"lowpower.app.js","url":"app.js"} + ] +}