From 3feaf83dadc6c63f62ffb26b3fbf9885b969f494 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 11 Jul 2025 19:56:43 -0400 Subject: [PATCH 01/20] Create widget.js --- apps/widsmartbatt/widget.js | 110 ++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 apps/widsmartbatt/widget.js diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js new file mode 100644 index 000000000..b8323f24b --- /dev/null +++ b/apps/widsmartbatt/widget.js @@ -0,0 +1,110 @@ +//Learns by averaging power usage every time it is updated + + +(function(){ + + + const storage = require("Storage"); + const filename = "widsmartbatt.json"; + let runningAvg; + var newJson=false; + + //check if json file exists; + + function CalcHoursRemaining (batt, usage) { + + var hrsLeft = 175000 * batt / (100 * usage); + return hrsLeft; + + }; + + function addValue(val) { + let summary = storage.readJSON(filename, 1) || { total: 0, count: 0 }; + summary.total += val; + summary.count++; + storage.writeJSON(filename, summary); // SAVED! + + let avg = summary.total / summary.count; + runningAvg=avg; + } + + + const intervalLow = 60000; // update time when not charging + const intervalHigh = 2000; // update time when charging + var showPercent=false; + const width=40; + const height=24; + let COLORS = { + 'bg': g.theme.bg, + 'fg': g.theme.fg, + 'charging': "#08f", + 'high': g.theme.dark ? "#fff" : "#000", + 'low': "#f00", + }; + + const levelColor = (l) => { + if (Bangle.isCharging()) return COLORS.charging; + if (l >= 30) return COLORS.high; + return COLORS.low; + }; + + function draw() { + var _a = require("power_usage").get(), usage = _a.usage, batt = _a.batt; + var s = 29; + var x = this.x, y = this.y; + var txt; + + //Add this to total and get the average + addValue(usage) + + if(showPercent){ + txt=batt; + }else{ + var hrsLeft=CalcHoursRemaining(batt,runningAvg); + var days = hrsLeft / 24; + txt = days >= 1 ? "".concat(Math.round(Math.min(days, 99)), "d") : "".concat(Math.round(hrsLeft), "h"); + } + + + let xl = x+4+batt*(s-12)/100; + + g.setColor(COLORS.bg); + g.fillRect(x+2,y+5,x+s-6,y+18); + + g.setColor(levelColor(batt)); + g.fillRect(x+1,y+3,x+s-5,y+4); + g.fillRect(x+1,y+19,x+s-5,y+20); + g.fillRect(x,y+4,x+1,y+19); + g.fillRect(x+s-5,y+4,x+s-4,y+19); + g.fillRect(x+s-3,y+8,x+s-2,y+16); // tip of the battery + g.fillRect(x+4,y+15,xl,y+16); // charging bar + + g.setColor(COLORS.fg); + g.setFontAlign(0,0); + g.setFont('6x8'); + g.drawString(txt, x + 14, y + 10); + + if (Bangle.isCharging()) changeInterval(id, intervalHigh); + else changeInterval(id, intervalLow); + } + + + Bangle.on('charging',function(charging) { draw(); }); + var id = setInterval(()=>WIDGETS["widsmartbatt"].draw(), intervalLow); + Bangle.on("touch", function (_btn, xy) { + if (WIDGETS["back"] || !xy) + return; + var oversize = 5; + + var w = WIDGETS["widsmartbatt"]; + var x = xy.x, y = xy.y; + if (w.x - oversize <= x && x < w.x + width + oversize + && w.y - oversize <= y && y < w.y + height + oversize) { + E.stopEventPropagation && E.stopEventPropagation(); + showPercent = true; + setTimeout(function () { return (showPercent = false, w.draw(w)); }, 3000); + w.draw(w); + } + }); + WIDGETS["widsmartbatt"]={area:"tr",width:30,draw:draw}; +})(); From 4f9aa34b60ba40857d252beee9024b9e2bd5cb10 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 11 Jul 2025 22:19:45 -0400 Subject: [PATCH 02/20] Create README.md --- apps/widsmartbatt/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/widsmartbatt/README.md diff --git a/apps/widsmartbatt/README.md b/apps/widsmartbatt/README.md new file mode 100644 index 000000000..0a29819af --- /dev/null +++ b/apps/widsmartbatt/README.md @@ -0,0 +1,12 @@ +# Smart Battery Widget +Shows battery in terms of days (21 days, 12 hours), and learns from your daily usage to give better estimations. +This app was modified from `wid_a_battery_widget`, by @alainsaas + +When you install the app for the first time, or clear the data, the forecast will fluctate, and will not be reliable for a while. As it learns from your usage, it will keep learning, and provide better predictions. +The app learns by averaging all the power draw whenever it needs to draw, and saves it to a json, averaging it with many others, providing an accurate prediction. The app gives the best forecast when you use the watch relatively similar per day. + +Tap on the widget to show the battery percentage. It will go back to the days left after 3 seconds. +## Settings +* Clear Data - Clears the learned data. Useful when you change something fundamental that affects battery usage. (eg. New clock, turn on GPS daily, LCD backlight setting changes.) +## Creator +RKBoss6 From 2da0831c48be7f3830fbd17105033aba3d009ae1 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 11 Jul 2025 22:22:44 -0400 Subject: [PATCH 03/20] Create metadata.json --- apps/widsmartbatt/metadata.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 apps/widsmartbatt/metadata.json diff --git a/apps/widsmartbatt/metadata.json b/apps/widsmartbatt/metadata.json new file mode 100644 index 000000000..17b53d4a2 --- /dev/null +++ b/apps/widsmartbatt/metadata.json @@ -0,0 +1,17 @@ +{ + "id": "widsmartbatt", + "name": "Smart Battery Widget", + "shortName":"Smart Batt", + "icon": "icon.png", + "version":"0.01", + "type": "widget", + "supports": ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "description": "Simple and slim battery widget that shows days remaining, and learns from your usage to tailor the days remaining to you.", + "tags": "widget,battery", + "provides_widgets" : ["battery"], + "storage": [ + {"name":"widsmartbatt.js","url":"widget.js"}, + {"name":"widsmartbatt.settings.js","url":"settings.js"} + ] +} From faa6257974287a6bbb448526aaf2247d890129b9 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 24 Jul 2025 16:18:42 -0400 Subject: [PATCH 04/20] Update metadata.json --- apps/widsmartbatt/metadata.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/widsmartbatt/metadata.json b/apps/widsmartbatt/metadata.json index 17b53d4a2..a8878bf98 100644 --- a/apps/widsmartbatt/metadata.json +++ b/apps/widsmartbatt/metadata.json @@ -1,17 +1,16 @@ { "id": "widsmartbatt", "name": "Smart Battery Widget", - "shortName":"Smart Batt", + "shortName":"Smart Batt Wid", "icon": "icon.png", "version":"0.01", "type": "widget", "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", - "description": "Simple and slim battery widget that shows days remaining, and learns from your usage to tailor the days remaining to you.", + "description": "Simple and slim battery widget that shows days remaining, and uses the `smartbatt` module to learm from your usage and provide accurate predictions.", "tags": "widget,battery", "provides_widgets" : ["battery"], "storage": [ - {"name":"widsmartbatt.js","url":"widget.js"}, - {"name":"widsmartbatt.settings.js","url":"settings.js"} + {"name":"widsmartbatt.js","url":"widget.js"} ] } From 725d16044268ecdfe58299f522ad39e76bed5c94 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 24 Jul 2025 16:19:54 -0400 Subject: [PATCH 05/20] Update widget.js --- apps/widsmartbatt/widget.js | 157 ++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 87 deletions(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index b8323f24b..df299f99c 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -1,45 +1,17 @@ -//Learns by averaging power usage every time it is updated - - (function(){ - - - const storage = require("Storage"); - const filename = "widsmartbatt.json"; - let runningAvg; - var newJson=false; - - //check if json file exists; - - function CalcHoursRemaining (batt, usage) { - - var hrsLeft = 175000 * batt / (100 * usage); - return hrsLeft; - - }; - - function addValue(val) { - let summary = storage.readJSON(filename, 1) || { total: 0, count: 0 }; - summary.total += val; - summary.count++; - storage.writeJSON(filename, summary); // SAVED! - let avg = summary.total / summary.count; - runningAvg=avg; - } + const intervalLow = 30000; // update interval when not charging + const intervalHigh = 30000; // faster update when charging + var showPercent = false; + const width = 40; + const height = 24; - - const intervalLow = 60000; // update time when not charging - const intervalHigh = 2000; // update time when charging - var showPercent=false; - const width=40; - const height=24; let COLORS = { - 'bg': g.theme.bg, - 'fg': g.theme.fg, + 'bg': g.theme.bg, + 'fg': g.theme.fg, 'charging': "#08f", - 'high': g.theme.dark ? "#fff" : "#000", - 'low': "#f00", + 'high': g.theme.dark ? "#fff" : "#000", + 'low': "#f00", }; const levelColor = (l) => { @@ -49,62 +21,73 @@ }; function draw() { - var _a = require("power_usage").get(), usage = _a.usage, batt = _a.batt; - var s = 29; - var x = this.x, y = this.y; - var txt; - - //Add this to total and get the average - addValue(usage) - - if(showPercent){ - txt=batt; - }else{ - var hrsLeft=CalcHoursRemaining(batt,runningAvg); - var days = hrsLeft / 24; - txt = days >= 1 ? "".concat(Math.round(Math.min(days, 99)), "d") : "".concat(Math.round(hrsLeft), "h"); - } - + let batt=E.getBattery(); + let data = require("smartbatt").get(); + let hrsLeft=data.hrsLeft; + let days = hrsLeft / 24; - let xl = x+4+batt*(s-12)/100; + let txt = showPercent + ? batt + : (days >= 1 + ? Math.round(Math.min(days, 99)) + "d" + : Math.round(hrsLeft) + "h"); + if(Bangle.isCharging()) txt=E.getBattery(); + let s = 29; + let x = this.x, y = this.y; + let xl = x + 4 + batt * (s - 12) / 100; + + // Drawing code follows... + g.setColor(COLORS.bg); + g.fillRect(x + 2, y + 5, x + s - 6, y + 18); - g.setColor(COLORS.bg); - g.fillRect(x+2,y+5,x+s-6,y+18); + g.setColor(levelColor(batt)); + g.fillRect(x + 1, y + 3, x + s - 5, y + 4); + g.fillRect(x + 1, y + 19, x + s - 5, y + 20); + g.fillRect(x, y + 4, x + 1, y + 19); + g.fillRect(x + s - 5, y + 4, x + s - 4, y + 19); + g.fillRect(x + s - 3, y + 8, x + s - 2, y + 16); + g.fillRect(x + 4, y + 15, xl, y + 16); - g.setColor(levelColor(batt)); - g.fillRect(x+1,y+3,x+s-5,y+4); - g.fillRect(x+1,y+19,x+s-5,y+20); - g.fillRect(x,y+4,x+1,y+19); - g.fillRect(x+s-5,y+4,x+s-4,y+19); - g.fillRect(x+s-3,y+8,x+s-2,y+16); // tip of the battery - g.fillRect(x+4,y+15,xl,y+16); // charging bar + g.setColor(COLORS.fg); + g.setFontAlign(0, 0); + g.setFont('6x8'); + g.drawString(txt, x + 14, y + 10); - g.setColor(COLORS.fg); - g.setFontAlign(0,0); - g.setFont('6x8'); - g.drawString(txt, x + 14, y + 10); - - if (Bangle.isCharging()) changeInterval(id, intervalHigh); - else changeInterval(id, intervalLow); - } + if (Bangle.isCharging()) changeInterval(id, intervalHigh); + else changeInterval(id, intervalLow); +} - Bangle.on('charging',function(charging) { draw(); }); - var id = setInterval(()=>WIDGETS["widsmartbatt"].draw(), intervalLow); + // Touch to temporarily show battery percent Bangle.on("touch", function (_btn, xy) { - if (WIDGETS["back"] || !xy) - return; - var oversize = 5; + if (WIDGETS["back"] || !xy) return; - var w = WIDGETS["widsmartbatt"]; - var x = xy.x, y = xy.y; - if (w.x - oversize <= x && x < w.x + width + oversize - && w.y - oversize <= y && y < w.y + height + oversize) { - E.stopEventPropagation && E.stopEventPropagation(); - showPercent = true; - setTimeout(function () { return (showPercent = false, w.draw(w)); }, 3000); - w.draw(w); - } - }); - WIDGETS["widsmartbatt"]={area:"tr",width:30,draw:draw}; + var oversize = 5; + var w = WIDGETS["widsmartbatt"]; + var x = xy.x, y = xy.y; + + if (w.x - oversize <= x && x < w.x + width + oversize + && w.y - oversize <= y && y < w.y + height + oversize) { + E.stopEventPropagation && E.stopEventPropagation(); + showPercent = true; + setTimeout(() => { + showPercent = false; + w.draw(w); + }, 3000); + w.draw(w); + } + }); + + // Update widget on charging state change + Bangle.on('charging', function () { + WIDGETS["widsmartbatt"].draw(); + }); + + var id = setInterval(() => WIDGETS["widsmartbatt"].draw(), intervalLow); + + WIDGETS["widsmartbatt"] = { + area: "tr", + width: 30, + draw: draw + }; })(); From 7d44e200dd9d103e7af42cbf0bdf122ec35cd00b Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 24 Jul 2025 16:27:27 -0400 Subject: [PATCH 06/20] Add smartbatt module specifications, and links to it --- apps/widsmartbatt/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/widsmartbatt/README.md b/apps/widsmartbatt/README.md index 0a29819af..97463034c 100644 --- a/apps/widsmartbatt/README.md +++ b/apps/widsmartbatt/README.md @@ -1,12 +1,12 @@ # Smart Battery Widget -Shows battery in terms of days (21 days, 12 hours), and learns from your daily usage to give better estimations. +Shows battery in terms of days (21 days, 12 hours), and uses the [`smartbatt`](https://banglejs.com/apps/?id=smartbatt) module to learn from daily battery drainage and provide accurate estimations. This app was modified from `wid_a_battery_widget`, by @alainsaas -When you install the app for the first time, or clear the data, the forecast will fluctate, and will not be reliable for a while. As it learns from your usage, it will keep learning, and provide better predictions. -The app learns by averaging all the power draw whenever it needs to draw, and saves it to a json, averaging it with many others, providing an accurate prediction. The app gives the best forecast when you use the watch relatively similar per day. +When you install this widget for the first time, or clear the data, it will also install the [`smartbatt`](https://banglejs.com/apps/?id=smartbatt) module as a dependency. As it learns your battery usage for the first time the forecast will fluctate, and will not be reliable for a while. As it compunds many drainage values together, it will keep learning, and provide better predictions. +The module learns by averaging all the battery drainage over a period of time, and saves it to a json, averaging it with many others, providing an accurate prediction. The module gives the best forecast when you use the watch relatively similar per day. Tap on the widget to show the battery percentage. It will go back to the days left after 3 seconds. -## Settings -* Clear Data - Clears the learned data. Useful when you change something fundamental that affects battery usage. (eg. New clock, turn on GPS daily, LCD backlight setting changes.) + +When charging, only the percentage is shown. ## Creator RKBoss6 From fbb8500b98f115ecebf673c24c3d7f37cac87071 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Thu, 24 Jul 2025 16:28:01 -0400 Subject: [PATCH 07/20] Create ChangeLog --- apps/widsmartbatt/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/widsmartbatt/ChangeLog diff --git a/apps/widsmartbatt/ChangeLog b/apps/widsmartbatt/ChangeLog new file mode 100644 index 000000000..4e1092b44 --- /dev/null +++ b/apps/widsmartbatt/ChangeLog @@ -0,0 +1 @@ +v0.01: New app! From 29be5f50b98e672438894c7c9b91a7bbf6d39e8b Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 25 Jul 2025 19:39:43 -0400 Subject: [PATCH 08/20] add icon --- apps/widsmartbatt/icon.png | Bin 0 -> 24914 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/widsmartbatt/icon.png diff --git a/apps/widsmartbatt/icon.png b/apps/widsmartbatt/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cf7b5ee71ccb5346f38318811338cf1b7421394e GIT binary patch literal 24914 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 Date: Fri, 25 Jul 2025 19:41:09 -0400 Subject: [PATCH 09/20] Update metadata.json --- apps/widsmartbatt/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widsmartbatt/metadata.json b/apps/widsmartbatt/metadata.json index a8878bf98..b61d367c6 100644 --- a/apps/widsmartbatt/metadata.json +++ b/apps/widsmartbatt/metadata.json @@ -7,6 +7,7 @@ "type": "widget", "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", + "dependencies" : { "smartbatt":"module" }, "description": "Simple and slim battery widget that shows days remaining, and uses the `smartbatt` module to learm from your usage and provide accurate predictions.", "tags": "widget,battery", "provides_widgets" : ["battery"], From bddd0f769b55406b101652656d85a57ece62692e Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 25 Jul 2025 19:44:28 -0400 Subject: [PATCH 10/20] Update widget.js --- apps/widsmartbatt/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index df299f99c..f03834af1 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -1,4 +1,4 @@ -(function(){ +((){ const intervalLow = 30000; // update interval when not charging const intervalHigh = 30000; // faster update when charging From c09e29b4787f35f0a139df9fc173644721157f81 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Fri, 25 Jul 2025 19:47:17 -0400 Subject: [PATCH 11/20] Define widget first --- apps/widsmartbatt/widget.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index f03834af1..0ba8eda12 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -1,5 +1,9 @@ -((){ - +(function(){ + WIDGETS["widsmartbatt"] = { + area: "tr", + width: 30, + draw: draw + }; const intervalLow = 30000; // update interval when not charging const intervalHigh = 30000; // faster update when charging var showPercent = false; @@ -85,9 +89,5 @@ var id = setInterval(() => WIDGETS["widsmartbatt"].draw(), intervalLow); - WIDGETS["widsmartbatt"] = { - area: "tr", - width: 30, - draw: draw - }; + })(); From 45df9b3cfa4b100786ed0420cd6a19bc649b4421 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Sat, 26 Jul 2025 09:55:52 -0400 Subject: [PATCH 12/20] Update widget.js --- apps/widsmartbatt/widget.js | 81 +++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index 0ba8eda12..c519cfd7b 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -1,9 +1,5 @@ (function(){ - WIDGETS["widsmartbatt"] = { - area: "tr", - width: 30, - draw: draw - }; + const intervalLow = 30000; // update interval when not charging const intervalHigh = 30000; // faster update when charging var showPercent = false; @@ -25,42 +21,49 @@ }; function draw() { - let batt=E.getBattery(); - let data = require("smartbatt").get(); - let hrsLeft=data.hrsLeft; - let days = hrsLeft / 24; - - let txt = showPercent - ? batt - : (days >= 1 - ? Math.round(Math.min(days, 99)) + "d" - : Math.round(hrsLeft) + "h"); - if(Bangle.isCharging()) txt=E.getBattery(); - let s = 29; - let x = this.x, y = this.y; - let xl = x + 4 + batt * (s - 12) / 100; + let batt=E.getBattery(); + let data = require("smartbatt").get(); + let hrsLeft=data.hrsLeft; + let days = hrsLeft / 24; - // Drawing code follows... - g.setColor(COLORS.bg); - g.fillRect(x + 2, y + 5, x + s - 6, y + 18); - - g.setColor(levelColor(batt)); - g.fillRect(x + 1, y + 3, x + s - 5, y + 4); - g.fillRect(x + 1, y + 19, x + s - 5, y + 20); - g.fillRect(x, y + 4, x + 1, y + 19); - g.fillRect(x + s - 5, y + 4, x + s - 4, y + 19); - g.fillRect(x + s - 3, y + 8, x + s - 2, y + 16); - g.fillRect(x + 4, y + 15, xl, y + 16); - - g.setColor(COLORS.fg); - g.setFontAlign(0, 0); - g.setFont('6x8'); - g.drawString(txt, x + 14, y + 10); - - if (Bangle.isCharging()) changeInterval(id, intervalHigh); - else changeInterval(id, intervalLow); + let txt = showPercent + ? batt + : (days >= 1 + ? Math.round(Math.min(days, 99)) + "d" + : Math.round(hrsLeft) + "h"); + if(Bangle.isCharging()) txt=E.getBattery(); + let s = 29; + let x = this.x, y = this.y; + let xl = x + 4 + batt * (s - 12) / 100; + + // Drawing code follows... + g.setColor(COLORS.bg); + g.fillRect(x + 2, y + 5, x + s - 6, y + 18); + + g.setColor(levelColor(batt)); + g.fillRect(x + 1, y + 3, x + s - 5, y + 4); + g.fillRect(x + 1, y + 19, x + s - 5, y + 20); + g.fillRect(x, y + 4, x + 1, y + 19); + g.fillRect(x + s - 5, y + 4, x + s - 4, y + 19); + g.fillRect(x + s - 3, y + 8, x + s - 2, y + 16); + g.fillRect(x + 4, y + 15, xl, y + 16); + + g.setColor(COLORS.fg); + g.setFontAlign(0, 0); + g.setFont('6x8'); + g.drawString(txt, x + 14, y + 10); + + if (Bangle.isCharging()) changeInterval(id, intervalHigh); + else changeInterval(id, intervalLow); } - + WIDGETS["widsmartbatt"] = { + area: "tr", + width: 30, + draw: function() { + // Call your drawing function + draw(); + } + }; // Touch to temporarily show battery percent Bangle.on("touch", function (_btn, xy) { From c06255dfb3d9ad834377e5e9ff9242c5a6671ed4 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Sat, 26 Jul 2025 10:18:19 -0400 Subject: [PATCH 13/20] Update widget.js --- apps/widsmartbatt/widget.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index c519cfd7b..684890f96 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -22,7 +22,11 @@ function draw() { let batt=E.getBattery(); - let data = require("smartbatt").get(); + try { + data = require("smartbatt").get(); + } catch (e) { + data.hrsLeft = 0; + } let hrsLeft=data.hrsLeft; let days = hrsLeft / 24; From 328cc50893dd14eae0f9ade84895d5b344405bd2 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Sat, 26 Jul 2025 13:18:59 -0400 Subject: [PATCH 14/20] Fix filename --- apps/widsmartbatt/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widsmartbatt/metadata.json b/apps/widsmartbatt/metadata.json index b61d367c6..108dd8f6d 100644 --- a/apps/widsmartbatt/metadata.json +++ b/apps/widsmartbatt/metadata.json @@ -12,6 +12,6 @@ "tags": "widget,battery", "provides_widgets" : ["battery"], "storage": [ - {"name":"widsmartbatt.js","url":"widget.js"} + {"name":"widsmartbatt.widget.js","url":"widget.js"} ] } From 751af4a8c0d85e0a8b1e9d0a82611626f48e3c54 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Wed, 30 Jul 2025 11:11:09 -0400 Subject: [PATCH 15/20] Fix no entry point for widget --- apps/widsmartbatt/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widsmartbatt/metadata.json b/apps/widsmartbatt/metadata.json index 108dd8f6d..e6a0796cd 100644 --- a/apps/widsmartbatt/metadata.json +++ b/apps/widsmartbatt/metadata.json @@ -12,6 +12,6 @@ "tags": "widget,battery", "provides_widgets" : ["battery"], "storage": [ - {"name":"widsmartbatt.widget.js","url":"widget.js"} + {"name":"widsmartbatt.wid.js","url":"widget.js"} ] } From 79dcbd7fd11608485694c6a1567892550e6fd7dc Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Wed, 30 Jul 2025 11:13:07 -0400 Subject: [PATCH 16/20] Remove outdated update changes --- apps/widsmartbatt/widget.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index 684890f96..e995cd298 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -1,7 +1,5 @@ (function(){ - - const intervalLow = 30000; // update interval when not charging - const intervalHigh = 30000; // faster update when charging + var showPercent = false; const width = 40; const height = 24; @@ -57,8 +55,7 @@ g.setFont('6x8'); g.drawString(txt, x + 14, y + 10); - if (Bangle.isCharging()) changeInterval(id, intervalHigh); - else changeInterval(id, intervalLow); + } WIDGETS["widsmartbatt"] = { area: "tr", @@ -80,6 +77,7 @@ if (w.x - oversize <= x && x < w.x + width + oversize && w.y - oversize <= y && y < w.y + height + oversize) { E.stopEventPropagation && E.stopEventPropagation(); + Bangle.buzz(20); showPercent = true; setTimeout(() => { showPercent = false; @@ -93,8 +91,8 @@ Bangle.on('charging', function () { WIDGETS["widsmartbatt"].draw(); }); - - var id = setInterval(() => WIDGETS["widsmartbatt"].draw(), intervalLow); + //draw once per minute... + var id = setInterval(() => WIDGETS["widsmartbatt"].draw(), 60000); })(); From 0875f516a17bca0df68689ef7c97bc47b94dcad1 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Wed, 30 Jul 2025 11:13:37 -0400 Subject: [PATCH 17/20] Update widget.js --- apps/widsmartbatt/widget.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index e995cd298..209d01d07 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -20,11 +20,7 @@ function draw() { let batt=E.getBattery(); - try { - data = require("smartbatt").get(); - } catch (e) { - data.hrsLeft = 0; - } + data = require("smartbatt").get(); let hrsLeft=data.hrsLeft; let days = hrsLeft / 24; From 274b51853fdc79a027dc5ed6258ab38e35d681b7 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Wed, 30 Jul 2025 11:15:12 -0400 Subject: [PATCH 18/20] Fix define data error --- apps/widsmartbatt/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index 209d01d07..a5df02e5c 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -20,7 +20,7 @@ function draw() { let batt=E.getBattery(); - data = require("smartbatt").get(); + let data = require("smartbatt").get(); let hrsLeft=data.hrsLeft; let days = hrsLeft / 24; From ffc8d201e3da22ad3a78192f1b3b74aa197b7d38 Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Wed, 30 Jul 2025 12:43:22 -0400 Subject: [PATCH 19/20] Fix draw define first --- apps/widsmartbatt/widget.js | 72 ++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 38 deletions(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index a5df02e5c..9d4bcb51d 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -1,5 +1,5 @@ (function(){ - + var showPercent = false; const width = 40; const height = 24; @@ -19,47 +19,44 @@ }; function draw() { - let batt=E.getBattery(); - let data = require("smartbatt").get(); - let hrsLeft=data.hrsLeft; - let days = hrsLeft / 24; + let batt=E.getBattery(); + let data = require("smartbatt").get(); + let hrsLeft=data.hrsLeft; + let days = hrsLeft / 24; + + let txt = showPercent + ? batt + : (days >= 1 + ? Math.round(Math.min(days, 99)) + "d" + : Math.round(hrsLeft) + "h"); + if(Bangle.isCharging()) txt=E.getBattery(); + let s = 29; + let x = this.x, y = this.y; + let xl = x + 4 + batt * (s - 12) / 100; - let txt = showPercent - ? batt - : (days >= 1 - ? Math.round(Math.min(days, 99)) + "d" - : Math.round(hrsLeft) + "h"); - if(Bangle.isCharging()) txt=E.getBattery(); - let s = 29; - let x = this.x, y = this.y; - let xl = x + 4 + batt * (s - 12) / 100; - - // Drawing code follows... - g.setColor(COLORS.bg); - g.fillRect(x + 2, y + 5, x + s - 6, y + 18); + // Drawing code follows... + g.setColor(COLORS.bg); + g.fillRect(x + 2, y + 5, x + s - 6, y + 18); + + g.setColor(levelColor(batt)); + g.fillRect(x + 1, y + 3, x + s - 5, y + 4); + g.fillRect(x + 1, y + 19, x + s - 5, y + 20); + g.fillRect(x, y + 4, x + 1, y + 19); + g.fillRect(x + s - 5, y + 4, x + s - 4, y + 19); + g.fillRect(x + s - 3, y + 8, x + s - 2, y + 16); + g.fillRect(x + 4, y + 15, xl, y + 16); + + g.setColor(COLORS.fg); + g.setFontAlign(0, 0); + g.setFont('6x8'); + g.drawString(txt, x + 14, y + 10); + - g.setColor(levelColor(batt)); - g.fillRect(x + 1, y + 3, x + s - 5, y + 4); - g.fillRect(x + 1, y + 19, x + s - 5, y + 20); - g.fillRect(x, y + 4, x + 1, y + 19); - g.fillRect(x + s - 5, y + 4, x + s - 4, y + 19); - g.fillRect(x + s - 3, y + 8, x + s - 2, y + 16); - g.fillRect(x + 4, y + 15, xl, y + 16); - - g.setColor(COLORS.fg); - g.setFontAlign(0, 0); - g.setFont('6x8'); - g.drawString(txt, x + 14, y + 10); - - } WIDGETS["widsmartbatt"] = { area: "tr", width: 30, - draw: function() { - // Call your drawing function - draw(); - } + draw: draw }; // Touch to temporarily show battery percent @@ -73,7 +70,6 @@ if (w.x - oversize <= x && x < w.x + width + oversize && w.y - oversize <= y && y < w.y + height + oversize) { E.stopEventPropagation && E.stopEventPropagation(); - Bangle.buzz(20); showPercent = true; setTimeout(() => { showPercent = false; @@ -87,7 +83,7 @@ Bangle.on('charging', function () { WIDGETS["widsmartbatt"].draw(); }); - //draw once per minute... + var id = setInterval(() => WIDGETS["widsmartbatt"].draw(), 60000); From 0fbcea89cb5d1231b2c5b121193061ad6cca630c Mon Sep 17 00:00:00 2001 From: RKBoss6 Date: Wed, 30 Jul 2025 12:45:05 -0400 Subject: [PATCH 20/20] Remove unused var --- apps/widsmartbatt/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widsmartbatt/widget.js b/apps/widsmartbatt/widget.js index 9d4bcb51d..29ac15108 100644 --- a/apps/widsmartbatt/widget.js +++ b/apps/widsmartbatt/widget.js @@ -84,7 +84,7 @@ WIDGETS["widsmartbatt"].draw(); }); - var id = setInterval(() => WIDGETS["widsmartbatt"].draw(), 60000); + setInterval(() => WIDGETS["widsmartbatt"].draw(), 60000); })();