From 82f4832aff788c202e6d0f41c8e7fa25fa26f260 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 3 Jul 2024 18:23:12 +0100 Subject: [PATCH] widbattpwr: fork from hwid_a_battery_widget --- apps/widbattpwr/ChangeLog | 1 + apps/widbattpwr/README.md | 11 ++++++ apps/widbattpwr/metadata.json | 19 +++++++++ apps/widbattpwr/widget.js | 60 ++++++++++++++++++++++++++++ apps/widbattpwr/widget.png | Bin 0 -> 987 bytes apps/widbattpwr/widget.ts | 71 ++++++++++++++++++++++++++++++++++ 6 files changed, 162 insertions(+) create mode 100644 apps/widbattpwr/ChangeLog create mode 100644 apps/widbattpwr/README.md create mode 100644 apps/widbattpwr/metadata.json create mode 100644 apps/widbattpwr/widget.js create mode 100644 apps/widbattpwr/widget.png create mode 100644 apps/widbattpwr/widget.ts diff --git a/apps/widbattpwr/ChangeLog b/apps/widbattpwr/ChangeLog new file mode 100644 index 000000000..b1bdaa6fc --- /dev/null +++ b/apps/widbattpwr/ChangeLog @@ -0,0 +1 @@ +0.01: Initial fork from hwid_a_battery_widget diff --git a/apps/widbattpwr/README.md b/apps/widbattpwr/README.md new file mode 100644 index 000000000..4dd4c8a5a --- /dev/null +++ b/apps/widbattpwr/README.md @@ -0,0 +1,11 @@ +# Battery Power Widget + +Show the time remaining at the current power consumption, and battery percentage via shading of the text and a percentage bar. + +Requires firmware 2v23 or above. + +This is a copy of `hwid_a_battery_widget` (that being a copy of `wid_a_battery_widget`). + +## Creator + +[@bobrippling](https://github.com/bobrippling) diff --git a/apps/widbattpwr/metadata.json b/apps/widbattpwr/metadata.json new file mode 100644 index 000000000..667485666 --- /dev/null +++ b/apps/widbattpwr/metadata.json @@ -0,0 +1,19 @@ +{ + "id": "widbattpwr", + "name": "Battery power and percentage widget", + "shortName": "Batt Pwr", + "icon": "widget.png", + "version": "0.01", + "type": "widget", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "description": "A battery widget showing percentage (via shading) and time remaining at current power consumption", + "tags": "widget,battery", + "provides_widgets": ["battery"], + "storage": [ + { + "name": "widbattpwr.wid.js", + "url": "widget.js" + } + ] +} diff --git a/apps/widbattpwr/widget.js b/apps/widbattpwr/widget.js new file mode 100644 index 000000000..b6c0924d1 --- /dev/null +++ b/apps/widbattpwr/widget.js @@ -0,0 +1,60 @@ +(function () { + var intervalLow = 60000; + var intervalHigh = 2000; + var width = 30; + var height = 24; + var powerColour = function (pwr) { + return pwr >= 23000 + ? "#f00" + : pwr > 2000 + ? "#fc0" + : "#0f0"; + }; + var drawBar = function (x, y, batt) { + return g.fillRect(x + 1, y + height - 3, x + 1 + (width - 2) * batt / 100, y + height - 1); + }; + var drawString = function (x, y, txt) { + return g.drawString(txt, x + 14, y + 10); + }; + function draw() { + var x = this.x; + var y = this.y; + var batt = E.getBattery(); + var pwr = E.getPowerUsage(); + var usage = 0; + for (var key in pwr.device) { + if (!/^(LCD|LED)/.test(key)) + usage += pwr.device[key]; + } + var pwrColour = powerColour(usage); + g.reset() + .setBgColor(g.theme.bg) + .clearRect(x, y, x + width - 1, y + height - 1); + g.setColor(g.theme.fg); + drawBar(x, y, 100); + g.setColor(pwrColour); + drawBar(x, y, batt); + g.setFontAlign(0, 0); + g.setFont("Vector", 16); + { + var hrs = 200000 / usage; + var days = hrs / 24; + var txt = days >= 1 ? "".concat(Math.round(Math.min(days, 99)), "d") : "".concat(Math.round(hrs), "h"); + var txth = 14; + g.setColor(g.theme.fg); + g.setClipRect(x, y, x + width, y + txth); + drawString(x, y, txt); + g.setColor(pwrColour); + g.setClipRect(x, y + txth * (1 - batt / 100), x + width, y + txth); + drawString(x, y, txt); + } + } + var id = setInterval(function () { + var w = WIDGETS["battpwr"]; + w.draw(w); + }, intervalLow); + Bangle.on("charging", function (charging) { + changeInterval(id, charging ? intervalHigh : intervalLow); + }); + WIDGETS["battpwr"] = { area: "tr", width: width, draw: draw }; +})(); diff --git a/apps/widbattpwr/widget.png b/apps/widbattpwr/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a8284a1a7494cf510e06ce2764deb126fbd8e0 GIT binary patch literal 987 zcmeAS@N?(olHy`uVBq!ia0vp^ia;#I!2~3?SuY9$QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI&u`8WOFbu zF$ys-16hnf$k3k2zyfA7FaS*g0_Fvb2-yWpa9PC#%y708Na3X%^-cx`CZo)dh>{3j zAFJg2T)o7U{G?R9irfN_0tTB3D*7iAWdWaj57fXq!y$}cUkRZ;?3 z1P2gzrdDJkY|1N!dJE`5eUOa4p`L+0Hf<%DX*jfjWFXqW{(@L%12W7iAhRMhC(!q`k+un3S~$Xf<=LGXvbxv4^IzvT*U^Bw}46HjHioZhzIZ6DUE#1 z3Op`HfBfHn#!Kt#isLJ~^$ZgYg?D_DTl;9!nfNWtoXo}Ntb9AyCvWJ9ov|vb=~7lE z+lHyT*=9G_D?YrY_pslpZkxoXZ&peSIv-{FS1mR>zb)g}mAjw*X>HjlQOw8i^+jm* zfwW1>rguHdzReVWrr+>F)F$h=qtiVN+1|bSWpQjmUPO9JV{&^+(AwTi)xEEdTvzd8 zH4S4w#3gy7WL5X)`mzTn`3_{?u~rhDe^PQ~)PKGB7axAU*v&Jw-k@!Eh35hGITzJc TcL_ee4odr;u6{1-oD!M<$*?)d literal 0 HcmV?d00001 diff --git a/apps/widbattpwr/widget.ts b/apps/widbattpwr/widget.ts new file mode 100644 index 000000000..b39412179 --- /dev/null +++ b/apps/widbattpwr/widget.ts @@ -0,0 +1,71 @@ +(() => { + const intervalLow = 60000; + const intervalHigh = 2000; + const width = 30; + const height = 24; + + const powerColour = (pwr: number) => + pwr >= 23000 + ? "#f00" // red, e.g. GPS ~20k + : pwr > 2000 + ? "#fc0" // yellow, e.g. CPU ~1k, HRM ~700 + : "#0f0"; // green: ok + + const drawBar = (x: number, y: number, batt: number) => + g.fillRect(x+1, y+height-3, x+1+(width-2)*batt/100, y+height-1); + + const drawString = (x: number, y: number, txt: string) => + g.drawString(txt, x + 14, y + 10); + + function draw(this: Widget) { + let x = this.x!; + let y = this.y!; + + const batt = E.getBattery(); + const pwr = E.getPowerUsage(); + let usage = 0; + for(const key in pwr.device){ + if(!/^(LCD|LED)/.test(key)) + usage += pwr.device[key]; + } + const pwrColour = powerColour(usage); + + g.reset() + .setBgColor(g.theme.bg) + .clearRect(x, y, x + width - 1, y + height - 1); + + g.setColor(g.theme.fg); + drawBar(x, y, 100); + g.setColor(pwrColour); + drawBar(x, y, batt); + + g.setFontAlign(0, 0); + g.setFont("Vector", 16); + { + const hrs = 200000 / usage; + const days = hrs / 24; + const txt = days >= 1 ? `${Math.round(Math.min(days, 99))}d` : `${Math.round(hrs)}h`; + + // draw time remaining, then shade it based on batt % + const txth = 14; + g.setColor(g.theme.fg); + g.setClipRect(x, y, x + width, y + txth); + drawString(x, y, txt); + + g.setColor(pwrColour); + g.setClipRect(x, y + txth * (1 - batt / 100), x + width, y + txth); + drawString(x, y, txt); + } + } + + const id = setInterval(() => { + const w = WIDGETS["battpwr"]!; + w.draw(w); + }, intervalLow); + + Bangle.on("charging", charging => { + changeInterval(id, charging ? intervalHigh : intervalLow); + }); + + WIDGETS["battpwr"] = { area: "tr", width, draw }; +})();