From 1223184ee027e66aad9be82976d89e6eb1f3658c Mon Sep 17 00:00:00 2001 From: Amos Blanton Date: Sat, 25 Apr 2020 12:11:07 +0200 Subject: [PATCH] Add imprecise word clock. --- apps.json | 13 +++ apps/impwclock/clock-impword-icon.js | 1 + apps/impwclock/clock-impword.js | 160 +++++++++++++++++++++++++++ apps/impwclock/clock-impword.png | Bin 0 -> 10763 bytes 4 files changed, 174 insertions(+) create mode 100644 apps/impwclock/clock-impword-icon.js create mode 100644 apps/impwclock/clock-impword.js create mode 100644 apps/impwclock/clock-impword.png diff --git a/apps.json b/apps.json index 6d67d8b40..65f321a91 100644 --- a/apps.json +++ b/apps.json @@ -163,6 +163,19 @@ {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true} ] }, + { "id": "impwclock", + "name": "Imprecise Word Clock", + "icon": "clock-impword.png", + "version":"0.01", + "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", + "tags": "clock", + "type":"clock", + "allow_emulator":true, + "storage": [ + {"name":"impwclock.app.js","url":"clock-impword.js"}, + {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true} + ] + }, { "id": "aclock", "name": "Analog Clock", "icon": "clock-analog.png", diff --git a/apps/impwclock/clock-impword-icon.js b/apps/impwclock/clock-impword-icon.js new file mode 100644 index 000000000..f5ed47f1f --- /dev/null +++ b/apps/impwclock/clock-impword-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkEIf4A3iIBEn8ggP//8wgX/+cQl8Agc/BQPyCokQgHzmEB+ET+EfmMj+AXCmABBF4MBiIABiEC+PxC4Uwn4NB+QXMBAMzI4UxmYOBC5sfCgIvBgPzF4cfC5BgCFAMPkPwiXzL4cPmMvkAXDPAnzEgMxR4wDCGITl/AH4ApgUQbIICBAgXwBYMD+UAYoP/l4CBiUhd4QXFgIXCh73BfQUfAgIPBC4cQiIACC4cvj4PBC5AuCC48zgcwC4ZHBC5sBCAIEBF5EAC4RgDCQItCPAIXLCoQBBFgM/IoZHER4QA/AH4Anj8wgXzgX/+cQWoPyYQK9Bn/zj/wb4MTCAMf+MDAYMxkfwj8BmYXBmEzCYMf+cDmPzkMvj8zAIM/eoPyC4fy+IXDl8TmfwI4UvmYABAwIXB//xgPwBIIXCgYFBmEP/8fh/yF4sDC4QjBC4RvBF4UPB4JUBL4kAn8ROIJbBC4IIBL4hDBmaPEgBuB+EB+aPCUQUjCALn/AH4A/A")) \ No newline at end of file diff --git a/apps/impwclock/clock-impword.js b/apps/impwclock/clock-impword.js new file mode 100644 index 000000000..dafbbfcf5 --- /dev/null +++ b/apps/impwclock/clock-impword.js @@ -0,0 +1,160 @@ +/* Imprecise Word Clock - A. Blanton +A remix of word clock +by Gordon Williams https://github.com/gfwilliams +- Changes the representation of time to be more general +- Shows accurate digital time when button 1 is pressed +*/ +/* jshint esversion: 6 */ + +const allWords = [ + "AEARLYDN", + "LATEYRZO", + "MORNINGO", + "KMIDDLEN", + "AFTERDAY", + "OFDZTHEC", + "EVENINGR", + "ORMNIGHT" +]; + + +const timeOfDay = { + 0: ["", 0, 0], + 1: ["EARLYMORNING", 10, 11, 12, 13, 14, 02, 12, 22, 32, 42, 52, 62], + 2: ["MORNING", 02, 12, 22, 32, 42, 52, 62], + 3: ["LATEMORNING", 01, 11, 21, 31, 02, 12, 22, 32, 42, 52, 62], + 4: ["MIDDAY", 13, 23, 33, 54, 64, 74], + 5: ["EARLYAFTERNOON", 10, 20, 30, 40, 50, 04, 14, 24, 34, 44, 70, 71, 72, 73], + 6: ["AFTERNOON", 04, 14, 24, 34, 44, 70, 71, 72, 73], + 7: ["LATEAFTERNOON", 01, 11, 21, 31, 04, 14, 24, 34, 44, 70, 71, 72, 73], + 8: ["EARLYEVENING", 10, 20, 30, 40, 50, 06, 16, 26, 36, 46, 56, 66], + 9: ["EVENING", 06, 16, 26, 36, 46, 56, 66], + 10: ["NIGHT", 37, 47, 57, 67, 77], + 11: ["MIDDLEOFTHENIGHT", 32, 33, 34, 35, 36, 37, 50, 51, 54, 55, 56, 73,74,75,76,77 ], +}; + + +// offsets and increments +const xs = 35; +const ys = 31; +const dy = 22; +const dx = 25; + +// font size and color +const fontSize = 3; // "6x8" +const passivColor = 0x3186 /*grey*/ ; +const activeColorNight = 0xF800 /*red*/ ; +const activeColorDay = 0xFFFF /* white */; + +function drawWordClock() { + + + // get time + var t = new Date(); + var h = t.getHours(); + var m = t.getMinutes(); + var time = ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2); + var day = t.getDay(); + + var hidx; + + var activeColor = activeColorDay; + if(h < 7 || h > 19) {activeColor = activeColorNight;} + + g.setFont("6x8",fontSize); + g.setColor(passivColor); + g.setFontAlign(0, -1, 0); + + // draw allWords + var c; + var y = ys; + var x = xs; + allWords.forEach((line) => { + x = xs; + for (c in line) { + g.drawString(line[c], x, y); + x += dx; + } + y += dy; + }); + + + // Switch case isn't good for this in Js apparently so... + if(h < 3){ + // Middle of the Night + hidx = 11; + } + else if (h < 7){ + // Early Morning + hidx = 1; + } + else if (h < 10){ + // Morning + hidx = 2; + } + else if (h < 12){ + // Late Morning + hidx = 3; + } + else if (h < 13){ + // Midday + hidx = 4; + } + else if (h < 14){ + // Early afternoon + hidx = 5; + } + else if (h < 16){ + // Afternoon + hidx = 6; + } + else if (h < 17){ + // Late Afternoon + hidx = 7; + } + else if (h < 19){ + // Early evening + hidx = 8; + } + else if (h < 21){ + // evening + hidx = 9; + } + else if (h < 24){ + // Night + hidx = 10; + } + + // write hour in active color + g.setColor(activeColor); + timeOfDay[hidx][0].split('').forEach((c, pos) => { + x = xs + (timeOfDay[hidx][pos + 1] / 10 | 0) * dx; + y = ys + (timeOfDay[hidx][pos + 1] % 10) * dy; + g.drawString(c, x, y); + }); + + + // Display digital time while button 1 is pressed + if (BTN1.read()){ + g.setColor(activeColor); + g.clearRect(0, 215, 240, 240); + g.drawString(time, 120, 215); + } else { g.clearRect(0, 215, 240, 240); } + +} + +Bangle.on('lcdPower', function(on) { + if (on) drawWordClock(); +}); + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +setInterval(drawWordClock, 1E4); +drawWordClock(); + +// Show digital time while top button is pressed +setWatch(drawWordClock, BTN1, {repeat:true,edge:"both"}); + +// Show launcher when middle button pressed +setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"}); diff --git a/apps/impwclock/clock-impword.png b/apps/impwclock/clock-impword.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ed0e8282583a96e7bbd8bc444813af273260f7 GIT binary patch literal 10763 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 JPDHLkV1n2bV