From 8aabcf28e8df1a8dcd8ac72635a5968c5f4f5ef7 Mon Sep 17 00:00:00 2001 From: Oli Sanders <35221386+oli-sanders@users.noreply.github.com> Date: Fri, 27 Mar 2020 23:53:38 +0000 Subject: [PATCH] dev clock (#13) --- apps.json | 13 ++++ apps/dclock/ChangeLog | 8 +++ apps/dclock/clock-dev-icon.js | 1 + apps/dclock/clock-dev.js | 111 ++++++++++++++++++++++++++++++++++ apps/dclock/clock-dev.png | Bin 0 -> 2603 bytes 5 files changed, 133 insertions(+) create mode 100644 apps/dclock/ChangeLog create mode 100644 apps/dclock/clock-dev-icon.js create mode 100644 apps/dclock/clock-dev.js create mode 100644 apps/dclock/clock-dev.png diff --git a/apps.json b/apps.json index 15acb3b20..4f29159cb 100644 --- a/apps.json +++ b/apps.json @@ -508,6 +508,19 @@ {"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true} ] }, + { "id": "dclock", + "name": "Dev Clock", + "icon": "clock-dev.png", + "version":"0.08", + "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)", + "tags": "clock", + "type":"clock", + "allow_emulator":true, + "storage": [ + {"name":"dclock.app.js","url":"clock-dev.js"}, + {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true} + ] + }, { "id": "gesture", "name": "Gesture Test", "icon": "gesture.png", diff --git a/apps/dclock/ChangeLog b/apps/dclock/ChangeLog new file mode 100644 index 000000000..6582ec16e --- /dev/null +++ b/apps/dclock/ChangeLog @@ -0,0 +1,8 @@ +0.01: branched from simple clock and added seconds +0.02: add timestamp (tst) +0.03: fix timestamp round to whole number +0.04: add iso datetime and move day of the week (d) / month names (m) +0.05: add beats (@) +0.06: tidy up +0.07: add days in current month (md) and days since new moon (l) +0.08: update icon \ No newline at end of file diff --git a/apps/dclock/clock-dev-icon.js b/apps/dclock/clock-dev-icon.js new file mode 100644 index 000000000..f36dcaee3 --- /dev/null +++ b/apps/dclock/clock-dev-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkEIf4A5/8wgf/AwUB/8gh/zA4QMCl/xA4cAichgIaBiEDgMgmECDQMAkMA+EgiYvDkQJBkcQgMQDwMggUiiECG4MikEBmQWCgURiEREQIXBCIMxkIIBAoMSiQ4BGoIABKgPykRSBI4JfC+c/iARBl8zmBfEAAUvIgIAUkbAtgalB+ADDBIKSBHgUgmYJCAAa6BmCoBAYMiBIMRC4UQmEAAoQvFmUDAYUSmcxWIKMBEQKrBOw0yh8wmcyj4nBIYQDB+cwBAQA/ABUxgUDkBqBgchkMiiUikMRgSOBkR3BkEhC4MgiQHBiADBC4UQAYMRiUxkECAAITBC4MSiUQF4MTiQTBBAIDBkcCiMxkUTAYIvCAH4A/AH4AKiIPPgMxiESgUQgECgMBdAMiiUgC48ikUBiEBiIXDGQURiIbBF48RkAvCEwIvCkERgQMBRHpDBOoRhBNoJOBJIkiKYMjgcTOoMhLQMQmMDDIMjQQInEC4MhiUSkQHCC4MAkAXCiUjiZ5UiR5jLwLaBAQJ1BAgIAMCgMxMwMgkciAoMjC5pqBRwPxCoMiiUyGBsgiBBBiESVAKzBf+YACA==")) \ No newline at end of file diff --git a/apps/dclock/clock-dev.js b/apps/dclock/clock-dev.js new file mode 100644 index 000000000..39f031fcc --- /dev/null +++ b/apps/dclock/clock-dev.js @@ -0,0 +1,111 @@ +/* jshint esversion: 6 */ +const timeFontSize = 4; +const dateFontSize = 3; +const smallFontSize = 2; +const font = "6x8"; + +const xyCenter = g.getWidth() / 2; +const yposTime = 50; +const yposDate = 85; +const yposTst = 115; +const yposDml = 170; +const yposDayMonth = 195; +const yposGMT = 220; + +// Check settings for what type our clock should be +var is12Hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]; + +function getUTCTime(d) { + return d.toUTCString().split(' ')[4].split(':').map(function(d){return Number(d)}); +} + +function drawSimpleClock() { + // get date + var d = new Date(); + var da = d.toString().split(" "); + var dutc = getUTCTime(d); + + g.reset(); // default draw styles + // drawSting centered + g.setFontAlign(0, 0); + + // draw time + var time = da[4].split(":"); + var hours = time[0], + minutes = time[1], + seconds = time[2]; + + var meridian = ""; + if (is12Hour) { + hours = parseInt(hours,10); + meridian = "AM"; + if (hours == 0) { + hours = 12; + meridian = "AM"; + } else if (hours >= 12) { + meridian = "PM"; + if (hours>12) hours -= 12; + } + hours = (" "+hours).substr(-2); + } + + // Time + g.setFont(font, timeFontSize); + g.drawString(`${hours}:${minutes}:${seconds}`, xyCenter, yposTime, true); + g.setFont(font, smallFontSize); + g.drawString(meridian, xyCenter + 102, yposTime + 10, true); + + // Date String + g.setFont(font, dateFontSize); + g.drawString(`${d.getFullYear()}-${d.getMonth()+1}-${d.getDate()}`, xyCenter, yposDate, true); + + // Timestamp + var tst = Math.round(d.getTime()); + g.setFont(font, smallFontSize); + g.drawString(`tst:${tst}`, xyCenter, yposTst, true); + + //Days in month + var dom = new Date(d.getFullYear(), d.getMonth()+1, 0).getDate(); + + //Days since full moon + var knownnew = new Date(2020,02,24,09,28,0); + + // Get millisecond difference and divide down to cycles + var cycles = (d.getTime()-knownnew.getTime())/1000/60/60/24/29.53; + + // Multiply decimal component back into days since new moon + var sincenew = (cycles % 1)*29.53; + + // Draw days in month and sime since new moon + g.setFont(font, smallFontSize); + g.drawString(`md:${dom} l:${sincenew.toFixed(2)}`, xyCenter, yposDml, true); + + // draw Month name, Day of the week and beats + var beats = Math.floor((((dutc[0] + 1) % 24) + dutc[1] / 60 + dutc[2] / 3600) * 1000 / 24); + g.setFont(font, smallFontSize); + g.drawString(`m:${da[1]} d:${da[0]} @${beats}`, xyCenter, yposDayMonth, true); + + // draw gmt + var gmt = da[5]; + g.setFont(font, smallFontSize); + g.drawString(gmt, xyCenter, yposGMT, true); +} + +// handle switch display on by pressing BTN1 +Bangle.on('lcdPower', function(on) { + if (on) drawSimpleClock(); +}); + +// clean app screen +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +// refesh every 100 milliseconds +setInterval(drawSimpleClock, 100); + +// draw now +drawSimpleClock(); + +// Show launcher when middle button pressed +setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"}); \ No newline at end of file diff --git a/apps/dclock/clock-dev.png b/apps/dclock/clock-dev.png new file mode 100644 index 0000000000000000000000000000000000000000..0cfbff44c1e6ff1dad206c266e64f43787c846df GIT binary patch literal 2603 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 N002ovPDHLkV1gky