From c8ea4c55b3e743ceee9350a091fcd80d63023826 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 7 Jan 2022 22:43:49 +0000 Subject: [PATCH] Limelight, switched to bolted hands, redid screenshots --- apps/limelight/README.md | 1 + apps/limelight/limelight.app.js | 98 +++++++++++++++++------- apps/limelight/screenshot_gochihand.png | Bin 2332 -> 2452 bytes apps/limelight/screenshot_grenadier.png | Bin 2376 -> 2646 bytes apps/limelight/screenshot_limelight.png | Bin 2425 -> 2573 bytes apps/limelight/screenshot_monoton.png | Bin 3032 -> 2993 bytes 6 files changed, 71 insertions(+), 28 deletions(-) diff --git a/apps/limelight/README.md b/apps/limelight/README.md index f1cc52092..e84714403 100644 --- a/apps/limelight/README.md +++ b/apps/limelight/README.md @@ -6,6 +6,7 @@ * Selection of different fonts * Settings menu where you can select font, or switch to Vector font and try a range of sizes * 100 less lines of code, demonstrating that there is no need for a custom widget draw method +* Full screen options (widgets loaded but not displayed) ![](screenshot_gochihand.png) ![](screenshot_monoton.png) diff --git a/apps/limelight/limelight.app.js b/apps/limelight/limelight.app.js index 2d4ce5a43..20d79deeb 100644 --- a/apps/limelight/limelight.app.js +++ b/apps/limelight/limelight.app.js @@ -1,3 +1,14 @@ +/* + * Limelight analoguce clock with bolted hands + * Based on the work of @Andreas_Rozek + * [Simple_Clock](https://github.com/espruino/BangleApps/tree/master/apps/simple_clock) + * + * . Demonstrates simpler approach to establishing the available size of the appRect in relation + * to widgets, avoids having to take on the responsibility for managing the widget draw. + * . Demonstrates a settings menu and various configuration options + * . Demonstrates fullscreen verses, widgets and app area. + * + */ g.clear(); @@ -78,7 +89,7 @@ if (settings.fullscreen) { } function debug(o) { - console.log(o); + //console.log(o); } debug("limelight.app.js"); @@ -88,35 +99,54 @@ debug("outerRadius=" + outerRadius); debug("y12=" + (CenterY - outerRadius)); debug("y6=" + (CenterY + outerRadius)); -const HourHandLength = outerRadius * 0.5; -const HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; -const MinuteHandLength = outerRadius * 0.7; -const MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; -const SecondHandLength = outerRadius * 0.9; -const SecondHandOffset = 6; +let HourHandLength = outerRadius * 0.5; +let HourHandWidth = 2*5, halfHourHandWidth = HourHandWidth/2; -const twoPi = 2*Math.PI; -const Pi = Math.PI; -const halfPi = Math.PI/2; +let MinuteHandLength = outerRadius * 0.7; +let MinuteHandWidth = 2*3, halfMinuteHandWidth = MinuteHandWidth/2; -let HourHandPolygon = [ - -halfHourHandWidth,halfHourHandWidth, - -halfHourHandWidth,halfHourHandWidth-HourHandLength, - halfHourHandWidth,halfHourHandWidth-HourHandLength, - halfHourHandWidth,halfHourHandWidth, +let SecondHandLength = outerRadius * 0.9; +let SecondHandOffset = halfHourHandWidth + 10; + +let outerBoltRadius = halfHourHandWidth + 2, innerBoltRadius = outerBoltRadius - 4; +let HandOffset = outerBoltRadius + 4; + +let twoPi = 2*Math.PI, deg2rad = Math.PI/180; +let Pi = Math.PI; +let halfPi = Math.PI/2; + +let sin = Math.sin, cos = Math.cos; + +let sine = [0, sin(30*deg2rad), sin(60*deg2rad), 1]; + +let HandPolygon = [ + -sine[3],-sine[0], -sine[2],-sine[1], -sine[1],-sine[2], -sine[0],-sine[3], + sine[0],-sine[3], sine[1],-sine[2], sine[2],-sine[1], sine[3],-sine[0], + sine[3], sine[0], sine[2], sine[1], sine[1], sine[2], sine[0], sine[3], + -sine[0], sine[3], -sine[1], sine[2], -sine[2], sine[1], -sine[3], sine[0], ]; -let MinuteHandPolygon = [ - -halfMinuteHandWidth,halfMinuteHandWidth, - -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, - halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, - halfMinuteHandWidth,halfMinuteHandWidth, -]; +let HourHandPolygon = new Array(HandPolygon.length); +for (let i = 0, l = HandPolygon.length; i < l; i+=2) { + HourHandPolygon[i] = halfHourHandWidth*HandPolygon[i]; + HourHandPolygon[i+1] = halfHourHandWidth*HandPolygon[i+1]; + if (i < l/2) { HourHandPolygon[i+1] -= HourHandLength; } + if (i > l/2) { HourHandPolygon[i+1] += HandOffset; } +} +let MinuteHandPolygon = new Array(HandPolygon.length); +for (let i = 0, l = HandPolygon.length; i < l; i+=2) { + MinuteHandPolygon[i] = halfMinuteHandWidth*HandPolygon[i]; + MinuteHandPolygon[i+1] = halfMinuteHandWidth*HandPolygon[i+1]; + if (i < l/2) { MinuteHandPolygon[i+1] -= MinuteHandLength; } + if (i > l/2) { MinuteHandPolygon[i+1] += HandOffset; } +} -let transformedPolygon = new Array(HourHandPolygon.length); +/**** transforme polygon ****/ + +let transformedPolygon = new Array(HandPolygon.length); function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { - let sPhi = Math.sin(Phi), cPhi = Math.cos(Phi), x,y; + let sPhi = sin(Phi), cPhi = cos(Phi), x,y; for (let i = 0, l = originalPolygon.length; i < l; i+=2) { x = originalPolygon[i]; @@ -127,8 +157,11 @@ function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { } } -function drawHands () { +/**** draw clock hands ****/ + +function drawClockHands () { let now = new Date(); + let Hours = now.getHours() % 12; let Minutes = now.getMinutes(); let Seconds = now.getSeconds(); @@ -138,14 +171,17 @@ function drawHands () { let SecondsAngle = (Seconds/60) * twoPi - Pi; g.setColor(g.theme.fg); + transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); g.fillPoly(transformedPolygon); + transformPolygon(MinuteHandPolygon, CenterX,CenterY, MinutesAngle); g.fillPoly(transformedPolygon); + let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); + if (settings.secondhand) { - let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); - g.setColor('#FF0000'); + g.setColor(g.theme.fg2); g.drawLine( CenterX + SecondHandOffset*sPhi, CenterY - SecondHandOffset*cPhi, @@ -153,6 +189,13 @@ function drawHands () { CenterY + SecondHandLength*cPhi ); } + + g.setColor(g.theme.fg); + g.fillCircle(CenterX,CenterY, outerBoltRadius); + + g.setColor(g.theme.bg); + g.drawCircle(CenterX,CenterY, outerBoltRadius); + g.fillCircle(CenterX,CenterY, innerBoltRadius); } function setNumbersFont() { @@ -192,7 +235,7 @@ function draw() { g.setColor(g.theme.bg); g.fillRect(Bangle.appRect); - drawHands(); + drawClockHands(); drawNumbers(); queueDraw(); } @@ -216,6 +259,5 @@ Bangle.on('lcdPower',on=>{ } }); -loadSettings(); Bangle.setUI('clock'); draw(); diff --git a/apps/limelight/screenshot_gochihand.png b/apps/limelight/screenshot_gochihand.png index af405c0f8406505893cedcbac16da25ea1e27804..244b008dc2f56804bcb252a7f89dd49339c6e0f7 100644 GIT binary patch literal 2452 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 O2pnu&PtdK18UF>*lD-=N delta 2353 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 Ce0p>M literal 2425 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 BY>NN@ diff --git a/apps/limelight/screenshot_monoton.png b/apps/limelight/screenshot_monoton.png index d17d9bd26e9795c28c427f37ca8407db63b3f5b8..e75b11f5daaceca3fc7ee629ee942e822dca01bb 100644 GIT binary patch delta 2974 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