From a1820b7e7ec5f60002567e74ff49c1b4fe7ca66e Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sat, 13 Jun 2020 08:15:43 +0200 Subject: [PATCH] Added Mixed Clock 2 fork of original mixed clock Differences to original Mixed Clock: - Color is all white for better readability in the bright sunlight - Thicker clock hands for better readability in the bright sunlight - Extra space under the clock for widgets - Seconds in the digital clock --- apps.json | 13 ++++ apps/miclock2/clock-mixed-icon.js | 1 + apps/miclock2/clock-mixed.js | 113 ++++++++++++++++++++++++++++++ apps/miclock2/clock-mixed.png | Bin 0 -> 707 bytes 4 files changed, 127 insertions(+) create mode 100644 apps/miclock2/clock-mixed-icon.js create mode 100644 apps/miclock2/clock-mixed.js create mode 100755 apps/miclock2/clock-mixed.png diff --git a/apps.json b/apps.json index a09aa6c6b..55d70fe34 100644 --- a/apps.json +++ b/apps.json @@ -1945,5 +1945,18 @@ {"name":"gpspoilog.app.js","url":"app.js"}, {"name":"gpspoilog.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "miclock2", + "name": "Mixed Clock 2", + "icon": "clock-mixed.png", + "version":"0.01", + "description": "White color variant of the Mixed Clock with thicker clock hands for better readability in the bright sunlight, extra space under the clock for widgets and seconds in the digital clock.", + "tags": "clock", + "type":"clock", + "allow_emulator":true, + "storage": [ + {"name":"miclock.app.js","url":"clock-mixed.js"}, + {"name":"miclock.img","url":"clock-mixed-icon.js","evaluate":true} + ] } ] diff --git a/apps/miclock2/clock-mixed-icon.js b/apps/miclock2/clock-mixed-icon.js new file mode 100644 index 000000000..3ca3b0612 --- /dev/null +++ b/apps/miclock2/clock-mixed-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4ATiwAGFdYzlFp4xeFyYwZD49kxGs2fX6+z1mIsgxcDQtAxArCAA+zxFAGDAYFxAsJAAuIGCxcF1omHgEABI+sGCouERRIvJSgKTEFzovLGAJgRCIiMIF5ySGF57qMF5nXsgvORoggLF5yRPLyAvO6+IF6LsKF6JgEF5lkD5gvPYIiOaF6CQMBYesD5oAP1gvPXxpfDAQIAFYCILDJ5wvP64veACCPeAB6PQd4p9EQQ4MLd6GIF7uIF5YwDsgiNAY4vHsguLYBJfXXxiQKL66ONF4lAL7dAF5pgIF6y9DFxYvEi2sF6+sDwgvLGAryEACLsEFxrCGGCmzXh5gJSQYAPRgovQGA1kMR7qEFyQwHi2IGJWzxCLEFygwIMYOI1gzC2esxBbGFywxKABotXGCwuaGKQtdGZorjAH4A/AF4=")) diff --git a/apps/miclock2/clock-mixed.js b/apps/miclock2/clock-mixed.js new file mode 100644 index 000000000..d928a5185 --- /dev/null +++ b/apps/miclock2/clock-mixed.js @@ -0,0 +1,113 @@ +// Code based on the original Mixed Clock + +/* jshint esversion: 6 */ +var locale = require("locale"); +const Radius = { "center": 7, "hour": 60, "min": 80, "dots": 88 }; +const Center = { "x": 120, "y": 96 }; +const Widths = { hour: 2, minute: 2 }; +var buf = Graphics.createArrayBuffer(240,192,1,{msb:true}); + +function rotatePoint(x, y, d) { + rad = -1 * d / 180 * Math.PI; + var sin = Math.sin(rad); + var cos = Math.cos(rad); + xn = ((Center.x + x * cos - y * sin) + 0.5) | 0; + yn = ((Center.y + x * sin - y * cos) + 0.5) | 0; + p = [xn, yn]; + return p; +} + + +// from https://github.com/espruino/Espruino/issues/1702 +function setLineWidth(x1, y1, x2, y2, lw) { + var dx = x2 - x1; + var dy = y2 - y1; + var d = Math.sqrt(dx * dx + dy * dy); + dx = dx * lw / d; + dy = dy * lw / d; + + return [ + // rounding + x1 - (dx + dy) / 2, y1 - (dy - dx) / 2, + x1 - dx, y1 -dy, + x1 + (dy - dx) / 2, y1 - (dx + dy) / 2, + + x1 + dy, y1 - dx, + x2 + dy, y2 - dx, + + // rounding + x2 + (dx + dy) / 2, y2 + (dy - dx) / 2, + x2 + dx, y2 + dy, + x2 - (dy - dx) / 2, y2 + (dx + dy) / 2, + + x2 - dy, y2 + dx, + x1 - dy, y1 + dx + ]; +} + + +function drawMixedClock(force) { + if ((force || Bangle.isLCDOn()) && buf.buffer) { + var date = new Date(); + var dateArray = date.toString().split(" "); + var isEn = locale.name.startsWith("en"); + var point = []; + var minute = date.getMinutes(); + var hour = date.getHours(); + var radius; + + g.reset(); + buf.clear(); + + // draw date + buf.setFont("6x8", 2); + buf.setFontAlign(-1, 0); + buf.drawString(locale.dow(date,true) + ' ', 4, 16, true); + buf.drawString(isEn?(' ' + dateArray[2]):locale.month(date,true), 4, 176, true); + buf.setFontAlign(1, 0); + buf.drawString(isEn?locale.month(date,true):(' ' + dateArray[2]), 237, 16, true); + buf.drawString(dateArray[3], 237, 176, true); + + // draw hour and minute dots + for (i = 0; i < 60; i++) { + radius = (i % 5) ? 2 : 4; + point = rotatePoint(0, Radius.dots, i * 6); + buf.fillCircle(point[0], point[1], radius); + } + + // draw digital time + buf.setFont("6x8", 3); + buf.setFontAlign(0, 0); + buf.drawString(dateArray[4], 120, 120, true); + + // draw new minute hand + point = rotatePoint(0, Radius.min, minute * 6); + buf.drawLine(Center.x, Center.y, point[0], point[1]); + buf.fillPoly(setLineWidth(Center.x, Center.y, point[0], point[1], Widths.minute)); + // draw new hour hand + point = rotatePoint(0, Radius.hour, hour % 12 * 30 + date.getMinutes() / 2 | 0); + buf.fillPoly(setLineWidth(Center.x, Center.y, point[0], point[1], Widths.hour)); + + // draw center + buf.fillCircle(Center.x, Center.y, Radius.center); + + g.drawImage({width:buf.getWidth(),height:buf.getHeight(),bpp:1,buffer:buf.buffer},0,24); + } +} + +Bangle.on('lcdPower', function(on) { + if (on) + drawMixedClock(true); + Bangle.drawWidgets(); +}); + +setInterval(() => drawMixedClock(true), 30000); // force an update every 30s even screen is off + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +drawMixedClock(); // immediately draw +setInterval(drawMixedClock, 500); // update twice a second + +// Show launcher when middle button pressed after freeing memory first +setWatch(() => {delete buf.buffer; Bangle.showLauncher()}, BTN2, {repeat:false,edge:"falling"}); diff --git a/apps/miclock2/clock-mixed.png b/apps/miclock2/clock-mixed.png new file mode 100755 index 0000000000000000000000000000000000000000..f02ad5e9ee3a0bf215beed0d8cf9d8765015b314 GIT binary patch literal 707 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sa{_!qT!A#h<|7Pi4ua5HFbQJp zXIKqmL!}Nu)d0C0Pcy7Jz_11^0@Skh5J>T=0}N|{f(PHddk0d?KpYl@w4E=7yS=i zxccJNmV1x&cAi=$dl2LS>5?G7UISE7D(w3b_%UOgE( z!JUDDakr<7V~EG`yP-FyH5u@PGO{{49xq+BhH24`GiUz)zdd0UuRzrOz0Y4P%*~r^ z^3wOc^2PfW$F^^ch$ue%@mKy?_tOv8wJo#`nl<}Y!u3NA#!tV+Ut7og%jMagZw4Ro zD+SXcBV3mLpK;O3d1mj=M~eJ2945&Bcv5j~qy6^p{*u`W)<5Ssp1<(p+x6)W>;C`p z3VJ8nDW3M<$&K?(MdQ}6C(HPLH`@wLU`&6ZR(N8+k=Fwa1-{)A<4;`gJjwBfM{>>c z8cx2{A}0pFom;hAf1Q+6R8U%>z2_FMi@*vFMwf@2O~Ji+KCTI=sgF3C8s!3+ex-06 z+9M_U_34bQ6GPO39UE5ho#gzj{==f>4kuHJVwiB!2^Pf@jV!N(Sa-QJv#~!|Z+c+C z$0%h{#`U7Y;n#AH_zS$7dNNADCQfRTuuEo+=SNS!1CN9YDl1R>cR1RFJz@0Zc*HnS zebxyM&iX|mESHpDAK~wE@J`d4(r9#9Gv%fJEz{OB%YrfsR@$(yU1ZI@a!N;`)YYRF zPKIG8Y9&<@W!gPU>QC*}eH|kldpAJCXZALo+aczz+i!}5FaDl;y|`zksYFC@^4_=K b?F9c{ecS$I?dMmTpw#H;>gTe~DWM4f>^e@f literal 0 HcmV?d00001