From 6ae4e76b10d0af86b11fda312e3cb22b2877ceb4 Mon Sep 17 00:00:00 2001 From: paul-arg Date: Sun, 24 Mar 2024 15:19:32 +0100 Subject: [PATCH] initial commit for Vaporwave Sunset Clock --- apps/vpw_clock/ChangeLog | 1 + apps/vpw_clock/README.md | 4 + apps/vpw_clock/app-icon.js | 1 + apps/vpw_clock/app.js | 138 ++++++++++++++++++++++++++++++++++ apps/vpw_clock/app.png | Bin 0 -> 1928 bytes apps/vpw_clock/metadata.json | 19 +++++ apps/vpw_clock/screenshot.png | Bin 0 -> 4030 bytes 7 files changed, 163 insertions(+) create mode 100644 apps/vpw_clock/ChangeLog create mode 100644 apps/vpw_clock/README.md create mode 100644 apps/vpw_clock/app-icon.js create mode 100644 apps/vpw_clock/app.js create mode 100644 apps/vpw_clock/app.png create mode 100644 apps/vpw_clock/metadata.json create mode 100644 apps/vpw_clock/screenshot.png diff --git a/apps/vpw_clock/ChangeLog b/apps/vpw_clock/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/vpw_clock/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/vpw_clock/README.md b/apps/vpw_clock/README.md new file mode 100644 index 000000000..83635d61f --- /dev/null +++ b/apps/vpw_clock/README.md @@ -0,0 +1,4 @@ +# Vaporwave Sunset Clock +This is a simple clock with a Vaporwave Sunset theme. + +![Screenshot](screenshot.png) diff --git a/apps/vpw_clock/app-icon.js b/apps/vpw_clock/app-icon.js new file mode 100644 index 000000000..f90e4e6c6 --- /dev/null +++ b/apps/vpw_clock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwcAtu27YC/AX4C/AX4C/AVnXroRO3oDBtwRMv9p02atPTCJf7AwgRK74gBEYWmpoRJ7wGF5oRJ8wjFzoRJ+nTps0AQYRI24jGzc2CJAgEAQQREBQc1EAYCDugWDEYe/EZm+/fvAR33799ARwj/EfruIARAj/AQ88+fPARwjRA")) diff --git a/apps/vpw_clock/app.js b/apps/vpw_clock/app.js new file mode 100644 index 000000000..a9234ea9e --- /dev/null +++ b/apps/vpw_clock/app.js @@ -0,0 +1,138 @@ +Graphics.prototype.setFontMadeSunflower = function () { + // Actual height 46 (45 - 0) + return this.setFontCustom( + E.toString(require('heatshrink').decompress(atob('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'))), + 46, + atob("DxMiFyAgIiAgICEgDw=="), + 60 | 65536 + ); +}; + +var sun_img = require("heatshrink").decompress(atob("2GwwZC/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AUjdt23btuAH/MNHwQCD7CA8AQlsIGsGHwwCD2BAzgI+IAQfAIOVp22bARZAxjaAKAQdsIOGatOmARuAIF02QBgCEIFsBQBwCDQlsNQB4CC7BBsQCACDIFcDQCACDsBBqjSDUtBBq6dtmwCTIFMGQCQCD0BBognTps0AScwINEmQa2mIE8BmmTpICVwBBnQCoCCIM8NknSpoCV6BBmhKDYzRBmfyACJIMyAXQdECpMkyQCXoBBlQbVgIMkSQbVIIMkaQbVoQf6DmyVpkwCZIMqDapJB/IP5BnghB/IL0gIP5B/IP5B/IP5B/IP5B/IP5B/IP5B4gBB/ILxAjIP5B/IP4AGiRBapBB/IP5BogRBaoBB/IP4CCIEgABIP5B/AAcJILGQIM0BILGAIP5BogBBYIE8AghBWkBB/INUAIKxApgESIKlIINUCIKlAINUAIKhArgEJIKWQINkBIKWAINkAIKRAtAAJBQIF8AiRBOpBBwgBBOIGMAhJBMyBBygEEIJUgIGYABiRBIpBA1ZBLC0QxSA4AH4A/AH4A/AGA")); + +const COLOUR_BLACK = 0x0; +const COLOUR_WHITE = 0xffff; +const COLOUR_DARK_GREY = "#3F3F3F"; +const COLOUR_GREY = "#7F7F7F"; +const COLOUR_LIGHT_GREY = "#BFBFBF"; +const COLOUR_RED = "#FF0000"; +const COLOUR_BLUE = "#0000FF"; +const COLOUR_YELLOW = "#FFFF00"; +const COLOUR_LIGHT_CYAN = "#7FFFFF"; +const COLOUR_DARK_YELLOW = "#7F7F00"; +const COLOUR_DARK_CYAN = "#007F7F"; +const COLOUR_ORANGE = "#FF7F00"; +const COLOUR_VPW_GREEN = 0xf0f; +const COLOUR_MAGENTA = "#ff00ff"; + + +function drawPolygonWithGrid(x1, y1, x2, y2, x3, y3, x4, y4, M, N) { + // Draw the polygon + g.drawLine(x1, y1, x2, y2); + g.drawLine(x2, y2, x3, y3); + g.drawLine(x3, y3, x4, y4); + g.drawLine(x4, y4, x1, y1); + + for (let i = 1; i < N; i++) { + let xi1 = x1 + i * ((x2 - x1) / N); + let yi1 = y1 + i * ((y2 - y1) / N); + + let xi2 = x4 - i * ((x4 - x3) / N); + let yi2 = y4 - i * ((y4 - y3) / N); + + g.drawLine(xi1, yi1, xi2, yi2); + } + + for (let j = 1; j < M; j++) { + let xi1 = x1 + j * ((x4 - x1) / M); + let yi1 = y1 + j * ((y4 - y1) / M); + + let xi2 = x2 - j * ((x2 - x3) / M); + let yi2 = y2 - j * ((y2 - y3) / M); + + g.drawLine(xi1, yi1, xi2, yi2); + } +} + +var SCREEN_WIDTH = 176; +var SCREEN_HEIGHT = 176; +var GROUND_HEIGHT = 176 - 45; + +var GRID_BASE_OFFSET = 100; + +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function () { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +function draw() { + var x = g.getWidth() / 2; + var y = 24 + 20; + + g.reset().clearRect(0, 24, g.getWidth(), g.getHeight()); + + //sky + g.setColor(COLOUR_VPW_GREEN); + g.fillRect(0, 24, SCREEN_WIDTH, GROUND_HEIGHT - 1); + + g.drawImage(sun_img, 0, 0); + + //ground + g.setColor("#8000FF"); + g.fillRect(0, GROUND_HEIGHT, 176, SCREEN_HEIGHT); + + //lines + g.setColor(COLOUR_WHITE); + drawPolygonWithGrid(0, GROUND_HEIGHT, + SCREEN_WIDTH, GROUND_HEIGHT, + SCREEN_WIDTH + GRID_BASE_OFFSET, SCREEN_HEIGHT - 1, + 0 - GRID_BASE_OFFSET, SCREEN_HEIGHT - 1, + 7, //vertical + 15); //horizontal + + // work out locale-friendly date/time + var date = new Date(); + var timeStr = require("locale").time(date, 1); + var dateStr = require("locale").date(date).toUpperCase(); + var dowStr = require("locale").dow(date).toUpperCase(); + // draw time + g.setFontAlign(0, 0).setFontMadeSunflower(); + g.drawString(timeStr, x, y + 20); + // draw date + y += 35; + g.setFontAlign(0, 0, 1).setFont("6x8"); + g.drawString(dateStr, g.getWidth() - 8, g.getHeight() / 2); + // draw the day of the week + g.setFontAlign(0, 0, 3).setFont("6x8"); + g.drawString(dowStr, 8, g.getHeight() / 2); + // queue draw in one minute + queueDraw(); + // queue draw in one minute + queueDraw(); +} + +// Clear the screen once, at startup +g.setTheme({ bg: COLOUR_VPW_GREEN, fg: "#fff", dark: true }).clear(); +// draw immediately at first, queue update +draw(); +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower', on => { + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/vpw_clock/app.png b/apps/vpw_clock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..73c69d5a1c5283d0942ce827e7816e0c6eded7c0 GIT binary patch literal 1928 zcmV;32Y2|1P)sppOMZhk%!AJOHy<~Y&l8%kA z{DL*Wc(aYDHCGx5g8`aSh#_l`xp9uF5h{kG0%L_B(0wx(-?2#3)IiI$oa^>#0WK>B z*jcUYKA`tkUT+KlTIJDr2`HR$S(x{_ym8jR++12C8v|IG1t%sYa2p^fCD?jjnx2D3 ze{8hvkP8v8Nn%$7OWj=p3D$%*b!;@a+i1ui)x;D5p^WpLR}6sc|DFPhp_6C|dEK7G zB|}^{Ex0IhmJ&(l+&f1^UEQ2O!Z=W9!d8`Kb1E;0Lx{uf4H6h91S^usI`g-11hV%) z5PJZ%OACcM8*YymmVch%gs4#jII2u*WmZ>sV`rXjp6&sc0yeBOpckRP3>l=vN6GbV{d+<>+>3qWYosWAig7F&a zi^=BBZ+K_>6CB>Xfc4cLM5rK#;WrOGiIb0Q;^gB;5x+A>?{RH@*c8@})q1!F8L)fn z(o5puD;Kc!-6X@BVaqx z@gG0KdtZK3c?VC|q_%a@^!I^w>x&P7TRl!Z{T$eVTI1DZf=4<;;AHU~oORx(d>!1q zg!5Z(f+JNGqSO(RQ49uT)W3J%gJ)iU3)>GLK*hn8r>-)&3U%yMqlf#FyE2XExxqb& zv`>+!pReA37kX_Nme0UD-1VB2xoNzoZf$LJ*k4{`%6FkJf{Xy;m!l&{RykWWUZ8WF%cOlUjBX?$By;Bg5Y<4``)1SGz!=s zlo&7vZT;#V?!R(<0wF>G2@EtR7qvdg-iImftZ;pA4+k$^!k_yeXnhR&2#=|n04;aoqLC}-B(swZzOkm{`-ZS>TUC_t1t|x zMXIT#CTqTcqk+6d@}>-TAETx@yTfu( zl61v8;LJPBsTk=dEz~tYrISvd(gyrnUfp}`uRj(GYs=5w&3=`rDQDT<+l7Wqu;#=? z3^MTl$i1DOtYnD5%2N3uMDp&iVH6)FLruHx zDF{x^+=U`gtVAh2LYktzrbwC3a|}S1WvaVlVLcnL8Y3WfBa7~${FfE~nxFW4E_x@^ z?H_dv_}`xG6^A|ZbgLl(qV|PO9O=?p^z3o?jIz9~Y+c~dP@Yg5HIOW{W)BELAHTUp zFqYbnm9g|D=&#g9Nl|Wr@r_cp*u+$kmt+?q~_OugA(+TDsld-b? zyq)AHDBP9cg^>BC9^&+9#4HhzKW+adT|!?cxz8RgoxS=TnD zaub=)Leyl-(Ka&Q9FeJI>QZj!BX>cO_Jr(i%o`&i&zqg0sa9Al!^D64&c9&lSYfIF O0000(X-3| literal 0 HcmV?d00001 diff --git a/apps/vpw_clock/metadata.json b/apps/vpw_clock/metadata.json new file mode 100644 index 000000000..6042bdc81 --- /dev/null +++ b/apps/vpw_clock/metadata.json @@ -0,0 +1,19 @@ +{ + "id": "vpw_clock", + "name": "Vaporwave Sunset Clock", + "shortName": "Vaporwave Sunset", + "type": "clock", + "version":"0.01", + "description": "A clock with a vaporwave sunset theme.", + "tags": "clock", + "src": "vpw_clock.app.js", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"vpw_clock.app.js","url":"app.js"}, + {"name":"vpw_clock.img","url":"app-icon.js","evaluate":true} + ], + "icon": "app.png", + "readme": "README.md", + "screenshots": [{ "url": "screenshot.png" }], + "allow_emulator":true +} diff --git a/apps/vpw_clock/screenshot.png b/apps/vpw_clock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b2f1926e590e3fa051c0a4486d5485bcb1229e GIT binary patch literal 4030 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 literal 0 HcmV?d00001