From 7ab9e342d5fa8d8210201c8bd9ca626e9fd8bdb9 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Tue, 29 Mar 2022 09:02:07 +0200 Subject: [PATCH 01/85] EAN-8 Barcode clock, INIT --- apps/barcode/ChangeLog | 1 + apps/barcode/README.md | 15 ++ apps/barcode/barcode.app.js | 377 +++++++++++++++++++++++++++++++++ apps/barcode/barcode.clock.png | Bin 0 -> 1907 bytes apps/barcode/barcode.icon.js | 1 + apps/barcode/barcode.icon.png | Bin 0 -> 574 bytes apps/barcode/metadata.json | 16 ++ 7 files changed, 410 insertions(+) create mode 100644 apps/barcode/ChangeLog create mode 100644 apps/barcode/README.md create mode 100644 apps/barcode/barcode.app.js create mode 100644 apps/barcode/barcode.clock.png create mode 100644 apps/barcode/barcode.icon.js create mode 100644 apps/barcode/barcode.icon.png create mode 100644 apps/barcode/metadata.json diff --git a/apps/barcode/ChangeLog b/apps/barcode/ChangeLog new file mode 100644 index 000000000..987688083 --- /dev/null +++ b/apps/barcode/ChangeLog @@ -0,0 +1 @@ +0.01: Please forgive me diff --git a/apps/barcode/README.md b/apps/barcode/README.md new file mode 100644 index 000000000..0396e03ac --- /dev/null +++ b/apps/barcode/README.md @@ -0,0 +1,15 @@ +# Barcode clock(watch)face + +A scannable EAN-8 compatible face for your Bangle 2 + +The format of the bars are + +* Left section: HHmm + * H: Hours + * m: Minutes +* Right section: MM9c + * M: Month + * 9: constant + * c: Calculated EAN-8 digit checksum + +This face is aware of theme choice, so it will adapt to Light/Dark themes. diff --git a/apps/barcode/barcode.app.js b/apps/barcode/barcode.app.js new file mode 100644 index 000000000..99b3f4cc2 --- /dev/null +++ b/apps/barcode/barcode.app.js @@ -0,0 +1,377 @@ +var startOffsetX = 20; +var startOffsetHeight = 40; + +var checkBarWidth = 10; +var checkBarHeight = 140; + +var digitWidth = 14; +var digitHeight = 120; + +var startDigitOffsetX = startOffsetX + checkBarWidth; + +var midCheckBarOffsetX = startOffsetX + checkBarWidth + digitWidth * 4; + +var midDigitOffsetX = startOffsetX + checkBarWidth + digitWidth * 4 + checkBarWidth; + +var endCheckBarOffsetX = startOffsetX + checkBarWidth + digitWidth * 4 + checkBarWidth + digitWidth * 4; + +let intCaster = num => Number(num); + +var drawTimeout; + +Bangle.loadWidgets(); + +function renderWatch(l) { + g.setFont("4x6",2); + + // work out how to display the current time + + var offsetY = l.y; + + var d = new Date(); + var h = d.getHours(), m = d.getMinutes(); + var time = h + ":" + ("0"+m).substr(-2); + var month = ("0" + (d.getMonth()+1)).slice(-2); + var concatTime = ("0"+h).substr(-2) + ("0"+m).substr(-2) + month + 9; + + concatTime = "20510398"; + + const chars = String(concatTime).split("").map((concatTime) => { + return Number(concatTime); + }); + + drawStart(startOffsetX, offsetY); + + drawLDigit(chars[0], 0, offsetY); + drawLDigit(chars[1], 1, offsetY); + drawLDigit(chars[2], 2, offsetY); + drawLDigit(chars[3], 3, offsetY); + + drawMid(midCheckBarOffsetX, offsetY); + + drawRDigit(chars[4], 0, offsetY); + drawRDigit(chars[5], 1, offsetY); + drawRDigit(chars[6], 2, offsetY); + drawRDigit(calculateChecksum(chars), 3, offsetY); + + drawEnd(endCheckBarOffsetX, offsetY); + + // schedule a draw for the next minute + if (drawTimeout) { + clearTimeout(drawTimeout); + } + drawTimeout = setTimeout(function() { + + drawTimeout = undefined; + layout.render(layout.watch); + }, 60000 - (Date.now() % 60000)); +} + +function drawLDigit(digit, index, offsetY) { + switch(digit) { + case 0: + drawLZeroWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + case 1: + drawLOneWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + case 2: + drawLTwoWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + case 3: + drawLThreeWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + case 4: + drawLFourWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + case 5: + drawLFiveWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + case 6: + drawLSixWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + case 7: + drawLSevenWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + case 8: + drawLEightWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + case 9: + drawLNineWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); + break; + } +} + +function drawRDigit(digit, index, offsetY) { + switch(digit) { + case 0: + drawRZeroWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + case 1: + drawROneWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + case 2: + drawRTwoWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + case 3: + drawRThreeWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + case 4: + drawRFourWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + case 5: + drawRFiveWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + case 6: + drawRSixWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + case 7: + drawRSevenWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + case 8: + drawREightWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + case 9: + drawRNineWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); + break; + } +} + +/* +LEAN + +01234567890123 + xxxx xx + xx xxxx + xxxxxxxx xx + xx xxxx + xxxx xx + xx xxxxxxxx + xxxxxx xxxx + xxxx xxxxxx + xx xxxx + xxxx xx +*/ +function drawLOneWithOffset(offset, offsetY) { + let barOneX = 4; + let barTwoX = 12; + g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); + g.drawString("1",offset+3,offsetY+digitHeight+5); +} + +function drawLTwoWithOffset(offset, offsetY) { + let barOneX = 4; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); + g.drawString("2",offset+3,offsetY+digitHeight+5); +} + +function drawLThreeWithOffset(offset, offsetY) { + let barOneX = 2; + let barTwoX = 12; + g.fillRect(barOneX+offset,offsetY+0,barOneX+7+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); + g.drawString("3",offset+3,offsetY+digitHeight+5); +} + +function drawLFourWithOffset(offset, offsetY) { + let barOneX = 2; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); + g.drawString("4",offset+3,offsetY+digitHeight+5); +} + +function drawLFiveWithOffset(offset, offsetY) { + let barOneX = 2; + let barTwoX = 12; + g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); + g.drawString("5",offset+3,offsetY+digitHeight+5); +} + +function drawLSixWithOffset(offset, offsetY) { + let barOneX = 2; + let barTwoX = 6; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+7+offset,offsetY+digitHeight); + g.drawString("6",offset+3,offsetY+digitHeight+5); +} + +function drawLSevenWithOffset(offset, offsetY) { + let barOneX = 2; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); + g.drawString("7",offset+3,offsetY+digitHeight+5); +} + +function drawLEightWithOffset(offset, offsetY) { + let barOneX = 2; + let barTwoX = 8; + g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitHeight); + g.drawString("8",offset+3,offsetY+digitHeight+5); +} + +function drawLNineWithOffset(offset, offsetY) { + let barOneX = 6; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); + g.drawString("9",offset+3,offsetY+digitHeight+5); +} + +function drawLZeroWithOffset(offset, offsetY) { + let barOneX = 6; + let barTwoX = 12; + g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); + g.drawString("0",offset+3,offsetY+digitHeight+5); +} + + + +/* +REAN + +01234567890123 +xxxx xxxx +xxxx xxxx +xx xx +xx xxxxxx +xx xxxxxx +xx xx +xx xx +xx xx +xxxxxx xx +xxxxxx xx + +*/ +function drawROneWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 8; + g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+3,offsetY+digitHeight); + g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+3,offsetY+digitHeight); + g.drawString("1",offset+2,offsetY+digitHeight+5); +} + +function drawRTwoWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 6; + g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+3,offsetY+digitHeight); + g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+3,offsetY+digitHeight); + g.drawString("2",offset+2,offsetY+digitHeight+5); +} + +function drawRThreeWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); + g.drawString("3",offset+2,offsetY+digitHeight+5); +} + +function drawRFourWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 4; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitHeight); + g.drawString("4",offset+2,offsetY+digitHeight+5); +} + +function drawRFiveWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 6; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitHeight); + g.drawString("5",offset+2,offsetY+digitHeight+5); +} + +function drawRSixWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 4; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); + g.drawString("6",offset+2,offsetY+digitHeight+5); +} + +function drawRSevenWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 8; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); + g.drawString("7",offset+2,offsetY+digitHeight+5); +} + +function drawREightWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 6; + g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+1,offsetY+digitHeight); + g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+1,offsetY+digitHeight); + g.drawString("8",offset+2,offsetY+digitHeight+5); +} + +function drawRNineWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 8; + g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); + g.drawString("9",offset+2,offsetY+digitHeight+5); +} + +function drawRZeroWithOffset(offset, offsetY) { + let barOneX = 0; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); + g.drawString("0",offset+2,offsetY+digitHeight+5); +} + + + + + +function drawStart(offset, offsetY) { + let barOneX = 2; + let barTwoX = 6; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight+15); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight+15); +} + +function drawMid(offset, offsetY) { + let barOneX = 2; + let barTwoX = 6; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight+15); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight+15); +} + +function drawEnd(offset, offsetY) { + let barOneX = 2; + let barTwoX = 6; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight+15); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight+15); +} + +function calculateChecksum(digits) { + let oddSum = digits[6] + digits[4] + digits[2] + digits[0]; + let evenSum = digits[5] + digits[3] + digits[1]; + + let checkSum = (10 - ((3 * oddSum + evenSum) % 10)) % 10; + + return checkSum; +} + +// The layout, referencing the custom renderer +var Layout = require("Layout"); +var layout = new Layout( { + type:"v", c: [ + {type:"custom", render:renderWatch, id:"watch", bgCol:g.theme.bg, fillx:1, filly:1 } + ] +}); + +// Clear the screen once, at startup +g.clear(); +layout.render(); diff --git a/apps/barcode/barcode.clock.png b/apps/barcode/barcode.clock.png new file mode 100644 index 0000000000000000000000000000000000000000..4df621607c8d32f8caf26b8aa52a2d6a6c5e87af GIT binary patch literal 1907 zcmdT?jW^SK9Gzs8CBHZ&}y0-L{n!igahk z@v=mbUeH$Dp&Om$brY75w=pk`Xt}?sb#H&d{XOUR{hssuKA-3N`90r<;Y09R1vPSG@|!=;XwCV%tk;U-Ob*3EHN%n*7Gj28?8qZ4Jnb% z0ky?pW+zao<5!=YoC|UhO6#y+tPpeO_*C|_jl^ z^rI$1fsN&!kV?q$W8%YW))pi*-SILkhECDTBT2tgqdg6&9#YO38?aDtNn8W*?@lwI zdIZDf>4)v*4(}B&iKuc&VzwU3MCd8B{9L59jeJnsh&q?qxInHnqEa#C5GIumr=wUb z=KF1};q}U}CBgA6g(7?T^JxYu{kD?}Wszp7xzw}q_@g6SzbbSpy8c~1j7qW~TIlOn z<6#H1li4;R(~WOVEQHpNrQ0CX6 z^k?RS{?OmoPRLc6a;|^8Ud%{H_K0FP=JiGHvvhW!aFzdx(Us(EWKxq3pE$+1iv%Ai z4RZWBB7`nbtzC`f>14~J*G+S2^Rac@_NXdb^ZS9WqB7P+UUh0NSH+~ zt*e1r0GRTsc!W;r!i)WmBd~QgAzw_9GoF*Kl`e`KKlP7_`HUc8SBTQygt_6zR?jEoSaTo;|G5PpU0>b2gF0%)`eGrF zy;QU+Enhhflmo@whc4#_V0LToB|%j9J^>DngC98pS6^#3B=2hw)ROB}diC{awIBxO zs){x7Yb2Me06jW`1p3AtLB*BeiU6o3QhW?S%?E&5Qe#=q+E?S-)O3cl z7#N!arGRm}H$6j&20CgEN%%|jOHSmgej{=WY+jq?Hf`j$=dG99_+@NBftFU#cq-3& zqMv*xd69QESlU`R`Y8?g{#TuwQUSEUz`g6D4s1p@;UBi_R95jL_{QvJg8xwO1)(xZ z=2&{H;Yo93RnjSfaa`f6;TKKx*Mim53THfa_@qUTS6JjM`$8E{FRpEUMG~`@zjnj{ zmT;EI?eu81Ux=ts)>a41*XWsf&njnbc77aAy%M;Vl}WXvfiJi@SaAF2oFXcfOxWC& z9g@96?c2GX9OshC<(79x+Cd^*#f2T8MBEapAwXj5w^^>_QPgYIHgOMXz}&%hZ_5 zli37jZI$m$6sBW>3hF{#D3+@SO`t@0u(af&#Ez6g&3aijQ=+NoPx4tTfZEIVe~JkN zSRV8QpQr&2MDtsCQ2Wy)tSk#H5bPT4JWtX9-$NHE_v;|yia$G-0W3-9VNeN3%kDNS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGx) z>Fdh=j9ErlQs%&Mjcp7JjBcJTjv*e$lmDDQaNs~e{k(uDg)Z--mW+u{+cWV|+) z+xT?awR>kT&D_oB*Jt!leAk43Y3mXgg_)U!nL86g4zFknkBsh{d3^d`5({wFZ``sA$sb&Y`W^bHT5UU^KNm^ySzK1QesB^+nOW) z6F!FjbGMeT;FCG}ftg!h{qWxE=aLpIJ0v9T8vsH4{_D#Dj~6NZ^iLLCs%zx)bUVjvqE#o0*lE^%*Mv*>WBFE+Zk}zCO=B~ zarD%W*Zks#&)<)!zi-U_H!1ng&;H2|-`j_^+4JatR2??uS=AwZ)j^n-LB1=!BqR2- zEijN(OI#yLQW8s2t&)pUffR$0fsv7}fw8WUWr%^9m5Hg9sj0Ssft7(lioi!H6b-rg mDVb@N2n`k?hL%=FrdCE45DiU#{oVmJFnGH9xvX Date: Tue, 29 Mar 2022 09:17:44 +0200 Subject: [PATCH 02/85] Now (might) actually work --- apps/barcode/ChangeLog | 1 + apps/barcode/barcode.app.js | 4 +--- apps/barcode/metadata.json | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/barcode/ChangeLog b/apps/barcode/ChangeLog index 987688083..0581a70f5 100644 --- a/apps/barcode/ChangeLog +++ b/apps/barcode/ChangeLog @@ -1 +1,2 @@ 0.01: Please forgive me +0.02: Now tells time! diff --git a/apps/barcode/barcode.app.js b/apps/barcode/barcode.app.js index 99b3f4cc2..9448e893e 100644 --- a/apps/barcode/barcode.app.js +++ b/apps/barcode/barcode.app.js @@ -1,4 +1,4 @@ -var startOffsetX = 20; +var startOffsetX = 18; var startOffsetHeight = 40; var checkBarWidth = 10; @@ -34,8 +34,6 @@ function renderWatch(l) { var month = ("0" + (d.getMonth()+1)).slice(-2); var concatTime = ("0"+h).substr(-2) + ("0"+m).substr(-2) + month + 9; - concatTime = "20510398"; - const chars = String(concatTime).split("").map((concatTime) => { return Number(concatTime); }); diff --git a/apps/barcode/metadata.json b/apps/barcode/metadata.json index 6cc54c122..e230c0a5a 100644 --- a/apps/barcode/metadata.json +++ b/apps/barcode/metadata.json @@ -2,7 +2,7 @@ "name": "Barcode clock", "shortName":"Barcode clock", "icon": "barcode.icon.png", - "version":"0.01", + "version":"0.02", "description": "EAN-8 compatible barcode clock. Format (c: checksum): [HHmm] [MM9c]", "tags": "barcode,ean,ean-8,watchface,clock,clockface", "type": "clock", From a1162ef6d3b9b9cee426a173829cd54545bd3cf1 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Tue, 29 Mar 2022 09:24:05 +0200 Subject: [PATCH 03/85] Adds button press interaction --- apps/barcode/ChangeLog | 1 + apps/barcode/barcode.app.js | 5 +++-- apps/barcode/metadata.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/barcode/ChangeLog b/apps/barcode/ChangeLog index 0581a70f5..ca8cf8e96 100644 --- a/apps/barcode/ChangeLog +++ b/apps/barcode/ChangeLog @@ -1,2 +1,3 @@ 0.01: Please forgive me 0.02: Now tells time! +0.03: Interaction diff --git a/apps/barcode/barcode.app.js b/apps/barcode/barcode.app.js index 9448e893e..43c74e5ea 100644 --- a/apps/barcode/barcode.app.js +++ b/apps/barcode/barcode.app.js @@ -19,8 +19,6 @@ let intCaster = num => Number(num); var drawTimeout; -Bangle.loadWidgets(); - function renderWatch(l) { g.setFont("4x6",2); @@ -372,4 +370,7 @@ var layout = new Layout( { // Clear the screen once, at startup g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +Bangle.setUI("clock"); layout.render(); diff --git a/apps/barcode/metadata.json b/apps/barcode/metadata.json index e230c0a5a..4ad2cd96a 100644 --- a/apps/barcode/metadata.json +++ b/apps/barcode/metadata.json @@ -2,7 +2,7 @@ "name": "Barcode clock", "shortName":"Barcode clock", "icon": "barcode.icon.png", - "version":"0.02", + "version":"0.03", "description": "EAN-8 compatible barcode clock. Format (c: checksum): [HHmm] [MM9c]", "tags": "barcode,ean,ean-8,watchface,clock,clockface", "type": "clock", From 91cab3aee4bf2c2d359f756b3424611149b1aa00 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Tue, 29 Mar 2022 12:12:57 +0200 Subject: [PATCH 04/85] Added day of week --- apps/barcode/ChangeLog | 1 + apps/barcode/README.md | 4 +++- apps/barcode/barcode.app.js | 27 ++++++++++++++------------- apps/barcode/metadata.json | 4 ++-- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/apps/barcode/ChangeLog b/apps/barcode/ChangeLog index ca8cf8e96..60122a63b 100644 --- a/apps/barcode/ChangeLog +++ b/apps/barcode/ChangeLog @@ -1,3 +1,4 @@ 0.01: Please forgive me 0.02: Now tells time! 0.03: Interaction +0.04: Shows day of week diff --git a/apps/barcode/README.md b/apps/barcode/README.md index 0396e03ac..e677bc029 100644 --- a/apps/barcode/README.md +++ b/apps/barcode/README.md @@ -4,12 +4,14 @@ A scannable EAN-8 compatible face for your Bangle 2 The format of the bars are +`[HHmm] [MMwc]` + * Left section: HHmm * H: Hours * m: Minutes * Right section: MM9c * M: Month - * 9: constant + * w: Day of week * c: Calculated EAN-8 digit checksum This face is aware of theme choice, so it will adapt to Light/Dark themes. diff --git a/apps/barcode/barcode.app.js b/apps/barcode/barcode.app.js index 43c74e5ea..583c04876 100644 --- a/apps/barcode/barcode.app.js +++ b/apps/barcode/barcode.app.js @@ -21,7 +21,7 @@ var drawTimeout; function renderWatch(l) { g.setFont("4x6",2); - + // work out how to display the current time var offsetY = l.y; @@ -30,7 +30,8 @@ function renderWatch(l) { var h = d.getHours(), m = d.getMinutes(); var time = h + ":" + ("0"+m).substr(-2); var month = ("0" + (d.getMonth()+1)).slice(-2); - var concatTime = ("0"+h).substr(-2) + ("0"+m).substr(-2) + month + 9; + var dayOfWeek = d.getDay() || 7; + var concatTime = ("0"+h).substr(-2) + ("0"+m).substr(-2) + month + dayOfWeek; const chars = String(concatTime).split("").map((concatTime) => { return Number(concatTime); @@ -57,7 +58,7 @@ function renderWatch(l) { clearTimeout(drawTimeout); } drawTimeout = setTimeout(function() { - + drawTimeout = undefined; layout.render(layout.watch); }, 60000 - (Date.now() % 60000)); @@ -150,7 +151,7 @@ LEAN */ function drawLOneWithOffset(offset, offsetY) { let barOneX = 4; - let barTwoX = 12; + let barTwoX = 12; g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); g.drawString("1",offset+3,offsetY+digitHeight+5); @@ -158,7 +159,7 @@ function drawLOneWithOffset(offset, offsetY) { function drawLTwoWithOffset(offset, offsetY) { let barOneX = 4; - let barTwoX = 10; + let barTwoX = 10; g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); g.drawString("2",offset+3,offsetY+digitHeight+5); @@ -166,7 +167,7 @@ function drawLTwoWithOffset(offset, offsetY) { function drawLThreeWithOffset(offset, offsetY) { let barOneX = 2; - let barTwoX = 12; + let barTwoX = 12; g.fillRect(barOneX+offset,offsetY+0,barOneX+7+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); g.drawString("3",offset+3,offsetY+digitHeight+5); @@ -174,7 +175,7 @@ function drawLThreeWithOffset(offset, offsetY) { function drawLFourWithOffset(offset, offsetY) { let barOneX = 2; - let barTwoX = 10; + let barTwoX = 10; g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); g.drawString("4",offset+3,offsetY+digitHeight+5); @@ -182,7 +183,7 @@ function drawLFourWithOffset(offset, offsetY) { function drawLFiveWithOffset(offset, offsetY) { let barOneX = 2; - let barTwoX = 12; + let barTwoX = 12; g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); g.drawString("5",offset+3,offsetY+digitHeight+5); @@ -190,7 +191,7 @@ function drawLFiveWithOffset(offset, offsetY) { function drawLSixWithOffset(offset, offsetY) { let barOneX = 2; - let barTwoX = 6; + let barTwoX = 6; g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+7+offset,offsetY+digitHeight); g.drawString("6",offset+3,offsetY+digitHeight+5); @@ -198,7 +199,7 @@ function drawLSixWithOffset(offset, offsetY) { function drawLSevenWithOffset(offset, offsetY) { let barOneX = 2; - let barTwoX = 10; + let barTwoX = 10; g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); g.drawString("7",offset+3,offsetY+digitHeight+5); @@ -206,7 +207,7 @@ function drawLSevenWithOffset(offset, offsetY) { function drawLEightWithOffset(offset, offsetY) { let barOneX = 2; - let barTwoX = 8; + let barTwoX = 8; g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitHeight); g.drawString("8",offset+3,offsetY+digitHeight+5); @@ -214,7 +215,7 @@ function drawLEightWithOffset(offset, offsetY) { function drawLNineWithOffset(offset, offsetY) { let barOneX = 6; - let barTwoX = 10; + let barTwoX = 10; g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); g.drawString("9",offset+3,offsetY+digitHeight+5); @@ -222,7 +223,7 @@ function drawLNineWithOffset(offset, offsetY) { function drawLZeroWithOffset(offset, offsetY) { let barOneX = 6; - let barTwoX = 12; + let barTwoX = 12; g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); g.drawString("0",offset+3,offsetY+digitHeight+5); diff --git a/apps/barcode/metadata.json b/apps/barcode/metadata.json index 4ad2cd96a..ad85f81d2 100644 --- a/apps/barcode/metadata.json +++ b/apps/barcode/metadata.json @@ -2,8 +2,8 @@ "name": "Barcode clock", "shortName":"Barcode clock", "icon": "barcode.icon.png", - "version":"0.03", - "description": "EAN-8 compatible barcode clock. Format (c: checksum): [HHmm] [MM9c]", + "version":"0.04", + "description": "EAN-8 compatible barcode clock.", "tags": "barcode,ean,ean-8,watchface,clock,clockface", "type": "clock", "supports" : ["BANGLEJS2"], From 6bded83f776c7b0096265d8b5a18d604a7801913 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Tue, 29 Mar 2022 13:22:54 +0200 Subject: [PATCH 05/85] Shows day of month --- apps/barcode/ChangeLog | 1 + apps/barcode/README.md | 2 +- apps/barcode/barcode.app.js | 8 ++++---- apps/barcode/metadata.json | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/barcode/ChangeLog b/apps/barcode/ChangeLog index 60122a63b..b4137fc3f 100644 --- a/apps/barcode/ChangeLog +++ b/apps/barcode/ChangeLog @@ -2,3 +2,4 @@ 0.02: Now tells time! 0.03: Interaction 0.04: Shows day of week +0.05: Shows day of month diff --git a/apps/barcode/README.md b/apps/barcode/README.md index e677bc029..72d4d2abd 100644 --- a/apps/barcode/README.md +++ b/apps/barcode/README.md @@ -10,7 +10,7 @@ The format of the bars are * H: Hours * m: Minutes * Right section: MM9c - * M: Month + * M: Day of month * w: Day of week * c: Calculated EAN-8 digit checksum diff --git a/apps/barcode/barcode.app.js b/apps/barcode/barcode.app.js index 583c04876..470aac30e 100644 --- a/apps/barcode/barcode.app.js +++ b/apps/barcode/barcode.app.js @@ -1,4 +1,4 @@ -var startOffsetX = 18; +var startOffsetX = 17; var startOffsetHeight = 40; var checkBarWidth = 10; @@ -29,9 +29,10 @@ function renderWatch(l) { var d = new Date(); var h = d.getHours(), m = d.getMinutes(); var time = h + ":" + ("0"+m).substr(-2); - var month = ("0" + (d.getMonth()+1)).slice(-2); + //var month = ("0" + (d.getMonth()+1)).slice(-2); + var dayOfMonth = ('0' + d.getDate()).slice(-2); var dayOfWeek = d.getDay() || 7; - var concatTime = ("0"+h).substr(-2) + ("0"+m).substr(-2) + month + dayOfWeek; + var concatTime = ("0"+h).substr(-2) + ("0"+m).substr(-2) + dayOfMonth + dayOfWeek; const chars = String(concatTime).split("").map((concatTime) => { return Number(concatTime); @@ -58,7 +59,6 @@ function renderWatch(l) { clearTimeout(drawTimeout); } drawTimeout = setTimeout(function() { - drawTimeout = undefined; layout.render(layout.watch); }, 60000 - (Date.now() % 60000)); diff --git a/apps/barcode/metadata.json b/apps/barcode/metadata.json index ad85f81d2..350750e32 100644 --- a/apps/barcode/metadata.json +++ b/apps/barcode/metadata.json @@ -2,7 +2,7 @@ "name": "Barcode clock", "shortName":"Barcode clock", "icon": "barcode.icon.png", - "version":"0.04", + "version":"0.05", "description": "EAN-8 compatible barcode clock.", "tags": "barcode,ean,ean-8,watchface,clock,clockface", "type": "clock", From a8436b96ea87d2f235a8619135c03b5a1a55c73d Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Sun, 15 May 2022 15:15:00 +0200 Subject: [PATCH 06/85] Step counter and more restrictive time updates. --- apps/barcode/ChangeLog | 1 + apps/barcode/barcode.app.js | 484 +++++++++++++++++++----------------- apps/barcode/metadata.json | 2 +- 3 files changed, 251 insertions(+), 236 deletions(-) diff --git a/apps/barcode/ChangeLog b/apps/barcode/ChangeLog index b4137fc3f..d97fd8af8 100644 --- a/apps/barcode/ChangeLog +++ b/apps/barcode/ChangeLog @@ -3,3 +3,4 @@ 0.03: Interaction 0.04: Shows day of week 0.05: Shows day of month +0.06: Updates every 5 minutes when locked, or when unlock occurs. Also shows nr of steps. \ No newline at end of file diff --git a/apps/barcode/barcode.app.js b/apps/barcode/barcode.app.js index 470aac30e..9f4d31122 100644 --- a/apps/barcode/barcode.app.js +++ b/apps/barcode/barcode.app.js @@ -1,137 +1,163 @@ +/* Sizes */ +let checkBarWidth = 10; +let checkBarHeight = 140; + +let digitBarWidth = 14; +let digitBarHeight = 100; + +let textBarWidth = 56; +let textBarHeight = 20; + +let textWidth = 14; +let textHeight = 20; + +/* Offsets */ var startOffsetX = 17; -var startOffsetHeight = 40; +var startOffsetY = 30; -var checkBarWidth = 10; -var checkBarHeight = 140; +let startBarOffsetX = startOffsetX; +let startBarOffsetY = startOffsetY; -var digitWidth = 14; -var digitHeight = 120; +let upperTextBarLeftOffsetX = startBarOffsetX + checkBarWidth; +let upperTextBarLeftOffsetY = startOffsetY; -var startDigitOffsetX = startOffsetX + checkBarWidth; +let midBarOffsetX = upperTextBarLeftOffsetX + textBarWidth; +let midBarOffsetY = startOffsetY; -var midCheckBarOffsetX = startOffsetX + checkBarWidth + digitWidth * 4; +let upperTextBarRightOffsetX = midBarOffsetX + checkBarWidth; +let upperTextBarRightOffsetY = startOffsetY; -var midDigitOffsetX = startOffsetX + checkBarWidth + digitWidth * 4 + checkBarWidth; +let endBarOffsetX = upperTextBarRightOffsetX + textBarWidth; +let endBarOffsetY = startOffsetY; -var endCheckBarOffsetX = startOffsetX + checkBarWidth + digitWidth * 4 + checkBarWidth + digitWidth * 4; +let leftBarsStartX = startBarOffsetX + checkBarWidth; +let leftBarsStartY = upperTextBarLeftOffsetY + textBarHeight; + +let rightBarsStartX = midBarOffsetX + checkBarWidth; +let rightBarsStartY = upperTextBarRightOffsetY + textBarHeight; let intCaster = num => Number(num); var drawTimeout; function renderWatch(l) { - g.setFont("4x6",2); + g.setFont("4x6",2); - // work out how to display the current time + // work out how to display the current time - var offsetY = l.y; + var d = new Date(); + var h = d.getHours(), m = d.getMinutes(); + var time = h + ":" + ("0"+m).substr(-2); + //var month = ("0" + (d.getMonth()+1)).slice(-2); + var dayOfMonth = ('0' + d.getDate()).slice(-2); + var dayOfWeek = d.getDay() || 7; + var concatTime = ("0"+h).substr(-2) + ("0"+m).substr(-2) + dayOfMonth + dayOfWeek; - var d = new Date(); - var h = d.getHours(), m = d.getMinutes(); - var time = h + ":" + ("0"+m).substr(-2); - //var month = ("0" + (d.getMonth()+1)).slice(-2); - var dayOfMonth = ('0' + d.getDate()).slice(-2); - var dayOfWeek = d.getDay() || 7; - var concatTime = ("0"+h).substr(-2) + ("0"+m).substr(-2) + dayOfMonth + dayOfWeek; + const chars = String(concatTime).split("").map((concatTime) => { + return Number(concatTime); + }); + const checkSum = calculateChecksum(chars); + concatTime += checkSum; - const chars = String(concatTime).split("").map((concatTime) => { - return Number(concatTime); - }); + drawCheckBar(startBarOffsetX, startBarOffsetY); - drawStart(startOffsetX, offsetY); + drawLDigit(chars[0], 0, leftBarsStartY); + drawLDigit(chars[1], 1, leftBarsStartY); + drawLDigit(chars[2], 2, leftBarsStartY); + drawLDigit(chars[3], 3, leftBarsStartY); - drawLDigit(chars[0], 0, offsetY); - drawLDigit(chars[1], 1, offsetY); - drawLDigit(chars[2], 2, offsetY); - drawLDigit(chars[3], 3, offsetY); + g.drawString(Bangle.getStepCount(), startOffsetX + checkBarWidth + 3, startOffsetY + 4); + g.drawString(concatTime.substring(0,4), startOffsetX + checkBarWidth + 3, startOffsetY + textBarHeight + digitBarHeight + 6); - drawMid(midCheckBarOffsetX, offsetY); + drawCheckBar(midBarOffsetX, midBarOffsetY); - drawRDigit(chars[4], 0, offsetY); - drawRDigit(chars[5], 1, offsetY); - drawRDigit(chars[6], 2, offsetY); - drawRDigit(calculateChecksum(chars), 3, offsetY); + drawRDigit(chars[4], 0, rightBarsStartY); + drawRDigit(chars[5], 1, rightBarsStartY); + drawRDigit(chars[6], 2, rightBarsStartY); + drawRDigit(checkSum, 3, rightBarsStartY); - drawEnd(endCheckBarOffsetX, offsetY); + g.drawString(concatTime.substring(4), midBarOffsetX + checkBarWidth + 3, startOffsetY + textBarHeight + digitBarHeight + 6); - // schedule a draw for the next minute - if (drawTimeout) { - clearTimeout(drawTimeout); - } - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - layout.render(layout.watch); - }, 60000 - (Date.now() % 60000)); + drawCheckBar(endBarOffsetX, endBarOffsetY); + + // schedule a draw for the next minute + if (drawTimeout) { + clearTimeout(drawTimeout); + } + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + layout.render(layout.watch); + }, (1000 * 60 * 5) - (Date.now() % (1000 * 60 * 5))); } function drawLDigit(digit, index, offsetY) { - switch(digit) { - case 0: - drawLZeroWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - case 1: - drawLOneWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - case 2: - drawLTwoWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - case 3: - drawLThreeWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - case 4: - drawLFourWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - case 5: - drawLFiveWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - case 6: - drawLSixWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - case 7: - drawLSevenWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - case 8: - drawLEightWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - case 9: - drawLNineWithOffset(startDigitOffsetX+(digitWidth*index), offsetY); - break; - } + switch(digit) { + case 0: + drawLZeroWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + case 1: + drawLOneWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + case 2: + drawLTwoWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + case 3: + drawLThreeWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + case 4: + drawLFourWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + case 5: + drawLFiveWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + case 6: + drawLSixWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + case 7: + drawLSevenWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + case 8: + drawLEightWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + case 9: + drawLNineWithOffset(leftBarsStartX+(digitBarWidth*index), offsetY); + break; + } } function drawRDigit(digit, index, offsetY) { - switch(digit) { - case 0: - drawRZeroWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - case 1: - drawROneWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - case 2: - drawRTwoWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - case 3: - drawRThreeWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - case 4: - drawRFourWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - case 5: - drawRFiveWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - case 6: - drawRSixWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - case 7: - drawRSevenWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - case 8: - drawREightWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - case 9: - drawRNineWithOffset(midDigitOffsetX+(digitWidth*index), offsetY); - break; - } + switch(digit) { + case 0: + drawRZeroWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + case 1: + drawROneWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + case 2: + drawRTwoWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + case 3: + drawRThreeWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + case 4: + drawRFourWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + case 5: + drawRFiveWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + case 6: + drawRSixWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + case 7: + drawRSevenWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + case 8: + drawREightWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + case 9: + drawRNineWithOffset(rightBarsStartX+(digitBarWidth*index), offsetY); + break; + } } /* @@ -150,83 +176,83 @@ LEAN xxxx xx */ function drawLOneWithOffset(offset, offsetY) { - let barOneX = 4; - let barTwoX = 12; - g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); - g.drawString("1",offset+3,offsetY+digitHeight+5); + let barOneX = 4; + let barTwoX = 12; + g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight); + //g.drawString("1",offset+3,offsetY+digitHeight+5); } function drawLTwoWithOffset(offset, offsetY) { - let barOneX = 4; - let barTwoX = 10; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); - g.drawString("2",offset+3,offsetY+digitHeight+5); + let barOneX = 4; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitBarHeight); + //g.drawString("2",offset+3,offsetY+digitHeight+5); } function drawLThreeWithOffset(offset, offsetY) { - let barOneX = 2; - let barTwoX = 12; - g.fillRect(barOneX+offset,offsetY+0,barOneX+7+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); - g.drawString("3",offset+3,offsetY+digitHeight+5); + let barOneX = 2; + let barTwoX = 12; + g.fillRect(barOneX+offset,offsetY+0,barOneX+7+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight); + //g.drawString("3",offset+3,offsetY+digitHeight+5); } function drawLFourWithOffset(offset, offsetY) { - let barOneX = 2; - let barTwoX = 10; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); - g.drawString("4",offset+3,offsetY+digitHeight+5); + let barOneX = 2; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitBarHeight); + //g.drawString("4",offset+3,offsetY+digitHeight+5); } function drawLFiveWithOffset(offset, offsetY) { - let barOneX = 2; - let barTwoX = 12; - g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); - g.drawString("5",offset+3,offsetY+digitHeight+5); + let barOneX = 2; + let barTwoX = 12; + g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight); + //g.drawString("5",offset+3,offsetY+digitHeight+5); } function drawLSixWithOffset(offset, offsetY) { - let barOneX = 2; - let barTwoX = 6; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+7+offset,offsetY+digitHeight); - g.drawString("6",offset+3,offsetY+digitHeight+5); + let barOneX = 2; + let barTwoX = 6; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+7+offset,offsetY+digitBarHeight); + //g.drawString("6",offset+3,offsetY+digitHeight+5); } function drawLSevenWithOffset(offset, offsetY) { - let barOneX = 2; - let barTwoX = 10; - g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); - g.drawString("7",offset+3,offsetY+digitHeight+5); + let barOneX = 2; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitBarHeight); + //g.drawString("7",offset+3,offsetY+digitHeight+5); } function drawLEightWithOffset(offset, offsetY) { - let barOneX = 2; - let barTwoX = 8; - g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitHeight); - g.drawString("8",offset+3,offsetY+digitHeight+5); + let barOneX = 2; + let barTwoX = 8; + g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitBarHeight); + //g.drawString("8",offset+3,offsetY+digitHeight+5); } function drawLNineWithOffset(offset, offsetY) { - let barOneX = 6; - let barTwoX = 10; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitHeight); - g.drawString("9",offset+3,offsetY+digitHeight+5); + let barOneX = 6; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+3+offset,offsetY+digitBarHeight); + //g.drawString("9",offset+3,offsetY+digitHeight+5); } function drawLZeroWithOffset(offset, offsetY) { - let barOneX = 6; - let barTwoX = 12; - g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); - g.drawString("0",offset+3,offsetY+digitHeight+5); + let barOneX = 6; + let barTwoX = 12; + g.fillRect(barOneX+offset,offsetY+0,barOneX+3+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight); + //g.drawString("0",offset+3,offsetY+digitHeight+5); } @@ -248,125 +274,109 @@ xxxxxx xx */ function drawROneWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 8; - g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+3,offsetY+digitHeight); - g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+3,offsetY+digitHeight); - g.drawString("1",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 8; + g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+3,offsetY+digitBarHeight); + g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+3,offsetY+digitBarHeight); + //g.drawString("1",offset+2,offsetY+textHeight+5); } function drawRTwoWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 6; - g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+3,offsetY+digitHeight); - g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+3,offsetY+digitHeight); - g.drawString("2",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 6; + g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+3,offsetY+digitBarHeight); + g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+3,offsetY+digitBarHeight); + //g.drawString("2",offset+2,offsetY+textHeight+5); } function drawRThreeWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 10; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); - g.drawString("3",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight); + //g.drawString("3",offset+2,offsetY+textHeight+5); } function drawRFourWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 4; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitHeight); - g.drawString("4",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 4; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitBarHeight); + //g.drawString("4",offset+2,offsetY+textHeight+5); } function drawRFiveWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 6; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitHeight); - g.drawString("5",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 6; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+5+offset,offsetY+digitBarHeight); + //g.drawString("5",offset+2,offsetY+textHeight+5); } function drawRSixWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 4; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); - g.drawString("6",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 4; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight); + //g.drawString("6",offset+2,offsetY+textHeight+5); } function drawRSevenWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 8; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); - g.drawString("7",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 8; + g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight); + //g.drawString("7",offset+2,offsetY+textHeight+5); } function drawREightWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 6; - g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+1,offsetY+digitHeight); - g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+1,offsetY+digitHeight); - g.drawString("8",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 6; + g.fillRect(offset+barOneX,offsetY+0,offset+barOneX+1,offsetY+digitBarHeight); + g.fillRect(offset+barTwoX,offsetY+0,offset+barTwoX+1,offsetY+digitBarHeight); + //g.drawString("8",offset+2,offsetY+textHeight+5); } function drawRNineWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 8; - g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); - g.drawString("9",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 8; + g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight); + //g.drawString("9",offset+2,offsetY+textHeight+5); } function drawRZeroWithOffset(offset, offsetY) { - let barOneX = 0; - let barTwoX = 10; - g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitHeight); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight); - g.drawString("0",offset+2,offsetY+digitHeight+5); + let barOneX = 0; + let barTwoX = 10; + g.fillRect(barOneX+offset,offsetY+0,barOneX+5+offset,offsetY+digitBarHeight); + g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitBarHeight); + //g.drawString("0",offset+2,offsetY+textHeight+5); } - - - - -function drawStart(offset, offsetY) { - let barOneX = 2; - let barTwoX = 6; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight+15); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight+15); -} - -function drawMid(offset, offsetY) { - let barOneX = 2; - let barTwoX = 6; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight+15); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight+15); -} - -function drawEnd(offset, offsetY) { - let barOneX = 2; - let barTwoX = 6; - g.fillRect(barOneX+offset,offsetY+0,barOneX+1+offset,offsetY+digitHeight+15); - g.fillRect(barTwoX+offset,offsetY+0,barTwoX+1+offset,offsetY+digitHeight+15); +function drawCheckBar(offsetX, offsetY) { + const barOneX = offsetX+2; + const barOneWidth = 1; + const barTwoX = offsetX+6; + const barTwoWidth = 1; + g.fillRect(barOneX,offsetY,barOneX+barOneWidth,offsetY+checkBarHeight); + g.fillRect(barTwoX,offsetY,barTwoX+barTwoWidth,offsetY+checkBarHeight); } function calculateChecksum(digits) { - let oddSum = digits[6] + digits[4] + digits[2] + digits[0]; - let evenSum = digits[5] + digits[3] + digits[1]; + let oddSum = digits[6] + digits[4] + digits[2] + digits[0]; + let evenSum = digits[5] + digits[3] + digits[1]; - let checkSum = (10 - ((3 * oddSum + evenSum) % 10)) % 10; + let checkSum = (10 - ((3 * oddSum + evenSum) % 10)) % 10; - return checkSum; + return checkSum; } // The layout, referencing the custom renderer var Layout = require("Layout"); var layout = new Layout( { - type:"v", c: [ - {type:"custom", render:renderWatch, id:"watch", bgCol:g.theme.bg, fillx:1, filly:1 } - ] + type:"v", c: [ + {type:"custom", render:renderWatch, id:"watch", bgCol:g.theme.bg, fillx:1, filly:1 } + ] }); // Clear the screen once, at startup @@ -375,3 +385,7 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); Bangle.setUI("clock"); layout.render(); + +Bangle.on('lock', function(locked) { + layout.render(); +}); \ No newline at end of file diff --git a/apps/barcode/metadata.json b/apps/barcode/metadata.json index 350750e32..d0e5fb448 100644 --- a/apps/barcode/metadata.json +++ b/apps/barcode/metadata.json @@ -2,7 +2,7 @@ "name": "Barcode clock", "shortName":"Barcode clock", "icon": "barcode.icon.png", - "version":"0.05", + "version":"0.06", "description": "EAN-8 compatible barcode clock.", "tags": "barcode,ean,ean-8,watchface,clock,clockface", "type": "clock", From 700a0369a7293667b92033b25f8ce791abb7767c Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Mon, 16 May 2022 08:56:44 +0200 Subject: [PATCH 07/85] lcars: refractoring to prepare warning msgs --- apps/lcars/ChangeLog | 3 ++- apps/lcars/lcars.app.js | 18 ++++++++++-------- apps/lcars/metadata.json | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index e622feb1f..9a8ac4008 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -19,4 +19,5 @@ 0.19: Alarms can not go bigger than 100. 0.20: Use alarm for alarm functionality instead of own implementation. 0.21: Add custom theming. -0.22: Fix alarm and add build in function for step counting. \ No newline at end of file +0.22: Fix alarm and add build in function for step counting. +0.23: Add warning for low flash memory diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 07ca51fd9..584dc9caf 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -147,12 +147,14 @@ var iconCharging = { buffer : require("heatshrink").decompress(atob("23btugAwUBtoICARG0h048eODQYCJ6P/AAUCCJfbo4SDxYRLtEcuPHjlwgoRJ7RnIloUHoYjDAQfAExEAwUIkACEkSAIEYwCBhZKH6EIJI0CJRFHEY0BJRWBSgf//0AJRYSE4BKLj4SE8BKLv4RD/hK/JS2AXY0gXwRKG4cMmACCJQMAg8csEFJQsBAwfasEAm379u0gFbcBfHzgFBz1xMQZKBjY/D0E2+BOChu26yVEEYdww+cgAFCg+cgIfB6RKF4HbgEIkGChEAthfCJQ0eEAIjBBAMxk6GCJQtgtyVBwRKBAQMbHAJKGXIIFCgACBhl54qVG2E+EAJKBJoWAm0WJQ6SCXgdxFgMLJQvYjeAEAUwFIUitEtJQ14NwUHgEwKYZKGwOwNYX7XgWCg3CJQ5rB4MevPnAoPDJRJrCgEG/ECAoNsJRUwoEesIIBiJKI3CVDti/CJRKVDiJHBSo0YsOGjED8AjBcAcIgdhcAXAPIUAcAYIBcA4dBAQUG8BrBgBuCgOwcBEeXIK2BBAIFBgRqBGoYAChq8CcYUE4FbUYOACQsHzgjDgwFBCIImBAQsDtwYD7cAloRI22B86YBw5QBgoRJ7dAgYEDCJaeBJoMcsARMAQNoJIIRE6A")) }; -var iconNoBattery = { - text: "NO BAT", - width : 50, height : 50, bpp : 3, - transparent : 1, - buffer : require("heatshrink").decompress(atob("kmSpIC/AWMyoQIFsmECJFJhMmA4QXByVICIwODAQ4RRFIQGD5JVLkIGDzJqMyAGDph8MiRKGyApEAoZKFyYIDQwMkSQNkQZABBhIIOOJRuEL5gRIAUKACVQMhmUSNYNDQYJTBBwYFByGTkOE5FJWYNMknCAQKYCiaSCpmGochDoSYBhMwTAZrChILBhmEzKPBF4ImBTAREBDoMmEwJVDoYjBycJFgWEJQRuLJQ1kmQCCjJlCBYbjCagaDBwyDBmBuBF4TjJAUQKINBChCDQxZBcZIIQF4NIgEAgKSDiQmEVQKMBoARBAAMCSQLLBVoxqKL4gaCChVCNwoRKOIo4CJIgABBoSMHpIRFgDdJOIJUBCAUJRgJuEAQb+DIIgRIAX4C/ASOQA")) -}; +function iconWarning(msg) { + return { + text: msg, + width : 50, height : 50, bpp : 3, + transparent : 1, + buffer : require("heatshrink").decompress(atob("kmSpIC/AWMyoQIFsmECJFJhMmA4QXByVICIwODAQ4RRFIQGD5JVLkIGDzJqMyAGDph8MiRKGyApEAoZKFyYIDQwMkSQNkQZABBhIIOOJRuEL5gRIAUKACVQMhmUSNYNDQYJTBBwYFByGTkOE5FJWYNMknCAQKYCiaSCpmGochDoSYBhMwTAZrChILBhmEzKPBF4ImBTAREBDoMmEwJVDoYjBycJFgWEJQRuLJQ1kmQCCjJlCBYbjCagaDBwyDBmBuBF4TjJAUQKINBChCDQxZBcZIIQF4NIgEAgKSDiQmEVQKMBoARBAAMCSQLLBVoxqKL4gaCChVCNwoRKOIo4CJIgABBoSMHpIRFgDdJOIJUBCAUJRgJuEAQb+DIIgRIAX4C/ASOQA")) + }; +} // Font to use: // @@ -325,12 +327,12 @@ function drawState(){ var hours = current.getHours(); var iconImg = Bangle.isCharging() ? iconCharging : - bat < 30 ? iconNoBattery : + bat < 30 ? iconWarning("NO BAT"): Bangle.isGPSOn() ? iconSatellite : hours % 4 == 0 ? iconSaturn : hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : - iconEarth; + { icon: iconEarth, text: "STATUS" }; g.drawImage(iconImg, 23, 118); g.setColor(cWhite); g.drawString("STATUS", 23+26, 108); diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index 40da1b37f..62a1c67db 100644 --- a/apps/lcars/metadata.json +++ b/apps/lcars/metadata.json @@ -3,7 +3,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.22", + "version":"0.23", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", From 9d2a2adf9a50e9558544f505f645af3dca7a6c29 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Mon, 16 May 2022 11:46:47 +0200 Subject: [PATCH 08/85] lcars: Warn when storage below 10% --- apps/lcars/lcars.app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 584dc9caf..a2da8a677 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -323,11 +323,13 @@ function drawState(){ if(!isAlarmEnabled()){ var bat = E.getBattery(); + var flash = storage.getFree() / process.env.STORAGE; var current = new Date(); var hours = current.getHours(); var iconImg = Bangle.isCharging() ? iconCharging : bat < 30 ? iconWarning("NO BAT"): + flash < 0.1 ? iconWarning("DISK"): Bangle.isGPSOn() ? iconSatellite : hours % 4 == 0 ? iconSaturn : hours % 4 == 1 ? iconMars : From cc0ad4d6a35817350fb25ee7d4b7872c13e715ad Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Mon, 16 May 2022 17:38:27 +0200 Subject: [PATCH 09/85] lcars: BAT/DISK warning label --- apps/lcars/lcars.app.js | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index a2da8a677..e81c0d6f3 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -147,14 +147,11 @@ var iconCharging = { buffer : require("heatshrink").decompress(atob("23btugAwUBtoICARG0h048eODQYCJ6P/AAUCCJfbo4SDxYRLtEcuPHjlwgoRJ7RnIloUHoYjDAQfAExEAwUIkACEkSAIEYwCBhZKH6EIJI0CJRFHEY0BJRWBSgf//0AJRYSE4BKLj4SE8BKLv4RD/hK/JS2AXY0gXwRKG4cMmACCJQMAg8csEFJQsBAwfasEAm379u0gFbcBfHzgFBz1xMQZKBjY/D0E2+BOChu26yVEEYdww+cgAFCg+cgIfB6RKF4HbgEIkGChEAthfCJQ0eEAIjBBAMxk6GCJQtgtyVBwRKBAQMbHAJKGXIIFCgACBhl54qVG2E+EAJKBJoWAm0WJQ6SCXgdxFgMLJQvYjeAEAUwFIUitEtJQ14NwUHgEwKYZKGwOwNYX7XgWCg3CJQ5rB4MevPnAoPDJRJrCgEG/ECAoNsJRUwoEesIIBiJKI3CVDti/CJRKVDiJHBSo0YsOGjED8AjBcAcIgdhcAXAPIUAcAYIBcA4dBAQUG8BrBgBuCgOwcBEeXIK2BBAIFBgRqBGoYAChq8CcYUE4FbUYOACQsHzgjDgwFBCIImBAQsDtwYD7cAloRI22B86YBw5QBgoRJ7dAgYEDCJaeBJoMcsARMAQNoJIIRE6A")) }; -function iconWarning(msg) { - return { - text: msg, - width : 50, height : 50, bpp : 3, - transparent : 1, - buffer : require("heatshrink").decompress(atob("kmSpIC/AWMyoQIFsmECJFJhMmA4QXByVICIwODAQ4RRFIQGD5JVLkIGDzJqMyAGDph8MiRKGyApEAoZKFyYIDQwMkSQNkQZABBhIIOOJRuEL5gRIAUKACVQMhmUSNYNDQYJTBBwYFByGTkOE5FJWYNMknCAQKYCiaSCpmGochDoSYBhMwTAZrChILBhmEzKPBF4ImBTAREBDoMmEwJVDoYjBycJFgWEJQRuLJQ1kmQCCjJlCBYbjCagaDBwyDBmBuBF4TjJAUQKINBChCDQxZBcZIIQF4NIgEAgKSDiQmEVQKMBoARBAAMCSQLLBVoxqKL4gaCChVCNwoRKOIo4CJIgABBoSMHpIRFgDdJOIJUBCAUJRgJuEAQb+DIIgRIAX4C/ASOQA")) - }; -} +var iconWarning = { + width : 50, height : 50, bpp : 3, + transparent : 1, + buffer : require("heatshrink").decompress(atob("kmSpIC/AWMyoQIFsmECJFJhMmA4QXByVICIwODAQ4RRFIQGD5JVLkIGDzJqMyAGDph8MiRKGyApEAoZKFyYIDQwMkSQNkQZABBhIIOOJRuEL5gRIAUKACVQMhmUSNYNDQYJTBBwYFByGTkOE5FJWYNMknCAQKYCiaSCpmGochDoSYBhMwTAZrChILBhmEzKPBF4ImBTAREBDoMmEwJVDoYjBycJFgWEJQRuLJQ1kmQCCjJlCBYbjCagaDBwyDBmBuBF4TjJAUQKINBChCDQxZBcZIIQF4NIgEAgKSDiQmEVQKMBoARBAAMCSQLLBVoxqKL4gaCChVCNwoRKOIo4CJIgABBoSMHpIRFgDdJOIJUBCAUJRgJuEAQb+DIIgRIAX4C/ASOQA")) +}; // Font to use: // @@ -326,18 +323,18 @@ function drawState(){ var flash = storage.getFree() / process.env.STORAGE; var current = new Date(); var hours = current.getHours(); - var iconImg = - Bangle.isCharging() ? iconCharging : - bat < 30 ? iconWarning("NO BAT"): - flash < 0.1 ? iconWarning("DISK"): - Bangle.isGPSOn() ? iconSatellite : - hours % 4 == 0 ? iconSaturn : - hours % 4 == 1 ? iconMars : - hours % 4 == 2 ? iconMoon : + var iconMsg = + Bangle.isCharging() ? { icon: iconCharging, text: "STATUS" } : + bat < 30 ? { icon: iconWarning, text: "BAT" } : + flash < 0.1 ? { icon: iconWarning, text: "DISK" } : + Bangle.isGPSOn() ? { icon: iconSatellite, text: "STATUS" } : + hours % 4 == 0 ? { icon: iconSaturn, text: "STATUS" } : + hours % 4 == 1 ? { icon: iconMars, text: "STATUS" } : + hours % 4 == 2 ? { icon: iconMoon, text: "STATUS" } : { icon: iconEarth, text: "STATUS" }; - g.drawImage(iconImg, 23, 118); + g.drawImage(iconMsg.icon, 23, 118); g.setColor(cWhite); - g.drawString("STATUS", 23+26, 108); + g.drawString(iconMsg.text, 23+26, 108); } else { // Alarm within symbol g.setColor(color2); From 616277fe5de434ef3f9c42f0f182d726b64b88b4 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Wed, 18 May 2022 23:14:37 +0200 Subject: [PATCH 10/85] Step count resets around midnight --- apps/barcode/ChangeLog | 3 ++- apps/barcode/barcode.app.js | 38 +++++++++++++++++++++++++++++++++++-- apps/barcode/metadata.json | 2 +- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/apps/barcode/ChangeLog b/apps/barcode/ChangeLog index d97fd8af8..ae89926a5 100644 --- a/apps/barcode/ChangeLog +++ b/apps/barcode/ChangeLog @@ -3,4 +3,5 @@ 0.03: Interaction 0.04: Shows day of week 0.05: Shows day of month -0.06: Updates every 5 minutes when locked, or when unlock occurs. Also shows nr of steps. \ No newline at end of file +0.06: Updates every 5 minutes when locked, or when unlock occurs. Also shows nr of steps. +0.07: Step count resets at midnight \ No newline at end of file diff --git a/apps/barcode/barcode.app.js b/apps/barcode/barcode.app.js index 9f4d31122..0f6684733 100644 --- a/apps/barcode/barcode.app.js +++ b/apps/barcode/barcode.app.js @@ -36,6 +36,8 @@ let leftBarsStartY = upperTextBarLeftOffsetY + textBarHeight; let rightBarsStartX = midBarOffsetX + checkBarWidth; let rightBarsStartY = upperTextBarRightOffsetY + textBarHeight; +/* Utilities */ +let stepCount = 0; let intCaster = num => Number(num); var drawTimeout; @@ -66,7 +68,7 @@ function renderWatch(l) { drawLDigit(chars[2], 2, leftBarsStartY); drawLDigit(chars[3], 3, leftBarsStartY); - g.drawString(Bangle.getStepCount(), startOffsetX + checkBarWidth + 3, startOffsetY + 4); + g.drawString(getStepCount(), startOffsetX + checkBarWidth + 3, startOffsetY + 4); g.drawString(concatTime.substring(0,4), startOffsetX + checkBarWidth + 3, startOffsetY + textBarHeight + digitBarHeight + 6); drawCheckBar(midBarOffsetX, midBarOffsetY); @@ -371,6 +373,36 @@ function calculateChecksum(digits) { return checkSum; } +function storeStepCount() { + stepCount = Bangle.getStepCount(); +} + +function getStepCount() { + let accumulatedSteps = Bangle.getStepCount(); + if(accumulatedSteps <= stepCount) { + return 0; + } + return accumulatedSteps - stepCount; +} + +function resetAtMidnight() { + var now = new Date(); + var night = new Date( + now.getFullYear(), + now.getMonth(), + now.getDate() + 1, // the next day, ... + 23, 58, 0 // ...at 00:00:00 hours + ); + var msToMidnight = night.getTime() - now.getTime(); + + setTimeout(function() { + storeStepCount(); // <-- This is the function being called at midnight. + resetAtMidnight(); // Then, reset again next midnight. + }, msToMidnight); +} + +resetAtMidnight(); + // The layout, referencing the custom renderer var Layout = require("Layout"); var layout = new Layout( { @@ -387,5 +419,7 @@ Bangle.setUI("clock"); layout.render(); Bangle.on('lock', function(locked) { - layout.render(); + if(!locked) { + layout.render(); + } }); \ No newline at end of file diff --git a/apps/barcode/metadata.json b/apps/barcode/metadata.json index d0e5fb448..5c23acada 100644 --- a/apps/barcode/metadata.json +++ b/apps/barcode/metadata.json @@ -2,7 +2,7 @@ "name": "Barcode clock", "shortName":"Barcode clock", "icon": "barcode.icon.png", - "version":"0.06", + "version":"0.07", "description": "EAN-8 compatible barcode clock.", "tags": "barcode,ean,ean-8,watchface,clock,clockface", "type": "clock", From 9a153d937657c7215630957a364dedd8b2e1bfd2 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Fri, 20 May 2022 01:16:28 +0200 Subject: [PATCH 11/85] Reset count more reliable and also shows additional info --- apps/barcode/ChangeLog | 3 ++- apps/barcode/barcode.app.js | 13 ++++++++----- apps/barcode/metadata.json | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/barcode/ChangeLog b/apps/barcode/ChangeLog index ae89926a5..fd55ead4b 100644 --- a/apps/barcode/ChangeLog +++ b/apps/barcode/ChangeLog @@ -4,4 +4,5 @@ 0.04: Shows day of week 0.05: Shows day of month 0.06: Updates every 5 minutes when locked, or when unlock occurs. Also shows nr of steps. -0.07: Step count resets at midnight \ No newline at end of file +0.07: Step count resets at midnight +0.08: Step count stored in memory to survive reloads. Now shows step count daily and since last reboot. diff --git a/apps/barcode/barcode.app.js b/apps/barcode/barcode.app.js index 0f6684733..d8f478b21 100644 --- a/apps/barcode/barcode.app.js +++ b/apps/barcode/barcode.app.js @@ -37,7 +37,8 @@ let rightBarsStartX = midBarOffsetX + checkBarWidth; let rightBarsStartY = upperTextBarRightOffsetY + textBarHeight; /* Utilities */ -let stepCount = 0; +let stepCount = require("Storage").readJSON("stepCount",1); +if(stepCount === undefined) stepCount = 0; let intCaster = num => Number(num); var drawTimeout; @@ -78,6 +79,7 @@ function renderWatch(l) { drawRDigit(chars[6], 2, rightBarsStartY); drawRDigit(checkSum, 3, rightBarsStartY); + g.drawString(Bangle.getStepCount(), midBarOffsetX + checkBarWidth + 3, startOffsetY + 4); g.drawString(concatTime.substring(4), midBarOffsetX + checkBarWidth + 3, startOffsetY + textBarHeight + digitBarHeight + 6); drawCheckBar(endBarOffsetX, endBarOffsetY); @@ -375,6 +377,7 @@ function calculateChecksum(digits) { function storeStepCount() { stepCount = Bangle.getStepCount(); + require("Storage").writeJSON("stepCount",stepCount); } function getStepCount() { @@ -386,14 +389,14 @@ function getStepCount() { } function resetAtMidnight() { - var now = new Date(); - var night = new Date( + let now = new Date(); + let night = new Date( now.getFullYear(), now.getMonth(), now.getDate() + 1, // the next day, ... 23, 58, 0 // ...at 00:00:00 hours - ); - var msToMidnight = night.getTime() - now.getTime(); +); + let msToMidnight = night.getTime() - now.getTime(); setTimeout(function() { storeStepCount(); // <-- This is the function being called at midnight. diff --git a/apps/barcode/metadata.json b/apps/barcode/metadata.json index 5c23acada..bb8a960fe 100644 --- a/apps/barcode/metadata.json +++ b/apps/barcode/metadata.json @@ -2,7 +2,7 @@ "name": "Barcode clock", "shortName":"Barcode clock", "icon": "barcode.icon.png", - "version":"0.07", + "version":"0.08", "description": "EAN-8 compatible barcode clock.", "tags": "barcode,ean,ean-8,watchface,clock,clockface", "type": "clock", From f4525c6f78b6e7a49217c982b7d419e79971f570 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Sat, 21 May 2022 11:51:12 +0200 Subject: [PATCH 12/85] Daily count reset fix --- apps/barcode/ChangeLog | 1 + apps/barcode/barcode.app.js | 2 +- apps/barcode/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/barcode/ChangeLog b/apps/barcode/ChangeLog index fd55ead4b..4f99f15ac 100644 --- a/apps/barcode/ChangeLog +++ b/apps/barcode/ChangeLog @@ -6,3 +6,4 @@ 0.06: Updates every 5 minutes when locked, or when unlock occurs. Also shows nr of steps. 0.07: Step count resets at midnight 0.08: Step count stored in memory to survive reloads. Now shows step count daily and since last reboot. +0.09: NOW it really should reset daily (instead of every other day...) diff --git a/apps/barcode/barcode.app.js b/apps/barcode/barcode.app.js index d8f478b21..89419f33c 100644 --- a/apps/barcode/barcode.app.js +++ b/apps/barcode/barcode.app.js @@ -393,7 +393,7 @@ function resetAtMidnight() { let night = new Date( now.getFullYear(), now.getMonth(), - now.getDate() + 1, // the next day, ... + now.getDate(), // the next day, ... 23, 58, 0 // ...at 00:00:00 hours ); let msToMidnight = night.getTime() - now.getTime(); diff --git a/apps/barcode/metadata.json b/apps/barcode/metadata.json index bb8a960fe..cef267b2b 100644 --- a/apps/barcode/metadata.json +++ b/apps/barcode/metadata.json @@ -2,7 +2,7 @@ "name": "Barcode clock", "shortName":"Barcode clock", "icon": "barcode.icon.png", - "version":"0.08", + "version":"0.09", "description": "EAN-8 compatible barcode clock.", "tags": "barcode,ean,ean-8,watchface,clock,clockface", "type": "clock", From 700760ff1e408bb1152cf4c0c3fe1e0aa6560fef Mon Sep 17 00:00:00 2001 From: dronesflier <42714028+dronesflier@users.noreply.github.com> Date: Thu, 26 May 2022 20:53:40 +0200 Subject: [PATCH 13/85] attempt to upload subjects.txt --- apps/homework/subjects.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/homework/subjects.html b/apps/homework/subjects.html index d3bf7a400..608c7dce7 100644 --- a/apps/homework/subjects.html +++ b/apps/homework/subjects.html @@ -20,9 +20,10 @@ // send finished app (in addition to contents of app.json) sendCustomizedApp({ storage:[ - {name:"subjects.txt"}, + {name:"subjects.txt", url:"subjects.txt", content:app}, ] }); + console.log("Sent homework.subjects.txt!"); }); From 01f16f196ca4b199ca1b57adf470527df54d1b02 Mon Sep 17 00:00:00 2001 From: dronesflier <42714028+dronesflier@users.noreply.github.com> Date: Thu, 26 May 2022 20:58:19 +0200 Subject: [PATCH 14/85] change subjects.txt to homework.subjects.txt and hope it doesn't break --- apps/homework/subjects.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/homework/subjects.html b/apps/homework/subjects.html index 608c7dce7..92c3023dd 100644 --- a/apps/homework/subjects.html +++ b/apps/homework/subjects.html @@ -20,7 +20,7 @@ // send finished app (in addition to contents of app.json) sendCustomizedApp({ storage:[ - {name:"subjects.txt", url:"subjects.txt", content:app}, + {name:"homework.subjects.txt", url:"subjects.txt", content:app}, ] }); console.log("Sent homework.subjects.txt!"); From ecc6e8b6667c277ccfd48148cd3ce6425ebaf3de Mon Sep 17 00:00:00 2001 From: dronesflier <42714028+dronesflier@users.noreply.github.com> Date: Thu, 26 May 2022 20:59:18 +0200 Subject: [PATCH 15/85] add data section --- apps/homework/metadata.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/homework/metadata.json b/apps/homework/metadata.json index 2ba1e918f..a46c74dad 100644 --- a/apps/homework/metadata.json +++ b/apps/homework/metadata.json @@ -9,6 +9,10 @@ "supports" : ["BANGLEJS2"], "readme": "README.md", "custom": "subjects.html", + "data": [ + {"name":"homework.txt" }, + {"name":"homework.subjects.txt" } + ], "storage": [ {"name":"homework.app.js","url":"app.js"}, {"name":"homework.img","url":"app-icon.js","evaluate":true} From b4ae6e47c69420ef330c36f7eb32e594d382989b Mon Sep 17 00:00:00 2001 From: dronesflier <42714028+dronesflier@users.noreply.github.com> Date: Thu, 26 May 2022 20:59:38 +0200 Subject: [PATCH 16/85] homework.subjects.txt --- apps/homework/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/homework/app.js b/apps/homework/app.js index 4ba786690..3d9be31c9 100644 --- a/apps/homework/app.js +++ b/apps/homework/app.js @@ -14,7 +14,7 @@ var nhwmn = { // New homework Menu function newHomeworkMenu() { E.showMessage("Getting subjects..."); - var rawsubjects = require("Storage").read("subjects.txt"); // This code reads out the subjects list and removes the newline character at the end + var rawsubjects = require("Storage").read("homework.subjects.txt"); // This code reads out the subjects list and removes the newline character at the end var splitsubjects = rawsubjects.split(","); var lastItem = splitsubjects[splitsubjects.length - 1]; var thiscurrentsubject; From 6e88874d418ba0108df2aeda8f4c6606bf91b7c9 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Thu, 26 May 2022 21:02:07 +0200 Subject: [PATCH 17/85] [ActivityReminder] Better handling of period going through midnight --- apps/activityreminder/boot.js | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/apps/activityreminder/boot.js b/apps/activityreminder/boot.js index 7c094f521..25e31923c 100644 --- a/apps/activityreminder/boot.js +++ b/apps/activityreminder/boot.js @@ -2,17 +2,17 @@ function run() { if (isNotWorn()) return; let now = new Date(); let h = now.getHours(); - let health = Bangle.getHealthStatus("day"); - if (h >= activityreminder_settings.startHour && h < activityreminder_settings.endHour) { + if (isDuringAlertHours(h)) { + let health = Bangle.getHealthStatus("day"); if (health.steps - activityreminder_data.stepsOnDate >= activityreminder_settings.minSteps // more steps made than needed || health.steps < activityreminder_data.stepsOnDate) { // new day or reboot of the watch activityreminder_data.stepsOnDate = health.steps; activityreminder_data.stepsDate = now; activityreminder.saveData(activityreminder_data); /* todo in a futur release - add settimer to trigger like 10 secs after the stepsDate + minSteps - cancel all other timers of this app + Add settimer to trigger like 30 secs after going in this part cause the person have been walking + (pass some argument to run() to handle long walks and not triggering so often) */ } @@ -28,18 +28,39 @@ function isNotWorn() { return Bangle.isCharging(); } +function isDuringAlertHours(h) { + if(activityreminder_settings.startHour < activityreminder_settings.endHour){ // not passing through midnight + return (h >= activityreminder_settings.startHour && h < activityreminder_settings.endHour) + } else{ // passing through midnight + reutn (h >= activityreminder_settings.startHour || h < activityreminder_settings.endHour) + } +} + +Bangle.on('midnight', function() { + /* + Usefull trick to have the app working smothly for people using it at night + */ + let now = new Date(); + let h = now.getHours(); + if (activityreminder_settings.enabled && isDuringAlertHours(h)){ + // updating only the steps and keeping the original stepsDate on purpose + activityreminder_data.stepsOnDate = 0; + activityreminder.saveData(activityreminder_data); + } +}); + const activityreminder = require("activityreminder"); const activityreminder_settings = activityreminder.loadSettings(); if (activityreminder_settings.enabled) { const activityreminder_data = activityreminder.loadData(); if(activityreminder_data.firstLoad){ - activityreminder_data.firstLoad =false; + activityreminder_data.firstLoad = false; activityreminder.saveData(activityreminder_data); } setInterval(run, 60000); /* todo in a futur release increase setInterval time to something that is still sensible (5 mins ?) - add settimer to trigger like 10 secs after the stepsDate + minSteps - cancel all other timers of this app + when we added a settimer */ } + From 358b06fd6cbbf71e5e028bc7208ae9ec3503a778 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Thu, 26 May 2022 21:21:15 +0200 Subject: [PATCH 18/85] [ActivityReminder] Add temperature threshold to detect when the watch isn't worn --- apps/activityreminder/ChangeLog | 1 + apps/activityreminder/README.md | 1 + apps/activityreminder/boot.js | 2 +- apps/activityreminder/lib.js | 3 ++- apps/activityreminder/metadata.json | 2 +- apps/activityreminder/settings.js | 11 +++++++++++ 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/apps/activityreminder/ChangeLog b/apps/activityreminder/ChangeLog index d4b5100a2..4edb72aa5 100644 --- a/apps/activityreminder/ChangeLog +++ b/apps/activityreminder/ChangeLog @@ -3,3 +3,4 @@ 0.03: Do not alarm while charging 0.04: Obey system quiet mode 0.05: Battery optimisation, add the pause option, bug fixes +0.06: Add a temperature threshold to detect (and not alert) if the BJS isn't worn. Better support for the peoples using the app at night diff --git a/apps/activityreminder/README.md b/apps/activityreminder/README.md index 25e2c8d35..0c79b4141 100644 --- a/apps/activityreminder/README.md +++ b/apps/activityreminder/README.md @@ -11,4 +11,5 @@ Different settings can be personalized: - Dismiss delay: Delay added before the next alert if the alert is dismissed. From 5 to 60 min - Pause delay: Same as Dismiss delay but longer (usefull for meetings and such). From 30 to 240 min - Min steps: Minimal amount of steps to count as an activity +- Temp Threshold: Temperature threshold to determine if the watch is worn diff --git a/apps/activityreminder/boot.js b/apps/activityreminder/boot.js index 25e31923c..d4ea307d5 100644 --- a/apps/activityreminder/boot.js +++ b/apps/activityreminder/boot.js @@ -25,7 +25,7 @@ function run() { function isNotWorn() { // todo in a futur release check temperature and mouvement in a futur release - return Bangle.isCharging(); + return (Bangle.isCharging() || activityreminder_settings.tempThreshold <= E.getTemperature()); } function isDuringAlertHours(h) { diff --git a/apps/activityreminder/lib.js b/apps/activityreminder/lib.js index 5b7959827..08fffd5f4 100644 --- a/apps/activityreminder/lib.js +++ b/apps/activityreminder/lib.js @@ -8,7 +8,8 @@ exports.loadSettings = function () { maxInnactivityMin: 30, dismissDelayMin: 15, pauseDelayMin: 120, - minSteps: 50 + minSteps: 50, + tempThreshold: 27 }, storage.readJSON("activityreminder.s.json", true) || {}); }; diff --git a/apps/activityreminder/metadata.json b/apps/activityreminder/metadata.json index 15f10f2ed..752c6c101 100644 --- a/apps/activityreminder/metadata.json +++ b/apps/activityreminder/metadata.json @@ -3,7 +3,7 @@ "name": "Activity Reminder", "shortName":"Activity Reminder", "description": "A reminder to take short walks for the ones with a sedentary lifestyle", - "version":"0.05", + "version":"0.06", "icon": "app.png", "type": "app", "tags": "tool,activity", diff --git a/apps/activityreminder/settings.js b/apps/activityreminder/settings.js index 9dff61f48..7a4a022e6 100644 --- a/apps/activityreminder/settings.js +++ b/apps/activityreminder/settings.js @@ -71,6 +71,17 @@ settings.minSteps = v; activityreminder.writeSettings(settings); } + }, + 'Temp Threshold': { + value: settings.tempThreshold, + step: 0.5, + min: 20, + max: 40, + format: v => v + "°C", + onchange: v => { + settings.tempThreshold = v; + activityreminder.writeSettings(settings); + } } }); }) From d4edeb509667c3833a6642691b426534b00ed666 Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Thu, 26 May 2022 22:39:36 +0200 Subject: [PATCH 19/85] [Messages] Don't turn on the screen after unread timeout expires --- apps/messages/ChangeLog | 1 + apps/messages/metadata.json | 2 +- apps/messages/widget.js | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 53157f0d8..67c2f903a 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -51,3 +51,4 @@ 0.36: Ensure a new message plus an almost immediate deletion of that message doesn't load the messages app (fix #1362) 0.37: Now use the setUI 'back' icon in the top left rather than specific buttons/menu items 0.38: Add telegram foss handling +0.39: Don't turn on the screen after unread timeout expires (#1873) diff --git a/apps/messages/metadata.json b/apps/messages/metadata.json index fd09fdfe4..4bc9f59e4 100644 --- a/apps/messages/metadata.json +++ b/apps/messages/metadata.json @@ -1,7 +1,7 @@ { "id": "messages", "name": "Messages", - "version": "0.38", + "version": "0.39", "description": "App to display notifications from iOS and Gadgetbridge/Android", "icon": "app.png", "type": "app", diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 4b368ffd6..ca02d4f1f 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -27,7 +27,6 @@ draw:function(recall) { if (quiet) WIDGETS["messages"].t -= 500000; // if quiet, set last time in the past so there is no buzzing WIDGETS["messages"].width=this.iconwidth; Bangle.drawWidgets(); - Bangle.setLCDPower(1);// turns screen on },hide:function() { delete WIDGETS["messages"].t; delete WIDGETS["messages"].l; From dcac7426acf8a63459790344e5f9247242da4681 Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Fri, 27 May 2022 08:44:25 +0200 Subject: [PATCH 20/85] [Messages] Small code improvements --- apps/messages/app.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/apps/messages/app.js b/apps/messages/app.js index 745f7d208..46f010c0b 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -411,19 +411,17 @@ function cancelReloadTimeout() { unreadTimeout = undefined; } - g.clear(); + Bangle.loadWidgets(); Bangle.drawWidgets(); + setTimeout(() => { - var unreadTimeoutSecs = settings.unreadTimeout; - if (unreadTimeoutSecs===undefined) unreadTimeoutSecs=60; - if (unreadTimeoutSecs) - unreadTimeout = setTimeout(function() { - print("Message not seen - reloading"); - load(); - }, unreadTimeoutSecs*1000); + var unreadTimeoutMillis = (settings.unreadTimeout || 60) * 1000; + if (unreadTimeoutMillis) { + unreadTimeout = setTimeout(load, unreadTimeoutMillis); + } // only openMusic on launch if music is new - var newMusic = MESSAGES.some(m=>m.id==="music"&&m.new); - checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:1,openMusic:newMusic&&settings.openMusic}); -},10); // if checkMessages wants to 'load', do that + var newMusic = MESSAGES.some(m => m.id === "music" && m.new); + checkMessages({ clockIfNoMsg: 0, clockIfAllRead: 0, showMsgIfUnread: 1, openMusic: newMusic && settings.openMusic }); +}, 10); // if checkMessages wants to 'load', do that From 904f0d1260973c1a0f99ea5050e24b3113b84050 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Fri, 27 May 2022 09:50:07 +0200 Subject: [PATCH 21/85] [ActivityReminder] Fix tempThreshold --- apps/activityreminder/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/activityreminder/boot.js b/apps/activityreminder/boot.js index d4ea307d5..fa9b8557d 100644 --- a/apps/activityreminder/boot.js +++ b/apps/activityreminder/boot.js @@ -25,7 +25,7 @@ function run() { function isNotWorn() { // todo in a futur release check temperature and mouvement in a futur release - return (Bangle.isCharging() || activityreminder_settings.tempThreshold <= E.getTemperature()); + return (Bangle.isCharging() || activityreminder_settings.tempThreshold >= E.getTemperature()); } function isDuringAlertHours(h) { From c7231d243e900402068d3d0d0d1897eca9e681c1 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 27 May 2022 10:05:50 +0200 Subject: [PATCH 22/85] Use full screen for calibration --- apps/calibration/app.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/calibration/app.js b/apps/calibration/app.js index d3823de63..727a4c349 100644 --- a/apps/calibration/app.js +++ b/apps/calibration/app.js @@ -49,7 +49,7 @@ class BanglejsApp { this.x = 16 + Math.floor(Math.random() * (g.getWidth() - 32)); this.y = 40 + Math.floor(Math.random() * (g.getHeight() - 80)); - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.clearRect(0, 0, g.getWidth(), g.getHeight()); g.drawLine(this.x, this.y - 5, this.x, this.y + 5); g.drawLine(this.x - 5, this.y, this.x + 5, this.y); g.setFont('Vector', 10); @@ -64,8 +64,6 @@ class BanglejsApp { E.srand(Date.now()); -Bangle.loadWidgets(); -Bangle.drawWidgets(); calibration = new BanglejsApp(); calibration.load_settings(); From 5256acfe4cc2b7c3d140cf673d3d808f9fe9e1b7 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Fri, 27 May 2022 10:10:16 +0200 Subject: [PATCH 23/85] [ActivityReminder] Remove done todo --- apps/activityreminder/boot.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/activityreminder/boot.js b/apps/activityreminder/boot.js index fa9b8557d..a5e982a8b 100644 --- a/apps/activityreminder/boot.js +++ b/apps/activityreminder/boot.js @@ -24,7 +24,6 @@ function run() { } function isNotWorn() { - // todo in a futur release check temperature and mouvement in a futur release return (Bangle.isCharging() || activityreminder_settings.tempThreshold >= E.getTemperature()); } From c1ca89dc607e9cfc0882463f7de8aa136eeb23d1 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Fri, 27 May 2022 10:43:45 +0200 Subject: [PATCH 24/85] [ActivityReminder] Fix broken return --- apps/activityreminder/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/activityreminder/boot.js b/apps/activityreminder/boot.js index a5e982a8b..4ae9548c2 100644 --- a/apps/activityreminder/boot.js +++ b/apps/activityreminder/boot.js @@ -31,7 +31,7 @@ function isDuringAlertHours(h) { if(activityreminder_settings.startHour < activityreminder_settings.endHour){ // not passing through midnight return (h >= activityreminder_settings.startHour && h < activityreminder_settings.endHour) } else{ // passing through midnight - reutn (h >= activityreminder_settings.startHour || h < activityreminder_settings.endHour) + return (h >= activityreminder_settings.startHour || h < activityreminder_settings.endHour) } } From d48f674b1cd9ddc22a7890bed2bf9b7db12eaba1 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Fri, 27 May 2022 11:06:19 +0200 Subject: [PATCH 25/85] [ActivityReminder] Add "step" in settings to facilitate settings usage --- apps/activityreminder/settings.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/activityreminder/settings.js b/apps/activityreminder/settings.js index 7a4a022e6..f25697de0 100644 --- a/apps/activityreminder/settings.js +++ b/apps/activityreminder/settings.js @@ -55,7 +55,7 @@ }, 'Pause delay': { value: settings.pauseDelayMin, - min: 30, max: 240, + min: 30, max: 240, step: 5, onchange: v => { settings.pauseDelayMin = v; activityreminder.writeSettings(settings); @@ -66,7 +66,7 @@ }, 'Min steps': { value: settings.minSteps, - min: 10, max: 500, + min: 10, max: 500, step: 10, onchange: v => { settings.minSteps = v; activityreminder.writeSettings(settings); @@ -74,9 +74,7 @@ }, 'Temp Threshold': { value: settings.tempThreshold, - step: 0.5, - min: 20, - max: 40, + min: 20, max: 40, step: 0.5, format: v => v + "°C", onchange: v => { settings.tempThreshold = v; From 056adb78732427b1d5bdee048bb770401c76e8a8 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 27 May 2022 10:53:52 +0200 Subject: [PATCH 26/85] Adds scaling to correct for linear mismatches in coordinates --- apps/calibration/app.js | 87 +++++++++++++++++++++++++++++++--------- apps/calibration/boot.js | 6 +-- 2 files changed, 70 insertions(+), 23 deletions(-) diff --git a/apps/calibration/app.js b/apps/calibration/app.js index 727a4c349..6227b936a 100644 --- a/apps/calibration/app.js +++ b/apps/calibration/app.js @@ -1,26 +1,24 @@ class BanglejsApp { constructor() { + this.updateFactor = 0.2; this.x = 0; this.y = 0; + this.step = 0; this.settings = { xoffset: 0, yoffset: 0, + xscale: 1, + yscale: 1, }; } load_settings() { let settings = require('Storage').readJSON('calibration.json', true) || {active: false}; - // do nothing if the calibration is deactivated - if (settings.active === true) { - // cancel the calibration offset - Bangle.on('touch', function(button, xy) { - xy.x += settings.xoffset; - xy.y += settings.yoffset; - }); - } if (!settings.xoffset) settings.xoffset = 0; if (!settings.yoffset) settings.yoffset = 0; + if (!settings.xscale) settings.xscale = 1; + if (!settings.yscale) settings.yscale = 1; console.log('loaded settings:'); console.log(settings); @@ -46,19 +44,63 @@ class BanglejsApp { } drawTarget() { - this.x = 16 + Math.floor(Math.random() * (g.getWidth() - 32)); - this.y = 40 + Math.floor(Math.random() * (g.getHeight() - 80)); + switch (this.step){ + case 0: + this.x = Math.floor(0.2 * g.getWidth()); + this.y = Math.floor(0.2 * g.getHeight()); + break; + case 1: + this.x = Math.floor(0.8 * g.getWidth()); + this.y = Math.floor(0.2 * g.getHeight()); + break; + case 2: + this.x = Math.floor(0.5 * g.getWidth()); + this.y = Math.floor(0.5 * g.getHeight()); + break; + case 3: + this.x = Math.floor(0.2 * g.getWidth()); + this.y = Math.floor(0.8 * g.getHeight()); + break; + case 4: + this.x = Math.floor(0.8 * g.getWidth()); + this.y = Math.floor(0.8 * g.getHeight()); + break; + } - g.clearRect(0, 0, g.getWidth(), g.getHeight()); + g.setColor(g.theme.fg); g.drawLine(this.x, this.y - 5, this.x, this.y + 5); g.drawLine(this.x - 5, this.y, this.x + 5, this.y); g.setFont('Vector', 10); - g.drawString('current offset: ' + this.settings.xoffset + ', ' + this.settings.yoffset, 0, 24); + g.drawString('current offset: ' + this.settings.xoffset.toFixed(3) + ', ' + this.settings.yoffset.toFixed(3), 2, 2); + g.drawString('current scale: ' + this.settings.xscale.toFixed(3) + ', ' + this.settings.yscale.toFixed(3), 2, 12); } - + setOffset(xy) { - this.settings.xoffset = Math.round((this.settings.xoffset + (this.x - Math.floor((this.x + xy.x)/2)))/2); - this.settings.yoffset = Math.round((this.settings.yoffset + (this.y - Math.floor((this.y + xy.y)/2)))/2); + this.last=xy; + switch (this.step){ + case 0: + this.settings.xoffset = this.settings.xoffset * (1-this.updateFactor) + (this.x - xy.x) * this.updateFactor; + this.settings.yoffset = this.settings.yoffset * (1-this.updateFactor) + (this.y - xy.y) * this.updateFactor; + break; + case 1: + this.settings.xscale = this.settings.xscale * (1-this.updateFactor) + ((xy.x + this.settings.xoffset) / this.x) * this.updateFactor; + this.settings.yoffset = this.settings.yoffset * (1-this.updateFactor) + (this.y - xy.y) * this.updateFactor; + break; + case 3: + this.settings.xoffset = this.settings.xoffset * (1-this.updateFactor) + (this.x - xy.x) * this.updateFactor; + this.settings.yscale = this.settings.yscale * (1-this.updateFactor) + ((xy.y + this.settings.yoffset) / this.y) * this.updateFactor; + break; + case 2: + case 4: + this.settings.xscale = this.settings.xscale * (1-this.updateFactor) + ((xy.x + this.settings.xoffset) / this.x) * this.updateFactor; + this.settings.yscale = this.settings.yscale * (1-this.updateFactor) + ((xy.y + this.settings.yoffset) / this.y) * this.updateFactor; + break; + } + } + + nextStep() { + this.step++; + if ( this.step == 5 ) this.step = 0; } } @@ -67,6 +109,14 @@ E.srand(Date.now()); calibration = new BanglejsApp(); calibration.load_settings(); +Bangle.disableCalibration = true; + +function touchHandler (btn, xy){ + g.clearRect(0, 0, g.getWidth(), g.getHeight()); + if (xy) calibration.setOffset(xy); + calibration.drawTarget(); + calibration.nextStep(); +} let modes = { mode : 'custom', @@ -74,10 +124,7 @@ let modes = { calibration.save_settings(this.settings); load(); }, - touch : function(btn, xy) { - calibration.setOffset(xy); - calibration.drawTarget(); - }, + touch : touchHandler, }; Bangle.setUI(modes); -calibration.drawTarget(); +touchHandler(); diff --git a/apps/calibration/boot.js b/apps/calibration/boot.js index 237fb2e0d..2c60de26b 100644 --- a/apps/calibration/boot.js +++ b/apps/calibration/boot.js @@ -1,7 +1,7 @@ let cal_settings = require('Storage').readJSON("calibration.json", true) || {active: false}; Bangle.on('touch', function(button, xy) { // do nothing if the calibration is deactivated - if (cal_settings.active === false) return; + if (cal_settings.active === false || Bangle.disableCalibration) return; // reload the calibration offset at each touch event /!\ bad for the flash memory if (cal_settings.reload === true) { @@ -9,6 +9,6 @@ Bangle.on('touch', function(button, xy) { } // apply the calibration offset - xy.x += cal_settings.xoffset; - xy.y += cal_settings.yoffset; + xy.x = Math.round((xy.x + cal_settings.xoffset) * cal_settings.xscale); + xy.y = Math.round((xy.y + cal_settings.yoffset) * cal_settings.yscale); }); From cddaf36f1a7a0566c37018a81d69b2bc69ebf068 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 27 May 2022 12:20:09 +0200 Subject: [PATCH 27/85] Use median sample values --- apps/calibration/app.js | 117 +++++++++++++++++++++++----------------- 1 file changed, 69 insertions(+), 48 deletions(-) diff --git a/apps/calibration/app.js b/apps/calibration/app.js index 6227b936a..049430d45 100644 --- a/apps/calibration/app.js +++ b/apps/calibration/app.js @@ -1,38 +1,60 @@ class BanglejsApp { constructor() { - this.updateFactor = 0.2; + this.maxSamples = 16; + this.target = { + xMin: Math.floor(0.1 * g.getWidth()), + xMax: Math.floor(0.9 * g.getWidth()), + yMin: Math.floor(0.1 * g.getHeight()), + yMax: Math.floor(0.9 * g.getHeight()), + }; this.x = 0; this.y = 0; this.step = 0; this.settings = { - xoffset: 0, - yoffset: 0, - xscale: 1, - yscale: 1, + xoffset: [0], + yoffset: [0], + xMaxActual: [this.target.xMax], + yMaxActual: [this.target.yMax], }; } load_settings() { let settings = require('Storage').readJSON('calibration.json', true) || {active: false}; - if (!settings.xoffset) settings.xoffset = 0; - if (!settings.yoffset) settings.yoffset = 0; - if (!settings.xscale) settings.xscale = 1; - if (!settings.yscale) settings.yscale = 1; - console.log('loaded settings:'); console.log(settings); return settings; } - save_settings() { - this.settings.active = true; - this.settings.reload = false; - require('Storage').writeJSON('calibration.json', this.settings); + getMedian(array){ + array.sort(); + let i = Math.floor(array.length/2); + if ( array.length % 2 && array.length > 1 ){ + return (array[i]+array[i+1])/2; + } else { + return array[i]; + } + } - console.log('saved settings:'); - console.log(this.settings); + getMedianSettings(){ + let medianSettings = { + xoffset: this.getMedian(this.settings.xoffset), + yoffset: this.getMedian(this.settings.yoffset) + }; + + medianSettings.xscale = this.target.xMax / (medianSettings.xoffset + this.getMedian(this.settings.xMaxActual)); + medianSettings.yscale = this.target.yMax / (medianSettings.yoffset + this.getMedian(this.settings.yMaxActual)); + return medianSettings; + } + + save_settings() { + let settingsToSave = this.getMedianSettings(); + settingsToSave.active = true; + settingsToSave.reload = false; + require('Storage').writeJSON('calibration.json', settingsToSave); + + console.log('saved settings:', settingsToSave); } explain() { @@ -46,61 +68,61 @@ class BanglejsApp { drawTarget() { switch (this.step){ case 0: - this.x = Math.floor(0.2 * g.getWidth()); - this.y = Math.floor(0.2 * g.getHeight()); + this.x = this.target.xMin; + this.y = this.target.yMin; break; case 1: - this.x = Math.floor(0.8 * g.getWidth()); - this.y = Math.floor(0.2 * g.getHeight()); + this.x = this.target.xMax; + this.y = this.target.yMin; break; case 2: - this.x = Math.floor(0.5 * g.getWidth()); - this.y = Math.floor(0.5 * g.getHeight()); + this.x = this.target.xMin; + this.y = this.target.yMax; break; case 3: - this.x = Math.floor(0.2 * g.getWidth()); - this.y = Math.floor(0.8 * g.getHeight()); - break; - case 4: - this.x = Math.floor(0.8 * g.getWidth()); - this.y = Math.floor(0.8 * g.getHeight()); + this.x = this.target.xMax; + this.y = this.target.yMax; break; } + g.clearRect(0, 0, g.getWidth(), g.getHeight()); g.setColor(g.theme.fg); g.drawLine(this.x, this.y - 5, this.x, this.y + 5); g.drawLine(this.x - 5, this.y, this.x + 5, this.y); g.setFont('Vector', 10); - g.drawString('current offset: ' + this.settings.xoffset.toFixed(3) + ', ' + this.settings.yoffset.toFixed(3), 2, 2); - g.drawString('current scale: ' + this.settings.xscale.toFixed(3) + ', ' + this.settings.yscale.toFixed(3), 2, 12); + let medianSettings = this.getMedianSettings(); + g.drawString('current offset: ' + medianSettings.xoffset.toFixed(3) + ', ' + medianSettings.yoffset.toFixed(3), 2, (g.getHeight()/2)-6); + g.drawString('current scale: ' + medianSettings.xscale.toFixed(3) + ', ' + medianSettings.yscale.toFixed(3), 2, (g.getHeight()/2)+6); } - + setOffset(xy) { - this.last=xy; switch (this.step){ case 0: - this.settings.xoffset = this.settings.xoffset * (1-this.updateFactor) + (this.x - xy.x) * this.updateFactor; - this.settings.yoffset = this.settings.yoffset * (1-this.updateFactor) + (this.y - xy.y) * this.updateFactor; + this.settings.xoffset.push(this.x - xy.x); + this.settings.yoffset.push(this.y - xy.y); break; case 1: - this.settings.xscale = this.settings.xscale * (1-this.updateFactor) + ((xy.x + this.settings.xoffset) / this.x) * this.updateFactor; - this.settings.yoffset = this.settings.yoffset * (1-this.updateFactor) + (this.y - xy.y) * this.updateFactor; - break; - case 3: - this.settings.xoffset = this.settings.xoffset * (1-this.updateFactor) + (this.x - xy.x) * this.updateFactor; - this.settings.yscale = this.settings.yscale * (1-this.updateFactor) + ((xy.y + this.settings.yoffset) / this.y) * this.updateFactor; + this.settings.xMaxActual.push(xy.x); + this.settings.yoffset.push(this.y - xy.y); break; case 2: - case 4: - this.settings.xscale = this.settings.xscale * (1-this.updateFactor) + ((xy.x + this.settings.xoffset) / this.x) * this.updateFactor; - this.settings.yscale = this.settings.yscale * (1-this.updateFactor) + ((xy.y + this.settings.yoffset) / this.y) * this.updateFactor; + this.settings.xoffset.push(this.x - xy.x); + this.settings.yMaxActual.push(xy.y); + break; + case 3: + this.settings.xMaxActual.push(xy.x); + this.settings.yMaxActual.push(xy.y); break; } + + for (let c in this.settings){ + if (this.settings[c].length > this.maxSamples) this.settings[c] = this.settings[c].slice(1, this.maxSamples); + } } - + nextStep() { this.step++; - if ( this.step == 5 ) this.step = 0; + if ( this.step == 4 ) this.step = 0; } } @@ -112,10 +134,9 @@ calibration.load_settings(); Bangle.disableCalibration = true; function touchHandler (btn, xy){ - g.clearRect(0, 0, g.getWidth(), g.getHeight()); if (xy) calibration.setOffset(xy); - calibration.drawTarget(); calibration.nextStep(); + calibration.drawTarget(); } let modes = { @@ -127,4 +148,4 @@ let modes = { touch : touchHandler, }; Bangle.setUI(modes); -touchHandler(); +calibration.drawTarget(); From f763cd962f88d5393ee3a91e4b377e82dfb3e2a9 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 27 May 2022 13:16:47 +0200 Subject: [PATCH 28/85] Clip values to display range --- apps/calibration/boot.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/calibration/boot.js b/apps/calibration/boot.js index 2c60de26b..03b17a03a 100644 --- a/apps/calibration/boot.js +++ b/apps/calibration/boot.js @@ -9,6 +9,6 @@ Bangle.on('touch', function(button, xy) { } // apply the calibration offset - xy.x = Math.round((xy.x + cal_settings.xoffset) * cal_settings.xscale); - xy.y = Math.round((xy.y + cal_settings.yoffset) * cal_settings.yscale); + xy.x = E.clip(Math.round((xy.x + (cal_settings.xoffset || 0)) * (cal_settings.xscale || 1)),0,g.getWidth()); + xy.y = E.clip(Math.round((xy.y + (cal_settings.yoffset || 0)) * (cal_settings.yscale || 1)),0,g.getHeight()); }); From e8c7ea363e17c9d90621239a885e4667f999634b Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 27 May 2022 10:54:10 +0200 Subject: [PATCH 29/85] Bump version --- apps/calibration/ChangeLog | 2 ++ apps/calibration/metadata.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 apps/calibration/ChangeLog diff --git a/apps/calibration/ChangeLog b/apps/calibration/ChangeLog new file mode 100644 index 000000000..0e22605af --- /dev/null +++ b/apps/calibration/ChangeLog @@ -0,0 +1,2 @@ +1.00: New App! +1.01: Use fractional numbers and scale the points to keep working consistently on whole screen diff --git a/apps/calibration/metadata.json b/apps/calibration/metadata.json index 122a2c175..b7a719e1c 100644 --- a/apps/calibration/metadata.json +++ b/apps/calibration/metadata.json @@ -2,7 +2,7 @@ "name": "Touchscreen Calibration", "shortName":"Calibration", "icon": "calibration.png", - "version":"1.00", + "version":"1.01", "description": "A simple calibration app for the touchscreen", "supports": ["BANGLEJS","BANGLEJS2"], "readme": "README.md", From 0add5a9950830c1896ddffabf1324f5459bacab1 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 27 May 2022 13:20:05 +0200 Subject: [PATCH 30/85] Update readme --- apps/calibration/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/calibration/README.md b/apps/calibration/README.md index 37f637d21..ed1a29d9e 100644 --- a/apps/calibration/README.md +++ b/apps/calibration/README.md @@ -6,6 +6,7 @@ A simple calibration app for the touchscreen Once lauched touch the cross that appear on the screen to make another spawn elsewhere. -each new touch on the screen will help to calibrate the offset -of your finger on the screen. After five or more input, press -the button to save the calibration and close the application. \ No newline at end of file +Each new touch on the screen will help to calibrate the offset +of your finger on the screen. After four or more inputs, press +the button to save the calibration and close the application. Quality +of the calibration gets better with every touch on a cross. From ecd5868821bd8ad4334c21fd2f0f492c21985f32 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Fri, 27 May 2022 17:08:50 +0200 Subject: [PATCH 31/85] ClockFace: add settings support --- modules/ClockFace.js | 20 +++++++++++++++---- modules/ClockFace.md | 41 +++++++++++++++++++++++++++++++++++++++ modules/ClockFace_menu.js | 10 ++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 modules/ClockFace_menu.js diff --git a/modules/ClockFace.js b/modules/ClockFace.js index d6c3a2e66..f8dc33287 100644 --- a/modules/ClockFace.js +++ b/modules/ClockFace.js @@ -10,7 +10,8 @@ function ClockFace(options) { "precision", "init", "draw", "update", "pause", "resume", - "up", "down", "upDown" + "up", "down", "upDown", + "settingsFile", ].includes(k)) throw `Invalid ClockFace option: ${k}`; }); if (!options.draw && !options.update) throw "ClockFace needs at least one of draw() or update() functions"; @@ -33,7 +34,18 @@ function ClockFace(options) { }; if (options.upDown) this._upDown = options.upDown; - this.is12Hour = !!(require("Storage").readJSON("setting.json", 1) || {})["12hour"]; + if (options.settingsFile) { + const settings = (require("Storage").readJSON(options.settingsFile, true) || {}); + Object.keys(settings).forEach(k => { + this[k] = settings[k]; + }); + } + // these default to true + ["showDate", "loadWidgets"].forEach(k => { + if (this[k]===undefined) this[k] = true; + }); + // use global 24/12-hour setting if not set by clock-settings + if (!('is12Hour' in this)) this.is12Hour = !!(require("Storage").readJSON("setting.json", true) || {})["12hour"]; } ClockFace.prototype.tick = function() { @@ -46,7 +58,7 @@ ClockFace.prototype.tick = function() { }; if (!this._last) { g.clear(true); - Bangle.drawWidgets(); + if (global.WIDGETS) Bangle.drawWidgets(); g.reset(); this.draw.apply(this, [time, {d: true, h: true, m: true, s: true}]); } else { @@ -70,7 +82,7 @@ ClockFace.prototype.start = function() { .CLOCK is set by Bangle.setUI('clock') but we want to load widgets so we can check appRect and *then* call setUI. see #1864 */ Bangle.CLOCK = 1; - Bangle.loadWidgets(); + if (this.loadWidgets) Bangle.loadWidgets(); if (this.init) this.init.apply(this); if (this._upDown) Bangle.setUI("clockupdown", d=>this._upDown.apply(this,[d])); else Bangle.setUI("clock"); diff --git a/modules/ClockFace.md b/modules/ClockFace.md index e760c3e74..6b59e68e7 100644 --- a/modules/ClockFace.md +++ b/modules/ClockFace.md @@ -85,6 +85,7 @@ var clock = new ClockFace({ if (dir === -1) // Up else // (dir === 1): Down }, + settingsFile: 'appid.settings.json', // optional, values from file will be applied to `this` }); clock.start(); @@ -110,11 +111,51 @@ clock.start(); ``` + +SettingsFile +------------ +If you use the `settingsFile` option, values from that file are loaded and set +directly on the clock. + +For example: + +```json +// example.settings.json: +{ + "showDate": false, + "foo": 123 +} +``` +```js + var ClockFace = require("ClockFace"); + var clock = new ClockFace({ + draw: function(){/*...*/}, + settingsFile: "example.settings.json", + }); + // now + clock.showDate === false; + clock.foo === 123; + clock.loadWidgets === true; // default when not in settings file + clock.is12Hour === ??; // not in settings file: uses global setting + clock.start(); + +``` + Properties ---------- The following properties are automatically set on the clock: * `is12Hour`: `true` if the "Time Format" setting is set to "12h", `false` for "24h". * `paused`: `true` while the clock is paused. (You don't need to check this inside your `draw()` code) +* `showDate`: `true` (if not overridden through the settings file.) +* `loadWidgets`: `true` (if not overridden through the settings file.) + If set to `false` before calling `start()`, the clock won't call `Bangle.loadWidgets();` for you. + Best is to add a setting for this, but if you never want to load widgets, you could do this: + ```js + var ClockFace = require("ClockFace"); + var clock = new ClockFace({draw: function(){/*...*/}}); + clock.loadWidgets = false; // prevent loading of widgets + clock.start(); + ``` Inside the `draw()`/`update()` function you can access these using `this`: diff --git a/modules/ClockFace_menu.js b/modules/ClockFace_menu.js new file mode 100644 index 000000000..cd99ea39f --- /dev/null +++ b/modules/ClockFace_menu.js @@ -0,0 +1,10 @@ +// boolean options, which default to true +exports.showDate = +exports.loadWidgets = + function(value, callback) { + if (value === undefined) value = true; + return { + value: !!value, + onchange: v=>callback(v), + }; + }; From f90d5dbdca6cd5b688fb06c0909737a40f7b40a5 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Fri, 27 May 2022 17:09:21 +0200 Subject: [PATCH 32/85] barclock: add settings to hide date/widgets --- apps/barclock/ChangeLog | 1 + apps/barclock/README.md | 3 +++ apps/barclock/clock-bar.js | 7 ++++--- apps/barclock/metadata.json | 6 +++++- apps/barclock/settings.js | 19 +++++++++++++++++++ 5 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 apps/barclock/settings.js diff --git a/apps/barclock/ChangeLog b/apps/barclock/ChangeLog index 5df032c4d..d30ec04de 100644 --- a/apps/barclock/ChangeLog +++ b/apps/barclock/ChangeLog @@ -9,3 +9,4 @@ 0.09: Fix time/date disappearing after fullscreen notification 0.10: Use ClockFace library 0.11: Use ClockFace.is12Hour +0.12: Add settings to hide date,widgets diff --git a/apps/barclock/README.md b/apps/barclock/README.md index 4b92313c5..af10d4c6c 100644 --- a/apps/barclock/README.md +++ b/apps/barclock/README.md @@ -4,3 +4,6 @@ A simple digital clock showing seconds as a horizontal bar. | 24hr style | 12hr style | | --- | --- | | ![24-hour bar clock](screenshot.png) | ![12-hour bar clock with meridian](screenshot_pm.png) | + +## Settings +* `Show date`: display date at the bottom of screen \ No newline at end of file diff --git a/apps/barclock/clock-bar.js b/apps/barclock/clock-bar.js index 987d41cc6..afbe46f1b 100644 --- a/apps/barclock/clock-bar.js +++ b/apps/barclock/clock-bar.js @@ -51,6 +51,7 @@ function dateText(date) { const ClockFace = require("ClockFace"), clock = new ClockFace({ precision:1, + settingsFile:'barclock.settings.json', init: function() { const Layout = require("Layout"); this.layout = new Layout({ @@ -62,8 +63,8 @@ const ClockFace = require("ClockFace"), ], }, {id: "bar", type: "custom", fraction: 0, fillx: 1, height: 6, col: g.theme.fg2, render: renderBar}, - {height: 40}, - {id: "date", type: "txt", font: "10%", valign: 1}, + this.showDate ? {height: 40} : {}, + this.showDate ? {id: "date", type: "txt", font: "10%", valign: 1} : {}, ], }, {lazy: true}); // adjustments based on screen size and whether we display am/pm @@ -82,7 +83,7 @@ const ClockFace = require("ClockFace"), update: function(date, c) { if (c.m) this.layout.time.label = timeText(date); if (c.h) this.layout.ampm.label = ampmText(date); - if (c.d) this.layout.date.label = dateText(date); + if (c.d && this.showDate) this.layout.date.label = dateText(date); const SECONDS_PER_MINUTE = 60; if (c.s) this.layout.bar.fraction = date.getSeconds()/SECONDS_PER_MINUTE; this.layout.render(); diff --git a/apps/barclock/metadata.json b/apps/barclock/metadata.json index 7bc61096d..5a81593d4 100644 --- a/apps/barclock/metadata.json +++ b/apps/barclock/metadata.json @@ -1,7 +1,7 @@ { "id": "barclock", "name": "Bar Clock", - "version": "0.11", + "version": "0.12", "description": "A simple digital clock showing seconds as a bar", "icon": "clock-bar.png", "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_pm.png"}], @@ -12,6 +12,10 @@ "allow_emulator": true, "storage": [ {"name":"barclock.app.js","url":"clock-bar.js"}, + {"name":"barclock.settings.js","url":"settings.js"}, {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true} + ], + "data": [ + {"name":"barclock.settings.json"} ] } diff --git a/apps/barclock/settings.js b/apps/barclock/settings.js new file mode 100644 index 000000000..60f459a26 --- /dev/null +++ b/apps/barclock/settings.js @@ -0,0 +1,19 @@ +(function(back) { + let s = require('Storage').readJSON("barclock.settings.json", true) || {}; + + function saver(key) { + return value => { + s[key] = value; + require('Storage').writeJSON("barclock.settings.json", s); + } + } + + const menu = { + "": {"title": /*LANG*/"Bar Clock"}, + /*LANG*/"< Back": back, + /*LANG*/"Show date": require("ClockFace_menu").showDate(s.showDate, saver('showDate')), + /*LANG*/"Load widgets": require("ClockFace_menu").loadWidgets(s.loadWidgets, saver('loadWidgets')), + } + + E.showMenu(menu); +}); From 65d59242d55ca7136d5d644f1f0fe538d298a867 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Fri, 27 May 2022 17:20:13 +0200 Subject: [PATCH 33/85] barclock: add font setting --- apps/barclock/ChangeLog | 1 + apps/barclock/README.md | 3 ++- apps/barclock/clock-bar.js | 15 ++++++++++++--- apps/barclock/metadata.json | 2 +- apps/barclock/settings.js | 9 ++++++++- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/apps/barclock/ChangeLog b/apps/barclock/ChangeLog index d30ec04de..197a24738 100644 --- a/apps/barclock/ChangeLog +++ b/apps/barclock/ChangeLog @@ -10,3 +10,4 @@ 0.10: Use ClockFace library 0.11: Use ClockFace.is12Hour 0.12: Add settings to hide date,widgets +0.13: Add font setting diff --git a/apps/barclock/README.md b/apps/barclock/README.md index af10d4c6c..ff66a5cbb 100644 --- a/apps/barclock/README.md +++ b/apps/barclock/README.md @@ -6,4 +6,5 @@ A simple digital clock showing seconds as a horizontal bar. | ![24-hour bar clock](screenshot.png) | ![12-hour bar clock with meridian](screenshot_pm.png) | ## Settings -* `Show date`: display date at the bottom of screen \ No newline at end of file +* `Show date`: display date at the bottom of screen +* `Font`: choose between bitmap or vector fonts \ No newline at end of file diff --git a/apps/barclock/clock-bar.js b/apps/barclock/clock-bar.js index afbe46f1b..55c4da074 100644 --- a/apps/barclock/clock-bar.js +++ b/apps/barclock/clock-bar.js @@ -58,7 +58,7 @@ const ClockFace = require("ClockFace"), type: "v", c: [ { type: "h", c: [ - {id: "time", label: "88:88", type: "txt", font: "6x8:5", col:g.theme.fg, bgCol: g.theme.bg}, // size updated below + {id: "time", label: "88:88", type: "txt", font: "6x8:5", col:g.theme.fg, bgCol: g.theme.bg}, // updated below {id: "ampm", label: " ", type: "txt", font: "6x8:2", col:g.theme.fg, bgCol: g.theme.bg}, ], }, @@ -69,7 +69,7 @@ const ClockFace = require("ClockFace"), }, {lazy: true}); // adjustments based on screen size and whether we display am/pm let thickness; // bar thickness, same as time font "pixel block" size - if (this.is12Hour) { + if (this.is12Hour && locale.hasMeridian) { // Maximum font size = ( - ) / (5chars * 6px) thickness = Math.floor((Bangle.appRect.w-24)/(5*6)); } else { @@ -77,7 +77,16 @@ const ClockFace = require("ClockFace"), thickness = Math.floor(Bangle.appRect.w/(5*6)); } this.layout.bar.height = thickness+1; - this.layout.time.font = "6x8:"+thickness; + if (this.font===1) { // vector + if (this.is12Hour && locale.hasMeridian) { + this.layout.time.font = "Vector:60"; + this.layout.ampm.font = "Vector:40"; + } else { + this.layout.time.font = "Vector:80"; + } + } else { + this.layout.time.font = "6x8:"+thickness; + } this.layout.update(); }, update: function(date, c) { diff --git a/apps/barclock/metadata.json b/apps/barclock/metadata.json index 5a81593d4..0a0b73778 100644 --- a/apps/barclock/metadata.json +++ b/apps/barclock/metadata.json @@ -1,7 +1,7 @@ { "id": "barclock", "name": "Bar Clock", - "version": "0.12", + "version": "0.13", "description": "A simple digital clock showing seconds as a bar", "icon": "clock-bar.png", "screenshots": [{"url":"screenshot.png"},{"url":"screenshot_pm.png"}], diff --git a/apps/barclock/settings.js b/apps/barclock/settings.js index 60f459a26..3e97688a1 100644 --- a/apps/barclock/settings.js +++ b/apps/barclock/settings.js @@ -8,12 +8,19 @@ } } + const fonts = [/*LANG*/"Bitmap",/*LANG*/"Vector"]; const menu = { "": {"title": /*LANG*/"Bar Clock"}, /*LANG*/"< Back": back, /*LANG*/"Show date": require("ClockFace_menu").showDate(s.showDate, saver('showDate')), /*LANG*/"Load widgets": require("ClockFace_menu").loadWidgets(s.loadWidgets, saver('loadWidgets')), - } + /*LANG*/"Font": { + value: s.font|0, + min:0,max:1,wrap:true, + format:v=>fonts[v], + onchange:saver('font'), + }, + }; E.showMenu(menu); }); From 30dd8512eda42049f5215f57504ed4cd6c855449 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 12 Apr 2022 00:16:09 +0200 Subject: [PATCH 34/85] cogclock: new app --- apps/cogclock/app.js | 111 +++++++++++++++++++++++++++++++++++ apps/cogclock/icon.js | 1 + apps/cogclock/icon.png | Bin 0 -> 11242 bytes apps/cogclock/metadata.json | 16 +++++ apps/cogclock/screenshot.png | Bin 0 -> 5887 bytes 5 files changed, 128 insertions(+) create mode 100644 apps/cogclock/app.js create mode 100644 apps/cogclock/icon.js create mode 100644 apps/cogclock/icon.png create mode 100644 apps/cogclock/metadata.json create mode 100644 apps/cogclock/screenshot.png diff --git a/apps/cogclock/app.js b/apps/cogclock/app.js new file mode 100644 index 000000000..ba423fec1 --- /dev/null +++ b/apps/cogclock/app.js @@ -0,0 +1,111 @@ +Graphics.prototype.setFont16x32N = function() { + this.setFontCustom(atob( + "/////v////7////+4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO/////v////7////+AAAAAOAAAA7gAAAO4AAADuAAAA7gAAAO4AAADv////7////+/////gAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAADgA//+4AP//uAD//7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7//4AO//+ADv//gA4AAAAA4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO/////v////7////+AAAAAP//gAD//4AA//+AAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAP////7////+/////gAAAAD//4AO//+ADv//gA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA//+4AP//uAD//4AAAAA/////v////7////+4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AP//uAD//7gA//+AAAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAP////7////+/////gAAAAD////+/////v////7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7////+/////v////4AAAAA//+ADv//gA7//4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO/////v////7////+AAAAAA==" + ), "0".charCodeAt(0), 16, 32); +}; + +Bangle.loadWidgets(); +const r1 = 84, // inner radius + r3 = Math.min(Bangle.appRect.w/2, Bangle.appRect.h/2), // outer radius + r2 = (r1*3+r3*2)/5, + teeth = 12, + edge = 0.45, point = 0.35; // as fraction of arc + +const x = Bangle.appRect.x+Bangle.appRect.w/2, + y = Bangle.appRect.y+Bangle.appRect.h/2; + +/** + * Add coordinates for nth tooth to vertices + * @param {array} poly Array to add points to + * @param {number} n Tooth number + */ +function addTooth(poly, n) { + const + tau = Math.PI*2, arc = tau/teeth, + e = arc*edge, p = arc*point, s = (arc-(e+p))/2; // edge,point,slopes + const sin = Math.sin, cos = Math.cos; + let r = (n-1)*arc+e/2; // rads + poly.push(x+r2*sin(r), y-r2*cos(r)); + r += s; + poly.push(x+r3*sin(r), y-r3*cos(r)); + r += p; + poly.push(x+r3*sin(r), y-r3*cos(r)); + r += s; + poly.push(x+r2*sin(r), y-r2*cos(r)); +} + +function drawCog() { + g.drawCircle(x, y, r1); + let poly = []; + for(let t = 1; t<=teeth; t++) { + addTooth(poly, t); + } + g.drawPoly(poly, true); +} +/** + * @param {number} n Tooth number to fill (1-based) + * @param col Fill color + */ +function fillTooth(n, col) { + if (!n) return; // easiest to check here + let poly = []; + addTooth(poly, n); + g.setColor(col).fillPoly(poly) + .setColor(g.theme.fg).drawPoly(poly); // fillPoly colored over the outline +} + +let last = {tooth: 0}, timeOut; +function draw() { + if (!Bangle.isLCDOn()) return; // no drawing, also no new update scheduled + g.reset(); + const pad2 = num => (num<10 ? "0" : "")+num, + d = new Date(), + year = d.getFullYear(), + date = pad2(d.getDate())+pad2(d.getMonth()), + time = pad2(d.getHours())+pad2(d.getMinutes()), + tooth = Math.round(d.getSeconds()/60*teeth), + m = d.getMilliseconds(); + if (year!==last.year) { + g.setFont("16x32N").setFontAlign(0, -1) // center top + .drawString(year, x, y+34, true); + } + if (date!==last.date) { + g.setFont("16x32N").setFontAlign(0, 1) // center bottom + .drawString(date, x, y-34, true); + } + if (time!==last.time) { + g.setFont("16x32N:2").setFontAlign(0, 0) // center middle + .drawString(time, x, y, true); + } + if (tooth!==last.tooth) { + if (tooth>last.tooth) { + for(let t = last.tooth; t<=tooth; t++) { // fill missing teeth + fillTooth(t, g.theme.fg2); + } + } else { + for(let t = last.tooth; t>tooth; t--) { // erase extraneous teeth + fillTooth(t, g.theme.bg); + } + } + } + + last = { + year: year, + date: date, + time: time, + tooth: tooth, + }; + timeOut = setTimeout(draw, 1000-m); +} +g.clear(); +Bangle.drawWidgets(); +Bangle.setUI("clock"); +Bangle.on("lcdPower", on => { + if (timeOut) { + clearTimeout(timeOut); + timeOut = undefined; + } + if (on) draw(); +}); +drawCog(); +draw(); diff --git a/apps/cogclock/icon.js b/apps/cogclock/icon.js new file mode 100644 index 000000000..899cfc7c1 --- /dev/null +++ b/apps/cogclock/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/ACcikQXpCQUCC4MgBAgqMCQIXEAgQXNBwIDCAggXOABAXLHwQAHMYQXmmczI5oiCBwUjCwIABmQXDEgJ0KCwMwCwMDDAgyGLYoWBgAXBgAYBMZIXEkYWBC4YYBGAh7FFwgHCC4YEBPRIwCFwYXFGAaqHC56oIIwgXFJAbUJLwpgHI4qPDIwpIFR4wWDLwa6BAAQHDVIYYCC/gYCC453MPIR3HU5gADd5bXHC4rvJMAYAECwJeCd5MjGAjVDC4ZHGNARIFGAgNDFw5IJUogwFC4gwBDAhGBBghIFBQhhBbYguEPAweCDAgACCwZACNg5LFXQYsIC5QAFdg4XcCxJHNBwYTEC6A+BJYQEEC5YYBMYhbCCxo0GCaIXbAHgA=")) \ No newline at end of file diff --git a/apps/cogclock/icon.png b/apps/cogclock/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8520fcf5d0cfff4f509021448b25abf4a63e6604 GIT binary patch literal 11242 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 Cc70L+ literal 0 HcmV?d00001 diff --git a/apps/cogclock/metadata.json b/apps/cogclock/metadata.json new file mode 100644 index 000000000..ab47c43a1 --- /dev/null +++ b/apps/cogclock/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "cogclock", + "name": "Cog Clock", + "version": "0.01", + "description": "A clock inside a cog", + "icon": "icon.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS"], + "allow_emulator": true, + "storage": [ + {"name":"cogclock.app.js","url":"app.js"}, + {"name":"cogclock.img","url":"icon.js","evaluate":true} + ] +} diff --git a/apps/cogclock/screenshot.png b/apps/cogclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f49709aef266bf4555139c86171fcbd73dcad4d8 GIT binary patch literal 5887 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 literal 0 HcmV?d00001 From 9cf64f5d98e33a717f1514dd1470e72cbac59a3e Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 12 Apr 2022 00:38:12 +0200 Subject: [PATCH 35/85] cogclock: setUI before loading widgets --- apps/cogclock/app.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/cogclock/app.js b/apps/cogclock/app.js index ba423fec1..277eadd3a 100644 --- a/apps/cogclock/app.js +++ b/apps/cogclock/app.js @@ -4,7 +4,9 @@ Graphics.prototype.setFont16x32N = function() { ), "0".charCodeAt(0), 16, 32); }; -Bangle.loadWidgets(); +Bangle.setUI("clock"); // set UI first, so widgets know about Bangle.CLOCK +Bangle.loadWidgets(); // load widgets, so Bangle.appRect knows about them + const r1 = 84, // inner radius r3 = Math.min(Bangle.appRect.w/2, Bangle.appRect.h/2), // outer radius r2 = (r1*3+r3*2)/5, @@ -99,7 +101,6 @@ function draw() { } g.clear(); Bangle.drawWidgets(); -Bangle.setUI("clock"); Bangle.on("lcdPower", on => { if (timeOut) { clearTimeout(timeOut); From 452b3298934ae0980275fa3a49f537ed938e0690 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Mon, 18 Apr 2022 15:14:32 +0200 Subject: [PATCH 36/85] cogclock: fix missing g.reset() --- apps/cogclock/app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/cogclock/app.js b/apps/cogclock/app.js index 277eadd3a..2734b9a17 100644 --- a/apps/cogclock/app.js +++ b/apps/cogclock/app.js @@ -37,6 +37,7 @@ function addTooth(poly, n) { } function drawCog() { + g.reset(); g.drawCircle(x, y, r1); let poly = []; for(let t = 1; t<=teeth; t++) { From c4c0a55ceac8128297961c6183fb798b4bc2f2df Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sun, 24 Apr 2022 19:43:34 +0200 Subject: [PATCH 37/85] cogclock: improve font --- apps/cogclock/15x32.png | Bin 0 -> 6247 bytes apps/cogclock/app.js | 17 +++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 apps/cogclock/15x32.png diff --git a/apps/cogclock/15x32.png b/apps/cogclock/15x32.png new file mode 100644 index 0000000000000000000000000000000000000000..0af326e718290e8f9f6445a30109f47dc8213ba9 GIT binary patch literal 6247 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 RU=;uW002ovPDHLkV1l)@#DM?+ literal 0 HcmV?d00001 diff --git a/apps/cogclock/app.js b/apps/cogclock/app.js index 2734b9a17..73a709e88 100644 --- a/apps/cogclock/app.js +++ b/apps/cogclock/app.js @@ -1,7 +1,8 @@ -Graphics.prototype.setFont16x32N = function() { +Graphics.prototype.setFont15x32N = function() { this.setFontCustom(atob( - "/////v////7////+4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO/////v////7////+AAAAAOAAAA7gAAAO4AAADuAAAA7gAAAO4AAADv////7////+/////gAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAADgA//+4AP//uAD//7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7//4AO//+ADv//gA4AAAAA4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO/////v////7////+AAAAAP//gAD//4AA//+AAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAP////7////+/////gAAAAD//4AO//+ADv//gA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA//+4AP//uAD//4AAAAA/////v////7////+4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AP//uAD//7gA//+AAAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAP////7////+/////gAAAAD////+/////v////7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7////+/////v////4AAAAA//+ADv//gA7//4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO4AOADuADgA7gA4AO/////v////7////+AAAAAA==" - ), "0".charCodeAt(0), 16, 32); + // 15x32.png, converted using http://ebfc.mattbrailsford.com/ + "/////oAAAAKAAAACgAAAAoAAAAKAAAACgf//AoEAAQKB//8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+/wAB/oEAAQKBAAECgf//AoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAC////AgAAAQIAAAH+/w///oEIAAKBCAACgQgAAoEIAAKBCAACgQg/AoEIIQKB+CECgAAhAoAAIQKAACECgAAhAoAAIQL//+H+/w/h/oEIIQKBCCECgQghAoEIIQKBCCECgQghAoEIIQKB+D8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+///gAIAAIACAACAAgAAgAIAAIAD/+CAAAAggAAAIIAAACD/+//gAAoAAAAKAAAACgAAAAoAAAAL////+///h/oAAIQKAACECgAAhAoAAIQKAACECgfghAoEIIQKBCD8CgQgAAoEIAAKBCAACgQgAAoEIAAL/D//+/////oAAAAKAAAACgAAAAoAAAAKAAAACgfg/AoEIIQKBCD8CgQgAAoEIAAKBCAACgQgAAoEIAAL/D//+/wAAAIEAAACBAAAAgQAAAIEAAACBAAAAgQAAAIH///6AAAACgAAAAoAAAAKAAAACgAAAAoAAAAL////+/////oAAAAKAAAACgAAAAoAAAAKAAAACgfg/AoEIIQKB+D8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+///h/oAAIQKAACECgAAhAoAAIQKAACECgfghAoEIIQKB+D8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+" + ), "0".charCodeAt(0), 15, 32); }; Bangle.setUI("clock"); // set UI first, so widgets know about Bangle.CLOCK @@ -69,15 +70,15 @@ function draw() { tooth = Math.round(d.getSeconds()/60*teeth), m = d.getMilliseconds(); if (year!==last.year) { - g.setFont("16x32N").setFontAlign(0, -1) // center top - .drawString(year, x, y+34, true); + g.setFont("15x32N").setFontAlign(0, -1) // center top + .drawString(year, x, y+32, true); } if (date!==last.date) { - g.setFont("16x32N").setFontAlign(0, 1) // center bottom - .drawString(date, x, y-34, true); + g.setFont("15x32N").setFontAlign(0, 1) // center bottom + .drawString(date, x, y-32, true); } if (time!==last.time) { - g.setFont("16x32N:2").setFontAlign(0, 0) // center middle + g.setFont("15x32N:2").setFontAlign(0, 0) // center middle .drawString(time, x, y, true); } if (tooth!==last.tooth) { From 944c709629dad89d0d7e9a33942a19822c27a4d0 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Sun, 24 Apr 2022 19:56:19 +0200 Subject: [PATCH 38/85] cogclock: replace date with rectangles todo: makt this a setting --- apps/cogclock/app.js | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/cogclock/app.js b/apps/cogclock/app.js index 73a709e88..bb925e7e1 100644 --- a/apps/cogclock/app.js +++ b/apps/cogclock/app.js @@ -4,7 +4,7 @@ Graphics.prototype.setFont15x32N = function() { "/////oAAAAKAAAACgAAAAoAAAAKAAAACgf//AoEAAQKB//8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+/wAB/oEAAQKBAAECgf//AoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAC////AgAAAQIAAAH+/w///oEIAAKBCAACgQgAAoEIAAKBCAACgQg/AoEIIQKB+CECgAAhAoAAIQKAACECgAAhAoAAIQL//+H+/w/h/oEIIQKBCCECgQghAoEIIQKBCCECgQghAoEIIQKB+D8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+///gAIAAIACAACAAgAAgAIAAIAD/+CAAAAggAAAIIAAACD/+//gAAoAAAAKAAAACgAAAAoAAAAL////+///h/oAAIQKAACECgAAhAoAAIQKAACECgfghAoEIIQKBCD8CgQgAAoEIAAKBCAACgQgAAoEIAAL/D//+/////oAAAAKAAAACgAAAAoAAAAKAAAACgfg/AoEIIQKBCD8CgQgAAoEIAAKBCAACgQgAAoEIAAL/D//+/wAAAIEAAACBAAAAgQAAAIEAAACBAAAAgQAAAIH///6AAAACgAAAAoAAAAKAAAACgAAAAoAAAAL////+/////oAAAAKAAAACgAAAAoAAAAKAAAACgfg/AoEIIQKB+D8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+///h/oAAIQKAACECgAAhAoAAIQKAACECgfghAoEIIQKB+D8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+" ), "0".charCodeAt(0), 15, 32); }; - +const SHOW_DATE = false; // TODO: make into setting? Bangle.setUI("clock"); // set UI first, so widgets know about Bangle.CLOCK Bangle.loadWidgets(); // load widgets, so Bangle.appRect knows about them @@ -69,18 +69,24 @@ function draw() { time = pad2(d.getHours())+pad2(d.getMinutes()), tooth = Math.round(d.getSeconds()/60*teeth), m = d.getMilliseconds(); - if (year!==last.year) { - g.setFont("15x32N").setFontAlign(0, -1) // center top - .drawString(year, x, y+32, true); - } - if (date!==last.date) { - g.setFont("15x32N").setFontAlign(0, 1) // center bottom - .drawString(date, x, y-32, true); - } if (time!==last.time) { g.setFont("15x32N:2").setFontAlign(0, 0) // center middle .drawString(time, x, y, true); } + if (SHOW_DATE) { + if (year!==last.year) { + g.setFont("15x32N").setFontAlign(0, -1) // center top + .drawString(year, x, y+32, true); + } + if (date!==last.date) { + g.setFont("15x32N").setFontAlign(0, 1) // center bottom + .drawString(date, x, y-32, true); + } + } + else if (time!==last.time) { + g.fillRect(x-30, y-60, x+29, y-33).clearRect(x-28, y-58, x+27, y-33); + g.fillRect(x-30, y+60, x+29, y+30).clearRect(x-28, y+58, x+27, y+30); + } if (tooth!==last.tooth) { if (tooth>last.tooth) { for(let t = last.tooth; t<=tooth; t++) { // fill missing teeth From 17cb0de69e27c458cd698aa68711c1e207ecdba5 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 26 Apr 2022 19:13:56 +0200 Subject: [PATCH 39/85] cogclock: fill cog --- apps/cogclock/app.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/cogclock/app.js b/apps/cogclock/app.js index bb925e7e1..c186cd881 100644 --- a/apps/cogclock/app.js +++ b/apps/cogclock/app.js @@ -39,12 +39,15 @@ function addTooth(poly, n) { function drawCog() { g.reset(); - g.drawCircle(x, y, r1); - let poly = []; + g.setColor(g.theme.bg2).fillCircle(x, y, r2) // fill cog + .setColor(g.theme.bg).fillCircle(x, y, r1) // clear center + .setColor(g.theme.fg2).drawCircle(x, y, r1); // draw inner border + let poly = []; // complete teeth outline for(let t = 1; t<=teeth; t++) { + fillTooth(t, g.theme.bg2); addTooth(poly, t); } - g.drawPoly(poly, true); + g.drawPoly(poly, true); // draw outer border } /** * @param {number} n Tooth number to fill (1-based) @@ -55,7 +58,7 @@ function fillTooth(n, col) { let poly = []; addTooth(poly, n); g.setColor(col).fillPoly(poly) - .setColor(g.theme.fg).drawPoly(poly); // fillPoly colored over the outline + .setColor(g.theme.fg2).drawPoly(poly); // fillPoly colored over the outline } let last = {tooth: 0}, timeOut; @@ -82,8 +85,7 @@ function draw() { g.setFont("15x32N").setFontAlign(0, 1) // center bottom .drawString(date, x, y-32, true); } - } - else if (time!==last.time) { + } else if (time!==last.time) { g.fillRect(x-30, y-60, x+29, y-33).clearRect(x-28, y-58, x+27, y-33); g.fillRect(x-30, y+60, x+29, y+30).clearRect(x-28, y+58, x+27, y+30); } @@ -94,7 +96,7 @@ function draw() { } } else { for(let t = last.tooth; t>tooth; t--) { // erase extraneous teeth - fillTooth(t, g.theme.bg); + fillTooth(t, g.theme.bg2); } } } From 66a36ec215ecc809055db5d783dea61d502868d2 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Fri, 27 May 2022 18:37:55 +0200 Subject: [PATCH 40/85] cogclock: new clock --- apps/cogclock/ChangeLog | 2 + apps/cogclock/app.js | 147 +++++++++++++++++------------------- apps/cogclock/metadata.json | 8 +- apps/cogclock/settings.js | 19 +++++ 4 files changed, 95 insertions(+), 81 deletions(-) create mode 100644 apps/cogclock/ChangeLog create mode 100644 apps/cogclock/settings.js diff --git a/apps/cogclock/ChangeLog b/apps/cogclock/ChangeLog new file mode 100644 index 000000000..3158b6116 --- /dev/null +++ b/apps/cogclock/ChangeLog @@ -0,0 +1,2 @@ +0.01: New clock +0.02: Use ClockFace library, add settings diff --git a/apps/cogclock/app.js b/apps/cogclock/app.js index c186cd881..d24031684 100644 --- a/apps/cogclock/app.js +++ b/apps/cogclock/app.js @@ -4,18 +4,6 @@ Graphics.prototype.setFont15x32N = function() { "/////oAAAAKAAAACgAAAAoAAAAKAAAACgf//AoEAAQKB//8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+/wAB/oEAAQKBAAECgf//AoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAC////AgAAAQIAAAH+/w///oEIAAKBCAACgQgAAoEIAAKBCAACgQg/AoEIIQKB+CECgAAhAoAAIQKAACECgAAhAoAAIQL//+H+/w/h/oEIIQKBCCECgQghAoEIIQKBCCECgQghAoEIIQKB+D8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+///gAIAAIACAACAAgAAgAIAAIAD/+CAAAAggAAAIIAAACD/+//gAAoAAAAKAAAACgAAAAoAAAAL////+///h/oAAIQKAACECgAAhAoAAIQKAACECgfghAoEIIQKBCD8CgQgAAoEIAAKBCAACgQgAAoEIAAL/D//+/////oAAAAKAAAACgAAAAoAAAAKAAAACgfg/AoEIIQKBCD8CgQgAAoEIAAKBCAACgQgAAoEIAAL/D//+/wAAAIEAAACBAAAAgQAAAIEAAACBAAAAgQAAAIH///6AAAACgAAAAoAAAAKAAAACgAAAAoAAAAL////+/////oAAAAKAAAACgAAAAoAAAAKAAAACgfg/AoEIIQKB+D8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+///h/oAAIQKAACECgAAhAoAAIQKAACECgfghAoEIIQKB+D8CgAAAAoAAAAKAAAACgAAAAoAAAAL////+" ), "0".charCodeAt(0), 15, 32); }; -const SHOW_DATE = false; // TODO: make into setting? -Bangle.setUI("clock"); // set UI first, so widgets know about Bangle.CLOCK -Bangle.loadWidgets(); // load widgets, so Bangle.appRect knows about them - -const r1 = 84, // inner radius - r3 = Math.min(Bangle.appRect.w/2, Bangle.appRect.h/2), // outer radius - r2 = (r1*3+r3*2)/5, - teeth = 12, - edge = 0.45, point = 0.35; // as fraction of arc - -const x = Bangle.appRect.x+Bangle.appRect.w/2, - y = Bangle.appRect.y+Bangle.appRect.h/2; /** * Add coordinates for nth tooth to vertices @@ -24,9 +12,11 @@ const x = Bangle.appRect.x+Bangle.appRect.w/2, */ function addTooth(poly, n) { const - tau = Math.PI*2, arc = tau/teeth, - e = arc*edge, p = arc*point, s = (arc-(e+p))/2; // edge,point,slopes - const sin = Math.sin, cos = Math.cos; + tau = Math.PI*2, arc = tau/clock.teeth, + e = arc*clock.edge, p = arc*clock.point, s = (arc-(e+p))/2; // edge,point,slopes + const sin = Math.sin, cos = Math.cos, + x = clock.x, y = clock.y, + r2 = clock.r2, r3 = clock.r3; let r = (n-1)*arc+e/2; // rads poly.push(x+r2*sin(r), y-r2*cos(r)); r += s; @@ -37,18 +27,6 @@ function addTooth(poly, n) { poly.push(x+r2*sin(r), y-r2*cos(r)); } -function drawCog() { - g.reset(); - g.setColor(g.theme.bg2).fillCircle(x, y, r2) // fill cog - .setColor(g.theme.bg).fillCircle(x, y, r1) // clear center - .setColor(g.theme.fg2).drawCircle(x, y, r1); // draw inner border - let poly = []; // complete teeth outline - for(let t = 1; t<=teeth; t++) { - fillTooth(t, g.theme.bg2); - addTooth(poly, t); - } - g.drawPoly(poly, true); // draw outer border -} /** * @param {number} n Tooth number to fill (1-based) * @param col Fill color @@ -61,62 +39,73 @@ function fillTooth(n, col) { .setColor(g.theme.fg2).drawPoly(poly); // fillPoly colored over the outline } -let last = {tooth: 0}, timeOut; -function draw() { - if (!Bangle.isLCDOn()) return; // no drawing, also no new update scheduled - g.reset(); - const pad2 = num => (num<10 ? "0" : "")+num, - d = new Date(), - year = d.getFullYear(), - date = pad2(d.getDate())+pad2(d.getMonth()), - time = pad2(d.getHours())+pad2(d.getMinutes()), - tooth = Math.round(d.getSeconds()/60*teeth), - m = d.getMilliseconds(); - if (time!==last.time) { - g.setFont("15x32N:2").setFontAlign(0, 0) // center middle - .drawString(time, x, y, true); - } - if (SHOW_DATE) { - if (year!==last.year) { - g.setFont("15x32N").setFontAlign(0, -1) // center top - .drawString(year, x, y+32, true); +const ClockFace = require("ClockFace"); +const clock = new ClockFace({ + precision: 1, + settingsFile: "cogclock.settings.json", + init: function() { + this.r1 = 84; // inner radius + this.r3 = Math.min(Bangle.appRect.w/2, Bangle.appRect.h/2); // outer radius + this.r2 = (this.r1*3+this.r3*2)/5; + this.teeth = 12; + this.edge = 0.45; + this.point = 0.35; // as fraction of arc + this.x = Bangle.appRect.x+Bangle.appRect.w/2; + this.y = Bangle.appRect.y+Bangle.appRect.h/2; + }, + draw: function(d) { + const x = this.x, y = this.y; + g.setColor(g.theme.bg2).fillCircle(x, y, this.r2) // fill cog + .setColor(g.theme.bg).fillCircle(x, y, this.r1) // clear center + .setColor(g.theme.fg2).drawCircle(x, y, this.r1); // draw inner border + let poly = []; // complete teeth outline + for(let t = 1; t<=this.teeth; t++) { + fillTooth(t, g.theme.bg2); + addTooth(poly, t); } - if (date!==last.date) { - g.setFont("15x32N").setFontAlign(0, 1) // center bottom - .drawString(date, x, y-32, true); + g.drawPoly(poly, true); // draw outer border + if (!this.showDate) { + // draw top/bottom rectangles (instead of year/date) + g.reset() + .fillRect(x-30, y-60, x+29, y-33).clearRect(x-28, y-58, x+27, y-33) + .fillRect(x-30, y+60, x+29, y+30).clearRect(x-28, y+58, x+27, y+30); } - } else if (time!==last.time) { - g.fillRect(x-30, y-60, x+29, y-33).clearRect(x-28, y-58, x+27, y-33); - g.fillRect(x-30, y+60, x+29, y+30).clearRect(x-28, y+58, x+27, y+30); - } - if (tooth!==last.tooth) { - if (tooth>last.tooth) { - for(let t = last.tooth; t<=tooth; t++) { // fill missing teeth - fillTooth(t, g.theme.fg2); - } - } else { - for(let t = last.tooth; t>tooth; t--) { // erase extraneous teeth - fillTooth(t, g.theme.bg2); + this.tooth = 0; + this.update(d, {s: 1, m: 1, h: 1, d: 1}); + }, + update: function(d, c) { + g.reset(); + const pad2 = num => (num<10 ? "0" : "")+num, + year = d.getFullYear(), + date = pad2(d.getDate())+pad2(d.getMonth()), + time = pad2(d.getHours())+pad2(d.getMinutes()), + tooth = Math.round(d.getSeconds()/60*this.teeth); + const x = this.x, y = this.y; + if (c.m) { + g.setFont("15x32N:2").setFontAlign(0, 0) // center middle + .drawString(time, x, y, true); + } + if (this.showDate) { + if (c.d) { + g.setFont("15x32N").setFontAlign(0, -1) // center top + .drawString(year, x, y+32, true) + .setFont("15x32N").setFontAlign(0, 1) // center bottom + .drawString(date, x, y-32, true); } } - } - last = { - year: year, - date: date, - time: time, - tooth: tooth, - }; - timeOut = setTimeout(draw, 1000-m); -} -g.clear(); -Bangle.drawWidgets(); -Bangle.on("lcdPower", on => { - if (timeOut) { - clearTimeout(timeOut); - timeOut = undefined; + if (tooth!==this.tooth) { + if (tooth>this.tooth) { + for(let t = this.tooth; t<=tooth; t++) { // fill missing teeth + fillTooth(t, g.theme.fg2); + } + } else { + for(let t = this.tooth; t>tooth; t--) { // erase extraneous teeth + fillTooth(t, g.theme.bg2); + } + } + } + this.tooth = tooth; } - if (on) draw(); }); -drawCog(); -draw(); +clock.start(); diff --git a/apps/cogclock/metadata.json b/apps/cogclock/metadata.json index ab47c43a1..40733bcd1 100644 --- a/apps/cogclock/metadata.json +++ b/apps/cogclock/metadata.json @@ -1,8 +1,8 @@ { "id": "cogclock", "name": "Cog Clock", - "version": "0.01", - "description": "A clock inside a cog", + "version": "0.02", + "description": "A cross-shaped clock inside a cog", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], "type": "clock", @@ -11,6 +11,10 @@ "allow_emulator": true, "storage": [ {"name":"cogclock.app.js","url":"app.js"}, + {"name":"cogclock.settings.js","url":"settings.js"}, {"name":"cogclock.img","url":"icon.js","evaluate":true} + ], + "data": [ + {"name": "cogclock.settings.json"} ] } diff --git a/apps/cogclock/settings.js b/apps/cogclock/settings.js new file mode 100644 index 000000000..4eadc32c2 --- /dev/null +++ b/apps/cogclock/settings.js @@ -0,0 +1,19 @@ +(function(back) { + let s = require('Storage').readJSON("cogclock.settings.json", true) || {}; + + function saver(key) { + return value => { + s[key] = value; + require('Storage').writeJSON("cogclock.settings.json", s); + } + } + + const menu = { + "": {"title": /*LANG*/"Cog Clock"}, + /*LANG*/"< Back": back, + /*LANG*/"Show date": require("ClockFace_menu").showDate(s.showDate, saver('showDate')), + /*LANG*/"Load widgets": require("ClockFace_menu").loadWidgets(s.loadWidgets, saver('loadWidgets')), + }; + + E.showMenu(menu); +}); From 208ac30a3931d6f880bc41db8af83bb7ed78a3c7 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 11:28:06 -0800 Subject: [PATCH 41/85] Add files via upload --- apps/invader/ChangeLog | 1 + apps/invader/README.md | 25 ++++++++ apps/invader/app-icon.js | 1 + apps/invader/app.js | 110 ++++++++++++++++++++++++++++++++++++ apps/invader/app.png | Bin 0 -> 665 bytes apps/invader/metadata.json | 14 +++++ apps/invader/screenshot.png | Bin 0 -> 1707 bytes 7 files changed, 151 insertions(+) create mode 100644 apps/invader/ChangeLog create mode 100644 apps/invader/README.md create mode 100644 apps/invader/app-icon.js create mode 100644 apps/invader/app.js create mode 100644 apps/invader/app.png create mode 100644 apps/invader/metadata.json create mode 100644 apps/invader/screenshot.png diff --git a/apps/invader/ChangeLog b/apps/invader/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/invader/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/invader/README.md b/apps/invader/README.md new file mode 100644 index 000000000..dc139bc9a --- /dev/null +++ b/apps/invader/README.md @@ -0,0 +1,25 @@ +# App Name + +Describe the app... + +Add screen shots (if possible) to the app folder and link then into this file with ![](.png) + +## 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/invader/app-icon.js b/apps/invader/app-icon.js new file mode 100644 index 000000000..dc7003c84 --- /dev/null +++ b/apps/invader/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwhHXAH4A/AH4A/AH4AYgAACC/4X/C/YbTFbYv/F/4rTAC4v/F/4vfC5YnPGaYv/F/4vLc7b3TF/4v/F/4v/F/4vTA5YAPE64v/F/4fTa55DXF/4v/AH4A/AH4A/AH4A/AHIA==")) diff --git a/apps/invader/app.js b/apps/invader/app.js new file mode 100644 index 000000000..aabc0022a --- /dev/null +++ b/apps/invader/app.js @@ -0,0 +1,110 @@ +// Brian Kumanchik +// Started 05-25-22 +// My Invader Demo, for Bangle.js 2, written JavaScript - using Espruino Web IDE + + + +// - variables ----------------------------------------- +// invader variables +var inv_x = 77; +var inv_y = 20; + +// turret variables +var tur_x = 77; +var tur_y = 138; + +// misc variables +var score = 999; +var lives = 3; +var game_over = false; + +// input(screen controller) variables +var BTNL, BTNR, BTNF; +var tap = {}; +// use tapping on screen for left and right +Bangle.on('drag',e=>tap=e); +BTNL = { read : _=>tap.b && tap.x < 88 && tap.y > 88}; +BTNR = { read : _=>tap.b && tap.x > 88 && tap.y > 88}; +BTNF = { read : _=>tap.b && tap.x > 88 && tap.y < 88}; + + + +// - sprites ------------------------------------------- +// invader sprites +var invader_a = + require("heatshrink").decompress(atob("kEgwkBiMRgACBAAQFFBJIPJBQgOKB55MGB64JCBoYQIB5yOKB+qvIA6pxHX5YPOAH4A/AH4A8A==")); +var invader_b = + require("heatshrink").decompress(atob("kEgxH+AAYJBAwgLQCaYfPB4oVHBpofnSpofvCY4HND9oAPD9IhTDpYfhd6IftN6IPtAH4A/AH4A/AH4A/AH4A9A=")); +var boom = + require("heatshrink").decompress(atob("kEgxH+AH4AFJYIHND9YTFAoYJJD9YRNMLKhbX/IRBV6JvND7p//f/4RHAoYJJD9a//AH4A/AH4A/AH4A9A==")); +var inv_shot = + require("heatshrink").decompress(atob("kEgxH+AH4A/ABaRBD/pB/Hv69/IP4A/AH4A/AH4A/AH4A/AH4AzA")); + +// turret sprites +var turret = + require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/ABcAgAf7DoIADD/4fxC4oAPD84dVEJIf/D/4f/D74=")); +var tur_exp_a = + require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/AAcAgATdD7YbJBJYLFAoYffDKqLXD6qlVB86lHLYoFDS5offA5YbRD8YZHABLbRD7aZLD5IlJD7YA=")); +var tur_exp_b = + require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/AAcAgATdD7YbJBJYLFAoYffDKqLXD6qlVB86lHLYoFDS5offA5YbRD8YZHABLbRD7aZLD5IlJD7YA=")); +var shot = + require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/ABcAgAf/D/4f9AH4A/AH4A/AH4A/AH4A/AGY")); + + + +// - setup stuff --------------------------------------- +function gameStart() { + setInterval(onFrame, 50); +} + + + +// - main loop ----------------------------------------- +function onFrame() { + // if not game over + if(game_over == false) { + g.clear(); + + + // check input (screen presses) + if(BTNL.read()) { + tur_x -= 5; + } + else if(BTNR.read()) { + tur_x += 5; + } + else if(BTNF.read()) { + tur_y -= 5; + } + + + // - draw sprites ---------------------------------- + // draw invader sprites + g.drawImage(invader_a, inv_x, inv_y); + //g.drawImage(invader_b, inv_x + 30, inv_y); + //g.drawImage(boom, inv_x + 60, inv_y); + //g.drawImage(inv_shot, inv_x - 30, inv_y); + + // draw turret sprites + g.drawImage(turret, tur_x, tur_y); + //g.drawImage(tur_exp_a, tur_x + 30, tur_y); + //g.drawImage(tur_exp_b, tur_x + 60, tur_y); + //g.drawImage(shot, tur_x - 30, tur_y); + + + // - draw text ------------------------------------- + g.setFont("4x6", 2); + g.setColor(0,0,0); + g.drawString("SCORE:" + score ,5,5); // + g.drawString("LIVES:" + lives ,117,5); // + + + g.flip(); + } +} + + + +gameStart(); + + diff --git a/apps/invader/app.png b/apps/invader/app.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9f822056531de84e9fe8641d57c4ab7e43c300 GIT binary patch literal 665 zcmV;K0%rY*P)EX>4Tx04R}tkv&MmKpe$iQ%gl!MC>5ykfAzRkSgLRRV;#q(pG5I!Q|2}Xws0h zxHt-~1qVMCs}3&Cx;nTDg5U>;qmz@Oi)x!1rQVA7g-j7icvs>-*TUS|@<_8Mx9q{%RAL{Up87 z(ZWYS|2A-O-O=Pd;Bp5TdeS9BvL!D~p-=$c&*+n`u^?e6X0GwuF<0Hy{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&GE5i~ng^xj1P005OqL_t(&-tCx63cw%?L{0Jj zS5DUz#L#@&z?+>Q!ox|%D5|QXv98fv0000$b4}|;5qYemyYJicu@C@NHL!ZpTN6<= zg@pj{wqNUWdi89!$N>Pp&ViHXPr2aD6>CmlApoLspt{dT{gk(LU(SP%HFop!|0#d)WR+w3 zw

