From 964fa27bfb9a5b1ef72a612d9b90e0891b21b9b0 Mon Sep 17 00:00:00 2001 From: The Dod Date: Tue, 21 Dec 2021 01:01:10 +0200 Subject: [PATCH] Add Four Twenty Clock app --- apps.json | 18 ++ apps/ftclock/ChangeLog | 1 + apps/ftclock/app-icon.js | 1 + apps/ftclock/app.js | 52 ++++ apps/ftclock/app.png | Bin 0 -> 6742 bytes apps/ftclock/fourTwenty.js | 45 +++ apps/ftclock/fourTwentyTz.js | 536 +++++++++++++++++++++++++++++++++ apps/ftclock/mkFourTwentyTz.py | 46 +++ apps/ftclock/screenshot.png | Bin 0 -> 17635 bytes 9 files changed, 699 insertions(+) create mode 100644 apps/ftclock/ChangeLog create mode 100644 apps/ftclock/app-icon.js create mode 100644 apps/ftclock/app.js create mode 100644 apps/ftclock/app.png create mode 100644 apps/ftclock/fourTwenty.js create mode 100644 apps/ftclock/fourTwentyTz.js create mode 100644 apps/ftclock/mkFourTwentyTz.py create mode 100644 apps/ftclock/screenshot.png diff --git a/apps.json b/apps.json index e5e9f8f02..3dc4c3577 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,23 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "ftclock", + "name": "Four Twenty Clock", + "version": "0.01", + "description": "A clock that tells when and where it's going to be 4:20 next", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"ftclock.app.js","url":"app.js"}, + {"name":"fourTwenty","url":"fourTwenty.js"}, + {"name":"fourTwentyTz","url":"fourTwentyTz.js"}, + {"name":"ftclock.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/ftclock/ChangeLog b/apps/ftclock/ChangeLog new file mode 100644 index 000000000..9db0e26c5 --- /dev/null +++ b/apps/ftclock/ChangeLog @@ -0,0 +1 @@ +0.01: first release diff --git a/apps/ftclock/app-icon.js b/apps/ftclock/app-icon.js new file mode 100644 index 000000000..297847e95 --- /dev/null +++ b/apps/ftclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwghC/AH4A/AH4A/AAMHu4ACuwHBs4HDsEGBIQLCsADBgwPDCAQGEuwXFBwI0GEAMHuAGCCoMHC4pMHEAIXEAgIGEBwI9BC4wSCC8IVCMAwIBs4XKUQJfITQgXCDwp8EHAqaECoLFEu4cDBIggBs6uFZozuGBAVmC4g+FMgZQEZQ5vGC4iRIC5IrDN4h5EC5J3BCoIKGgyaEC44VBC46yEDgoeDgxqLC5SCMAgoTFY47GFC4xFBdwwPBD4oWFAH4A/AH4A/AH4AjA==")) diff --git a/apps/ftclock/app.js b/apps/ftclock/app.js new file mode 100644 index 000000000..1aed8da54 --- /dev/null +++ b/apps/ftclock/app.js @@ -0,0 +1,52 @@ +let getNextFourTwenty = require("fourTwenty").getNextFourTwenty; +require("FontTeletext10x18Ascii").add(Graphics); +let leaf_img = "\x17\x18\x81\x00\x00\x10\x00\x00 \x00\x00@\x00\x01\xc0\x00\x03\x80\x00\x0f\x80\x00\x1f\x00\x00>\x00\x00|\x00\xc0\xf8\x19\xe1\xf0\xf1\xe3\xe3\xc3\xf7\xdf\x83\xff\xfe\x03\xff\xf8\x03\xff\xe0\x03\xff\x80\x03\xfe\x00\x7f\xff\xc0\xff\xff\xc0\x06\xe0\x00\x18\xc0\x00 \x80\x00\x00\x00"; + +// timeout used to update every minute +let 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(); + g.setBgColor("#ffffff"); + let date = new Date(); + let timeStr = require("locale").time(date,1); + let next420 = getNextFourTwenty(); + g.clearRect(0,26,g.getWidth(),g.getHeight()); + g.setColor("#00ff00").setFontAlign(0,-1).setFont("Teletext10x18Ascii",2); + g.drawString(next420.minutes? timeStr: `\0${leaf_img}${timeStr}\0${leaf_img}`, g.getWidth()/2, 28); + g.setColor("#000000"); + g.setFontAlign(-1,-1).setFont("Teletext10x18Ascii"); + g.drawString(g.wrapString(next420.text, g.getWidth()-8).join("\n"),4,60); + + // queue draw in one minute + queueDraw(); +} + +// Clear the screen once, at startup +g.clear(); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); +// 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"); diff --git a/apps/ftclock/app.png b/apps/ftclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..0553837ca47ff2061105cd49c40a86d8f66d4b7b GIT binary patch literal 6742 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 && current_min<25) { + current_time -= current_min-20; // 5 minutes grace period + } + let offset = 16*60+20-current_time; + if (offset<0) { + offset += 24*60; + } + return offset; +} + +function makeFourTwentyText(minutes, places) { + //let plural = minutes==1? "": "s"; + //let msgprefix = minutes? `${minutes} minute${plural} to`: "It is now"; + let msgprefix = minutes? `${minutes}m to`: "It is now"; + let msgsuffix = places.length>1? ", and other fine places": ""; + let msgplace = places[Math.floor(Math.random()*places.length)]; + return `${msgprefix} 4:20 at ${msgplace}${msgsuffix}.`; +} + +function getNextFourTwenty() { + let offs = get420offset(); + for (let i=0; i2: # e.g. America/North_Dakota/New_Salem + country = parts[1] # e.g. North Dakota + else: # e.g. America/Denver + country = countries[r[1]] # e.g. United States + if country==city: # Avoid awkward searches like "Anguilla, Anguilla" + country = r[1] # Use code instead + zones[int(r[0])] = {"name":', '.join((city,country))} +now = int(time.time()) +for r in csv.reader(open("timezone.csv")): + code = int(r[0]) + if code not in zones: + continue + starttime = int(r[2] or "0") # Bugger. They're feeding us blanks for UTC now + offs = int(r[3]) + if offs < 0: + offs += 60*60*24 + d = zones[code] + if starttime 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 W_a_}>UQb*A0000