From 4aa62b46e522a98447299db31ec5b8a9f7504095 Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 23 Feb 2026 09:59:44 -0500 Subject: [PATCH 01/29] Add files via upload --- apps/Sun_Moon_Watch.js | 88 +++++++++++++++++++++++++++++++++++++++++ apps/sunmoonclk.img | 1 + apps/sunmoonclk.info | 6 +++ apps/sunmoonclk.png | Bin 0 -> 1069 bytes 4 files changed, 95 insertions(+) create mode 100644 apps/Sun_Moon_Watch.js create mode 100644 apps/sunmoonclk.img create mode 100644 apps/sunmoonclk.info create mode 100644 apps/sunmoonclk.png diff --git a/apps/Sun_Moon_Watch.js b/apps/Sun_Moon_Watch.js new file mode 100644 index 0000000000..6825b807a4 --- /dev/null +++ b/apps/Sun_Moon_Watch.js @@ -0,0 +1,88 @@ +// Load fonts +require("Font7x11Numeric7Seg").add(Graphics); +// X/Y are the position of the bottom right of the HH:MM text - make it central! +const X = g.getWidth()/2 + 45, + Y = g.getHeight()/2 + 40; + +function draw() { + // work out how to display the current time + var d = new Date(); + var clock = require("locale").time(d, 1 /*omit seconds*/); + var seconds = d.getSeconds().toString().padStart(2,0); + var meridian = require("locale").meridian(d); + // Reset the state of the graphics library + g.reset(); + // draw the current time (4x size 7 segment) + g.setFontAlign(1,1); // align bottom right + g.setFont("7x11Numeric7Seg:4"); + g.drawString(clock, X, Y, true /*clear background*/); + // draw the meridian(am/pm) and seconds (2x size 7 segment) + g.setFontAlign(-1,1); // align bottom left + g.setFont("6x8:2"); + g.drawString(meridian, X+4, Y-26, true /*clear background*/); + g.setFont("7x11Numeric7Seg:2"); + g.drawString(seconds, X+2, Y, true /*clear background*/); + // draw the date, in a normal font + g.setFont("6x8", 2); + g.setFontAlign(0,-40); // align center bottom + // pad the date - this clears the background if the date were to change length + var dateStr = " "+require("locale").date(d)+" "; + g.drawString(dateStr, g.getWidth()/2, Y+15, true /*clear background*/); + + // Get current time + let now = new Date(); + let h = now.getHours(); + let m = now.getMinutes(); + let timeStr = ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2); + + // Draw sun or moon icon + if (h >= 6 && h < 18) { + drawSun(g.getWidth()/2, g.getHeight()/2 - 40); + } else { + drawMoon(g.getWidth()/2, g.getHeight()/2 - 40); + } +} + +function drawSun(x, y) { + g.setColor("#FF8C00"); // orange + g.fillCircle(x, y, 12); + for (let i = 0; i < 8; i++) { + let angle = i * Math.PI / 4; + g.drawLine( + x + Math.cos(angle) * 16, + y + Math.sin(angle) * 16, + x + Math.cos(angle) * 22, + y + Math.sin(angle) * 22 + ); + } +} +function drawMoon(x, y) { + g.setColor("#F5F5F5"); // white smoke + g.fillCircle(x, y, 12); + g.setColor(0, 0, 0); // mask for crescent + g.fillCircle(x + 5, y - 2, 12); + +} + +// Clear the screen once, at startup +g.clear(); +// draw immediately at first +draw(); +// now draw every second +var secondInterval = setInterval(draw, 1000); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 1000); + draw(); // draw immediately + } +}); +/* Show launcher when middle button pressed +This should be done *before* Bangle.loadWidgets so that +widgets know if they're being loaded into a clock app or not */ +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/sunmoonclk.img b/apps/sunmoonclk.img new file mode 100644 index 0000000000..9ab3fa8126 --- /dev/null +++ b/apps/sunmoonclk.img @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("MDCDAf/////////////////////////////////////////////////////////////////////////////////wAAAP/////////////////wAMP/+AAP//////////////wNtth////wP////////////+Nttth/////x///////////+BttttsP////+B//////////xtttttth/////+P////////+Ntttttth//////x////////xtttttttsP/////+P//////+NtttttttsP//////x//////+NttttsBtth//+B//x//////xttttth+Nth//x+P/+P////+NttttsOB9th/+OBx//x////+NttttsOB9tsP+OBx//x////xtttttsP/9tsP+P/x//+P///xtttttth+NtsP/x+P//+P///xttttttsBttsP/+B///+P///xtttttttttth///////+P//+Ntttttttttth////////x//+NtttttttttsP////////x//+Nttttttttth/////////x//+Nttttttttth/////////x//+NtttttttttsAP///////x//+Nttttttttttth///////x//+Nttttttttttth///////x//+Nttttttttttth///////x///xttttttttttth//////+P///xttttttttttth//////+P///xtttttthtttsP//x///+P///xttttttsNttsP/+P///+P///+NtttttsNttsP/+P///x////+NttttthhttsP/xx///x/////xttttttsAAAAAP///+P/////xttttttttth//////x//////+Ntttttttth//////x///////xtttttttsP/////+P///////+NttttttsP/////x/////////xtttttth/////+P/////////+BttttsP////+B///////////+Nttth/////x/////////////wNtth////wP//////////////wAMP//wAP/////////////////wAAAP/////////////////////////////////////////////////////////////////////////////////w==") \ No newline at end of file diff --git a/apps/sunmoonclk.info b/apps/sunmoonclk.info new file mode 100644 index 0000000000..4ec739f2b5 --- /dev/null +++ b/apps/sunmoonclk.info @@ -0,0 +1,6 @@ +require("Storage").write("sunmoonclk.info",{ + "id":"sunmoonclk", + "name":"Sun Moon", + "type":"clock", + "src":"sunmoonclk.app.js" +}); \ No newline at end of file diff --git a/apps/sunmoonclk.png b/apps/sunmoonclk.png new file mode 100644 index 0000000000000000000000000000000000000000..32f1c23715664ad506e01c83f656664c24548678 GIT binary patch literal 1069 zcmV+|1k(G7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGxg#Z8@g#qvzGVA~V1Hwr}K~!i%?U}!e z9aR*^Ki@Tp3Nj#?CRqCiSmY@(0TYO*SZJf5g&8Eu&p5EUmPNsNioQ4hn;n z|A8Q4kznya)NFQ-#oqh8bKd;8GjCql1wSw__neuX^S$Ssxp(Ku%s9&Ic*9ZSe*qpz zrzPEx^jA2phvOefyTH@_o=woEJs{}}a3u`)tuA)7SW;D$yAsN>jHd<&Ff+RdywfTi zG9c+BkR5n#79t@Vf126rz$Nc*BU^x^JFPDM@b)3biXaFvvnPO$z0Z?XLXz&768u!E zszTCb;5qN}3}!&mT~-&@ynPH)vcP|tI0JOv+?xSO=Qa&~6GA4w2OjjkNUs3kQ*Y=) zizQkty&0>EbPZUeEX!X1qzp*9$LivCZ|_2jC1!@1wTkE>lnG|mDk5Y-z~kOWmjFp; ztuB7`_AX-Zl90quUqxc@>3uySJ^>!^zE%OiH{P%*LuHi7kKV8*K+?-r7xMNTVkwLz z=f02yfEQBxngHMpZy3VrBK~nWn1qJEizFxr_hr0p-%AH=0 z6W)+RPUia7gb~f%*bB7@xXl}Ku)4?+(MDO8ox)nUB^|5@Fthik2C_|(`u{eyuL%HN zOkY#EXtA7>g*f{oO6Yt#Sldnq-U+EY^ud&-o-+GM@ZSOFygwyZ0Kj=kUlJCr9L5G8U!@_Y4}qurHJ+goO8Lsn z9x^k_DXA&J+rbB}ec;WU;2D{Ll$RvEOHVd(1-Mzi2AuTQ^f6TcVMY8ReCAjYSL3eW z{fe7BzXtAaI5XHpK;$g&HQ{$(Nxfwmo);f#z|X*a&8za6LxAV`@C)N!vUA)C+u&os n4?y Date: Mon, 23 Feb 2026 10:10:47 -0500 Subject: [PATCH 02/29] Delete apps/Sun_Moon_Watch.js --- apps/Sun_Moon_Watch.js | 88 ------------------------------------------ 1 file changed, 88 deletions(-) delete mode 100644 apps/Sun_Moon_Watch.js diff --git a/apps/Sun_Moon_Watch.js b/apps/Sun_Moon_Watch.js deleted file mode 100644 index 6825b807a4..0000000000 --- a/apps/Sun_Moon_Watch.js +++ /dev/null @@ -1,88 +0,0 @@ -// Load fonts -require("Font7x11Numeric7Seg").add(Graphics); -// X/Y are the position of the bottom right of the HH:MM text - make it central! -const X = g.getWidth()/2 + 45, - Y = g.getHeight()/2 + 40; - -function draw() { - // work out how to display the current time - var d = new Date(); - var clock = require("locale").time(d, 1 /*omit seconds*/); - var seconds = d.getSeconds().toString().padStart(2,0); - var meridian = require("locale").meridian(d); - // Reset the state of the graphics library - g.reset(); - // draw the current time (4x size 7 segment) - g.setFontAlign(1,1); // align bottom right - g.setFont("7x11Numeric7Seg:4"); - g.drawString(clock, X, Y, true /*clear background*/); - // draw the meridian(am/pm) and seconds (2x size 7 segment) - g.setFontAlign(-1,1); // align bottom left - g.setFont("6x8:2"); - g.drawString(meridian, X+4, Y-26, true /*clear background*/); - g.setFont("7x11Numeric7Seg:2"); - g.drawString(seconds, X+2, Y, true /*clear background*/); - // draw the date, in a normal font - g.setFont("6x8", 2); - g.setFontAlign(0,-40); // align center bottom - // pad the date - this clears the background if the date were to change length - var dateStr = " "+require("locale").date(d)+" "; - g.drawString(dateStr, g.getWidth()/2, Y+15, true /*clear background*/); - - // Get current time - let now = new Date(); - let h = now.getHours(); - let m = now.getMinutes(); - let timeStr = ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2); - - // Draw sun or moon icon - if (h >= 6 && h < 18) { - drawSun(g.getWidth()/2, g.getHeight()/2 - 40); - } else { - drawMoon(g.getWidth()/2, g.getHeight()/2 - 40); - } -} - -function drawSun(x, y) { - g.setColor("#FF8C00"); // orange - g.fillCircle(x, y, 12); - for (let i = 0; i < 8; i++) { - let angle = i * Math.PI / 4; - g.drawLine( - x + Math.cos(angle) * 16, - y + Math.sin(angle) * 16, - x + Math.cos(angle) * 22, - y + Math.sin(angle) * 22 - ); - } -} -function drawMoon(x, y) { - g.setColor("#F5F5F5"); // white smoke - g.fillCircle(x, y, 12); - g.setColor(0, 0, 0); // mask for crescent - g.fillCircle(x + 5, y - 2, 12); - -} - -// Clear the screen once, at startup -g.clear(); -// draw immediately at first -draw(); -// now draw every second -var secondInterval = setInterval(draw, 1000); -// Stop updates when LCD is off, restart when on -Bangle.on('lcdPower',on=>{ - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; - if (on) { - secondInterval = setInterval(draw, 1000); - draw(); // draw immediately - } -}); -/* Show launcher when middle button pressed -This should be done *before* Bangle.loadWidgets so that -widgets know if they're being loaded into a clock app or not */ -Bangle.setUI("clock"); -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); \ No newline at end of file From d39eea8776b3c06e1870d2a74d365446eaeff3e0 Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 23 Feb 2026 10:11:27 -0500 Subject: [PATCH 03/29] Delete apps/sunmoonclk.img --- apps/sunmoonclk.img | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/sunmoonclk.img diff --git a/apps/sunmoonclk.img b/apps/sunmoonclk.img deleted file mode 100644 index 9ab3fa8126..0000000000 --- a/apps/sunmoonclk.img +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("MDCDAf/////////////////////////////////////////////////////////////////////////////////wAAAP/////////////////wAMP/+AAP//////////////wNtth////wP////////////+Nttth/////x///////////+BttttsP////+B//////////xtttttth/////+P////////+Ntttttth//////x////////xtttttttsP/////+P//////+NtttttttsP//////x//////+NttttsBtth//+B//x//////xttttth+Nth//x+P/+P////+NttttsOB9th/+OBx//x////+NttttsOB9tsP+OBx//x////xtttttsP/9tsP+P/x//+P///xtttttth+NtsP/x+P//+P///xttttttsBttsP/+B///+P///xtttttttttth///////+P//+Ntttttttttth////////x//+NtttttttttsP////////x//+Nttttttttth/////////x//+Nttttttttth/////////x//+NtttttttttsAP///////x//+Nttttttttttth///////x//+Nttttttttttth///////x//+Nttttttttttth///////x///xttttttttttth//////+P///xttttttttttth//////+P///xtttttthtttsP//x///+P///xttttttsNttsP/+P///+P///+NtttttsNttsP/+P///x////+NttttthhttsP/xx///x/////xttttttsAAAAAP///+P/////xttttttttth//////x//////+Ntttttttth//////x///////xtttttttsP/////+P///////+NttttttsP/////x/////////xtttttth/////+P/////////+BttttsP////+B///////////+Nttth/////x/////////////wNtth////wP//////////////wAMP//wAP/////////////////wAAAP/////////////////////////////////////////////////////////////////////////////////w==") \ No newline at end of file From eb9bbeadf6320bc5668a6e5adcf53b1bda798175 Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 23 Feb 2026 10:11:43 -0500 Subject: [PATCH 04/29] Delete apps/sunmoonclk.info --- apps/sunmoonclk.info | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 apps/sunmoonclk.info diff --git a/apps/sunmoonclk.info b/apps/sunmoonclk.info deleted file mode 100644 index 4ec739f2b5..0000000000 --- a/apps/sunmoonclk.info +++ /dev/null @@ -1,6 +0,0 @@ -require("Storage").write("sunmoonclk.info",{ - "id":"sunmoonclk", - "name":"Sun Moon", - "type":"clock", - "src":"sunmoonclk.app.js" -}); \ No newline at end of file From 2b9bcdff3bbcf34723f0f4d1b46ae3a1ed715809 Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 23 Feb 2026 10:12:02 -0500 Subject: [PATCH 05/29] Delete apps/sunmoonclk.png --- apps/sunmoonclk.png | Bin 1069 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/sunmoonclk.png diff --git a/apps/sunmoonclk.png b/apps/sunmoonclk.png deleted file mode 100644 index 32f1c23715664ad506e01c83f656664c24548678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1069 zcmV+|1k(G7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGxg#Z8@g#qvzGVA~V1Hwr}K~!i%?U}!e z9aR*^Ki@Tp3Nj#?CRqCiSmY@(0TYO*SZJf5g&8Eu&p5EUmPNsNioQ4hn;n z|A8Q4kznya)NFQ-#oqh8bKd;8GjCql1wSw__neuX^S$Ssxp(Ku%s9&Ic*9ZSe*qpz zrzPEx^jA2phvOefyTH@_o=woEJs{}}a3u`)tuA)7SW;D$yAsN>jHd<&Ff+RdywfTi zG9c+BkR5n#79t@Vf126rz$Nc*BU^x^JFPDM@b)3biXaFvvnPO$z0Z?XLXz&768u!E zszTCb;5qN}3}!&mT~-&@ynPH)vcP|tI0JOv+?xSO=Qa&~6GA4w2OjjkNUs3kQ*Y=) zizQkty&0>EbPZUeEX!X1qzp*9$LivCZ|_2jC1!@1wTkE>lnG|mDk5Y-z~kOWmjFp; ztuB7`_AX-Zl90quUqxc@>3uySJ^>!^zE%OiH{P%*LuHi7kKV8*K+?-r7xMNTVkwLz z=f02yfEQBxngHMpZy3VrBK~nWn1qJEizFxr_hr0p-%AH=0 z6W)+RPUia7gb~f%*bB7@xXl}Ku)4?+(MDO8ox)nUB^|5@Fthik2C_|(`u{eyuL%HN zOkY#EXtA7>g*f{oO6Yt#Sldnq-U+EY^ud&-o-+GM@ZSOFygwyZ0Kj=kUlJCr9L5G8U!@_Y4}qurHJ+goO8Lsn z9x^k_DXA&J+rbB}ec;WU;2D{Ll$RvEOHVd(1-Mzi2AuTQ^f6TcVMY8ReCAjYSL3eW z{fe7BzXtAaI5XHpK;$g&HQ{$(Nxfwmo);f#z|X*a&8za6LxAV`@C)N!vUA)C+u&os n4?y Date: Mon, 23 Feb 2026 10:16:37 -0500 Subject: [PATCH 06/29] Create sunmoonclk --- apps/sunmoonclk | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/sunmoonclk diff --git a/apps/sunmoonclk b/apps/sunmoonclk new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/apps/sunmoonclk @@ -0,0 +1 @@ + From fbf5e70cc793c4b64cacf2635816599743f5afea Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 23 Feb 2026 10:24:28 -0500 Subject: [PATCH 07/29] Delete apps/sunmoonclk --- apps/sunmoonclk | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/sunmoonclk diff --git a/apps/sunmoonclk b/apps/sunmoonclk deleted file mode 100644 index 8b13789179..0000000000 --- a/apps/sunmoonclk +++ /dev/null @@ -1 +0,0 @@ - From c278cc2a35039e5474f7add4fea7049b2dbb9ab8 Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 23 Feb 2026 10:41:31 -0500 Subject: [PATCH 08/29] Create sunmoonclk.js --- apps/sunmoonclk/sunmoonclk.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/sunmoonclk/sunmoonclk.js diff --git a/apps/sunmoonclk/sunmoonclk.js b/apps/sunmoonclk/sunmoonclk.js new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/apps/sunmoonclk/sunmoonclk.js @@ -0,0 +1 @@ + From 1d2a02abd6e52ca74deb82e28caf4d15bfd693c9 Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 23 Feb 2026 10:42:02 -0500 Subject: [PATCH 09/29] Delete apps/sunmoonclk/sunmoonclk.js --- apps/sunmoonclk/sunmoonclk.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/sunmoonclk/sunmoonclk.js diff --git a/apps/sunmoonclk/sunmoonclk.js b/apps/sunmoonclk/sunmoonclk.js deleted file mode 100644 index 8b13789179..0000000000 --- a/apps/sunmoonclk/sunmoonclk.js +++ /dev/null @@ -1 +0,0 @@ - From 7cff19f5ecc2790f6d08d2be6dabb130a1a219f6 Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 23 Feb 2026 10:43:47 -0500 Subject: [PATCH 10/29] Create test.js --- apps/sunmoonclk/test.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/sunmoonclk/test.js diff --git a/apps/sunmoonclk/test.js b/apps/sunmoonclk/test.js new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/apps/sunmoonclk/test.js @@ -0,0 +1 @@ + From 8d4d2ae41d82e07129cf0c68cc8b92fb6bb4417d Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 23 Feb 2026 10:44:17 -0500 Subject: [PATCH 11/29] Add files via upload --- apps/sunmoonclk/Sun_Moon_Watch.js | 88 ++++++++++++++++++++++++++++++ apps/sunmoonclk/sunmoonclk.img | 1 + apps/sunmoonclk/sunmoonclk.info | 6 ++ apps/sunmoonclk/sunmoonclk.png | Bin 0 -> 1069 bytes 4 files changed, 95 insertions(+) create mode 100644 apps/sunmoonclk/Sun_Moon_Watch.js create mode 100644 apps/sunmoonclk/sunmoonclk.img create mode 100644 apps/sunmoonclk/sunmoonclk.info create mode 100644 apps/sunmoonclk/sunmoonclk.png diff --git a/apps/sunmoonclk/Sun_Moon_Watch.js b/apps/sunmoonclk/Sun_Moon_Watch.js new file mode 100644 index 0000000000..6825b807a4 --- /dev/null +++ b/apps/sunmoonclk/Sun_Moon_Watch.js @@ -0,0 +1,88 @@ +// Load fonts +require("Font7x11Numeric7Seg").add(Graphics); +// X/Y are the position of the bottom right of the HH:MM text - make it central! +const X = g.getWidth()/2 + 45, + Y = g.getHeight()/2 + 40; + +function draw() { + // work out how to display the current time + var d = new Date(); + var clock = require("locale").time(d, 1 /*omit seconds*/); + var seconds = d.getSeconds().toString().padStart(2,0); + var meridian = require("locale").meridian(d); + // Reset the state of the graphics library + g.reset(); + // draw the current time (4x size 7 segment) + g.setFontAlign(1,1); // align bottom right + g.setFont("7x11Numeric7Seg:4"); + g.drawString(clock, X, Y, true /*clear background*/); + // draw the meridian(am/pm) and seconds (2x size 7 segment) + g.setFontAlign(-1,1); // align bottom left + g.setFont("6x8:2"); + g.drawString(meridian, X+4, Y-26, true /*clear background*/); + g.setFont("7x11Numeric7Seg:2"); + g.drawString(seconds, X+2, Y, true /*clear background*/); + // draw the date, in a normal font + g.setFont("6x8", 2); + g.setFontAlign(0,-40); // align center bottom + // pad the date - this clears the background if the date were to change length + var dateStr = " "+require("locale").date(d)+" "; + g.drawString(dateStr, g.getWidth()/2, Y+15, true /*clear background*/); + + // Get current time + let now = new Date(); + let h = now.getHours(); + let m = now.getMinutes(); + let timeStr = ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2); + + // Draw sun or moon icon + if (h >= 6 && h < 18) { + drawSun(g.getWidth()/2, g.getHeight()/2 - 40); + } else { + drawMoon(g.getWidth()/2, g.getHeight()/2 - 40); + } +} + +function drawSun(x, y) { + g.setColor("#FF8C00"); // orange + g.fillCircle(x, y, 12); + for (let i = 0; i < 8; i++) { + let angle = i * Math.PI / 4; + g.drawLine( + x + Math.cos(angle) * 16, + y + Math.sin(angle) * 16, + x + Math.cos(angle) * 22, + y + Math.sin(angle) * 22 + ); + } +} +function drawMoon(x, y) { + g.setColor("#F5F5F5"); // white smoke + g.fillCircle(x, y, 12); + g.setColor(0, 0, 0); // mask for crescent + g.fillCircle(x + 5, y - 2, 12); + +} + +// Clear the screen once, at startup +g.clear(); +// draw immediately at first +draw(); +// now draw every second +var secondInterval = setInterval(draw, 1000); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 1000); + draw(); // draw immediately + } +}); +/* Show launcher when middle button pressed +This should be done *before* Bangle.loadWidgets so that +widgets know if they're being loaded into a clock app or not */ +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/sunmoonclk/sunmoonclk.img b/apps/sunmoonclk/sunmoonclk.img new file mode 100644 index 0000000000..9ab3fa8126 --- /dev/null +++ b/apps/sunmoonclk/sunmoonclk.img @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("MDCDAf/////////////////////////////////////////////////////////////////////////////////wAAAP/////////////////wAMP/+AAP//////////////wNtth////wP////////////+Nttth/////x///////////+BttttsP////+B//////////xtttttth/////+P////////+Ntttttth//////x////////xtttttttsP/////+P//////+NtttttttsP//////x//////+NttttsBtth//+B//x//////xttttth+Nth//x+P/+P////+NttttsOB9th/+OBx//x////+NttttsOB9tsP+OBx//x////xtttttsP/9tsP+P/x//+P///xtttttth+NtsP/x+P//+P///xttttttsBttsP/+B///+P///xtttttttttth///////+P//+Ntttttttttth////////x//+NtttttttttsP////////x//+Nttttttttth/////////x//+Nttttttttth/////////x//+NtttttttttsAP///////x//+Nttttttttttth///////x//+Nttttttttttth///////x//+Nttttttttttth///////x///xttttttttttth//////+P///xttttttttttth//////+P///xtttttthtttsP//x///+P///xttttttsNttsP/+P///+P///+NtttttsNttsP/+P///x////+NttttthhttsP/xx///x/////xttttttsAAAAAP///+P/////xttttttttth//////x//////+Ntttttttth//////x///////xtttttttsP/////+P///////+NttttttsP/////x/////////xtttttth/////+P/////////+BttttsP////+B///////////+Nttth/////x/////////////wNtth////wP//////////////wAMP//wAP/////////////////wAAAP/////////////////////////////////////////////////////////////////////////////////w==") \ No newline at end of file diff --git a/apps/sunmoonclk/sunmoonclk.info b/apps/sunmoonclk/sunmoonclk.info new file mode 100644 index 0000000000..4ec739f2b5 --- /dev/null +++ b/apps/sunmoonclk/sunmoonclk.info @@ -0,0 +1,6 @@ +require("Storage").write("sunmoonclk.info",{ + "id":"sunmoonclk", + "name":"Sun Moon", + "type":"clock", + "src":"sunmoonclk.app.js" +}); \ No newline at end of file diff --git a/apps/sunmoonclk/sunmoonclk.png b/apps/sunmoonclk/sunmoonclk.png new file mode 100644 index 0000000000000000000000000000000000000000..32f1c23715664ad506e01c83f656664c24548678 GIT binary patch literal 1069 zcmV+|1k(G7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGxg#Z8@g#qvzGVA~V1Hwr}K~!i%?U}!e z9aR*^Ki@Tp3Nj#?CRqCiSmY@(0TYO*SZJf5g&8Eu&p5EUmPNsNioQ4hn;n z|A8Q4kznya)NFQ-#oqh8bKd;8GjCql1wSw__neuX^S$Ssxp(Ku%s9&Ic*9ZSe*qpz zrzPEx^jA2phvOefyTH@_o=woEJs{}}a3u`)tuA)7SW;D$yAsN>jHd<&Ff+RdywfTi zG9c+BkR5n#79t@Vf126rz$Nc*BU^x^JFPDM@b)3biXaFvvnPO$z0Z?XLXz&768u!E zszTCb;5qN}3}!&mT~-&@ynPH)vcP|tI0JOv+?xSO=Qa&~6GA4w2OjjkNUs3kQ*Y=) zizQkty&0>EbPZUeEX!X1qzp*9$LivCZ|_2jC1!@1wTkE>lnG|mDk5Y-z~kOWmjFp; ztuB7`_AX-Zl90quUqxc@>3uySJ^>!^zE%OiH{P%*LuHi7kKV8*K+?-r7xMNTVkwLz z=f02yfEQBxngHMpZy3VrBK~nWn1qJEizFxr_hr0p-%AH=0 z6W)+RPUia7gb~f%*bB7@xXl}Ku)4?+(MDO8ox)nUB^|5@Fthik2C_|(`u{eyuL%HN zOkY#EXtA7>g*f{oO6Yt#Sldnq-U+EY^ud&-o-+GM@ZSOFygwyZ0Kj=kUlJCr9L5G8U!@_Y4}qurHJ+goO8Lsn z9x^k_DXA&J+rbB}ec;WU;2D{Ll$RvEOHVd(1-Mzi2AuTQ^f6TcVMY8ReCAjYSL3eW z{fe7BzXtAaI5XHpK;$g&HQ{$(Nxfwmo);f#z|X*a&8za6LxAV`@C)N!vUA)C+u&os n4?y Date: Mon, 23 Feb 2026 10:46:09 -0500 Subject: [PATCH 12/29] Delete apps/sunmoonclk/test.js --- apps/sunmoonclk/test.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/sunmoonclk/test.js diff --git a/apps/sunmoonclk/test.js b/apps/sunmoonclk/test.js deleted file mode 100644 index 8b13789179..0000000000 --- a/apps/sunmoonclk/test.js +++ /dev/null @@ -1 +0,0 @@ - From bc42c9f7fd96043160e0efbede7bddeb06539ef5 Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 10:47:22 -0500 Subject: [PATCH 13/29] Add files via upload --- apps/sunmoonclk/screenshot (1).png | Bin 0 -> 3022 bytes apps/sunmoonclk/screenshot (2).png | Bin 0 -> 2629 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/sunmoonclk/screenshot (1).png create mode 100644 apps/sunmoonclk/screenshot (2).png diff --git a/apps/sunmoonclk/screenshot (1).png b/apps/sunmoonclk/screenshot (1).png new file mode 100644 index 0000000000000000000000000000000000000000..e77e7e261fcd601258620d2fb79af3d60676f71e GIT binary patch literal 3022 zcmY*bc{r3^8-Jc>X2QtwCh=x%@mdEZ#=g9i%HE8M%JR7o%203F29K0Bp%Q5p`=&rVf zYcDs0rUWrfUh%=b9L82@PQ=`r8t!{33^cF25DJA&j8C^FqWd>=o6jB%sseP~9e+&X zr6(3VJPhIh_Ih2Qzq@M$4rqiIJ(rT$hI$u8Y#O15eBImUsS|DI9Q%9xwrdO=)@{3* zU7@;!_o0cjwR|c4=kavZ?irqQ^|E(6mC&VG25=jY3n z=hCa0@}7%Xg`*+jh|c>(e+yREzenkh&){@btoef7t<6>e%;f3-%invL=pL`lby0f! zwjWA8iQ5~}pd+vzx!~vv8YGxwSDMVO``uwe4Q|#>Qrq=Uj%I_`{)GbKVpeT+suLvmGxIJKg_qVpw3AL< zrmYgXRSHtM=YBqS={%G-I=%QCjDdKv-7zpx=g+i#)?r!gQiaS%^PA=rsOyACoeRB7 zc02Ow#-72LEJlmyE}0~_H#0bSi8jd}mxDpA@hAi3gawm7gJc)%a9bM*0rD~_ef0(H zkiH+VT^LL1b~AGZH=H8_%GsqhD?IJ2)_3xq0kNLT71b(xS0Tlf&krEs_8ai8``P%oS9{BGshf}nZ3iPhyyXrKGGsXXUKJ*`ecgXm*CTyz zJ`6aE_I;>OXrQH6+d;-fM_uwlIk~|b6Wb80d;eUX-tt{%+B667`u3wQgjYGXh3EZd zO>^2g1rscbnC-sbvg3wHeBjM#{jtf>Yd0l3R^6?E_`<_h(rD;Wk zZ8N)9=eqp7leaQ%ez)z%>wxaPZ^RXGKZw^=6QEggK z!%unp)=oj8p_8H>>>!m#+`CI5$RXsBu@@kxZ24kDXrh~_wQK6rn|no)a)@EOw^$%6 z{&o5Pj2P#yk`i>}qjGj2%@Y+RfjrGvAlL2n-^S0q%mO}DhofP2%zA-_^XEx4PL$LA zc|lOa*iX6XmAhg=Gqs7DJ3AgmmjSxwaT|fB`sLXc&QZ4O95L?+Di0x#odcTBV zhwrc+XzqL}(}P&m=i5^ZDDR~g%C;1>$!o*y(`9rKO;uQG+o1O$rf|D7BCH`7$)Kb9 z4Tjn}Dp?OIbyU|-g5 zqqi#E7tGJkf9`!pzT|uyq^5lLti2CG4foTIUQB_mgVgTjnwdUXc_?fp&d9T^p#NJ_ zUej7@IH32q`Pypq{M37@Ens;8;~5f)8azDZU9-;T)x|w*69k+$pQW|D#dCHn9r*PR zt_V92dL`XLNY?cPq~qs}lvOmw_UN*B`qFu?J2~4pJM#}rJwo{ql6$+XgKP~1;tQ)n zwDhq)ND~I^PGOsJSYWnNlh?ceE>{R!UW%^B0J2rWj0Bq2K`LQUK;VhnBXk2ShZgks z0tJ0u^N%ql_cgXeURl9qFD>sbJv4{Bk5IrR0g7>phswi$MmPN;d0KJUXA(?@Vk|o4 zW}tKZnUCanUuLAh$Pk-5M-p<;=eRm8Q3_FQpTkQBToW|Gx`@hjiG#;BU*a9b_?J>` zA3Q)UcaS9s3Q?bDno7!&%8&t+Ft@~Vv?(WR zEgV2lKwq4Fsep|1#1LZ}G+c>#UHALs5ECuUze<6B*MDRZ zGs7!fcq>3N`z>m{8_ES<3Hhue2r7~eHV>h^rd%Xz9Vmiemp z9V#G=p?)OcYKKsWC^7$NW#dJC${t@ng~Nuu{TS472}P{mMBM!t`iC&2ok)xV6z6V_ zl6!busCbo7?b|JjkPh@WCm>R$nDd1;3BJIP#EZbrU@J>g_xQ4Vy({G0^p*pg(~;!{ zr`rVubNaBo97Avn#%~po*H{l!8zX*M(=lS5Gq0&0*p@em8DAP|n5?l(lcOwNI3Kh@ zZmbC8`l@J@k1hb;qB0_ClqC7n5*nMs==p)>`~cF0A>*ozzc366cZ`bM!GzFmNlg{6 z!JU~qrG$tnn?)3-x3{jw#6CX1;iY8l5!V@b>C`BF)qZFUNM*wd%nEBGq;@~}ohD)Y zDzm-$b^ZvA7;H{&T|<`R0HUOE$fD=B8uNVIu&Mo&$nZ;K&@;ATY4(GPB;O0%nF$f_ zrzL%Sgic#n!i*0YU9}3>la*2paSuDkZR0DOCq;(WkijCB*wo}ZFlv>wnzG<6$tf^m zT*}Qy{DCdQM0RL$x`e;WTTs_q-h0qxlGrkd8II;j5jgJ%&8(!T*5*kZ>)W+(Bzl;4 zE!=l>93WaL)?1>|xb&v2NP$sFW3je=4eSeGE{$3vA28#rPrx`AUOaWW0(V;3XDDek zA(AS8Vo+o}Dxub@3q=F$XWqe_Hs_rC-l!i+j+aLY@W;J0IcQRdHT+36L(|b*iX(0v z<$ja|29Z%*xL>aU zw`Vh+DL;h)%fn|028Ynn<wlZWC)5(W^_cSLC}h7er=aLE?0yvpOe1y z1dX-Z%E=uaB#sqYjBjpUF63@SCtH4(;~1c8=x@#21MV~E3UK70vmN7apDX_bn##6A literal 0 HcmV?d00001 diff --git a/apps/sunmoonclk/screenshot (2).png b/apps/sunmoonclk/screenshot (2).png new file mode 100644 index 0000000000000000000000000000000000000000..88b416af640975ab2de003f67b25b815cf8c1238 GIT binary patch literal 2629 zcmYLLeIS!-AKqrga&SzAd<+eFDVz!&(=22Nr9yFhOx z-I}9eWtbB_(ZQrAgw|t~5}T7ta(N9S+~*n27SQ#w$Knpe)*q$Ys?tP-6>cFJjm#u7E9yI0{&*QMcS-_#g9wUG{_I^^9;?iZ~LFzI`> zk}!@u=X0axMtkKnamF-<`%Y>rTmFsE|1{G=gfb2>HKgRz5%0@?k-S}+e$H;7W!B_V zQ*;q_kgh-N84C`hwELcsU*o#!$y`=zC}I0Z%h&B;g5>DVA{B()RqKv0d2;UbtjRDY zSQef>^XcHz$yh>DB%Y`Jjl(ThN0|Q9yQQiAwb-Hr?UBX7=5WMY>)4%;KCM3XkwZVQvjJfiv9a1I@7kYqbU z$zs$G$9&zC+<7KyK~&M1+>hZ?upT_3(o)|qyc^SN16^mRpVKGz<}G9SAWdiX zX3m_cb;xs?`h$eYhQ<3?-I7pvV3JiUALj@w940RI*OFG7lnfrF3zJ!@rVUzj-5;$ExAivhlb~DkVE>PuC$>g z$_9k=csN=TA9->S218D7V%E6W18k3+Fg5nt^XOu*5}p?<$+Eahih>wN+;G4J>*yCy;$WHmd>$)lI=*2*HM_AL=Ivab?jcRkOuOSPdS#(sq4HU5udA~ft44{u_ zP#OvIMotezo*+U%a)_K#BC7yWRhoz3f8-BeSG2z0EY0xr=FHgq)5T_~bkI~N)olcv2#gS-F0YbaQ@aL zT4Mi@!0!S59u!kUib-fZ@wEToxACJV{_7oH7A*CP4m?}-)R6D1hV;hTQi~{o83jJP z{r9qZOrZ!4pE6o*?%#x?T=0TTj@tBkSTh3P-;8Rgw6{%}XTMAL9y$d>t1_kIbEo5! z+SS^#XVYewV~*A7otyK37R_3ZhHfG7JiTBqOIE9GVm@(Bd-!*%Is26*H0QlfWCA=| zowR~Jv~>ELvB(Oc-WQb0>KL}tNzW92sp@0qd=PUsWGKmjJsj(wdF`{@j{mr-PKopD zu`kzoJD>Ma$gX)%(8};z9!QyJ>?-+KQJ8yq)Ru6D7C-3neY;{`fp`_z4 z>oW?bI%S++g2CVMIB!;K4?Dg^OCUxwSB8de?-)c|mCiu}~VYdZ~~Y6)jA*a4@G?E4d=3q>Sy%w?%(GwATht@~1q z0Zk!a5CM-I#)bIs40NUT9r( z;G7FjX`iN5DGJ3P6FfifynH*k@bzbYlYW%`ahY^3q>&gbA3S(1d8V*Vm@N?Bkgrl5 z-W6BS*a~kj><@!Bnxt`shif8uu5v%NIJ%Cs{JjOXo%yv%UuMW^>5guFy}~+BniMeJ zrS>LKEZ%J)3|nI#(0#Msr2c~wKlnv3J-nRwEx@_g8ot|~ufe3p?nu(VMTcWVKX2QI z!99dynvJoG*OAkAhzVDoy74puXYXY0f?^lrP3`jjN0RbBoa{>nPSRuuY@z^0amvSB zfDh9h33)aEZ30iu83BvA+^g}_f$=p+I$q_2V58#nq#p}dR$4(pAnWUte6Rc9Ft~Z+ b6sQ1sJ5Sz`m5ZZ*7KodRmviNzkSqTI#f|s6 literal 0 HcmV?d00001 From fd49c16b7884a9288bfac3d19ba10b4999a3e125 Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 10:52:28 -0500 Subject: [PATCH 14/29] Delete apps/sunmoonclk/screenshot (1).png --- apps/sunmoonclk/screenshot (1).png | Bin 3022 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/sunmoonclk/screenshot (1).png diff --git a/apps/sunmoonclk/screenshot (1).png b/apps/sunmoonclk/screenshot (1).png deleted file mode 100644 index e77e7e261fcd601258620d2fb79af3d60676f71e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3022 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 From 2a48ee9bf5b5bf0cb53a150583c9a1df39f7706e Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 10:52:49 -0500 Subject: [PATCH 15/29] Delete apps/sunmoonclk/screenshot (2).png --- apps/sunmoonclk/screenshot (2).png | Bin 2629 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/sunmoonclk/screenshot (2).png diff --git a/apps/sunmoonclk/screenshot (2).png b/apps/sunmoonclk/screenshot (2).png deleted file mode 100644 index 88b416af640975ab2de003f67b25b815cf8c1238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2629 zcmYLLeIS!-AKqrga&SzAd<+eFDVz!&(=22Nr9yFhOx z-I}9eWtbB_(ZQrAgw|t~5}T7ta(N9S+~*n27SQ#w$Knpe)*q$Ys?tP-6>cFJjm#u7E9yI0{&*QMcS-_#g9wUG{_I^^9;?iZ~LFzI`> zk}!@u=X0axMtkKnamF-<`%Y>rTmFsE|1{G=gfb2>HKgRz5%0@?k-S}+e$H;7W!B_V zQ*;q_kgh-N84C`hwELcsU*o#!$y`=zC}I0Z%h&B;g5>DVA{B()RqKv0d2;UbtjRDY zSQef>^XcHz$yh>DB%Y`Jjl(ThN0|Q9yQQiAwb-Hr?UBX7=5WMY>)4%;KCM3XkwZVQvjJfiv9a1I@7kYqbU z$zs$G$9&zC+<7KyK~&M1+>hZ?upT_3(o)|qyc^SN16^mRpVKGz<}G9SAWdiX zX3m_cb;xs?`h$eYhQ<3?-I7pvV3JiUALj@w940RI*OFG7lnfrF3zJ!@rVUzj-5;$ExAivhlb~DkVE>PuC$>g z$_9k=csN=TA9->S218D7V%E6W18k3+Fg5nt^XOu*5}p?<$+Eahih>wN+;G4J>*yCy;$WHmd>$)lI=*2*HM_AL=Ivab?jcRkOuOSPdS#(sq4HU5udA~ft44{u_ zP#OvIMotezo*+U%a)_K#BC7yWRhoz3f8-BeSG2z0EY0xr=FHgq)5T_~bkI~N)olcv2#gS-F0YbaQ@aL zT4Mi@!0!S59u!kUib-fZ@wEToxACJV{_7oH7A*CP4m?}-)R6D1hV;hTQi~{o83jJP z{r9qZOrZ!4pE6o*?%#x?T=0TTj@tBkSTh3P-;8Rgw6{%}XTMAL9y$d>t1_kIbEo5! z+SS^#XVYewV~*A7otyK37R_3ZhHfG7JiTBqOIE9GVm@(Bd-!*%Is26*H0QlfWCA=| zowR~Jv~>ELvB(Oc-WQb0>KL}tNzW92sp@0qd=PUsWGKmjJsj(wdF`{@j{mr-PKopD zu`kzoJD>Ma$gX)%(8};z9!QyJ>?-+KQJ8yq)Ru6D7C-3neY;{`fp`_z4 z>oW?bI%S++g2CVMIB!;K4?Dg^OCUxwSB8de?-)c|mCiu}~VYdZ~~Y6)jA*a4@G?E4d=3q>Sy%w?%(GwATht@~1q z0Zk!a5CM-I#)bIs40NUT9r( z;G7FjX`iN5DGJ3P6FfifynH*k@bzbYlYW%`ahY^3q>&gbA3S(1d8V*Vm@N?Bkgrl5 z-W6BS*a~kj><@!Bnxt`shif8uu5v%NIJ%Cs{JjOXo%yv%UuMW^>5guFy}~+BniMeJ zrS>LKEZ%J)3|nI#(0#Msr2c~wKlnv3J-nRwEx@_g8ot|~ufe3p?nu(VMTcWVKX2QI z!99dynvJoG*OAkAhzVDoy74puXYXY0f?^lrP3`jjN0RbBoa{>nPSRuuY@z^0amvSB zfDh9h33)aEZ30iu83BvA+^g}_f$=p+I$q_2V58#nq#p}dR$4(pAnWUte6Rc9Ft~Z+ b6sQ1sJ5Sz`m5ZZ*7KodRmviNzkSqTI#f|s6 From 87f9e940e6a0ff9713e148c23fb0e6e4e6196f23 Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 10:53:15 -0500 Subject: [PATCH 16/29] Add files via upload --- apps/sunmoonclk/screenshot_moon.png | Bin 0 -> 2629 bytes apps/sunmoonclk/screenshot_sun.png | Bin 0 -> 3022 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/sunmoonclk/screenshot_moon.png create mode 100644 apps/sunmoonclk/screenshot_sun.png diff --git a/apps/sunmoonclk/screenshot_moon.png b/apps/sunmoonclk/screenshot_moon.png new file mode 100644 index 0000000000000000000000000000000000000000..88b416af640975ab2de003f67b25b815cf8c1238 GIT binary patch literal 2629 zcmYLLeIS!-AKqrga&SzAd<+eFDVz!&(=22Nr9yFhOx z-I}9eWtbB_(ZQrAgw|t~5}T7ta(N9S+~*n27SQ#w$Knpe)*q$Ys?tP-6>cFJjm#u7E9yI0{&*QMcS-_#g9wUG{_I^^9;?iZ~LFzI`> zk}!@u=X0axMtkKnamF-<`%Y>rTmFsE|1{G=gfb2>HKgRz5%0@?k-S}+e$H;7W!B_V zQ*;q_kgh-N84C`hwELcsU*o#!$y`=zC}I0Z%h&B;g5>DVA{B()RqKv0d2;UbtjRDY zSQef>^XcHz$yh>DB%Y`Jjl(ThN0|Q9yQQiAwb-Hr?UBX7=5WMY>)4%;KCM3XkwZVQvjJfiv9a1I@7kYqbU z$zs$G$9&zC+<7KyK~&M1+>hZ?upT_3(o)|qyc^SN16^mRpVKGz<}G9SAWdiX zX3m_cb;xs?`h$eYhQ<3?-I7pvV3JiUALj@w940RI*OFG7lnfrF3zJ!@rVUzj-5;$ExAivhlb~DkVE>PuC$>g z$_9k=csN=TA9->S218D7V%E6W18k3+Fg5nt^XOu*5}p?<$+Eahih>wN+;G4J>*yCy;$WHmd>$)lI=*2*HM_AL=Ivab?jcRkOuOSPdS#(sq4HU5udA~ft44{u_ zP#OvIMotezo*+U%a)_K#BC7yWRhoz3f8-BeSG2z0EY0xr=FHgq)5T_~bkI~N)olcv2#gS-F0YbaQ@aL zT4Mi@!0!S59u!kUib-fZ@wEToxACJV{_7oH7A*CP4m?}-)R6D1hV;hTQi~{o83jJP z{r9qZOrZ!4pE6o*?%#x?T=0TTj@tBkSTh3P-;8Rgw6{%}XTMAL9y$d>t1_kIbEo5! z+SS^#XVYewV~*A7otyK37R_3ZhHfG7JiTBqOIE9GVm@(Bd-!*%Is26*H0QlfWCA=| zowR~Jv~>ELvB(Oc-WQb0>KL}tNzW92sp@0qd=PUsWGKmjJsj(wdF`{@j{mr-PKopD zu`kzoJD>Ma$gX)%(8};z9!QyJ>?-+KQJ8yq)Ru6D7C-3neY;{`fp`_z4 z>oW?bI%S++g2CVMIB!;K4?Dg^OCUxwSB8de?-)c|mCiu}~VYdZ~~Y6)jA*a4@G?E4d=3q>Sy%w?%(GwATht@~1q z0Zk!a5CM-I#)bIs40NUT9r( z;G7FjX`iN5DGJ3P6FfifynH*k@bzbYlYW%`ahY^3q>&gbA3S(1d8V*Vm@N?Bkgrl5 z-W6BS*a~kj><@!Bnxt`shif8uu5v%NIJ%Cs{JjOXo%yv%UuMW^>5guFy}~+BniMeJ zrS>LKEZ%J)3|nI#(0#Msr2c~wKlnv3J-nRwEx@_g8ot|~ufe3p?nu(VMTcWVKX2QI z!99dynvJoG*OAkAhzVDoy74puXYXY0f?^lrP3`jjN0RbBoa{>nPSRuuY@z^0amvSB zfDh9h33)aEZ30iu83BvA+^g}_f$=p+I$q_2V58#nq#p}dR$4(pAnWUte6Rc9Ft~Z+ b6sQ1sJ5Sz`m5ZZ*7KodRmviNzkSqTI#f|s6 literal 0 HcmV?d00001 diff --git a/apps/sunmoonclk/screenshot_sun.png b/apps/sunmoonclk/screenshot_sun.png new file mode 100644 index 0000000000000000000000000000000000000000..e77e7e261fcd601258620d2fb79af3d60676f71e GIT binary patch literal 3022 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 literal 0 HcmV?d00001 From 41da04069bfabb6f00db7ecc558039c012a4d597 Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 11:27:56 -0500 Subject: [PATCH 17/29] Add files via upload --- apps/sunmoonclk/metadata.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 apps/sunmoonclk/metadata.json diff --git a/apps/sunmoonclk/metadata.json b/apps/sunmoonclk/metadata.json new file mode 100644 index 0000000000..b585b89dd0 --- /dev/null +++ b/apps/sunmoonclk/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "sunmoonclk", + "name": "Sun and Moon Clock", + "version": "0.1", + "description": "A basic clock with sun and moon images to represent day and night hours. Day is set from 6:00 AM to 5:59 PM and night is set from 6:00 PM to 5:59 AM.", + "icon": "sunmoonclk.png", + "screenshots": [{"url":"screenshot_sun.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"sunmoonclk.app.js","url":"app.js"}, + {"name":"sunmoonclk.img","url":"app-icon.js","evaluate":true} + ] +} \ No newline at end of file From 59d6ccebd8f18ad2f4eb96554a78273dc1ae2c46 Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 11:36:23 -0500 Subject: [PATCH 18/29] Update metadata.json --- apps/sunmoonclk/metadata.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/sunmoonclk/metadata.json b/apps/sunmoonclk/metadata.json index b585b89dd0..f93252d705 100644 --- a/apps/sunmoonclk/metadata.json +++ b/apps/sunmoonclk/metadata.json @@ -4,7 +4,8 @@ "version": "0.1", "description": "A basic clock with sun and moon images to represent day and night hours. Day is set from 6:00 AM to 5:59 PM and night is set from 6:00 PM to 5:59 AM.", "icon": "sunmoonclk.png", - "screenshots": [{"url":"screenshot_sun.png"}], + "screenshots": [{"url":"screenshot_sun.png"} + {"url":"screenshot_moon.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], @@ -13,4 +14,5 @@ {"name":"sunmoonclk.app.js","url":"app.js"}, {"name":"sunmoonclk.img","url":"app-icon.js","evaluate":true} ] -} \ No newline at end of file + +} From 31514f4caed6b6255f83ea038ef0b9412a58c742 Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 13:09:13 -0500 Subject: [PATCH 19/29] Delete apps/sunmoonclk/Sun_Moon_Watch.js --- apps/sunmoonclk/Sun_Moon_Watch.js | 88 ------------------------------- 1 file changed, 88 deletions(-) delete mode 100644 apps/sunmoonclk/Sun_Moon_Watch.js diff --git a/apps/sunmoonclk/Sun_Moon_Watch.js b/apps/sunmoonclk/Sun_Moon_Watch.js deleted file mode 100644 index 6825b807a4..0000000000 --- a/apps/sunmoonclk/Sun_Moon_Watch.js +++ /dev/null @@ -1,88 +0,0 @@ -// Load fonts -require("Font7x11Numeric7Seg").add(Graphics); -// X/Y are the position of the bottom right of the HH:MM text - make it central! -const X = g.getWidth()/2 + 45, - Y = g.getHeight()/2 + 40; - -function draw() { - // work out how to display the current time - var d = new Date(); - var clock = require("locale").time(d, 1 /*omit seconds*/); - var seconds = d.getSeconds().toString().padStart(2,0); - var meridian = require("locale").meridian(d); - // Reset the state of the graphics library - g.reset(); - // draw the current time (4x size 7 segment) - g.setFontAlign(1,1); // align bottom right - g.setFont("7x11Numeric7Seg:4"); - g.drawString(clock, X, Y, true /*clear background*/); - // draw the meridian(am/pm) and seconds (2x size 7 segment) - g.setFontAlign(-1,1); // align bottom left - g.setFont("6x8:2"); - g.drawString(meridian, X+4, Y-26, true /*clear background*/); - g.setFont("7x11Numeric7Seg:2"); - g.drawString(seconds, X+2, Y, true /*clear background*/); - // draw the date, in a normal font - g.setFont("6x8", 2); - g.setFontAlign(0,-40); // align center bottom - // pad the date - this clears the background if the date were to change length - var dateStr = " "+require("locale").date(d)+" "; - g.drawString(dateStr, g.getWidth()/2, Y+15, true /*clear background*/); - - // Get current time - let now = new Date(); - let h = now.getHours(); - let m = now.getMinutes(); - let timeStr = ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2); - - // Draw sun or moon icon - if (h >= 6 && h < 18) { - drawSun(g.getWidth()/2, g.getHeight()/2 - 40); - } else { - drawMoon(g.getWidth()/2, g.getHeight()/2 - 40); - } -} - -function drawSun(x, y) { - g.setColor("#FF8C00"); // orange - g.fillCircle(x, y, 12); - for (let i = 0; i < 8; i++) { - let angle = i * Math.PI / 4; - g.drawLine( - x + Math.cos(angle) * 16, - y + Math.sin(angle) * 16, - x + Math.cos(angle) * 22, - y + Math.sin(angle) * 22 - ); - } -} -function drawMoon(x, y) { - g.setColor("#F5F5F5"); // white smoke - g.fillCircle(x, y, 12); - g.setColor(0, 0, 0); // mask for crescent - g.fillCircle(x + 5, y - 2, 12); - -} - -// Clear the screen once, at startup -g.clear(); -// draw immediately at first -draw(); -// now draw every second -var secondInterval = setInterval(draw, 1000); -// Stop updates when LCD is off, restart when on -Bangle.on('lcdPower',on=>{ - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; - if (on) { - secondInterval = setInterval(draw, 1000); - draw(); // draw immediately - } -}); -/* Show launcher when middle button pressed -This should be done *before* Bangle.loadWidgets so that -widgets know if they're being loaded into a clock app or not */ -Bangle.setUI("clock"); -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); \ No newline at end of file From b37ad5ce4a95d320e524c739137b68ddd93dcb0d Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 13:10:24 -0500 Subject: [PATCH 20/29] Delete apps/sunmoonclk/sunmoonclk.info --- apps/sunmoonclk/sunmoonclk.info | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 apps/sunmoonclk/sunmoonclk.info diff --git a/apps/sunmoonclk/sunmoonclk.info b/apps/sunmoonclk/sunmoonclk.info deleted file mode 100644 index 4ec739f2b5..0000000000 --- a/apps/sunmoonclk/sunmoonclk.info +++ /dev/null @@ -1,6 +0,0 @@ -require("Storage").write("sunmoonclk.info",{ - "id":"sunmoonclk", - "name":"Sun Moon", - "type":"clock", - "src":"sunmoonclk.app.js" -}); \ No newline at end of file From 2c072c6e3cf457a8edf2fff2164f0208eff44de9 Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 13:14:07 -0500 Subject: [PATCH 21/29] Add files via upload --- apps/sunmoonclk/sunmoonclk.app.js | 102 ++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 apps/sunmoonclk/sunmoonclk.app.js diff --git a/apps/sunmoonclk/sunmoonclk.app.js b/apps/sunmoonclk/sunmoonclk.app.js new file mode 100644 index 0000000000..d34b6bde1d --- /dev/null +++ b/apps/sunmoonclk/sunmoonclk.app.js @@ -0,0 +1,102 @@ +// Load fonts +require("Font7x11Numeric7Seg").add(Graphics); +// X/Y are the position of the bottom right of the HH:MM text - make it central! +const X = g.getWidth()/2 + 45, + Y = g.getHeight()/2 + 40; + +function draw() { + // work out how to display the current time + var d = new Date(); + var clock = require("locale").time(d, 1 /*omit seconds*/); + var seconds = d.getSeconds().toString().padStart(2,0); + var meridian = require("locale").meridian(d); + + // Reset the state of the graphics library + g.reset(); + // draw the current time (4x size 7 segment) + g.setFontAlign(1,1); // align bottom right + g.setFont("7x11Numeric7Seg:4"); + g.drawString(clock, X, Y, true /*clear background*/); + // draw the meridian(am/pm) and seconds (2x size 7 segment) + g.setFontAlign(-1,1); // align bottom left + g.setFont("6x8:2"); + g.drawString(meridian, X+4, Y-26, true /*clear background*/); + g.setFont("7x11Numeric7Seg:2"); + g.drawString(seconds, X+2, Y, true /*clear background*/); + // draw the date, in a normal font + g.setFont("6x8", 2); + g.setFontAlign(0,-40); // align center bottom + // pad the date - this clears the background if the date were to change length + var dateStr = " "+require("locale").date(d)+" "; + g.drawString(dateStr, g.getWidth()/2, Y+15, true /*clear background*/); + + // Get current time + let now = new Date(); + let h = now.getHours(); + let m = now.getMinutes(); + let timeStr = ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2); + + // Draw sun or moon icon + if (h >= 6 && h < 18) { + drawSun(g.getWidth()/2, g.getHeight()/2 - 38); + } else { + clearSun(g.getWidth()/2, g.getHeight()/2 - 38); + drawMoon(g.getWidth()/2, g.getHeight()/2 - 38); + } +} + +function drawSun(x, y) { + g.setColor("#FF8C00"); // orange + g.fillCircle(x, y, 12); + for (let i = 0; i < 8; i++) { + let angle = i * Math.PI / 4; + g.drawLine( + x + Math.cos(angle) * 16, + y + Math.sin(angle) * 16, + x + Math.cos(angle) * 22, + y + Math.sin(angle) * 22 + ); + } +} + function clearSun(x, y) { + g.setColor("#000000"); // black + g.fillCircle(x, y, 12); + for (let i = 0; i < 8; i++) { + let angle = i * Math.PI / 4; + g.drawLine( + x + Math.cos(angle) * 16, + y + Math.sin(angle) * 16, + x + Math.cos(angle) * 22, + y + Math.sin(angle) * 22 + ); + } +} +function drawMoon(x, y) { + g.setColor("#F5F5F5"); // white smoke + g.fillCircle(x, y, 12); + g.setColor(0, 0, 0); // mask for crescent + g.fillCircle(x + 5, y - 2, 12); +} + +// Clear the screen once, at startup +g.clear(); +// draw immediately at first +draw(); +// now draw every second +var secondInterval = setInterval(draw, 1000); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 1000); + draw(); // draw immediately + } +}); +/* Show launcher when middle button pressed +This should be done *before* Bangle.loadWidgets so that +widgets know if they're being loaded into a clock app or not */ +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file From bf883eac9382fbc3b18484f5ba497dcf89c46b70 Mon Sep 17 00:00:00 2001 From: eholstine Date: Wed, 25 Feb 2026 13:26:38 -0500 Subject: [PATCH 22/29] Update metadata.json --- apps/sunmoonclk/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/sunmoonclk/metadata.json b/apps/sunmoonclk/metadata.json index f93252d705..7b9614e7ce 100644 --- a/apps/sunmoonclk/metadata.json +++ b/apps/sunmoonclk/metadata.json @@ -4,7 +4,7 @@ "version": "0.1", "description": "A basic clock with sun and moon images to represent day and night hours. Day is set from 6:00 AM to 5:59 PM and night is set from 6:00 PM to 5:59 AM.", "icon": "sunmoonclk.png", - "screenshots": [{"url":"screenshot_sun.png"} + "screenshots": [{"url":"screenshot_sun.png"}, {"url":"screenshot_moon.png"}], "type": "clock", "tags": "clock", @@ -16,3 +16,4 @@ ] } + From 4c4291e4e833966e2938400bb6e17352d09b769a Mon Sep 17 00:00:00 2001 From: eholstine Date: Thu, 26 Feb 2026 06:57:34 -0500 Subject: [PATCH 23/29] Delete apps/sunmoonclk directory --- apps/sunmoonclk/metadata.json | 19 ------ apps/sunmoonclk/screenshot_moon.png | Bin 2629 -> 0 bytes apps/sunmoonclk/screenshot_sun.png | Bin 3022 -> 0 bytes apps/sunmoonclk/sunmoonclk.app.js | 102 ---------------------------- apps/sunmoonclk/sunmoonclk.img | 1 - apps/sunmoonclk/sunmoonclk.png | Bin 1069 -> 0 bytes 6 files changed, 122 deletions(-) delete mode 100644 apps/sunmoonclk/metadata.json delete mode 100644 apps/sunmoonclk/screenshot_moon.png delete mode 100644 apps/sunmoonclk/screenshot_sun.png delete mode 100644 apps/sunmoonclk/sunmoonclk.app.js delete mode 100644 apps/sunmoonclk/sunmoonclk.img delete mode 100644 apps/sunmoonclk/sunmoonclk.png diff --git a/apps/sunmoonclk/metadata.json b/apps/sunmoonclk/metadata.json deleted file mode 100644 index 7b9614e7ce..0000000000 --- a/apps/sunmoonclk/metadata.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "sunmoonclk", - "name": "Sun and Moon Clock", - "version": "0.1", - "description": "A basic clock with sun and moon images to represent day and night hours. Day is set from 6:00 AM to 5:59 PM and night is set from 6:00 PM to 5:59 AM.", - "icon": "sunmoonclk.png", - "screenshots": [{"url":"screenshot_sun.png"}, - {"url":"screenshot_moon.png"}], - "type": "clock", - "tags": "clock", - "supports": ["BANGLEJS","BANGLEJS2"], - "allow_emulator": true, - "storage": [ - {"name":"sunmoonclk.app.js","url":"app.js"}, - {"name":"sunmoonclk.img","url":"app-icon.js","evaluate":true} - ] - -} - diff --git a/apps/sunmoonclk/screenshot_moon.png b/apps/sunmoonclk/screenshot_moon.png deleted file mode 100644 index 88b416af640975ab2de003f67b25b815cf8c1238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2629 zcmYLLeIS!-AKqrga&SzAd<+eFDVz!&(=22Nr9yFhOx z-I}9eWtbB_(ZQrAgw|t~5}T7ta(N9S+~*n27SQ#w$Knpe)*q$Ys?tP-6>cFJjm#u7E9yI0{&*QMcS-_#g9wUG{_I^^9;?iZ~LFzI`> zk}!@u=X0axMtkKnamF-<`%Y>rTmFsE|1{G=gfb2>HKgRz5%0@?k-S}+e$H;7W!B_V zQ*;q_kgh-N84C`hwELcsU*o#!$y`=zC}I0Z%h&B;g5>DVA{B()RqKv0d2;UbtjRDY zSQef>^XcHz$yh>DB%Y`Jjl(ThN0|Q9yQQiAwb-Hr?UBX7=5WMY>)4%;KCM3XkwZVQvjJfiv9a1I@7kYqbU z$zs$G$9&zC+<7KyK~&M1+>hZ?upT_3(o)|qyc^SN16^mRpVKGz<}G9SAWdiX zX3m_cb;xs?`h$eYhQ<3?-I7pvV3JiUALj@w940RI*OFG7lnfrF3zJ!@rVUzj-5;$ExAivhlb~DkVE>PuC$>g z$_9k=csN=TA9->S218D7V%E6W18k3+Fg5nt^XOu*5}p?<$+Eahih>wN+;G4J>*yCy;$WHmd>$)lI=*2*HM_AL=Ivab?jcRkOuOSPdS#(sq4HU5udA~ft44{u_ zP#OvIMotezo*+U%a)_K#BC7yWRhoz3f8-BeSG2z0EY0xr=FHgq)5T_~bkI~N)olcv2#gS-F0YbaQ@aL zT4Mi@!0!S59u!kUib-fZ@wEToxACJV{_7oH7A*CP4m?}-)R6D1hV;hTQi~{o83jJP z{r9qZOrZ!4pE6o*?%#x?T=0TTj@tBkSTh3P-;8Rgw6{%}XTMAL9y$d>t1_kIbEo5! z+SS^#XVYewV~*A7otyK37R_3ZhHfG7JiTBqOIE9GVm@(Bd-!*%Is26*H0QlfWCA=| zowR~Jv~>ELvB(Oc-WQb0>KL}tNzW92sp@0qd=PUsWGKmjJsj(wdF`{@j{mr-PKopD zu`kzoJD>Ma$gX)%(8};z9!QyJ>?-+KQJ8yq)Ru6D7C-3neY;{`fp`_z4 z>oW?bI%S++g2CVMIB!;K4?Dg^OCUxwSB8de?-)c|mCiu}~VYdZ~~Y6)jA*a4@G?E4d=3q>Sy%w?%(GwATht@~1q z0Zk!a5CM-I#)bIs40NUT9r( z;G7FjX`iN5DGJ3P6FfifynH*k@bzbYlYW%`ahY^3q>&gbA3S(1d8V*Vm@N?Bkgrl5 z-W6BS*a~kj><@!Bnxt`shif8uu5v%NIJ%Cs{JjOXo%yv%UuMW^>5guFy}~+BniMeJ zrS>LKEZ%J)3|nI#(0#Msr2c~wKlnv3J-nRwEx@_g8ot|~ufe3p?nu(VMTcWVKX2QI z!99dynvJoG*OAkAhzVDoy74puXYXY0f?^lrP3`jjN0RbBoa{>nPSRuuY@z^0amvSB zfDh9h33)aEZ30iu83BvA+^g}_f$=p+I$q_2V58#nq#p}dR$4(pAnWUte6Rc9Ft~Z+ b6sQ1sJ5Sz`m5ZZ*7KodRmviNzkSqTI#f|s6 diff --git a/apps/sunmoonclk/screenshot_sun.png b/apps/sunmoonclk/screenshot_sun.png deleted file mode 100644 index e77e7e261fcd601258620d2fb79af3d60676f71e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3022 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 diff --git a/apps/sunmoonclk/sunmoonclk.app.js b/apps/sunmoonclk/sunmoonclk.app.js deleted file mode 100644 index d34b6bde1d..0000000000 --- a/apps/sunmoonclk/sunmoonclk.app.js +++ /dev/null @@ -1,102 +0,0 @@ -// Load fonts -require("Font7x11Numeric7Seg").add(Graphics); -// X/Y are the position of the bottom right of the HH:MM text - make it central! -const X = g.getWidth()/2 + 45, - Y = g.getHeight()/2 + 40; - -function draw() { - // work out how to display the current time - var d = new Date(); - var clock = require("locale").time(d, 1 /*omit seconds*/); - var seconds = d.getSeconds().toString().padStart(2,0); - var meridian = require("locale").meridian(d); - - // Reset the state of the graphics library - g.reset(); - // draw the current time (4x size 7 segment) - g.setFontAlign(1,1); // align bottom right - g.setFont("7x11Numeric7Seg:4"); - g.drawString(clock, X, Y, true /*clear background*/); - // draw the meridian(am/pm) and seconds (2x size 7 segment) - g.setFontAlign(-1,1); // align bottom left - g.setFont("6x8:2"); - g.drawString(meridian, X+4, Y-26, true /*clear background*/); - g.setFont("7x11Numeric7Seg:2"); - g.drawString(seconds, X+2, Y, true /*clear background*/); - // draw the date, in a normal font - g.setFont("6x8", 2); - g.setFontAlign(0,-40); // align center bottom - // pad the date - this clears the background if the date were to change length - var dateStr = " "+require("locale").date(d)+" "; - g.drawString(dateStr, g.getWidth()/2, Y+15, true /*clear background*/); - - // Get current time - let now = new Date(); - let h = now.getHours(); - let m = now.getMinutes(); - let timeStr = ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2); - - // Draw sun or moon icon - if (h >= 6 && h < 18) { - drawSun(g.getWidth()/2, g.getHeight()/2 - 38); - } else { - clearSun(g.getWidth()/2, g.getHeight()/2 - 38); - drawMoon(g.getWidth()/2, g.getHeight()/2 - 38); - } -} - -function drawSun(x, y) { - g.setColor("#FF8C00"); // orange - g.fillCircle(x, y, 12); - for (let i = 0; i < 8; i++) { - let angle = i * Math.PI / 4; - g.drawLine( - x + Math.cos(angle) * 16, - y + Math.sin(angle) * 16, - x + Math.cos(angle) * 22, - y + Math.sin(angle) * 22 - ); - } -} - function clearSun(x, y) { - g.setColor("#000000"); // black - g.fillCircle(x, y, 12); - for (let i = 0; i < 8; i++) { - let angle = i * Math.PI / 4; - g.drawLine( - x + Math.cos(angle) * 16, - y + Math.sin(angle) * 16, - x + Math.cos(angle) * 22, - y + Math.sin(angle) * 22 - ); - } -} -function drawMoon(x, y) { - g.setColor("#F5F5F5"); // white smoke - g.fillCircle(x, y, 12); - g.setColor(0, 0, 0); // mask for crescent - g.fillCircle(x + 5, y - 2, 12); -} - -// Clear the screen once, at startup -g.clear(); -// draw immediately at first -draw(); -// now draw every second -var secondInterval = setInterval(draw, 1000); -// Stop updates when LCD is off, restart when on -Bangle.on('lcdPower',on=>{ - if (secondInterval) clearInterval(secondInterval); - secondInterval = undefined; - if (on) { - secondInterval = setInterval(draw, 1000); - draw(); // draw immediately - } -}); -/* Show launcher when middle button pressed -This should be done *before* Bangle.loadWidgets so that -widgets know if they're being loaded into a clock app or not */ -Bangle.setUI("clock"); -// Load widgets -Bangle.loadWidgets(); -Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/sunmoonclk/sunmoonclk.img b/apps/sunmoonclk/sunmoonclk.img deleted file mode 100644 index 9ab3fa8126..0000000000 --- a/apps/sunmoonclk/sunmoonclk.img +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("MDCDAf/////////////////////////////////////////////////////////////////////////////////wAAAP/////////////////wAMP/+AAP//////////////wNtth////wP////////////+Nttth/////x///////////+BttttsP////+B//////////xtttttth/////+P////////+Ntttttth//////x////////xtttttttsP/////+P//////+NtttttttsP//////x//////+NttttsBtth//+B//x//////xttttth+Nth//x+P/+P////+NttttsOB9th/+OBx//x////+NttttsOB9tsP+OBx//x////xtttttsP/9tsP+P/x//+P///xtttttth+NtsP/x+P//+P///xttttttsBttsP/+B///+P///xtttttttttth///////+P//+Ntttttttttth////////x//+NtttttttttsP////////x//+Nttttttttth/////////x//+Nttttttttth/////////x//+NtttttttttsAP///////x//+Nttttttttttth///////x//+Nttttttttttth///////x//+Nttttttttttth///////x///xttttttttttth//////+P///xttttttttttth//////+P///xtttttthtttsP//x///+P///xttttttsNttsP/+P///+P///+NtttttsNttsP/+P///x////+NttttthhttsP/xx///x/////xttttttsAAAAAP///+P/////xttttttttth//////x//////+Ntttttttth//////x///////xtttttttsP/////+P///////+NttttttsP/////x/////////xtttttth/////+P/////////+BttttsP////+B///////////+Nttth/////x/////////////wNtth////wP//////////////wAMP//wAP/////////////////wAAAP/////////////////////////////////////////////////////////////////////////////////w==") \ No newline at end of file diff --git a/apps/sunmoonclk/sunmoonclk.png b/apps/sunmoonclk/sunmoonclk.png deleted file mode 100644 index 32f1c23715664ad506e01c83f656664c24548678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1069 zcmV+|1k(G7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGxg#Z8@g#qvzGVA~V1Hwr}K~!i%?U}!e z9aR*^Ki@Tp3Nj#?CRqCiSmY@(0TYO*SZJf5g&8Eu&p5EUmPNsNioQ4hn;n z|A8Q4kznya)NFQ-#oqh8bKd;8GjCql1wSw__neuX^S$Ssxp(Ku%s9&Ic*9ZSe*qpz zrzPEx^jA2phvOefyTH@_o=woEJs{}}a3u`)tuA)7SW;D$yAsN>jHd<&Ff+RdywfTi zG9c+BkR5n#79t@Vf126rz$Nc*BU^x^JFPDM@b)3biXaFvvnPO$z0Z?XLXz&768u!E zszTCb;5qN}3}!&mT~-&@ynPH)vcP|tI0JOv+?xSO=Qa&~6GA4w2OjjkNUs3kQ*Y=) zizQkty&0>EbPZUeEX!X1qzp*9$LivCZ|_2jC1!@1wTkE>lnG|mDk5Y-z~kOWmjFp; ztuB7`_AX-Zl90quUqxc@>3uySJ^>!^zE%OiH{P%*LuHi7kKV8*K+?-r7xMNTVkwLz z=f02yfEQBxngHMpZy3VrBK~nWn1qJEizFxr_hr0p-%AH=0 z6W)+RPUia7gb~f%*bB7@xXl}Ku)4?+(MDO8ox)nUB^|5@Fthik2C_|(`u{eyuL%HN zOkY#EXtA7>g*f{oO6Yt#Sldnq-U+EY^ud&-o-+GM@ZSOFygwyZ0Kj=kUlJCr9L5G8U!@_Y4}qurHJ+goO8Lsn z9x^k_DXA&J+rbB}ec;WU;2D{Ll$RvEOHVd(1-Mzi2AuTQ^f6TcVMY8ReCAjYSL3eW z{fe7BzXtAaI5XHpK;$g&HQ{$(Nxfwmo);f#z|X*a&8za6LxAV`@C)N!vUA)C+u&os n4?y Date: Fri, 27 Feb 2026 18:01:18 +0000 Subject: [PATCH 24/29] Revert "Delete apps/sunmoonclk directory" This reverts commit 4c4291e4e833966e2938400bb6e17352d09b769a. --- apps/sunmoonclk/metadata.json | 19 ++++++ apps/sunmoonclk/screenshot_moon.png | Bin 0 -> 2629 bytes apps/sunmoonclk/screenshot_sun.png | Bin 0 -> 3022 bytes apps/sunmoonclk/sunmoonclk.app.js | 102 ++++++++++++++++++++++++++++ apps/sunmoonclk/sunmoonclk.img | 1 + apps/sunmoonclk/sunmoonclk.png | Bin 0 -> 1069 bytes 6 files changed, 122 insertions(+) create mode 100644 apps/sunmoonclk/metadata.json create mode 100644 apps/sunmoonclk/screenshot_moon.png create mode 100644 apps/sunmoonclk/screenshot_sun.png create mode 100644 apps/sunmoonclk/sunmoonclk.app.js create mode 100644 apps/sunmoonclk/sunmoonclk.img create mode 100644 apps/sunmoonclk/sunmoonclk.png diff --git a/apps/sunmoonclk/metadata.json b/apps/sunmoonclk/metadata.json new file mode 100644 index 0000000000..7b9614e7ce --- /dev/null +++ b/apps/sunmoonclk/metadata.json @@ -0,0 +1,19 @@ +{ + "id": "sunmoonclk", + "name": "Sun and Moon Clock", + "version": "0.1", + "description": "A basic clock with sun and moon images to represent day and night hours. Day is set from 6:00 AM to 5:59 PM and night is set from 6:00 PM to 5:59 AM.", + "icon": "sunmoonclk.png", + "screenshots": [{"url":"screenshot_sun.png"}, + {"url":"screenshot_moon.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"sunmoonclk.app.js","url":"app.js"}, + {"name":"sunmoonclk.img","url":"app-icon.js","evaluate":true} + ] + +} + diff --git a/apps/sunmoonclk/screenshot_moon.png b/apps/sunmoonclk/screenshot_moon.png new file mode 100644 index 0000000000000000000000000000000000000000..88b416af640975ab2de003f67b25b815cf8c1238 GIT binary patch literal 2629 zcmYLLeIS!-AKqrga&SzAd<+eFDVz!&(=22Nr9yFhOx z-I}9eWtbB_(ZQrAgw|t~5}T7ta(N9S+~*n27SQ#w$Knpe)*q$Ys?tP-6>cFJjm#u7E9yI0{&*QMcS-_#g9wUG{_I^^9;?iZ~LFzI`> zk}!@u=X0axMtkKnamF-<`%Y>rTmFsE|1{G=gfb2>HKgRz5%0@?k-S}+e$H;7W!B_V zQ*;q_kgh-N84C`hwELcsU*o#!$y`=zC}I0Z%h&B;g5>DVA{B()RqKv0d2;UbtjRDY zSQef>^XcHz$yh>DB%Y`Jjl(ThN0|Q9yQQiAwb-Hr?UBX7=5WMY>)4%;KCM3XkwZVQvjJfiv9a1I@7kYqbU z$zs$G$9&zC+<7KyK~&M1+>hZ?upT_3(o)|qyc^SN16^mRpVKGz<}G9SAWdiX zX3m_cb;xs?`h$eYhQ<3?-I7pvV3JiUALj@w940RI*OFG7lnfrF3zJ!@rVUzj-5;$ExAivhlb~DkVE>PuC$>g z$_9k=csN=TA9->S218D7V%E6W18k3+Fg5nt^XOu*5}p?<$+Eahih>wN+;G4J>*yCy;$WHmd>$)lI=*2*HM_AL=Ivab?jcRkOuOSPdS#(sq4HU5udA~ft44{u_ zP#OvIMotezo*+U%a)_K#BC7yWRhoz3f8-BeSG2z0EY0xr=FHgq)5T_~bkI~N)olcv2#gS-F0YbaQ@aL zT4Mi@!0!S59u!kUib-fZ@wEToxACJV{_7oH7A*CP4m?}-)R6D1hV;hTQi~{o83jJP z{r9qZOrZ!4pE6o*?%#x?T=0TTj@tBkSTh3P-;8Rgw6{%}XTMAL9y$d>t1_kIbEo5! z+SS^#XVYewV~*A7otyK37R_3ZhHfG7JiTBqOIE9GVm@(Bd-!*%Is26*H0QlfWCA=| zowR~Jv~>ELvB(Oc-WQb0>KL}tNzW92sp@0qd=PUsWGKmjJsj(wdF`{@j{mr-PKopD zu`kzoJD>Ma$gX)%(8};z9!QyJ>?-+KQJ8yq)Ru6D7C-3neY;{`fp`_z4 z>oW?bI%S++g2CVMIB!;K4?Dg^OCUxwSB8de?-)c|mCiu}~VYdZ~~Y6)jA*a4@G?E4d=3q>Sy%w?%(GwATht@~1q z0Zk!a5CM-I#)bIs40NUT9r( z;G7FjX`iN5DGJ3P6FfifynH*k@bzbYlYW%`ahY^3q>&gbA3S(1d8V*Vm@N?Bkgrl5 z-W6BS*a~kj><@!Bnxt`shif8uu5v%NIJ%Cs{JjOXo%yv%UuMW^>5guFy}~+BniMeJ zrS>LKEZ%J)3|nI#(0#Msr2c~wKlnv3J-nRwEx@_g8ot|~ufe3p?nu(VMTcWVKX2QI z!99dynvJoG*OAkAhzVDoy74puXYXY0f?^lrP3`jjN0RbBoa{>nPSRuuY@z^0amvSB zfDh9h33)aEZ30iu83BvA+^g}_f$=p+I$q_2V58#nq#p}dR$4(pAnWUte6Rc9Ft~Z+ b6sQ1sJ5Sz`m5ZZ*7KodRmviNzkSqTI#f|s6 literal 0 HcmV?d00001 diff --git a/apps/sunmoonclk/screenshot_sun.png b/apps/sunmoonclk/screenshot_sun.png new file mode 100644 index 0000000000000000000000000000000000000000..e77e7e261fcd601258620d2fb79af3d60676f71e GIT binary patch literal 3022 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 literal 0 HcmV?d00001 diff --git a/apps/sunmoonclk/sunmoonclk.app.js b/apps/sunmoonclk/sunmoonclk.app.js new file mode 100644 index 0000000000..d34b6bde1d --- /dev/null +++ b/apps/sunmoonclk/sunmoonclk.app.js @@ -0,0 +1,102 @@ +// Load fonts +require("Font7x11Numeric7Seg").add(Graphics); +// X/Y are the position of the bottom right of the HH:MM text - make it central! +const X = g.getWidth()/2 + 45, + Y = g.getHeight()/2 + 40; + +function draw() { + // work out how to display the current time + var d = new Date(); + var clock = require("locale").time(d, 1 /*omit seconds*/); + var seconds = d.getSeconds().toString().padStart(2,0); + var meridian = require("locale").meridian(d); + + // Reset the state of the graphics library + g.reset(); + // draw the current time (4x size 7 segment) + g.setFontAlign(1,1); // align bottom right + g.setFont("7x11Numeric7Seg:4"); + g.drawString(clock, X, Y, true /*clear background*/); + // draw the meridian(am/pm) and seconds (2x size 7 segment) + g.setFontAlign(-1,1); // align bottom left + g.setFont("6x8:2"); + g.drawString(meridian, X+4, Y-26, true /*clear background*/); + g.setFont("7x11Numeric7Seg:2"); + g.drawString(seconds, X+2, Y, true /*clear background*/); + // draw the date, in a normal font + g.setFont("6x8", 2); + g.setFontAlign(0,-40); // align center bottom + // pad the date - this clears the background if the date were to change length + var dateStr = " "+require("locale").date(d)+" "; + g.drawString(dateStr, g.getWidth()/2, Y+15, true /*clear background*/); + + // Get current time + let now = new Date(); + let h = now.getHours(); + let m = now.getMinutes(); + let timeStr = ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2); + + // Draw sun or moon icon + if (h >= 6 && h < 18) { + drawSun(g.getWidth()/2, g.getHeight()/2 - 38); + } else { + clearSun(g.getWidth()/2, g.getHeight()/2 - 38); + drawMoon(g.getWidth()/2, g.getHeight()/2 - 38); + } +} + +function drawSun(x, y) { + g.setColor("#FF8C00"); // orange + g.fillCircle(x, y, 12); + for (let i = 0; i < 8; i++) { + let angle = i * Math.PI / 4; + g.drawLine( + x + Math.cos(angle) * 16, + y + Math.sin(angle) * 16, + x + Math.cos(angle) * 22, + y + Math.sin(angle) * 22 + ); + } +} + function clearSun(x, y) { + g.setColor("#000000"); // black + g.fillCircle(x, y, 12); + for (let i = 0; i < 8; i++) { + let angle = i * Math.PI / 4; + g.drawLine( + x + Math.cos(angle) * 16, + y + Math.sin(angle) * 16, + x + Math.cos(angle) * 22, + y + Math.sin(angle) * 22 + ); + } +} +function drawMoon(x, y) { + g.setColor("#F5F5F5"); // white smoke + g.fillCircle(x, y, 12); + g.setColor(0, 0, 0); // mask for crescent + g.fillCircle(x + 5, y - 2, 12); +} + +// Clear the screen once, at startup +g.clear(); +// draw immediately at first +draw(); +// now draw every second +var secondInterval = setInterval(draw, 1000); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 1000); + draw(); // draw immediately + } +}); +/* Show launcher when middle button pressed +This should be done *before* Bangle.loadWidgets so that +widgets know if they're being loaded into a clock app or not */ +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/sunmoonclk/sunmoonclk.img b/apps/sunmoonclk/sunmoonclk.img new file mode 100644 index 0000000000..9ab3fa8126 --- /dev/null +++ b/apps/sunmoonclk/sunmoonclk.img @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("MDCDAf/////////////////////////////////////////////////////////////////////////////////wAAAP/////////////////wAMP/+AAP//////////////wNtth////wP////////////+Nttth/////x///////////+BttttsP////+B//////////xtttttth/////+P////////+Ntttttth//////x////////xtttttttsP/////+P//////+NtttttttsP//////x//////+NttttsBtth//+B//x//////xttttth+Nth//x+P/+P////+NttttsOB9th/+OBx//x////+NttttsOB9tsP+OBx//x////xtttttsP/9tsP+P/x//+P///xtttttth+NtsP/x+P//+P///xttttttsBttsP/+B///+P///xtttttttttth///////+P//+Ntttttttttth////////x//+NtttttttttsP////////x//+Nttttttttth/////////x//+Nttttttttth/////////x//+NtttttttttsAP///////x//+Nttttttttttth///////x//+Nttttttttttth///////x//+Nttttttttttth///////x///xttttttttttth//////+P///xttttttttttth//////+P///xtttttthtttsP//x///+P///xttttttsNttsP/+P///+P///+NtttttsNttsP/+P///x////+NttttthhttsP/xx///x/////xttttttsAAAAAP///+P/////xttttttttth//////x//////+Ntttttttth//////x///////xtttttttsP/////+P///////+NttttttsP/////x/////////xtttttth/////+P/////////+BttttsP////+B///////////+Nttth/////x/////////////wNtth////wP//////////////wAMP//wAP/////////////////wAAAP/////////////////////////////////////////////////////////////////////////////////w==") \ No newline at end of file diff --git a/apps/sunmoonclk/sunmoonclk.png b/apps/sunmoonclk/sunmoonclk.png new file mode 100644 index 0000000000000000000000000000000000000000..32f1c23715664ad506e01c83f656664c24548678 GIT binary patch literal 1069 zcmV+|1k(G7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGxg#Z8@g#qvzGVA~V1Hwr}K~!i%?U}!e z9aR*^Ki@Tp3Nj#?CRqCiSmY@(0TYO*SZJf5g&8Eu&p5EUmPNsNioQ4hn;n z|A8Q4kznya)NFQ-#oqh8bKd;8GjCql1wSw__neuX^S$Ssxp(Ku%s9&Ic*9ZSe*qpz zrzPEx^jA2phvOefyTH@_o=woEJs{}}a3u`)tuA)7SW;D$yAsN>jHd<&Ff+RdywfTi zG9c+BkR5n#79t@Vf126rz$Nc*BU^x^JFPDM@b)3biXaFvvnPO$z0Z?XLXz&768u!E zszTCb;5qN}3}!&mT~-&@ynPH)vcP|tI0JOv+?xSO=Qa&~6GA4w2OjjkNUs3kQ*Y=) zizQkty&0>EbPZUeEX!X1qzp*9$LivCZ|_2jC1!@1wTkE>lnG|mDk5Y-z~kOWmjFp; ztuB7`_AX-Zl90quUqxc@>3uySJ^>!^zE%OiH{P%*LuHi7kKV8*K+?-r7xMNTVkwLz z=f02yfEQBxngHMpZy3VrBK~nWn1qJEizFxr_hr0p-%AH=0 z6W)+RPUia7gb~f%*bB7@xXl}Ku)4?+(MDO8ox)nUB^|5@Fthik2C_|(`u{eyuL%HN zOkY#EXtA7>g*f{oO6Yt#Sldnq-U+EY^ud&-o-+GM@ZSOFygwyZ0Kj=kUlJCr9L5G8U!@_Y4}qurHJ+goO8Lsn z9x^k_DXA&J+rbB}ec;WU;2D{Ll$RvEOHVd(1-Mzi2AuTQ^f6TcVMY8ReCAjYSL3eW z{fe7BzXtAaI5XHpK;$g&HQ{$(Nxfwmo);f#z|X*a&8za6LxAV`@C)N!vUA)C+u&os n4?y Date: Fri, 27 Feb 2026 18:10:17 +0000 Subject: [PATCH 25/29] sunmoon: add changelog and fix metadata/filenames --- apps/sunmoonclk/ChangeLog | 1 + apps/sunmoonclk/{sunmoonclk.img => app-icon.js} | 2 +- apps/sunmoonclk/{sunmoonclk.app.js => app.js} | 0 apps/sunmoonclk/metadata.json | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 apps/sunmoonclk/ChangeLog rename apps/sunmoonclk/{sunmoonclk.img => app-icon.js} (95%) rename apps/sunmoonclk/{sunmoonclk.app.js => app.js} (100%) diff --git a/apps/sunmoonclk/ChangeLog b/apps/sunmoonclk/ChangeLog new file mode 100644 index 0000000000..90161ac985 --- /dev/null +++ b/apps/sunmoonclk/ChangeLog @@ -0,0 +1 @@ +0.01: Initial app diff --git a/apps/sunmoonclk/sunmoonclk.img b/apps/sunmoonclk/app-icon.js similarity index 95% rename from apps/sunmoonclk/sunmoonclk.img rename to apps/sunmoonclk/app-icon.js index 9ab3fa8126..b62642c3b9 100644 --- a/apps/sunmoonclk/sunmoonclk.img +++ b/apps/sunmoonclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("MDCDAf/////////////////////////////////////////////////////////////////////////////////wAAAP/////////////////wAMP/+AAP//////////////wNtth////wP////////////+Nttth/////x///////////+BttttsP////+B//////////xtttttth/////+P////////+Ntttttth//////x////////xtttttttsP/////+P//////+NtttttttsP//////x//////+NttttsBtth//+B//x//////xttttth+Nth//x+P/+P////+NttttsOB9th/+OBx//x////+NttttsOB9tsP+OBx//x////xtttttsP/9tsP+P/x//+P///xtttttth+NtsP/x+P//+P///xttttttsBttsP/+B///+P///xtttttttttth///////+P//+Ntttttttttth////////x//+NtttttttttsP////////x//+Nttttttttth/////////x//+Nttttttttth/////////x//+NtttttttttsAP///////x//+Nttttttttttth///////x//+Nttttttttttth///////x//+Nttttttttttth///////x///xttttttttttth//////+P///xttttttttttth//////+P///xtttttthtttsP//x///+P///xttttttsNttsP/+P///+P///+NtttttsNttsP/+P///x////+NttttthhttsP/xx///x/////xttttttsAAAAAP///+P/////xttttttttth//////x//////+Ntttttttth//////x///////xtttttttsP/////+P///////+NttttttsP/////x/////////xtttttth/////+P/////////+BttttsP////+B///////////+Nttth/////x/////////////wNtth////wP//////////////wAMP//wAP/////////////////wAAAP/////////////////////////////////////////////////////////////////////////////////w==") \ No newline at end of file +require("heatshrink").decompress(atob("MDCDAf/////////////////////////////////////////////////////////////////////////////////wAAAP/////////////////wAMP/+AAP//////////////wNtth////wP////////////+Nttth/////x///////////+BttttsP////+B//////////xtttttth/////+P////////+Ntttttth//////x////////xtttttttsP/////+P//////+NtttttttsP//////x//////+NttttsBtth//+B//x//////xttttth+Nth//x+P/+P////+NttttsOB9th/+OBx//x////+NttttsOB9tsP+OBx//x////xtttttsP/9tsP+P/x//+P///xtttttth+NtsP/x+P//+P///xttttttsBttsP/+B///+P///xtttttttttth///////+P//+Ntttttttttth////////x//+NtttttttttsP////////x//+Nttttttttth/////////x//+Nttttttttth/////////x//+NtttttttttsAP///////x//+Nttttttttttth///////x//+Nttttttttttth///////x//+Nttttttttttth///////x///xttttttttttth//////+P///xttttttttttth//////+P///xtttttthtttsP//x///+P///xttttttsNttsP/+P///+P///+NtttttsNttsP/+P///x////+NttttthhttsP/xx///x/////xttttttsAAAAAP///+P/////xttttttttth//////x//////+Ntttttttth//////x///////xtttttttsP/////+P///////+NttttttsP/////x/////////xtttttth/////+P/////////+BttttsP////+B///////////+Nttth/////x/////////////wNtth////wP//////////////wAMP//wAP/////////////////wAAAP/////////////////////////////////////////////////////////////////////////////////w==")) diff --git a/apps/sunmoonclk/sunmoonclk.app.js b/apps/sunmoonclk/app.js similarity index 100% rename from apps/sunmoonclk/sunmoonclk.app.js rename to apps/sunmoonclk/app.js diff --git a/apps/sunmoonclk/metadata.json b/apps/sunmoonclk/metadata.json index 7b9614e7ce..368e8d2a13 100644 --- a/apps/sunmoonclk/metadata.json +++ b/apps/sunmoonclk/metadata.json @@ -1,7 +1,7 @@ { "id": "sunmoonclk", "name": "Sun and Moon Clock", - "version": "0.1", + "version": "0.01", "description": "A basic clock with sun and moon images to represent day and night hours. Day is set from 6:00 AM to 5:59 PM and night is set from 6:00 PM to 5:59 AM.", "icon": "sunmoonclk.png", "screenshots": [{"url":"screenshot_sun.png"}, From c5fec1e0453f5ccad886b5e252ad7bdf80272a35 Mon Sep 17 00:00:00 2001 From: eholstine Date: Sat, 28 Feb 2026 21:25:06 -0500 Subject: [PATCH 26/29] Update app-icon.js --- apps/sunmoonclk/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sunmoonclk/app-icon.js b/apps/sunmoonclk/app-icon.js index b62642c3b9..32ffb77e3f 100644 --- a/apps/sunmoonclk/app-icon.js +++ b/apps/sunmoonclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("MDCDAf/////////////////////////////////////////////////////////////////////////////////wAAAP/////////////////wAMP/+AAP//////////////wNtth////wP////////////+Nttth/////x///////////+BttttsP////+B//////////xtttttth/////+P////////+Ntttttth//////x////////xtttttttsP/////+P//////+NtttttttsP//////x//////+NttttsBtth//+B//x//////xttttth+Nth//x+P/+P////+NttttsOB9th/+OBx//x////+NttttsOB9tsP+OBx//x////xtttttsP/9tsP+P/x//+P///xtttttth+NtsP/x+P//+P///xttttttsBttsP/+B///+P///xtttttttttth///////+P//+Ntttttttttth////////x//+NtttttttttsP////////x//+Nttttttttth/////////x//+Nttttttttth/////////x//+NtttttttttsAP///////x//+Nttttttttttth///////x//+Nttttttttttth///////x//+Nttttttttttth///////x///xttttttttttth//////+P///xttttttttttth//////+P///xtttttthtttsP//x///+P///xttttttsNttsP/+P///+P///+NtttttsNttsP/+P///x////+NttttthhttsP/xx///x/////xttttttsAAAAAP///+P/////xttttttttth//////x//////+Ntttttttth//////x///////xtttttttsP/////+P///////+NttttttsP/////x/////////xtttttth/////+P/////////+BttttsP////+B///////////+Nttth/////x/////////////wNtth////wP//////////////wAMP//wAP/////////////////wAAAP/////////////////////////////////////////////////////////////////////////////////w==")) +require("heatshrink").decompress(atob("Li6DASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSAAACSSSSSSSSSSSSSSSSSAMP/+AAOSSSSSSSSSSSSSSNtth////wCSSSSSSSSSSSSdttth/////xySSSSSSSSSSRttttsP////+ASSSSSSSSSTtttttth/////+CSSSSSSSSdtttttth//////wSSSSSSSTtttttttsP/////+CSSSSSSdtttttttsP//////wSSSSSSNttttsBtth//+B//xySSSSTttttth+Nth//x+P/+CSSSSdttttsOB9th/+OBx//wSSSSNttttsOB9tsP+OBx//xySSTtttttsP/9tsP+P/x//+CSSRtttttth+NtsP/x+P//+OSSRttttttsBttsP/+B///+OSSRtttttttttth///////+OSSdtttttttttth////////wSSNtttttttttsP////////xySNttttttttth/////////xySNttttttttth/////////xySNtttttttttsAP///////xySNttttttttttth///////xySNttttttttttth///////xySNttttttttttth///////xySRttttttttttth//////+PySRttttttttttth//////+OSSRtttttthtttsP//x///+OSSRttttttsNttsP/+P///+OSSeNtttttsNttsP/+P///x+SSSNttttthhttsP/xx///xySSTxttttttsAAAAAP///+PySSSRttttttttth//////x+SSSSSNtttttttth//////xySSSSSRtttttttsP/////+PySSSSSSNttttttsP/////x+SSSSSSSRtttttth/////+PySSSSSSSSBttttsP////+B+SSSSSSSSSeNttth/////x/ySSSSSSSSSSQNtth////wPySSSSSSSSSSSTwAMP//wAP+SSSSSSSSSSSSST/wAAAP/+SSSSSSSSSSSSSSSST///+SSSSSSSSQ")) From bd55b8d695a730cd47cc7943280a2f9037c86668 Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 2 Mar 2026 09:10:19 -0500 Subject: [PATCH 27/29] Update metadata.json --- apps/sunmoonclk/metadata.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/sunmoonclk/metadata.json b/apps/sunmoonclk/metadata.json index 368e8d2a13..cc68f67282 100644 --- a/apps/sunmoonclk/metadata.json +++ b/apps/sunmoonclk/metadata.json @@ -2,8 +2,9 @@ "id": "sunmoonclk", "name": "Sun and Moon Clock", "version": "0.01", + "author": "ehartwork", "description": "A basic clock with sun and moon images to represent day and night hours. Day is set from 6:00 AM to 5:59 PM and night is set from 6:00 PM to 5:59 AM.", - "icon": "sunmoonclk.png", + "icon": "app-icon.js", "screenshots": [{"url":"screenshot_sun.png"}, {"url":"screenshot_moon.png"}], "type": "clock", @@ -17,3 +18,4 @@ } + From 276189008218ba788af635f3068c55a5219edd80 Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 2 Mar 2026 09:39:54 -0500 Subject: [PATCH 28/29] Update metadata.json --- apps/sunmoonclk/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/sunmoonclk/metadata.json b/apps/sunmoonclk/metadata.json index cc68f67282..86bf405ece 100644 --- a/apps/sunmoonclk/metadata.json +++ b/apps/sunmoonclk/metadata.json @@ -4,7 +4,7 @@ "version": "0.01", "author": "ehartwork", "description": "A basic clock with sun and moon images to represent day and night hours. Day is set from 6:00 AM to 5:59 PM and night is set from 6:00 PM to 5:59 AM.", - "icon": "app-icon.js", + "icon": "sunmoonclk.png", "screenshots": [{"url":"screenshot_sun.png"}, {"url":"screenshot_moon.png"}], "type": "clock", @@ -19,3 +19,4 @@ } + From 6cb4c8a86017edf8cddfbbb7180b5bc84f364b0a Mon Sep 17 00:00:00 2001 From: eholstine Date: Mon, 2 Mar 2026 09:41:47 -0500 Subject: [PATCH 29/29] Update app-icon.js --- apps/sunmoonclk/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sunmoonclk/app-icon.js b/apps/sunmoonclk/app-icon.js index 32ffb77e3f..642553296f 100644 --- a/apps/sunmoonclk/app-icon.js +++ b/apps/sunmoonclk/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("Li6DASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSAAACSSSSSSSSSSSSSSSSSAMP/+AAOSSSSSSSSSSSSSSNtth////wCSSSSSSSSSSSSdttth/////xySSSSSSSSSSRttttsP////+ASSSSSSSSSTtttttth/////+CSSSSSSSSdtttttth//////wSSSSSSSTtttttttsP/////+CSSSSSSdtttttttsP//////wSSSSSSNttttsBtth//+B//xySSSSTttttth+Nth//x+P/+CSSSSdttttsOB9th/+OBx//wSSSSNttttsOB9tsP+OBx//xySSTtttttsP/9tsP+P/x//+CSSRtttttth+NtsP/x+P//+OSSRttttttsBttsP/+B///+OSSRtttttttttth///////+OSSdtttttttttth////////wSSNtttttttttsP////////xySNttttttttth/////////xySNttttttttth/////////xySNtttttttttsAP///////xySNttttttttttth///////xySNttttttttttth///////xySNttttttttttth///////xySRttttttttttth//////+PySRttttttttttth//////+OSSRtttttthtttsP//x///+OSSRttttttsNttsP/+P///+OSSeNtttttsNttsP/+P///x+SSSNttttthhttsP/xx///xySSTxttttttsAAAAAP///+PySSSRttttttttth//////x+SSSSSNtttttttth//////xySSSSSRtttttttsP/////+PySSSSSSNttttttsP/////x+SSSSSSSRtttttth/////+PySSSSSSSSBttttsP////+B+SSSSSSSSSeNttth/////x/ySSSSSSSSSSQNtth////wPySSSSSSSSSSSTwAMP//wAP+SSSSSSSSSSSSST/wAAAP/+SSSSSSSSSSSSSSSST///+SSSSSSSSQ")) +require("heatshrink").decompress(atob("MDCDASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSAAACSSSSSSSSSSSSSSSSSSAMP/+AAOSSSSSSSSSSSSSSSNtth////wCSSSSSSSSSSSSSdttth/////xySSSSSSSSSSSRttttsP////+ASSSSSSSSSSTtttttth/////+CSSSSSSSSSdtttttth//////wSSSSSSSSTtttttttsP/////+CSSSSSSSdtttttttsP//////wSSSSSSSNttttsBtth//+B//xySSSSSTttttth+Nth//x+P/+CSSSSSdttttsOB9th/+OBx//wSSSSSNttttsOB9tsP+OBx//xySSSTtttttsP/9tsP+P/x//+CSSSRtttttth+NtsP/x+P//+OSSSRttttttsBttsP/+B///+OSSSRtttttttttth///////+OSSSdtttttttttth////////wSSSNtttttttttsP////////xySSNttttttttth/////////xySSNttttttttth/////////xySSNtttttttttsAP///////xySSNttttttttttth///////xySSNttttttttttth///////xySSNttttttttttth///////xySSRttttttttttth//////+PySSRttttttttttth//////+OSSSRtttttthtttsP//x///+OSSSRttttttsNttsP/+P///+OSSSeNtttttsNttsP/+P///x+SSSSNttttthhttsP/xx///xySSSTxttttttsAAAAAP///+PySSSSRttttttttth//////x+SSSSSSNtttttttth//////xySSSSSSRtttttttsP/////+PySSSSSSSNttttttsP/////x+SSSSSSSSRtttttth/////+PySSSSSSSSSBttttsP////+B+SSSSSSSSSSeNttth/////x/ySSSSSSSSSSSQNtth////wPySSSSSSSSSSSSTwAMP//wAP+SSSSSSSSSSSSSST/wAAAP/+SSSSSSSSSSSSSSSSST///+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQ=="))