From 3aa0e09f28d9b8d1179011594d8c4221e9ce36a6 Mon Sep 17 00:00:00 2001 From: Spioune <> Date: Tue, 9 Apr 2024 16:03:16 +0800 Subject: [PATCH] add Meridian Clock --- apps/meridian/ChangeLog | 1 + apps/meridian/README.md | 25 +++++ apps/meridian/app-icon.js | 1 + apps/meridian/app.js | 188 +++++++++++++++++++++++++++++++++++ apps/meridian/app.png | Bin 0 -> 1561 bytes apps/meridian/metadata.json | 17 ++++ apps/meridian/screenshot.png | Bin 0 -> 2074 bytes 7 files changed, 232 insertions(+) create mode 100644 apps/meridian/ChangeLog create mode 100644 apps/meridian/README.md create mode 100644 apps/meridian/app-icon.js create mode 100644 apps/meridian/app.js create mode 100644 apps/meridian/app.png create mode 100644 apps/meridian/metadata.json create mode 100644 apps/meridian/screenshot.png diff --git a/apps/meridian/ChangeLog b/apps/meridian/ChangeLog new file mode 100644 index 000000000..09953593e --- /dev/null +++ b/apps/meridian/ChangeLog @@ -0,0 +1 @@ +0.01: New Clock! diff --git a/apps/meridian/README.md b/apps/meridian/README.md new file mode 100644 index 000000000..5d750a965 --- /dev/null +++ b/apps/meridian/README.md @@ -0,0 +1,25 @@ +# Clock Name + +More info on making Clock Faces: https://www.espruino.com/Bangle.js+Clock + +Describe the Clock... + +## Usage + +Describe how to use it + +## Features + +Name the function + +## Controls + +Name the buttons and what they are used for + +## Requests + +Name who should be contacted for support/update requests + +## Creator + +Your name diff --git a/apps/meridian/app-icon.js b/apps/meridian/app-icon.js new file mode 100644 index 000000000..43e7bca3b --- /dev/null +++ b/apps/meridian/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgMAkEAwEEBIMQAo8IH1WAAgcBsAFDgwRFJwIADgYYF8AMEvAFEjgFEh4eF4AGE+AFEnAeKG4Y0BgIFBg5QHC4ojFF4kBHYkHMAhzGABcQxAkEhgDBawMAZQMEFokDaVUQagI2BAocEIQYFCA=")) \ No newline at end of file diff --git a/apps/meridian/app.js b/apps/meridian/app.js new file mode 100644 index 000000000..e560cc6fd --- /dev/null +++ b/apps/meridian/app.js @@ -0,0 +1,188 @@ +require("FontDylex7x13").add(Graphics); + +var weather = require("Storage").readJSON("weather.json", 1) || {}; + +function getArcXY(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; +} + +function getArc(centerX, centerY, radius, startAngle, endAngle) { + var xy, + r = [], + actAngle = startAngle; + var stepAngle = ((radius + radius) * Math.PI) / 60; + stepAngle = 6; + while (actAngle < endAngle) { + r = r.concat(getArcXY(centerX, centerY, radius, actAngle)); + actAngle += stepAngle; + actAngle = Math.min(actAngle, endAngle); + } + return r.concat(getArcXY(centerX, centerY, radius, endAngle)); +} + +var timeout; + +function fillLine(x1, y1, x2, y2, thickness) { + const angle = Math.atan2(y2 - y1, x2 - x1); + const offset_x = (thickness * Math.sin(angle)) / 2; + const offset_y = (thickness * Math.cos(angle)) / 2; + g.fillPoly( + [ + x1 + offset_x, + y1 - offset_y, + x1 - offset_x, + y1 + offset_y, + x2 - offset_x, + y2 + offset_y, + x2 + offset_x, + y2 - offset_y, + ], + true + ); +} + +function getWeatherIcon(txt) { + txt = txt.toLowerCase(); + if (txt == "rainy") { + return atob("EhCBAAAAAPwAf4A/8A/8D//H//v////////3//j//AjEBiMDEIAAAA=="); + } else if (txt == "cloudy") { + return atob("FA6BAABgAD/AB/4Af+A//wf/+H//7//+//////////f//j//4P/4"); + } else if (txt == "sunny") { + return atob( + "FBSBAABgAAYAAAABgBgY8YA/wAf+AH/gD/8M//PP/zD/8Af+AH/gA/wBjxgYAYAAAABgAAYA" + ); + } else { + return null; + } +} + +function draw() { + g.setTheme({ fg: 0xffff, bg: 0 }); + + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + g.reset().clear(); + g.setColor("#FFF"); + + const mid = g.getWidth() / 2; + g.drawImage( + require("heatshrink").decompress( + atob( + "2GwgIGDhwMEgPAAwk4Dg8HCpdwCqnwCo8DwAVK8AVIB4gVFgIVIB4wFKD5IPFG4pLJCosHMYiNJCozNJvAVJh4VJkAKJgT/PAH4A/AH4A/AH4A/AH4A/ADWACqngCicD/AVTh9+Cqc/n4VTv0P4AURgP4gZuSCYQrTVwNACqT/6AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4Ah//ACaMD/4VrQP4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/ADlACSMBAQPACqMDwED8AVS8EPFaUB/E/Nad+vwVTn/4CqcPNiSEDd/4A/AH4A/AH4A/AH4A/AH8gAgcB4AFDgwVJvAVJh4VJuAVJg4VJ8AVJgeACg8BCqoPEApYfECpY3EGpIlGCpEHCpfwCo6jFCoylEA=" + ) + ) + ); + + g.setFontAlign(0, 0); + g.setFont("Dylex7x13", 1); + + const battery = E.getBattery() || 50; + const outerarc = getArc( + g.getWidth() * (1 / 4) + 1, + g.getHeight() * (1 / 4) - 1, + 14, + -90, + Math.max(battery * 3.6, 10) - 90 + ); + const innerarc = getArc( + g.getWidth() * (1 / 4) + 1, + g.getHeight() * (1 / 4) - 1, + 11, + -92, + Math.max(battery * 3.6, 10) - 88 + ); + g.setColor("#00FF00").fillPoly( + [g.getWidth() * (1 / 4), g.getHeight() * (1 / 4) - 2].concat(outerarc) + ); + g.setColor("#000").fillPoly( + [g.getWidth() * (1 / 4), g.getHeight() * (1 / 4) - 2].concat(innerarc) + ); + g.setColor("#FFF").drawString( + battery, + g.getWidth() * (1 / 4), + g.getHeight() * (1 / 4) + ); + + if (weather && weather.txt) { + const icon = getWeatherIcon(weather.txt); + if (icon) { + g.drawImage( + icon, + g.getWidth() * (3 / 4) - 10, + g.getHeight() * (1 / 4) - 10 + ); + } else { + g.drawString( + weather.txt, + g.getWidth() * (3 / 4), + g.getHeight() * (1 / 4) + ); + } + g.drawString( + weather.temp || "-", + g.getWidth() * (3 / 4), + g.getHeight() * (1 / 4) + 16 + ); + } + + const now = new Date(); + + g.setFont("Vector", 14); + // Date (ex. MON 8) + g.drawString( + require("locale").dow(now, 1).toUpperCase() + " " + now.getDate(), + g.getWidth() / 2, + g.getHeight() * (3 / 4) + ); + + let rhour = + (now.getHours() * Math.PI) / 6 + + (now.getMinutes() * Math.PI) / 30 / 12 - + Math.PI / 2; + let rmin = (now.getMinutes() * Math.PI) / 30 - Math.PI / 2; + + // Middle circle + g.fillCircle(mid, mid, 4); + + // Hours hand + fillLine(mid, mid, mid + Math.cos(rhour) * 10, mid + Math.sin(rhour) * 10, 3); + fillLine( + mid + Math.cos(rhour) * 10, + mid + Math.sin(rhour) * 10, + mid + Math.cos(rhour) * 50, + mid + Math.sin(rhour) * 50, + 7 + ); + + // Minutes hand + fillLine(mid, mid, mid + Math.cos(rmin) * 10, mid + Math.sin(rmin) * 10, 3); + fillLine( + mid + Math.cos(rmin) * 10, + mid + Math.sin(rmin) * 10, + mid + Math.cos(rmin) * 76, + mid + Math.sin(rmin) * 76, + 7 + ); + + if (now.getMinutes() == 0) { + Bangle.buzz(); + } + + timeout = setTimeout(() => { + timeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +draw(); + +Bangle.setUI("clock"); +Bangle.loadWidgets(); +Bangle.drawWidgets(); diff --git a/apps/meridian/app.png b/apps/meridian/app.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb282495d55ab62dab29f8c5ed52e1df2e24165 GIT binary patch literal 1561 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 literal 0 HcmV?d00001