From 684e62eb7f407437acc70b4f7be01daefb1781f5 Mon Sep 17 00:00:00 2001 From: Spioune <> Date: Tue, 9 Apr 2024 19:04:59 +0800 Subject: [PATCH] add clock_info --- apps/meridian/README.md | 22 +--- apps/meridian/app.js | 247 ++++++++++++++--------------------- apps/meridian/app.png | Bin 1561 -> 0 bytes apps/meridian/metadata.json | 4 +- apps/meridian/screenshot.png | Bin 2074 -> 2316 bytes 5 files changed, 103 insertions(+), 170 deletions(-) delete mode 100644 apps/meridian/app.png diff --git a/apps/meridian/README.md b/apps/meridian/README.md index 5d750a965..1fdd03546 100644 --- a/apps/meridian/README.md +++ b/apps/meridian/README.md @@ -1,25 +1,11 @@ -# Clock Name +# Meridian Clock -More info on making Clock Faces: https://www.espruino.com/Bangle.js+Clock - -Describe the Clock... +An elegant clock with 2 clock info ## 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 +Tap on a widget and swipe left/right/up/down to change the displayed info ## Creator -Your name +Spioune diff --git a/apps/meridian/app.js b/apps/meridian/app.js index e560cc6fd..3bb904c7c 100644 --- a/apps/meridian/app.js +++ b/apps/meridian/app.js @@ -1,188 +1,135 @@ -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; +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; +function getArc(centerX,centerY,radius,startAngle,endAngle){ + var r = [], actAngle = startAngle; + var stepAngle = (radius + radius) * Math.PI / 60; stepAngle = 6; - while (actAngle < endAngle) { - r = r.concat(getArcXY(centerX, centerY, radius, actAngle)); + while(actAngle < endAngle){ + r = r.concat(getArcXY(centerX,centerY,radius,actAngle)); actAngle += stepAngle; - actAngle = Math.min(actAngle, endAngle); + actAngle = Math.min(actAngle,endAngle); } - return r.concat(getArcXY(centerX, centerY, radius, endAngle)); + return r.concat(getArcXY(centerX,centerY,radius,endAngle)); } + +let clockInfoItems = require("clock_info").load(); + +clockInfoItems[0].items.unshift({ + name : "BatteryRing", + hasRange : true, + get : () => { + var s = 30; + var mid=s/2; + var v = E.getBattery(); + var img; + var g = Graphics.createArrayBuffer(s,s,4); + + const outerarc = getArc(mid,mid,14,-90,Math.max(v*3.6, 10)-90); + const innerarc = getArc(mid,mid,11,-92,Math.max(v*3.6, 10)-88); + + g.reset(); + g.setColor('#00FF00').fillPoly([mid, mid].concat(outerarc)); + g.setColor('#000').fillPoly([mid, mid].concat(innerarc)); + g.setFont("6x8").setColor('#FFF').setFontAlign(0, 0).drawString(v, mid, mid); + img = g.asImage("object"); + return { v : v, min:0, max:100, img : img }; + }, + show : function() { }, + hide : function() { }, +}); + +function drawInfoClock(itm,info,options){ + g.reset().clearRect(options.x-1, options.y-1, options.x+options.w+1, options.y+options.h+1); + if (options.focus) g.drawRect(options.x-1, options.y-1, options.x+options.w+1, options.y+options.h+1); + if (info.img) g.drawImage(info.img, options.x+options.w/2-(info.img.width||options.w)*options.scale/2,options.y, {scale:options.scale}); + if(info.text) g.setFont("6x8").setFontAlign(0,1).drawString(info.text, options.x+options.w/2,options.y+options.h); +} + +const topleft = require("clock_info").addInteractive(clockInfoItems, { + x : g.getWidth()*(1/4)-15, y: g.getHeight()*(1/4)-15, w: 30, h:30, scale:1, + draw : drawInfoClock +}); + +const topright = require("clock_info").addInteractive(clockInfoItems, { + x : g.getWidth()*(3/4)-15, y: g.getHeight()*(1/4)-15, w: 30, h:30, scale:1, + draw : drawInfoClock +}); + + var timeout; -function fillLine(x1, y1, x2, y2, thickness) { +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 - ); + 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) { +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 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="))); + + + topleft.redraw(); + topright.redraw(); + const now = new Date(); - - g.setFont("Vector", 14); + + g.setFont("Vector",14); + g.setColor('#FFF'); + g.setFontAlign(0,0); // 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; + 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); - + 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 - ); + 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) { + 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 = 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 deleted file mode 100644 index dfb282495d55ab62dab29f8c5ed52e1df2e24165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1561 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 P;1`Z|E{7^8w4{FkQ>e))