From 7e8df5593e450e0742c182a844d7313cbc9f0173 Mon Sep 17 00:00:00 2001 From: The Dod Date: Thu, 13 Jan 2022 17:53:42 +0200 Subject: [PATCH 1/7] Add AccelaMaze game app --- apps.json | 15 ++ apps/acmaze/ChangeLog | 1 + apps/acmaze/README.md | 17 +++ apps/acmaze/app-icon.js | 1 + apps/acmaze/app.js | 276 +++++++++++++++++++++++++++++++++++++ apps/acmaze/app.png | Bin 0 -> 8863 bytes apps/acmaze/screenshot.png | Bin 0 -> 10082 bytes 7 files changed, 310 insertions(+) create mode 100644 apps/acmaze/ChangeLog create mode 100644 apps/acmaze/README.md create mode 100644 apps/acmaze/app-icon.js create mode 100644 apps/acmaze/app.js create mode 100644 apps/acmaze/app.png create mode 100644 apps/acmaze/screenshot.png diff --git a/apps.json b/apps.json index f28766ab5..bf887cabc 100644 --- a/apps.json +++ b/apps.json @@ -5660,5 +5660,20 @@ {"name":"timeandlife.app.js","url":"app.js"}, {"name":"timeandlife.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "acmaze", + "name": "AccelaMaze", + "shortName":"AccelaMaze", + "version":"0.01", + "description": "Tilt the watch to roll a ball through a maze", + "icon": "app.png", + "tags": "game", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "screenshots": [{"url":"screenshot.png"}], + "storage": [ + {"name":"acmaze.app.js","url":"app.js"}, + {"name":"acmaze.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/acmaze/ChangeLog b/apps/acmaze/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/acmaze/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/acmaze/README.md b/apps/acmaze/README.md new file mode 100644 index 000000000..4724eea3e --- /dev/null +++ b/apps/acmaze/README.md @@ -0,0 +1,17 @@ +# AccelaMaze + +Tilt the watch to roll a ball through a maze. + +![Screenshot](screenshot.png) + +## Usage + +* Use the menu to select difficulty level (or exit). +* Wait until the maze gets generated and a red ball appears. +* Tilt the watch to get the ball into the green cell. + +At any time you can click the button to return to the menu. + +## Creator + +[Nimrod Kerrett](https://zzzen.com) diff --git a/apps/acmaze/app-icon.js b/apps/acmaze/app-icon.js new file mode 100644 index 000000000..8bd043b8b --- /dev/null +++ b/apps/acmaze/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwggaXh3M53/AA3yl4IHn//+EM5nMAoIX/C4RfCC4szmcxC4QFBAAUxC4UPAwIOB+YCCiMRkAFCkIGBAAQfBC4IUEAQhHIAAQX/C5EDmcyCgUTAoYXDR4kzC4UBPoKVB+YFFAQSPBiAKBiCnDGoZECABDUCa4YX/C5qPBQwoXGkczmC/FQYSSCVQSSCEwQOCC4hKFX4QXCd5YX/C4qMEmQXITAinDPoIADTwSPFkKMBX47RGI47XIC/4XCgZ9DQYYABmKYBmIXFkczmEBRIK/CQYQIBkECSoiSCA4MQa5pEFd6IX/RgMyC6H/QASVCRIS/EAQrXFJQoX/C6kDRQIXCiYFD+QFBmIUCkYFD+CJBiSPCRwIFFSoQFCiF3u9wI4gAO+wXW+IXygAAW")) diff --git a/apps/acmaze/app.js b/apps/acmaze/app.js new file mode 100644 index 000000000..53a851b5e --- /dev/null +++ b/apps/acmaze/app.js @@ -0,0 +1,276 @@ +const MARGIN = 25; +const WALL_RIGHT = 1, WALL_DOWN = 2; +const STATUS_GENERATING = 0, STATUS_PLAYING = 1, + STATUS_SOLVED = 2, STATUS_ABORTED = -1; + +function Maze(n) { + this.n = n; + this.status = STATUS_GENERATING; + this.wall_length = Math.floor((g.getHeight()-2*MARGIN)/n); + this.total_length = this.wall_length*n; + this.margin = Math.floor((g.getHeight()-this.total_length)/2); + this.ball_x = 0; + this.ball_y = 0; + this.clearScreen = function() { + g.clearRect( + 0, this.margin, + g.getWidth(), this.margin+this.total_length + ); + }; + this.clearScreen(); + g.setColor(g.theme.fg); + for (let i=0; i<=n; i++) { + g.drawRect( + this.margin, this.margin+i*this.wall_length, + g.getWidth()-this.margin, this.margin+i*this.wall_length + ); + g.drawRect( + this.margin+i*this.wall_length, this.margin, + this.margin+i*this.wall_length, g.getHeight() - this.margin + ); + } + this.walls = new Uint8Array(n*n); + this.groups = new Uint8Array(n*n); + for (let cell = 0; cell0 && !(this.walls[n*(ball_r-1)+ball_c]&WALL_DOWN)) { + next_y--; + } else if (dy>0 && ball_r<(this.n-1) && !(this.walls[n*ball_r+ball_c]&WALL_DOWN)) { + next_y++; + } else if (dx<0 && ball_c>0 && !(this.walls[n*ball_r+ball_c-1]&WALL_RIGHT)) { + next_x--; + } else if (dx>0 && ball_c<(this.n-1) && !(this.walls[n*ball_r+ball_c]&WALL_RIGHT)) { + next_x++; + } else { + return false; + } + } + this.clearCell(ball_r, ball_c); + if (this.ball_x%this.wall_length) { + this.clearCell(ball_r, ball_c+1); + } + if (this.ball_y%this.wall_length) { + this.clearCell(ball_r+1, ball_c); + } + this.ball_x = next_x; + this.ball_y = next_y; + this.drawBall(this.ball_x, this.ball_y); + if (this.ball_x==(n-1)*this.wall_length && this.ball_y==(n-1)*this.wall_length) { + this.status = STATUS_SOLVED; + } + return true; + }; + this.try_move_horizontally = function(accel_x) { + if (accel_x>0.15) { + return this.move(-1, 0); + } else if (accel_x<-0.15) { + return this.move(1, 0); + } + return false; + }; + this.try_move_vertically = function(accel_y) { + if (accel_y<-0.15) { + return this.move(0,1); + } else if (accel_y>0.15) { + return this.move(0,-1); + } + return false; + }; + this.tick = function() { + accel = Bangle.getAccel(); + if (this.ball_x%this.wall_length) { + this.try_move_horizontally(accel.x); + } else if (this.ball_y%this.wall_length) { + this.try_move_vertically(accel.y); + } else { + if (Math.abs(accel.x)>Math.abs(accel.y)) { // prefer horizontally + if (!this.try_move_horizontally(accel.x)) { + this.try_move_vertically(accel.y); + } + } else { // prefer vertically + if (!this.try_move_vertically(accel.y)) { + this.try_move_horizontally(accel.x); + } + } + } + }; + this.clearCell(0,0); + this.clearCell(n-1,n-1); + this.drawBall(0,0); + this.status = STATUS_PLAYING; +} + +function timeToText(t) { // Courtesy of stopwatch app + let hrs = Math.floor(t/3600000); + let mins = Math.floor(t/60000)%60; + let secs = Math.floor(t/1000)%60; + let tnth = Math.floor(t/100)%10; + let text; + + if (hrs === 0) + text = ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2) + "." + tnth; + else + text = ("0"+hrs) + ":" + ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2); + return text; +} + +let aborting = false; +let start_time = 0; +let duration = 0; +let maze=null; +let mazeMenu = { + "": { "title": "Maze size", "selected": 1 }, + "Easy (8x8)": function() { E.showMenu(); maze = new Maze(8); }, + "Medium (10x10)": function() { E.showMenu(); maze = new Maze(10); }, + "Hard (14x14)": function() { E.showMenu(); maze = new Maze(14); }, + "< Exit": function() { setTimeout(load, 100); } // timeout voodoo prevents deadlock +}; + +g.clear(true); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +Bangle.setLocked(false); +Bangle.setLCDTimeout(0); +E.showMenu(mazeMenu); +let maze_interval = setInterval( + function() { + if (maze) { + if (digitalRead(BTN1) || maze.status==STATUS_ABORTED) { + console.log(`aborting ${start_time}`); + maze = null; + start_time = duration = 0; + aborting = false; + setTimeout(function() {E.showMenu(mazeMenu); }, 100); + return; + } + if (!start_time) { + start_time = Date.now(); + } + if (maze.status==STATUS_PLAYING) { + maze.tick(); + } + if (maze.status==STATUS_SOLVED && !duration) { + duration = Date.now()-start_time; + g.setFontAlign(0,0).setColor(g.theme.fg); + g.setFont("Vector",18); + g.drawString(`Solved in\n ${timeToText(duration)} \nClick to play again`, g.getWidth()/2, g.getHeight()/2, true); + } + } + }, 25); diff --git a/apps/acmaze/app.png b/apps/acmaze/app.png new file mode 100644 index 0000000000000000000000000000000000000000..0d96448b11888295d626c0eb3a81c031b105f177 GIT binary patch literal 8863 zcmV;QB4FK#P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+P$1< z4)OQX=jwjI@{#*GGu7+-%ID$hg4;bzd;VPI>xj+QK-YoWfKKjgc{3g-$>;WbZu~V+ zndeO`IXzCb+4I`36ZcfEe=hBz?}NzS>hS}gkkSa8<*c2~IK6-8GXp38tgF15^V`Zh z&wJ~<;>9rHnF#`UTHftd>qh}S3HkO;eV6|I-8bRedVTJ`$ueFt;?2tgCcGB@7V)z> zTr;xI2d1_0kL6td)*5-Oc~)0_M56K1D6MYNk!v`yA#%4bi~J=11>UFqQ~1fc>dxj2 z-F4%qn_?`xvXt>=m}-`p`?Z_S6uq4`@oH_iZhw|tvc-0H_K6>}Y;wg7m)Wy!r*e*u z?R_q0-?!}hb(6XCFq~=)gPFbkZ+_ILgTMJvYjqKk(fKYb=4C~5nTG6~{N^k+#H?%I z!WQuD=h}Y#pg*W8I~cZ@GYhP`ogrE=KVVoE8el4^F@=a6GgIp>mVvBiOb zp~R9(E~V6JRpmyNu`1_RK54eO=38j7rIuT1wWB`W_t0ZcJ@?Y@_&dHwXVlj$fnPiZ?QNzfNv4wsb8;4-%r`Wnb_wB{54e@h*@7S?Ik*RiA-?Dn?q*it-=w-Nm*ojIcKVma} zn66{8BkA62YnVvoej&I%kp}C@*-gWo0kYm!RA zm|km3PtIWp%l7GV;F9K}$gFrJ*UX$6$c6p2I!8Je88cQ5Q_j}a=fd`9orBN7oiB6x z<$9@0HymH>Q88Cm(BoigW4TsV2!-h}=UhTS@}rMbXG<&!ojG!9`>TZ!GQ;x^1e5(43b?;Ks!VOe)HN z>NeuP9S}TvoZvqnPMz`o{c!4WdV4s|YOZo}-Y1o7G>+}@7{G;)0ff~}LjT!?l#5n= zr3OC103x`TXW+^n#n7@Fw#~+tvGWGY={e3lcwKQ1IdrM$Tenyo)^FFePPW)gyx&Sd zQw+Jc;;g8&$vvAwxx(#{#G&2=?}*NZ@L zo2gV>x+%CA-mf-deXljwTw6?_tQ;#!2yHUxZZ-HG7A*_5DCrqOzZpUo5OrxUNDJ)6 zstnp1Y?I-fvJW$PJ(bMw$*{_|?TA zB9I$3F)VcbS=A{Y;0H! zP9mFFa1$d&BW{9=QXX@R2-74I=5FF6I$i|VTvus5PFoA|a`=9x94l{^hwLPro?THw zj}>vCrHk$ah|1&>9cDq84t`W)>&$P?V!dw=7jdY=!x-@NV;qk<13t<|gI~i<*V4@L zCAW?$biCh+3eiO;s#bESs1uwEUy*$>E8tXJfYjhj#QkJ^Yf9U%*t+09c%7I72$w8+ zg!hI1iB{o5p^c9C$^l6=dN^4i&|#0@74X7Y3hR$mVscoODK*ACBm_xbb-c3{k{`P4 zmGuxXxxd3_%4?Io%VX;iCJ-hkE%X7$SokFu!?#k|?kLZ;Ax$E`)KF0%O(65##i1L< zZkt@~ADjL;-Kav8~{3&W$jKs++Q zBy8QX!s8>!&6}~$&d`3a-`j#;txiOu-pGV$1^3g%kJqYybMfP~N-oAmpz4m3q2f*K zZb51m@$3{wDBIzSFkSG)@BK@i(M%Pj&3V){21}dPG;GTOq|*%pW#m?Atbxq%k>dZ> zvWBUw*>aH^AW}3^O!IzBeLIM*HRu(zdV?8z#P|cg3Ste@*fzu;U~Fj)K`|RNTpsjN z#2%tIqr?mkhsQ0#kdjb|)NA#yy@tnidw~F77D^__016aPqvN32?C4anB0`XsJC@PT zEVe4jJp7)A340zzGCK+Ta-pVBq50W&*AjL=t+GWobjAB9DF-HLglZ6^4dRCm&-I2t zNec-C14eDI00sv50)Q;Q=LGnos-;At06Thu%)s<#+O$&>nlJ>cd31}8Y8*lCXX_I* zWw_aTO|Vl!xoN#>`6#)MN5|!yP@(60wRD`j7Qi2AnXK69-V|GqITvs5fvV0;;L91WD2H5Y{Z5L!_kLa z0W~QBHt;h>WwJ(}o!l0$)io2mFCtl)-DrcbsM($jmY*|=!e*S?E}dvnG=$iM(29LQ zQ2TSYRH{sAEOAKFT4W>aPW)9)bsLLJ`M`q_RY%_3l9)$KttVXF5V~r%(XJhY;VlCE zgE{3Eh{14W6@D>s@|0c2YB!kX9TZIk> zzhPD5AHyDBxQI+-iK)s0xVop!!?S>tt!NR)(_Eelh-kO(m!V{buW_D6;ph*epj|SK z40Mh2|2U&y4~-ZzSeTm67HMhBMLdT3gk)^^3oPS`8=7q}6XrRJijq4035k|1tLrj+ zjQCH3?)PFUelB@oc_oV;m03(8BH|LAesIjzOpKNR069MU|(pqsL{( zdJJ>*()OUEBvJ&a?&x?8uG=+uX?yT?$UK9qm(21tu{=y>^B76Hm?!e1zA5j=OI?6B z3J@~eD)i@m1U*6tZrn=$z^=Xx`^3v2TCXmik|G_`7<}vecCm+qLFe)PqiI~0tzN{V z{uvv3BtxzcOa>LEAwXpU3z5&*r{o!pL?zH9U+@Hy=9}3yywbw+iM~F$#^V{)-8EvN zkFX>tbzo`3+W{tV$*#OaQ+2_q&>_4R?*2Hw_00pzA`nG~WH#I^J1Du7D8UJC(3GGE z!>ylUp~*~ioH)iDoZ#lhTd37$VcUo<)ol&u4?8=q!U{E8>R`oJ3Wv~A!Z`>`<-TY* z(yCGpBIIHU!jBf}&sve&!y?t6KBKlL@^hmRH{Jt{a9`5CWWAFtCnbg;3RtCKSUb#j z4?gR-EaIji=?lrDBOJ&nRsh5}SibQJ#%*!w;95f*AR|r+Ypys1;@{AFH^WFxwMksa z{oC3;PB+^uK8}!c!Y;kSxRUlbk+8(iNwF~pB4Dh-IrKOpc@z{DJ%H;yCDd6-MhPBlB9%1|CWl%|P`OxH9P)f_Lhf0iKB)f}Ms~~x`X{$u{ zXn9Pz$<1y19*4yA;V23j(e@2`T9j$J2hZy~o)5b?3;<$8FfGp7Pw&$XAeae(;RY7f zgc_~Cb2%?P4$#V!rjn1UaGeJ~8N^RkyAzFm&o+dsE_0Yj`ZJZF{yTXHos?Ysx5=h2 zN?>}jCdJOHuSF0{-O>_UkDNwdgiuy-e-VOLB=D5fzVT9CI#f$|=9k9Dj{lKN1eZSv7;UfX5@YV#a5GwU{8 z634(UY9EWhx7|Kal0Sg}c#~B3h9Rg2ig0GNZTQS;pZLm(aqOsb&!~dUT|lxb2`rdS zV3%^@)ScztCTSi_GC6!FjuW(%q#=F}XM9VR>{N+jb02dh$4UFUlMeN7+$DjfdLO0! zE=X1Hqtwge!|QD&mNIpCSF86GLDW>NG+tyRv(T?KRY%S?+;S&7Ic`p>wXRzVXSzo0 z%3uZj>$6D*KgUcNKTw}-!AM1_YaiJ)r@Cf2ZajiXdbttB+`vjOxRxP)WSU>Z3#DCHav*)L8r42Y4 zaHZppw5&u@YNcB!)sFUKDh9I1-z^7--DX-^f_s!n{Cjp_Jy7nqi_#*HR#BK8;1*f?&n$2fUqD&el z#MpP7A`J``+9^#B#3|CiU;~kI4te)4ps(40M;cs0i&kN*%Z@@;O3h=DYSOhJ->@fP5DcRV%vThpe5OOE( zElwDpMBsTzNm`&E!`j4w&z>>~+k2lrL-duU&Cu?c{+y}!;nL?T)h{j;Wfm0|Wxmn| z>7F%E&A)dtS@Q5n7CalY-evB>aXtDT#HZX5}uoeDX=pwm#iY=LoE; z?>X0pl_+c$2H}Oer8sU$7Ja32KV(T{0y|lAdK3UXc30h^kDZ4}f1dDg z9MBx|XjB0=ca>}2z*Z%L~pym!f{o!~9(u zMqPOram8s9E3ohBQli2aOz*+Qk9DeOF7rG{B!<2X^i`SpdzIN8JKt7*G7*=VZ@>r- z<2YG_jIz&?QT7ZNN9wCFZeDwZeKkYF6?Q^h`no=*o8M)d)o&Bv@2G|PZ36ti zJ0nLFYAkl>ui8k%Wj{iGlm-XwY(w16#s*zC8V>^2t~AWF`qEwn0fE{T6O`1y6?_ygMv3E441TXiYxp&~e9# zIpduIsKWs^Y<_{&jRsUamkq5J3E>V0ec%A@?96IJ6Ge@53QSpcu|2AS|CUC1nPOPc z?fvQMF+KId#{*4RYIlPfbO%|Ew!~?BZl)ywx1dUfcy1_Zx|0fomqN6Y@Kgdb8&2G2 zPu#WvB*AhruLo>SAIK%ER-1xiX=$4UuEL)u%xA=S$qJ59u*u=uuwMNb*Z-7;4!*?(V=L9$Dt+== zQl03``&>vDFOjDhCVcqIBX6BhzXkbsxpwt9(Vc70ZDRL>dyTM_;JWSjT%b}PZ2V*A z2)Hxd_B>LL1=v!0-8r&8c8(A_qVszk)Eyz=Y0o&UbB|*&xs=9F4KP@ZgbY`}Ab_Ll z9n7TB_-z{Hgd}J&P~apeDfy6{46K^2ow`?x0PMfPop-RKew&qn%M+NEa*{G%#;vZb z%vI(yuH<|fzob=4J(-9L0EiZf&qL}a&uw7PWBy5Jnpr-QRLN7S zPl-yQdhf;G@r?$Sic}a`MWk+h#`lZjo3v@In0&+JWkJkMGi@hrM;7Gs#Mfn%E=lQJ zq93+6=ZunOavTSUQ6?5rk5m4T2Qcm>OHtow%9|R)V~)K@m2w((J)9mD$t`Q;r8u;6 z=0P$>Qa^4lW1Qy*=N8}G^C;>HZY0PnhYpOs>4-9Z-dYa9^K0zoM9tQZRj zQG!XOmvx0v;%r48fU%N{=lxDpoW;my-Q3%&Xmh(Z^;c5aeL3Cj9J{o~1Zf;{gvmPJ zIylr<3x~beeub<*RDTayM`y6M)g?O{XCj_0MhbHHhBoKg}(@4RF-E zCKZw6X;XPFC+x1qrCSR`1~D4FD;%esafNS10>8adT%fGA{oDs#oHReluu2LsF`msj zKy~@mGi)n`JgNf!fRN{%JkG<(0gGLyuSlGo@7(@(nr;Z}TkN=1W^IYb;nmHIC_H2hO} zMM{>|T_wwV>F9>k?jgOSex2WWO7DEpc=avA^Q+?ABdb(jwDQ-Po~J~QdW-^J1c6`K zp7%weO%2so4EQDle3$Flk;Ye|NBsr`KY^h70|otdu*DjA07V?^UiMRJ=6eIm$@#x- zFL_GOYy+}8-H~qTj)&aL9##F2nzo&F3d#Iz?NBQO?r-sLMH zbNXv;DVf)8CnqC=T1c2Ra(^uE6sn z`M44-WhYt=^EmZj^|_QQ6C!FUE$$~AI+K)VzWX3(dCm~1zeo{uXnB)|bgxcYeL888 zRTN1YDQ#vI;?qHauOvjcyGkU##5Gr!A;{f}Zw@RZ-C91RSMpW`QE&4fv94VSey#)G zs=$BXrFs*FM+xSMA_evGtA50tW{N@76&@LbB6x&UN_rrm-8Y9NE-Tzz)<+Y%*@=3S z6}@$S^>-$84gV=KdM44Bg0nr<(XEyWqM65QZl4M23t(6Yt#Z0b&{9o(U>Kg*WbkWOWI4h#AK^LiS zv6?Qu5XN?Sg01ppgB76DHaPI~v&D0bS!zB)>U zamg12ygVrFrtWjQ>2tTK`seMYRr03yXjgp?ci)y8Z zuKs+I=5@aH%ptTl?J2Uf!P2($K}>m$;u3y2kFtCfnwt5P9Z_Y6dxuUv{bhGTDjraS!s?~{{-V^4jp&!7locB zk0uuU-UVDa3X(J!+xI?MT%bHp56*_)w92Yay|TY)l~vA*tN2`(0VfFK*@~TNd=bPG z!l=!cU{rHA3&>N4LYKV7BL;9++83{8f!)~sM1_w|M?VG@U<} z64Y}o;d3dWhP=*`Cv1tkJ$WLym6y78hTs$>a`m=Xd5k5N+*-3nT7J8cGKf6JvS~aT z;*+0}N|{D{j1){V?r28gjZ0X=cpC-(*yNzzcR9RHJ3Uglt1Pq0oO&qH9X1F33|aE{ zj-P9Bw;tXq-{x>FFiJTAS+&(#C{bBLG@FHt<9|v=%bLXcef&kN|F}-|Z({u~g>*&< zFihz(+ZDh_(_hII=dv5eg)NJzHw=6tBjBk``K}I$gUj`816kY>@-cn` zU~CuMy9Y8DK?XTLZ!)Mx+@*ndalurLJU-Zl1pBF$zH4qB4_-tk-{&OMVMTZkJPDy1 zn%OmT_oEh$=zx=Qy+O7IU^Rm&B}Mrni4Nv=J(I26s!F~8JeM^L?oH}0I-W03nBu&q zYXKC*Iy{hrz(7#*`h0b}V1MI+)Hwt(vuU?y!^P7{JK+8vj}JqsuY3Qyq159t{>@P8 zSt9>@DD_>q|8ywz=RW zr;<+=+9Hp>O7Wd=9KW8D>jYS_*$Q2@ctj&`i>n~?fwXS4RF81E(GoBoO}^d@M_#Ov zZ?#AbQk3OuYA){)q{|uaC(knr;jXjD*My|gc(>%~=Mw5Dk{JrN?a~;*y*wL(z@mJq z#{LK#eMH#}vPv>)@t#pTWggw&tS792;BK%TCkbV6pQg$MNkVrnkS}7$uqP#br2FgA zYLRa)D^40*Q;{;gKr8I7%Xclr670bH&YCvhGSQ}se6dliHE=*pNnb+j)c*kl{Iz+o zlf$?G00D$)LqkwWLqi~Na&Km7Y-Iodc$|HaJxIe)6opSyMUjew8B`oHR3{6fB92;x zB2);qLaPoYFa3ii4M~cNqu^R_@Mp2=;Nq;SgR3A2{(v|-IVrkGiT5Ri7BSxN$j5p2 z9NxPR5b9;7+a2S8Za7vd5tlOARjKP0A^IW^F{m)xoRj4w0_*FZda3SWJS({G&+653 zHUmNu@hmefhj@c{debpE?-PrxsA$CJ#A6m6kob}7s?Tqn3mywRQ?$~ld18@RDzvfM z#;j=R#8bpkO*bfC$oQ;r-r}s6tE_oWe#1!4SXt&etzjgvh$YC7prVQr%5V^)zd?$P z6z#_Y{6n5!CYMUC5*RraP=OA`^Mk*^@7db<$q7Fx5(he8T=!!H=-LGuHP`((^e=}AOE zRA}DqnITl`NEC*D-XRf*DW)cdiic?gF~wktXbcLC!lb&0*3?vCP?%t1T2s*?8nIMt zOc1Gwc{QsrYf?eYL?mKXyrqX^W*}^rvoCx4b1;|TPH!gj&v&PL0H^{WMNSHUl>3)L zk|YUn9REzEC`i+PmIuJ*f8XZWm zcDs#Er;~~Eo<0B^9UbBB?(S>%fFwyJ-^3`f3zg;R1HgV9$MC%D`|f!j_vla46k!-L zQR zf4WeaR$-qPB!qwvf@-zO<&wM$B}uZuhrA5K;Ifk>NsOzAK4hAv@H~&nAICAjfW=~g zAPCUw^)hi?*HNid7}xSV4}=h$pR?@L>-BJTb(M)vr&Cla6l@p#8Vy8`~5j!e)6 z<=sZ4&$5t6Q50dhTz;N~@~YSC&@_#^>qRyvYWY4}z<4~~*m4mT;ucV=)wpi+)zWnx zwrw-<>+5Ub#n_I8b}qCn3-LO#*Hc&1H0Fd3!;pC&MJ(j|{w7!6;dmQT#7G~qP~L5p z%O#r4CT?zSmUHEo6&B! zTey=N4u|yi_IB&rX;DWeQfWG}9SfC`g+zVAVzJnog+y-i9%87fTAYOp!{D})p68+6 zZll#|ZN);Oj!Y!Sad2{S!o6qW7NBVwa|XQny=7VG_xoEdyQm`*X|-Ajui|$sv~!_t zT}Z@2^?JSVy^!es=hdN#vQUyFczSxm!NCDD-Z(WtklhC{1S}-WGAzqt3J~23sj3Q1 z)0hGpjRt(*=Q0eBh0e~-;5ZI5em5t(4^9v6UhMV1_rAGrUS^V= z$!vDNe4AvF$;PTG%c3F^Ap-yaRCzfm^?$PIKNS)FU)$JuU*{1J_b+8I)Vc>(+^2?3PR6*4<3p(3Y{K4pVIhlZZ`hD z0&1?lN!HK?>ke}*_^^J~@O_WywAo2J={<=WI3NAK$@+3q z$+qUuWd%C4dgR6Tzc848i(&!$>a%)g4xMp)@R>j=`97w;ulw7^pJ{D9#Q6$5^ZZKr zbH}G+2Hi{EJJveX*f{aJ%Jv>!Yd+-D(cLuYb?+ZTcHZm!Y+*C+nR?loSU+`37{ao* zl{%%H4A)>8*f#ZpyruojVn{48TZr6n0-9HbFS`t7i{7S%N%;}NwO;Vm$Ybi*stHL_ zsxV-jcbP8%S7J2S?bDNLyhs#*MVtU0_E(3g$`o@22KrFLX_06W_a6e^4c(dgBd`=1 zyVKPbYa9I7*;h2(S=v`t^6bD>9NPPT$C)-gw@4hvhakeM3VZWwDDIX6wHHaJo>*+W+nl)3*ky5Tk&5Zs%E4H`83(Q*@)E?gxt;0qF!7pM$Rro&h_7d9j!bn; z${Zd~u)k05V18HvKF2ob9rz6L}2F7za@Pb|OC+!HZzyt= zK%=!%@@>+-?zyvPe8lXMpex1TZ_JZ5`-W@QcYlptuS%c-@*LE*V0}q?ZzLxj3`g2u zLEO~9plxd1hxt>8u1X_ty5f=(iM_4|iK(xLBctD2Mf0+2rKg9sF*PjPb2zcr%d`jA z=9uu%^u;f^+Tx1TjmrKW*;r6wO=p9)ZuWDxR_qRD!=fW$ciPcVi}KNUmmtc_rpl_# zeerVFP21NtUB}~MjJXbf=T&4eAW9SbUoo6|)$?JYl_*l%=+7}LZo9a_Lxq73eae*~ z)M#Ed79_2`8|KD3d8OHc9TSU`?0p$y{g@naX4l~0o6XnfVK~nFr0|!nkQP*d8{TFo zkOTc*>%QidgE~}^UZ(pu{)QjNv_n5WtC8Sk?R{0m?p-Hg9iLX+K9M+w0;%5oz+^Q- z?f$%X$7Jm?zF{0CLxj%}%wh^ih&zqc0E+0K4>L$i(5K+!@T1LR>8tQ$=N-V2UlH)U`6|qio#|i;k(f{IlRNz_>WMqT3euh1#v$fzC?-k0n z1%`Fx6`_`2Xj;_(p!8O~E`Aq{EnrSukFvm=#VZ+msZ{n^PpeZSK~YXu5;!FHqro6k zpthJ}6uSCU!};M~5HZEtMlILXM;P@&!jVFEha$xP5<1!pdqg^*ecEx4m;QD~wO+S3 zt)|8+*Qa<5v_XCwrGEF{OC0?B)c<@QhRC&5ui`xsgzJEIy1EWnxPd)eqhNCi<~XDc zLt839Suuy+5z7m-E_dLZaKlTc&|}U0MUeX#!_@5e^KK}lE4p$a{M&J54mC48`sh;KN}vLyzKAm=Dctn7wQ{Zqp4%7Q z;j5ZF^6597+111oZJC`XDjBgv#0h}u*{3(9H8oZOMO>K;(3oxy$jTV^Ns#Y~y>X7t zJB6e3W8kC{8xe-{@XP14OI3z?z|9WEH>MiW)9O3n)M>z4kB##l2$*umHl}D>pQVrr z@ewjZMX*=?^n!cH$HlqejaE@b0k_rj4+h7WO?D8cgaGUpGX)2cZtO^bDQM&7&(rh! zW-gT^FZoz>zAu*fNanN%L33tnq`X#+KKLP#{M5Yo-C%RN=H_%iD(qIbmc1z+{1yMa z4DP_Zs6T|p#26EOCOV%l_Z$2^lobg{`gsE?hI6$4+E+k+X>K?A8eN0xuQ1(QW<2T@T3n`ExhB7stxsrUHn zP(`2At~)59QcO``0bO)dh=L2fE^y0KIdqhbIy{~iprpGX`M z=5ZU3%#VB`rBe3$B)}l=0UwEv-mGu1iHJd*f>0NGoBTu41@PP#cegf~ovUn{IN=Fc zT=sKv)L+Y#HskMP|7;v_`bTRY&4nv#+0zF9W@y+kx;Bw{$p-NBrC| z^aLbxSX!?=Xh$F0N=lKmgD(_9HTavjP&uDZErl=>aV5-lQXrGhzN6+@AY`soLDq>7 z8FSSbLEcf?lEU#cvJ#JgKb?}S_Bxv|iw+4=Rwkb#_RGB0?fw?omwxk1Fa*?3bJa~v zJ4sxdMypXj%RCMt>EysE!+%2Hkpt0&6xGP!J!l>1aK!Q*wN_yE!XAerZZ$aquQDRG z%sgQQ?QkN~1K@&9S*T2|sm{56jfoVNd+Qe4Q86D^z+;DWVe`QoyQgwZ{=!oD@%I2m zmmUdYIfit-j*!_9wK!Ug8*XS>Q&+C{Tk8)OQ$5-CMmIA*H&pxWW+psyxK4B?lY`jJ zb`5+YjxEOVLGvW_@PHSC=H^RPF^L#d7R!57m2kHLfl6vLv-?juu6xNOu^|GvN^J?% zaA`s7vCy3q8bjYDfo0ZZ6v3F|d(UNzf%ckDmBO~d@e}9|-2A9~624_f_+5c;4DrHO zbu3cS@5N2}4Vk@zN_0-9)9O~tnB)G&NV1&73`h3lfP654bDpOh%K@VZHSPPt{L@JzXWY&lFxFqNuq`iik2Ii&sgw;`{eG3q~swQW_ z<8I52FQ*CHC%UIZP$~s=lB=dceC;6KMhMi(VtFURCYq&)KgK&^R zA;DKx3esR-RN_7+DBE=O3Yg(8uD)YlZbyMd^q|uu*7@t9t2{jHU zVSikkoTr9CC4?Y|>%sPQD2@rP$qe>Rkt-HdXTT3g=*hGrq+u)TQ$G?U%|Hp=>|4u* z%$Uitikwxok0i1piMSEJCl=Oip*rNNnSxp~xliK?iaTN$<(6~5qebR%x(KESk}ynf zBg;n?jbJP^N4+#NL_CgGWO6)uf8WxHdPFgHF65ha?R-qt{UQn9;x@)qH-8?%*+kGx z3F~r|a-AERVq_Uc`vyY{GJS8}R?}Yn)(hf{MzgFDLb9plkJ^>%96nK3uIX=dOlp+Z zOp)%n8n)Q#w};D|W)2tMrG^0}U&j3%rFhPH#t*Rc#_JNy$!^}{ra@Vgt3j=72q|FW zszM8&t`zNg0tc`bMS@gAuXLD;WAvAfJJvj;w6siL==2u}IM61P1BK<#hlfreyAv+lc(b zRYrerK$0N^xvuYTBumy8~Xnh|u6dvOLiK zfTJ{7*kQa?jHMtF(W5$k^n6*f16amkJF+EK2t#gmsXL^(mA}f7w*@Va&XNnC(oR;T zs89OQ+pH0#LP8_Ot#w(L860;h)FYmn$`Z@toSRc=)OD+3mhuyO50D9gF<;%-V$x&j z%|^;JKL#ZzGpOAPRD=r!?i9ax22QBX{zf^fpfrb>&yfPdN?+zSxi<-=oJ}w#AbQVT z3AABCtw^IdX0$;Wt-FADqJ~x4jRS{AEq<_be$FIpDP0XIfYnKu@iQz|_8n_;kafc? zBHL(DE?Sc+LH~^{4!hYDfhSWSVYIM<{TKxz*M23T&*?B+YvAodYJB$vk5Df&R5AVT}JgeHPTbv zhEY(OUf;G7M%{7zw^1R%MOHDb7p_q_U3C0{%$|O=H(`cEIR{rSEus1jrmi$vU!Deb zB>B^S)V!h1x>VZJA@_|jxsosNv8luKR9kLM94t$bU_0otD;W02zbzfFS*I%i<@@uU zj$VBGA;SohpW!f&SrK$R<2dC&6vi;YfKe>WwIhpdCPK{Wgs&KO^j(;6t3wLm271pP zz=L03W7m~vY3Q`uFSi7moi8L2_fb+NWzF|rha8B3EpI?^%!ujQ=HVV;sA2HYSi=w+n3J1Rh5Vw$3r zf5$qm2!`A~8U1rc)muYiG^SFoW+4j`Dh`1;+b1?X-a{-c1hN!;)r>E&wRsdjH936Q zvW*@~zMMRm?W-|CWlbeMbwN}8e7m0mIRjxrvF420y|SR>K~$C}x(lJx#m5duXzM(& z_(z$4KmVYh#U}oCt+A%Cdqm`(_9P!0gL=&NsP_<5?w65h&4z7bJ}u0!-E?grTNDZ= zB6$iLN@Zf?fVr*`X6QzIJKd0eX!n_a-yGvEH*3qqEy{seC1h6f@|+9F zeejIq#ovd%D~Oq7M(c&neMAB>))Uv3@_w>3(;@M4U|iSbKguh8FlXVE7TL{J{$?uQ z^isM?!j*y0RC(hF$}+ffM5Jq=Ir1{ z>geaheNY2CIa{g t@Bv+w~*V!~|Dt~U`S{@aPTK*Bba$xva5na5njr>KJct|iE# zyAx-OCzPIYn{B`37@`e7>yoSAqn9k z9~N=^=9@L0Ie2XbdmS4!qlOL34Mig6s+a#s?`9=cw#VN^2LyPBa^hBNYx&vp93 zgO&mvo>QSz;Li`i4D;KZ)sXWd3fUG8_}9o8N8zmIsVAb=&y^RA^}P-Lw=_7Z!Q_ZI z4hIlbeQ>-q2R%(>^2D{ws#Imo7lf2UOXeWDtfeNHZLw26k|8-Bj`%s59XtoYh)7ES z=}&=N>WMbELyf+3+m7BnukFu927_gQt^_Oc(YqWUFa2eD%(9bM*7xL5J>(O^R0(MV zt9zfYirHzGTciH$cgs|RfqYtp!FWTbfH5Tl;>Pm2QawA}B8@6vg+^>w4u=^a)M3 z=&+m#MB}cVdm=fXj*w$ zyy%0bXKU!a4ffF2pR2~?ej?@%e1)dJFXxZ2i(X#$KHsihR-F|$U^FN5k0tbYbZeE& zO%h_RkZ<9apQE8dP-UWV_^LPvyM&&gW@Lmq!o=$ z0A|T~l0vj_^wbQh-F4Kxj{S)kWUn$W`9E2n5LkNASFmaQh z4Pw!GvtLP&L7d6~^`|g5awqruB&?-qa?p&D;S_Y`e$|tE*W&3Kuq9f?NN2#i2;UxN zXokyY*9u6QN4>o3MKnE(!J4;@@ECo*A-deIn5MkkUm+Lc{XQ8Xi)_zMtdMALH?@z` zdI435i>RbixBI%b!1b#FmN1JC5piEn`Is)`0GS0uBOfLTva~29W;u17>%KQ zg6WZ4KkyZP1P?(~<@`GC3sfNHw^0RbBUvncb`))5N?feeWr*4Z5aaR<9|2^)&g)#9p4m44~u3i{I!s&$C9NPCI955OE8>L9DJ=(ahd zR%1l#QSHTp23kH`YM{%yGBp@)(Tq5M5Bke915j(bo;zxOhF z(=WzwhW~uZ(Cy}Pv8;{i1|9*gb3p2SCV1eAX*LJ#sb88kB0z+4#h7i}=80n-k)Qo9wo z%cH(Ey$aBEz?4#Y+SQ2H3JNP6@UERGsVV*~hq);46PaQZDG@e~4o4-qZ&-aA&rIxO z`BitJq(OSK#plJM|5`nd#Cwnw!BAz+y`gG_1s;Pi%61Si=V>qX8o9WUg!c;Z6qYPu z7R|`@gk_se1BJQ=k?w!NlkV6^pbG*aczhszVnz@B_TJ*;6X4IDCk$wa53lQawcD@B zi?)%a-s>A&FWpNt5VjX1BbbNjwi)rs9aS|9eaxxYcD9+`vzD8*EVQ=U^lx1PYNTOP zdv^`_`)_OXv*JqRAm>4zf&Q!ROyAX(uwZ+=>)2MdMh<6uVNydlNtQ`yrfFM)T&>bE zD^^)+Dm%T#XL{D`1MUbM{T=S282q-qshwTHdH|8*&ZuDDY^E?Pt>X=M$eeW%vDPAt zBoVn(Zdw(RN^thVJhrPyBbXTjU$xrzxzZHz>7dtB9-RX0*veKW>{;`!`F583???i4Jx?$d5uwPJS7JpTmMB`sb1(u(~%2-C8w zP=}3DO`CARF;8=|Gn`nmZ%8iLcm&h9*0)}o=E->aMPX+mNqhu3WqzvhhbY4U2fcVM9nLQ0wfcCbAFyf%*70t-8UUwleMuQjC zO%5}O-|e$BHlMX7O8Si?x?Rm!acnrfr`(!$l;4vcmb{^CDAbyq_!yzPP1x&vZBVr2 z7?K0t=4i-%7p!}$|H}Rtp&wO#GWNH=8ZESUE{W_ya>ghB2u@MMyV>R$a&+B(ksr?^ z@^k+_sxriHHS92izwv=9S=z~m+qklt%c#f0epOxSp2tNtt<{kEJ8VpT|8)Pt|F!B4 zy(Y=$MJ`&E){7C2SE^)9l;ut^LDQX?oM#|NTYrC~5|jSBW^4f+3uzEGETZ-(`gNoj z(8#_3Kqfdt1B1y$jUdqv&^UaKy1Yn|&+Pda<+!yQn{B8eCQ^xjp%j%6uk7^rGtTJ5 z7R%M~9s5bWE>2zV~xUDcGYJkEbTAEY?a zaxK&I=YqW@m@=X2vH6qv4LG|KyotE71Y5f`$PR_{JuGd>UVHvaR@Dk(W73aan81^C zDyxzgp03lC`~n(0eompyk}D+7^hkNTbtuik6Ap%!<7$zrHZsxP)GtQZQsk0NFUrx` zI_d(A=@_7V<7gnjthw|jSgNmHoGW|z8lbwmTEq_X2M!JR*Ge}*}dD$3EPNrNcPp& z0IdF+RhEO+6MK)VxZG=!*O|&`qj4W;FVe`C?=0T>QguZ|*4J9;VzXRsdbn81Q0qOh zn;F$NJ}rln5ut({89!98I;_?wmwVnoR-B*yhosnN12oQXj<%D5yS8*KdV!xe>X7*6G>u=D zMhm#|kbb}YiO+X=ZBQZR!2EYpV-3cVfm(DgRZ>ZK2R4uJTzD_}&x^|!9giM`YWz*`Mci3$ox2}k%Q!gt#Ogg@(Bt!$W%soHf&84(C_+71@4N~++p zgcVU&C|`3Q^fFaeR--K|D)}1==nrI#`dKl{W^vyy9JNeZ3D*3w`um5qNk=MEbii&W zkNCm4XY!n{u@H?s0c2+%T9Zr;jNi242^gfdZ)rIXv$r-u9pY#S(6lrVsO3+Qfba1pUh) zxV~2n4n(=_K>$h|H`M-`6uh@JN&!-d;%QAXU+K!yBOS$>2urtl3a)Ie*ljsSB?odP zK6(e4)GB-NU`yiNAWkDDTCchyc@7xdco65pYPd?X&Wh)E3mWtmmSBhqqVIi1SL1f> z4^$k;+&ecb+Ae_GkU$YW$f$$yJ?FM8=l(i%AeT=N;-sf#seSW~IB`hN|B8Q^y_)-X z6QhdkCp{x+!>n>by{yo9c_sGp&o&oc^{s`uRyb1Nv{d-)bITk}<#;0O!6}%c;nICV z#h5%5LojQhQKzZsyes$vQ-F}I(Zy5P7f0ngtAiEyS_G|h?e0u1L&dj{;||dPo*4juim;QERF#*M{J+^9|8hF=0#k+MMpSVk zRW!<}GSIwI_EL%k^)PTQ(YFs2zaph*yCt<~xvugKbWhf>3#PK)S3;sb7NYqY@Nwt9Du}v`&eIkA>sMpHNyGk3D zFM1qv6_E*9U|q21pL=ZHZ&ME0;c_YWer=~?zm@kZEgee^ndEhG-CRr;-f=@9@Z+@9 z@G7TZDb|JEnm@|E8Qfu67=X;y_a*;Apipd8*ajd(58B4ItOj0et_pVs`)}O7Ks|kR z^Flo~qyLw518=SzQE6!T$u3i=3W20Dyx1p9%%Y$s_pJiQplxB#i)pf&!8N zo#*bJ005X!c`0#CpN;d)bvGgo46()3_>T{(=OH>Rd0p;>FP+?nAWIH7prK_bM%$ME zwy8Qk-;i(n!|h=oWu1|V>S%rQ!}O+HvvT6#8R2pewA1;!T%PcBz+LVj;!L574M}X` zATW8`L8(`6P7<&OYpc<{cKvqx%9*n$NNoY?64?M;to; z8EgBclK~bnYyOQf=+zlYLuBi;%?u(9RM}G|yR4`8$~YX^nxWo8xb)6)r{RSz9Id(h zi^ncWeb+J8A3gMqA1!eeai;CMV;I|lnq6Z)IaeuvW(F}KM0}9K6cz{_WkJ%PvZxIv znl?!auzE;y4_VD|e!ChN_)_1_>k*w);1snlJb_bk{u=xV+r|I(a7Ug58XhV<1oJBN zZ?0(c9cEYj_eUf3)4-NQS~n=ud6Y9f6!g+n*Npvq{++UDrD4*hLr&_(?IYjW{V2b+l`sHU?8QI$uMu^Ajy9~|BwBwTgKiLwfm6+5nqzjiPusj0!HD~9xWM}=}{^PKkajNB<7zF7vlT>jkgC~)n2y-vk}gd zW-nR&2_M0M{$IBKA2$AL@%(rE{~Or Date: Thu, 13 Jan 2022 18:22:13 +0100 Subject: [PATCH 2/7] Improved battery visualization --- apps/lcars/lcars.app.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 2674d323f..3b9745a7a 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -20,7 +20,7 @@ let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; let cBlack = "#000000"; -let cGrey = "#9E9E9E"; +let cGrey = "#424242"; /* * Global lcars variables @@ -143,7 +143,7 @@ function printData(key, y, c){ } else if (key == "HUMIDITY"){ text = "HUM"; var weather = getWeather(); - value = parseInt(weather.hum) + "%"; + value = weather.hum + "%"; } else if(key == "CORET"){ value = locale.temp(parseInt(E.getTemperature())); @@ -242,9 +242,14 @@ function drawPosition0(){ // The last line is a battery indicator too var bat = E.getBattery() / 100.0; - var batX2 = parseInt((172 - 35) * bat + 35); - drawHorizontalBgLine(cOrange, 35, batX2-5, 171, 5); - drawHorizontalBgLine(cGrey, batX2+5, 172, 171, 5); + var batStart = 19; + var batWidth = 172 - batStart; + var batX2 = parseInt(batWidth * bat + batStart); + drawHorizontalBgLine(cOrange, batStart, batX2, 171, 5); + drawHorizontalBgLine(cGrey, batX2, 172, 171, 5); + for(var i=0; i+batStart<=172; i+=parseInt(batWidth/4)){ + drawHorizontalBgLine(cBlack, batStart+i, batStart+i+3, 168, 8) + } // Draw Infos drawInfo(); From fbbb0bb36738c0ff69ccad9db2c1d8b70a49178c Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 13 Jan 2022 18:24:30 +0100 Subject: [PATCH 3/7] New version. --- apps.json | 2 +- apps/lcars/ChangeLog | 3 ++- apps/lcars/screenshot.png | Bin 5721 -> 5787 bytes 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 93b1cf44e..bf8151743 100644 --- a/apps.json +++ b/apps.json @@ -4518,7 +4518,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.12", + "version":"0.13", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index 702ef58b9..dba05915b 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -9,4 +9,5 @@ 0.09: Tab anywhere to open the launcher. 0.10: Removed swipes to be compatible with the Pattern Launcher. Stability improvements. 0.11: Show the gadgetbridge weather temperature (settings). -0.12: Added humidity to data. \ No newline at end of file +0.12: Added humidity to data. +0.13: Improved battery visualization. \ No newline at end of file diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 319062dcce36640c38e24378d97b7724ab3a9f74..120229fba29717e0501a63ac1f805467b1edc5fc 100644 GIT binary patch literal 5787 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 Z@PEl{>&?){aSZ?f002ovPDHLkV1j3-{UHDV literal 5721 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 Date: Thu, 13 Jan 2022 18:58:22 +0000 Subject: [PATCH 4/7] Simple Pedometer and Lato Pedometer widgets, fix size after step count reset --- apps.json | 4 ++-- apps/widpa/ChangeLog | 1 + apps/widpa/widpa.wid.js | 2 +- apps/widpb/ChangeLog | 1 + apps/widpb/widpb.wid.js | 6 +++--- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps.json b/apps.json index f28766ab5..b837b8f2b 100644 --- a/apps.json +++ b/apps.json @@ -5618,7 +5618,7 @@ "shortName":"Simple Pedometer", "icon": "screenshot_widpa.png", "screenshots": [{"url":"screenshot_widpa.png"}], - "version":"0.01", + "version":"0.02", "type": "widget", "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", @@ -5634,7 +5634,7 @@ "shortName":"Lato Pedometer", "icon": "screenshot_widpb.png", "screenshots": [{"url":"screenshot_widpb.png"}], - "version":"0.01", + "version":"0.02", "type": "widget", "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", diff --git a/apps/widpa/ChangeLog b/apps/widpa/ChangeLog index 7b83706bf..5197bb4bd 100644 --- a/apps/widpa/ChangeLog +++ b/apps/widpa/ChangeLog @@ -1 +1,2 @@ 0.01: First release +0.02: Size widget after step count is reset diff --git a/apps/widpa/widpa.wid.js b/apps/widpa/widpa.wid.js index b8c439d2b..1c0f27394 100644 --- a/apps/widpa/widpa.wid.js +++ b/apps/widpa/widpa.wid.js @@ -6,7 +6,7 @@ WIDGETS["widpa"]={area:"tl",width:13,draw:function() { if (!Bangle.isLCDOn()) return; // dont redraw if LCD is off var steps = Bangle.getHealthStatus("day").steps; var w = 1 + (steps.toString().length)*12; - if (w > this.width) {this.width = w; setTimeout(() => Bangle.drawWidgets(),10); return;} + if (w != this.width) {this.width = w; setTimeout(() => Bangle.drawWidgets(),10); return;} g.reset(); g.setColor(g.theme.bg); g.fillRect(this.x, this.y, this.x + this.width, this.y + 23); diff --git a/apps/widpb/ChangeLog b/apps/widpb/ChangeLog index 7b83706bf..1409a81ff 100644 --- a/apps/widpb/ChangeLog +++ b/apps/widpb/ChangeLog @@ -1 +1,2 @@ 0.01: First release +0.02: Fixed widget id to wibpb, Size widget after step count is reset diff --git a/apps/widpb/widpb.wid.js b/apps/widpb/widpb.wid.js index d65d7fe43..6129fac51 100644 --- a/apps/widpb/widpb.wid.js +++ b/apps/widpb/widpb.wid.js @@ -1,13 +1,13 @@ // on.step version Bangle.on('step', function(s) { WIDGETS["bata"].draw(); }); Bangle.on('lcdPower', function(on) { - if (on) WIDGETS["bata"].draw(); + if (on) WIDGETS["widpb"].draw(); }); -WIDGETS["bata"]={area:"tl",width:13,draw:function() { +WIDGETS["widpb"]={area:"tl",width:13,draw:function() { if (!Bangle.isLCDOn()) return; // dont redraw if LCD is off var steps = Bangle.getHealthStatus("day").steps; var w = 1 + (steps.toString().length)*12; - if (w > this.width) {this.width = w; setTimeout(() => Bangle.drawWidgets(),10); return;} + if (w != this.width) {this.width = w; setTimeout(() => Bangle.drawWidgets(),10); return;} g.reset(); g.setColor(g.theme.bg); g.fillRect(this.x, this.y, this.x + this.width, this.y + 23); // erase background From b80909be9b6b9dc5ef039fd46512acfd5e3c44e7 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 13 Jan 2022 19:24:57 +0000 Subject: [PATCH 5/7] Widlock: set sortorder -1 --- apps.json | 3 ++- apps/widlock/ChangeLog | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b837b8f2b..65fe64ed3 100644 --- a/apps.json +++ b/apps.json @@ -942,12 +942,13 @@ { "id": "widlock", "name": "Lock Widget", - "version": "0.03", + "version": "0.04", "description": "On devices with always-on display (Bangle.js 2) this displays lock icon whenever the display is locked", "icon": "widget.png", "type": "widget", "tags": "widget,lock", "supports": ["BANGLEJS","BANGLEJS2"], + "sortorder": -1, "storage": [ {"name":"widlock.wid.js","url":"widget.js"} ] diff --git a/apps/widlock/ChangeLog b/apps/widlock/ChangeLog index 3b1436feb..8aeb75429 100644 --- a/apps/widlock/ChangeLog +++ b/apps/widlock/ChangeLog @@ -1,3 +1,4 @@ 0.01: First commit 0.02: Handle new firmwares with 'lock' event 0.03: Don't try to be fancy - just bail out on firmwares without a lock event +0.04: Set sortorder to -1 so that widget always takes up the furthest left position From db0e55b18e9ca0805d8dfd0e7c7b53babf9ea456 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 14 Jan 2022 09:47:26 +0100 Subject: [PATCH 6/7] Add sit ups Add more feedback to the user about the exercises Clean up code --- apps/banglexercise/ChangeLog | 3 + apps/banglexercise/README.md | 4 +- apps/banglexercise/app.js | 128 ++++++++++++++++++++--------------- 3 files changed, 80 insertions(+), 55 deletions(-) diff --git a/apps/banglexercise/ChangeLog b/apps/banglexercise/ChangeLog index 5560f00bc..5f1d3bd7d 100644 --- a/apps/banglexercise/ChangeLog +++ b/apps/banglexercise/ChangeLog @@ -1 +1,4 @@ 0.01: New App! +0.02: Add sit ups + Add more feedback to the user about the exercises + Clean up code diff --git a/apps/banglexercise/README.md b/apps/banglexercise/README.md index 28b276a59..c9f9ec38a 100644 --- a/apps/banglexercise/README.md +++ b/apps/banglexercise/README.md @@ -2,7 +2,7 @@ Can automatically track exercises while wearing the Bangle.js watch. -Currently only push ups and curls are supported. +Currently only push ups, curls and sit ups are supported. ## Disclaimer @@ -23,7 +23,7 @@ Press stop to end your exercise. ## TODO * Add other exercise types: * Rope jumps - * Sit ups + * Star jumps * ... * Save exercise summaries to file system * Configure daily goal for exercises diff --git a/apps/banglexercise/app.js b/apps/banglexercise/app.js index 0d5c814bf..bc6e35f07 100644 --- a/apps/banglexercise/app.js +++ b/apps/banglexercise/app.js @@ -25,22 +25,32 @@ let exerciseType = { const exerciseTypes = [{ "id": "pushup", "name": "push ups", - "useYaxe": true, - "useZaxe": false, - "thresholdY": 2500, - "thresholdMinTime": 1400, // mininmal time between two push ups in ms + "useYaxis": true, + "useZaxis": false, + "threshold": 2500, + "thresholdMinTime": 800, // mininmal time between two push ups in ms "thresholdMaxTime": 5000, // maximal time between two push ups in ms - "thresholdMinDurationTime": 700, // mininmal duration of half a push ups in ms + "thresholdMinDurationTime": 600, // mininmal duration of half a push up in ms }, { "id": "curl", "name": "curls", - "useYaxe": true, - "useZaxe": false, - "thresholdY": 2500, - "thresholdMinTime": 1000, // mininmal time between two curls in ms + "useYaxis": true, + "useZaxis": false, + "threshold": 2500, + "thresholdMinTime": 800, // mininmal time between two curls in ms "thresholdMaxTime": 5000, // maximal time between two curls in ms - "thresholdMinDurationTime": 500, // mininmal duration of half a push ups in ms + "thresholdMinDurationTime": 500, // mininmal duration of half a curl in ms + }, + { + "id": "situp", + "name": "sit ups", + "useYaxis": false, + "useZaxis": true, + "threshold": 3500, + "thresholdMinTime": 800, // mininmal time between two sit ups in ms + "thresholdMaxTime": 5000, // maximal time between two sit ups in ms + "thresholdMinDurationTime": 500, // mininmal duration of half a sit up in ms } ]; let exerciseCounter = 0; @@ -66,7 +76,7 @@ function showMainMenu() { }; exerciseTypes.forEach(function(et) { - menu["Do " + et.name] = function() { + menu[et.name] = function() { exerciseType = et; E.showMenu(); startTraining(); @@ -81,8 +91,8 @@ function showMainMenu() { value: exerciseCounter + " " + exerciseType.name }; } - menu.Exit = function() { - load(); + menu.exit = function() { + load(); }; E.showMenu(menu); @@ -91,11 +101,11 @@ function showMainMenu() { function accelHandler(accel) { if (!exerciseType) return; const t = Math.round(new Date().getTime()); // time in ms - const y = exerciseType.useYaxe ? accel.y * 8192 : 0; - const z = exerciseType.useZaxe ? accel.z * 8192 : 0; + const y = exerciseType.useYaxis ? accel.y * 8192 : 0; + const z = exerciseType.useZaxis ? accel.z * 8192 : 0; //console.log(t, y, z); - if (exerciseType.useYaxe) { + if (exerciseType.useYaxis) { while (historyY.length > avgSize) historyY.shift(); @@ -109,7 +119,7 @@ function accelHandler(accel) { } } - if (exerciseType.useYaxe) { + if (exerciseType.useZaxis) { while (historyZ.length > avgSize) historyZ.shift(); @@ -124,72 +134,64 @@ function accelHandler(accel) { } // slope for Y - if (exerciseType.useYaxe) { + if (exerciseType.useYaxis) { let l = historyAvgY.length; if (l > 1) { const p1 = historyAvgY[l - 2]; const p2 = historyAvgY[l - 1]; const slopeY = (p2[1] - p1[1]) / (p2[0] / 1000 - p1[0] / 1000); // we use this data for exercises which can be detected by using Y axis data - switch (exerciseType.id) { - case "pushup": - isValidYAxisExercise(slopeY, t); - break; - case "curl": - isValidYAxisExercise(slopeY, t); - break; - } - + isValidExercise(slopeY, t); } } // slope for Z - if (exerciseType.useZaxe) { + if (exerciseType.useZaxis) { l = historyAvgZ.length; if (l > 1) { const p1 = historyAvgZ[l - 2]; const p2 = historyAvgZ[l - 1]; - const slopeZ = (p2[1] - p1[1]) / (p2[0] - p1[0]); - historyAvgZ.shift(); - historySlopeZ.push([p2[0] - p1[0], slopeZ]); - - // TODO: we can use this data for some exercises which can be detected by using Z axis data + const slopeZ = (p2[1] - p1[1]) / (p2[0] / 1000 - p1[0] / 1000); + // we use this data for some exercises which can be detected by using Z axis data + isValidExercise(slopeZ, t); } } } /* - * Check if slope value of Y-axis data looks like an exercise + * Check if slope value of Y-axis or Z-axis data (depending on exercise type) looks like an exercise * - * In detail we look for slop values which are bigger than the configured Y threshold for the current exercise + * In detail we look for slop values which are bigger than the configured threshold for the current exercise type * Then we look for two consecutive slope values of which one is above 0 and the other is below zero. * If we find one pair of these values this could be part of one exercise. * Then we look for a pair of values which cross the zero from the otherwise direction */ -function isValidYAxisExercise(slopeY, t) { +function isValidExercise(slope, t) { if (!exerciseType) return; - const thresholdY = exerciseType.thresholdY; + const threshold = exerciseType.threshold; + const historySlopeValues = exerciseType.useYaxis ? historySlopeY : historySlopeZ; const thresholdMinTime = exerciseType.thresholdMinTime; const thresholdMaxTime = exerciseType.thresholdMaxTime; const thresholdMinDurationTime = exerciseType.thresholdMinDurationTime; const exerciseName = exerciseType.name; - if (Math.abs(slopeY) >= thresholdY) { - historyAvgY.shift(); - historySlopeY.push([t, slopeY]); - //console.log(t, Math.abs(slopeY)); - const lSlopeY = historySlopeY.length; - if (lSlopeY > 1) { - const p1 = historySlopeY[lSlopeY - 1][1]; - const p2 = historySlopeY[lSlopeY - 2][1]; + if (Math.abs(slope) >= threshold) { + historySlopeValues.push([t, slope]); + //console.log(t, Math.abs(slope)); + + const lSlopeHistory = historySlopeValues.length; + if (lSlopeHistory > 1) { + const p1 = historySlopeValues[lSlopeHistory - 1][1]; + const p2 = historySlopeValues[lSlopeHistory - 2][1]; if (p1 > 0 && p2 < 0) { if (lastZeroPassCameFromPositive == false) { lastExerciseHalfCompletionTime = t; - //console.log(t, exerciseName + " half complete..."); + console.log(t, exerciseName + " half complete..."); layout.progress.label = "½"; + layout.recording.label = "TRAINING"; g.clear(); layout.render(); } @@ -201,7 +203,7 @@ function isValidYAxisExercise(slopeY, t) { if (lastZeroPassCameFromPositive == true) { const tDiffLastExercise = t - lastExerciseCompletionTime; const tDiffStart = t - tStart; - //console.log(t, exerciseName + " maybe complete?", Math.round(tDiffLastExercise), Math.round(tDiffStart)); + console.log(t, exerciseName + " maybe complete?", Math.round(tDiffLastExercise), Math.round(tDiffStart)); // check minimal time between exercises: if ((lastExerciseCompletionTime <= 0 && tDiffStart >= thresholdMinTime) || tDiffLastExercise >= thresholdMinTime) { @@ -219,22 +221,36 @@ function isValidYAxisExercise(slopeY, t) { layout.count.label = exerciseCounter; layout.progress.label = ""; + layout.recording.label = "Good!"; + g.clear(); layout.render(); if (settings.buzz) - Bangle.buzz(100, 0.4); + Bangle.buzz(200, 0.5); } else { - //console.log(t, exerciseName + " to quick for duration time threshold!"); + console.log(t, exerciseName + " too quick for duration time threshold!"); // thresholdMinDurationTime lastExerciseCompletionTime = t; + + layout.recording.label = "Go slower!"; + g.clear(); + layout.render(); } } else { - //console.log(t, exerciseName + " to slow for time threshold!"); + console.log(t, exerciseName + " top slow for time threshold!"); // thresholdMaxTime lastExerciseCompletionTime = t; + + layout.recording.label = "Go faster!"; + g.clear(); + layout.render(); } } else { - //console.log(t, exerciseName + " to quick for time threshold!"); + console.log(t, exerciseName + " too quick for time threshold!"); // thresholdMinTime lastExerciseCompletionTime = t; + + layout.recording.label = "Go slower!"; + g.clear(); + layout.render(); } } @@ -267,6 +283,7 @@ function startTraining() { if (recordActive) return; g.clear(1); reset(); + Bangle.setLCDTimeout(0); // force LCD on Bangle.setHRMPower(1, "banglexercise"); if (!hrtValue) hrtValue = "..."; @@ -285,7 +302,7 @@ function startTraining() { type: "txt", id: "count", font: exerciseCounter < 100 ? "6x8:9" : "6x8:8", - label: 10, + label: exerciseCounter, pad: 5 }, { @@ -337,11 +354,16 @@ function startTraining() { layout.render(); Bangle.setPollInterval(80); // 12.5 Hz - Bangle.on('accel', accelHandler); + tStart = new Date().getTime(); recordActive = true; if (settings.buzz) Bangle.buzz(200, 1); + + // delay start a little bit + setTimeout(() => { + Bangle.on('accel', accelHandler); + }, 1000); } function stopTraining() { From ef1292322ba772bb3753da4086cdd0d6db331da5 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 14 Jan 2022 09:49:35 +0100 Subject: [PATCH 7/7] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index f28766ab5..28e2b73ef 100644 --- a/apps.json +++ b/apps.json @@ -5594,7 +5594,7 @@ { "id": "banglexercise", "name": "BanglExercise", "shortName":"BanglExercise", - "version":"0.01", + "version":"0.02", "description": "Can automatically track exercises while wearing the Bangle.js watch.", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}],