From 7afc487f272a52e513b66b4b3431257b0f42bf99 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 10 Mar 2022 17:00:57 +0100 Subject: [PATCH 001/122] Add second screenshot --- apps/smclock/metadata.json | 2 +- apps/smclock/{screenshot.png => screenshot0.png} | Bin apps/smclock/screenshot1.png | Bin 0 -> 2031 bytes 3 files changed, 1 insertion(+), 1 deletion(-) rename apps/smclock/{screenshot.png => screenshot0.png} (100%) create mode 100644 apps/smclock/screenshot1.png diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index cc995d587..dec97b70c 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -3,7 +3,7 @@ "name": "Monogram Watch Face", "shortName": "MonoClock", "icon": "app.png", - "screenshots": [{ "url": "screenshot.png" }], + "screenshots": [{ "url": "screenshot0.png" }, {"url": "screenshot1.png" }], "version": "0.04", "description": "A simple watchface based on my stylised monogram.", "type": "clock", diff --git a/apps/smclock/screenshot.png b/apps/smclock/screenshot0.png similarity index 100% rename from apps/smclock/screenshot.png rename to apps/smclock/screenshot0.png diff --git a/apps/smclock/screenshot1.png b/apps/smclock/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed9ef9ee4cd26c51b7d45dcdc7ccfaee680d8e6 GIT binary patch literal 2031 zcmcgt`BPJe77p=-<%%p46s!W;0Tl{FBg-o#0SzEqpnxG&2&vX0_#lC>nE-mRF8Gv8 z%PJB|C4dk@;9(#I0#{^tOjs1CxDl>>R1)(rP!d7bm;Mp;U(GC=_Z(;7L-1t~UP_hWffJYM-U)iXJN>;5e#jbgvSHGN=zE`9@{Y<}2Q?tKG4f zku_r4YWl@4lOxZ}FSt;?Toc^sFSgn-xO*q(q;Z7y2jG#yGGb92J`lfBW~&D zBk`G7D)b7-y$ZiFb#;}sj9v1MP$G*-FSqVcAD?9ub3}~G@`j~kZz{U(xR~6HX>|)@ zY{(adT5a}&NN8L6z5QU9-k(Nj(NJgTcnQLZBc>c1T24!}zo614O>=_~A&TRzq@~sl zip)-@w=JoE3oBgr;qF_8Ilal(ax2zq{lbw=U@L{>NDuB3GlR=0JZp^HLKBcW-LnvX zuUTj#(XxZDQhM8HGw{jKpQ6nr2R;X2v z*+>blh@SAT)U=#v!-@~Eka9Ln-C0^8>`RhXs#aOEIOt4X8;$5_WzW1Q-S?!^f(o%Z zz`g%Y6z{ckCaFVT(nOp#12X4%+{Ru>dg~O2)mB=@afTIr(a3IwdfB!nEVtnGaBL-9 zPv_>UH*J*@`44lQzC9!2nt5j9na?etZ_#zpVX792sHQl7paeZw~v` zB>O_I==ajmDtLXM9JV`$(SK78f2Grn^}W9Zkr4dP|H~n?X~kckaj70KeJg~oLWI&t zx>=JmU>Xfw8gRh<$I3j5A?3{bs>e7g?w-p`TkMLRWEO|%jzkmP8{zzXgTX`1Xxpec zyvbwC`<#Y_iXY+&q>`kpN;#k(8?De*-zPo4(55X zJ>&t{%)cmy!A4iSc{p-6Lnhv|tAc}$xanak*=sRfXcauEQ_Z`1)*{%rEz%+!sc#?a zcWO2X3H5>MTK_)FZU8IE&U5U5QWS9VotytX?%OZ9Kpd^I|}cWnQ%Su!zp3 z$rS8*yXwI^1XGNS^u#iI(%;)PGY#c)sJpmEV!UxZ!(t_)+C2#BiTmCGhxGz0h@t;j zBHxEWWAic+ax7syG;Sm^ z+L?sO-4MKtdK}h64@J@r&ct}~?7Mf^@=k8GZ>K2p916C470_h9;%@ny&Fj9Sp8B z&kyVhfh?&|p~QA$*E#9pSn&j4GeTI5XWTY2wqH<$Zt~gHQ}^LabVA-r(d=vdX$(d3 z{)x5o$X#}P!8~DcK(EcL&1~8ur6&k^+B2S${-{Ry=&qR0;u}S@3`O%8{l98cZC2-s zl(R}nRFlB{;r%-DoYlxNp2u``T8>gO;oN7PFz#2&9Bs7ceICp53yMweww!w=djZf& zioQA4bhglPMLmJVP!L7$dS-Zk|6P~2Y1@A!&w3h}0obyt#F3+DFy{Kpd_y!C5-$GU zS`XuLVx9!(VH_TuZoPd4UHVJLfxIhdizwkY{yvZ_+{@h82Qq4S_QmH_@c9S4n>ytJ zr!JQ0gnV?8O#187HMq$P4>7G14<0Z)g!BEa{5*h_7>g~;KLs5XvuQ9yoL+YSa9Q`j OQK&#aGO6h}J@5Zrimdto literal 0 HcmV?d00001 From b24fbb0b2dcc3d6bfb29fd31604afbdb2b0bb7b0 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Sun, 13 Mar 2022 21:27:36 +0100 Subject: [PATCH 002/122] smclock - Replace background with purple and dark green one. --- apps/smclock/app.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 350c0dd07..0ef886b04 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -1,14 +1,8 @@ const SETTINGSFILE = "smclock.json"; const background = { - width: 176, - height: 176, - bpp: 3, - transparent: 1, - buffer: require("heatshrink").decompress( - atob( - "/4A/AH4ACUb8H9MkyVJAThB/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INP/AH4A/AAX8Yz4Afn5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INI=" - ) - ), + width : 176, height : 176, bpp : 4, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4A/AH4Au1QAp1/2swApK/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K+//AH4A/AF8AAH4AUK/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/AA==")) }; const monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; From 1aeb958dd4f8f333dc071f8ee4b47386b1d0df7c Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 15:14:07 +0100 Subject: [PATCH 003/122] Create app.js --- apps/timer/app.js | 65 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 apps/timer/app.js diff --git a/apps/timer/app.js b/apps/timer/app.js new file mode 100644 index 000000000..26a9ef7c9 --- /dev/null +++ b/apps/timer/app.js @@ -0,0 +1,65 @@ +var mins = 7; +var counter; +var counterInterval; +var timers = [9, 7, 5, 3, 1]; + +function showMainMenu() { + const menu = { + '': { 'title': 'Timers' }, + }; + timers.forEach((timer,idx)=>{ + menu[timer] = function() { + startTimer(timer); + }; + }); + return E.showMenu(menu); +} + +function outOfTime() { + if (counterInterval) return; + E.showMessage("Out of Time", "My Timer"); + Bangle.buzz(); + // again, 3 secs later + setTimeout(outOfTime, 3000); +} + +function countDown() { + counter--; + // Out of time + if (counter<=0) { + clearInterval(counterInterval); + counterInterval = undefined; + setWatch(()=>{load();}, BTN1); // Bangle1: BTN2 + outOfTime(); + return; + } + + function sec2time(counter) { + let m = Math.floor(counter / 60); + let s = counter - m * 60; + if (s < 10) + return `${m}:0${s}`; + else + return `${m}:${s}`; + } + + g.clear(true); + g.drawImage(require("Storage").read("timer.png"),70,20); + g.setFontAlign(0,0); // center font + g.setFont("Vector",60); // vector font, 80px + // draw the current counter value + g.drawString(sec2time(counter),90,120); + // optional - this keeps the watch LCD lit up + // g.flip(); +} + +function startTimer(timer) { + counter = timer * 60; + // console.log(counter); + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +showMainMenu(); +//startTimer(); From 6ca2a8ef946e59271986aad97e4937fe2183a130 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 15:22:16 +0100 Subject: [PATCH 004/122] Create app-icon.js --- apps/timer/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/timer/app-icon.js diff --git a/apps/timer/app-icon.js b/apps/timer/app-icon.js new file mode 100644 index 000000000..d0fb2e0be --- /dev/null +++ b/apps/timer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4ALjAAWF/4v3AAWJACDCdF/4vf/1ms1l///h4FBAA4ugs0eFwNlF5IweEAUP/8eFxQvjLxYvhR4Ivtd4IvqSAjupMAsPF9TBEMBIugMIouqF4ZerGBYukGBIumGA4uoF96+2GEwuJGEooEoVCF84uFlUqGEwuHGE4uIGAwuijguFAAMcGEIgCjouHAAMdF8crF5MrF8SNISIwvfdgzyIeECPNFz2JACAv/F/UYACwv/F+4A/AH4AzA=")) From 95f814a532381a2d1fff0dd19ccf15f36204c6c9 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 15:24:46 +0100 Subject: [PATCH 005/122] Create metadata.json --- apps/timer/metadata.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/timer/metadata.json diff --git a/apps/timer/metadata.json b/apps/timer/metadata.json new file mode 100644 index 000000000..e79702375 --- /dev/null +++ b/apps/timer/metadata.json @@ -0,0 +1,12 @@ +{ "id": "timer", + "name": "My Timer App", + "shortName":"My Timer", + "icon": "app.png", + "version":"0.01", + "description": "This is Peter´s awesome timer app", + "tags": "", + "storage": [ + {"name":"timer.app.js","url":"app.js"}, + {"name":"timer.img","url":"app-icon.js","evaluate":true} + ] +} From 2ad69dcd53cfd2a761d761f93952f4a304615244 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 15:37:36 +0100 Subject: [PATCH 006/122] Add files via upload --- apps/timer/app-icon.png | Bin 0 -> 1011 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/timer/app-icon.png diff --git a/apps/timer/app-icon.png b/apps/timer/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd942ea013fdda73add2a8f06f63628f6f4d8eb GIT binary patch literal 1011 zcmV0rD z1-1BOqO}O(lTg8jLJ)2HRIT^}1<@B3tE;kzRZPKx4Rq6xZQYf&R3tTNv)N5%=J>F? z>1LBQGkb19$$nqv-aGf)@Au3-_s*R;&_omK8z!v5=nK!D1oOZx5;L~{?ROsxV-snB z=9Y*D5Euw+(|`kzr0`q47-!tV&62XK{W%u_)k^Kcf`xjV!?yV-@(KK zh{zs|23-hAWNFWi$I93ItdHx5lJJm5f^rSW-Akp)espC%?8YP=8U@-#JX0+c7R%R? z7kX#Cq7k5SK;T5RJX0zQ54$TE_*tVt_zRpmJca$2m^T z6P%p(xocC1A%%1@5&KS~LH{O>_|E}Ffa!T*wiI|4ipKGW)%4l{hI(2v7OOo=Ve>G)@A@8 zeO5NRj{75qdv4HWEWY3jJ=|}u+Tyh806;1)oyPTk0!h@}I_<@rosV~!X`6i3zXwVV z|A1Ur<(BXISor{|g;fWB`BUO;MfVHfkyUQr-|D%?PfSR=O-^eLd@2&1bKTE?!JBj& zD73hrr_xT!*UBPJonLs`h?#4j?n{f(7I zB728=TaK-~5e{kxzRwjC;zfT4HeGKO`X=_%l|KwXzI%kpzR`NRf)Q^=vbSwg!>7d}`nAR6rabR+0O$TyExi|toW z)1Mhx)1*K1Jh#oBTB?g&AEOcI95CDoV8r9T@jXPm`LzlCBKM9zgAuPX1e-Myw0|Wo z19V*ckd4N0pknq*0)p0rMNchQd^6(|93UDaomuc3cD6HSjS&u4f;m z*3Q6YrM4~Px4u}ei1|b#LHT?AF?F^^3}c7COoz(K)Izxi^w}CC;j=Qe_}}LTnn^yJ hSeHq@CYo69_!rhyA?h4K76AYN002ovPDHLkV1g(R?#}=K literal 0 HcmV?d00001 From bb9a952abd968097fb47bdaa58fa9990a94d557e Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 15:51:04 +0100 Subject: [PATCH 007/122] Update metadata.json --- apps/timer/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/timer/metadata.json b/apps/timer/metadata.json index e79702375..d0431cd9e 100644 --- a/apps/timer/metadata.json +++ b/apps/timer/metadata.json @@ -1,6 +1,6 @@ { "id": "timer", - "name": "My Timer App", - "shortName":"My Timer", + "name": "Peter´s App", + "shortName":"Timer", "icon": "app.png", "version":"0.01", "description": "This is Peter´s awesome timer app", From b6f82d55e5625c0fbc07ef649c2553fb3855a18d Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 15:52:04 +0100 Subject: [PATCH 008/122] Delete app-icon.png --- apps/timer/app-icon.png | Bin 1011 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/timer/app-icon.png diff --git a/apps/timer/app-icon.png b/apps/timer/app-icon.png deleted file mode 100644 index cfd942ea013fdda73add2a8f06f63628f6f4d8eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmV0rD z1-1BOqO}O(lTg8jLJ)2HRIT^}1<@B3tE;kzRZPKx4Rq6xZQYf&R3tTNv)N5%=J>F? z>1LBQGkb19$$nqv-aGf)@Au3-_s*R;&_omK8z!v5=nK!D1oOZx5;L~{?ROsxV-snB z=9Y*D5Euw+(|`kzr0`q47-!tV&62XK{W%u_)k^Kcf`xjV!?yV-@(KK zh{zs|23-hAWNFWi$I93ItdHx5lJJm5f^rSW-Akp)espC%?8YP=8U@-#JX0+c7R%R? z7kX#Cq7k5SK;T5RJX0zQ54$TE_*tVt_zRpmJca$2m^T z6P%p(xocC1A%%1@5&KS~LH{O>_|E}Ffa!T*wiI|4ipKGW)%4l{hI(2v7OOo=Ve>G)@A@8 zeO5NRj{75qdv4HWEWY3jJ=|}u+Tyh806;1)oyPTk0!h@}I_<@rosV~!X`6i3zXwVV z|A1Ur<(BXISor{|g;fWB`BUO;MfVHfkyUQr-|D%?PfSR=O-^eLd@2&1bKTE?!JBj& zD73hrr_xT!*UBPJonLs`h?#4j?n{f(7I zB728=TaK-~5e{kxzRwjC;zfT4HeGKO`X=_%l|KwXzI%kpzR`NRf)Q^=vbSwg!>7d}`nAR6rabR+0O$TyExi|toW z)1Mhx)1*K1Jh#oBTB?g&AEOcI95CDoV8r9T@jXPm`LzlCBKM9zgAuPX1e-Myw0|Wo z19V*ckd4N0pknq*0)p0rMNchQd^6(|93UDaomuc3cD6HSjS&u4f;m z*3Q6YrM4~Px4u}ei1|b#LHT?AF?F^^3}c7COoz(K)Izxi^w}CC;j=Qe_}}LTnn^yJ hSeHq@CYo69_!rhyA?h4K76AYN002ovPDHLkV1g(R?#}=K From 24d625ece1184e5e4fafb95038f5ce96c99eca83 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 16:03:18 +0100 Subject: [PATCH 009/122] Update metadata.json --- apps/timer/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/timer/metadata.json b/apps/timer/metadata.json index d0431cd9e..050e0c8ad 100644 --- a/apps/timer/metadata.json +++ b/apps/timer/metadata.json @@ -5,6 +5,7 @@ "version":"0.01", "description": "This is Peter´s awesome timer app", "tags": "", + "supports" : ["BANGLEJS2"], "storage": [ {"name":"timer.app.js","url":"app.js"}, {"name":"timer.img","url":"app-icon.js","evaluate":true} From d1a321050834fa1b760adac68e6dda2a90fdf273 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 16:23:27 +0100 Subject: [PATCH 010/122] Update metadata.json --- apps/timer/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/timer/metadata.json b/apps/timer/metadata.json index 050e0c8ad..b50b81e86 100644 --- a/apps/timer/metadata.json +++ b/apps/timer/metadata.json @@ -1,5 +1,5 @@ { "id": "timer", - "name": "Peter´s App", + "name": "Peter´s Timer", "shortName":"Timer", "icon": "app.png", "version":"0.01", From 443a5e1fc1209ac03c27789c23ea6bd2fa74bb2c Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 16:37:03 +0100 Subject: [PATCH 011/122] Add files via upload --- apps/timer/app.png | Bin 0 -> 1011 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/timer/app.png diff --git a/apps/timer/app.png b/apps/timer/app.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd942ea013fdda73add2a8f06f63628f6f4d8eb GIT binary patch literal 1011 zcmV0rD z1-1BOqO}O(lTg8jLJ)2HRIT^}1<@B3tE;kzRZPKx4Rq6xZQYf&R3tTNv)N5%=J>F? z>1LBQGkb19$$nqv-aGf)@Au3-_s*R;&_omK8z!v5=nK!D1oOZx5;L~{?ROsxV-snB z=9Y*D5Euw+(|`kzr0`q47-!tV&62XK{W%u_)k^Kcf`xjV!?yV-@(KK zh{zs|23-hAWNFWi$I93ItdHx5lJJm5f^rSW-Akp)espC%?8YP=8U@-#JX0+c7R%R? z7kX#Cq7k5SK;T5RJX0zQ54$TE_*tVt_zRpmJca$2m^T z6P%p(xocC1A%%1@5&KS~LH{O>_|E}Ffa!T*wiI|4ipKGW)%4l{hI(2v7OOo=Ve>G)@A@8 zeO5NRj{75qdv4HWEWY3jJ=|}u+Tyh806;1)oyPTk0!h@}I_<@rosV~!X`6i3zXwVV z|A1Ur<(BXISor{|g;fWB`BUO;MfVHfkyUQr-|D%?PfSR=O-^eLd@2&1bKTE?!JBj& zD73hrr_xT!*UBPJonLs`h?#4j?n{f(7I zB728=TaK-~5e{kxzRwjC;zfT4HeGKO`X=_%l|KwXzI%kpzR`NRf)Q^=vbSwg!>7d}`nAR6rabR+0O$TyExi|toW z)1Mhx)1*K1Jh#oBTB?g&AEOcI95CDoV8r9T@jXPm`LzlCBKM9zgAuPX1e-Myw0|Wo z19V*ckd4N0pknq*0)p0rMNchQd^6(|93UDaomuc3cD6HSjS&u4f;m z*3Q6YrM4~Px4u}ei1|b#LHT?AF?F^^3}c7COoz(K)Izxi^w}CC;j=Qe_}}LTnn^yJ hSeHq@CYo69_!rhyA?h4K76AYN002ovPDHLkV1g(R?#}=K literal 0 HcmV?d00001 From 895bae593942e757944f231874d86dab5734f8c8 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 17:10:54 +0100 Subject: [PATCH 012/122] Update app.js --- apps/timer/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/timer/app.js b/apps/timer/app.js index 26a9ef7c9..3603ef44f 100644 --- a/apps/timer/app.js +++ b/apps/timer/app.js @@ -44,7 +44,7 @@ function countDown() { } g.clear(true); - g.drawImage(require("Storage").read("timer.png"),70,20); + g.drawImage(require("Storage").read("timer.img"),70,20); g.setFontAlign(0,0); // center font g.setFont("Vector",60); // vector font, 80px // draw the current counter value From 6a29d8e792c3fec289b6e7bcc087ae2ffc639fdc Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Mon, 14 Mar 2022 17:22:08 +0100 Subject: [PATCH 013/122] Add files via upload --- apps/timer/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/timer/app.js b/apps/timer/app.js index 3603ef44f..e903f84b5 100644 --- a/apps/timer/app.js +++ b/apps/timer/app.js @@ -62,4 +62,4 @@ function startTimer(timer) { } showMainMenu(); -//startTimer(); +//startTimer(); \ No newline at end of file From f74a2437fea7a679d131a90150a598862c6281d4 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:22:23 +0100 Subject: [PATCH 014/122] Create widget.js --- widdaysleft/widget.js | 78 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 widdaysleft/widget.js diff --git a/widdaysleft/widget.js b/widdaysleft/widget.js new file mode 100644 index 000000000..1bc891690 --- /dev/null +++ b/widdaysleft/widget.js @@ -0,0 +1,78 @@ +const storage = require('Storage'); +let settings; +let height = 23; +let width = 34; + +var debug = 0; //1 = show debug info + +settings = storage.readJSON('daysleft.json',1); //read storage +if (!settings) print("no daysleft.json found"); +var i = 0; +const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds +const today = new Date(); //includes current time +const currentYear = today.getFullYear(); +const currentMonth = today.getMonth(); +const currentDay = today.getDate(); +const todayMorning = new Date (currentYear, currentMonth, currentDay, 0, 0, 0); //create date object with today, but 00:00:00 +do { + var target = settings[i]; + if (target) { + var dd = target.day, + mm = target.month-1, //-1 because month is zero-based + yy = target.year; + const targetDate = new Date(yy, mm, dd); //is 00:00 + i += 1; + } +} while (target && todayMorning >= targetDate); + +const diffDays = (target ? (targetDate - todayMorning) / oneDay : 0); //calculate day difference + +function drawWidget() { + if (debug == 1) g.drawRect(this.x,this.y,this.x+width,this.y+height); //draw rectangle around widget area + g.reset(); + + //define font size and string position + //small if number has more than 3 digits (positive number) + if (diffDays >= 1000) { + g.setFont("6x8", 1); + g.drawString(diffDays,this.x+10,this.y+7); + } + //large if number has 3 digits (positive number) + if (diffDays <= 999 && diffDays >= 100) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x,this.y+4); + } + //large if number has 2 digits (positive number) + if (diffDays <= 99 && diffDays >= 10) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x+6,this.y+4); + } + //large if number has 1 digit (positive number) + if (diffDays <= 9 && diffDays >= 0) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x+13,this.y+4); + } + //large if number has 1 digit (negative number) + if (diffDays <= -1 && diffDays >= -9) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x+5,this.y+4); + } + //large if number has 2 digits (negative number) + if (diffDays <= -10 && diffDays >= -99) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x,this.y+4); + } + //large if number has 3 digits or more (negative number) + if (diffDays <= -100) { + g.setFont("6x8", 1); + g.drawString(diffDays,this.x,this.y+7); + } +} + +//draw widget +WIDGETS["widdaysl"]={area:"tl",width:width,draw:drawWidget}; + +setTimeout(function() { + Bangle.loadWidgets(); + WIDGETS["widdaysl"].draw(WIDGETS["widdaysl"]); + }, todayMorning + oneDay - today + 1000); // update at next noon From 94e24f8b4e5b34a1f2e4efb5bcf6663a8be83ad3 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:23:01 +0100 Subject: [PATCH 015/122] Add files via upload --- widdaysleft/metadata.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 widdaysleft/metadata.json diff --git a/widdaysleft/metadata.json b/widdaysleft/metadata.json new file mode 100644 index 000000000..b3cff5eb8 --- /dev/null +++ b/widdaysleft/metadata.json @@ -0,0 +1,13 @@ +{ + "id": "widdaysleft", + "name": "Days Left", + "version": "0.01", + "description": "Read daysleft.json and show number of days left until first date, which lies in the future", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tools", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"widdaysleft.wid.js","url":"widget.js"} + ] +} From bef491f29a63b7b68263860040fb72f25222f197 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:24:40 +0100 Subject: [PATCH 016/122] Delete widdaysleft directory --- widdaysleft/metadata.json | 13 ------- widdaysleft/widget.js | 78 --------------------------------------- 2 files changed, 91 deletions(-) delete mode 100644 widdaysleft/metadata.json delete mode 100644 widdaysleft/widget.js diff --git a/widdaysleft/metadata.json b/widdaysleft/metadata.json deleted file mode 100644 index b3cff5eb8..000000000 --- a/widdaysleft/metadata.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id": "widdaysleft", - "name": "Days Left", - "version": "0.01", - "description": "Read daysleft.json and show number of days left until first date, which lies in the future", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tools", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"widdaysleft.wid.js","url":"widget.js"} - ] -} diff --git a/widdaysleft/widget.js b/widdaysleft/widget.js deleted file mode 100644 index 1bc891690..000000000 --- a/widdaysleft/widget.js +++ /dev/null @@ -1,78 +0,0 @@ -const storage = require('Storage'); -let settings; -let height = 23; -let width = 34; - -var debug = 0; //1 = show debug info - -settings = storage.readJSON('daysleft.json',1); //read storage -if (!settings) print("no daysleft.json found"); -var i = 0; -const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds -const today = new Date(); //includes current time -const currentYear = today.getFullYear(); -const currentMonth = today.getMonth(); -const currentDay = today.getDate(); -const todayMorning = new Date (currentYear, currentMonth, currentDay, 0, 0, 0); //create date object with today, but 00:00:00 -do { - var target = settings[i]; - if (target) { - var dd = target.day, - mm = target.month-1, //-1 because month is zero-based - yy = target.year; - const targetDate = new Date(yy, mm, dd); //is 00:00 - i += 1; - } -} while (target && todayMorning >= targetDate); - -const diffDays = (target ? (targetDate - todayMorning) / oneDay : 0); //calculate day difference - -function drawWidget() { - if (debug == 1) g.drawRect(this.x,this.y,this.x+width,this.y+height); //draw rectangle around widget area - g.reset(); - - //define font size and string position - //small if number has more than 3 digits (positive number) - if (diffDays >= 1000) { - g.setFont("6x8", 1); - g.drawString(diffDays,this.x+10,this.y+7); - } - //large if number has 3 digits (positive number) - if (diffDays <= 999 && diffDays >= 100) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x,this.y+4); - } - //large if number has 2 digits (positive number) - if (diffDays <= 99 && diffDays >= 10) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x+6,this.y+4); - } - //large if number has 1 digit (positive number) - if (diffDays <= 9 && diffDays >= 0) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x+13,this.y+4); - } - //large if number has 1 digit (negative number) - if (diffDays <= -1 && diffDays >= -9) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x+5,this.y+4); - } - //large if number has 2 digits (negative number) - if (diffDays <= -10 && diffDays >= -99) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x,this.y+4); - } - //large if number has 3 digits or more (negative number) - if (diffDays <= -100) { - g.setFont("6x8", 1); - g.drawString(diffDays,this.x,this.y+7); - } -} - -//draw widget -WIDGETS["widdaysl"]={area:"tl",width:width,draw:drawWidget}; - -setTimeout(function() { - Bangle.loadWidgets(); - WIDGETS["widdaysl"].draw(WIDGETS["widdaysl"]); - }, todayMorning + oneDay - today + 1000); // update at next noon From 603c6d4d7dca1ed9123286535c3ad3a596e9ad01 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:25:21 +0100 Subject: [PATCH 017/122] Add files via upload --- apps/daysleft.json | 9 +++++ apps/metadata.json | 13 ++++++++ apps/widdaysl.wid.js | 78 +++++++++++++++++++++++++++++++++++++++++++ apps/widget.png | Bin 0 -> 1043 bytes 4 files changed, 100 insertions(+) create mode 100644 apps/daysleft.json create mode 100644 apps/metadata.json create mode 100644 apps/widdaysl.wid.js create mode 100644 apps/widget.png diff --git a/apps/daysleft.json b/apps/daysleft.json new file mode 100644 index 000000000..c2349db0b --- /dev/null +++ b/apps/daysleft.json @@ -0,0 +1,9 @@ +[ + { "day": 25, "month": 2, "year": 2022 }, // Urlaub Essen + { "day": 2, "month": 3, "year": 2022 }, // Aschermittwoch + { "day": 27, "month": 3, "year": 2022 }, // Sommerzeit + { "day": 16, "month": 4, "year": 2022 }, // Ostersamstag + { "day": 3, "month": 6, "year": 2022 }, // Kalamata + { "day": 17, "month": 7, "year": 2022 }, // Exerzitien + { "day": 31, "month":12, "year": 2022 } // Sylvester +] \ No newline at end of file diff --git a/apps/metadata.json b/apps/metadata.json new file mode 100644 index 000000000..b3cff5eb8 --- /dev/null +++ b/apps/metadata.json @@ -0,0 +1,13 @@ +{ + "id": "widdaysleft", + "name": "Days Left", + "version": "0.01", + "description": "Read daysleft.json and show number of days left until first date, which lies in the future", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tools", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"widdaysleft.wid.js","url":"widget.js"} + ] +} diff --git a/apps/widdaysl.wid.js b/apps/widdaysl.wid.js new file mode 100644 index 000000000..0fc0e24b2 --- /dev/null +++ b/apps/widdaysl.wid.js @@ -0,0 +1,78 @@ +const storage = require('Storage'); +let settings; +let height = 23; +let width = 34; + +var debug = 0; //1 = show debug info + +settings = storage.readJSON('daysleft.json',1); //read storage +if (!settings) print("no daysleft.json found"); +var i = 0; +const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds +const today = new Date(); //includes current time +const currentYear = today.getFullYear(); +const currentMonth = today.getMonth(); +const currentDay = today.getDate(); +const todayMorning = new Date (currentYear, currentMonth, currentDay, 0, 0, 0); //create date object with today, but 00:00:00 +do { + var target = settings[i]; + if (target) { + var dd = target.day, + mm = target.month-1, //-1 because month is zero-based + yy = target.year; + const targetDate = new Date(yy, mm, dd); //is 00:00 + i += 1; + } +} while (target && todayMorning >= targetDate); + +const diffDays = (target ? (targetDate - todayMorning) / oneDay : 0); //calculate day difference + +function drawWidget() { + if (debug == 1) g.drawRect(this.x,this.y,this.x+width,this.y+height); //draw rectangle around widget area + g.reset(); + + //define font size and string position + //small if number has more than 3 digits (positive number) + if (diffDays >= 1000) { + g.setFont("6x8", 1); + g.drawString(diffDays,this.x+10,this.y+7); + } + //large if number has 3 digits (positive number) + if (diffDays <= 999 && diffDays >= 100) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x,this.y+4); + } + //large if number has 2 digits (positive number) + if (diffDays <= 99 && diffDays >= 10) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x+6,this.y+4); + } + //large if number has 1 digit (positive number) + if (diffDays <= 9 && diffDays >= 0) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x+13,this.y+4); + } + //large if number has 1 digit (negative number) + if (diffDays <= -1 && diffDays >= -9) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x+5,this.y+4); + } + //large if number has 2 digits (negative number) + if (diffDays <= -10 && diffDays >= -99) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x,this.y+4); + } + //large if number has 3 digits or more (negative number) + if (diffDays <= -100) { + g.setFont("6x8", 1); + g.drawString(diffDays,this.x,this.y+7); + } +} + +//draw widget +WIDGETS["widdaysl"]={area:"tl",width:width,draw:drawWidget}; + +setTimeout(function() { + Bangle.loadWidgets(); + WIDGETS["widdaysl"].draw(WIDGETS["widdaysl"]); + }, todayMorning + oneDay - today + 1000); // update at next noon \ No newline at end of file diff --git a/apps/widget.png b/apps/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..70aa664e4951e9ad02b3840004e0edbb42aa0274 GIT binary patch literal 1043 zcmV+u1nm2XP)z#5?V?Eh00b*1C7%MvebBLgk__$G(3?!Vn;(l&?N_;PJ24OUI%z zu!N6+F2E^-7*f$FmyVJFz`5$UTT!DdI$ExVowL#}7wP%foJAdnsNXUFoPpmW$Pn9G1YM;w5l{%@%R3xH5sjf>T3 zHVYQL3TX}pr_UP%bxB|WKD}UIbC}Mys_2+nUTam6NlDB*m!1Ne!@-93E`+7HDyZnp zoUms#=3GW|AuNKrPA7Gp&itLLprg8x-7(zt223a1$kn*w&RSUxZntISd)HT>W?;Rk z8CY+M-pE#nF2)(2nByn6A73~|Q-elZOFjGdY~iVg+p(_kULz&AJz>T#-(te$XXv$k zs%fYh2t<}Rb@~#%@KQP!ipB^YUo&#i%O~fi%aZhJlne+VcyMbA07v(C zv3FbQII1W3(d7f+iYJm`Af8O72DDn}aMUw~?*lhOe>3v)bqraZ_ra1Y@XjlJ7*cZGx5(hI zn`<|9MknX#*xbm|k93wJ$2BQS1*}5Q-P*{({*H8P@=CBA(s?Pm0`WwWm);v^Wrm!3 zv6r1)sh=1jJ(lj5yi=!;O|!7e*^Fy848VtHT@3WK5nW6$HZ`B_*SowoR2roz^zz{z znwHo3P&CHb?`Ao7@dgPawOQ?QHgjZO<>x;rKE&Ovjl6rjpWz7)lYa#9hhx~R0%vO@ zk3G=JKz}=0k-u3~seKc#H@OT%s+vV%+%^lE8<31vG!-S}*Je>u16E<26i}U=s4)DR zVSCf8!PLOO_IkIG)E*M>IS{UBYHJe)`I%;DeNWyeJnNW8jT$v7#XpmfZd3Da;PC(e N002ovPDHLkV1n(i@o@kE literal 0 HcmV?d00001 From e39aaad4162bc62675d3b2563b7d712fbfb9d770 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:27:07 +0100 Subject: [PATCH 018/122] Delete daysleft.json --- apps/daysleft.json | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 apps/daysleft.json diff --git a/apps/daysleft.json b/apps/daysleft.json deleted file mode 100644 index c2349db0b..000000000 --- a/apps/daysleft.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { "day": 25, "month": 2, "year": 2022 }, // Urlaub Essen - { "day": 2, "month": 3, "year": 2022 }, // Aschermittwoch - { "day": 27, "month": 3, "year": 2022 }, // Sommerzeit - { "day": 16, "month": 4, "year": 2022 }, // Ostersamstag - { "day": 3, "month": 6, "year": 2022 }, // Kalamata - { "day": 17, "month": 7, "year": 2022 }, // Exerzitien - { "day": 31, "month":12, "year": 2022 } // Sylvester -] \ No newline at end of file From efdfac11f862b403a505c2e6e00e090a2dcff483 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:27:27 +0100 Subject: [PATCH 019/122] Delete metadata.json --- apps/metadata.json | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 apps/metadata.json diff --git a/apps/metadata.json b/apps/metadata.json deleted file mode 100644 index b3cff5eb8..000000000 --- a/apps/metadata.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id": "widdaysleft", - "name": "Days Left", - "version": "0.01", - "description": "Read daysleft.json and show number of days left until first date, which lies in the future", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tools", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"widdaysleft.wid.js","url":"widget.js"} - ] -} From 3235bf1772c6077f012a4598e5a6220cb72d0ae6 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:27:42 +0100 Subject: [PATCH 020/122] Delete widdaysl.wid.js --- apps/widdaysl.wid.js | 78 -------------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 apps/widdaysl.wid.js diff --git a/apps/widdaysl.wid.js b/apps/widdaysl.wid.js deleted file mode 100644 index 0fc0e24b2..000000000 --- a/apps/widdaysl.wid.js +++ /dev/null @@ -1,78 +0,0 @@ -const storage = require('Storage'); -let settings; -let height = 23; -let width = 34; - -var debug = 0; //1 = show debug info - -settings = storage.readJSON('daysleft.json',1); //read storage -if (!settings) print("no daysleft.json found"); -var i = 0; -const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds -const today = new Date(); //includes current time -const currentYear = today.getFullYear(); -const currentMonth = today.getMonth(); -const currentDay = today.getDate(); -const todayMorning = new Date (currentYear, currentMonth, currentDay, 0, 0, 0); //create date object with today, but 00:00:00 -do { - var target = settings[i]; - if (target) { - var dd = target.day, - mm = target.month-1, //-1 because month is zero-based - yy = target.year; - const targetDate = new Date(yy, mm, dd); //is 00:00 - i += 1; - } -} while (target && todayMorning >= targetDate); - -const diffDays = (target ? (targetDate - todayMorning) / oneDay : 0); //calculate day difference - -function drawWidget() { - if (debug == 1) g.drawRect(this.x,this.y,this.x+width,this.y+height); //draw rectangle around widget area - g.reset(); - - //define font size and string position - //small if number has more than 3 digits (positive number) - if (diffDays >= 1000) { - g.setFont("6x8", 1); - g.drawString(diffDays,this.x+10,this.y+7); - } - //large if number has 3 digits (positive number) - if (diffDays <= 999 && diffDays >= 100) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x,this.y+4); - } - //large if number has 2 digits (positive number) - if (diffDays <= 99 && diffDays >= 10) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x+6,this.y+4); - } - //large if number has 1 digit (positive number) - if (diffDays <= 9 && diffDays >= 0) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x+13,this.y+4); - } - //large if number has 1 digit (negative number) - if (diffDays <= -1 && diffDays >= -9) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x+5,this.y+4); - } - //large if number has 2 digits (negative number) - if (diffDays <= -10 && diffDays >= -99) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x,this.y+4); - } - //large if number has 3 digits or more (negative number) - if (diffDays <= -100) { - g.setFont("6x8", 1); - g.drawString(diffDays,this.x,this.y+7); - } -} - -//draw widget -WIDGETS["widdaysl"]={area:"tl",width:width,draw:drawWidget}; - -setTimeout(function() { - Bangle.loadWidgets(); - WIDGETS["widdaysl"].draw(WIDGETS["widdaysl"]); - }, todayMorning + oneDay - today + 1000); // update at next noon \ No newline at end of file From 7fce40bf45cd21893b21474a4321b4fcfa782fe7 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:28:04 +0100 Subject: [PATCH 021/122] Delete widget.png --- apps/widget.png | Bin 1043 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/widget.png diff --git a/apps/widget.png b/apps/widget.png deleted file mode 100644 index 70aa664e4951e9ad02b3840004e0edbb42aa0274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1043 zcmV+u1nm2XP)z#5?V?Eh00b*1C7%MvebBLgk__$G(3?!Vn;(l&?N_;PJ24OUI%z zu!N6+F2E^-7*f$FmyVJFz`5$UTT!DdI$ExVowL#}7wP%foJAdnsNXUFoPpmW$Pn9G1YM;w5l{%@%R3xH5sjf>T3 zHVYQL3TX}pr_UP%bxB|WKD}UIbC}Mys_2+nUTam6NlDB*m!1Ne!@-93E`+7HDyZnp zoUms#=3GW|AuNKrPA7Gp&itLLprg8x-7(zt223a1$kn*w&RSUxZntISd)HT>W?;Rk z8CY+M-pE#nF2)(2nByn6A73~|Q-elZOFjGdY~iVg+p(_kULz&AJz>T#-(te$XXv$k zs%fYh2t<}Rb@~#%@KQP!ipB^YUo&#i%O~fi%aZhJlne+VcyMbA07v(C zv3FbQII1W3(d7f+iYJm`Af8O72DDn}aMUw~?*lhOe>3v)bqraZ_ra1Y@XjlJ7*cZGx5(hI zn`<|9MknX#*xbm|k93wJ$2BQS1*}5Q-P*{({*H8P@=CBA(s?Pm0`WwWm);v^Wrm!3 zv6r1)sh=1jJ(lj5yi=!;O|!7e*^Fy848VtHT@3WK5nW6$HZ`B_*SowoR2roz^zz{z znwHo3P&CHb?`Ao7@dgPawOQ?QHgjZO<>x;rKE&Ovjl6rjpWz7)lYa#9hhx~R0%vO@ zk3G=JKz}=0k-u3~seKc#H@OT%s+vV%+%^lE8<31vG!-S}*Je>u16E<26i}U=s4)DR zVSCf8!PLOO_IkIG)E*M>IS{UBYHJe)`I%;DeNWyeJnNW8jT$v7#XpmfZd3Da;PC(e N002ovPDHLkV1n(i@o@kE From 87e2f95af3069764241f55c632fa2c43f7b6bc73 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:29:18 +0100 Subject: [PATCH 022/122] Create widget.js --- apps/widdaysleft/widget.js | 78 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 apps/widdaysleft/widget.js diff --git a/apps/widdaysleft/widget.js b/apps/widdaysleft/widget.js new file mode 100644 index 000000000..1bc891690 --- /dev/null +++ b/apps/widdaysleft/widget.js @@ -0,0 +1,78 @@ +const storage = require('Storage'); +let settings; +let height = 23; +let width = 34; + +var debug = 0; //1 = show debug info + +settings = storage.readJSON('daysleft.json',1); //read storage +if (!settings) print("no daysleft.json found"); +var i = 0; +const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds +const today = new Date(); //includes current time +const currentYear = today.getFullYear(); +const currentMonth = today.getMonth(); +const currentDay = today.getDate(); +const todayMorning = new Date (currentYear, currentMonth, currentDay, 0, 0, 0); //create date object with today, but 00:00:00 +do { + var target = settings[i]; + if (target) { + var dd = target.day, + mm = target.month-1, //-1 because month is zero-based + yy = target.year; + const targetDate = new Date(yy, mm, dd); //is 00:00 + i += 1; + } +} while (target && todayMorning >= targetDate); + +const diffDays = (target ? (targetDate - todayMorning) / oneDay : 0); //calculate day difference + +function drawWidget() { + if (debug == 1) g.drawRect(this.x,this.y,this.x+width,this.y+height); //draw rectangle around widget area + g.reset(); + + //define font size and string position + //small if number has more than 3 digits (positive number) + if (diffDays >= 1000) { + g.setFont("6x8", 1); + g.drawString(diffDays,this.x+10,this.y+7); + } + //large if number has 3 digits (positive number) + if (diffDays <= 999 && diffDays >= 100) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x,this.y+4); + } + //large if number has 2 digits (positive number) + if (diffDays <= 99 && diffDays >= 10) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x+6,this.y+4); + } + //large if number has 1 digit (positive number) + if (diffDays <= 9 && diffDays >= 0) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x+13,this.y+4); + } + //large if number has 1 digit (negative number) + if (diffDays <= -1 && diffDays >= -9) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x+5,this.y+4); + } + //large if number has 2 digits (negative number) + if (diffDays <= -10 && diffDays >= -99) { + g.setFont("6x8", 2); + g.drawString(diffDays,this.x,this.y+4); + } + //large if number has 3 digits or more (negative number) + if (diffDays <= -100) { + g.setFont("6x8", 1); + g.drawString(diffDays,this.x,this.y+7); + } +} + +//draw widget +WIDGETS["widdaysl"]={area:"tl",width:width,draw:drawWidget}; + +setTimeout(function() { + Bangle.loadWidgets(); + WIDGETS["widdaysl"].draw(WIDGETS["widdaysl"]); + }, todayMorning + oneDay - today + 1000); // update at next noon From b93d32cb4ab84ffa975f986d9f41bf589a2e9933 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:30:02 +0100 Subject: [PATCH 023/122] Add files via upload --- apps/widdaysleft/daysleft.json | 9 +++++++++ apps/widdaysleft/metadata.json | 13 +++++++++++++ apps/widdaysleft/widget.png | Bin 0 -> 1043 bytes 3 files changed, 22 insertions(+) create mode 100644 apps/widdaysleft/daysleft.json create mode 100644 apps/widdaysleft/metadata.json create mode 100644 apps/widdaysleft/widget.png diff --git a/apps/widdaysleft/daysleft.json b/apps/widdaysleft/daysleft.json new file mode 100644 index 000000000..c2349db0b --- /dev/null +++ b/apps/widdaysleft/daysleft.json @@ -0,0 +1,9 @@ +[ + { "day": 25, "month": 2, "year": 2022 }, // Urlaub Essen + { "day": 2, "month": 3, "year": 2022 }, // Aschermittwoch + { "day": 27, "month": 3, "year": 2022 }, // Sommerzeit + { "day": 16, "month": 4, "year": 2022 }, // Ostersamstag + { "day": 3, "month": 6, "year": 2022 }, // Kalamata + { "day": 17, "month": 7, "year": 2022 }, // Exerzitien + { "day": 31, "month":12, "year": 2022 } // Sylvester +] \ No newline at end of file diff --git a/apps/widdaysleft/metadata.json b/apps/widdaysleft/metadata.json new file mode 100644 index 000000000..b3cff5eb8 --- /dev/null +++ b/apps/widdaysleft/metadata.json @@ -0,0 +1,13 @@ +{ + "id": "widdaysleft", + "name": "Days Left", + "version": "0.01", + "description": "Read daysleft.json and show number of days left until first date, which lies in the future", + "icon": "widget.png", + "type": "widget", + "tags": "widget,tools", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"widdaysleft.wid.js","url":"widget.js"} + ] +} diff --git a/apps/widdaysleft/widget.png b/apps/widdaysleft/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..70aa664e4951e9ad02b3840004e0edbb42aa0274 GIT binary patch literal 1043 zcmV+u1nm2XP)z#5?V?Eh00b*1C7%MvebBLgk__$G(3?!Vn;(l&?N_;PJ24OUI%z zu!N6+F2E^-7*f$FmyVJFz`5$UTT!DdI$ExVowL#}7wP%foJAdnsNXUFoPpmW$Pn9G1YM;w5l{%@%R3xH5sjf>T3 zHVYQL3TX}pr_UP%bxB|WKD}UIbC}Mys_2+nUTam6NlDB*m!1Ne!@-93E`+7HDyZnp zoUms#=3GW|AuNKrPA7Gp&itLLprg8x-7(zt223a1$kn*w&RSUxZntISd)HT>W?;Rk z8CY+M-pE#nF2)(2nByn6A73~|Q-elZOFjGdY~iVg+p(_kULz&AJz>T#-(te$XXv$k zs%fYh2t<}Rb@~#%@KQP!ipB^YUo&#i%O~fi%aZhJlne+VcyMbA07v(C zv3FbQII1W3(d7f+iYJm`Af8O72DDn}aMUw~?*lhOe>3v)bqraZ_ra1Y@XjlJ7*cZGx5(hI zn`<|9MknX#*xbm|k93wJ$2BQS1*}5Q-P*{({*H8P@=CBA(s?Pm0`WwWm);v^Wrm!3 zv6r1)sh=1jJ(lj5yi=!;O|!7e*^Fy848VtHT@3WK5nW6$HZ`B_*SowoR2roz^zz{z znwHo3P&CHb?`Ao7@dgPawOQ?QHgjZO<>x;rKE&Ovjl6rjpWz7)lYa#9hhx~R0%vO@ zk3G=JKz}=0k-u3~seKc#H@OT%s+vV%+%^lE8<31vG!-S}*Je>u16E<26i}U=s4)DR zVSCf8!PLOO_IkIG)E*M>IS{UBYHJe)`I%;DeNWyeJnNW8jT$v7#XpmfZd3Da;PC(e N002ovPDHLkV1n(i@o@kE literal 0 HcmV?d00001 From fe8aa5dea738f5804b701c40c70f28d0d99c5117 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:31:35 +0100 Subject: [PATCH 024/122] Update metadata.json --- apps/widdaysleft/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widdaysleft/metadata.json b/apps/widdaysleft/metadata.json index b3cff5eb8..8fdcc2aca 100644 --- a/apps/widdaysleft/metadata.json +++ b/apps/widdaysleft/metadata.json @@ -8,6 +8,6 @@ "tags": "widget,tools", "supports": ["BANGLEJS2"], "storage": [ - {"name":"widdaysleft.wid.js","url":"widget.js"} + {"name":"widdaysleft.wid.js","url":"widget.js", "settings":"daysleft.json"} ] } From 6fde81d0e3f9259ab5ecdc747dcb43c4e423b57b Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:32:40 +0100 Subject: [PATCH 025/122] Update metadata.json --- apps/widdaysleft/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/widdaysleft/metadata.json b/apps/widdaysleft/metadata.json index 8fdcc2aca..2573416a1 100644 --- a/apps/widdaysleft/metadata.json +++ b/apps/widdaysleft/metadata.json @@ -8,6 +8,7 @@ "tags": "widget,tools", "supports": ["BANGLEJS2"], "storage": [ - {"name":"widdaysleft.wid.js","url":"widget.js", "settings":"daysleft.json"} + {"name":"widdaysleft.wid.js","url":"widget.js"}, + {"settings":"daysleft.json"} ] } From 0248ce33d1c215a58804780473779819f5f2a138 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:35:24 +0100 Subject: [PATCH 026/122] Update metadata.json --- apps/widdaysleft/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widdaysleft/metadata.json b/apps/widdaysleft/metadata.json index 2573416a1..76b0f967a 100644 --- a/apps/widdaysleft/metadata.json +++ b/apps/widdaysleft/metadata.json @@ -9,6 +9,6 @@ "supports": ["BANGLEJS2"], "storage": [ {"name":"widdaysleft.wid.js","url":"widget.js"}, - {"settings":"daysleft.json"} + {"name":"daysleft.json", "url":"daysleft.json"} ] } From 91f360aa3f59add862465439cd47058be129dd6c Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:49:07 +0100 Subject: [PATCH 027/122] Update mylocation.app.js --- apps/mylocation/mylocation.app.js | 33 ++++++++++++++----------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/apps/mylocation/mylocation.app.js b/apps/mylocation/mylocation.app.js index 27ab17ea5..b26abb5ec 100644 --- a/apps/mylocation/mylocation.app.js +++ b/apps/mylocation/mylocation.app.js @@ -6,38 +6,35 @@ let settings; // initialize with default settings... let s = { - 'lat': 51.5072, - 'lon': 0.1276, - 'location': "London" -}; + 'lat': 53.322659, + 'lon': 10.14107, + 'location': "Pattensen" +} function loadSettings() { - settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}; - for (const key in settings) { - s[key] = settings[key] - } + settings = require('Storage').readJSON(SETTINGS_FILE, 1) || s; } function save() { - settings = s; - require('Storage').write(SETTINGS_FILE, settings); + settings = s + require('Storage').write(SETTINGS_FILE, settings) } -const locations = ["London" ,"Newcastle","Edinburgh", "Paris" , "New York" , "Tokyo" , "Frankfurt", "Auckland", "???"]; -const lats = [ 51.5072 , 54.9783 , 55.9533 , 48.8566 , 40.7128 , 35.6762 , 50.1236 , -36.9 , 0.0 ]; -const lons = [ -0.1276 , -1.6178 , -3.1883 , 2.3522 , -74.0060 , 139.6503 , 8.6553 , 174.7832 , 0.0 ]; +const locations = ["Pattensen","Essen", "Kalamata", "???"]; +const lats = [ 53.322659, 51.46302, 37.04006, 0.0]; +const lons = [ 10.14107, 6.99891, 22.11535, 0.0]; function setFromGPS() { Bangle.on('GPS', (gps) => { //console.log("."); if (gps.fix === 0) return; //console.log("fix from GPS"); - s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' }; + s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' } Bangle.buzz(1500); // buzz on first position Bangle.setGPSPower(0); save(); - Bangle.setUI("updown", ()=>{ load(); }); + Bangle.setUI("updown", ()=>{ load() }); E.showPrompt("Location has been saved from the GPS fix",{ title:"Location Saved", buttons : {"OK":1} @@ -52,13 +49,13 @@ function setFromGPS() { } function showMainMenu() { - //console.log("showMainMenu"); + console.log("showMainMenu"); const mainmenu = { '': { 'title': 'My Location' }, '{ load(); }, 'City': { value: 0 | locations.indexOf(s.location), - min: 0, max: locations.length - 1, + min: 0, max: 6, format: v => locations[v], onchange: v => { if (v != 6) { @@ -70,7 +67,7 @@ function showMainMenu() { } }, 'Set From GPS': ()=>{ setFromGPS(); } - }; + } return E.showMenu(mainmenu); } From a0d5ec5d30688bc457dce009eb215b2e7d33d7e8 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 08:54:48 +0100 Subject: [PATCH 028/122] Update widget.js --- apps/widmp/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widmp/widget.js b/apps/widmp/widget.js index 6da572aab..966b5d7ea 100644 --- a/apps/widmp/widget.js +++ b/apps/widmp/widget.js @@ -2,7 +2,7 @@ WIDGETS["widmoon"] = { area: "tr", width: 24, draw: function() { const CenterX = this.x + 12, CenterY = this.y + 12, Radius = 11; var southernHemisphere = false; // when in southern hemisphere, use the "My Location" App - const simulate = false; // simulate one month in one minute + const simulate = true; // simulate one month in one minute const updateR = 1000; // update every x ms in simulation function moonPhase() { From 139029af0b047aba01ee3224e8d4fb06cd6784c2 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 09:03:27 +0100 Subject: [PATCH 029/122] Update widget.js --- apps/widmp/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widmp/widget.js b/apps/widmp/widget.js index 966b5d7ea..6da572aab 100644 --- a/apps/widmp/widget.js +++ b/apps/widmp/widget.js @@ -2,7 +2,7 @@ WIDGETS["widmoon"] = { area: "tr", width: 24, draw: function() { const CenterX = this.x + 12, CenterY = this.y + 12, Radius = 11; var southernHemisphere = false; // when in southern hemisphere, use the "My Location" App - const simulate = true; // simulate one month in one minute + const simulate = false; // simulate one month in one minute const updateR = 1000; // update every x ms in simulation function moonPhase() { From 39d256ff6f6dce5a406b8e17e33ed3398ff7a4b9 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 09:16:02 +0100 Subject: [PATCH 030/122] Create metadata.json --- apps/sunclock/metadata.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 apps/sunclock/metadata.json diff --git a/apps/sunclock/metadata.json b/apps/sunclock/metadata.json new file mode 100644 index 000000000..a0afcc786 --- /dev/null +++ b/apps/sunclock/metadata.json @@ -0,0 +1,15 @@ +{ + "id": "sunclock", + "name": "Sun Clock", + "version": "0.01", + "description": "A clock with sunset/sunrise, sun height/azimuth", + "icon": "app.png", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"sunclock.app.js","url":"app.js"}, + {"name":"sunclock.img","url":"app-icon.js","evaluate":true} + ] +} From b89b2dee50a35a59e80cbd32af3c651ea98be667 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 09:18:19 +0100 Subject: [PATCH 031/122] Create app-icon.js --- apps/sunclock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/sunclock/app-icon.js diff --git a/apps/sunclock/app-icon.js b/apps/sunclock/app-icon.js new file mode 100644 index 000000000..977aec98d --- /dev/null +++ b/apps/sunclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("kEgwhC/AC8N6APo7oPJBQndBQYPEhoaFAogZIEokO93u8AuGAAYOCCAgOLCBQOFAAIeNEBAPPBw4wHB5wuIGAwPthGIxwIC8UowUuB4eIwAPBxEk91CAgIGGwAhBBYeCAwMoA4ZwEBIIOCAxAA/ABwA=")) From a11f10d855c96b8fdd8cf12b71037310fa5844ee Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 09:19:14 +0100 Subject: [PATCH 032/122] Add files via upload --- apps/sunclock/app.js | 79 ++++++++++++++++++++++++++++++++++++++++++ apps/sunclock/app.png | Bin 0 -> 776 bytes 2 files changed, 79 insertions(+) create mode 100644 apps/sunclock/app.js create mode 100644 apps/sunclock/app.png diff --git a/apps/sunclock/app.js b/apps/sunclock/app.js new file mode 100644 index 000000000..1401c2a98 --- /dev/null +++ b/apps/sunclock/app.js @@ -0,0 +1,79 @@ +/* sclock.app.js for Bangle2 +Peter Bernschneider 30.12.2021 +Update current latitude and longitude in My Location app +Update current Timezone in Settings app, menu item "System" +Update for summer time by incrementing Timezone += 1 */ +setting = require("Storage").readJSON("setting.json",1); +E.setTimeZone(setting.timezone); // timezone = 1 for MEZ, = 2 for MESZ +SunCalc = require("suncalc.js"); +loc = require('locale'); +const LOCATION_FILE = "mylocation.json"; +const xyCenter = g.getWidth() / 2 + 3; +const yposTime = 60; +const yposDate = 100; +const yposRS = 135; +const yposPos = 160; +var rise = "07:00"; +var set = "20:00"; +var pos = {altitude: 20, azimuth: 135}; +var noonpos = {altitude: 37, azimuth: 180}; +let idTimeout = null; + +function updatePos() { + coord = require("Storage").readJSON(LOCATION_FILE,1)|| {"lat":53.3,"lon":10.1,"location":"Pattensen"}; + pos = SunCalc.getPosition(Date.now(), coord.lat, coord.lon); + times = SunCalc.getTimes(Date.now(), coord.lat, coord.lon); + rise = times.sunrise.toString().split(" ")[4].substr(0,5); + set = times.sunset.toString().split(" ")[4].substr(0,5); + noonpos = SunCalc.getPosition(times.solarNoon, coord.lat, coord.lon); +} + +function drawSimpleClock() { + var d = new Date(); // get date + var da = d.toString().split(" "); + g.clear(); + Bangle.drawWidgets(); + g.reset(); // default draw styles + g.setFontAlign(0, 0); // drawSting centered + + var time = da[4].substr(0, 5); // draw time + + g.setFont("Vector",60); + g.drawString(time, xyCenter, yposTime, true); + + var date = [loc.dow(new Date(),1), loc.date(d,1)].join(" "); // draw Day, name of month, Date + g.setFont("Vector",24); + g.drawString(date, xyCenter, yposDate, true); + + g.setFont("Vector",25); + g.drawString(`${rise} ${set}`, xyCenter, yposRS, true); // draw riseset + g.drawImage(require("Storage").read("sunrise.img"), xyCenter-16, yposRS-16); + + g.setFont("Vector",21); + g.drawString(`H${pos.altitude}/${noonpos.altitude} Az${pos.azimuth}`, xyCenter, yposPos, true); // draw sun pos + + let t = d.getSeconds()*1000 + d.getMilliseconds(); + idTimeout = setTimeout(drawSimpleClock, 60000 - t); // time till next minute +} + +// special function to handle display switch on +Bangle.on('lcdPower', function(on){ + if (on) { + drawSimpleClock(); + } else { + if(idTimeout) { + clearTimeout(idTimeout); + } + } +}); + +g.clear(); // clean app screen +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +setInterval(updatePos, 60*15E3); // refesh every 15 mins + +updatePos(); +drawSimpleClock(); // draw now + +setWatch(Bangle.showLauncher, BTN1, { repeat: false, edge: "falling" }); // Show launcher when button pressed \ No newline at end of file diff --git a/apps/sunclock/app.png b/apps/sunclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..72c5b10d53f98912d0bcea5c7eec61ee215bcbee GIT binary patch literal 776 zcmV+j1NZ!iP)Qc8qH1%iQMDNbXAnjaZ{>(!al!i$Z0Z&w|m zf_dPs-t+$6-+9lu@4XNu%KuELTx}1PtL>3!*duZvDT*i`uth2mDeF2AIz3AwuK zLuTT(Mt^~YL3E8=pj#-ES{rEak4m34Ff$0o}k4v ziR07X!_p>!PN8tZ=tzat4gh2aPG+6gfEvJMv3v%&LHyipahN$PZA%04RopHR%|QM} z%!bhk@{A~+|GH%Zdhz%CYV~Fr0$KPc6Q*-OcHq=^zSZIYX&{a39_XSfxu;#SA-c@{ksuJP9`+tOMJlo9bGI+ z2mOngJesKB=~NlgWPl1J-h?JDB-WGR=mR7HO{HbZ%fpFFK}|Yh!d4Fis$8B`rSv;f zNs5geDMXcka!h7~KvEe0`b(Ch_g38U%yWQwyQ`#kF{}FBY|(Bra{xl{Qiix26QXB1 z-sK;-C>9J?dmGvh>}2HLXDuV|TQJq3utZwy;7qE0@N=f)V|C5B>o1J*YMW|H`e(9k z4lk$g9a>6vElE4c_OS)GZEEaCDCx?Z%IwFc?xIBbTl@s$D(DmEAVu;30000 Date: Tue, 15 Mar 2022 09:22:07 +0100 Subject: [PATCH 033/122] Add files via upload --- modules/suncalc.js | 298 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 modules/suncalc.js diff --git a/modules/suncalc.js b/modules/suncalc.js new file mode 100644 index 000000000..b1af0a0d9 --- /dev/null +++ b/modules/suncalc.js @@ -0,0 +1,298 @@ +/* Module suncalc.js + (c) 2011-2015, Vladimir Agafonkin + SunCalc is a JavaScript library for calculating sun/moon position and light phases. + https://github.com/mourner/suncalc + +PB: Usage: +E.setTimeZone(2); // 1 = MEZ, 2 = MESZ +SunCalc = require("suncalc.js"); +pos = SunCalc.getPosition(Date.now(), 53.3, 10.1); +times = SunCalc.getTimes(Date.now(), 53.3, 10.1); +rise = times.sunrise; // Date object +rise_str = rise.getHours() + ':' + rise.getMinutes(); //hh:mm +*/ +var exports={}; + +// shortcuts for easier to read formulas + +var PI = Math.PI, + sin = Math.sin, + cos = Math.cos, + tan = Math.tan, + asin = Math.asin, + atan = Math.atan2, + acos = Math.acos, + rad = PI / 180; + +// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas + +// date/time constants and conversions + +var dayMs = 1000 * 60 * 60 * 24, + J1970 = 2440588, + J2000 = 2451545; + +function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; } +function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); } // PB: onece removed + 0.5; included it again 4 Jan 2021 +function toDays(date) { return toJulian(date) - J2000; } + + +// general calculations for position + +var e = rad * 23.4397; // obliquity of the Earth + +function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); } +function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); } + +function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); } +function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); } + +function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; } + +function astroRefraction(h) { + if (h < 0) // the following formula works for positive altitudes only. + h = 0; // if h = -0.08901179 a div/0 would occur. + + // formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. + // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad: + return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179)); +} + +// general sun calculations + +function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); } + +function eclipticLongitude(M) { + + var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center + P = rad * 102.9372; // perihelion of the Earth + + return M + C + P + PI; +} + +function sunCoords(d) { + + var M = solarMeanAnomaly(d), + L = eclipticLongitude(M); + + return { + dec: declination(L, 0), + ra: rightAscension(L, 0) + }; +} + +// calculates sun position for a given date and latitude/longitude + +exports.getPosition = function (date, lat, lng) { + + var lw = rad * -lng, + phi = rad * lat, + d = toDays(date), + + c = sunCoords(d), + H = siderealTime(d, lw) - c.ra; + + return { + azimuth: Math.round((azimuth(H, phi, c.dec) / rad + 180) % 360), // PB: converted to deg + altitude: Math.round( altitude(H, phi, c.dec) / rad) // PB: converted to deg + }; +}; + + +// sun times configuration (angle, morning name, evening name) + +var times = [ + [-0.833, 'sunrise', 'sunset' ] +]; + +// calculations for sun times +var J0 = 0.0009; + +function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); } + +function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; } +function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); } + +function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); } +function observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; } + +// returns set time for the given sun altitude +function getSetJ(h, lw, phi, dec, n, M, L) { + + var w = hourAngle(h, phi, dec), + a = approxTransit(w, lw, n); + return solarTransitJ(a, M, L); +} + + +// calculates sun times for a given date, latitude/longitude, and, optionally, +// the observer height (in meters) relative to the horizon + +exports.getTimes = function (date, lat, lng, height) { + + height = height || 0; + + var lw = rad * -lng, + phi = rad * lat, + + dh = observerAngle(height), + + d = toDays(date), + n = julianCycle(d, lw), + ds = approxTransit(0, lw, n), + + M = solarMeanAnomaly(ds), + L = eclipticLongitude(M), + dec = declination(L, 0), + + Jnoon = solarTransitJ(ds, M, L), + + i, len, time, h0, Jset, Jrise; + + + var result = { + solarNoon: fromJulian(Jnoon), + nadir: fromJulian(Jnoon - 0.5) + }; + + for (i = 0, len = times.length; i < len; i += 1) { + time = times[i]; + h0 = (time[0] + dh) * rad; + + Jset = getSetJ(h0, lw, phi, dec, n, M, L); + Jrise = Jnoon - (Jset - Jnoon); + + result[time[1]] = fromJulian(Jrise); + result[time[2]] = fromJulian(Jset); + } + + return result; +}; + + +// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas + +function moonCoords(d) { // geocentric ecliptic coordinates of the moon + + var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude + M = rad * (134.963 + 13.064993 * d), // mean anomaly + F = rad * (93.272 + 13.229350 * d), // mean distance + + l = L + rad * 6.289 * sin(M), // longitude + b = rad * 5.128 * sin(F), // latitude + dt = 385001 - 20905 * cos(M); // distance to the moon in km + + return { + ra: rightAscension(l, b), + dec: declination(l, b), + dist: dt + }; +} + +getMoonPosition = function (date, lat, lng) { + + var lw = rad * -lng, + phi = rad * lat, + d = toDays(date), + + c = moonCoords(d), + H = siderealTime(d, lw) - c.ra, + h = altitude(H, phi, c.dec), + // formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. + pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H)); + + h = h + astroRefraction(h); // altitude correction for refraction + + return { + azimuth: azimuth(H, phi, c.dec), + altitude: h, + distance: c.dist, + parallacticAngle: pa + }; +}; + + +// calculations for illumination parameters of the moon, +// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and +// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. + +getMoonIllumination = function (date) { + + var d = toDays(date || new Date()), + s = sunCoords(d), + m = moonCoords(d), + + sdist = 149598000, // distance from Earth to Sun in km + + phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)), + inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)), + angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) - + cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra)); + + return { + fraction: (1 + cos(inc)) / 2, + phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI, + angle: angle + }; +}; + + +function hoursLater(date, h) { + return new Date(date.valueOf() + h * dayMs / 24); +} + +// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article + +getMoonTimes = function (date, lat, lng, inUTC) { + var t = new Date(date); + if (inUTC) t.setUTCHours(0, 0, 0, 0); + else t.setHours(0, 0, 0, 0); + + var hc = 0.133 * rad, + h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc, + h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx; + + // go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set) + for (var i = 1; i <= 24; i += 2) { + h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc; + h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc; + + a = (h0 + h2) / 2 - h1; + b = (h2 - h0) / 2; + xe = -b / (2 * a); + ye = (a * xe + b) * xe + h1; + d = b * b - 4 * a * h1; + roots = 0; + + if (d >= 0) { + dx = Math.sqrt(d) / (Math.abs(a) * 2); + x1 = xe - dx; + x2 = xe + dx; + if (Math.abs(x1) <= 1) roots++; + if (Math.abs(x2) <= 1) roots++; + if (x1 < -1) x1 = x2; + } + + if (roots === 1) { + if (h0 < 0) rise = i + x1; + else set = i + x1; + + } else if (roots === 2) { + rise = i + (ye < 0 ? x2 : x1); + set = i + (ye < 0 ? x1 : x2); + } + + if (rise && set) break; + + h0 = h2; + } + + var result = {}; + + if (rise) result.rise = hoursLater(t, rise); + if (set) result.set = hoursLater(t, set); + + if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true; + + return result; +}; \ No newline at end of file From b23399c432a1fca69451dd4603d1c0a6e77f924d Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 09:30:32 +0100 Subject: [PATCH 035/122] Update metadata.json --- apps/sunclock/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/sunclock/metadata.json b/apps/sunclock/metadata.json index a0afcc786..a39343992 100644 --- a/apps/sunclock/metadata.json +++ b/apps/sunclock/metadata.json @@ -10,6 +10,7 @@ "allow_emulator": true, "storage": [ {"name":"sunclock.app.js","url":"app.js"}, - {"name":"sunclock.img","url":"app-icon.js","evaluate":true} + {"name":"sunclock.img","url":"app-icon.js","evaluate":true}, + {"name":"suncalc.js","url":"suncalc.js"} ] } From 844fe160bb143780c234135a50607bca2b8536c8 Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 09:31:13 +0100 Subject: [PATCH 036/122] Add files via upload --- apps/sunclock/suncalc.js | 298 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 apps/sunclock/suncalc.js diff --git a/apps/sunclock/suncalc.js b/apps/sunclock/suncalc.js new file mode 100644 index 000000000..b1af0a0d9 --- /dev/null +++ b/apps/sunclock/suncalc.js @@ -0,0 +1,298 @@ +/* Module suncalc.js + (c) 2011-2015, Vladimir Agafonkin + SunCalc is a JavaScript library for calculating sun/moon position and light phases. + https://github.com/mourner/suncalc + +PB: Usage: +E.setTimeZone(2); // 1 = MEZ, 2 = MESZ +SunCalc = require("suncalc.js"); +pos = SunCalc.getPosition(Date.now(), 53.3, 10.1); +times = SunCalc.getTimes(Date.now(), 53.3, 10.1); +rise = times.sunrise; // Date object +rise_str = rise.getHours() + ':' + rise.getMinutes(); //hh:mm +*/ +var exports={}; + +// shortcuts for easier to read formulas + +var PI = Math.PI, + sin = Math.sin, + cos = Math.cos, + tan = Math.tan, + asin = Math.asin, + atan = Math.atan2, + acos = Math.acos, + rad = PI / 180; + +// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas + +// date/time constants and conversions + +var dayMs = 1000 * 60 * 60 * 24, + J1970 = 2440588, + J2000 = 2451545; + +function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; } +function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); } // PB: onece removed + 0.5; included it again 4 Jan 2021 +function toDays(date) { return toJulian(date) - J2000; } + + +// general calculations for position + +var e = rad * 23.4397; // obliquity of the Earth + +function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); } +function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); } + +function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); } +function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); } + +function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; } + +function astroRefraction(h) { + if (h < 0) // the following formula works for positive altitudes only. + h = 0; // if h = -0.08901179 a div/0 would occur. + + // formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. + // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad: + return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179)); +} + +// general sun calculations + +function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); } + +function eclipticLongitude(M) { + + var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center + P = rad * 102.9372; // perihelion of the Earth + + return M + C + P + PI; +} + +function sunCoords(d) { + + var M = solarMeanAnomaly(d), + L = eclipticLongitude(M); + + return { + dec: declination(L, 0), + ra: rightAscension(L, 0) + }; +} + +// calculates sun position for a given date and latitude/longitude + +exports.getPosition = function (date, lat, lng) { + + var lw = rad * -lng, + phi = rad * lat, + d = toDays(date), + + c = sunCoords(d), + H = siderealTime(d, lw) - c.ra; + + return { + azimuth: Math.round((azimuth(H, phi, c.dec) / rad + 180) % 360), // PB: converted to deg + altitude: Math.round( altitude(H, phi, c.dec) / rad) // PB: converted to deg + }; +}; + + +// sun times configuration (angle, morning name, evening name) + +var times = [ + [-0.833, 'sunrise', 'sunset' ] +]; + +// calculations for sun times +var J0 = 0.0009; + +function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); } + +function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; } +function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); } + +function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); } +function observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; } + +// returns set time for the given sun altitude +function getSetJ(h, lw, phi, dec, n, M, L) { + + var w = hourAngle(h, phi, dec), + a = approxTransit(w, lw, n); + return solarTransitJ(a, M, L); +} + + +// calculates sun times for a given date, latitude/longitude, and, optionally, +// the observer height (in meters) relative to the horizon + +exports.getTimes = function (date, lat, lng, height) { + + height = height || 0; + + var lw = rad * -lng, + phi = rad * lat, + + dh = observerAngle(height), + + d = toDays(date), + n = julianCycle(d, lw), + ds = approxTransit(0, lw, n), + + M = solarMeanAnomaly(ds), + L = eclipticLongitude(M), + dec = declination(L, 0), + + Jnoon = solarTransitJ(ds, M, L), + + i, len, time, h0, Jset, Jrise; + + + var result = { + solarNoon: fromJulian(Jnoon), + nadir: fromJulian(Jnoon - 0.5) + }; + + for (i = 0, len = times.length; i < len; i += 1) { + time = times[i]; + h0 = (time[0] + dh) * rad; + + Jset = getSetJ(h0, lw, phi, dec, n, M, L); + Jrise = Jnoon - (Jset - Jnoon); + + result[time[1]] = fromJulian(Jrise); + result[time[2]] = fromJulian(Jset); + } + + return result; +}; + + +// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas + +function moonCoords(d) { // geocentric ecliptic coordinates of the moon + + var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude + M = rad * (134.963 + 13.064993 * d), // mean anomaly + F = rad * (93.272 + 13.229350 * d), // mean distance + + l = L + rad * 6.289 * sin(M), // longitude + b = rad * 5.128 * sin(F), // latitude + dt = 385001 - 20905 * cos(M); // distance to the moon in km + + return { + ra: rightAscension(l, b), + dec: declination(l, b), + dist: dt + }; +} + +getMoonPosition = function (date, lat, lng) { + + var lw = rad * -lng, + phi = rad * lat, + d = toDays(date), + + c = moonCoords(d), + H = siderealTime(d, lw) - c.ra, + h = altitude(H, phi, c.dec), + // formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. + pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H)); + + h = h + astroRefraction(h); // altitude correction for refraction + + return { + azimuth: azimuth(H, phi, c.dec), + altitude: h, + distance: c.dist, + parallacticAngle: pa + }; +}; + + +// calculations for illumination parameters of the moon, +// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and +// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. + +getMoonIllumination = function (date) { + + var d = toDays(date || new Date()), + s = sunCoords(d), + m = moonCoords(d), + + sdist = 149598000, // distance from Earth to Sun in km + + phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)), + inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)), + angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) - + cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra)); + + return { + fraction: (1 + cos(inc)) / 2, + phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI, + angle: angle + }; +}; + + +function hoursLater(date, h) { + return new Date(date.valueOf() + h * dayMs / 24); +} + +// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article + +getMoonTimes = function (date, lat, lng, inUTC) { + var t = new Date(date); + if (inUTC) t.setUTCHours(0, 0, 0, 0); + else t.setHours(0, 0, 0, 0); + + var hc = 0.133 * rad, + h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc, + h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx; + + // go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set) + for (var i = 1; i <= 24; i += 2) { + h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc; + h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc; + + a = (h0 + h2) / 2 - h1; + b = (h2 - h0) / 2; + xe = -b / (2 * a); + ye = (a * xe + b) * xe + h1; + d = b * b - 4 * a * h1; + roots = 0; + + if (d >= 0) { + dx = Math.sqrt(d) / (Math.abs(a) * 2); + x1 = xe - dx; + x2 = xe + dx; + if (Math.abs(x1) <= 1) roots++; + if (Math.abs(x2) <= 1) roots++; + if (x1 < -1) x1 = x2; + } + + if (roots === 1) { + if (h0 < 0) rise = i + x1; + else set = i + x1; + + } else if (roots === 2) { + rise = i + (ye < 0 ? x2 : x1); + set = i + (ye < 0 ? x1 : x2); + } + + if (rise && set) break; + + h0 = h2; + } + + var result = {}; + + if (rise) result.rise = hoursLater(t, rise); + if (set) result.set = hoursLater(t, set); + + if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true; + + return result; +}; \ No newline at end of file From 13145072a93c48d4ad7288818412174081da5cbb Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 09:50:08 +0100 Subject: [PATCH 037/122] Create README.md --- apps/sunclock/README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 apps/sunclock/README.md diff --git a/apps/sunclock/README.md b/apps/sunclock/README.md new file mode 100644 index 000000000..622a11ba3 --- /dev/null +++ b/apps/sunclock/README.md @@ -0,0 +1,6 @@ +# Sun Clock +Clock showing date/time, sunset/sunrise, sun height/azimuth + +![](screenshot_sunclock.png) + +Location set with mylocation app, time zone set with settings app. From d626b0a5284bfc377518fb0070911b73e739f5da Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 09:51:45 +0100 Subject: [PATCH 038/122] Add files via upload --- apps/sunclock/screenshot_sunclock.png | Bin 0 -> 4079 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/sunclock/screenshot_sunclock.png diff --git a/apps/sunclock/screenshot_sunclock.png b/apps/sunclock/screenshot_sunclock.png new file mode 100644 index 0000000000000000000000000000000000000000..a24af2116245f45cec0b14c51f7b23945f5d1933 GIT binary patch literal 4079 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 F^*<=JsV)Ej literal 0 HcmV?d00001 From 641aa7c90446abece2f2c185d53f7471f469952d Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 09:54:54 +0100 Subject: [PATCH 039/122] Update README.md --- apps/sunclock/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sunclock/README.md b/apps/sunclock/README.md index 622a11ba3..4076767d9 100644 --- a/apps/sunclock/README.md +++ b/apps/sunclock/README.md @@ -1,5 +1,5 @@ # Sun Clock -Clock showing date/time, sunset/sunrise, sun height/azimuth +Clock showing date/time, sunset/sunrise, H = current sun height/noon sun height, Az = sun azimuth ![](screenshot_sunclock.png) From 24b2af4eb91924111f1297eced62aeb96285eb62 Mon Sep 17 00:00:00 2001 From: DC959 Date: Tue, 15 Mar 2022 21:58:04 +1300 Subject: [PATCH 040/122] Add Seiko 5actus watchface --- apps/seiko_5actus/ChangeLog | 1 + apps/seiko_5actus/README.md | 16 +++ apps/seiko_5actus/app-icon.js | 1 + apps/seiko_5actus/metadata.json | 17 +++ apps/seiko_5actus/screenshot.png | Bin 0 -> 3438 bytes apps/seiko_5actus/seiko-5actus.js | 181 +++++++++++++++++++++++++++++ apps/seiko_5actus/seiko-5actus.png | Bin 0 -> 2375 bytes 7 files changed, 216 insertions(+) create mode 100644 apps/seiko_5actus/ChangeLog create mode 100644 apps/seiko_5actus/README.md create mode 100644 apps/seiko_5actus/app-icon.js create mode 100644 apps/seiko_5actus/metadata.json create mode 100644 apps/seiko_5actus/screenshot.png create mode 100644 apps/seiko_5actus/seiko-5actus.js create mode 100644 apps/seiko_5actus/seiko-5actus.png diff --git a/apps/seiko_5actus/ChangeLog b/apps/seiko_5actus/ChangeLog new file mode 100644 index 000000000..28f11c1c7 --- /dev/null +++ b/apps/seiko_5actus/ChangeLog @@ -0,0 +1 @@ +0.01: Initial Release diff --git a/apps/seiko_5actus/README.md b/apps/seiko_5actus/README.md new file mode 100644 index 000000000..4f09bf3c6 --- /dev/null +++ b/apps/seiko_5actus/README.md @@ -0,0 +1,16 @@ +# Seiko 5actus + +![](screenshot.png) + +This is built on the knowledge of what I gained through designing the rolex watch face and improves on it by getting more done right at the start. + +This watch is modeled after one I personally own and love, I have spent quite a bit of time designing this in a pixel art editor to try and make it as clean as possible and am quite happy with how it came out. + +This watch face works in both the light and dark themes but I personally think it looks a lot cleaner in the dark them. + +This watch whilst technically designed in a way that would work with the BangleJs has been only listed to work with the BangleJs2, if someones wants to test it on a first gen and let me know if it works then i'll allow it to be installed on both devices but I assume with how the images have been designed it would look strange on a first gen watch. + +Special thanks to: +* rozek (for his updated widget draw code for utilization with background images) +* Gordon Williams (Bangle.js, watchapps for reference code and documentation) +* The community (for helping drive such a wonderful project) diff --git a/apps/seiko_5actus/app-icon.js b/apps/seiko_5actus/app-icon.js new file mode 100644 index 000000000..796f24122 --- /dev/null +++ b/apps/seiko_5actus/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkEBpMB+fziAjRCQQXBHyoXEgIRLgMwC5EAj8gC5MC+QXJn4XKBgJHJMhkfJAYXEh/xC5cDBofzJocvIxKiCHpBGNExMCIxi2KeRIJFgMiiYBCkQ1Jh67EAAMSCgICBiQjFn8xDYX/AgQANn4qEgf/JIcDkcxiUSiMRY4cv+ZaFj6bDgZGBkMRDIIXD/7CHn5TDFYIADFIcRSxgAvXQwAQgRyDACcje4wAESQ4RDmMQgSGBj8zAAnyTgauH/65Cj7EBkMicAPyBYIABCgcRkYWCmYvCewMhmUiiMyF4gUBDoXzn7/Dj4RBF4IXB+QrDj40DmJgBiEyBYMDL4qcEgUikYqDCgSGKAAUSn8hbh8BgICBl/yFggwEbhMC/4sHAAcTIhIsBGYLcJGAQOHgLAEGBM/Jg0vRgsQZAMQBAQUBif/AwLJDfoQ1DkDOBkIOCgQDBFAKCDaIRPGSwqGBgM/dwUDeQiZEEAowCgXxb5jGGgQ+GaAjaHeIbmISYToHRYTPKYQIODE4cfEA4AEPghtEgQJCI5Mv+AXHJAiIIBggXFj/xDBMCcAYXGga7LcYIXIUpY1GC4SiJVRAXCiAWJA")) diff --git a/apps/seiko_5actus/metadata.json b/apps/seiko_5actus/metadata.json new file mode 100644 index 000000000..306b2f188 --- /dev/null +++ b/apps/seiko_5actus/metadata.json @@ -0,0 +1,17 @@ +{ "id": "seiko-5actus", + "name": "Seiko 5actus", + "shortName":"5actus", + "icon": "seiko-5actus.png", + "screenshots": [{"url":"screenshot.png"}], + "version":"0.01", + "description": "A watch designed after then Seiko 5actus from the 1970's", + "tags": "clock", + "type": "clock", + "supports":["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"seiko-5actus.js","url":"seiko-5actus.js"}, + {"name":"seiko-5actus.img","url":"app-icon.js","evaluate":true} + ] + } diff --git a/apps/seiko_5actus/screenshot.png b/apps/seiko_5actus/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8638999b50e7a1b6ba68578b282e3034694e43 GIT binary patch literal 3438 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 QIRF3v07*qoM6N<$f { + if (on) { + if (Timeout != null) { clearTimeout(Timeout); Timeout = undefined;} + displayRefresh(); + } +}); + +Bangle.setUI("clock"); +// load widgets after 'setUI' so they're aware there is a clock active +Bangle.loadWidgets(); +displayRefresh(); diff --git a/apps/seiko_5actus/seiko-5actus.png b/apps/seiko_5actus/seiko-5actus.png new file mode 100644 index 0000000000000000000000000000000000000000..73f1b81649f720c832209a70ee446661659b0481 GIT binary patch literal 2375 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 literal 0 HcmV?d00001 From f51c72e234ff522e8762aafa2a13654766381f4b Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Tue, 15 Mar 2022 10:43:10 +0100 Subject: [PATCH 041/122] Update app.js --- apps/sunclock/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/sunclock/app.js b/apps/sunclock/app.js index 1401c2a98..4609565a2 100644 --- a/apps/sunclock/app.js +++ b/apps/sunclock/app.js @@ -41,7 +41,7 @@ function drawSimpleClock() { g.setFont("Vector",60); g.drawString(time, xyCenter, yposTime, true); - var date = [loc.dow(new Date(),1), loc.date(d,1)].join(" "); // draw Day, name of month, Date + var date = [loc.dow(new Date(),1), loc.date(d,1)].join(" "); // draw day of week, date g.setFont("Vector",24); g.drawString(date, xyCenter, yposDate, true); @@ -71,9 +71,9 @@ g.clear(); // clean app screen Bangle.loadWidgets(); Bangle.drawWidgets(); -setInterval(updatePos, 60*15E3); // refesh every 15 mins +setInterval(updatePos, 60*5E3); // refesh every 5 mins updatePos(); drawSimpleClock(); // draw now -setWatch(Bangle.showLauncher, BTN1, { repeat: false, edge: "falling" }); // Show launcher when button pressed \ No newline at end of file +setWatch(Bangle.showLauncher, BTN1, { repeat: false, edge: "falling" }); // Show launcher when button pressed From 65a4a79d08714750e8ac852daa16960b33217f29 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Tue, 15 Mar 2022 16:39:00 +0100 Subject: [PATCH 042/122] Update screenshots with new background --- apps/smclock/screenshot0.png | Bin 2845 -> 2971 bytes apps/smclock/screenshot1.png | Bin 2031 -> 2399 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/smclock/screenshot0.png b/apps/smclock/screenshot0.png index c0e0bd0eed06e2c77e0ad737b1ecd4814a8e4f65..de4dc4e43da2403b684284b6805809343793d524 100644 GIT binary patch literal 2971 zcmb`Jc|25mAIBNnm@XOn80*+3%Wx}On541HOx7!Vj1nqBiLslKJq!k2;X%6D$0)=w zlU&s;JhW@ocQI|!9mE?lvkrm zTK3V4kAx@acN1g8TJ?47XA71$qq`?iyXt~jhzJ={c97%MlM zkG|eL`S)(#qolN_d-iWOqn}JH^G%^TvXcg8Ry{?wY9o4Vn?wiO-pC$_sMf%dPG1cS zmur$XWe=$f^DrIOhiEoC3- zF+FmG`}~Q`)Lq(ANBhjsw|$$(D=G?GT|D2VmbP2NGp&^Tfy~DSD($ecR0Z8<*Rg0q>cc>7}>xew|g&U#W~2ohTg8|KtLNMQi0c z95qK}jqjNYbp7_P1#t!!LU$Q|a9qE}T{HLWv>a|Q??KV9t^tn6+vB0>wadT7!gngy zb17TTulCmkx_|G@r63VRq}#A_!&c+4+j#~k@7~61cORq$Rc;vF4oh0@7Gph^V0o4{_uJRK*<&K>^sxUn4HOAO zj&OlPkYw~+OuQMxVb?)&j4_k4vaYTMu_J$fv^mDQO^|V(HI9+)sj|Ey&Qb7$oJn3l zVMyhF1t$FN&%rN!Lt#F-;<$dxE@Pq#)*1b$KVeByD@a#DPxgc4J~eotkila|JGsts z)<0_Ni`RD98JcnO6tg(-C!E-2qNy|~P@P7@LVRsVUXt*FN}M<6hRb5-Dc^e1Z?tWU z`5Dp(bf*TpV0ly}LWB(Ra3O36S6tQ*k5kVF_HwV|qO;iIUX$IVcJN3gK2b9L1sGoqHz=O~S#O<|gv_~;&ZSh-}0 z2SK~enBlx)CV=RnEV@n`J-(5tAir4x-TAlA(J>olZXqbS6;!juiF=u4pYx3ZYH@M9 zQZnN#)QPPi=B$NF2765jdi z1#IR3Imw=+t7GWeXV8TbYOZJcV@6{Xe(-P>y_6}J{ey&3u-X!UUs1aN9|-{5H1&i~ z<>;T3^ouk8KDMl-M`)#yd&P0xLHJu|f6%r zk9_?-fkn(S$Z66`CNCZ9FZ?Qyr4)d6n7+%*zmDvj+=L~|$HUN!w)kQqZGUxg{{h$n z?j{TiO0?D(TJ;iCR!>=thMHz+yfDK&*xy7l@+U$VcAO#UVIBWblSncNBSm71jpdXI z=<{*nQVpQjsl2!WwS$idBjJBwgjY@-uL;q+HUt9G9&a8Rgqz9HjB0xIl7cgyOKD40 zK1sDAgx>KUh?5$OR+cwxM>lRvw85HWhrf%C3q;9?(iQ^;vt_RoPc+85SSYX2VqQxK zDc3#KVNQ;<>QGEzGUyH+6+KyKY#G83@mzB`PDxf0UuAu)L05LA?9t1FXdeoGI(W1=bAKYCVMc;9 z709nSQg**FR$tKO0y%GPUDr*1XKrxV0~sM`8vIZVhTsgSt|g{FYJH8(MwZdWR~$G;R(9X-~kmGy!%r3R71j|mZMERG9xBV zyFYL1tH5OlbiuC*J0?X4Redy`e_h@hd|DHeuGk=je(AK$rm!1nnnLI*P_i|)Nah*( zoQe}6JUfJPlNi@g!CILoVhF_3TuarXr$SIG)zs9~1Zuwgpp4RCS}YbE)}S@h;v80jp9Z5oD`X zu-3iJDhNrR{kp*9$_in!|DvRZ^$w>)R+t!+V>C8`lfKh!q%2%BSE_G(vRZgq$fArG zUfos@>t>O0=7oVlZsSCrCe?!+%s-4+bzxI6^LNVrTq|G7(^s=S)#92J3Tnd)X$;HG zo@FnuU)D18&g?=7x+7FUEf}BnK7c{b)ZV4)0_st%@ADa)!Tg+mxsL*Ol}HTQM^ve7l0jI zGHeWDXC)|}?k3fYu@dylY!AJyt_n&&T`%hKU-2P=JdxcyFI8ioJZu5}w)wC&j+ka^ H!p;8xDEo2- literal 2845 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 YUdx_>rDxQ4@7%ip9M&0AYD0|sC!%XI-v9sr diff --git a/apps/smclock/screenshot1.png b/apps/smclock/screenshot1.png index 6ed9ef9ee4cd26c51b7d45dcdc7ccfaee680d8e6..70e28bac9a37874a76a86e903f557c7c7b8f6ce2 100644 GIT binary patch literal 2399 zcmdUv`#aNrAII0W7_GjJC6N%5a}K2(R?eC^6I){>YB@HC^=0%SqGGqmsaq=&Yc~2i zMp(GfopLcl7WS1SEaX(?aDTe4`(L-~JcUf26|J+4=#n~TGKNkvHr z1hU`B(bfaBHNQ7P3_PnFr~N^*hwR~C4Pk#!`UZhW9Corj??v$!mfX8hW{9-w+)Xwy zf16%cu0Z%`5(=&<;!YQEX(XDZZA-q$c{pig=o1AJMgR8_b0(Z7BL zJb)-Sr1F0(%(G0;ozv9vYkn&8n{pIt)gMXSb4$hI{fru2cXCQnTo}NS%|QS*2ZAed z4?OCREQnA1r;iKxCre&F?8ue}UJQ0BeFs^}!OJ}K|*hVnu3FdTB`Te$ORW6+q zx7pBB5Omb*We@p23{b7H7d+F8e!3lm4uJ>i~eWWh{V>rH~mAg7B=hAQD47a2})ulD}`Pc?QHm< zg`pA^6IsL8*{zwnE34V$oXm0fMDHsU!)|t%k1BNvlO7stLy@$h%$Zu}(4sj0#9Ytj zc2bKxt==+^Q;q5>==n<3675F532UFs_!tvqlBt)1<8Rnv?TOA?sV5_#$y?WkI4s=A z3xFl`*&il7Jl3{`ww_?k9AE+onZtN8&bDsK9UWOOn=Q9O68NyL^EktCwPFp3>*14# zPp-d}EI^ODkUMTvO;Ti*$kR4&GD`x3P6Ir}Cc8QJjt`nq@SB|ypNuNbRd!y9cxN&p z%r9b@v6dqk01HP6P=6HcJ*gBdJ={W2-iU8;gI=DpiF+jxmJ^#iO=20X4)-1eQ?0vJ z!SEQr*4&P>Ijb_iJfQgC?Jt6EZJWp}-Q2Mkfq1^2^}KD{Lr(q)9G}%MEEpY1s!C!B zv)*dS`f8{M+t_aD)z%c(KAf;MxM2)$8&TB8t(!D}%rm8oe#KbF65i^_IcNcTE4bsU z#eHX&=S<7vJ?vQ4=X`csRRZBY?}zyMw{FWu&V3f<#phV%aaw1*&=-fghB&eV?&+Kt zZ)F?G#2)*47N|v8leIxO?_N;eutfJCKDM-Vkq;tuX>&^nWa+W^^})iUpkorU5GVov z?vAa>WB?2Rlbo!~lp^$RH)kV2=saPQvE@3VCeZCSCo~@ z%e-?!YP2jr<#yyY!5@YYr|K#og%b3m8SmBOL`kn&6GD2SCuF?_34F`|_y788^ zU=F_SUsT(-NR@rvNR29bqkX$^_C_7uMc}`ZUF_TXrdJWg=>r?Mo2b@_@ro2dxE`>J z)j%pXDo3fcLMG9ndse=FqCeoT16w`so%b(PUTZ}Z`M`Fgxj!tU`$u+NtEd%;c+2O? zBKGuPzyGAy^m)OrLmqxl)iG0b(_O6m2t@1 zmFIBGp4LGXnqoE)M`53VK}n)u@S8dXd0+g3&Mg2_K@*%bJgUWli0PMDrSxzpPyUzU zg2O*&$AOEl_c~HT|CWDgYi>8*SQgFORz7Sq9$=bZwqv-2e<&@@v$bnHa?O5=Y~xMCLg%Nm==TltipXT`fQaX^KRwy zRkqWOxT~VJ@ZjXK4Xn^LykbVHc|0%I47s&7fkP^Vf23~*3Y<3WbLZJRr9D~sM_>** zXBjiJQxC@IV-XMThcqgT=2cdokC|GWGx+n9l_{UDc&es3m1G_(&O3`2Moz=$@8+7t zqP+-1+ukD2&z?QrqE1d^d5FZ3SedWbN}m6C05UNUdsRai)>7;idw*8_LvND<-FxE@ z?6QEC?8U7N@x~lNCYDxSP^>R0eytt+GvxdwyPTBEo?q5Z=b_S2b90E4R)({Cwn?E_>=MeW=uv- zN#?ekSK@4yG%$wyvSKyrP)urkpS&sak(+v{~+&?hdJ^-Fpfe? z`4;1=?bVO>RgzBwv2U+tLYF0xBb;T`0d>h)Ng|P;gVXeaz);STs^9*fL!$8#x^f0M T#+MxJf`H4(&c&8(O-%U@oPSX3 literal 2031 zcmcgt`BPJe77p=-<%%p46s!W;0Tl{FBg-o#0SzEqpnxG&2&vX0_#lC>nE-mRF8Gv8 z%PJB|C4dk@;9(#I0#{^tOjs1CxDl>>R1)(rP!d7bm;Mp;U(GC=_Z(;7L-1t~UP_hWffJYM-U)iXJN>;5e#jbgvSHGN=zE`9@{Y<}2Q?tKG4f zku_r4YWl@4lOxZ}FSt;?Toc^sFSgn-xO*q(q;Z7y2jG#yGGb92J`lfBW~&D zBk`G7D)b7-y$ZiFb#;}sj9v1MP$G*-FSqVcAD?9ub3}~G@`j~kZz{U(xR~6HX>|)@ zY{(adT5a}&NN8L6z5QU9-k(Nj(NJgTcnQLZBc>c1T24!}zo614O>=_~A&TRzq@~sl zip)-@w=JoE3oBgr;qF_8Ilal(ax2zq{lbw=U@L{>NDuB3GlR=0JZp^HLKBcW-LnvX zuUTj#(XxZDQhM8HGw{jKpQ6nr2R;X2v z*+>blh@SAT)U=#v!-@~Eka9Ln-C0^8>`RhXs#aOEIOt4X8;$5_WzW1Q-S?!^f(o%Z zz`g%Y6z{ckCaFVT(nOp#12X4%+{Ru>dg~O2)mB=@afTIr(a3IwdfB!nEVtnGaBL-9 zPv_>UH*J*@`44lQzC9!2nt5j9na?etZ_#zpVX792sHQl7paeZw~v` zB>O_I==ajmDtLXM9JV`$(SK78f2Grn^}W9Zkr4dP|H~n?X~kckaj70KeJg~oLWI&t zx>=JmU>Xfw8gRh<$I3j5A?3{bs>e7g?w-p`TkMLRWEO|%jzkmP8{zzXgTX`1Xxpec zyvbwC`<#Y_iXY+&q>`kpN;#k(8?De*-zPo4(55X zJ>&t{%)cmy!A4iSc{p-6Lnhv|tAc}$xanak*=sRfXcauEQ_Z`1)*{%rEz%+!sc#?a zcWO2X3H5>MTK_)FZU8IE&U5U5QWS9VotytX?%OZ9Kpd^I|}cWnQ%Su!zp3 z$rS8*yXwI^1XGNS^u#iI(%;)PGY#c)sJpmEV!UxZ!(t_)+C2#BiTmCGhxGz0h@t;j zBHxEWWAic+ax7syG;Sm^ z+L?sO-4MKtdK}h64@J@r&ct}~?7Mf^@=k8GZ>K2p916C470_h9;%@ny&Fj9Sp8B z&kyVhfh?&|p~QA$*E#9pSn&j4GeTI5XWTY2wqH<$Zt~gHQ}^LabVA-r(d=vdX$(d3 z{)x5o$X#}P!8~DcK(EcL&1~8ur6&k^+B2S${-{Ry=&qR0;u}S@3`O%8{l98cZC2-s zl(R}nRFlB{;r%-DoYlxNp2u``T8>gO;oN7PFz#2&9Bs7ceICp53yMweww!w=djZf& zioQA4bhglPMLmJVP!L7$dS-Zk|6P~2Y1@A!&w3h}0obyt#F3+DFy{Kpd_y!C5-$GU zS`XuLVx9!(VH_TuZoPd4UHVJLfxIhdizwkY{yvZ_+{@h82Qq4S_QmH_@c9S4n>ytJ zr!JQ0gnV?8O#187HMq$P4>7G14<0Z)g!BEa{5*h_7>g~;KLs5XvuQ9yoL+YSa9Q`j OQK&#aGO6h}J@5Zrimdto From ff13a755802c1dd6a67478b022e28a8928207dfa Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Tue, 15 Mar 2022 17:09:14 +0100 Subject: [PATCH 043/122] Add 3bit/4bit background choice --- apps/smclock/ChangeLog | 1 + apps/smclock/README.md | 4 +++- apps/smclock/app.js | 15 ++++++++++++++- apps/smclock/screenshot1.png | Bin 2399 -> 2134 bytes apps/smclock/settings.js | 1 + 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/smclock/ChangeLog b/apps/smclock/ChangeLog index 0300d5ceb..f0b5c5bde 100644 --- a/apps/smclock/ChangeLog +++ b/apps/smclock/ChangeLog @@ -2,3 +2,4 @@ 0.02: Add battery level 0.03: Fix battery display when full 0.04: Add support for settings +0.05: Add ability to change background (3bit or 4bit) diff --git a/apps/smclock/README.md b/apps/smclock/README.md index 635292d0c..7a099f268 100644 --- a/apps/smclock/README.md +++ b/apps/smclock/README.md @@ -10,7 +10,9 @@ It shows battery level in the upper left corner, date information in the upper r **Analog Clock:** -**Human Readable Date:** When the setting is on, the date is shown in a more human-friendly format (e.g. "Oct 2"), otherwise the date is shown in a standard format (e.g. "02/10"). Default is off. +**Background:** When the setting is set as "3bit", a background with more accurate colors is chosen for the watchface. Otherwise, it uses a background following the 16-bit Mac Color Palette. + +**Date Format:** When the setting is set as "Long", the date is shown in a more human-friendly format (e.g. "Oct 2"), otherwise the date is shown in a standard format (e.g. "02/10"). Default is off. **Show Week Info:** When the setting is on, the weekday and week number are shown in the upper right box. When the setting is off, the full year is shown instead. Default is off. diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 0ef886b04..297ddb894 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -1,5 +1,10 @@ const SETTINGSFILE = "smclock.json"; -const background = { +const image3bit = { + width : 176, height : 176, bpp : 3, + transparent : 1, + buffer : require("heatshrink").decompress(atob("/4A/AH4AC23btoCct/pkmSpICcIP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5Bp/4A/AH4AC/kAAH0/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5BpA=")) +}; +const image4bit = { width : 176, height : 176, bpp : 4, transparent : 1, buffer : require("heatshrink").decompress(atob("/4A/AH4Au1QAp1/2swApK/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K/5X/K+//AH4A/AF8AAH4AUK/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/4A/K/5X/AH5X/K/5X/AH5X/K/5X/AH5X/K/4A/K/5X/K/4A/K/5X/K/AA==")) @@ -12,6 +17,7 @@ var batLevel = -1; var batColor = [0, 0, 0]; // settings variables +var backgroundImage; var dateFormat; var drawInterval; var pollInterval; @@ -25,6 +31,7 @@ function loadSettings() { function def(value, def) {return value !== undefined ? value : def;} var settings = require("Storage").readJSON(SETTINGSFILE, true) || {}; + backgroundImage = def(settings.backgroundImage, "3bit"); dateFormat = def(settings.dateFormat, "Short"); drawInterval = def(settings.drawInterval, 10); pollInterval = def(settings.pollInterval, 60); @@ -75,6 +82,12 @@ function getBatteryColor(level) { } function draw() { + var background; + if (backgroundImage == "3bit") { + background = image3bit; + } else { + background = image4bit; + } g.drawImage(background); const color = getBatteryColor(batLevel); diff --git a/apps/smclock/screenshot1.png b/apps/smclock/screenshot1.png index 70e28bac9a37874a76a86e903f557c7c7b8f6ce2..1a020c9ca825f3f0772854801037aa37d3e036bf 100644 GIT binary patch literal 2134 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 T#+MxJf`H4(&c&8(O-%U@oPSX3 diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js index a6c7d1b98..ee4a35a26 100644 --- a/apps/smclock/settings.js +++ b/apps/smclock/settings.js @@ -52,6 +52,7 @@ writeSettings(); }, }, + "Background": stringInSettings("backgroundImage", ["3bit", "4bit"]), Date: stringInSettings("dateFormat", ["Long", "Short"]), "Draw Interval": { value: settings.drawInterval, From de6b3d97ad2b1f02edf44e192ce6f44925eb1080 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Tue, 15 Mar 2022 17:26:42 +0100 Subject: [PATCH 044/122] Fix screenshot links in README file --- apps/smclock/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/smclock/README.md b/apps/smclock/README.md index 7a099f268..518d77d4e 100644 --- a/apps/smclock/README.md +++ b/apps/smclock/README.md @@ -4,7 +4,8 @@ Just a simple watch face for the Banglejs2. It shows battery level in the upper left corner, date information in the upper right, and time information in the bottom. -![](screenshot.png) +![](screenshot0.png) +![](screenshot1.png) ## Settings From d8080a9d6e76402bfd054ffcf316209810d50a2b Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 15 Mar 2022 19:36:18 +0100 Subject: [PATCH 045/122] widclose: new widget: a Close Button --- apps/widclose/ChangeLog | 1 + apps/widclose/README.md | 7 +++++++ apps/widclose/icon.png | Bin 0 -> 1322 bytes apps/widclose/metadata.json | 15 +++++++++++++++ apps/widclose/preview.png | Bin 0 -> 261 bytes apps/widclose/screenshot_dark.png | Bin 0 -> 2324 bytes apps/widclose/screenshot_light.png | Bin 0 -> 2425 bytes apps/widclose/widget.js | 14 ++++++++++++++ 8 files changed, 37 insertions(+) create mode 100644 apps/widclose/ChangeLog create mode 100644 apps/widclose/README.md create mode 100644 apps/widclose/icon.png create mode 100644 apps/widclose/metadata.json create mode 100644 apps/widclose/preview.png create mode 100644 apps/widclose/screenshot_dark.png create mode 100644 apps/widclose/screenshot_light.png create mode 100644 apps/widclose/widget.js diff --git a/apps/widclose/ChangeLog b/apps/widclose/ChangeLog new file mode 100644 index 000000000..4be6afb16 --- /dev/null +++ b/apps/widclose/ChangeLog @@ -0,0 +1 @@ +0.01: New widget! \ No newline at end of file diff --git a/apps/widclose/README.md b/apps/widclose/README.md new file mode 100644 index 000000000..55c8de483 --- /dev/null +++ b/apps/widclose/README.md @@ -0,0 +1,7 @@ +# Close Button + +Adds a ![X](preview.png) button to close the current app and go back to the clock. +(Widget is not visible on the clock screen) + +![Light theme screenshot](screenshot_light.png) +![Dark theme screenshot](screenshot_dark.png) \ No newline at end of file diff --git a/apps/widclose/icon.png b/apps/widclose/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1d95ba0ce40155f397a587da9463123509c9fac7 GIT binary patch literal 1322 zcmV+_1=aeAP)U*#STqfkhaVU`Am#aP!|dqJ4`b$?;aOS z`Z4cK=f0T%7xce8_uO;-|93ymz4yU1rg3jWY7s=cy4=xgzqTo?KqaA~3lQd@G!(LA zQ2r2=i-@L0BvrR`a7el_)#k2BKz7yQdB(^_lox@fh~2NCa?mmK#`_1aRLY?u0VAs) ze~6o2k037tGb>GAz)clC*Sx>uzW(&zQ9DN#km+oD0p(+0cGSLQa8;2_jeUcMqja(s zpozqc%q(}m!20Oi?4fX=;U9mqq|>)-{H+A&Gl}?(toH@z>gwoOLinb>&hL_A>1;Vy zr<{W(5;N{9c>rb2jjZ>TcD0mUUu6YkX1V+CD)}*JXXbkSN9DYxoI;u8;&mVgYey>5_L2hrO}0JYzy;vJJHpH!*NpGaFSW&%oI--`;r}NOFxz##U8NdB1!UWo z%q&;^EL(VMgQWCTuILIK;MWr|!eg@H)${b#Hl+ zx(^Nz+qxTE*D3`t(>LCRu!evD?Z!b_XBD7!)fI3K2pIjbZ3!^fCZ@Bn1uyy31cO6t%MQHul|l0DE62!>*`Dmcncr;1 zA7~oA`b#3fq1d3X!ZxBgcZS^C+rjt8jjl^<>+VS-;Vn-Rd!y)U8$<5B-I#M{Y|~*J z=_s~&0Vh}#<%E|XNCDf4ZR;5)SeQ-#+`1X~@)$$z-CgASzKxIxL?ti+0j`;3+fP7C zq{!T!4wFOxr~w6>2?Jdr`9i=m4SmCpO|*pVLUSsJOnx90oKE7@kUW3{xP=L5s4)7t z2orKsRIQRc0FA{4`)XnfDYb%hinhuTCLmL3u(5sK2?;CZ>x2bHiVa}`{;VYO#3D5Y z)ydPzqS#Fh4R8yq1DB$P4JB_3xp%tB^=zBGu&WRu$i-q?K!5|MqXaEUzOZ0Jcc%(P zs0O(O1c*q=HlWko8YJ)gQX&MI@>-GA(tN&qWb68u+N^D$r8xZ-e@($ptpZBBPi2?5a?$k9! zLRH^QsIp|w59_9Gh=zN{TBYaEaJ^{bjQ?t-Y~q1vB(9ZxhF%qB$F z0rMhuzYKcNQLi_w!rG!XzgfF+Mh6xxGLCeJNJiR gzged-je8yc0S7nSp}o%sl>h($07*qoM6N<$f=vT~fdBvi literal 0 HcmV?d00001 diff --git a/apps/widclose/metadata.json b/apps/widclose/metadata.json new file mode 100644 index 000000000..e044a2d39 --- /dev/null +++ b/apps/widclose/metadata.json @@ -0,0 +1,15 @@ +{ + "id": "widclose", + "name": "Close Button", + "version": "0.01", + "description": "A button to close the current app", + "readme": "README.md", + "icon": "icon.png", + "type": "widget", + "tags": "widget,tools", + "supports": ["BANGLEJS2"], + "screenshots": [{"url":"screenshot_light.png"},{"url":"screenshot_dark.png"}], + "storage": [ + {"name":"widclose.wid.js","url":"widget.js"} + ] +} diff --git a/apps/widclose/preview.png b/apps/widclose/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..d90a3b4c56e5583b74c0a0d176c24f381e693165 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6;x#X;^) zj5kl})B`yR$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8U)v z6XFV_{{zwg|LKw`azGAaNswPKgTu2MX&@B^9+AZi4BWyX%*Zfn4#+V+o-U3d9M?np zb_+5na5yh4VELZN!oB&wmYNjT!iw^TlU-cGHV6r*Z{XapPOX$ePh6+FKRk4rwxmjlJl<2s{ zm0B;iCkdZY(rBXWFs#O&9XpDq#C872J@qX-#v94i&2;I1mcv9Ec&Mf3-9{|}i|}dP zioSQ7YbfviN#MunN8NXGU?IZv5wA+-?=y(2otV;2pN7u+R*aa`CKZj>5Jh9Aib>*$ z;RYxt8=CnBLCPt#vhK!%2F}0%*>wISm4RHlY9V<6J}2d_c_DzPAV$?8fuPMvYyFa3t2@MMP;ld0zMvCsEs zeFDJA1!@p058lRT!t%Ajg!B2*r;7lv4a)TXfCB9U%FQi0fWQh;ZQEj!T~r@sft(v<+J15c0l0R`8ur{BVG6&28CE-H|0&ZWE24n+ooFkDw=D zR~%K}X%@ePs9o^IYL_-^R=liwFVY+8Y$sudk= zz9=(+256(}=YYR)JsK=j%ZpZ_%!+F@|POGT2&|JaLVEfoO zjBdt41+sfeXy#&*ce985&m15>@Lvs@bzNx-#o^p^$te{9A|gRm$DkLyZ4nbg+Z@yU zx&)aYHT`rF8SaX)Nj@vH8g{kO>)xk`Y&t$m;M*C+gnPAJ<%Oj7`1~2TxSa~M$-X8_ zmp?KH4-))(Q>~H};WsWm7@EV3jo!6);Dmnku6o(jRVF(Wi5rL$JE~G|$Q)}rcmS^= z%#2sF4T`*JUN=wdc$a&e)Mb~195W5B8;6K;DWo=;l9k3K1jctWPp(Csu9Ys#dR8rj zJo;?*ckimUX`$7m{sDEWJOclux}m1#K@$8y#)Vp(z{Dx>^h6-6ik0bc%-4{(ioJ7Q z(z^q@mB?>*DaCEnS@Rh8bIzEA531*>yNr>GZyR*aJCqrhHb2%OIC!re<@F^!{ozZ! zGgR|lv;I~De;){*_@bnOIoFT<;0-aN#C*JZWu=lh|KU1aChSGlXecg2aPtyPEYeN{Geoufbm13FzjPBc{(_$i?=6H7nF?+cGwQLKg`nl=Am(O&ypn~C9IMsA@E|WfD{SHPB*MkI>Z0B8B zHLK!GF85E{KKowrN`(LIM`o;_@x-dFm0>cllU6f*Xvg@44O@0q`0m*29 zYp;%wUl4=u6SOyvTYY#G9QPtjtmkn2s5Zrk#44$|c&^?Ya(_#$gm1Ypb7!EHmyc6E zA49Hdx?G-4c~b-{N^s-v#6R}OsUzL@t{2@>5{)__3x+o1AOSYXD99tMPknt~*B>a4 zHr-jwy3GPkJuoVhwWPp^t=a5HPsc7E<{oSb>zy|;D@5loCMCW>3o_`1T7ztPf};OI z(v)3(4sQ1KSVG2M%Ss?G literal 0 HcmV?d00001 diff --git a/apps/widclose/screenshot_light.png b/apps/widclose/screenshot_light.png new file mode 100644 index 0000000000000000000000000000000000000000..32817ea8dc0851e39860d30441d444587832f89f GIT binary patch literal 2425 zcmd^>`#%#3AIG;fwdv-TZZ2~#b1C=ISaX@{Tsq7xImkV9+!k?6DrB-rBBrpXgVrz% z+qCCAa>_Lv7NQjrHkS?4636pjJg?XDeZ4;4&ySxUK0mxax$YSBVd+!S007{yql2yI zo;Ungko|j~#+VJXt2hv;D@IM_+Lx50nfKdLxZ;iKnG=Eytqd_h z3$I)$k`c!y3G*=%2L{6=^f-H-Z+t+UMkdEBw%N%xsJQD*trR@IN}@u{!v=T0&&bwp zKM+~`MD=XXRqjmFNM7I3B$XH4#s~Tyj#|@WLvQGCY|1N?_2p%dJg^;1$`S}}rB`1E zfgt72AT>ccnVjV0W)~y?FRy@C;Dcp83=}+uLSXS(>V;Vq0MO+4kP#3F#<+t$8|0Be zmX?0nuuKj#4=J4tg2aTQd%<8Ci_5YO|Hc6D0)9kkCIF;!26XlV6xQ%R70UG7dcQ+M z+Mz1%?5agzr>iq$ENqUM%?1(0aDDK!yHZCX)JJN-;5@t`;0HDU&!L@}X}^QyB}DJ$ z5j9rfJ-B6<%+|+=*TJ)p?K~s$1;|5IIjVfYrOrbmzV5feK0P3qtku0y3&BYZun0Um zd)?7x$Nl(~&rW|I2B!))J7><35Hn(RAH2E4`skaI6P8jDxfYYVFSnn%?<|HfIc1aM zdfy=N^z>zgwlMx&d$3WTa5zv^y#bsU-q`Yt#TA?yiMrK$^V7-6p5u7xtoEcGL{DF# z$Y!gP^=PYLi++KkU=ciMaWHmMq70%vt}hWSW`z0fbii-NlI>Apbj!ASp|P$3yLP+rEm39O`DZy3?DEiA{+TV#vR86ARTNP<6O< zJNm*5RYn-X{&a;@G&V2Lqh^ynynC@^`@6urrI2k!2{1UqW|F*E*6`9b<|&At3%i3; zmc>OyUOz?MG5#5a4T^Jdj1|l|zP#n^OX8i(qIQ*8Ctrma8TG!8jQwK+wXpE1CPQK$@O4`I{YZ!QVFo!^%cs}XiWE89`{ z>S#$~icg~?8auJPV=1yJpZ~VtXX;;nr&)+tIB~-SLsc4EQ(w(&uxlFAjqr7)x@}kc zuSHxM4j^)ZQYfbk|}!$1=S0*9NCT z#5Nz5?|hKG;vXtVN|}oxMr(&VZ!^0kY=Ui&a^MYO3wI&4;&q)u%*MX4ipF`g+P?M=luY(nWCv#T%WchJ;{Mcy8m7IBtZ#@e5t6LFD zt^j;B9Jw0{Qpp`hwXMl>oB?eP8w|daOSc&a0 zq;k3d^NY9WHi2*tp9Auj_9oA?PH=Cv7JQBZ)`YZlRQi#GA`d-B0|Cx2e6sA_aM>kR zDgP-|aZ7qg{`&d~ z0}=PwL9$9`?!n@;8c-byi`Pt-B=2Fy90jtKL-HIX>jLdePHZ+fM>CT{Twj>n>vakO zm2m{%H5Nt~PXQpNtQ?F40HKFp#F+!Z$r_qSO(3|S#_dxq2*S5_$aDZflpHHNr}n@` fC=w.x && c.x<=w.x+24 && c.y>=w.y && c.y<=w.y+24) load(); + } +}; \ No newline at end of file From 2662b48ea79ba6442f47308d0421e43f78ed59cb Mon Sep 17 00:00:00 2001 From: Daniel Cox Date: Wed, 16 Mar 2022 08:48:21 +1300 Subject: [PATCH 046/122] remove incorrectly named directory local git not syncing correctly with this still here for some reason so deleting it through githuib to try resolve the issue --- apps/seiko_5actus/ChangeLog | 1 - apps/seiko_5actus/README.md | 16 --- apps/seiko_5actus/app-icon.js | 1 - apps/seiko_5actus/metadata.json | 17 --- apps/seiko_5actus/screenshot.png | Bin 3438 -> 0 bytes apps/seiko_5actus/seiko-5actus.js | 181 ----------------------------- apps/seiko_5actus/seiko-5actus.png | Bin 2375 -> 0 bytes 7 files changed, 216 deletions(-) delete mode 100644 apps/seiko_5actus/ChangeLog delete mode 100644 apps/seiko_5actus/README.md delete mode 100644 apps/seiko_5actus/app-icon.js delete mode 100644 apps/seiko_5actus/metadata.json delete mode 100644 apps/seiko_5actus/screenshot.png delete mode 100644 apps/seiko_5actus/seiko-5actus.js delete mode 100644 apps/seiko_5actus/seiko-5actus.png diff --git a/apps/seiko_5actus/ChangeLog b/apps/seiko_5actus/ChangeLog deleted file mode 100644 index 28f11c1c7..000000000 --- a/apps/seiko_5actus/ChangeLog +++ /dev/null @@ -1 +0,0 @@ -0.01: Initial Release diff --git a/apps/seiko_5actus/README.md b/apps/seiko_5actus/README.md deleted file mode 100644 index 4f09bf3c6..000000000 --- a/apps/seiko_5actus/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Seiko 5actus - -![](screenshot.png) - -This is built on the knowledge of what I gained through designing the rolex watch face and improves on it by getting more done right at the start. - -This watch is modeled after one I personally own and love, I have spent quite a bit of time designing this in a pixel art editor to try and make it as clean as possible and am quite happy with how it came out. - -This watch face works in both the light and dark themes but I personally think it looks a lot cleaner in the dark them. - -This watch whilst technically designed in a way that would work with the BangleJs has been only listed to work with the BangleJs2, if someones wants to test it on a first gen and let me know if it works then i'll allow it to be installed on both devices but I assume with how the images have been designed it would look strange on a first gen watch. - -Special thanks to: -* rozek (for his updated widget draw code for utilization with background images) -* Gordon Williams (Bangle.js, watchapps for reference code and documentation) -* The community (for helping drive such a wonderful project) diff --git a/apps/seiko_5actus/app-icon.js b/apps/seiko_5actus/app-icon.js deleted file mode 100644 index 796f24122..000000000 --- a/apps/seiko_5actus/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwwkEBpMB+fziAjRCQQXBHyoXEgIRLgMwC5EAj8gC5MC+QXJn4XKBgJHJMhkfJAYXEh/xC5cDBofzJocvIxKiCHpBGNExMCIxi2KeRIJFgMiiYBCkQ1Jh67EAAMSCgICBiQjFn8xDYX/AgQANn4qEgf/JIcDkcxiUSiMRY4cv+ZaFj6bDgZGBkMRDIIXD/7CHn5TDFYIADFIcRSxgAvXQwAQgRyDACcje4wAESQ4RDmMQgSGBj8zAAnyTgauH/65Cj7EBkMicAPyBYIABCgcRkYWCmYvCewMhmUiiMyF4gUBDoXzn7/Dj4RBF4IXB+QrDj40DmJgBiEyBYMDL4qcEgUikYqDCgSGKAAUSn8hbh8BgICBl/yFggwEbhMC/4sHAAcTIhIsBGYLcJGAQOHgLAEGBM/Jg0vRgsQZAMQBAQUBif/AwLJDfoQ1DkDOBkIOCgQDBFAKCDaIRPGSwqGBgM/dwUDeQiZEEAowCgXxb5jGGgQ+GaAjaHeIbmISYToHRYTPKYQIODE4cfEA4AEPghtEgQJCI5Mv+AXHJAiIIBggXFj/xDBMCcAYXGga7LcYIXIUpY1GC4SiJVRAXCiAWJA")) diff --git a/apps/seiko_5actus/metadata.json b/apps/seiko_5actus/metadata.json deleted file mode 100644 index 306b2f188..000000000 --- a/apps/seiko_5actus/metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ "id": "seiko-5actus", - "name": "Seiko 5actus", - "shortName":"5actus", - "icon": "seiko-5actus.png", - "screenshots": [{"url":"screenshot.png"}], - "version":"0.01", - "description": "A watch designed after then Seiko 5actus from the 1970's", - "tags": "clock", - "type": "clock", - "supports":["BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"seiko-5actus.js","url":"seiko-5actus.js"}, - {"name":"seiko-5actus.img","url":"app-icon.js","evaluate":true} - ] - } diff --git a/apps/seiko_5actus/screenshot.png b/apps/seiko_5actus/screenshot.png deleted file mode 100644 index fb8638999b50e7a1b6ba68578b282e3034694e43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3438 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 QIRF3v07*qoM6N<$f { - if (on) { - if (Timeout != null) { clearTimeout(Timeout); Timeout = undefined;} - displayRefresh(); - } -}); - -Bangle.setUI("clock"); -// load widgets after 'setUI' so they're aware there is a clock active -Bangle.loadWidgets(); -displayRefresh(); diff --git a/apps/seiko_5actus/seiko-5actus.png b/apps/seiko_5actus/seiko-5actus.png deleted file mode 100644 index 73f1b81649f720c832209a70ee446661659b0481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2375 zcmV-N3Apx&P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2;50TK~!i%y;^r@ z6ipO=7h~^=z1K+8MARsDMNqK?Ecl204;zYzhzcTp!GaBqC}Km6iUo<7*boI{7e#E? zvG?A4neY8xcGum#*}J{V>4RT(?#;WMnK!S^T!=}<0_Dn;Q}OZf(ym{>zWVazi`u_` zzXEO8ut6myB}re+nl&BY%PZpePo5|-F;Si`U%sTDKYvR5#*G{DwA00l7v*{X{(X5C zFJ7D~RjMTIyiimNC{UmPu_mQ`<;oR#vZCb~j(-3CEzb`hKG2gVPo!-sAsUKk0ja5} zl#`Pqlel~LuEEVaK?zNoG$A%S8as9@#l`ubRzwS^SFav*=+J>CPo8XWVnggZl%AeW zg$fmtoh@3lsI>i3kYl(}vSdkBxpHO2FICsCUsoSLepIDPm)6Rfa67S1#zen<{X`D$ z#u$K3&I4Me08xeQ-N7>l+qG+#gYSml1+X(K4gl)Mj~|N7$kB(0#pdMTX`p2a0)c?4 zR;^kP@4$frGO;dQx;XmmxOeZK+O}<*diwOKTDEMNRt8wIWQn|M=FFMeet@HumTy4I zlvu9g1JD#SeEITaKN|8xLPCOQ{?esORu0i2j7e#kVX=Jqa?#v`2@|yaeqg?%XV0G6 zem82@uC3!c8Q3mAP6WAO!-lDR`SQtUjvT6R;llD6c3q-G3GpBB3l=OWZ2)}p{g7?b zrj6shp#XWePX>&J5Hcf|1XkAcOKffuTF;z0L!Uo?rs2bfOKfM;ps!!QQt#fq>D;+< z^y}9zdiU-fRj5#bX3UsjeA_=wnKFeYPMk>X+O@N?y_E+Le=#5?k(QQbaQ)Hu@89Y8 z@#B(!pa4u3B?Iq>@Ls)oMZ62d+Lr|&?ngpx+qNYRu{3w?TzdZeIh8G2*67J4*$O!0 zym|A)IYGyc9a9Y&G;nN}7mz1v)TrSbh-@%3-Mj3lUcI{7x^=7K%rDN4NCjsH5Dg(? znGjY5O;xEV88%6fBwAmvjXJ3tmoiT z;?bi=vSlMjjuiXdxN#$8W@ZL$n@Jd~OqnwD_U&8ZT_cYB)VOhDYT2?SJ$v?yIMmXS zBS)lK#e`u3ty{O2g~Pmb#95!_%$Xx?EFw8M*_u4)!Gi}@@hCfhNx+WXghAG?Ur)`O zHy15_`}WP~aZ*Z3if9{zLQnTDH{HH{o6ep+YkUf(Zr!?xMZhO@g!!0`9QKeAVQuoS zp=Cx4oXAYa`WJvBW6U_1Ni0rAbK_)VaQ-eKr@VRdM%vmHMuSO{CMkA$ZQtKQ z0Pz^dyI2u2^5DUPB}~Ez{SY#@SCsQ21d0_aR#1RLph9-Umc)ws^yx!Wr%t7%OP9*o zH!CYkCfL7!f4X+<8XY=x$dDxJ+_^Jt-@aYKEa?6F_rys{+Q=#S^XI42r%zMex^*SO zv7ZUQR;^kzZQ3*n7&X0?5H=4VK5Tr7jQB7^{BCKZtUzo>2{C>8bec75mheH4*|KGe zBupeHgyTAO>d4q9PMn}2LxvEaE$Gy#Q&I!*L5dnRY9y0~g5oid7aIw`9qlOm@#8yAs7?8g(M2?;~b9S z(yR=iebhzRDNsCC=ta0C03rQj)zD(orcI^X=+XcVv$OlI%iy;QYoRZ2=qlF6V* zgodF}9l?A7EEML0Y5?P4(fAHBHcASZ5GG!}e0eHWs+4>;fFy=3MyHOjZ72oo1P6Nj z__1|21lqA<2XWygrh`EcPP=#SE`29Yo+LhoiiYRUpD#RUsFxh)0UhDR z5X2Wyc)?t7wZc`UI3p&G;tyLMitrxf34CYKqD2NbHspw_cA$jd9Z-uGFIF5q6c=K0 z3~b-NebC9s50I%dGBPAzMDu+&5)%{gB*n#=qXUy(y?V9c@>i}rR;^kklScZs%S8hm z3z6*h?Aep23jrH)8}J2Of3R%}*e+G4PMzGsF~iWILsfQmb}V)x_khmjt7RT`O=AGI zd;1q+2F}=u9b8)tgBNOCoa~AeDT20M0N{A8xNcV*r{#F3lgTRv4H~2l9z3WxG&}gX z)x)@a8Vpy?=QdCi+1oHDj?HpD=HwId7S05AGBq_-+HkNQJ$lHwnsbP>O|7~ogz+|S z-t16Pt5&TP=KvWWeuyhgd%12nutM$oAH&LiI0@ls$fhJ25^=k4-@bJ7=1qu&B$NRS z8#a_9AFkqYWsanikdPq9Ox#iwD^^T$h&}8gMDN_WQ?5-QgOe7@3gid$u`klVfdl3J zxc$I+8|Q12WF@=+wQt`(SurRlCr3=k?2iV}HZ-a0^8#)j;E#45cG27o+?sI3Yw!Of zh)Hw3qQ;LOZx@IPaDGfCGc!|l?b=l<;{{w-!erchOdNiJ2xjB|5x_3s8qm%Q1wSFs zon!n0PCaVWD2Ls{$29YEe2__T1?b@EfW_hm2|v#51xyG@(q$4BFc+?Ht(;Fko5XJbx_&=ERKo8FT>N?Z3Kqe&Sg4ykEmN+tk@j_cEn2jY>pu7kpOmyR0D=IL zmB+QX06Pe}aN&aIcqlnSlpR{81(=GPhrvK;X=y=yb}U%1K;*CpUB8JnYu1QddU|?L zpBe8%K+Ck?UH~E#=+2!x+Qr%7cLDGPBr6b~r?oO6pk)RDn!rFP^pK%-Va^S|3jiPk z!a`t{$;ruDISsT-Ef6t4d_vRqyAjC(VE-tw;n19QwK5*iGPQuo%$_}4rKF_zy5IM^ z0K5y=J9vMjnVX?yh6T(CPecd&2=49&ycS@_b9=e$6@kJbqJK58llhMtxM;$iKZyNA tp1ioA+X|kn(IPodgY5s+65Yib(f<%dOdOR<#lZjo002ovPDHLkV1g3UZRG#} From 46808fa415fa58e49b7c1d8129a5caaaf1ef41c3 Mon Sep 17 00:00:00 2001 From: DC959 Date: Wed, 16 Mar 2022 08:55:02 +1300 Subject: [PATCH 047/122] Reupload seiko with fixed images and directory name --- apps/seiko-5actus/ChangeLog | 1 + apps/seiko-5actus/README.md | 16 +++ apps/seiko-5actus/app-icon.js | 1 + apps/seiko-5actus/metadata.json | 17 +++ apps/seiko-5actus/screenshot.png | Bin 0 -> 3438 bytes apps/seiko-5actus/seiko-5actus.js | 181 +++++++++++++++++++++++++++++ apps/seiko-5actus/seiko-5actus.png | Bin 0 -> 2375 bytes 7 files changed, 216 insertions(+) create mode 100644 apps/seiko-5actus/ChangeLog create mode 100644 apps/seiko-5actus/README.md create mode 100644 apps/seiko-5actus/app-icon.js create mode 100644 apps/seiko-5actus/metadata.json create mode 100644 apps/seiko-5actus/screenshot.png create mode 100644 apps/seiko-5actus/seiko-5actus.js create mode 100644 apps/seiko-5actus/seiko-5actus.png diff --git a/apps/seiko-5actus/ChangeLog b/apps/seiko-5actus/ChangeLog new file mode 100644 index 000000000..28f11c1c7 --- /dev/null +++ b/apps/seiko-5actus/ChangeLog @@ -0,0 +1 @@ +0.01: Initial Release diff --git a/apps/seiko-5actus/README.md b/apps/seiko-5actus/README.md new file mode 100644 index 000000000..4f09bf3c6 --- /dev/null +++ b/apps/seiko-5actus/README.md @@ -0,0 +1,16 @@ +# Seiko 5actus + +![](screenshot.png) + +This is built on the knowledge of what I gained through designing the rolex watch face and improves on it by getting more done right at the start. + +This watch is modeled after one I personally own and love, I have spent quite a bit of time designing this in a pixel art editor to try and make it as clean as possible and am quite happy with how it came out. + +This watch face works in both the light and dark themes but I personally think it looks a lot cleaner in the dark them. + +This watch whilst technically designed in a way that would work with the BangleJs has been only listed to work with the BangleJs2, if someones wants to test it on a first gen and let me know if it works then i'll allow it to be installed on both devices but I assume with how the images have been designed it would look strange on a first gen watch. + +Special thanks to: +* rozek (for his updated widget draw code for utilization with background images) +* Gordon Williams (Bangle.js, watchapps for reference code and documentation) +* The community (for helping drive such a wonderful project) diff --git a/apps/seiko-5actus/app-icon.js b/apps/seiko-5actus/app-icon.js new file mode 100644 index 000000000..796f24122 --- /dev/null +++ b/apps/seiko-5actus/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkEBpMB+fziAjRCQQXBHyoXEgIRLgMwC5EAj8gC5MC+QXJn4XKBgJHJMhkfJAYXEh/xC5cDBofzJocvIxKiCHpBGNExMCIxi2KeRIJFgMiiYBCkQ1Jh67EAAMSCgICBiQjFn8xDYX/AgQANn4qEgf/JIcDkcxiUSiMRY4cv+ZaFj6bDgZGBkMRDIIXD/7CHn5TDFYIADFIcRSxgAvXQwAQgRyDACcje4wAESQ4RDmMQgSGBj8zAAnyTgauH/65Cj7EBkMicAPyBYIABCgcRkYWCmYvCewMhmUiiMyF4gUBDoXzn7/Dj4RBF4IXB+QrDj40DmJgBiEyBYMDL4qcEgUikYqDCgSGKAAUSn8hbh8BgICBl/yFggwEbhMC/4sHAAcTIhIsBGYLcJGAQOHgLAEGBM/Jg0vRgsQZAMQBAQUBif/AwLJDfoQ1DkDOBkIOCgQDBFAKCDaIRPGSwqGBgM/dwUDeQiZEEAowCgXxb5jGGgQ+GaAjaHeIbmISYToHRYTPKYQIODE4cfEA4AEPghtEgQJCI5Mv+AXHJAiIIBggXFj/xDBMCcAYXGga7LcYIXIUpY1GC4SiJVRAXCiAWJA")) diff --git a/apps/seiko-5actus/metadata.json b/apps/seiko-5actus/metadata.json new file mode 100644 index 000000000..306b2f188 --- /dev/null +++ b/apps/seiko-5actus/metadata.json @@ -0,0 +1,17 @@ +{ "id": "seiko-5actus", + "name": "Seiko 5actus", + "shortName":"5actus", + "icon": "seiko-5actus.png", + "screenshots": [{"url":"screenshot.png"}], + "version":"0.01", + "description": "A watch designed after then Seiko 5actus from the 1970's", + "tags": "clock", + "type": "clock", + "supports":["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"seiko-5actus.js","url":"seiko-5actus.js"}, + {"name":"seiko-5actus.img","url":"app-icon.js","evaluate":true} + ] + } diff --git a/apps/seiko-5actus/screenshot.png b/apps/seiko-5actus/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8638999b50e7a1b6ba68578b282e3034694e43 GIT binary patch literal 3438 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 QIRF3v07*qoM6N<$f { + if (on) { + if (Timeout != null) { clearTimeout(Timeout); Timeout = undefined;} + displayRefresh(); + } +}); + +Bangle.setUI("clock"); +// load widgets after 'setUI' so they're aware there is a clock active +Bangle.loadWidgets(); +displayRefresh(); diff --git a/apps/seiko-5actus/seiko-5actus.png b/apps/seiko-5actus/seiko-5actus.png new file mode 100644 index 0000000000000000000000000000000000000000..73f1b81649f720c832209a70ee446661659b0481 GIT binary patch literal 2375 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 literal 0 HcmV?d00001 From f4387fca64d9a99465522305c716442d63f9ac93 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 21:24:45 +0100 Subject: [PATCH 048/122] First entry of my 1024 Game (v0.5) --- apps/game1024/Changelog | 2 + apps/game1024/app-icon.js | 1 + apps/game1024/app.js | 682 ++++++++++++++++++++++++++++++++ apps/game1024/game1024.app.info | 6 + apps/game1024/game1024.json | 1 + apps/game1024/game1024.png | Bin 0 -> 1768 bytes apps/game1024/metadata.json | 13 + 7 files changed, 705 insertions(+) create mode 100644 apps/game1024/Changelog create mode 100644 apps/game1024/app-icon.js create mode 100644 apps/game1024/app.js create mode 100644 apps/game1024/game1024.app.info create mode 100644 apps/game1024/game1024.json create mode 100644 apps/game1024/game1024.png create mode 100644 apps/game1024/metadata.json diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog new file mode 100644 index 000000000..310242d11 --- /dev/null +++ b/apps/game1024/Changelog @@ -0,0 +1,2 @@ +0.01: New App! +0.5: First version in Github \ No newline at end of file diff --git a/apps/game1024/app-icon.js b/apps/game1024/app-icon.js new file mode 100644 index 000000000..2a9df2fa3 --- /dev/null +++ b/apps/game1024/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwg96xAACCqMICwYABwAsSAAoWWDBhEGJSAWLGBQuMGBQWNGBAuH/84GBoNGx///AwMFxH/mQYHGAgXHn//GIIXLIo84nAxBwZIKFo4YBMAM/PQwXJCwIABn8y//zC5BeFwYXDmaSCGApgCC4oRBAAQ0CwYwFC5BeB/GCkY0B+YHBC452H+YqBSYRgJUw7tCAYIZCC6ApBU4TZHC44rCJAJgCR4wXLIgMzC4MzF55ICSYUzC6bZDPgIXOJAYACLwwXCa4oXHBgzvIJAzVGC7ZgHwXdAAXSLxAXIpvUkUilvdC6Pd7ADBwndlAXJMAwXLLwYXI6Wq1RHBC5RIGCYIAC6hGJGA6nKFwp5IABAWGbRDUKGCYWIGBouJGBoWKDBYWMJRBELGRQVRAE4A==")) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js new file mode 100644 index 000000000..52f82cdeb --- /dev/null +++ b/apps/game1024/app.js @@ -0,0 +1,682 @@ +const debugMode = 'development'; // valid values are: off, test, production, development +const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; +const rows = 4, cols = 4; +const borderWidth = 6; +const sqWidth = (Math.floor(Bangle.appRect.w - 48) / rows) - borderWidth; +const cellColors = [{bg:'#CCFFFF', fg: '#000000'}, + {bg:'#FF9966', fg: '#000000'}, {bg:'#330033', fg: '#FFFFFF'}, {bg:'#6600FF', fg: '#FFFFFF'}, {bg:'#33CC66', fg: '#000000'}, + {bg:'#990000', fg: '#FFFFFF'}, {bg:'#99FF66', fg: '#000000'}, {bg:'#0033CC', fg: '#FFFFFF'}, {bg:'#CCFF00', fg: '#000000'}, + {bg:'#00CC00', fg: '#FFFFFF'}, {bg:'#FF0000', fg: '#FFFFFF'}]; +const cellFgColor = '#000000'; +const cellShadowColor = '#f2f2f2'; +const cellFonts = ["12x20", "12x20", "Vector:14"]; +const cellChars = [ + [0,1,2,3,4,5,6,7,8,9,10], + ['0','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], + ['0','I', 'II', 'III', 'IV', 'V', 'VI', 'VII','VIII', 'IX', 'X'] +]; +// const numInitialCells = 2; +const maxUndoLevels = 4; +const noExceptions = true; +let charIndex = 0; // plain numbers on the grid + + + +const scores = { + currentScore: 0, + highScore: 0, + lastScores: [0], + add: function(val) { + this.currentScore = this.currentScore + Math.pow(2, val); + debug(console.log("new score=",this.currentScore)); + }, + addToUndo: function () { + this.lastScores.push(this.currentScore); + if (this.lastScores.length > maxUndoLevels) this.lastScores.shift(); + }, + undo: function () { + this.currentScore = this.lastScores.pop(); + debug(console.log("undo score =", this.currentScore, "rest:", this.lastScores)); + }, + reset: function () { + this.currentScore = 0; + this.lastScores = [0]; + }, + draw: function () { + g.setColor(btnAtribs.fg); + let ulCorner = {x: Bangle.appRect.x + 6, y: Bangle.appRect.y2 -22 }; + let lrCorner = {x: Bangle.appRect.x2, y: Bangle.appRect.y2 - 1}; + g.fillRect(ulCorner.x, ulCorner.y, lrCorner.x, lrCorner.y); + g.setFont12x20(1); + g.setFontAlign(0,0,0); + let scrX = Math.floor((ulCorner.x + lrCorner.x)/3); + let scrY = Math.floor((ulCorner.y + lrCorner.y)/2) + 1; + g.setColor('#000000'); + g.drawString(this.currentScore, scrX+1, scrY+1); + g.setColor(btnAtribs.bg); + g.drawString(this.currentScore, scrX, scrY); + scrX = Math.floor(4*(ulCorner.x + lrCorner.x)/5); + g.setFont("6x8:1x2"); + g.drawString(this.highScore, btnAtribs.x + Math.floor(btnAtribs.w/2), scrY); + }, + hsContents: function () { + return {"highScore": this.highScore, "lastScore": this.currentScore}; + }, + check: function () { + this.highScore = (this.currentScore > this.highScore) ? this.currentScore : this.highScore; + debug(console.log('highScore =', this.highScore)); + } +}; + +// snapshot interval is the number of moves after wich a snapshot is wriiten to file +const snInterval = 1; + +const snReadOnInit = true; +// a snapshot contains a json file dump of the last positions of the tiles on the board, including the scores +const snapshot = { + interval: snInterval, + snFileName: 'game1024.json', + counter: 0, + updCounter: function() { + this.counter = ++this.counter > this.interval ? 0 : this.counter; + }, + dump: {gridsize: rows * cols, expVals: [], score: 0, highScore: 0, charIndex: charIndex}, + write: function() { + require("Storage").writeJSON(this.snFileName, this.dump); + }, + read: function () { + let sn = require("Storage").readJSON(this.snFileName, noExceptions); + if ((typeof sn == "undefined") || (sn.gridsize !== rows * cols)) { + require("Storage").writeJSON(this.snFileName, this.dump); + return false; + } else { + if ((typeof sn !== "undefined") && (sn.gridsize == rows * cols)){ + this.dump = sn; + return true; + } + } + }, + setDump: function () { + this.dump.expVals = []; + allSquares.forEach(sq => { + this.dump.expVals.push(sq.expVal); + }); + this.dump.score = scores.currentScore; + this.dump.highScore = scores.highScore; + this.dump.charIndex = charIndex; + }, + make: function () { + this.updCounter(); + if (this.counter == this.interval) { + this.setDump(); + this.write(); + debug(console.log("D U M P E D!", this.dump)); + } + }, + recover: function () { + if (this.read()) { + this.dump.expVals.forEach((val, idx) => { + allSquares[idx].setExpVal(val); + }); + scores.currentScore = this.dump.score ? this.dump.score : 0; + scores.highScore = this.dump.highScore ? this.dump.highScore : 0 ; + charIndex = this.dump.charIndex ? this.dump.charIndex : 0 ; + } + }, + reset: function () { + this.dump.gridsize = rows * cols; + this.dump.expVals = []; + for (let i = 0; i< this.dump.gridsize; i++) { + this.dump.expVals[i] = 0; + } + this.dump.score = scores.currentScore; + this.dump.charIndex = charIndex; + this.write(); + debug(console.log("reset D U M P E D!", this.dump)); + } +}; +const btnAtribs = {x: 134, w: 42, h: 42, fg:'#B5E61D', bg:'#870014'}; +const buttons = { + all: [], + draw: function () { + this.all.forEach(btn => { + btn.draw(); + }); + }, + add: function(btn) { + this.all.push(btn); + } +}; +/** + * to the right = -1 + all tiles move to the left, begin with the outer righthand side tiles + moving 0 to max 3 places to the right + + find first tile beginning with bottom row, righthand side + */ + +const mover = { + direction: { + up: {name: 'up', step: 1, innerBegin: 0, innerEnd: rows-1, outerBegin: 0, outerEnd: cols-1, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m < rows -1 ? (m+1)*(cols) + n : -1;} + }, + down: {name: 'down', step:-1, innerBegin: rows-1, innerEnd: 0, outerBegin: cols-1, outerEnd: 0, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m > 0 ? (m-1)*(cols) + n : -1;} + }, + left: {name: 'left', step: 1, innerBegin: 0, innerEnd: cols-1, outerBegin: 0, outerEnd: rows-1, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m < cols -1 ? n*(rows) + m +1 : -1;} + }, + right: {name: 'right', step:-1, innerBegin: cols-1, innerEnd: 0, outerBegin: rows-1, outerEnd: 0, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m > 0 ? n*(rows) + m -1: -1;} + } + }, + anyLeft: function() { + let canContinue = false; + [this.direction.up,this.direction.left].forEach (dir => { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + if (allSquares[idx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + if (nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + canContinue = true; // equal adjacent cells > 0 found + break; + } + if (allSquares[nextIdx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + } + if (canContinue) break; + } + if (canContinue) break; + } + }); + return canContinue; + }, + nonEmptyCells: function (dir) { + debug(console.log("Move: ", dir.name)); + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // let rowStr = '| '; + + // Move a number of iteration with the squares to move them all to one side + for (let iter = 0; iter < dir.iter; iter++) { + + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + // get the array of squares index for current cell + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if (allSquares[idx].expVal == 0 && nextIdx >= 0) { + allSquares[idx].setExpVal(allSquares[nextIdx].expVal); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + }, + // add up the conjacent squares with identical values en set next square to empty in the process + mergeEqlCells: function(dir) { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if ((allSquares[idx].expVal > 0) && nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + let expVal = allSquares[idx].expVal; + allSquares[idx].setExpVal(++expVal); + allSquares[idx].addToScore(); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + } +}; +// Minimum number of pixels to interpret it as drag gesture +const dragThreshold = 10; + +// Maximum number of pixels to interpret a click from a drag event series +const clickThreshold = 3; + +let allSquares = []; +// let buttons = []; + +class Button { + constructor(name, x0, y0, width, height, text, bg, fg, cb, enabled) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + height; + this.name = name; + this.cb = cb; + this.text = text; + this.bg = bg; + this.fg = fg; + this.font = "6x8:3"; + this.enabled = enabled; + } + disable() { + this.enabled = false; + } + enable() { + this.enabled = true; + } + draw() { + g.setColor(this.bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + g.setFont(this.font); + g.setFontAlign(0,0,0); + let strX = Math.floor((this.x0+this.x1)/2); + let strY = Math.floor((this.y0+this.y1)/2); + g.setColor("#000000"); + g.drawString(this.text, strX+2, strY+2); + g.setColor(this.fg); + g.drawString(this.text, strX, strY); + // buttons.push(this); + } + onClick() {if (typeof this.cb === 'function' && this.enabled) { + this.cb(this); + } + } +} + +class Cell { + constructor(x0, y0, width, idx, cb) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + width; + this.expVal = 0; + this.previousExpVals=[]; + this.idx = idx; + this.cb = cb; + } + getColor(i) { + return cellColors[i >= cellColors.length ? cellColors.length -1 : i]; + } + drawBg() { + g.setColor(this.getColor(this.expVal).bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + } + drawNumber() { + if (this.expVal !== 0) { + g.setFont(cellFonts[charIndex]); + g.setFontAlign(0,0,0); + let char = cellChars[charIndex][this.expVal]; + let strX = Math.floor((this.x0 + this.x1)/2); + let strY = Math.floor((this.y0 + this.y1)/2); + // g.setColor(cellShadowColor); + // g.drawString(this.expVal, strX+1, strY+1); + g.setColor(this.getColor(this.expVal).fg); + g.drawString(char, strX, strY); + } + } + setExpVal(val) { + this.expVal = val; + } + getIdx() {return this.idx;} + pushToUndo() { + // remember this new step + this.previousExpVals.push(this.expVal); + // keep the undo list not longer than max undo levels + if (this.previousExpVals.length > maxUndoLevels) this.previousExpVals.shift(); + } + popFromUndo() { + // take one step back + if (this.previousExpVals.length > 0) { + this.expVal = this.previousExpVals.pop(); + } + } + removeUndo() { + this.previousExpVals=[0]; + } + addToScore() {if (typeof this.cb === 'function') { + this.cb(this.expVal); + } + } +} + +function undoGame() { + g.clear(); + if (scores.lastScores.length > 0) { + allSquares.forEach(sq => { + sq.popFromUndo(); + sq.drawBg(); + sq.drawNumber(); + }); + scores.undo(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + snapshot.make(); + } + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function addToUndo() { + allSquares.forEach(sq => { + sq.pushToUndo(); + }); + scores.addToUndo(); +} +function addToScore (val) { + scores.add(val); + if (val == 10) messageYouWin(); +} +function createGrid () { + let cn =0; + for (let r = 0; r < rows; r++) { + for (let c = 0; c < cols; c++) { + let x0 = borderWidth + c*(borderWidth + sqWidth) - (rows/2)*(2*borderWidth + sqWidth) + middle.x + Math.floor(sqWidth/3); + let y0 = borderWidth + r*(borderWidth + sqWidth) - (cols/2)*(2*borderWidth + sqWidth) + middle.y + Math.floor(sqWidth/3); + let cell = new Cell(x0, y0, sqWidth, c + r*cols, addToScore); + allSquares.push(cell); + } + } +} +function messageGameOver () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("G A M E", middle.x+13, middle.y-24); + g.drawString("O V E R !", middle.x+13, middle.y+24); + g.setColor("#ffffff"); + g.drawString("G A M E", middle.x+12, middle.y-25); + g.drawString("O V E R !", middle.x+12, middle.y+25); +} +function messageYouWin () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("YOU HAVE", middle.x+18, middle.y-24); + g.drawString("W O N ! !", middle.x+18, middle.y+24); + g.setColor("#FF0808"); + g.drawString("YOU HAVE", middle.x+17, middle.y-25); + g.drawString("W O N ! !", middle.x+17, middle.y+25); + Bangle.buzz(200, 1); +} +function makeRandomNumber () { + return Math.ceil(2*Math.random()); +} +function addRandomNumber() { + let emptySquaresIdxs = []; + allSquares.forEach(sq => { + if (sq.expVal == 0) emptySquaresIdxs.push(sq.getIdx()); + }); + if (emptySquaresIdxs.length > 0) { + let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() ); + allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber()); + } +} +function drawGrid() { + allSquares.forEach(sq => { + sq.drawBg(); + sq.drawNumber(); + }); +} +function initGame() { + g.clear(); + // scores.read(); + createGrid(); + if (snReadOnInit) { + snapshot.recover(); + debug(console.log("R E C O V E R E D !", snapshot.dump)); + let sum = allSquares.reduce((t,v) => { return t + v ;}); + if (!sum) { + addRandomNumber(); + } + } else { + addRandomNumber(); + // addToUndo(); + } + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + // Clock mode allows short-press on button to exit + Bangle.setUI("clock"); + // Load widgets + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function drawPopUp(message,cb) { + g.setColor('#FFFFFF'); + let rDims = Bangle.appRect; + g.fillPoly([rDims.x+10, rDims.y+20, + rDims.x+20, rDims.y+10, + rDims.x2-30, rDims.y+10, + rDims.x2-20, rDims.y+20, + rDims.x2-20, rDims.y2-40, + rDims.x2-30, rDims.y2-30, + rDims.x+20, rDims.y2-30, + rDims.x+10, rDims.y2-40 + ]); + buttons.all.forEach(btn => {btn.disable();}); + const btnYes = new Button('yes', rDims.x+16, rDims.y2-80, 54, btnAtribs.h, 'YES', btnAtribs.fg, btnAtribs.bg, cb, true); + const btnNo = new Button('no', rDims.x2-80, rDims.y2-80, 54, btnAtribs.h, 'NO', btnAtribs.fg, btnAtribs.bg, cb, true); + btnYes.draw(); + btnNo.draw(); + g.setColor('#000000'); + g.setFont12x20(1); + g.setFontAlign(-1,-1,0); + g.drawString(message, rDims.x+20, rDims.y+20); + buttons.add(btnYes); + buttons.add(btnNo); +} +function handlePopUpClicks(btn) { + const name = btn.name; + buttons.all.pop(); // remove the no button + buttons.all.pop(); // remove the yes button + buttons.all.forEach(b => {b.enable();}); // enable the remaining buttons again + debug(console.log("Button name =", name)); + switch (name) { + case 'yes': + resetGame(); + break; + default: + g.clear(); + drawGrid(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } +} +function resetGame() { + g.clear(); + scores.reset(); + allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();}); + addRandomNumber(); + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} + +/** + * Function that can be used in test or development environment, or production. + * Depends on global constant EFTriggerDebugMode + * @param {function} func function to call like console.log() + */ + const debug = (func) => { + switch (debugMode) { + case "development": + // console.log("Development"); + if (typeof func === 'function') { + func(); + } + break; + case "test" : + console.log("--- test ---"); + if (typeof func === 'function') { + func(); + } + break; + case "off": + case "production": // ignore func + default: break; + } +}; +const test = { + drawAllColors: function(i) { + charIndex = i>2 ? 0 : i<0 ? 0 : i; + allSquares.forEach((sq,i) => { + let c = i<11 ? i : i-10; + sq.setExpVal(c); + debug(console.log("c=",c)); + }); + drawGrid(); + }, + youWin: function() { + messageYouWin(); + }, + gameOver: function() { + messageGameOver(); + } +}; + +// Handle a "click" event (only needed for menu button) +function handleclick(e) { + buttons.all.forEach(btn => { + if ((e.x >= btn.x0) && (e.x <= btn.x1) && (e.y >= btn.y0) && (e.y <= btn.y1)) { + btn.onClick(); + debug(console.log(btn.name)); + } + }); +} + +// Handle a drag event (moving the stones around) +function handledrag(e) { + /*debug(Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? e => console.log('To the right') : e => console.log('To the left') ) : + (e.dy > 0 ? e => console.log('Move down') : e => console.log('Move up') )); + */ + // [move.right, move.left, move.up, move.down] + runGame((Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? mover.direction.right : mover.direction.left ) : + (e.dy > 0 ? mover.direction.down : mover.direction.up ))); +} +// Evaluate "drag" events from the UI and call handlers for drags or clicks +// The UI sends a drag as a series of events indicating partial movements +// of the finger. +// This class combines such parts to a long drag from start to end +// If the drag is short, it is interpreted as click, +// otherwise as drag. +// The approprate method is called with the data of the drag. +class Dragger { + + constructor(clickHandler, dragHandler, clickThreshold, dragThreshold) { + this.clickHandler = clickHandler; + this.dragHandler = dragHandler; + this.clickThreshold = (clickThreshold === undefined ? 3 : clickThreshold); + this.dragThreshold = (dragThreshold === undefined ? 10 : dragThreshold); + this.dx = 0; + this.dy = 0; + this.enabled = true; + } + + // Enable or disable the Dragger + setEnabled(b) { + this.enabled = b; + } + + // Handle a raw drag event from the UI + handleRawDrag(e) { + if (!this.enabled) + return; + this.dx += e.dx; // Always accumulate + this.dy += e.dy; + if (e.b === 0) { // Drag event ended: Evaluate full drag + if (Math.abs(this.dx) < this.clickThreshold && Math.abs(this.dy) < this.clickThreshold) + this.clickHandler({ + x: e.x - this.dx, + y: e.y - this.dy + }); // take x and y from the drag start + else if (Math.abs(this.dx) > this.dragThreshold || Math.abs(this.dy) > this.dragThreshold) + this.dragHandler({ + x: e.x - this.dx, + y: e.y - this.dy, + dx: this.dx, + dy: this.dy + }); + this.dx = 0; // Clear the drag accumulator + this.dy = 0; + } + } + + // Attach the drag evaluator to the UI + attach() { + Bangle.on("drag", e => this.handleRawDrag(e)); + } +} + +// Dragger is needed for interaction during the game +var dragger = new Dragger(handleclick, handledrag, clickThreshold, dragThreshold); + +// Disable dragger as board is not yet initialized +dragger.setEnabled(false); + +// Nevertheless attach it so that it is ready once the game starts +dragger.attach(); + +function runGame(dir){ + addToUndo(); + updUndoLvlIndex(); + mover.nonEmptyCells(dir); + mover.mergeEqlCells(dir); + mover.nonEmptyCells(dir); + addRandomNumber(); + drawGrid(); + scores.check(); + scores.draw(); + // scores.write(); + snapshot.make(); + dragger.setEnabled(true); + if (!(mover.anyLeft())) { + debug(console.log("G A M E O V E R !!")); + snapshot.reset(); + messageGameOver(); + } +} + +function updUndoLvlIndex() { + let x = 170; + let y = 60; + g.setColor(btnAtribs.fg); + g.fillRect(x-6,y-6, 176, 67); + if (scores.lastScores.length > 0) { + g.setColor("#000000"); + g.setFont("4x6:2"); + g.drawString(scores.lastScores.length, x, y); + } +} +function incrCharIndex() { + charIndex++; + if (charIndex >= cellChars.length) charIndex = 0; + drawGrid(); +} +buttons.add(new Button('undo', btnAtribs.x, 25, btnAtribs.w, btnAtribs.h, 'U', btnAtribs.fg, btnAtribs.bg, undoGame, true)); +buttons.add(new Button('chars', btnAtribs.x, 71, btnAtribs.w, 31, '*', btnAtribs.fg, btnAtribs.bg, function(){incrCharIndex();}, true)); +buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R', btnAtribs.fg, btnAtribs.bg, function(){drawPopUp('Do you want\nto restart?',handlePopUpClicks);}, true)); + +initGame(); + +dragger.setEnabled(true); diff --git a/apps/game1024/game1024.app.info b/apps/game1024/game1024.app.info new file mode 100644 index 000000000..b1c9d84ce --- /dev/null +++ b/apps/game1024/game1024.app.info @@ -0,0 +1,6 @@ +require("Storage").write("timer.info",{ + "id":"game1024", + "name":"1024 Game", + "src":"game1024.app.js", + "icon":"game1024.img" +}); \ No newline at end of file diff --git a/apps/game1024/game1024.json b/apps/game1024/game1024.json new file mode 100644 index 000000000..3749649ee --- /dev/null +++ b/apps/game1024/game1024.json @@ -0,0 +1 @@ +{"gridsize": 16, "expVals": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "score": 0, "highScore": 0, "charIndex": 1} \ No newline at end of file diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4118dd3ca0de7e48b2944f9bbaae606cf9647d8f GIT binary patch literal 1768 zcmVP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5Z6$WWauh>AFBD-@wZs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCNG^=L<&~)3( zq!MB-zbb}a5kwdf#1W90Wz0)b8ouM}9s$1I#d((hxj#olEm#Z)h{SWuFm2)u;+aj` z;Ji;9Wo204L)D#X^Sm6F&Z7*DsMvAy);A z91EyHgY5dj|KNAGR&i?5OA04|-WSLD7zIMRK&#<6-^Y&AIst;uz?I(d*P6iWC+Urj z7CQn4wtHLth!K29HiEOnK>0S*p< zu@Ysk`@FlaySIPOwEO!3C_QqCyM6Kv00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-{s3=SC+6rWO?0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbR z(n&-?RA}Dqm~Bi`R~W~Cw*^W8UCRVBlnGUhzQHxnq`y4V1{4V zmYAqpVsth!Q$tLKS;T181w|9Xq8&>M^MxW=g(#~!CV~+$fo{C>7{_r(a2be+i(&oN^;l{wSdUo$ALoEzG_m%FI>JBMMoY(azuN4j*~GsX zPw|>!4q6XVaiHSK7V%il1ORh|8FPhs;v{|`114A~7+I*yAaB!5HsO(2DBlsduBy{b z!NEektzEQMHgMhY2XFnn8ts%Q_6I7wfvXIy1=G^xu$@nsld`HwU5N5sc7^O<6Fd%2%--LZz;<{k|^Qn8{(Hw z_tW%^1$XbD@&?EuuW;$w}Oi7JXwg&P(gY4zt^TCa7IJOtrEL6OvnBJaVRu!!B`B5L!G6dEOHrvy&1CM23PS_mG zGtF4iEbL6!NhtnVLXx0*cPH;JJjLE^m$-9B8g+FAn+=aB-v92$t}e3ec6N7mBK{*= z9?L+UK99D6HdeQ;MwCQ~bVYvk*E)t!sRSy2%_J^COZ)kOe>Z9{@NGiE{m-34L)`Fs z`6(j{oZ8*+t9?8X9gd=Cy@794C5Z%^#=HaN_1oJfcX$ty@eB4_C&(T+LjpbF6Gk z-biClBQ*mxe)aK55u82U$2;>*Qg`G!Nhy;?E#kH9?S$9Y)8cXwuhsH=SQu}fKFyHN z$E%T%51+&n=fK3Z%CpWwl``_qcsK7VC3)A0M!_VTvmU6i{J@WPw(9h!YzOWQ{elI& zy=4mkqR+>^oScA@IO{uTIo3wurYuE+%UKw~%$G-QB#ztrX};i-6e04AU>7k*?#VbjXxV@76B95OuoA)dhvUco12=z~xzt>%6)*Ca%B|SR2 zeK;?95k-mf?Zfg6+_c--pPS18qY;%_O=8jLgxPbYpV*i5gp9-L-y22Cbo_Rvf9wzS zk|-ht=pGkOUSU_!-}n%lsN?ky(-bw3mO7a)Hg(81kWx~@yn+IJ!^2#4I%%&O{q`)g zFon#*6aWr>Rj+vP0Bbj19$Ob`Eib3FynM`mv|_{J36yvyQQ|LfmGqg4p;7q&0000< KMNUMnLSTZhfk=Y@ literal 0 HcmV?d00001 diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json new file mode 100644 index 000000000..e4b7c9e6f --- /dev/null +++ b/apps/game1024/metadata.json @@ -0,0 +1,13 @@ +{ "id": "game1024", + "name": "1024 Game", + "shortName" : "1024 Game", + "icon": "game1024.img", + "description": "Join the numbers and get to the 1024 tile!", + "tags": "game puzzle 1024", + "allow_emulator": true, + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"game1024.app.js","url":"app.js"}, + {"name":"game1024.img","url":"app-icon.js","evaluate":true} + ] + } \ No newline at end of file From 299e754d22a93b6c388b63bfad65f502736efc06 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Tue, 15 Mar 2022 21:53:20 +0100 Subject: [PATCH 049/122] hidjoystick: Make BangleJS2 compatible --- apps/hidjoystick/ChangeLog | 1 + apps/hidjoystick/metadata.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/hidjoystick/ChangeLog b/apps/hidjoystick/ChangeLog index 5560f00bc..625daf4bb 100644 --- a/apps/hidjoystick/ChangeLog +++ b/apps/hidjoystick/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Make Bangle.js 2 compatible diff --git a/apps/hidjoystick/metadata.json b/apps/hidjoystick/metadata.json index e2b78a97b..35be134dc 100644 --- a/apps/hidjoystick/metadata.json +++ b/apps/hidjoystick/metadata.json @@ -2,11 +2,11 @@ "id": "hidjoystick", "name": "Bluetooth Joystick", "shortName": "Joystick", - "version": "0.01", + "version": "0.02", "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.", "icon": "app.png", "tags": "bluetooth", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ {"name":"hidjoystick.app.js","url":"app.js"}, {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} From 9daf16f1c047022b962ed5168f36c4f68e8a35da Mon Sep 17 00:00:00 2001 From: Daniel Cox Date: Wed, 16 Mar 2022 10:12:06 +1300 Subject: [PATCH 050/122] Fixed incorrect app name in metadata.json Forgot to add .app before the .js in name so watch face wasn't loading --- apps/seiko-5actus/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/seiko-5actus/metadata.json b/apps/seiko-5actus/metadata.json index 306b2f188..41772e4aa 100644 --- a/apps/seiko-5actus/metadata.json +++ b/apps/seiko-5actus/metadata.json @@ -11,7 +11,7 @@ "readme": "README.md", "allow_emulator": true, "storage": [ - {"name":"seiko-5actus.js","url":"seiko-5actus.js"}, + {"name":"seiko-5actus.app.js","url":"seiko-5actus.js"}, {"name":"seiko-5actus.img","url":"app-icon.js","evaluate":true} ] } From 5797fe1aa5ca32ae8fcd765d754a0e6feaa30031 Mon Sep 17 00:00:00 2001 From: Daniel Cox Date: Wed, 16 Mar 2022 10:24:22 +1300 Subject: [PATCH 051/122] Rename seiko-5actus.js to app.js --- apps/seiko-5actus/{seiko-5actus.js => app.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/seiko-5actus/{seiko-5actus.js => app.js} (100%) diff --git a/apps/seiko-5actus/seiko-5actus.js b/apps/seiko-5actus/app.js similarity index 100% rename from apps/seiko-5actus/seiko-5actus.js rename to apps/seiko-5actus/app.js From 2f3e614f33557e5dbdad9f9600236f2af00fa2d5 Mon Sep 17 00:00:00 2001 From: Daniel Cox Date: Wed, 16 Mar 2022 10:25:44 +1300 Subject: [PATCH 052/122] Update app url to app.js App keeps loading with no app source found so attempting to fix that --- apps/seiko-5actus/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/seiko-5actus/metadata.json b/apps/seiko-5actus/metadata.json index 41772e4aa..da48552e8 100644 --- a/apps/seiko-5actus/metadata.json +++ b/apps/seiko-5actus/metadata.json @@ -11,7 +11,7 @@ "readme": "README.md", "allow_emulator": true, "storage": [ - {"name":"seiko-5actus.app.js","url":"seiko-5actus.js"}, + {"name":"seiko-5actus.app.js","url":"app.js"}, {"name":"seiko-5actus.img","url":"app-icon.js","evaluate":true} ] } From 8bca10c3c56eafea345de2ba2e600f140b2a55e2 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 23:52:08 +0100 Subject: [PATCH 053/122] Added app iocon game1024.png --- apps/game1024/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index e4b7c9e6f..80dc59c47 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "icon": "game1024.img", + "icon": "game1024.png", "description": "Join the numbers and get to the 1024 tile!", "tags": "game puzzle 1024", "allow_emulator": true, From 87451c8ed143e65f683c932add04e6f8579e68c1 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 21:24:45 +0100 Subject: [PATCH 054/122] First entry of my 1024 Game (v0.5) --- apps/game1024/Changelog | 2 + apps/game1024/app-icon.js | 1 + apps/game1024/app.js | 682 ++++++++++++++++++++++++++++++++ apps/game1024/game1024.app.info | 6 + apps/game1024/game1024.json | 1 + apps/game1024/game1024.png | Bin 0 -> 1768 bytes apps/game1024/metadata.json | 13 + 7 files changed, 705 insertions(+) create mode 100644 apps/game1024/Changelog create mode 100644 apps/game1024/app-icon.js create mode 100644 apps/game1024/app.js create mode 100644 apps/game1024/game1024.app.info create mode 100644 apps/game1024/game1024.json create mode 100644 apps/game1024/game1024.png create mode 100644 apps/game1024/metadata.json diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog new file mode 100644 index 000000000..310242d11 --- /dev/null +++ b/apps/game1024/Changelog @@ -0,0 +1,2 @@ +0.01: New App! +0.5: First version in Github \ No newline at end of file diff --git a/apps/game1024/app-icon.js b/apps/game1024/app-icon.js new file mode 100644 index 000000000..2a9df2fa3 --- /dev/null +++ b/apps/game1024/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwg96xAACCqMICwYABwAsSAAoWWDBhEGJSAWLGBQuMGBQWNGBAuH/84GBoNGx///AwMFxH/mQYHGAgXHn//GIIXLIo84nAxBwZIKFo4YBMAM/PQwXJCwIABn8y//zC5BeFwYXDmaSCGApgCC4oRBAAQ0CwYwFC5BeB/GCkY0B+YHBC452H+YqBSYRgJUw7tCAYIZCC6ApBU4TZHC44rCJAJgCR4wXLIgMzC4MzF55ICSYUzC6bZDPgIXOJAYACLwwXCa4oXHBgzvIJAzVGC7ZgHwXdAAXSLxAXIpvUkUilvdC6Pd7ADBwndlAXJMAwXLLwYXI6Wq1RHBC5RIGCYIAC6hGJGA6nKFwp5IABAWGbRDUKGCYWIGBouJGBoWKDBYWMJRBELGRQVRAE4A==")) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js new file mode 100644 index 000000000..52f82cdeb --- /dev/null +++ b/apps/game1024/app.js @@ -0,0 +1,682 @@ +const debugMode = 'development'; // valid values are: off, test, production, development +const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; +const rows = 4, cols = 4; +const borderWidth = 6; +const sqWidth = (Math.floor(Bangle.appRect.w - 48) / rows) - borderWidth; +const cellColors = [{bg:'#CCFFFF', fg: '#000000'}, + {bg:'#FF9966', fg: '#000000'}, {bg:'#330033', fg: '#FFFFFF'}, {bg:'#6600FF', fg: '#FFFFFF'}, {bg:'#33CC66', fg: '#000000'}, + {bg:'#990000', fg: '#FFFFFF'}, {bg:'#99FF66', fg: '#000000'}, {bg:'#0033CC', fg: '#FFFFFF'}, {bg:'#CCFF00', fg: '#000000'}, + {bg:'#00CC00', fg: '#FFFFFF'}, {bg:'#FF0000', fg: '#FFFFFF'}]; +const cellFgColor = '#000000'; +const cellShadowColor = '#f2f2f2'; +const cellFonts = ["12x20", "12x20", "Vector:14"]; +const cellChars = [ + [0,1,2,3,4,5,6,7,8,9,10], + ['0','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], + ['0','I', 'II', 'III', 'IV', 'V', 'VI', 'VII','VIII', 'IX', 'X'] +]; +// const numInitialCells = 2; +const maxUndoLevels = 4; +const noExceptions = true; +let charIndex = 0; // plain numbers on the grid + + + +const scores = { + currentScore: 0, + highScore: 0, + lastScores: [0], + add: function(val) { + this.currentScore = this.currentScore + Math.pow(2, val); + debug(console.log("new score=",this.currentScore)); + }, + addToUndo: function () { + this.lastScores.push(this.currentScore); + if (this.lastScores.length > maxUndoLevels) this.lastScores.shift(); + }, + undo: function () { + this.currentScore = this.lastScores.pop(); + debug(console.log("undo score =", this.currentScore, "rest:", this.lastScores)); + }, + reset: function () { + this.currentScore = 0; + this.lastScores = [0]; + }, + draw: function () { + g.setColor(btnAtribs.fg); + let ulCorner = {x: Bangle.appRect.x + 6, y: Bangle.appRect.y2 -22 }; + let lrCorner = {x: Bangle.appRect.x2, y: Bangle.appRect.y2 - 1}; + g.fillRect(ulCorner.x, ulCorner.y, lrCorner.x, lrCorner.y); + g.setFont12x20(1); + g.setFontAlign(0,0,0); + let scrX = Math.floor((ulCorner.x + lrCorner.x)/3); + let scrY = Math.floor((ulCorner.y + lrCorner.y)/2) + 1; + g.setColor('#000000'); + g.drawString(this.currentScore, scrX+1, scrY+1); + g.setColor(btnAtribs.bg); + g.drawString(this.currentScore, scrX, scrY); + scrX = Math.floor(4*(ulCorner.x + lrCorner.x)/5); + g.setFont("6x8:1x2"); + g.drawString(this.highScore, btnAtribs.x + Math.floor(btnAtribs.w/2), scrY); + }, + hsContents: function () { + return {"highScore": this.highScore, "lastScore": this.currentScore}; + }, + check: function () { + this.highScore = (this.currentScore > this.highScore) ? this.currentScore : this.highScore; + debug(console.log('highScore =', this.highScore)); + } +}; + +// snapshot interval is the number of moves after wich a snapshot is wriiten to file +const snInterval = 1; + +const snReadOnInit = true; +// a snapshot contains a json file dump of the last positions of the tiles on the board, including the scores +const snapshot = { + interval: snInterval, + snFileName: 'game1024.json', + counter: 0, + updCounter: function() { + this.counter = ++this.counter > this.interval ? 0 : this.counter; + }, + dump: {gridsize: rows * cols, expVals: [], score: 0, highScore: 0, charIndex: charIndex}, + write: function() { + require("Storage").writeJSON(this.snFileName, this.dump); + }, + read: function () { + let sn = require("Storage").readJSON(this.snFileName, noExceptions); + if ((typeof sn == "undefined") || (sn.gridsize !== rows * cols)) { + require("Storage").writeJSON(this.snFileName, this.dump); + return false; + } else { + if ((typeof sn !== "undefined") && (sn.gridsize == rows * cols)){ + this.dump = sn; + return true; + } + } + }, + setDump: function () { + this.dump.expVals = []; + allSquares.forEach(sq => { + this.dump.expVals.push(sq.expVal); + }); + this.dump.score = scores.currentScore; + this.dump.highScore = scores.highScore; + this.dump.charIndex = charIndex; + }, + make: function () { + this.updCounter(); + if (this.counter == this.interval) { + this.setDump(); + this.write(); + debug(console.log("D U M P E D!", this.dump)); + } + }, + recover: function () { + if (this.read()) { + this.dump.expVals.forEach((val, idx) => { + allSquares[idx].setExpVal(val); + }); + scores.currentScore = this.dump.score ? this.dump.score : 0; + scores.highScore = this.dump.highScore ? this.dump.highScore : 0 ; + charIndex = this.dump.charIndex ? this.dump.charIndex : 0 ; + } + }, + reset: function () { + this.dump.gridsize = rows * cols; + this.dump.expVals = []; + for (let i = 0; i< this.dump.gridsize; i++) { + this.dump.expVals[i] = 0; + } + this.dump.score = scores.currentScore; + this.dump.charIndex = charIndex; + this.write(); + debug(console.log("reset D U M P E D!", this.dump)); + } +}; +const btnAtribs = {x: 134, w: 42, h: 42, fg:'#B5E61D', bg:'#870014'}; +const buttons = { + all: [], + draw: function () { + this.all.forEach(btn => { + btn.draw(); + }); + }, + add: function(btn) { + this.all.push(btn); + } +}; +/** + * to the right = -1 + all tiles move to the left, begin with the outer righthand side tiles + moving 0 to max 3 places to the right + + find first tile beginning with bottom row, righthand side + */ + +const mover = { + direction: { + up: {name: 'up', step: 1, innerBegin: 0, innerEnd: rows-1, outerBegin: 0, outerEnd: cols-1, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m < rows -1 ? (m+1)*(cols) + n : -1;} + }, + down: {name: 'down', step:-1, innerBegin: rows-1, innerEnd: 0, outerBegin: cols-1, outerEnd: 0, iter: rows -1, + sqIndex: function (m,n) {return m*(cols) + n;}, sqNextIndex: function (m,n) {return m > 0 ? (m-1)*(cols) + n : -1;} + }, + left: {name: 'left', step: 1, innerBegin: 0, innerEnd: cols-1, outerBegin: 0, outerEnd: rows-1, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m < cols -1 ? n*(rows) + m +1 : -1;} + }, + right: {name: 'right', step:-1, innerBegin: cols-1, innerEnd: 0, outerBegin: rows-1, outerEnd: 0, iter: cols -1, + sqIndex: function (m,n) {return n*(rows) + m;}, sqNextIndex: function (m,n) {return m > 0 ? n*(rows) + m -1: -1;} + } + }, + anyLeft: function() { + let canContinue = false; + [this.direction.up,this.direction.left].forEach (dir => { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + if (allSquares[idx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + if (nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + canContinue = true; // equal adjacent cells > 0 found + break; + } + if (allSquares[nextIdx].expVal == 0) { + canContinue = true; // there is an empty cell found + break; + } + } + if (canContinue) break; + } + if (canContinue) break; + } + }); + return canContinue; + }, + nonEmptyCells: function (dir) { + debug(console.log("Move: ", dir.name)); + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // let rowStr = '| '; + + // Move a number of iteration with the squares to move them all to one side + for (let iter = 0; iter < dir.iter; iter++) { + + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + // get the array of squares index for current cell + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if (allSquares[idx].expVal == 0 && nextIdx >= 0) { + allSquares[idx].setExpVal(allSquares[nextIdx].expVal); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + }, + // add up the conjacent squares with identical values en set next square to empty in the process + mergeEqlCells: function(dir) { + const step = dir.step; + // outer loop for all colums/rows + for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { + // lets move squares one position in a row or column, counting backwards starting from the and where the squares will end up + for (let m = dir.innerBegin; step*m <= step*dir.innerEnd; m=m+step) { + const idx = dir.sqIndex(m,n); + const nextIdx = dir.sqNextIndex(m,n); + + if ((allSquares[idx].expVal > 0) && nextIdx >= 0) { + if (allSquares[idx].expVal == allSquares[nextIdx].expVal) { + let expVal = allSquares[idx].expVal; + allSquares[idx].setExpVal(++expVal); + allSquares[idx].addToScore(); + allSquares[nextIdx].setExpVal(0); + } + } + } + } + } +}; +// Minimum number of pixels to interpret it as drag gesture +const dragThreshold = 10; + +// Maximum number of pixels to interpret a click from a drag event series +const clickThreshold = 3; + +let allSquares = []; +// let buttons = []; + +class Button { + constructor(name, x0, y0, width, height, text, bg, fg, cb, enabled) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + height; + this.name = name; + this.cb = cb; + this.text = text; + this.bg = bg; + this.fg = fg; + this.font = "6x8:3"; + this.enabled = enabled; + } + disable() { + this.enabled = false; + } + enable() { + this.enabled = true; + } + draw() { + g.setColor(this.bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + g.setFont(this.font); + g.setFontAlign(0,0,0); + let strX = Math.floor((this.x0+this.x1)/2); + let strY = Math.floor((this.y0+this.y1)/2); + g.setColor("#000000"); + g.drawString(this.text, strX+2, strY+2); + g.setColor(this.fg); + g.drawString(this.text, strX, strY); + // buttons.push(this); + } + onClick() {if (typeof this.cb === 'function' && this.enabled) { + this.cb(this); + } + } +} + +class Cell { + constructor(x0, y0, width, idx, cb) { + this.x0 = x0; + this.y0 = y0; + this.x1 = x0 + width; + this.y1 = y0 + width; + this.expVal = 0; + this.previousExpVals=[]; + this.idx = idx; + this.cb = cb; + } + getColor(i) { + return cellColors[i >= cellColors.length ? cellColors.length -1 : i]; + } + drawBg() { + g.setColor(this.getColor(this.expVal).bg); + g.fillRect(this.x0, this.y0, this.x1, this.y1); + } + drawNumber() { + if (this.expVal !== 0) { + g.setFont(cellFonts[charIndex]); + g.setFontAlign(0,0,0); + let char = cellChars[charIndex][this.expVal]; + let strX = Math.floor((this.x0 + this.x1)/2); + let strY = Math.floor((this.y0 + this.y1)/2); + // g.setColor(cellShadowColor); + // g.drawString(this.expVal, strX+1, strY+1); + g.setColor(this.getColor(this.expVal).fg); + g.drawString(char, strX, strY); + } + } + setExpVal(val) { + this.expVal = val; + } + getIdx() {return this.idx;} + pushToUndo() { + // remember this new step + this.previousExpVals.push(this.expVal); + // keep the undo list not longer than max undo levels + if (this.previousExpVals.length > maxUndoLevels) this.previousExpVals.shift(); + } + popFromUndo() { + // take one step back + if (this.previousExpVals.length > 0) { + this.expVal = this.previousExpVals.pop(); + } + } + removeUndo() { + this.previousExpVals=[0]; + } + addToScore() {if (typeof this.cb === 'function') { + this.cb(this.expVal); + } + } +} + +function undoGame() { + g.clear(); + if (scores.lastScores.length > 0) { + allSquares.forEach(sq => { + sq.popFromUndo(); + sq.drawBg(); + sq.drawNumber(); + }); + scores.undo(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + snapshot.make(); + } + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function addToUndo() { + allSquares.forEach(sq => { + sq.pushToUndo(); + }); + scores.addToUndo(); +} +function addToScore (val) { + scores.add(val); + if (val == 10) messageYouWin(); +} +function createGrid () { + let cn =0; + for (let r = 0; r < rows; r++) { + for (let c = 0; c < cols; c++) { + let x0 = borderWidth + c*(borderWidth + sqWidth) - (rows/2)*(2*borderWidth + sqWidth) + middle.x + Math.floor(sqWidth/3); + let y0 = borderWidth + r*(borderWidth + sqWidth) - (cols/2)*(2*borderWidth + sqWidth) + middle.y + Math.floor(sqWidth/3); + let cell = new Cell(x0, y0, sqWidth, c + r*cols, addToScore); + allSquares.push(cell); + } + } +} +function messageGameOver () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("G A M E", middle.x+13, middle.y-24); + g.drawString("O V E R !", middle.x+13, middle.y+24); + g.setColor("#ffffff"); + g.drawString("G A M E", middle.x+12, middle.y-25); + g.drawString("O V E R !", middle.x+12, middle.y+25); +} +function messageYouWin () { + g.setColor("#1a0d00"); + g.setFont12x20(2); + g.setFontAlign(0,0,0); + g.drawString("YOU HAVE", middle.x+18, middle.y-24); + g.drawString("W O N ! !", middle.x+18, middle.y+24); + g.setColor("#FF0808"); + g.drawString("YOU HAVE", middle.x+17, middle.y-25); + g.drawString("W O N ! !", middle.x+17, middle.y+25); + Bangle.buzz(200, 1); +} +function makeRandomNumber () { + return Math.ceil(2*Math.random()); +} +function addRandomNumber() { + let emptySquaresIdxs = []; + allSquares.forEach(sq => { + if (sq.expVal == 0) emptySquaresIdxs.push(sq.getIdx()); + }); + if (emptySquaresIdxs.length > 0) { + let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() ); + allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber()); + } +} +function drawGrid() { + allSquares.forEach(sq => { + sq.drawBg(); + sq.drawNumber(); + }); +} +function initGame() { + g.clear(); + // scores.read(); + createGrid(); + if (snReadOnInit) { + snapshot.recover(); + debug(console.log("R E C O V E R E D !", snapshot.dump)); + let sum = allSquares.reduce((t,v) => { return t + v ;}); + if (!sum) { + addRandomNumber(); + } + } else { + addRandomNumber(); + // addToUndo(); + } + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + // Clock mode allows short-press on button to exit + Bangle.setUI("clock"); + // Load widgets + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} +function drawPopUp(message,cb) { + g.setColor('#FFFFFF'); + let rDims = Bangle.appRect; + g.fillPoly([rDims.x+10, rDims.y+20, + rDims.x+20, rDims.y+10, + rDims.x2-30, rDims.y+10, + rDims.x2-20, rDims.y+20, + rDims.x2-20, rDims.y2-40, + rDims.x2-30, rDims.y2-30, + rDims.x+20, rDims.y2-30, + rDims.x+10, rDims.y2-40 + ]); + buttons.all.forEach(btn => {btn.disable();}); + const btnYes = new Button('yes', rDims.x+16, rDims.y2-80, 54, btnAtribs.h, 'YES', btnAtribs.fg, btnAtribs.bg, cb, true); + const btnNo = new Button('no', rDims.x2-80, rDims.y2-80, 54, btnAtribs.h, 'NO', btnAtribs.fg, btnAtribs.bg, cb, true); + btnYes.draw(); + btnNo.draw(); + g.setColor('#000000'); + g.setFont12x20(1); + g.setFontAlign(-1,-1,0); + g.drawString(message, rDims.x+20, rDims.y+20); + buttons.add(btnYes); + buttons.add(btnNo); +} +function handlePopUpClicks(btn) { + const name = btn.name; + buttons.all.pop(); // remove the no button + buttons.all.pop(); // remove the yes button + buttons.all.forEach(b => {b.enable();}); // enable the remaining buttons again + debug(console.log("Button name =", name)); + switch (name) { + case 'yes': + resetGame(); + break; + default: + g.clear(); + drawGrid(); + scores.draw(); + buttons.draw(); + updUndoLvlIndex(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } +} +function resetGame() { + g.clear(); + scores.reset(); + allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();}); + addRandomNumber(); + addRandomNumber(); + drawGrid(); + scores.draw(); + buttons.draw(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); +} + +/** + * Function that can be used in test or development environment, or production. + * Depends on global constant EFTriggerDebugMode + * @param {function} func function to call like console.log() + */ + const debug = (func) => { + switch (debugMode) { + case "development": + // console.log("Development"); + if (typeof func === 'function') { + func(); + } + break; + case "test" : + console.log("--- test ---"); + if (typeof func === 'function') { + func(); + } + break; + case "off": + case "production": // ignore func + default: break; + } +}; +const test = { + drawAllColors: function(i) { + charIndex = i>2 ? 0 : i<0 ? 0 : i; + allSquares.forEach((sq,i) => { + let c = i<11 ? i : i-10; + sq.setExpVal(c); + debug(console.log("c=",c)); + }); + drawGrid(); + }, + youWin: function() { + messageYouWin(); + }, + gameOver: function() { + messageGameOver(); + } +}; + +// Handle a "click" event (only needed for menu button) +function handleclick(e) { + buttons.all.forEach(btn => { + if ((e.x >= btn.x0) && (e.x <= btn.x1) && (e.y >= btn.y0) && (e.y <= btn.y1)) { + btn.onClick(); + debug(console.log(btn.name)); + } + }); +} + +// Handle a drag event (moving the stones around) +function handledrag(e) { + /*debug(Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? e => console.log('To the right') : e => console.log('To the left') ) : + (e.dy > 0 ? e => console.log('Move down') : e => console.log('Move up') )); + */ + // [move.right, move.left, move.up, move.down] + runGame((Math.abs(e.dx) > Math.abs(e.dy) ? + (e.dx > 0 ? mover.direction.right : mover.direction.left ) : + (e.dy > 0 ? mover.direction.down : mover.direction.up ))); +} +// Evaluate "drag" events from the UI and call handlers for drags or clicks +// The UI sends a drag as a series of events indicating partial movements +// of the finger. +// This class combines such parts to a long drag from start to end +// If the drag is short, it is interpreted as click, +// otherwise as drag. +// The approprate method is called with the data of the drag. +class Dragger { + + constructor(clickHandler, dragHandler, clickThreshold, dragThreshold) { + this.clickHandler = clickHandler; + this.dragHandler = dragHandler; + this.clickThreshold = (clickThreshold === undefined ? 3 : clickThreshold); + this.dragThreshold = (dragThreshold === undefined ? 10 : dragThreshold); + this.dx = 0; + this.dy = 0; + this.enabled = true; + } + + // Enable or disable the Dragger + setEnabled(b) { + this.enabled = b; + } + + // Handle a raw drag event from the UI + handleRawDrag(e) { + if (!this.enabled) + return; + this.dx += e.dx; // Always accumulate + this.dy += e.dy; + if (e.b === 0) { // Drag event ended: Evaluate full drag + if (Math.abs(this.dx) < this.clickThreshold && Math.abs(this.dy) < this.clickThreshold) + this.clickHandler({ + x: e.x - this.dx, + y: e.y - this.dy + }); // take x and y from the drag start + else if (Math.abs(this.dx) > this.dragThreshold || Math.abs(this.dy) > this.dragThreshold) + this.dragHandler({ + x: e.x - this.dx, + y: e.y - this.dy, + dx: this.dx, + dy: this.dy + }); + this.dx = 0; // Clear the drag accumulator + this.dy = 0; + } + } + + // Attach the drag evaluator to the UI + attach() { + Bangle.on("drag", e => this.handleRawDrag(e)); + } +} + +// Dragger is needed for interaction during the game +var dragger = new Dragger(handleclick, handledrag, clickThreshold, dragThreshold); + +// Disable dragger as board is not yet initialized +dragger.setEnabled(false); + +// Nevertheless attach it so that it is ready once the game starts +dragger.attach(); + +function runGame(dir){ + addToUndo(); + updUndoLvlIndex(); + mover.nonEmptyCells(dir); + mover.mergeEqlCells(dir); + mover.nonEmptyCells(dir); + addRandomNumber(); + drawGrid(); + scores.check(); + scores.draw(); + // scores.write(); + snapshot.make(); + dragger.setEnabled(true); + if (!(mover.anyLeft())) { + debug(console.log("G A M E O V E R !!")); + snapshot.reset(); + messageGameOver(); + } +} + +function updUndoLvlIndex() { + let x = 170; + let y = 60; + g.setColor(btnAtribs.fg); + g.fillRect(x-6,y-6, 176, 67); + if (scores.lastScores.length > 0) { + g.setColor("#000000"); + g.setFont("4x6:2"); + g.drawString(scores.lastScores.length, x, y); + } +} +function incrCharIndex() { + charIndex++; + if (charIndex >= cellChars.length) charIndex = 0; + drawGrid(); +} +buttons.add(new Button('undo', btnAtribs.x, 25, btnAtribs.w, btnAtribs.h, 'U', btnAtribs.fg, btnAtribs.bg, undoGame, true)); +buttons.add(new Button('chars', btnAtribs.x, 71, btnAtribs.w, 31, '*', btnAtribs.fg, btnAtribs.bg, function(){incrCharIndex();}, true)); +buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R', btnAtribs.fg, btnAtribs.bg, function(){drawPopUp('Do you want\nto restart?',handlePopUpClicks);}, true)); + +initGame(); + +dragger.setEnabled(true); diff --git a/apps/game1024/game1024.app.info b/apps/game1024/game1024.app.info new file mode 100644 index 000000000..b1c9d84ce --- /dev/null +++ b/apps/game1024/game1024.app.info @@ -0,0 +1,6 @@ +require("Storage").write("timer.info",{ + "id":"game1024", + "name":"1024 Game", + "src":"game1024.app.js", + "icon":"game1024.img" +}); \ No newline at end of file diff --git a/apps/game1024/game1024.json b/apps/game1024/game1024.json new file mode 100644 index 000000000..3749649ee --- /dev/null +++ b/apps/game1024/game1024.json @@ -0,0 +1 @@ +{"gridsize": 16, "expVals": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "score": 0, "highScore": 0, "charIndex": 1} \ No newline at end of file diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4118dd3ca0de7e48b2944f9bbaae606cf9647d8f GIT binary patch literal 1768 zcmVP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5Z6$WWauh>AFBD-@wZs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCNG^=L<&~)3( zq!MB-zbb}a5kwdf#1W90Wz0)b8ouM}9s$1I#d((hxj#olEm#Z)h{SWuFm2)u;+aj` z;Ji;9Wo204L)D#X^Sm6F&Z7*DsMvAy);A z91EyHgY5dj|KNAGR&i?5OA04|-WSLD7zIMRK&#<6-^Y&AIst;uz?I(d*P6iWC+Urj z7CQn4wtHLth!K29HiEOnK>0S*p< zu@Ysk`@FlaySIPOwEO!3C_QqCyM6Kv00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-{s3=SC+6rWO?0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbR z(n&-?RA}Dqm~Bi`R~W~Cw*^W8UCRVBlnGUhzQHxnq`y4V1{4V zmYAqpVsth!Q$tLKS;T181w|9Xq8&>M^MxW=g(#~!CV~+$fo{C>7{_r(a2be+i(&oN^;l{wSdUo$ALoEzG_m%FI>JBMMoY(azuN4j*~GsX zPw|>!4q6XVaiHSK7V%il1ORh|8FPhs;v{|`114A~7+I*yAaB!5HsO(2DBlsduBy{b z!NEektzEQMHgMhY2XFnn8ts%Q_6I7wfvXIy1=G^xu$@nsld`HwU5N5sc7^O<6Fd%2%--LZz;<{k|^Qn8{(Hw z_tW%^1$XbD@&?EuuW;$w}Oi7JXwg&P(gY4zt^TCa7IJOtrEL6OvnBJaVRu!!B`B5L!G6dEOHrvy&1CM23PS_mG zGtF4iEbL6!NhtnVLXx0*cPH;JJjLE^m$-9B8g+FAn+=aB-v92$t}e3ec6N7mBK{*= z9?L+UK99D6HdeQ;MwCQ~bVYvk*E)t!sRSy2%_J^COZ)kOe>Z9{@NGiE{m-34L)`Fs z`6(j{oZ8*+t9?8X9gd=Cy@794C5Z%^#=HaN_1oJfcX$ty@eB4_C&(T+LjpbF6Gk z-biClBQ*mxe)aK55u82U$2;>*Qg`G!Nhy;?E#kH9?S$9Y)8cXwuhsH=SQu}fKFyHN z$E%T%51+&n=fK3Z%CpWwl``_qcsK7VC3)A0M!_VTvmU6i{J@WPw(9h!YzOWQ{elI& zy=4mkqR+>^oScA@IO{uTIo3wurYuE+%UKw~%$G-QB#ztrX};i-6e04AU>7k*?#VbjXxV@76B95OuoA)dhvUco12=z~xzt>%6)*Ca%B|SR2 zeK;?95k-mf?Zfg6+_c--pPS18qY;%_O=8jLgxPbYpV*i5gp9-L-y22Cbo_Rvf9wzS zk|-ht=pGkOUSU_!-}n%lsN?ky(-bw3mO7a)Hg(81kWx~@yn+IJ!^2#4I%%&O{q`)g zFon#*6aWr>Rj+vP0Bbj19$Ob`Eib3FynM`mv|_{J36yvyQQ|LfmGqg4p;7q&0000< KMNUMnLSTZhfk=Y@ literal 0 HcmV?d00001 diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json new file mode 100644 index 000000000..e4b7c9e6f --- /dev/null +++ b/apps/game1024/metadata.json @@ -0,0 +1,13 @@ +{ "id": "game1024", + "name": "1024 Game", + "shortName" : "1024 Game", + "icon": "game1024.img", + "description": "Join the numbers and get to the 1024 tile!", + "tags": "game puzzle 1024", + "allow_emulator": true, + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"game1024.app.js","url":"app.js"}, + {"name":"game1024.img","url":"app-icon.js","evaluate":true} + ] + } \ No newline at end of file From f67313e7ffbd9c4e07cf279b4268d20d0ddc5c2b Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 15 Mar 2022 23:52:08 +0100 Subject: [PATCH 055/122] Added app iocon game1024.png --- apps/game1024/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index e4b7c9e6f..80dc59c47 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "icon": "game1024.img", + "icon": "game1024.png", "description": "Join the numbers and get to the 1024 tile!", "tags": "game puzzle 1024", "allow_emulator": true, From 305d9eb5b7ca3c6e36902998e57b4154c2cbfdff Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Wed, 16 Mar 2022 00:25:33 +0100 Subject: [PATCH 056/122] Altered app icon for the correct image --- apps/gbdebug/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gbdebug/app-icon.js b/apps/gbdebug/app-icon.js index a701ef3a9..0bd1418fc 100644 --- a/apps/gbdebug/app-icon.js +++ b/apps/gbdebug/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4cBzsE/4AClMywH680rlOW9N9kmSpICnyBBBgQRMkBUDgIRKoBoGGRYAFHBGARpARHT5MJKxQAFLgzELCIlIBQkSCIsEPRKBHCIYbGoIRFiQRJhJgFCISeEBwMQOQykCCIqlBpMEBIgRHOQYRIYQbPDhAbBNwgRJVwOCTIgRFMAJKDgQRGOQprBCIMSGogHBJwwbBkC2FCJNbUgMNwHYBYPJCIhODju0yFNCIUGCJGCoE2NwO24EAmw1FHgWCpMGgQOBBIMwCJGSpMmyAjDCI6eBCIWAhu2I4IRCUIYREk+Ah3brEB2CzFAAIRCl3b23btsNCJckjoRC1h2CyAREtoNC9oDC2isCCIgHBjdt5MtCJj2CowjD2uyCIOSCI83lu123tAQIRI4EB28/++39/0mwRCoARCgbfByU51/3rev+mWCIQwCPok0EYIRB/gRDpJ+EcYQRJkARQdgq/Bl5HE7IRDZAltwAREyXbCIbIFgEfCIXsBwQCDQAYRNLgvfCIXtCI44Dm3JCIUlYoYCGkrjBk9bxMkyy9CChICFA=")) +var img = E.toArrayBuffer(atob("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R0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4ca//8Ph4eHAABHR0dHCo9HR0dHAABkZGRkZGRkZGRkAAAJCThQUDgJCQkAAAAAh4caHYeHh4eHAABHR0dHCo5HR0dHAABkZGRkZGRkZGRkAAAJCQk4HjgJCQkAAAAAh4caDw8eh4eHAABHR0ekR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJHgkJCQkAAAAAh4eHh58eB4eHAABHR0dIR45HR0dHAABkZGRkZGRkZGRkAAAJCQlQUAkJCQkAAAAAh4eHh58eB4eHAABHR6UAAAClR0dHAABkZGRkZGRkZGRkAAAJCQkeCQkJCQkAAAAAh4cc/w8eoIeHAABHR0dHR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")) \ No newline at end of file From 4370d2ef8cc04d3b889d5df25bb1e1abb424c723 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Wed, 16 Mar 2022 00:32:14 +0100 Subject: [PATCH 057/122] wrong edited --- apps/gbdebug/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gbdebug/app-icon.js b/apps/gbdebug/app-icon.js index 0bd1418fc..0cecad73b 100644 --- a/apps/gbdebug/app-icon.js +++ b/apps/gbdebug/app-icon.js @@ -1 +1 @@ -var img = E.toArrayBuffer(atob("MDCI/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkZGRkZGRkAABBQUFBQUFBQUFBAAAWFhYWFhYWFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBQUFBQUFBAAAWFggdDx4aFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUEAAEFBQUFBAAAWFhocFxweFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBikFBQUFBAAAWFhYWFhoeFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBikFBQUFBAAAWFhYWFx4ZFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBikFBQUFBAAAWFhYXHhoWFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBikFBQUFBAAAWFhceGhYWFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUEAAABAQUFBAAAWFgf///8eFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBQUFBQUFBAAAWFhYWFhYWFhYWAABkZGRkZGRkZGQAAAAAZGRkZGRkZGRkAABBQUFBQUFBQUFBAAAWFhYWFhYWFhYWAABkZGRkZGRkZGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkZGRkZGRkAAAJCQkJCQkJCQkJAAAWFhYWFhYWFhYWAAAKCgoKCgoKCgoAAAAAZGRkZGRkZGRkAAAJCQkJCQkJCQkJAAAWFggdDx4aFhYWAAAKCgqT2AAKCgoAAAAAZGRkZGRkZGRkAAAJCTn/D1IJCQkJAAAWFhscFxweFhYWAAAKCgrYCgoKCgoAAAAAZGRkZGRkZGRkAAAJCQkJCR45CQkJAAAWFhYWFhoeFhYWAAAKCpOSCgoKCgoAAAAAZGRkZGRkZGRkAAAJCQkJCR45CQkJAAAWFhYWFx4ZFhYWAAAKCpORwtoKCgoAAAAAZGRkZGRkZGRkAAAJCQlQ/x4JCQkJAAAWFhYXHhoWFhYWAAAKCgqRCpKSCgoAAAAAZGRkZGRkZGRkAAAJCQkJCVJQCQkJAAAWFhceGhYWFhYWAAAKCgqSwdoKCgoAAAAAZGRkZGRkZGRkAAAJCVD/Dw85CQkJAAAWFgf///8eFhYWAAAKCgoKCgoKCgoAAAAAZGRkZGRkZGRkAAAJCQkJCQkJCQkJAAAWFhYWFhYWFhYWAAAKCgoKCgoKCgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkZGRkZGRkAAAKCgoKCgoKCgoKAAAODg4ODg4ODg4OAAAMDAwMDAwMDAwAAAAAZGRkZGRkZGRkAAAKCgoKCgoKCgoKAAAODg4ODg4ODg4OAAAMDAwMDAwMDAwAAAAAZGRkZGRkZGRkAAAKCkgeDx4KCgoKAAAODg6MvYwODg4OAAAAAAwMDAS3BAwAAAAAZGRkZGRkZGRkAAAKCmBfCh5HCgoKAAAODi2MDowtDg4OAAAMbwwMDIgMBAwAAAAAZGRkZGRkZGRkAAAKCkgPDx5fCgoKAAAODi2MDowtDg4OAAAMbwwMBgwMDAYAAAAAZGRkZGRkZGRkAAAKCgoKCl9gCgoKAAAODg6MAHQODg4OAAAMbwwMBgwMDAYAAAAAZGRkZGRkZGRkAAAKCgoKSA9ICgoKAAAODi2MDi4uDg4OAAAMbwwMDIgMBAwAAAAAZGRkZGRkZGRkAAAKCkj/D18KCgoKAAAODi11vnUtDg4OAAAAAAAMDAS3BAwAAAAAZGRkZGRkZGRkAAAKCgoKCgoKCgoKAAAODg4ODg4ODg4OAAAMDAwMDAwMDAwAAAAAZGRkZGRkZGRkAAAKCgoKCgoKCgoKAAAODg4ODg4ODg4OAAAMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4ca//8Ph4eHAABHR0dHCo9HR0dHAABkZGRkZGRkZGRkAAAJCThQUDgJCQkAAAAAh4caHYeHh4eHAABHR0dHCo5HR0dHAABkZGRkZGRkZGRkAAAJCQk4HjgJCQkAAAAAh4caDw8eh4eHAABHR0ekR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJHgkJCQkAAAAAh4eHh58eB4eHAABHR0dIR45HR0dHAABkZGRkZGRkZGRkAAAJCQlQUAkJCQkAAAAAh4eHh58eB4eHAABHR6UAAAClR0dHAABkZGRkZGRkZGRkAAAJCQkeCQkJCQkAAAAAh4cc/w8eoIeHAABHR0dHR45HR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAh4eHh4eHh4eHAABHR0dHR0dHR0dHAABkZGRkZGRkZGRkAAAJCQkJCQkJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")) \ No newline at end of file +require("heatshrink").decompress(atob("mEw4cBzsE/4AClMywH680rlOW9N9kmSpICnyBBBgQRMkBUDgIRKoBoGGRYAFHBGARpARHT5MJKxQAFLgzELCIlIBQkSCIsEPRKBHCIYbGoIRFiQRJhJgFCISeEBwMQOQykCCIqlBpMEBIgRHOQYRIYQbPDhAbBNwgRJVwOCTIgRFMAJKDgQRGOQprBCIMSGogHBJwwbBkC2FCJNbUgMNwHYBYPJCIhODju0yFNCIUGCJGCoE2NwO24EAmw1FHgWCpMGgQOBBIMwCJGSpMmyAjDCI6eBCIWAhu2I4IRCUIYREk+Ah3brEB2CzFAAIRCl3b23btsNCJckjoRC1h2CyAREtoNC9oDC2isCCIgHBjdt5MtCJj2CowjD2uyCIOSCI83lu123tAQIRI4EB28/++39/0mwRCoARCgbfByU51/3rev+mWCIQwCPok0EYIRB/gRDpJ+EcYQRJkARQdgq/Bl5HE7IRDZAltwAREyXbCIbIFgEfCIXsBwQCDQAYRNLgvfCIXtCI44Dm3JCIUlYoYCGkrjBk9bxMkyy9CChICFA=")) \ No newline at end of file From d9a92a5f6ebd9a1bfa311ff928ba08f9f0247570 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Wed, 16 Mar 2022 01:14:26 +0100 Subject: [PATCH 058/122] Changed metadata: new screenshiot, tags and data --- apps/game1024/game1024.app.info | 6 ------ apps/game1024/metadata.json | 10 +++++++--- apps/game1024/screenshot.png | Bin 0 -> 5904 bytes 3 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 apps/game1024/game1024.app.info create mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/game1024.app.info b/apps/game1024/game1024.app.info deleted file mode 100644 index b1c9d84ce..000000000 --- a/apps/game1024/game1024.app.info +++ /dev/null @@ -1,6 +0,0 @@ -require("Storage").write("timer.info",{ - "id":"game1024", - "name":"1024 Game", - "src":"game1024.app.js", - "icon":"game1024.img" -}); \ No newline at end of file diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 80dc59c47..83a3613f2 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,13 +1,17 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", + "version": "0.5", "icon": "game1024.png", - "description": "Join the numbers and get to the 1024 tile!", - "tags": "game puzzle 1024", + "screenshots": [ {"url":"screenshot.png" } ], + "description": "Join the numbers and get to the 1024(2^10) or J or X tile!", + "type": "app", + "tags": "game,puzzle", "allow_emulator": true, "supports" : ["BANGLEJS2"], "storage": [ {"name":"game1024.app.js","url":"app.js"}, {"name":"game1024.img","url":"app-icon.js","evaluate":true} - ] + ], + "data":[{"name": "game1024.json", "url": "game1024.json"}] } \ No newline at end of file diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..256ecb53bc679984c59b5847219ab9bb4a7097bb GIT binary patch literal 5904 zcmc&&%gKtehtC!;~>7@g9Bj+SO1(xFHw-5nANNDQTg(OpAQS^;Tz z`TZ5|x#!loAD$2Q-shfkV|2CENQoGTaBy%)HPn^$?|t2W3MRO>wO`k*?j5d|zM3LV z4TkAA4i4?0hO&a;YpZ?Bg|syu63u|yyOggDpe1s}jJWJZ=1NxI$ArC5Wj$W|>!5b4 zTD9v)d_h-~lhl!ln&2l=S}+Kr*4&8y9VG+{8aqc~k5JFdp-kuFKj;$3KoHjdTM2gt z@VhRV`&#ktEI`icyl1VvqfpU-IcOZ5DiqhrQrma@=Yyz;M+IZ-MDV$Oxs)V0Q#q6w z^hHuEcsMvE(}1jeZPxMzl#YD9*ICgtI^g!?x~JVl)9o_WeT$Yl9U|lY!?EQiAgo2( z!Quh6PiMtXb3CrihPQ~fdYFQRN{iaHJksZNUlkc&KO}mg$gv0OX&INOHTKn%4H_27 z3pApc!0$P8VVB}QE)tcOAMp-#mL&_>nHbsqbFS4X&ysXE-Z_d{cWV(7RTr;Z5Abxl z&E74~Otv@#xoY0sJ_%u!uiaWZy9l^OXWz$1un_G#yNi`RDo3$a`MaE*JAY4Uw?}D( z0eOXU1*3P|ORRlt3ksw_+3mx)efUPzQomJsXMlcewmv?AXCBj}!92~?v(uws&8zO3 z5{t{*6}&znlzP2Eg;2tCkHE4dB!Y{6PHVpSIy|T?Bg@qe@!F_yCXwnQwN+<|m3~Ql zo)MJUmZRgT{a8k}+;e(sEgvK#eJUhd{aCQYuLd{0&|aKg)~l69R!+v!bCA_za4)D= z!^1Yzolkm}|o%bj`#atAxf(r#ori|3fJFWUt7#S*Iu# z;dU$Vg2=KG32Nz?6o0)j4;uZU97%V&sx{i+J3ywXKulYgG)8(uK1-2BE|IMSeM{ zv`*DqLb^Q16<@cF+8E$OIT#zho6CIG_I-zjWVd|p5mx`-Ps`7v9uz=xr$SDkwssmr zBW5<9{(LKg`PSoCj&d;S<0ew-PeaqA77j4w12Up(lYG zuzt3A^-7mFW*D1s-oUy)yIpq6+TAaXgH&kN#YZ(mtH%b-O;7wxrj=Gsf?b1lzRpC&U5t-F|AE+SYY z$W6#(2wrM}LTo=eCF3}0{k$da{EBPY6=?*I#?3oE)ATEZD~##YsqKLNAfjo&{&A@> z1f39g^c58>f_&H|z1fte1Y?4o<+Ee0t_EVllE^l3`ID6jr zrBSpQo@#v5C91TEiv{H0QK^G@pa?uNxG;0`J29~t6^Td*0PHmpp%s&{6Q4RGp%uJW!9-1^fv%9|^EAM2 zBUFwiNeEvNp5VNRZ_Ri4SnOoZBsFD7;P$bMPF1MD$NQ-jL^Qlql_Dxl0h7xIWPh=_ zolS0pZ#O!&&eUmY_RKX>-MvWF{x@lMxO{}yIMFJuF#E15PG(jOcF^qU`al{8FH09? z+-1c4V7R_PoId_mQ)>UcS@i{`f~zsjSUw39(Xe`M97-?-yRAOdGuW#-4v=YCB;!SV z5|$Rd!&Eg5qp19*^vRz&7D0*}So>;Kc@;>8eOy%80jbe$J~m}v-!C_Y#I*`m>4%}q zdqY1y#?gP#-i&^zh=|YpBNG*IXTKhC+9kyreKH#A7Nv?n6hD)&;fVdpmyA@NZkZY^ zPBtW;GqQkQu>-I4&ols)>aNIN4o&ik+=S)mW7?tPc2u|7}INUO6t(r|3JLJ8u= zyR(W{tze^qi|kBqx+ZYicp6vSYf-pMZmOBKLK(kbQ`K#`EGr6!)h#~T&w%faZO=Y& zfcidJ9ynGGYD(GiLRZPheQ=xtA5pgF9VJj1p_fx-eKsDBQfAThJ1{S%_a^_dkEt}7 z2Y=*)Wg&6^9}OfKWRNX*89#I_bpAr}mu#s{6^fLa6zOj=Tne(GQp{6DO^b-#RTBN7 zVI$2CZwW7ds+;ePPVwSvf{I-YDT_9j7nshuUpm@^XFP{MY6TxJ;m^% z-I`KktE9_`On2V9+d=24f!y{8$_G*$NbdQ#(%mMpV_$KO&%`Eo^+bgUJn!i%`Q?U= zK7Mf_%%%dbyZc6thI2KW9^0sthAFxl@fovoGgE&s;9jYdGel}_;P}+XgnKVPl|0IF zFLt1a4KA~0e@-i!^{YW#&LsoM?Hl15cw>w=Jrt=fmgUq{+J>@vMR;_VwR1(Q zkt+lS&>>s_bSjCYBm+|hV2lV?LjOUcdD)XXa?`}00Hc9?s(Q|bKT_L&ngriWR4+ev z`kJaSyuS{mLQp3$9>*#yp0kF~TAEbCKKVZO(6+XAKD%n$KU`ogzVfCSyoc!6Fv8hf_PQO6{Pi9q$2#T9y64YrdA0!K$-=HJOt z3D1EfMJe+IUaGD&@xnzG{crvmHRg1+JpI0!4d;d>r}2lYIDu*qIBz(mW0hmjQY`+N z^mQux9LP-uP1nmLtGTd2c)coN-yZS!B}-` zy00%D?sj7pi}3q({zgNglT;s@gxQ$KM+C(5G-o)RvcqnCKSW>NK4gsZ615k8?E97) zWN)TBS!kFoC!Ld&UaZS>)Froms;1%T7^PLyf+mdR2!$HzxDp zXg?Prf4IF`PXBh+ac)b!o5ZmDGsEg|qzmEMlZXOK!Xjz3#M614{B~?Oh7mIue~v4e zq)@PF-;?tt?=OPf*#0?T)LH^OOK|oetErf?QJlv`HNb))9T92IMWlAn6CJbgBZjMp zS)7pGg&SfAO=awob))a67$$d9Z+(Rsc|ROKNu{JH<|*n_v?nF(SpsWiIwPjX1$j0a zn7WI3(LU%#Zut6Elxm0Rn>sKj_V@F;M$V&CKj;+ONr_OqU#?e4BB%y~>^6*f`5?On zGIi+<`NexZPgTf1I!n#R+d?zW8fun%lD$@UMluT@^ua+QUe)C2v=glbj zz(f&u_ZO7N$>QA8UWwG)2EEC;k{HnorZ9~3;2>qoOIaC)a+kugyrJdc-wY}Jh2I=_ zV6BpUQ`l<;8IKyk!f}C5;lY=d4s!(VY z`j+Du&)20I9{eH5DF%*(V{x~7EZ*y~nT&o)e54rZd^DoVwuuc!7-a~s@^(KiwVFbe zQv67v?Zid7hahznjr<3cTK_acu4eYQl+gm!sw<6Pzf{cY8Tx z#2s)kAS*Ll5}5P;wqitpX^1b&++Qt-+|&}!bug`ol8t-Rv|y*;gp#FslmP1%UTE$X z^LU{pc*tLh!z(WmUC)|5l8vO0B|lI8bNl_NYTIG(60M+n^Iu^A-9>9*z^1FTB%9He z;5_w>WYFX1pSy1mSBK|aD=VQ;8eg^0Z#N4G=m_PYha2@XCdc%KEZWjq>%*AqC(st; zFbYj2>%jtSpL5w?2LlE9kwDNg{>$nMu_{F%z?vSG=}W=2NqLAMOME9JMh3d<$b2UZ+$J5p_W{o$z$kLGkxf2IVzp6ItOEi|+8%8oZ=Nc203NW7mXc?X9gsrW z4(EE{Hb39VhoLVfe+Q+xBe5K#l2aZ|z#ODi5W8(Bgb5tP4`7ubO|0nam05xcYN1)Q zuq&33Z)X8GC=r_Ql`RV1ZoLD~j(`&8*H8PF6j%YMeN@4=Tp`xOu;sXA&m`_K2DI$b zO~~-MLJIab=i7_eQGAtIgU!+^b*ZFi?^5IooUK7mD{SGm2HPK=3vord;<$o zM`gzqVYQ0Ugv|6SRC@N;ccWrcw=o0rnvY;h zM94F@#ux>dA_xL}!a#wCTKm}iQR7+*Tr~kc5p%0PH)=W60uP>oqJ7N~oRo?5zn8tDw{ZF5cBFJ6m(RY3x@ zda^R})4z_l$Lhv!&wCJ#_0ybvG1-!cw!$c#-Zn?*>-u`xBz1;|!2Tw3G7MnRP0w_^ zx=atwF;2fQDa2#`u*x=t68`kuR7RyEEZV7i-3Pe2+_?O`+8dbeoJPlw;i zU)oKaQb+s2O}1gd;KhcD5UkgT*t`88tP0FS;u8t;mqv62vvFB3-)qW5pf|dcXG%=p|*Rn8y7nKUW-FA?n0ujVCzpymFg22rNtl5n^ zW#sLT=sK;309O=JhSBC;qr3OaP=Vd<%~!M_S;H(X!m;H%Po%cb_Pg-`xr_xJZ9e}U zGAgFqAimL72!9L2TpH4a>SV&XYYY6Z;-_dco$chs==jq-Sl0K~Ez^$ne3%BX#A>J` z((6l*O4BFqMxBH8p@W-+zgufzq18WbPj9%TkD_i=uDQw2i*U}jhRu|)I+C(~Q5>x2 z8A12`(ivH5UipF#Kq*Bw7ZUw(c?f|psqdLX$))b){6?n{cuxl)fDTmanGl5e{MVdw z?q-LFpfdDT894|l#Ni1=LXWm5hE!UxXjHfH7x)_K>?Ougs2_4F}^s`$b-8v3zfEsju1DW}Ia0t4i`M73_x|dG?lBIfafI zANF&{c2N5STiA&Su>}?CH*%fL;OKYMzegs4yuZ+dYtOj*fcj*pVNpeE78EFXOa|eVV5uJAxk)XJG7}Yb%=JH0B|_6;Lhe&FE9I51$%PC`}beN zSWTrONjZrC(3kSVzqUR%d?P`BEn?dgSPWNl#VDMl!6E4dyYPeJDUm$FQ| zV36aQfZD3l>UtX9i&Jj4T9s|Y#oVpMJG?V;SFhfN2`wZxCuH%(h(O3!ri}dsnXVF} zka3e46>RlKneaw2US;IEf8rk7K^pJpp8T(f)>o=Fj7ziuM*zTKOd2<8FxNhuh1_e!}4_~DsC-T8rC19*W?-nn|09r*&}#J6Qj ztYN%EOjDrj$ebZ9%@aUHcs;`x%1vX(7pUpUki}fUF3d6+!J$?_7IW~l>9dkw_n@yO z&{rEMq*-N15EhfrX_wSt607O=+c;~;OK1Hu&FYSqzBJKw|Ki5cP|;SdQM3vFAAgD}`~Uy| literal 0 HcmV?d00001 From eb0246dd32457b64733270d4567867e0d7464b4f Mon Sep 17 00:00:00 2001 From: Klaus-Peter Bernschneider Date: Wed, 16 Mar 2022 16:54:44 +0100 Subject: [PATCH 059/122] Changing back to official version as requested by Hilmar Strauch Changing back to official version as requested by Hilmar Strauch --- apps/mylocation/mylocation.app.js | 33 +++++++++++++++++-------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/apps/mylocation/mylocation.app.js b/apps/mylocation/mylocation.app.js index b26abb5ec..27ab17ea5 100644 --- a/apps/mylocation/mylocation.app.js +++ b/apps/mylocation/mylocation.app.js @@ -6,35 +6,38 @@ let settings; // initialize with default settings... let s = { - 'lat': 53.322659, - 'lon': 10.14107, - 'location': "Pattensen" -} + 'lat': 51.5072, + 'lon': 0.1276, + 'location': "London" +}; function loadSettings() { - settings = require('Storage').readJSON(SETTINGS_FILE, 1) || s; + settings = require('Storage').readJSON(SETTINGS_FILE, 1) || {}; + for (const key in settings) { + s[key] = settings[key] + } } function save() { - settings = s - require('Storage').write(SETTINGS_FILE, settings) + settings = s; + require('Storage').write(SETTINGS_FILE, settings); } -const locations = ["Pattensen","Essen", "Kalamata", "???"]; -const lats = [ 53.322659, 51.46302, 37.04006, 0.0]; -const lons = [ 10.14107, 6.99891, 22.11535, 0.0]; +const locations = ["London" ,"Newcastle","Edinburgh", "Paris" , "New York" , "Tokyo" , "Frankfurt", "Auckland", "???"]; +const lats = [ 51.5072 , 54.9783 , 55.9533 , 48.8566 , 40.7128 , 35.6762 , 50.1236 , -36.9 , 0.0 ]; +const lons = [ -0.1276 , -1.6178 , -3.1883 , 2.3522 , -74.0060 , 139.6503 , 8.6553 , 174.7832 , 0.0 ]; function setFromGPS() { Bangle.on('GPS', (gps) => { //console.log("."); if (gps.fix === 0) return; //console.log("fix from GPS"); - s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' } + s = {'lat': gps.lat, 'lon': gps.lon, 'location': '???' }; Bangle.buzz(1500); // buzz on first position Bangle.setGPSPower(0); save(); - Bangle.setUI("updown", ()=>{ load() }); + Bangle.setUI("updown", ()=>{ load(); }); E.showPrompt("Location has been saved from the GPS fix",{ title:"Location Saved", buttons : {"OK":1} @@ -49,13 +52,13 @@ function setFromGPS() { } function showMainMenu() { - console.log("showMainMenu"); + //console.log("showMainMenu"); const mainmenu = { '': { 'title': 'My Location' }, '{ load(); }, 'City': { value: 0 | locations.indexOf(s.location), - min: 0, max: 6, + min: 0, max: locations.length - 1, format: v => locations[v], onchange: v => { if (v != 6) { @@ -67,7 +70,7 @@ function showMainMenu() { } }, 'Set From GPS': ()=>{ setFromGPS(); } - } + }; return E.showMenu(mainmenu); } From f2ef87295d1fe7ddde9c01f6e7c3b7f49c56b6d3 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Thu, 17 Mar 2022 00:52:10 +0100 Subject: [PATCH 060/122] 0.02: Added a readme, fixed a bug, added some descriptions --- apps/game1024/Changelog | 2 +- apps/game1024/README.md | 28 ++++++++++++++++++++++++++++ apps/game1024/app.js | 6 +++--- apps/game1024/game1024_sc_watch.png | Bin 0 -> 48769 bytes apps/game1024/metadata.json | 5 +++-- 5 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 apps/game1024/README.md create mode 100644 apps/game1024/game1024_sc_watch.png diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog index 310242d11..b45a8d3ad 100644 --- a/apps/game1024/Changelog +++ b/apps/game1024/Changelog @@ -1,2 +1,2 @@ 0.01: New App! -0.5: First version in Github \ No newline at end of file +0.02: Temporary intermediate version \ No newline at end of file diff --git a/apps/game1024/README.md b/apps/game1024/README.md new file mode 100644 index 000000000..d1d427078 --- /dev/null +++ b/apps/game1024/README.md @@ -0,0 +1,28 @@ + +# Play the game of 1024 + +Move the tiles by swiping to the lefthand, righthand or up- and downward side of the watch. + +When two tiles with the same number are squashed together they will add up as exponentials: + +**1 + 1 = 2** or **A + A = D** which is a representation of **2¹ + 2¹ = 2² = 4** + +**2 + 2 = 3** or **B + B = C** which is a representation of **2² + 2² = 2³ = 8** + +**3 + 3 = 4** or **C + C = D** which is a representation of **2³ + 2³ = 2⁴ = 16** + +So you can continue till you reach **1024** which equals **2¹⁰**. So when you reach tile **10** you have won. + +The score is maintained by adding the outcome of the sum of all pairs of squashed tiles (4+16+4+8 etc.) + +## Buttons + + - Button **U**: Undo the last move. There are currently a maximum of 4 undo levels + - Button **\***: Change the text on the tile to number, capitals or Roman numbers + - Button **R**: Reset the game. The Higscore will be remembered. You will be prompted first. + +### Credits + +Game 1024 is based on Saming's 2048 and Misho M. Petković 1024game.org and conceptually similar to Threes by Asher Vollmer. + +![Screenshot from the Banglejs 2 watch with the game](./game1024_sc_watch.png) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 52f82cdeb..352426d57 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -436,9 +436,9 @@ function initGame() { if (snReadOnInit) { snapshot.recover(); debug(console.log("R E C O V E R E D !", snapshot.dump)); - let sum = allSquares.reduce((t,v) => { return t + v ;}); + let sum = allSquares.reduce(function (tv, sq) {return (sq.expVal + tv) ;}, 0); if (!sum) { - addRandomNumber(); + addRandomNumber(); } } else { addRandomNumber(); @@ -679,4 +679,4 @@ buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R initGame(); -dragger.setEnabled(true); +dragger.setEnabled(true); \ No newline at end of file diff --git a/apps/game1024/game1024_sc_watch.png b/apps/game1024/game1024_sc_watch.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8184b0be8935cac9afa5340793c342111d7fe1 GIT binary patch literal 48769 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 Date: Thu, 17 Mar 2022 09:08:24 +0000 Subject: [PATCH 061/122] run 0.10: Don't allow the same setting to be chosen for 2 boxes (fix #1578) --- apps/run/ChangeLog | 1 + apps/run/metadata.json | 2 +- apps/run/settings.js | 13 +++++++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/run/ChangeLog b/apps/run/ChangeLog index 032ebdc1a..401a68de9 100644 --- a/apps/run/ChangeLog +++ b/apps/run/ChangeLog @@ -8,3 +8,4 @@ 0.07: Fix crash if an odd number of active boxes are configured (fix #1473) 0.08: Added support for notifications from exstats. Support all stats from exstats 0.09: Fix broken start/stop if recording not enabled (fix #1561) +0.10: Don't allow the same setting to be chosen for 2 boxes (fix #1578) diff --git a/apps/run/metadata.json b/apps/run/metadata.json index 01a85ed05..51239d297 100644 --- a/apps/run/metadata.json +++ b/apps/run/metadata.json @@ -1,6 +1,6 @@ { "id": "run", "name": "Run", - "version":"0.09", + "version":"0.10", "description": "Displays distance, time, steps, cadence, pace and more for runners.", "icon": "app.png", "tags": "run,running,fitness,outdoors,gps", diff --git a/apps/run/settings.js b/apps/run/settings.js index 29a2f43cc..949f7a235 100644 --- a/apps/run/settings.js +++ b/apps/run/settings.js @@ -42,6 +42,11 @@ value: Math.max(statsIDs.indexOf(settings[boxID]),0), format: v => statsList[v].name, onchange: v => { + for (var i=1;i<=6;i++) + if (settings["B"+i]==statsIDs[v]) { + settings["B"+i]=""; + boxMenu["Box "+i].value=0; + } settings[boxID] = statsIDs[v]; saveSettings(); }, @@ -60,7 +65,7 @@ '': { 'title': 'Run' }, '< Back': back, }; - if (WIDGETS["recorder"]) + if (global.WIDGETS&&WIDGETS["recorder"]) menu[/*LANG*/"Record Run"] = { value : !!settings.record, format : v => v?/*LANG*/"Yes":/*LANG*/"No", @@ -87,7 +92,7 @@ notificationsMenu[/*LANG*/"Dist Pattern"] = { value: Math.max(0,vibPatterns.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.dist.notifications))), min: 0, max: vibPatterns.length, - format: v => vibPatterns[v]||"Off", + format: v => vibPatterns[v]||/*LANG*/"Off", onchange: v => { settings.notify.dist.notifications = vibTimes[v]; sampleBuzz(vibTimes[v]); @@ -97,7 +102,7 @@ notificationsMenu[/*LANG*/"Step Pattern"] = { value: Math.max(0,vibPatterns.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.step.notifications))), min: 0, max: vibPatterns.length, - format: v => vibPatterns[v]||"Off", + format: v => vibPatterns[v]||/*LANG*/"Off", onchange: v => { settings.notify.step.notifications = vibTimes[v]; sampleBuzz(vibTimes[v]); @@ -107,7 +112,7 @@ notificationsMenu[/*LANG*/"Time Pattern"] = { value: Math.max(0,vibPatterns.findIndex((p) => JSON.stringify(p) === JSON.stringify(settings.notify.time.notifications))), min: 0, max: vibPatterns.length, - format: v => vibPatterns[v]||"Off", + format: v => vibPatterns[v]||/*LANG*/"Off", onchange: v => { settings.notify.time.notifications = vibTimes[v]; sampleBuzz(vibTimes[v]); From 7c4032d6fbff6967508259865b4afd97787b9845 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 17 Mar 2022 09:54:02 +0000 Subject: [PATCH 062/122] boot 0.44: Write .boot0 without ever having it all in RAM (fix Bangle.js 1 issues with BTHRM) --- apps/boot/ChangeLog | 1 + apps/boot/bootupdate.js | 41 ++++++++++++++++++++++++++++++++--------- apps/boot/metadata.json | 2 +- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/apps/boot/ChangeLog b/apps/boot/ChangeLog index e75c9cc7b..3f406e6a1 100644 --- a/apps/boot/ChangeLog +++ b/apps/boot/ChangeLog @@ -47,3 +47,4 @@ 0.41: Add Keyboard and Mouse Bluetooth HID option 0.42: Sort *.boot.js files lexically and by optional numeric priority, e.g. appname..boot.js 0.43: Fix Gadgetbridge handling with Programmable:off +0.44: Write .boot0 without ever having it all in RAM (fix Bangle.js 1 issues with BTHRM) diff --git a/apps/boot/bootupdate.js b/apps/boot/bootupdate.js index c9bd89f51..8eaeaf095 100644 --- a/apps/boot/bootupdate.js +++ b/apps/boot/bootupdate.js @@ -4,7 +4,7 @@ of the time. */ E.showMessage("Updating boot0..."); var s = require('Storage').readJSON('setting.json',1)||{}; var BANGLEJS2 = process.env.HWVERSION==2; // Is Bangle.js 2 -var boot = ""; +var boot = "", bootPost = ""; if (require('Storage').hash) { // new in 2v11 - helps ensure files haven't changed var CRC = E.CRC32(require('Storage').read('setting.json'))+require('Storage').hash(/\.boot\.js/)+E.CRC32(process.env.GIT_COMMIT); boot += `if (E.CRC32(require('Storage').read('setting.json'))+require('Storage').hash(/\\.boot\\.js/)+E.CRC32(process.env.GIT_COMMIT)!=${CRC})`; @@ -15,6 +15,7 @@ if (require('Storage').hash) { // new in 2v11 - helps ensure files haven't chang boot += ` { eval(require('Storage').read('bootupdate.js')); throw "Storage Updated!"}\n`; boot += `E.setFlags({pretokenise:1});\n`; boot += `var bleServices = {}, bleServiceOptions = { uart : true};\n`; +bootPost += `NRF.setServices(bleServices, bleServiceOptions);delete bleServices,bleServiceOptions;\n`; // executed after other boot code if (s.ble!==false) { if (s.HID) { // Human interface device if (s.HID=="joy") boot += `Bangle.HID = E.toUint8Array(atob("BQEJBKEBCQGhAAUJGQEpBRUAJQGVBXUBgQKVA3UBgQMFAQkwCTEVgSV/dQiVAoECwMA="));`; @@ -195,8 +196,8 @@ if (!Bangle.appRect) { // added in 2v11 - polyfill for older firmwares // Append *.boot.js files // These could change bleServices/bleServiceOptions if needed -var getPriority = /.*\.(\d+)\.boot\.js$/; -require('Storage').list(/\.boot\.js$/).sort((a,b)=>{ +var bootFiles = require('Storage').list(/\.boot\.js$/).sort((a,b)=>{ + var getPriority = /.*\.(\d+)\.boot\.js$/; var aPriority = a.match(getPriority); var bPriority = b.match(getPriority); if (aPriority && bPriority){ @@ -207,17 +208,39 @@ require('Storage').list(/\.boot\.js$/).sort((a,b)=>{ return 1; } return a==b ? 0 : (a>b ? 1 : -1); -}).forEach(bootFile=>{ +}); +// precalculate file size +var fileSize = boot.length + bootPost.length; +bootFiles.forEach(bootFile=>{ + // match the size of data we're adding below in bootFiles.forEach + fileSize += 2+bootFile.length+1+require('Storage').read(bootFile).length+1; +}); +// write file in chunks (so as not to use up all RAM) +require('Storage').write('.boot0',boot,0,fileSize); +var fileOffset = boot.length; +bootFiles.forEach(bootFile=>{ // we add a semicolon so if the file is wrapped in (function(){ ... }() // with no semicolon we don't end up with (function(){ ... }()(function(){ ... }() // which would cause an error! - boot += "//"+bootFile+"\n"+require('Storage').read(bootFile)+";\n"; + // we write: + // "//"+bootFile+"\n"+require('Storage').read(bootFile)+";\n"; + // but we need to do this without ever loading everything into RAM as some + // boot files seem to be getting pretty big now. + require('Storage').write('.boot0',"//"+bootFile+"\n",fileOffset); + fileOffset+=2+bootFile.length+1; + var bf = require('Storage').read(bootFile); + require('Storage').write('.boot0',bf,fileOffset); + fileOffset+=bf.length; + require('Storage').write('.boot0',"\n",fileOffset); + fileOffset+=1; }); -// update ble -boot += `NRF.setServices(bleServices, bleServiceOptions);delete bleServices,bleServiceOptions;\n`; -// write file -require('Storage').write('.boot0',boot); +require('Storage').write('.boot0',bootPost,fileOffset); + delete boot; +delete bootPost; +delete bootFiles; +delete fileSize; +delete fileOffset; E.showMessage("Reloading..."); eval(require('Storage').read('.boot0')); // .bootcde should be run automatically after if required, since diff --git a/apps/boot/metadata.json b/apps/boot/metadata.json index edddc6b41..a4fa875fa 100644 --- a/apps/boot/metadata.json +++ b/apps/boot/metadata.json @@ -1,7 +1,7 @@ { "id": "boot", "name": "Bootloader", - "version": "0.43", + "version": "0.44", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "icon": "bootloader.png", "type": "bootloader", From 13c18e76a6ec1224539e0e7b394eb52b1b4e5584 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 17 Mar 2022 10:14:25 +0000 Subject: [PATCH 063/122] backup to ignore firmware --- backup.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backup.js b/backup.js index b0159036d..3ee71f54b 100644 --- a/backup.js +++ b/backup.js @@ -22,6 +22,10 @@ function bangleDownload() { var promise = Promise.resolve(); // Normal files normalFiles.forEach((filename,n) => { + if (filename==".firmware") { + console.log("Ignoring .firmware file"); + return; + } promise = promise.then(() => { Progress.hide({sticky: true}); var percent = n/fileCount; From 8209dc9af6af6ddd997316f56a47c6e1b99c5c5b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 17 Mar 2022 10:43:18 +0000 Subject: [PATCH 064/122] Add smoother backup percentage --- backup.js | 4 ++-- core | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backup.js b/backup.js index 3ee71f54b..75e236049 100644 --- a/backup.js +++ b/backup.js @@ -29,7 +29,7 @@ function bangleDownload() { promise = promise.then(() => { Progress.hide({sticky: true}); var percent = n/fileCount; - Progress.show({title:`Download ${filename}`,sticky:true,min:percent,max:percent,percent:0}); + Progress.show({title:`Download ${filename}`,sticky:true,min:percent,max:percent+(1/fileCount),percent:0}); return Comms.readFile(filename).then(data => zip.file(filename,data)); }); }); @@ -40,7 +40,7 @@ function bangleDownload() { promise = promise.then(() => { Progress.hide({sticky: true}); var percent = (normalFiles.length+n)/fileCount; - Progress.show({title:`Download ${filename}`,sticky:true,min:percent,max:percent,percent:0}); + Progress.show({title:`Download ${filename}`,sticky:true,min:percent,max:percent+(1/fileCount),percent:0}); return Comms.readStorageFile(filename).then(data => zipStorageFiles.file(filename,data)); }); }); diff --git a/core b/core index 6e94cf77a..27c7db603 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 6e94cf77a2b355389dcd5efa55e2249a9b31983c +Subproject commit 27c7db6035832837ca3909ea52939f60803df72f From 7b842294e0b4812de8102fbaa3cf72eb039d3203 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Thu, 17 Mar 2022 15:33:32 +0100 Subject: [PATCH 065/122] Layout: add support for `back` option --- modules/Layout.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/Layout.js b/modules/Layout.js index 20fa2be8b..0bfbc28ad 100644 --- a/modules/Layout.js +++ b/modules/Layout.js @@ -59,6 +59,7 @@ options is an object containing: * `label` - the text on the button * `cb` - a callback function * `cbl` - a callback function for long presses +* `back` - a callback function, passed as `back` into Bangle.setUI If automatic lazy rendering is enabled, calls to `layout.render()` will attempt to automatically determine what objects have changed or moved, clear their previous locations, and re-render just those objects. @@ -89,7 +90,7 @@ function Layout(layout, options) { options = options || {}; this.lazy = options.lazy || false; - var btnList; + var btnList, uiSet; Bangle.setUI(); // remove all existing input handlers if (process.env.HWVERSION!=2) { // no touchscreen, find any buttons in 'layout' @@ -104,7 +105,7 @@ function Layout(layout, options) { this.physBtns = 0; this.buttons = btnList; this.selectedButton = -1; - Bangle.setUI("updown", dir=>{ + Bangle.setUI({mode:"updown", back:options.back}, dir=>{ var s = this.selectedButton, l=this.buttons.length; if (dir===undefined && this.buttons[s]) return this.buttons[s].cb(); @@ -119,8 +120,10 @@ function Layout(layout, options) { } this.selectedButton = s; }); + uiSet = true; } } + if (options.back && !uiSet) Bangle.setUI({mode: "custom", back: options.back}); if (options.btns) { var buttons = options.btns; From 5ac392ae7c7599e2936143e62acf3badd3e63c9d Mon Sep 17 00:00:00 2001 From: Daniel Cox Date: Fri, 18 Mar 2022 09:32:00 +1300 Subject: [PATCH 066/122] Shrink hand images to save memory --- apps/seiko-5actus/app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/seiko-5actus/app.js b/apps/seiko-5actus/app.js index a2e2d4569..078b6e5c2 100644 --- a/apps/seiko-5actus/app.js +++ b/apps/seiko-5actus/app.js @@ -7,17 +7,17 @@ var imgBg = { /* Set hour hand image */ var imgHour = { - width : 16, height : 176, bpp : 2, + width : 14, height : 114, bpp : 2, transparent : 0, - buffer : require("heatshrink").decompress(atob("AH4A/AH4A/AEk//gDp///gEDAYPAh4DB+E/AYP8AaYbDEYYrDLdgD/Af4DXh/wAYIA/AGwA=")) + buffer : require("heatshrink").decompress(atob("AH4A/AB8P/4DB//wAz8D//8BIIKBn4DB54CBACPzAQP8EoImBD4PAJkQG/A34GIgbUBA")) }; /* Set minute hand image */ var imgMin = { - width : 8, height : 176, bpp : 2, + width : 4, height : 168, bpp : 2, transparent : 0, - buffer : require("heatshrink").decompress(atob("AH4A/AB8P+AB/AP4B/AIcA4DPHA=")) + buffer : require("heatshrink").decompress(atob("AH4AE/4A/AEI")) }; /* Set second hand image */ From 6957a9081d28aa41ba49aa4270d37914f12862ba Mon Sep 17 00:00:00 2001 From: Daniel Cox Date: Fri, 18 Mar 2022 09:32:33 +1300 Subject: [PATCH 067/122] Update metadata.json --- apps/seiko-5actus/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/seiko-5actus/metadata.json b/apps/seiko-5actus/metadata.json index da48552e8..33de8213b 100644 --- a/apps/seiko-5actus/metadata.json +++ b/apps/seiko-5actus/metadata.json @@ -3,7 +3,7 @@ "shortName":"5actus", "icon": "seiko-5actus.png", "screenshots": [{"url":"screenshot.png"}], - "version":"0.01", + "version":"0.02", "description": "A watch designed after then Seiko 5actus from the 1970's", "tags": "clock", "type": "clock", From c52ed79950812d1c954d72f42b507f442e094413 Mon Sep 17 00:00:00 2001 From: Daniel Cox Date: Fri, 18 Mar 2022 09:33:20 +1300 Subject: [PATCH 068/122] Update ChangeLog --- apps/seiko-5actus/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/seiko-5actus/ChangeLog b/apps/seiko-5actus/ChangeLog index 28f11c1c7..978e5d6ea 100644 --- a/apps/seiko-5actus/ChangeLog +++ b/apps/seiko-5actus/ChangeLog @@ -1 +1,2 @@ 0.01: Initial Release +0.02: Shrink hand images to save memory From 7d03b49f0c6a3320832b02e905b5e6d1deccfb75 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 17 Mar 2022 23:18:17 +0100 Subject: [PATCH 069/122] smclock: Replace Bat text with battery image --- apps/smclock/app.js | 56 +++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 297ddb894..bf78b7bfd 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -14,7 +14,7 @@ const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; // dynamic variables var batLevel = -1; -var batColor = [0, 0, 0]; +var batColor = ""; // settings variables var backgroundImage; @@ -68,15 +68,15 @@ function getBatteryColor(level) { level = batLevel; } if (level > 80) { - color = [0, 0, 1]; + color = "#00f"; } else if (level > 60) { - color = [0, 1, 1]; + color = "#0ff"; } else if (level > 40) { - color = [0, 1, 0]; + color = "#0f0"; } else if (level > 20) { - color = [1, 1, 0]; + color = "#f40"; } else { - color = [1, 0, 0]; + color = "f00"; } return color; } @@ -90,7 +90,7 @@ function draw() { } g.drawImage(background); - const color = getBatteryColor(batLevel); + batColor = getBatteryColor(batLevel); var bat = ""; const d = new Date(); const day = d.getDate(); @@ -102,32 +102,34 @@ function draw() { const m = d.getMinutes(); const time = d02(h) + ":" + d02(m); - if (E.getBattery() < 100) { - bat = d02(E.getBattery()) + "%"; - } else { - bat = E.getBattery() + "%"; - } - g.reset(); // draw battery info - g.setColor(1, 1, 1); - if (useVectorFont == true) { - g.setFont("Vector", 16); - g.drawString("Bat:", 12, 22, false); + var x = 12; + var y = 16; + if (Bangle.isCharging()) { + g.setColor("#ff0").drawImage(atob("DhgBHOBzgc4HOP////////////////////3/4HgB4AeAHgB4AeAHgB4AeAHg"),x,y); } else { - g.setFont("4x6", 2); - g.drawString("Bat:", 10, 22, false); + g.clearRect(x,y,x+14,y+24); + g.setColor("#000").fillRect(x+2,y+2,x+12,y+22).clearRect(x+4,y+4,x+10,y+20).fillRect(x+5,y+1,x+9,y+2); + g.setColor(batColor).fillRect(x+4,y+20-(batLevel*16/100),x+10,y+20); } - g.setColor(color[0], color[1], color[2]); - if (batLevel < 100) { - g.drawString(bat, 52, 22, false); + g.setFont("Vector", 16); + if (Bangle.isCharging()) { + g.setColor("#ff0"); } else { - g.drawString(bat, 46, 22, false); + g.setColor(batColor); + } + if (batLevel < 100) { + bat = d02(batLevel) + "%"; + g.drawString(bat, 50, 22, false); + } else { + bat = "100%"; + g.drawString(bat, 40, 22, false); } // draw date info - g.setColor(0, 0, 0); + g.setColor("#000"); if (useVectorFont == true) { g.setFont("Vector", 20); } else { @@ -143,7 +145,7 @@ function draw() { // draw week info if (showWeekInfo == true) { - date2 = weekday[d.getDay()] + " " + d02(week) + date2 = weekday[d.getDay()] + " " + d02(week); if (useVectorFont == true) { g.setFont("Vector", 18); } else { @@ -162,7 +164,7 @@ function draw() { } // draw time - g.setColor(1, 1, 1); + g.setColor("#fff"); if (useVectorFont == true) { g.setFont("Vector", 60); g.drawString(time, 10, 108, false); @@ -198,4 +200,4 @@ Bangle.on("lcdPower", (on) => { }); // Show launcher when middle button pressed -Bangle.setUI("clock"); +Bangle.setUI("clock"); \ No newline at end of file From 2e084ae9d850a5e027ccd5ea99b26e1e720abad2 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 17 Mar 2022 15:32:40 -0700 Subject: [PATCH 070/122] Update lcars.app.js --- apps/lcars/lcars.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7d5da2d8e..433d33427 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -626,7 +626,7 @@ Bangle.on('charging',function(charging) { function increaseAlarm(){ - if(isAlarmEnabled()){ + if(isAlarmEnabled() && getAlarmMinutes() < 95){ settings.alarm += 5; } else { settings.alarm = getCurrentTimeInMinutes() + 5; From 849b1ddb343713ee0234e9e367c9e196b0d7bb25 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 17 Mar 2022 15:33:13 -0700 Subject: [PATCH 071/122] Update ChangeLog --- apps/lcars/ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 7d8fecb1e..d8ec46f94 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -15,4 +15,5 @@ 0.15: Using wpedom to count steps. 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. -0.18: Fullscreen mode can now be enabled or disabled in the settings. \ No newline at end of file +0.18: Fullscreen mode can now be enabled or disabled in the settings. +0.19: Alarms can not go bigger than 100; From f0a6c52f72d859e3c78fef670d7203c977510c7c Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 17 Mar 2022 15:33:27 -0700 Subject: [PATCH 072/122] Update ChangeLog --- apps/lcars/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index d8ec46f94..9d43f6575 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -16,4 +16,4 @@ 0.16: Improved stability. Wind can now be shown. 0.17: Settings for mph/kph and other minor improvements. 0.18: Fullscreen mode can now be enabled or disabled in the settings. -0.19: Alarms can not go bigger than 100; +0.19: Alarms can not go bigger than 100. From e8e9e73be5f28d94b747e1dce4d850ad70409b07 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 17 Mar 2022 15:33:42 -0700 Subject: [PATCH 073/122] Update metadata.json --- apps/lcars/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/metadata.json b/apps/lcars/metadata.json index e6ca10f79..1335b8e1d 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.18", + "version":"0.19", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", From 9d4cb9081fe7b10f7fe60c6e2cd20fa038b9780d Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 17 Mar 2022 23:36:16 +0100 Subject: [PATCH 074/122] smclock: Fix battery font, update Changelog and screenshots --- apps/smclock/ChangeLog | 3 ++- apps/smclock/app.js | 8 ++++++-- apps/smclock/screenshot0.png | Bin 2971 -> 2947 bytes apps/smclock/screenshot1.png | Bin 2134 -> 2059 bytes 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/smclock/ChangeLog b/apps/smclock/ChangeLog index f0b5c5bde..2a3874d34 100644 --- a/apps/smclock/ChangeLog +++ b/apps/smclock/ChangeLog @@ -1,5 +1,6 @@ 0.01: Initial version 0.02: Add battery level -0.03: Fix battery display when full +0.03: Fix battery display when full (incorporating code by Ronin0000) 0.04: Add support for settings 0.05: Add ability to change background (3bit or 4bit) +0.06: Replace battery text with image diff --git a/apps/smclock/app.js b/apps/smclock/app.js index bf78b7bfd..41bc2b5e4 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -114,12 +114,16 @@ function draw() { g.setColor("#000").fillRect(x+2,y+2,x+12,y+22).clearRect(x+4,y+4,x+10,y+20).fillRect(x+5,y+1,x+9,y+2); g.setColor(batColor).fillRect(x+4,y+20-(batLevel*16/100),x+10,y+20); } - g.setFont("Vector", 16); if (Bangle.isCharging()) { g.setColor("#ff0"); } else { g.setColor(batColor); } + if (useVectorFont == true) { + g.setFont("Vector", 16); + } else { + g.setFont("4x6", 3); + } if (batLevel < 100) { bat = d02(batLevel) + "%"; g.drawString(bat, 50, 22, false); @@ -200,4 +204,4 @@ Bangle.on("lcdPower", (on) => { }); // Show launcher when middle button pressed -Bangle.setUI("clock"); \ No newline at end of file +Bangle.setUI("clock"); diff --git a/apps/smclock/screenshot0.png b/apps/smclock/screenshot0.png index de4dc4e43da2403b684284b6805809343793d524..07eff8ddf475761b2cc3e29f8789c0a407ff6eff 100644 GIT binary patch literal 2947 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 E0R26K7ytkO literal 2971 zcmb`Jc|25mAIBNnm@XOn80*+3%Wx}On541HOx7!Vj1nqBiLslKJq!k2;X%6D$0)=w zlU&s;JhW@ocQI|!9mE?lvkrm zTK3V4kAx@acN1g8TJ?47XA71$qq`?iyXt~jhzJ={c97%MlM zkG|eL`S)(#qolN_d-iWOqn}JH^G%^TvXcg8Ry{?wY9o4Vn?wiO-pC$_sMf%dPG1cS zmur$XWe=$f^DrIOhiEoC3- zF+FmG`}~Q`)Lq(ANBhjsw|$$(D=G?GT|D2VmbP2NGp&^Tfy~DSD($ecR0Z8<*Rg0q>cc>7}>xew|g&U#W~2ohTg8|KtLNMQi0c z95qK}jqjNYbp7_P1#t!!LU$Q|a9qE}T{HLWv>a|Q??KV9t^tn6+vB0>wadT7!gngy zb17TTulCmkx_|G@r63VRq}#A_!&c+4+j#~k@7~61cORq$Rc;vF4oh0@7Gph^V0o4{_uJRK*<&K>^sxUn4HOAO zj&OlPkYw~+OuQMxVb?)&j4_k4vaYTMu_J$fv^mDQO^|V(HI9+)sj|Ey&Qb7$oJn3l zVMyhF1t$FN&%rN!Lt#F-;<$dxE@Pq#)*1b$KVeByD@a#DPxgc4J~eotkila|JGsts z)<0_Ni`RD98JcnO6tg(-C!E-2qNy|~P@P7@LVRsVUXt*FN}M<6hRb5-Dc^e1Z?tWU z`5Dp(bf*TpV0ly}LWB(Ra3O36S6tQ*k5kVF_HwV|qO;iIUX$IVcJN3gK2b9L1sGoqHz=O~S#O<|gv_~;&ZSh-}0 z2SK~enBlx)CV=RnEV@n`J-(5tAir4x-TAlA(J>olZXqbS6;!juiF=u4pYx3ZYH@M9 zQZnN#)QPPi=B$NF2765jdi z1#IR3Imw=+t7GWeXV8TbYOZJcV@6{Xe(-P>y_6}J{ey&3u-X!UUs1aN9|-{5H1&i~ z<>;T3^ouk8KDMl-M`)#yd&P0xLHJu|f6%r zk9_?-fkn(S$Z66`CNCZ9FZ?Qyr4)d6n7+%*zmDvj+=L~|$HUN!w)kQqZGUxg{{h$n z?j{TiO0?D(TJ;iCR!>=thMHz+yfDK&*xy7l@+U$VcAO#UVIBWblSncNBSm71jpdXI z=<{*nQVpQjsl2!WwS$idBjJBwgjY@-uL;q+HUt9G9&a8Rgqz9HjB0xIl7cgyOKD40 zK1sDAgx>KUh?5$OR+cwxM>lRvw85HWhrf%C3q;9?(iQ^;vt_RoPc+85SSYX2VqQxK zDc3#KVNQ;<>QGEzGUyH+6+KyKY#G83@mzB`PDxf0UuAu)L05LA?9t1FXdeoGI(W1=bAKYCVMc;9 z709nSQg**FR$tKO0y%GPUDr*1XKrxV0~sM`8vIZVhTsgSt|g{FYJH8(MwZdWR~$G;R(9X-~kmGy!%r3R71j|mZMERG9xBV zyFYL1tH5OlbiuC*J0?X4Redy`e_h@hd|DHeuGk=je(AK$rm!1nnnLI*P_i|)Nah*( zoQe}6JUfJPlNi@g!CILoVhF_3TuarXr$SIG)zs9~1Zuwgpp4RCS}YbE)}S@h;v80jp9Z5oD`X zu-3iJDhNrR{kp*9$_in!|DvRZ^$w>)R+t!+V>C8`lfKh!q%2%BSE_G(vRZgq$fArG zUfos@>t>O0=7oVlZsSCrCe?!+%s-4+bzxI6^LNVrTq|G7(^s=S)#92J3Tnd)X$;HG zo@FnuU)D18&g?=7x+7FUEf}BnK7c{b)ZV4)0_st%@ADa)!Tg+mxsL*Ol}HTQM^ve7l0jI zGHeWDXC)|}?k3fYu@dylY!AJyt_n&&T`%hKU-2P=JdxcyFI8ioJZu5}w)wC&j+ka^ H!p;8xDEo2- diff --git a/apps/smclock/screenshot1.png b/apps/smclock/screenshot1.png index 1a020c9ca825f3f0772854801037aa37d3e036bf..da25b2579fadc66df8095c50f76ee95e8ea03a23 100644 GIT binary patch literal 2059 zcmd5-`BPI@6n;J)B?&Mlp#?{=5LvXPEF#JxON;@0B!VKQArTB#jG_h<5M(hvg$hOm zMTiJ4V+5ou4G2V*kY}q@1%nDg6oj~7kwBmXO$3F;ary^z`Jq4Dd*;md%{}LvbH2IR z8-fE(aSL$(0GPt-sG<5O{&X;3=*i~aZIL{xuT2T=Vku2sgcE_(W%)qsqP567E8x`cp%@W@PkUV0;r(T zWout)udT!K>06jeHvq{`fH|HKP=Sp-lAlFj!a}H^%b(-9jmXSi@UK7zGlfR|{Ncda zOtcf9e17(Pi>yrE}~(14pRCqvUo&?)I;r7lZ+wIaHsikR$q&aS-SZo_)9=+)|l+zUybr$W@r7S&srEb|t$8E=AN%&+*J`V};V{B{vzW;@9oED5Vn;af2S#h8! zxy06I;Z`=kNSU8HxLLX711E3n=!xq>n~8C0P^VE5)i?u{srgn`gBz5Im`2IG)!93O zXF8hkC4;k4EUW0M+-JODaRiTq*DZb5DZ?k*Q$Z`inbT-VhQnSsD0SG6;K3Kw2^|;r zK5o+JoXixHmv6S1>a4mgYNFZ1Ll(bGTZ?RQ;2?j#cOBX%eY3IlF^?3)&KnzReJZV8 zei~NJUq-tUxqh?`3gGm;p5rBvdII;J9vg=HA37i2m2>7K>^36i5f>o8g)Klrrqu(q z!2ZkyT{O*4AHhXI^~q=Vc$|2*7SEJhe%=c$R~>^?oa#t1E{&O7)QUld*015%ZG#w( zs_2~eq{J`)8M@zc5uIE+at#36i?Y!m{eoR>H>U(!AVXR3XRaMGlt5sfItMY91aRyk zh|GTiGBA5SD!QeKRa@E9#o1#jQJaw_K*_m0M?Z!JHSHn2`l|#3la|mD*mtyIQ0B$& z*4^{9jceZ$KfDv)?Os)qY5y$`jtJ(NZ~gBOrBog+Y}eVia>A zhvu*Ry4mZ&d3^Ha9oidVkh(?>VgFZ9K4$d&xs{!P?C8h$i8i~X;fY!gn+f{u_!rjV z3uHI0egMtsnsr1SRQS7z)J)ON2y3zaM0-NX3NFTJDUoOFLKzX+XsRGP_@VTD?Fj3> zYDjmn_S8tHk(|Y0L_mk6EU0_49Mhul`>wxcqpGdJqqPh&1Z^gGwM)crS#kRXKl)6l z@;|*(vFgkW+Vg@d+x)F_erlqR@TIv*>{>rS+F3JDP+TFwGsHdn9Ob$KjwqNqUsn0H zp;Ca}oRc!Ava`?`NI~h?!rBrl+RcNXd||EXwNb_Rgp7svD!NB$x4km(O;#hYvqF z%e{2B%1o_R*&$Vnn>^Ita4sF9cxT2Bo4>dsxc$6`D(f;hJKV;Og};iD8&uNA!?dGJ zybc);X!nY`KC)y2_C83wdp^`LCKt8HyA!`E;MaGSG~-5Ach-&=A5V6-9Re$J%Xmp9 z$47j`Z##alguaAq$1^urE{ms-Ycl}{$Q7H57EYCq*&jxE8T4EjKvulj)VCf$o?!~D z^8k?hsH~v~0GkP}YwYJi@~a_x-RD6EY_=bvgP3CY(o-IY84b7t6+(EAJm30f5MFUI z7wd|(j`i6Uj>YboT)>GRK`_f5-Ole^byLnKL-X@j3x#5s>T6Ujqas57ju zys7uMuhN7QQ&GYwMGi*rH3A^c*h2CojNncYO6Hae`*OUg#0anv7Yz_GxQ2YZj=)zR zlHVwXeLIn|fAGM@J`$A}wYNdX=6{FMFl!4r_jEGT@1bPRcR{5|Mwas%wR6*hEm)~B zH`09vgTa-~ZDH${%*>duzvq78g$nF2Eq0jOQsLleI$(Ja;1Nn`rodKovIfLgQZ~OcsB}{loX+8{?>Ox8-0fpMx9#aI$`pxFJv9D}3=_a=Vy>>Hj#=~{D-41G8!s;x{E zAIO>hj>z}dVbPK%w6)->+n_sh7N?l8?$#K=n0tm~R9WwQy6Nlu$cT|Y2}&&El00L4 zo(8|Zuw~tDRsI(BuH;e@J|@THXELghqHX_9yZV@m8^C_N3)Po)+{JK0Umm(Y?#omB zCBYlJ1WAg`*MnB}sVNb8f1 zKsi_ghKvy0%6X1EYS$f-3H28?Q%Ibv8W2+sqSx%7g^X<*U#~*9M`gEQs&@#q4lf{6 zs`Tpa!kF*7>0s~c{81|G zhEhBr#MnWlH!uPZChAhvZ8*8pn`#*aCcixo2xrV2cH8I(Zho9_F`UdnULtpc$>#1< z%ZR=I9W)vFKp8zJh6%68)kI6orvl@D%LJ%e{y@SgvlQ zSR^oDq^zmC`LC|jvm6}0$3XDgAytPa0+D~(#{Ju#ucEGU4ciiEzm{w1S;oCEpC8xA zjrb5a$|ET=mjyrF+jIc2iTcpg%uGO`>3o2^tUe4ZtFQ73&W63%>8(+i)YdY5Fa{v- zXO*`|qslZ+5DD25^yAbQdeD?~CP3HhPX-CT0b)0&+1+=aN){^L*(w!&79CD?2cBK; za_TvM@i_Rw>8N_hWy)SWj(IvfTAO|NkUki4QzW*f8Z{l;S(fMZG4^yp$#$UDO?3@4 zpgF4}>h`T^+4H$)B>g;@S;4%$ThAjQ7;?LJ53Ai@oYn%{Dxw#8%eZItU5+}mD>_WI zzwg_d7)!70eNK67!l$20>r|z!=lIi3YePnnhYhHV@WPyOkLHv4lZukGJ^x&;Eb%(k zArgfbez*l`Hb?-zqQ;2+SYf+a&2p7rH)J}h*KVtcj~Op+#=Z!e`<^w3!*@_JVye?k z=SvH=%ks#XlSl|=v_;n%7Oi*jI-eXZ|62Rd6gJ)f&vK4m(>$YPtxo2K_MD0!*xB%p z_diHig~a}37WbVO8`PsetBLtv?ghm zB=o=U&%lIPC?<}u7x?k~^R>z+8@?8Chm3Wj?mk-$xg5SxGq)HV67!&|i!It2J64Wi#If{$%HJ`q}3v8M=TZ0$P=tT$7JUtt4n-biWfoudIhF^o| j)ajKxhyNQF3v7K3qF${E{g&-jj{?Gj Date: Fri, 18 Mar 2022 00:43:18 +0100 Subject: [PATCH 075/122] smclock: Update README and metadata.json - remove support for BJs1 and not implemented features --- apps/smclock/README.md | 4 ++-- apps/smclock/metadata.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/smclock/README.md b/apps/smclock/README.md index 518d77d4e..2fc239ab2 100644 --- a/apps/smclock/README.md +++ b/apps/smclock/README.md @@ -9,7 +9,7 @@ It shows battery level in the upper left corner, date information in the upper r ## Settings -**Analog Clock:** +**Analog Clock:** *Not yet implemented.* **Background:** When the setting is set as "3bit", a background with more accurate colors is chosen for the watchface. Otherwise, it uses a background following the 16-bit Mac Color Palette. @@ -23,4 +23,4 @@ It shows battery level in the upper left corner, date information in the upper r Monogram Watch Face can be selected as the default clock or it can be run manually from the launcher. Its settings can be accessed and changed via the relevant menu. -Tapping on the "Alerts" area will replace the current time display with the time of the most immediate alert. +*Tapping on the "Alerts" area will replace the current time display with the time of the most immediate alert.* - *Feature not implemented yet.* diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index dec97b70c..55668adcc 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -9,7 +9,7 @@ "type": "clock", "tags": "clock", "readme": "README.md", - "supports": ["BANGLEJS", "BANGLEJS2"], + "supports": ["BANGLEJS2"], "allow_emulator": true, "storage": [ { "name": "smclock.app.js", "url": "app.js" }, From a6f92028e978cedc8683602c454e37d0ef65f803 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 01:09:45 +0100 Subject: [PATCH 076/122] Changed colors to basic colors --- apps/game1024/app.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 352426d57..829b29ba9 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -3,12 +3,10 @@ const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)} const rows = 4, cols = 4; const borderWidth = 6; const sqWidth = (Math.floor(Bangle.appRect.w - 48) / rows) - borderWidth; -const cellColors = [{bg:'#CCFFFF', fg: '#000000'}, - {bg:'#FF9966', fg: '#000000'}, {bg:'#330033', fg: '#FFFFFF'}, {bg:'#6600FF', fg: '#FFFFFF'}, {bg:'#33CC66', fg: '#000000'}, - {bg:'#990000', fg: '#FFFFFF'}, {bg:'#99FF66', fg: '#000000'}, {bg:'#0033CC', fg: '#FFFFFF'}, {bg:'#CCFF00', fg: '#000000'}, - {bg:'#00CC00', fg: '#FFFFFF'}, {bg:'#FF0000', fg: '#FFFFFF'}]; -const cellFgColor = '#000000'; -const cellShadowColor = '#f2f2f2'; +const cellColors = [{bg:'#00FFFF', fg: '#000000'}, + {bg:'#FF00FF', fg: '#000000'}, {bg:'#808000', fg: '#FFFFFF'}, {bg:'#0000FF', fg: '#FFFFFF'}, {bg:'#008000', fg: '#FFFFFF'}, + {bg:'#800000', fg: '#FFFFFF'}, {bg:'#00FF00', fg: '#000000'}, {bg:'#000080', fg: '#FFFFFF'}, {bg:'#FFFF00', fg: '#000000'}, + {bg:'#800080', fg: '#FFFFFF'}, {bg:'#FF0000', fg: '#FFFFFF'}]; const cellFonts = ["12x20", "12x20", "Vector:14"]; const cellChars = [ [0,1,2,3,4,5,6,7,8,9,10], @@ -135,7 +133,7 @@ const snapshot = { debug(console.log("reset D U M P E D!", this.dump)); } }; -const btnAtribs = {x: 134, w: 42, h: 42, fg:'#B5E61D', bg:'#870014'}; +const btnAtribs = {x: 134, w: 42, h: 42, fg:'#C0C0C0', bg:'#800000'}; const buttons = { all: [], draw: function () { @@ -679,4 +677,4 @@ buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R initGame(); -dragger.setEnabled(true); \ No newline at end of file +dragger.setEnabled(true); From 654ba447c1654093a6ebf6f86c1bb90900075978 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 01:10:38 +0100 Subject: [PATCH 077/122] incremented to version 0.03 --- apps/game1024/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 5b75212bc..510c93764 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "version": "0.02", + "version": "0.03", "icon": "game1024.png", "screenshots": [ {"url":"screenshot.png" } ], "readme":"README.md", @@ -15,4 +15,4 @@ {"name":"game1024.img","url":"app-icon.js","evaluate":true} ], "data":[{"name": "game1024.json", "url": "game1024.json"}] - } \ No newline at end of file + } From 762121e063a7cba858b7c01a001fa5fc339d17e3 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 01:11:29 +0100 Subject: [PATCH 078/122] Update to 0.03 --- apps/game1024/Changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog index b45a8d3ad..15e6f25b9 100644 --- a/apps/game1024/Changelog +++ b/apps/game1024/Changelog @@ -1,2 +1,3 @@ 0.01: New App! -0.02: Temporary intermediate version \ No newline at end of file +0.02: Temporary intermediate version +0.03: Basic colors From 8657e563cb4f34459b610ae626bdef9c072d4540 Mon Sep 17 00:00:00 2001 From: Salim Blume Date: Thu, 17 Mar 2022 22:01:46 -0500 Subject: [PATCH 079/122] When the user chooses to not delete a track, show it properly --- apps/recorder/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/recorder/app.js b/apps/recorder/app.js index e5e732fe3..99252e0e2 100644 --- a/apps/recorder/app.js +++ b/apps/recorder/app.js @@ -219,7 +219,7 @@ function viewTrack(filename, info) { f.erase(); viewTracks(); } else - viewTrack(n, info); + viewTrack(filename, info); }); }; menu['< Back'] = () => { viewTracks(); }; From 03a2bc29b82556af9096bfa388bb099a5d92dd33 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 18 Mar 2022 08:41:02 +0000 Subject: [PATCH 080/122] Remove files that weren't meant to be in the PR --- apps/timer/app-icon.js | 1 - apps/timer/app.js | 65 ------- apps/timer/app.png | Bin 1011 -> 0 bytes apps/timer/metadata.json | 13 -- apps/widdaysleft/daysleft.json | 9 - apps/widdaysleft/metadata.json | 14 -- apps/widdaysleft/widget.js | 78 --------- apps/widdaysleft/widget.png | Bin 1043 -> 0 bytes modules/suncalc.js | 298 --------------------------------- 9 files changed, 478 deletions(-) delete mode 100644 apps/timer/app-icon.js delete mode 100644 apps/timer/app.js delete mode 100644 apps/timer/app.png delete mode 100644 apps/timer/metadata.json delete mode 100644 apps/widdaysleft/daysleft.json delete mode 100644 apps/widdaysleft/metadata.json delete mode 100644 apps/widdaysleft/widget.js delete mode 100644 apps/widdaysleft/widget.png delete mode 100644 modules/suncalc.js diff --git a/apps/timer/app-icon.js b/apps/timer/app-icon.js deleted file mode 100644 index d0fb2e0be..000000000 --- a/apps/timer/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4ALjAAWF/4v3AAWJACDCdF/4vf/1ms1l///h4FBAA4ugs0eFwNlF5IweEAUP/8eFxQvjLxYvhR4Ivtd4IvqSAjupMAsPF9TBEMBIugMIouqF4ZerGBYukGBIumGA4uoF96+2GEwuJGEooEoVCF84uFlUqGEwuHGE4uIGAwuijguFAAMcGEIgCjouHAAMdF8crF5MrF8SNISIwvfdgzyIeECPNFz2JACAv/F/UYACwv/F+4A/AH4AzA=")) diff --git a/apps/timer/app.js b/apps/timer/app.js deleted file mode 100644 index e903f84b5..000000000 --- a/apps/timer/app.js +++ /dev/null @@ -1,65 +0,0 @@ -var mins = 7; -var counter; -var counterInterval; -var timers = [9, 7, 5, 3, 1]; - -function showMainMenu() { - const menu = { - '': { 'title': 'Timers' }, - }; - timers.forEach((timer,idx)=>{ - menu[timer] = function() { - startTimer(timer); - }; - }); - return E.showMenu(menu); -} - -function outOfTime() { - if (counterInterval) return; - E.showMessage("Out of Time", "My Timer"); - Bangle.buzz(); - // again, 3 secs later - setTimeout(outOfTime, 3000); -} - -function countDown() { - counter--; - // Out of time - if (counter<=0) { - clearInterval(counterInterval); - counterInterval = undefined; - setWatch(()=>{load();}, BTN1); // Bangle1: BTN2 - outOfTime(); - return; - } - - function sec2time(counter) { - let m = Math.floor(counter / 60); - let s = counter - m * 60; - if (s < 10) - return `${m}:0${s}`; - else - return `${m}:${s}`; - } - - g.clear(true); - g.drawImage(require("Storage").read("timer.img"),70,20); - g.setFontAlign(0,0); // center font - g.setFont("Vector",60); // vector font, 80px - // draw the current counter value - g.drawString(sec2time(counter),90,120); - // optional - this keeps the watch LCD lit up - // g.flip(); -} - -function startTimer(timer) { - counter = timer * 60; - // console.log(counter); - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -showMainMenu(); -//startTimer(); \ No newline at end of file diff --git a/apps/timer/app.png b/apps/timer/app.png deleted file mode 100644 index cfd942ea013fdda73add2a8f06f63628f6f4d8eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmV0rD z1-1BOqO}O(lTg8jLJ)2HRIT^}1<@B3tE;kzRZPKx4Rq6xZQYf&R3tTNv)N5%=J>F? z>1LBQGkb19$$nqv-aGf)@Au3-_s*R;&_omK8z!v5=nK!D1oOZx5;L~{?ROsxV-snB z=9Y*D5Euw+(|`kzr0`q47-!tV&62XK{W%u_)k^Kcf`xjV!?yV-@(KK zh{zs|23-hAWNFWi$I93ItdHx5lJJm5f^rSW-Akp)espC%?8YP=8U@-#JX0+c7R%R? z7kX#Cq7k5SK;T5RJX0zQ54$TE_*tVt_zRpmJca$2m^T z6P%p(xocC1A%%1@5&KS~LH{O>_|E}Ffa!T*wiI|4ipKGW)%4l{hI(2v7OOo=Ve>G)@A@8 zeO5NRj{75qdv4HWEWY3jJ=|}u+Tyh806;1)oyPTk0!h@}I_<@rosV~!X`6i3zXwVV z|A1Ur<(BXISor{|g;fWB`BUO;MfVHfkyUQr-|D%?PfSR=O-^eLd@2&1bKTE?!JBj& zD73hrr_xT!*UBPJonLs`h?#4j?n{f(7I zB728=TaK-~5e{kxzRwjC;zfT4HeGKO`X=_%l|KwXzI%kpzR`NRf)Q^=vbSwg!>7d}`nAR6rabR+0O$TyExi|toW z)1Mhx)1*K1Jh#oBTB?g&AEOcI95CDoV8r9T@jXPm`LzlCBKM9zgAuPX1e-Myw0|Wo z19V*ckd4N0pknq*0)p0rMNchQd^6(|93UDaomuc3cD6HSjS&u4f;m z*3Q6YrM4~Px4u}ei1|b#LHT?AF?F^^3}c7COoz(K)Izxi^w}CC;j=Qe_}}LTnn^yJ hSeHq@CYo69_!rhyA?h4K76AYN002ovPDHLkV1g(R?#}=K diff --git a/apps/timer/metadata.json b/apps/timer/metadata.json deleted file mode 100644 index b50b81e86..000000000 --- a/apps/timer/metadata.json +++ /dev/null @@ -1,13 +0,0 @@ -{ "id": "timer", - "name": "Peter´s Timer", - "shortName":"Timer", - "icon": "app.png", - "version":"0.01", - "description": "This is Peter´s awesome timer app", - "tags": "", - "supports" : ["BANGLEJS2"], - "storage": [ - {"name":"timer.app.js","url":"app.js"}, - {"name":"timer.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/widdaysleft/daysleft.json b/apps/widdaysleft/daysleft.json deleted file mode 100644 index c2349db0b..000000000 --- a/apps/widdaysleft/daysleft.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { "day": 25, "month": 2, "year": 2022 }, // Urlaub Essen - { "day": 2, "month": 3, "year": 2022 }, // Aschermittwoch - { "day": 27, "month": 3, "year": 2022 }, // Sommerzeit - { "day": 16, "month": 4, "year": 2022 }, // Ostersamstag - { "day": 3, "month": 6, "year": 2022 }, // Kalamata - { "day": 17, "month": 7, "year": 2022 }, // Exerzitien - { "day": 31, "month":12, "year": 2022 } // Sylvester -] \ No newline at end of file diff --git a/apps/widdaysleft/metadata.json b/apps/widdaysleft/metadata.json deleted file mode 100644 index 76b0f967a..000000000 --- a/apps/widdaysleft/metadata.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "widdaysleft", - "name": "Days Left", - "version": "0.01", - "description": "Read daysleft.json and show number of days left until first date, which lies in the future", - "icon": "widget.png", - "type": "widget", - "tags": "widget,tools", - "supports": ["BANGLEJS2"], - "storage": [ - {"name":"widdaysleft.wid.js","url":"widget.js"}, - {"name":"daysleft.json", "url":"daysleft.json"} - ] -} diff --git a/apps/widdaysleft/widget.js b/apps/widdaysleft/widget.js deleted file mode 100644 index 1bc891690..000000000 --- a/apps/widdaysleft/widget.js +++ /dev/null @@ -1,78 +0,0 @@ -const storage = require('Storage'); -let settings; -let height = 23; -let width = 34; - -var debug = 0; //1 = show debug info - -settings = storage.readJSON('daysleft.json',1); //read storage -if (!settings) print("no daysleft.json found"); -var i = 0; -const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds -const today = new Date(); //includes current time -const currentYear = today.getFullYear(); -const currentMonth = today.getMonth(); -const currentDay = today.getDate(); -const todayMorning = new Date (currentYear, currentMonth, currentDay, 0, 0, 0); //create date object with today, but 00:00:00 -do { - var target = settings[i]; - if (target) { - var dd = target.day, - mm = target.month-1, //-1 because month is zero-based - yy = target.year; - const targetDate = new Date(yy, mm, dd); //is 00:00 - i += 1; - } -} while (target && todayMorning >= targetDate); - -const diffDays = (target ? (targetDate - todayMorning) / oneDay : 0); //calculate day difference - -function drawWidget() { - if (debug == 1) g.drawRect(this.x,this.y,this.x+width,this.y+height); //draw rectangle around widget area - g.reset(); - - //define font size and string position - //small if number has more than 3 digits (positive number) - if (diffDays >= 1000) { - g.setFont("6x8", 1); - g.drawString(diffDays,this.x+10,this.y+7); - } - //large if number has 3 digits (positive number) - if (diffDays <= 999 && diffDays >= 100) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x,this.y+4); - } - //large if number has 2 digits (positive number) - if (diffDays <= 99 && diffDays >= 10) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x+6,this.y+4); - } - //large if number has 1 digit (positive number) - if (diffDays <= 9 && diffDays >= 0) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x+13,this.y+4); - } - //large if number has 1 digit (negative number) - if (diffDays <= -1 && diffDays >= -9) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x+5,this.y+4); - } - //large if number has 2 digits (negative number) - if (diffDays <= -10 && diffDays >= -99) { - g.setFont("6x8", 2); - g.drawString(diffDays,this.x,this.y+4); - } - //large if number has 3 digits or more (negative number) - if (diffDays <= -100) { - g.setFont("6x8", 1); - g.drawString(diffDays,this.x,this.y+7); - } -} - -//draw widget -WIDGETS["widdaysl"]={area:"tl",width:width,draw:drawWidget}; - -setTimeout(function() { - Bangle.loadWidgets(); - WIDGETS["widdaysl"].draw(WIDGETS["widdaysl"]); - }, todayMorning + oneDay - today + 1000); // update at next noon diff --git a/apps/widdaysleft/widget.png b/apps/widdaysleft/widget.png deleted file mode 100644 index 70aa664e4951e9ad02b3840004e0edbb42aa0274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1043 zcmV+u1nm2XP)z#5?V?Eh00b*1C7%MvebBLgk__$G(3?!Vn;(l&?N_;PJ24OUI%z zu!N6+F2E^-7*f$FmyVJFz`5$UTT!DdI$ExVowL#}7wP%foJAdnsNXUFoPpmW$Pn9G1YM;w5l{%@%R3xH5sjf>T3 zHVYQL3TX}pr_UP%bxB|WKD}UIbC}Mys_2+nUTam6NlDB*m!1Ne!@-93E`+7HDyZnp zoUms#=3GW|AuNKrPA7Gp&itLLprg8x-7(zt223a1$kn*w&RSUxZntISd)HT>W?;Rk z8CY+M-pE#nF2)(2nByn6A73~|Q-elZOFjGdY~iVg+p(_kULz&AJz>T#-(te$XXv$k zs%fYh2t<}Rb@~#%@KQP!ipB^YUo&#i%O~fi%aZhJlne+VcyMbA07v(C zv3FbQII1W3(d7f+iYJm`Af8O72DDn}aMUw~?*lhOe>3v)bqraZ_ra1Y@XjlJ7*cZGx5(hI zn`<|9MknX#*xbm|k93wJ$2BQS1*}5Q-P*{({*H8P@=CBA(s?Pm0`WwWm);v^Wrm!3 zv6r1)sh=1jJ(lj5yi=!;O|!7e*^Fy848VtHT@3WK5nW6$HZ`B_*SowoR2roz^zz{z znwHo3P&CHb?`Ao7@dgPawOQ?QHgjZO<>x;rKE&Ovjl6rjpWz7)lYa#9hhx~R0%vO@ zk3G=JKz}=0k-u3~seKc#H@OT%s+vV%+%^lE8<31vG!-S}*Je>u16E<26i}U=s4)DR zVSCf8!PLOO_IkIG)E*M>IS{UBYHJe)`I%;DeNWyeJnNW8jT$v7#XpmfZd3Da;PC(e N002ovPDHLkV1n(i@o@kE diff --git a/modules/suncalc.js b/modules/suncalc.js deleted file mode 100644 index b1af0a0d9..000000000 --- a/modules/suncalc.js +++ /dev/null @@ -1,298 +0,0 @@ -/* Module suncalc.js - (c) 2011-2015, Vladimir Agafonkin - SunCalc is a JavaScript library for calculating sun/moon position and light phases. - https://github.com/mourner/suncalc - -PB: Usage: -E.setTimeZone(2); // 1 = MEZ, 2 = MESZ -SunCalc = require("suncalc.js"); -pos = SunCalc.getPosition(Date.now(), 53.3, 10.1); -times = SunCalc.getTimes(Date.now(), 53.3, 10.1); -rise = times.sunrise; // Date object -rise_str = rise.getHours() + ':' + rise.getMinutes(); //hh:mm -*/ -var exports={}; - -// shortcuts for easier to read formulas - -var PI = Math.PI, - sin = Math.sin, - cos = Math.cos, - tan = Math.tan, - asin = Math.asin, - atan = Math.atan2, - acos = Math.acos, - rad = PI / 180; - -// sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas - -// date/time constants and conversions - -var dayMs = 1000 * 60 * 60 * 24, - J1970 = 2440588, - J2000 = 2451545; - -function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; } -function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); } // PB: onece removed + 0.5; included it again 4 Jan 2021 -function toDays(date) { return toJulian(date) - J2000; } - - -// general calculations for position - -var e = rad * 23.4397; // obliquity of the Earth - -function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); } -function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); } - -function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); } -function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); } - -function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; } - -function astroRefraction(h) { - if (h < 0) // the following formula works for positive altitudes only. - h = 0; // if h = -0.08901179 a div/0 would occur. - - // formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. - // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad: - return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179)); -} - -// general sun calculations - -function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); } - -function eclipticLongitude(M) { - - var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center - P = rad * 102.9372; // perihelion of the Earth - - return M + C + P + PI; -} - -function sunCoords(d) { - - var M = solarMeanAnomaly(d), - L = eclipticLongitude(M); - - return { - dec: declination(L, 0), - ra: rightAscension(L, 0) - }; -} - -// calculates sun position for a given date and latitude/longitude - -exports.getPosition = function (date, lat, lng) { - - var lw = rad * -lng, - phi = rad * lat, - d = toDays(date), - - c = sunCoords(d), - H = siderealTime(d, lw) - c.ra; - - return { - azimuth: Math.round((azimuth(H, phi, c.dec) / rad + 180) % 360), // PB: converted to deg - altitude: Math.round( altitude(H, phi, c.dec) / rad) // PB: converted to deg - }; -}; - - -// sun times configuration (angle, morning name, evening name) - -var times = [ - [-0.833, 'sunrise', 'sunset' ] -]; - -// calculations for sun times -var J0 = 0.0009; - -function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); } - -function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; } -function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); } - -function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); } -function observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; } - -// returns set time for the given sun altitude -function getSetJ(h, lw, phi, dec, n, M, L) { - - var w = hourAngle(h, phi, dec), - a = approxTransit(w, lw, n); - return solarTransitJ(a, M, L); -} - - -// calculates sun times for a given date, latitude/longitude, and, optionally, -// the observer height (in meters) relative to the horizon - -exports.getTimes = function (date, lat, lng, height) { - - height = height || 0; - - var lw = rad * -lng, - phi = rad * lat, - - dh = observerAngle(height), - - d = toDays(date), - n = julianCycle(d, lw), - ds = approxTransit(0, lw, n), - - M = solarMeanAnomaly(ds), - L = eclipticLongitude(M), - dec = declination(L, 0), - - Jnoon = solarTransitJ(ds, M, L), - - i, len, time, h0, Jset, Jrise; - - - var result = { - solarNoon: fromJulian(Jnoon), - nadir: fromJulian(Jnoon - 0.5) - }; - - for (i = 0, len = times.length; i < len; i += 1) { - time = times[i]; - h0 = (time[0] + dh) * rad; - - Jset = getSetJ(h0, lw, phi, dec, n, M, L); - Jrise = Jnoon - (Jset - Jnoon); - - result[time[1]] = fromJulian(Jrise); - result[time[2]] = fromJulian(Jset); - } - - return result; -}; - - -// moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas - -function moonCoords(d) { // geocentric ecliptic coordinates of the moon - - var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude - M = rad * (134.963 + 13.064993 * d), // mean anomaly - F = rad * (93.272 + 13.229350 * d), // mean distance - - l = L + rad * 6.289 * sin(M), // longitude - b = rad * 5.128 * sin(F), // latitude - dt = 385001 - 20905 * cos(M); // distance to the moon in km - - return { - ra: rightAscension(l, b), - dec: declination(l, b), - dist: dt - }; -} - -getMoonPosition = function (date, lat, lng) { - - var lw = rad * -lng, - phi = rad * lat, - d = toDays(date), - - c = moonCoords(d), - H = siderealTime(d, lw) - c.ra, - h = altitude(H, phi, c.dec), - // formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. - pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H)); - - h = h + astroRefraction(h); // altitude correction for refraction - - return { - azimuth: azimuth(H, phi, c.dec), - altitude: h, - distance: c.dist, - parallacticAngle: pa - }; -}; - - -// calculations for illumination parameters of the moon, -// based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and -// Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. - -getMoonIllumination = function (date) { - - var d = toDays(date || new Date()), - s = sunCoords(d), - m = moonCoords(d), - - sdist = 149598000, // distance from Earth to Sun in km - - phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)), - inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)), - angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) - - cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra)); - - return { - fraction: (1 + cos(inc)) / 2, - phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI, - angle: angle - }; -}; - - -function hoursLater(date, h) { - return new Date(date.valueOf() + h * dayMs / 24); -} - -// calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article - -getMoonTimes = function (date, lat, lng, inUTC) { - var t = new Date(date); - if (inUTC) t.setUTCHours(0, 0, 0, 0); - else t.setHours(0, 0, 0, 0); - - var hc = 0.133 * rad, - h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc, - h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx; - - // go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set) - for (var i = 1; i <= 24; i += 2) { - h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc; - h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc; - - a = (h0 + h2) / 2 - h1; - b = (h2 - h0) / 2; - xe = -b / (2 * a); - ye = (a * xe + b) * xe + h1; - d = b * b - 4 * a * h1; - roots = 0; - - if (d >= 0) { - dx = Math.sqrt(d) / (Math.abs(a) * 2); - x1 = xe - dx; - x2 = xe + dx; - if (Math.abs(x1) <= 1) roots++; - if (Math.abs(x2) <= 1) roots++; - if (x1 < -1) x1 = x2; - } - - if (roots === 1) { - if (h0 < 0) rise = i + x1; - else set = i + x1; - - } else if (roots === 2) { - rise = i + (ye < 0 ? x2 : x1); - set = i + (ye < 0 ? x1 : x2); - } - - if (rise && set) break; - - h0 = h2; - } - - var result = {}; - - if (rise) result.rise = hoursLater(t, rise); - if (set) result.set = hoursLater(t, set); - - if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true; - - return result; -}; \ No newline at end of file From 3f20ad8af099ed51eaaaaee50bf32d847d201fc6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 18 Mar 2022 08:51:53 +0000 Subject: [PATCH 081/122] fix remaining icon sizes --- apps/alpinenav/app-icon.js | 2 +- apps/arrow/icon.js | 2 +- apps/astral/app-icon.js | 2 +- apps/s7clk/icon.js | 2 +- apps/s7clk/icon.png | Bin 279 -> 4066 bytes apps/slomoclock/app-icon.js | 2 +- 6 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/alpinenav/app-icon.js b/apps/alpinenav/app-icon.js index dba084202..6708ee67f 100644 --- a/apps/alpinenav/app-icon.js +++ b/apps/alpinenav/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mUywkEIf4A/AHUBiAYWgcwDC0v+IYW///C6sC+c/kAYUj/xj/wDCgvBgfyVihhBAQQASh6TCMikvYoRkU/73CMicD+ZnFViJFBj5MBMiU/+IuBJoJkRCoUvfIPy/5kQVgM//7gBC4KCDFxSsDgTHCl8QWgaRKmBJBFIzmDSJXzYBECWobbJAAKNIMhYlBOoK/IMhZXCmYMLABAkCS4RkSXZoNJRBo/CgK6UBwTWBBIs/SJBAGl7UFegIXMaogHEehAAHj/yIYsfehAAGMQISFMRxbCiEDU4ZiQZY5iQZYpiSbQ8/cwzLOCiQA/AH4A1A")) \ No newline at end of file +require("heatshrink").decompress(atob("mEkgIRO4AFJgPgAocDAoswAocHAokGjAFDhgFFhgFDjEOAoc4gxSE44FDuPjAod//+AAoXfn4FCgPMjJUCmIJBAoU7AoJUCv4CBsACBtwCBuACB4w3CEQIaCKgMBFgQFBgYFCLQMDMIfAg55D4BcDg/gNAcD+B0DSIMcOgiGEjCYEjgFEhhVCUgQ")) diff --git a/apps/arrow/icon.js b/apps/arrow/icon.js index 380728484..917a5c979 100644 --- a/apps/arrow/icon.js +++ b/apps/arrow/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mUywIebg/4AocP//AAoUf//+BYgMDh/+j/8Dol/wEAgYFBg/wgEBFIV+AQIVCh4fBnwFBgISBj8AhgJCh+Ag4BB4ED8ED+ASCAYJDBnkAvkAIYIWBjw8B/EB8AcBn//gF4DwJdBAQMA/EP738FYM8g/nz+A+EPgHx8YKBgfAjF4sAKBHIItBBQJMBFoJEBHII1BIQIDCvAUCAYYUBHIIDBMIXACgQpBRAIUBMIIrBDAIWCVYaiBTYQJCn4FBQgIIBEYKrDQ4MBVYUf8CQCCoP/w6DBAAKIBAocHAoIwBBgb5DDoYAZA=")) +require("heatshrink").decompress(atob("kkkwIEBgf8AYMB//4AgN///ggEf4E/wED+EACQN8C4Pgh4TBh8BCYMAvEcEoWD4AEBnk4gFggPHwAXBj1wgIwB88An/Ah3gg/+gF+gH/+EH8Ef/+ABAPvuAIBgnyCIQjBBAMAJAIIEuAICFgIIBh14BAMB8eAg0Ajk8KAXBKAU4jwDBg+ADoIXBg4NBnxPBEgPAgP8gZaBg//KoKLBKAIEBMQMAA")) diff --git a/apps/astral/app-icon.js b/apps/astral/app-icon.js index 19d0998ff..d10e7a498 100644 --- a/apps/astral/app-icon.js +++ b/apps/astral/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mUyxH+AH4AG3YAGF1w0oExYykEZwyhEIyRJGUAfEYpgxjLxQNEGEajMGTohPGMBTQOZwwTGKoyXDASVWGSwtHKYYAJZbYVEGR7bSGKQWkDRQbOCAoxYRI4wMCIYxXXpQSYP6L4NCRLGXLZwdVMJwAWGKgwbD6aUTSzoRKfCAxbAogcJBxQx/GP4x/GP4xNAAoKKBxwxaGRQZPSqwZmGOZ7VY8oxnPZoJPGP57TBJavWGL7gRRaiPVGJxRGBJgxcACYxfHJIRLSrTHxGODHvGSgwcAEY=")) \ No newline at end of file +require("heatshrink").decompress(atob("kUw4MA///xP5gEH/AMBh//4AHBwF4gEDwEHgEB4fw8EAsf/jEAjPh80AhngjnAgcwAIMB5kA50A+cAmfAtnAhnYmc//8zhln/+c4YjBg0w440Bxk38EB/cP/0B//Dwf/+FxwEf8EGIAJGB2BkCnhiB4EPgF//EDFQIpB+HGgOMnkxwFjh8MsEY4YQHn/x//j//8n/wHYItBCAKFBhgKBKAIQBBgIQC4AQCmAQChkD/v8gcA/wCBBoMA7+39kAPwP/WIMP4aYBCAYhCCAkHAYOAA=")) diff --git a/apps/s7clk/icon.js b/apps/s7clk/icon.js index d5d9aaf68..dbb4fc6d3 100644 --- a/apps/s7clk/icon.js +++ b/apps/s7clk/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mUygP/AC5BlH4MAn/gAwN/4EP/AFBsEMhkBwEAjEDgYJBgEGgHA4EYDwOAmEwBIIYyj/wgf+AoMH/kA/4eBJXwYLVxgAjh//AC3w")) +require("heatshrink").decompress(atob("mEqgInkn/gg/8Ao/AjEYgYF/AoZT/Kb4AiA=")) diff --git a/apps/s7clk/icon.png b/apps/s7clk/icon.png index cb08aec5e1b88cbd097bd451c072ec7c04d3bea9..cfb1c0349c54f8e947faf29e01744781e108d719 100644 GIT binary patch literal 4066 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 Date: Fri, 18 Mar 2022 11:49:26 +0100 Subject: [PATCH 083/122] New app icon, less colors Old app icon did not show in the watch --- apps/game1024/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/app-icon.js b/apps/game1024/app-icon.js index 2a9df2fa3..3af366bc9 100644 --- a/apps/game1024/app-icon.js +++ b/apps/game1024/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwg96xAACCqMICwYABwAsSAAoWWDBhEGJSAWLGBQuMGBQWNGBAuH/84GBoNGx///AwMFxH/mQYHGAgXHn//GIIXLIo84nAxBwZIKFo4YBMAM/PQwXJCwIABn8y//zC5BeFwYXDmaSCGApgCC4oRBAAQ0CwYwFC5BeB/GCkY0B+YHBC452H+YqBSYRgJUw7tCAYIZCC6ApBU4TZHC44rCJAJgCR4wXLIgMzC4MzF55ICSYUzC6bZDPgIXOJAYACLwwXCa4oXHBgzvIJAzVGC7ZgHwXdAAXSLxAXIpvUkUilvdC6Pd7ADBwndlAXJMAwXLLwYXI6Wq1RHBC5RIGCYIAC6hGJGA6nKFwp5IABAWGbRDUKGCYWIGBouJGBoWKDBYWMJRBELGRQVRAE4A==")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwwkBkQAWkAyVgQXYhnMACXAC/4X/C/4XH5s9CAvTmfcC5nf/4GGAAM8C5YOBGogWC//zC5XDC4ouB/vdBIJJCC4wnDC4c/CYXP//8C5APBC4pDDHQIXICwPzAQI2EC4QEB/oXHQYQXGCQQ0EF4wOBC6nNJQYXSPIgXaRQIvtC7jEEC5oqEa5QXIAoZ8B/gXQ774BAYgXPFYP/BAIJDC5wGCAAJGCC5PfOISREPQYXKABHdAogXRAAoX/C/4X/C+UAACgXYkQAW")) From a3c2c05878eb72c161fc2ae23789eab040b56d25 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 11:59:39 +0100 Subject: [PATCH 084/122] Data file removed from the set up Data file game1024.json will be generated by the app --- apps/game1024/metadata.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 510c93764..92d34bed3 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -13,6 +13,5 @@ "storage": [ {"name":"game1024.app.js","url":"app.js"}, {"name":"game1024.img","url":"app-icon.js","evaluate":true} - ], - "data":[{"name": "game1024.json", "url": "game1024.json"}] + ] } From 296cd68f139ce3d61102084a24ecfd7b9eab035e Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:06:27 +0100 Subject: [PATCH 085/122] Delete screenshot.png will be changed with a new one --- apps/game1024/screenshot.png | Bin 5904 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png deleted file mode 100644 index 256ecb53bc679984c59b5847219ab9bb4a7097bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5904 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 From bcf658c84334324f3917d092e3a8d847874b3444 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:07:15 +0100 Subject: [PATCH 086/122] Add files via upload New screenshot --- apps/game1024/screenshot.png | Bin 0 -> 5313 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc244bdae62034fddade46d012902e0200b30d0 GIT binary patch literal 5313 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 CG8;Gm literal 0 HcmV?d00001 From 9999764b9f57a3802e0eae46a2f86e0292700a92 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:10:44 +0100 Subject: [PATCH 087/122] Delete screenshot.png --- apps/game1024/screenshot.png | Bin 5313 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png deleted file mode 100644 index 5cc244bdae62034fddade46d012902e0200b30d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5313 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 CG8;Gm From 139a7a9775cfe00376b5c2d62df8ad014daa5861 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:11:26 +0100 Subject: [PATCH 088/122] Add files via upload New screenshot, new colors --- apps/game1024/screenshot.png | Bin 0 -> 5313 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/screenshot.png diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc244bdae62034fddade46d012902e0200b30d0 GIT binary patch literal 5313 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 CG8;Gm literal 0 HcmV?d00001 From 61af019839b309f92e256197715d49f0a5341282 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:25:40 +0100 Subject: [PATCH 089/122] Delete game1024.png will be replaced --- apps/game1024/game1024.png | Bin 1768 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/game1024.png diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png deleted file mode 100644 index 4118dd3ca0de7e48b2944f9bbaae606cf9647d8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1768 zcmVP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5Z6$WWauh>AFBD-@wZs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0YbCNG^=L<&~)3( zq!MB-zbb}a5kwdf#1W90Wz0)b8ouM}9s$1I#d((hxj#olEm#Z)h{SWuFm2)u;+aj` z;Ji;9Wo204L)D#X^Sm6F&Z7*DsMvAy);A z91EyHgY5dj|KNAGR&i?5OA04|-WSLD7zIMRK&#<6-^Y&AIst;uz?I(d*P6iWC+Urj z7CQn4wtHLth!K29HiEOnK>0S*p< zu@Ysk`@FlaySIPOwEO!3C_QqCyM6Kv00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-{s3=SC+6rWO?0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbR z(n&-?RA}Dqm~Bi`R~W~Cw*^W8UCRVBlnGUhzQHxnq`y4V1{4V zmYAqpVsth!Q$tLKS;T181w|9Xq8&>M^MxW=g(#~!CV~+$fo{C>7{_r(a2be+i(&oN^;l{wSdUo$ALoEzG_m%FI>JBMMoY(azuN4j*~GsX zPw|>!4q6XVaiHSK7V%il1ORh|8FPhs;v{|`114A~7+I*yAaB!5HsO(2DBlsduBy{b z!NEektzEQMHgMhY2XFnn8ts%Q_6I7wfvXIy1=G^xu$@nsld`HwU5N5sc7^O<6Fd%2%--LZz;<{k|^Qn8{(Hw z_tW%^1$XbD@&?EuuW;$w}Oi7JXwg&P(gY4zt^TCa7IJOtrEL6OvnBJaVRu!!B`B5L!G6dEOHrvy&1CM23PS_mG zGtF4iEbL6!NhtnVLXx0*cPH;JJjLE^m$-9B8g+FAn+=aB-v92$t}e3ec6N7mBK{*= z9?L+UK99D6HdeQ;MwCQ~bVYvk*E)t!sRSy2%_J^COZ)kOe>Z9{@NGiE{m-34L)`Fs z`6(j{oZ8*+t9?8X9gd=Cy@794C5Z%^#=HaN_1oJfcX$ty@eB4_C&(T+LjpbF6Gk z-biClBQ*mxe)aK55u82U$2;>*Qg`G!Nhy;?E#kH9?S$9Y)8cXwuhsH=SQu}fKFyHN z$E%T%51+&n=fK3Z%CpWwl``_qcsK7VC3)A0M!_VTvmU6i{J@WPw(9h!YzOWQ{elI& zy=4mkqR+>^oScA@IO{uTIo3wurYuE+%UKw~%$G-QB#ztrX};i-6e04AU>7k*?#VbjXxV@76B95OuoA)dhvUco12=z~xzt>%6)*Ca%B|SR2 zeK;?95k-mf?Zfg6+_c--pPS18qY;%_O=8jLgxPbYpV*i5gp9-L-y22Cbo_Rvf9wzS zk|-ht=pGkOUSU_!-}n%lsN?ky(-bw3mO7a)Hg(81kWx~@yn+IJ!^2#4I%%&O{q`)g zFon#*6aWr>Rj+vP0Bbj19$Ob`Eib3FynM`mv|_{J36yvyQQ|LfmGqg4p;7q&0000< KMNUMnLSTZhfk=Y@ From e86e5bb9fdaf9e99a9ce314de46fbead5bcf1cef Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:26:22 +0100 Subject: [PATCH 090/122] New icon image --- apps/game1024/game1024_10-2.png | Bin 0 -> 425 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/game1024_10-2.png diff --git a/apps/game1024/game1024_10-2.png b/apps/game1024/game1024_10-2.png new file mode 100644 index 0000000000000000000000000000000000000000..28b0079d8e0ed8691675d60a189be1c3c8869373 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sP60k4t_=+hKqe3X89)GJ{0E|# znE&h6{daKqFDdyyJNv(}@qZwws`}5v^S`_M|KY>`{rvvly7hm~od0TSr5=a1fZA9} zg8YKdpMU@Uoor++kk6Q3Ae+_G#WBR=_}go@g_;xu7y^78T*6$Q{;xL` z6Vcq7P_-iMj=1>K9Yq%>3Pg#tT<8*Yapg>9U6jNjah|WNF`l(IWAe0|7J<1nj3Nv< zYx$hMEO&6`y7rIZFy{p|)(BoJQ@?i?N*{j2N*Qn(~K@$6x{SgdKbC^EMeVHG6f+aa( zq0NS~`?_|&RGm=xtI3%!Ao`R{~r@#A7nq6_WyN(bHIiBoL;Xs-Jk!9Z?CWQ$vZR8o&tsr NgQu&X%Q~loCIDf;w_yMP literal 0 HcmV?d00001 From 03efd3af5cbd1d9df26d44281358bbfb39c2f813 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:28:56 +0100 Subject: [PATCH 091/122] Delete game1024_10-2.png --- apps/game1024/game1024_10-2.png | Bin 425 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/game1024_10-2.png diff --git a/apps/game1024/game1024_10-2.png b/apps/game1024/game1024_10-2.png deleted file mode 100644 index 28b0079d8e0ed8691675d60a189be1c3c8869373..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sP60k4t_=+hKqe3X89)GJ{0E|# znE&h6{daKqFDdyyJNv(}@qZwws`}5v^S`_M|KY>`{rvvly7hm~od0TSr5=a1fZA9} zg8YKdpMU@Uoor++kk6Q3Ae+_G#WBR=_}go@g_;xu7y^78T*6$Q{;xL` z6Vcq7P_-iMj=1>K9Yq%>3Pg#tT<8*Yapg>9U6jNjah|WNF`l(IWAe0|7J<1nj3Nv< zYx$hMEO&6`y7rIZFy{p|)(BoJQ@?i?N*{j2N*Qn(~K@$6x{SgdKbC^EMeVHG6f+aa( zq0NS~`?_|&RGm=xtI3%!Ao`R{~r@#A7nq6_WyN(bHIiBoL;Xs-Jk!9Z?CWQ$vZR8o&tsr NgQu&X%Q~loCIDf;w_yMP From 49f2dae36dd66a567153baa1544cdc5d318b024e Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Fri, 18 Mar 2022 12:29:54 +0100 Subject: [PATCH 092/122] Add files via upload New icon image --- apps/game1024/game1024.png | Bin 0 -> 425 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/game1024.png diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png new file mode 100644 index 0000000000000000000000000000000000000000..28b0079d8e0ed8691675d60a189be1c3c8869373 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sP60k4t_=+hKqe3X89)GJ{0E|# znE&h6{daKqFDdyyJNv(}@qZwws`}5v^S`_M|KY>`{rvvly7hm~od0TSr5=a1fZA9} zg8YKdpMU@Uoor++kk6Q3Ae+_G#WBR=_}go@g_;xu7y^78T*6$Q{;xL` z6Vcq7P_-iMj=1>K9Yq%>3Pg#tT<8*Yapg>9U6jNjah|WNF`l(IWAe0|7J<1nj3Nv< zYx$hMEO&6`y7rIZFy{p|)(BoJQ@?i?N*{j2N*Qn(~K@$6x{SgdKbC^EMeVHG6f+aa( zq0NS~`?_|&RGm=xtI3%!Ao`R{~r@#A7nq6_WyN(bHIiBoL;Xs-Jk!9Z?CWQ$vZR8o&tsr NgQu&X%Q~loCIDf;w_yMP literal 0 HcmV?d00001 From ead78423363f9a794109d7f12c5ebcfe68280035 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 07:39:25 -0700 Subject: [PATCH 093/122] Update crow_clock.js --- apps/crowclk/crow_clock.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/crowclk/crow_clock.js b/apps/crowclk/crow_clock.js index d06369fa8..eee1653cb 100644 --- a/apps/crowclk/crow_clock.js +++ b/apps/crowclk/crow_clock.js @@ -76,7 +76,7 @@ function draw_clock(){ // g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y); // g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius); - g.setColor(g.theme.fg); + g.setColor(g.theme.dark ? g.theme.bg : g.theme.fg); let ticks = [0, 90, 180, 270]; ticks.forEach((item)=>{ let agl = item+180; @@ -92,13 +92,13 @@ function draw_clock(){ let minute_agl = minute_angle(date); g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); // g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); // - g.setColor(g.theme.fg); + g.setColor(g.theme.dark ? g.theme.bg : g.theme.fg); g.fillCircle(clock_center.x, clock_center.y, 6); - g.setColor(g.theme.bg); + g.setColor(g.theme.dark ? g.theme.fg : g.theme.bg); g.fillCircle(clock_center.x, clock_center.y, 3); // draw minute ticks. Takes long time to draw! - g.setColor(g.theme.fg); + g.setColor(g.theme.dark ? g.theme.bg : g.theme.fg); for (var i=0; i<60; i++){ let agl = i*6+180; g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180}); From b6f533f542bf597afcba7e7410cdff46502b8682 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 07:39:38 -0700 Subject: [PATCH 094/122] Update metadata.json --- apps/crowclk/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/crowclk/metadata.json b/apps/crowclk/metadata.json index 752e30fb0..6985cf11a 100644 --- a/apps/crowclk/metadata.json +++ b/apps/crowclk/metadata.json @@ -1,7 +1,7 @@ { "id": "crowclk", "name": "Crow Clock", - "version": "0.02", + "version": "0.03", "description": "A simple clock based on Bold Clock that has MST3K's Crow T. Robot for a face", "icon": "crow_clock.png", "screenshots": [{"url":"screenshot_crow.png"}], From 439c841a05a58dd12acd082899a39d443d453e00 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 07:40:15 -0700 Subject: [PATCH 095/122] Update ChangeLog --- apps/crowclk/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/crowclk/ChangeLog b/apps/crowclk/ChangeLog index b7e18abe3..4f48bdd14 100644 --- a/apps/crowclk/ChangeLog +++ b/apps/crowclk/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Removed "wake LCD on face-up"-feature: A watch-face should not set things like "wake LCD on face-up". +0.03: Fix the clock for dark mode. From 215756d5b4b0a1f37730ddcb5aa721ce6188805a Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 08:02:14 -0700 Subject: [PATCH 096/122] Update app-b1.js --- apps/dtlaunch/app-b1.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/dtlaunch/app-b1.js b/apps/dtlaunch/app-b1.js index ec0569127..ed9cc778e 100644 --- a/apps/dtlaunch/app-b1.js +++ b/apps/dtlaunch/app-b1.js @@ -48,6 +48,7 @@ function draw_icon(p,n,selected) { var x = (n%3)*80; var y = n>2?130:40; (selected?g.setColor(0.3,0.3,0.3):g.setColor(0,0,0)).fillRect(x,y,x+79,y+89); + g.setColor(g.theme.fg); g.drawImage(s.read(apps[p*6+n].icon),x+10,y+10,{scale:1.25}); g.setColor(-1).setFontAlign(0,-1,0).setFont("6x8",1); var txt = apps[p*6+n].name.split(" "); From aaf46fe41048f6b13b3aec632efc63596d0bc724 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 08:02:54 -0700 Subject: [PATCH 097/122] Update ChangeLog --- apps/dtlaunch/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index 811784b39..da07af798 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -8,3 +8,4 @@ 0.08: Optimize line wrapping for Bangle 2 0.09: fix the trasparent widget bar if there are no widgets for Bangle 2 0.10: added "one click exit" setting for Bangle 2 +0.11: Fix bangle.js 1 white icons not displaying From 833cf465fa097a5a70c6316d15f8b3f344d050fa Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Fri, 18 Mar 2022 08:03:07 -0700 Subject: [PATCH 098/122] Update metadata.json --- apps/dtlaunch/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dtlaunch/metadata.json b/apps/dtlaunch/metadata.json index 7a4094e54..b3f94442f 100644 --- a/apps/dtlaunch/metadata.json +++ b/apps/dtlaunch/metadata.json @@ -1,7 +1,7 @@ { "id": "dtlaunch", "name": "Desktop Launcher", - "version": "0.10", + "version": "0.11", "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], "icon": "icon.png", From c9c5e3ed53961b9113a8fb67c6ff1b06f34566d9 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sat, 19 Mar 2022 15:20:42 +0100 Subject: [PATCH 099/122] Changed the superscript characters in readme --- apps/game1024/Changelog | 4 ++-- apps/game1024/README.md | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog index b45a8d3ad..3d040bc08 100644 --- a/apps/game1024/Changelog +++ b/apps/game1024/Changelog @@ -1,2 +1,2 @@ -0.01: New App! -0.02: Temporary intermediate version \ No newline at end of file +0.01: Initial version +0.02: Temporary intermediate version, bug fix, added descriptions \ No newline at end of file diff --git a/apps/game1024/README.md b/apps/game1024/README.md index d1d427078..96ac8747b 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -5,17 +5,19 @@ Move the tiles by swiping to the lefthand, righthand or up- and downward side of When two tiles with the same number are squashed together they will add up as exponentials: -**1 + 1 = 2** or **A + A = D** which is a representation of **2¹ + 2¹ = 2² = 4** +**1 + 1 = 2** or **A + A = D** which is a representation of **2^1 + 2^1 = 2^1 = 4** -**2 + 2 = 3** or **B + B = C** which is a representation of **2² + 2² = 2³ = 8** +**2 + 2 = 3** or **B + B = C** which is a representation of **2^2 + 2^2 = 2^3 = 8** -**3 + 3 = 4** or **C + C = D** which is a representation of **2³ + 2³ = 2⁴ = 16** +**3 + 3 = 4** or **C + C = D** which is a representation of **2^3 + 2^3 = 2^4 = 16** -So you can continue till you reach **1024** which equals **2¹⁰**. So when you reach tile **10** you have won. +So you can continue till you reach **1024** which equals **2^(10)**. So when you reach tile **10** you have won. The score is maintained by adding the outcome of the sum of all pairs of squashed tiles (4+16+4+8 etc.) -## Buttons +Use the side **BTN** to exit the game, score and tile positions will be saved. + +## Buttons on the screen - Button **U**: Undo the last move. There are currently a maximum of 4 undo levels - Button **\***: Change the text on the tile to number, capitals or Roman numbers @@ -23,6 +25,6 @@ The score is maintained by adding the outcome of the sum of all pairs of squashe ### Credits -Game 1024 is based on Saming's 2048 and Misho M. Petković 1024game.org and conceptually similar to Threes by Asher Vollmer. +Game 1024 is based on Saming's 2048 and Misho M. Petkovic 1024game.org and conceptually similar to Threes by Asher Vollmer. ![Screenshot from the Banglejs 2 watch with the game](./game1024_sc_watch.png) \ No newline at end of file From 802bd08173f1d391b0abe16e5f6a8343efbc9823 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sat, 19 Mar 2022 16:05:50 +0100 Subject: [PATCH 100/122] hidjoystick Disable Button 2-5 on BangleJs2, use Layout library --- apps/hidjoystick/app.js | 67 ++++++++++++++++++++++------------ apps/hidjoystick/metadata.json | 2 +- 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/apps/hidjoystick/app.js b/apps/hidjoystick/app.js index 134814cee..a571dcc0e 100644 --- a/apps/hidjoystick/app.js +++ b/apps/hidjoystick/app.js @@ -1,8 +1,43 @@ -var storage = require('Storage'); +const storage = require('Storage'); +const Layout = require("Layout"); const settings = storage.readJSON('setting.json',1) || { HID: false }; +const BANGLEJS2 = process.env.HWVERSION == 2; +const buttonWidth = Bangle.appRect.w/2; +const buttonHeight = (Bangle.appRect.h-16)/2*0.85; // subtract text row and add a safety margin var sendInProgress = false; // Only send one message at a time, do not flood + +function renderBtnArrows(l) { + const d = g.getWidth() - l.width; + + function c(a) { + return { + width: 8, + height: a.length, + bpp: 1, + buffer: (new Uint8Array(a)).buffer + }; + } + + g.drawImage(c([0,8,12,14,255,14,12,8]),d,g.getHeight()/2); + if (!BANGLEJS2) { + g.drawImage(c([16,56,124,254,16,16,16,16]),d,40); + g.drawImage(c([16,16,16,16,254,124,56,16]),d,194); + } +} + +const layout = new Layout( + {type:"h", c:[ + {type:"v", width:Bangle.appRect.w-18, c: [ + {type:"h", c:[ + {type:"txt", font:"6x8:2", label:"Joystick"}, + ]} + ]}, + {type:"custom", width:18, height: Bangle.appRect.h, render:renderBtnArrows} + ]} +); + const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) { try { const buttons = (btn5<<4) | (btn4<<3) | (btn3<<2) | (btn2<<1) | (btn1<<0); @@ -20,31 +55,17 @@ const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) { function drawApp() { g.clear(); - g.setFont("6x8",2); - g.setFontAlign(0,0); - g.drawString("Joystick", 120, 120); - const d = g.getWidth() - 18; - - function c(a) { - return { - width: 8, - height: a.length, - bpp: 1, - buffer: (new Uint8Array(a)).buffer - }; - } - - g.drawImage(c([16,56,124,254,16,16,16,16]),d,40); - g.drawImage(c([16,16,16,16,254,124,56,16]),d,194); - g.drawImage(c([0,8,12,14,255,14,12,8]),d,116); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + layout.render(); } function update() { - const btn1 = BTN1.read(); - const btn2 = BTN2.read(); - const btn3 = BTN3.read(); - const btn4 = BTN4.read(); - const btn5 = BTN5.read(); + const btn1 = BTN1 ? BTN1.read() : 0; + const btn2 = !BANGLEJS2 ? BTN2.read() : 0; + const btn3 = !BANGLEJS2 ? BTN3.read() : 0; + const btn4 = !BANGLEJS2 ? BTN4.read() : 0; + const btn5 = !BANGLEJS2 ? BTN5.read() : 0; const acc = Bangle.getAccel(); var x = acc.x*-127; var y = acc.y*-127; diff --git a/apps/hidjoystick/metadata.json b/apps/hidjoystick/metadata.json index 35be134dc..3642e732c 100644 --- a/apps/hidjoystick/metadata.json +++ b/apps/hidjoystick/metadata.json @@ -3,7 +3,7 @@ "name": "Bluetooth Joystick", "shortName": "Joystick", "version": "0.02", - "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.", + "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5. On Bangle.js 2 only one button is supported at this moment)", "icon": "app.png", "tags": "bluetooth", "supports": ["BANGLEJS", "BANGLEJS2"], From f4a467fbe66258ae23a0b8d07bdb0fefb3f6eef8 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sat, 19 Mar 2022 22:10:05 +0100 Subject: [PATCH 101/122] hidjoystick Emulate buttons 2-5 with touchscreen on BangleJs2 --- apps/hidjoystick/app.js | 68 ++++++++++++++++++++++++++++------ apps/hidjoystick/metadata.json | 2 +- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/apps/hidjoystick/app.js b/apps/hidjoystick/app.js index a571dcc0e..6198afffe 100644 --- a/apps/hidjoystick/app.js +++ b/apps/hidjoystick/app.js @@ -2,11 +2,15 @@ const storage = require('Storage'); const Layout = require("Layout"); const settings = storage.readJSON('setting.json',1) || { HID: false }; const BANGLEJS2 = process.env.HWVERSION == 2; -const buttonWidth = Bangle.appRect.w/2; +const sidebarWidth=18; +const buttonWidth = (Bangle.appRect.w-sidebarWidth)/2; const buttonHeight = (Bangle.appRect.h-16)/2*0.85; // subtract text row and add a safety margin var sendInProgress = false; // Only send one message at a time, do not flood - +var touchBtn2 = 0; +var touchBtn3 = 0; +var touchBtn4 = 0; +var touchBtn5 = 0; function renderBtnArrows(l) { const d = g.getWidth() - l.width; @@ -27,17 +31,57 @@ function renderBtnArrows(l) { } } +const layoutChilden = []; +if (BANGLEJS2) { // add virtual buttons in display + layoutChilden.push({type:"h", c:[ + {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN2", id:"touchBtn2" }, + {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN3", id:"touchBtn3" }, + ]}); +} +layoutChilden.push({type:"h", c:[ + {type:"txt", font:"6x8:2", label:"Joystick" }, +]}); +if (BANGLEJS2) { // add virtual buttons in display + layoutChilden.push({type:"h", c:[ + {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN4", id:"touchBtn4" }, + {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN5", id:"touchBtn5" }, + ]}); +} + const layout = new Layout( {type:"h", c:[ - {type:"v", width:Bangle.appRect.w-18, c: [ - {type:"h", c:[ - {type:"txt", font:"6x8:2", label:"Joystick"}, - ]} - ]}, - {type:"custom", width:18, height: Bangle.appRect.h, render:renderBtnArrows} + {type:"v", width:Bangle.appRect.w-sidebarWidth, c: layoutChilden}, + {type:"custom", width:18, height: Bangle.appRect.h, render:renderBtnArrows } ]} ); +function isInBox(box, x, y) { + return x >= box.x && x < box.x+box.w && y >= box.y && y < box.y+box.h; +} + +if (BANGLEJS2) { + Bangle.on('drag', function(event) { + if (event.b == 0) { // release + touchBtn2 = touchBtn3 = touchBtn4 = touchBtn5 = 0; + } else if (isInBox(layout.touchBtn2, event.x, event.y)) { + touchBtn2 = 1; + touchBtn3 = touchBtn4 = touchBtn5 = 0; + } else if (isInBox(layout.touchBtn3, event.x, event.y)) { + touchBtn3 = 1; + touchBtn2 = touchBtn4 = touchBtn5 = 0; + } else if (isInBox(layout.touchBtn4, event.x, event.y)) { + touchBtn4 = 1; + touchBtn2 = touchBtn3 = touchBtn5 = 0; + } else if (isInBox(layout.touchBtn5, event.x, event.y)) { + touchBtn5 = 1; + touchBtn2 = touchBtn3 = touchBtn4 = 0; + } else { + // outside any buttons, release all + touchBtn2 = touchBtn3 = touchBtn4 = touchBtn5 = 0; + } + }); +} + const sendHid = function (x, y, btn1, btn2, btn3, btn4, btn5, cb) { try { const buttons = (btn5<<4) | (btn4<<3) | (btn3<<2) | (btn2<<1) | (btn1<<0); @@ -62,10 +106,10 @@ function drawApp() { function update() { const btn1 = BTN1 ? BTN1.read() : 0; - const btn2 = !BANGLEJS2 ? BTN2.read() : 0; - const btn3 = !BANGLEJS2 ? BTN3.read() : 0; - const btn4 = !BANGLEJS2 ? BTN4.read() : 0; - const btn5 = !BANGLEJS2 ? BTN5.read() : 0; + const btn2 = !BANGLEJS2 ? BTN2.read() : touchBtn2; + const btn3 = !BANGLEJS2 ? BTN3.read() : touchBtn3; + const btn4 = !BANGLEJS2 ? BTN4.read() : touchBtn4; + const btn5 = !BANGLEJS2 ? BTN5.read() : touchBtn5; const acc = Bangle.getAccel(); var x = acc.x*-127; var y = acc.y*-127; diff --git a/apps/hidjoystick/metadata.json b/apps/hidjoystick/metadata.json index 3642e732c..c13ae2efa 100644 --- a/apps/hidjoystick/metadata.json +++ b/apps/hidjoystick/metadata.json @@ -3,7 +3,7 @@ "name": "Bluetooth Joystick", "shortName": "Joystick", "version": "0.02", - "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5. On Bangle.js 2 only one button is supported at this moment)", + "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5. On Bangle.js 2 buttons 2-5 are emulated with the touchscreen.", "icon": "app.png", "tags": "bluetooth", "supports": ["BANGLEJS", "BANGLEJS2"], From 9e82dec18131f4675f9cb7de1af13d793ad04629 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Sat, 19 Mar 2022 22:15:25 +0100 Subject: [PATCH 102/122] hidjoystick retab --- apps/hidjoystick/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/hidjoystick/app.js b/apps/hidjoystick/app.js index 6198afffe..69f56463d 100644 --- a/apps/hidjoystick/app.js +++ b/apps/hidjoystick/app.js @@ -45,7 +45,7 @@ if (BANGLEJS2) { // add virtual buttons in display layoutChilden.push({type:"h", c:[ {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN4", id:"touchBtn4" }, {type:"btn", width:buttonWidth, height:buttonHeight, label:"BTN5", id:"touchBtn5" }, - ]}); + ]}); } const layout = new Layout( From fbe07de1c083c60bda10ecca9788e5c02f83c07d Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 00:26:42 +0100 Subject: [PATCH 103/122] Bug fix score reset after Game Over, new icon --- apps/game1024/Changelog | 6 +----- apps/game1024/app-icon.js | 2 +- apps/game1024/app.js | 3 ++- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog index dd4ee3149..af0925b0f 100644 --- a/apps/game1024/Changelog +++ b/apps/game1024/Changelog @@ -1,8 +1,4 @@ -<<<<<<< HEAD 0.01: Initial version -0.02: Temporary intermediate version, bug fix, added descriptions -======= -0.01: New App! 0.02: Temporary intermediate version 0.03: Basic colors ->>>>>>> 49f2dae36dd66a567153baa1544cdc5d318b024e +0.04: Bug fix score reset after Game Over, new icon \ No newline at end of file diff --git a/apps/game1024/app-icon.js b/apps/game1024/app-icon.js index 3af366bc9..8e8b56d9f 100644 --- a/apps/game1024/app-icon.js +++ b/apps/game1024/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwkBkQAWkAyVgQXYhnMACXAC/4X/C/4XH5s9CAvTmfcC5nf/4GGAAM8C5YOBGogWC//zC5XDC4ouB/vdBIJJCC4wnDC4c/CYXP//8C5APBC4pDDHQIXICwPzAQI2EC4QEB/oXHQYQXGCQQ0EF4wOBC6nNJQYXSPIgXaRQIvtC7jEEC5oqEa5QXIAoZ8B/gXQ774BAYgXPFYP/BAIJDC5wGCAAJGCC5PfOISREPQYXKABHdAogXRAAoX/C/4X/C+UAACgXYkQAW")) +require("heatshrink").decompress(atob("mEwwkBkQAWkAyVgQXx5gAMCQOqAAeiC/4X/AAXdC6HP7gECn///oXH///+QXEn4XC4f/mf/AwQXEmczmQXD74QD7/8AQZHLFIPfC4QzC4ZICC5XPngXD/4CB5oXNIYQXG+YXSCYQXKkQXWU4oXbL5mjC5M/R5evC5PfniwBa5Gvd4gXE5/z7s/DQIXGl6PJ5v//5eCC46/F4YXCAgMzAoYXFkYXFABTvMC/4X0ACkCC/4XJu4AMCQOIAAeCC+0///zC6dz/8z/83C6V/CgN/+4XSn4DCF6ZcGC6Hyv53V+Z3WCgR3OkQAWA=")) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 829b29ba9..71e2b3906 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -127,7 +127,8 @@ const snapshot = { for (let i = 0; i< this.dump.gridsize; i++) { this.dump.expVals[i] = 0; } - this.dump.score = scores.currentScore; + this.dump.score = 0; + this.dump.highScore = scores.highScore; this.dump.charIndex = charIndex; this.write(); debug(console.log("reset D U M P E D!", this.dump)); From 6380f1a124f6d4f538fa772979c52ca18a814430 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 00:28:45 +0100 Subject: [PATCH 104/122] v0.04 --- apps/game1024/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 92d34bed3..5512d7572 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -1,7 +1,7 @@ { "id": "game1024", "name": "1024 Game", "shortName" : "1024 Game", - "version": "0.03", + "version": "0.04", "icon": "game1024.png", "screenshots": [ {"url":"screenshot.png" } ], "readme":"README.md", From ebf30dc874c812502c8a51cbc281026797caacfb Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Sun, 20 Mar 2022 00:41:30 +0100 Subject: [PATCH 105/122] New icon --- apps/game1024/game1024.png | Bin 425 -> 582 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png index 28b0079d8e0ed8691675d60a189be1c3c8869373..c0f7eaf212ebf597bf5eb069c0b5bbeddca2a573 100644 GIT binary patch delta 557 zcmZ3;J8s zU$){vZLB3he!+jgoqzvF?M}2mP=GPN$S;KP{G#$%K(@Q5i(`n#@wZoQ7d07(um)63 zjPkgnB>3WJR4B^BiE3Ajs1~-NrSvu1EWrk3->c6 z-42WOjIL+Cn=$v;epuDX;uve~kix{lF;#(WrM#snV|>n1wjzBIAJ+1_+rMz%NG!MU`-?S}g+m&zR5c6_hp^=$`AuXA|--F@%Y zALbLA?l3)hpR~dL)4>G{r-XjUaG7ar%iP6W#_ZUb`}EXVg9(eDeAS(G?!(sqYTGic onlqyQur<}j&N0t@bI`~>C%lrqclx*Uz#wMuboFyt=akR{02kT(jQ{`u delta 399 zcmV;A0dW4t1gQg%B!5CsOjJdHfPer100000fPjF2fPer10RI30|6E-EuCD(;K>ryT z|7&aiGc*7H|NnY={|pTOi;Mrm!~afB|JvIBoSgqACUr=|DgXcg1awkPQ_s)u@9rI0 zeE4!K~zY`?bh28f*=q8P)tBXR)0k0|9>?W6e+b}dZ=dH z7Z>HYa?z0xS`>uPiWNjf31tPMVh9+|4t9ZG1&wHvmTZI&oqPcl0Bo%eLiDFVLkiaZ z0K*B;CIwgxIyFx2&>jLcK?-JD%PDHLkV1hV3wax$l From 85d60201b783916fca3f8473fc4e62e157c29345 Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Sun, 20 Mar 2022 00:42:04 +0100 Subject: [PATCH 106/122] to be replaced --- apps/game1024/game1024.png | Bin 582 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/game1024/game1024.png diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png deleted file mode 100644 index c0f7eaf212ebf597bf5eb069c0b5bbeddca2a573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sa{_!qT!Az)XlQ5va)CE=b^WPWA_$d3f6V z{Fcv|bMF6~Ioa7;tE%??uc}g0n=Ak_*8pVh|NqASjd}j_RQ<2&{@;E0|KWB2*UkAq z$M3(Nhj=a;QGP#0@SkYDiMZ|C3tQM(iE4-{a`FY*gvJin-X z7Le`k>EamTas2I-+eJ+VBCG*b6QextC<(qeniZ|NC1C5f|Nqx=wm5nAq%7mN+mT-5 zu!+y|jN-WyM(0ix_CHxveXy~**yl@Q+Qhqe6f_AlHw5)1M<K(9xW3*&{RC0f2o6}1Kj zo!Dz0bh<5kvzL2X#H)rGT=OPqB((0oeCkO<-{16OLW}D7SN}Y{vVM^|OPp`J;r_~{ zGRL+Z-)nh&+kw*STpmDY-@EmP`NXC>Oi$h?ZLt4zZ~?<9p&v3_W*XZvcQKbSJ2vJ% zJ$2S#!r~`ib!VOXu=W48OsnRMs6T8?wXt)|bKe{^vd;;xWbd8+?L07i89ZJ6T-G@y GGywqqH2s4B From 4420833dbdb6878808ab934f60bfdbcc096b882e Mon Sep 17 00:00:00 2001 From: Jelco Huijser Date: Sun, 20 Mar 2022 00:42:52 +0100 Subject: [PATCH 107/122] New icon --- apps/game1024/game1024.png | Bin 0 -> 582 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/game1024/game1024.png diff --git a/apps/game1024/game1024.png b/apps/game1024/game1024.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f7eaf212ebf597bf5eb069c0b5bbeddca2a573 GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sa{_!qT!Az)XlQ5va)CE=b^WPWA_$d3f6V z{Fcv|bMF6~Ioa7;tE%??uc}g0n=Ak_*8pVh|NqASjd}j_RQ<2&{@;E0|KWB2*UkAq z$M3(Nhj=a;QGP#0@SkYDiMZ|C3tQM(iE4-{a`FY*gvJin-X z7Le`k>EamTas2I-+eJ+VBCG*b6QextC<(qeniZ|NC1C5f|Nqx=wm5nAq%7mN+mT-5 zu!+y|jN-WyM(0ix_CHxveXy~**yl@Q+Qhqe6f_AlHw5)1M<K(9xW3*&{RC0f2o6}1Kj zo!Dz0bh<5kvzL2X#H)rGT=OPqB((0oeCkO<-{16OLW}D7SN}Y{vVM^|OPp`J;r_~{ zGRL+Z-)nh&+kw*STpmDY-@EmP`NXC>Oi$h?ZLt4zZ~?<9p&v3_W*XZvcQKbSJ2vJ% zJ$2S#!r~`ib!VOXu=W48OsnRMs6T8?wXt)|bKe{^vd;;xWbd8+?L07i89ZJ6T-G@y GGywqqH2s4B literal 0 HcmV?d00001 From 5cb7e0620c86ccf2e281c6266e7aa43876d59593 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sun, 20 Mar 2022 09:55:43 +0100 Subject: [PATCH 108/122] add Banglejs 1 compatibity to the terminal clock app --- apps/terminalclock/ChangeLog | 3 ++- apps/terminalclock/app.js | 22 +++++++++++++++++----- apps/terminalclock/metadata.json | 5 +++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/apps/terminalclock/ChangeLog b/apps/terminalclock/ChangeLog index 6515ab627..14159bc19 100644 --- a/apps/terminalclock/ChangeLog +++ b/apps/terminalclock/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! -0.02: Rename "Activity" in "Motion" and display the true values for it +0.02: Rename "Activity" in "Motion" and display the true values for it +0.03: Add Banglejs 1 compatibility diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index ab83a696f..d219b84d8 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -1,16 +1,28 @@ var locale = require("locale"); var fontColor = g.theme.dark ? "#0f0" : "#000"; -var paddingY = 2; -var font6x8At4Size = 32; -var font6x8At2Size = 18; var heartRate = 0; +// handling the differents versions of the Banglejs smartwatch +if (process.env.HWVERSION == 1){ + var paddingY = 3; + var font6x8At4Size = 48; + var font6x8At2Size = 27; + var font6x8FirstTextSize = 6; + var font6x8DefaultTextSize = 3; +} +else{ + var paddingY = 2; + var font6x8At4Size = 32; + var font6x8At2Size = 18; + var font6x8FirstTextSize = 4; + var font6x8DefaultTextSize = 2; +} function setFontSize(pos){ if(pos == 1) - g.setFont("6x8", 4); + g.setFont("6x8", font6x8FirstTextSize); else - g.setFont("6x8", 2); + g.setFont("6x8", font6x8DefaultTextSize); } function clearField(pos){ diff --git a/apps/terminalclock/metadata.json b/apps/terminalclock/metadata.json index de0244318..de369bf10 100644 --- a/apps/terminalclock/metadata.json +++ b/apps/terminalclock/metadata.json @@ -3,11 +3,12 @@ "name": "Terminal Clock", "shortName":"Terminal Clock", "description": "A terminal cli like clock displaying multiple sensor data", - "version":"0.02", + "version":"0.03", "icon": "app.png", "type": "clock", "tags": "clock", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, "readme": "README.md", "storage": [ {"name": "terminalclock.app.js","url": "app.js"}, From b97ee495c5308da28daa663c76e70b88cb304141 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 16:47:11 +0100 Subject: [PATCH 109/122] Changed name of Changelog to ChangeLog --- apps/game1024/ChangeLog | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 apps/game1024/ChangeLog diff --git a/apps/game1024/ChangeLog b/apps/game1024/ChangeLog new file mode 100644 index 000000000..af0925b0f --- /dev/null +++ b/apps/game1024/ChangeLog @@ -0,0 +1,4 @@ +0.01: Initial version +0.02: Temporary intermediate version +0.03: Basic colors +0.04: Bug fix score reset after Game Over, new icon \ No newline at end of file From c37c8ea62facd212d7116f74f966b474043a9b53 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 16:51:33 +0100 Subject: [PATCH 110/122] Changed description of the game --- apps/game1024/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/game1024/metadata.json b/apps/game1024/metadata.json index 5512d7572..6d72b9e9d 100644 --- a/apps/game1024/metadata.json +++ b/apps/game1024/metadata.json @@ -5,7 +5,7 @@ "icon": "game1024.png", "screenshots": [ {"url":"screenshot.png" } ], "readme":"README.md", - "description": "Join the numbers and get to the 1024, J or X tile!", + "description": "Swipe the squares up, down, to the left or right, join the numbers and get to the 10 (2^1024), J or X tile!", "type": "app", "tags": "game,puzzle", "allow_emulator": true, From d77fe09c99e3e1376906c12dad65dc11f424387b Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Sun, 20 Mar 2022 16:51:55 +0100 Subject: [PATCH 111/122] rename of Changelog --- apps/game1024/Changelog | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 apps/game1024/Changelog diff --git a/apps/game1024/Changelog b/apps/game1024/Changelog deleted file mode 100644 index af0925b0f..000000000 --- a/apps/game1024/Changelog +++ /dev/null @@ -1,4 +0,0 @@ -0.01: Initial version -0.02: Temporary intermediate version -0.03: Basic colors -0.04: Bug fix score reset after Game Over, new icon \ No newline at end of file From d7c16c50dc7b7e8adbd82375f7bf22ab1a0374cb Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Mon, 21 Mar 2022 00:54:27 +0100 Subject: [PATCH 112/122] New screenshots foor the readme.md --- apps/game1024/README.md | 5 +- apps/game1024/app.js | 153 ++++++++++++---------------- apps/game1024/game1024_sc_watch.png | Bin 48769 -> 0 bytes apps/game1024/scrnshot_dn_300.jpg | Bin 0 -> 56911 bytes apps/game1024/scrnshot_lc_300.jpg | Bin 0 -> 55178 bytes 5 files changed, 68 insertions(+), 90 deletions(-) delete mode 100644 apps/game1024/game1024_sc_watch.png create mode 100644 apps/game1024/scrnshot_dn_300.jpg create mode 100644 apps/game1024/scrnshot_lc_300.jpg diff --git a/apps/game1024/README.md b/apps/game1024/README.md index 96ac8747b..e52961424 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -19,7 +19,7 @@ Use the side **BTN** to exit the game, score and tile positions will be saved. ## Buttons on the screen - - Button **U**: Undo the last move. There are currently a maximum of 4 undo levels + - Button **U**: Undo the last move. There are currently a maximum of 4 undo levels. The level is indicated with a small number in the lower righthand corner of the Undo button - Button **\***: Change the text on the tile to number, capitals or Roman numbers - Button **R**: Reset the game. The Higscore will be remembered. You will be prompted first. @@ -27,4 +27,5 @@ Use the side **BTN** to exit the game, score and tile positions will be saved. Game 1024 is based on Saming's 2048 and Misho M. Petkovic 1024game.org and conceptually similar to Threes by Asher Vollmer. -![Screenshot from the Banglejs 2 watch with the game](./game1024_sc_watch.png) \ No newline at end of file +![Screenshot from the Banglejs 2 watch with the game in dark theme](./scrnshot_dn_300.jpg) +![Screenshot from the Banglejs 2 watch with the game in light theme](./scrnshot_lc_300.jpg) \ No newline at end of file diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 71e2b3906..3b96b327f 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -1,4 +1,4 @@ -const debugMode = 'development'; // valid values are: off, test, production, development +const debugMode = 'off'; // valid values are: off, test, production, development const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; const rows = 4, cols = 4; const borderWidth = 6; @@ -26,7 +26,7 @@ const scores = { lastScores: [0], add: function(val) { this.currentScore = this.currentScore + Math.pow(2, val); - debug(console.log("new score=",this.currentScore)); + debug(() => console.log("new score=",this.currentScore)); }, addToUndo: function () { this.lastScores.push(this.currentScore); @@ -34,7 +34,7 @@ const scores = { }, undo: function () { this.currentScore = this.lastScores.pop(); - debug(console.log("undo score =", this.currentScore, "rest:", this.lastScores)); + debug(() => console.log("undo score =", this.currentScore, "rest:", this.lastScores)); }, reset: function () { this.currentScore = 0; @@ -44,25 +44,25 @@ const scores = { g.setColor(btnAtribs.fg); let ulCorner = {x: Bangle.appRect.x + 6, y: Bangle.appRect.y2 -22 }; let lrCorner = {x: Bangle.appRect.x2, y: Bangle.appRect.y2 - 1}; - g.fillRect(ulCorner.x, ulCorner.y, lrCorner.x, lrCorner.y); - g.setFont12x20(1); - g.setFontAlign(0,0,0); + g.fillRect(ulCorner.x, ulCorner.y, lrCorner.x, lrCorner.y) + .setFont12x20(1) + .setFontAlign(0,0,0); let scrX = Math.floor((ulCorner.x + lrCorner.x)/3); let scrY = Math.floor((ulCorner.y + lrCorner.y)/2) + 1; - g.setColor('#000000'); - g.drawString(this.currentScore, scrX+1, scrY+1); - g.setColor(btnAtribs.bg); - g.drawString(this.currentScore, scrX, scrY); + g.setColor('#000000') + .drawString(this.currentScore, scrX+1, scrY+1) + .setColor(btnAtribs.bg) + .drawString(this.currentScore, scrX, scrY); scrX = Math.floor(4*(ulCorner.x + lrCorner.x)/5); - g.setFont("6x8:1x2"); - g.drawString(this.highScore, btnAtribs.x + Math.floor(btnAtribs.w/2), scrY); + g.setFont("6x8:1x2") + .drawString(this.highScore, btnAtribs.x + Math.floor(btnAtribs.w/2), scrY); }, hsContents: function () { return {"highScore": this.highScore, "lastScore": this.currentScore}; }, check: function () { this.highScore = (this.currentScore > this.highScore) ? this.currentScore : this.highScore; - debug(console.log('highScore =', this.highScore)); + debug(() => console.log('highScore =', this.highScore)); } }; @@ -108,7 +108,7 @@ const snapshot = { if (this.counter == this.interval) { this.setDump(); this.write(); - debug(console.log("D U M P E D!", this.dump)); + debug(() => console.log("snapped the state of the game:", this.dump)); } }, recover: function () { @@ -131,7 +131,7 @@ const snapshot = { this.dump.highScore = scores.highScore; this.dump.charIndex = charIndex; this.write(); - debug(console.log("reset D U M P E D!", this.dump)); + debug(() => console.log("reset D U M P E D!", this.dump)); } }; const btnAtribs = {x: 134, w: 42, h: 42, fg:'#C0C0C0', bg:'#800000'}; @@ -201,7 +201,7 @@ const mover = { return canContinue; }, nonEmptyCells: function (dir) { - debug(console.log("Move: ", dir.name)); + debug(() => console.log("Move: ", dir.name)); const step = dir.step; // outer loop for all colums/rows for (let n = dir.outerBegin; step*n <= step*dir.outerEnd; n=n+step) { @@ -276,16 +276,16 @@ class Button { this.enabled = true; } draw() { - g.setColor(this.bg); - g.fillRect(this.x0, this.y0, this.x1, this.y1); - g.setFont(this.font); - g.setFontAlign(0,0,0); + g.setColor(this.bg) + .fillRect(this.x0, this.y0, this.x1, this.y1) + .setFont(this.font) + .setFontAlign(0,0,0); let strX = Math.floor((this.x0+this.x1)/2); let strY = Math.floor((this.y0+this.y1)/2); - g.setColor("#000000"); - g.drawString(this.text, strX+2, strY+2); - g.setColor(this.fg); - g.drawString(this.text, strX, strY); + g.setColor("#000000") + .drawString(this.text, strX+2, strY+2) + .setColor(this.fg) + .drawString(this.text, strX, strY); // buttons.push(this); } onClick() {if (typeof this.cb === 'function' && this.enabled) { @@ -309,20 +309,18 @@ class Cell { return cellColors[i >= cellColors.length ? cellColors.length -1 : i]; } drawBg() { - g.setColor(this.getColor(this.expVal).bg); - g.fillRect(this.x0, this.y0, this.x1, this.y1); + g.setColor(this.getColor(this.expVal).bg) + .fillRect(this.x0, this.y0, this.x1, this.y1); } drawNumber() { if (this.expVal !== 0) { - g.setFont(cellFonts[charIndex]); - g.setFontAlign(0,0,0); + g.setFont(cellFonts[charIndex]) + .setFontAlign(0,0,0); let char = cellChars[charIndex][this.expVal]; let strX = Math.floor((this.x0 + this.x1)/2); let strY = Math.floor((this.y0 + this.y1)/2); - // g.setColor(cellShadowColor); - // g.drawString(this.expVal, strX+1, strY+1); - g.setColor(this.getColor(this.expVal).fg); - g.drawString(char, strX, strY); + g.setColor(this.getColor(this.expVal).fg) + .drawString(char, strX, strY); } } setExpVal(val) { @@ -389,24 +387,23 @@ function createGrid () { } } function messageGameOver () { - g.setColor("#1a0d00"); - g.setFont12x20(2); - g.setFontAlign(0,0,0); - g.drawString("G A M E", middle.x+13, middle.y-24); - g.drawString("O V E R !", middle.x+13, middle.y+24); - g.setColor("#ffffff"); - g.drawString("G A M E", middle.x+12, middle.y-25); - g.drawString("O V E R !", middle.x+12, middle.y+25); + g.setColor("#1a0d00") + .setFont12x20(2).setFontAlign(0,0,0) + .drawString("G A M E", middle.x+13, middle.y-24) + .drawString("O V E R !", middle.x+13, middle.y+24); + g.setColor("#ffffff") + .drawString("G A M E", middle.x+12, middle.y-25) + .drawString("O V E R !", middle.x+12, middle.y+25); } function messageYouWin () { - g.setColor("#1a0d00"); - g.setFont12x20(2); - g.setFontAlign(0,0,0); - g.drawString("YOU HAVE", middle.x+18, middle.y-24); - g.drawString("W O N ! !", middle.x+18, middle.y+24); - g.setColor("#FF0808"); - g.drawString("YOU HAVE", middle.x+17, middle.y-25); - g.drawString("W O N ! !", middle.x+17, middle.y+25); + g.setColor("#1a0d00") + .setFont12x20(2) + .setFontAlign(0,0,0) + .drawString("YOU HAVE", middle.x+18, middle.y-24) + .drawString("W O N ! !", middle.x+18, middle.y+24); + g.setColor("#FF0808") + .drawString("YOU HAVE", middle.x+17, middle.y-25) + .drawString("W O N ! !", middle.x+17, middle.y+25); Bangle.buzz(200, 1); } function makeRandomNumber () { @@ -434,7 +431,7 @@ function initGame() { createGrid(); if (snReadOnInit) { snapshot.recover(); - debug(console.log("R E C O V E R E D !", snapshot.dump)); + debug(() => console.log("R E C O V E R E D !", snapshot.dump)); let sum = allSquares.reduce(function (tv, sq) {return (sq.expVal + tv) ;}, 0); if (!sum) { addRandomNumber(); @@ -482,7 +479,7 @@ function handlePopUpClicks(btn) { buttons.all.pop(); // remove the no button buttons.all.pop(); // remove the yes button buttons.all.forEach(b => {b.enable();}); // enable the remaining buttons again - debug(console.log("Button name =", name)); + debug(() => console.log("Button name =", name)); switch (name) { case 'yes': resetGame(); @@ -512,52 +509,27 @@ function resetGame() { /** * Function that can be used in test or development environment, or production. - * Depends on global constant EFTriggerDebugMode + * Depends on global constant debugMode * @param {function} func function to call like console.log() */ const debug = (func) => { switch (debugMode) { case "development": - // console.log("Development"); - if (typeof func === 'function') { - func(); - } - break; - case "test" : - console.log("--- test ---"); - if (typeof func === 'function') { - func(); - } - break; - case "off": - case "production": // ignore func + if (typeof func === 'function') { + func(); + } + break; + case "off": default: break; } }; -const test = { - drawAllColors: function(i) { - charIndex = i>2 ? 0 : i<0 ? 0 : i; - allSquares.forEach((sq,i) => { - let c = i<11 ? i : i-10; - sq.setExpVal(c); - debug(console.log("c=",c)); - }); - drawGrid(); - }, - youWin: function() { - messageYouWin(); - }, - gameOver: function() { - messageGameOver(); - } -}; // Handle a "click" event (only needed for menu button) function handleclick(e) { buttons.all.forEach(btn => { if ((e.x >= btn.x0) && (e.x <= btn.x1) && (e.y >= btn.y0) && (e.y <= btn.y1)) { btn.onClick(); - debug(console.log(btn.name)); + debug(() => console.log(btn.name)); } }); } @@ -650,7 +622,7 @@ function runGame(dir){ snapshot.make(); dragger.setEnabled(true); if (!(mover.anyLeft())) { - debug(console.log("G A M E O V E R !!")); + debug(() => console.log("G A M E O V E R !!")); snapshot.reset(); messageGameOver(); } @@ -659,12 +631,12 @@ function runGame(dir){ function updUndoLvlIndex() { let x = 170; let y = 60; - g.setColor(btnAtribs.fg); - g.fillRect(x-6,y-6, 176, 67); + g.setColor(btnAtribs.fg) + .fillRect(x-6,y-6, 176, 67); if (scores.lastScores.length > 0) { - g.setColor("#000000"); - g.setFont("4x6:2"); - g.drawString(scores.lastScores.length, x, y); + g.setColor("#000000") + .setFont("4x6:2") + .drawString(scores.lastScores.length, x, y); } } function incrCharIndex() { @@ -679,3 +651,8 @@ buttons.add(new Button('restart', btnAtribs.x, 106, btnAtribs.w, btnAtribs.h, 'R initGame(); dragger.setEnabled(true); + +E.on('kill',function() { + this.write(); + debug(() => console.log("1024 game got killed!")); +}); \ No newline at end of file diff --git a/apps/game1024/game1024_sc_watch.png b/apps/game1024/game1024_sc_watch.png deleted file mode 100644 index ca8184b0be8935cac9afa5340793c342111d7fe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48769 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

ta@h|)hAIX9R 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%0A@s4$i z@1?9`6yb6G6Y;(zasT39TyRgvSwVmXUk2M)%^Bg128s7GCg^qyphZR~OmDFDu-qmH z%9k(Znt%>ywSeWSfciEGQffC0A7`CJ6LFRqz*=yo4nLI+`dPvLn_OjbQkakAnt3{o}k=)WT`-Gu|!iFY%924w-#9egd)B=6~ z|01IdFJ5U;M|Hrz`}e78TJ~QDR4!~Lz9Vk9t?G%Mp5nCy5Opnuh7(Tsbz6i{e^<{n z%Y$Fjq0pg0{+93|bh4JDEzE}H!s+su(A{<|kF^#t$5nR$f$#RX7J@s(8zfR*HTf6h z??JV^aCve8?zc)weSHODIUj-wpQ&#SgNSd+f)K-b8@3_8(2lyN1Ms{!RWybV%O-da zMk@)*3e9}{jSe!{D`L*n4j7t)(cF{lL(^LAGtqx5;kX!}#!Z8bmY9wQ7@h%Uj9zq- zhuKdJ`d>7UC;y)Sp9Nt0TygE*N9ssY^Pc>NSdB>{VY+&E-T^#;TlGq7-2CI(RqVkG zN6UEmq=)Bi_&vBX3^iqCK6};_OrVIREcM?;ER_}vqyGS}IYR9w&rXqVADosFkP5Y9 z{v2cg9W+zf{#C?h%DEG*oOs1cs1`Mv_fI)_2r$K=^^>=phue*Gb;d+ z**&I})x zP!dG7F1r3+Fl;v64rIJb^>v>G*70Bp-6Vlmr~YQ1Kyo0PAkyr^(XFWw;5Gq*Ui@_=u>=fi-`eqb#-1y{2<=b^n^+z<>1q$MtvL1}IpST0RV5NzX< zE&vspn=RZ$5rSE%^SmFxr~kOS7fF=VS-XRYn6a57*kkSsSi zYri-oPhq&c=U)bHOa$2VzAvNBSRqIWqhagcoO+OeVB6^U>CP)J-eKfh)A?jB3#}|a z0p2fatr%@}*z|RbYOMfoTAcBl0(St{EOZYT23pjKS5Ex##9&Yc3#*Q?M~p>c2Zeb% zOObU0nKu9^3e9VrAcHzc|vyoXI?Da2oF-PDt$Pvq0^xGV?14P-EY^t*(|~T(!hfas=K-opLJsGz<&PcxbtOv>g~e?fp2U5u-O0`1 zK)DNi>lC)})`;4@Vi*EMdj#3-=*rdaF%Cmi<=$x_3U0uJ*9RV>ITV(geBI?#0YF4{ z``h{Vh;7F}y;t$Wiqo*&_4zPps!}3&Hrt#cC0&<-UzZ=8=AzD5oP7m&hBof5n@+#S z&CYO&@-HI&~HNMX9w2fO`gt4m8R72%Ah=MJbFFjmmtRxqWI=K^NA(p zI4iyE4E4>9xN{+sxQ37Nj(dKp!;{vydCAM&ow;{9C^5*)=A8Y{okzFTc6s` ztG;ltvd?&9_i@LZl7!l_kGcN6FCaenZ853zt z`UfPgT{YHyNt;2`FQLQXgkr+Gc}Ej1L?%X`DT%rS9O*H^eMwUGx9x!kt`3N9d;b7> znLtp~M+h3=f9=N$Ng&(Xj(->>t-ObhIKe@5Y&<`_J`{H?^7+Gu36?l(o-#kAr>|c{ z)<8+zS53a|1O-+l(s&+>;X<=-C)n%8CMz^5CljLg=L(W+T--_5)^6a9Nh{0mpa0o5 CtLv}; From 286ec4cb806503eedbd53e7b3865b956728ac628 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 22 Mar 2022 01:15:51 +0100 Subject: [PATCH 122/122] Repaired the screenshot withe wrong caret. --- apps/game1024/screenshot.png | Bin 6263 -> 6079 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/game1024/screenshot.png b/apps/game1024/screenshot.png index 5537a5eb5c1f16ec1406b833b8fd587f724c2f23..8be52f8cb7a7f0650f6b454fc9a7fd41ff6a58d6 100644 GIT binary patch literal 6079 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 literal 6263 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

ta@h|)hAIX9R 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%0A@s4$i z@1?9`6yb6G6Y;(zasT39TyRgvSwVmXUk2M)%^Bg128s7GCg^qyphZR~OmDFDu-qmH z%9k(Znt%>ywSeWSfciEGQffC0A7`CJ6LFRqz*=yo4nLI+`dPvLn_OjbQkakAnt3{o}k=)WT`-Gu|!iFY%924w-#9egd)B=6~ z|01IdFJ5U;M|Hrz`}e78TJ~QDR4!~Lz9Vk9t?G%Mp5nCy5Opnuh7(Tsbz6i{e^<{n z%Y$Fjq0pg0{+93|bh4JDEzE}H!s+su(A{<|kF^#t$5nR$f$#RX7J@s(8zfR*HTf6h z??JV^aCve8?zc)weSHODIUj-wpQ&#SgNSd+f)K-b8@3_8(2lyN1Ms{!RWybV%O-da zMk@)*3e9}{jSe!{D`L*n4j7t)(cF{lL(^LAGtqx5;kX!}#!Z8bmY9wQ7@h%Uj9zq- zhuKdJ`d>7UC;y)Sp9Nt0TygE*N9ssY^Pc>NSdB>{VY+&E-T^#;TlGq7-2CI(RqVkG zN6UEmq=)Bi_&vBX3^iqCK6};_OrVIREcM?;ER_}vqyGS}IYR9w&rXqVADosFkP5Y9 z{v2cg9W+zf{#C?h%DEG*oOs1cs1`Mv_fI)_2r$K=^^>=phue*Gb;d+ z**&I})x zP!dG7F1r3+Fl;v64rIJb^>v>G*70Bp-6Vlmr~YQ1Kyo0PAkyr^(XFWw;5Gq*Ui@_=u>=fi-`eqb#-1y{2<=b^n^+z<>1q$MtvL1}IpST0RV5NzX< zE&vspn=RZ$5rSE%^SmFxr~kOS7fF=VS-XRYn6a57*kkSsSi zYri-oPhq&c=U)bHOa$2VzAvNBSRqIWqhagcoO+OeVB6^U>CP)J-eKfh)A?jB3#}|a z0p2fatr%@}*z|RbYOMfoTAcBl0(St{EOZYT23pjKS5Ex##9&Yc3#*Q?M~p>c2Zeb% zOObU0nKu9^3e9VrAcHzc|vyoXI?Da2oF-PDt$Pvq0^xGV?14P-EY^t*(|~T(!hfas=K-opLJsGz<&PcxbtOv>g~e?fp2U5u-O0`1 zK)DNi>lC)})`;4@Vi*EMdj#3-=*rdaF%Cmi<=$x_3U0uJ*9RV>ITV(geBI?#0YF4{ z``h{Vh;7F}y;t$Wiqo*&_4zPps!}3&Hrt#cC0&<-UzZ=8=AzD5oP7m&hBof5n@+#S z&CYO&@-HI&~HNMX9w2fO`gt4m8R72%Ah=MJbFFjmmtRxqWI=K^NA(p zI4iyE4E4>9xN{+sxQ37Nj(dKp!;{vydCAM&ow;{9C^5*)=A8Y{okzFTc6s` ztG;ltvd?&9_i@LZl7!l_kGcN6FCaenZ853zt z`UfPgT{YHyNt;2`FQLQXgkr+Gc}Ej1L?%X`DT%rS9O*H^eMwUGx9x!kt`3N9d;b7> znLtp~M+h3=f9=N$Ng&(Xj(->>t-ObhIKe@5Y&<`_J`{H?^7+Gu36?l(o-#kAr>|c{ z)<8+zS53a|1O-+l(s&+>;X<=-C)n%8CMz^5CljLg=L(W+T--_5)^6a9Nh{0mpa0o5 CtLv}; literal 0 HcmV?d00001 From e4fbd662c1f7e4b0338c83ed59c5d5f955d1b312 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 21 Mar 2022 08:50:56 +0000 Subject: [PATCH 113/122] docs --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 38ce09f75..a6c449cc7 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,18 @@ try and keep filenames short to avoid overflowing the buffer. }, ``` +### Screenshots + +In the app `metadata.json` file you can add a list of screenshots with a line like: `"screenshots" : [ { url:"screenshot.png" } ],` + +To get a screenshot you can: + +* Type `g.dump()` in the left-hand side of the Web IDE when connected to a Bangle.js 2 - you can then +right-click and save the image shown in the terminal (this only works on Bangle.js 2 - Bangle.js 1 is +unable to read data back from the LCD controller). +* Run your code in the emulator and use the screenshot button in the bottom right of the window. + + ## Testing ### Online From 338a659bbdf205f7ca2925aedab893b2a052a24e Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Mon, 21 Mar 2022 11:02:52 +0100 Subject: [PATCH 114/122] bledetect - Set bangleJs compatible - Show widgets --- apps/bledetect/ChangeLog | 1 + apps/bledetect/bledetect.js | 2 ++ apps/bledetect/metadata.json | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/bledetect/ChangeLog b/apps/bledetect/ChangeLog index e52015f04..e9b98e08c 100644 --- a/apps/bledetect/ChangeLog +++ b/apps/bledetect/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App! 0.02: Fixed issue with wrong device informations 0.03: Ensure manufacturer:undefined doesn't overflow screen +0.04: Set Bangle.js 2 compatible, show widgets diff --git a/apps/bledetect/bledetect.js b/apps/bledetect/bledetect.js index ca8699f9a..f3fc70e92 100644 --- a/apps/bledetect/bledetect.js +++ b/apps/bledetect/bledetect.js @@ -5,6 +5,7 @@ let menu = { function showMainMenu() { menu["< Back"] = () => load(); + Bangle.drawWidgets(); return E.showMenu(menu); } @@ -55,5 +56,6 @@ function waitMessage() { E.showMessage("scanning"); } +Bangle.loadWidgets(); scan(); waitMessage(); diff --git a/apps/bledetect/metadata.json b/apps/bledetect/metadata.json index f5e0ffb19..0c30fe8f6 100644 --- a/apps/bledetect/metadata.json +++ b/apps/bledetect/metadata.json @@ -2,11 +2,11 @@ "id": "bledetect", "name": "BLE Detector", "shortName": "BLE Detector", - "version": "0.03", + "version": "0.04", "description": "Detect BLE devices and show some informations.", "icon": "bledetect.png", "tags": "app,bluetooth,tool", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"bledetect.app.js","url":"bledetect.js"}, From 3c7e830e1c536cf68f21f548fba276265d23dad2 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Mon, 21 Mar 2022 11:03:32 +0100 Subject: [PATCH 115/122] sleepphasealarm fix comment typo --- apps/sleepphasealarm/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sleepphasealarm/app.js b/apps/sleepphasealarm/app.js index 39f9b59db..e963f2c40 100644 --- a/apps/sleepphasealarm/app.js +++ b/apps/sleepphasealarm/app.js @@ -29,11 +29,11 @@ function calc_ess(val) { if (nonmot) { slsnds+=1; if (slsnds >= sleepthresh) { - return true; // awake + return true; // sleep } } else { slsnds=0; - return false; // sleep + return false; // awake } } } From 127624b19fb293fc93a0d67f629fca1b269c29be Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Mon, 21 Mar 2022 16:17:16 +0100 Subject: [PATCH 116/122] Changed screenshot pictures with ide dumps --- apps/game1024/README.md | 7 +++++-- apps/game1024/game1024_sc_dump_dark.png | Bin 0 -> 4146 bytes apps/game1024/game1024_sc_dump_light.png | Bin 0 -> 3806 bytes 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 apps/game1024/game1024_sc_dump_dark.png create mode 100644 apps/game1024/game1024_sc_dump_light.png diff --git a/apps/game1024/README.md b/apps/game1024/README.md index e52961424..474e8c97e 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -27,5 +27,8 @@ Use the side **BTN** to exit the game, score and tile positions will be saved. Game 1024 is based on Saming's 2048 and Misho M. Petkovic 1024game.org and conceptually similar to Threes by Asher Vollmer. -![Screenshot from the Banglejs 2 watch with the game in dark theme](./scrnshot_dn_300.jpg) -![Screenshot from the Banglejs 2 watch with the game in light theme](./scrnshot_lc_300.jpg) \ No newline at end of file +In Dark theme with numbers: +![Screenshot from the Banglejs 2 watch with the game in dark theme](./game1024_sc_dump_dark.png) + +In Light theme with characters: +![Screenshot from the Banglejs 2 watch with the game in light theme](./game1024_sc_dump_light.png) \ No newline at end of file diff --git a/apps/game1024/game1024_sc_dump_dark.png b/apps/game1024/game1024_sc_dump_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..15ecb87d9e7e0180b7443b717e0aeb5409563fa0 GIT binary patch literal 4146 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 literal 0 HcmV?d00001 diff --git a/apps/game1024/game1024_sc_dump_light.png b/apps/game1024/game1024_sc_dump_light.png new file mode 100644 index 0000000000000000000000000000000000000000..286257be4e4c689b6770b99db2a5a5f6b1b1e4e5 GIT binary patch literal 3806 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 Date: Mon, 21 Mar 2022 15:47:53 -0700 Subject: [PATCH 117/122] Update mmind.app.js --- apps/mmind/mmind.app.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/apps/mmind/mmind.app.js b/apps/mmind/mmind.app.js index e7def025d..10d315285 100644 --- a/apps/mmind/mmind.app.js +++ b/apps/mmind/mmind.app.js @@ -172,6 +172,7 @@ Bangle.on('touch', function(zone,e) { break; case 4: //new game + turn = 0; play = [-1,-1,-1,-1]; game = []; endgame=false; @@ -189,10 +190,3 @@ Bangle.on('touch', function(zone,e) { game = []; get_secret(); draw(); -//Bangle.loadWidgets(); -//Bangle.drawWidgets(); - - - - - From afb7a4846a705c6e9fc2165a8c031aabf3e6d054 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 21 Mar 2022 15:48:21 -0700 Subject: [PATCH 118/122] Update ChangeLog --- apps/mmind/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/mmind/ChangeLog b/apps/mmind/ChangeLog index 939ac3b5d..040e62671 100644 --- a/apps/mmind/ChangeLog +++ b/apps/mmind/ChangeLog @@ -1 +1,2 @@ 0.01: First release +0.02: Make sure to reset turns From 347f6783b72eb5950d4b39876111d093c38d1092 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 21 Mar 2022 15:48:31 -0700 Subject: [PATCH 119/122] Update metadata.json --- apps/mmind/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mmind/metadata.json b/apps/mmind/metadata.json index c2ed474b6..ea970ee23 100644 --- a/apps/mmind/metadata.json +++ b/apps/mmind/metadata.json @@ -3,7 +3,7 @@ "name": "Classic Mind Game", "shortName":"Master Mind", "icon": "mmind.png", - "version":"0.01", + "version":"0.02", "description": "This is the classic game for masterminds", "screenshots": [{"url":"screenshot_mmind.png"}], "type": "app", From 06a58ae1496e052b0fd245ac8780cc3663853acc Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 22 Mar 2022 00:35:51 +0100 Subject: [PATCH 120/122] Added a carret to the newly randomly added tiles --- apps/game1024/app.js | 47 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 3b96b327f..337350e30 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -1,4 +1,4 @@ -const debugMode = 'off'; // valid values are: off, test, production, development +const debugMode = 'development'; // valid values are: off, test, production, development const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; const rows = 4, cols = 4; const borderWidth = 6; @@ -17,7 +17,7 @@ const cellChars = [ const maxUndoLevels = 4; const noExceptions = true; let charIndex = 0; // plain numbers on the grid - +const themeBg = g.theme.bg; const scores = { @@ -304,13 +304,29 @@ class Cell { this.previousExpVals=[]; this.idx = idx; this.cb = cb; + this.isRndm = false; + this.ax = x0; + this.ay = Math.floor(0.2*width+y0); + this.bx = Math.floor(0.3*width+x0); + this.by = Math.floor(0.5*width+y0); + this.cx = x0; + this.cy = Math.floor(0.8*width+y0); } getColor(i) { return cellColors[i >= cellColors.length ? cellColors.length -1 : i]; } drawBg() { - g.setColor(this.getColor(this.expVal).bg) - .fillRect(this.x0, this.y0, this.x1, this.y1); + debug(()=>console.log("Drawbg!!")); + if (this.isRndm == true) { + debug(()=>console.log('Random: (ax)', this.ax)); + g.setColor(this.getColor(this.expVal).bg) + .fillRect(this.x0, this.y0, this.x1, this.y1) + .setColor(themeBg) + .fillPoly([this.cx,this.cy,this.bx,this.by,this.ax,this.ay]); + } else { + g.setColor(this.getColor(this.expVal).bg) + .fillRect(this.x0, this.y0, this.x1, this.y1); + } } drawNumber() { if (this.expVal !== 0) { @@ -346,6 +362,19 @@ class Cell { this.cb(this.expVal); } } + setRndmFalse() { + this.isRndm = false; + } + setRndmTrue() { + this.isRndm = true; + } + drawRndmIndicator(){ + if (this.isRndm == true) { + debug(()=>console.log('Random: (ax)', this.ax)); + g.setColor(this.getColor(0).bg) + .fillPoly(this.ax,this.ay,this.bx,this.by,this.cx,this.cy); + } + } } function undoGame() { @@ -387,11 +416,12 @@ function createGrid () { } } function messageGameOver () { - g.setColor("#1a0d00") + const c = (g.theme.dark) ? {"fg": "#FFFFFF", "bg": "#808080"} : {"fg": "#FF0000", "bg": "#000000"}; + g.setColor(c.bg) .setFont12x20(2).setFontAlign(0,0,0) .drawString("G A M E", middle.x+13, middle.y-24) .drawString("O V E R !", middle.x+13, middle.y+24); - g.setColor("#ffffff") + g.setColor(c.fg) .drawString("G A M E", middle.x+12, middle.y-25) .drawString("O V E R !", middle.x+12, middle.y+25); } @@ -417,11 +447,13 @@ function addRandomNumber() { if (emptySquaresIdxs.length > 0) { let randomIdx = Math.floor( emptySquaresIdxs.length * Math.random() ); allSquares[emptySquaresIdxs[randomIdx]].setExpVal(makeRandomNumber()); + allSquares[emptySquaresIdxs[randomIdx]].setRndmTrue(); } } function drawGrid() { allSquares.forEach(sq => { sq.drawBg(); + // sq.drawRndmIndicator(); sq.drawNumber(); }); } @@ -497,7 +529,7 @@ function handlePopUpClicks(btn) { function resetGame() { g.clear(); scores.reset(); - allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();}); + allSquares.forEach(sq => {sq.setExpVal(0);sq.removeUndo();sq.setRndmFalse();}); addRandomNumber(); addRandomNumber(); drawGrid(); @@ -614,6 +646,7 @@ function runGame(dir){ mover.nonEmptyCells(dir); mover.mergeEqlCells(dir); mover.nonEmptyCells(dir); + allSquares.forEach(sq => {sq.setRndmFalse();}); addRandomNumber(); drawGrid(); scores.check(); From f2faa4e0de42093913d1560caffd8206c4bc59b2 Mon Sep 17 00:00:00 2001 From: chiefdaft Date: Tue, 22 Mar 2022 01:01:14 +0100 Subject: [PATCH 121/122] Updated the description for the chevron add-on, and added new images --- apps/game1024/ChangeLog | 3 ++- apps/game1024/README.md | 2 ++ apps/game1024/app.js | 2 +- apps/game1024/game1024_sc_dump_dark.png | Bin 4146 -> 4404 bytes apps/game1024/game1024_sc_dump_light.png | Bin 3806 -> 4054 bytes apps/game1024/metadata.json | 2 +- apps/game1024/screenshot.png | Bin 5313 -> 6263 bytes apps/game1024/scrnshot_dn_300.jpg | Bin 56911 -> 0 bytes apps/game1024/scrnshot_lc_300.jpg | Bin 55178 -> 0 bytes 9 files changed, 6 insertions(+), 3 deletions(-) delete mode 100644 apps/game1024/scrnshot_dn_300.jpg delete mode 100644 apps/game1024/scrnshot_lc_300.jpg diff --git a/apps/game1024/ChangeLog b/apps/game1024/ChangeLog index af0925b0f..ffb1f94bc 100644 --- a/apps/game1024/ChangeLog +++ b/apps/game1024/ChangeLog @@ -1,4 +1,5 @@ 0.01: Initial version 0.02: Temporary intermediate version 0.03: Basic colors -0.04: Bug fix score reset after Game Over, new icon \ No newline at end of file +0.04: Bug fix score reset after Game Over, new icon +0.05: Chevron marker on the randomly added square \ No newline at end of file diff --git a/apps/game1024/README.md b/apps/game1024/README.md index 474e8c97e..500453145 100644 --- a/apps/game1024/README.md +++ b/apps/game1024/README.md @@ -11,6 +11,8 @@ When two tiles with the same number are squashed together they will add up as ex **3 + 3 = 4** or **C + C = D** which is a representation of **2^3 + 2^3 = 2^4 = 16** +After each move a new tile will be added on a random empty square. The value can be 1 or 2, and will be marked with a chevron. + So you can continue till you reach **1024** which equals **2^(10)**. So when you reach tile **10** you have won. The score is maintained by adding the outcome of the sum of all pairs of squashed tiles (4+16+4+8 etc.) diff --git a/apps/game1024/app.js b/apps/game1024/app.js index 337350e30..9f6081376 100644 --- a/apps/game1024/app.js +++ b/apps/game1024/app.js @@ -1,4 +1,4 @@ -const debugMode = 'development'; // valid values are: off, test, production, development +const debugMode = 'off'; // valid values are: off, test, production, development const middle = {x:Math.floor(g.getWidth()/2)-20, y: Math.floor(g.getHeight()/2)}; const rows = 4, cols = 4; const borderWidth = 6; diff --git a/apps/game1024/game1024_sc_dump_dark.png b/apps/game1024/game1024_sc_dump_dark.png index 15ecb87d9e7e0180b7443b717e0aeb5409563fa0..87577ecfa39c5f663d4c883425a8d4625168631d 100644 GIT binary patch delta 4397 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 delta 4137 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 CG8;Gm diff --git a/apps/game1024/scrnshot_dn_300.jpg b/apps/game1024/scrnshot_dn_300.jpg deleted file mode 100644 index 2f4cc4bdae9e3b315db280c378f2ca4dd10d5e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56911 zcmeFZcUTn7@-RAxh-46u%pySqBxeLxM9Db_5*A?zl5-BLf}ltc5m3^K2uNIzoO2M6 z468)RNsuMEz_Q%I_kGVf&;5Si_uPB`y{BQAn(pfAuA1(y>KeMvzMcI5s5Mm7RR97o z-6XgP0B7^J^zH>X+5>>PIzMn30Kn@C0Uv4z)iHZn` z$$(Tu#Kh!8#O1_9IK;%|L`1<~;35FLB0m2MfQ2Fi@BiJ$3-AA;%>fn?{tZLU5y3