From 68c04698f5c7591aecd93eca8b3f461d9e7cae57 Mon Sep 17 00:00:00 2001 From: Fredrik Lautrup Date: Mon, 29 Mar 2021 19:49:19 +0200 Subject: [PATCH] First version --- apps.json | 14 +++ apps/fclock/ChangeLog | 5 + apps/fclock/app-icon.js | 1 + apps/fclock/fclock.app.js | 219 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 239 insertions(+) create mode 100644 apps/fclock/ChangeLog create mode 100644 apps/fclock/app-icon.js create mode 100644 apps/fclock/fclock.app.js diff --git a/apps.json b/apps.json index b531ebb3e..5aa915176 100644 --- a/apps.json +++ b/apps.json @@ -1712,6 +1712,20 @@ {"name":"rclock.img","url":"app-icon.js","evaluate":true} ] }, + { + "id": "fclock", + "name": "", + "shortName": "Clock", + "icon": "app.png", + "version": "0.01", + "description": "", + "tags": "clock", + "type": "clock", + "storage": [ + {"name":"fclock.app.js","url":"fclock.app.js"}, + {"name":"fclock.img","url":"app-icon.js","evaluate":true} + ] + }, { "id": "hamloc", "name": "QTH Locator / Maidenhead Locator System", "shortName": "QTH Locator", diff --git a/apps/fclock/ChangeLog b/apps/fclock/ChangeLog new file mode 100644 index 000000000..61bf493c1 --- /dev/null +++ b/apps/fclock/ChangeLog @@ -0,0 +1,5 @@ +0.01: First published version of app +0.02: Added support for locale and 12H clock +0.03: Added HR indication to clock +0.04: Update font size and alignment +0.05: Changes which circle show minutes and seconds \ No newline at end of file diff --git a/apps/fclock/app-icon.js b/apps/fclock/app-icon.js new file mode 100644 index 000000000..62f5310d5 --- /dev/null +++ b/apps/fclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+If4A/AH4AXqwBEF9VWlYxEAoIAllYuGGwIxnSxAwkR4InCFIbGmF4TCCGAYEBSgK/kXYQxFetDzCLYhgjeBQ3EGE69ESwgwoZYiSpMAgCEGFRfqYQrDblRfRMDdU0QFDp2iAAN4HIowBLYYwXvHG4w0D4wtB0QDBGApcCGYqLSEgIvEAwIqCHQNUYArdaKwIlBRwYpDGgIvEL4QxBYDIvEAAhpBpxZaF6BeBvAIFL4qVXF44uIF4pffFxI0GF7ouKlbrClaNXF4wEB0VUAAUqF4qTEF7heBAAhjDLQS+CL7MqqgECLgZfNGDIAORIaNZACCOBLIbvaFxy/ERtDpCAgYCDF1DsnFgS2ERk4sBF4hhBMYgAiE4bsDF0zAKMFABBXkxZEX4QunWwS4CFtCMEFsN4AAOiAYcAqgGB0UqgGip2iqgvcD4IuCAYgwBAoINBAIN4F7gkBAAplCGgVUNQhfcqlOAAIDCgEqAQIBBAoKXBAQIAL")) \ No newline at end of file diff --git a/apps/fclock/fclock.app.js b/apps/fclock/fclock.app.js new file mode 100644 index 000000000..823fac80c --- /dev/null +++ b/apps/fclock/fclock.app.js @@ -0,0 +1,219 @@ +{ + var minutes; + var seconds; + var hours; + var date; + var first = true; + var locale = require('locale'); + var _12hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"] || false; + + //HR variables + var id = 0; + var grow = true; + var size=10; + + //Screen dimensions + const screen = { + width: g.getWidth(), + height: g.getWidth(), + middle: g.getWidth() / 2, + center: g.getHeight() / 2, + }; + + // Ssettings + const settings = { + time: { + color: '#D6ED17', + font: 'Vector', + size: 60, + middle: screen.middle, + center: screen.center, + }, + date: { + color: '#D6ED17', + font: 'Vector', + size: 15, + middle: screen.height-17, // at bottom of screen + center: screen.center, + }, + circle: { + colormin: '#ffffff', + colorsec: '#ffffff', + width: 10, + middle: screen.middle, + center: screen.center, + height: screen.height + }, + hr: { + color: '#333333', + size: 10, + x: screen.center, + y: screen.middle + 45 + } + }; + + const dateStr = function (date) { + return locale.date(new Date(), 1); + }; + + const getArcXY = function (centerX, centerY, radius, angle) { + var s, r = []; + s = 2 * Math.PI * angle / 360; + r.push(centerX + Math.round(Math.cos(s) * radius)); + r.push(centerY + Math.round(Math.sin(s) * radius)); + + return r; + }; + + const drawMin = function (sections, color) { + g.setFontAlign(0, 0, 0); + g.setColor(settings.time.color); + g.setFont(settings.time.font, settings.time.size/2); + g.drawString(timestr, settings.time.center, settings.time.middle); + }; + + const drawSec = function (sections, color) { + g.setFontAlign(0, 0, 0); + g.setColor(settings.time.color); + g.setFont(settings.time.font, settings.time.size/4); + g.drawString(timestr, settings.time.center+20, settings.time.middle); + }; + + const drawClock = function () { + + currentTime = new Date(); + + //Set to initial time when started + if (first == true) { + minutes = currentTime.getMinutes(); + seconds = currentTime.getSeconds(); + for (count = 0; count <= minutes; count++) { + drawMin(count, settings.circle.colormin); + } + + for (count = 0; count <= seconds; count++) { + drawSec(count, settings.circle.colorsec); + } + first = false; + } + + // Reset + if (seconds == 59) { + g.setColor('#000000'); + g.fillCircle(settings.circle.middle, settings.circle.center, (settings.circle.height / 2)); + for (count = 0; count <= minutes; count++) { + drawMin(count, settings.circle.colormin); + } + } + + //Get date as a string + date = dateStr(currentTime); + + // Update minutes when needed + if (minutes != currentTime.getMinutes()) { + minutes = currentTime.getMinutes(); + drawMin(minutes, settings.circle.colormin); + } + + //Update seconds when needed + if (seconds != currentTime.getSeconds()) { + seconds = currentTime.getSeconds(); + drawSec(seconds, settings.circle.colorsec); + } + + //Write the time as configured in the settings + hours = currentTime.getHours(); + if (_12hour && hours > 13) { + hours = hours - 12; + } + + var meridian; + + if (typeof locale.meridian === "function") { + meridian = locale.meridian(new Date()); + } else { + meridian = ""; + } + + var timestr; + + if (meridian.length > 0 && _12hour) { + timestr = hours + " " + meridian; + } else { + timestr = hours; + } + g.setFontAlign(0, 0, 0); + g.setColor(settings.time.color); + g.setFont(settings.time.font, settings.time.size); + g.drawString(timestr, settings.time.center+20, settings.time.middle); + + //Write the date as configured in the settings + g.setColor(settings.date.color); + g.setFont(settings.date.font, settings.date.size); + g.drawString(date, settings.date.center, settings.date.middle); + }; + + //setInterval for HR visualisation + const newBeats = function (hr) { + if (id != 0) { + changeInterval(id, 6e3 / hr.bpm); + } else { + id = setInterval(drawHR, 6e3 / hr.bpm); + } + }; + + //visualize HR with circles pulsating + const drawHR = function () { + if (grow && size < settings.hr.size) { + size++; + } + + if (!grow && size > 3) { + size--; + } + + if (size == settings.hr.size || size == 3) { + grow = !grow; + } + + if (grow) { + color = settings.hr.color; + g.setColor(color); + g.fillCircle(settings.hr.x, settings.hr.y, size); + } else { + color = "#000000"; + g.setColor(color); + g.drawCircle(settings.hr.x, settings.hr.y, size); + } + }; + + // clean app screen + g.clear(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + + //manage when things should be enabled and not + Bangle.on('lcdPower', function (on) { + if (on) { + Bangle.setHRMPower(1); + } else { + Bangle.setHRMPower(0); + } + }); + + // refesh every second + setInterval(drawClock, 1E3); + + //start HR monitor and update frequency of update + Bangle.setHRMPower(1); + Bangle.on('HRM', function (d) { + newBeats(d); + }); + + // draw now + drawClock(); + + // Show launcher when middle button pressed + setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" }); + +} \ No newline at end of file