r=6?}^4FYys8yf7tJ}v&lbnU=$u^$Exjz9jmU;O*8%J+XiE_kM95NciAm|UGv1ecuvFpd-u}n8U9}_IREcK z?azku|5(odJF?EM-fYI^_X_26&%gN@U;FRHuU@D5U#o5JZ~lFL-?{#0f4|CBlrU}9 z|M2Sb`F$4_a~GHXKau?HPnrGyH$VIGKA!v6@V}Vx{J)mIxC2=Z>%XThwsr59KP!1R zyI1bM?4wtIb~E|K&ez^vu>4))`nn3?4_RH=$2or-%{4u6as7ge){oz8=UeQ*b+!G= z^yY}uy7gCXewMxKBvX63pzPlZ^Pe}v?P~dLeud8EiaL<4|M1S|b8O#IneD3In>R@@ z&aG{a_@t#IZ&Reug?*57nyk=e5)eSg^JMBR41 z2Xmgjw7(%xz!!VK(t9!&6O-P8=$XO-1?Mg;X=-TTei8PJg=NlWla&ez514jMwPa*` zuH&o4!Lg$uFV)XsRLf|H4dn#GuWl>XKfm90{(0$bwd+Nh_C2iPu8`l<@crh#z3snu z9kMP2WsB4HYMd3y@77;rx|gBzpmzt;KF06Y+s(HN{9dz{Ievp}Rr_9pOWQ>!S1`?E z`Th4L)4m3AtB?cS6LudeU2Rxz$YPUU_T%e~Lo4|CKbGE(2sx0v_;P%|ZjaChR})5k zhFz@@4!27>8pIP=_dv5QFuUho2Il4l(GN_wmN~QRVbFfSy2ZDhqe6Ji#_t>)KjhM* f%{cM#{;)rs6=x$HfA9&g_F?dJ^>bP0l+XkKTNVEM literal 0 HcmV?d00001 From dc0157cf1f392c8a8424e164b20ca6783f34d118 Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Sat, 28 May 2022 21:30:30 +0200 Subject: [PATCH 57/85] [time_utils] Fix typo --- modules/time_utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/time_utils.js b/modules/time_utils.js index 5ca153710..0fdc788ba 100644 --- a/modules/time_utils.js +++ b/modules/time_utils.js @@ -55,7 +55,7 @@ exports.decodeTime = (millis) => { */ exports.formatTime = (value) => { var time = safeTime(typeof value === "object" ? value : exports.decodeTime(value)); - if (time.d != 0) throw "(d)ays not supported here"; + if (time.d != 0) throw "days not supported here"; if (time.h < 0 || time.h > 23) throw "Invalid value: must be 0 <= h <= 23"; if (time.m < 0 || time.m > 59) throw "Invalid value: must be 0 <= m <= 59"; return time.h + ":" + ("0" + time.m).substr(-2); From 889de43d263d5dbd6f971370b722059d4aa6d481 Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Sat, 28 May 2022 21:30:50 +0200 Subject: [PATCH 58/85] [time_utils] Add compact mode to formatDuration --- modules/time_utils.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/time_utils.js b/modules/time_utils.js index 0fdc788ba..6a3ed6faf 100644 --- a/modules/time_utils.js +++ b/modules/time_utils.js @@ -63,16 +63,19 @@ exports.formatTime = (value) => { /** * @param {object|int} value {d, h, m, s} object or milliseconds - * @returns an human-readable duration string like "3d 1h 10m 45s" + * @param {boolean} compact `true` to remove all whitespaces between the values + * @returns an human-readable duration string like "3d 1h 10m 45s" (or "3d1h10m45s" if `compact` is `true`) */ -exports.formatDuration = (value) => { +exports.formatDuration = (value, compact) => { + compact = compact || false; var duration = ""; var time = safeTime(typeof value === "object" ? value : exports.decodeTime(value)); if (time.d > 0) duration += time.d + "d "; if (time.h > 0) duration += time.h + "h "; if (time.m > 0) duration += time.m + "m "; if (time.s > 0) duration += time.s + "s" - return duration.trim(); + duration = duration.trim() + return compact ? duration.replace(" ", "") : duration; } exports.getCurrentTimeMillis = () => { From f3ff034439d87e6c8567ad5bd9af9ad362d7e064 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 12:22:44 -0800 Subject: [PATCH 59/85] Add files via upload --- apps/invader/app.js | 112 +++++++++++++++++++++++++++++-------- apps/invader/metadata.json | 2 +- 2 files changed, 89 insertions(+), 25 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index 59dbb8d42..af73aaeb3 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -6,12 +6,6 @@ // resolution 176x176 -// to do: -// random invader restart x -// stop auto fire - - - // - variables ----------------------------------------- // invader variables var inv_x = 77; @@ -22,10 +16,10 @@ var ix_speed = 6; // march speed var i_dir = 1; // 1 = right, 0 = left var been_hit = false; // invader hit state // - shoot variables -var inv_shot_x = -32; -var inv_shot_y = -32; +var inv_shot_x = -32; +var inv_shot_y = -32; var inv_fire_pause = 30; -var inv_fired = false; // invader fired state +var inv_fired = false; // invader fired state // - explode variables var been_hit = false; // invader hit state var bx = -32; // blast x @@ -42,13 +36,16 @@ var sy = -20; // turret shot starting y - off screen var turret_been_hit = false; var turret_blast_delay = 21; // keep blast active on screen for 60 frames var turret_exp_frame = 1; // turret explode start animation frame -var turret_anim_delay = 3; // turret explode animation delay +var turret_anim_delay = 3; // turret explode animation delay var explosion_play = false; // misc variables -var score = 0; -var lives = 3; -var game_over = false; +var score = 0; // starting score +var lives = 3; // starting lives +var game_state = 0; // game state - 0 = game not started, 1 = game running, 3 = game over +var ang = 0.1; +var start_been_pressed = false; // stops double press on restart +var fire_been_pressed = false; // stops auto fire // input(screen controller) variables var BTNL, BTNR, BTNF, BTNS; // button - left, right, fire, start @@ -184,8 +181,9 @@ function invader_hit() { been_hit = false; bx = -32; // move boom off screen (following invader) by = -32; - //inv_x = rand() % (464 - 16) + 4; // move invader to random x position - inv_x = 77; // move invader back up after being hit + // to gerate a random rounded number between 10 and 142; + inv_x = Math.floor(Math.random() * 142) + 10; + //inv_x = 77; // move invader back up after being hit inv_y = 20; // move invader back up after being hit i_dir = 1; // reset invader direction } @@ -199,11 +197,68 @@ function gameStart() { } -// - main loop ----------------------------------------- +// - main loop ------------------------------------------------------------- function onFrame() { + // game not started state (title screen) + if(game_state == 0) { + g.clear(); + + + if (!(BTNS.read())) { + start_been_pressed = false; // stops double press on restart + } + + + // draw text during game over state + g.setFont("4x6", 4); // set font and size x 2 + g.setColor(0,1,0); // set color (black) + g.drawString("INVADER", 33, 55); + + + // just animate invader + // invader anim code + i_anim_delay -= 1; + if(i_anim_delay < 0) { + i_anim_delay = 25; + + inv_frame += 1; + if (inv_frame > 2) { + inv_frame = 1; + } + } + + + // draw sprites during game over state + //ang += 0.1; + //g.drawImage(invader_a, 88, 98, {scale:4, rotate:ang}); + if(inv_frame == 1) { + g.drawImage(invader_a, 88-22, 85, {scale:4}); + } + else if(inv_frame == 2) { + g.drawImage(invader_b, 88-22, 85, {scale:4}); + } + + // reset stuff + if(BTNS.read() && !(start_been_pressed)) { + turret_been_hit = false; + tur_x = 77; // reset turret to center of screen + tur_y = 148; // reset turret y + inv_x = 77; // reset invader to center of screen + inv_y = 20; // reset invader back to top + i_dir = 1; // reset invader direction + lives = 3; // reset lives + score = 0; // reset score + explosion_play = false; + game_state = 1; + } + + + g.flip(); + } + // game over state - if(game_over) { + if(game_state == 3) { g.clear(); // draw text during game over state @@ -232,7 +287,8 @@ function onFrame() { lives = 3; // reset lives score = 0; // reset score explosion_play = false; - game_over = false; + game_state = 0; + start_been_pressed = true; } @@ -241,9 +297,15 @@ function onFrame() { // not game over state (game running) - if(!(game_over)) { + if(game_state == 1) { g.clear(); + + if (!(BTNF.read())) { + fire_been_pressed = false; // stops auto fire + } + + // call function to move and animate invader move_anim_inv(); @@ -258,8 +320,9 @@ function onFrame() { else if(BTNR.read() && tur_x <= 140 && !(turret_been_hit)) { tur_x += 6; } - else if(BTNF.read() && !(turret_been_hit)) { + else if(BTNF.read() && !(turret_been_hit) && !(fire_been_pressed) && !(shot_fired)) { shot_fired = true; + fire_been_pressed = true; // stops auto fire sx=tur_x + 12; sy=tur_y - 7; } @@ -301,7 +364,7 @@ function onFrame() { lives -= 1; if (lives == 0) { - game_over = true; + game_state = 3; } turret_been_hit = true; } @@ -332,7 +395,7 @@ function onFrame() { g.drawImage(inv_shot, -32, -32, {scale:2}); } - // turret sprites + // turret sprites if(!(turret_been_hit)) { // - undamaged turret g.drawImage(turret, tur_x, tur_y, {scale:2}); @@ -363,12 +426,13 @@ function onFrame() { g.setFont("4x6", 2); // set font and size x 2 g.setColor(0,0,0); // set color (black) g.drawString("SCORE:" + score ,5,5); - g.drawString("LIVES:" + lives ,117,5); + g.drawString("LIVES:" + lives ,117,5); g.flip(); } -} + +} // end main loop --------------------------------------------------------- gameStart(); diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index c84271925..b7f6b0c88 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.05", + "version":"0.06", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From 21fdba71d345a44dafc79d1b26647d6633806783 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 12:50:18 -0800 Subject: [PATCH 60/85] Add files via upload --- apps/invader/screenshot_1.png | Bin 1707 -> 1719 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/invader/screenshot_1.png b/apps/invader/screenshot_1.png index ae936f6c7adf3ca353f737179adfab9fa5a1c80e..14164bc6e2a46a8df943511f499278884afbcf66 100644 GIT binary patch literal 1719 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfvwQf#WAEJ z?(N-&MRTlp93Fo9$A5P2Y%^oc*lUMQZ1dRn@3n&WqZbdDZu)Moz5hM_pTdU#Ch10b zE6dz^0R;m=Ip2l@{c`i4ah_>(7p~C$ur0TK?wya7??3;zS^VJU$BcW*H&>sZz4o7+ z?N0Nv+t2+z@!$BW`u)ehHt*m5?DDM7H#K7--5=y%^tN>U)s5HqicIfc zeiZ%rx6S-(`zKtil>O=Q+I{D~)8C8O^Gq)Ysr;_^;&Pttveo?6KUW`jKmYwUSIt+h z+}OswPV(>1MwN2>nSDT~vHJPtPuf*~9>?7OtDs!fy6uS4hdZ{j53t|c%e3v?!gK2$ zykLm(-IA0q(?9qfUBPfa?7@rb9bzlQ z7QEoQyE}OMuieU?Pq!ZbDf@G4-}bU|*M9B(x8>9StAi~giJcdn|G3xl@ z&)IjAzSuo+{he)hr1zkFP>rlFT*pd zKTb~nv-Y&$j062*a}MP1W4U=Na9|FwmRG|8SN6qgB^XC}gC->Q_TJj|_VJH>?>TQS+2Pc1AUtF4 z5g`l4q;xK(@}}yoJtsO1npbkju!wRh7qkTB@iYoo2$@5rfA8u!z$suIEU-iP&i~UL z)y#31f|%|zcs`K+Flidl5S59-3T4X_3e+vWAK-i-6eM85xJcwRhd_mF^;BVw5ywl? zZvB6Bh3ks{7LC7ewuTE?^t>ukXw+Bk*8d^$eMi#$?-fE5^Em}77AUaDaeVjBV&YHn zdC*wEX~Xz#+g_bVVoLpcWq+`p-Yomg?Nt9#mVRNCf;m_1C$j8g)X&sxw07tdx_-Os z^{gk(LU(SP%HFop!|0#d)WR+w3 zw

r=6?}^4FYys8yf7tJ}v&lbnU=$u^$Exjz9jmU;O*8%J+XiE_kM95NciAm|UGv1ecuvFpd-u}n8U9}_IREcK z?azku|5(odJF?EM-fYI^_X_26&%gN@U;FRHuU@D5U#o5JZ~lFL-?{#0f4|CBlrU}9 z|M2Sb`F$4_a~GHXKau?HPnrGyH$VIGKA!v6@V}Vx{J)mIxC2=Z>%XThwsr59KP!1R zyI1bM?4wtIb~E|K&ez^vu>4))`nn3?4_RH=$2or-%{4u6as7ge){oz8=UeQ*b+!G= z^yY}uy7gCXewMxKBvX63pzPlZ^Pe}v?P~dLeud8EiaL<4|M1S|b8O#IneD3In>R@@ z&aG{a_@t#IZ&Reug?*57nyk=e5)eSg^JMBR41 z2Xmgjw7(%xz!!VK(t9!&6O-P8=$XO-1?Mg;X=-TTei8PJg=NlWla&ez514jMwPa*` zuH&o4!Lg$uFV)XsRLf|H4dn#GuWl>XKfm90{(0$bwd+Nh_C2iPu8`l<@crh#z3snu z9kMP2WsB4HYMd3y@77;rx|gBzpmzt;KF06Y+s(HN{9dz{Ievp}Rr_9pOWQ>!S1`?E z`Th4L)4m3AtB?cS6LudeU2Rxz$YPUU_T%e~Lo4|CKbGE(2sx0v_;P%|ZjaChR})5k zhFz@@4!27>8pIP=_dv5QFuUho2Il4l(GN_wmN~QRVbFfSy2ZDhqe6Ji#_t>)KjhM* f%{cM#{;)rs6=x$HfA9&g_F?dJ^>bP0l+XkKTNVEM From c00820190c50ef343a857e7fa483e662c90003d4 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 13:00:06 -0800 Subject: [PATCH 61/85] Add files via upload --- apps/invader/README.md | 2 +- apps/invader/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/invader/README.md b/apps/invader/README.md index e0036cb8a..7ed98defb 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -20,4 +20,4 @@ bkumanchik on Espruino Forums ## Creator -Brian Kumanchik +Brian Kumanchik 2022 diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index b7f6b0c88..add8a05e1 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.06", + "version":"0.07", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From 3d296473d4a15b2083122bf5f8ce188b0d49f599 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 13:15:33 -0800 Subject: [PATCH 62/85] Add files via upload --- apps/invader/app.js | 50 +++++++++++++++++++++++--------------- apps/invader/metadata.json | 2 +- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index af73aaeb3..fa53c608d 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -3,7 +3,12 @@ // My Invader Demo, for Bangle.js 2, written JavaScript - using Espruino Web IDE -// resolution 176x176 +// note: resolution is 176x176 + + +// to do: +// make invader clock +// upload to official app page // - variables ----------------------------------------- @@ -34,7 +39,7 @@ var shot_fired = false; // turret fired state var sx = -20; // turret shot starting x - off screen var sy = -20; // turret shot starting y - off screen var turret_been_hit = false; -var turret_blast_delay = 21; // keep blast active on screen for 60 frames +var turret_blast_delay = 25; // keep blast active on screen for 60 frames var turret_exp_frame = 1; // turret explode start animation frame var turret_anim_delay = 3; // turret explode animation delay var explosion_play = false; @@ -50,7 +55,7 @@ var fire_been_pressed = false; // stops auto fire // input(screen controller) variables var BTNL, BTNR, BTNF, BTNS; // button - left, right, fire, start var tap = {}; -// use tapping on screen for left and right +// use tapping on screen for left, right, fire, start Bangle.on('drag',e=>tap=e); BTNL = { read : _=>tap.b && tap.x < 88 && tap.y > 88}; BTNR = { read : _=>tap.b && tap.x > 88 && tap.y > 88}; @@ -133,7 +138,7 @@ function invader_fire() { function turret_hit() { if (turret_been_hit) { if (!(explosion_play)) { - Bangle.buzz(); + //Bangle.buzz(); //Bangle.beep(); } @@ -144,6 +149,7 @@ function turret_hit() { if (turret_anim_delay < 0) { turret_exp_frame += 1; if (turret_exp_frame > 2) { + Bangle.buzz(); turret_exp_frame = 1; } turret_anim_delay = 3; @@ -181,9 +187,8 @@ function invader_hit() { been_hit = false; bx = -32; // move boom off screen (following invader) by = -32; - // to gerate a random rounded number between 10 and 142; - inv_x = Math.floor(Math.random() * 142) + 10; - //inv_x = 77; // move invader back up after being hit + // generate a random rounded number between 10 and 142; + inv_x = Math.floor(Math.random() * 142) + 10; inv_y = 20; // move invader back up after being hit i_dir = 1; // reset invader direction } @@ -200,7 +205,7 @@ function gameStart() { // - main loop ------------------------------------------------------------- function onFrame() { - // game not started state (title screen) + // game not started state (title screen) *************************** if(game_state == 0) { g.clear(); @@ -230,6 +235,7 @@ function onFrame() { // draw sprites during game over state + // next 2 line for a rotating invader on the title screen //ang += 0.1; //g.drawImage(invader_a, 88, 98, {scale:4, rotate:ang}); if(inv_frame == 1) { @@ -251,13 +257,15 @@ function onFrame() { score = 0; // reset score explosion_play = false; game_state = 1; + turret_blast_delay = 25; } g.flip(); } - // game over state + + // game over state ************************************************* if(game_state == 3) { g.clear(); @@ -278,17 +286,18 @@ function onFrame() { // reset stuff if(BTNS.read()) { - turret_been_hit = false; - tur_x = 77; // reset turret to center of screen - tur_y = 148; // reset turret y - inv_x = 77; // reset invader to center of screen - inv_y = 20; // reset invader back to top - i_dir = 1; // reset invader direction - lives = 3; // reset lives - score = 0; // reset score - explosion_play = false; + //turret_been_hit = false; + //tur_x = 77; // reset turret to center of screen + //tur_y = 148; // reset turret y + //inv_x = 77; // reset invader to center of screen + //inv_y = 20; // reset invader back to top + //i_dir = 1; // reset invader direction + //lives = 3; // reset lives + //score = 0; // reset score + //explosion_play = false; game_state = 0; start_been_pressed = true; + //turret_blast_delay = 25; } @@ -296,7 +305,7 @@ function onFrame() { } - // not game over state (game running) + // not game over state (game running) ****************************** if(game_state == 1) { g.clear(); @@ -364,7 +373,8 @@ function onFrame() { lives -= 1; if (lives == 0) { - game_state = 3; + game_state = 3; + Bangle.buzz(); } turret_been_hit = true; } diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index add8a05e1..9ef8d7f31 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.07", + "version":"0.08", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From 840abf6e384f25225c0b60423fee5aa7bd616063 Mon Sep 17 00:00:00 2001 From: nujw Date: Sun, 29 May 2022 15:22:30 +1200 Subject: [PATCH 63/85] Update README.md --- apps/speedalt2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/README.md b/apps/speedalt2/README.md index c124e0c00..aebc71e32 100644 --- a/apps/speedalt2/README.md +++ b/apps/speedalt2/README.md @@ -37,7 +37,7 @@ When the GPS obtains a fix the number of satellites is displayed as 'Sats:nn'. W ## Power Saving -The The GPS Adv Sport app obeys the watch screen off timeouts as a power saving measure. Restore the screen as per any of the colck/watch apps. Use BTN2 to lock the screen on but doing this will use more battery. +The The GPS Adv Sport app obeys the watch screen off timeouts as a power saving measure. Restore the screen as per any of the clock/watch apps. Use BTN2 to lock the screen on but doing this will use more battery. This app will work quite happily on its own but will use the [GPS Setup App](https://banglejs.com/apps/#gps%20setup) if it is installed. You may choose to use the GPS Setup App to gain significantly longer battery life while the GPS is on. Please read the Low Power GPS Setup App Readme to understand what this does. From b094ce2b918c257a549cc0177dbf6612b74aad8f Mon Sep 17 00:00:00 2001 From: nujw Date: Sun, 29 May 2022 15:26:10 +1200 Subject: [PATCH 64/85] Update README.md --- apps/speedalt2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/README.md b/apps/speedalt2/README.md index aebc71e32..a86f787cf 100644 --- a/apps/speedalt2/README.md +++ b/apps/speedalt2/README.md @@ -65,7 +65,7 @@ The Droidscript script file is called : **GPS Adv Sports II.js** Start/Stop buttons tell the Bangle.js to start or stop sending BLE data packets to the Android device. While stopped the Bangle.js reverts to full power saving mode when the screen is asleep. -When runnig a blue 'led' will flash each time a data packet is recieved to refresh the android display. +When running a blue 'led' will flash each time a data packet is recieved to refresh the android display. An orange 'led' will flash for each reconnection attempt if no data is received for 30 seconds. It will keep trying to reconnect so you can restart the Bangle, run another Bangle app or temprarily turn off bluetooth. The android mirror display will automatically reconnect when the GPS Adv Sports II app is running on the Bangle again. ( Designed to leave the Android device running as the display mirror in a sealed case all day while retaining the ability to do other functions on the Bangle.js and returning to the GPS Speed Alt II app. ) From 99f3c6ab26f1da7a0eec8afc08e983555b2646ed Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Sat, 28 May 2022 22:16:23 +0200 Subject: [PATCH 65/85] [Alarms & Timers] Fix "enable all" --- apps/alarm/ChangeLog | 1 + apps/alarm/app.js | 25 ++++++++++++++++--------- apps/alarm/metadata.json | 2 +- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index b00055334..00187fa7c 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -29,3 +29,4 @@ 0.27: New UI! 0.28: Fix bug with alarms not firing when configured to fire only once 0.29: Fix wrong 'dow' handling in new timer if first day of week is Monday +0.30: Fix "Enable All" diff --git a/apps/alarm/app.js b/apps/alarm/app.js index fe0f67dbb..2aff43de2 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -86,7 +86,8 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) { const menu = { "": { "title": isNew ? /*LANG*/"New Alarm" : /*LANG*/"Edit Alarm" }, "< Back": () => { - saveAlarm(alarm, alarmIndex, time); + prepareAlarmForSave(alarm, alarmIndex, time); + saveAndReload(); showMainMenu(); }, /*LANG*/"Hour": { @@ -144,7 +145,7 @@ function showEditAlarmMenu(selectedAlarm, alarmIndex) { E.showMenu(menu); } -function saveAlarm(alarm, alarmIndex, time) { +function prepareAlarmForSave(alarm, alarmIndex, time) { alarm.t = require("time_utils").encodeTime(time); alarm.last = alarm.t < require("time_utils").getCurrentTimeMillis() ? new Date().getDate() : 0; @@ -153,8 +154,6 @@ function saveAlarm(alarm, alarmIndex, time) { } else { alarms[alarmIndex] = alarm; } - - saveAndReload(); } function saveAndReload() { @@ -251,7 +250,8 @@ function showEditTimerMenu(selectedTimer, timerIndex) { const menu = { "": { "title": isNew ? /*LANG*/"New Timer" : /*LANG*/"Edit Timer" }, "< Back": () => { - saveTimer(timer, timerIndex, time); + prepareTimerForSave(timer, timerIndex, time); + saveAndReload(); showMainMenu(); }, /*LANG*/"Hours": { @@ -293,7 +293,7 @@ function showEditTimerMenu(selectedTimer, timerIndex) { E.showMenu(menu); } -function saveTimer(timer, timerIndex, time) { +function prepareTimerForSave(timer, timerIndex, time) { timer.timer = require("time_utils").encodeTime(time); timer.t = require("time_utils").getCurrentTimeMillis() + timer.timer; timer.last = 0; @@ -303,8 +303,6 @@ function saveTimer(timer, timerIndex, time) { } else { alarms[timerIndex] = timer; } - - saveAndReload(); } function showAdvancedMenu() { @@ -327,7 +325,16 @@ function enableAll(on) { } else { E.showPrompt(/*LANG*/"Are you sure?", { title: on ? /*LANG*/"Enable All" : /*LANG*/"Disable All" }).then((confirm) => { if (confirm) { - alarms.forEach(alarm => alarm.on = on); + alarms.forEach((alarm, i) => { + alarm.on = on; + if (on) { + if (alarm.timer) { + prepareTimerForSave(alarm, i, require("time_utils").decodeTime(alarm.timer)) + } else { + prepareAlarmForSave(alarm, i, require("time_utils").decodeTime(alarm.t)) + } + } + }); saveAndReload(); showMainMenu(); } else { diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index cac837b5e..3c17ee177 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarms & Timers", "shortName": "Alarms", - "version": "0.29", + "version": "0.30", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm,widget", From e564efbcea74f5df4467428c612d6be5f15e60d6 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sun, 29 May 2022 07:21:23 -0800 Subject: [PATCH 66/85] Add files via upload --- apps/invader/app.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index fa53c608d..e4aef423d 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -7,8 +7,9 @@ // to do: -// make invader clock // upload to official app page +// make invader clock + // - variables ----------------------------------------- @@ -225,7 +226,7 @@ function onFrame() { // invader anim code i_anim_delay -= 1; if(i_anim_delay < 0) { - i_anim_delay = 25; + i_anim_delay = 15; inv_frame += 1; if (inv_frame > 2) { From fcde17946da3add20468a7a6b1d2ecfc790c3d5c Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sun, 29 May 2022 07:22:40 -0800 Subject: [PATCH 67/85] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 9ef8d7f31..d3a70728b 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.08", + "version":"0.09", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From f01dd23bab991e8f91a88df403036f74b6a59e0c Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Mon, 2 May 2022 23:15:06 +0200 Subject: [PATCH 68/85] [Settings] Improve "Turn Off" user experience - User must confirm - Show a goodbye message - Clear the screen --- apps/setting/ChangeLog | 1 + apps/setting/metadata.json | 2 +- apps/setting/settings.js | 20 +++++++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index eca2b7938..5a225b96d 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -50,3 +50,4 @@ UI improvements to Locale and Date & Time menu 0.45: Add calibrate battery option 0.46: Fix regression after making 'calibrate battery' only for Bangle.js 2 +0.47: Improve "Turn Off" user experience diff --git a/apps/setting/metadata.json b/apps/setting/metadata.json index 183290a85..ce4e5b337 100644 --- a/apps/setting/metadata.json +++ b/apps/setting/metadata.json @@ -1,7 +1,7 @@ { "id": "setting", "name": "Settings", - "version": "0.46", + "version": "0.47", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 150251e7d..359bc47a2 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -569,7 +569,25 @@ function showUtilMenu() { } else showUtilMenu(); }); }; - menu[/*LANG*/'Turn Off'] = ()=>{ if (Bangle.softOff) Bangle.softOff(); else Bangle.off() }; + menu[/*LANG*/"Turn Off"] = () => { + E.showPrompt(/*LANG*/"Are you sure? Alarms and timers won't fire", { + title:/*LANG*/"Turn Off" + }).then((confirmed) => { + if (confirmed) { + E.showMessage(/*LANG*/"See you\nlater!", /*LANG*/"Goodbye"); + setTimeout(() => { + // clear the screen so when the user will turn on the watch they'll see + // an empty screen instead of the latest displayed screen + E.showMessage(); + g.clear(true); + + Bangle.softOff ? Bangle.softOff() : Bangle.off(); + }, 2500); + } else { + showUtilMenu(); + } + }); + }; if (Bangle.factoryReset) { menu[/*LANG*/'Factory Reset'] = ()=>{ From fa6943ef185518c71455b36d98ec596fec204afe Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 31 May 2022 00:19:29 +0200 Subject: [PATCH 69/85] barclock: fix Vector font size on Bangle.js 2 --- apps/barclock/clock-bar.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/barclock/clock-bar.js b/apps/barclock/clock-bar.js index 55c4da074..61ce07dfb 100644 --- a/apps/barclock/clock-bar.js +++ b/apps/barclock/clock-bar.js @@ -78,11 +78,12 @@ const ClockFace = require("ClockFace"), } this.layout.bar.height = thickness+1; if (this.font===1) { // vector + const B2 = process.env.HWVERSION>1; if (this.is12Hour && locale.hasMeridian) { - this.layout.time.font = "Vector:60"; - this.layout.ampm.font = "Vector:40"; + this.layout.time.font = "Vector:"+(B2 ? 50 : 60); + this.layout.ampm.font = "Vector:"+(B2 ? 20 : 40); } else { - this.layout.time.font = "Vector:80"; + this.layout.time.font = "Vector:"+(B2 ? 60 : 80); } } else { this.layout.time.font = "6x8:"+thickness; From 4f807796f4aa47f09626d48a21c7a50eae098c93 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Tue, 31 May 2022 08:18:39 -0800 Subject: [PATCH 70/85] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index d3a70728b..168d83235 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.09", + "version":"0.10", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From 37cd4a1f5e9bc357175272acc963e1a028bfe140 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Tue, 31 May 2022 09:00:45 -0800 Subject: [PATCH 71/85] Add files via upload --- apps/invader/app.js | 3 ++- apps/invader/metadata.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index e4aef423d..89e7462f6 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -207,7 +207,7 @@ function gameStart() { function onFrame() { // game not started state (title screen) *************************** - if(game_state == 0) { + if(game_state == 0) { g.clear(); @@ -308,6 +308,7 @@ function onFrame() { // not game over state (game running) ****************************** if(game_state == 1) { + Bangle.setLCDPower(1); // optional - this keeps the watch LCD lit up g.clear(); diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 168d83235..bb74f5122 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.10", + "version":"0.11", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], From 4f92dcc00229ef57c056ad163124a96e49664172 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Wed, 1 Jun 2022 17:39:48 +0200 Subject: [PATCH 72/85] miclock2: Fix typo in redraw check --- apps/miclock2/ChangeLog | 1 + apps/miclock2/clock-mixed.js | 2 +- apps/miclock2/metadata.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/miclock2/ChangeLog b/apps/miclock2/ChangeLog index 55c60accd..534332e63 100644 --- a/apps/miclock2/ChangeLog +++ b/apps/miclock2/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Redraw only when seconds change +0.03: Fix typo in redraw check diff --git a/apps/miclock2/clock-mixed.js b/apps/miclock2/clock-mixed.js index edc68959c..bb1537313 100644 --- a/apps/miclock2/clock-mixed.js +++ b/apps/miclock2/clock-mixed.js @@ -48,7 +48,7 @@ function setLineWidth(x1, y1, x2, y2, lw) { function drawMixedClock(force) { var date = new Date(); - if ((force || Bangle.isLCDOn()) && buf.buffer && date.getSeconds() === lastDate.getSeconds()) { + if ((force || Bangle.isLCDOn()) && buf.buffer && date.getSeconds() !== lastDate.getSeconds()) { lastDate = date; var dateArray = date.toString().split(" "); var isEn = locale.name.startsWith("en"); diff --git a/apps/miclock2/metadata.json b/apps/miclock2/metadata.json index e1481dbd2..094d0995a 100644 --- a/apps/miclock2/metadata.json +++ b/apps/miclock2/metadata.json @@ -1,7 +1,7 @@ { "id": "miclock2", "name": "Mixed Clock 2", - "version": "0.02", + "version": "0.03", "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.", "icon": "clock-mixed.png", "type": "clock", From 602ffee6015609b2dddc5ab78af59941c8daa649 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Thu, 2 Jun 2022 19:39:42 +0200 Subject: [PATCH 73/85] calendar: Fix scope of let variables --- apps/calendar/ChangeLog | 1 + apps/calendar/calendar.js | 25 ++++++++++++------------- apps/calendar/metadata.json | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/calendar/ChangeLog b/apps/calendar/ChangeLog index ea8934f84..873f90de6 100644 --- a/apps/calendar/ChangeLog +++ b/apps/calendar/ChangeLog @@ -7,3 +7,4 @@ 0.07: Fix off-by-one-error on previous month 0.08: Do not register as watch, manually start clock on button read start of week from system settings +0.09: Fix scope of let variables diff --git a/apps/calendar/calendar.js b/apps/calendar/calendar.js index fc7e93cf5..f4676fc22 100644 --- a/apps/calendar/calendar.js +++ b/apps/calendar/calendar.js @@ -16,6 +16,12 @@ const white = "#ffffff"; const red = "#d41706"; const blue = "#0000ff"; const yellow = "#ffff00"; +let bgColor = color4; +let bgColorMonth = color1; +let bgColorDow = color2; +let bgColorWeekend = color3; +let fgOtherMonth = gray1; +let fgSameMonth = white; let settings = require('Storage').readJSON("calendar.json", true) || {}; let startOnSun = ((require("Storage").readJSON("setting.json", true) || {}).firstDayOfWeek || 0) === 0; @@ -27,19 +33,12 @@ if (settings.ndColors === undefined) } if (settings.ndColors === true) { - let bgColor = white; - let bgColorMonth = blue; - let bgColorDow = black; - let bgColorWeekend = yellow; - let fgOtherMonth = blue; - let fgSameMonth = black; -} else { - let bgColor = color4; - let bgColorMonth = color1; - let bgColorDow = color2; - let bgColorWeekend = color3; - let fgOtherMonth = gray1; - let fgSameMonth = white; + bgColor = white; + bgColorMonth = blue; + bgColorDow = black; + bgColorWeekend = yellow; + fgOtherMonth = blue; + fgSameMonth = black; } function getDowLbls(locale) { diff --git a/apps/calendar/metadata.json b/apps/calendar/metadata.json index 5f968b364..65a54c097 100644 --- a/apps/calendar/metadata.json +++ b/apps/calendar/metadata.json @@ -1,7 +1,7 @@ { "id": "calendar", "name": "Calendar", - "version": "0.08", + "version": "0.09", "description": "Simple calendar", "icon": "calendar.png", "screenshots": [{"url":"screenshot_calendar.png"}], From 019f635ad4582b1031fba44f4d663fa1876b22fc Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Thu, 26 May 2022 22:03:32 +0200 Subject: [PATCH 74/85] [buzz] Add support for ':' and '=' --- modules/buzz.js | 36 +++++++++++++++++++++++++++--------- modules/buzz_menu.js | 23 ++++++++++++++--------- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/modules/buzz.js b/modules/buzz.js index 488d0228d..4de314b8c 100644 --- a/modules/buzz.js +++ b/modules/buzz.js @@ -1,14 +1,32 @@ -/* Call this with a pattern like '.-.', '.. .' or '..' to buzz that pattern -out on the internal vibration motor. use buzz_menu to display a menu -where the patterns can be chosen. */ +const BUZZ_WEAK = 0.25; +const BUZZ_STRONG = 1; +const SHORT_MS = 100; +const LONG_MS = 500; + +/** + * Buzz the passed `pattern` out on the internal vibration motor. + * + * A pattern is a sequence of `.`, `:`, `-` and `=` where + * - `:` is one short and strong vibration + * - `.` is one short and weak vibration + * - `=` is one long and strong vibration + * - `-` is one long and weak vibration + * + * You can use the `buzz_menu` module to display a menu where some common patterns can be chosen. + * + * @param {string} pattern A string like `.-.`, `..=`, `:.:`, `..`, etc. + * @returns a Promise + */ exports.pattern = pattern => new Promise(resolve => { - function b() { - if (pattern=="") resolve(); + function doBuzz() { + if (pattern == "") resolve(); var c = pattern[0]; pattern = pattern.substr(1); - if (c==".") Bangle.buzz().then(()=>setTimeout(b,100)); - else if (c=="-") Bangle.buzz(500).then(()=>setTimeout(b,100)); - else setTimeout(b,100); + if (c == ".") Bangle.buzz(SHORT_MS, BUZZ_WEAK).then(() => setTimeout(doBuzz, 100)); + else if (c == "-") Bangle.buzz(LONG_MS, BUZZ_WEAK).then(() => setTimeout(doBuzz, 100)); + else if (c == ":") Bangle.buzz(SHORT_MS, BUZZ_STRONG).then(() => setTimeout(doBuzz, 100)); + else if (c == "=") Bangle.buzz(LONG_MS, BUZZ_STRONG).then(() => setTimeout(doBuzz, 100)); + else setTimeout(doBuzz, 100); } - b(); + doBuzz(); }); diff --git a/modules/buzz_menu.js b/modules/buzz_menu.js index c5b41a997..bb138a812 100644 --- a/modules/buzz_menu.js +++ b/modules/buzz_menu.js @@ -1,14 +1,19 @@ -/* Display a menu to select from various vibration patterns for use with buzz.js */ - -exports.pattern = function(value, callback) { - var vibPatterns = ["", ".", "..", "-", "--", "-.-", "---"]; +/** + * Display a menu to select from various common vibration patterns for use with buzz.js. + * + * @param {string} value The pre-selected pattern + * @param {*} callback A function called with the user selected pattern + */ +exports.pattern = function (value, callback) { + var patterns = ["", ".", ":", "..", "::", "-", "=", "--", "==", "=.=", "---"]; return { - value: Math.max(0,vibPatterns.indexOf(value)), - min: 0, max: vibPatterns.length-1, - format: v => vibPatterns[v]||/*LANG*/"Off", + value: Math.max(0, patterns.indexOf(value)), + min: 0, + max: patterns.length - 1, + format: v => patterns[v] || /*LANG*/"Off", onchange: v => { - require("buzz").pattern(vibPatterns[v]); - callback(vibPatterns[v]); + require("buzz").pattern(patterns[v]); + callback(patterns[v]); } }; } From 091006e9c502e2867417a44ed52deab361b62c66 Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Sat, 28 May 2022 23:30:59 +0200 Subject: [PATCH 75/85] [buzz] Add support for ',' and ';' --- modules/buzz.js | 16 +++++++++------- modules/buzz_menu.js | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/buzz.js b/modules/buzz.js index 4de314b8c..cfa948117 100644 --- a/modules/buzz.js +++ b/modules/buzz.js @@ -1,16 +1,16 @@ -const BUZZ_WEAK = 0.25; -const BUZZ_STRONG = 1; -const SHORT_MS = 100; -const LONG_MS = 500; +const BUZZ_WEAK = 0.25, BUZZ_STRONG = 1; +const SHORT_MS = 100, MEDIUM_MS = 200, LONG_MS = 500; /** * Buzz the passed `pattern` out on the internal vibration motor. * - * A pattern is a sequence of `.`, `:`, `-` and `=` where - * - `:` is one short and strong vibration + * A pattern is a sequence of `.`, `,`, `-`, `:`, `;` and `=` where * - `.` is one short and weak vibration - * - `=` is one long and strong vibration + * - `,` is one medium and weak vibration * - `-` is one long and weak vibration + * - `:` is one short and strong vibration + * - `;` is one medium and strong vibration + * - `=` is one long and strong vibration * * You can use the `buzz_menu` module to display a menu where some common patterns can be chosen. * @@ -23,8 +23,10 @@ exports.pattern = pattern => new Promise(resolve => { var c = pattern[0]; pattern = pattern.substr(1); if (c == ".") Bangle.buzz(SHORT_MS, BUZZ_WEAK).then(() => setTimeout(doBuzz, 100)); + else if (c == ",") Bangle.buzz(MEDIUM_MS, BUZZ_WEAK).then(() => setTimeout(doBuzz, 100)); else if (c == "-") Bangle.buzz(LONG_MS, BUZZ_WEAK).then(() => setTimeout(doBuzz, 100)); else if (c == ":") Bangle.buzz(SHORT_MS, BUZZ_STRONG).then(() => setTimeout(doBuzz, 100)); + else if (c == ";") Bangle.buzz(MEDIUM_MS, BUZZ_STRONG).then(() => setTimeout(doBuzz, 100)); else if (c == "=") Bangle.buzz(LONG_MS, BUZZ_STRONG).then(() => setTimeout(doBuzz, 100)); else setTimeout(doBuzz, 100); } diff --git a/modules/buzz_menu.js b/modules/buzz_menu.js index bb138a812..7ca155a2c 100644 --- a/modules/buzz_menu.js +++ b/modules/buzz_menu.js @@ -5,7 +5,7 @@ * @param {*} callback A function called with the user selected pattern */ exports.pattern = function (value, callback) { - var patterns = ["", ".", ":", "..", "::", "-", "=", "--", "==", "=.=", "---"]; + var patterns = ["", ".", ":", "..", "::", ",", ";", ",,", ";;", "-", "=", "--", "==", "...", ":::", "---", ";;;", "==="]; return { value: Math.max(0, patterns.indexOf(value)), min: 0, From 13c3e13cde857f1050b070e7c5bbb5309bfbb3cf Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Sun, 29 May 2022 10:01:58 +0200 Subject: [PATCH 76/85] [Scheduler] Update label --- apps/sched/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sched/settings.js b/apps/sched/settings.js index 5ddb4dab2..a2b3a5241 100644 --- a/apps/sched/settings.js +++ b/apps/sched/settings.js @@ -29,7 +29,7 @@ min: 5, max: 30, step: 5, - format: v => v + /*LANG*/" min", + format: v => v + /*LANG*/"m", onchange: v => { settings.defaultSnoozeMillis = v * 60000; require("sched").setSettings(settings); From 9ac54459b401b7e664135442634df978f26d4176 Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Thu, 2 Jun 2022 18:14:38 +0200 Subject: [PATCH 77/85] [Scheduler] Fallback to configured default patterns --- apps/sched/sched.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/sched/sched.js b/apps/sched/sched.js index f4d1bc9ad..92a744588 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -50,7 +50,8 @@ function showAlarm(alarm) { Bangle.setLocked(false); } - require("buzz").pattern(alarm.vibrate === undefined ? ".." : alarm.vibrate).then(() => { + const pattern = alarm.vibrate || (alarm.timer ? settings.defaultTimerPattern : settings.defaultAlarmPattern); + require("buzz").pattern(pattern).then(() => { if (buzzCount--) { setTimeout(buzz, settings.buzzIntervalMillis); } else if (alarm.as) { // auto-snooze From 061fec482601a218dd3ca4480980398c3384a486 Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Thu, 2 Jun 2022 18:12:54 +0200 Subject: [PATCH 78/85] [Scheduler] Show timer using formatDuration --- apps/sched/sched.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sched/sched.js b/apps/sched/sched.js index 92a744588..012e8ed35 100644 --- a/apps/sched/sched.js +++ b/apps/sched/sched.js @@ -9,7 +9,7 @@ function showAlarm(alarm) { const settings = require("sched").getSettings(); let msg = ""; - msg += require("time_utils").formatTime(alarm.timer ? alarm.timer : alarm.t); + msg += alarm.timer ? require("time_utils").formatDuration(alarm.timer) : require("time_utils").formatTime(alarm.t); if (alarm.msg) { msg += "\n"+alarm.msg; } else { From a1c214a5027da3004b0988ea935711ce1bc2e80b Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Fri, 3 Jun 2022 17:32:09 +0200 Subject: [PATCH 79/85] [Scheduler] Set default patterns to "strong" --- apps/sched/lib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sched/lib.js b/apps/sched/lib.js index 315e4e387..5089ed46c 100644 --- a/apps/sched/lib.js +++ b/apps/sched/lib.js @@ -106,8 +106,8 @@ exports.getSettings = function () { defaultRepeat: false, buzzCount: 10, buzzIntervalMillis: 3000, // 3 seconds - defaultAlarmPattern: "..", - defaultTimerPattern: ".." + defaultAlarmPattern: "::", + defaultTimerPattern: "::" }, require("Storage").readJSON("sched.settings.json", true) || {} ); From b33cfc8c142b6b48e735f5ff1ba79d519c23b9fb Mon Sep 17 00:00:00 2001 From: Alessandro Cocco Date: Fri, 3 Jun 2022 17:32:39 +0200 Subject: [PATCH 80/85] [Scheduler] Update metadata and changelog --- apps/sched/ChangeLog | 3 +++ apps/sched/metadata.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog index e003248a3..5728bf734 100644 --- a/apps/sched/ChangeLog +++ b/apps/sched/ChangeLog @@ -10,3 +10,6 @@ 0.09: Move some functions to new time_utils module 0.10: Default to sched.js if custom js not found 0.11: Fix default dow +0.12: Update default buzz patterns to new values + Improve timer message using formatDuration + Fix wrong fallback for buzz pattern diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json index 76341a7ad..c8ed3acb8 100644 --- a/apps/sched/metadata.json +++ b/apps/sched/metadata.json @@ -1,7 +1,7 @@ { "id": "sched", "name": "Scheduler", - "version": "0.11", + "version": "0.12", "description": "Scheduling library for alarms and timers", "icon": "app.png", "type": "scheduler", From 1a8f8d9cdff56f97495cc1c6237d81f70026f9cb Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 4 Jun 2022 10:48:27 +0200 Subject: [PATCH 81/85] Improve localization for de_DE --- apps/setting/settings.js | 24 +++++++---- lang/de_DE.json | 93 ++++++++++++++++++++++++---------------- 2 files changed, 70 insertions(+), 47 deletions(-) diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 150251e7d..e4f1cffae 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -252,22 +252,28 @@ function showThemeMenu() { } upd(th); } - let rgb = { - black: "#000", white: "#fff", - red: "#f00", green: "#0f0", blue: "#00f", - cyan: "#0ff", magenta: "#f0f", yellow: "#ff0", - }; - if (!BANGLEJS2) Object.assign(rgb, { + let rgb = {}; + rgb[/*LANG*/'black'] = "#000"; + rgb[/*LANG*/'white'] = "#fff"; + rgb[/*LANG*/'red'] = "#f00"; + rgb[/*LANG*/'green'] = "#0f0"; + rgb[/*LANG*/'blue'] = "#00f"; + rgb[/*LANG*/'cyan'] = "#0ff"; + rgb[/*LANG*/'magenta'] = "#f0f"; + rgb[/*LANG*/'yellow'] = "#ff0"; + if (!BANGLEJS2) { // these would cause dithering, which is not great for e.g. text - orange: "#ff7f00", purple: "#7f00ff", grey: "#7f7f7f", - }); + rgb[/*LANG*/'orange'] = "#ff7f00"; + rgb[/*LANG*/'purple'] = "#7f00ff"; + rgb[/*LANG*/'grey'] = "#7f7f7f"; + } let colors = [], names = []; for(const c in rgb) { names.push(c); colors.push(cl(rgb[c])); } let menu = { - '':{title:'Custom Theme'}, + '':{title:/*LANG*/'Custom Theme'}, "< Back": () => showThemeMenu() }; const labels = { diff --git a/lang/de_DE.json b/lang/de_DE.json index e0deef7fb..ef22b588f 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -20,11 +20,11 @@ "On": "Ein", "Off": "Aus", "Ok": "OK", - "New Timer": "Neue Zeitschaltuhr", + "New Timer": "Neuer Kurzzeitwecker", "(repeat)": "(Wiederholung)", "music": "Musik", - "Keep Msgs": "Msgs behalten", - "circle count": "Kreiszahl", + "Keep Msgs": "Nachrichten behalten", + "circle count": "Anzahl Kreise", "Auto snooze": "Automatisches Schlummern", "week": "Woche", "Heartrate": "Herzfrequenz", @@ -43,7 +43,7 @@ "colorize icon": "Symbol einfärben", "min. confidence": "Mindestvertrauen", "maximum": "maximal", - "distance goal": "Fernziel", + "distance goal": "Entfernungsziel", "Circle": "Kreis", "Yes\ndefinitely": "Ja\ndefinitiv", "TAP right top/bottom": "TAP rechts oben/unten", @@ -52,28 +52,29 @@ "Mark Unread": "Ungelesen markieren", "Delete all messages": "Alle Nachrichten löschen", "Unread timer": "Ungelesener Timer", - "Quiet Mode": "Leiser Modus", + "Quiet Mode": "Stiller Modus", "Utils": "Werkzeuge", "Piezo": "Piezo", "LCD": "LCD", - "Record Run": "Rekordlauf", + "Record Run": "Lauf aufzeichnen", "Apps": "Apps", "Delete All Messages": "Alle Nachrichten löschen", "start&lap/reset, BTN1: EXIT": "Start&Runde/Zurücksetzen, BTN1: EXIT", "No Messages": "Keine Nachrichten", "Bluetooth": "Bluetooth", - "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:Rundenstart 2:Exit 3:Reset", "View Message": "Nachricht anzeigen", "Vector font size": "Vektor-Schriftgröße", - "Light BW": "Licht BW", + "Light BW": "Hell S/W", "BLE": "BLE", "Make Connectable": "Verbindbar machen", "Vibration": "Vibration", - "Foreground": "Vorderseite", - "Customize": "Anpassen", + "Foreground": "Vordergrund", + "Customize": "Individualisieren", + "Custom Theme": "Individueller Stil", "HID": "HID", - "Dark BW": "Dunkel BW", - "Passkey BETA": "Hauptschlüssel BETA", + "Dark BW": "Dunkel S/W", + "Passkey BETA": "Passwort BETA", "Show clocks": "Uhren anzeigen", "Font": "Schriftart", "Launcher Settings": "Launcher-Einstellungen", @@ -82,30 +83,30 @@ "Background 2": "Hintergrund 2", "Foreground 2": "Vordergrund 2", "Add Device": "Gerät hinzufügen", - "Highlight BG": "Hervorhebung BG", + "Highlight BG": "Hervorhebung HG", "Background": "Hintergrund", - "Highlight FG": "Highlight FG", + "Highlight FG": "Hervorhebung VG", "Wake on Touch": "Wecken bei Berührung", "Twist Timeout": "Twist Timeout", "Twist Max Y": "Twist Max Y", - "LCD Timeout": "LCD-Zeitüberschreitung", + "LCD Timeout": "LCD-Leuchtdauer", "LCD Brightness": "LCD-Helligkeit", - "Utilities": "Versorgungsunternehmen", + "Utilities": "Werkzeuge", "Log": "Protokoll", - "Compact Storage": "Kompakte Lagerung", - "Wake on BTN3": "Wake auf BTN3", - "Twist Threshold": "Schwellenwert verdrehen", + "Compact Storage": "Speicherwartung", + "Wake on BTN3": "Aufwachen auf BTN3", + "Twist Threshold": "Twist Schwellenwert", "Remove": "entfernen", "Connect device\nto add to\nwhitelist": "Gerät verbinden\nzum Hinzufügen zur\nWhitelist", "Debug Info": "Debug-Informationen", "Time Zone": "Zeitzone", - "Clock Style": "Uhr Stil", - "Wake on BTN2": "Wake auf BTN2", - "Wake on FaceUp": "Wake on FaceUp", - "Wake on BTN1": "Wake auf BTN1", - "Wake on Twist": "Wake on Twist", - "Connectable": "Anschließbar", - "Second": "Zweite", + "Clock Style": "Uhrenstil", + "Wake on BTN2": "Aufwecken mit BTN2", + "Wake on FaceUp": "Aufwecken mit Display oben", + "Wake on BTN1": "Aufwecken mit BTN1", + "Wake on Twist": "Aufwecken mit Twist", + "Connectable": "Erreichbar", + "Second": "Sekunde", "Minute": "Minute", "Turn Off": "Ausschalten", "No Clocks Found": "Keine Uhren gefunden", @@ -114,10 +115,10 @@ "Reset to Defaults": "Auf Standardwerte zurücksetzen", "Flattening battery - this can take hours.\nLong-press button to cancel": "Entladen der Batterie - dies kann Stunden dauern.\nLanger Tastendruck zum Abbrechen", "Reset Settings": "Einstellungen zurücksetzen", - "Rewrite Settings": "Einstellungen umschreiben", - "Compacting...\nTakes approx\n1 minute": "Verdichten...\nDauert ca.\n1 Minute", - "Stay Connectable": "Anschlussfähig bleiben", - "Storage": "Lagerung", + "Rewrite Settings": "Einstellungen neu schreiben", + "Compacting...\nTakes approx\n1 minute": "Speicherwartung...\nDauert ca.\n1 Minute", + "Stay Connectable": "Erreichbar bleiben", + "Storage": "Speicher", "This will remove everything": "Dadurch wird alles entfernt", "on": "auf", "TIMER": "TIMER", @@ -126,9 +127,10 @@ "Beep": "Piep", "Reset": "Zurücksetzen", "No app has settings": "Keine App hat Einstellungen", + "Day": "Tag", "Month": "Monat", "Reset All": "Alle zurücksetzen", - "Flatten Battery": "Batterie abflachen", + "Flatten Battery": "Batterie entladen", "Right": "Rechts", "Side": "Seite", "Left": "Links", @@ -141,12 +143,12 @@ "Vibrate": "Vibrieren", "Reset all widgets": "Alle Widgets zurücksetzen", "System": "System", - "Alerts": "Warnungen", - "Locale": "Schauplatz", + "Alerts": "Alarme", + "Locale": "Ort", "Whitelist": "Whitelist", "Select Clock": "Uhr auswählen", - "Disable": "Deaktivieren Sie", - "Timer": "Zeitschaltuhr", + "Disable": "Deaktivieren", + "Timer": "Kurzzeitwecker", "Error in settings": "Fehler in den Einstellungen", "Set Time": "Zeit einstellen", "ALARM": "ALARM", @@ -164,7 +166,7 @@ "Music": "Musik", "color": "Farbe", "off": "aus", - "Theme": "Thema", + "Theme": "Stil", "one": "eins", "two": "zwei", "three": "drei", @@ -176,7 +178,22 @@ "nine": "neun", "ten": "zehn", "eleven": "elf", - "twelve": "zwölf" + "twelve": "zwölf", + "Time Format": "Zeitformat", + "Start Week On": "Wochenbeginn", + "Date & Time": "Datum und Zeit", + "Calibrate Battery": "Akku kalibrieren", + "black": "Schwarz", + "white": "Weiß", + "red": "Rot", + "green": "Grün", + "blue": "Blau", + "yellow": "Gelb", + "magenta": "Magenta", + "cyan": "Cyan", + "orange": "Orange", + "purple": "Violett", + "grey": "Grau" }, "alarm": { "//": "App-specific overrides", @@ -189,7 +206,7 @@ "ten past *$1": "zehn nach *$1", "quarter past *$1": "viertel nach *$1", "twenty past *$1": "zwanzig nach *$1", - "twenty five past *$1": "fünf for halb *$2", + "twenty five past *$1": "fünf vor halb *$2", "half past *$1": "halb *$2", "twenty five to *$2": "fünf nach halb *$2", "twenty to *$2": "zwanzig vor *$2", From f897b4f86cb15ea0a90ea9b23cc280a45a420aca Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 5 Jun 2022 15:03:36 +0200 Subject: [PATCH 82/85] Update metadata and changelog --- apps/setting/ChangeLog | 1 + apps/setting/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index eca2b7938..b8dd3d317 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -50,3 +50,4 @@ UI improvements to Locale and Date & Time menu 0.45: Add calibrate battery option 0.46: Fix regression after making 'calibrate battery' only for Bangle.js 2 +0.47: Allow colors to be translated diff --git a/apps/setting/metadata.json b/apps/setting/metadata.json index 183290a85..ce4e5b337 100644 --- a/apps/setting/metadata.json +++ b/apps/setting/metadata.json @@ -1,7 +1,7 @@ { "id": "setting", "name": "Settings", - "version": "0.46", + "version": "0.47", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", From adb96f1704c9b9f8c5ea952685d9e5a7b30c732d Mon Sep 17 00:00:00 2001 From: Dione Batista Date: Sun, 5 Jun 2022 14:59:58 -0300 Subject: [PATCH 83/85] Create pt_BR.json --- lang/pt_BR.json | 167 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 lang/pt_BR.json diff --git a/lang/pt_BR.json b/lang/pt_BR.json new file mode 100644 index 000000000..75849ddad --- /dev/null +++ b/lang/pt_BR.json @@ -0,0 +1,167 @@ +{ + "//": "Portuguese Brasil language translations", + "GLOBAL": { + "//": "Translations that apply for all apps", + "New Timer": "Novo Temporizador", + "New Alarm": "Novo Alarme", + "Auto snooze": "Soneca automática", + "week": "semana", + "circle 3": "círculo 3", + "(repeat)": "(repetir)", + "Save": "Salvar", + "Keep Msgs": "Manter Msgs", + "music": "música", + "circle 4": "círculo 4", + "circle 2": "círculo 2", + "circle count": "contagem em círculo", + "circle 1": "círculo 1", + "battery warn": "aviso de bateria", + "show widgets": "exibir widgets", + "data": "dados", + "heartrate": "frequência cardíaca", + "distance goal": "distancia de chegada", + "Circle": "Círculo", + "colorize icon": "colorir ícone", + "min. confidence": "min. confiança", + "minimum": "mínimo", + "maximum": "máximo", + "Heartrate": "Frequência Cardíaca", + "weather circle": "círculo meteorológico", + "step length": "comprimento do passo", + "valid period": "período válido", + "TAP right top/bottom": "TAP superior/inferior direita", + "Vector font size": "Tamanho de letra vectorial", + "Yes\ndefinitely": "Sim\ndefinitivamente", + "BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset", + "STEPS": "ETAPAS", + "Font": "Fonte", + "Show clocks": "Mostrar relógios", + "App Source\nNot found": "Fonte do aplicativo\nNão encontrado", + "Mark Unread": "Marcar como não lido", + "View Message": "Ver Mensagem", + "start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: SAÍDA", + "Launcher Settings": "Configurações do Launcher", + "Delete All Messages": "Apagar todas as mensagens", + "Delete all messages": "Apagar todas as mensagens", + "Utils": "Utils", + "LCD": "LCD", + "Apps": "Apps", + "Record Run": "Gravar Corrida", + "No Messages": "Sem Mensagens", + "Unread timer": "Temporizador não visto", + "Are you sure": "Tem certeza", + "Make Connectable": "Habilitar Conexão", + "Piezo": "Piezo", + "Bluetooth": "Bluetooth", + "BLE": "BLE", + "Programmable": "Programável", + "Vibration": "Vibração", + "Quiet Mode": "Modo Silencioso", + "Foreground": "Primeiro plano", + "Passkey BETA": "Senha BETA", + "HID": "HID", + "Light BW": "BW Leve", + "Foreground 2": "Primeiro plano 2", + "Dark BW": "BW Escuro", + "Background": "Plano de Fundo", + "Highlight FG": "Destaque FG", + "Customize": "Personalizar", + "Background 2": "Plano de Fundo 2", + "Wake on BTN3": "Acordar no BTN3", + "Wake on BTN2": "Acordar no BTN2", + "Highlight BG": "Destaque BG", + "LCD Timeout": "Tempo limite do LCD", + "Wake on FaceUp": "Acordar no FaceUp", + "Wake on BTN1": "Acordar no BTN1", + "Wake on Twist": "Acordar ao Balançar", + "Wake on Touch": "Acordar ao Tocar", + "Connect device\nto add to\nwhitelist": "Ligar dispositivo\npara adicionar a\nWhitelist", + "Remove": "Remover", + "Add Device": "Adicionar dispositivo", + "LCD Brightness": "Luminosidade do LCD", + "Twist Max Y": "Max Y do Balanço", + "Utilities": "Utilidades", + "Twist Threshold": "Limiar do Balanço", + "Time Zone": "Fuso horário", + "Twist Timeout": "Timeout do Balanço", + "Clock Style": "Estilo do Relógio", + "Debug Info": "Debug Infos", + "Log": "Logs", + "Storage": "Armazenamento", + "Rewrite Settings": "Re-escrever Configurações", + "Compacting...\nTakes approx\n1 minute": "Compactando...\nLeva aproximadamente\n1 minuto", + "Flatten Battery": "Drenar Bateria", + "Reset Settings": "Resetar Configurações", + "Compact Storage": "Armazenamento compacto", + "Stay Connectable": "Manter Conectavel", + "Turn Off": "Desativar", + "Connectable": "Conectável", + "This will remove everything": "Esta ação irá apagar tudo", + "Date": "Data", + "Month": "Mês", + "Second": "Segundo", + "Minute": "Minuto", + "Flattening battery - this can take hours.\nLong-press button to cancel": "Drenando Bateria - isto pode demorar horas.\nSegure o Botão para Cancelar", + "Reset to Defaults": "Resetar Dispositivo", + "Hour": "Hora", + "No Clocks Found": "Não encontramos nenhum Relogio", + "Right": "Confirmar", + "No app has settings": "Nenhum aplicativo possui configurações", + "App Settings": "Configurações do aplicativo", + "OFF": "DESLIGADO", + "Side": "Lado", + "Left": "Esquerda", + "Sort Order": "Ordem de classificação", + "Widgets": "Widgets", + "Invalid settings": "Configurações inválidas", + "Sleep Phase Alarm": "Alarme da Fase do Sono", + "Alarm": "Alarme", + "Minutes": "Minutos", + "TIMER": "TIMER", + "Hours": "Horário", + "on": "em", + "Reset All": "Resetar tudo", + "Repeat": "Repetir", + "Delete": "Deletar", + "Enabled": "Habilitado", + "Reset all widgets": "Redefinir todos os widgets", + "Reset": "Resetar", + "goal": "meta", + "Message": "Mensagem", + "Beep": "Bip", + "Vibrate": "Vibrar", + "System": "Sistema", + "Alerts": "Alertas", + "Locale": "Localização", + "Set Time": "Tempo Definido", + "Whitelist": "Whitelist", + "Select Clock": "Selecionar Relógio", + "BACK": "VOLTAR", + "Timer": "Temporizador", + "Error in settings": "Erro nas Configurações", + "Disable": "Desativar", + "Factory Reset": "Reset de Fábrica", + "Connected": "Conectado", + "ALARM": "ALARME", + "Sleep": "Dormir", + "Messages": "Mensagens", + "Hide": "Esconder", + "Show": "Mostrar", + "On": "Ativo", + "Ok": "Ok", + "No": "Não", + "Settings": "Configurações", + "steps": "passos", + "back": "voltar", + "Steps": "Passos", + "Year": "Ano", + "Yes": "Sim", + "Loading": "Carregando", + "Music": "Música", + "color": "cor", + "off": "desativado", + "Off": "Desativado", + "Theme": "Tema", + "Back": "Voltar" + } +} From a4f79367ba16d13755541bbcbcb7fef17f438341 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Jun 2022 11:16:41 +0100 Subject: [PATCH 84/85] constant decl in function saves RAM --- modules/buzz.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/buzz.js b/modules/buzz.js index cfa948117..aed0e2e7b 100644 --- a/modules/buzz.js +++ b/modules/buzz.js @@ -1,6 +1,3 @@ -const BUZZ_WEAK = 0.25, BUZZ_STRONG = 1; -const SHORT_MS = 100, MEDIUM_MS = 200, LONG_MS = 500; - /** * Buzz the passed `pattern` out on the internal vibration motor. * @@ -22,6 +19,8 @@ exports.pattern = pattern => new Promise(resolve => { if (pattern == "") resolve(); var c = pattern[0]; pattern = pattern.substr(1); + const BUZZ_WEAK = 0.25, BUZZ_STRONG = 1; + const SHORT_MS = 100, MEDIUM_MS = 200, LONG_MS = 500; if (c == ".") Bangle.buzz(SHORT_MS, BUZZ_WEAK).then(() => setTimeout(doBuzz, 100)); else if (c == ",") Bangle.buzz(MEDIUM_MS, BUZZ_WEAK).then(() => setTimeout(doBuzz, 100)); else if (c == "-") Bangle.buzz(LONG_MS, BUZZ_WEAK).then(() => setTimeout(doBuzz, 100)); From 97811b6cadca1cfc375ced23489a490b45a8a234 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 6 Jun 2022 12:01:01 +0100 Subject: [PATCH 85/85] link pt_BR --- lang/index.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lang/index.json b/lang/index.json index 20ceaab92..474a530ab 100644 --- a/lang/index.json +++ b/lang/index.json @@ -12,6 +12,7 @@ {"code":"tr_TR","name":"Turkish","url":"tr_TR.json"}, {"code":"ru_RU","name":"Russian","url":"ru_RU.json", "disabled":"Characters not in ISO Latin codepage"}, {"code":"pt_PT","name":"Portuguese","url":"pt_PT.json"}, + {"code":"pt_BR","name":"Portuguese Brasil","url":"pt_BR.json"}, {"code":"bg_BG","name":"Bulgarian","url":"bg_BG.json", "disabled":"Characters not in ISO Latin codepage"}, {"code":"da_DA","name":"Danish","url":"da_DA.json"}, {"code":"el_EL","name":"Greek","url":"el_EL.json", "disabled":"Characters not in ISO Latin codepage"}, @@ -23,5 +24,5 @@ {"code":"sk_SK","name":"Slovak","url":"sk_SK.json"}, {"code":"sl_SL","name":"Slovenian","url":"sl_SL.json"}, {"code":"nn_NO","name":"Norwegian (Nynorsk)","url":"nn_NO.json"}, - {"code":"hr_HR","name":"Croatian","url":"hr_HR.json"} + {"code":"hr_HR","name":"Croatian","url":"hr_HR.json"} ]

r=6?}^4FYys8yf7tJ}v&lbnU=$u^$Exjz9jmU;O*8%J+XiE_kM95NciAm|UGv1ecuvFpd-u}n8U9}_IREcK z?azku|5(odJF?EM-fYI^_X_26&%gN@U;FRHuU@D5U#o5JZ~lFL-?{#0f4|CBlrU}9 z|M2Sb`F$4_a~GHXKau?HPnrGyH$VIGKA!v6@V}Vx{J)mIxC2=Z>%XThwsr59KP!1R zyI1bM?4wtIb~E|K&ez^vu>4))`nn3?4_RH=$2or-%{4u6as7ge){oz8=UeQ*b+!G= z^yY}uy7gCXewMxKBvX63pzPlZ^Pe}v?P~dLeud8EiaL<4|M1S|b8O#IneD3In>R@@ z&aG{a_@t#IZ&Reug?*57nyk=e5)eSg^JMBR41 z2Xmgjw7(%xz!!VK(t9!&6O-P8=$XO-1?Mg;X=-TTei8PJg=NlWla&ez514jMwPa*` zuH&o4!Lg$uFV)XsRLf|H4dn#GuWl>XKfm90{(0$bwd+Nh_C2iPu8`l<@crh#z3snu z9kMP2WsB4HYMd3y@77;rx|gBzpmzt;KF06Y+s(HN{9dz{Ievp}Rr_9pOWQ>!S1`?E z`Th4L)4m3AtB?cS6LudeU2Rxz$YPUU_T%e~Lo4|CKbGE(2sx0v_;P%|ZjaChR})5k zhFz@@4!27>8pIP=_dv5QFuUho2Il4l(GN_wmN~QRVbFfSy2ZDhqe6Ji#_t>)KjhM* f%{cM#{;)rs6=x$HfA9&g_F?dJ^>bP0l+XkKTNVEM literal 0 HcmV?d00001 From d89d15ec78714567a1a90b78b5822579c432c4c9 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 11:56:40 -0800 Subject: [PATCH 42/85] Add files via upload --- apps/invader/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index e211ac3f6..43b832cb8 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -2,9 +2,9 @@ "name": "Invader", "shortName":"Invader", "version":"0.01", - "description": "A Space Invader game-like demo", + "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", - "tags": "", + "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ From a8e348dd59c197564f06d1e15f095fcfa774a2fa Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 12:03:35 -0800 Subject: [PATCH 43/85] Add files via upload --- apps/invader/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/invader/README.md b/apps/invader/README.md index dc139bc9a..1b04e585e 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -6,20 +6,20 @@ Add screen shots (if possible) to the app folder and link then into this file wi ## Usage -Describe how to use it +For fun, I'm learning js with the Bangle ## Features -Name the function +Shoot the Alien ## Controls -Name the buttons and what they are used for +Lower Left and Right hand sides of the screen to move turret left or right, upper Right hand part of screen to fire ## Requests -Name who should be contacted for support/update requests +Brian Kumanchik ## Creator -Your name +Brian Kumanchik From 8574ef736a97242e80686c017ea079337494b826 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 12:17:31 -0800 Subject: [PATCH 44/85] Add files via upload --- apps/invader/README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/invader/README.md b/apps/invader/README.md index 1b04e585e..7941deafa 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -1,24 +1,22 @@ # App Name -Describe the app... - -Add screen shots (if possible) to the app folder and link then into this file with ![](.png) +Invader, I'm creating this demo to learn JavaScript with the Bangle.js 2 ## Usage -For fun, I'm learning js with the Bangle +For fun! ## Features -Shoot the Alien +Shoot the Alien, you have three lives ## Controls -Lower Left and Right hand sides of the screen to move turret left or right, upper Right hand part of screen to fire +Touch the lower Left or Right hand sides of the screen to move turret left or right, tap upper Right hand part of screen to fire ## Requests -Brian Kumanchik +bkumanchik on Espruino Forums ## Creator From cae5f1b9277312a84aa05cb9a9449f4fc0227907 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 12:35:00 -0800 Subject: [PATCH 45/85] Add files via upload --- apps/invader/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 43b832cb8..b1c1805d3 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -4,6 +4,7 @@ "version":"0.01", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", + "screenshots" : "screenshot.png", "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", From 1c9f6e7879ef3c3f04657ea1f22838c7231202b3 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 12:40:57 -0800 Subject: [PATCH 46/85] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index b1c1805d3..f3beedb50 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -4,7 +4,7 @@ "version":"0.01", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", - "screenshots" : "screenshot.png", + "screenshots" : [ { "url":"screenshot.png" } ], "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", From e6fe23211609f9caab3cf3228b7ae96b1240ddd7 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 13:41:12 -0800 Subject: [PATCH 47/85] Add files via upload --- apps/invader/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/README.md b/apps/invader/README.md index 7941deafa..d7c091ebf 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -1,6 +1,6 @@ # App Name -Invader, I'm creating this demo to learn JavaScript with the Bangle.js 2 +Invader - I'm creating this demo to learn JavaScript with the Bangle.js 2 ## Usage From 94d97f8d8d232aaacb04cf89c44fafc86a199929 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 15:42:20 -0800 Subject: [PATCH 48/85] Add files via upload --- apps/invader/app.js | 169 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 140 insertions(+), 29 deletions(-) diff --git a/apps/invader/app.js b/apps/invader/app.js index aabc0022a..9a06b6f41 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -3,18 +3,40 @@ // My Invader Demo, for Bangle.js 2, written JavaScript - using Espruino Web IDE +// resolution 176x176 + + +// to do: +// add buzz + // - variables ----------------------------------------- // invader variables -var inv_x = 77; -var inv_y = 20; +var inv_x = 77; +var inv_y = 20; +var i_anim_delay = 10; // invader animation (and move) delay +var inv_frame = 1; // invader start animation frame +var ix_speed = 6; // march speed +var i_dir = 1; // 1 = right, 0 = left +var been_hit = false; // invader hit state +//// shoot variables +var inv_shot_x = -32; +var inv_shot_y = -32; +var inv_fire_pause = 30; +var inv_fired = false; // invader fired state +//// explode variables +var been_hit = false; // invader hit state +var bx = -32; // blast x +var by = -32; // blast y +var blast_delay = 60; // invader blast delay - pause after explosion +var boom_play = false; // turret variables var tur_x = 77; -var tur_y = 138; +var tur_y = 148; // misc variables -var score = 999; +var score = 0; var lives = 3; var game_over = false; @@ -28,27 +50,81 @@ BTNR = { read : _=>tap.b && tap.x > 88 && tap.y > 88}; BTNF = { read : _=>tap.b && tap.x > 88 && tap.y < 88}; - // - sprites ------------------------------------------- // invader sprites var invader_a = - require("heatshrink").decompress(atob("kEgwkBiMRgACBAAQFFBJIPJBQgOKB55MGB64JCBoYQIB5yOKB+qvIA6pxHX5YPOAH4A/AH4A8A==")); + require("heatshrink").decompress(atob("hcIwkBiIBBAQoECCQQFBgEQAIMBEhUBDoYWDAYI=")); var invader_b = - require("heatshrink").decompress(atob("kEgxH+AAYJBAwgLQCaYfPB4oVHBpofnSpofvCY4HND9oAPD9IhTDpYfhd6IftN6IPtAH4A/AH4A/AH4A/AH4A9A=")); + require("heatshrink").decompress(atob("hcIwkBiIBBAQMQAoQEBgISCAYUQAIQAEB4YEBEAgEDAYIA==")); var boom = - require("heatshrink").decompress(atob("kEgxH+AH4AFJYIHND9YTFAoYJJD9YRNMLKhbX/IRBV6JvND7p//f/4RHAoYJJD9a//AH4A/AH4A/AH4A9A==")); + require("heatshrink").decompress(atob("hcJwkBiMQAIURgMQAgIKBAIICFAIMAAwIWBBAYSIEAgrDiA=")); var inv_shot = - require("heatshrink").decompress(atob("kEgxH+AH4A/ABaRBD/pB/Hv69/IP4A/AH4A/AH4A/AH4A/AH4AzA")); + require("heatshrink").decompress(atob("gcFwkBiERiAABAYQ")); // turret sprites -var turret = - require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/ABcAgAf7DoIADD/4fxC4oAPD84dVEJIf/D/4f/D74=")); -var tur_exp_a = - require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/AAcAgATdD7YbJBJYLFAoYffDKqLXD6qlVB86lHLYoFDS5offA5YbRD8YZHABLbRD7aZLD5IlJD7YA=")); -var tur_exp_b = - require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/AH4A/AH4A/AAcAgATdD7YbJBJYLFAoYffDKqLXD6qlVB86lHLYoFDS5offA5YbRD8YZHABLbRD7aZLD5IlJD7YA=")); +var turret = + require("heatshrink").decompress(atob("h8IwkBiIABAYYACgAHFiEABggADCAInFgITBAAgOPA==")); +var tur_exp_a = + require("heatshrink").decompress(atob("h8IwkBiMRiACBAAwJEiAABBQgZCAAkAiAJBBoIUBgIABBgQACDIQ9ECQIA==")); +var tur_exp_b = + require("heatshrink").decompress(atob("h8IwkBiIBBAAUBiADCiMQAwQFDCIYXEB4IABgMAEYQXBiEAAQIQBAoIABDAQUCAAIVBA")); var shot = - require("heatshrink").decompress(atob("kEgxH+AH4A/AH4A/ABcAgAf/D/4f9AH4A/AH4A/AH4A/AH4A/AGY")); + require("heatshrink").decompress(atob("gMDwkBAoIA==")); + + +// function to move and animate invader +function move_anim_inv() { + // invader anim code + i_anim_delay -= 1; + if ((i_anim_delay < 0) && !(been_hit)) { + i_anim_delay = 10; + + inv_frame += 1; + if (inv_frame > 2) { + inv_frame = 1; + } + + // move right + if (i_dir == 1){ + inv_x += ix_speed; + if (inv_x >= 142) { + inv_y += 8; // step down + i_dir = -1; + } + } + + // move left + if (i_dir < 1){ + inv_x -= ix_speed; + if (inv_x <= 10) { + inv_y += 8; // step down + i_dir = 1; + } + } + } +} + + + +// function to make invader fire +function invader_fire() { + inv_fire_pause -= 1; + + if (!(inv_fired)) { // so once invader shot is fired it doesn't follow the invader still + inv_shot_x = inv_x + 8; + inv_shot_y = inv_y + 18; + } + + if (inv_fire_pause < 0) { + inv_fired = true; + inv_shot_y += 8; + } +} + + + + + @@ -64,32 +140,67 @@ function onFrame() { // if not game over if(game_over == false) { g.clear(); + + // call function to move and animate invader + move_anim_inv(); + + // call function to make invader fire + invader_fire(); // check input (screen presses) - if(BTNL.read()) { - tur_x -= 5; + if(BTNL.read() && tur_x >= 12) { + tur_x -= 6; } - else if(BTNR.read()) { - tur_x += 5; + else if(BTNR.read() && tur_x <= 140) { + tur_x += 6; } else if(BTNF.read()) { tur_y -= 5; } + + + + // check for invader shot going off screen before allowing to fire again + if (inv_shot_y > 150 + ) { + inv_fired = false; + inv_shot_x = inv_x - 1; + inv_shot_y = inv_y + 7; + inv_fire_pause = 30; + } + + + + // - draw sprites ---------------------------------- // draw invader sprites - g.drawImage(invader_a, inv_x, inv_y); - //g.drawImage(invader_b, inv_x + 30, inv_y); - //g.drawImage(boom, inv_x + 60, inv_y); - //g.drawImage(inv_shot, inv_x - 30, inv_y); + if(inv_frame == 1) { + g.drawImage(invader_a, inv_x, inv_y, {scale:2}); + } + else if(inv_frame == 2) { + g.drawImage(invader_b, inv_x, inv_y, {scale:2}); + } + //g.drawImage(invader_b, inv_x + 30, inv_y, {scale:2}); + //g.drawImage(boom, inv_x + 60, inv_y, {scale:2}); + // - invader shot + if (inv_fired) { + //DrawTexture(inv_shot, inv_shot_x, inv_shot_y, WHITE); + g.drawImage(inv_shot, inv_shot_x, inv_shot_y, {scale:2}); + } + else { + //DrawTexture(inv_shot, -32, -32, WHITE); + g.drawImage(inv_shot, -32, -32, {scale:2}); + } + - // draw turret sprites - g.drawImage(turret, tur_x, tur_y); - //g.drawImage(tur_exp_a, tur_x + 30, tur_y); - //g.drawImage(tur_exp_b, tur_x + 60, tur_y); - //g.drawImage(shot, tur_x - 30, tur_y); + // draw turret sprites + g.drawImage(turret, tur_x, tur_y, {scale:2}); + //g.drawImage(tur_exp_a, tur_x + 30, tur_y, {scale:2}); + //g.drawImage(tur_exp_b, tur_x + 60, tur_y, {scale:2}); + //g.drawImage(shot, tur_x - 30, tur_y, {scale:2}); // - draw text ------------------------------------- From a5ed2385d47807d8ea2ea6dc84212e562a5d351b Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Fri, 27 May 2022 15:48:02 -0800 Subject: [PATCH 49/85] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index f3beedb50..7e7f5dee2 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.01", + "version":"0.02", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot.png" } ], From d0ff3c142c91799cfbfeaac9a097ecfbff24d3b3 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Sat, 28 May 2022 13:40:41 +0200 Subject: [PATCH 50/85] README updates --- apps/barcode/README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/barcode/README.md b/apps/barcode/README.md index 72d4d2abd..e9a012413 100644 --- a/apps/barcode/README.md +++ b/apps/barcode/README.md @@ -1,10 +1,10 @@ -# Barcode clock(watch)face +# Barcode clockwatchface -A scannable EAN-8 compatible face for your Bangle 2 +A scannable EAN-8 compatible clockwatchface for your Bangle 2 The format of the bars are -`[HHmm] [MMwc]` +`||HHmm||MMwc||` * Left section: HHmm * H: Hours @@ -14,4 +14,9 @@ The format of the bars are * w: Day of week * c: Calculated EAN-8 digit checksum -This face is aware of theme choice, so it will adapt to Light/Dark themes. +Apart from that + +* The upper left section displays total number of steps per day +* The upper right section displays total number of steps from last boot ("stepuptime") + +This clockwathface is aware of theme choice, so it will adapt to Light/Dark themes. From 41377d6c0304d833f950fde9e1f58263b13e3740 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Sat, 28 May 2022 14:01:20 +0200 Subject: [PATCH 51/85] Clarifying update intervals --- apps/barcode/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/barcode/README.md b/apps/barcode/README.md index e9a012413..17b365d45 100644 --- a/apps/barcode/README.md +++ b/apps/barcode/README.md @@ -18,5 +18,6 @@ Apart from that * The upper left section displays total number of steps per day * The upper right section displays total number of steps from last boot ("stepuptime") +* The face updates every 5 minutes or on demant by pressing the hardware button This clockwathface is aware of theme choice, so it will adapt to Light/Dark themes. From 87a33e16d5e61afe2034ab1494fa645350a825c3 Mon Sep 17 00:00:00 2001 From: Matrixes <46491408+matrixes@users.noreply.github.com> Date: Sat, 28 May 2022 14:37:08 +0200 Subject: [PATCH 52/85] Icon updates --- apps/barcode/barcode.clock.png | Bin 1907 -> 2727 bytes apps/barcode/barcode.icon.png | Bin 574 -> 2393 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/barcode/barcode.clock.png b/apps/barcode/barcode.clock.png index 4df621607c8d32f8caf26b8aa52a2d6a6c5e87af..7d249cdebd5303d03f93b34043021db5f33a986a 100644 GIT binary patch literal 2727 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 mDVb@N2n`k?hL%=FrdCE45DiU#{oVmJFnGH9xvX Date: Sat, 28 May 2022 09:53:00 -0800 Subject: [PATCH 53/85] Add files via upload --- apps/invader/README.md | 6 +- apps/invader/app.js | 361 ++++++++++++++++++++++++---------- apps/invader/metadata.json | 2 +- apps/invader/screenshot_2.png | Bin 0 -> 1878 bytes 4 files changed, 262 insertions(+), 107 deletions(-) create mode 100644 apps/invader/screenshot_2.png diff --git a/apps/invader/README.md b/apps/invader/README.md index d7c091ebf..e0036cb8a 100644 --- a/apps/invader/README.md +++ b/apps/invader/README.md @@ -1,10 +1,10 @@ # App Name -Invader - I'm creating this demo to learn JavaScript with the Bangle.js 2 +Invader ## Usage -For fun! +For fun! - I'm creating this demo to learn JavaScript with the Bangle.js 2 ## Features @@ -12,7 +12,7 @@ Shoot the Alien, you have three lives ## Controls -Touch the lower Left or Right hand sides of the screen to move turret left or right, tap upper Right hand part of screen to fire +Touch the lower Left or Right hand sides of the screen to move turret left or right, tap upper Right hand part of screen to fire, tap upper Left hand part of screen to restart ## Requests diff --git a/apps/invader/app.js b/apps/invader/app.js index 9a06b6f41..59dbb8d42 100644 --- a/apps/invader/app.js +++ b/apps/invader/app.js @@ -1,4 +1,4 @@ -// Brian Kumanchik +// Brian Kumanchik // Started 05-25-22 // My Invader Demo, for Bangle.js 2, written JavaScript - using Espruino Web IDE @@ -7,7 +7,9 @@ // to do: -// add buzz +// random invader restart x +// stop auto fire + // - variables ----------------------------------------- @@ -19,21 +21,29 @@ var inv_frame = 1; // invader start animation frame var ix_speed = 6; // march speed var i_dir = 1; // 1 = right, 0 = left var been_hit = false; // invader hit state -//// shoot variables +// - shoot variables var inv_shot_x = -32; var inv_shot_y = -32; var inv_fire_pause = 30; var inv_fired = false; // invader fired state -//// explode variables +// - explode variables var been_hit = false; // invader hit state var bx = -32; // blast x var by = -32; // blast y -var blast_delay = 60; // invader blast delay - pause after explosion -var boom_play = false; +var blast_delay = 15; // invader blast delay - pause after explosion +var boom_play = false; // turret variables -var tur_x = 77; -var tur_y = 148; +var tur_x = 77; +var tur_y = 148; +var shot_fired = false; // turret fired state +var sx = -20; // turret shot starting x - off screen +var sy = -20; // turret shot starting y - off screen +var turret_been_hit = false; +var turret_blast_delay = 21; // keep blast active on screen for 60 frames +var turret_exp_frame = 1; // turret explode start animation frame +var turret_anim_delay = 3; // turret explode animation delay +var explosion_play = false; // misc variables var score = 0; @@ -41,20 +51,21 @@ var lives = 3; var game_over = false; // input(screen controller) variables -var BTNL, BTNR, BTNF; +var BTNL, BTNR, BTNF, BTNS; // button - left, right, fire, start var tap = {}; // use tapping on screen for left and right Bangle.on('drag',e=>tap=e); BTNL = { read : _=>tap.b && tap.x < 88 && tap.y > 88}; BTNR = { read : _=>tap.b && tap.x > 88 && tap.y > 88}; BTNF = { read : _=>tap.b && tap.x > 88 && tap.y < 88}; +BTNS = { read : _=>tap.b && tap.x < 88 && tap.y < 88}; // - sprites ------------------------------------------- // invader sprites -var invader_a = - require("heatshrink").decompress(atob("hcIwkBiIBBAQoECCQQFBgEQAIMBEhUBDoYWDAYI=")); -var invader_b = +var invader_a = + require("heatshrink").decompress(atob("hcIwkBiIBBAQoECCQQFBgEQAIMBEhUBDoYWDAYI=")); +var invader_b = require("heatshrink").decompress(atob("hcIwkBiIBBAQMQAoQEBgISCAYUQAIQAEB4YEBEAgEDAYIA==")); var boom = require("heatshrink").decompress(atob("hcJwkBiMQAIURgMQAgIKBAIICFAIMAAwIWBBAYSIEAgrDiA=")); @@ -62,152 +73,297 @@ var inv_shot = require("heatshrink").decompress(atob("gcFwkBiERiAABAYQ")); // turret sprites -var turret = +var turret = require("heatshrink").decompress(atob("h8IwkBiIABAYYACgAHFiEABggADCAInFgITBAAgOPA==")); -var tur_exp_a = +var tur_exp_a = require("heatshrink").decompress(atob("h8IwkBiMRiACBAAwJEiAABBQgZCAAkAiAJBBoIUBgIABBgQACDIQ9ECQIA==")); -var tur_exp_b = +var tur_exp_b = require("heatshrink").decompress(atob("h8IwkBiIBBAAUBiADCiMQAwQFDCIYXEB4IABgMAEYQXBiEAAQIQBAoIABDAQUCAAIVBA")); var shot = require("heatshrink").decompress(atob("gMDwkBAoIA==")); // function to move and animate invader -function move_anim_inv() { - // invader anim code - i_anim_delay -= 1; - if ((i_anim_delay < 0) && !(been_hit)) { - i_anim_delay = 10; - - inv_frame += 1; - if (inv_frame > 2) { - inv_frame = 1; - } - - // move right - if (i_dir == 1){ - inv_x += ix_speed; - if (inv_x >= 142) { - inv_y += 8; // step down - i_dir = -1; - } - } - - // move left - if (i_dir < 1){ - inv_x -= ix_speed; - if (inv_x <= 10) { - inv_y += 8; // step down - i_dir = 1; - } - } - } -} +function move_anim_inv() { + // invader anim code + i_anim_delay -= 1; + if ((i_anim_delay < 0) && !(been_hit)) { + i_anim_delay = 10; + inv_frame += 1; + if (inv_frame > 2) { + inv_frame = 1; + } + + // move right + if (i_dir == 1){ + inv_x += ix_speed; + if (inv_x >= 142) { + inv_y += 8; // step down + i_dir = -1; + } + } + + // move left + if (i_dir < 1){ + inv_x -= ix_speed; + if (inv_x <= 10) { + inv_y += 8; // step down + i_dir = 1; + } + } + } +} // function to make invader fire -function invader_fire() { - inv_fire_pause -= 1; +function invader_fire() { + inv_fire_pause -= 1; - if (!(inv_fired)) { // so once invader shot is fired it doesn't follow the invader still - inv_shot_x = inv_x + 8; - inv_shot_y = inv_y + 18; - } - - if (inv_fire_pause < 0) { - inv_fired = true; - inv_shot_y += 8; - } + if (!(inv_fired)) { // so once invader shot is fired it doesn't follow the invader still + inv_shot_x = inv_x + 8; + inv_shot_y = inv_y + 18; + } + + if (inv_fire_pause < 0) { + inv_fired = true; + inv_shot_y += 8; + } } +// function to make turret explode (when hit) then start back in center +function turret_hit() { + if (turret_been_hit) { + if (!(explosion_play)) { + Bangle.buzz(); + //Bangle.beep(); + } + + explosion_play = true; + turret_anim_delay -= 1; + turret_blast_delay -= 1; + + if (turret_anim_delay < 0) { + turret_exp_frame += 1; + if (turret_exp_frame > 2) { + turret_exp_frame = 1; + } + turret_anim_delay = 3; + } + + if (turret_blast_delay < 0) { + turret_blast_delay = 21; + turret_been_hit = false; + explosion_play = false; + tur_x = 77; // reset turret x + tur_y = 148; // reset turret y + } + } +} +// function to make invader explode (when hit) then randomly start somewhere else +function invader_hit() { + if (been_hit) { + if (!(boom_play)) { + Bangle.buzz(); + //Bangle.beep(); + } + inv_shot_x = -32; // hide shot + inv_shot_y = -32; // hide shot + inv_fire_pause = 30; // and reset pause + boom_play = true; + blast_delay -= 1; + + if (blast_delay < 0) { + blast_delay = 15; + boom_play = false; + been_hit = false; + bx = -32; // move boom off screen (following invader) + by = -32; + //inv_x = rand() % (464 - 16) + 4; // move invader to random x position + inv_x = 77; // move invader back up after being hit + inv_y = 20; // move invader back up after being hit + i_dir = 1; // reset invader direction + } + } +} // - setup stuff --------------------------------------- function gameStart() { - setInterval(onFrame, 50); + setInterval(onFrame, 50); } - // - main loop ----------------------------------------- function onFrame() { - // if not game over - if(game_over == false) { + + // game over state + if(game_over) { g.clear(); - + + // draw text during game over state + g.setFont("4x6", 2); // set font and size x 2 + g.setColor(0,0,0); // set color (black) + g.drawString("SCORE:" + score ,5, 5); + g.drawString("LIVES:" + lives ,117, 5); + g.drawString("GAME OVER", 52, 80); + + + // draw sprites during game over state + // - invader frame 2 + g.drawImage(invader_b, inv_x, inv_y, {scale:2}); + g.drawImage(tur_exp_b, tur_x, tur_y, {scale:2}); + g.drawImage(inv_shot, inv_shot_x, inv_shot_y, {scale:2}); + + + // reset stuff + if(BTNS.read()) { + turret_been_hit = false; + tur_x = 77; // reset turret to center of screen + tur_y = 148; // reset turret y + inv_x = 77; // reset invader to center of screen + inv_y = 20; // reset invader back to top + i_dir = 1; // reset invader direction + lives = 3; // reset lives + score = 0; // reset score + explosion_play = false; + game_over = false; + } + + + g.flip(); + } + + + // not game over state (game running) + if(!(game_over)) { + g.clear(); + // call function to move and animate invader move_anim_inv(); - + // call function to make invader fire invader_fire(); // check input (screen presses) - if(BTNL.read() && tur_x >= 12) { + if(BTNL.read() && tur_x >= 12 && !(turret_been_hit)) { tur_x -= 6; } - else if(BTNR.read() && tur_x <= 140) { + else if(BTNR.read() && tur_x <= 140 && !(turret_been_hit)) { tur_x += 6; } - else if(BTNF.read()) { - tur_y -= 5; + else if(BTNF.read() && !(turret_been_hit)) { + shot_fired = true; + sx=tur_x + 12; + sy=tur_y - 7; + } + + + // check for turret shot going off screen before allowing to fire again + if (shot_fired) { + sy -= 8; + if (sy < 22) { + shot_fired = false; + sx = -32; + sy = -32; + } } - - - // check for invader shot going off screen before allowing to fire again if (inv_shot_y > 150 ) { - inv_fired = false; - inv_shot_x = inv_x - 1; - inv_shot_y = inv_y + 7; - inv_fire_pause = 30; + inv_fired = false; + inv_shot_x = inv_x - 1; + inv_shot_y = inv_y + 7; + inv_fire_pause = 30; } - - - - + + + // check for turret shot and invader collision + if ((sx >= inv_x) && (sx <= inv_x + 20) && (sy <= inv_y + 14)) { + sx = -32; + sy = -32; + been_hit = true; + score += 10; + } + + + // check for invader shot and turret collision + if ((inv_shot_x + 4) >= (tur_x) && (inv_shot_x) <= (tur_x + 24) && (inv_shot_y + 8) >= (tur_y + 6)) { + if (!(turret_been_hit)) { + lives -= 1; + + if (lives == 0) { + game_over = true; + } + turret_been_hit = true; + } + } + + // - draw sprites ---------------------------------- - // draw invader sprites - if(inv_frame == 1) { - g.drawImage(invader_a, inv_x, inv_y, {scale:2}); - } - else if(inv_frame == 2) { - g.drawImage(invader_b, inv_x, inv_y, {scale:2}); - } - //g.drawImage(invader_b, inv_x + 30, inv_y, {scale:2}); - //g.drawImage(boom, inv_x + 60, inv_y, {scale:2}); - // - invader shot - if (inv_fired) { - //DrawTexture(inv_shot, inv_shot_x, inv_shot_y, WHITE); - g.drawImage(inv_shot, inv_shot_x, inv_shot_y, {scale:2}); + // invader sprites + if(!(been_hit)) { + if(inv_frame == 1) { + // - invader frame 1 + g.drawImage(invader_a, inv_x, inv_y, {scale:2}); + } + else if(inv_frame == 2) { + // - invader frame 2 + g.drawImage(invader_b, inv_x, inv_y, {scale:2}); + } + } + else { + // - invader explosion + g.drawImage(boom, inv_x, inv_y, {scale:2}); + } + // - invader shot + if (inv_fired) { + g.drawImage(inv_shot, inv_shot_x, inv_shot_y, {scale:2}); } else { - //DrawTexture(inv_shot, -32, -32, WHITE); g.drawImage(inv_shot, -32, -32, {scale:2}); - } - + } - // draw turret sprites - g.drawImage(turret, tur_x, tur_y, {scale:2}); - //g.drawImage(tur_exp_a, tur_x + 30, tur_y, {scale:2}); - //g.drawImage(tur_exp_b, tur_x + 60, tur_y, {scale:2}); - //g.drawImage(shot, tur_x - 30, tur_y, {scale:2}); + // turret sprites + if(!(turret_been_hit)) { + // - undamaged turret + g.drawImage(turret, tur_x, tur_y, {scale:2}); + } + else { + if(turret_exp_frame == 1) { + // - turret explosion frame 1 + g.drawImage(tur_exp_a, tur_x, tur_y, {scale:2}); + } + else if(turret_exp_frame == 2) { + // - turret explosion frame 2 + g.drawImage(tur_exp_b, tur_x, tur_y, {scale:2}); + } + } + // - turret shot + g.drawImage(shot, sx, sy, {scale:2}); + + + // call function to make invader explode then randomly start somewhere else + invader_hit(); + + + // call function to make turret explode (when hit) then start back in center + turret_hit(); // - draw text ------------------------------------- - g.setFont("4x6", 2); - g.setColor(0,0,0); - g.drawString("SCORE:" + score ,5,5); // - g.drawString("LIVES:" + lives ,117,5); // + g.setFont("4x6", 2); // set font and size x 2 + g.setColor(0,0,0); // set color (black) + g.drawString("SCORE:" + score ,5,5); + g.drawString("LIVES:" + lives ,117,5); g.flip(); @@ -215,7 +371,6 @@ function onFrame() { } - gameStart(); diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 7e7f5dee2..bae9baea4 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.02", + "version":"0.03", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot.png" } ], diff --git a/apps/invader/screenshot_2.png b/apps/invader/screenshot_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6ade79ce4026276af3b84aa01c8e60babe17dc GIT binary patch literal 1878 zcmd^A=~Gh&5Px~TghwnTK|ltPfQW#AFl|+)sRSYzX&h1PfCLG65fPQ7))GR3Nh&&^ zf(HdeE)TRd5WpyR;AuUv615G8NO(=~;tn(+7!vyY2l}}){jmG{u(R{q-P!$Z?v~9A zJEAKQ006tFjS(>z)_*dXfcd(nAvOlM!!ZmxAn$hj001_msEF|I`0TOrzrHUE{)}*V zV*Xk0g-sV)T6xQv;((5^PRC%lEsdUgpZ47EERX3GO%Hx6Tn0Fn4Vd2XSX0pP=bN!}3jw zWU`UMW$NJ$6N7lba_!D=Q0}t7MRa)z9kt)JRUdarF`o%7hbk-tX%5fG{596Cf5JC^yJkj8vPV zDlmwb-Ya$pLu2Nat1t)%*D^64zwC3I{{&ru6MwF#TTj)dB%xneEu-&v`!y3)RIR)# z-H^DyAODzavRG~W!KCEAoD;$_q$h6oUi|I+^ru}H=bJAlmYuh37KBwpz&*9}*Z>8RPS&((Xm;{d}IT_SLKL zz(LkU)n;{bIZGXOH471kgf#y%Mp2aSh@>pzmW z?+}lVd2wfK^Lh&qE%-w^MbZ|%r9B&RUR;%BhF^=MT7y@8GceH4K*tw3)=?z)@$WUE zU`AyX-vS4$3Y#&Ko6XSu5k@i(*V16|91A6{I8yfrqRPhDHB$*!Ml3rosD}+ zPNx~&``RAJd#lp%@SMT0SLv>Ja1wF8G}6c<3ej8gGcx=19=&|YmGQIK#W#`Q_W4}T zPwJ4LKT@NLiJ10(=sEe&HDo0SG9JItUBy?3iagEE(%W42rU^31^wXd5b Date: Sat, 28 May 2022 10:05:25 -0800 Subject: [PATCH 54/85] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index bae9baea4..445d165f2 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -4,7 +4,7 @@ "version":"0.03", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", - "screenshots" : [ { "url":"screenshot.png" } ], + "screenshots" : [ { "url":"screenshot.png" }, { "url":"screenshot_2.png" } ], "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", From 32b72e1c1675ce605f3d01ff6dd6bc700a91a3a1 Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 10:06:21 -0800 Subject: [PATCH 55/85] Add files via upload --- apps/invader/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 445d165f2..36dbdf9fc 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,7 +1,7 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.03", + "version":"0.04", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", "screenshots" : [ { "url":"screenshot.png" }, { "url":"screenshot_2.png" } ], From f9df01f8cda4607321927dd4f6b57b3d5e45008b Mon Sep 17 00:00:00 2001 From: Brian Kumanchik Date: Sat, 28 May 2022 11:23:50 -0800 Subject: [PATCH 56/85] Add files via upload --- apps/invader/metadata.json | 4 ++-- apps/invader/screenshot_0.png | Bin 0 -> 1598 bytes apps/invader/screenshot_1.png | Bin 0 -> 1707 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 apps/invader/screenshot_0.png create mode 100644 apps/invader/screenshot_1.png diff --git a/apps/invader/metadata.json b/apps/invader/metadata.json index 36dbdf9fc..c84271925 100644 --- a/apps/invader/metadata.json +++ b/apps/invader/metadata.json @@ -1,10 +1,10 @@ { "id": "invader", "name": "Invader", "shortName":"Invader", - "version":"0.04", + "version":"0.05", "description": "A Space Invader game-like demo - work in progress", "icon": "app.png", - "screenshots" : [ { "url":"screenshot.png" }, { "url":"screenshot_2.png" } ], + "screenshots" : [ { "url":"screenshot_0.png" }, { "url":"screenshot_1.png" }, { "url":"screenshot_2.png" } ], "tags": "game", "supports" : ["BANGLEJS2"], "readme": "README.md", diff --git a/apps/invader/screenshot_0.png b/apps/invader/screenshot_0.png new file mode 100644 index 0000000000000000000000000000000000000000..804f3e435fba61068f3902cddd6255f1fc2487dc GIT binary patch literal 1598 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlf%S){i(^Pd z+}k^Mr(HJSaeeshul%kxtap4Q1Ln->(D=J!tM19@-F?4}ZQ|EofBjIN$(hrJ(`HNY zsehgg2V5k48xAbKy}W{{IKhOGsXuT2BhE987g;!LcGY&N8?d_xD|~qIO>^D>nUSDS zPw~U&k1o1kg-@x+k*OAq~E?d51DP#Kok!6+N8$ZX@G1CQhSWWD=Yg*kF zqWzwJu>_V`}$2D%|o9q|NVv^t=OC=kB*+2#bG^&J}f3&7d(>aaH)qR~279 zR{KrRy8ntZ_-gUiLiK{w11BF(6=3=IJ^Uq$UE~F=KmWyctXgk%uz%h9N9+5-zlOxS zhR;77{_(s_Is3n7d@+pcS*&*L>)LM>ch&hp*M&zrge`t&@8+^^)OPBA%%b)oELE?t zb%kHUD_>958q>JFnrq%Qg#NkuF>8P5-q6qC>lH%(hVBFUgWyPV~czUvpFM=Sc!h z{}Q{S_jH-Rcm26NyC-z(t9&@dCRm}o;#nrkJ&rjCq#aHDl|Q&W0CHAUN;Upx+9UMs zZ(r2edjHM4?#=!2+f8uBfwSppX0nZ(b4*uRN;PucSrY@~)qjrJdpPa(2D!6ye~241 z30M5RTD(vc81AhlG5W0sSmL%nbJFJUdBFX0M;uop=bpT?tziN)4v1eW+$#c9eRmf3 zT7?hsEbHo4PxvRZ?N?*9X`SNoC~rlB#^_dWb!CIb%YIvr0Vy!=gWsa7`Rc2zzf|A) zGPmmawqsyl3RbA^_+Z5Jp2h3I+y{qFbLkf&SW&Q-h2zfY=xqj!Ozn+a q*S#AK?A?>fEvzsqMeopfz^;6V&E~Y|UqN7nz~JfX=d#Wzp$PyM9^8Te literal 0 HcmV?d00001 diff --git a/apps/invader/screenshot_1.png b/apps/invader/screenshot_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae936f6c7adf3ca353f737179adfab9fa5a1c80e GIT binary patch literal 1707 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfi2b3#WAEJ z?(OZ1MVCE9Trd9kZ+|N|U`dyu#@f8O*A!3A+O8S>{gk(LU(SP%HFop!|0#d)WR+w3 zw