From a0040525d83cb6a80cc298e417dd13420f2a828f Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 19:34:46 +0100 Subject: [PATCH 01/54] Gallifreyan Wrist Watch --- apps/gallifrey/app.js | 200 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 apps/gallifrey/app.js diff --git a/apps/gallifrey/app.js b/apps/gallifrey/app.js new file mode 100644 index 000000000..ebac920f6 --- /dev/null +++ b/apps/gallifrey/app.js @@ -0,0 +1,200 @@ +const locale = require('locale'); +const widgetHeight=24; +let timer = null; +let currentDate = new Date(); +const centerX = Math.round(g.getWidth() / 2); +const centerY = widgetHeight + Math.round((g.getHeight()-widgetHeight) / 2); +const radius = Math.round(Math.min(g.getWidth()/2,(g.getHeight()-widgetHeight) / 2)); +const cirRad = 2*Math.PI; +const proportion = 0.3; // relative size of hour hand +const thickness = 4; // thickness of decorative lines + +const drawSegment = (params) => { + angle1 = params.start/360*cirRad; + angle2 = (params.start + params.arc)/360*cirRad; + segRadius = Math.round(params.radius*radius); + x = centerX + (params.x * radius); + y = centerY - (params.y *radius); + g.setColor(0,0,0); + incr = cirRad/60; + for (i = angle1; i < angle2; i=i+incr) { + brush = thickness * (angle2-angle1) /angle2; + points = [ + x + Math.sin(i) * (segRadius+brush), + y - Math.cos(i) * (segRadius+brush), + x + Math.sin(i+incr) * (segRadius+brush), + y - Math.cos(i+incr) * (segRadius+brush), + x + Math.sin(i+incr) * (segRadius-brush), + y - Math.cos(i+incr) * (segRadius-brush), + x + Math.sin(i) * (segRadius-brush), + y - Math.cos(i) * (segRadius-brush) + ]; + g.fillPoly(points); + } +}; + +const drawThickLine = (params) => { + g.setColor(0,0,0); + from = { + x: centerX + (params.fromX * radius), + y: centerY - (params.fromY * radius) + }; + to = { + x: centerX + (params.toX * radius), + y: centerY - (params.toY * radius) + }; + vec = {}; + vec.x = to.x - from.x; + vec.y = to.y - from.y; + pVec = {}; + pVec.x = vec.y; + pVec.y = -vec.x; + length = Math.sqrt(pVec.x * pVec.x + pVec.y * pVec.y); + nVec = {}; + nVec.x = pVec.x / length; + nVec.y = pVec.y / length; + array = [ + from.x + nVec.x * thickness, + from.y + nVec.y * thickness, + from.x - nVec.x * thickness, + from.y - nVec.y * thickness, + to.x + nVec.x * thickness, + to.y + nVec.y * thickness, + to.x - nVec.x * thickness, + to.y - nVec.y * thickness + ]; + g.fillPoly(array); +}; + + + +const drawHands = () => { + drawMinuteHand(); + drawHourHand(); + drawDecoration(); +}; + +const drawDecoration = () => { + params = { + start: 210, + arc: 295, + radius: 0.7, + x: 0, + y: 0 + }; + drawSegment(params); + params = { + start: 290, + arc: 135, + radius: 0.4, + x: 0, + y: -0.7 + }; + drawSegment(params); + params = { + start: 0, + arc: 360, + radius: 0.4, + x: 0, + y: 0.3 + }; + drawSegment(params); + params = { + start: 0, + arc: 360, + radius: 0.15, + x: 0, + y: 0.3 + }; + drawSegment(params); + params = { + start: 0, + arc: 360, + radius: 0.15, + x: 0.7, + y: 0 + }; + drawSegment(params); + params = { + fromX: 0.4, + fromY: 0.2, + toX: 0.6, + toY: 0.1 + }; + drawThickLine(params); + params = { + fromX: -0.2, + fromY: -0.05, + toX: -0.7, + toY: -0.7 + }; + drawThickLine(params); + params = { + fromX: -0.3, + fromY: 0.05, + toX: -0.95, + toY: -0.3 + }; + drawThickLine(params); +}; + +const drawMinuteHand = () => { + angle = currentDate.getMinutes()/60 * cirRad; + //angle = currentDate.getSeconds()/60 * cirRad; + g.setColor(0,1,0); + var points = [centerX,centerY]; + for (i = 0; i < angle; i=i+cirRad/60) { + points.push(Math.round(centerX + Math.sin(i) * radius), + Math.round(centerY - Math.cos(i) * radius)); + } + g.fillPoly(points); +}; + +const drawHourHand = () => { + g.setColor(0,0,0); + //angle = currentDate.getMinutes()/60 * cirRad; + angle = currentDate.getHours()/12 * cirRad; + g.fillCircle( + Math.round(centerX + Math.sin(angle) * radius * (1-proportion)), + Math.round(centerY - Math.cos(angle) * radius * (1-proportion)), + radius * proportion + ); +}; + +const drawClockFace = () => { + g.setColor(0.1,0.7,0); + g.fillCircle(centerX,centerY,radius*0.98); + }; + +const drawAll = () => { + currentDate = new Date(); + g.clear(); + Bangle.drawWidgets(); + drawClockFace(); + drawHands(); +}; + + +const startTimers = () => { + //timer = setInterval(drawAll, 1000); + timer = setInterval(drawAll, 1000*20); +}; + +Bangle.on('lcdPower', (on) => { + if (on) { + startTimers(); + drawAll(); + } else { + if (timer) { + clearInterval(timer); + } + } +}); + +g.clear(); +startTimers(); +Bangle.loadWidgets(); +drawAll(); + +// Show launcher when middle button pressed +setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" }); From 61af541b175dc19a04455a07f99f2d020967f48d Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 20:24:04 +0100 Subject: [PATCH 02/54] Create app-icon.js --- apps/gallifrey/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/gallifrey/app-icon.js diff --git a/apps/gallifrey/app-icon.js b/apps/gallifrey/app-icon.js new file mode 100644 index 000000000..2b98479b1 --- /dev/null +++ b/apps/gallifrey/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("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")) From abf7af209edb6a108061ff44d1fee0cb3b842928 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 20:29:42 +0100 Subject: [PATCH 03/54] Update apps.json --- apps.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index a8fe0a2ab..118bc7ece 100644 --- a/apps.json +++ b/apps.json @@ -1675,5 +1675,17 @@ {"name":"findphone.app.js","url":"app.js"}, {"name":"findphone.img","url":"app-icon.js","evaluate":true} ] - } + }, +{ "id": "gallifrey", + "name": "Gallifreyan Chronometer", + "shortName":"Gallifrey Clock", + "icon": "app.png", + "version":"0.01", + "description": "A Gallifreyan clock. The dark and light green segments show the minutes, the black circle, the hour.", + "tags": "", + "storage": [ + {"name":"gallifrey.app.js","url":"app.js"}, + {"name":"gallirey.img","url":"app-icon.js","evaluate":true} + ] +} ] From b25ab0af35146937529603991a7a6a37a9620c2b Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 20:42:53 +0100 Subject: [PATCH 04/54] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 118bc7ece..6897fafe1 100644 --- a/apps.json +++ b/apps.json @@ -1682,7 +1682,8 @@ "icon": "app.png", "version":"0.01", "description": "A Gallifreyan clock. The dark and light green segments show the minutes, the black circle, the hour.", - "tags": "", + "tags": "clock", + "type": "clock", "storage": [ {"name":"gallifrey.app.js","url":"app.js"}, {"name":"gallirey.img","url":"app-icon.js","evaluate":true} From 840dc58ae65d26be6ec6f8d04e4cadee2def392a Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 20:50:23 +0100 Subject: [PATCH 05/54] Add files via upload --- apps/gallifrey/gallifrey.png | Bin 0 -> 4273 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/gallifrey/gallifrey.png diff --git a/apps/gallifrey/gallifrey.png b/apps/gallifrey/gallifrey.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb6485a6a8c3f13dd0d46b8c393552652696836 GIT binary patch literal 4273 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 Date: Sun, 10 May 2020 20:56:18 +0100 Subject: [PATCH 06/54] Delete gallifrey.png --- apps/gallifrey/gallifrey.png | Bin 4273 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/gallifrey/gallifrey.png diff --git a/apps/gallifrey/gallifrey.png b/apps/gallifrey/gallifrey.png deleted file mode 100644 index 7fb6485a6a8c3f13dd0d46b8c393552652696836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4273 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 Date: Sun, 10 May 2020 20:56:41 +0100 Subject: [PATCH 07/54] Adding icon --- apps/gallifrey/app.png | Bin 0 -> 4273 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/gallifrey/app.png diff --git a/apps/gallifrey/app.png b/apps/gallifrey/app.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb6485a6a8c3f13dd0d46b8c393552652696836 GIT binary patch literal 4273 zcmY*cXIN8Nv`s=42_2+F3<0DQ2tD*-2pJFzDorV3=+Y88Qly0l(tDAn6hWFGAXNkb zkx)cXBV7DCt2n+=xI;h zW}v;8lLW+L^>qMGhak%*n@F6wfrF6|K>P&L189J30IE~U$pZlL0%-om000Ka_b06>g0fcg)|@+6-w^hunk|75BH;D3$bak@g;Ur0s5d+`>uw-|;+E0o44FC-4rAU`m4kK zW*|@SX&DZK{!Jmcs>95UOrW|R-Z-d&w7j$oOoIUmg{pbqc0gkFP=DknJ9U^7f#8XR z!~OjHr2XWiJ-i*^vMMSna2W&~fsi_3NZ|wA33mQc?s&m}O#atL4~Mt+cJ?GVd$>bS zeeG^}_z=`#u+v8Wu7A!+aCZ2wlRN&;SSJI*PrtxrrDfp%dY?$uPOC^`Z)e;|=Tm7lJsDMlK@I-zwP`RIz7(+l0GR9y^t7)!(Tr!EiMxs8 ze7%|%P)}$vQhi2K$ieWa5(X7@eI!Yf5mrR(!wNdZ(+YvGTvXzm252ox82Zh{`(m#E zz%FiiC=@hcS@Q_Dikdjlr!TGg{cMx-cr10E!e;#I;p&u!%Ji}1bn{NTL5fg$*s+z^ zk#S~egzp}6%l8iZu*j&7`il!ePC4}qqKY9SBz@# zpM?s%cz-bs%N(RJ_dU)=J+>7My?-qc{kk6TG7Xnwv8%GbwGCQZxwvTf$T;HMqCHYK zB3hItteBdl}h@EHcb06 zBP?@{0!q#6ENU7UbvY~6fTJSuBpL|VlwjtU4G@R6#1tLp^L%wzE_FxdBy;iBcq6ME zyXDKd;@%A>`u^rkQkenPNcf+tq_HBRv=g#&5^udDc*>0y{LB>M@qy$&%zRs&IX!MY z%F+_2h2ysHQl@n(h&Djwky1!LE53vB2WOh7gXzmYiE^qnK_pk@QjLYBNCch`rk+Ka z&7_N*8x~^p1}5Qgtjm8D3L<{WUYvc}w6fFweEY=|`ok2J2DAJCtd_$qdfB1HqCh@E z!7EMPCP}DUW6+vS=KR&CO)8eKcqfI*AO+LwFVh;oXZH`z#!>T-iA7BP0|i=z6GSy8 zCeQ%2Z5rO1RY5u}{sk$YHLkHYw`32~x7uSVL7amqy{3=NLET(%do96{?I=6L+N&rW zxaD7?GzmsuRj2XV3arZXH4dW+M=1dzh)gf-j3n_ZUV;UB+eteGDykwLyv+fxpBM(o z8z@q`)v@)=F$bpKotY9YCtr(^d0S?2#~rW(`f|e)G0a`OoV!xC;vBy#r_5~#O8=l} zBAg=+6{c{iAy?S?Ag>x0&VEU}tde_k)pPM@x82~k5mWS-lCt1JaQsL_;#TM$fpJ)X z#F|T&IU!;*>!O$mk}vYaCW)udeCialHC_XiCEvSlV@6sMn)Vlu++J!)5l9nH7D41y zoA9d)KT!If1CDQJj0uhQV!8!S!r#2a_R<9wP>eh~NH_4jOQcJBM%ILmVeVScMUjzE zfyBe10!;38$=F1zpu6gmE8_WO_S}?C# z^<;%pFGTd)0%ay1f_TfXkd{kl*J78bj1Wv(*4sz4GYt$eB@R24b9xG*bGrQ5Y)`5U zl55Sn?M2YiA`Lk;(h)6VDU~x!M3`esL#ZH|rBQ=4p~)2RYux+e3yqxB`#DqS zELZCHQ+Znnf}moDVPkprGvd>9kM(N5@%zG79gMs=ek{*yA5Ni+-*i(+FM9wl(Ltjs zBul?KQQ|e-lT(zcTKYR0HD`ZxkCei$Z|zQ+kxa&x%qP0J1KGrs!-Jk=;5=Zvth-<* znoHMSUJ>wEta{tinQFygC=51PDE^+I&@XP;groH|fBUw@euJ{Q*lynG@PnLkJqFRp zxlgLq@p>#Ufe}=RCs15R;U&4xd)l6}&}St-*Hgs)fPI89AkhmeJG%Y2%igb!ZeAElRrF_vZv#b8G z?ZJ0Rjf-#@Tu^@J5_Zr1_FK1Jg%G4N`_(u14i_~n8GqjILp;?F|JFI*dDq9h-MG~q z?;4m6DXZL;7W}wmrwaYlZGJwwN0pf*kI{9JEt|dXzpuDy{AO{pB2k`C-+6QR`DYT7 zQajMr9HK++k*NXY(n3_JGTHpX&xK8ydFu4}?FNa-1d>>3!0#`^wDZn>6jn$9$0o0MBx?VyJ8FRKwBjYKVXHSLZLxZ7{+x(VIfY^s}e zAKm-yX003^U!}G3Q_MRb#+t80v$aVRhW)fNJNiZeIX6r$QKy##zP@)MtUCOW7EhK! zyIVR#f_}&oy%GAT1AdIt=g7)8&Fz;rXU?DTn_?)H%cA|TZ8K8j$-&oKAO1yyFPmta zvt?z$6apRsnnh%FI;8?!Qw};mXvtQ^ljeA^aYSsYXRhhWMk8j;g=np_+3KhjAtZ>j zhISnH1$^SE+c43Zyc<^K^_>fQz*M(zb%;)22RONgIJgX|F4mtzlh!%apAa04N`93# zw=)a^dDVGDnQt3y1~hAQh`3^+?lFvC^v;2dkF8rrM6qo(bWyfH+wcVOF3{WS#Rr*| z+iMIwfLf}ug0T_HRC?3z$S{|sdUt(y86*wod3`>*4T7cMhI+xyZ1N4N5T+11dCZ4I z1!OBnp{v%&oFvWMO@5E}TGk0qT7$&q^ZfA)N8L@muIs5jxoS2+a49{@K2tECkI)-* z9+4kkY2E;F8za|INDq9+>eAKK;CmWL;%s@qik@e>j>=XM({JfU%n;Rc`r_yo=c5PQ zI-hC*y3@BA;kzS6F+~G2KduTB?KS9-9;Jk-+@u|~Nt+mN@?|2c@cFwj;!<-K>qtj? zw({1qBjZovN|8~DD!i>=X^_Z0^)9{6{r38PoB$8!IauDYEmOX=pG0tf$0AvWlzc5e zM%L|PlLVg~+Ksprq+3<4#9dcVzmk&V-45wS|Z3 zuKWc)_XAKtj)i>YixD9ME-j5Ir>YB8Qum2^*DM#S0MV7l>U`=68RP+C6c7x#G2l3V zReZ$SV$+b792NcbPH5h+!1lxgpt2x8aj~Yi7C+Exz5gaC(el$MUH>M=Qrx)5sYZi1 zmic%c09gg=L>}BtwTW*_ryCYvoa@@luWmC=o(Cl+-kz{Z z9dxXdoxZLP&oAe%Kpo)y_qB5mX}@jxE;g3DY)O5_x5v#C$dzX-x5=A{>cB6IuP*++ zK^)7`oj5j)3eRrXurH(er?shxi`gO zE$6|hOK#9?dv+AR{bNw9mX0YoYP{^hIziFiG3Ge=ax5R~`(EuO#fqe=16W1-yZbe4 zb-Xfh^k3VQm7BNt`w&|%&LsriIm!rQUH?#E78A-C<$o2P@esQ88!+49d7RFdxWgVh zDXr&p=I(v3cS8gWwP2jB#MEj**fYpL>%=h4I{0mtR~H9W%6wRzxa)pI_q74-&3f;J zC=1>mW{YT+OY3&JXKu)*$a#y+(;+f$Y^#2#_yT_y@~BF1{9{Ox*oDLA`9;IQu-jN^+B>K>D^FhZMdsH2pqvfq2VhGcsdN^GCzYR#at;r8|88_j;~MJX*@x7IaQ<)U;c8yxc` zh<<)#LDWnYvTtWBZTqnH!hcb?Z)R`bAWnVYh-^;wX(gmNtFVXrS}Gc;ShbPu>G!jt z)~di_fgi4@H#p_nuITPUQK`jt&7w;#viVPOjE<3)d3&gNpqxWts9kH*kmNI|O_$Yb z7Ipd__FheWFRPI+`tC*oqxpKMT=E>EgZC9vo zwWI;Zu)nVSdej|D39tObQe1nbl{p{*@vSvEaF?VqBKI|cZ%O+8j*$B}k0!^0;XO4m zhw__yJ{K#g(s8D)ECGQGIc*Rj?kfTbTjoj)pO_E)jn*bpP=%7rxM2Db9Hun^MVmwk zT9?_dK2IattLDLVKh1GumB;p2xv2-@{scG1D(aBPwBFW=RDG7-XM*9E=sA8h*VSVY zOV-lqu;@BS5;t7y6fdNjL+U>}N+S Date: Sun, 10 May 2020 21:00:13 +0100 Subject: [PATCH 08/54] Rename apps/gallifrey/app-icon.js to apps/gallifrey-icon.js --- apps/{gallifrey/app-icon.js => gallifrey-icon.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/{gallifrey/app-icon.js => gallifrey-icon.js} (100%) diff --git a/apps/gallifrey/app-icon.js b/apps/gallifrey-icon.js similarity index 100% rename from apps/gallifrey/app-icon.js rename to apps/gallifrey-icon.js From 7bc39c8e364cce5351733d81b578fd9dcee3beb5 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:01:08 +0100 Subject: [PATCH 09/54] Rename apps/gallifrey-icon.js to apps/gallifrey/gallifrey-icon.js. --- apps/{gallifrey-icon.js => gallifrey/gallifrey-icon.js.} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/{gallifrey-icon.js => gallifrey/gallifrey-icon.js.} (100%) diff --git a/apps/gallifrey-icon.js b/apps/gallifrey/gallifrey-icon.js. similarity index 100% rename from apps/gallifrey-icon.js rename to apps/gallifrey/gallifrey-icon.js. From af108e9a68f0836f165353745ae87b29eb2cffb5 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:01:58 +0100 Subject: [PATCH 10/54] Delete app.png --- apps/gallifrey/app.png | Bin 4273 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/gallifrey/app.png diff --git a/apps/gallifrey/app.png b/apps/gallifrey/app.png deleted file mode 100644 index 7fb6485a6a8c3f13dd0d46b8c393552652696836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4273 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 Date: Sun, 10 May 2020 21:02:25 +0100 Subject: [PATCH 11/54] Rename app.js to gallifrey.js --- apps/gallifrey/{app.js => gallifrey.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/gallifrey/{app.js => gallifrey.js} (100%) diff --git a/apps/gallifrey/app.js b/apps/gallifrey/gallifrey.js similarity index 100% rename from apps/gallifrey/app.js rename to apps/gallifrey/gallifrey.js From 0c2701015e96b912329e07af93a4dd7b87416442 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:03:08 +0100 Subject: [PATCH 12/54] Add files via upload --- apps/gallifrey/gallifrey.png | Bin 0 -> 4273 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/gallifrey/gallifrey.png diff --git a/apps/gallifrey/gallifrey.png b/apps/gallifrey/gallifrey.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb6485a6a8c3f13dd0d46b8c393552652696836 GIT binary patch literal 4273 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 Date: Sun, 10 May 2020 21:06:44 +0100 Subject: [PATCH 13/54] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 6897fafe1..7e91be2ca 100644 --- a/apps.json +++ b/apps.json @@ -1685,8 +1685,8 @@ "tags": "clock", "type": "clock", "storage": [ - {"name":"gallifrey.app.js","url":"app.js"}, - {"name":"gallirey.img","url":"app-icon.js","evaluate":true} + {"name":"gallifrey.app.js","url":"gallifrey.js"}, + {"name":"gallirey.img","url":"gallifrey-icon.js","evaluate":true} ] } ] From b6e0c6402d62672909187425f45c95d1a2e7cacd Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:14:58 +0100 Subject: [PATCH 14/54] Update apps.json --- apps.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 7e91be2ca..0db5bb26f 100644 --- a/apps.json +++ b/apps.json @@ -1676,17 +1676,17 @@ {"name":"findphone.img","url":"app-icon.js","evaluate":true} ] }, -{ "id": "gallifrey", +{ "id": "gallifr", "name": "Gallifreyan Chronometer", "shortName":"Gallifrey Clock", - "icon": "app.png", + "icon": "gallifrey.png", "version":"0.01", "description": "A Gallifreyan clock. The dark and light green segments show the minutes, the black circle, the hour.", "tags": "clock", "type": "clock", "storage": [ - {"name":"gallifrey.app.js","url":"gallifrey.js"}, - {"name":"gallirey.img","url":"gallifrey-icon.js","evaluate":true} + {"name":"gallifr.app.js","url":"app.js"}, + {"name":"gallir.img","url":"app-icon.js","evaluate":true} ] } ] From 60cef5ba03bc7edc93ddcaadff8e04c498c6f715 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:17:32 +0100 Subject: [PATCH 15/54] Rename apps/gallifrey/gallifrey-icon.js. to apps/gallifr/app-icon.js. --- apps/{gallifrey/gallifrey-icon.js. => gallifr/app-icon.js.} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/{gallifrey/gallifrey-icon.js. => gallifr/app-icon.js.} (100%) diff --git a/apps/gallifrey/gallifrey-icon.js. b/apps/gallifr/app-icon.js. similarity index 100% rename from apps/gallifrey/gallifrey-icon.js. rename to apps/gallifr/app-icon.js. From 440d130b6b4a304f13788daa06b326c3436e1576 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:18:06 +0100 Subject: [PATCH 16/54] Rename apps/gallifrey/gallifrey.js to apps/gallifr/apps.js --- apps/{gallifrey/gallifrey.js => gallifr/apps.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/{gallifrey/gallifrey.js => gallifr/apps.js} (100%) diff --git a/apps/gallifrey/gallifrey.js b/apps/gallifr/apps.js similarity index 100% rename from apps/gallifrey/gallifrey.js rename to apps/gallifr/apps.js From 58202cd32da090b9af290d9cae7b787020b9513b Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:18:41 +0100 Subject: [PATCH 17/54] Delete gallifrey.png --- apps/gallifrey/gallifrey.png | Bin 4273 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/gallifrey/gallifrey.png diff --git a/apps/gallifrey/gallifrey.png b/apps/gallifrey/gallifrey.png deleted file mode 100644 index 7fb6485a6a8c3f13dd0d46b8c393552652696836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4273 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 Date: Sun, 10 May 2020 21:20:07 +0100 Subject: [PATCH 18/54] Add files via upload --- apps/gallifr/app.png | Bin 0 -> 4273 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/gallifr/app.png diff --git a/apps/gallifr/app.png b/apps/gallifr/app.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb6485a6a8c3f13dd0d46b8c393552652696836 GIT binary patch literal 4273 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 Date: Sun, 10 May 2020 21:22:34 +0100 Subject: [PATCH 19/54] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 0db5bb26f..8695406de 100644 --- a/apps.json +++ b/apps.json @@ -1679,14 +1679,14 @@ { "id": "gallifr", "name": "Gallifreyan Chronometer", "shortName":"Gallifrey Clock", - "icon": "gallifrey.png", + "icon": "app.png", "version":"0.01", "description": "A Gallifreyan clock. The dark and light green segments show the minutes, the black circle, the hour.", "tags": "clock", "type": "clock", "storage": [ {"name":"gallifr.app.js","url":"app.js"}, - {"name":"gallir.img","url":"app-icon.js","evaluate":true} + {"name":"gallifr.img","url":"app-icon.js","evaluate":true} ] } ] From 1d8db9b9a230736e3bee8fe45e26a14f19a51217 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:44:56 +0100 Subject: [PATCH 20/54] Update app-icon.js. --- apps/gallifr/app-icon.js. | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gallifr/app-icon.js. b/apps/gallifr/app-icon.js. index 2b98479b1..0b05da02e 100644 --- a/apps/gallifr/app-icon.js. +++ b/apps/gallifr/app-icon.js. @@ -1 +1 @@ -require("heatshrink").decompress(atob("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")) +require("heatshrink").decompress(atob("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")); From 0d38ff7e4b05f31851be50bae8226a1791608f68 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:54:44 +0100 Subject: [PATCH 21/54] Add files via upload --- apps/gallifr/app.png | Bin 4273 -> 4571 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/gallifr/app.png b/apps/gallifr/app.png index 7fb6485a6a8c3f13dd0d46b8c393552652696836..c271fec07968f7a0aff765c3c8d03b4b5783cea8 100644 GIT binary patch delta 4040 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 Date: Sun, 10 May 2020 21:58:07 +0100 Subject: [PATCH 22/54] Add files via upload --- apps/gallifr/app.png | Bin 4571 -> 4099 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/gallifr/app.png b/apps/gallifr/app.png index c271fec07968f7a0aff765c3c8d03b4b5783cea8..9bb50e3cdd899f759f6b1ad5fb3b31881d9f6ba8 100644 GIT binary patch delta 3562 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 LgVrwBw2S^XKHtfZ delta 4074 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 Date: Sun, 10 May 2020 21:59:30 +0100 Subject: [PATCH 23/54] Delete app.png --- apps/gallifr/app.png | Bin 4099 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/gallifr/app.png diff --git a/apps/gallifr/app.png b/apps/gallifr/app.png deleted file mode 100644 index 9bb50e3cdd899f759f6b1ad5fb3b31881d9f6ba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4099 zcmZ`+XIN9)(%zKN0|IJ-bUcEJCkYTCgrYQ&7AaB`1Oi3~B?(PJuTqqz6j2gH5i1}~ z>CyyLx=IkF1cHPjf`Wj6aD)1tbH4N3yY{p8ynE(-XJ$RK{_I3^j3JnBA0Ge!V55`z zmMn|d**sjVw=Mhkc$VRG(=pQlfYMa{O)QA@E#rF9(hLBCm+OMXnt9aJhs0x=CS|9M&xn)jdx@R!E8b-!%I4O#t#7aMRztE zaFYTB0QL*`({}!LW~OLYqBjhCp6G&uk-bSfDnOHrW3`~|e7{)yjm)|Zx?yT3mP4TlE? z2EqbWU_@UxxRScMIvk-4S62R$#rV@Nh~SSU|4H!M|0~J=<d@lCt=nZ+4&x@L-;U9(h$v_6hb%X7y^_ zSVYw(s@^SkTWcezXJvFrN1@&9 zNO1%|GkwV5yn1=fB;F;yt)lf+1CZK8MM!68HMU-5Ge5HHq1jy|F}-P{54HNoVl!hDTc&(N3`@XxX z>-HDREp({8X-13ZVKow39C2#=Z)2`fA*EmrG%Y~Jpy=vtYMoDMZr!b?L9oVA1n7Mq zl3R*RVH{Qz$nz5&mZyAeXT>kissI0IY`&;=U8!_p9*YT+T!etc8Y;?>Okv!odxVwUykvaX$sMRTX zK)f?%p_xWk|I@?Mxs~?BHBHvE!q?m;_=kNX=-jq4L-+~G<*BTxsy8={pEqV$*kFDl zdx5h-VCo??7V@Ekn48|^QXyB~XH}jXA1*Dh(98{*$}xnV+)Amu>+wQtcu@4E7+|*g zW3K#=6Xz4X*wutVH}$xndtkN5u+LmAzI8+a<>ob`YSP|dFqEcK%gBE3nK9Biqb@$256k?4C#G{0)1nqw6sFUEgwStj`+f{E)F(yz=7V2k?(% zF%2IaK~2fCZRPIKi9xHWXl6yg)ZCSJ5U#)yEwpUx1k&oP^ua(1DnL^CcSg8i4n^~> zf0FMdKUQeI<;-<3cVQ1nxei=&dPAU37hZ3rEpnkr87lP7Q`O~^h~l{K+Cfwrgm&Vx zqv&qJ^3F zJYJ?+_E+bAZD<*C=n1d0<(eG`+l1YR>n*SmCo2M41fO0MLp=(pJv94D-A8=LT(wLG zS(8SF5~=Vg=Ji(rrlN6L9n}qJ>zL=q9}PBWhsgzDvzf#6yBDJ^^7If6z}TxV-`v|% zjV688(6*H5>718Lx)~xvG=WPfZTpG?K~gK8tL#lcuZ+AhT~Zs|E_~l>4Nt!9d1Kh` zE(94gv%7)|Z?_y~4GZCu91nTnPmOz%>#GAVC_M9r9Dyo(IO9WsAsTAafAnUsN#ck1 z`PhX0rO~MGdZ�?NZ)PH_#6tX^q|QyuCaVR9CQ0LbPhL!7@rEnwgoNFtXuhb^nX5 z^nL!;j#*nwsr|=`D6Y`eHFeuj_tOLR`Xl{jTQajYwrr^Q8sebuEYWDYiRs0m52(DI8aw|{$b@}h4a*LqQ zJ4+F14bl~@yo!}k)N0XidRwDpQUw1(vC0~(6zET$tiI{iq+3!H;F{E)sHlBQD;k#4 zcG!x3n9NRjpkeWvEP4geME{u3@px?Ynj|<_I0o{{gdjE=7jk>XI#~GiN?UauUb@8L z;w1xTlE4P*I%oB8oZC-8X>q1D&g`1kV?bwjU97`V75pv?FHdjo`T9lv=@XheH;j8* z5wEclfG>GF-GWSQ@(yAwPg^uIUa+@92P`f~2WRkf_~m}LZIo^FRQobiG&g$|?!DQVdk-04C9ye3FKeumy?!Oosf(hWPvF|y^tlVmC14Udh91q^$ z<)#m2abqLa_E7-i;Y7on^Iya630z{%*%><-Ht;C=?d!KXR=6xO|B!q;lx)!MQ@Z!s z{U*ot`*f*ZdkMjTCPjLIlz=HM;>H8U$~M}L31owqEu`ML7btx-5r`=>FE)9lsHBRc zR{PmVR3>YV#h>_k?HFn;C>|enNMk2ONqnAff%3NJwsiE8@4CdYnhs>{GYSjQpDEgw z|7@`IrJ_4Uy+elJeMmS~tHyor0Tn)LBGvLnxF zU z?u)~o=~6|z7xtd8nPEOXV_gI7;(j0=s_XgnGKHaZrQhjfXn1#}!A8Pb4wkp7ODeIf zZup_^w~qdAdcjA?ySplr(HDERFjK21yy*g4xoovDcic+!2OcteSGze{_c*e*$2hu4 ztceE-k*+T@dYVrzhTI-_<2l{;DbT5;Gko}}@BNdspqRcTtO<&5`04{Ujrp>L9`-k6 zsI7&NdG|Zb`m}(o7JgDFCdXEpS~2Q+==~`T^40521&yNl;x2W*-$uU2$ZiEG*whz_ zI(;2VxMishJ9}oZ8ywgyi~u8RAkU)u=z8AlFV4dh2u>5Y@?(cm(^AH5ovXiFw5xKB zX^lI)<~^Y`_x`ztV54Lqn1w#+c1A_sK|Ae}i}9>5N3pNKK9D^Kx2Q6&fys%7_epksqzXwTWN9 zqRyQN4kj?VGrU{mHZH+pkW-To*sFQ#GuG{Z6ed}Z+yMtbM*ih^gQ3O(*FG)VsbD$Dy*o7D1@ zOv1wPyCHt{r}EF8(F@^rQFu3cJ!I}|*CoP}I`38z2-W@hjGEzf{Sc90Uh%H3Jz?(# z5wn*{f6R>dj@)oRc6l6UoZmr)x;cIzzjf)AZ@+RWCB)V(PPWDGz}u}MG!LdDXn*XOPsVlN{3NHUBu3QG1GP?BsLJLQmbqG?54N;Obn7nhd_2wu3So8#E=_(}gy z`tRoF?h@lyIs+CA#F2N9Rgy$;LXhdp6>Obr3S0Xyd6RNxub07S0wsbQjUG%{E1`_3 zj$)2wbv(aBvtD8HeGqlO-}1pdR6=|sMYLo_>0Sv^{sI%DzlD1dL3vBS`d2CX^xS>X zy3aWD02F!8+c{ze1@mY*Tg5Ih<|?W<7WjF?Yi^%d+ap&Ise<>s^{=DMX`b!pzFRx5 zMWmzzP|iaM8b3C%&SNlB%6Bu{=f(Mks$~!L6XCjHOD6OV%dt73wO91iaHqVj=@sdO z)%YTvZDRPLkMFuF>k5~UGdbhjd7lJL=IoZ{XU1L+-F0|ea3@L{+J{)8H1d}~B!G?M z@C*@YU5HL8Rl4G9{)JJ`5&@}5^}HnR_Fl5Wboz&yoU3-suHDQ}Wm#?2&9cSo&ky*@=GT%!VsXys=*bnx?ilg{CvZce~bwDDM2)8W~{p Ji*=o&{{sw5H_!k8 From df2065c5f22e0c2f918682865537fefaa7f8aa2b Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 21:59:51 +0100 Subject: [PATCH 24/54] Icon change --- apps/gallifr/app.png | Bin 0 -> 4099 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/gallifr/app.png diff --git a/apps/gallifr/app.png b/apps/gallifr/app.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb50e3cdd899f759f6b1ad5fb3b31881d9f6ba8 GIT binary patch literal 4099 zcmZ`+XIN9)(%zKN0|IJ-bUcEJCkYTCgrYQ&7AaB`1Oi3~B?(PJuTqqz6j2gH5i1}~ z>CyyLx=IkF1cHPjf`Wj6aD)1tbH4N3yY{p8ynE(-XJ$RK{_I3^j3JnBA0Ge!V55`z zmMn|d**sjVw=Mhkc$VRG(=pQlfYMa{O)QA@E#rF9(hLBCm+OMXnt9aJhs0x=CS|9M&xn)jdx@R!E8b-!%I4O#t#7aMRztE zaFYTB0QL*`({}!LW~OLYqBjhCp6G&uk-bSfDnOHrW3`~|e7{)yjm)|Zx?yT3mP4TlE? z2EqbWU_@UxxRScMIvk-4S62R$#rV@Nh~SSU|4H!M|0~J=<d@lCt=nZ+4&x@L-;U9(h$v_6hb%X7y^_ zSVYw(s@^SkTWcezXJvFrN1@&9 zNO1%|GkwV5yn1=fB;F;yt)lf+1CZK8MM!68HMU-5Ge5HHq1jy|F}-P{54HNoVl!hDTc&(N3`@XxX z>-HDREp({8X-13ZVKow39C2#=Z)2`fA*EmrG%Y~Jpy=vtYMoDMZr!b?L9oVA1n7Mq zl3R*RVH{Qz$nz5&mZyAeXT>kissI0IY`&;=U8!_p9*YT+T!etc8Y;?>Okv!odxVwUykvaX$sMRTX zK)f?%p_xWk|I@?Mxs~?BHBHvE!q?m;_=kNX=-jq4L-+~G<*BTxsy8={pEqV$*kFDl zdx5h-VCo??7V@Ekn48|^QXyB~XH}jXA1*Dh(98{*$}xnV+)Amu>+wQtcu@4E7+|*g zW3K#=6Xz4X*wutVH}$xndtkN5u+LmAzI8+a<>ob`YSP|dFqEcK%gBE3nK9Biqb@$256k?4C#G{0)1nqw6sFUEgwStj`+f{E)F(yz=7V2k?(% zF%2IaK~2fCZRPIKi9xHWXl6yg)ZCSJ5U#)yEwpUx1k&oP^ua(1DnL^CcSg8i4n^~> zf0FMdKUQeI<;-<3cVQ1nxei=&dPAU37hZ3rEpnkr87lP7Q`O~^h~l{K+Cfwrgm&Vx zqv&qJ^3F zJYJ?+_E+bAZD<*C=n1d0<(eG`+l1YR>n*SmCo2M41fO0MLp=(pJv94D-A8=LT(wLG zS(8SF5~=Vg=Ji(rrlN6L9n}qJ>zL=q9}PBWhsgzDvzf#6yBDJ^^7If6z}TxV-`v|% zjV688(6*H5>718Lx)~xvG=WPfZTpG?K~gK8tL#lcuZ+AhT~Zs|E_~l>4Nt!9d1Kh` zE(94gv%7)|Z?_y~4GZCu91nTnPmOz%>#GAVC_M9r9Dyo(IO9WsAsTAafAnUsN#ck1 z`PhX0rO~MGdZ�?NZ)PH_#6tX^q|QyuCaVR9CQ0LbPhL!7@rEnwgoNFtXuhb^nX5 z^nL!;j#*nwsr|=`D6Y`eHFeuj_tOLR`Xl{jTQajYwrr^Q8sebuEYWDYiRs0m52(DI8aw|{$b@}h4a*LqQ zJ4+F14bl~@yo!}k)N0XidRwDpQUw1(vC0~(6zET$tiI{iq+3!H;F{E)sHlBQD;k#4 zcG!x3n9NRjpkeWvEP4geME{u3@px?Ynj|<_I0o{{gdjE=7jk>XI#~GiN?UauUb@8L z;w1xTlE4P*I%oB8oZC-8X>q1D&g`1kV?bwjU97`V75pv?FHdjo`T9lv=@XheH;j8* z5wEclfG>GF-GWSQ@(yAwPg^uIUa+@92P`f~2WRkf_~m}LZIo^FRQobiG&g$|?!DQVdk-04C9ye3FKeumy?!Oosf(hWPvF|y^tlVmC14Udh91q^$ z<)#m2abqLa_E7-i;Y7on^Iya630z{%*%><-Ht;C=?d!KXR=6xO|B!q;lx)!MQ@Z!s z{U*ot`*f*ZdkMjTCPjLIlz=HM;>H8U$~M}L31owqEu`ML7btx-5r`=>FE)9lsHBRc zR{PmVR3>YV#h>_k?HFn;C>|enNMk2ONqnAff%3NJwsiE8@4CdYnhs>{GYSjQpDEgw z|7@`IrJ_4Uy+elJeMmS~tHyor0Tn)LBGvLnxF zU z?u)~o=~6|z7xtd8nPEOXV_gI7;(j0=s_XgnGKHaZrQhjfXn1#}!A8Pb4wkp7ODeIf zZup_^w~qdAdcjA?ySplr(HDERFjK21yy*g4xoovDcic+!2OcteSGze{_c*e*$2hu4 ztceE-k*+T@dYVrzhTI-_<2l{;DbT5;Gko}}@BNdspqRcTtO<&5`04{Ujrp>L9`-k6 zsI7&NdG|Zb`m}(o7JgDFCdXEpS~2Q+==~`T^40521&yNl;x2W*-$uU2$ZiEG*whz_ zI(;2VxMishJ9}oZ8ywgyi~u8RAkU)u=z8AlFV4dh2u>5Y@?(cm(^AH5ovXiFw5xKB zX^lI)<~^Y`_x`ztV54Lqn1w#+c1A_sK|Ae}i}9>5N3pNKK9D^Kx2Q6&fys%7_epksqzXwTWN9 zqRyQN4kj?VGrU{mHZH+pkW-To*sFQ#GuG{Z6ed}Z+yMtbM*ih^gQ3O(*FG)VsbD$Dy*o7D1@ zOv1wPyCHt{r}EF8(F@^rQFu3cJ!I}|*CoP}I`38z2-W@hjGEzf{Sc90Uh%H3Jz?(# z5wn*{f6R>dj@)oRc6l6UoZmr)x;cIzzjf)AZ@+RWCB)V(PPWDGz}u}MG!LdDXn*XOPsVlN{3NHUBu3QG1GP?BsLJLQmbqG?54N;Obn7nhd_2wu3So8#E=_(}gy z`tRoF?h@lyIs+CA#F2N9Rgy$;LXhdp6>Obr3S0Xyd6RNxub07S0wsbQjUG%{E1`_3 zj$)2wbv(aBvtD8HeGqlO-}1pdR6=|sMYLo_>0Sv^{sI%DzlD1dL3vBS`d2CX^xS>X zy3aWD02F!8+c{ze1@mY*Tg5Ih<|?W<7WjF?Yi^%d+ap&Ise<>s^{=DMX`b!pzFRx5 zMWmzzP|iaM8b3C%&SNlB%6Bu{=f(Mks$~!L6XCjHOD6OV%dt73wO91iaHqVj=@sdO z)%YTvZDRPLkMFuF>k5~UGdbhjd7lJL=IoZ{XU1L+-F0|ea3@L{+J{)8H1d}~B!G?M z@C*@YU5HL8Rl4G9{)JJ`5&@}5^}HnR_Fl5Wboz&yoU3-suHDQ}Wm#?2&9cSo&ky*@=GT%!VsXys=*bnx?ilg{CvZce~bwDDM2)8W~{p Ji*=o&{{sw5H_!k8 literal 0 HcmV?d00001 From cc666be07796ad1cc37bb06eab5c49a885bc497e Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 22:52:41 +0100 Subject: [PATCH 25/54] File name changes --- apps.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 8695406de..9a6a36495 100644 --- a/apps.json +++ b/apps.json @@ -1679,14 +1679,14 @@ { "id": "gallifr", "name": "Gallifreyan Chronometer", "shortName":"Gallifrey Clock", - "icon": "app.png", + "icon": "gallifr.png", "version":"0.01", "description": "A Gallifreyan clock. The dark and light green segments show the minutes, the black circle, the hour.", "tags": "clock", "type": "clock", "storage": [ - {"name":"gallifr.app.js","url":"app.js"}, - {"name":"gallifr.img","url":"app-icon.js","evaluate":true} + {"name":"gallifr.app.js","url":"gallifr.js"}, + {"name":"gallifr.img","url":"gallifr-icon.js","evaluate":true} ] } ] From 94158feda3c6911dba7a143ba0d54d26de3168f0 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 22:53:34 +0100 Subject: [PATCH 26/54] Rename app-icon.js. to gallifr-icon.js. --- apps/gallifr/{app-icon.js. => gallifr-icon.js.} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/gallifr/{app-icon.js. => gallifr-icon.js.} (100%) diff --git a/apps/gallifr/app-icon.js. b/apps/gallifr/gallifr-icon.js. similarity index 100% rename from apps/gallifr/app-icon.js. rename to apps/gallifr/gallifr-icon.js. From 632292781569aea936d0cbc79c5380455488510b Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 22:54:13 +0100 Subject: [PATCH 27/54] Rename apps.js to gallifr.js --- apps/gallifr/{apps.js => gallifr.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/gallifr/{apps.js => gallifr.js} (100%) diff --git a/apps/gallifr/apps.js b/apps/gallifr/gallifr.js similarity index 100% rename from apps/gallifr/apps.js rename to apps/gallifr/gallifr.js From 4268616483f6b165e5781557d7608e0b37c1b66e Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 22:55:50 +0100 Subject: [PATCH 28/54] Add files via upload --- apps/gallifr/gallifr.png | Bin 0 -> 4099 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/gallifr/gallifr.png diff --git a/apps/gallifr/gallifr.png b/apps/gallifr/gallifr.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb50e3cdd899f759f6b1ad5fb3b31881d9f6ba8 GIT binary patch literal 4099 zcmZ`+XIN9)(%zKN0|IJ-bUcEJCkYTCgrYQ&7AaB`1Oi3~B?(PJuTqqz6j2gH5i1}~ z>CyyLx=IkF1cHPjf`Wj6aD)1tbH4N3yY{p8ynE(-XJ$RK{_I3^j3JnBA0Ge!V55`z zmMn|d**sjVw=Mhkc$VRG(=pQlfYMa{O)QA@E#rF9(hLBCm+OMXnt9aJhs0x=CS|9M&xn)jdx@R!E8b-!%I4O#t#7aMRztE zaFYTB0QL*`({}!LW~OLYqBjhCp6G&uk-bSfDnOHrW3`~|e7{)yjm)|Zx?yT3mP4TlE? z2EqbWU_@UxxRScMIvk-4S62R$#rV@Nh~SSU|4H!M|0~J=<d@lCt=nZ+4&x@L-;U9(h$v_6hb%X7y^_ zSVYw(s@^SkTWcezXJvFrN1@&9 zNO1%|GkwV5yn1=fB;F;yt)lf+1CZK8MM!68HMU-5Ge5HHq1jy|F}-P{54HNoVl!hDTc&(N3`@XxX z>-HDREp({8X-13ZVKow39C2#=Z)2`fA*EmrG%Y~Jpy=vtYMoDMZr!b?L9oVA1n7Mq zl3R*RVH{Qz$nz5&mZyAeXT>kissI0IY`&;=U8!_p9*YT+T!etc8Y;?>Okv!odxVwUykvaX$sMRTX zK)f?%p_xWk|I@?Mxs~?BHBHvE!q?m;_=kNX=-jq4L-+~G<*BTxsy8={pEqV$*kFDl zdx5h-VCo??7V@Ekn48|^QXyB~XH}jXA1*Dh(98{*$}xnV+)Amu>+wQtcu@4E7+|*g zW3K#=6Xz4X*wutVH}$xndtkN5u+LmAzI8+a<>ob`YSP|dFqEcK%gBE3nK9Biqb@$256k?4C#G{0)1nqw6sFUEgwStj`+f{E)F(yz=7V2k?(% zF%2IaK~2fCZRPIKi9xHWXl6yg)ZCSJ5U#)yEwpUx1k&oP^ua(1DnL^CcSg8i4n^~> zf0FMdKUQeI<;-<3cVQ1nxei=&dPAU37hZ3rEpnkr87lP7Q`O~^h~l{K+Cfwrgm&Vx zqv&qJ^3F zJYJ?+_E+bAZD<*C=n1d0<(eG`+l1YR>n*SmCo2M41fO0MLp=(pJv94D-A8=LT(wLG zS(8SF5~=Vg=Ji(rrlN6L9n}qJ>zL=q9}PBWhsgzDvzf#6yBDJ^^7If6z}TxV-`v|% zjV688(6*H5>718Lx)~xvG=WPfZTpG?K~gK8tL#lcuZ+AhT~Zs|E_~l>4Nt!9d1Kh` zE(94gv%7)|Z?_y~4GZCu91nTnPmOz%>#GAVC_M9r9Dyo(IO9WsAsTAafAnUsN#ck1 z`PhX0rO~MGdZ�?NZ)PH_#6tX^q|QyuCaVR9CQ0LbPhL!7@rEnwgoNFtXuhb^nX5 z^nL!;j#*nwsr|=`D6Y`eHFeuj_tOLR`Xl{jTQajYwrr^Q8sebuEYWDYiRs0m52(DI8aw|{$b@}h4a*LqQ zJ4+F14bl~@yo!}k)N0XidRwDpQUw1(vC0~(6zET$tiI{iq+3!H;F{E)sHlBQD;k#4 zcG!x3n9NRjpkeWvEP4geME{u3@px?Ynj|<_I0o{{gdjE=7jk>XI#~GiN?UauUb@8L z;w1xTlE4P*I%oB8oZC-8X>q1D&g`1kV?bwjU97`V75pv?FHdjo`T9lv=@XheH;j8* z5wEclfG>GF-GWSQ@(yAwPg^uIUa+@92P`f~2WRkf_~m}LZIo^FRQobiG&g$|?!DQVdk-04C9ye3FKeumy?!Oosf(hWPvF|y^tlVmC14Udh91q^$ z<)#m2abqLa_E7-i;Y7on^Iya630z{%*%><-Ht;C=?d!KXR=6xO|B!q;lx)!MQ@Z!s z{U*ot`*f*ZdkMjTCPjLIlz=HM;>H8U$~M}L31owqEu`ML7btx-5r`=>FE)9lsHBRc zR{PmVR3>YV#h>_k?HFn;C>|enNMk2ONqnAff%3NJwsiE8@4CdYnhs>{GYSjQpDEgw z|7@`IrJ_4Uy+elJeMmS~tHyor0Tn)LBGvLnxF zU z?u)~o=~6|z7xtd8nPEOXV_gI7;(j0=s_XgnGKHaZrQhjfXn1#}!A8Pb4wkp7ODeIf zZup_^w~qdAdcjA?ySplr(HDERFjK21yy*g4xoovDcic+!2OcteSGze{_c*e*$2hu4 ztceE-k*+T@dYVrzhTI-_<2l{;DbT5;Gko}}@BNdspqRcTtO<&5`04{Ujrp>L9`-k6 zsI7&NdG|Zb`m}(o7JgDFCdXEpS~2Q+==~`T^40521&yNl;x2W*-$uU2$ZiEG*whz_ zI(;2VxMishJ9}oZ8ywgyi~u8RAkU)u=z8AlFV4dh2u>5Y@?(cm(^AH5ovXiFw5xKB zX^lI)<~^Y`_x`ztV54Lqn1w#+c1A_sK|Ae}i}9>5N3pNKK9D^Kx2Q6&fys%7_epksqzXwTWN9 zqRyQN4kj?VGrU{mHZH+pkW-To*sFQ#GuG{Z6ed}Z+yMtbM*ih^gQ3O(*FG)VsbD$Dy*o7D1@ zOv1wPyCHt{r}EF8(F@^rQFu3cJ!I}|*CoP}I`38z2-W@hjGEzf{Sc90Uh%H3Jz?(# z5wn*{f6R>dj@)oRc6l6UoZmr)x;cIzzjf)AZ@+RWCB)V(PPWDGz}u}MG!LdDXn*XOPsVlN{3NHUBu3QG1GP?BsLJLQmbqG?54N;Obn7nhd_2wu3So8#E=_(}gy z`tRoF?h@lyIs+CA#F2N9Rgy$;LXhdp6>Obr3S0Xyd6RNxub07S0wsbQjUG%{E1`_3 zj$)2wbv(aBvtD8HeGqlO-}1pdR6=|sMYLo_>0Sv^{sI%DzlD1dL3vBS`d2CX^xS>X zy3aWD02F!8+c{ze1@mY*Tg5Ih<|?W<7WjF?Yi^%d+ap&Ise<>s^{=DMX`b!pzFRx5 zMWmzzP|iaM8b3C%&SNlB%6Bu{=f(Mks$~!L6XCjHOD6OV%dt73wO91iaHqVj=@sdO z)%YTvZDRPLkMFuF>k5~UGdbhjd7lJL=IoZ{XU1L+-F0|ea3@L{+J{)8H1d}~B!G?M z@C*@YU5HL8Rl4G9{)JJ`5&@}5^}HnR_Fl5Wboz&yoU3-suHDQ}Wm#?2&9cSo&ky*@=GT%!VsXys=*bnx?ilg{CvZce~bwDDM2)8W~{p Ji*=o&{{sw5H_!k8 literal 0 HcmV?d00001 From 2615f28aae7d9146688f64d0c692e47a0aeaffef Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Sun, 10 May 2020 22:56:22 +0100 Subject: [PATCH 29/54] Delete app.png --- apps/gallifr/app.png | Bin 4099 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/gallifr/app.png diff --git a/apps/gallifr/app.png b/apps/gallifr/app.png deleted file mode 100644 index 9bb50e3cdd899f759f6b1ad5fb3b31881d9f6ba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4099 zcmZ`+XIN9)(%zKN0|IJ-bUcEJCkYTCgrYQ&7AaB`1Oi3~B?(PJuTqqz6j2gH5i1}~ z>CyyLx=IkF1cHPjf`Wj6aD)1tbH4N3yY{p8ynE(-XJ$RK{_I3^j3JnBA0Ge!V55`z zmMn|d**sjVw=Mhkc$VRG(=pQlfYMa{O)QA@E#rF9(hLBCm+OMXnt9aJhs0x=CS|9M&xn)jdx@R!E8b-!%I4O#t#7aMRztE zaFYTB0QL*`({}!LW~OLYqBjhCp6G&uk-bSfDnOHrW3`~|e7{)yjm)|Zx?yT3mP4TlE? z2EqbWU_@UxxRScMIvk-4S62R$#rV@Nh~SSU|4H!M|0~J=<d@lCt=nZ+4&x@L-;U9(h$v_6hb%X7y^_ zSVYw(s@^SkTWcezXJvFrN1@&9 zNO1%|GkwV5yn1=fB;F;yt)lf+1CZK8MM!68HMU-5Ge5HHq1jy|F}-P{54HNoVl!hDTc&(N3`@XxX z>-HDREp({8X-13ZVKow39C2#=Z)2`fA*EmrG%Y~Jpy=vtYMoDMZr!b?L9oVA1n7Mq zl3R*RVH{Qz$nz5&mZyAeXT>kissI0IY`&;=U8!_p9*YT+T!etc8Y;?>Okv!odxVwUykvaX$sMRTX zK)f?%p_xWk|I@?Mxs~?BHBHvE!q?m;_=kNX=-jq4L-+~G<*BTxsy8={pEqV$*kFDl zdx5h-VCo??7V@Ekn48|^QXyB~XH}jXA1*Dh(98{*$}xnV+)Amu>+wQtcu@4E7+|*g zW3K#=6Xz4X*wutVH}$xndtkN5u+LmAzI8+a<>ob`YSP|dFqEcK%gBE3nK9Biqb@$256k?4C#G{0)1nqw6sFUEgwStj`+f{E)F(yz=7V2k?(% zF%2IaK~2fCZRPIKi9xHWXl6yg)ZCSJ5U#)yEwpUx1k&oP^ua(1DnL^CcSg8i4n^~> zf0FMdKUQeI<;-<3cVQ1nxei=&dPAU37hZ3rEpnkr87lP7Q`O~^h~l{K+Cfwrgm&Vx zqv&qJ^3F zJYJ?+_E+bAZD<*C=n1d0<(eG`+l1YR>n*SmCo2M41fO0MLp=(pJv94D-A8=LT(wLG zS(8SF5~=Vg=Ji(rrlN6L9n}qJ>zL=q9}PBWhsgzDvzf#6yBDJ^^7If6z}TxV-`v|% zjV688(6*H5>718Lx)~xvG=WPfZTpG?K~gK8tL#lcuZ+AhT~Zs|E_~l>4Nt!9d1Kh` zE(94gv%7)|Z?_y~4GZCu91nTnPmOz%>#GAVC_M9r9Dyo(IO9WsAsTAafAnUsN#ck1 z`PhX0rO~MGdZ�?NZ)PH_#6tX^q|QyuCaVR9CQ0LbPhL!7@rEnwgoNFtXuhb^nX5 z^nL!;j#*nwsr|=`D6Y`eHFeuj_tOLR`Xl{jTQajYwrr^Q8sebuEYWDYiRs0m52(DI8aw|{$b@}h4a*LqQ zJ4+F14bl~@yo!}k)N0XidRwDpQUw1(vC0~(6zET$tiI{iq+3!H;F{E)sHlBQD;k#4 zcG!x3n9NRjpkeWvEP4geME{u3@px?Ynj|<_I0o{{gdjE=7jk>XI#~GiN?UauUb@8L z;w1xTlE4P*I%oB8oZC-8X>q1D&g`1kV?bwjU97`V75pv?FHdjo`T9lv=@XheH;j8* z5wEclfG>GF-GWSQ@(yAwPg^uIUa+@92P`f~2WRkf_~m}LZIo^FRQobiG&g$|?!DQVdk-04C9ye3FKeumy?!Oosf(hWPvF|y^tlVmC14Udh91q^$ z<)#m2abqLa_E7-i;Y7on^Iya630z{%*%><-Ht;C=?d!KXR=6xO|B!q;lx)!MQ@Z!s z{U*ot`*f*ZdkMjTCPjLIlz=HM;>H8U$~M}L31owqEu`ML7btx-5r`=>FE)9lsHBRc zR{PmVR3>YV#h>_k?HFn;C>|enNMk2ONqnAff%3NJwsiE8@4CdYnhs>{GYSjQpDEgw z|7@`IrJ_4Uy+elJeMmS~tHyor0Tn)LBGvLnxF zU z?u)~o=~6|z7xtd8nPEOXV_gI7;(j0=s_XgnGKHaZrQhjfXn1#}!A8Pb4wkp7ODeIf zZup_^w~qdAdcjA?ySplr(HDERFjK21yy*g4xoovDcic+!2OcteSGze{_c*e*$2hu4 ztceE-k*+T@dYVrzhTI-_<2l{;DbT5;Gko}}@BNdspqRcTtO<&5`04{Ujrp>L9`-k6 zsI7&NdG|Zb`m}(o7JgDFCdXEpS~2Q+==~`T^40521&yNl;x2W*-$uU2$ZiEG*whz_ zI(;2VxMishJ9}oZ8ywgyi~u8RAkU)u=z8AlFV4dh2u>5Y@?(cm(^AH5ovXiFw5xKB zX^lI)<~^Y`_x`ztV54Lqn1w#+c1A_sK|Ae}i}9>5N3pNKK9D^Kx2Q6&fys%7_epksqzXwTWN9 zqRyQN4kj?VGrU{mHZH+pkW-To*sFQ#GuG{Z6ed}Z+yMtbM*ih^gQ3O(*FG)VsbD$Dy*o7D1@ zOv1wPyCHt{r}EF8(F@^rQFu3cJ!I}|*CoP}I`38z2-W@hjGEzf{Sc90Uh%H3Jz?(# z5wn*{f6R>dj@)oRc6l6UoZmr)x;cIzzjf)AZ@+RWCB)V(PPWDGz}u}MG!LdDXn*XOPsVlN{3NHUBu3QG1GP?BsLJLQmbqG?54N;Obn7nhd_2wu3So8#E=_(}gy z`tRoF?h@lyIs+CA#F2N9Rgy$;LXhdp6>Obr3S0Xyd6RNxub07S0wsbQjUG%{E1`_3 zj$)2wbv(aBvtD8HeGqlO-}1pdR6=|sMYLo_>0Sv^{sI%DzlD1dL3vBS`d2CX^xS>X zy3aWD02F!8+c{ze1@mY*Tg5Ih<|?W<7WjF?Yi^%d+ap&Ise<>s^{=DMX`b!pzFRx5 zMWmzzP|iaM8b3C%&SNlB%6Bu{=f(Mks$~!L6XCjHOD6OV%dt73wO91iaHqVj=@sdO z)%YTvZDRPLkMFuF>k5~UGdbhjd7lJL=IoZ{XU1L+-F0|ea3@L{+J{)8H1d}~B!G?M z@C*@YU5HL8Rl4G9{)JJ`5&@}5^}HnR_Fl5Wboz&yoU3-suHDQ}Wm#?2&9cSo&ky*@=GT%!VsXys=*bnx?ilg{CvZce~bwDDM2)8W~{p Ji*=o&{{sw5H_!k8 From 1d239f854163c74d1a86f0c4cf44cafbef18f094 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 00:12:59 +0100 Subject: [PATCH 30/54] Sanity check --- apps/gallifr/app-icon.js | 1 + apps/gallifr/app-icon.js. | 1 - apps/gallifr/{apps.js => app.js} | 0 package.json | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 apps/gallifr/app-icon.js delete mode 100644 apps/gallifr/app-icon.js. rename apps/gallifr/{apps.js => app.js} (100%) diff --git a/apps/gallifr/app-icon.js b/apps/gallifr/app-icon.js new file mode 100644 index 000000000..f0b27e1c8 --- /dev/null +++ b/apps/gallifr/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("MDAIAAAAAAAAAAAAAAAABgYAAAAAAAYGDAwSGBgYGBISBgAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAwMEhISGBgYHh4eHh4eHhgSDAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhgYEhIYGBgYEhIYHh4eHh4eHh4eHhgMAAAGAAAAAAAAAAAAAAAAAAAAAAAGAAASHh4eGBISEhISEhIYHh4eHh4eHh4eHh4eGAYABgAAAAAAAAAAAAAAAAAAAAYADBgeHh4eGBIYEhISEhIYHh4eHh4eHh4eHh4eHh4SAAYAAAAAAAAAAAAAAAAABgAMHh4eHh4eHhgSEhIYGBgYHh4eHh4eHh4eHh4eHh4eEgAGAAAAAAAAAAAAAAAGABIeHh4eHh4eHhgSGBgSEhIMEhgYHh4eHh4eHh4eHh4eHhIABgAAAAAAAAAAAAYAEh4eHh4eHh4eHh4SEgwAAAAAAAAAABIYHh4eHh4eHh4eHh4SAAYAAAAAAAAABgAMHh4eHh4eHh4eHhIGAAAMEhISGB4YEgAABhIeHh4eHh4eHh4eEgAGAAAAAAAAAAweHh4eHh4eHh4YDAAABhIYGBgYHh4eHhgGAAAMGB4eHh4eHh4eHhIABgAAAAAAABgeHh4eHh4eHhISGAAMGBgSEhIYHh4eHh4eDAASEgweHh4eHh4eHh4MAAAAAAYAEh4eHh4eHh4eBhIeDAAeHhISGBgYHh4eHh4eGAAGHhIAHh4eHh4eHh4YAAAAAAAGHh4eHh4eHh4GEh4YABgeHhgSEhIMEhgeHh4eHhgAEh4SBh4eHh4eHh4eEgAGBgAYHh4eHh4eHhISHh4MDB4eHhgSDAAAAAAMHh4eHh4AAB4eEgweHh4eHh4eHgAAAAYeHh4eHh4eGBIeHh4AEh4eHh4MABISGBgADB4eHh4SABgeHgwSHh4eHh4eHhIAABIeHh4eHh4eBh4eHhgAGB4eHhgADBgYHh4SABgeHh4YABgeHhgAHh4eHh4eHhgAABgeHh4eHh4SEh4eHhgAGB4eHhgAEhgYHh4YABgeHh4YABIeHh4MEh4eHh4eHh4MBh4eHh4eHh4MHh4eHhgAGB4eHhgAEhgYHh4YABgeHh4YABgeHh4YAB4eHh4eHh4SDB4eHh4eHhgSHh4eHhgAGB4eHh4ADBIYHh4MAB4eHh4YABgeHh4eDBIeHh4eHh4YEh4eHh4eHhIYHh4eHhgADB4eHh4YAAYSEgwAGB4eHh4SAAweHh4eEgYYHh4eHh4YGB4eHh4eHgwYHh4eHh4MAB4eHh4eGAYAAAYYHh4eHh4AEh4YGBgSAAAAABgeHh4eGB4eHh4eHgweHh4eHh4YABIeHh4eHh4YGB4eHh4eHhIAGB4eGAAAEgYSEgAYHh4eGB4eHh4eGBIeHh4eHh4eDAAYHh4eHh4eHh4eHh4eGAASHh4eGAAYHgwYHgYAHh4eGB4eHh4eGAweHh4eHh4MAAYAGB4eHh4eHh4eHh4YAAweHh4eEgAeHgwYHhIAGB4eHh4eHh4eGAweHh4eGAYMGB4MABIeHh4eHh4eHhIADB4eHh4eEgAeHgwYHhIAGB4eHh4eHh4eGAweHhgSEhgeHh4YAAAADBIYGBIMAAASHh4eHh4eGAAYHgweHgwGHh4eHh4eHh4eGAYeGBgeHh4eHh4MABgSDAAAAAAMEhgeHh4eHh4eHgwAEgwYEgAYHh4eGB4eHh4eGAAYHh4eHh4eHhgAGB4eHh4YGB4eHh4eHh4eHh4eHh4MAAAAABgeHh4YGB4eHh4YGAYSHh4eHh4eHgASHh4eHh4eHh4eHh4eHh4eHh4eHh4eEgwYHh4eHh4YEh4YEgwYHhIMHh4eHh4eDBIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eEhgeHh4eHh4SDBIAEh4eHh4AGB4eHh4YEh4eHh4eHh4YGB4eHh4eHh4eHh4eHh4eDB4eHh4eHh4MAAwYHh4eHh4SDB4eHhgGEhgYHh4YEhgSEhgYGB4eHh4eHh4eHh4SEh4eHh4eHh4GABgeHh4eHh4eABgeDAAAAAAABgwYHh4eHh4eGBIYHh4eHh4eHh4GHh4eHh4eHhgAABIeHh4eHh4eGAwGAAYAAAYGAAASHh4eHh4eHh4SEh4eHh4eHhIYHh4eHh4eHhIAAAAYHh4eHh4eGAAABgAAAAAAAAYAEh4eHh4eHh4eGBIeHh4eEhIeHh4eHh4eGAAABgASHh4eHh4eDAAGAAAAAAAAAAAGABgeHh4eHh4eHhIYHh4SBh4eHh4eHh4eEgAGAAYAGB4eHh4YAAAAAAAAAAAAAAAGABIeHh4eHh4eHh4SHhIGHh4eHh4eHh4YAAAAAAAABh4eHh4YAAYAAAAAAAAAAAAGAAweHh4eHh4eHh4YDBIeHh4eHh4eHh4GAAAAAAAGABIeHh4MAAAAAAAAAAAAAAAGAAYeHh4eHh4eHh4SGB4eHh4eHh4eHhIABgAAAAAABgASHhIABgAAAAAAAAAAAAAGAAweHh4eHh4eHh4eHh4eHh4eHh4eEgAGAAAAAAAAAAAADAYSAAAAAAAAAAAAAAAGABIeHh4eHh4eHh4eHh4eHh4eHh4YAAAAAAAAAAAAAAAAABIeBgAGAAAAAAAAAAAGABgeHh4eHh4eHh4eHh4eHh4eHhgAAAAAAAAAAAAAAAAAAAAYGAAAAAAAAAAAAAYADB4eHh4eHh4eHh4eHh4eHh4eEgAAAAAAAAAAAAAAAAAAAAAAEgwAAAAABgYGBgAAGB4eHh4eHh4eHh4eHh4eHh4SAAAAAAAAAAAAAAAAAAAAAAAAAAYGAAAAAAAAAAweHh4eHh4eHh4eHh4eHh4eGAYABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMDAwSGB4eHh4eHh4eHh4eHh4eHhgSAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMEhgeHh4eHh4eHh4eHh4eHh4YEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMEhgYHh4eHh4eGBgSDAYAAAAGAAAAAAAAAAAAAAAA")) \ No newline at end of file diff --git a/apps/gallifr/app-icon.js. b/apps/gallifr/app-icon.js. deleted file mode 100644 index 0b05da02e..000000000 --- a/apps/gallifr/app-icon.js. +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("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")); diff --git a/apps/gallifr/apps.js b/apps/gallifr/app.js similarity index 100% rename from apps/gallifr/apps.js rename to apps/gallifr/app.js diff --git a/package.json b/package.json index 24793d86a..34ee837d8 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,6 @@ "start": "npx http-server" }, "dependencies": { - "acorn": "^7.1.1" + "acorn": "^7.2.0" } } From 19cf9bde3a6aa6afe1fdac3c7ed1c5001c536a8a Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 00:18:40 +0100 Subject: [PATCH 31/54] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8695406de..1a3a63f68 100644 --- a/apps.json +++ b/apps.json @@ -1679,7 +1679,7 @@ { "id": "gallifr", "name": "Gallifreyan Chronometer", "shortName":"Gallifrey Clock", - "icon": "app.png", + "icon": "gallifr.png", "version":"0.01", "description": "A Gallifreyan clock. The dark and light green segments show the minutes, the black circle, the hour.", "tags": "clock", From 721cf11099f7e9cf473fd8c0dedcc487db256d2f Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 00:29:32 +0100 Subject: [PATCH 32/54] JSON formatting and description change --- apps.json | 1504 +++++++++++++++++++++++++++++------------------------ 1 file changed, 818 insertions(+), 686 deletions(-) diff --git a/apps.json b/apps.json index 1a3a63f68..25d1217fb 100644 --- a/apps.json +++ b/apps.json @@ -1,937 +1,1015 @@ [ - { "id": "boot", + { + "id": "boot", "name": "Bootloader", "icon": "bootloader.png", - "version":"0.16", + "version": "0.16", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "tags": "tool,system", - "type":"bootloader", + "type": "bootloader", "storage": [ - {"name":".boot0","url":"boot0.js"}, - {"name":".bootcde","url":"bootloader.js"} + { "name": ".boot0", "url": "boot0.js" }, + { "name": ".bootcde", "url": "bootloader.js" } ], - "sortorder" : -10 + "sortorder": -10 }, - { "id": "moonphase", + { + "id": "moonphase", "name": "Moonphase", "icon": "app.png", - "version":"0.02", + "version": "0.02", "description": "Shows current moon phase. Now with GPS function.", "tags": "", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"moonphase.app.js","url":"app.js"}, - {"name":"moonphase.img","url":"app-icon.js","evaluate":true} + { "name": "moonphase.app.js", "url": "app.js" }, + { "name": "moonphase.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "daysl", + { + "id": "daysl", "name": "Days left", "icon": "app.png", - "version":"0.03", + "version": "0.03", "description": "Shows you the days left until a certain date. Date can be set with a settings app and is written to a file.", "tags": "", - "allow_emulator":false, + "allow_emulator": false, "storage": [ - {"name":"daysl.app.js","url":"app.js"}, - {"name":"daysl.img","url":"app-icon.js","evaluate":true}, - {"name":"daysl.wid.js","url":"widget.js"} + { "name": "daysl.app.js", "url": "app.js" }, + { "name": "daysl.img", "url": "app-icon.js", "evaluate": true }, + { "name": "daysl.wid.js", "url": "widget.js" } ] }, - { "id": "launch", + { + "id": "launch", "name": "Default Launcher", - "shortName":"Launcher", + "shortName": "Launcher", "icon": "app.png", - "version":"0.03", + "version": "0.03", "description": "This is needed by Bangle.js to display a menu allowing you to choose your own applications. You can replace this with a customised launcher.", "tags": "tool,system,launcher", - "type":"launch", - "storage": [ - {"name":"launch.app.js","url":"app.js"} - ], - "sortorder" : -10 + "type": "launch", + "storage": [{ "name": "launch.app.js", "url": "app.js" }], + "sortorder": -10 }, - { "id": "about", + { + "id": "about", "name": "About", "icon": "app.png", - "version":"0.05", + "version": "0.05", "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", "tags": "tool,system", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"about.app.js","url":"app.js"}, - {"name":"about.img","url":"app-icon.js","evaluate":true} + { "name": "about.app.js", "url": "app.js" }, + { "name": "about.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "locale", + { + "id": "locale", "name": "Languages", "icon": "locale.png", - "version":"0.06", + "version": "0.06", "description": "Translations for different countries", "tags": "tool,system,locale,translate", "type": "locale", - "custom":"locale.html", - "storage": [ - {"name":"locale"} - ], - "sortorder" : -10 + "custom": "locale.html", + "storage": [{ "name": "locale" }], + "sortorder": -10 }, - { "id": "welcome", + { + "id": "welcome", "name": "Welcome", "icon": "app.png", - "version":"0.08", + "version": "0.08", "description": "Appears at first boot and explains how to use Bangle.js", "tags": "start,welcome", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"welcome.boot.js","url":"boot.js"}, - {"name":"welcome.app.js","url":"app.js"}, - {"name":"welcome.settings.js","url":"settings.js"}, - {"name":"welcome.img","url":"app-icon.js","evaluate":true} + { "name": "welcome.boot.js", "url": "boot.js" }, + { "name": "welcome.app.js", "url": "app.js" }, + { "name": "welcome.settings.js", "url": "settings.js" }, + { "name": "welcome.img", "url": "app-icon.js", "evaluate": true } ], - "data": [ - {"name":"welcome.json"} - ] + "data": [{ "name": "welcome.json" }] }, - { "id": "gbridge", + { + "id": "gbridge", "name": "Gadgetbridge", "icon": "app.png", - "version":"0.10", + "version": "0.10", "description": "The default notification handler for Gadgetbridge notifications from Android", "tags": "tool,system,android,widget", - "type":"widget", + "type": "widget", "storage": [ - {"name":"gbridge.settings.js","url":"settings.js"}, - {"name":"gbridge.img","url":"app-icon.js","evaluate":true}, - {"name":"gbridge.wid.js","url":"widget.js"} + { "name": "gbridge.settings.js", "url": "settings.js" }, + { "name": "gbridge.img", "url": "app-icon.js", "evaluate": true }, + { "name": "gbridge.wid.js", "url": "widget.js" } ] }, - { "id": "mclock", + { + "id": "mclock", "name": "Morphing Clock", "icon": "clock-morphing.png", - "version":"0.05", + "version": "0.05", "description": "7 segment clock that morphs between minutes and hours", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"mclock.app.js","url":"clock-morphing.js"}, - {"name":"mclock.img","url":"clock-morphing-icon.js","evaluate":true} + { "name": "mclock.app.js", "url": "clock-morphing.js" }, + { + "name": "mclock.img", + "url": "clock-morphing-icon.js", + "evaluate": true + } ], - "sortorder" : -9 + "sortorder": -9 }, - { "id": "setting", + { + "id": "setting", "name": "Settings", "icon": "settings.png", - "version":"0.19", + "version": "0.19", "description": "A menu for setting up Bangle.js", "tags": "tool,system", "readme": "README.md", "storage": [ - {"name":"setting.app.js","url":"settings.js"}, - {"name":"setting.boot.js","url":"boot.js"}, - {"name":"setting.img","url":"settings-icon.js","evaluate":true} + { "name": "setting.app.js", "url": "settings.js" }, + { "name": "setting.boot.js", "url": "boot.js" }, + { "name": "setting.img", "url": "settings-icon.js", "evaluate": true } ], - "sortorder" : -2 + "sortorder": -2 }, - { "id": "alarm", + { + "id": "alarm", "name": "Default Alarm", - "shortName":"Alarms", + "shortName": "Alarms", "icon": "app.png", - "version":"0.07", + "version": "0.07", "description": "Set and respond to alarms", "tags": "tool,alarm,widget", "storage": [ - {"name":"alarm.app.js","url":"app.js"}, - {"name":"alarm.boot.js","url":"boot.js"}, - {"name":"alarm.js","url":"alarm.js"}, - {"name":"alarm.img","url":"app-icon.js","evaluate":true}, - {"name":"alarm.wid.js","url":"widget.js"} + { "name": "alarm.app.js", "url": "app.js" }, + { "name": "alarm.boot.js", "url": "boot.js" }, + { "name": "alarm.js", "url": "alarm.js" }, + { "name": "alarm.img", "url": "app-icon.js", "evaluate": true }, + { "name": "alarm.wid.js", "url": "widget.js" } ], - "data": [ - {"name":"alarm.json"} - ] + "data": [{ "name": "alarm.json" }] }, - { "id": "wclock", + { + "id": "wclock", "name": "Word Clock", "icon": "clock-word.png", - "version":"0.02", + "version": "0.02", "description": "Display Time as Text", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"wclock.app.js","url":"clock-word.js"}, - {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true} + { "name": "wclock.app.js", "url": "clock-word.js" }, + { "name": "wclock.img", "url": "clock-word-icon.js", "evaluate": true } ] }, - { "id": "imgclock", + { + "id": "imgclock", "name": "Image background clock", - "shortName":"Image Clock", + "shortName": "Image Clock", "icon": "app.png", - "version":"0.04", + "version": "0.04", "description": "A clock with an image as a background", "tags": "clock", - "type" : "clock", + "type": "clock", "custom": "custom.html", "storage": [ - {"name":"imgclock.app.js","url":"app.js"}, - {"name":"imgclock.img","url":"app-icon.js","evaluate":true}, - {"name":"imgclock.face.img"}, - {"name":"imgclock.face.json"}, - {"name":"imgclock.face.bg","content":""} + { "name": "imgclock.app.js", "url": "app.js" }, + { "name": "imgclock.img", "url": "app-icon.js", "evaluate": true }, + { "name": "imgclock.face.img" }, + { "name": "imgclock.face.json" }, + { "name": "imgclock.face.bg", "content": "" } ] }, - { "id": "impwclock", + { + "id": "impwclock", "name": "Imprecise Word Clock", "icon": "clock-impword.png", - "version":"0.02", + "version": "0.02", "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"impwclock.app.js","url":"clock-impword.js"}, - {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true} + { "name": "impwclock.app.js", "url": "clock-impword.js" }, + { + "name": "impwclock.img", + "url": "clock-impword-icon.js", + "evaluate": true + } ] }, - { "id": "aclock", + { + "id": "aclock", "name": "Analog Clock", "icon": "clock-analog.png", "version": "0.13", "description": "An Analog Clock", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"aclock.app.js","url":"clock-analog.js"}, - {"name":"aclock.img","url":"clock-analog-icon.js","evaluate":true} + { "name": "aclock.app.js", "url": "clock-analog.js" }, + { "name": "aclock.img", "url": "clock-analog-icon.js", "evaluate": true } ] }, - { "id": "clock2x3", + { + "id": "clock2x3", "name": "2x3 Pixel Clock", "icon": "clock2x3.png", - "version":"0.04", + "version": "0.04", "description": "This is a simple clock using minimalist 2x3 pixel numerical digits", "tags": "clock", "type": "clock", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"clock2x3.app.js","url":"clock2x3-app.js"}, - {"name":"clock2x3.img","url":"clock2x3-icon.js","evaluate":true} + { "name": "clock2x3.app.js", "url": "clock2x3-app.js" }, + { "name": "clock2x3.img", "url": "clock2x3-icon.js", "evaluate": true } ] }, - { "id": "trex", + { + "id": "trex", "name": "T-Rex", "icon": "trex.png", - "version":"0.02", + "version": "0.02", "description": "T-Rex game in the style of Chrome's offline game", "tags": "game", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"trex.app.js","url":"trex.js"}, - {"name":"trex.img","url":"trex-icon.js","evaluate":true} + { "name": "trex.app.js", "url": "trex.js" }, + { "name": "trex.img", "url": "trex-icon.js", "evaluate": true } ] }, - { "id": "astroid", + { + "id": "astroid", "name": "Asteroids!", "icon": "asteroids.png", - "version":"0.02", + "version": "0.02", "description": "Retro asteroids game", "tags": "game", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"astroid.app.js","url":"asteroids.js"}, - {"name":"astroid.img","url":"asteroids-icon.js","evaluate":true} + { "name": "astroid.app.js", "url": "asteroids.js" }, + { "name": "astroid.img", "url": "asteroids-icon.js", "evaluate": true } ] }, - { "id": "clickms", + { + "id": "clickms", "name": "Click Master", "icon": "click-master.png", - "version":"0.01", + "version": "0.01", "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", "tags": "game", "storage": [ - {"name":"clickms.app.js","url":"click-master.js"}, - {"name":"clickms.img","url":"click-master-icon.js","evaluate":true} + { "name": "clickms.app.js", "url": "click-master.js" }, + { "name": "clickms.img", "url": "click-master-icon.js", "evaluate": true } ] }, - { "id": "horsey", + { + "id": "horsey", "name": "Horse Race!", "icon": "horse-race.png", - "version":"0.01", + "version": "0.01", "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", "tags": "game", "storage": [ - {"name":"horsey.app.js","url":"horse-race.js"}, - {"name":"horsey.img","url":"horse-race-icon.js","evaluate":true} + { "name": "horsey.app.js", "url": "horse-race.js" }, + { "name": "horsey.img", "url": "horse-race-icon.js", "evaluate": true } ] }, - { "id": "compass", + { + "id": "compass", "name": "Compass", "icon": "compass.png", - "version":"0.02", + "version": "0.02", "description": "Simple compass that points North", "tags": "tool,outdoors", "storage": [ - {"name":"compass.app.js","url":"compass.js"}, - {"name":"compass.img","url":"compass-icon.js","evaluate":true} + { "name": "compass.app.js", "url": "compass.js" }, + { "name": "compass.img", "url": "compass-icon.js", "evaluate": true } ] }, - { "id": "gpstime", + { + "id": "gpstime", "name": "GPS Time", "icon": "gpstime.png", - "version":"0.03", + "version": "0.03", "description": "Update the Bangle.js's clock based on the time from the GPS receiver", "tags": "tool,gps", "storage": [ - {"name":"gpstime.app.js","url":"gpstime.js"}, - {"name":"gpstime.img","url":"gpstime-icon.js","evaluate":true} + { "name": "gpstime.app.js", "url": "gpstime.js" }, + { "name": "gpstime.img", "url": "gpstime-icon.js", "evaluate": true } ] }, - { "id": "openloc", + { + "id": "openloc", "name": "Open Location / Plus Codes", "shortName": "Open Location", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "Convert your current GPS location to a series of characters", "tags": "tool,outdoors,gps", "storage": [ - {"name":"openloc.app.js","url":"app.js"}, - {"name":"openloc.img","url":"app-icon.js","evaluate":true} + { "name": "openloc.app.js", "url": "app.js" }, + { "name": "openloc.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "speedo", + { + "id": "speedo", "name": "Speedo", "icon": "speedo.png", - "version":"0.03", + "version": "0.03", "description": "Show the current speed according to the GPS", "tags": "tool,outdoors,gps", "storage": [ - {"name":"speedo.app.js","url":"speedo.js"}, - {"name":"speedo.img","url":"speedo-icon.js","evaluate":true} + { "name": "speedo.app.js", "url": "speedo.js" }, + { "name": "speedo.img", "url": "speedo-icon.js", "evaluate": true } ] }, - { "id": "gpsrec", + { + "id": "gpsrec", "name": "GPS Recorder", "icon": "app.png", - "version":"0.09", + "version": "0.09", "interface": "interface.html", "description": "Application that allows you to record a GPS track. Can run in background", "tags": "tool,outdoors,gps,widget", "storage": [ - {"name":"gpsrec.app.js","url":"app.js"}, - {"name":"gpsrec.img","url":"app-icon.js","evaluate":true}, - {"name":"gpsrec.wid.js","url":"widget.js"} + { "name": "gpsrec.app.js", "url": "app.js" }, + { "name": "gpsrec.img", "url": "app-icon.js", "evaluate": true }, + { "name": "gpsrec.wid.js", "url": "widget.js" } ], "data": [ - {"name":"gpsrec.json"}, - {"wildcard":".gpsrc?","storageFile": true} + { "name": "gpsrec.json" }, + { "wildcard": ".gpsrc?", "storageFile": true } ] }, - { "id": "gpsnav", + { + "id": "gpsnav", "name": "GPS Navigation", "icon": "icon.png", - "version":"0.01", + "version": "0.01", "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording", "tags": "tool,outdoors,gps", "readme": "README.md", "storage": [ - {"name":"gpsnav.app.js","url":"app.js"}, - {"name":"waypoints.json","url":"waypoints.json","evaluate":false}, - {"name":"gpsnav.img","url":"app-icon.js","evaluate":true} + { "name": "gpsnav.app.js", "url": "app.js" }, + { "name": "waypoints.json", "url": "waypoints.json", "evaluate": false }, + { "name": "gpsnav.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "heart", + { + "id": "heart", "name": "Heart Rate Recorder", "icon": "app.png", - "version":"0.02", + "version": "0.02", "interface": "interface.html", "description": "Application that allows you to record your heart rate. Can run in background", "tags": "tool,health,widget", "storage": [ - {"name":"heart.app.js","url":"app.js"}, - {"name":"heart.img","url":"app-icon.js","evaluate":true}, - {"name":"heart.wid.js","url":"widget.js"} + { "name": "heart.app.js", "url": "app.js" }, + { "name": "heart.img", "url": "app-icon.js", "evaluate": true }, + { "name": "heart.wid.js", "url": "widget.js" } ], "data": [ - {"name":"heart.json"}, - {"wildcard":".heart?","storageFile": true} + { "name": "heart.json" }, + { "wildcard": ".heart?", "storageFile": true } ] }, - { "id": "slevel", + { + "id": "slevel", "name": "Spirit Level", "icon": "spiritlevel.png", - "version":"0.01", + "version": "0.01", "description": "Show the current angle of the watch, so you can use it to make sure something is absolutely flat", "tags": "tool", "storage": [ - {"name":"slevel.app.js","url":"spiritlevel.js"}, - {"name":"slevel.img","url":"spiritlevel-icon.js","evaluate":true} + { "name": "slevel.app.js", "url": "spiritlevel.js" }, + { "name": "slevel.img", "url": "spiritlevel-icon.js", "evaluate": true } ] }, - { "id": "files", + { + "id": "files", "name": "App Manager", "icon": "files.png", - "version":"0.03", + "version": "0.03", "description": "Show currently installed apps, free space, and allow their deletion from the watch", "tags": "tool,system,files", "storage": [ - {"name":"files.app.js","url":"files.js"}, - {"name":"files.img","url":"files-icon.js","evaluate":true} + { "name": "files.app.js", "url": "files.js" }, + { "name": "files.img", "url": "files-icon.js", "evaluate": true } ] }, - { "id": "weather", + { + "id": "weather", "name": "Weather", "icon": "icon.png", - "version":"0.01", + "version": "0.01", "description": "Show Gadgetbridge weather report", "readme": "readme.md", "tags": "widget,outdoors", "storage": [ - {"name":"weather.app.js","url":"app.js"}, - {"name":"weather.wid.js","url":"widget.js"}, - {"name":"weather","url":"lib.js"}, - {"name":"weather.img","url":"icon.js","evaluate":true} + { "name": "weather.app.js", "url": "app.js" }, + { "name": "weather.wid.js", "url": "widget.js" }, + { "name": "weather", "url": "lib.js" }, + { "name": "weather.img", "url": "icon.js", "evaluate": true } ], - "data": [ - {"name": "weather.json"} - ] + "data": [{ "name": "weather.json" }] }, - { "id": "widbat", + { + "id": "widbat", "name": "Battery Level Widget", "icon": "widget.png", - "version":"0.05", + "version": "0.05", "description": "Show the current battery level and charging status in the top right of the clock", "tags": "widget,battery", - "type":"widget", - "storage": [ - {"name":"widbat.wid.js","url":"widget.js"} - ] + "type": "widget", + "storage": [{ "name": "widbat.wid.js", "url": "widget.js" }] }, - { "id": "widbatpc", + { + "id": "widbatpc", "name": "Battery Level Widget (with percentage)", "shortName": "Battery Widget", "icon": "widget.png", - "version":"0.11", + "version": "0.11", "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", "tags": "widget,battery", - "type":"widget", + "type": "widget", "storage": [ - {"name":"widbatpc.wid.js","url":"widget.js"}, - {"name":"widbatpc.settings.js","url":"settings.js"} + { "name": "widbatpc.wid.js", "url": "widget.js" }, + { "name": "widbatpc.settings.js", "url": "settings.js" } ], - "data": [ - {"name":"widbatpc.json"} - ] + "data": [{ "name": "widbatpc.json" }] }, - { "id": "widbt", + { + "id": "widbt", "name": "Bluetooth Widget", "icon": "widget.png", - "version":"0.04", + "version": "0.04", "description": "Show the current Bluetooth connection status in the top right of the clock", "tags": "widget,bluetooth", - "type":"widget", - "storage": [ - {"name":"widbt.wid.js","url":"widget.js"} - ] + "type": "widget", + "storage": [{ "name": "widbt.wid.js", "url": "widget.js" }] }, - { "id": "widram", + { + "id": "widram", "name": "RAM Widget", - "shortName":"RAM Widget", + "shortName": "RAM Widget", "icon": "widget.png", - "version":"0.01", + "version": "0.01", "description": "Display your Bangle's available RAM percentage in a widget", "tags": "widget", "type": "widget", - "storage": [ - {"name":"widram.wid.js","url":"widget.js"} - ] + "storage": [{ "name": "widram.wid.js", "url": "widget.js" }] }, - { "id": "hrm", + { + "id": "hrm", "name": "Heart Rate Monitor", "icon": "heartrate.png", - "version":"0.01", + "version": "0.01", "description": "Measure your current heart rate", "tags": "health", "storage": [ - {"name":"hrm.app.js","url":"heartrate.js"}, - {"name":"hrm.img","url":"heartrate-icon.js","evaluate":true} + { "name": "hrm.app.js", "url": "heartrate.js" }, + { "name": "hrm.img", "url": "heartrate-icon.js", "evaluate": true } ] }, - { "id": "widhrm", + { + "id": "widhrm", "name": "Simple Heart Rate widget", "icon": "widget.png", - "version":"0.03", + "version": "0.03", "description": "When the screen is on, the widget turns on the heart rate monitor and displays the current heart rate (or last known in grey). For this to work well you'll need at least a 15 second LCD Timeout.", "tags": "health,widget", "type": "widget", - "storage": [ - {"name":"widhrm.wid.js","url":"widget.js"} - ] + "storage": [{ "name": "widhrm.wid.js", "url": "widget.js" }] }, - { "id": "stetho", + { + "id": "stetho", "name": "Stethoscope", "icon": "stetho.png", - "version":"0.01", + "version": "0.01", "description": "Hear your heart rate", "tags": "health", "storage": [ - {"name":"stetho.app.js","url":"stetho.js"}, - {"name":"stetho.img","url":"stetho-icon.js","evaluate":true} + { "name": "stetho.app.js", "url": "stetho.js" }, + { "name": "stetho.img", "url": "stetho-icon.js", "evaluate": true } ] }, - { "id": "swatch", + { + "id": "swatch", "name": "Stopwatch", "icon": "stopwatch.png", - "version":"0.07", + "version": "0.07", "interface": "interface.html", "description": "Simple stopwatch with Lap Time logging to a JSON file", "tags": "health", - "allow_emulator":true, + "allow_emulator": true, "readme": "README.md", "storage": [ - {"name":"swatch.app.js","url":"stopwatch.js"}, - {"name":"swatch.img","url":"stopwatch-icon.js","evaluate":true} + { "name": "swatch.app.js", "url": "stopwatch.js" }, + { "name": "swatch.img", "url": "stopwatch-icon.js", "evaluate": true } ] }, - { "id": "hidmsic", + { + "id": "hidmsic", "name": "Bluetooth Music Controls", "shortName": "Music Control", "icon": "hid-music.png", - "version":"0.02", + "version": "0.02", "description": "Enable HID in settings, pair with your phone, then use this app to control music from your watch!", "tags": "bluetooth", "storage": [ - {"name":"hidmsic.app.js","url":"hid-music.js"}, - {"name":"hidmsic.img","url":"hid-music-icon.js","evaluate":true} + { "name": "hidmsic.app.js", "url": "hid-music.js" }, + { "name": "hidmsic.img", "url": "hid-music-icon.js", "evaluate": true } ] }, - { "id": "hidkbd", + { + "id": "hidkbd", "name": "Bluetooth Keyboard", "shortName": "Bluetooth Kbd", "icon": "hid-keyboard.png", - "version":"0.02", + "version": "0.02", "description": "Enable HID in settings, pair with your phone/PC, then use this app to control other apps", "tags": "bluetooth", "storage": [ - {"name":"hidkbd.app.js","url":"hid-keyboard.js"}, - {"name":"hidkbd.img","url":"hid-keyboard-icon.js","evaluate":true} + { "name": "hidkbd.app.js", "url": "hid-keyboard.js" }, + { "name": "hidkbd.img", "url": "hid-keyboard-icon.js", "evaluate": true } ] }, - { "id": "hidbkbd", + { + "id": "hidbkbd", "name": "Binary Bluetooth Keyboard", "shortName": "Binary BT Kbd", "icon": "hid-binary-keyboard.png", - "version":"0.02", + "version": "0.02", "description": "Enable HID in settings, pair with your phone/PC, then type messages using the onscreen keyboard by tapping repeatedly on the key you want", "tags": "bluetooth", "storage": [ - {"name":"hidbkbd.app.js","url":"hid-binary-keyboard.js"}, - {"name":"hidbkbd.img","url":"hid-binary-keyboard-icon.js","evaluate":true} + { "name": "hidbkbd.app.js", "url": "hid-binary-keyboard.js" }, + { + "name": "hidbkbd.img", + "url": "hid-binary-keyboard-icon.js", + "evaluate": true + } ] }, - { "id": "animals", + { + "id": "animals", "name": "Animals Game", "icon": "animals.png", - "version":"0.01", + "version": "0.01", "description": "Simple toddler's game - displays a different number of animals each time the screen is pressed", "tags": "game", "storage": [ - {"name":"animals.app.js","url":"animals.js"}, - {"name":"animals.img","url":"animals-icon.js","evaluate":true}, - {"name":"animals-snake.img","url":"animals-snake.js","evaluate":true}, - {"name":"animals-duck.img","url":"animals-duck.js","evaluate":true}, - {"name":"animals-swan.img","url":"animals-swan.js","evaluate":true}, - {"name":"animals-fox.img","url":"animals-fox.js","evaluate":true}, - {"name":"animals-camel.img","url":"animals-camel.js","evaluate":true}, - {"name":"animals-pig.img","url":"animals-pig.js","evaluate":true}, - {"name":"animals-sheep.img","url":"animals-sheep.js","evaluate":true}, - {"name":"animals-mouse.img","url":"animals-mouse.js","evaluate":true} + { "name": "animals.app.js", "url": "animals.js" }, + { "name": "animals.img", "url": "animals-icon.js", "evaluate": true }, + { + "name": "animals-snake.img", + "url": "animals-snake.js", + "evaluate": true + }, + { + "name": "animals-duck.img", + "url": "animals-duck.js", + "evaluate": true + }, + { + "name": "animals-swan.img", + "url": "animals-swan.js", + "evaluate": true + }, + { "name": "animals-fox.img", "url": "animals-fox.js", "evaluate": true }, + { + "name": "animals-camel.img", + "url": "animals-camel.js", + "evaluate": true + }, + { "name": "animals-pig.img", "url": "animals-pig.js", "evaluate": true }, + { + "name": "animals-sheep.img", + "url": "animals-sheep.js", + "evaluate": true + }, + { + "name": "animals-mouse.img", + "url": "animals-mouse.js", + "evaluate": true + } ] }, - { "id": "qrcode", + { + "id": "qrcode", "name": "Custom QR Code", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "Use this to upload a customised QR code to Bangle.js", "tags": "qrcode", "custom": "custom.html", "storage": [ - {"name":"qrcode.app.js"}, - {"name":"qrcode.img","url":"app-icon.js","evaluate":true} + { "name": "qrcode.app.js" }, + { "name": "qrcode.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "beer", + { + "id": "beer", "name": "Beer Compass", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "Uploads all the pubs in an area onto your watch, so it can always point you at the nearest one", "tags": "", "custom": "custom.html", "storage": [ - {"name":"beer.app.js"}, - {"name":"beer.img","url":"app-icon.js","evaluate":true} + { "name": "beer.app.js" }, + { "name": "beer.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "route", + { + "id": "route", "name": "Route Viewer", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "Upload a KML file of a route, and have your watch display a map with how far around it you are", "tags": "", "custom": "custom.html", "storage": [ - {"name":"route.app.js"}, - {"name":"route.img","url":"app-icon.js","evaluate":true} + { "name": "route.app.js" }, + { "name": "route.img", "url": "app-icon.js", "evaluate": true } ] }, { "id": "ncstart", "name": "NCEU Startup", "icon": "start.png", - "version":"0.05", + "version": "0.05", "description": "NodeConfEU 2019 'First Start' Sequence", "tags": "start,welcome", "storage": [ - {"name":"ncstart.app.js","url":"start.js"}, - {"name":"ncstart.boot.js","url":"boot.js"}, - {"name":"ncstart.settings.js","url":"settings.js"}, - {"name":"ncstart.img","url":"start-icon.js","evaluate":true}, - {"name":"nc-bangle.img","url":"start-bangle.js","evaluate":true}, - {"name":"nc-nceu.img","url":"start-nceu.js","evaluate":true}, - {"name":"nc-nfr.img","url":"start-nfr.js","evaluate":true}, - {"name":"nc-nodew.img","url":"start-nodew.js","evaluate":true}, - {"name":"nc-tf.img","url":"start-tf.js","evaluate":true} + { "name": "ncstart.app.js", "url": "start.js" }, + { "name": "ncstart.boot.js", "url": "boot.js" }, + { "name": "ncstart.settings.js", "url": "settings.js" }, + { "name": "ncstart.img", "url": "start-icon.js", "evaluate": true }, + { "name": "nc-bangle.img", "url": "start-bangle.js", "evaluate": true }, + { "name": "nc-nceu.img", "url": "start-nceu.js", "evaluate": true }, + { "name": "nc-nfr.img", "url": "start-nfr.js", "evaluate": true }, + { "name": "nc-nodew.img", "url": "start-nodew.js", "evaluate": true }, + { "name": "nc-tf.img", "url": "start-tf.js", "evaluate": true } ], - "data": [ - {"name":"ncstart.json"} - ] + "data": [{ "name": "ncstart.json" }] }, - { "id": "ncfrun", + { + "id": "ncfrun", "name": "NCEU 5K Fun Run", "icon": "nceu-funrun.png", - "version":"0.01", + "version": "0.01", "description": "Display a map of the NodeConf EU 2019 5K Fun Run route and your location on it", "tags": "health", "storage": [ - {"name":"ncfrun.app.js","url":"nceu-funrun.js"}, - {"name":"ncfrun.img","url":"nceu-funrun-icon.js","evaluate":true} + { "name": "ncfrun.app.js", "url": "nceu-funrun.js" }, + { "name": "ncfrun.img", "url": "nceu-funrun-icon.js", "evaluate": true } ] }, - { "id": "widnceu", + { + "id": "widnceu", "name": "NCEU Logo Widget", "icon": "widget.png", - "version":"0.02", + "version": "0.02", "description": "Show the NodeConf EU logo in the top left", "tags": "widget", - "type":"widget", - "storage": [ - {"name":"widnceu.wid.js","url":"widget.js"} - ] + "type": "widget", + "storage": [{ "name": "widnceu.wid.js", "url": "widget.js" }] }, - { "id": "sclock", + { + "id": "sclock", "name": "Simple Clock", "icon": "clock-simple.png", - "version":"0.04", + "version": "0.04", "description": "A Simple Digital Clock", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"sclock.app.js","url":"clock-simple.js"}, - {"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true} + { "name": "sclock.app.js", "url": "clock-simple.js" }, + { "name": "sclock.img", "url": "clock-simple-icon.js", "evaluate": true } ] }, - { "id": "dclock", + { + "id": "dclock", "name": "Dev Clock", "icon": "clock-dev.png", - "version":"0.09", + "version": "0.09", "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"dclock.app.js","url":"clock-dev.js"}, - {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true} + { "name": "dclock.app.js", "url": "clock-dev.js" }, + { "name": "dclock.img", "url": "clock-dev-icon.js", "evaluate": true } ] }, - { "id": "gesture", + { + "id": "gesture", "name": "Gesture Test", "icon": "gesture.png", - "version":"0.01", + "version": "0.01", "description": "BETA! Uploads a basic Tensorflow Gesture model, and then outputs each gesture as a message", "tags": "gesture,ai", - "type":"app", + "type": "app", "storage": [ - {"name":"gesture.app.js","url":"gesture.js"}, - {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, - {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, - {"name":"gesture.img","url":"gesture-icon.js","evaluate":true} + { "name": "gesture.app.js", "url": "gesture.js" }, + { "name": ".tfnames", "url": "gesture-tfnames.js", "evaluate": true }, + { "name": ".tfmodel", "url": "gesture-tfmodel.js", "evaluate": true }, + { "name": "gesture.img", "url": "gesture-icon.js", "evaluate": true } ] }, - { "id": "pparrot", + { + "id": "pparrot", "name": "Party Parrot", "icon": "party-parrot.png", - "version":"0.01", + "version": "0.01", "description": "Party with a parrot on your wrist", "tags": "party,parrot,lol", - "type":"app", - "allow_emulator":true, + "type": "app", + "allow_emulator": true, "storage": [ - {"name":"pparrot.app.js","url":"party-parrot.js"}, - {"name":"pparrot.img","url":"party-parrot-icon.js","evaluate":true} + { "name": "pparrot.app.js", "url": "party-parrot.js" }, + { "name": "pparrot.img", "url": "party-parrot-icon.js", "evaluate": true } ] }, - { "id": "hrings", + { + "id": "hrings", "name": "Hypno Rings", "icon": "hypno-rings.png", - "version":"0.01", + "version": "0.01", "description": "Experiment with trippy rings, press buttons for change", "tags": "rings,hypnosis,psychadelic", - "type":"app", - "allow_emulator":true, + "type": "app", + "allow_emulator": true, "storage": [ - {"name":"hrings.app.js","url":"hypno-rings.js"}, - {"name":"hrings.img","url":"hypno-rings-icon.js","evaluate":true} + { "name": "hrings.app.js", "url": "hypno-rings.js" }, + { "name": "hrings.img", "url": "hypno-rings-icon.js", "evaluate": true } ] }, - { "id": "morse", + { + "id": "morse", "name": "Morse Code", "icon": "morse-code.png", - "version":"0.01", + "version": "0.01", "description": "Learn morse code by hearing/seeing/feeling the code. Tap to toggle buzz!", "tags": "morse,sound,visual,input", - "type":"app", + "type": "app", "storage": [ - {"name":"morse.app.js","url":"morse-code.js"}, - {"name":"morse.img","url":"morse-code-icon.js","evaluate":true} + { "name": "morse.app.js", "url": "morse-code.js" }, + { "name": "morse.img", "url": "morse-code-icon.js", "evaluate": true } ] }, { "id": "blescan", "name": "BLE Scanner", "icon": "blescan.png", - "version":"0.01", + "version": "0.01", "description": "Scan for advertising BLE devices", - "tags" : "bluetooth", - "storage" : [ - {"name":"blescan.app.js","url":"blescan.js"}, - {"name":"blescan.img","url":"blescan-icon.js", "evaluate":true} + "tags": "bluetooth", + "storage": [ + { "name": "blescan.app.js", "url": "blescan.js" }, + { "name": "blescan.img", "url": "blescan-icon.js", "evaluate": true } ] }, - { "id": "mmonday", - "name": "Manic Monday Tone", - "icon": "manic-monday-icon.png", - "version":"0.02", - "description": "The Bangles make a comeback", - "tags": "sound", - "storage": [ - {"name":"mmonday.app.js","url":"manic-monday.js"}, - {"name":"mmonday.img","url":"manic-monday-icon.js","evaluate":true} - ] + { + "id": "mmonday", + "name": "Manic Monday Tone", + "icon": "manic-monday-icon.png", + "version": "0.02", + "description": "The Bangles make a comeback", + "tags": "sound", + "storage": [ + { "name": "mmonday.app.js", "url": "manic-monday.js" }, + { "name": "mmonday.img", "url": "manic-monday-icon.js", "evaluate": true } + ] }, - { "id": "jbells", + { + "id": "jbells", "name": "Jingle Bells", "icon": "jbells.png", - "version":"0.01", + "version": "0.01", "description": "Play Jingle Bells", "tags": "sound", - "type":"app", + "type": "app", "storage": [ - {"name":"jbells.app.js","url":"jbells.js"}, - {"name":"jbells.img","url":"jbells-icon.js","evaluate":true} + { "name": "jbells.app.js", "url": "jbells.js" }, + { "name": "jbells.img", "url": "jbells-icon.js", "evaluate": true } ] }, - { "id": "scolor", + { + "id": "scolor", "name": "Show Color", "icon": "show-color.png", - "version":"0.01", + "version": "0.01", "description": "Display all available Colors and Names", "tags": "tool", - "type":"app", - "allow_emulator":true, + "type": "app", + "allow_emulator": true, "storage": [ - {"name":"scolor.app.js","url":"show-color.js"}, - {"name":"scolor.img","url":"show-color-icon.js","evaluate":true} + { "name": "scolor.app.js", "url": "show-color.js" }, + { "name": "scolor.img", "url": "show-color-icon.js", "evaluate": true } ] }, - { "id": "miclock", + { + "id": "miclock", "name": "Mixed Clock", "icon": "clock-mixed.png", - "version":"0.04", + "version": "0.04", "description": "A mix of analog and digital Clock", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"miclock.app.js","url":"clock-mixed.js"}, - {"name":"miclock.img","url":"clock-mixed-icon.js","evaluate":true} + { "name": "miclock.app.js", "url": "clock-mixed.js" }, + { "name": "miclock.img", "url": "clock-mixed-icon.js", "evaluate": true } ] }, - { "id": "bclock", + { + "id": "bclock", "name": "Binary Clock", "icon": "clock-binary.png", - "version":"0.02", + "version": "0.02", "description": "A simple binary clock watch face", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"bclock.app.js","url":"clock-binary.js"}, - {"name":"bclock.img","url":"clock-binary-icon.js","evaluate":true} + { "name": "bclock.app.js", "url": "clock-binary.js" }, + { "name": "bclock.img", "url": "clock-binary-icon.js", "evaluate": true } ] }, - { "id": "clotris", + { + "id": "clotris", "name": "Clock-Tris", "icon": "clock-tris.png", - "version":"0.01", + "version": "0.01", "description": "A fully functional clone of a classic game of falling blocks", "tags": "game", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"clotris.app.js","url":"clock-tris.js"}, - {"name":"clotris.img","url":"clock-tris-icon.js","evaluate":true}, - {"name":".trishig","url":"clock-tris-high"} + { "name": "clotris.app.js", "url": "clock-tris.js" }, + { "name": "clotris.img", "url": "clock-tris-icon.js", "evaluate": true }, + { "name": ".trishig", "url": "clock-tris-high" } ] }, - { "id": "flappy", + { + "id": "flappy", "name": "Flappy Bird", "icon": "app.png", - "version":"0.04", + "version": "0.04", "description": "A Flappy Bird game clone", "tags": "game", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"flappy.app.js","url":"app.js"}, - {"name":"flappy.img","url":"app-icon.js","evaluate":true} + { "name": "flappy.app.js", "url": "app.js" }, + { "name": "flappy.img", "url": "app-icon.js", "evaluate": true } ] }, { "id": "gpsinfo", "name": "GPS Info", "icon": "gps-info.png", - "version":"0.03", + "version": "0.03", "description": "An application that displays information about altitude, lat/lon, satellites and time", "tags": "gps", "type": "app", "storage": [ - {"name":"gpsinfo.app.js","url": "gps-info.js"}, - {"name":"gpsinfo.img","url": "gps-info-icon.js","evaluate": true} + { "name": "gpsinfo.app.js", "url": "gps-info.js" }, + { "name": "gpsinfo.img", "url": "gps-info-icon.js", "evaluate": true } ] }, { "id": "pomodo", - "name":"Pomodoro", - "icon":"pomodoro.png", - "version":"0.01", + "name": "Pomodoro", + "icon": "pomodoro.png", + "version": "0.01", "description": "A simple pomodoro timer.", "tags": "pomodoro,cooking,tools", "type": "app", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"pomodo.app.js","url": "pomodoro.js"}, - {"name":"pomodo.img","url": "pomodoro-icon.js","evaluate": true} + { "name": "pomodo.app.js", "url": "pomodoro.js" }, + { "name": "pomodo.img", "url": "pomodoro-icon.js", "evaluate": true } ] }, - { "id": "blobclk", + { + "id": "blobclk", "name": "Large Digit Blob Clock", - "shortName" : "Blob Clock", + "shortName": "Blob Clock", "icon": "clock-blob.png", - "version":"0.03", + "version": "0.03", "description": "A clock with big digits", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"blobclk.app.js","url":"clock-blob.js"}, - {"name":"blobclk.img","url":"clock-blob-icon.js","evaluate":true} + { "name": "blobclk.app.js", "url": "clock-blob.js" }, + { "name": "blobclk.img", "url": "clock-blob-icon.js", "evaluate": true } ] }, - { "id": "boldclk", + { + "id": "boldclk", "name": "Bold Clock", "icon": "bold_clock.png", - "version":"0.02", + "version": "0.02", "description": "Simple, readable and practical clock", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"boldclk.app.js","url":"bold_clock.js"}, - {"name":"boldclk.img","url":"bold_clock-icon.js","evaluate":true} + { "name": "boldclk.app.js", "url": "bold_clock.js" }, + { "name": "boldclk.img", "url": "bold_clock-icon.js", "evaluate": true } ] }, - { "id": "widclk", + { + "id": "widclk", "name": "Digital clock widget", "icon": "widget.png", - "version":"0.04", + "version": "0.04", "description": "A simple digital clock widget", "tags": "widget,clock", - "type":"widget", - "storage": [ - {"name":"widclk.wid.js","url":"widget.js"} - ] + "type": "widget", + "storage": [{ "name": "widclk.wid.js", "url": "widget.js" }] }, - { "id": "widpedom", + { + "id": "widpedom", "name": "Pedometer widget", "icon": "widget.png", - "version":"0.10", + "version": "0.10", "description": "Daily pedometer widget", "tags": "widget", - "type":"widget", + "type": "widget", "storage": [ - {"name":"widpedom.wid.js","url":"widget.js"}, - {"name":"widpedom.settings.js","url":"settings.js"} + { "name": "widpedom.wid.js", "url": "widget.js" }, + { "name": "widpedom.settings.js", "url": "settings.js" } ] }, - { "id": "berlinc", + { + "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version":"0.02", + "version": "0.02", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"berlinc.app.js","url":"berlin-clock.js"}, - {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true} + { "name": "berlinc.app.js", "url": "berlin-clock.js" }, + { "name": "berlinc.img", "url": "berlin-clock-icon.js", "evaluate": true } ] }, - { "id": "ctrclk", + { + "id": "ctrclk", "name": "Centerclock", "icon": "app.png", - "version":"0.02", + "version": "0.02", "description": "Watch-centered digital 24h clock with date in dd.mm.yyyy format.", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"ctrclk.app.js","url":"app.js"}, - {"name":"ctrclk.img","url":"app-icon.js","evaluate":true} + { "name": "ctrclk.app.js", "url": "app.js" }, + { "name": "ctrclk.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "demoapp", + { + "id": "demoapp", "name": "Demo Loop", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "Simple demo app - displays Bangle.js, JS logo, graphics, and Bangle.js information", "tags": "", - "type":"app", - "allow_emulator":true, + "type": "app", + "allow_emulator": true, "storage": [ - {"name":"demoapp.app.js","url":"app.js"}, - {"name":"demoapp.img","url":"app-icon.js","evaluate":true} + { "name": "demoapp.app.js", "url": "app.js" }, + { "name": "demoapp.img", "url": "app-icon.js", "evaluate": true } ], - "sortorder" : -9 + "sortorder": -9 }, - { "id": "flagrse", + { + "id": "flagrse", "name": "Espruino Flag Raiser", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "App to send a command to another Espruino to cause it to raise a flag", "tags": "", "storage": [ - {"name":"flagrse.app.js","url":"app.js"}, - {"name":"flagrse.img","url":"app-icon.js","evaluate":true} + { "name": "flagrse.app.js", "url": "app.js" }, + { "name": "flagrse.img", "url": "app-icon.js", "evaluate": true } ] }, { @@ -941,202 +1019,233 @@ "version": "0.03", "description": "Pipboy themed clock", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"pipboy.app.js","url":"app.js"}, - {"name":"pipboy.img","url":"app-icon.js","evaluate":true} + { "name": "pipboy.app.js", "url": "app.js" }, + { "name": "pipboy.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "torch", + { + "id": "torch", "name": "Torch", - "shortName":"Torch", + "shortName": "Torch", "icon": "app.png", - "version":"0.02", + "version": "0.02", "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets", "tags": "tool,torch", "storage": [ - {"name":"torch.app.js","url":"app.js"}, - {"name":"torch.wid.js","url":"widget.js"}, - {"name":"torch.img","url":"app-icon.js","evaluate":true} + { "name": "torch.app.js", "url": "app.js" }, + { "name": "torch.wid.js", "url": "widget.js" }, + { "name": "torch.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "wohrm", + { + "id": "wohrm", "name": "Workout HRM", "icon": "app.png", - "version":"0.07", + "version": "0.07", "readme": "README.md", "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", "tags": "hrm,workout", "type": "app", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"wohrm.app.js","url":"app.js"}, - {"name":"wohrm.img","url":"app-icon.js","evaluate":true} + { "name": "wohrm.app.js", "url": "app.js" }, + { "name": "wohrm.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "widid", + { + "id": "widid", "name": "Bluetooth ID Widget", "icon": "widget.png", - "version":"0.02", + "version": "0.02", "description": "Display the last two tuple of your Bangle.js MAC address in the widget section. This is useful for figuring out which Bangle.js to connect to if you have more than one Bangle.js!", "tags": "widget,address,mac", - "type":"widget", - "storage": [ - {"name":"widid.wid.js","url":"widget.js"} - ] + "type": "widget", + "storage": [{ "name": "widid.wid.js", "url": "widget.js" }] }, { "id": "grocery", "name": "Grocery", "icon": "grocery.png", - "version":"0.01", + "version": "0.01", "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.", "tags": "tool,outdoors,shopping,list", "type": "app", - "custom":"grocery.html", + "custom": "grocery.html", "storage": [ - {"name":"grocery"}, - {"name":"grocery.app.js"}, - {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} + { "name": "grocery" }, + { "name": "grocery.app.js" }, + { "name": "grocery.img", "url": "grocery-icon.js", "evaluate": true } ] }, - { "id": "marioclock", + { + "id": "marioclock", "name": "Mario Clock", "icon": "marioclock.png", - "version":"0.12", + "version": "0.12", "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", "tags": "clock,mario,retro", "type": "clock", - "allow_emulator":true, + "allow_emulator": true, "readme": "README.md", "storage": [ - {"name":"marioclock.app.js","url":"marioclock-app.js"}, - {"name":"marioclock.img","url":"marioclock-icon.js","evaluate":true} + { "name": "marioclock.app.js", "url": "marioclock-app.js" }, + { + "name": "marioclock.img", + "url": "marioclock-icon.js", + "evaluate": true + } ] }, - { "id": "cliock", + { + "id": "cliock", "name": "Commandline-Clock", - "shortName":"CLI-Clock", + "shortName": "CLI-Clock", "icon": "app.png", - "version":"0.07", + "version": "0.07", "description": "Simple CLI-Styled Clock", "tags": "clock,cli,command,bash,shell", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"cliock.app.js","url":"app.js"}, - {"name":"cliock.img","url":"app-icon.js","evaluate":true} + { "name": "cliock.app.js", "url": "app.js" }, + { "name": "cliock.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "widver", + { + "id": "widver", "name": "Firmware Version Widget", "icon": "widget.png", - "version":"0.01", + "version": "0.01", "description": "Display the version of the installed firmware in the top widget section.", "tags": "widget,tool,system", - "type":"widget", - "storage": [ - {"name":"widver.wid.js","url":"widget.js"} - ] + "type": "widget", + "storage": [{ "name": "widver.wid.js", "url": "widget.js" }] }, - { "id": "barclock", + { + "id": "barclock", "name": "Bar Clock", "icon": "clock-bar.png", - "version":"0.05", + "version": "0.05", "description": "A simple digital clock showing seconds as a bar", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"barclock.app.js","url":"clock-bar.js"}, - {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true} + { "name": "barclock.app.js", "url": "clock-bar.js" }, + { "name": "barclock.img", "url": "clock-bar-icon.js", "evaluate": true } ] }, - { "id": "dotclock", + { + "id": "dotclock", "name": "Dot Clock", "icon": "clock-dot.png", - "version":"0.01", + "version": "0.01", "description": "A Minimal Dot Analog Clock", "tags": "clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"dotclock.app.js","url":"clock-dot.js"}, - {"name":"dotclock.img","url":"clock-dot-icon.js","evaluate":true} + { "name": "dotclock.app.js", "url": "clock-dot.js" }, + { "name": "dotclock.img", "url": "clock-dot-icon.js", "evaluate": true } ] }, - { "id": "widtbat", + { + "id": "widtbat", "name": "Tiny Battery Widget", "icon": "widget.png", - "version":"0.01", + "version": "0.01", "description": "Tiny blueish battery widget, vibs and changes level color when charging", "tags": "widget,tool,system", - "type":"widget", - "storage": [ - {"name":"widtbat.wid.js","url":"widget.js"} - ] + "type": "widget", + "storage": [{ "name": "widtbat.wid.js", "url": "widget.js" }] }, - { "id": "chrono", + { + "id": "chrono", "name": "Chrono", - "shortName":"Chrono", + "shortName": "Chrono", "icon": "chrono.png", - "version":"0.01", + "version": "0.01", "description": "Single click BTN1 to add 5 minutes. Single click BTN2 to add 30 seconds. Single click BTN3 to add 5 seconds. Tap to pause or play to timer. Double click BTN1 to reset. When timer finishes the watch vibrates.", "tags": "Tools", "storage": [ - {"name":"chrono.app.js","url":"chrono.js"}, - {"name":"chrono.img","url":"chrono-icon.js","evaluate":true} + { "name": "chrono.app.js", "url": "chrono.js" }, + { "name": "chrono.img", "url": "chrono-icon.js", "evaluate": true } ] }, - { "id": "astrocalc", + { + "id": "astrocalc", "name": "Astrocalc", "icon": "astrocalc.png", - "version":"0.02", + "version": "0.02", "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.", "tags": "app,sun,moon,cycles,tool,outdoors", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"astrocalc.app.js","url":"astrocalc-app.js"}, - {"name":"suncalc.js","url":"suncalc.js"}, - {"name":"astrocalc.img","url":"astrocalc-icon.js","evaluate":true}, - {"name":"first-quarter.img","url":"first-quarter-icon.js","evaluate":true}, - {"name":"last-quarter.img","url":"last-quarter-icon.js","evaluate":true}, - {"name":"waning-crescent.img","url":"waning-crescent-icon.js","evaluate":true}, - {"name":"waning-gibbous.img","url":"waning-gibbous-icon.js","evaluate":true}, - {"name":"full.img","url":"full-icon.js","evaluate":true}, - {"name":"new.img","url":"new-icon.js","evaluate":true}, - {"name":"waxing-gibbous.img","url":"waxing-gibbous-icon.js","evaluate":true}, - {"name":"waxing-crescent.img","url":"waxing-crescent-icon.js","evaluate":true} + { "name": "astrocalc.app.js", "url": "astrocalc-app.js" }, + { "name": "suncalc.js", "url": "suncalc.js" }, + { "name": "astrocalc.img", "url": "astrocalc-icon.js", "evaluate": true }, + { + "name": "first-quarter.img", + "url": "first-quarter-icon.js", + "evaluate": true + }, + { + "name": "last-quarter.img", + "url": "last-quarter-icon.js", + "evaluate": true + }, + { + "name": "waning-crescent.img", + "url": "waning-crescent-icon.js", + "evaluate": true + }, + { + "name": "waning-gibbous.img", + "url": "waning-gibbous-icon.js", + "evaluate": true + }, + { "name": "full.img", "url": "full-icon.js", "evaluate": true }, + { "name": "new.img", "url": "new-icon.js", "evaluate": true }, + { + "name": "waxing-gibbous.img", + "url": "waxing-gibbous-icon.js", + "evaluate": true + }, + { + "name": "waxing-crescent.img", + "url": "waxing-crescent-icon.js", + "evaluate": true + } ] }, - { "id": "widhwt", + { + "id": "widhwt", "name": "Hand Wash Timer", "icon": "widget.png", - "version":"0.01", + "version": "0.01", "description": "Swipe your wrist over the watch face to start your personal Bangle.js hand wash timer for 35 sec. Start washing after the short buzz and stop after the long buzz.", "tags": "widget,tool", - "type":"widget", - "storage": [ - {"name":"widhwt.wid.js","url":"widget.js"} - ] + "type": "widget", + "storage": [{ "name": "widhwt.wid.js", "url": "widget.js" }] }, - { "id": "toucher", + { + "id": "toucher", "name": "Touch Launcher", - "shortName":"Toucher", + "shortName": "Toucher", "icon": "app.png", - "version":"0.06", + "version": "0.06", "description": "Touch enable left to right launcher.", "tags": "tool,system,launcher", - "type":"launch", - "data": [ - {"name":"toucher.json"} - ], + "type": "launch", + "data": [{ "name": "toucher.json" }], "storage": [ - {"name":"toucher.app.js","url":"app.js"}, - {"name":"toucher.settings.js","url":"settings.js"} + { "name": "toucher.app.js", "url": "app.js" }, + { "name": "toucher.settings.js", "url": "settings.js" } ], - "sortorder" : -10 + "sortorder": -10 }, { "id": "balltastic", @@ -1147,9 +1256,9 @@ "tags": "game,fun", "type": "app", "storage": [ - {"name":"balltastic.app.js","url":"app.js"}, - {"name":"balltastic.img","url":"app-icon.js","evaluate":true} - ] + { "name": "balltastic.app.js", "url": "app.js" }, + { "name": "balltastic.img", "url": "app-icon.js", "evaluate": true } + ] }, { "id": "rpgdice", @@ -1161,22 +1270,22 @@ "type": "app", "allow_emulator": true, "storage": [ - {"name":"rpgdice.app.js","url": "app.js"}, - {"name":"rpgdice.img","url": "app-icon.js","evaluate":true} + { "name": "rpgdice.app.js", "url": "app.js" }, + { "name": "rpgdice.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "widmp", + { + "id": "widmp", "name": "Moon Phase Widget", "icon": "widget.png", - "version":"0.01", + "version": "0.01", "description": "Display the current moon phase in blueish for the northern hemisphere in eight phases", "tags": "widget,tools", - "type":"widget", - "storage": [ - {"name":"widmp.wid.js","url":"widget.js"} - ] + "type": "widget", + "storage": [{ "name": "widmp.wid.js", "url": "widget.js" }] }, - { "id": "minionclk", + { + "id": "minionclk", "name": "Minion clock", "icon": "minionclk.png", "version": "0.02", @@ -1185,171 +1294,183 @@ "type": "clock", "allow_emulator": true, "storage": [ - {"name":"minionclk.app.js","url":"app.js"}, - {"name":"minionclk.img","url":"app-icon.js","evaluate":true} + { "name": "minionclk.app.js", "url": "app.js" }, + { "name": "minionclk.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "openstmap", + { + "id": "openstmap", "name": "OpenStreetMap", - "shortName":"OpenStMap", + "shortName": "OpenStMap", "icon": "app.png", - "version":"0.03", + "version": "0.03", "description": "[BETA] Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are", "tags": "outdoors,gps", "custom": "custom.html", "storage": [ - {"name":"openstmap.app.js","url":"app.js"}, - {"name":"openstmap.img","url":"app-icon.js","evaluate":true} + { "name": "openstmap.app.js", "url": "app.js" }, + { "name": "openstmap.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "activepedom", + { + "id": "activepedom", "name": "Active Pedometer", - "shortName":"Active Pedometer", + "shortName": "Active Pedometer", "icon": "app.png", - "version":"0.04", + "version": "0.04", "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.", "tags": "outdoors,widget", - "readme": "README.md", + "readme": "README.md", "storage": [ - {"name":"activepedom.wid.js","url":"widget.js"}, - {"name":"activepedom.settings.js","url":"settings.js"}, - {"name":"activepedom.img","url":"app-icon.js","evaluate":true}, - {"name":"activepedom.app.js","url":"app.js"} + { "name": "activepedom.wid.js", "url": "widget.js" }, + { "name": "activepedom.settings.js", "url": "settings.js" }, + { "name": "activepedom.img", "url": "app-icon.js", "evaluate": true }, + { "name": "activepedom.app.js", "url": "app.js" } ] }, - { "id": "chronowid", + { + "id": "chronowid", "name": "Chrono Widget", - "shortName":"Chrono Widget", + "shortName": "Chrono Widget", "icon": "app.png", - "version":"0.03", + "version": "0.03", "description": "Chronometer (timer) which runs as widget.", "tags": "tools,widget", - "readme": "README.md", + "readme": "README.md", "storage": [ - {"name":"chronowid.wid.js","url":"widget.js"}, - {"name":"chronowid.app.js","url":"app.js"}, - {"name":"chronowid.img","url":"app-icon.js","evaluate":true} + { "name": "chronowid.wid.js", "url": "widget.js" }, + { "name": "chronowid.app.js", "url": "app.js" }, + { "name": "chronowid.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "tabata", + { + "id": "tabata", "name": "Tabata", "shortName": "Tabata - Control High-Intensity Interval Training", "icon": "tabata.png", - "version":"0.01", + "version": "0.01", "description": "Control high-intensity interval training (according to tabata: https://en.wikipedia.org/wiki/Tabata_method).", "tags": "workout,health", "storage": [ - {"name":"tabata.app.js","url":"tabata.js"}, - {"name":"tabata.img","url":"tabata-icon.js","evaluate":true} + { "name": "tabata.app.js", "url": "tabata.js" }, + { "name": "tabata.img", "url": "tabata-icon.js", "evaluate": true } ] }, - { "id": "custom", + { + "id": "custom", "name": "Custom Boot Code ", "icon": "custom.png", - "version":"0.01", + "version": "0.01", "description": "Add code you want to run at boot time", "tags": "tool,system", "type": "bootloader", - "custom":"custom.html", + "custom": "custom.html", + "storage": [{ "name": "custom" }] + }, + { + "id": "devstopwatch", + "name": "Dev Stopwatch", + "shortName": "Dev Stopwatch", + "icon": "app.png", + "version": "0.01", + "description": "Stopwatch with 5 laps supported (cyclically replaced)", + "tags": "stopwatch, chrono, timer, chronometer", + "allow_emulator": true, "storage": [ - {"name":"custom"} + { "name": "devstopwatch.app.js", "url": "app.js" }, + { "name": "devstopwatch.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "devstopwatch", - "name": "Dev Stopwatch", - "shortName":"Dev Stopwatch", - "icon": "app.png", - "version":"0.01", - "description": "Stopwatch with 5 laps supported (cyclically replaced)", - "tags": "stopwatch, chrono, timer, chronometer", - "allow_emulator":true, - "storage": [ - {"name":"devstopwatch.app.js","url":"app.js"}, - {"name":"devstopwatch.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "batchart", + { + "id": "batchart", "name": "Battery Chart", - "shortName":"Battery Chart", + "shortName": "Battery Chart", "icon": "app.png", - "version":"0.09", + "version": "0.09", "readme": "README.md", "description": "A widget and an app for recording and visualizing battery percentage over time.", "tags": "app,widget,battery,time,record,chart,tool", "storage": [ - {"name":"batchart.wid.js","url":"widget.js"}, - {"name":"batchart.app.js","url":"app.js"}, - {"name":"batchart.img","url":"app-icon.js","evaluate":true} + { "name": "batchart.wid.js", "url": "widget.js" }, + { "name": "batchart.app.js", "url": "app.js" }, + { "name": "batchart.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "nato", + { + "id": "nato", "name": "NATO Alphabet", - "shortName" : "NATOAlphabet", + "shortName": "NATOAlphabet", "icon": "nato.png", - "version":"0.01", + "version": "0.01", "type": "app", "description": "Learn the NATO Phonetic alphabet plus some numbers.", "tags": "app,learn,visual", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"nato.app.js","url":"nato.js"}, - {"name":"nato.img","url":"nato-icon.js","evaluate":true} + { "name": "nato.app.js", "url": "nato.js" }, + { "name": "nato.img", "url": "nato-icon.js", "evaluate": true } ] }, - { "id": "numerals", + { + "id": "numerals", "name": "Numerals Clock", "shortName": "Numerals Clock", "icon": "numerals.png", - "version":"0.05", + "version": "0.05", "description": "A simple big numerals clock", "tags": "numerals,clock", - "type":"clock", - "allow_emulator":true, + "type": "clock", + "allow_emulator": true, "storage": [ - {"name":"numerals.app.js","url":"numerals.app.js"}, - {"name":"numerals.img","url":"numerals-icon.js","evaluate":true}, - {"name":"numerals.settings.js","url":"numerals.settings.js"} + { "name": "numerals.app.js", "url": "numerals.app.js" }, + { "name": "numerals.img", "url": "numerals-icon.js", "evaluate": true }, + { "name": "numerals.settings.js", "url": "numerals.settings.js" } ], - "data":[ - {"name":"numerals.json"} - ] + "data": [{ "name": "numerals.json" }] }, - { "id": "bledetect", + { + "id": "bledetect", "name": "BLE Detector", - "shortName":"BLE Detector", + "shortName": "BLE Detector", "icon": "bledetect.png", - "version":"0.02", + "version": "0.02", "description": "Detect BLE devices and show some informations.", "tags": "app,bluetooth,tool", "readme": "README.md", "storage": [ - {"name":"bledetect.app.js","url":"bledetect.js"}, - {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true} + { "name": "bledetect.app.js", "url": "bledetect.js" }, + { "name": "bledetect.img", "url": "bledetect-icon.js", "evaluate": true } ] }, - { "id": "snake", + { + "id": "snake", "name": "Snake", - "shortName":"Snake", + "shortName": "Snake", "icon": "snake.png", - "version":"0.02", + "version": "0.02", "description": "The classic snake game. Eat apples and don't bite your tail.", "tags": "game,fun", "readme": "README.md", "storage": [ - {"name":"snake.app.js","url":"snake.js"}, - {"name":"snake.img","url":"snake-icon.js","evaluate":true} + { "name": "snake.app.js", "url": "snake.js" }, + { "name": "snake.img", "url": "snake-icon.js", "evaluate": true } ] }, - { "id": "calculator", + { + "id": "calculator", "name": "Calculator", - "shortName":"Calculator", + "shortName": "Calculator", "icon": "calculator.png", - "version":"0.02", + "version": "0.02", "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", "tags": "app,tool", "storage": [ - {"name":"calculator.app.js","url":"app.js"}, - {"name":"calculator.img","url":"calculator-icon.js","evaluate":true} + { "name": "calculator.app.js", "url": "app.js" }, + { + "name": "calculator.img", + "url": "calculator-icon.js", + "evaluate": true + } ] }, { @@ -1378,7 +1499,7 @@ "id": "buffgym", "name": "BuffGym", "icon": "buffgym.png", - "version":"0.02", + "version": "0.02", "description": "BuffGym is the famous 5x5 workout program for the BangleJS", "tags": "tool,outdoors,gym,exercise", "type": "app", @@ -1386,14 +1507,17 @@ "allow_emulator": false, "readme": "README.md", "storage": [ - {"name":"buffgym.app.js", "url": "buffgym.app.js"}, - {"name":"buffgym-set.js","url":"buffgym-set.js"}, - {"name":"buffgym-exercise.js","url":"buffgym-exercise.js"}, - {"name":"buffgym-workout.js","url":"buffgym-workout.js"}, - {"name":"buffgym-workout-a.json","url":"buffgym-workout-a.json"}, - {"name":"buffgym-workout-b.json","url":"buffgym-workout-b.json"}, - {"name":"buffgym-workout-index.json","url":"buffgym-workout-index.json"}, - {"name":"buffgym.img","url":"buffgym-icon.js","evaluate":true} + { "name": "buffgym.app.js", "url": "buffgym.app.js" }, + { "name": "buffgym-set.js", "url": "buffgym-set.js" }, + { "name": "buffgym-exercise.js", "url": "buffgym-exercise.js" }, + { "name": "buffgym-workout.js", "url": "buffgym-workout.js" }, + { "name": "buffgym-workout-a.json", "url": "buffgym-workout-a.json" }, + { "name": "buffgym-workout-b.json", "url": "buffgym-workout-b.json" }, + { + "name": "buffgym-workout-index.json", + "url": "buffgym-workout-index.json" + }, + { "name": "buffgym.img", "url": "buffgym-icon.js", "evaluate": true } ] }, { @@ -1438,73 +1562,78 @@ } ] }, - { "id": "blackjack", + { + "id": "blackjack", "name": "Black Jack game", - "shortName":"Black Jack game", + "shortName": "Black Jack game", "icon": "blackjack.png", - "version":"0.01", + "version": "0.01", "description": "Simple implementation of card game Black Jack", "tags": "game", - "allow_emulator":true, + "allow_emulator": true, "storage": [ - {"name":"blackjack.app.js","url":"blackjack.app.js"}, - {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true} + { "name": "blackjack.app.js", "url": "blackjack.app.js" }, + { "name": "blackjack.img", "url": "blackjack-icon.js", "evaluate": true } ] }, - { "id": "hidcam", + { + "id": "hidcam", "name": "Camera shutter", - "shortName":"Cam shutter", + "shortName": "Cam shutter", "icon": "app.png", - "version":"0.03", + "version": "0.03", "description": "Enable HID, connect to your phone, start your camera and trigger the shot on your Bangle", "readme": "README.md", "tags": "bluetooth,tool", "storage": [ - {"name":"hidcam.app.js","url":"app.js"}, - {"name":"hidcam.img","url":"app-icon.js","evaluate":true} + { "name": "hidcam.app.js", "url": "app.js" }, + { "name": "hidcam.img", "url": "app-icon.js", "evaluate": true } ] }, { "id": "rclock", "name": "Round clock with seconds, minutes and date", - "shortName":"Round Clock", + "shortName": "Round Clock", "icon": "app.png", - "version":"0.02", + "version": "0.02", "description": "Designed round clock with ticks for minutes and seconds and heart rate indication", "tags": "clock", "type": "clock", "storage": [ - {"name":"rclock.app.js","url":"rclock.app.js"}, - {"name":"rclock.img","url":"app-icon.js","evaluate":true} + { "name": "rclock.app.js", "url": "rclock.app.js" }, + { "name": "rclock.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "hamloc", + { + "id": "hamloc", "name": "QTH Locator / Maidenhead Locator System", "shortName": "QTH Locator", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "Convert your current GPS location to the Maidenhead locator system used by HAM amateur radio operators", "tags": "tool,outdoors,gps", "readme": "README.md", "storage": [ - {"name":"hamloc.app.js","url":"app.js"}, - {"name":"hamloc.img","url":"app-icon.js","evaluate":true} + { "name": "hamloc.app.js", "url": "app.js" }, + { "name": "hamloc.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "osmpoi", + { + "id": "osmpoi", "name": "POI Compass", "icon": "app.png", - "version":"0.03", + "version": "0.03", "description": "Uploads all the points of interest in an area onto your watch, same as Beer Compass with more p.o.i.", "tags": "tool,outdoors,gps", "readme": "README.md", "custom": "custom.html", "storage": [ - {"name":"osmpoi.app.js"}, - {"name":"osmpoi.img","url":"app-icon.js","evaluate":true} + { "name": "osmpoi.app.js" }, + { "name": "osmpoi.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "pong", + { + "id": "pong", "name": "Pong", "shortName": "Pong", "icon": "pong.png", @@ -1515,11 +1644,12 @@ "allow_emulator": true, "readme": "README.md", "storage": [ - {"name":"pong.app.js","url":"app.js"}, - {"name":"pong.img","url":"app-icon.js","evaluate":true} + { "name": "pong.app.js", "url": "app.js" }, + { "name": "pong.img", "url": "app-icon.js", "evaluate": true } ] }, - { "id": "ballmaze", + { + "id": "ballmaze", "name": "Ball Maze", "icon": "icon.png", "version": "0.01", @@ -1528,12 +1658,10 @@ "tags": "game", "type": "app", "storage": [ - {"name": "ballmaze.app.js","url":"app.js"}, - {"name": "ballmaze.img","url":"icon.js","evaluate": true} + { "name": "ballmaze.app.js", "url": "app.js" }, + { "name": "ballmaze.img", "url": "icon.js", "evaluate": true } ], - "data": [ - {"name": "ballmaze.json"} - ] + "data": [{ "name": "ballmaze.json" }] }, { "id": "calendar", @@ -1556,16 +1684,17 @@ } ] }, - { "id": "hidjoystick", + { + "id": "hidjoystick", "name": "Bluetooth Joystick", "shortName": "Joystick", "icon": "app.png", - "version":"0.01", + "version": "0.01", "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.", "tags": "bluetooth", "storage": [ - {"name":"hidjoystick.app.js","url":"app.js"}, - {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} + { "name": "hidjoystick.app.js", "url": "app.js" }, + { "name": "hidjoystick.img", "url": "app-icon.js", "evaluate": true } ] }, { @@ -1599,22 +1728,23 @@ } ] }, - { "id": "smtswch", + { + "id": "smtswch", "name": "Smart Switch", - "shortName":"Smart Switch", + "shortName": "Smart Switch", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "Using EspruinoHub, control your smart devices on and off via Bluetooth Low Energy!", "tags": "bluetooth,btle,smart,switch", "type": "app", "readme": "README.md", "storage": [ - {"name":"smtswch.app.js","url":"app.js"}, - {"name":"smtswch.img","url":"app-icon.js","evaluate":true}, - {"name":"light-on.img","url":"light-on.js","evaluate":true}, - {"name":"light-off.img","url":"light-off.js","evaluate":true}, - {"name":"switch-on.img","url":"switch-on.js","evaluate":true}, - {"name":"switch-off.img","url":"switch-off.js","evaluate":true} + { "name": "smtswch.app.js", "url": "app.js" }, + { "name": "smtswch.img", "url": "app-icon.js", "evaluate": true }, + { "name": "light-on.img", "url": "light-on.js", "evaluate": true }, + { "name": "light-off.img", "url": "light-off.js", "evaluate": true }, + { "name": "switch-on.img", "url": "switch-on.js", "evaluate": true }, + { "name": "switch-off.img", "url": "switch-off.js", "evaluate": true } ] }, { @@ -1652,41 +1782,43 @@ "id": "beebclock", "name": "Beeb Clock", "icon": "beebclock.png", - "version":"0.02", + "version": "0.02", "description": "Clock face that may be coincidentally familiar to BBC viewers", "tags": "clock", "type": "clock", "allow_emulator": true, "storage": [ - {"name":"beebclock.app.js","url":"beebclock.js"}, - {"name":"beebclock.img","url":"beebclock-icon.js","evaluate":true} + { "name": "beebclock.app.js", "url": "beebclock.js" }, + { "name": "beebclock.img", "url": "beebclock-icon.js", "evaluate": true } ] }, - { "id": "findphone", + { + "id": "findphone", "name": "Find Phone", - "shortName":"Find Phone", + "shortName": "Find Phone", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "Find your phone via Gadgetbridge. Click any button to let your phone ring. 📳", "tags": "tool,android", "readme": "README.md", "allow_emulator": true, "storage": [ - {"name":"findphone.app.js","url":"app.js"}, - {"name":"findphone.img","url":"app-icon.js","evaluate":true} + { "name": "findphone.app.js", "url": "app.js" }, + { "name": "findphone.img", "url": "app-icon.js", "evaluate": true } ] }, -{ "id": "gallifr", - "name": "Gallifreyan Chronometer", - "shortName":"Gallifrey Clock", - "icon": "gallifr.png", - "version":"0.01", - "description": "A Gallifreyan clock. The dark and light green segments show the minutes, the black circle, the hour.", - "tags": "clock", - "type": "clock", - "storage": [ - {"name":"gallifr.app.js","url":"app.js"}, - {"name":"gallifr.img","url":"app-icon.js","evaluate":true} - ] -} + { + "id": "gallifr", + "name": "Gallifreyan Chronometer", + "shortName": "Gallifrey Clock", + "icon": "gallifr.png", + "version": "0.01", + "description": "A Gallifreyan clock. The light pie segment shows the minutes, the black circle, the hour. The symbols on the dial read 'time' in Gallifreyan.", + "tags": "clock", + "type": "clock", + "storage": [ + { "name": "gallifr.app.js", "url": "app.js" }, + { "name": "gallifr.img", "url": "app-icon.js", "evaluate": true } + ] + } ] From f2df509f19eb48857a123d5bebcfdad0f2bab65b Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 00:31:22 +0100 Subject: [PATCH 33/54] Description change --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 25d1217fb..09833ab97 100644 --- a/apps.json +++ b/apps.json @@ -1813,7 +1813,7 @@ "shortName": "Gallifrey Clock", "icon": "gallifr.png", "version": "0.01", - "description": "A Gallifreyan clock. The light pie segment shows the minutes, the black circle, the hour. The symbols on the dial read 'time' in Gallifreyan.", + "description": "A Gallifreyan clock. The light pie segment shows the minutes, the black circle, the hour. The symbols on the dial spell time in Gallifreyan.", "tags": "clock", "type": "clock", "storage": [ From f9beb2f5cda59094eff5a0900e7cee8b8f8b7637 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 00:44:12 +0100 Subject: [PATCH 34/54] Added ChangeLog --- apps/gallifr/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/gallifr/ChangeLog diff --git a/apps/gallifr/ChangeLog b/apps/gallifr/ChangeLog new file mode 100644 index 000000000..c785cbd67 --- /dev/null +++ b/apps/gallifr/ChangeLog @@ -0,0 +1 @@ +0.01: First released version From 2cd43968602a7eb81baa3cd8c037412fd11511ac Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 01:29:27 +0100 Subject: [PATCH 35/54] Adding settings --- apps.json | 7 ++++++- apps/gallifr/settings.js | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 apps/gallifr/settings.js diff --git a/apps.json b/apps.json index 09833ab97..a75625325 100644 --- a/apps.json +++ b/apps.json @@ -1816,9 +1816,14 @@ "description": "A Gallifreyan clock. The light pie segment shows the minutes, the black circle, the hour. The symbols on the dial spell time in Gallifreyan.", "tags": "clock", "type": "clock", + "allow_emulator":true, "storage": [ { "name": "gallifr.app.js", "url": "app.js" }, - { "name": "gallifr.img", "url": "app-icon.js", "evaluate": true } + { "name": "gallifr.img", "url": "app-icon.js", "evaluate": true }, + { "name": "gallifr.settings.js", "url": "settings.js" } + ], + "data": [ + {"name":"app.json"} ] } ] diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js new file mode 100644 index 000000000..31f2cede8 --- /dev/null +++ b/apps/gallifr/settings.js @@ -0,0 +1,26 @@ +// make sure to enclose the function in parentheses +(function (back) { + let settings = require('Storage').readJSON('app.json',1)||{}; + let colours = ["green","red","blue"]; + let widgets = ["on","off"]; + function save(key, value) { + settings[key] = value; + require('Storage').write('app.json',settings); + } + const appMenu = { + '': {'title': 'Clock Settings'}, + '< Back': back, + 'Colour': { + value: 0|settings.colour, + min:0,max:2, + format: m=>colours[m], + onchange: (m) => {save('colour', m)} + 'Widgets': { + value: 0|settings.widgets, + min:0,max:1, + format: m=>widgets[m], + onchange: (m) => {save('widgets', m)} + } + }; + E.showMenu(appMenu) + }) \ No newline at end of file From cc71fc1dba03ec3159cfc3e39fa8be2496a22fe6 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 01:46:48 +0100 Subject: [PATCH 36/54] Menu function --- apps/gallifr/settings.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js index 31f2cede8..c2a8b892f 100644 --- a/apps/gallifr/settings.js +++ b/apps/gallifr/settings.js @@ -11,12 +11,13 @@ '': {'title': 'Clock Settings'}, '< Back': back, 'Colour': { - value: 0|settings.colour, + value: 0||settings.colour, min:0,max:2, format: m=>colours[m], onchange: (m) => {save('colour', m)} + }, 'Widgets': { - value: 0|settings.widgets, + value: 0||settings.widgets, min:0,max:1, format: m=>widgets[m], onchange: (m) => {save('widgets', m)} From 971a2f358d8fd61a63791e6a61f0a6107fa9b98c Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 01:53:07 +0100 Subject: [PATCH 37/54] Update settings.js --- apps/gallifr/settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js index c2a8b892f..3dc85c775 100644 --- a/apps/gallifr/settings.js +++ b/apps/gallifr/settings.js @@ -11,13 +11,13 @@ '': {'title': 'Clock Settings'}, '< Back': back, 'Colour': { - value: 0||settings.colour, + value: 0||settings['colour'], min:0,max:2, format: m=>colours[m], onchange: (m) => {save('colour', m)} }, 'Widgets': { - value: 0||settings.widgets, + value: 0||settings['widgets'], min:0,max:1, format: m=>widgets[m], onchange: (m) => {save('widgets', m)} From b56ccb8017c217cf7d9065be4ab28893b494d250 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 02:01:22 +0100 Subject: [PATCH 38/54] Bug fix --- apps/gallifr/settings.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js index 3dc85c775..09d4c416c 100644 --- a/apps/gallifr/settings.js +++ b/apps/gallifr/settings.js @@ -11,16 +11,16 @@ '': {'title': 'Clock Settings'}, '< Back': back, 'Colour': { - value: 0||settings['colour'], + value: 0|settings['colour'], min:0,max:2, - format: m=>colours[m], - onchange: (m) => {save('colour', m)} + format: m => colours[m], + onchange: m => {save('colour', m)} }, 'Widgets': { - value: 0||settings['widgets'], + value: 0|settings['widgets'], min:0,max:1, - format: m=>widgets[m], - onchange: (m) => {save('widgets', m)} + format: m => widgets[m], + onchange: m => {save('widgets', m)} } }; E.showMenu(appMenu) From d7341d4486ef8c3fcb14e0ec603bc0c9b88356c0 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 02:08:30 +0100 Subject: [PATCH 39/54] New menu --- apps/gallifr/settings.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js index 09d4c416c..78e7e516d 100644 --- a/apps/gallifr/settings.js +++ b/apps/gallifr/settings.js @@ -1,8 +1,8 @@ // make sure to enclose the function in parentheses (function (back) { let settings = require('Storage').readJSON('app.json',1)||{}; - let colours = ["green","red","blue"]; - let widgets = ["on","off"]; + let colours = ["green","red","blue","80s"]; + let onoff = ["on","off"]; function save(key, value) { settings[key] = value; require('Storage').write('app.json',settings); @@ -12,16 +12,22 @@ '< Back': back, 'Colour': { value: 0|settings['colour'], - min:0,max:2, + min:0,max:3, format: m => colours[m], onchange: m => {save('colour', m)} }, 'Widgets': { value: 0|settings['widgets'], min:0,max:1, - format: m => widgets[m], + format: m => onoff[m], onchange: m => {save('widgets', m)} - } + }, + 'Decoration': { + value: 0|settings['decoration'], + min:0,max:1, + format: m => onoff[m], + onchange: m => {save('decoration', m)} + } }; E.showMenu(appMenu) }) \ No newline at end of file From d6cb2bba18df7cd43594104aca6a1f71173c0de3 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 10:35:17 +0100 Subject: [PATCH 40/54] Adding README --- apps.json | 6 +++--- apps/gallifr/README.md | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 apps/gallifr/README.md diff --git a/apps.json b/apps.json index a75625325..af3f427f0 100644 --- a/apps.json +++ b/apps.json @@ -1809,11 +1809,11 @@ }, { "id": "gallifr", - "name": "Gallifreyan Chronometer", - "shortName": "Gallifrey Clock", + "name": "Time Traveller's Chronometer", + "shortName": "Time Travel Clock", "icon": "gallifr.png", "version": "0.01", - "description": "A Gallifreyan clock. The light pie segment shows the minutes, the black circle, the hour. The symbols on the dial spell time in Gallifreyan.", + "description": "A clock for time travellers. The light pie segment shows the minutes, the black circle, the hour. The dial itself reads 'time' just in case you forget.", "tags": "clock", "type": "clock", "allow_emulator":true, diff --git a/apps/gallifr/README.md b/apps/gallifr/README.md new file mode 100644 index 000000000..b88a3cb53 --- /dev/null +++ b/apps/gallifr/README.md @@ -0,0 +1,20 @@ +# Time Traveller's Clock + +The time travelling wristwatch is for those who are so attuned to the ebb and flow of time that they no longer require antiquated numbers to read the time. + +For those that need some tuition in the ways of the time traveller, the light coloured segment of the pie chart provides a traditional readout of minute. The black sphere that revolves around the edge of the display provides an indication of the hour. + +## Features + +The following aspects are customisable using the App Loader Menu system: + +1. Colour; the dial has four colour schemes: +- shades of green +- shades of red +- shades of blue +- a 1980's scheme +2. Widgets; these can be turned on or off - when turned off, the dial uses the whole screen and is slightly larger +3. Decoration; for those attuned to the time streams, the dial itself reads 'time'. For those who don't need to be reminded what the dial is for, this can be optionally turned off. + +## Code description +The code includes some functions that others may find useful in creating their own applications. These are explained in my robot-building blog [here](https://k9-build.blogspot.com/). \ No newline at end of file From 898f0c67b9c163c0ca205624c716918b665cf067 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 10:51:44 +0100 Subject: [PATCH 41/54] Enabling decoration --- apps/gallifr/app.js | 9 ++++++++- apps/gallifr/settings.js | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index ebac920f6..348be4d79 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -1,3 +1,8 @@ +// +// Time Travellers Watch +// Written May 2020 by Richard Hopkins +// based on a skeleton app by Gordon Williams +// const locale = require('locale'); const widgetHeight=24; let timer = null; @@ -8,6 +13,8 @@ const radius = Math.round(Math.min(g.getWidth()/2,(g.getHeight()-widgetHeight) / const cirRad = 2*Math.PI; const proportion = 0.3; // relative size of hour hand const thickness = 4; // thickness of decorative lines +const settings = require("Storage").readJSON("app.json", 1); +const decoration = settings['decoration'] const drawSegment = (params) => { angle1 = params.start/360*cirRad; @@ -71,7 +78,7 @@ const drawThickLine = (params) => { const drawHands = () => { drawMinuteHand(); drawHourHand(); - drawDecoration(); + if (decoration) {drawDecoration()}; }; const drawDecoration = () => { diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js index 78e7e516d..ac54c90ae 100644 --- a/apps/gallifr/settings.js +++ b/apps/gallifr/settings.js @@ -23,7 +23,7 @@ onchange: m => {save('widgets', m)} }, 'Decoration': { - value: 0|settings['decoration'], + value: 1|settings['decoration'], min:0,max:1, format: m => onoff[m], onchange: m => {save('decoration', m)} From 506f6260834113860b53aad78c6d33aeb698f79b Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 10:54:33 +0100 Subject: [PATCH 42/54] Add README to apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index af3f427f0..b8e1e9f20 100644 --- a/apps.json +++ b/apps.json @@ -1815,6 +1815,7 @@ "version": "0.01", "description": "A clock for time travellers. The light pie segment shows the minutes, the black circle, the hour. The dial itself reads 'time' just in case you forget.", "tags": "clock", + "readme": "README.md", "type": "clock", "allow_emulator":true, "storage": [ From abb48b296f7ab86f06f3042331471da47bd7328c Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 10:57:30 +0100 Subject: [PATCH 43/54] Bug fix --- apps/gallifr/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 348be4d79..91955ec7f 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -14,7 +14,7 @@ const cirRad = 2*Math.PI; const proportion = 0.3; // relative size of hour hand const thickness = 4; // thickness of decorative lines const settings = require("Storage").readJSON("app.json", 1); -const decoration = settings['decoration'] +const decoration = settings['decoration']; const drawSegment = (params) => { angle1 = params.start/360*cirRad; From 1a94d8484596c8154c1e497cbd32d6f382591f36 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 11:20:22 +0100 Subject: [PATCH 44/54] Enable menu options --- apps/gallifr/app.js | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 91955ec7f..4ec013a51 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -4,7 +4,6 @@ // based on a skeleton app by Gordon Williams // const locale = require('locale'); -const widgetHeight=24; let timer = null; let currentDate = new Date(); const centerX = Math.round(g.getWidth() / 2); @@ -13,8 +12,16 @@ const radius = Math.round(Math.min(g.getWidth()/2,(g.getHeight()-widgetHeight) / const cirRad = 2*Math.PI; const proportion = 0.3; // relative size of hour hand const thickness = 4; // thickness of decorative lines +// retrieve settings from menu const settings = require("Storage").readJSON("app.json", 1); const decoration = settings['decoration']; +const widgets = settings['widgets']; +if (widgets) { + widgetHeight = 24;} +else { + widgetHeight = 0;} +const colours = ["green","red","blue","80s"]; +const colour = colours[settings['colour']]; const drawSegment = (params) => { angle1 = params.start/360*cirRad; @@ -148,7 +155,23 @@ const drawDecoration = () => { const drawMinuteHand = () => { angle = currentDate.getMinutes()/60 * cirRad; //angle = currentDate.getSeconds()/60 * cirRad; - g.setColor(0,1,0); + switch(colour) { + case "red": + g.setColor(1,0,0); + break; + case "green": + g.setColor(0,1,0); + break; + case "blue": + g.setColor(0,0,1); + break; + case "80's": + g.setColor(1,0,0); + break; + default: + g.setColor(0,1,0); + } + var points = [centerX,centerY]; for (i = 0; i < angle; i=i+cirRad/60) { points.push(Math.round(centerX + Math.sin(i) * radius), @@ -169,7 +192,22 @@ const drawHourHand = () => { }; const drawClockFace = () => { - g.setColor(0.1,0.7,0); + switch(colour) { + case "red": + g.setColor(0.7,0.1,0); + break; + case "green": + g.setColor(0.1,0.7,0); + break; + case "blue": + g.setColor(0.1,0,0.7); + break; + case "80's": + g.setColor(1,1,1); + break; + default: + g.setColor(0.1,0.7,0); + } g.fillCircle(centerX,centerY,radius*0.98); }; From b96e6ad4166d2c633fb1738cc254cc85f9792a4f Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 11:23:13 +0100 Subject: [PATCH 45/54] Tweaks --- apps/gallifr/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 4ec013a51..9ef3c581a 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -14,14 +14,14 @@ const proportion = 0.3; // relative size of hour hand const thickness = 4; // thickness of decorative lines // retrieve settings from menu const settings = require("Storage").readJSON("app.json", 1); -const decoration = settings['decoration']; -const widgets = settings['widgets']; +const decoration = settings.decoration; +const widgets = settings.widgets; if (widgets) { widgetHeight = 24;} else { widgetHeight = 0;} const colours = ["green","red","blue","80s"]; -const colour = colours[settings['colour']]; +const colour = colours[settings.colour]; const drawSegment = (params) => { angle1 = params.start/360*cirRad; From d76f3e859d4d87d3e9a90aa04112f4334ec49b32 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 11:27:08 +0100 Subject: [PATCH 46/54] Bug fix --- apps/gallifr/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 9ef3c581a..0a9e840ef 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -6,9 +6,6 @@ const locale = require('locale'); let timer = null; let currentDate = new Date(); -const centerX = Math.round(g.getWidth() / 2); -const centerY = widgetHeight + Math.round((g.getHeight()-widgetHeight) / 2); -const radius = Math.round(Math.min(g.getWidth()/2,(g.getHeight()-widgetHeight) / 2)); const cirRad = 2*Math.PI; const proportion = 0.3; // relative size of hour hand const thickness = 4; // thickness of decorative lines @@ -22,6 +19,9 @@ else { widgetHeight = 0;} const colours = ["green","red","blue","80s"]; const colour = colours[settings.colour]; +const centerX = Math.round(g.getWidth() / 2); +const centerY = widgetHeight + Math.round((g.getHeight()-widgetHeight) / 2); +const radius = Math.round(Math.min(g.getWidth()/2,(g.getHeight()-widgetHeight) / 2)); const drawSegment = (params) => { angle1 = params.start/360*cirRad; From 64684680b2767345bb019f13cd88b39567717a31 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 11:44:31 +0100 Subject: [PATCH 47/54] Bug fix --- apps/gallifr/app.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 0a9e840ef..7d950f05a 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -10,7 +10,8 @@ const cirRad = 2*Math.PI; const proportion = 0.3; // relative size of hour hand const thickness = 4; // thickness of decorative lines // retrieve settings from menu -const settings = require("Storage").readJSON("app.json", 1); +// const settings = require("Storage").readJSON("app.json", 1); +require('Storage').read('app.json',settings); const decoration = settings.decoration; const widgets = settings.widgets; if (widgets) { @@ -165,7 +166,7 @@ const drawMinuteHand = () => { case "blue": g.setColor(0,0,1); break; - case "80's": + case "80s": g.setColor(1,0,0); break; default: @@ -194,13 +195,13 @@ const drawHourHand = () => { const drawClockFace = () => { switch(colour) { case "red": - g.setColor(0.7,0.1,0); + g.setColor(0.8,0.3,0); break; case "green": g.setColor(0.1,0.7,0); break; case "blue": - g.setColor(0.1,0,0.7); + g.setColor(0,0.3,0.8); break; case "80's": g.setColor(1,1,1); From d13d64c0dd8adb58969f9dbf828ccb3d2e2e85a4 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 11:47:48 +0100 Subject: [PATCH 48/54] Bug fix --- apps/gallifr/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 7d950f05a..12c629dc0 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -86,7 +86,9 @@ const drawThickLine = (params) => { const drawHands = () => { drawMinuteHand(); drawHourHand(); - if (decoration) {drawDecoration()}; + if (decoration) { + drawDecoration(); + } }; const drawDecoration = () => { From cefaa93bc101907efcd1dcd56201ea8c841d7caa Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 11:53:03 +0100 Subject: [PATCH 49/54] Bug fix --- apps/gallifr/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 12c629dc0..19c503643 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -217,7 +217,7 @@ const drawClockFace = () => { const drawAll = () => { currentDate = new Date(); g.clear(); - Bangle.drawWidgets(); + if (widgets) {Bangle.drawWidgets();} drawClockFace(); drawHands(); }; From 2495df581f824498dfc0953ad056899c201ca41b Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 11:57:31 +0100 Subject: [PATCH 50/54] Bug fix and tidy --- apps/gallifr/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 19c503643..57ca86279 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -116,7 +116,7 @@ const drawDecoration = () => { y: 0.3 }; drawSegment(params); - params = { + params = { start: 0, arc: 360, radius: 0.15, @@ -139,7 +139,7 @@ const drawDecoration = () => { toY: 0.1 }; drawThickLine(params); - params = { + params = { fromX: -0.2, fromY: -0.05, toX: -0.7, @@ -205,7 +205,7 @@ const drawClockFace = () => { case "blue": g.setColor(0,0.3,0.8); break; - case "80's": + case "80s": g.setColor(1,1,1); break; default: From 0b8fa574d24bd7d78026199d7c5935bfd803258c Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 12:05:18 +0100 Subject: [PATCH 51/54] Bug fixes --- apps/gallifr/app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 57ca86279..42227f0a8 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -10,8 +10,7 @@ const cirRad = 2*Math.PI; const proportion = 0.3; // relative size of hour hand const thickness = 4; // thickness of decorative lines // retrieve settings from menu -// const settings = require("Storage").readJSON("app.json", 1); -require('Storage').read('app.json',settings); +let settings = require('Storage').readJSON('app.json',1)||{}; const decoration = settings.decoration; const widgets = settings.widgets; if (widgets) { From 9f52fe4a91ed160eae3c970ed4410ccbca4a1099 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 12:15:59 +0100 Subject: [PATCH 52/54] Default option fixes --- apps/gallifr/app.js | 4 ++-- apps/gallifr/settings.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 42227f0a8..45769f35b 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -11,8 +11,8 @@ const proportion = 0.3; // relative size of hour hand const thickness = 4; // thickness of decorative lines // retrieve settings from menu let settings = require('Storage').readJSON('app.json',1)||{}; -const decoration = settings.decoration; -const widgets = settings.widgets; +const decoration = !settings.decoration; +const widgets = !settings.widgets; if (widgets) { widgetHeight = 24;} else { diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js index ac54c90ae..78e7e516d 100644 --- a/apps/gallifr/settings.js +++ b/apps/gallifr/settings.js @@ -23,7 +23,7 @@ onchange: m => {save('widgets', m)} }, 'Decoration': { - value: 1|settings['decoration'], + value: 0|settings['decoration'], min:0,max:1, format: m => onoff[m], onchange: m => {save('decoration', m)} From 38a3922a9e7f8030dcd2627c85aa42cd380c9081 Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 17:00:06 +0100 Subject: [PATCH 53/54] Re-merging apps.json --- apps.json | 1512 +++++++++++++++++++++++++---------------------------- 1 file changed, 698 insertions(+), 814 deletions(-) diff --git a/apps.json b/apps.json index b8e1e9f20..0c63a9848 100644 --- a/apps.json +++ b/apps.json @@ -1,1015 +1,937 @@ [ - { - "id": "boot", + { "id": "boot", "name": "Bootloader", "icon": "bootloader.png", - "version": "0.16", + "version":"0.16", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "tags": "tool,system", - "type": "bootloader", + "type":"bootloader", "storage": [ - { "name": ".boot0", "url": "boot0.js" }, - { "name": ".bootcde", "url": "bootloader.js" } + {"name":".boot0","url":"boot0.js"}, + {"name":".bootcde","url":"bootloader.js"} ], - "sortorder": -10 + "sortorder" : -10 }, - { - "id": "moonphase", + { "id": "moonphase", "name": "Moonphase", "icon": "app.png", - "version": "0.02", + "version":"0.02", "description": "Shows current moon phase. Now with GPS function.", "tags": "", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "moonphase.app.js", "url": "app.js" }, - { "name": "moonphase.img", "url": "app-icon.js", "evaluate": true } + {"name":"moonphase.app.js","url":"app.js"}, + {"name":"moonphase.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "daysl", + { "id": "daysl", "name": "Days left", "icon": "app.png", - "version": "0.03", + "version":"0.03", "description": "Shows you the days left until a certain date. Date can be set with a settings app and is written to a file.", "tags": "", - "allow_emulator": false, + "allow_emulator":false, "storage": [ - { "name": "daysl.app.js", "url": "app.js" }, - { "name": "daysl.img", "url": "app-icon.js", "evaluate": true }, - { "name": "daysl.wid.js", "url": "widget.js" } + {"name":"daysl.app.js","url":"app.js"}, + {"name":"daysl.img","url":"app-icon.js","evaluate":true}, + {"name":"daysl.wid.js","url":"widget.js"} ] }, - { - "id": "launch", + { "id": "launch", "name": "Default Launcher", - "shortName": "Launcher", + "shortName":"Launcher", "icon": "app.png", - "version": "0.03", + "version":"0.03", "description": "This is needed by Bangle.js to display a menu allowing you to choose your own applications. You can replace this with a customised launcher.", "tags": "tool,system,launcher", - "type": "launch", - "storage": [{ "name": "launch.app.js", "url": "app.js" }], - "sortorder": -10 + "type":"launch", + "storage": [ + {"name":"launch.app.js","url":"app.js"} + ], + "sortorder" : -10 }, - { - "id": "about", + { "id": "about", "name": "About", "icon": "app.png", - "version": "0.05", + "version":"0.05", "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", "tags": "tool,system", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "about.app.js", "url": "app.js" }, - { "name": "about.img", "url": "app-icon.js", "evaluate": true } + {"name":"about.app.js","url":"app.js"}, + {"name":"about.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "locale", + { "id": "locale", "name": "Languages", "icon": "locale.png", - "version": "0.06", + "version":"0.06", "description": "Translations for different countries", "tags": "tool,system,locale,translate", "type": "locale", - "custom": "locale.html", - "storage": [{ "name": "locale" }], - "sortorder": -10 + "custom":"locale.html", + "storage": [ + {"name":"locale"} + ], + "sortorder" : -10 }, - { - "id": "welcome", + { "id": "welcome", "name": "Welcome", "icon": "app.png", - "version": "0.08", + "version":"0.08", "description": "Appears at first boot and explains how to use Bangle.js", "tags": "start,welcome", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "welcome.boot.js", "url": "boot.js" }, - { "name": "welcome.app.js", "url": "app.js" }, - { "name": "welcome.settings.js", "url": "settings.js" }, - { "name": "welcome.img", "url": "app-icon.js", "evaluate": true } + {"name":"welcome.boot.js","url":"boot.js"}, + {"name":"welcome.app.js","url":"app.js"}, + {"name":"welcome.settings.js","url":"settings.js"}, + {"name":"welcome.img","url":"app-icon.js","evaluate":true} ], - "data": [{ "name": "welcome.json" }] - }, - { - "id": "gbridge", - "name": "Gadgetbridge", - "icon": "app.png", - "version": "0.10", - "description": "The default notification handler for Gadgetbridge notifications from Android", - "tags": "tool,system,android,widget", - "type": "widget", - "storage": [ - { "name": "gbridge.settings.js", "url": "settings.js" }, - { "name": "gbridge.img", "url": "app-icon.js", "evaluate": true }, - { "name": "gbridge.wid.js", "url": "widget.js" } + "data": [ + {"name":"welcome.json"} ] }, - { - "id": "mclock", + { "id": "gbridge", + "name": "Gadgetbridge", + "icon": "app.png", + "version":"0.10", + "description": "The default notification handler for Gadgetbridge notifications from Android", + "tags": "tool,system,android,widget", + "type":"widget", + "storage": [ + {"name":"gbridge.settings.js","url":"settings.js"}, + {"name":"gbridge.img","url":"app-icon.js","evaluate":true}, + {"name":"gbridge.wid.js","url":"widget.js"} + ] + }, + { "id": "mclock", "name": "Morphing Clock", "icon": "clock-morphing.png", - "version": "0.05", + "version":"0.05", "description": "7 segment clock that morphs between minutes and hours", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "mclock.app.js", "url": "clock-morphing.js" }, - { - "name": "mclock.img", - "url": "clock-morphing-icon.js", - "evaluate": true - } + {"name":"mclock.app.js","url":"clock-morphing.js"}, + {"name":"mclock.img","url":"clock-morphing-icon.js","evaluate":true} ], - "sortorder": -9 + "sortorder" : -9 }, - { - "id": "setting", + { "id": "setting", "name": "Settings", "icon": "settings.png", - "version": "0.19", + "version":"0.19", "description": "A menu for setting up Bangle.js", "tags": "tool,system", "readme": "README.md", "storage": [ - { "name": "setting.app.js", "url": "settings.js" }, - { "name": "setting.boot.js", "url": "boot.js" }, - { "name": "setting.img", "url": "settings-icon.js", "evaluate": true } + {"name":"setting.app.js","url":"settings.js"}, + {"name":"setting.boot.js","url":"boot.js"}, + {"name":"setting.img","url":"settings-icon.js","evaluate":true} ], - "sortorder": -2 + "sortorder" : -2 }, - { - "id": "alarm", + { "id": "alarm", "name": "Default Alarm", - "shortName": "Alarms", + "shortName":"Alarms", "icon": "app.png", - "version": "0.07", + "version":"0.07", "description": "Set and respond to alarms", "tags": "tool,alarm,widget", "storage": [ - { "name": "alarm.app.js", "url": "app.js" }, - { "name": "alarm.boot.js", "url": "boot.js" }, - { "name": "alarm.js", "url": "alarm.js" }, - { "name": "alarm.img", "url": "app-icon.js", "evaluate": true }, - { "name": "alarm.wid.js", "url": "widget.js" } + {"name":"alarm.app.js","url":"app.js"}, + {"name":"alarm.boot.js","url":"boot.js"}, + {"name":"alarm.js","url":"alarm.js"}, + {"name":"alarm.img","url":"app-icon.js","evaluate":true}, + {"name":"alarm.wid.js","url":"widget.js"} ], - "data": [{ "name": "alarm.json" }] + "data": [ + {"name":"alarm.json"} + ] }, - { - "id": "wclock", + { "id": "wclock", "name": "Word Clock", "icon": "clock-word.png", - "version": "0.02", + "version":"0.02", "description": "Display Time as Text", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "wclock.app.js", "url": "clock-word.js" }, - { "name": "wclock.img", "url": "clock-word-icon.js", "evaluate": true } + {"name":"wclock.app.js","url":"clock-word.js"}, + {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true} ] }, - { - "id": "imgclock", + { "id": "imgclock", "name": "Image background clock", - "shortName": "Image Clock", + "shortName":"Image Clock", "icon": "app.png", - "version": "0.04", + "version":"0.05", "description": "A clock with an image as a background", "tags": "clock", - "type": "clock", + "type" : "clock", "custom": "custom.html", "storage": [ - { "name": "imgclock.app.js", "url": "app.js" }, - { "name": "imgclock.img", "url": "app-icon.js", "evaluate": true }, - { "name": "imgclock.face.img" }, - { "name": "imgclock.face.json" }, - { "name": "imgclock.face.bg", "content": "" } + {"name":"imgclock.app.js","url":"app.js"}, + {"name":"imgclock.img","url":"app-icon.js","evaluate":true}, + {"name":"imgclock.face.img"}, + {"name":"imgclock.face.json"}, + {"name":"imgclock.face.bg","content":""} ] }, - { - "id": "impwclock", + { "id": "impwclock", "name": "Imprecise Word Clock", "icon": "clock-impword.png", - "version": "0.02", + "version":"0.02", "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "impwclock.app.js", "url": "clock-impword.js" }, - { - "name": "impwclock.img", - "url": "clock-impword-icon.js", - "evaluate": true - } + {"name":"impwclock.app.js","url":"clock-impword.js"}, + {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true} ] }, - { - "id": "aclock", + { "id": "aclock", "name": "Analog Clock", "icon": "clock-analog.png", "version": "0.13", "description": "An Analog Clock", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "aclock.app.js", "url": "clock-analog.js" }, - { "name": "aclock.img", "url": "clock-analog-icon.js", "evaluate": true } + {"name":"aclock.app.js","url":"clock-analog.js"}, + {"name":"aclock.img","url":"clock-analog-icon.js","evaluate":true} ] }, - { - "id": "clock2x3", + { "id": "clock2x3", "name": "2x3 Pixel Clock", "icon": "clock2x3.png", - "version": "0.04", + "version":"0.04", "description": "This is a simple clock using minimalist 2x3 pixel numerical digits", "tags": "clock", "type": "clock", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "clock2x3.app.js", "url": "clock2x3-app.js" }, - { "name": "clock2x3.img", "url": "clock2x3-icon.js", "evaluate": true } + {"name":"clock2x3.app.js","url":"clock2x3-app.js"}, + {"name":"clock2x3.img","url":"clock2x3-icon.js","evaluate":true} ] }, - { - "id": "trex", + { "id": "trex", "name": "T-Rex", "icon": "trex.png", - "version": "0.02", + "version":"0.02", "description": "T-Rex game in the style of Chrome's offline game", "tags": "game", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "trex.app.js", "url": "trex.js" }, - { "name": "trex.img", "url": "trex-icon.js", "evaluate": true } + {"name":"trex.app.js","url":"trex.js"}, + {"name":"trex.img","url":"trex-icon.js","evaluate":true} ] }, - { - "id": "astroid", + { "id": "astroid", "name": "Asteroids!", "icon": "asteroids.png", - "version": "0.02", + "version":"0.02", "description": "Retro asteroids game", "tags": "game", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "astroid.app.js", "url": "asteroids.js" }, - { "name": "astroid.img", "url": "asteroids-icon.js", "evaluate": true } + {"name":"astroid.app.js","url":"asteroids.js"}, + {"name":"astroid.img","url":"asteroids-icon.js","evaluate":true} ] }, - { - "id": "clickms", + { "id": "clickms", "name": "Click Master", "icon": "click-master.png", - "version": "0.01", + "version":"0.01", "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", "tags": "game", "storage": [ - { "name": "clickms.app.js", "url": "click-master.js" }, - { "name": "clickms.img", "url": "click-master-icon.js", "evaluate": true } + {"name":"clickms.app.js","url":"click-master.js"}, + {"name":"clickms.img","url":"click-master-icon.js","evaluate":true} ] }, - { - "id": "horsey", + { "id": "horsey", "name": "Horse Race!", "icon": "horse-race.png", - "version": "0.01", + "version":"0.01", "description": "Get several friends to start the game, then compete to see who can press BTN1 the most!", "tags": "game", "storage": [ - { "name": "horsey.app.js", "url": "horse-race.js" }, - { "name": "horsey.img", "url": "horse-race-icon.js", "evaluate": true } + {"name":"horsey.app.js","url":"horse-race.js"}, + {"name":"horsey.img","url":"horse-race-icon.js","evaluate":true} ] }, - { - "id": "compass", + { "id": "compass", "name": "Compass", "icon": "compass.png", - "version": "0.02", + "version":"0.02", "description": "Simple compass that points North", "tags": "tool,outdoors", "storage": [ - { "name": "compass.app.js", "url": "compass.js" }, - { "name": "compass.img", "url": "compass-icon.js", "evaluate": true } + {"name":"compass.app.js","url":"compass.js"}, + {"name":"compass.img","url":"compass-icon.js","evaluate":true} ] }, - { - "id": "gpstime", + { "id": "gpstime", "name": "GPS Time", "icon": "gpstime.png", - "version": "0.03", + "version":"0.03", "description": "Update the Bangle.js's clock based on the time from the GPS receiver", "tags": "tool,gps", "storage": [ - { "name": "gpstime.app.js", "url": "gpstime.js" }, - { "name": "gpstime.img", "url": "gpstime-icon.js", "evaluate": true } + {"name":"gpstime.app.js","url":"gpstime.js"}, + {"name":"gpstime.img","url":"gpstime-icon.js","evaluate":true} ] }, - { - "id": "openloc", + { "id": "openloc", "name": "Open Location / Plus Codes", "shortName": "Open Location", "icon": "app.png", - "version": "0.01", + "version":"0.01", "description": "Convert your current GPS location to a series of characters", "tags": "tool,outdoors,gps", "storage": [ - { "name": "openloc.app.js", "url": "app.js" }, - { "name": "openloc.img", "url": "app-icon.js", "evaluate": true } + {"name":"openloc.app.js","url":"app.js"}, + {"name":"openloc.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "speedo", + { "id": "speedo", "name": "Speedo", "icon": "speedo.png", - "version": "0.03", + "version":"0.03", "description": "Show the current speed according to the GPS", "tags": "tool,outdoors,gps", "storage": [ - { "name": "speedo.app.js", "url": "speedo.js" }, - { "name": "speedo.img", "url": "speedo-icon.js", "evaluate": true } + {"name":"speedo.app.js","url":"speedo.js"}, + {"name":"speedo.img","url":"speedo-icon.js","evaluate":true} ] }, - { - "id": "gpsrec", + { "id": "gpsrec", "name": "GPS Recorder", "icon": "app.png", - "version": "0.09", + "version":"0.09", "interface": "interface.html", "description": "Application that allows you to record a GPS track. Can run in background", "tags": "tool,outdoors,gps,widget", "storage": [ - { "name": "gpsrec.app.js", "url": "app.js" }, - { "name": "gpsrec.img", "url": "app-icon.js", "evaluate": true }, - { "name": "gpsrec.wid.js", "url": "widget.js" } + {"name":"gpsrec.app.js","url":"app.js"}, + {"name":"gpsrec.img","url":"app-icon.js","evaluate":true}, + {"name":"gpsrec.wid.js","url":"widget.js"} ], "data": [ - { "name": "gpsrec.json" }, - { "wildcard": ".gpsrc?", "storageFile": true } + {"name":"gpsrec.json"}, + {"wildcard":".gpsrc?","storageFile": true} ] }, - { - "id": "gpsnav", + { "id": "gpsnav", "name": "GPS Navigation", "icon": "icon.png", - "version": "0.01", + "version":"0.01", "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording", "tags": "tool,outdoors,gps", "readme": "README.md", "storage": [ - { "name": "gpsnav.app.js", "url": "app.js" }, - { "name": "waypoints.json", "url": "waypoints.json", "evaluate": false }, - { "name": "gpsnav.img", "url": "app-icon.js", "evaluate": true } + {"name":"gpsnav.app.js","url":"app.js"}, + {"name":"waypoints.json","url":"waypoints.json","evaluate":false}, + {"name":"gpsnav.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "heart", + { "id": "heart", "name": "Heart Rate Recorder", "icon": "app.png", - "version": "0.02", + "version":"0.02", "interface": "interface.html", "description": "Application that allows you to record your heart rate. Can run in background", "tags": "tool,health,widget", "storage": [ - { "name": "heart.app.js", "url": "app.js" }, - { "name": "heart.img", "url": "app-icon.js", "evaluate": true }, - { "name": "heart.wid.js", "url": "widget.js" } + {"name":"heart.app.js","url":"app.js"}, + {"name":"heart.img","url":"app-icon.js","evaluate":true}, + {"name":"heart.wid.js","url":"widget.js"} ], "data": [ - { "name": "heart.json" }, - { "wildcard": ".heart?", "storageFile": true } + {"name":"heart.json"}, + {"wildcard":".heart?","storageFile": true} ] }, - { - "id": "slevel", + { "id": "slevel", "name": "Spirit Level", "icon": "spiritlevel.png", - "version": "0.01", + "version":"0.01", "description": "Show the current angle of the watch, so you can use it to make sure something is absolutely flat", "tags": "tool", "storage": [ - { "name": "slevel.app.js", "url": "spiritlevel.js" }, - { "name": "slevel.img", "url": "spiritlevel-icon.js", "evaluate": true } + {"name":"slevel.app.js","url":"spiritlevel.js"}, + {"name":"slevel.img","url":"spiritlevel-icon.js","evaluate":true} ] }, - { - "id": "files", + { "id": "files", "name": "App Manager", "icon": "files.png", - "version": "0.03", + "version":"0.05", "description": "Show currently installed apps, free space, and allow their deletion from the watch", "tags": "tool,system,files", "storage": [ - { "name": "files.app.js", "url": "files.js" }, - { "name": "files.img", "url": "files-icon.js", "evaluate": true } + {"name":"files.app.js","url":"files.js"}, + {"name":"files.img","url":"files-icon.js","evaluate":true} ] }, - { - "id": "weather", + { "id": "weather", "name": "Weather", "icon": "icon.png", - "version": "0.01", + "version":"0.01", "description": "Show Gadgetbridge weather report", "readme": "readme.md", "tags": "widget,outdoors", "storage": [ - { "name": "weather.app.js", "url": "app.js" }, - { "name": "weather.wid.js", "url": "widget.js" }, - { "name": "weather", "url": "lib.js" }, - { "name": "weather.img", "url": "icon.js", "evaluate": true } + {"name":"weather.app.js","url":"app.js"}, + {"name":"weather.wid.js","url":"widget.js"}, + {"name":"weather","url":"lib.js"}, + {"name":"weather.img","url":"icon.js","evaluate":true} ], - "data": [{ "name": "weather.json" }] + "data": [ + {"name": "weather.json"} + ] }, - { - "id": "widbat", + { "id": "widbat", "name": "Battery Level Widget", "icon": "widget.png", - "version": "0.05", + "version":"0.05", "description": "Show the current battery level and charging status in the top right of the clock", "tags": "widget,battery", - "type": "widget", - "storage": [{ "name": "widbat.wid.js", "url": "widget.js" }] + "type":"widget", + "storage": [ + {"name":"widbat.wid.js","url":"widget.js"} + ] }, - { - "id": "widbatpc", + { "id": "widbatpc", "name": "Battery Level Widget (with percentage)", "shortName": "Battery Widget", "icon": "widget.png", - "version": "0.11", + "version":"0.11", "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", "tags": "widget,battery", - "type": "widget", + "type":"widget", "storage": [ - { "name": "widbatpc.wid.js", "url": "widget.js" }, - { "name": "widbatpc.settings.js", "url": "settings.js" } + {"name":"widbatpc.wid.js","url":"widget.js"}, + {"name":"widbatpc.settings.js","url":"settings.js"} ], - "data": [{ "name": "widbatpc.json" }] + "data": [ + {"name":"widbatpc.json"} + ] }, - { - "id": "widbt", + { "id": "widbt", "name": "Bluetooth Widget", "icon": "widget.png", - "version": "0.04", + "version":"0.04", "description": "Show the current Bluetooth connection status in the top right of the clock", "tags": "widget,bluetooth", - "type": "widget", - "storage": [{ "name": "widbt.wid.js", "url": "widget.js" }] + "type":"widget", + "storage": [ + {"name":"widbt.wid.js","url":"widget.js"} + ] }, - { - "id": "widram", + { "id": "widram", "name": "RAM Widget", - "shortName": "RAM Widget", + "shortName":"RAM Widget", "icon": "widget.png", - "version": "0.01", + "version":"0.01", "description": "Display your Bangle's available RAM percentage in a widget", "tags": "widget", "type": "widget", - "storage": [{ "name": "widram.wid.js", "url": "widget.js" }] + "storage": [ + {"name":"widram.wid.js","url":"widget.js"} + ] }, - { - "id": "hrm", + { "id": "hrm", "name": "Heart Rate Monitor", "icon": "heartrate.png", - "version": "0.01", + "version":"0.01", "description": "Measure your current heart rate", "tags": "health", "storage": [ - { "name": "hrm.app.js", "url": "heartrate.js" }, - { "name": "hrm.img", "url": "heartrate-icon.js", "evaluate": true } + {"name":"hrm.app.js","url":"heartrate.js"}, + {"name":"hrm.img","url":"heartrate-icon.js","evaluate":true} ] }, - { - "id": "widhrm", + { "id": "widhrm", "name": "Simple Heart Rate widget", "icon": "widget.png", - "version": "0.03", + "version":"0.03", "description": "When the screen is on, the widget turns on the heart rate monitor and displays the current heart rate (or last known in grey). For this to work well you'll need at least a 15 second LCD Timeout.", "tags": "health,widget", "type": "widget", - "storage": [{ "name": "widhrm.wid.js", "url": "widget.js" }] + "storage": [ + {"name":"widhrm.wid.js","url":"widget.js"} + ] }, - { - "id": "stetho", + { "id": "stetho", "name": "Stethoscope", "icon": "stetho.png", - "version": "0.01", + "version":"0.01", "description": "Hear your heart rate", "tags": "health", "storage": [ - { "name": "stetho.app.js", "url": "stetho.js" }, - { "name": "stetho.img", "url": "stetho-icon.js", "evaluate": true } + {"name":"stetho.app.js","url":"stetho.js"}, + {"name":"stetho.img","url":"stetho-icon.js","evaluate":true} ] }, - { - "id": "swatch", + { "id": "swatch", "name": "Stopwatch", "icon": "stopwatch.png", - "version": "0.07", + "version":"0.07", "interface": "interface.html", "description": "Simple stopwatch with Lap Time logging to a JSON file", "tags": "health", - "allow_emulator": true, + "allow_emulator":true, "readme": "README.md", "storage": [ - { "name": "swatch.app.js", "url": "stopwatch.js" }, - { "name": "swatch.img", "url": "stopwatch-icon.js", "evaluate": true } + {"name":"swatch.app.js","url":"stopwatch.js"}, + {"name":"swatch.img","url":"stopwatch-icon.js","evaluate":true} ] }, - { - "id": "hidmsic", + { "id": "hidmsic", "name": "Bluetooth Music Controls", "shortName": "Music Control", "icon": "hid-music.png", - "version": "0.02", + "version":"0.02", "description": "Enable HID in settings, pair with your phone, then use this app to control music from your watch!", "tags": "bluetooth", "storage": [ - { "name": "hidmsic.app.js", "url": "hid-music.js" }, - { "name": "hidmsic.img", "url": "hid-music-icon.js", "evaluate": true } + {"name":"hidmsic.app.js","url":"hid-music.js"}, + {"name":"hidmsic.img","url":"hid-music-icon.js","evaluate":true} ] }, - { - "id": "hidkbd", + { "id": "hidkbd", "name": "Bluetooth Keyboard", "shortName": "Bluetooth Kbd", "icon": "hid-keyboard.png", - "version": "0.02", + "version":"0.02", "description": "Enable HID in settings, pair with your phone/PC, then use this app to control other apps", "tags": "bluetooth", "storage": [ - { "name": "hidkbd.app.js", "url": "hid-keyboard.js" }, - { "name": "hidkbd.img", "url": "hid-keyboard-icon.js", "evaluate": true } + {"name":"hidkbd.app.js","url":"hid-keyboard.js"}, + {"name":"hidkbd.img","url":"hid-keyboard-icon.js","evaluate":true} ] }, - { - "id": "hidbkbd", + { "id": "hidbkbd", "name": "Binary Bluetooth Keyboard", "shortName": "Binary BT Kbd", "icon": "hid-binary-keyboard.png", - "version": "0.02", + "version":"0.02", "description": "Enable HID in settings, pair with your phone/PC, then type messages using the onscreen keyboard by tapping repeatedly on the key you want", "tags": "bluetooth", "storage": [ - { "name": "hidbkbd.app.js", "url": "hid-binary-keyboard.js" }, - { - "name": "hidbkbd.img", - "url": "hid-binary-keyboard-icon.js", - "evaluate": true - } + {"name":"hidbkbd.app.js","url":"hid-binary-keyboard.js"}, + {"name":"hidbkbd.img","url":"hid-binary-keyboard-icon.js","evaluate":true} ] }, - { - "id": "animals", + { "id": "animals", "name": "Animals Game", "icon": "animals.png", - "version": "0.01", + "version":"0.01", "description": "Simple toddler's game - displays a different number of animals each time the screen is pressed", "tags": "game", "storage": [ - { "name": "animals.app.js", "url": "animals.js" }, - { "name": "animals.img", "url": "animals-icon.js", "evaluate": true }, - { - "name": "animals-snake.img", - "url": "animals-snake.js", - "evaluate": true - }, - { - "name": "animals-duck.img", - "url": "animals-duck.js", - "evaluate": true - }, - { - "name": "animals-swan.img", - "url": "animals-swan.js", - "evaluate": true - }, - { "name": "animals-fox.img", "url": "animals-fox.js", "evaluate": true }, - { - "name": "animals-camel.img", - "url": "animals-camel.js", - "evaluate": true - }, - { "name": "animals-pig.img", "url": "animals-pig.js", "evaluate": true }, - { - "name": "animals-sheep.img", - "url": "animals-sheep.js", - "evaluate": true - }, - { - "name": "animals-mouse.img", - "url": "animals-mouse.js", - "evaluate": true - } + {"name":"animals.app.js","url":"animals.js"}, + {"name":"animals.img","url":"animals-icon.js","evaluate":true}, + {"name":"animals-snake.img","url":"animals-snake.js","evaluate":true}, + {"name":"animals-duck.img","url":"animals-duck.js","evaluate":true}, + {"name":"animals-swan.img","url":"animals-swan.js","evaluate":true}, + {"name":"animals-fox.img","url":"animals-fox.js","evaluate":true}, + {"name":"animals-camel.img","url":"animals-camel.js","evaluate":true}, + {"name":"animals-pig.img","url":"animals-pig.js","evaluate":true}, + {"name":"animals-sheep.img","url":"animals-sheep.js","evaluate":true}, + {"name":"animals-mouse.img","url":"animals-mouse.js","evaluate":true} ] }, - { - "id": "qrcode", + { "id": "qrcode", "name": "Custom QR Code", "icon": "app.png", - "version": "0.01", + "version":"0.02", "description": "Use this to upload a customised QR code to Bangle.js", "tags": "qrcode", "custom": "custom.html", "storage": [ - { "name": "qrcode.app.js" }, - { "name": "qrcode.img", "url": "app-icon.js", "evaluate": true } + {"name":"qrcode.app.js"}, + {"name":"qrcode.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "beer", + { "id": "beer", "name": "Beer Compass", "icon": "app.png", - "version": "0.01", + "version":"0.01", "description": "Uploads all the pubs in an area onto your watch, so it can always point you at the nearest one", "tags": "", "custom": "custom.html", "storage": [ - { "name": "beer.app.js" }, - { "name": "beer.img", "url": "app-icon.js", "evaluate": true } + {"name":"beer.app.js"}, + {"name":"beer.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "route", + { "id": "route", "name": "Route Viewer", "icon": "app.png", - "version": "0.01", + "version":"0.01", "description": "Upload a KML file of a route, and have your watch display a map with how far around it you are", "tags": "", "custom": "custom.html", "storage": [ - { "name": "route.app.js" }, - { "name": "route.img", "url": "app-icon.js", "evaluate": true } + {"name":"route.app.js"}, + {"name":"route.img","url":"app-icon.js","evaluate":true} ] }, { "id": "ncstart", "name": "NCEU Startup", "icon": "start.png", - "version": "0.05", + "version":"0.05", "description": "NodeConfEU 2019 'First Start' Sequence", "tags": "start,welcome", "storage": [ - { "name": "ncstart.app.js", "url": "start.js" }, - { "name": "ncstart.boot.js", "url": "boot.js" }, - { "name": "ncstart.settings.js", "url": "settings.js" }, - { "name": "ncstart.img", "url": "start-icon.js", "evaluate": true }, - { "name": "nc-bangle.img", "url": "start-bangle.js", "evaluate": true }, - { "name": "nc-nceu.img", "url": "start-nceu.js", "evaluate": true }, - { "name": "nc-nfr.img", "url": "start-nfr.js", "evaluate": true }, - { "name": "nc-nodew.img", "url": "start-nodew.js", "evaluate": true }, - { "name": "nc-tf.img", "url": "start-tf.js", "evaluate": true } + {"name":"ncstart.app.js","url":"start.js"}, + {"name":"ncstart.boot.js","url":"boot.js"}, + {"name":"ncstart.settings.js","url":"settings.js"}, + {"name":"ncstart.img","url":"start-icon.js","evaluate":true}, + {"name":"nc-bangle.img","url":"start-bangle.js","evaluate":true}, + {"name":"nc-nceu.img","url":"start-nceu.js","evaluate":true}, + {"name":"nc-nfr.img","url":"start-nfr.js","evaluate":true}, + {"name":"nc-nodew.img","url":"start-nodew.js","evaluate":true}, + {"name":"nc-tf.img","url":"start-tf.js","evaluate":true} ], - "data": [{ "name": "ncstart.json" }] + "data": [ + {"name":"ncstart.json"} + ] }, - { - "id": "ncfrun", + { "id": "ncfrun", "name": "NCEU 5K Fun Run", "icon": "nceu-funrun.png", - "version": "0.01", + "version":"0.01", "description": "Display a map of the NodeConf EU 2019 5K Fun Run route and your location on it", "tags": "health", "storage": [ - { "name": "ncfrun.app.js", "url": "nceu-funrun.js" }, - { "name": "ncfrun.img", "url": "nceu-funrun-icon.js", "evaluate": true } + {"name":"ncfrun.app.js","url":"nceu-funrun.js"}, + {"name":"ncfrun.img","url":"nceu-funrun-icon.js","evaluate":true} ] }, - { - "id": "widnceu", + { "id": "widnceu", "name": "NCEU Logo Widget", "icon": "widget.png", - "version": "0.02", + "version":"0.02", "description": "Show the NodeConf EU logo in the top left", "tags": "widget", - "type": "widget", - "storage": [{ "name": "widnceu.wid.js", "url": "widget.js" }] + "type":"widget", + "storage": [ + {"name":"widnceu.wid.js","url":"widget.js"} + ] }, - { - "id": "sclock", + { "id": "sclock", "name": "Simple Clock", "icon": "clock-simple.png", - "version": "0.04", + "version":"0.04", "description": "A Simple Digital Clock", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "sclock.app.js", "url": "clock-simple.js" }, - { "name": "sclock.img", "url": "clock-simple-icon.js", "evaluate": true } + {"name":"sclock.app.js","url":"clock-simple.js"}, + {"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true} ] }, - { - "id": "dclock", + { "id": "dclock", "name": "Dev Clock", "icon": "clock-dev.png", - "version": "0.09", + "version":"0.09", "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "dclock.app.js", "url": "clock-dev.js" }, - { "name": "dclock.img", "url": "clock-dev-icon.js", "evaluate": true } + {"name":"dclock.app.js","url":"clock-dev.js"}, + {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true} ] }, - { - "id": "gesture", + { "id": "gesture", "name": "Gesture Test", "icon": "gesture.png", - "version": "0.01", + "version":"0.01", "description": "BETA! Uploads a basic Tensorflow Gesture model, and then outputs each gesture as a message", "tags": "gesture,ai", - "type": "app", + "type":"app", "storage": [ - { "name": "gesture.app.js", "url": "gesture.js" }, - { "name": ".tfnames", "url": "gesture-tfnames.js", "evaluate": true }, - { "name": ".tfmodel", "url": "gesture-tfmodel.js", "evaluate": true }, - { "name": "gesture.img", "url": "gesture-icon.js", "evaluate": true } + {"name":"gesture.app.js","url":"gesture.js"}, + {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, + {"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true}, + {"name":"gesture.img","url":"gesture-icon.js","evaluate":true} ] }, - { - "id": "pparrot", + { "id": "pparrot", "name": "Party Parrot", "icon": "party-parrot.png", - "version": "0.01", + "version":"0.01", "description": "Party with a parrot on your wrist", "tags": "party,parrot,lol", - "type": "app", - "allow_emulator": true, + "type":"app", + "allow_emulator":true, "storage": [ - { "name": "pparrot.app.js", "url": "party-parrot.js" }, - { "name": "pparrot.img", "url": "party-parrot-icon.js", "evaluate": true } + {"name":"pparrot.app.js","url":"party-parrot.js"}, + {"name":"pparrot.img","url":"party-parrot-icon.js","evaluate":true} ] }, - { - "id": "hrings", + { "id": "hrings", "name": "Hypno Rings", "icon": "hypno-rings.png", - "version": "0.01", + "version":"0.01", "description": "Experiment with trippy rings, press buttons for change", "tags": "rings,hypnosis,psychadelic", - "type": "app", - "allow_emulator": true, + "type":"app", + "allow_emulator":true, "storage": [ - { "name": "hrings.app.js", "url": "hypno-rings.js" }, - { "name": "hrings.img", "url": "hypno-rings-icon.js", "evaluate": true } + {"name":"hrings.app.js","url":"hypno-rings.js"}, + {"name":"hrings.img","url":"hypno-rings-icon.js","evaluate":true} ] }, - { - "id": "morse", + { "id": "morse", "name": "Morse Code", "icon": "morse-code.png", - "version": "0.01", + "version":"0.01", "description": "Learn morse code by hearing/seeing/feeling the code. Tap to toggle buzz!", "tags": "morse,sound,visual,input", - "type": "app", + "type":"app", "storage": [ - { "name": "morse.app.js", "url": "morse-code.js" }, - { "name": "morse.img", "url": "morse-code-icon.js", "evaluate": true } + {"name":"morse.app.js","url":"morse-code.js"}, + {"name":"morse.img","url":"morse-code-icon.js","evaluate":true} ] }, { "id": "blescan", "name": "BLE Scanner", "icon": "blescan.png", - "version": "0.01", + "version":"0.01", "description": "Scan for advertising BLE devices", - "tags": "bluetooth", - "storage": [ - { "name": "blescan.app.js", "url": "blescan.js" }, - { "name": "blescan.img", "url": "blescan-icon.js", "evaluate": true } + "tags" : "bluetooth", + "storage" : [ + {"name":"blescan.app.js","url":"blescan.js"}, + {"name":"blescan.img","url":"blescan-icon.js", "evaluate":true} ] }, - { - "id": "mmonday", - "name": "Manic Monday Tone", - "icon": "manic-monday-icon.png", - "version": "0.02", - "description": "The Bangles make a comeback", - "tags": "sound", - "storage": [ - { "name": "mmonday.app.js", "url": "manic-monday.js" }, - { "name": "mmonday.img", "url": "manic-monday-icon.js", "evaluate": true } - ] + { "id": "mmonday", + "name": "Manic Monday Tone", + "icon": "manic-monday-icon.png", + "version":"0.02", + "description": "The Bangles make a comeback", + "tags": "sound", + "storage": [ + {"name":"mmonday.app.js","url":"manic-monday.js"}, + {"name":"mmonday.img","url":"manic-monday-icon.js","evaluate":true} + ] }, - { - "id": "jbells", + { "id": "jbells", "name": "Jingle Bells", "icon": "jbells.png", - "version": "0.01", + "version":"0.01", "description": "Play Jingle Bells", "tags": "sound", - "type": "app", + "type":"app", "storage": [ - { "name": "jbells.app.js", "url": "jbells.js" }, - { "name": "jbells.img", "url": "jbells-icon.js", "evaluate": true } + {"name":"jbells.app.js","url":"jbells.js"}, + {"name":"jbells.img","url":"jbells-icon.js","evaluate":true} ] }, - { - "id": "scolor", + { "id": "scolor", "name": "Show Color", "icon": "show-color.png", - "version": "0.01", + "version":"0.01", "description": "Display all available Colors and Names", "tags": "tool", - "type": "app", - "allow_emulator": true, + "type":"app", + "allow_emulator":true, "storage": [ - { "name": "scolor.app.js", "url": "show-color.js" }, - { "name": "scolor.img", "url": "show-color-icon.js", "evaluate": true } + {"name":"scolor.app.js","url":"show-color.js"}, + {"name":"scolor.img","url":"show-color-icon.js","evaluate":true} ] }, - { - "id": "miclock", + { "id": "miclock", "name": "Mixed Clock", "icon": "clock-mixed.png", - "version": "0.04", + "version":"0.04", "description": "A mix of analog and digital Clock", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "miclock.app.js", "url": "clock-mixed.js" }, - { "name": "miclock.img", "url": "clock-mixed-icon.js", "evaluate": true } + {"name":"miclock.app.js","url":"clock-mixed.js"}, + {"name":"miclock.img","url":"clock-mixed-icon.js","evaluate":true} ] }, - { - "id": "bclock", + { "id": "bclock", "name": "Binary Clock", "icon": "clock-binary.png", - "version": "0.02", + "version":"0.02", "description": "A simple binary clock watch face", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "bclock.app.js", "url": "clock-binary.js" }, - { "name": "bclock.img", "url": "clock-binary-icon.js", "evaluate": true } + {"name":"bclock.app.js","url":"clock-binary.js"}, + {"name":"bclock.img","url":"clock-binary-icon.js","evaluate":true} ] }, - { - "id": "clotris", + { "id": "clotris", "name": "Clock-Tris", "icon": "clock-tris.png", - "version": "0.01", + "version":"0.01", "description": "A fully functional clone of a classic game of falling blocks", "tags": "game", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "clotris.app.js", "url": "clock-tris.js" }, - { "name": "clotris.img", "url": "clock-tris-icon.js", "evaluate": true }, - { "name": ".trishig", "url": "clock-tris-high" } + {"name":"clotris.app.js","url":"clock-tris.js"}, + {"name":"clotris.img","url":"clock-tris-icon.js","evaluate":true}, + {"name":".trishig","url":"clock-tris-high"} ] }, - { - "id": "flappy", + { "id": "flappy", "name": "Flappy Bird", "icon": "app.png", - "version": "0.04", + "version":"0.04", "description": "A Flappy Bird game clone", "tags": "game", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "flappy.app.js", "url": "app.js" }, - { "name": "flappy.img", "url": "app-icon.js", "evaluate": true } + {"name":"flappy.app.js","url":"app.js"}, + {"name":"flappy.img","url":"app-icon.js","evaluate":true} ] }, { "id": "gpsinfo", "name": "GPS Info", "icon": "gps-info.png", - "version": "0.03", + "version":"0.03", "description": "An application that displays information about altitude, lat/lon, satellites and time", "tags": "gps", "type": "app", "storage": [ - { "name": "gpsinfo.app.js", "url": "gps-info.js" }, - { "name": "gpsinfo.img", "url": "gps-info-icon.js", "evaluate": true } + {"name":"gpsinfo.app.js","url": "gps-info.js"}, + {"name":"gpsinfo.img","url": "gps-info-icon.js","evaluate": true} ] }, { "id": "pomodo", - "name": "Pomodoro", - "icon": "pomodoro.png", - "version": "0.01", + "name":"Pomodoro", + "icon":"pomodoro.png", + "version":"0.01", "description": "A simple pomodoro timer.", "tags": "pomodoro,cooking,tools", "type": "app", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "pomodo.app.js", "url": "pomodoro.js" }, - { "name": "pomodo.img", "url": "pomodoro-icon.js", "evaluate": true } + {"name":"pomodo.app.js","url": "pomodoro.js"}, + {"name":"pomodo.img","url": "pomodoro-icon.js","evaluate": true} ] }, - { - "id": "blobclk", + { "id": "blobclk", "name": "Large Digit Blob Clock", - "shortName": "Blob Clock", + "shortName" : "Blob Clock", "icon": "clock-blob.png", - "version": "0.03", + "version":"0.03", "description": "A clock with big digits", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "blobclk.app.js", "url": "clock-blob.js" }, - { "name": "blobclk.img", "url": "clock-blob-icon.js", "evaluate": true } + {"name":"blobclk.app.js","url":"clock-blob.js"}, + {"name":"blobclk.img","url":"clock-blob-icon.js","evaluate":true} ] }, - { - "id": "boldclk", + { "id": "boldclk", "name": "Bold Clock", "icon": "bold_clock.png", - "version": "0.02", + "version":"0.02", "description": "Simple, readable and practical clock", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "boldclk.app.js", "url": "bold_clock.js" }, - { "name": "boldclk.img", "url": "bold_clock-icon.js", "evaluate": true } + {"name":"boldclk.app.js","url":"bold_clock.js"}, + {"name":"boldclk.img","url":"bold_clock-icon.js","evaluate":true} ] }, - { - "id": "widclk", + { "id": "widclk", "name": "Digital clock widget", "icon": "widget.png", - "version": "0.04", + "version":"0.04", "description": "A simple digital clock widget", "tags": "widget,clock", - "type": "widget", - "storage": [{ "name": "widclk.wid.js", "url": "widget.js" }] + "type":"widget", + "storage": [ + {"name":"widclk.wid.js","url":"widget.js"} + ] }, - { - "id": "widpedom", + { "id": "widpedom", "name": "Pedometer widget", "icon": "widget.png", - "version": "0.10", + "version":"0.10", "description": "Daily pedometer widget", "tags": "widget", - "type": "widget", + "type":"widget", "storage": [ - { "name": "widpedom.wid.js", "url": "widget.js" }, - { "name": "widpedom.settings.js", "url": "settings.js" } + {"name":"widpedom.wid.js","url":"widget.js"}, + {"name":"widpedom.settings.js","url":"settings.js"} ] }, - { - "id": "berlinc", + { "id": "berlinc", "name": "Berlin Clock", "icon": "berlin-clock.png", - "version": "0.02", + "version":"0.02", "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "berlinc.app.js", "url": "berlin-clock.js" }, - { "name": "berlinc.img", "url": "berlin-clock-icon.js", "evaluate": true } + {"name":"berlinc.app.js","url":"berlin-clock.js"}, + {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true} ] }, - { - "id": "ctrclk", + { "id": "ctrclk", "name": "Centerclock", "icon": "app.png", - "version": "0.02", + "version":"0.02", "description": "Watch-centered digital 24h clock with date in dd.mm.yyyy format.", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "ctrclk.app.js", "url": "app.js" }, - { "name": "ctrclk.img", "url": "app-icon.js", "evaluate": true } + {"name":"ctrclk.app.js","url":"app.js"}, + {"name":"ctrclk.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "demoapp", + { "id": "demoapp", "name": "Demo Loop", "icon": "app.png", - "version": "0.01", + "version":"0.01", "description": "Simple demo app - displays Bangle.js, JS logo, graphics, and Bangle.js information", "tags": "", - "type": "app", - "allow_emulator": true, + "type":"app", + "allow_emulator":true, "storage": [ - { "name": "demoapp.app.js", "url": "app.js" }, - { "name": "demoapp.img", "url": "app-icon.js", "evaluate": true } + {"name":"demoapp.app.js","url":"app.js"}, + {"name":"demoapp.img","url":"app-icon.js","evaluate":true} ], - "sortorder": -9 + "sortorder" : -9 }, - { - "id": "flagrse", + { "id": "flagrse", "name": "Espruino Flag Raiser", "icon": "app.png", - "version": "0.01", + "version":"0.01", "description": "App to send a command to another Espruino to cause it to raise a flag", "tags": "", "storage": [ - { "name": "flagrse.app.js", "url": "app.js" }, - { "name": "flagrse.img", "url": "app-icon.js", "evaluate": true } + {"name":"flagrse.app.js","url":"app.js"}, + {"name":"flagrse.img","url":"app-icon.js","evaluate":true} ] }, { @@ -1019,233 +941,202 @@ "version": "0.03", "description": "Pipboy themed clock", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "pipboy.app.js", "url": "app.js" }, - { "name": "pipboy.img", "url": "app-icon.js", "evaluate": true } + {"name":"pipboy.app.js","url":"app.js"}, + {"name":"pipboy.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "torch", + { "id": "torch", "name": "Torch", - "shortName": "Torch", + "shortName":"Torch", "icon": "app.png", - "version": "0.02", + "version":"0.02", "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets", "tags": "tool,torch", "storage": [ - { "name": "torch.app.js", "url": "app.js" }, - { "name": "torch.wid.js", "url": "widget.js" }, - { "name": "torch.img", "url": "app-icon.js", "evaluate": true } + {"name":"torch.app.js","url":"app.js"}, + {"name":"torch.wid.js","url":"widget.js"}, + {"name":"torch.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "wohrm", + { "id": "wohrm", "name": "Workout HRM", "icon": "app.png", - "version": "0.07", + "version":"0.07", "readme": "README.md", "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", "tags": "hrm,workout", "type": "app", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "wohrm.app.js", "url": "app.js" }, - { "name": "wohrm.img", "url": "app-icon.js", "evaluate": true } + {"name":"wohrm.app.js","url":"app.js"}, + {"name":"wohrm.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "widid", + { "id": "widid", "name": "Bluetooth ID Widget", "icon": "widget.png", - "version": "0.02", + "version":"0.02", "description": "Display the last two tuple of your Bangle.js MAC address in the widget section. This is useful for figuring out which Bangle.js to connect to if you have more than one Bangle.js!", "tags": "widget,address,mac", - "type": "widget", - "storage": [{ "name": "widid.wid.js", "url": "widget.js" }] + "type":"widget", + "storage": [ + {"name":"widid.wid.js","url":"widget.js"} + ] }, { "id": "grocery", "name": "Grocery", "icon": "grocery.png", - "version": "0.01", + "version":"0.01", "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.", "tags": "tool,outdoors,shopping,list", "type": "app", - "custom": "grocery.html", + "custom":"grocery.html", "storage": [ - { "name": "grocery" }, - { "name": "grocery.app.js" }, - { "name": "grocery.img", "url": "grocery-icon.js", "evaluate": true } + {"name":"grocery"}, + {"name":"grocery.app.js"}, + {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} ] }, - { - "id": "marioclock", + { "id": "marioclock", "name": "Mario Clock", "icon": "marioclock.png", - "version": "0.12", + "version":"0.12", "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", "tags": "clock,mario,retro", "type": "clock", - "allow_emulator": true, + "allow_emulator":true, "readme": "README.md", "storage": [ - { "name": "marioclock.app.js", "url": "marioclock-app.js" }, - { - "name": "marioclock.img", - "url": "marioclock-icon.js", - "evaluate": true - } + {"name":"marioclock.app.js","url":"marioclock-app.js"}, + {"name":"marioclock.img","url":"marioclock-icon.js","evaluate":true} ] }, - { - "id": "cliock", + { "id": "cliock", "name": "Commandline-Clock", - "shortName": "CLI-Clock", + "shortName":"CLI-Clock", "icon": "app.png", - "version": "0.07", + "version":"0.07", "description": "Simple CLI-Styled Clock", "tags": "clock,cli,command,bash,shell", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "cliock.app.js", "url": "app.js" }, - { "name": "cliock.img", "url": "app-icon.js", "evaluate": true } + {"name":"cliock.app.js","url":"app.js"}, + {"name":"cliock.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "widver", + { "id": "widver", "name": "Firmware Version Widget", "icon": "widget.png", - "version": "0.01", + "version":"0.01", "description": "Display the version of the installed firmware in the top widget section.", "tags": "widget,tool,system", - "type": "widget", - "storage": [{ "name": "widver.wid.js", "url": "widget.js" }] + "type":"widget", + "storage": [ + {"name":"widver.wid.js","url":"widget.js"} + ] }, - { - "id": "barclock", + { "id": "barclock", "name": "Bar Clock", "icon": "clock-bar.png", - "version": "0.05", + "version":"0.05", "description": "A simple digital clock showing seconds as a bar", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "barclock.app.js", "url": "clock-bar.js" }, - { "name": "barclock.img", "url": "clock-bar-icon.js", "evaluate": true } + {"name":"barclock.app.js","url":"clock-bar.js"}, + {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true} ] }, - { - "id": "dotclock", + { "id": "dotclock", "name": "Dot Clock", "icon": "clock-dot.png", - "version": "0.01", + "version":"0.01", "description": "A Minimal Dot Analog Clock", "tags": "clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "dotclock.app.js", "url": "clock-dot.js" }, - { "name": "dotclock.img", "url": "clock-dot-icon.js", "evaluate": true } + {"name":"dotclock.app.js","url":"clock-dot.js"}, + {"name":"dotclock.img","url":"clock-dot-icon.js","evaluate":true} ] }, - { - "id": "widtbat", + { "id": "widtbat", "name": "Tiny Battery Widget", "icon": "widget.png", - "version": "0.01", + "version":"0.01", "description": "Tiny blueish battery widget, vibs and changes level color when charging", "tags": "widget,tool,system", - "type": "widget", - "storage": [{ "name": "widtbat.wid.js", "url": "widget.js" }] + "type":"widget", + "storage": [ + {"name":"widtbat.wid.js","url":"widget.js"} + ] }, - { - "id": "chrono", + { "id": "chrono", "name": "Chrono", - "shortName": "Chrono", + "shortName":"Chrono", "icon": "chrono.png", - "version": "0.01", + "version":"0.01", "description": "Single click BTN1 to add 5 minutes. Single click BTN2 to add 30 seconds. Single click BTN3 to add 5 seconds. Tap to pause or play to timer. Double click BTN1 to reset. When timer finishes the watch vibrates.", "tags": "Tools", "storage": [ - { "name": "chrono.app.js", "url": "chrono.js" }, - { "name": "chrono.img", "url": "chrono-icon.js", "evaluate": true } + {"name":"chrono.app.js","url":"chrono.js"}, + {"name":"chrono.img","url":"chrono-icon.js","evaluate":true} ] }, - { - "id": "astrocalc", + { "id": "astrocalc", "name": "Astrocalc", "icon": "astrocalc.png", - "version": "0.02", + "version":"0.02", "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.", "tags": "app,sun,moon,cycles,tool,outdoors", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "astrocalc.app.js", "url": "astrocalc-app.js" }, - { "name": "suncalc.js", "url": "suncalc.js" }, - { "name": "astrocalc.img", "url": "astrocalc-icon.js", "evaluate": true }, - { - "name": "first-quarter.img", - "url": "first-quarter-icon.js", - "evaluate": true - }, - { - "name": "last-quarter.img", - "url": "last-quarter-icon.js", - "evaluate": true - }, - { - "name": "waning-crescent.img", - "url": "waning-crescent-icon.js", - "evaluate": true - }, - { - "name": "waning-gibbous.img", - "url": "waning-gibbous-icon.js", - "evaluate": true - }, - { "name": "full.img", "url": "full-icon.js", "evaluate": true }, - { "name": "new.img", "url": "new-icon.js", "evaluate": true }, - { - "name": "waxing-gibbous.img", - "url": "waxing-gibbous-icon.js", - "evaluate": true - }, - { - "name": "waxing-crescent.img", - "url": "waxing-crescent-icon.js", - "evaluate": true - } + {"name":"astrocalc.app.js","url":"astrocalc-app.js"}, + {"name":"suncalc.js","url":"suncalc.js"}, + {"name":"astrocalc.img","url":"astrocalc-icon.js","evaluate":true}, + {"name":"first-quarter.img","url":"first-quarter-icon.js","evaluate":true}, + {"name":"last-quarter.img","url":"last-quarter-icon.js","evaluate":true}, + {"name":"waning-crescent.img","url":"waning-crescent-icon.js","evaluate":true}, + {"name":"waning-gibbous.img","url":"waning-gibbous-icon.js","evaluate":true}, + {"name":"full.img","url":"full-icon.js","evaluate":true}, + {"name":"new.img","url":"new-icon.js","evaluate":true}, + {"name":"waxing-gibbous.img","url":"waxing-gibbous-icon.js","evaluate":true}, + {"name":"waxing-crescent.img","url":"waxing-crescent-icon.js","evaluate":true} ] }, - { - "id": "widhwt", + { "id": "widhwt", "name": "Hand Wash Timer", "icon": "widget.png", - "version": "0.01", + "version":"0.01", "description": "Swipe your wrist over the watch face to start your personal Bangle.js hand wash timer for 35 sec. Start washing after the short buzz and stop after the long buzz.", "tags": "widget,tool", - "type": "widget", - "storage": [{ "name": "widhwt.wid.js", "url": "widget.js" }] + "type":"widget", + "storage": [ + {"name":"widhwt.wid.js","url":"widget.js"} + ] }, - { - "id": "toucher", + { "id": "toucher", "name": "Touch Launcher", - "shortName": "Toucher", + "shortName":"Toucher", "icon": "app.png", - "version": "0.06", + "version":"0.06", "description": "Touch enable left to right launcher.", "tags": "tool,system,launcher", - "type": "launch", - "data": [{ "name": "toucher.json" }], - "storage": [ - { "name": "toucher.app.js", "url": "app.js" }, - { "name": "toucher.settings.js", "url": "settings.js" } + "type":"launch", + "data": [ + {"name":"toucher.json"} ], - "sortorder": -10 + "storage": [ + {"name":"toucher.app.js","url":"app.js"}, + {"name":"toucher.settings.js","url":"settings.js"} + ], + "sortorder" : -10 }, { "id": "balltastic", @@ -1256,9 +1147,9 @@ "tags": "game,fun", "type": "app", "storage": [ - { "name": "balltastic.app.js", "url": "app.js" }, - { "name": "balltastic.img", "url": "app-icon.js", "evaluate": true } - ] + {"name":"balltastic.app.js","url":"app.js"}, + {"name":"balltastic.img","url":"app-icon.js","evaluate":true} + ] }, { "id": "rpgdice", @@ -1270,22 +1161,22 @@ "type": "app", "allow_emulator": true, "storage": [ - { "name": "rpgdice.app.js", "url": "app.js" }, - { "name": "rpgdice.img", "url": "app-icon.js", "evaluate": true } + {"name":"rpgdice.app.js","url": "app.js"}, + {"name":"rpgdice.img","url": "app-icon.js","evaluate":true} ] }, - { - "id": "widmp", + { "id": "widmp", "name": "Moon Phase Widget", "icon": "widget.png", - "version": "0.01", + "version":"0.01", "description": "Display the current moon phase in blueish for the northern hemisphere in eight phases", "tags": "widget,tools", - "type": "widget", - "storage": [{ "name": "widmp.wid.js", "url": "widget.js" }] + "type":"widget", + "storage": [ + {"name":"widmp.wid.js","url":"widget.js"} + ] }, - { - "id": "minionclk", + { "id": "minionclk", "name": "Minion clock", "icon": "minionclk.png", "version": "0.02", @@ -1294,183 +1185,171 @@ "type": "clock", "allow_emulator": true, "storage": [ - { "name": "minionclk.app.js", "url": "app.js" }, - { "name": "minionclk.img", "url": "app-icon.js", "evaluate": true } + {"name":"minionclk.app.js","url":"app.js"}, + {"name":"minionclk.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "openstmap", + { "id": "openstmap", "name": "OpenStreetMap", - "shortName": "OpenStMap", + "shortName":"OpenStMap", "icon": "app.png", - "version": "0.03", + "version":"0.03", "description": "[BETA] Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are", "tags": "outdoors,gps", "custom": "custom.html", "storage": [ - { "name": "openstmap.app.js", "url": "app.js" }, - { "name": "openstmap.img", "url": "app-icon.js", "evaluate": true } + {"name":"openstmap.app.js","url":"app.js"}, + {"name":"openstmap.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "activepedom", + { "id": "activepedom", "name": "Active Pedometer", - "shortName": "Active Pedometer", + "shortName":"Active Pedometer", "icon": "app.png", - "version": "0.04", + "version":"0.04", "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.", "tags": "outdoors,widget", - "readme": "README.md", + "readme": "README.md", "storage": [ - { "name": "activepedom.wid.js", "url": "widget.js" }, - { "name": "activepedom.settings.js", "url": "settings.js" }, - { "name": "activepedom.img", "url": "app-icon.js", "evaluate": true }, - { "name": "activepedom.app.js", "url": "app.js" } + {"name":"activepedom.wid.js","url":"widget.js"}, + {"name":"activepedom.settings.js","url":"settings.js"}, + {"name":"activepedom.img","url":"app-icon.js","evaluate":true}, + {"name":"activepedom.app.js","url":"app.js"} ] }, - { - "id": "chronowid", + { "id": "chronowid", "name": "Chrono Widget", - "shortName": "Chrono Widget", + "shortName":"Chrono Widget", "icon": "app.png", - "version": "0.03", + "version":"0.03", "description": "Chronometer (timer) which runs as widget.", "tags": "tools,widget", - "readme": "README.md", + "readme": "README.md", "storage": [ - { "name": "chronowid.wid.js", "url": "widget.js" }, - { "name": "chronowid.app.js", "url": "app.js" }, - { "name": "chronowid.img", "url": "app-icon.js", "evaluate": true } + {"name":"chronowid.wid.js","url":"widget.js"}, + {"name":"chronowid.app.js","url":"app.js"}, + {"name":"chronowid.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "tabata", + { "id": "tabata", "name": "Tabata", "shortName": "Tabata - Control High-Intensity Interval Training", "icon": "tabata.png", - "version": "0.01", + "version":"0.01", "description": "Control high-intensity interval training (according to tabata: https://en.wikipedia.org/wiki/Tabata_method).", "tags": "workout,health", "storage": [ - { "name": "tabata.app.js", "url": "tabata.js" }, - { "name": "tabata.img", "url": "tabata-icon.js", "evaluate": true } + {"name":"tabata.app.js","url":"tabata.js"}, + {"name":"tabata.img","url":"tabata-icon.js","evaluate":true} ] }, - { - "id": "custom", + { "id": "custom", "name": "Custom Boot Code ", "icon": "custom.png", - "version": "0.01", + "version":"0.01", "description": "Add code you want to run at boot time", "tags": "tool,system", "type": "bootloader", - "custom": "custom.html", - "storage": [{ "name": "custom" }] - }, - { - "id": "devstopwatch", - "name": "Dev Stopwatch", - "shortName": "Dev Stopwatch", - "icon": "app.png", - "version": "0.01", - "description": "Stopwatch with 5 laps supported (cyclically replaced)", - "tags": "stopwatch, chrono, timer, chronometer", - "allow_emulator": true, + "custom":"custom.html", "storage": [ - { "name": "devstopwatch.app.js", "url": "app.js" }, - { "name": "devstopwatch.img", "url": "app-icon.js", "evaluate": true } + {"name":"custom"} ] }, - { - "id": "batchart", + { "id": "devstopwatch", + "name": "Dev Stopwatch", + "shortName":"Dev Stopwatch", + "icon": "app.png", + "version":"0.01", + "description": "Stopwatch with 5 laps supported (cyclically replaced)", + "tags": "stopwatch, chrono, timer, chronometer", + "allow_emulator":true, + "storage": [ + {"name":"devstopwatch.app.js","url":"app.js"}, + {"name":"devstopwatch.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "batchart", "name": "Battery Chart", - "shortName": "Battery Chart", + "shortName":"Battery Chart", "icon": "app.png", - "version": "0.09", + "version":"0.09", "readme": "README.md", "description": "A widget and an app for recording and visualizing battery percentage over time.", "tags": "app,widget,battery,time,record,chart,tool", "storage": [ - { "name": "batchart.wid.js", "url": "widget.js" }, - { "name": "batchart.app.js", "url": "app.js" }, - { "name": "batchart.img", "url": "app-icon.js", "evaluate": true } + {"name":"batchart.wid.js","url":"widget.js"}, + {"name":"batchart.app.js","url":"app.js"}, + {"name":"batchart.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "nato", + { "id": "nato", "name": "NATO Alphabet", - "shortName": "NATOAlphabet", + "shortName" : "NATOAlphabet", "icon": "nato.png", - "version": "0.01", + "version":"0.01", "type": "app", "description": "Learn the NATO Phonetic alphabet plus some numbers.", "tags": "app,learn,visual", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "nato.app.js", "url": "nato.js" }, - { "name": "nato.img", "url": "nato-icon.js", "evaluate": true } + {"name":"nato.app.js","url":"nato.js"}, + {"name":"nato.img","url":"nato-icon.js","evaluate":true} ] }, - { - "id": "numerals", + { "id": "numerals", "name": "Numerals Clock", "shortName": "Numerals Clock", "icon": "numerals.png", - "version": "0.05", + "version":"0.05", "description": "A simple big numerals clock", "tags": "numerals,clock", - "type": "clock", - "allow_emulator": true, + "type":"clock", + "allow_emulator":true, "storage": [ - { "name": "numerals.app.js", "url": "numerals.app.js" }, - { "name": "numerals.img", "url": "numerals-icon.js", "evaluate": true }, - { "name": "numerals.settings.js", "url": "numerals.settings.js" } + {"name":"numerals.app.js","url":"numerals.app.js"}, + {"name":"numerals.img","url":"numerals-icon.js","evaluate":true}, + {"name":"numerals.settings.js","url":"numerals.settings.js"} ], - "data": [{ "name": "numerals.json" }] + "data":[ + {"name":"numerals.json"} + ] }, - { - "id": "bledetect", + { "id": "bledetect", "name": "BLE Detector", - "shortName": "BLE Detector", + "shortName":"BLE Detector", "icon": "bledetect.png", - "version": "0.02", + "version":"0.02", "description": "Detect BLE devices and show some informations.", "tags": "app,bluetooth,tool", "readme": "README.md", "storage": [ - { "name": "bledetect.app.js", "url": "bledetect.js" }, - { "name": "bledetect.img", "url": "bledetect-icon.js", "evaluate": true } + {"name":"bledetect.app.js","url":"bledetect.js"}, + {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true} ] }, - { - "id": "snake", + { "id": "snake", "name": "Snake", - "shortName": "Snake", + "shortName":"Snake", "icon": "snake.png", - "version": "0.02", + "version":"0.02", "description": "The classic snake game. Eat apples and don't bite your tail.", "tags": "game,fun", "readme": "README.md", "storage": [ - { "name": "snake.app.js", "url": "snake.js" }, - { "name": "snake.img", "url": "snake-icon.js", "evaluate": true } + {"name":"snake.app.js","url":"snake.js"}, + {"name":"snake.img","url":"snake-icon.js","evaluate":true} ] }, - { - "id": "calculator", + { "id": "calculator", "name": "Calculator", - "shortName": "Calculator", + "shortName":"Calculator", "icon": "calculator.png", - "version": "0.02", + "version":"0.02", "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", "tags": "app,tool", "storage": [ - { "name": "calculator.app.js", "url": "app.js" }, - { - "name": "calculator.img", - "url": "calculator-icon.js", - "evaluate": true - } + {"name":"calculator.app.js","url":"app.js"}, + {"name":"calculator.img","url":"calculator-icon.js","evaluate":true} ] }, { @@ -1499,7 +1378,7 @@ "id": "buffgym", "name": "BuffGym", "icon": "buffgym.png", - "version": "0.02", + "version":"0.02", "description": "BuffGym is the famous 5x5 workout program for the BangleJS", "tags": "tool,outdoors,gym,exercise", "type": "app", @@ -1507,17 +1386,14 @@ "allow_emulator": false, "readme": "README.md", "storage": [ - { "name": "buffgym.app.js", "url": "buffgym.app.js" }, - { "name": "buffgym-set.js", "url": "buffgym-set.js" }, - { "name": "buffgym-exercise.js", "url": "buffgym-exercise.js" }, - { "name": "buffgym-workout.js", "url": "buffgym-workout.js" }, - { "name": "buffgym-workout-a.json", "url": "buffgym-workout-a.json" }, - { "name": "buffgym-workout-b.json", "url": "buffgym-workout-b.json" }, - { - "name": "buffgym-workout-index.json", - "url": "buffgym-workout-index.json" - }, - { "name": "buffgym.img", "url": "buffgym-icon.js", "evaluate": true } + {"name":"buffgym.app.js", "url": "buffgym.app.js"}, + {"name":"buffgym-set.js","url":"buffgym-set.js"}, + {"name":"buffgym-exercise.js","url":"buffgym-exercise.js"}, + {"name":"buffgym-workout.js","url":"buffgym-workout.js"}, + {"name":"buffgym-workout-a.json","url":"buffgym-workout-a.json"}, + {"name":"buffgym-workout-b.json","url":"buffgym-workout-b.json"}, + {"name":"buffgym-workout-index.json","url":"buffgym-workout-index.json"}, + {"name":"buffgym.img","url":"buffgym-icon.js","evaluate":true} ] }, { @@ -1545,7 +1421,7 @@ "id": "metronome", "name": "Metronome", "icon": "metronome_icon.png", - "version": "0.03", + "version": "0.04", "readme": "README.md", "description": "Makes the watch blinking and vibrating with a given rate", "tags": "tool", @@ -1562,78 +1438,73 @@ } ] }, - { - "id": "blackjack", + { "id": "blackjack", "name": "Black Jack game", - "shortName": "Black Jack game", + "shortName":"Black Jack game", "icon": "blackjack.png", - "version": "0.01", + "version":"0.01", "description": "Simple implementation of card game Black Jack", "tags": "game", - "allow_emulator": true, + "allow_emulator":true, "storage": [ - { "name": "blackjack.app.js", "url": "blackjack.app.js" }, - { "name": "blackjack.img", "url": "blackjack-icon.js", "evaluate": true } + {"name":"blackjack.app.js","url":"blackjack.app.js"}, + {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true} ] }, - { - "id": "hidcam", + { "id": "hidcam", "name": "Camera shutter", - "shortName": "Cam shutter", + "shortName":"Cam shutter", "icon": "app.png", - "version": "0.03", + "version":"0.03", "description": "Enable HID, connect to your phone, start your camera and trigger the shot on your Bangle", "readme": "README.md", "tags": "bluetooth,tool", "storage": [ - { "name": "hidcam.app.js", "url": "app.js" }, - { "name": "hidcam.img", "url": "app-icon.js", "evaluate": true } + {"name":"hidcam.app.js","url":"app.js"}, + {"name":"hidcam.img","url":"app-icon.js","evaluate":true} ] }, { "id": "rclock", "name": "Round clock with seconds, minutes and date", - "shortName": "Round Clock", + "shortName":"Round Clock", "icon": "app.png", - "version": "0.02", + "version":"0.02", "description": "Designed round clock with ticks for minutes and seconds and heart rate indication", "tags": "clock", "type": "clock", "storage": [ - { "name": "rclock.app.js", "url": "rclock.app.js" }, - { "name": "rclock.img", "url": "app-icon.js", "evaluate": true } + {"name":"rclock.app.js","url":"rclock.app.js"}, + {"name":"rclock.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "hamloc", + { "id": "hamloc", "name": "QTH Locator / Maidenhead Locator System", "shortName": "QTH Locator", "icon": "app.png", - "version": "0.01", + "version":"0.01", "description": "Convert your current GPS location to the Maidenhead locator system used by HAM amateur radio operators", "tags": "tool,outdoors,gps", "readme": "README.md", "storage": [ - { "name": "hamloc.app.js", "url": "app.js" }, - { "name": "hamloc.img", "url": "app-icon.js", "evaluate": true } + {"name":"hamloc.app.js","url":"app.js"}, + {"name":"hamloc.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "osmpoi", + { "id": "osmpoi", "name": "POI Compass", "icon": "app.png", - "version": "0.03", + "version":"0.03", "description": "Uploads all the points of interest in an area onto your watch, same as Beer Compass with more p.o.i.", "tags": "tool,outdoors,gps", "readme": "README.md", "custom": "custom.html", "storage": [ - { "name": "osmpoi.app.js" }, - { "name": "osmpoi.img", "url": "app-icon.js", "evaluate": true } + {"name":"osmpoi.app.js"}, + {"name":"osmpoi.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "pong", + { "id": "pong", "name": "Pong", "shortName": "Pong", "icon": "pong.png", @@ -1644,12 +1515,11 @@ "allow_emulator": true, "readme": "README.md", "storage": [ - { "name": "pong.app.js", "url": "app.js" }, - { "name": "pong.img", "url": "app-icon.js", "evaluate": true } + {"name":"pong.app.js","url":"app.js"}, + {"name":"pong.img","url":"app-icon.js","evaluate":true} ] }, - { - "id": "ballmaze", + { "id": "ballmaze", "name": "Ball Maze", "icon": "icon.png", "version": "0.01", @@ -1658,10 +1528,12 @@ "tags": "game", "type": "app", "storage": [ - { "name": "ballmaze.app.js", "url": "app.js" }, - { "name": "ballmaze.img", "url": "icon.js", "evaluate": true } + {"name": "ballmaze.app.js","url":"app.js"}, + {"name": "ballmaze.img","url":"icon.js","evaluate": true} ], - "data": [{ "name": "ballmaze.json" }] + "data": [ + {"name": "ballmaze.json"} + ] }, { "id": "calendar", @@ -1684,24 +1556,23 @@ } ] }, - { - "id": "hidjoystick", + { "id": "hidjoystick", "name": "Bluetooth Joystick", "shortName": "Joystick", "icon": "app.png", - "version": "0.01", + "version":"0.01", "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.", "tags": "bluetooth", "storage": [ - { "name": "hidjoystick.app.js", "url": "app.js" }, - { "name": "hidjoystick.img", "url": "app-icon.js", "evaluate": true } + {"name":"hidjoystick.app.js","url":"app.js"}, + {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true} ] }, { "id": "largeclock", "name": "Large Clock", "icon": "largeclock.png", - "version": "0.01", + "version": "0.02", "description": "A readable and informational digital watch, with date, seconds and moon phase", "readme": "README.md", "tags": "clock", @@ -1728,23 +1599,22 @@ } ] }, - { - "id": "smtswch", + { "id": "smtswch", "name": "Smart Switch", - "shortName": "Smart Switch", + "shortName":"Smart Switch", "icon": "app.png", - "version": "0.01", + "version":"0.01", "description": "Using EspruinoHub, control your smart devices on and off via Bluetooth Low Energy!", "tags": "bluetooth,btle,smart,switch", "type": "app", "readme": "README.md", "storage": [ - { "name": "smtswch.app.js", "url": "app.js" }, - { "name": "smtswch.img", "url": "app-icon.js", "evaluate": true }, - { "name": "light-on.img", "url": "light-on.js", "evaluate": true }, - { "name": "light-off.img", "url": "light-off.js", "evaluate": true }, - { "name": "switch-on.img", "url": "switch-on.js", "evaluate": true }, - { "name": "switch-off.img", "url": "switch-off.js", "evaluate": true } + {"name":"smtswch.app.js","url":"app.js"}, + {"name":"smtswch.img","url":"app-icon.js","evaluate":true}, + {"name":"light-on.img","url":"light-on.js","evaluate":true}, + {"name":"light-off.img","url":"light-off.js","evaluate":true}, + {"name":"switch-on.img","url":"switch-on.js","evaluate":true}, + {"name":"switch-off.img","url":"switch-off.js","evaluate":true} ] }, { @@ -1782,29 +1652,43 @@ "id": "beebclock", "name": "Beeb Clock", "icon": "beebclock.png", - "version": "0.02", + "version":"0.02", "description": "Clock face that may be coincidentally familiar to BBC viewers", "tags": "clock", "type": "clock", "allow_emulator": true, "storage": [ - { "name": "beebclock.app.js", "url": "beebclock.js" }, - { "name": "beebclock.img", "url": "beebclock-icon.js", "evaluate": true } + {"name":"beebclock.app.js","url":"beebclock.js"}, + {"name":"beebclock.img","url":"beebclock-icon.js","evaluate":true} ] }, - { - "id": "findphone", + { "id": "findphone", "name": "Find Phone", - "shortName": "Find Phone", + "shortName":"Find Phone", "icon": "app.png", - "version": "0.01", + "version":"0.01", "description": "Find your phone via Gadgetbridge. Click any button to let your phone ring. 📳", "tags": "tool,android", "readme": "README.md", "allow_emulator": true, "storage": [ - { "name": "findphone.app.js", "url": "app.js" }, - { "name": "findphone.img", "url": "app-icon.js", "evaluate": true } + {"name":"findphone.app.js","url":"app.js"}, + {"name":"findphone.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "getup", + "name": "Get Up", + "shortName":"Get Up", + "icon": "app.png", + "version":"0.01", + "description": "Reminds you to getup every x minutes. Sitting to long is dangerous!", + "tags": "tools,health", + "readme": "README.md", + "allow_emulator":true, + "storage": [ + {"name":"getup.app.js","url":"app.js"}, + {"name":"getup.settings.js","url":"settings.js"}, + {"name":"getup.img","url":"app-icon.js","evaluate":true} ] }, { @@ -1827,4 +1711,4 @@ {"name":"app.json"} ] } -] +] \ No newline at end of file From 883147bc0030a2e34807bc560f212dee7aa7f81a Mon Sep 17 00:00:00 2001 From: Richard Hopkins Date: Mon, 11 May 2020 17:05:27 +0100 Subject: [PATCH 54/54] Speed up drawing --- apps/gallifr/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js index 45769f35b..b775d247f 100644 --- a/apps/gallifr/app.js +++ b/apps/gallifr/app.js @@ -30,7 +30,7 @@ const drawSegment = (params) => { x = centerX + (params.x * radius); y = centerY - (params.y *radius); g.setColor(0,0,0); - incr = cirRad/60; + incr = cirRad/15; for (i = angle1; i < angle2; i=i+incr) { brush = thickness * (angle2-angle1) /angle2; points = [