From 790d2a5ac0a8e319ccb7b6703cd365fe073acfcb Mon Sep 17 00:00:00 2001 From: Tom Wallroth Date: Mon, 8 Apr 2024 08:36:00 +0200 Subject: [PATCH 1/8] wip --- apps/lift/ChangeLog | 1 + apps/lift/README.md | 22 +++++++++++++++++++ apps/lift/app-icon.js | 1 + apps/lift/app.js | 45 +++++++++++++++++++++++++++++++++++++++ apps/lift/app.png | Bin 0 -> 3468 bytes apps/lift/metadata.json | 16 ++++++++++++++ apps/lift/screenshot.png | Bin 0 -> 2285 bytes 7 files changed, 85 insertions(+) create mode 100644 apps/lift/ChangeLog create mode 100644 apps/lift/README.md create mode 100644 apps/lift/app-icon.js create mode 100644 apps/lift/app.js create mode 100644 apps/lift/app.png create mode 100644 apps/lift/metadata.json create mode 100644 apps/lift/screenshot.png diff --git a/apps/lift/ChangeLog b/apps/lift/ChangeLog new file mode 100644 index 000000000..5453557bc --- /dev/null +++ b/apps/lift/ChangeLog @@ -0,0 +1 @@ +0.01: First Release diff --git a/apps/lift/README.md b/apps/lift/README.md new file mode 100644 index 000000000..12af8a9f4 --- /dev/null +++ b/apps/lift/README.md @@ -0,0 +1,22 @@ +# Guitar Songs + +Upload lyrics and chords to your BangleJS2. Play songs at the camp fire. + +![screenshot](screenshot.png) + +## Usage + +Install the app. Use the App Loader to add songs to the watch. + +You can scroll through the chords by dragging your finger left and right. + +You can scroll the lyrics by dragging it up and down. + +## Attribution + +[Fire icon created by Freepik - Flaticon](https://www.flaticon.com/free-icons/fire) + +## Credits + +Created by: devsnd +Inspired by: NovaDawn999 diff --git a/apps/lift/app-icon.js b/apps/lift/app-icon.js new file mode 100644 index 000000000..554372bb0 --- /dev/null +++ b/apps/lift/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwg967oABCaHQAYUNDCISBC4wfDC5gQCC4YYPC5BJOC65MFJCQXIGCIXGGAY0MC5K2EC54TCMhoWGC5YHEC5RBIIxREKC4gWHC5QLDFwXu9oXSCAXuDAoXILIYDD7wYBeJhxHC4QwEC6QwEaB4WCGAgXYDIxGKVQwXJLAQXESJYXGCYPjmYXPFYPtFwQXTAAczmc+C6fj+YXNa4QXEn//C43QC5kz/4XBMAPtVIQXM8YWBC4bBDC4xgCC4RFBC5AWGC4guDC55IBC4IuDC4xGHC5peJPAfdCQIAEVAdACglEABVDDAM97vUqgGBkUAggXLGAQXBotUCwM0oAWLC4cz6tUokyGANCIxwABooGBmkzmQuMoQXDDwQXBmgXMI4gGCmRFBoR3PFIYECVYJgOAwtEbQ4AoA")) diff --git a/apps/lift/app.js b/apps/lift/app.js new file mode 100644 index 000000000..930e75d3c --- /dev/null +++ b/apps/lift/app.js @@ -0,0 +1,45 @@ + +function roundRect (x1, y1, x2, y2, halfrad) { + const bgColor = g.getBgColor(); + const fgColor = g.getColor(); + g.fillRect(x1, y1, x2, y2); + g.setColor(bgColor); + g.fillRect(x1, y1, x1 + halfrad, y2 + halfrad); + g.setColor(fgColor); + g.fillEllipse(x1, y1, x1 + halfrad, y2 + halfrad); +} + +function drawApp() { + const R = Bangle.appRect; + + g.setFont('6x8').setColor(0x1).setFontAlign(-1, -1).drawString('lol', 1, 2); + g.drawLine(R.x, R.y2 / 2, R.x2, R.y2 / 2); + roundRect(R.x, R.y, R.x2/2, R.y2 / 2); +} + +function main() { + const R = Bangle.appRect; + g.clear(); + + Bangle.on('drag', (event) => { + g.clear(); + drawApp(); + }) +} + +// function mainMenu () { +// const songs = ( +// require("Storage").readJSON("guitar_songs.json", true) || +// [{'name': 'No songs', 'lyrics': 'Em\nPlease upload a song\nAm A7\nusing the Bangle App Loader', 'chords': ['Am', 'Em', 'A7']}] +// ); +// const menu = { +// "": {"title": "Guitar Songs"}, +// }; +// for (let i=0; iTA+aa!>*QK%<348(*pTzeNtY>gJ&1 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 R8cr4v;>+-0P7wC$e*uDaBkBME literal 0 HcmV?d00001 From abb6555137498099f9d8232297efa72df3102138 Mon Sep 17 00:00:00 2001 From: Tom Wallroth Date: Mon, 8 Apr 2024 23:30:52 +0200 Subject: [PATCH 2/8] v0.01 --- apps/lift/app-icon.js | 2 +- apps/lift/app.js | 323 ++++++++++++++++++++++++++++++++++---- apps/lift/app.png | Bin 3468 -> 6261 bytes apps/lift/metadata.json | 21 ++- apps/lift/screenshot.png | Bin 2285 -> 3971 bytes apps/lift/screenshot2.png | Bin 0 -> 2841 bytes apps/lift/screenshot3.png | Bin 0 -> 3250 bytes apps/lift/screenshot4.png | Bin 0 -> 2989 bytes 8 files changed, 302 insertions(+), 44 deletions(-) create mode 100644 apps/lift/screenshot2.png create mode 100644 apps/lift/screenshot3.png create mode 100644 apps/lift/screenshot4.png diff --git a/apps/lift/app-icon.js b/apps/lift/app-icon.js index 554372bb0..f335b8cb2 100644 --- a/apps/lift/app-icon.js +++ b/apps/lift/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwg967oABCaHQAYUNDCISBC4wfDC5gQCC4YYPC5BJOC65MFJCQXIGCIXGGAY0MC5K2EC54TCMhoWGC5YHEC5RBIIxREKC4gWHC5QLDFwXu9oXSCAXuDAoXILIYDD7wYBeJhxHC4QwEC6QwEaB4WCGAgXYDIxGKVQwXJLAQXESJYXGCYPjmYXPFYPtFwQXTAAczmc+C6fj+YXNa4QXEn//C43QC5kz/4XBMAPtVIQXM8YWBC4bBDC4xgCC4RFBC5AWGC4guDC55IBC4IuDC4xGHC5peJPAfdCQIAEVAdACglEABVDDAM97vUqgGBkUAggXLGAQXBotUCwM0oAWLC4cz6tUokyGANCIxwABooGBmkzmQuMoQXDDwQXBmgXMI4gGCmRFBoR3PFIYECVYJgOAwtEbQ4AoA")) +require("heatshrink").decompress(atob("mEwgf/ABH7tu27YCCCBP+BwYCCv4RI+wRGt4RQtoLCgEPCIYLCLIUWCOO0gEtI5wR/COoABj6hOAAMDCL4AFCIQCFCJH2CLFvCJH+CKH/CI1/CJI/OBAX0yVJkgCBl///pgF24IBBwQCD3/tQ43/9IRGy4RH74RISwwRBBwgCDBwTOChoRDyAICgIRQhIRXmxHGpEAiRHGCKI1GCNxZjCP4RGAQgRDAQoRI9IRH9oRPy/9CI3//oRG3//CIoHB//0CIkl/4=")) diff --git a/apps/lift/app.js b/apps/lift/app.js index 930e75d3c..04d527a8f 100644 --- a/apps/lift/app.js +++ b/apps/lift/app.js @@ -1,45 +1,304 @@ function roundRect (x1, y1, x2, y2, halfrad) { + const fullrad = halfrad + halfrad const bgColor = g.getBgColor(); const fgColor = g.getColor(); g.fillRect(x1, y1, x2, y2); - g.setColor(bgColor); - g.fillRect(x1, y1, x1 + halfrad, y2 + halfrad); - g.setColor(fgColor); - g.fillEllipse(x1, y1, x1 + halfrad, y2 + halfrad); + g.setColor(bgColor).fillRect(x1, y1, x1 + halfrad, y1 + halfrad); + g.setColor(fgColor).fillEllipse(x1, y1, x1 + fullrad, y1 + fullrad); + g.setColor(bgColor).fillRect(x2 - halfrad, y1, x2, y1 + halfrad); + g.setColor(fgColor).fillEllipse(x2 - fullrad, y1, x2, y1 + fullrad); + + g.setColor(bgColor).fillRect(x1, y2-halfrad, x1 + halfrad, y2); + g.setColor(fgColor).fillEllipse(x1, y2-fullrad, x1 + fullrad, y2); + g.setColor(bgColor).fillRect(x2 - halfrad, y2-halfrad, x2, y2); + g.setColor(fgColor).fillEllipse(x2 - fullrad, y2-fullrad, x2, y2); } -function drawApp() { - const R = Bangle.appRect; - - g.setFont('6x8').setColor(0x1).setFontAlign(-1, -1).drawString('lol', 1, 2); - g.drawLine(R.x, R.y2 / 2, R.x2, R.y2 / 2); - roundRect(R.x, R.y, R.x2/2, R.y2 / 2); +function center(r) { + return {x: r.x + (r.x2 - r.x)/2, y: r.y + (r.y2 - r.y)/2} +} +function inRect(r, xy) { + return xy.x >= r.x && xy.x <= r.x2 && xy.y >= r.y && xy.y <= r.y2; } -function main() { - const R = Bangle.appRect; +let restSeconds = 60; +let setsCount = 3; + +let currentSet = 1; +let restUntil = 0; + + +const R = Bangle.appRect; +const spacing = 2; +const q1 = {x: R.x, y: R.y, x2: R.x2/2 - spacing, y2: R.y2 / 2 - spacing}; +const q2 = {x: R.x2/2 + spacing, y: R.y, x2: R.x2, y2: R.y2 / 2 - spacing}; +const q3 = {x: R.x, y: R.y2/2 + spacing, x2: R.x2/2 - spacing, y2: R.y2}; +const q4 = {x: R.x2/2 + spacing, y: R.y2/2 + spacing, x2: R.x2, y2: R.y2}; +const quadrants = [q1,q2,q3,q4]; +const c1 = center(q1) +const c2 = center(q2) +const c3 = center(q3) +const c4 = center(q4) + +const SET_COLOR = '#880088'; +const REST_COLOR = '#008888'; + +function drawMainMenu() { + g.setBgColor(-1).clear(); + g.setColor('#888888'); + roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); + g.setColor(SET_COLOR); + roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); + g.setColor(REST_COLOR); + roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); + g.setColor('#008800'); + roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); + g.setColor(-1) + g.setFont("Vector:25").setFontAlign(0,0).drawString("Lift", c1.x, c1.y) + g.setFont("6x8").drawString("Tap to\nConfigure", c2.x, c2.y-25) + g.setFont("Vector:25").setFontAlign(0,0).drawString("Sets\n" + setsCount, c2.x, c2.y + 10) + g.setFont("6x8").drawString("Tap to\nConfigure", c3.x, c3.y-25) + g.setFont("Vector:25").setFontAlign(0,0).drawString("Rest\n" +restSeconds+ "s", c3.x, c3.y + 10) + g.setFont("Vector:25").setFontAlign(0,0).drawString("Go", c4.x, c4.y) +} + +function drawSetRest() { + g.setBgColor(-1).clear(); + g.setColor('#888888'); + roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); + g.setColor(REST_COLOR); + roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); + g.setColor('#880000'); + roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); + g.setColor('#008800'); + roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); + g.setColor(-1) + g.setFont("Vector:25").setFontAlign(0,0).drawString("OK", c1.x, c1.y) + g.setFont("Vector:25").setFontAlign(0,0).drawString("Rest\n" +restSeconds+ "s", c2.x, c2.y) + g.setFont("Vector:25").setFontAlign(0,0).drawString("-", c3.x, c3.y) + g.setFont("Vector:25").setFontAlign(0,0).drawString("+", c4.x, c4.y) +} + +function drawSetSets() { + g.setBgColor(-1).clear(); + g.setColor('#888888'); + roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); + g.setColor(SET_COLOR); + roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); + g.setColor('#880000'); + roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); + g.setColor('#008800'); + roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); + g.setColor(-1) + g.setFont("Vector:25").setFontAlign(0,0).drawString("OK", c1.x, c1.y) + g.setFont("Vector:25").setFontAlign(0,0).drawString("Sets\n" +setsCount, c2.x, c2.y) + g.setFont("Vector:25").setFontAlign(0,0).drawString("-", c3.x, c3.y) + g.setFont("Vector:25").setFontAlign(0,0).drawString("+", c4.x, c4.y) +} + +function drawExercise() { + g.setBgColor(-1).clear(); + g.setColor('#000000'); + roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); + g.setColor(SET_COLOR); + roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); + g.setColor('#000000'); + roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); + // g.setColor('#FF0000'); + // roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); + g.setColor(-1); + g.setFont("Vector:15").setFontAlign(0,0).drawString("START", c1.x, c1.y) + g.setColor(-1); + g.setFont("Vector:25").setFontAlign(0,0).drawString("Set\n#"+currentSet, c2.x, c2.y) + g.setColor(-1); + g.setFont("Vector:15").setFontAlign(0,0).drawString("EXERCISE", c3.x, c3.y) + g.setColor(0); + g.setFont("6x8").drawString("Push button \nwhen done ->", c4.x, c4.y) +} + +function circlePoints (cx, cy, r, points) { + let circlePoints = []; + for (let i=0; i> 1) << 1 + const poly = [c3.x, c3.y].concat(smallQ3Circle.slice(0, circleParts)) + g.setColor(REST_COLOR); + g.fillPoly(poly); + + g.setColor(0); + g.setFont("6x8").drawString("Push button\nto skip ->", c4.x, c4.y); + + if (secondsRemaining > 0) { + const renderTime = Date.now() - start; + if (secondsRemaining < 3) { + Bangle.buzz(); + } + setTimeout(redrawApp, Math.max(10, 1000 - renderTime)); + } else { + Bangle.buzz(1000); + currentSet += 1; + if (currentSet > setsCount) { + currentSet = 1; + mode = MAIN_MENU; + } else { + mode = EXERCISE; + } + redrawApp(); + } +} + +function drawDoIt() { + g.setBgColor('#00FF00').clear(); + g.drawImage(getImg(), 44, 44); + g.setFont("Vector:25") + g.setColor(0); + g.drawString('just', 40, 20); + Bangle.buzz(100, 0.5); + setTimeout(() => { + g.drawString('DO', 100, 20); + Bangle.buzz(200); + }, 1000); + setTimeout(() => { + g.drawString('IT', 150, 20); + Bangle.buzz(200); + }, 1100); + setTimeout(() => { + mode = MAIN_MENU; + redrawApp(); + }, 2000); +} + +const MAIN_MENU = 'MAIN_MENU'; +const SET_REST = 'SET_REST'; +const SET_SETS = 'SET_SETS'; +const EXERCISE = 'EXERCISE'; +const REST = 'REST'; +const DOIT = 'DOIT'; + +let mode = MAIN_MENU; + +function getImg() { + return require("heatshrink").decompress(atob("rFYwcBpMkyQCB6QFDmnStsk6dpmmatO2AoMm7VpkmapMm6Vp02TEAmSCIIFB2mbEYPbtu07VJmwFCzYRD0gdB0gmBEAgCCtoOBtIOBIIPTpo1BHwJQCAQMmydNI4RBFLIILDmnaps2L4Om7ZEBI4IgCAQNN0g+GJQKJDKwIaB0iJCJQQmBCgWmHAIdEHYKnFDQSbBkBcE0wOBFgImBSoMmQZJTE6VAbYMJPQRHBDQKMBmmTtoUCEBPSJQT8CgKPCcAJQEIILFHMohxDEAUANwZ9E0wdBUhDLGyAgDO4LIByYOBAQLpEL45KEm2AQIMkwEEYQZTB7Vt23TC4wCHCgOAgRUBEAL+CzVtkwRCHw4CJEANNm2QggXEX4jpBIJgCBgESOoKHB6RiByYCBDQSGCMoIdJHAQgCkmCgALCZALpCd4RiNYoKkCkESpC8CEYm2QByDDgEBkETpBWDtukKYZBOHAKkBgIGBIIRNC0wFEIKCDCyVEBASbLAReQEAXSghKCzQ7BQYIgUoAGBEARuDIKmSgAAByAgFASwgCgALFmikUEBRBYgggcwBBDtDrDASwfDgFIgAgYkAfDgVAgEJECw6BAAcSEAKGXDIUAhEgZIcEYS4ABAwwgUyAgFAwjIUDIifBdQggUDIkBZIjKBECYZEAA4gSHQogoRYIgQD5gghgIgQpAg/QeAgRQcNAggeLECQDBwAgryIgTxAgKwAgQpQgKgMhkmQIKcIIJEgEA+kEBNApMgdJBhBgkQIKFCpMAEBUAMQ+aIJUioAgKIItpIJkCEBEAIJIgKhIgMyRBFmikLMRMAgkEEAmTUhogRARlAhIggkAgLUiNIpMgD5AgWXQIgcpMJED8BEBmAED0kwIgRkAgLkAgSkMkwAhKxIgRkgggXIIcFgIEDaYIgRwggGgBKDECcEyVAgEQEIkSpIgUgADCQwzSBEC0gD4pBBkQdQDgYgIBAIgVHAJFBcYgMBgQgUPQIgFFINIBQQgQTYYgfXQIgFFYggPGgIVCgmQDogFCECr8CII4KCECUBED4AKFYQgOoAYFggIGEC4XDEDgLDkAgVD4kCBYgKEECsSBYmAEDILFEEGQEBYA==")); +} + +const onTouchPerQuadrantPerMode = { + // mode -> [[nextMode on touch, custom function], ... for all quadrants] + MAIN_MENU: [ + [DOIT, null], + [SET_SETS, null], + [SET_REST, null], + [EXERCISE, null] + ], + SET_REST: [ + [MAIN_MENU, Bangle.buzz], + [null, null], + [null, () => { + restSeconds = Math.min(120, Math.max(0, restSeconds - 15)); + }], + [null, () => { + restSeconds = Math.min(120, Math.max(0, restSeconds + 15)); + }], + ], + SET_SETS: [ + [MAIN_MENU, Bangle.buzz], + [null, null], + [null, () => { + setsCount = Math.min(15, Math.max(0, setsCount - 1)); + }], + [null, () => { + setsCount = Math.min(15, Math.max(0, setsCount + 1)); + }], + ], + EXERCISE: [ + [null, null], + [null, null], + [null, null], + [null, null], + ], + REST: [ + [null, null], + [null, null], + [null, null], + [null, null], + ] +} + +const drawFuncPerMode = { + MAIN_MENU: drawMainMenu, + SET_REST: drawSetRest, + SET_SETS: drawSetSets, + EXERCISE: drawExercise, + REST: drawRest, + DOIT: drawDoIt, +} + +function redrawApp(){ g.clear(); - - Bangle.on('drag', (event) => { - g.clear(); - drawApp(); - }) + drawFuncPerMode[mode](); } -// function mainMenu () { -// const songs = ( -// require("Storage").readJSON("guitar_songs.json", true) || -// [{'name': 'No songs', 'lyrics': 'Em\nPlease upload a song\nAm A7\nusing the Bangle App Loader', 'chords': ['Am', 'Em', 'A7']}] -// ); -// const menu = { -// "": {"title": "Guitar Songs"}, -// }; -// for (let i=0; i { + for (let qidx=0; qidx<4; qidx++) { + if (inRect(quadrants[qidx], xy)) { + const nextMode = onTouchPerQuadrantPerMode[mode][qidx][0]; + const func = onTouchPerQuadrantPerMode[mode][qidx][1]; + if (func) { + func(); + } + if (nextMode) { + mode = nextMode; + redrawApp(); + } + return; + } + } +}); + +Bangle.loadWidgets(); +redrawApp(); -main(); diff --git a/apps/lift/app.png b/apps/lift/app.png index d48a062688fe461638821725e4344862f27cb5ca..c87417289267678ba22d817a5e4293c5eb3ff311 100644 GIT binary patch literal 6261 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 M^IE48hfO>F57cy)W&i*H literal 3468 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 R8cr4v;>+-0P7wC$e*uDaBkBME diff --git a/apps/lift/screenshot2.png b/apps/lift/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..e9779b94e7c1d8a48300d2ead5c0274147fe542c GIT binary patch literal 2841 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 W-4udQq;mTXz~Zvar8=xv(tiL;E%6or literal 0 HcmV?d00001 diff --git a/apps/lift/screenshot4.png b/apps/lift/screenshot4.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d655d09d49d160e3dcaf78034dffe4d56b0530 GIT binary patch literal 2989 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 Date: Mon, 8 Apr 2024 23:52:54 +0200 Subject: [PATCH 3/8] wip --- apps/lift/README.md | 16 +++++----------- apps/lift/{app.js => lift.app.js} | 0 apps/lift/metadata.json | 6 +++--- 3 files changed, 8 insertions(+), 14 deletions(-) rename apps/lift/{app.js => lift.app.js} (100%) diff --git a/apps/lift/README.md b/apps/lift/README.md index 12af8a9f4..b9e3e7a5d 100644 --- a/apps/lift/README.md +++ b/apps/lift/README.md @@ -1,22 +1,16 @@ -# Guitar Songs +# Lift -Upload lyrics and chords to your BangleJS2. Play songs at the camp fire. +An app to keep track of your sets when lifting things and to keep track of your rest when not lifting things. ![screenshot](screenshot.png) ## Usage -Install the app. Use the App Loader to add songs to the watch. +Install the app. Set the number of sets and the rest between sets. Once you tap "GO" the app is only +operated using the physical button on the watch, to avoid accidental touches during workout. -You can scroll through the chords by dragging your finger left and right. - -You can scroll the lyrics by dragging it up and down. - -## Attribution - -[Fire icon created by Freepik - Flaticon](https://www.flaticon.com/free-icons/fire) +The watch will vibrate to let you know when your rest time is up. ## Credits Created by: devsnd -Inspired by: NovaDawn999 diff --git a/apps/lift/app.js b/apps/lift/lift.app.js similarity index 100% rename from apps/lift/app.js rename to apps/lift/lift.app.js diff --git a/apps/lift/metadata.json b/apps/lift/metadata.json index b5d2ae34e..0c14df0c1 100644 --- a/apps/lift/metadata.json +++ b/apps/lift/metadata.json @@ -1,15 +1,15 @@ { "id": "lift", - "name": "Lift Workout App", + "name": "Lift - Workout Timer App", "shortName":"Lift", "version": "0.01", "description": "Rest and Set counter for workout, fitness and lifting things.", "icon": "app.png", "screenshots": [{"url": "screenshot.png"}, {"url": "screenshot2.png"}, {"url": "screenshot3.png"}, {"url": "screenshot4.png"}], - "tags": "workout, weight lifting, rest, fitness", + "tags": "workout,weight lifting,rest,fitness,timer", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ - {"name":"app.js","url":"app.js"}, + {"name":"lift.app.js","url":"lift.app.js"}, {"name":"lift.img","url":"app-icon.js","evaluate":true} ] } From 6398d6b6d2ecf7c8fa31c663040131f5d03a5e2e Mon Sep 17 00:00:00 2001 From: Tom Wallroth Date: Tue, 9 Apr 2024 20:42:36 +0200 Subject: [PATCH 4/8] wip --- apps/lift/lift.app.js | 203 ++++++++++++++++++++---------------------- 1 file changed, 98 insertions(+), 105 deletions(-) diff --git a/apps/lift/lift.app.js b/apps/lift/lift.app.js index 04d527a8f..e779a2908 100644 --- a/apps/lift/lift.app.js +++ b/apps/lift/lift.app.js @@ -16,7 +16,7 @@ function roundRect (x1, y1, x2, y2, halfrad) { } function center(r) { - return {x: r.x + (r.x2 - r.x)/2, y: r.y + (r.y2 - r.y)/2} + return {x: r.x + (r.x2 - r.x)/2 + 1, y: r.y + (r.y2 - r.y)/2 + 1} } function inRect(r, xy) { return xy.x >= r.x && xy.x <= r.x2 && xy.y >= r.y && xy.y <= r.y2; @@ -28,93 +28,90 @@ let setsCount = 3; let currentSet = 1; let restUntil = 0; +Bangle.loadWidgets(); +const m = 2; // margin const R = Bangle.appRect; -const spacing = 2; -const q1 = {x: R.x, y: R.y, x2: R.x2/2 - spacing, y2: R.y2 / 2 - spacing}; -const q2 = {x: R.x2/2 + spacing, y: R.y, x2: R.x2, y2: R.y2 / 2 - spacing}; -const q3 = {x: R.x, y: R.y2/2 + spacing, x2: R.x2/2 - spacing, y2: R.y2}; -const q4 = {x: R.x2/2 + spacing, y: R.y2/2 + spacing, x2: R.x2, y2: R.y2}; +const r = {x:R.x+m, x2:R.x2-m, y:R.y+m, y2:R.y2-m}; +const s = 2; // spacing +const h = r.y2 - r.y; +const w = r.x2 - r.x; +const cx = r.x + w/2; // center x +const cy = r.y + h/2; // center y +const q1 = {x: r.x, y: r.y, x2: cx - s, y2: cy - s}; +const q2 = {x: cx + s, y: r.y, x2: r.x2, y2: cy - s}; +const q3 = {x: r.x, y: cy + s, x2: cx - s, y2: r.y2}; +const q4 = {x: cx + s, y: cy + s, x2: r.x2, y2: r.y2}; const quadrants = [q1,q2,q3,q4]; const c1 = center(q1) const c2 = center(q2) const c3 = center(q3) const c4 = center(q4) -const SET_COLOR = '#880088'; -const REST_COLOR = '#008888'; +const GREY_COLOR = '#CCCCCC'; +const SET_COLOR = '#FF00FF'; +const REST_COLOR = '#00FFFF'; +const REST_COLOR_MUTED = '#008888'; +const RED_COLOR = '#FF0000'; +const GREEN_COLOR = '#00FF00'; +const GREEN_COLOR_MUTED = '#008800'; +const BIG_FONT = "6x8:2x2"; function drawMainMenu() { - g.setBgColor(-1).clear(); - g.setColor('#888888'); + g.setColor(REST_COLOR); roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); g.setColor(SET_COLOR); roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); - g.setColor(REST_COLOR); + g.setColor(GREY_COLOR); roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); - g.setColor('#008800'); + g.setColor(GREEN_COLOR); roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); g.setColor(-1) - g.setFont("Vector:25").setFontAlign(0,0).drawString("Lift", c1.x, c1.y) - g.setFont("6x8").drawString("Tap to\nConfigure", c2.x, c2.y-25) - g.setFont("Vector:25").setFontAlign(0,0).drawString("Sets\n" + setsCount, c2.x, c2.y + 10) - g.setFont("6x8").drawString("Tap to\nConfigure", c3.x, c3.y-25) - g.setFont("Vector:25").setFontAlign(0,0).drawString("Rest\n" +restSeconds+ "s", c3.x, c3.y + 10) - g.setFont("Vector:25").setFontAlign(0,0).drawString("Go", c4.x, c4.y) + g.setFont("6x8").setFontAlign(0,0).drawString("Tap to\nConfigure", c1.x, c1.y-25) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("REST\n" +restSeconds+ "s", c1.x, c1.y + 10) + g.setFont("6x8").setFontAlign(0,0).drawString("Tap to\nConfigure", c2.x, c2.y-25) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("SETS\n" + setsCount, c2.x, c2.y + 10) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("Lift", c3.x, c3.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("GO", c4.x, c4.y) } function drawSetRest() { - g.setBgColor(-1).clear(); - g.setColor('#888888'); - roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); g.setColor(REST_COLOR); - roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); - g.setColor('#880000'); + roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); + g.setColor(RED_COLOR); roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); - g.setColor('#008800'); + g.setColor(GREEN_COLOR); roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); g.setColor(-1) - g.setFont("Vector:25").setFontAlign(0,0).drawString("OK", c1.x, c1.y) - g.setFont("Vector:25").setFontAlign(0,0).drawString("Rest\n" +restSeconds+ "s", c2.x, c2.y) - g.setFont("Vector:25").setFontAlign(0,0).drawString("-", c3.x, c3.y) - g.setFont("Vector:25").setFontAlign(0,0).drawString("+", c4.x, c4.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("REST\n" +restSeconds+ "s", c1.x, c1.y) + // g.setFont(BIG_FONT).setFontAlign(0,0).drawString("OK", c2.x, c2.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("-", c3.x, c3.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("+", c4.x, c4.y) } function drawSetSets() { - g.setBgColor(-1).clear(); - g.setColor('#888888'); - roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); g.setColor(SET_COLOR); roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); - g.setColor('#880000'); + g.setColor(RED_COLOR); roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); - g.setColor('#008800'); + g.setColor(GREEN_COLOR); roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); g.setColor(-1) - g.setFont("Vector:25").setFontAlign(0,0).drawString("OK", c1.x, c1.y) - g.setFont("Vector:25").setFontAlign(0,0).drawString("Sets\n" +setsCount, c2.x, c2.y) - g.setFont("Vector:25").setFontAlign(0,0).drawString("-", c3.x, c3.y) - g.setFont("Vector:25").setFontAlign(0,0).drawString("+", c4.x, c4.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("SETS\n" +setsCount, c2.x, c2.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("-", c3.x, c3.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("+", c4.x, c4.y) } function drawExercise() { - g.setBgColor(-1).clear(); - g.setColor('#000000'); + g.setColor(REST_COLOR_MUTED); roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); g.setColor(SET_COLOR); roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); - g.setColor('#000000'); - roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); - // g.setColor('#FF0000'); - // roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); + g.setColor(GREEN_COLOR_MUTED); + roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); g.setColor(-1); - g.setFont("Vector:15").setFontAlign(0,0).drawString("START", c1.x, c1.y) - g.setColor(-1); - g.setFont("Vector:25").setFontAlign(0,0).drawString("Set\n#"+currentSet, c2.x, c2.y) - g.setColor(-1); - g.setFont("Vector:15").setFontAlign(0,0).drawString("EXERCISE", c3.x, c3.y) - g.setColor(0); - g.setFont("6x8").drawString("Push button \nwhen done ->", c4.x, c4.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("SET\n#"+currentSet, c2.x, c2.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("PUSH >\nBUTTON\nWHEN\nDONE", c4.x, c4.y) } function circlePoints (cx, cy, r, points) { @@ -126,51 +123,47 @@ function circlePoints (cx, cy, r, points) { return circlePoints; } -const smallQ3Circle = circlePoints(c3.x, c3.y, (q1.x - q1.x2)/2, 60); +const smallQ3Circle = [c2.x, c2.y].concat(circlePoints(c2.x, c2.y, (q2.y - q2.y2)/2, 60)); function drawRest() { const start = Date.now(); const secondsRemaining = Math.max(0, ((restUntil - Date.now()) / 1000) | 0); - g.setBgColor(-1).clear(); - g.setColor('#888888'); - roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); g.setColor(REST_COLOR); - roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); - // g.setColor('#888888'); - // roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); - // g.setColor('#FFFFFF'); - // roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); - - g.setColor(-1); - g.setFont("Vector:25").setFontAlign(0,0).drawString("REST", c1.x, c1.y) - g.setColor(-1); - g.setFont("Vector:25").setFontAlign(0,0).drawString(secondsRemaining, c2.x, c2.y) + roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); + g.setColor(-1).setFont(BIG_FONT).setFontAlign(0,0).drawString(secondsRemaining, c1.x, c1.y) const factor = 1 - secondsRemaining / restSeconds; const circleParts = (((factor * smallQ3Circle.length) | 0) >> 1) << 1 - const poly = [c3.x, c3.y].concat(smallQ3Circle.slice(0, circleParts)) - g.setColor(REST_COLOR); + const poly = smallQ3Circle.slice(0, circleParts + 2) + g.setColor(SET_COLOR); g.fillPoly(poly); + g.setColor(GREY_COLOR); + roundRect(q3.x, q3.y, q3.x2, q3.y2, 20); + g.setColor(-1).setFont(BIG_FONT).setFontAlign(0,0).drawString("REST", c3.x, c3.y) + g.setColor(0); g.setFont("6x8").drawString("Push button\nto skip ->", c4.x, c4.y); if (secondsRemaining > 0) { - const renderTime = Date.now() - start; - if (secondsRemaining < 3) { - Bangle.buzz(); + if (secondsRemaining < 5) { + if (secondsRemaining > 1) { + Bangle.buzz(100); + } else { + Bangle.buzz(1000); + } } + const renderTime = Date.now() - start; setTimeout(redrawApp, Math.max(10, 1000 - renderTime)); } else { - Bangle.buzz(1000); currentSet += 1; if (currentSet > setsCount) { currentSet = 1; - mode = MAIN_MENU; + setMode(MAIN_MENU); } else { - mode = EXERCISE; + setMode(EXERCISE); } redrawApp(); } @@ -179,20 +172,23 @@ function drawRest() { function drawDoIt() { g.setBgColor('#00FF00').clear(); g.drawImage(getImg(), 44, 44); - g.setFont("Vector:25") + g.setFont(BIG_FONT) g.setColor(0); - g.drawString('just', 40, 20); - Bangle.buzz(100, 0.5); setTimeout(() => { + g.drawString('just', 40, 20); + Bangle.buzz(150, 0.5); + }, 200); + setTimeout(() => { + g.drawImage(getImg(), 22, 44, {scale: 1.5}); g.drawString('DO', 100, 20); Bangle.buzz(200); }, 1000); setTimeout(() => { g.drawString('IT', 150, 20); Bangle.buzz(200); - }, 1100); + }, 1300); setTimeout(() => { - mode = MAIN_MENU; + setMode(MAIN_MENU); redrawApp(); }, 2000); } @@ -205,6 +201,11 @@ const REST = 'REST'; const DOIT = 'DOIT'; let mode = MAIN_MENU; +let lastRender = MAIN_MENU; + +function setMode(newMode){ + mode = newMode; +} function getImg() { return require("heatshrink").decompress(atob("rFYwcBpMkyQCB6QFDmnStsk6dpmmatO2AoMm7VpkmapMm6Vp02TEAmSCIIFB2mbEYPbtu07VJmwFCzYRD0gdB0gmBEAgCCtoOBtIOBIIPTpo1BHwJQCAQMmydNI4RBFLIILDmnaps2L4Om7ZEBI4IgCAQNN0g+GJQKJDKwIaB0iJCJQQmBCgWmHAIdEHYKnFDQSbBkBcE0wOBFgImBSoMmQZJTE6VAbYMJPQRHBDQKMBmmTtoUCEBPSJQT8CgKPCcAJQEIILFHMohxDEAUANwZ9E0wdBUhDLGyAgDO4LIByYOBAQLpEL45KEm2AQIMkwEEYQZTB7Vt23TC4wCHCgOAgRUBEAL+CzVtkwRCHw4CJEANNm2QggXEX4jpBIJgCBgESOoKHB6RiByYCBDQSGCMoIdJHAQgCkmCgALCZALpCd4RiNYoKkCkESpC8CEYm2QByDDgEBkETpBWDtukKYZBOHAKkBgIGBIIRNC0wFEIKCDCyVEBASbLAReQEAXSghKCzQ7BQYIgUoAGBEARuDIKmSgAAByAgFASwgCgALFmikUEBRBYgggcwBBDtDrDASwfDgFIgAgYkAfDgVAgEJECw6BAAcSEAKGXDIUAhEgZIcEYS4ABAwwgUyAgFAwjIUDIifBdQggUDIkBZIjKBECYZEAA4gSHQogoRYIgQD5gghgIgQpAg/QeAgRQcNAggeLECQDBwAgryIgTxAgKwAgQpQgKgMhkmQIKcIIJEgEA+kEBNApMgdJBhBgkQIKFCpMAEBUAMQ+aIJUioAgKIItpIJkCEBEAIJIgKhIgMyRBFmikLMRMAgkEEAmTUhogRARlAhIggkAgLUiNIpMgD5AgWXQIgcpMJED8BEBmAED0kwIgRkAgLkAgSkMkwAhKxIgRkgggXIIcFgIEDaYIgRwggGgBKDECcEyVAgEQEIkSpIgUgADCQwzSBEC0gD4pBBkQdQDgYgIBAIgVHAJFBcYgMBgQgUPQIgFFINIBQQgQTYYgfXQIgFFYggPGgIVCgmQDogFCECr8CII4KCECUBED4AKFYQgOoAYFggIGEC4XDEDgLDkAgVD4kCBYgKEECsSBYmAEDILFEEGQEBYA==")); @@ -213,42 +214,38 @@ function getImg() { const onTouchPerQuadrantPerMode = { // mode -> [[nextMode on touch, custom function], ... for all quadrants] MAIN_MENU: [ - [DOIT, null], - [SET_SETS, null], - [SET_REST, null], - [EXERCISE, null] + [SET_REST, null], [SET_SETS, null], + [DOIT, null], [EXERCISE, null] ], SET_REST: [ - [MAIN_MENU, Bangle.buzz], - [null, null], + [MAIN_MENU, Bangle.buzz], [null, null], [null, () => { restSeconds = Math.min(120, Math.max(0, restSeconds - 15)); + Bangle.buzz(100); }], [null, () => { restSeconds = Math.min(120, Math.max(0, restSeconds + 15)); + Bangle.buzz(100); }], ], SET_SETS: [ - [MAIN_MENU, Bangle.buzz], - [null, null], + [null, null], [MAIN_MENU, Bangle.buzz], [null, () => { setsCount = Math.min(15, Math.max(0, setsCount - 1)); + Bangle.buzz(100); }], [null, () => { setsCount = Math.min(15, Math.max(0, setsCount + 1)); + Bangle.buzz(100); }], ], EXERCISE: [ - [null, null], - [null, null], - [null, null], - [null, null], + [null, null], [null, null], + [null, null], [null, null], ], REST: [ - [null, null], - [null, null], - [null, null], - [null, null], + [null, null], [null, null], + [null, null], [null, null], ] } @@ -262,13 +259,15 @@ const drawFuncPerMode = { } function redrawApp(){ - g.clear(); + g.setBgColor(-1).clear(); + Bangle.drawWidgets(); drawFuncPerMode[mode](); + lastRender = mode; } function buttonPress () { if (mode === EXERCISE) { - mode = REST; + setMode(REST); restUntil = Date.now() + (restSeconds * 1000); redrawApp(); return; @@ -280,25 +279,19 @@ function buttonPress () { } } -setWatch(buttonPress, BTN, { repeat: true}); +setWatch(buttonPress, BTN, { repeat: true, debounce: 25}); Bangle.on('touch', (button, xy) => { for (let qidx=0; qidx<4; qidx++) { if (inRect(quadrants[qidx], xy)) { const nextMode = onTouchPerQuadrantPerMode[mode][qidx][0]; const func = onTouchPerQuadrantPerMode[mode][qidx][1]; - if (func) { - func(); - } - if (nextMode) { - mode = nextMode; - redrawApp(); - } - return; + if (func) func(); + if (nextMode) setMode(nextMode); + redrawApp(); } } }); -Bangle.loadWidgets(); redrawApp(); From e2c7116fad5bbd408669f370049192248b76296e Mon Sep 17 00:00:00 2001 From: Tom Wallroth Date: Wed, 10 Apr 2024 22:00:41 +0200 Subject: [PATCH 5/8] wip --- apps/lift/app-icon.js | 1 - apps/lift/app.png | Bin 6261 -> 0 bytes apps/lift/metadata.json | 15 ----- apps/lift/screenshot.png | Bin 3971 -> 0 bytes apps/lift/screenshot2.png | Bin 2841 -> 0 bytes apps/lift/screenshot3.png | Bin 3250 -> 0 bytes apps/lift/screenshot4.png | Bin 2989 -> 0 bytes apps/{lift => rest}/ChangeLog | 0 apps/{lift => rest}/README.md | 6 +- apps/rest/app-icon.js | 1 + apps/rest/app.png | Bin 0 -> 5761 bytes apps/rest/metadata.json | 15 +++++ apps/{lift/lift.app.js => rest/rest.app.js} | 63 ++++++++++++++------ apps/rest/screenshot2.png | Bin 0 -> 2809 bytes apps/rest/screenshot3.png | Bin 0 -> 2589 bytes 15 files changed, 63 insertions(+), 38 deletions(-) delete mode 100644 apps/lift/app-icon.js delete mode 100644 apps/lift/app.png delete mode 100644 apps/lift/metadata.json delete mode 100644 apps/lift/screenshot.png delete mode 100644 apps/lift/screenshot2.png delete mode 100644 apps/lift/screenshot3.png delete mode 100644 apps/lift/screenshot4.png rename apps/{lift => rest}/ChangeLog (100%) rename apps/{lift => rest}/README.md (66%) create mode 100644 apps/rest/app-icon.js create mode 100644 apps/rest/app.png create mode 100644 apps/rest/metadata.json rename apps/{lift/lift.app.js => rest/rest.app.js} (79%) create mode 100644 apps/rest/screenshot2.png create mode 100644 apps/rest/screenshot3.png diff --git a/apps/lift/app-icon.js b/apps/lift/app-icon.js deleted file mode 100644 index f335b8cb2..000000000 --- a/apps/lift/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwgf/ABH7tu27YCCCBP+BwYCCv4RI+wRGt4RQtoLCgEPCIYLCLIUWCOO0gEtI5wR/COoABj6hOAAMDCL4AFCIQCFCJH2CLFvCJH+CKH/CI1/CJI/OBAX0yVJkgCBl///pgF24IBBwQCD3/tQ43/9IRGy4RH74RISwwRBBwgCDBwTOChoRDyAICgIRQhIRXmxHGpEAiRHGCKI1GCNxZjCP4RGAQgRDAQoRI9IRH9oRPy/9CI3//oRG3//CIoHB//0CIkl/4=")) diff --git a/apps/lift/app.png b/apps/lift/app.png deleted file mode 100644 index c87417289267678ba22d817a5e4293c5eb3ff311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6261 zcmeHLcT`i^_6|)kfTAExABMmn#q@*}Dbj=>QF;?cQz1eMNgxCiMMXpuL4SWrYAq^O`01QC@{e>VZ!`n|Q@a;^9NGs)rXd(L;iv-fxQ+2JP1W37t@ z*Z>Ryfi%djPF_Hdlr_~kz+ZpG_lZE)#S9>`$YcwUDsTZH6_h~=G7QiZzOxk-lt4be$q3G3Z{AdG=yA z#cXa)kI1b>*Dqnr(qYeb7e&W|G=1Tz!|~F0RW93$#Sxi9+eSN4Cv{*ds;Z6TCM2g{ zqrZpJyQyYfyX9i?Z??;iV~2M%rn+a@#Lnr4du*!7^|T+!%_-}PW4mTm6&#NAk(3(5->8CVZz4Xgh0kuw1;x8hox?M6O0 z3vLV+IT$r7j&wmP<4Wz`Ju3FiK0bc%l=(?%Q-tmH_%V1FmvnRL!a(`D?R^-2p7`UW z&VhF(fA-v^xzzVr@gpAH9kl5a%+-^iO}qtp5K4)U;^WTeIpF#+SXbTC$?l%!VWk77 zOVIfG1|y{B*_V+g#4a(h(^KyGb<1*h3Mv;ly-o#EFq-WXAPS(kljuASoXX(QnDA&0 zU$$Q$YrAMZl^(_vL1@enHrEC!t*(PY*bEz}KaPT=@Ew_rFZ4?QM~PGmss zY{AyiB!Ga!6j343oN%s?6m0{Q^O68tHjIEmi{WAnoF@oDpol~w0*OYT(J%l36H2%uYBY>1 zG?r1!a5yoAbOD<$V)M8V87Gy-ixk;Fp};)ki+>zGh4Pi2E1XpU&;t=ofIdkWbB`pO^+DTK}8%Yy>M`(ZH# z{VR?iDF~Ni7<2?PoXG)5g@AvkAMheJ>zi0V_$Hf?hx5H7z;a*te?WhUT@D6N6bi|S zM~{>(N_Mh=%KRlUcyu;{BsWo5JdHr5VPP~R0|Udd2q+j8YlVd|XlNRW$U?Iic=UHv zWUf#|<^;afP&6F* zZNwv-Dq`^j92=-Rn;RMZZNi7mVS0-mSLYSW!MslCLw3ylF?Ck3^q&hpU|?y1F;71z?QqRg~0j} z`OwUX@@7WNT+LjDv*kw#0+AmI5|us^f{+@;WXSylxMrs4p;T@N6Q~}u>H1}y{clo% zV1*@Gv2aWn5<|ejusACsj7G=NVKgj?h$1r3EF5Yks;}%q9!n&q3YhjGfR2DxKzho* zpde=Q9W?*Z7jY<4wmpDgFeLCH%nF7=&kBZ^4HzM-8DAo{M*KfbtmT03iVSey%otF- zfLe(7S`2431N{A8zGnC0f4Kw%@@tWw()X8KzvTKU1%3+rE4zNl^-~J`6!=$m{nz9I ze|wx_a)JMX#K6PS;Cpii;6ZC1-!)JO0;y@qngS^Ms2(slS45^b&wZ|}x>!#=>xya; z@F@Np*~#7~^zqOU`_Lu+2F=@~9s9!9WWH)dTQyub=CsyI^WxdWTO9L7J;mO$XN=-^ z8)UDk_5iEpPF-AY#X+A9!<*wtTLT>NHg>UK{L+1p#|Q&&(~ZN<%hj!AS(bxNDVwZZ#WLy$;KRjk3><=R=s z2S@+n#w5m)N7q$J{oRI#hL~sb^UX8dT+Kb*JmFcMZbo^H7tgm;Faytcnco`5COHAC zv|-vFP7fO9y+29QBZxt{OWD#$W_iDdCut0&(7MK#DuC!CTuxcFh z;zoVlv~i2*{)ByS?7e}Dg)N{ajP=e0=i^(3Y!Zp>6V@At9HCEj zO(hJ{p0K0Ach7iWD=x}t*_BcYX%9nd?s6~hbUXh!hT>eaeYWH|pX!3m z(rP6BDDA%TC@9(?K2@)SiQNnE>^d`d5gPcF)rt%(`b9b)$8011&{AvQq!0} zA5A1y4isNHv%(z7O9n$m8JVwIK#7IEtaG6 zw3D26#K$Yp{M5^uO+K#9ZV%qwU)*1^jsaHL+BNB?yP>%XnUkIEnt!{zy!=21%hJj` z?|g+DvMVNfg^sadDh7#M<>HdKeplw1X(v3?G@3u4kkG60re-xbFe0O@w>oL}u{5n*@Y*^9frdsCF$ zd=;Hr-A+;~?qrv1F2zw|+_fybKnmeZj4`XCH!ACBhLTF?D$uR!u#x@<g{eT=sk8> zFY5Lk%}#~SrJSc|eVPLwVAE)R3NT6SwwwrL6&65SkcMpw$INj}KHR-fXZZZz8*4Cj zozaDZbEJgz<72v~CsSUpZ-U|ttv3~%-r3Zz4){>fU>W>YWs~yY6J>_h!eyVO1jMLh zA@M?K{g#t@;-Zhpf1+yZcV1dt8&vzEb+uLZyR~DIkmE^}^V(6pQ5%=)Jlwxz?Bi5? z2l*r+V@JF~^iT#T`G`vyt#^g45T1TVbyR08Lw7K9Qu*oBC{HpucAs{AoPOAB$j!*z zaKW-2Q`h`DUOx!K4J|*TTznZ^nrSVl*Dy%6+tqgCJn|VvTJ3hgbGu_=-&Ga7$7jj4 z?Qh?X>{EI6mx6xFsySOs7btCet9UWKE?VJ)N=j^nGVRI4;WVtq0k;M<#4cS?vBXJ< zk{@r6=(+?NaM}L%-Ijp;lJ?yt{fPRkARn<{sivTNidvxcb)c4@1C%CLEb9BTHG1mNE0wpy`CZ+Y zH^e#k%%vzNn{?GcgNk}e$ttObTvGkE=_t}JJfI+f8Zksw(J39?x-7TQS)BXq_|65k z+Xa#rlC~m*-M=VvG%zQxK1)m6U{<<6##s|(aWJLg#+q=j_Ycq3$AG}k=X{$^QYblY}5D~ zM+qgJ(_DJs`in_>*N~TudAZEp&;e7wyg*?d5Z M^IE48hfO>F57cy)W&i*H diff --git a/apps/lift/metadata.json b/apps/lift/metadata.json deleted file mode 100644 index 0c14df0c1..000000000 --- a/apps/lift/metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ "id": "lift", - "name": "Lift - Workout Timer App", - "shortName":"Lift", - "version": "0.01", - "description": "Rest and Set counter for workout, fitness and lifting things.", - "icon": "app.png", - "screenshots": [{"url": "screenshot.png"}, {"url": "screenshot2.png"}, {"url": "screenshot3.png"}, {"url": "screenshot4.png"}], - "tags": "workout,weight lifting,rest,fitness,timer", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"lift.app.js","url":"lift.app.js"}, - {"name":"lift.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/lift/screenshot.png b/apps/lift/screenshot.png deleted file mode 100644 index 891dce5e52daa8735cbf0d7292e6857d8e2f52b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3971 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 W-4udQq;mTXz~Zvar8=xv(tiL;E%6or diff --git a/apps/lift/screenshot4.png b/apps/lift/screenshot4.png deleted file mode 100644 index a3d655d09d49d160e3dcaf78034dffe4d56b0530..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2989 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 E8)lzz$p8QV literal 0 HcmV?d00001 diff --git a/apps/rest/metadata.json b/apps/rest/metadata.json new file mode 100644 index 000000000..bdce75cd6 --- /dev/null +++ b/apps/rest/metadata.json @@ -0,0 +1,15 @@ +{ "id": "rest", + "name": "Rest - Workout Timer App", + "shortName":"Rest", + "version": "0.01", + "description": "Rest timer and Set counter for workout, fitness and lifting things.", + "icon": "app.png", + "screenshots": [{"url": "screenshot1.png"}, {"url": "screenshot2.png"}, {"url": "screenshot3.png"}], + "tags": "workout,weight lifting,rest,fitness,timer", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"rest.app.js","url":"rest.app.js"}, + {"name":"rest.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/lift/lift.app.js b/apps/rest/rest.app.js similarity index 79% rename from apps/lift/lift.app.js rename to apps/rest/rest.app.js index e779a2908..4c4c5f434 100644 --- a/apps/lift/lift.app.js +++ b/apps/rest/rest.app.js @@ -50,14 +50,17 @@ const c4 = center(q4) const GREY_COLOR = '#CCCCCC'; const SET_COLOR = '#FF00FF'; +const SET_COLOR_MUTED = '#FF88FF'; const REST_COLOR = '#00FFFF'; -const REST_COLOR_MUTED = '#008888'; +const REST_COLOR_MUTED = '#88FFFF'; const RED_COLOR = '#FF0000'; const GREEN_COLOR = '#00FF00'; -const GREEN_COLOR_MUTED = '#008800'; +const GREEN_COLOR_MUTED = '#88FF88'; const BIG_FONT = "6x8:2x2"; +const HUGE_FONT = "6x8:3x3"; +const BIGHUGE_FONT = "6x8:6x6"; -function drawMainMenu() { +function drawMainMenu(splash) { g.setColor(REST_COLOR); roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); g.setColor(SET_COLOR); @@ -67,12 +70,24 @@ function drawMainMenu() { g.setColor(GREEN_COLOR); roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); g.setColor(-1) - g.setFont("6x8").setFontAlign(0,0).drawString("Tap to\nConfigure", c1.x, c1.y-25) - g.setFont(BIG_FONT).setFontAlign(0,0).drawString("REST\n" +restSeconds+ "s", c1.x, c1.y + 10) - g.setFont("6x8").setFontAlign(0,0).drawString("Tap to\nConfigure", c2.x, c2.y-25) - g.setFont(BIG_FONT).setFontAlign(0,0).drawString("SETS\n" + setsCount, c2.x, c2.y + 10) - g.setFont(BIG_FONT).setFontAlign(0,0).drawString("Lift", c3.x, c3.y) - g.setFont(BIG_FONT).setFontAlign(0,0).drawString("GO", c4.x, c4.y) + + if (splash) { + g.setFont(BIGHUGE_FONT).setFontAlign(0,0).drawString("R", c1.x, c1.y) + g.setFont(BIGHUGE_FONT).setFontAlign(0,0).drawString("E", c2.x, c2.y) + g.setFont(BIGHUGE_FONT).setFontAlign(0,0).drawString("S", c3.x, c3.y) + g.setFont(BIGHUGE_FONT).setFontAlign(0,0).drawString("T", c4.x, c4.y) + } else { + g.setFont("6x8").setFontAlign(0,0).drawString("Tap to\nConfigure", c1.x, c1.y-25) + g.setFont(HUGE_FONT).setFontAlign(0,0).drawString(restSeconds+ "s", c1.x, c1.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("REST", c1.x, c1.y + 25) + + g.setFont("6x8").setFontAlign(0,0).drawString("Tap to\nConfigure", c2.x, c2.y-25) + g.setFont(HUGE_FONT).setFontAlign(0,0).drawString(setsCount, c2.x, c2.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("SETS", c2.x, c2.y + 25) + + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("JUST\nDO\nIT", c3.x, c3.y) + g.setFont(HUGE_FONT).setFontAlign(0,0).drawString("GO", c4.x, c4.y) + } } function drawSetRest() { @@ -83,7 +98,9 @@ function drawSetRest() { g.setColor(GREEN_COLOR); roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); g.setColor(-1) - g.setFont(BIG_FONT).setFontAlign(0,0).drawString("REST\n" +restSeconds+ "s", c1.x, c1.y) + g.setFont("6x8").setFontAlign(0,0).drawString("Tap to\nConfirm", c1.x, c1.y-25) + g.setFont(HUGE_FONT).setFontAlign(0,0).drawString(restSeconds+ "s", c1.x, c1.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("REST", c1.x, c1.y + 25) // g.setFont(BIG_FONT).setFontAlign(0,0).drawString("OK", c2.x, c2.y) g.setFont(BIG_FONT).setFontAlign(0,0).drawString("-", c3.x, c3.y) g.setFont(BIG_FONT).setFontAlign(0,0).drawString("+", c4.x, c4.y) @@ -97,7 +114,9 @@ function drawSetSets() { g.setColor(GREEN_COLOR); roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); g.setColor(-1) - g.setFont(BIG_FONT).setFontAlign(0,0).drawString("SETS\n" +setsCount, c2.x, c2.y) + g.setFont("6x8").setFontAlign(0,0).drawString("Tap to\nConfirm", c2.x, c2.y-25) + g.setFont(HUGE_FONT).setFontAlign(0,0).drawString(setsCount, c2.x, c2.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("SETS", c2.x, c2.y + 25) g.setFont(BIG_FONT).setFontAlign(0,0).drawString("-", c3.x, c3.y) g.setFont(BIG_FONT).setFontAlign(0,0).drawString("+", c4.x, c4.y) } @@ -110,7 +129,8 @@ function drawExercise() { g.setColor(GREEN_COLOR_MUTED); roundRect(q4.x, q4.y, q4.x2, q4.y2, 20); g.setColor(-1); - g.setFont(BIG_FONT).setFontAlign(0,0).drawString("SET\n#"+currentSet, c2.x, c2.y) + g.setFont(BIG_FONT).setFontAlign(0,0).drawString("SET", c2.x, c2.y-25) + g.setFont(HUGE_FONT).setFontAlign(0,0).drawString("#"+currentSet, c2.x, c2.y) g.setFont(BIG_FONT).setFontAlign(0,0).drawString("PUSH >\nBUTTON\nWHEN\nDONE", c4.x, c4.y) } @@ -123,7 +143,7 @@ function circlePoints (cx, cy, r, points) { return circlePoints; } -const smallQ3Circle = [c2.x, c2.y].concat(circlePoints(c2.x, c2.y, (q2.y - q2.y2)/2, 60)); +const smallQ3Circle = [c2.x, c2.y].concat(circlePoints(c2.x, c2.y, ((q2.y - q2.y2)/2) + 10, 60)); function drawRest() { @@ -132,8 +152,10 @@ function drawRest() { g.setColor(REST_COLOR); roundRect(q1.x, q1.y, q1.x2, q1.y2, 20); - g.setColor(-1).setFont(BIG_FONT).setFontAlign(0,0).drawString(secondsRemaining, c1.x, c1.y) + g.setColor(-1).setFont(HUGE_FONT).setFontAlign(0,0).drawString(secondsRemaining, c1.x, c1.y) + g.setColor(SET_COLOR_MUTED); + roundRect(q2.x, q2.y, q2.x2, q2.y2, 20); const factor = 1 - secondsRemaining / restSeconds; const circleParts = (((factor * smallQ3Circle.length) | 0) >> 1) << 1 const poly = smallQ3Circle.slice(0, circleParts + 2) @@ -175,18 +197,19 @@ function drawDoIt() { g.setFont(BIG_FONT) g.setColor(0); setTimeout(() => { - g.drawString('just', 40, 20); + g.setFontAlign(0, 0) + g.drawString('just ', R.x2/2, 20); Bangle.buzz(150, 0.5); }, 200); setTimeout(() => { g.drawImage(getImg(), 22, 44, {scale: 1.5}); - g.drawString('DO', 100, 20); + g.drawString(' DO ', R.x2/2, 20); Bangle.buzz(200); }, 1000); setTimeout(() => { - g.drawString('IT', 150, 20); + g.drawString(' IT', R.x2/2, 20); Bangle.buzz(200); - }, 1300); + }, 1400); setTimeout(() => { setMode(MAIN_MENU); redrawApp(); @@ -293,5 +316,7 @@ Bangle.on('touch', (button, xy) => { } }); -redrawApp(); +g.clear(); +drawMainMenu(true); +setTimeout(redrawApp, 1000); diff --git a/apps/rest/screenshot2.png b/apps/rest/screenshot2.png new file mode 100644 index 0000000000000000000000000000000000000000..e878fea96f3b6961fb9ab021566766af93f030c9 GIT binary patch literal 2809 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 HiA($sk$FXM literal 0 HcmV?d00001 diff --git a/apps/rest/screenshot3.png b/apps/rest/screenshot3.png new file mode 100644 index 0000000000000000000000000000000000000000..28d94eb91ee4c8bf963ed5346510432180de3c5e GIT binary patch literal 2589 zcmchZ`#02EAIHCQ@kPy?qS7Fwspq8BAu-i)%iTej3CSE9=`=25CQU-5`KCf{Ny))T zM{b#M$!#$B=9D>=OUR6-FozB?E+a9*aOQc|dY(Vv{P66x_I|JTYk%JRhrRY^t(|b< zm?L(b);a(Hu+C0)M1@xTd#ZqnwY=_=uR;(EqN5E^*12t5VbBa4XLl9Fh*mit4*;rs zXS<{B5x!Hb#7m!w)s^^bYu&OG9zKo@_N_mG7>`d*9@y_2H@W#8Gy`s8ni+2cA!@`!aFjs<4Q8M#)H;kxo75KQlVrbByVQ#zj2ZggMGvf3rKxlKLDE z!=>EY@+hagQl7g#A*^oU0kaf9m1CXL6T)N5`>w7h5fzaTX>Q-1cv8q{nfzld$h^kZ zAe8{CtMlE%EjgcSER&&1dQyPeuy1ywOUpe7!NtRk)`BROFzQc9TqKhK&WxPl$_i^I z&)(7hono@uF)P%>F$-9|O}-Wm)i>D$yM}`1xubXtdqC%`kD7SPpH2MUWw)@YH5z$R z5?dpf*!sfcd6dm?vcJ&_D@PSzVcM&HAnq3B2G?V=g@azJ5RmGpw=HXy@5mRg{m|B$oA*d;*BeIh^A`=z3iLKe-VP!td}zarDNPK(Q#&gOQS4jkOD+-GMsN+Z-cwl*S^ILC$!jfOr#r{2_p;-!>@$56L5L$FYk+v3o``Hd1BZ)pZ->c09(=N=W zX(^GX}I|rAdn00VF4(|zkJsx|kvl)YaJPX4Qd@ll(yGzUFYis&<`P%`UCZdZL)IFtm| zHlHyO(!)W4b$C;cxy6P)-?V3%hfMAY>O-!93$4_^IEdpUnlP3==C`bQu17qWK0gLoBz#^jNyF;3#xSH8>&nk<6~yjFiFsIw`m@w6V8E@ z$pX5{e}O{(nK$o;`JUd*^WAjG*i8M>%TtykdCN($_j{Gn9;Kc_UTh>BQzHkSiWmT8 zEmKJGm5-}mZ$kWSdd&q~FE z)+X)Ds)|Pe-OUuPMayUIQnuXzBOn~a#mk30_ftFgYB#DXHjp1&EB7g_>$25uJs!F9WZmwd+NwC9g7c8KY?P8CuynUSWJ})fm5R( zdC;hBSz(NzH0x3H#Lyr8lLoe5*WHUuKb@-$`bLHmytF}DbisS(ukJ1{;F8+dS6-VI zS7P0?v<a2`ti&(eFUamv!ChGO#Giug0S3Adtbue7H(>4s>3ku|G3S|gSuwc2OX{u=*b15 zh^3y+D)%@DKW<8kqOQ)5E$-cBZsi%zo;N_y=J%a7kS-r0%D*+#vTCO-X{GZ~WN!IM z@42v~y**{IMJ>9Sph&Ax}E_m+U!VjENSAAX|^=}P!8;=gOXteyr^T67G zlz)AwBc^Vx*F*nm!R`x!VS1^IsuALpXOHYn9*neeOEDayN znCh-QuUW5uzwm9a=P4i1sINXF(yTkvKWmFLC@Ul z8xUuF1G~=r-ZNdLvTIRo30Vh4tB&qtZaD%&BCC(-t?O;obXTBu&8Knys~j1HBXB(L zxOO`GVGOA#GB;R97NcZvrcvnyj;j>NT9Rg-%=*b0Eecf}WmWXJDdE1Ly8}MS;Pm)5 zB8V)0uF%q=>rSx0!{ZR_jI8h07_4r?i_x|920jk=OC?y*5{7r@XubqkHdZBzjSrjr zRD{m5QclSVez3q=NTktK$>h74M-UjEIDEM9UpM-Eqf!-}pL#%KI5G)2u6jI0bhd21!1YJc zm=xn*N+YLL_?X};DD&TkGe?$G0qIf{@9R25#Q2oY_0TnCW#!may_C%3iZ34EY=6wI I%!Yj9Z}HsiNdN!< literal 0 HcmV?d00001 From 8e0bcdc26c69f59e17ee8a4b609659dfcd5555bf Mon Sep 17 00:00:00 2001 From: Tom Wallroth Date: Wed, 10 Apr 2024 22:04:57 +0200 Subject: [PATCH 6/8] whoops forgot screenshot1 --- apps/rest/screenshot1.png | Bin 0 -> 2958 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/rest/screenshot1.png diff --git a/apps/rest/screenshot1.png b/apps/rest/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..616a7232b10a238170a639dad26acb2818b858cf GIT binary patch literal 2958 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 Date: Fri, 19 Apr 2024 13:56:41 +0200 Subject: [PATCH 7/8] removed unused lastRender variable, use edge:falling for button press --- apps/rest/rest.app.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/rest/rest.app.js b/apps/rest/rest.app.js index 4c4c5f434..ea15a1b23 100644 --- a/apps/rest/rest.app.js +++ b/apps/rest/rest.app.js @@ -224,7 +224,6 @@ const REST = 'REST'; const DOIT = 'DOIT'; let mode = MAIN_MENU; -let lastRender = MAIN_MENU; function setMode(newMode){ mode = newMode; @@ -285,7 +284,6 @@ function redrawApp(){ g.setBgColor(-1).clear(); Bangle.drawWidgets(); drawFuncPerMode[mode](); - lastRender = mode; } function buttonPress () { @@ -302,7 +300,7 @@ function buttonPress () { } } -setWatch(buttonPress, BTN, { repeat: true, debounce: 25}); +setWatch(buttonPress, BTN, { repeat: true, debounce: 25, edge:"falling"}); Bangle.on('touch', (button, xy) => { for (let qidx=0; qidx<4; qidx++) { From e15bd46f8fb7480970b6fa4340f1eae08020acb2 Mon Sep 17 00:00:00 2001 From: Tom Wallroth Date: Fri, 19 Apr 2024 14:01:26 +0200 Subject: [PATCH 8/8] fixed app looking ugly when using dark theme --- apps/rest/rest.app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/rest/rest.app.js b/apps/rest/rest.app.js index ea15a1b23..aeb066e55 100644 --- a/apps/rest/rest.app.js +++ b/apps/rest/rest.app.js @@ -192,6 +192,7 @@ function drawRest() { } function drawDoIt() { + const oldBgColor = g.getBgColor(); g.setBgColor('#00FF00').clear(); g.drawImage(getImg(), 44, 44); g.setFont(BIG_FONT) @@ -212,6 +213,7 @@ function drawDoIt() { }, 1400); setTimeout(() => { setMode(MAIN_MENU); + g.setBgColor(oldBgColor); redrawApp(); }, 2000); } @@ -281,7 +283,7 @@ const drawFuncPerMode = { } function redrawApp(){ - g.setBgColor(-1).clear(); + g.clear(); Bangle.drawWidgets(); drawFuncPerMode[mode](); }