diff --git a/apps/geminiclock/README.md b/apps/geminiclock/README.md new file mode 100644 index 000000000..d05acca04 --- /dev/null +++ b/apps/geminiclock/README.md @@ -0,0 +1,20 @@ +# Gemini clock + +A simple clock face using the Buro Destruct Geminis font, inspired by their Pebble Watch designs: https://burodestruct.net/work/pebble-watchfaces + +![image](watch-in-use.jpg) + +It is designed for maximum legibility and utility whilst still showing widgets. + +If editing or remixing this code, please retain leading zeroes on the hours, they are an integral part of the design. + +The minutes are not right-aligned deliberately so that the numbers don't jump around too much when they change. + + +## Creator +Created by Giles Booth: +- http://www.suppertime.co.uk/blogmywiki/ +- https://mastodon.social/@blogmywiki +- https://github.com/blogmywiki + + diff --git a/apps/geminiclock/app-icon.js b/apps/geminiclock/app-icon.js new file mode 100644 index 000000000..84c9338c2 --- /dev/null +++ b/apps/geminiclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AJhMIIQvwBBEQAOCgYCCBwAHI5mABpBAIkCBZCFxJ//wANMYBEwQL84gFzPjAI+CRguIPBguHAguWeBpeFwjuJIwuOABS2CFwQAJAiwCF1ICF/wv+F73eSFzIlMwAI/QQuTIAOGKAQAMFwoCOAokCQflEQuEHgQANMSiDIgAEDw5kSQguKSQgWCewRGSFxRyCAAQUDHwuR8guMHwgAFAwuggRDsCXw5GFyvmFxQAIjwguovwgv+F/1+OF6ZlEYjEAun85nM5kGAYDEpEAAZG7ygAJMYBEwWQFwpeCx/iFwQUOFw4mQgQAKLwguQCwSoCUwgAIXwYEIh5mnygAGlQQAMFjQB+AKw=")) \ No newline at end of file diff --git a/apps/geminiclock/app.png b/apps/geminiclock/app.png new file mode 100644 index 000000000..2c96e8937 Binary files /dev/null and b/apps/geminiclock/app.png differ diff --git a/apps/geminiclock/gemini-watch-app.js b/apps/geminiclock/gemini-watch-app.js new file mode 100644 index 000000000..716bc37b5 --- /dev/null +++ b/apps/geminiclock/gemini-watch-app.js @@ -0,0 +1,73 @@ +// Clock by Giles Booth for BangleJS2 using Büro Destruct Console Remix font +// based on code in https://www.espruino.com/Bangle.js+Clock+Font + +Graphics.prototype.setFontBDGemini = function() { + // Actual height 79 (84 - 6) + var widths = atob("Gio1KS8zNS8vLzkvGg=="); + var font = atob("AAAAAAAAD///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAH///gAAAAAAAAAAAD///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+AAAAAAAAAAAAAAf/AAAAAAAAAAAAAD//AAAAAAAAAAAAAP//AAAAAAAAAAAAA///AAAAAAAAAAAAH///AAAAAAAAAAAAf//+AAAAAAAAAAAD///8AAAAAAAAAAAP///wAAAAAAAAAAB///+AAAAAAAAAAAH///4AAAAAAAAAAA////gAAAAAAAAAAD///8AAAAAAAAAAAP///wAAAAAAAAAAB///+AAAAAAAAAAAH///4AAAAAAAAAAA////AAAAAAAAAAAD///8AAAAAAAAAAAf///gAAAAAAAAAAB///+AAAAAAAAAAAP///wAAAAAAAAAAA////AAAAAAAAAAAH///8AAAAAAAAAAAf///gAAAAAAAAAAB///+AAAAAAAAAAAP///wAAAAAAAAAAA////AAAAAAAAAAAH///4AAAAAAAAAAAP///gAAAAAAAAAAAf//8AAAAAAAAAAAAf//wAAAAAAAAAAAAf/+AAAAAAAAAAAAAf/4AAAAAAAAAAAAAf/gAAAAAAAAAAAAAP8AAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////4AAAf///////////8AAAf///////////8AAA////////////+AAA////////////+AAA////////////+AAA////////////+AAA////////////+AAA//gAAAAB////+AAA/+AAAAAD////+AAA/8AAAAAP////+AAA/4AAAAA/////+AAA/4AAAAD/////+AAA/4AAAAH/////+AAA/4AAAAf/////+AAA/4AAAB//+f//+AAA/4AAAD//8f//+AAA/4AAAP//wf//+AAA/4AAA///Af//+AAA/4AAB//+Af//+AAA/4AAH//4Af//+AAA/4AAf//gAf//+AAA/4AB///AAf//+AAA/4AD//8AAf//+AAA/4AP//wAAf//+AAA/4A///gAAf//+AAA/4B//+AAAf//+AAA/4H//4AAAf//+AAA/4f//wAAAf//+AAA/4///AAAAf//+AAA/7//8AAAAf//+AAA////wAAAAf//+AAA////gAAAAf//+AAA///+AAAAAf//+AAA///4AAAAA///+AAA///wAAAAA///+AAA///AAAAAB///+AAA//+AAAAAP///+AAA////////////+AAA////////////+AAA////////////+AAA////////////+AAA////////////+AAAf///////////8AAAP///////////8AAAH///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAB//8AAAf4AAAAAAAD//+AAAf4AAAAAAAH//+AAAf4AAAAAAAP///AAAf8AAAAAAAP///AAAf8AAAAAAAP///AAAf8AAAAAAAP///AAAf8AAAAAAAP///AAAf8AAAAAAAP///AAAf8AAAAAAAf///AAAf+AAAAAAAf///AAAf/AAAAAAA////AAAf/4AAAAAP////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAP////////////AAAP////////////AAAD////////////AAAAAAAAAAAH////AAAAAAAAAAAA////AAAAAAAAAAAAf///AAAAAAAAAAAAP///AAAAAAAAAAAAP///AAAAAAAAAAAAP///AAAAAAAAAAAAP///AAAAAAAAAAAAP///AAAAAAAAAAAAP///AAAAAAAAAAAAP///AAAAAAAAAAAAH//+AAAAAAAAAAAAD//+AAAAAAAAAAAAB//4AAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAAAD//////4AAA/wAAAH//////8AAA/wAAAH//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP/4AAB/+AAA/4AAAP/gAAAf+AAA/4AAAP/AAAAf+AAA/4AAAP+AAAAP+AAA/4AAAP+AAAAP+AAA/4AAAP+AAAAP+AAA/4AAAP+AAAAP+AAA/4AAAP+AAAAP+AAA/8AAAf+AAAAP+AAA/+AAA/+AAAAP+AAA//////+AAAAP+AAA//////+AAAAP+AAA//////+AAAAP+AAA//////+AAAAP+AAA//////+AAAAP+AAA//////+AAAAH+AAAf/////8AAAAH+AAAP/////4AAAAH+AAAH/////wAAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAPwAAAB+AAAf4AAAAP4AAAD/AAAf4AAAAf8AAAD/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAAf8AAAH/AAAf8AAAA/+AAAH/AAAf+AAAB/+AAAP/AAAf/gAAD//gAAf/AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAP////////////AAAH////////////AAAD////////////AAAAAAAAH///////AAAAAAAAD///////AAAAAAAAB///////AAAAAAAAA///////AAAAAAAAA///////AAAAAAAAAf//////AAAAAAAAAf//////AAAAAAAAAf//////AAAAAAAAAP/////+AAAAAAAAAH/////+AAAAAAAAAD/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAf8AAAAAAAAAAAAAB/+AAAAAAAAAAAAAD/+AAAAAAAAAAAAAP//AAAAAAAAAAAAAf//AAAAAAAAAAAAB///AAAAAAAAAAAAD///AAAAAAAAAAAAP///AAAAAAAAAAAAf///AAAAAAAAAAAB////AAAAAAAAAAAD////AAAAAAAAAAAP////AAAAAAAAAAA//+P/AAAAAAAAAAB//4H/AAAAAAAAAAH//wH/AAAAAAAAAAP//AH/AAAAAAAAAA//+AH/AAAAAAAAAB//4AH/AAAAAAAAAH//wAH/AAAAAAAAAP//AAH/AAAAAAAAAP/+AAH/AAA//4AAAf/4AAH/AAB//8AAAf/wAAH/AAD//+AAAf/AAAH/AAH///AAAf+AAAH/AAH///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAP/AAf///AAAf8AAAP/AAf///AAAf+AAAf/gB////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAP////////////AAAH////////////AAAD////////////AAAAAAAAAAAD////AAAAAAAAAAAA////AAAAAAAAAAAAP///AAAAAAAAAAAAP//+AAAAAAAAAAAAD//8AAAAAAAAAAAAB//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////wAAAAD8AAAf/////4AAAAH+AAAf/////8AAAAH+AAA//////8AAAAH+AAA//////+AAAAP+AAA//////+AAAAP+AAA//////+AAAAP+AAA//////+AAAAP+AAA//wAH/+AAAAP+AAA/+AAA/+AAAAP+AAA/8AAAf+AAAAP+AAA/4AAAP+AAAAP+AAA/4AAAP+AAAAP+AAA/4AAAP+AAAAP+AAA/4AAAP+AAAAP+AAA/4AAAP+AAAAP+AAA/4AAAP/AAAAf+AAA/4AAAP/gAAAf+AAA/4AAAP/wAAB/+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/4AAAP//////+AAA/wAAAH//////+AAA/wAAAH//////8AAAfwAAAD//////4AAAPAAAAA//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///////////8AAAP///////////+AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf/AAA//4B////AAAf+AAAP/gAf///AAAf8AAAP/gAf///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/gAf///AAAf8AAAH/gAf///AAAf8AAAH/4B////AAAf8AAAH///////AAAf8AAAH///////AAAf8AAAH///////AAAf8AAAH///////AAAf8AAAH///////AAAf8AAAD///////AAAf4AAAD///////AAAf4AAAB///////AAAPwAAAA//////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAAAf//AAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAAAAAAAAAA///gAAAH////4AAA///gAAAP////8AAA///gAAAf////+AAA///gAAA/////+AAA///gAAB/////+AAA///gAAD/////+AAA///gAAH/////+AAA///gAAP/////8AAA///gAAf/////4AAA///gAA//gAAAAAAA///gAB//AAAAAAAA///wAD/+AAAAAAAA///wAH/8AAAAAAAA///wAf/wAAAAAAAA///4A//gAAAAAAAA///8B//AAAAAAAAA//////+AAAAAAAAA//////8AAAAAAAAA//////4AAAAAAAAA//////wAAAAAAAAA//////gAAAAAAAAA//////AAAAAAAAAAf////+AAAAAAAAAAP////8AAAAAAAAAAH////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////8AAAAAAAAAf/////+AAAAAAAAA///////AAAAAAAAB///////AAAAAAAAD///////AAAAAAAAH///////AAAAAAAAP///////AAAAAAAA////////AAAAAAAD//4B////AAAD//////wA////AAAP//////gAf///AAAP//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf/AAAf/AAP///AAAf+AAAP/AAP///AAAf8AAAP/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf+AAAP/AAP///AAAf/AAAf/AAP///AAAf/4AD//AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAP//////AAP///AAAP//////gAf///AAAD//////wA////AAAAf/////4B////AAAAAAAA////////AAAAAAAAP///////AAAAAAAAH///////AAAAAAAAD///////AAAAAAAAB///////AAAAAAAAA///////AAAAAAAAAf/////+AAAAAAAAAP/////8AAAAAAAAAH/////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////8AAH//+AAAf/////+AAP///AAAf/////+AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf//////AAP///AAAf/AAA//AAP///AAAf+AAAP/AAP///AAAf8AAAP/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAH/AAP///AAAf8AAAP/gAf///AAAf+AAAP/gAf///AAAf/AAAf/wA////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAf////////////AAAP///////////+AAAH///////////+AAAD///////////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAD///gAAAAAH///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAP///gAH///gAAAAAH///AAH///gAAAAAH///AAD///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + var scale = 1; // size multiplier for this font + g.setFontCustom(font, 46, widths, 96+(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() { + g.reset(); + // work out locale-friendly date/time + var date = new Date(); + var timeStr = require("locale").time(date,1); + var hh = timeStr.substr(0,2); + // Kludge to add leading zeros to hours - if recoding please implement leading zeros: + // Leading zeroes are an integral part of the design. + // If the hour is single digit the first character of the string will be + // space, in which case a zero is added. As there is no space in the font, + // spaces are ignored. + if (hh.substr(0,1) == ' ') { + hh = '0' + hh; + } + var mm = timeStr.substr(-3); + var dayName = require("locale").dow(new Date(), 1); + var longDateStr = date.getDate() + ' ' + require("locale").month(new Date(), 1); + // draw time + g.setFont("BDGemini"); + g.clearRect(0,24,175,175); // clear the background + g.drawString(hh,0,24); + g.drawString(mm,49,98); + // draw date + g.setFont("6x8",2); + g.drawString(dayName,106,35); + g.drawString(longDateStr,106,51); + g.drawString(date.getFullYear(),106,67); + // queue draw in one minte + queueDraw(); +} + +// Clear the screen once, at startup +g.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(); \ No newline at end of file diff --git a/apps/geminiclock/metadata.json b/apps/geminiclock/metadata.json new file mode 100644 index 000000000..88129dde6 --- /dev/null +++ b/apps/geminiclock/metadata.json @@ -0,0 +1,17 @@ +{ "id": "geminiclock", + "name": "Gemini clock", + "shortName":"Gemini Clock", + "icon": "app.png", + "version":"0.01", + "description": "Watch face using retro Gemini font", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"geminiclock.app.js","url":"gemini-clock-app.js"}, + {"name":"geminiclock.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/geminiclock/screenshot.png b/apps/geminiclock/screenshot.png new file mode 100644 index 000000000..77e37c1b2 Binary files /dev/null and b/apps/geminiclock/screenshot.png differ diff --git a/apps/geminiclock/watch-in-use.jpg b/apps/geminiclock/watch-in-use.jpg new file mode 100644 index 000000000..825a2b120 Binary files /dev/null and b/apps/geminiclock/watch-in-use.jpg differ