From 785ce647793568fd9d1ee038303a3e552235a801 Mon Sep 17 00:00:00 2001 From: Noah Howard <3317164+nh-99@users.noreply.github.com> Date: Fri, 18 Mar 2022 18:35:44 -0400 Subject: [PATCH] Add disc golf score tracking app --- apps/discgolf/ChangeLog | 1 + apps/discgolf/README.md | 14 +++ apps/discgolf/app-icon.js | 1 + apps/discgolf/app.js | 171 +++++++++++++++++++++++++++++++ apps/discgolf/app.png | Bin 0 -> 10687 bytes apps/discgolf/metadata.json | 14 +++ apps/discgolf/summary_screen.png | Bin 0 -> 3025 bytes apps/discgolf/throw_screen.png | Bin 0 -> 2459 bytes 8 files changed, 201 insertions(+) create mode 100644 apps/discgolf/ChangeLog create mode 100644 apps/discgolf/README.md create mode 100644 apps/discgolf/app-icon.js create mode 100644 apps/discgolf/app.js create mode 100644 apps/discgolf/app.png create mode 100644 apps/discgolf/metadata.json create mode 100644 apps/discgolf/summary_screen.png create mode 100644 apps/discgolf/throw_screen.png diff --git a/apps/discgolf/ChangeLog b/apps/discgolf/ChangeLog new file mode 100644 index 000000000..220e1d1c2 --- /dev/null +++ b/apps/discgolf/ChangeLog @@ -0,0 +1 @@ +0.01: Initial version of disc golf app. Has throw and hole counter, along with summary screen. Uses buttons for holes & throws. \ No newline at end of file diff --git a/apps/discgolf/README.md b/apps/discgolf/README.md new file mode 100644 index 000000000..34a9dfe90 --- /dev/null +++ b/apps/discgolf/README.md @@ -0,0 +1,14 @@ +# Disc Golf + +Individual score tracking for disc golf on your wrist. + +![](throw_screen.png) +![](summary_screen.png) + +## Usage + +Press the side button once to increment throws. Double-tap the side button to increment holes. View your game summary with the button in the upper right of the screen. + +## Creator + +Made by [Noah Howard](https://github.com/nh-99) diff --git a/apps/discgolf/app-icon.js b/apps/discgolf/app-icon.js new file mode 100644 index 000000000..cfc07a2fa --- /dev/null +++ b/apps/discgolf/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/ABFzudsAAImmABIppAAIQBFcYMBzwMDFbP+y5RJHYiHdLJYADG5AATzxaNFotszwuXFp5sFLq4tIVpANNF0D4FRqobFJ5peaFxKtJXgi9VzxdSLwwvUFyYvaFxIhKOYwvSFxoAEzyjJF7I/VFyzRjU5QICuYiNBxBJTQp7lFF7byQGQYwSOwovSOpJsFdpwvTao4voMQ4vQOQQwmX4oQCBAwwgCxAvWDIwvPGD4vIy4WJSSzcFMCCpGMC+eGChiUYJwjJPIRiTF5xULBxwvVEJgQQCIQOEF5X+zwfLSoY0HBYg9FF5a2QDSQvNWqJbBAQTaOMTY9PF6DFNAB4uRGLguUYygucfKwubGQgzLFsAAHFYV6Fc4A/AAw=")) \ No newline at end of file diff --git a/apps/discgolf/app.js b/apps/discgolf/app.js new file mode 100644 index 000000000..68bbd817d --- /dev/null +++ b/apps/discgolf/app.js @@ -0,0 +1,171 @@ +Bangle.loadWidgets(); + +// +// App imports +// +var Layout = require("Layout"); + +// +// App variables +// +var holeCount = 1; +var throwCount = 0; +var drawTimeout; +var currentScreen = 'throw'; +var redraw = true; +var update = true; +var holeSummary = { + "< Back" : () => { update = true; redraw = true; currentScreen = 'throw'; E.showMenu(); createThrowLayout(); }, + "Hole #1": { value: 0 }, + "Hole #2": { value: 0 }, + "Hole #3": { value: 0 }, + "Hole #4": { value: 0 }, + "Hole #5": { value: 0 }, + "Hole #6": { value: 0 }, + "Hole #7": { value: 0 }, + "Hole #8": { value: 0 }, + "Hole #9": { value: 0 }, + "Front": { value: 0 }, + "Hole #10": { value: 0 }, + "Hole #11": { value: 0 }, + "Hole #12": { value: 0 }, + "Hole #13": { value: 0 }, + "Hole #14": { value: 0 }, + "Hole #15": { value: 0 }, + "Hole #16": { value: 0 }, + "Hole #17": { value: 0 }, + "Hole #18": { value: 0 }, + "Back": { value: 0 }, +}; + +// Images +function getBackImage() { + return atob("FhYBAAAAEAAAwAAHAAA//wH//wf//g///BwB+DAB4EAHwAAPAAA8AADwAAPAAB4AAHgAB+AH/wA/+AD/wAH8AA=="); +} +function getMenuImage() { + return { + width : 20, height : 20, bpp : 1, + buffer : require("heatshrink").decompress(atob("AAk///D//8CBcDBwITB4AiVA")) + }; +} +function getBasketIcon() { + return { + width : 20, height : 20, bpp : 1, + buffer : require("heatshrink").decompress(atob("gFggF/8EH/0AiWAgtogEW0EDt0Am3ggfsgEf4EB/EA//4j//wEChEP/8AgwnDAgw")) + }; +} +function getFrisbeeIcon() { + return { + width : 20, height : 20, bpp : 1, + buffer : require("heatshrink").decompress(atob("AAf+gF/wE+uEPx0B+PAn0cgf/4F3/0G/1g9/7g1/7AJB4+f/k+v3B/Hcg4WBj/4E4ItC")) + }; +} + +var throwLayout; + +function createThrowLayout() { + throwLayout = new Layout( { + type:"v", c: [ + // Title & menu button + { + type:"h", fillx:1, valign:-1, bgCol:g.theme.bg2, col: g.theme.fg2, c: [ + {type:"img", src:getBasketIcon()}, + {type:"txt", pad:4, font:"15%", label:holeCount, id: "holeCount"}, + {type:"txt", pad:4, font:"15%", label: '', fillx:1}, + {type:"btn", src:getMenuImage(), halign:1, cb: l=>{ currentScreen = 'summary'; update = true; redraw = true; }} + ] + }, + // Throw count + { + type:"h", filly:1, c: [ + {type:"img", pad:4, src:getFrisbeeIcon() }, + {type:"txt", fillx:1, font:"6x8:2", label:"Throws: "+throwCount, id:"throwCount"} + ] + } + ] + }, {lazy:true}); +} + +function incrementHole() { + if (holeCount > 18) return; + resetThrow(); + holeCount += 1; + holeSummary["Hole #" + holeCount] = {value: 0}; +} +function incrementThrow() { + throwCount += 1; + holeSummary["Hole #" + holeCount] = {value: throwCount}; +} +function decrementThrow() { + throwCount -= 1; + holeSummary["Hole #" + holeCount] = {value: throwCount}; +} +function resetThrow() { + throwCount = 0; +} +function computeFrontScore() { + var scoreSum = 0; + for (var i = 1; i < 10; i++) { + scoreSum += holeSummary["Hole #" + i].value; + } + holeSummary.Front = {value: scoreSum}; +} +function computeBackScore() { + var scoreSum = 0; + for (var i = 1; i < 19; i++) { + scoreSum += holeSummary["Hole #" + i].value; + } + holeSummary.Back = {value: scoreSum}; +} + +// update the app state/variables +function updateApp() { + throwLayout.holeCount.label = holeCount; + throwLayout.throwCount.label = "Throws: " + throwCount; +} + +// update the screen +function draw() { + updateApp(); + if (redraw) { + throwLayout.forgetLazyState(); + redraw = false; + } + if (update) { + if (currentScreen == 'throw') { + throwLayout.render(); + } else if (currentScreen == 'summary') { + E.showMenu(holeSummary); + } + update = false; + } + // schedule a draw for the next 500ms + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 500 - (Date.now() % 500)); +} + +// +// button press events +// +setWatch((p) => { + if (p.time - p.lastTime < 0.2) { + decrementThrow(); + incrementHole(); + } else { + incrementThrow(); + } + computeFrontScore(); + computeBackScore(); + update = true; +}, BTN, {edge:"rising", debounce:50, repeat:true}); + +// +// main app function start +// +g.clear(); +Bangle.drawWidgets(); +createThrowLayout(); +draw(); \ No newline at end of file diff --git a/apps/discgolf/app.png b/apps/discgolf/app.png new file mode 100644 index 0000000000000000000000000000000000000000..6aba5e54816571474aae74f0db98b39a7db7933a GIT binary patch literal 10687 zcmZ8{WmMc;w07{pp}1R-;_ei8Dee@fcyV`^;_mM5P>Q=laVrB9cPkFxy!Xeq?z&kk z$&Z=r>~nJR$li%mR+2_VB18fJ0995-LKSjm{ci`sLylU|kKvFLqJxZ%GXOAC{kKDT zlnA>407jIogs8e@;F+$cOR`4lyRY7vylRS&8Tu+Y1sg^yg^4~!i;5t5IgH(U><(+d zZ@K6gQ+#jTvxc~ph?q6}dPmEwp$I4uG1F>-4?Siw>z-0(#U8W6w!h^%F=j z*mxDz#@Dx0My9c|fh|MG-989c=IFCS0M_0$thJHI*3us(sCXzq67&%mBUZAT&7!G!lRw08PGV>1DpXJz`bST<`^(#A;}$g%25T>5m{FCep;%e(5l} zvrFO8K8k>4{P~caX^#d&1g6|)JHlo4_I28Ofee2nUY3tyO2IY?vr2CC`8qf2jCaY1idc~=+xp{u!Pi#h%Oi-7jbp?qCc2h~3eSR<0wr7B4?9*& z@eGo^UDdz`B&6rjlUyR={K# zn?Z>I4+Q)A8#_bylGu3e{Dedl+BKJaIY#RA4k{|FZm!$ww0RrWq{NIrfH3_5G^6W6 z$%~KJczXIdIr%!ckO8ko;|6M0TyB;s##b#C>6)kmAqNE!(ZRhptUi~b6>TMZ=CYUD z2|@D!BVZ=7Cq5E4)5M?C-q%#7LXL_&P!NjzzT$HU zp4bLG+*z9Ek%;UpRB)lIYiwewsecTqSgdz<>0Mq9pA09HI%R4j=jOmlsHnK~xm&~? zi*Wq~xHvlEwS4+CH9f6_ksE$^2OR{2_W|F(v+Q@j@zbyvqUq@oiHvHb8U-?RGa^C% z^%COEK?_e~@-8YUG|^bGq#;yd*HIh}Lsc8NzH!`H)an~E%O^%dadV^OU_p;eq77E7 zn05U-Iv7}5n(-S`_yBlF8E;kVbQf>duGRVa*K_pF%VX2N-q8_EhlEl0ml_waOoanM z(WZ%$;)IUV=IJ|I984QZQW_ODAlZ`zY_!;Hk@0%te%tawmZheKpsv{3BHRU-+#?Qw zq@{)R?zXqybmSGgw&f#gfK17B?UE+Q6qeD-9-b;mloU6tyH7M-R~O7g2Z$kL^xlvc zf?TcXr@QXIik>}Re2>DH_CN{*ilJP(p3n1MxYx5JYV6NjwWoiUDe#?NdBpxk8uHW; zgU+_#Fi}-C(yHP>0cn04h(I8}d2aD++l244hQpMedBO(7RLHSI)BD8^@4O;7NdT}T zZ+=9S*f&Mg*gAtwL%yieux8ASWVrnJF)$n9C(QT(vvH101<&D&ZoOeBqyGL(0+kna z^$IkP(l772rOR1T6Z?X|u!Vfq-HItN0qyr*4%Ctt0I8u{WoNP20*22D_5EbBlGTq~__H|gH|BBE66P-I*HhB|ohz!jxSy=Fw||;0 zEftG3w%-%V1%1JwV@S!}DOT+;YTAp16~%BE>gaScAD+r^o?BhyI`6|lGKne`1tDsa zQ_>=&og61mJ^xDyyMA#%t+=`Nqnet2%UL%IYAJxanlJ4mBaqEoZ4f8pa`Pr6C-)zQG?_#Z6)#Ab)KUs_ zohH0`aZ0PglHX0rbZDO%o6slJRKZQFMnbOEK@u2C7)eKLe=MRwh@_NcfKu7Xuh*NI zBy~d6Uz#T|P?qmcC-no=)LoPmzcJiM1N{E{Lj6R<^Y(3X#@{clt-^{7K_(-ASd75j zBMtj^H7FoKPAG9@g-W965rc4QWUWGtP1^v~U3>r;$*2o_Whq8Z2fzRpH3rXM;n!{S zympi@$BA$oK%G(dcCw_)dyDw|GqfU>jw~WxLW(4MYRaRa5^eg)(uDE`tded@W!~?j z@l&)Be;FDDharU=IaEz`TioYotuPS}sCq)hnZla(+a0*e<9k;{+&TwEr} zGF&C1t{XBkpm*=fw#qMiagZATk8rB-<<&=yPxqJUPVHbMT4&-*L4yWQE>s8Wia*MB%BJ}>hH`){Z6EWTF; zIyyhYF-Fzt>pzVB7X^>Nip=xv3OM~X{VTi28b{sv;PcsV%ia4FPyn!gy$D|DaIV?J z!C9R~#A>Cf)xFCPG8Vxq{PX^>`z_XPExA}m1{i1zv<{57NrwkCtL*SS-^PHI={y#` zpDsrz{z}trYk&U=ze`-BW5V=)V=s|I3FDtxZJIxPdHJ${jLUccB>}b8*Vu?Pg@8UT z(Lr2o#z~6^@3`=TVDYnll`&GUk@?FJ7BamvsZ-jhb{1BBrJc73i4Zoey$`Y<*sy|KurqkmKWpe7v<=ZylRz zG;((ON(n+iWwzgXbCcFckxP~Vx31QjL}5Vp?TT)7IB(}E<=Gb^Lh&ro5Kei@N=Zdh zGE{Bp7`~U6b^9U1S^CSheSnI$ns2UOJv|+Yw#T64f=X|+UH$%jv-_1=T7F`&1)Bmk zby%vrvGH=K(Hz~s$N9kjgw1OhF%^~h>~uAbAv)^wzq^0^25L=x0+1%8hf94P?# zTdaWn8A7Fjq3>b|Mu-PG(4i@i{`_xUC7B#!?tsWE7alq$sI3YaORMe=PENuV?K6J# zJfJONEbMk#w=d-VcHE@RYjOP-XQNm)GDxf;r}U`cdV55^Lci0bT&RTCa`$ zdG*_tqpOQPln^Ws*ipvKg!+rz$X|ABYfULvzk1}sw*eHOR)v~)d&^U>-18|iI=Hh8 zp?(#~n3LJDt@V!-3>-FvLb+24C79mjQUf60=6zT=t}M^sz%%Q<3Onl`Pw_tzcKVwq zzM6-SKX>F;Bdhe*1@1}|tA!T8yQ^iczHuw zES8-TT3l3~FslP8DiVpA3jpmvF*aV^7rmdiTo+*Q3cy=|4KYWmU8LJ%V-Nd7czM;{ zcZ=>;z_lYIlzxS)B>=71*2up}q2u+0_c`u>wMd=6OOqjy$2Op#89R1ZYH%_e@#(zN zxTZY7l2c4<9{u^}&!tP!85g&Zy&RxXtIm(ocPPrvKG@g?u}5{SUdAsK7x_))amZu8!PbVKwR5}Q@ev$$iTpItqGxYd|YD*;v^0*B~y@g zM}{qp@L>t@2m=E(%YC+4TfJ35KbUu&ono1*s~Gmhu};Wi@;=fbg&|JN^{ixyfou|(e?esf@4F9if(_c@XQk|>WF9eGnaRFiZoyAmM-qYb;k>Sj^X*t)H8l0 zRE%R}YoLFGyp-$$IXJ2@@YAi_0p`*;Z>0c=I5Z&M$IPD-U#{*ZV~((ARe>;ogk;3$ z#yGyRl8%W>np>F3PF?#r|Am$n7kPvOB{EOAXJ&bAjfO6zCP}lJ_r#h1Y^-eq`sPp9 zB^nBBKrDxD!Q1;5{kzco!?QMS{?TedMiSmbYr#ka|eCj;MXw z=;&piv9Z-Lp@fc}p?Y5*8zLlg3sy$P0hBA&41m9^Y(-GLZw%%gobIP^}5d~Weww#I_mi)`1c!n@4|)7{?Y zp=vaHt{C{5{sAf)+x61{eHrUb6)iekh5XoZQ-q_&yM(O$pzN+iaR3jx3(z?R!qr`70*_&sX zpZDf&RcyX<OTOlJs2JQ31^s;l(&isJOR~IP|G!XG}x;j&2)jYTf18+O`FPP)s zMI2)4#H%DR8WO&%xb65v=ca(0ZEF08sflqM-7!uxCk52anoH|u=Qk6(c?nSfFs7!x zk1n12@P4?;A-9emh79Z66-%0f%2l{eNH}`pdcw`w8kx!;go_O8qUp-D|2&!5VyW_7 zXlK3C&C}>?LP7)p8vI^XIR2Z`?cFBDEOgJQ>HEa6P9`D3#NxaC^AW6y_6JR=djkNtCOvUxL@iX@_1e!3XJpAx@Bue}GKL}0d` zt#LbI*hGflKyrVJBq!qJ`j;Ujz@p83kJoB-gX@CF6%K*3?cZxHH@8vABFCUi6@6Pn zLveBAZl6_^O(99)I5Bq&KqQ^#`;+9nW#rlekagjrf2vN@Wl{5Qv6Ii3a=m!QO%!-c(W zBRG~2@hC^|5(F?Yw~y^pSJqN7@S{Hk1Aqi1!S|35SZixy`V=&V3ciq}suJH=SE=EZ z8{wCFm3NG*qS*Ya)0xJ^r00rGo_wiO{f%rMCdl~4-=0pYK+@7N)NyGCe?xj7t{n3R zW_peXBdxsQ(F9FwlbBtD5_a_AZv0$ax)646QPHMrSUGHxqsL?LLm*Qqn#C-0+2Oo? zW|MmF)Y3fF(C++gsqd4T32GFE=`q@R!>SnZD}}pOt@`uqZ{KG(dU;cHXytjhj=K@E zTvV>?db@ScvKqY}D3UjHMm4prB0)iBLTrk#1x(H^4F>(001G_4^{Wpbj(zhl^;%CG zR>mud=~PTnp#hLEBO|@V)9nx{*R5d(`;h7TTb)R_f?ZO^s$F>8%qJMr!4UqSR#)eN z&QfA0jOos1~{v&7C)h{VxO573tL%LnMr71CQLkMyN!}!#qvL&IthCe@8tEp;v4y+zd9m8ie0{T7J1- zVCPH3&_*bFc9=`t?0+M)Zr(XtuZT+1w?n-!VMjE)SE-$bk4+2E~*sosu4rg#!FPns?q{aPqHOCK~Ca?bc*ALb1BD2BYU!lT& zEHoH`Bz5T$WpLIEv|TcC#~zzA7jPCJ_Gf#1!x`-KD3=VIU6%}4j@zXX>LL`Ty`b-GPK%Pn{W zuI&G9=T-+rl#Kit%=!Ge>~bS*B|qOTJKJn>wP}oZ42Lagg6nM++55>Q;qeE-J3wvy zOT zj5;<98+JqGm2DN_22bY`oL$r1AFo+{5;ik1+D^#JI4o|cx;N_ze(-pxpGF7pg8-l( z71Um9H8NCKSxI5u;T0fo0mcA;@X7dnOzm z`z_bJ=GbsMSLCpqBT&H%Y9+^YKSxn^ZyFkm{3bGz*J5C7yxw+nf<;2>8> z0CQptH)pBJ?-49YR!vL<^!wda2A3KO1!TgwVf*W}i$M~Ug>o-txLCA>Z?s626TY&HLyAreW74wx>*5B;* z4SmC0lq_QoPmI`~B5Md06X^BKN=`2#!nmh(P3%+G%~Usy2eGi zPC^{JdgOSimJupBtr|HvbvbK2YZI;D;n;wu31tMBB&F<;Lb%Yv;MWQ`pzCI~KtrB^ zUaHxk(~U}b6GOqc*|tLK5xFV~$wEaF7rBb}_Rr1YF1U}Jyyv6<7Q$!eD-DkRF@!C0 zYP)m7uP#)OVdjpQBY0L>{KH z27nM!GGUYd0MK>FRy~6R3yb7GA>vD))jK56I~@D7Y1|w>+1StX<-z5Z>WKyZZ2a~5 z_Q*ly`QM|FSs{1Y7<6J7dQah*j{i-a!8-PT7o!rDR;x`7afqlDKkZ7(`wCC^y?0Y< zI^zGD5)@>);E+`elwP=WVBLG4dFmvFnU(t? z9YkXoS9CjhIa^fLDNm=P4>Zyv#*~LUr?yKg&73T(-HbJ`#t`=UPd|9WKrdN67a*>; z=H#&?J$jP}@#`&=P9a*Z>0}AymvZ7W|7v%&Va0W0#dLAz;gLPb6$*vf-IX>rMyG|) z^duJ6>wj``-q<*)`89ueGUIVOG<5#IgdWq`@CuF)v-F0| z1qFzb7TvuRtINe1F=lVrIXbE1i0)xIiXQsl0PxGdb$6&OpQ0PI`*7)47a83izu>c* zgYm*7P*?*25vqNr#sUTBVegU?4F@fRZ>kDT_*ro{MPkaG)l|KNv$;|4=}YnZAZj4V zQ$i{X6$y2*igYX`hUhg{N-C_uCe{<4mBi5*3V6zf@X$!H>|O3dRM0y5K>qhC{c$F@W9#|l#@UE?es`@mg%w{THz8pgCXI2fb9Q=<%wMAM-x;#; z!2!bzibOqPoI^X1Sw;OSSw{PN&j}XBf0)6Nx+5|&rvnOVx!@{-5D3tdED|k4C0dHp z?);ZZ5k^WPu1l)^#&r^}eZ^nw4Pa#0r))X9I-43%|Z_7VgS z(2b9q5ZGn!jBBX z-evRO*@>fGoUYC@d0*`q1Q@);h|dCC0$H z#!{n)*DK&?!XG{2tjTwY-8bHy>Hq}{+S~I{QBe(SNX0HZyyj+qwtLUFxJK+_jUA@4 zq{dWIinPU+1UW|tZO{{DJnLHxgG_HH-0M z0}_+|$R%T8{-)vnpw2ZNQ*e=g#71+v`1FOTLSd_xG#K)~pq?oqp| z9ibu~`(I&YP1y`u+MaP_-uq=GcOQiO|42SPwZJ5&>T*nsS7&k6)0JnBC2Q*HrTx}z zrfWR^z31s|xaCbEC`498)G#}^g+Fi0C*kRF+Bi0OTIvxE-YXki<2UWl-WX68C`QyB zJm5IAuxRXoNAIp!$(W*`#&`kK8zw(L6hAR)*SGa#R+ySn-E8o6R>`NG8~N*shJ(+V zHrAhA4hOat=Hx0_CT<0ZRo_M2AaBt;m_+T{6Zzr2^P#oph>_SrMmVE7bKYOh1f4LbYxU!SN2 z&k~?i+{F2&{D82}C0mg0A~rs`lgs3Q>Ld`O zFe?|2!=UtKYU<47vuW7$2!%2}>fvN&s8agx@}I;lDx~OcmXHUO`stI}Xl%Hc_s7>~ zGDDyHbA{?NZfj8n%&SKfS*wb>xvSk>1s8*eia@3DF~=rn#{?6*m5;DB~A|*sNheFoeh&(4Y!X_3Wo2>&dT0+Z<da6Y6W z^75wxqNjfmr|XAlO6ok&_?>U`{3jD>1afK6=-r$r5GTe71Iw_IaGO6gh={O^jyZPm z`oDesH<5;#J0=#0-p_6KW}u>d7~PgfLt#lRMjH1CGrGpK=gGQ9Lw60fao376zhATF zPxwa9MfBd4-La)=kY?cqlk@ROUEA1nc1C{tBn8_?H8>ncUdwioS))5@Mytf2+9?QP zA6#6+>|^W%n}dMLmhf&18yJ2uEEeIX$z(kAxwQPAV+<>XIF+6O7vvZWL|?@kWT zP>`Z13bP83s1J1`9(>@}S3BtK7b`=9gx^4F*xuXmBwAEZOpvCA8pL$!aeZh0s5=QH z=X0s1XIlIFEmj&5AR>wfesB}dXLUOb1-G}Cn8Ax8>dH&_e5Mj+n0Q@#x+ALotbw%` zPmq)lfVAGqgz_VfEOdxQOS}NKhBhvigvj9;0_U0$S>kSj9|J1Y>4(e-^~mT%i6S6x zSFA_|;#c1noEQ6*H1K4OOe;`Zh$1|;xg826heAPFw=!GtVrqgH? zGPaJkt(A`b*~QEm-iOAzB1px~6wkp9k~$)~iOGuxk3Gs`eD3+D-79^&@p1K;>3yR^ zB#mwiJ)M-Sjt=t{GETZNo8QIr#KJvkF%-x=u+)}R2L@7McSNK!cZy1}C(j2n0%`jP zZSUI3v#md?Cv`PdO^`nzMr&#e<&T-U#7{t3a>jGuYd9ezBTlXTOrHDIQLmH59qN`N zfXwgVS<>q0w(tD%@-^|b>oVvAXQ-^PlYk~&CUnk7*)GJ`9b9pga%ap*VQ9I=Odx5CWdAzSxxa(X z%SuZr+w|(^vH&3)(UnlCdvonuAvC08?}2Ndc65OX=_1Rl^?lZ6S%(n^9SHO;)fxJ4 zx-R#T7zTx%;rwi{($N$b7hkS5P<#%$+s|!`LwWj(>!tso0ZPct{i>}!nk;Pt%4`t} zm=<~afzKvp8P(AOBOo-6fQ9XXM$t@PLd10-P)i9*-HDssU|wt zd@G~AkgVpa&9_V%Qt35{{IX4W=)i@A1)eRRBs8`sGYtVEua%X)7tiuHEl5jhIwb_n zx_rm43Vgd`Py9nI*?jyn=}0r8DZ(iXZ)Ky8^h$#2h5Q-u&!H&czPsC_d3kyHPs`ek zI_oKjBrd6B=jo-0(rNCDITRaB>m{x3CQ?$vKV47a&7b62TG8e?DFSn;{U@{elA_@^+-qp_=;Z2A{2myYm=qNiOTOAjV+9>|lao!&38;+^2s$F6Lf}-r%CZl?kvC&ZK7(Gp zS@8uOz(92L$Tm7FpEbBQa3YN*ylYPddp5vau>@U;bRcORyoaAA{%9ny$|t8`Y`k4> zJP_iGaU?Pztx%BF;BXV?|FSzAL!{%sSQH=2z<;Elze{L9!*E;0EWYqsTBp}yjloDhQrx>+P-gfQ_H8K z5U__3rk69N8~;H`oKt~k8rks4oT+Y}r21KIvQVzl(a{l%fZlyQ&hUJDl$4kVJylVs ztELo<12z_Y;s=cc!XW%RUApw@ zmw>e}$2S*=isaLnwe%e&-``$2*x7&o&z6{!#L^B9s)abi^9=(2Hr2}R?zhPd4lXV( z4Gl0$I%bj> tuXXRyfkPi%pl>&ro__55??zC?^6vbfgC)v4x)kpe;Hj*i^S^Q9{{eOLib4PY literal 0 HcmV?d00001 diff --git a/apps/discgolf/metadata.json b/apps/discgolf/metadata.json new file mode 100644 index 000000000..6d56f05e4 --- /dev/null +++ b/apps/discgolf/metadata.json @@ -0,0 +1,14 @@ +{ "id": "discgolf", + "name": "Disc Golf", + "shortName":"Disc Golf", + "version":"0.01", + "description": "A personal disc golf score tracker", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"discgolf.app.js","url":"app.js"}, + {"name":"discgolf.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/discgolf/summary_screen.png b/apps/discgolf/summary_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..480d36eddfa8646b874e96458520979ac2de4ad6 GIT binary patch literal 3025 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 literal 0 HcmV?d00001