From 0cbdc5210b535623977d3ef534e422e5260b5d43 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Fri, 11 Feb 2022 19:13:33 +0100 Subject: [PATCH] Update widget.js Replace the 8 phases by a more exact drawing, see forum.espruino.com/conversations/371985 --- apps/widmp/widget.js | 65 ++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/apps/widmp/widget.js b/apps/widmp/widget.js index d8abc3a9c..08cc4e6f1 100644 --- a/apps/widmp/widget.js +++ b/apps/widmp/widget.js @@ -1,26 +1,51 @@ WIDGETS["widmoon"] = { area: "tr", width: 24, draw: function() { - const MC = 29.5305882, NM = 694039.09; - var r = 11, mx = this.x + 12; my = this.y + 12; + const CenterX = this.x + 12, CenterY = this.y + 12, Radius = 11; - function moonPhase(d) { - var tmp, month = d.getMonth(), year = d.getFullYear(), day = d.getDate(); + const simulate = false; // simulate one month in one minute + const updateR = 1000; // update every x ms in simulation + + function moonPhase() { + const d = Date(); + var month = d.getMonth(), year = d.getFullYear(), day = d.getDate(); + if (simulate) day = d.getSeconds() / 2 +1; if (month < 3) {year--; month += 12;} - tmp = ((365.25 * year + 30.6 * ++month + day - NM) / MC); - return Math.round(((tmp - (tmp | 0)) * 7)+1); + mproz = ((365.25 * year + 30.6 * ++month + day - 694039.09) / 29.5305882); + mproz = mproz - (mproz | 0); // strip integral digits, result is between 0 and <1 + if (simulate) console.log(mproz + " " + day); + return (mproz); } - const BLACK = g.theme.bg, MOON = 0x41f; - var moon = { - 0: () => { g.reset().setColor(BLACK).fillRect(mx - r, my - r, mx + r, my + r);}, - 1: () => { moon[0](); g.setColor(MOON).drawCircle(mx, my, r);}, - 2: () => { moon[3](); g.setColor(BLACK).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);}, - 3: () => { moon[0](); g.setColor(MOON).fillCircle(mx, my, r).setColor(BLACK).fillRect(mx - r, my - r, mx, my + r);}, - 4: () => { moon[3](); g.setColor(MOON).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);}, - 5: () => { moon[0](); g.setColor(MOON).fillCircle(mx, my, r);}, - 6: () => { moon[7](); g.setColor(MOON).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);}, - 7: () => { moon[0](); g.setColor(MOON).fillCircle(mx, my, r).setColor(BLACK).fillRect(mx, my - r, mx + r, my + r);}, - 8: () => { moon[7](); g.setColor(BLACK).fillEllipse(mx - r / 2, my - r, mx + r / 2, my + r);} - }; - moon[moonPhase(Date())](); -} }; + // code source: github.com/rozek/banglejs-2-activities/blob/main/README.md#drawmoonphase + function drawMoonPhase (CenterX,CenterY, Radius, leftFactor,rightFactor) { + let x = Radius, y = 0, Error = Radius; + g.drawLine(CenterX-leftFactor*x,CenterY, CenterX+rightFactor*x,CenterY); + let dx,dy; + while (y <= x) { + dy = 1 + 2*y; y++; Error -= dy; + if (Error < 0) { + dx = 1 - 2*x; x--; Error -= dx; + } + g.drawLine(CenterX-leftFactor*x,CenterY-y, CenterX+rightFactor*x,CenterY-y); + g.drawLine(CenterX-leftFactor*x,CenterY+y, CenterX+rightFactor*x,CenterY+y); + g.drawLine(CenterX-leftFactor*y,CenterY-x, CenterX+rightFactor*y,CenterY-x); + g.drawLine(CenterX-leftFactor*y,CenterY+x, CenterX+rightFactor*y,CenterY+x); + } + } + function updateWidget() { + g.reset().setColor(g.theme.bg); + g.fillRect(CenterX - Radius, CenterY - Radius, CenterX + Radius, CenterY + Radius); + g.setColor(0x41f); + + mproz = moonPhase(); // mproz = 0..<1 + + leftFactor = mproz * 4 - 1; + rightFactor = (1 - mproz) * 4 - 1; + if (mproz >= 0.5) leftFactor = 1; else rightFactor = 1; + + drawMoonPhase(CenterX,CenterY, Radius, leftFactor,rightFactor); + + if (simulate) setTimeout(updateWidget, updateR); + } + updateWidget(); +} };