From be556e859e9e73c649ee19c05a60b42281a6ef89 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 7 Oct 2021 11:09:41 +0100 Subject: [PATCH] add floral clock --- apps.json | 15 +++++++- apps/alarm/ChangeLog | 2 +- apps/floralclk/ChangeLog | 1 + apps/floralclk/app-icon.js | 1 + apps/floralclk/app.js | 76 +++++++++++++++++++++++++++++++++++++ apps/floralclk/app.png | Bin 0 -> 4978 bytes 6 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 apps/floralclk/ChangeLog create mode 100644 apps/floralclk/app-icon.js create mode 100644 apps/floralclk/app.js create mode 100644 apps/floralclk/app.png diff --git a/apps.json b/apps.json index 532a0c898..c576eada6 100644 --- a/apps.json +++ b/apps.json @@ -3533,7 +3533,7 @@ "name": "Wave Clock", "icon": "app.png", "version":"0.02", - "description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: This requires a bugfix for #2049 on Bangle.js 1**", + "description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: This requires firmware 2v11 or later Bangle.js 1**", "tags":"clock,b2", "type":"clock", "allow_emulator":true, @@ -3541,5 +3541,18 @@ {"name":"waveclk.app.js","url":"app.js"}, {"name":"waveclk.img","url":"app-icon.js","evaluate":true} ] +}, +{ "id": "floralclk", + "name": "Floral Clock", + "icon": "app.png", + "version":"0.01", + "description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: This requires firmware 2v11 or later Bangle.js 1**", + "tags":"clock,b2", + "type":"clock", + "allow_emulator":true, + "storage": [ + {"name":"floralclk.app.js","url":"app.js"}, + {"name":"floralclk.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index a151fd07e..fce54f273 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -11,4 +11,4 @@ 0.11: Respect Quiet Mode 0.12: Fix widget for bangle 2, now uses theme Widgets now shown on Alarm screen - Alarm widget state now updates when setting/resetting an alarm +0.13: Alarm widget state now updates when setting/resetting an alarm diff --git a/apps/floralclk/ChangeLog b/apps/floralclk/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/floralclk/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/floralclk/app-icon.js b/apps/floralclk/app-icon.js new file mode 100644 index 000000000..4dfc57191 --- /dev/null +++ b/apps/floralclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwhE+sVin0/tVjsdim84sdro1GAQNrAAlHAYVqABk/FINosc/AoNpF4cTGoMTnIhBo1qEgIvFABJACoAvEFwJaDGoNjnFpn5eCik/DYQwBAAQwOFIMUDYKBBLwQwBnwoBBAM3GIIEBhs5E4RLBPYqMKFwU4AAM+nwCBF4SJCAwMxXII2BnBeDJogAGNQIAFBIJMBRIYvCLQK+Bow7BhsNCINjm45BXwZgHF5ITBigoBF4NpQoIwBLwLJBn8Oh0NBoU4F4J6CF4RiKR47iCtIrBiaGBEgdknMOnBABiYKBtNkKoaUIdo5hCQoKvBYgKGBGAIJBMANjhqfBHgLQBNgKcBEpAxBBA9HHoiwBF4S3BcoM4Nwdim83sVEGAINBMQIfBEASYGLII4ECISFBnEyFgKHBGwRsDHYKfBaQOGrifCXw4qBNgIEBXoQHBCQZXBnArCAQNpnBWBFwUTBINiwGkwFcsbzDEwJcFG4pcCAAMUik/EIKJBn6JBMYNpnzABsY0BwGeAAN6wLnCEQQACF4ztCF4UUJ4QNDGAKTCtMTnASBHwOezAwCveIP4ReEeQzNDFwgvDDQU/oDlDJYVkF4e8z2Hx2Px2IAAKKEGo1qnAuBtLYBBwRJCAoIuCbgVqxAsCAQWB1mBwN6AANWmSwBJwRcCDIIuDnxAGAYU5HQmPF4W84QBBvWlGoOY4TIBmMxnJGCYYc5ik+coNjn8UhsUiqRDGQQUBQQJUBz3CzAxBYYYADvWGsTZBDoNHcQUTXgU+n1pB4LmBFQSUCAoNkw4uCF4QBBF4QFBAAIFBF4IjBoBMCn84nwtCMAIABm8TnLREXYd7KQSLBzoBDAQJlBBQN5w1osU/VAQuBnCLBGQNpGYM4R4LRCAATTBRgJcCy4kBz3I5HO5HHy4JBYwRfBcYIfBoE4m5YCho0BA4M4FwzzCxCMBEIO73guB5wAC5BgBSoWAF4KQBsdkKoKNChoACik4nIuHF4i0BdQOdF4XNAQK8Cz2lqzjCnCIBFwTnBS4IrBTQQuBdoLuCBAWOdoOYWgRfC5ovDy4vDriDCAAS8CFQYADdQgvCowvDSAK0CF4SPC4QwCvVcmUymMxFwSUBFwQoDFQToBAoIsBBoSQBMASRBy6QDXwIJCSIWAFwjzDWowAKGYOHwIhBYIOezooC3YuBF4d6GAK/BYAVkF6CUExBiBYQQCBFQIvCzAvCAYM3LoUTLwIeDF5pBDSQRgCLQYDBZQZrBz1cw9iiZeCWoQvWeYQuBfIIxCLwd6w1inEULyQvFtYvFEwOB0uBz4zCX4QuBnDsCDortNCQNHL4mYFwN7ZAOIfgN6AANcsc+m6NBDoRgQFwNGo5FBx2HKoZeBHYNqsg7BqtVsS8BRoReCL6AgBSYQ1CwJWBveHZYlkmMxLwM4h05sgADPwRRCF5ouDMIKKCxwPDsk4mM4XgMTXwLvBikOYYQvOBoQOBoE/JA4DBn8UFwNim8NF4QABhsNnIvQUgVAnMOVoQ4CAANqscUidiRoMNm4zBAAQHBF6CLDO4JIBGAVHXgYiBn1jn0NGYVoAAIvBIwYvOBgM/hyxBAAQXBHYU5RANjscTLwNjLgIuBny+FF5xeBhtcPYU+DYJeDRog0CCIYSBoAvRGAMUmOHJgcbF4QuBFIUNmIBBeYItCIIRNBd54ABisUVgNED4QJBn69Dm4uBh0OnIsBoArCFBoPDHgNqoAvBL4YvCb4JeBnxiCslkDogvRNQVGGALrBVobwBfAMNXoMTigsHDINHAAIvJGIdGn9ro4FBscNMANpF4LoBm4DChq1BFAJDBDobmMMIgvDA4UULwKHBMoLlBG4MynBeBCYQfFF56MBoAbDMAKzBnETm7oBGoM4hxeCQoJfCcJC/KAgIvFMAMNAASNBsQ1BLwVqFwIeELppCBF4dq")) diff --git a/apps/floralclk/app.js b/apps/floralclk/app.js new file mode 100644 index 000000000..5fb9303a8 --- /dev/null +++ b/apps/floralclk/app.js @@ -0,0 +1,76 @@ +function getImg() { + return require("heatshrink").decompress(atob("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")); +} +var IMAGEWIDTH = 176; +var IMAGEHEIGHT = 109; + + +Graphics.prototype.setFontDancingScript = function() { + // Actual height 44 (44 - 1) + var widths = atob("DBIhFB4bGRoeFhweDQ=="); + var font = atob("AAAAAAAAAAAAAAMAAAAAAAHgAAAAAAD4AAAAAAA+AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAAAAD8AAAAAAD+AAAAAAD/AAAAAAD/gAAAAAH/gAAAAAH/wAAAAAH/gAAAAAP/gAAAAAP/gAAAAAf/AAAAAAf/AAAAAA/+AAAAAA/+AAAAAB/+AAAAAB/8AAAAAB/8AAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAf//4AAAAf///AAAAf///4AAAf////AAAf/8Af4AAP/gAA/AAP/AAADwAH+AAAAcAD+AAAAHAA+AAAABwAfAAAAAcAPAAAAAHADgAAAABwB4AAAAA8AcAAAAAOAHAAAAAHgBgAAAAHwAYAAAAD4AGAAAAD+ABwAAAD/AAcAAAD/gAHgAAH/wAA+AAP/wAAH+H//4AAB////4AAAP///4AAAA///4AAAAD//gAAAAAD8AAAAAAAAAAAGAAAAAAABwAAAAAAAcAAAAAAAHAAAAAAABwAAAAAAAcAAGAAAAPAADwAAA/wAA4AAB/8AAeAAP//AAPAD//7wAHwf//w8AB////gPAA///+ABwAf//4AAcAP/+AAADAH/wAAAAQB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAB8AAAAAAAfAAAAAAAGwAAAAAABsAAAAAAAfAAAAAAAHwAAP4AAB4AAP/AAAeAAH/wAAHAAD/+AAD4AB+AgAB+AA8AAAA/gAOAAAAf8AHAAAAPvABwAAAPzwAYAAAH4eAGAAAH8HgBgAAD+B8AcAAD/AfAHAAH/AHwB4AH/gB8AP4//gAfAD///wAHwAf//wAB8AB//gAAeAAP/gAAHAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAP+AAAAAAH/wAAAAAB/+AAAAAAcfgAAAAAEB8AB/AAAAPAA/4AAABwAf+AAAAcAP/gAAAHADwQAAABwAwABAAAcAcAAYAAHAHAAOAADwBgAHwAB4AYAD+AB+AHAB/4B/ABwB+///wAeB/P//4AH//h//8AA//4P/+AAH/4B/+AAA/8AH/AAAH8AAEAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAA4AAAAAAAeAAAAAAAPAAAAAAAHwAAAAAAD8AAAAAAB/AAAAAAA/wAAAAAAe8AAAAAAPPAAAAAAHjwAAAAADw8AAAAAB4PAAwAAA8DwP+AAAeA///wAAPAP//8AAHh////AAH3////wAD////AAAB///wAAAA//88AAAAf/gPAAAAf8ADgAAAHgAA4AAAAAAAMAAAAAAAAAfwAAAAAAP+AAAAAAH/wAAAAAB/+AAAAAA8PgAAAAwEA8AAAH8AAHAAAP/AABwAA//gAAcAD/4YAAHAH/gGAABwB/ABgAAcAfgAYAAPAD4AHAADwA+ABwAB4APgAeAB+AD4AH4B/AA+AA///wAPgAP//4AD4AB//8AB+AAP/+AAfgAB//AAHwAAH/AAB8AAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAf/4AAAAA///gAAAB///+AAAB////wAAB////+AAA//+B/gAA//8AD8AAf+OAAPAAP8HAABwAH8BgAAcAD8A4AAHAB+AOAABwAeADgAAcAPAA4AAHADgAOAADwBwADgAA8AcAA8AA+AGAAPgAfgBgAD+A/wAYAAf//4AGAAH//8ABwAA//+AAfgAH//AAD4AAf/AAAcAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAHAA/AAAABwB/wAwAA8B/8AeAAPB//AHwADx//gB8AA9//wAfAAP/4IAHwAD/wAAB8AB/wAAAPAB/gAAADwB/wAAAA8A/8AAAAPA/PAAAADw/DwAAAA8/A8AAAAP/AOAAAAD/ADgAAAB/gAwAAAAAAAAAAAAAAAAABAAAAAAAH/AAAAAAD/4AAAAAB//AAAAAA//4AAOAAfA+AAf8APgHwAP/wHgA8AH/+DwAHAD//48ABwA///eAAcAeAf/AAHAHAB/gABwBwAP4AA8AYAB/AAPAGAAf4AHgBgAP/AD4AcAHv8B8AHgD5///AA8H8H//gAP/+A//wAB/+AH/4AAP/AAf8AAA/AAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAP/gAAeAAP/+AAPgAH//wAD8AD//+AAPAB///gAAwAfwD8AAMAPwAfAADADwADwAAwB4AAeAAcAcAAHgAHAHAAA4ADgBwAAOAB4AcAADAB8AHAAAwA/ABwAAcA/gAeAAGB/wAHwADh/4AA+AB//8AAP+D//8AAB////+AAAP///+AAAB///+AAAAP//8AAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA4AAAAAAAeAAAAADAHgAAAAB4BwAAAAAeAIAAAAAHgAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + var scale = 1; // size multiplier for this font + g.setFontCustom(font, 46, widths, 50+(scale<<8)+(1<<16)); +} + +// 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 = 50; + g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); + if (g.getWidth() == IMAGEWIDTH) + g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); + else { + let scale = g.getWidth()/IMAGEWIDTH; + y *= scale; + g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT*scale,{scale:scale}); + } + + var date = new Date(); + var dateStr = require("locale").date(date); + // draw time + g.setFont("DancingScript").setFontAlign(0,0).setColor("#f00"); + g.drawString(date.getHours(), x,y); + y += 43; + g.drawString(date.getMinutes().toString().padStart(2,0), x,y); + // draw date + y += 22; + g.setFontAlign(0,0).setFont("6x8"); + var p = g.getWidth()-60; + g.clearRect(p,y-4,g.getWidth()-p,y+3); // clear the background + g.drawString(dateStr,x,y); + // queue draw in one minute + queueDraw(); +} + +// 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; + } +}); +// set background colour +g.setTheme({bg:"#0ff"}); +// Clear the screen once, at startup +g.clear(); +// draw immediately at first, queue update +draw(); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/floralclk/app.png b/apps/floralclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..a0284226eccdda08db3135319404d62daf4d973c GIT binary patch literal 4978 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 literal 0 HcmV?d00001