From 30dd8512eda42049f5215f57504ed4cd6c855449 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 12 Apr 2022 00:16:09 +0200 Subject: [PATCH] cogclock: new app --- apps/cogclock/app.js | 111 +++++++++++++++++++++++++++++++++++ apps/cogclock/icon.js | 1 + apps/cogclock/icon.png | Bin 0 -> 11242 bytes apps/cogclock/metadata.json | 16 +++++ apps/cogclock/screenshot.png | Bin 0 -> 5887 bytes 5 files changed, 128 insertions(+) create mode 100644 apps/cogclock/app.js create mode 100644 apps/cogclock/icon.js create mode 100644 apps/cogclock/icon.png create mode 100644 apps/cogclock/metadata.json create mode 100644 apps/cogclock/screenshot.png diff --git a/apps/cogclock/app.js b/apps/cogclock/app.js new file mode 100644 index 000000000..ba423fec1 --- /dev/null +++ b/apps/cogclock/app.js @@ -0,0 +1,111 @@ +Graphics.prototype.setFont16x32N = function() { + this.setFontCustom(atob( + "/////v////7////+4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO/////v////7////+AAAAAOAAAA7gAAAO4AAADuAAAA7gAAAO4AAADv////7////+/////gAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAADgA//+4AP//uAD//7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7//4AO//+ADv//gA4AAAAA4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO/////v////7////+AAAAAP//gAD//4AA//+AAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAP////7////+/////gAAAAD//4AO//+ADv//gA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA//+4AP//uAD//4AAAAA/////v////7////+4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AP//uAD//7gA//+AAAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAP////7////+/////gAAAAD////+/////v////7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7////+/////v////4AAAAA//+ADv//gA7//4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO/////v////7////+AAAAAA==" + ), "0".charCodeAt(0), 16, 32); +}; + +Bangle.loadWidgets(); +const r1 = 84, // inner radius + r3 = Math.min(Bangle.appRect.w/2, Bangle.appRect.h/2), // outer radius + r2 = (r1*3+r3*2)/5, + teeth = 12, + edge = 0.45, point = 0.35; // as fraction of arc + +const x = Bangle.appRect.x+Bangle.appRect.w/2, + y = Bangle.appRect.y+Bangle.appRect.h/2; + +/** + * Add coordinates for nth tooth to vertices + * @param {array} poly Array to add points to + * @param {number} n Tooth number + */ +function addTooth(poly, n) { + const + tau = Math.PI*2, arc = tau/teeth, + e = arc*edge, p = arc*point, s = (arc-(e+p))/2; // edge,point,slopes + const sin = Math.sin, cos = Math.cos; + let r = (n-1)*arc+e/2; // rads + poly.push(x+r2*sin(r), y-r2*cos(r)); + r += s; + poly.push(x+r3*sin(r), y-r3*cos(r)); + r += p; + poly.push(x+r3*sin(r), y-r3*cos(r)); + r += s; + poly.push(x+r2*sin(r), y-r2*cos(r)); +} + +function drawCog() { + g.drawCircle(x, y, r1); + let poly = []; + for(let t = 1; t<=teeth; t++) { + addTooth(poly, t); + } + g.drawPoly(poly, true); +} +/** + * @param {number} n Tooth number to fill (1-based) + * @param col Fill color + */ +function fillTooth(n, col) { + if (!n) return; // easiest to check here + let poly = []; + addTooth(poly, n); + g.setColor(col).fillPoly(poly) + .setColor(g.theme.fg).drawPoly(poly); // fillPoly colored over the outline +} + +let last = {tooth: 0}, timeOut; +function draw() { + if (!Bangle.isLCDOn()) return; // no drawing, also no new update scheduled + g.reset(); + const pad2 = num => (num<10 ? "0" : "")+num, + d = new Date(), + year = d.getFullYear(), + date = pad2(d.getDate())+pad2(d.getMonth()), + time = pad2(d.getHours())+pad2(d.getMinutes()), + tooth = Math.round(d.getSeconds()/60*teeth), + m = d.getMilliseconds(); + if (year!==last.year) { + g.setFont("16x32N").setFontAlign(0, -1) // center top + .drawString(year, x, y+34, true); + } + if (date!==last.date) { + g.setFont("16x32N").setFontAlign(0, 1) // center bottom + .drawString(date, x, y-34, true); + } + if (time!==last.time) { + g.setFont("16x32N:2").setFontAlign(0, 0) // center middle + .drawString(time, x, y, true); + } + if (tooth!==last.tooth) { + if (tooth>last.tooth) { + for(let t = last.tooth; t<=tooth; t++) { // fill missing teeth + fillTooth(t, g.theme.fg2); + } + } else { + for(let t = last.tooth; t>tooth; t--) { // erase extraneous teeth + fillTooth(t, g.theme.bg); + } + } + } + + last = { + year: year, + date: date, + time: time, + tooth: tooth, + }; + timeOut = setTimeout(draw, 1000-m); +} +g.clear(); +Bangle.drawWidgets(); +Bangle.setUI("clock"); +Bangle.on("lcdPower", on => { + if (timeOut) { + clearTimeout(timeOut); + timeOut = undefined; + } + if (on) draw(); +}); +drawCog(); +draw(); diff --git a/apps/cogclock/icon.js b/apps/cogclock/icon.js new file mode 100644 index 000000000..899cfc7c1 --- /dev/null +++ b/apps/cogclock/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/ACcikQXpCQUCC4MgBAgqMCQIXEAgQXNBwIDCAggXOABAXLHwQAHMYQXmmczI5oiCBwUjCwIABmQXDEgJ0KCwMwCwMDDAgyGLYoWBgAXBgAYBMZIXEkYWBC4YYBGAh7FFwgHCC4YEBPRIwCFwYXFGAaqHC56oIIwgXFJAbUJLwpgHI4qPDIwpIFR4wWDLwa6BAAQHDVIYYCC/gYCC453MPIR3HU5gADd5bXHC4rvJMAYAECwJeCd5MjGAjVDC4ZHGNARIFGAgNDFw5IJUogwFC4gwBDAhGBBghIFBQhhBbYguEPAweCDAgACCwZACNg5LFXQYsIC5QAFdg4XcCxJHNBwYTEC6A+BJYQEEC5YYBMYhbCCxo0GCaIXbAHgA=")) \ No newline at end of file diff --git a/apps/cogclock/icon.png b/apps/cogclock/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8520fcf5d0cfff4f509021448b25abf4a63e6604 GIT binary patch literal 11242 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 Cc70L+ literal 0 HcmV?d00001 diff --git a/apps/cogclock/metadata.json b/apps/cogclock/metadata.json new file mode 100644 index 000000000..ab47c43a1 --- /dev/null +++ b/apps/cogclock/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "cogclock", + "name": "Cog Clock", + "version": "0.01", + "description": "A clock inside a cog", + "icon": "icon.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"cogclock.app.js","url":"app.js"}, + {"name":"cogclock.img","url":"icon.js","evaluate":true} + ] +} diff --git a/apps/cogclock/screenshot.png b/apps/cogclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f49709aef266bf4555139c86171fcbd73dcad4d8 GIT binary patch literal 5887 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 literal 0 HcmV?d00001