From 902ea72ddedecf2abce4ea7c2111532108c2cdb5 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Mon, 4 Oct 2021 18:10:29 +0200 Subject: [PATCH 01/21] Set theme jekyll-theme-minimal --- _config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 _config.yml diff --git a/_config.yml b/_config.yml new file mode 100644 index 000000000..2f7efbeab --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-minimal \ No newline at end of file From 1ab8fbabffba72f92008fbd991bef9d7ac7e9b6a Mon Sep 17 00:00:00 2001 From: Vingelar Date: Mon, 4 Oct 2021 18:13:37 +0200 Subject: [PATCH 02/21] Create app.js --- apps/TheBinWatch/app.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/TheBinWatch/app.js diff --git a/apps/TheBinWatch/app.js b/apps/TheBinWatch/app.js new file mode 100644 index 000000000..fd538074f --- /dev/null +++ b/apps/TheBinWatch/app.js @@ -0,0 +1 @@ +E.showMessage("My\nSimple\nApp","My App") From 2e34b337a4a1139942633b5f61e9536330356d44 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Mon, 4 Oct 2021 18:23:05 +0200 Subject: [PATCH 03/21] Create app-icon.js --- apps/TheBinWatch/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/TheBinWatch/app-icon.js diff --git a/apps/TheBinWatch/app-icon.js b/apps/TheBinWatch/app-icon.js new file mode 100644 index 000000000..bb87c1926 --- /dev/null +++ b/apps/TheBinWatch/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkGAoMM7oAQoMRiIXBrnMACHAGofMn//AB385gWCgvM/85nQTJ+RCBiMj5lQLwXD/+YpIXJmH/+MRj5ID5nf/+B/IXJ+EikIXBnhIBIwX/nGDLhUzAAM//oXBhnEOp4ADJANc54JF+MjFAUzmUfBoss4qlH5kIxAACwHNVI5eCAAfz5kBC4cREwwOBC4wgB6AXDhnMKwwXHlnM4pICwFc5jNBC5gHBMAcgAwQXMWAIABqAXBggGCcwIXKcAIAB4EowJeBAAJgFC4wPC5nEhGAAwYQHSwwACiUkAwipEM44APC4nziS7DxHz/4GE/4wDC4n8RQQAC/nfAwn9PIYXElnAjAPCx884f4Awf8bQYXEaYmIn4GB+YXD7gSFagkQLwaKCAwraCC4bUC4APBwf8aYU4AwoXFaYg/DAwJgBMoLaEAYTUEgSeBdYhlDbQYKCHARIDAwnPUoIGEC4c97oAC6MvAwnTQgIGFU4gASC4SDBWoc/aYeIwUjAwsvC4QJEn/NAwmAbQgGBPoQzBBIfyaYmIgoGFiBfEBATNCaYQABhgGFh4XEIITUC4YGCwFcbQYGBj4XEKQTUDAwUQbQgXBR4hIDagdPAwMEAwXfAwMCC404x88cgf4wMcAwRPBwJeB+YHBn5gCSwQAC/ClBAAfzUoP/H4Nc54wC+fUogABpv/kQGEn8iCAM84sM4j/MAA3M4DJBA4cRn8/+UiE4IDBkcj+YOC+nMqEAQAIICmcin/zCgIXBl8zC4heBgEAhnDBAQSBl/ymfyAgIfBDYIOC7nAC4RIDNQXzl8j/8yDgMvQwZeBC4JIBVIQANIwYABri1EABnFC4ZIBACBGC")) From 74a448a7156b1adf2068c98e092274d8c34c948a Mon Sep 17 00:00:00 2001 From: Vingelar Date: Mon, 4 Oct 2021 18:28:03 +0200 Subject: [PATCH 04/21] Update apps.json --- apps.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps.json b/apps.json index 83690cf3e..fb44dda2f 100644 --- a/apps.json +++ b/apps.json @@ -3540,5 +3540,17 @@ {"name":"waveclk.app.js","url":"app.js"}, {"name":"waveclk.img","url":"app-icon.js","evaluate":true} ] +}, +{ "id": "TheBinWatch", + "name": "Binary Watch", + "shortName":"BinWatch", + "icon": "app.png", + "version":"0.01", + "description": "Famous binary watch", + "tags": "", + "storage": [ + {"name":"binwatch.app.js","url":"app.js"}, + {"name":"binwatch.img","url":"app-icon.js","evaluate":true} + ] } ] From 0cfee929d2e63eba8406e78e051fa44e15a3876b Mon Sep 17 00:00:00 2001 From: Vingelar Date: Mon, 4 Oct 2021 18:51:48 +0200 Subject: [PATCH 05/21] Update app.js --- apps/TheBinWatch/app.js | 265 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 264 insertions(+), 1 deletion(-) diff --git a/apps/TheBinWatch/app.js b/apps/TheBinWatch/app.js index fd538074f..c395c6684 100644 --- a/apps/TheBinWatch/app.js +++ b/apps/TheBinWatch/app.js @@ -1 +1,264 @@ -E.showMessage("My\nSimple\nApp","My App") +/*************************************************** +* BINARY WATCH +* for Bangle 1 / 2 +* inspired by RAL tec binary wrist watch +* +* TODO: +* - vibrate on full hour +* - +****************************************************/ + +/* reuqirements */ +var locale = require("locale"); +require("Font5x9Numeric7Seg").add(Graphics); + + +/* constants and definitions */ +/* Bangle 2: 176 x 176 */ + +/* +var x_step = 26; +var y_step = 34; + +var TIME_Y_OFFSET = 30; +var HX = 35, HY = 0 + TIME_Y_OFFSET; +var MX = 10, MY = 40 + TIME_Y_OFFSET; +var SX = 10, SY = 80 + TIME_Y_OFFSET; +var BT_X = 30, BT_Y = 10; +var DX = 160, DY = 148; +*/ +/* Bangle 1: 240 x 240 */ + +var x_step = 35; +var y_step = 46; + +var TIME_Y_OFFSET = 41; +var HX = 48, HY = 0 + TIME_Y_OFFSET; +var MX = 14, MY = 55 + TIME_Y_OFFSET; +var SX = 14, SY = 110 + TIME_Y_OFFSET; +var BT_X = 41, BT_Y = 14; +//var BT_X = 20, BT_Y = 14; +var DX = 160, DY = 205; + +var BAT_POS_X = 175, BAT_POS_Y = 21; +var BAT_SIZE_X = 3, BAT_SIZE_Y = 5; + +/* global variables */ + + +//var screen_size_x = 176; +//var screen_size_y = 176; + +var screen_size_x = 240; +var screen_size_y = 240; + +var showDateTime = 2; /* show noting, time or date */ +var cg = Graphics.createArrayBuffer( + screen_size_x,screen_size_y, 1, {msb:true}); +var cgimg = {width:screen_size_x, height:screen_size_y, bpp:1, + transparent:0, buffer:cg.buffer}; + +/* local functions */ + +/** + * function drawSquare(...) + * + * go through all bits and draw a square if a bit + * is set. So we get the binary representation + * of the value + * used to draw block for hours, mintutes, seconds, date + * + * @param gfx: graphic object to use + * @param x: x-coordinate of 1st the square + * @param y: y-coordinate of 1st the square + * @param data: data conatining the bit information + * @param numOfBits: number of bits to draw +*/ +function drawSquare(gfx, x, y, data, numOfBits) { + + for(i = numOfBits; i > 0 ; i--) { + if( (data & 1) != 0) { + gfx.fillRect(x + (i - 1) * x_step, y, + x + i * x_step , y + y_step); + } + data >>= 1; /* shift one bit right */ + } +} + +/** + * function drawBinary(...) + * draw the time in binary format + * default display for geeks and real men + + * @param h: hours + * @param m: minutes + * @param s: seconds +*/ +function drawBinary(gfx, hour, minute, second) { + gfx.clear(1); + gfx.setColor(1); + gfx.fillRect(0, 0, screen_size_x, screen_size_y); + gfx.setColor(0); + + if(hour > 12) { + hour -= 12; /* we use for bit for hours so we only display 12 hours*/ + } + drawSquare(gfx, HX, HY, hour, 4); /* set hour */ + drawSquare(gfx, MX, MY, minute, 6); /* set minute */ + drawSquare(gfx, SX, SY, second, 6); /* set second */ +} + +/** + * function drawTime(...) + * show time under the graphic + * for wimps and commies + * + * @param h: hours + * @param m: minutes + * @param s: seconds +*/ + +function drawTime(gfx, h, m, s) { + var time = (" "+h).substr(-2) + ":" + ("0"+m).substr(-2)+ ":" + ("0"+s).substr(-2); + + gfx.setFontAlign(0,-1); // align right bottom + gfx.setFont("5x9Numeric7Seg", 2); + gfx.drawString(time, gfx.getWidth() / 2, DY, false /*clear background*/); + +} + +/** + * function drawDate(...) + * show date under the graphic + * (optionally) + * + * @param gfx: graphic object to use + * @param d: date object +*/ + +function drawDate(gfx, d) { + var dateString = "" + + ("0" + d.getDate()).substr(-2) + " " + + ("0" + d.getMonth()).substr(-2) + " " + + ("0" + d.getFullYear()).substr(-4) + ; + + gfx.setFontAlign(0,-1); // align right bottom + gfx.setFont("5x9Numeric7Seg",2); /* draw the current time font */ + gfx.drawString(dateString, gfx.getWidth() / 2, DY, false /*clear background*/); + +// gfx.setFont("6x8",2); +// var date = locale.date(d, false); +// gfx.drawString(date, DX, DY, false); +// draw the seconds (2x size 7 segment) +// gfx.setFont("7x11Numeric7Seg",1); +// gfx.drawString(("0"+s).substr(-2), X+30, Y, false /*clear background*/); +} + +function toggleDateTime() { + showDateTime++; + if(showDateTime > 2){ + showDateTime = 0; + } + draw(); +} + +function updateVTime() { + second++; + if(second > 59) { + second = 0; + minute++; + if(minute > 59) { + minute = 0; + hour++; + if(hour > 12) { + hour = 0; + } + } + } +} + +/** + * function drawBattery(...) + * fill the battery symbol with blocks + * according to the battery level + * + * @param gfx: graphic object + * @param level: current battery level +*/ +function drawBattery(gfx, level) { + var pos_x = BAT_POS_X + 5 * (BAT_SIZE_X + 2); + var stepLevel = Math.round((level + 10) / 20); +/* + if(stepLevel < 2) { + gfx.setColor(2); + } else if(stepLevel < 4) { + gfx.setColor(3); + } else { + gfx.setColor(4); + } +*/ + console.log("stepLevel: " + stepLevel); + for(i = 0; i < stepLevel; i++) { + pos_x -= BAT_SIZE_X + 2; + gfx.fillRect(pos_x, BAT_POS_Y, + pos_x + BAT_SIZE_X, BAT_POS_Y + BAT_SIZE_Y); + } +} + +/** + * function drawBattery(...) + * fill the battery symbol with blocks + * according to the battery level + * + * @param gfx: graphic object + * @param level: current battery level +*/ +function drawBT(status) { +} +var hour = 0, minute = 1, second = 50; +var batVLevel = 0; +function draw() { + + var d = new Date(); + var h = d.getHours(), m = d.getMinutes(), s = d.getSeconds(); +// gfx2(hour, minute, second); + drawBinary(cg, h, m, s); + cg.setColor(0); + + switch(showDateTime) { + case 1: +// drawTime(hour, minute, second); + drawTime(cg, h, m, s); + break; + case 2: + drawDate(cg, d); + break; + default: + /* do nothing */ + } + console.log("BatLevel: " + batVLevel); + drawBattery(cg, batVLevel /*E.getBattery()*/); + drawBT(1); + + batVLevel += 2; + if(batVLevel > 100) { + batVLevel = 0; + } + updateVTime(); + g.clear(); + g.drawImages([{image:cgimg}, +// {image:require("Storage").read("Background176_center.png")}, + {image:require("Storage").read("Background240_center.png")}, + { x:BT_X, y:BT_Y, rotate: 0, image:require("Storage").read("bt-icon.png")}, + ]); +} + +g.clear(); +setInterval(draw, 1000); +var x_size = g.getWidth(); +console.log("Startup: X-W = " + x_size); +console.log("BatLevel: " + E.getBattery()); + +setWatch(toggleDateTime, BTN1, { repeat : true, edge: "falling"}); + From 9b8a01c23da192bd449a9687dc35a736dd726af3 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 7 Oct 2021 09:52:28 +0200 Subject: [PATCH 06/21] Added backgrounds for V1 and V2 + Bluetooth symbol --- apps/TheBinWatch/Background176_center.png | Bin 0 -> 4158 bytes apps/TheBinWatch/Background240_center.png | Bin 0 -> 6492 bytes apps/TheBinWatch/bt-icon.png | Bin 0 -> 628 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/TheBinWatch/Background176_center.png create mode 100644 apps/TheBinWatch/Background240_center.png create mode 100644 apps/TheBinWatch/bt-icon.png diff --git a/apps/TheBinWatch/Background176_center.png b/apps/TheBinWatch/Background176_center.png new file mode 100644 index 0000000000000000000000000000000000000000..9c8ecee53dae7bcf0f81fa2e42d8e3344317bc31 GIT binary patch literal 4158 zcma)9c~}!?8qdWb$3y7E3|f0G9PGmTG`f7PLj_g6-0-tJp3(A;%1D|L8nVj`_XU?|r}b zyQ-v;B&IvZokSurMZyFb_S<{_VPcitZ zAo|}w-Tv`hm0|p*=+-455rAERlN8Dx{no>$^0##i&0tF85}7286hASTi@mt1gxmL% zNOYFhU4$z?dqNLCh57~Yz|>h3Yx@&!1j_Qdsm8b8A| zC(}U>SV4I0VJH zNG}A|jlqK5Hcu3;xbQa+W8M9$LL~?YJV);I_xFRi>IG`ziX+{vcm*)~T?mzZac-l} z&j33V5aA>#Y-_X|ehi{IhF#b#myaFN(RQg5%x;n>$52q%3?wb{{cciB^(z7gJ)~ZC z6`)q*@esd_ZP_l>w6ZAs2qN_o_A$~}YrmVl5fF7bZG9Cpj>L;O?VygtZ&6Nto1>u^ z{-Q$DV(o)%MQ`-wkf|NydRn82fKCY~;E@epUgEH@u+XruB-s%NOdo!3(%xAJNk@|* zg5tLIRO${2wby$&W9+KgeAjH2>ThC$nkWIhB{$~hO+8l&h9%_i_< zw>4sk>wMGMw3b6q@Y!%kg>XX6=0!)Ao8$tJk*rEi?zEL3A-z$R!HjlI+DE1KdY0_} zlaa5_U@l9OVUH~ug{$BBzCR-L@&>n0GFsy=M0EdB0mPa+2uTt0G4xBEd13gKK6g zdq`dp9268~W7v}q1-5M(U?ii|J#ih3Qtk2DFNu=Brq|LQEMmIV(sTu_4$3wot!GfE zUlnr=l}=AzU>4by9UPN^2vSw=0?&n${DdCX>mwy!8}9 z#Wm3s#?Z z4gHlU6Ju=H=Y|b8u(5)WV{YsE%o++=hzhnSr6-UQ!nou@2N0@NaiYq z2*H%}$8D#$ctQw-g`n|!J#SnFj)!cHz-wcbP{~qM@Hyr#JCYD+Uh>SK(WH@9VOb5{ zW^8j#8Fmw+NVC-q3~{tY!|OQvKk^@b9(>tS7;IALb^uqa1Ds6+M}UVctSGWE zsoD3aWMwg`aIPmagtGP6BnnFKQ|hoi)dNv@2X^!Y?%Y8VQ9*Ir{e$f2(X!=sqIU4CRQ6EvzD9 zERG)25%kf^h#;uHWc7Kg+4mEo&w03@{od5@_`e8!f`XWjq|C;}JA3eMZ4j+AIa~dY zOdp~S=CO;)lN@Ml8R>93K|!VZyn1_6MKlcBUxC_e~kBG9B>hZ8G39hU%3o8xSnd01I;DQ&&9u0eZJxS$7 z@4kZ+XB=?ddmE=Ssr7qGuN#afeGv$|ullCh z_Z-8t@h(0SC!>s|)75dRj;>On2Q^i>pnlU2jI`wq5?=Gb1D9WmPW1e8Sg4e)^s-E9 zZ}Fp@tl{aDUYq3pqhbH+=Gias1+Q7WZ+v0f~q%#8)%! zirzcztIiGRz%uL*WjjK_D?@0{=-A$OP~W9+eN%JHI~dPpZ&!Hy&n|`1`dRQL3oDo! z@fqxFQ%cxT4VNKO4R)12i91*gxX`>qoR*XpFLYiQt2$C1cTnhWbgX?8?ug#|%G-u2 zCg)0d>_JGowibKr2ObKyiB-nGwLNYmE3T3u6B;m&j%|t(HX{?Ta(uGl(04X`bNP(P zM4vyIp`j^SI_l|z?UJ+Lp~l54E?ZB3$+5O06dGzuso?J1wJYY*MW3&3RnN>M?`z_- zm$1L7mdZM>?95$Cju4?UnJ%_yVJjMM)#MA=uV8lwZ#z`hD9MQT z+>w`;XQvd_-zY(~!55s4U}Z@CW>gzQM9})a0%Zp7x*_i?08k%JaCm{0kw(nsy=RLZ z!Qo+!;8j%1BX}9UA$T>z?1ja)g>Fzj^Wdnz*Sk4wMxn%fR50}t0l8;I0&y=5vu7ez zI1zYsb5b^{EjeJWTI)y>9(t0r9Tg1gmU8S>Zg{*ckx-b1#}mm5UQ4CK*BM}2p0K>4 w!Zwf%Gj%)i@PG|7!P$gYc=)cEsWsxksifxV!UIED&*pC>qC`nTGb~5{4@KTT(f|Me literal 0 HcmV?d00001 diff --git a/apps/TheBinWatch/Background240_center.png b/apps/TheBinWatch/Background240_center.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa35f93fc6c5e92b98f781d6d42251f370eb8a8 GIT binary patch literal 6492 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 Q2>KnnWX0l>+zk1D04_NZ`v3p{ literal 0 HcmV?d00001 diff --git a/apps/TheBinWatch/bt-icon.png b/apps/TheBinWatch/bt-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c07800ea34b2935ba689265237bf2ccbc4fced55 GIT binary patch literal 628 zcmV-)0*n2LP)C}z~&b@7#oSU1p zg(Mbn7FO^8ayo+?Z-@cQLag!o1eS0gsx%Ei1s)H>I*swX*GEUl@rZfL!Cy{9VVO~>MAT{}{W{1Ek>m7dA>3zFE)&)3t_F;h zzfx-`k7yyxOll^XnUEolQT__b+4RQv1W3&c=3}tABfdGooGLuI7h{~6HNX&$J1AmR z8uGu4=c&xh+3^11-hFF;yn~DY!%}G O0000 Date: Thu, 7 Oct 2021 10:05:18 +0200 Subject: [PATCH 07/21] support V1 and V2 recognize the device we are running on, load related background image and set fitting values --- apps/TheBinWatch/app.js | 184 +++++++++++++++++++++++++++++++--------- 1 file changed, 146 insertions(+), 38 deletions(-) diff --git a/apps/TheBinWatch/app.js b/apps/TheBinWatch/app.js index c395c6684..7e7c67966 100644 --- a/apps/TheBinWatch/app.js +++ b/apps/TheBinWatch/app.js @@ -26,22 +26,73 @@ var MX = 10, MY = 40 + TIME_Y_OFFSET; var SX = 10, SY = 80 + TIME_Y_OFFSET; var BT_X = 30, BT_Y = 10; var DX = 160, DY = 148; +var screen_size_x = 176; +var screen_size_y = 176; */ + +const V2_X_STEP = 26; +const V2_Y_STEP = 34; + +const V2_TIME_Y_OFFSET = 30; +const V2_HX = 35; +const V2_HY = 0 + V2_TIME_Y_OFFSET; +const V2_MX = 10; +const V2_MY = 40 + V2_TIME_Y_OFFSET; +const V2_SX = 10; +const V2_SY = 80 + V2_TIME_Y_OFFSET; +const V2_BT_X = 30; +const V2_BT_Y = 10; +const V2_DX = 160; +const V2_DY = 148; + +const V2_BAT_POS_X = 150; +const V2_BAT_POS_Y = 16; +const V2_BAT_SIZE_X = 2; +const V2_BAT_SIZE_Y = 4; +const V2_SCREEN_SIZE_X = 176; +const V2_SCREEN_SIZE_Y = 176; +const V2_BACKGROUND_IMAGE = "Background176_center.png"; + /* Bangle 1: 240 x 240 */ -var x_step = 35; -var y_step = 46; +const V1_X_STEP = 35; +const V1_Y_STEP = 46; -var TIME_Y_OFFSET = 41; -var HX = 48, HY = 0 + TIME_Y_OFFSET; -var MX = 14, MY = 55 + TIME_Y_OFFSET; -var SX = 14, SY = 110 + TIME_Y_OFFSET; -var BT_X = 41, BT_Y = 14; +const V1_TIME_Y_OFFSET = 41; +const V1_HX = 48; +const V1_HY = 0 + V1_TIME_Y_OFFSET; +const V1_MX = 14; +const V1_MY = 55 + V1_TIME_Y_OFFSET; +const V1_SX = 14; +const V1_SY = 110 + V1_TIME_Y_OFFSET; +const V1_BT_X = 41; +const V1_BT_Y = 14; //var BT_X = 20, BT_Y = 14; -var DX = 160, DY = 205; +const V1_DX = 160; +const V1_DY = 205; -var BAT_POS_X = 175, BAT_POS_Y = 21; -var BAT_SIZE_X = 3, BAT_SIZE_Y = 5; +const V1_BAT_POS_X = 175; +const V1_BAT_POS_Y = 21; +const V1_BAT_SIZE_X = 3; +const V1_BAT_SIZE_Y = 5; +const V1_SCREEN_SIZE_X = 240; +const V1_SCREEN_SIZE_Y = 240; +const V1_BACKGROUND_IMAGE = "Background240_center.png"; +/* runtime settings */ +var x_step = 0; +var y_step = 0; + +var time_y_offset = 0; +var hx = 0, hy = 0; +var mx = 0, my = 0; +var sx = 0, sy = 0; +var bt_x = 0, bt_y = 0; +var dx = 0, dy = 0; + +var bat_pos_x, bat_pos_y, bat_size_x, bat_size_y; +var backgroundImage = ""; +var screen_size_x = 0; +var screen_size_y = 0; /* global variables */ @@ -49,14 +100,10 @@ var BAT_SIZE_X = 3, BAT_SIZE_Y = 5; //var screen_size_x = 176; //var screen_size_y = 176; -var screen_size_x = 240; -var screen_size_y = 240; var showDateTime = 2; /* show noting, time or date */ -var cg = Graphics.createArrayBuffer( - screen_size_x,screen_size_y, 1, {msb:true}); -var cgimg = {width:screen_size_x, height:screen_size_y, bpp:1, - transparent:0, buffer:cg.buffer}; +var cg; +var cgimg; /* local functions */ @@ -103,9 +150,9 @@ function drawBinary(gfx, hour, minute, second) { if(hour > 12) { hour -= 12; /* we use for bit for hours so we only display 12 hours*/ } - drawSquare(gfx, HX, HY, hour, 4); /* set hour */ - drawSquare(gfx, MX, MY, minute, 6); /* set minute */ - drawSquare(gfx, SX, SY, second, 6); /* set second */ + drawSquare(gfx, hx, hy, hour, 4); /* set hour */ + drawSquare(gfx, mx, my, minute, 6); /* set minute */ + drawSquare(gfx, sx, sy, second, 6); /* set second */ } /** @@ -145,7 +192,7 @@ function drawDate(gfx, d) { gfx.setFontAlign(0,-1); // align right bottom gfx.setFont("5x9Numeric7Seg",2); /* draw the current time font */ - gfx.drawString(dateString, gfx.getWidth() / 2, DY, false /*clear background*/); + gfx.drawString(dateString, gfx.getWidth() / 2, dy, false /*clear background*/); // gfx.setFont("6x8",2); // var date = locale.date(d, false); @@ -187,7 +234,7 @@ function updateVTime() { * @param level: current battery level */ function drawBattery(gfx, level) { - var pos_x = BAT_POS_X + 5 * (BAT_SIZE_X + 2); + var pos_x = bat_pos_x + 5 * (bat_size_x + 2); var stepLevel = Math.round((level + 10) / 20); /* if(stepLevel < 2) { @@ -197,12 +244,11 @@ function drawBattery(gfx, level) { } else { gfx.setColor(4); } -*/ - console.log("stepLevel: " + stepLevel); +*/ for(i = 0; i < stepLevel; i++) { - pos_x -= BAT_SIZE_X + 2; - gfx.fillRect(pos_x, BAT_POS_Y, - pos_x + BAT_SIZE_X, BAT_POS_Y + BAT_SIZE_Y); + pos_x -= bat_size_x + 2; + gfx.fillRect(pos_x, bat_pos_y, + pos_x + bat_size_x, bat_pos_y + bat_size_y); } } @@ -215,11 +261,66 @@ function drawBattery(gfx, level) { * @param level: current battery level */ function drawBT(status) { +} +function setRuntimeValues(resolution) { + if(240 == resolution) { + x_step = V1_X_STEP; + y_step = V1_Y_STEP; + + time_y_offset = V1_TIME_Y_OFFSET; + hx = V1_HX; + hy = V1_HY; + mx = V1_MX; + my = V1_MY; + sx = V1_SX; + sy = V1_SY; + bt_x = V1_BT_X; + bt_y = V1_BT_Y; + dx = V1_DX; + dy = V1_DY; + + screen_size_x = V1_SCREEN_SIZE_X; + screen_size_y = V1_SCREEN_SIZE_Y; + backgroundImage = V1_BACKGROUND_IMAGE; + + // TODO: set battery stuff + } else { + x_step = V2_X_STEP; + y_step = V2_Y_STEP; + + time_y_offset = V2_TIME_Y_OFFSET; + + hx = V2_HX; + hy = V2_HY; + mx = V2_MX; + my = V2_MY; + sx = V2_SX; + sy = V2_SY; + + bt_x = V2_BT_X; + bt_y = V2_BT_Y; + + dx = V2_DX; + dy = V2_DY; + + screen_size_x = V2_SCREEN_SIZE_X; + screen_size_y = V2_SCREEN_SIZE_Y; + backgroundImage = V2_BACKGROUND_IMAGE; + // TODO: set battery stuff + } + cg = Graphics.createArrayBuffer( + screen_size_x,screen_size_y, 1, {msb:true}); + + cgimg = {width:screen_size_x, height:screen_size_y, bpp:1, + transparent:0, buffer:cg.buffer}; + } var hour = 0, minute = 1, second = 50; var batVLevel = 0; + + function draw() { - + if (!Bangle.isLCDOn()) {return;} // no drawing, also no new update scheduled var d = new Date(); var h = d.getHours(), m = d.getMinutes(), s = d.getSeconds(); // gfx2(hour, minute, second); @@ -237,7 +338,6 @@ function draw() { default: /* do nothing */ } - console.log("BatLevel: " + batVLevel); drawBattery(cg, batVLevel /*E.getBattery()*/); drawBT(1); @@ -248,17 +348,25 @@ function draw() { updateVTime(); g.clear(); g.drawImages([{image:cgimg}, -// {image:require("Storage").read("Background176_center.png")}, - {image:require("Storage").read("Background240_center.png")}, - { x:BT_X, y:BT_Y, rotate: 0, image:require("Storage").read("bt-icon.png")}, + {image:require("Storage").read(backgroundImage)}, + { x:bt_x, y:bt_y, rotate: 0, image:require("Storage").read("bt-icon.png")}, ]); + const millis = d.getMilliseconds(); + setTimeout(draw, 1000-millis); } -g.clear(); -setInterval(draw, 1000); -var x_size = g.getWidth(); -console.log("Startup: X-W = " + x_size); -console.log("BatLevel: " + E.getBattery()); - +// Show launcher when button pressed +Bangle.setUI("clock"); +setRuntimeValues(g.getWidth()); +Bangle.on("lcdPower", function(on) { + if (on) { + draw(); + } +}); +g.reset().clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +//setInterval(draw, 1000); +//var x_size = g.getWidth(); setWatch(toggleDateTime, BTN1, { repeat : true, edge: "falling"}); - +draw(); From c60dd212f9598ab7ebd4a07288e9f2025f9a82b0 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 7 Oct 2021 10:42:25 +0200 Subject: [PATCH 08/21] minor changes fix wrong variable name (DY -> dy) remove unused code --- apps/TheBinWatch/app.js | 40 +++++++--------------------------------- 1 file changed, 7 insertions(+), 33 deletions(-) diff --git a/apps/TheBinWatch/app.js b/apps/TheBinWatch/app.js index 7e7c67966..6c0abc961 100644 --- a/apps/TheBinWatch/app.js +++ b/apps/TheBinWatch/app.js @@ -14,22 +14,9 @@ require("Font5x9Numeric7Seg").add(Graphics); /* constants and definitions */ + /* Bangle 2: 176 x 176 */ -/* -var x_step = 26; -var y_step = 34; - -var TIME_Y_OFFSET = 30; -var HX = 35, HY = 0 + TIME_Y_OFFSET; -var MX = 10, MY = 40 + TIME_Y_OFFSET; -var SX = 10, SY = 80 + TIME_Y_OFFSET; -var BT_X = 30, BT_Y = 10; -var DX = 160, DY = 148; -var screen_size_x = 176; -var screen_size_y = 176; -*/ - const V2_X_STEP = 26; const V2_Y_STEP = 34; @@ -78,7 +65,9 @@ const V1_BAT_SIZE_Y = 5; const V1_SCREEN_SIZE_X = 240; const V1_SCREEN_SIZE_Y = 240; const V1_BACKGROUND_IMAGE = "Background240_center.png"; + /* runtime settings */ + var x_step = 0; var y_step = 0; @@ -96,11 +85,6 @@ var screen_size_y = 0; /* global variables */ - -//var screen_size_x = 176; -//var screen_size_y = 176; - - var showDateTime = 2; /* show noting, time or date */ var cg; var cgimg; @@ -170,8 +154,7 @@ function drawTime(gfx, h, m, s) { gfx.setFontAlign(0,-1); // align right bottom gfx.setFont("5x9Numeric7Seg", 2); - gfx.drawString(time, gfx.getWidth() / 2, DY, false /*clear background*/); - + gfx.drawString(time, gfx.getWidth() / 2, dy, false /*clear background*/); } /** @@ -187,19 +170,11 @@ function drawDate(gfx, d) { var dateString = "" + ("0" + d.getDate()).substr(-2) + " " + ("0" + d.getMonth()).substr(-2) + " " - + ("0" + d.getFullYear()).substr(-4) - ; + + ("0" + d.getFullYear()).substr(-4); gfx.setFontAlign(0,-1); // align right bottom gfx.setFont("5x9Numeric7Seg",2); /* draw the current time font */ - gfx.drawString(dateString, gfx.getWidth() / 2, dy, false /*clear background*/); - -// gfx.setFont("6x8",2); -// var date = locale.date(d, false); -// gfx.drawString(date, DX, DY, false); -// draw the seconds (2x size 7 segment) -// gfx.setFont("7x11Numeric7Seg",1); -// gfx.drawString(("0"+s).substr(-2), X+30, Y, false /*clear background*/); + gfx.drawString(dateString, gfx.getWidth() / 2, dy, false /* don't clear background*/); } function toggleDateTime() { @@ -323,13 +298,12 @@ function draw() { if (!Bangle.isLCDOn()) {return;} // no drawing, also no new update scheduled var d = new Date(); var h = d.getHours(), m = d.getMinutes(), s = d.getSeconds(); -// gfx2(hour, minute, second); + drawBinary(cg, h, m, s); cg.setColor(0); switch(showDateTime) { case 1: -// drawTime(hour, minute, second); drawTime(cg, h, m, s); break; case 2: From ebda183d240192019cc3995cdc55460271c51d6a Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 7 Oct 2021 11:06:23 +0200 Subject: [PATCH 09/21] adjusted battery level display settings --- apps/TheBinWatch/app.js | 47 +++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/apps/TheBinWatch/app.js b/apps/TheBinWatch/app.js index 6c0abc961..8cb8669f6 100644 --- a/apps/TheBinWatch/app.js +++ b/apps/TheBinWatch/app.js @@ -32,13 +32,15 @@ const V2_BT_Y = 10; const V2_DX = 160; const V2_DY = 148; -const V2_BAT_POS_X = 150; -const V2_BAT_POS_Y = 16; +const V2_BAT_POS_X = 127; +const V2_BAT_POS_Y = 15; const V2_BAT_SIZE_X = 2; -const V2_BAT_SIZE_Y = 4; +const V2_BAT_SIZE_Y = 3; const V2_SCREEN_SIZE_X = 176; const V2_SCREEN_SIZE_Y = 176; const V2_BACKGROUND_IMAGE = "Background176_center.png"; +const V2_BG_COLOR = 0; +const V2_FG_COLOR = 1; /* Bangle 1: 240 x 240 */ @@ -65,6 +67,8 @@ const V1_BAT_SIZE_Y = 5; const V1_SCREEN_SIZE_X = 240; const V1_SCREEN_SIZE_Y = 240; const V1_BACKGROUND_IMAGE = "Background240_center.png"; +const V1_BG_COLOR = 1; +const V1_FG_COLOR = 0; /* runtime settings */ @@ -82,6 +86,8 @@ var bat_pos_x, bat_pos_y, bat_size_x, bat_size_y; var backgroundImage = ""; var screen_size_x = 0; var screen_size_y = 0; +var bg_color = 0; +var fg_color = 1; /* global variables */ @@ -127,9 +133,9 @@ function drawSquare(gfx, x, y, data, numOfBits) { */ function drawBinary(gfx, hour, minute, second) { gfx.clear(1); - gfx.setColor(1); + gfx.setColor(bg_color); gfx.fillRect(0, 0, screen_size_x, screen_size_y); - gfx.setColor(0); + gfx.setColor(fg_color); if(hour > 12) { hour -= 12; /* we use for bit for hours so we only display 12 hours*/ @@ -154,6 +160,8 @@ function drawTime(gfx, h, m, s) { gfx.setFontAlign(0,-1); // align right bottom gfx.setFont("5x9Numeric7Seg", 2); + gfx.setColor(fg_color); + gfx.drawString(time, gfx.getWidth() / 2, dy, false /*clear background*/); } @@ -174,6 +182,8 @@ function drawDate(gfx, d) { gfx.setFontAlign(0,-1); // align right bottom gfx.setFont("5x9Numeric7Seg",2); /* draw the current time font */ + gfx.setColor(fg_color); + gfx.drawString(dateString, gfx.getWidth() / 2, dy, false /* don't clear background*/); } @@ -220,6 +230,8 @@ function drawBattery(gfx, level) { gfx.setColor(4); } */ + gfx.setColor(fg_color); + for(i = 0; i < stepLevel; i++) { pos_x -= bat_size_x + 2; gfx.fillRect(pos_x, bat_pos_y, @@ -257,8 +269,14 @@ function setRuntimeValues(resolution) { screen_size_x = V1_SCREEN_SIZE_X; screen_size_y = V1_SCREEN_SIZE_Y; backgroundImage = V1_BACKGROUND_IMAGE; - - // TODO: set battery stuff + bg_color = V1_BG_COLOR; + fg_color = V1_FG_COLOR; + + bat_pos_x = V1_BAT_POS_X; + bat_pos_y = V1_BAT_POS_Y; + bat_size_x = V1_BAT_SIZE_X; + bat_size_y = V1_BAT_SIZE_Y; + } else { x_step = V2_X_STEP; y_step = V2_Y_STEP; @@ -281,8 +299,14 @@ function setRuntimeValues(resolution) { screen_size_x = V2_SCREEN_SIZE_X; screen_size_y = V2_SCREEN_SIZE_Y; backgroundImage = V2_BACKGROUND_IMAGE; - // TODO: set battery stuff - } + bg_color = V2_BG_COLOR; + fg_color = V2_FG_COLOR; + + bat_pos_x = V2_BAT_POS_X; + bat_pos_y = V2_BAT_POS_Y; + bat_size_x = V2_BAT_SIZE_X; + bat_size_y = V2_BAT_SIZE_Y; +} cg = Graphics.createArrayBuffer( screen_size_x,screen_size_y, 1, {msb:true}); @@ -291,7 +315,7 @@ function setRuntimeValues(resolution) { } var hour = 0, minute = 1, second = 50; -var batVLevel = 0; +var batVLevel = 20; function draw() { @@ -300,7 +324,7 @@ function draw() { var h = d.getHours(), m = d.getMinutes(), s = d.getSeconds(); drawBinary(cg, h, m, s); - cg.setColor(0); + cg.setColor(fg_color); switch(showDateTime) { case 1: @@ -312,6 +336,7 @@ function draw() { default: /* do nothing */ } + cg.setColor(fg_color); drawBattery(cg, batVLevel /*E.getBattery()*/); drawBT(1); From bffb2577796ffd078944c242348b4ff1c3768aca Mon Sep 17 00:00:00 2001 From: Vingelar Date: Fri, 8 Oct 2021 15:58:40 +0200 Subject: [PATCH 10/21] added swipe for V2 use "swipe" to change time/date/nothing for V2 --- apps/TheBinWatch/app.js | 64 ++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/apps/TheBinWatch/app.js b/apps/TheBinWatch/app.js index 8cb8669f6..bc5de8f4c 100644 --- a/apps/TheBinWatch/app.js +++ b/apps/TheBinWatch/app.js @@ -94,6 +94,7 @@ var fg_color = 1; var showDateTime = 2; /* show noting, time or date */ var cg; var cgimg; +var btImage = null; /* local functions */ @@ -186,11 +187,15 @@ function drawDate(gfx, d) { gfx.drawString(dateString, gfx.getWidth() / 2, dy, false /* don't clear background*/); } - -function toggleDateTime() { - showDateTime++; +function toggleDateTimeUp() { + toggleDateTime(1); +} +function toggleDateTime(adder) { + showDateTime += adder; if(showDateTime > 2){ showDateTime = 0; + } else if(showDateTime < 0) { + showDateTime = 2; } draw(); } @@ -221,7 +226,7 @@ function updateVTime() { function drawBattery(gfx, level) { var pos_x = bat_pos_x + 5 * (bat_size_x + 2); var stepLevel = Math.round((level + 10) / 20); -/* +/* if(stepLevel < 2) { gfx.setColor(2); } else if(stepLevel < 4) { @@ -247,7 +252,12 @@ function drawBattery(gfx, level) { * @param gfx: graphic object * @param level: current battery level */ -function drawBT(status) { +function drawBT() { + if (NRF.getSecurityStatus().connected) { + btImage = "bt-icon.png"; + } else { + btImage = "nbt-icon.png"; + } } function setRuntimeValues(resolution) { if(240 == resolution) { @@ -277,6 +287,9 @@ function setRuntimeValues(resolution) { bat_size_x = V1_BAT_SIZE_X; bat_size_y = V1_BAT_SIZE_Y; + /* use button 1 to change date / time / nothing display */ + setWatch(toggleDateTimeUp, BTN1, { repeat : true, edge: "falling"}); + } else { x_step = V2_X_STEP; y_step = V2_Y_STEP; @@ -306,7 +319,17 @@ function setRuntimeValues(resolution) { bat_pos_y = V2_BAT_POS_Y; bat_size_x = V2_BAT_SIZE_X; bat_size_y = V2_BAT_SIZE_Y; -} + + /* use swipe to change date / time / nothing display */ + Bangle.on('swipe', function(direction) { toggleDateTime(direction);}); + + } + + dg = Graphics.createArrayBuffer( + screen_size_x,screen_size_y, 1, {msb:true}); + dgimg = {width:screen_size_x, height:screen_size_y, bpp:1, + transparent:0, buffer:dg.buffer}; + cg = Graphics.createArrayBuffer( screen_size_x,screen_size_y, 1, {msb:true}); @@ -315,7 +338,7 @@ function setRuntimeValues(resolution) { } var hour = 0, minute = 1, second = 50; -var batVLevel = 20; +var batVLevel = 20, batLevel = 0; function draw() { @@ -336,20 +359,28 @@ function draw() { default: /* do nothing */ } - cg.setColor(fg_color); - drawBattery(cg, batVLevel /*E.getBattery()*/); - drawBT(1); - batVLevel += 2; - if(batVLevel > 100) { - batVLevel = 0; + cg.setColor(fg_color); + + if (Bangle.isCharging()) { + batVLevel += 20; + if(batVLevel > 100) { + batVLevel = 0; + } + batLevel = batVLevel; + } else { + batLevel = E.getBattery(); } + + drawBattery(cg, batVLevel); + drawBT(); + updateVTime(); g.clear(); g.drawImages([{image:cgimg}, {image:require("Storage").read(backgroundImage)}, - { x:bt_x, y:bt_y, rotate: 0, image:require("Storage").read("bt-icon.png")}, - ]); + { x:bt_x, y:bt_y, rotate: 0, image:require("Storage").read(btImage)} + ]); const millis = d.getMilliseconds(); setTimeout(draw, 1000-millis); } @@ -365,7 +396,8 @@ Bangle.on("lcdPower", function(on) { g.reset().clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); + //setInterval(draw, 1000); //var x_size = g.getWidth(); -setWatch(toggleDateTime, BTN1, { repeat : true, edge: "falling"}); + draw(); From 98d625fb267125e22ed0ca543db18d3c9da155ff Mon Sep 17 00:00:00 2001 From: Vingelar Date: Fri, 8 Oct 2021 16:00:24 +0200 Subject: [PATCH 11/21] BT connected icon --- apps/TheBinWatch/nbt-icon.png | Bin 0 -> 789 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/TheBinWatch/nbt-icon.png diff --git a/apps/TheBinWatch/nbt-icon.png b/apps/TheBinWatch/nbt-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6b28c50dfecef751d0952530b8c55c7bb34a8e45 GIT binary patch literal 789 zcmV+w1M2*VP)Q2T*_KEk1X zh117?p~Jwgoj|z))HKlC2sCWtKZ{_HYZF90BbpNZn$XLW@fAekWS^$qY`~8zz+k@{a+}#YXJz0~f^L3xy{T+EoQP z9yfy5Ct;jv9d#EbPPDVT30<8mC>wC~R%Bmdq1jc_j+~rDf@-EOcnP3uH@C8zi{IU7 z0C5m@VZ>Tmuy@}l6W0{0INp8$78Y4hN~2bbPqj{z#e{RKQ+U3>brWEts?giRg1I?6 zTNr<>zI@}G=0bDO+B)vEj=89wkf z^Hm%fOu7-vRy7zz4V=-Gn~$#HQkF}hgHz=1N+mYS)et9InBg^iHW3x`NF&o``$4h) z6}FFgJL&z)x=B~iMrCvkNwEVrr>gFWB~CP*vKs2+XQIKggdYWEo#_&m6Wi@W5dZk@ z{w!j_eh^7F$;<8S;0>(&vT1AOp^(U!z93>j*5+)RK4{x8Eln&aXW5?2nj4CW1W7em zXX_hofN4yVap$kOCkNxJM`@GF@b76m8pBr3zP?asW@kR;JX|iZG8>awiYvgW3xpX? zPd+C>CJU~aY`{|1KJ%SzB7%a}_7aLKL@#qhg_6DelY3}Xn>aU5RIb=}>mm9J5=u^& Tmz64P00000NkvXXu0mjfG<;lH literal 0 HcmV?d00001 From 54e313bf3bae3802e5c2ac6d5feca37cd7525e21 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 21:54:27 +0100 Subject: [PATCH 12/21] several updates on main app: - changed positions of battery, BT, mask - removed all setColor calls - updated background image 176 - changed bt icon - added month names as gfx --- apps/TheBinWatch/Background176_center.png | Bin 4158 -> 4463 bytes apps/TheBinWatch/app.js | 158 ++++++++++++---------- apps/TheBinWatch/bt-icon.png | Bin 628 -> 708 bytes 3 files changed, 83 insertions(+), 75 deletions(-) diff --git a/apps/TheBinWatch/Background176_center.png b/apps/TheBinWatch/Background176_center.png index 9c8ecee53dae7bcf0f81fa2e42d8e3344317bc31..c8c1c01489841b23c195421c1dc52112f5df424b 100644 GIT binary patch literal 4463 zcmcgveOOcV9zSg3=-AnSL3+kOhAk57|u(8y?WqhB1ZdRoqyqj?F5Q<#c^D1%q{2PadlkmQlg>Mpi-Z7J@ zw%l`(oAw5M1?fr@D0=#o+o=`)7@qAOz%-Qf!%}rVuf(}8s{m(^N}@=TDr0TY?RPO| zY0wmKbCqEH*KRf>g+IwstqNVu*EmaxY@1`bI9 z4g%>iON9U`53ZCm@ZM^)f*GK#wdmnq_GVjf08MI1zA(zHNeFaf_?tD`+%(AJXrqNp zFbaryg>wrm@!&>PrFeLUn~7Xrw$mSJl2jfkOt^$LvakHmVfL7~7!d?xJ(TUjaDvQC zAWE+CvTDTUnu=nR)kA%7ji%W7a+cI`qSTfKfJzx;utrzvX$*=gP)cNKwU&6FA8hle zvWOp}J*(ztA zLgwO6WM9&IA(fv7ykm2n74y^{W^*%fiCi^6XJreeB3bZ!ar_A?$lwQ`oG(BJ`19`W z?(#sYT)j{$POUMS7F(MOC}bc$SDVV_hHldIQut;+epGki%y<$j-O?kc(1PN^;l| zLaGvS(zKsB3TTBQ(6PF6`#7F`Kv`OJ@XL%&vBssF&g##)0?dh+`w|w3j<$76RXiw3 z4YGOOUJ|BoTDP#^dox-h*X^Z1xTuBT=dfyEs-Gi8RWm=)U7%1XtX+L(#&Cd;%k$^N zKhkpr5%<>^{^|!FfgXDtZGJn@owqKSv;zYUEOh>dr?6DeJ(v;dvnPPlxA2mK>i}+u z{)X=tvDJL3Xw<95?YE!~yXmv+{a2Tl-LF%>FT}UG8D%wOfUz)i)KK(9raLrh=>EFH zIKV^FZT_=jg|QQSG1QrJP!hMWxp${(HJLkBG^6M1`rg;uyS7CWuCDuKr1JoFO&WXG zilIJx(l}iX+C-w)GkQ=%(a&{4w)flF`;S@zgM&}b?|1+#?3bobzRNB}{shbD`5%}F zJvmi5o?{vh$yCJDXgIC5GQa@RPRs9HItA{<^%kAi*`eP(MzYAXu@dAQtZ&sdw*RtC zpB-kmPlT?C#=`R!`D3DT+7ouJIUpSX4@9~@ z0AcZ*;@F9hrhq7fBjqKN0mivi*D^4tG}3`pV8bPrNYfoA91@qo;Ww+GET?>MZx5a^tG;AzE2@=>E`$k_|_z4v*-6SN2I2 zQqc&!lIIW$97T?$V;Quh^o?;Ey=d}D=!Msmw;W8h@WHg#Wt|Zt2ZHQnIK0=2@1ZJ;k0rthWj;&&9Sc8g2B7-U=iTdfKG}I% zv;O!<0qG9BG;I4<+-rsXq8O)VyEL(`Ess(1GX!LT=hK^}7@*ahDR;hrwD3uvV)^F* z;JG<*yu7Yx{M$ueC{e-k>hB*FWZyUNp@( zHUhe(d@Ef7k4|Th4ccd+W}49)UwkvilT&N<->7^%(w?TEM^#%=_QeP`AZjU{;ABRPmKXXs6i~lABOfLlw3+2A3{grV#zPQ#h zlneBAXJ2$sl^fi*CPo9GZEnP&aPOz=Uh)lho@VgPO#yQqr%<(?jBX@)%pyGZh1xe~ zpc{;Qr+VUZ>TL4|=DQZ2W*DcL$!b)jx0HR*{oWx5@OuD8fDtPs)Mq!?6wCi<>(4!? zaWNsfMom`FHI#upJT1xB)3CupoLf!ZQBL`whshb%In;Jf!-DL-Gbzqnj^`ZK1V-I9 zzv|E|dXBOwuBrM1KSdW7(oP{!gkMl(jsp&MTF_-yd@fV1QQ z2+O>c$b=GAc9M4af|ZAw(P)onYzH8`-FPAi*9O|T@b(ARm9_`2w&ND|?FM}uuKjKU zd7#9;ZL_ZM?OfQXE9R`tu2^n6q+p{2ws(i?@>>$?H9xwH?w0JuwYxNSL868qXbY0< zDq^Fb#_S!}202K+UJ<(kmpIyW{i(QzSHOO|@o3VT=!b~n;28hb_b4k^$0RhQYQ$`^)_`>!nKabZYqF%Eml5@~mzc+;ZJcI(X+6`9k^bNGZM{ j4N5Uyf9ItIvx5*7(tlyRXZXeAh&6v?u}Lv)SQh?Y68f_? literal 4158 zcma)9c~}!?8qdWb$3y7E3|f0G9PGmTG`f7PLj_g6-0-tJp3(A;%1D|L8nVj`_XU?|r}b zyQ-v;B&IvZokSurMZyFb_S<{_VPcitZ zAo|}w-Tv`hm0|p*=+-455rAERlN8Dx{no>$^0##i&0tF85}7286hASTi@mt1gxmL% zNOYFhU4$z?dqNLCh57~Yz|>h3Yx@&!1j_Qdsm8b8A| zC(}U>SV4I0VJH zNG}A|jlqK5Hcu3;xbQa+W8M9$LL~?YJV);I_xFRi>IG`ziX+{vcm*)~T?mzZac-l} z&j33V5aA>#Y-_X|ehi{IhF#b#myaFN(RQg5%x;n>$52q%3?wb{{cciB^(z7gJ)~ZC z6`)q*@esd_ZP_l>w6ZAs2qN_o_A$~}YrmVl5fF7bZG9Cpj>L;O?VygtZ&6Nto1>u^ z{-Q$DV(o)%MQ`-wkf|NydRn82fKCY~;E@epUgEH@u+XruB-s%NOdo!3(%xAJNk@|* zg5tLIRO${2wby$&W9+KgeAjH2>ThC$nkWIhB{$~hO+8l&h9%_i_< zw>4sk>wMGMw3b6q@Y!%kg>XX6=0!)Ao8$tJk*rEi?zEL3A-z$R!HjlI+DE1KdY0_} zlaa5_U@l9OVUH~ug{$BBzCR-L@&>n0GFsy=M0EdB0mPa+2uTt0G4xBEd13gKK6g zdq`dp9268~W7v}q1-5M(U?ii|J#ih3Qtk2DFNu=Brq|LQEMmIV(sTu_4$3wot!GfE zUlnr=l}=AzU>4by9UPN^2vSw=0?&n${DdCX>mwy!8}9 z#Wm3s#?Z z4gHlU6Ju=H=Y|b8u(5)WV{YsE%o++=hzhnSr6-UQ!nou@2N0@NaiYq z2*H%}$8D#$ctQw-g`n|!J#SnFj)!cHz-wcbP{~qM@Hyr#JCYD+Uh>SK(WH@9VOb5{ zW^8j#8Fmw+NVC-q3~{tY!|OQvKk^@b9(>tS7;IALb^uqa1Ds6+M}UVctSGWE zsoD3aWMwg`aIPmagtGP6BnnFKQ|hoi)dNv@2X^!Y?%Y8VQ9*Ir{e$f2(X!=sqIU4CRQ6EvzD9 zERG)25%kf^h#;uHWc7Kg+4mEo&w03@{od5@_`e8!f`XWjq|C;}JA3eMZ4j+AIa~dY zOdp~S=CO;)lN@Ml8R>93K|!VZyn1_6MKlcBUxC_e~kBG9B>hZ8G39hU%3o8xSnd01I;DQ&&9u0eZJxS$7 z@4kZ+XB=?ddmE=Ssr7qGuN#afeGv$|ullCh z_Z-8t@h(0SC!>s|)75dRj;>On2Q^i>pnlU2jI`wq5?=Gb1D9WmPW1e8Sg4e)^s-E9 zZ}Fp@tl{aDUYq3pqhbH+=Gias1+Q7WZ+v0f~q%#8)%! zirzcztIiGRz%uL*WjjK_D?@0{=-A$OP~W9+eN%JHI~dPpZ&!Hy&n|`1`dRQL3oDo! z@fqxFQ%cxT4VNKO4R)12i91*gxX`>qoR*XpFLYiQt2$C1cTnhWbgX?8?ug#|%G-u2 zCg)0d>_JGowibKr2ObKyiB-nGwLNYmE3T3u6B;m&j%|t(HX{?Ta(uGl(04X`bNP(P zM4vyIp`j^SI_l|z?UJ+Lp~l54E?ZB3$+5O06dGzuso?J1wJYY*MW3&3RnN>M?`z_- zm$1L7mdZM>?95$Cju4?UnJ%_yVJjMM)#MA=uV8lwZ#z`hD9MQT z+>w`;XQvd_-zY(~!55s4U}Z@CW>gzQM9})a0%Zp7x*_i?08k%JaCm{0kw(nsy=RLZ z!Qo+!;8j%1BX}9UA$T>z?1ja)g>Fzj^Wdnz*Sk4wMxn%fR50}t0l8;I0&y=5vu7ez zI1zYsb5b^{EjeJWTI)y>9(t0r9Tg1gmU8S>Zg{*ckx-b1#}mm5UQ4CK*BM}2p0K>4 w!Zwf%Gj%)i@PG|7!P$gYc=)cEsWsxksifxV!UIED&*pC>qC`nTGb~5{4@KTT(f|Me diff --git a/apps/TheBinWatch/app.js b/apps/TheBinWatch/app.js index 8cb8669f6..4a8e692a1 100644 --- a/apps/TheBinWatch/app.js +++ b/apps/TheBinWatch/app.js @@ -9,33 +9,56 @@ ****************************************************/ /* reuqirements */ -var locale = require("locale"); -require("Font5x9Numeric7Seg").add(Graphics); +require("Font7x11Numeric7Seg").add(Graphics); +require("Font5x7Numeric7Seg").add(Graphics); /* constants and definitions */ /* Bangle 2: 176 x 176 */ +/* month images */ + +var month = [ + /* JAN */ {width : 53, height : 24, bpp : 1, buffer : require("heatshrink").decompress(atob("AAMf/0D8AFBkM/9EvwMAgcM/3B30YgE4uEOh354EB4eAuFz90Ah0cgeDx9wgFw8Ecjk7wEDw8A8AIBgEcnEHg4IBgFh4EYnEDHYMF/8AwBID/BODgN/4EgAoI0BgODwExGgkDzg0FAII0D88A8PAnAIBAIMOgPBBAPAiBpCgPAQIOAmFwg0P/B5BwcAiE/JYYAHA"))}, + /* FEB */ {width : 51, height : 24, bpp : 1, buffer : require("heatshrink").decompress(atob("v/8n/+g/+if/hP/wM/8c/4Of8Ez/FwgE4gEHgFOAYUA8Ed4ADBgEcge4AYMAgeAu4DCgFwhwQBEIMOgPcAYMAgPAjN/4G/8EX/kf/EP/kB/+F/8C/+Ar/xGQkBGTE7wADBMIMHMotMgEGv+A7/hEYOf/EH/hvBh6FBIIKYFA"))}, + /* MAR */ {width : 52, height : 23, bpp : 1, buffer : require("heatshrink").decompress(atob("v/4j/+gf/hP/gV/6FP/HP8kz/cGv8OgHDwFwuEE8McnEHg8A905BgcO8ecBiM4BgMwuEGoeEi/8gX/wE4gH/4Ef/AMFx0QDIcA8BADnEOgIzCufABgk+Bglx+AMEh+OBgdwvnghk4gcGgfsgFDgEQoEeSgvg"))}, + /* APR */ {width : 52, height : 23, bpp : 1, buffer : require("heatshrink").decompress(atob("v/4j/4gf/hP/oV/4FP/HP9kz/EGv8OgPDwEguEE8EcnEHg8A9wMCuFwhwMTgAMBmFwg1f+EX/kC/+D/8A//AJIIMFxwZCgFwgAmCgEHnBNDgFz4AMEnwMEuPwBgkPxwMDuF88EMBgMGgfsgFDRgNAjyUF8A="))}, + /* MAY */ {width : 52, height : 24, bpp : 1, buffer : require("heatshrink").decompress(atob("v/4j/+AoMJ/8Cv/QAwPP8kz/cEgEugHDwFwsEG8McnEHg8A905BgVwh3jzgMRnAMBmAMBoeEi/8BgNgnEA//Ah/4BgcB/+OiAZCBgPgIARTB90BGYUAhwMahk4gYMBpkAocAiEP+CSDIAOAAwYMB"))}, + /* JUN */ {width : 53, height : 24, bpp : 1, buffer : require("heatshrink").decompress(atob("AAcD8ADBkMAhEvwIJBhkA4O+jEAnFwh0O/PAgPDwFwufugEOjkDwePuEAuHgjkcneAgeHgHgBAMAjk4g8HBAMAsPAjE4gY7BggCBwBPLkACBGgMBweAmI0EgecGgoBBGgfngHh4E4BAIBBh0B4IIB4EQmEEBAPA/0An5qBg0P/ED/xNBiAKBh6PCAAw="))}, + /* JUL */ {width : 53, height : 24, bpp : 1, buffer : require("heatshrink").decompress(atob("AA8hgEImAFBgcMgHB4AGBnFwh0OAoMB4eAuFwAwMOjkDweAAwNw8EcjggCw8A8HgAwMcnEHg40CsPAjE4AwUEAQIgCABMgGgcBGgMBGgo/BGggKBGgYBB8PAnA0BBQMOgJpC4EQmEENIX+gE/wFn/EP/ED/0Cv/gBQMP8EP/5QGA"))}, + /* AUG */ {width : 52, height : 24, bpp : 1, buffer : require("heatshrink").decompress(atob("n/8AocE/+gAgMP/1n+0QgGA//HgHhwEYl/wuEOjkDw8Ag4MB4E4uEABilhBgcv/EcgOCgEB/+AwBBB/AMBAgMCj/ngFgAwNw/wmCgImBBgIzDhwzFBikGhkBgUAs0AkEf4EH+A3Bgf+gBLBAwIMD"))}, + /* SEP */ {width : 51, height : 23, bpp : 1, buffer : require("heatshrink").decompress(atob("h/4j//g/+gf/wn/4M/8ABB5/wmf4mEAjkAg8Ap0AgeAgHgjvAgFwBwMD3EAhwOCu8AgIOCh3ggE4BwMB7gjCBwMYv/Ar/wi/8j/8IYMB/+BIYIODDwIyCLIMHGQYGB8JBDB4IyCAoMDw5BDB4JBDgEEMoZ6Cn/A8A6B8FP/kYgEf/EH/4eCA"))}, + /* OCT */ {width : 50, height : 23, bpp : 1, buffer : require("heatshrink").decompress(atob("h/gg/+j//w/8gf/h//+H+gF/wP//OAkHADAXgjlwAoU4g8cAgMYh0B44pCgeAuIYBgfADAnwnEDDAUcghCDgRMIsACBkAYFGKZKDngYFgJjBwAYCPgX4DAMHPgQYBgB8C8EGgAA="))}, + /* NOV */ {width : 51, height : 24, bpp : 1, buffer : require("heatshrink").decompress(atob("vkAgf4AoMX4GA/+ABIN8mEP8EggP350MgMGgF+vvDwFw8Ef4+4uEOjgiBu8OgIOBv8A8PAnFwEQMcnEHBwP8gOHgFh4EdHYNAgEQgJLFggFEhPAjFwg0cg4jDGQPnGQk8GQkPI4IyB8PDKwYOB+BWBMoMHnkOgHAn+A98BwEIh/4jnAHgX+gaGBAAcggAA=="))}, + /* DEC */ {width : 49, height : 23, bpp : 1, buffer : require("heatshrink").decompress(atob("v/gj//gP/5/4iYFC2f4hn/CAOcgMHgEBwEOgPDwEB4AJB8PAgHggeAuHggFwBoM4uEAnANBjgDBjgNBgwDBh0AiEAgowBAAQ6BwEAggFBv/BwAwBsIwWhwwDnEHAYIiBjhhDgEN/0Dn/Aj/hO4M/+Ef/JABv/8g/+A=="))}, + /* MAI */ {width : 44, height : 23, bpp : 1, buffer : require("heatshrink").decompress(atob("v/4j/+gEJ/8Cv/QgnP8kz/cA50A4eAuEc8McnEHgPOnIKD8ecBR04BQMwhlDwkX/kAoE4gH/4EABQlOiAVD8A2EgIrDBS0MnEDgHMGQMAiEEPwo="))}, + /* OKT */ {width : 51, height : 24, bpp : 1, buffer : require("heatshrink").decompress(atob("g/wAQMP//B/8DgPh//8j/AuF8n//jECh0fDAUA8PH4AGB8EcnIhBsEcgeHvkAj0DwFw98AgYjBh0dDAN4h0A4eAEgQDBl/4gFAE4MD/5OE3/ggIyBhk4gcAuAyCBIIyDIIIyDAgOAGQMBGQNwh8B4E4BwMB8BlCBIM8gF/AgMYg+Aj/wmA3B+EB/hBChiYGA"))}, + /* DEZ */ {width : 51, height : 23, bpp : 1, buffer : require("heatshrink").decompress(atob("n/wh//w//xP/gV/8F//Of4Fn/EH/04gUODAUHgHh4AFBnHgjk4BYUcgeHAoMB8eAuHgAwN4uEOjgFBh4jB4eAgED4ADBl/4gFwB4MD/4DBgQCB3/gC4PghgyBgPAGQl4gYyDjwgBGQQrBh0BGQVwDQM4F4MMLIJlEg3/gOfPAPgn/gk/+j/+h/8IoPh//gA="))} +]; + +var imgSquid = {width : 88, height : 26, bpp : 1, buffer : require("heatshrink").decompress(atob("gE/AYUYgEH////0B//gBQM8BQgDB/AKHh/A/gKBvwKBAgMOj8AnwKHBAIMBgH/BQgmCAoPnBQl4AoOAgPnwAKDuEAgYKB4YKIgfD4AKDMAMB4EDwIKIg+B8AKIgAKIh8A+AKHh0AuAKHj0AvBMG4EcgE4K458Bnh4HnEAjiOHBwMeBQpKBEgMOXQ/wBwIKDaAZQBg4KDcwT0BAAOHfgoKHgE/wDaBAAL8DA="))}; + const V2_X_STEP = 26; const V2_Y_STEP = 34; -const V2_TIME_Y_OFFSET = 30; -const V2_HX = 35; +const V2_TIME_Y_OFFSET = 8; +const V2_HX = 36; const V2_HY = 0 + V2_TIME_Y_OFFSET; const V2_MX = 10; -const V2_MY = 40 + V2_TIME_Y_OFFSET; +const V2_MY = 51 + V2_TIME_Y_OFFSET; const V2_SX = 10; -const V2_SY = 80 + V2_TIME_Y_OFFSET; -const V2_BT_X = 30; -const V2_BT_Y = 10; -const V2_DX = 160; -const V2_DY = 148; +const V2_SY = 95 + V2_TIME_Y_OFFSET; +const V2_BT_X = 135; +const V2_BT_Y = 20; +const V2_DX = 100; +const V2_DY = 141; + +const V2_BAT_POS_X = 21; +const V2_BAT_POS_Y = 40; +const V2_BAT_SIZE_X = 13; +const V2_BAT_SIZE_Y = 2; -const V2_BAT_POS_X = 127; -const V2_BAT_POS_Y = 15; -const V2_BAT_SIZE_X = 2; -const V2_BAT_SIZE_Y = 3; const V2_SCREEN_SIZE_X = 176; const V2_SCREEN_SIZE_Y = 176; const V2_BACKGROUND_IMAGE = "Background176_center.png"; @@ -112,7 +135,7 @@ var cgimg; * @param numOfBits: number of bits to draw */ function drawSquare(gfx, x, y, data, numOfBits) { - + for(i = numOfBits; i > 0 ; i--) { if( (data & 1) != 0) { gfx.fillRect(x + (i - 1) * x_step, y, @@ -132,11 +155,8 @@ function drawSquare(gfx, x, y, data, numOfBits) { * @param s: seconds */ function drawBinary(gfx, hour, minute, second) { - gfx.clear(1); - gfx.setColor(bg_color); - gfx.fillRect(0, 0, screen_size_x, screen_size_y); - gfx.setColor(fg_color); - + gfx.clear(0); + if(hour > 12) { hour -= 12; /* we use for bit for hours so we only display 12 hours*/ } @@ -159,10 +179,8 @@ function drawTime(gfx, h, m, s) { var time = (" "+h).substr(-2) + ":" + ("0"+m).substr(-2)+ ":" + ("0"+s).substr(-2); gfx.setFontAlign(0,-1); // align right bottom - gfx.setFont("5x9Numeric7Seg", 2); - gfx.setColor(fg_color); - - gfx.drawString(time, gfx.getWidth() / 2, dy, false /*clear background*/); + gfx.setFont("7x11Numeric7Seg", 2); + gfx.drawString(time, gfx.getWidth() / 2, dy + 1, false /*clear background*/); } /** @@ -173,18 +191,20 @@ function drawTime(gfx, h, m, s) { * @param gfx: graphic object to use * @param d: date object */ - +var vMonth = 0; function drawDate(gfx, d) { var dateString = "" - + ("0" + d.getDate()).substr(-2) + " " - + ("0" + d.getMonth()).substr(-2) + " " - + ("0" + d.getFullYear()).substr(-4); + + ("0" + d.getDate()).substr(-2) +// + " " +// + ("0" + d.getMonth()).substr(-2) +// + " " +// + ("0" + d.getFullYear()).substr(-2) + ; - gfx.setFontAlign(0,-1); // align right bottom - gfx.setFont("5x9Numeric7Seg",2); /* draw the current time font */ - gfx.setColor(fg_color); - - gfx.drawString(dateString, gfx.getWidth() / 2, dy, false /* don't clear background*/); + gfx.setFontAlign(-1,-1); // align right bottom + gfx.setFont("7x11Numeric7Seg",2); /* draw the current time font */ + gfx.drawString(dateString, dx, dy + 1, false /* don't clear background*/); + gfx.drawImage(month[d.getMonth()], 40, dy); } function toggleDateTime() { @@ -192,10 +212,13 @@ function toggleDateTime() { if(showDateTime > 2){ showDateTime = 0; } - draw(); } function updateVTime() { + vMonth++; + if(vMonth >= 12 + 3) { + vMonth = 0; + } second++; if(second > 59) { second = 0; @@ -219,23 +242,13 @@ function updateVTime() { * @param level: current battery level */ function drawBattery(gfx, level) { - var pos_x = bat_pos_x + 5 * (bat_size_x + 2); + var pos_y = bat_pos_y - 1; var stepLevel = Math.round((level + 10) / 20); -/* - if(stepLevel < 2) { - gfx.setColor(2); - } else if(stepLevel < 4) { - gfx.setColor(3); - } else { - gfx.setColor(4); - } -*/ - gfx.setColor(fg_color); for(i = 0; i < stepLevel; i++) { - pos_x -= bat_size_x + 2; - gfx.fillRect(pos_x, bat_pos_y, - pos_x + bat_size_x, bat_pos_y + bat_size_y); + pos_y -= bat_size_y + 2; + gfx.fillRect(bat_pos_x, pos_y, + bat_pos_x + bat_size_x, pos_y + bat_size_y); } } @@ -247,7 +260,10 @@ function drawBattery(gfx, level) { * @param gfx: graphic object * @param level: current battery level */ -function drawBT(status) { +function drawBT(gfx, status) { + if(!status) { + gfx.drawImage(require("Storage").read("bt-icon.png"), bt_x, bt_y); + } } function setRuntimeValues(resolution) { if(240 == resolution) { @@ -269,14 +285,14 @@ function setRuntimeValues(resolution) { screen_size_x = V1_SCREEN_SIZE_X; screen_size_y = V1_SCREEN_SIZE_Y; backgroundImage = V1_BACKGROUND_IMAGE; - bg_color = V1_BG_COLOR; - fg_color = V1_FG_COLOR; - + bat_pos_x = V1_BAT_POS_X; bat_pos_y = V1_BAT_POS_Y; bat_size_x = V1_BAT_SIZE_X; bat_size_y = V1_BAT_SIZE_Y; - + + setWatch(toggleDateTime, BTN1, { repeat : true, edge: "falling"}); + } else { x_step = V2_X_STEP; y_step = V2_Y_STEP; @@ -299,17 +315,17 @@ function setRuntimeValues(resolution) { screen_size_x = V2_SCREEN_SIZE_X; screen_size_y = V2_SCREEN_SIZE_Y; backgroundImage = V2_BACKGROUND_IMAGE; - bg_color = V2_BG_COLOR; - fg_color = V2_FG_COLOR; bat_pos_x = V2_BAT_POS_X; bat_pos_y = V2_BAT_POS_Y; bat_size_x = V2_BAT_SIZE_X; bat_size_y = V2_BAT_SIZE_Y; + + Bangle.on('swipe', function(direction) { toggleDateTime(direction);}); } cg = Graphics.createArrayBuffer( screen_size_x,screen_size_y, 1, {msb:true}); - + cgimg = {width:screen_size_x, height:screen_size_y, bpp:1, transparent:0, buffer:cg.buffer}; @@ -319,13 +335,12 @@ var batVLevel = 20; function draw() { - if (!Bangle.isLCDOn()) {return;} // no drawing, also no new update scheduled var d = new Date(); var h = d.getHours(), m = d.getMinutes(), s = d.getSeconds(); - + g.reset(); + drawBinary(cg, h, m, s); - cg.setColor(fg_color); - + switch(showDateTime) { case 1: drawTime(cg, h, m, s); @@ -334,12 +349,10 @@ function draw() { drawDate(cg, d); break; default: - /* do nothing */ + cg.drawImage(imgSquid, cg.getWidth() / 2 - 44, dy); } - cg.setColor(fg_color); - drawBattery(cg, batVLevel /*E.getBattery()*/); - drawBT(1); - + drawBattery(cg, /*batVLevel*/ E.getBattery()); + batVLevel += 2; if(batVLevel > 100) { batVLevel = 0; @@ -347,25 +360,20 @@ function draw() { updateVTime(); g.clear(); g.drawImages([{image:cgimg}, - {image:require("Storage").read(backgroundImage)}, - { x:bt_x, y:bt_y, rotate: 0, image:require("Storage").read("bt-icon.png")}, + {image:require("Storage").read(backgroundImage)}, +// { x:bt_x, y:bt_y, rotate: 0, image:require("Storage").read("bt-icon.png")}, ]); + drawBT(g, NRF.getSecurityStatus().connected); +// Bangle.drawWidgets(); const millis = d.getMilliseconds(); setTimeout(draw, 1000-millis); + // Bangle.loadWidgets(); } // Show launcher when button pressed Bangle.setUI("clock"); setRuntimeValues(g.getWidth()); -Bangle.on("lcdPower", function(on) { - if (on) { - draw(); - } -}); g.reset().clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); -//setInterval(draw, 1000); -//var x_size = g.getWidth(); -setWatch(toggleDateTime, BTN1, { repeat : true, edge: "falling"}); draw(); diff --git a/apps/TheBinWatch/bt-icon.png b/apps/TheBinWatch/bt-icon.png index c07800ea34b2935ba689265237bf2ccbc4fced55..cba9b59736664317879b89469e7b0479793d0cfb 100644 GIT binary patch delta 607 zcmV-l0-*i$1jGf9I|~*i000&x0ZCFM@R3G2e*!N_L_t(IPmPq#Zqq;%Mn6Y!(=H6j5iPJ2M*>4SMIo9ng*s}2l)1Jjv|UjtT5;Fi#L|B32lPd%d} zfAvrp4}tzwJm$lD4~OkbynB0Bwbv^NVLy<@emqc%G)W<$lu$hJ|DZWKK@iLk4uC@Z zDqogFi}-`;Gz5YXN*gA+#U`G=?BJX9E1{m|GMPq6heI6p4zMvi!}NTBRjZ6i-GSQ> zArnCUM@FL75PtI!?5m&Xnl>K0E%oi^f3G`mnMN?*JVZ>?FL zj4Ty$YkX|S*@R`mK3Og!xkAd0&v#X1ux+5#0ve6XwM~*Kq)hKKu9=cK&cepdf8{ca zB4!#pas=h7-VdVwy2JArotbuIZ*_P&6?%+Dw|UV)SHYJPq)A7Xl}#O;jy6fLC^uT4 zy_u;$q$5j5G@iuI(q49Sq`+EcgdxUKHBehyy3a~0ab%P0d554j^LG!mYTPzPWByrO zwE}ulHA-^O(#@$UU1g!3KcC)LPF=_Oatznr_sYKLjCH*?c4UyyYXCd5YR4x#hcj zl)qAID353%%uH$~nVFCwj#2&!%GvbB_ykDJ4CZ67xg)+g!JH~Qxff%cnKi%=c#k_M zVpSUQzl`Up%*@&F{^8zzYk`navlH+wGrsV6`QJVZ5!xN`wJj#ds9y|n1vR_uGeg(R zwy5aUJgPXZ3&tET^lbVdL5GMnK-e98ohum?8qtGpK_(<0(m8Ip2E+jP0a4;T6fSHP Q;{X5v07*qoM6N<$f*~sN;Q#;t From c002a57c9f27f40b8924fd19e69c5e0fa05e0a64 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 22:03:02 +0100 Subject: [PATCH 13/21] changed BT icon handling --- apps/TheBinWatch/app.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/TheBinWatch/app.js b/apps/TheBinWatch/app.js index 4a8e692a1..56e153dbf 100644 --- a/apps/TheBinWatch/app.js +++ b/apps/TheBinWatch/app.js @@ -39,6 +39,8 @@ var month = [ var imgSquid = {width : 88, height : 26, bpp : 1, buffer : require("heatshrink").decompress(atob("gE/AYUYgEH////0B//gBQM8BQgDB/AKHh/A/gKBvwKBAgMOj8AnwKHBAIMBgH/BQgmCAoPnBQl4AoOAgPnwAKDuEAgYKB4YKIgfD4AKDMAMB4EDwIKIg+B8AKIgAKIh8A+AKHh0AuAKHj0AvBMG4EcgE4K458Bnh4HnEAjiOHBwMeBQpKBEgMOXQ/wBwIKDaAZQBg4KDcwT0BAAOHfgoKHgE/wDaBAAL8DA="))}; +var imgNoBT = {width : 20, height : 20, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("///8mSpM/AoP/yUT/8yuYGB5AMB/1MyYUBkmT/P85MP+USBwOT8mQ/8JBwXyoVnyGSv8//Mhk14pMn//8BYNMwmSp/+pFJkgyBDoMkkgODpOSuQOE5M/KgIOCsmfz/JknPhMyof5n+Ss/wzMhn4OBk1+smQLoWTn/mHAM/+VJz4KBwhZBEYJ/CkM8yZVBAAQxBCgP/A="))}; + const V2_X_STEP = 26; const V2_Y_STEP = 34; @@ -49,7 +51,7 @@ const V2_MX = 10; const V2_MY = 51 + V2_TIME_Y_OFFSET; const V2_SX = 10; const V2_SY = 95 + V2_TIME_Y_OFFSET; -const V2_BT_X = 135; +const V2_BT_X = 137; /* 145, 35 */ const V2_BT_Y = 20; const V2_DX = 100; const V2_DY = 141; @@ -262,7 +264,7 @@ function drawBattery(gfx, level) { */ function drawBT(gfx, status) { if(!status) { - gfx.drawImage(require("Storage").read("bt-icon.png"), bt_x, bt_y); + gfx.drawImage(imgNoBT, bt_x, bt_y); } } function setRuntimeValues(resolution) { From d81b435de4bd7ce95826df89f7bbe89a16585bdf Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 22:27:55 +0100 Subject: [PATCH 14/21] added README.md --- apps/TheBinWatch/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 apps/TheBinWatch/README.md diff --git a/apps/TheBinWatch/README.md b/apps/TheBinWatch/README.md new file mode 100644 index 000000000..d9da4968b --- /dev/null +++ b/apps/TheBinWatch/README.md @@ -0,0 +1,10 @@ +# TheBinWatch + +Binary watch to train Your brain +Inspired by the 80's LCD wrist watch from RALtec +## Usage + +- swipe to left or right to change displayed text (date, time, ...) +- currently only available for BangeJs2 +- Widgets will not be shown +- If bluetooth connection is not established an icon will show up \ No newline at end of file From 0e0c6f7308fe09e688e9872c3e0785fd56bbcbe2 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 22:35:11 +0100 Subject: [PATCH 15/21] Update app-icon.js --- apps/TheBinWatch/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/TheBinWatch/app-icon.js b/apps/TheBinWatch/app-icon.js index bb87c1926..31d0a4cca 100644 --- a/apps/TheBinWatch/app-icon.js +++ b/apps/TheBinWatch/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwkGAoMM7oAQoMRiIXBrnMACHAGofMn//AB385gWCgvM/85nQTJ+RCBiMj5lQLwXD/+YpIXJmH/+MRj5ID5nf/+B/IXJ+EikIXBnhIBIwX/nGDLhUzAAM//oXBhnEOp4ADJANc54JF+MjFAUzmUfBoss4qlH5kIxAACwHNVI5eCAAfz5kBC4cREwwOBC4wgB6AXDhnMKwwXHlnM4pICwFc5jNBC5gHBMAcgAwQXMWAIABqAXBggGCcwIXKcAIAB4EowJeBAAJgFC4wPC5nEhGAAwYQHSwwACiUkAwipEM44APC4nziS7DxHz/4GE/4wDC4n8RQQAC/nfAwn9PIYXElnAjAPCx884f4Awf8bQYXEaYmIn4GB+YXD7gSFagkQLwaKCAwraCC4bUC4APBwf8aYU4AwoXFaYg/DAwJgBMoLaEAYTUEgSeBdYhlDbQYKCHARIDAwnPUoIGEC4c97oAC6MvAwnTQgIGFU4gASC4SDBWoc/aYeIwUjAwsvC4QJEn/NAwmAbQgGBPoQzBBIfyaYmIgoGFiBfEBATNCaYQABhgGFh4XEIITUC4YGCwFcbQYGBj4XEKQTUDAwUQbQgXBR4hIDagdPAwMEAwXfAwMCC404x88cgf4wMcAwRPBwJeB+YHBn5gCSwQAC/ClBAAfzUoP/H4Nc54wC+fUogABpv/kQGEn8iCAM84sM4j/MAA3M4DJBA4cRn8/+UiE4IDBkcj+YOC+nMqEAQAIICmcin/zCgIXBl8zC4heBgEAhnDBAQSBl/ymfyAgIfBDYIOC7nAC4RIDNQXzl8j/8yDgMvQwZeBC4JIBVIQANIwYABri1EABnFC4ZIBACBGC")) +require("heatshrink").decompress(atob("2GwwcCBQ0JkmSpICuoBMNIP4ABH14CCpBAMgRB/IOlJIJkSIOcgIP5BNH2ICDIJ3/AFvkIJsEIOuAIJKSCk4jQ7dt2wCJt4dP/hBc4EAgIOCIJl8EgPyv5BPyBAIgJBCn4GBg4cG/wKBhJBC/ZBLsATByRBM/5BCyRBM/5BMvMkIJ3gDoOSp5BM+RBLhJBCXIIABj4bF+AJBDoOfA4JBLCQMEMoRBPoBBHBZCnFwEAgfJIIftIJPfDYM8IJ3+ILkCCIOTIJnYDYKnCn5BPpBAGF4WSuEHCgRBF/gRBjxBE/pBJcYMBIJ//U4IRBILDjDBYJBJ25BBh4vCk5BXiRxC+BBJ8ARBDQIdBp4JBQZISBhJBQ/IRCkBBFF4WfIJkHII32II++EgN5F4UkHg/8JohBYCAMEIIdJIJWwCYIRDEwJBGkkn/1k85BDkhAEF4f/IJP4CIM8II3+II/wgEDeoZBH/MJQIPJyV/8hBZFgYCBn5BJwEAgSDEyZBF5DDB+f5yUfIIYZBAAQaCKQJBJ4EAgJBH/5BGtgkBiRBK/1CGAPyvhBB/gRCyBBUh5BFCgJBHvgkB+RBEXIJBEJwKDB8mE55BHOIZuBIJH+CIMJIIraB//7IItgCYIRFIIvyiVP8//kkk5//CIZBCF4YVBIJd5IJH/IIvggEHII1PIIfwAwX5kMkzJKBIKnwCIIsFAQOfII4SBghBGFIRBDAwPJGwJBFoAvELIRBIwEAgfJIJPtIIffEgM8IJ0mpAMBIIP+CIVIIKUCQY+TII3YgEB8hBHn5BFmVOIJIvDXgZBG/hSBiRBK/pBD4BBBCIxBIGQKoBIILLBCIQvEIJrdDAQoOBIIe3IIMPIJEnIIlMyfz/JBDAgJBFNYRBI8BBBFg7dEQYYSBhJBIkgmC/0SsmH+V/knPIIsgCgWfIJkHIJn2IIO+IIN5IJsTkknQYRBC/4UGIJYtBghBJpJBE2ATBCJIsD/nJkLMB5MmfYRBHBIRBH/AtBnhBM/xBBwEAgRBPhMn/1JmY2D8hBSgIUGAQk/IIVvIIMeIJWTE4RBC+VJXIZBGSIJBJ4BBBFhJBD//btiWBiRBOHAMnyVkA4aOBIJQnBAARBCh5BLDQXbvgWBOAIUKfwf/LggIFIJt+AQMJIJbgC/dgCYIRLyVPHQoAGIJP+IAcDDhgAkTwhBEAG5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5Bs+EAgFJAoP27dt2wCJB4P8z4DBCJdt34PB5ApBh5BTwEAgfJAoP+IJffIIvtIJYpC5PAIK8CpM/IKHkyZBQ/1JQYMBIKX8CwMSIIX/IJYWCkhBC/pBKt41DnBBXBwILCIJW3IIeSv5BMBoI1CkArBNYRBP8AVBBYMkA4P7IJn5EANPAoJBNGQQrBg5BTg5BE/5BJ35BH+xBJEAQmCFgRBRKwMEDQWfIJ3JEARBO/gmCwAtBIKH4CYM8IIvtIJAWCIIv+IJHfBgPkEwWcIKoLCkmTIJv+EAc/IJQpCIIeQFoMfIJ/AgEBIIeSv///pBHt4gGIIP/IJZoEYwJBSh5BG/5BHBQQgHII+3II2SQYMDIJ3+CQMJDQlPIJgRDAQIHB/ZBJ/ImEoAvBDwRBL+ARBvJBH+xBGCwRBH/5BG35BHpxBTFggCBIJf8IIufIJfJEwlIF4MPIJuAa4IaFIIX+IIvfBIPkIJHtIIocCNA3AIKMCDQ0/II4VCII2TII9vIJKDBgJBM/gQBiQaGBwRBICIpBD/pBHGQgCCnBBRDQ4OC/ZBD25BJyV/IIwHBIJEgGIKtBIJXgB4IsGAQJBJ/JBHp4LBII4mIGIMHIJYOCIJX/IIe/IJv2IIYaCExB0BIJ0EDRGfIJHJII9JIJH8ExGAGYJBK/ANBFhBBD9pBCAoP+CI5BD/xBC74GB8gmIzhBOgIaJyZBEt5BMn5BEGIQmJyBBBj5BJ4BBBQZOSv///pBEDogCFEYRBFExOTYwMDIJcPIJn/IIIECIJv7tu3IJmSQYJBJ/wMBhIaKp5BGCJICBII35ExVAGoIkBII3wBYN5IJv27ZvCIJv/tu/AYPJExVOIJosKAQJBF/hBLz5BCIoRBLpA1Bh5BHwEAgRBO/3fAYPkIJ3tCwQmM4BBZn5tCIJ2TB4PvIJ6DBgJBHAHRB/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5BmwEAgO27dtARIZCkASBCJfbt4SB+YCB/omM4AjBIJMDDRe3IIUngEAjZBLv5uCAYJBM25BBh5BH+AuBmxBN/MkCQMDIJ2Sp4DBQZgiBIJH+BYN2DRW/IIfggEHIJaWCIIf2ExW+GoJXBIJMGIJvJkjZBgBBN/gpBIJuwIJX/aIMADRQPB/wXBzgSB9pBJ74TB8hBD/wmKMYMDCAJBJgJBPyBBBhpBJYgRBCn5BLt5BBj5BJ/AuBjYaJC4oSBgJBMFIRBB/5BJtggBIJs7DRDcBC4lwUgJBI25BFFIRBJvgzBCoRBH/4NBgZBLCgIXBoATBmxBK/IpCkgGB/YmIsBBN8EAg4aIBwRBDpwhBuxBH35BI/4mIDwMHIJsAIJX8IIdICQMGIJXJIIefIJPfIJ38B4MNDQ4NB8hBDpISBhxBHCQP+CIZBD9omG7AeBn5BOjpBPnATBII1vII+TIJP4gEBG4RBJ/+ACAIaGBgQsDAQMgIIMbIJApEAQN///9Ew3AIJ/wgEDDQu3IJEnIIM7IIo3BIJP/EwxBBh5BPgE2II/5IIskCQMDIJARFyVPII+2DgJBO/wRBuwaE34LB5JBG8EAg5BFCQP8IJP2EwmwF4JXCIJ0GIJ+ACYJBE75BJpJBHWYRBO/7XBgAaEJgQsGkmQCQPtII3kIJP+EwhdBgY2EIJkBDQdvIJWTEwMNIIYdCIJE/IItvDQMfIJ/4OAMbIIoUEAQgSBgJBGCI4sDIIdsDQJBQ/4TBnYaCbgRBJuCqBIIW3IJ37EwV8FoI1FIJsDIIosHAQNACYM2IIn5IJEkIItgIKfgCgIaCA4P8IJNOCQN2IIO/CYPJIJf/EwQYBg5BU9pBOpASBgxBBDYRBKz5BD74YBn5BR/gVBhoaBA4PkIJNJCQMAIIf+CJJBDNAPYIK8d2wHCIJc4gEB7dvIJuTIIf4C4I0FIJn/wAWBIIYsJAQMgKoMbIIQmEAQ9///923AIKvwgED25BOk5BBnYxBIJ//2wWBh40GEwpBIgE3AoP5IJckCQMDGIQRLyVPB4O+IKwAz/hWFIP5B88hBFz4SK8EAn4HE4EAgJBjHwYCCyYSKjkAg///xEB/0AAAJKFABXwCYMPIKUSIJsDwEAFII7CQYnxSol/ILP5IIUgIIWSEZAABgFwgEfwBBBwIKC45KECIIdG4H8HwQREIJ0CIJ1+gCGBn/8QATIBF4LRB//4ILfJIISYBIIVPIJV/4BBp/w7CpBBR/BBwhKJCIJYDBINHyIIVAIIoXJIOcBIKAmBIIYyBIIgREIKw4BHYJABIIknChHjAwuPc4ovDCIxBS/hBGgBBMADfwFYJECIJuQIIcEBASDPABUfILHkHAWAIKD1DVQP8gK2DBAMHAoRBHYqJBIgAICz5BLwBBE/0AIL7+CkhAEIIeTIK4FBIMcSILT7BDI5BQ/JBCkBBFgRBByQ4CIKmAZARBW5JBCIApBb/kAGRBBbgBBCp5BM/+BBQXHIIXgJQRBW/w1CpBBKpJBKEwfAgA7CIIMAGoRBjhJBJgYbDEwLCBAAIFBQYTdHAAfwCYJQJ//yIIVAIJbgKOIiDFCZhBagJBRVAoUTAA4yBGoJAHAAJBCk4saACf8IIWQIP5BLggOCIN3kGQWAIJufIPkABwQCyIBUAiRBzkBB/IJsCIOZALIP4ADIOVIIJsJIONAHQwA==")) From a88c59a33959af68575b88cd860ea3e11d35f79c Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 22:41:19 +0100 Subject: [PATCH 16/21] Add files via upload --- apps/TheBinWatch/app.png | Bin 0 -> 3794 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/TheBinWatch/app.png diff --git a/apps/TheBinWatch/app.png b/apps/TheBinWatch/app.png new file mode 100644 index 0000000000000000000000000000000000000000..ebab4670eb754544f56fcb5d45174c490d6e935f GIT binary patch literal 3794 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 ODsaKd={(DlkoX_cgzO3c literal 0 HcmV?d00001 From 0201ce4f56ea92eb594d5b82ee5cc9261e03cab4 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 22:44:30 +0100 Subject: [PATCH 17/21] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index fb44dda2f..fbdd43d62 100644 --- a/apps.json +++ b/apps.json @@ -3549,8 +3549,8 @@ "description": "Famous binary watch", "tags": "", "storage": [ - {"name":"binwatch.app.js","url":"app.js"}, - {"name":"binwatch.img","url":"app-icon.js","evaluate":true} + {"name":"TheBinWatch.app.js","url":"app.js"}, + {"name":"TheBininWatch.img","url":"app-icon.js","evaluate":true} ] } ] From f95a8114fc9ed5992fd365662d30c04165782282 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 22:48:56 +0100 Subject: [PATCH 18/21] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index fbdd43d62..d32457642 100644 --- a/apps.json +++ b/apps.json @@ -3546,8 +3546,9 @@ "shortName":"BinWatch", "icon": "app.png", "version":"0.01", + "allow_emulator":true, "description": "Famous binary watch", - "tags": "", + "tags": "clock,b2", "storage": [ {"name":"TheBinWatch.app.js","url":"app.js"}, {"name":"TheBininWatch.img","url":"app-icon.js","evaluate":true} From 064f29eb10db15a2264fdf6ee3bd5ad0a04d7456 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 22:50:51 +0100 Subject: [PATCH 19/21] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index d32457642..09c2afb46 100644 --- a/apps.json +++ b/apps.json @@ -3545,10 +3545,11 @@ "name": "Binary Watch", "shortName":"BinWatch", "icon": "app.png", - "version":"0.01", + "version":"0.02", "allow_emulator":true, "description": "Famous binary watch", "tags": "clock,b2", + "type": "clock", "storage": [ {"name":"TheBinWatch.app.js","url":"app.js"}, {"name":"TheBininWatch.img","url":"app-icon.js","evaluate":true} From 824a0cea4f78792ea10622a0bba1e79909159e50 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 22:58:20 +0100 Subject: [PATCH 20/21] Create ChangeLog --- apps/TheBinWatch/ChangeLog | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/TheBinWatch/ChangeLog diff --git a/apps/TheBinWatch/ChangeLog b/apps/TheBinWatch/ChangeLog new file mode 100644 index 000000000..f916cd6cf --- /dev/null +++ b/apps/TheBinWatch/ChangeLog @@ -0,0 +1,2 @@ +0.01: start of development +0.02: first running version for BangleJs2 From 2ed21a314a2b159b03627138dc881eac334f05c9 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Fri, 19 Nov 2021 10:02:59 +0100 Subject: [PATCH 21/21] Delete apps.json --- apps.json | 3558 ----------------------------------------------------- 1 file changed, 3558 deletions(-) delete mode 100644 apps.json diff --git a/apps.json b/apps.json deleted file mode 100644 index 09c2afb46..000000000 --- a/apps.json +++ /dev/null @@ -1,3558 +0,0 @@ -[ - { "id": "boot", - "name": "Bootloader", - "tags": "tool,system,b2", - "type":"bootloader", - "icon": "bootloader.png", - "version":"0.30", - "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", - "storage": [ - {"name":".boot0","url":"boot0.js"}, - {"name":".bootcde","url":"bootloader.js"}, - {"name":"bootupdate.js","url":"bootupdate.js"} - ], - "sortorder" : -10 - }, - { "id": "moonphase", - "name": "Moonphase", - "icon": "app.png", - "version":"0.02", - "description": "Shows current moon phase. Now with GPS function.", - "tags": "", - "allow_emulator":true, - "storage": [ - {"name":"moonphase.app.js","url":"app.js"}, - {"name":"moonphase.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "daysl", - "name": "Days left", - "icon": "app.png", - "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, - "storage": [ - {"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", - "name": "Launcher (Default)", - "shortName":"Launcher", - "icon": "app.png", - "version":"0.07", - "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,b2", - "type":"launch", - "storage": [ - {"name":"launch.app.js","url":"app.js"} - ], - "sortorder" : -10 - }, - { "id": "launchb2", - "name": "Launcher (Bangle.js 2)", - "shortName":"Launcher", - "icon": "app.png", - "version":"0.02", - "description": "This is needed by Bangle.js 2.0 to display a menu allowing you to choose your own applications. It will not work on Bangle.js 1.0.", - "tags": "tool,system,launcher,b2,bno1", - "type":"launch", - "storage": [ - {"name":"launchb2.app.js","url":"app.js"} - ], - "sortorder" : -10 - }, - { "id": "about", - "name": "About", - "icon": "app.png", - "version":"0.08", - "description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers", - "tags": "tool,system,b2", - "allow_emulator":true, - "storage": [ - {"name":"about.app.js","url":"app.js"}, - {"name":"about.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "locale", - "name": "Languages", - "icon": "locale.png", - "version":"0.09", - "description": "Translations for different countries", - "tags": "tool,system,locale,translate,b2", - "type": "locale", - "custom":"locale.html", - "readme": "README.md", - "storage": [ - {"name":"locale"} - ], - "sortorder" : -10 - }, - { "id": "notify", - "name": "Notifications (default)", - "shortName":"Notifications", - "icon": "notify.png", - "version":"0.11", - "description": "Provides the default `notify` module used by applications to display notifications in a bar at the top of the screen. This module is installed by default by client applications such as the Gadgetbridge app. Installing `Fullscreen Notifications` replaces this module with a version that displays the notifications using the full screen", - "tags": "widget", - "type": "notify", - "readme": "README.md", - "storage": [ - {"name":"notify","url":"notify.js"} - ] - }, - { "id": "notifyfs", - "name": "Fullscreen Notifications", - "shortName":"Notifications", - "icon": "notify.png", - "version":"0.12", - "description": "Provides a replacement for the `Notifications (default)` `notify` module. This version is used by applications to display notifications fullscreen. This may not fully restore the screen after on some apps. See `Notifications (default)` for more information about the notify module.", - "tags": "widget,b2", - "type": "notify", - "storage": [ - {"name":"notify","url":"notify.js"} - ] - }, - { "id": "welcome", - "name": "Welcome", - "icon": "app.png", - "version":"0.12", - "description": "Appears at first boot and explains how to use Bangle.js", - "tags": "start,welcome", - "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} - ], - "data": [ - {"name":"welcome.json"} - ] - }, - { "id": "mywelcome", - "name": "Customised Welcome", - "shortName": "My Welcome", - "icon": "app.png", - "version":"0.12", - "description": "Appears at first boot and explains how to use Bangle.js. Like 'Welcome', but can be customised with a greeting", - "tags": "start,welcome", - "custom":"custom.html", - "storage": [ - {"name":"mywelcome.boot.js","url":"boot.js"}, - {"name":"mywelcome.app.js","url":"app.js"}, - {"name":"mywelcome.settings.js","url":"settings.js"}, - {"name":"mywelcome.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"mywelcome.json"} - ] - }, - { "id": "gbridge", - "name": "Gadgetbridge", - "icon": "app.png", - "version":"0.24", - "description": "The default notification handler for Gadgetbridge notifications from Android", - "tags": "tool,system,android,widget,b2", - "readme": "README.md", - "type":"widget", - "dependencies": { "notify":"type" }, - "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":"gbridge.json"} - ] - }, - { "id": "mclock", - "name": "Morphing Clock", - "icon": "clock-morphing.png", - "version":"0.07", - "description": "7 segment clock that morphs between minutes and hours", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"mclock.app.js","url":"clock-morphing.js"}, - {"name":"mclock.img","url":"clock-morphing-icon.js","evaluate":true} - ], - "sortorder" : -9 - }, - { "id": "setting", - "name": "Settings", - "icon": "settings.png", - "version":"0.28", - "description": "A menu for setting up Bangle.js", - "tags": "tool,system,b2", - "readme": "README.md", - "storage": [ - {"name":"setting.app.js","url":"settings.js"}, - {"name":"setting.img","url":"settings-icon.js","evaluate":true} - ], - "data": [ - {"name":"setting.json", "url":"settings.min.json","evaluate":true} - ], - "sortorder" : -2 - }, - { "id": "alarm", - "name": "Default Alarm", - "shortName":"Alarms", - "icon": "app.png", - "version":"0.12", - "description": "Set and respond to alarms", - "tags": "tool,alarm,widget,b2", - "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"} - ], - "data": [ - {"name":"alarm.json"} - ] - }, - { "id": "wclock", - "name": "Word Clock", - "icon": "clock-word.png", - "version":"0.03", - "description": "Display Time as Text", - "tags": "clock,b2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"wclock.app.js","url":"clock-word.js"}, - {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true} - ] - }, - { "id": "fontclock", - "name": "Font Clock", - "icon": "fontclock.png", - "version":"0.01", - "description": "Choose the font and design of clock face from a library of available designs", - "tags": "clock", - "type":"clock", - "allow_emulator":false, - "readme": "README.md", - "custom":"custom.html", - "storage": [ - {"name":"fontclock.app.js","url":"fontclock.js"}, - {"name":"fontclock.img","url":"fontclock-icon.js","evaluate":true}, - {"name":"fontclock.hand.js","url":"fontclock.hand.js"}, - {"name":"fontclock.thinhand.js","url":"fontclock.thinhand.js"}, - {"name":"fontclock.thickhand.js","url":"fontclock.thickhand.js"}, - {"name":"fontclock.hourscriber.js","url":"fontclock.hourscriber.js"}, - {"name":"fontclock.font.js","url":"fontclock.font.js"}, - {"name":"fontclock.font.abril_ff50.js","url":"fontclock.font.abril_ff50.js"}, - {"name":"fontclock.font.cpstc58.js","url":"fontclock.font.cpstc58.js"}, - {"name":"fontclock.font.mntn25.js","url":"fontclock.font.mntn25.js"}, - {"name":"fontclock.font.mntn50.js","url":"fontclock.font.mntn50.js"}, - {"name":"fontclock.font.vector25.js","url":"fontclock.font.vector25.js"}, - {"name":"fontclock.font.vector50.js","url":"fontclock.font.vector50.js"} - ] - }, - { "id": "slidingtext", - "name": "Sliding Clock", - "icon": "slidingtext.png", - "version":"0.07", - "description": "Inspired by the Pebble sliding clock, old times are scrolled off the screen and new times on. You are also able to change language on the fly so you can see the time written in other languages using button 1. Currently English, French, Japanese, Spanish and German are supported", - "tags": "clock", - "type":"clock", - "allow_emulator":false, - "readme": "README.md", - "custom":"custom.html", - "storage": [ - {"name":"slidingtext.app.js","url":"slidingtext.js"}, - {"name":"slidingtext.img","url":"slidingtext-icon.js","evaluate":true}, - {"name":"slidingtext.locale.en.js","url":"slidingtext.locale.en.js"}, - {"name":"slidingtext.locale.en2.js","url":"slidingtext.locale.en2.js"}, - {"name":"slidingtext.utils.en.js","url":"slidingtext.utils.en.js"}, - {"name":"slidingtext.locale.es.js","url":"slidingtext.locale.es.js"}, - {"name":"slidingtext.locale.fr.js","url":"slidingtext.locale.fr.js"}, - {"name":"slidingtext.locale.jp.js","url":"slidingtext.locale.jp.js"}, - {"name":"slidingtext.locale.de.js","url":"slidingtext.locale.de.js"}, - {"name":"slidingtext.dtfmt.js","url":"slidingtext.dtfmt.js"} - ] - }, - { "id": "solarclock", - "name": "Solar Clock", - "icon": "solar_clock.png", - "version":"0.02", - "description": "Using your current or chosen location the solar watch face shows the Sun's sky position, time and date. Also allows you to wind backwards and forwards in time to see the sun's position", - "tags": "clock", - "type":"clock", - "allow_emulator":false, - "readme": "README.md", - "custom":"custom.html", - "storage": [ - {"name":"solarclock.app.js","url":"solar_clock.js"}, - {"name":"solarclock.img","url":"solar_clock-icon.js","evaluate":true}, - {"name":"solar_colors.js","url":"solar_colors.js"}, - {"name":"solar_controller.js","url":"solar_controller.js"}, - {"name":"solar_date_utils.js","url":"solar_date_utils.js"}, - {"name":"solar_graphic_utils.js","url":"solar_graphic_utils.js"}, - {"name":"solar_location.js","url":"solar_location.js"}, - {"name":"solar_math_utils.js","url":"solar_math_utils.js"}, - {"name":"solar_loc.Reykjavik.json","url":"solar_loc.Reykjavik.json"}, - {"name":"solar_loc.Hong_Kong.json","url":"solar_loc.Hong_Kong.json"}, - {"name":"solar_loc.Honolulu.json","url":"solar_loc.Honolulu.json"}, - {"name":"solar_loc.Rio.json","url":"solar_loc.Rio.json"}, - {"name":"solar_loc.Tokyo.json","url":"solar_loc.Tokyo.json"}, - {"name":"solar_loc.Seoul.json","url":"solar_loc.Seoul.json"} - ] - }, - { "id": "sweepclock", - "name": "Sweep Clock", - "icon": "sweepclock.png", - "version":"0.04", - "description": "Smooth sweep secondhand with single hour numeral. Use button 1 to toggle the numeral font, button 3 to change the colour theme and button 4 to change the date placement", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"sweepclock.app.js","url":"sweepclock.js"}, - {"name":"sweepclock.img","url":"sweepclock-icon.js","evaluate":true} - ] - }, - { "id": "matrixclock", - "name": "Matrix Clock", - "icon": "matrixclock.png", - "version":"0.01", - "description": "inspired by The Matrix, a clock of the same style", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"matrixclock.app.js","url":"matrixclock.js"}, - {"name":"matrixclock.img","url":"matrixclock-icon.js","evaluate":true} - ] - }, - { "id": "imgclock", - "name": "Image background clock", - "shortName":"Image Clock", - "icon": "app.png", - "version":"0.08", - "description": "A clock with an image as a background", - "tags": "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":""} - ] - }, - { "id": "impwclock", - "name": "Imprecise Word Clock", - "icon": "clock-impword.png", - "version":"0.03", - "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"impwclock.app.js","url":"clock-impword.js"}, - {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true} - ] - }, - { "id": "aclock", - "name": "Analog Clock", - "icon": "clock-analog.png", - "version": "0.15", - "description": "An Analog Clock", - "tags": "clock,b2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"aclock.app.js","url":"clock-analog.js"}, - {"name":"aclock.img","url":"clock-analog-icon.js","evaluate":true} - ] - }, - { "id": "clock2x3", - "name": "2x3 Pixel Clock", - "icon": "clock2x3.png", - "version":"0.05", - "description": "This is a simple clock using minimalist 2x3 pixel numerical digits", - "tags": "clock,b2", - "type": "clock", - "allow_emulator":true, - "storage": [ - {"name":"clock2x3.app.js","url":"clock2x3-app.js"}, - {"name":"clock2x3.img","url":"clock2x3-icon.js","evaluate":true} - ] - }, - { "id": "geissclk", - "name": "Geiss Clock", - "icon": "clock.png", - "version":"0.03", - "description": "7 segment clock with animated background in the style of Ryan Geiss' music visualisation. NOTE: The first run will take ~1 minute to do some precalculation", - "tags": "clock,bno2", - "type":"clock", - "storage": [ - {"name":"geissclk.app.js","url":"clock.js"}, - {"name":"geissclk.precompute.js","url":"precompute.js"}, - {"name":"geissclk.img","url":"clock-icon.js","evaluate":true} - ], - "data": [ - {"name":"geissclk.0.map"}, - {"name":"geissclk.1.map"}, - {"name":"geissclk.2.map"}, - {"name":"geissclk.3.map"}, - {"name":"geissclk.4.map"}, - {"name":"geissclk.5.map"}, - {"name":"geissclk.0.pal"}, - {"name":"geissclk.1.pal"}, - {"name":"geissclk.2.pal"} - ] - }, - { "id": "trex", - "name": "T-Rex", - "icon": "trex.png", - "version":"0.04", - "description": "T-Rex game in the style of Chrome's offline game", - "tags": "game,b2", - "allow_emulator":true, - "storage": [ - {"name":"trex.app.js","url":"trex.js"}, - {"name":"trex.img","url":"trex-icon.js","evaluate":true}, - {"name":"trex.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"trex.score", "storageFile": true} - ] - }, - { "id": "astroid", - "name": "Asteroids!", - "icon": "asteroids.png", - "version":"0.03", - "description": "Retro asteroids game", - "tags": "game,b2", - "allow_emulator":true, - "storage": [ - {"name":"astroid.app.js","url":"asteroids.js"}, - {"name":"astroid.img","url":"asteroids-icon.js","evaluate":true} - ] - }, - { "id": "clickms", - "name": "Click Master", - "icon": "click-master.png", - "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} - ] - }, - { "id": "horsey", - "name": "Horse Race!", - "icon": "horse-race.png", - "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} - ] - }, - { "id": "compass", - "name": "Compass", - "icon": "compass.png", - "version":"0.03", - "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} - ] - }, - { "id": "gpstime", - "name": "GPS Time", - "icon": "gpstime.png", - "version":"0.04", - "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} - ] - }, - { "id": "openloc", - "name": "Open Location / Plus Codes", - "shortName": "Open Location", - "icon": "app.png", - "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} - ] - }, - { "id": "speedo", - "name": "Speedo", - "icon": "speedo.png", - "version":"0.04", - "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} - ] - }, - { "id": "gpsrec", - "name": "GPS Recorder", - "icon": "app.png", - "version":"0.23", - "interface": "interface.html", - "description": "Application that allows you to record a GPS track. Can run in background", - "tags": "tool,outdoors,gps,widget", - "readme": "README.md", - "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.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"gpsrec.json"}, - {"wildcard":".gpsrc?","storageFile": true} - ] - }, - { "id": "gpsnav", - "name": "GPS Navigation", - "icon": "icon.png", - "version":"0.05", - "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording, now with waypoint editor", - "tags": "tool,outdoors,gps", - "readme": "README.md", - "interface":"waypoints.html", - "storage": [ - {"name":"gpsnav.app.js","url":"app.min.js"}, - {"name":"gpsnav.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"waypoints.json","url":"waypoints.json"} - ] - }, - { "id": "heart", - "name": "Heart Rate Recorder", - "icon": "app.png", - "version":"0.06", - "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"} - ], - "data": [ - {"name":"heart.json"}, - {"wildcard":".heart?","storageFile": true} - ] - }, - { "id": "slevel", - "name": "Spirit Level", - "icon": "spiritlevel.png", - "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} - ] - }, - { "id": "files", - "name": "App Manager", - "icon": "files.png", - "version":"0.07", - "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} - ] - }, - { "id": "weather", - "name": "Weather", - "icon": "icon.png", - "version":"0.09", - "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.settings.js","url":"settings.js"} - ], - "data": [ - {"name": "weather.json"} - ] - }, - { "id": "chargeanim", - "name": "Charge Animation", - "icon": "icon.png", - "version":"0.01", - "description": "When charging, show a sideways charging animation and keep the screen on. When removed from the charger load the clock again.", - "tags": "battery", - "allow_emulator":true, - "storage": [ - {"name":"chargeanim.app.js","url":"app.js"}, - {"name":"chargeanim.boot.js","url":"boot.js"}, - {"name":"chargeanim.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "bluetoothdock", - "name": "Bluetooth Dock", - "shortName":"Dock", - "icon": "app.png", - "version":"0.01", - "description": "When charging shows the time, scans Bluetooth for known devices (eg temperature) and shows them on the screen", - "tags": "bluetooth", - "readme": "README.md", - "storage": [ - {"name":"bluetoothdock.app.js","url":"app.js"}, - {"name":"bluetoothdock.boot.js","url":"boot.js"}, - {"name":"bluetoothdock.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "widbat", - "name": "Battery Level Widget", - "icon": "widget.png", - "version":"0.08", - "description": "Show the current battery level and charging status in the top right of the clock", - "tags": "widget,battery,b2", - "type":"widget", - "storage": [ - {"name":"widbat.wid.js","url":"widget.js"} - ] - }, - { "id": "widlock", - "name": "Lock Widget", - "icon": "widget.png", - "version":"0.03", - "description": "On devices with always-on display (Bangle.js 2) this displays lock icon whenever the display is locked", - "tags": "widget,lock,b2", - "type":"widget", - "storage": [ - {"name":"widlock.wid.js","url":"widget.js"} - ] - }, - { "id": "widbatpc", - "name": "Battery Level Widget (with percentage)", - "shortName": "Battery Widget", - "icon": "widget.png", - "version":"0.12", - "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", - "tags": "widget,battery,b2", - "type":"widget", - "readme": "README.md", - "storage": [ - {"name":"widbatpc.wid.js","url":"widget.js"}, - {"name":"widbatpc.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"widbatpc.json"} - ] - }, - { "id": "widbatwarn", - "name": "Battery Warning", - "shortName": "Battery Warning", - "icon": "widget.png", - "readme": "README.md", - "version":"0.02", - "description": "Show a warning when the battery runs low.", - "tags": "tool,battery", - "type":"widget", - "dependencies": { "notify":"type" }, - "storage": [ - {"name":"widbatwarn.wid.js","url":"widget.js"}, - {"name":"widbatwarn.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"widbatwarn.json"} - ] - }, - { "id": "widbt", - "name": "Bluetooth Widget", - "icon": "widget.png", - "version":"0.05", - "description": "Show the current Bluetooth connection status in the top right of the clock", - "tags": "widget,bluetooth,b2", - "type":"widget", - "storage": [ - {"name":"widbt.wid.js","url":"widget.js"} - ] - }, - { "id": "widchime", - "name": "Hour Chime", - "icon": "widget.png", - "version":"0.02", - "description": "Buzz or beep on every whole hour.", - "tags": "widget", - "type": "widget", - "storage": [ - {"name":"widchime.wid.js","url":"widget.js"}, - {"name":"widchime.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"widchime.json"} - ] - }, - { "id": "widram", - "name": "RAM Widget", - "shortName":"RAM Widget", - "icon": "widget.png", - "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"} - ] - }, - { "id": "hrm", - "name": "Heart Rate Monitor", - "icon": "heartrate.png", - "version":"0.05", - "description": "Measure your heart rate and see live sensor data", - "tags": "health", - "storage": [ - {"name":"hrm.app.js","url":"heartrate.js"}, - {"name":"hrm.img","url":"heartrate-icon.js","evaluate":true} - ] - }, - { "id": "widhrm", - "name": "Simple Heart Rate widget", - "icon": "widget.png", - "version":"0.04", - "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"} - ] - }, - { "id": "stetho", - "name": "Stethoscope", - "icon": "stetho.png", - "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} - ] - }, - { "id": "swatch", - "name": "Stopwatch", - "icon": "stopwatch.png", - "version":"0.07", - "interface": "interface.html", - "description": "Simple stopwatch with Lap Time logging to a JSON file", - "tags": "health", - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"swatch.app.js","url":"stopwatch.js"}, - {"name":"swatch.img","url":"stopwatch-icon.js","evaluate":true} - ] - }, - { "id": "hidmsic", - "name": "Bluetooth Music Controls", - "shortName": "Music Control", - "icon": "hid-music.png", - "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} - ] - }, - { "id": "hidkbd", - "name": "Bluetooth Keyboard", - "shortName": "Bluetooth Kbd", - "icon": "hid-keyboard.png", - "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} - ] - }, - { "id": "hidbkbd", - "name": "Binary Bluetooth Keyboard", - "shortName": "Binary BT Kbd", - "icon": "hid-binary-keyboard.png", - "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} - ] - }, - { "id": "animals", - "name": "Animals Game", - "icon": "animals.png", - "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} - ] - }, - { "id": "qrcode", - "name": "Custom QR Code", - "icon": "app.png", - "version":"0.02", - "description": "Use this to upload a customised QR code to Bangle.js", - "tags": "qrcode,b2", - "custom": "custom.html", "customConnect":true, - "storage": [ - {"name":"qrcode.app.js"}, - {"name":"qrcode.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "beer", - "name": "Beer Compass", - "icon": "app.png", - "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} - ] - }, - { "id": "route", - "name": "Route Viewer", - "icon": "app.png", - "version":"0.02", - "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} - ] - }, - { - "id": "ncstart", - "name": "NCEU Startup", - "icon": "start.png", - "version":"0.06", - "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} - ], - "data": [ - {"name":"ncstart.json"} - ] - }, - { "id": "ncfrun", - "name": "NCEU 5K Fun Run", - "icon": "nceu-funrun.png", - "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} - ] - }, - { "id": "widnceu", - "name": "NCEU Logo Widget", - "icon": "widget.png", - "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"} - ] - }, - { "id": "sclock", - "name": "Simple Clock", - "icon": "clock-simple.png", - "version":"0.06", - "description": "A Simple Digital Clock", - "tags": "clock,b2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"sclock.app.js","url":"clock-simple.js"}, - {"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true} - ] - }, - { "id": "s7clk", - "name": "Simple 7 segment Clock", - "icon": "icon.png", - "version":"0.03", - "description": "A simple 7 segment Clock with date", - "tags": "clock,b2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"s7clk.app.js","url":"app.js"}, - {"name":"s7clk.img","url":"icon.js","evaluate":true} - ] - }, - { "id": "vibrclock", - "name": "Vibrate Clock", - "icon": "app.png", - "version":"0.03", - "description": "When BTN1 is pressed, vibrate out the time as a series of buzzes, one digit at a time. Hours, then Minutes. Zero is signified by one long buzz. Otherwise a simple digital clock.", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"vibrclock.app.js","url":"app.js"}, - {"name":"vibrclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "svclock", - "name": "Simple V-Clock", - "icon": "vclock-simple.png", - "version":"0.02", - "description": "Modification of Simple Clock 0.04 to use Vectorfont", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"svclock.app.js","url":"vclock-simple.js"}, - {"name":"svclock.img","url":"vclock-simple-icon.js","evaluate":true} - ] - }, - { "id": "dclock", - "name": "Dev Clock", - "icon": "clock-dev.png", - "version":"0.10", - "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)", - "tags": "clock,b2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"dclock.app.js","url":"clock-dev.js"}, - {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true} - ] - }, - { "id": "gesture", - "name": "Gesture Test", - "icon": "gesture.png", - "version":"0.01", - "description": "BETA! Uploads a basic Tensorflow Gesture model, and then outputs each gesture as a message", - "tags": "gesture,ai", - "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} - ] - }, - { "id": "pparrot", - "name": "Party Parrot", - "icon": "party-parrot.png", - "version":"0.01", - "description": "Party with a parrot on your wrist", - "tags": "party,parrot,lol", - "type":"app", - "allow_emulator":true, - "storage": [ - {"name":"pparrot.app.js","url":"party-parrot.js"}, - {"name":"pparrot.img","url":"party-parrot-icon.js","evaluate":true} - ] - }, - { "id": "hrings", - "name": "Hypno Rings", - "icon": "hypno-rings.png", - "version":"0.01", - "description": "Experiment with trippy rings, press buttons for change", - "tags": "rings,hypnosis,psychadelic", - "type":"app", - "allow_emulator":true, - "storage": [ - {"name":"hrings.app.js","url":"hypno-rings.js"}, - {"name":"hrings.img","url":"hypno-rings-icon.js","evaluate":true} - ] - }, - { "id": "morse", - "name": "Morse Code", - "icon": "morse-code.png", - "version":"0.01", - "description": "Learn morse code by hearing/seeing/feeling the code. Tap to toggle buzz!", - "tags": "morse,sound,visual,input", - "type":"app", - "storage": [ - {"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", - "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} - ] - }, - { "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", - "name": "Jingle Bells", - "icon": "jbells.png", - "version":"0.01", - "description": "Play Jingle Bells", - "tags": "sound", - "type":"app", - "storage": [ - {"name":"jbells.app.js","url":"jbells.js"}, - {"name":"jbells.img","url":"jbells-icon.js","evaluate":true} - ] - }, - { "id": "scolor", - "name": "Show Color", - "icon": "show-color.png", - "version":"0.01", - "description": "Display all available Colors and Names", - "tags": "tool", - "type":"app", - "allow_emulator":true, - "storage": [ - {"name":"scolor.app.js","url":"show-color.js"}, - {"name":"scolor.img","url":"show-color-icon.js","evaluate":true} - ] - }, - { "id": "miclock", - "name": "Mixed Clock", - "icon": "clock-mixed.png", - "version":"0.05", - "description": "A mix of analog and digital Clock", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"miclock.app.js","url":"clock-mixed.js"}, - {"name":"miclock.img","url":"clock-mixed-icon.js","evaluate":true} - ] - }, - { "id": "bclock", - "name": "Binary Clock", - "icon": "clock-binary.png", - "version":"0.03", - "description": "A simple binary clock watch face", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"bclock.app.js","url":"clock-binary.js"}, - {"name":"bclock.img","url":"clock-binary-icon.js","evaluate":true} - ] - }, - { "id": "clotris", - "name": "Clock-Tris", - "icon": "clock-tris.png", - "version":"0.01", - "description": "A fully functional clone of a classic game of falling blocks", - "tags": "game", - "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"} - ] - }, - { "id": "flappy", - "name": "Flappy Bird", - "icon": "app.png", - "version":"0.05", - "description": "A Flappy Bird game clone", - "tags": "game,b2", - "allow_emulator":true, - "storage": [ - {"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.05", - "description": "An application that displays information about altitude, lat/lon, satellites and time", - "tags": "gps,b2", - "type": "app", - "storage": [ - {"name":"gpsinfo.app.js","url": "gps-info.js"}, - {"name":"gpsinfo.img","url": "gps-info-icon.js","evaluate": true} - ] - }, - { "id": "assistedgps", - "name": "Assisted GPS Update (AGPS)", - "icon": "app.png", - "version":"0.01", - "description": "Downloads assisted GPS (AGPS) data to Bangle.js for faster GPS startup and more accurate fixes. **No app will be installed**, this just uploads new data to the GPS chip.", - "custom": "custom.html", - "tags": "tool,outdoors,agps,bno2", - "type": "RAM", - "storage": [ ] - }, - { - "id": "pomodo", - "name":"Pomodoro", - "icon":"pomodoro.png", - "version":"0.01", - "description": "A simple pomodoro timer.", - "tags": "pomodoro,cooking,tools", - "type": "app", - "allow_emulator":true, - "storage": [ - {"name":"pomodo.app.js","url": "pomodoro.js"}, - {"name":"pomodo.img","url": "pomodoro-icon.js","evaluate": true} - ] - }, - { "id": "blobclk", - "name": "Large Digit Blob Clock", - "shortName" : "Blob Clock", - "icon": "clock-blob.png", - "version":"0.06", - "description": "A clock with big digits", - "tags": "clock,b2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"blobclk.app.js","url":"clock-blob.js"}, - {"name":"blobclk.img","url":"clock-blob-icon.js","evaluate":true} - ] - }, - { "id": "boldclk", - "name": "Bold Clock", - "icon": "bold_clock.png", - "version":"0.05", - "description": "Simple, readable and practical clock", - "tags": "clock,b2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"boldclk.app.js","url":"bold_clock.js"}, - {"name":"boldclk.img","url":"bold_clock-icon.js","evaluate":true} - ] - }, - { "id": "widclk", - "name": "Digital clock widget", - "icon": "widget.png", - "version":"0.05", - "description": "A simple digital clock widget", - "tags": "widget,clock", - "type":"widget", - "storage": [ - {"name":"widclk.wid.js","url":"widget.js"} - ] - }, - { "id": "widpedom", - "name": "Pedometer widget", - "icon": "widget.png", - "version":"0.19", - "description": "Daily pedometer widget", - "tags": "widget,b2", - "type":"widget", - "storage": [ - {"name":"widpedom.wid.js","url":"widget.js"}, - {"name":"widpedom.settings.js","url":"settings.js"} - ] - }, - { "id": "berlinc", - "name": "Berlin Clock", - "icon": "berlin-clock.png", - "version":"0.04", - "description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"berlinc.app.js","url":"berlin-clock.js"}, - {"name":"berlinc.img","url":"berlin-clock-icon.js","evaluate":true} - ] - }, - { "id": "ctrclk", - "name": "Centerclock", - "icon": "app.png", - "version":"0.03", - "description": "Watch-centered digital 24h clock with date in dd.mm.yyyy format.", - "tags": "clock,bno2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"ctrclk.app.js","url":"app.js"}, - {"name":"ctrclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "demoapp", - "name": "Demo Loop", - "icon": "app.png", - "version":"0.01", - "description": "Simple demo app - displays Bangle.js, JS logo, graphics, and Bangle.js information", - "tags": "", - "type":"app", - "allow_emulator":true, - "storage": [ - {"name":"demoapp.app.js","url":"app.js"}, - {"name":"demoapp.img","url":"app-icon.js","evaluate":true} - ], - "sortorder" : -9 - }, - { "id": "flagrse", - "name": "Espruino Flag Raiser", - "icon": "app.png", - "version":"0.01", - "readme": "README.md", - "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} - ] - }, - { - "id": "pipboy", - "name": "Pipboy", - "icon": "app.png", - "version": "0.04", - "description": "Pipboy themed clock", - "tags": "clock,bno2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"pipboy.app.js","url":"app.js"}, - {"name":"pipboy.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "torch", - "name": "Torch", - "shortName":"Torch", - "icon": "app.png", - "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} - ] - }, - { "id": "rtorch", - "name": "Red Torch", - "shortName":"RedTorch", - "icon": "app.png", - "version":"0.01", - "description": "Turns screen RED to help you see in the dark without breaking your night vision. Select from the launcher or press BTN3,BTN1,BTN3,BTN1 quickly to start when in any app that shows widgets", - "tags": "tool,torch", - "storage": [ - {"name":"rtorch.app.js","url":"app.js"}, - {"name":"rtorch.wid.js","url":"widget.js"}, - {"name":"rtorch.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "wohrm", - "name": "Workout HRM", - "icon": "app.png", - "version":"0.08", - "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, - "storage": [ - {"name":"wohrm.app.js","url":"app.js"}, - {"name":"wohrm.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "widid", - "name": "Bluetooth ID Widget", - "icon": "widget.png", - "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"} - ] - }, - { - "id": "grocery", - "name": "Grocery", - "icon": "grocery.png", - "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", - "storage": [ - {"name":"grocery"}, - {"name":"grocery.app.js"}, - {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} - ] - }, - { "id": "marioclock", - "name": "Mario Clock", - "icon": "marioclock.png", - "version":"0.15", - "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", - "tags": "clock,mario,retro", - "type": "clock", - "allow_emulator":false, - "readme": "README.md", - "storage": [ - {"name":"marioclock.app.js","url":"marioclock-app.js"}, - {"name":"marioclock.img","url":"marioclock-icon.js","evaluate":true} - ] - }, - { "id": "cliock", - "name": "Commandline-Clock", - "shortName":"CLI-Clock", - "icon": "app.png", - "version":"0.13", - "description": "Simple CLI-Styled Clock", - "tags": "clock,cli,command,bash,shell,b2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"cliock.app.js","url":"app.js"}, - {"name":"cliock.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "widver", - "name": "Firmware Version Widget", - "icon": "widget.png", - "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"} - ] - }, - { "id": "barclock", - "name": "Bar Clock", - "icon": "clock-bar.png", - "version":"0.08", - "description": "A simple digital clock showing seconds as a bar", - "tags": "clock", - "type":"clock", - "readme": "README.md", - "allow_emulator":true, - "storage": [ - {"name":"barclock.app.js","url":"clock-bar.js"}, - {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true} - ] - }, - { "id": "dotclock", - "name": "Dot Clock", - "icon": "clock-dot.png", - "version":"0.03", - "description": "A Minimal Dot Analog Clock", - "tags": "clock,b2", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"dotclock.app.js","url":"clock-dot.js"}, - {"name":"dotclock.img","url":"clock-dot-icon.js","evaluate":true} - ] - }, - { "id": "widtbat", - "name": "Tiny Battery Widget", - "icon": "widget.png", - "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"} - ] - }, - { "id": "chrono", - "name": "Chrono", - "shortName":"Chrono", - "icon": "chrono.png", - "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} - ] - }, - { "id": "astrocalc", - "name": "Astrocalc", - "icon": "astrocalc.png", - "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, - "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} - ] - }, - { "id": "widhwt", - "name": "Hand Wash Timer", - "icon": "widget.png", - "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"} - ] - }, - { "id": "toucher", - "name": "Touch Launcher", - "shortName":"Toucher", - "icon": "app.png", - "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"} - ], - "sortorder" : -10 - }, - { - "id": "balltastic", - "name": "Balltastic", - "icon": "app.png", - "version": "0.02", - "description": "Simple but fun ball eats dots game.", - "tags": "game,fun", - "type": "app", - "storage": [ - {"name":"balltastic.app.js","url":"app.js"}, - {"name":"balltastic.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "rpgdice", - "name": "RPG dice", - "icon": "rpgdice.png", - "version": "0.02", - "description": "Simple RPG dice rolling app.", - "tags": "game,fun", - "type": "app", - "allow_emulator": true, - "storage": [ - {"name":"rpgdice.app.js","url": "app.js"}, - {"name":"rpgdice.img","url": "app-icon.js","evaluate":true} - ] - }, - { "id": "widmp", - "name": "Moon Phase Widget", - "icon": "widget.png", - "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"} - ] - }, - { "id": "minionclk", - "name": "Minion clock", - "icon": "minionclk.png", - "version": "0.05", - "description": "Minion themed clock.", - "tags": "clock,minion", - "type": "clock", - "allow_emulator": true, - "storage": [ - {"name":"minionclk.app.js","url":"app.js"}, - {"name":"minionclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "openstmap", - "name": "OpenStreetMap", - "shortName":"OpenStMap", - "icon": "app.png", - "version":"0.09", - "description": "[BETA] Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are", - "tags": "outdoors,gps,b2", - "custom": "custom.html", "customConnect":true, - "storage": [ - {"name":"openstmap","url":"openstmap.js"}, - {"name":"openstmap.app.js","url":"app.js"}, - {"name":"openstmap.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "activepedom", - "name": "Active Pedometer", - "shortName":"Active Pedometer", - "icon": "app.png", - "version":"0.09", - "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", - "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"} - ] - }, - { "id": "chronowid", - "name": "Chrono Widget", - "shortName":"Chrono Widget", - "icon": "app.png", - "version":"0.03", - "description": "Chronometer (timer) which runs as widget.", - "tags": "tools,widget", - "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} - ] - }, - { "id": "tabata", - "name": "Tabata", - "shortName": "Tabata - Control High-Intensity Interval Training", - "icon": "tabata.png", - "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} - ] - }, - { "id": "custom", - "name": "Custom Boot Code ", - "icon": "custom.png", - "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.03", - "description": "Stopwatch with 5 laps supported (cyclically replaced)", - "tags": "stopwatch,chrono,timer,chronometer,b2", - "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", - "icon": "app.png", - "version":"0.10", - "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} - ] - }, - { "id": "nato", - "name": "NATO Alphabet", - "shortName" : "NATOAlphabet", - "icon": "nato.png", - "version":"0.01", - "type": "app", - "description": "Learn the NATO Phonetic alphabet plus some numbers.", - "tags": "app,learn,visual", - "allow_emulator":true, - "storage": [ - {"name":"nato.app.js","url":"nato.js"}, - {"name":"nato.img","url":"nato-icon.js","evaluate":true} - ] - }, - { "id": "numerals", - "name": "Numerals Clock", - "shortName": "Numerals Clock", - "icon": "numerals.png", - "version":"0.09", - "description": "A simple big numerals clock", - "tags": "numerals,clock", - "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"} - ], - "data":[ - {"name":"numerals.json"} - ] - }, - { "id": "bledetect", - "name": "BLE Detector", - "shortName":"BLE Detector", - "icon": "bledetect.png", - "version":"0.03", - "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} - ] - }, - { "id": "snake", - "name": "Snake", - "shortName":"Snake", - "icon": "snake.png", - "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} - ] - }, - { "id": "calculator", - "name": "Calculator", - "shortName":"Calculator", - "icon": "calculator.png", - "version":"0.04", - "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", - "tags": "app,tool,b2", - "storage": [ - {"name":"calculator.app.js","url":"app.js"}, - {"name":"calculator.img","url":"calculator-icon.js","evaluate":true} - ] - }, - { - "id": "dane", - "name": "Digital Assistant, not EDITH", - "shortName": "DANE", - "icon": "app.png", - "version": "0.16", - "description": "A Watchface inspired by Tony Stark's EDITH and based on https://arwes.dev/", - "tags": "clock", - "type": "clock", - "allow_emulator": true, - "storage": [ - { - "name": "dane.app.js", - "url": "app.js" - }, - { - "name": "dane.img", - "url": "app-icon.js", - "evaluate": true - } - ] - }, - { "id": "dane_tcr", - "name": "DANE Touch Launcher", - "shortName":"DANE Toucher", - "icon": "app.png", - "version":"0.07", - "description": "Touch enable left to right launcher in the style of the DANE Watchface", - "tags": "tool,system,launcher", - "type":"launch", - "data": [ - {"name":"dane_tcr.json"} - ], - "storage": [ - {"name":"dane_tcr.app.js","url":"app.js"}, - {"name":"dane_tcr.settings.js","url":"settings.js"} - ], - "sortorder" : -10 - }, - { - "id": "buffgym", - "name": "BuffGym", - "icon": "buffgym.png", - "version":"0.02", - "description": "BuffGym is the famous 5x5 workout program for the BangleJS", - "tags": "tool,outdoors,gym,exercise", - "type": "app", - "interface": "buffgym.html", - "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} - ] - }, - { - "id": "banglerun", - "name": "BangleRun", - "shortName": "BangleRun", - "icon": "banglerun.png", - "version": "0.10", - "interface": "interface.html", - "description": "An app for running sessions. Displays info and logs your run for later viewing.", - "tags": "run,running,fitness,outdoors", - "allow_emulator": false, - "storage": [ - { - "name": "banglerun.app.js", - "url": "app.js" - }, - { - "name": "banglerun.img", - "url": "app-icon.js", - "evaluate": true - } - ] - }, - { - "id": "metronome", - "name": "Metronome", - "icon": "metronome_icon.png", - "version": "0.06", - "readme": "README.md", - "description": "Makes the watch blinking and vibrating with a given rate", - "tags": "tool", - "allow_emulator": true, - "storage": [ - { - "name": "metronome.app.js", - "url": "metronome.js" - }, - { - "name": "metronome.img", - "url": "metronome-icon.js", - "evaluate": true - }, - {"name":"metronome.settings.js","url":"settings.js"} - ] - }, - { "id": "blackjack", - "name": "Black Jack game", - "shortName":"Black Jack game", - "icon": "blackjack.png", - "version":"0.02", - "description": "Simple implementation of card game Black Jack", - "tags": "game", - "allow_emulator":true, - "storage": [ - {"name":"blackjack.app.js","url":"blackjack.app.js"}, - {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true} - ] - }, - { "id": "hidcam", - "name": "Camera shutter", - "shortName":"Cam shutter", - "icon": "app.png", - "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} - ] - }, - { "id": "swlclk", - "name": "SWL Clock / Short Wave Listner Clock", - "shortName": "SWL Clock", - "icon": "swlclk.png", - "version":"0.02", - "description": "Display Local, UTC time and some programs on the shorts waves along the day, with the frequencies", - "tags": "tool,clock", - "type":"clock", - "readme": "README.md", - "allow_emulator":true, - "storage": [ - {"name":"swlclk.app.js","url":"app.js"}, - {"name":"swlclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "rclock", - "name": "Round clock with seconds, minutes and date", - "shortName": "Round Clock", - "icon": "app.png", - "version": "0.06", - "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} - ] - }, - { - "id": "fclock", - "name": "fclock", - "shortName": "F Clock", - "icon": "app.png", - "version": "0.02", - "description": "Simple design of a digital clock", - "tags": "clock", - "type": "clock", - "storage": [ - {"name":"fclock.app.js","url":"fclock.app.js"}, - {"name":"fclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "hamloc", - "name": "QTH Locator / Maidenhead Locator System", - "shortName": "QTH Locator", - "icon": "app.png", - "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} - ] - }, - { "id": "osmpoi", - "name": "POI Compass", - "icon": "app.png", - "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} - ] - }, - { "id": "pong", - "name": "Pong", - "shortName": "Pong", - "icon": "pong.png", - "version": "0.03", - "description": "A clone of the Atari game Pong", - "tags": "game", - "type": "app", - "allow_emulator": true, - "readme": "README.md", - "storage": [ - {"name":"pong.app.js","url":"app.js"}, - {"name":"pong.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "ballmaze", - "name": "Ball Maze", - "icon": "icon.png", - "version": "0.02", - "description": "Navigate a ball through a maze by tilting your watch.", - "readme": "README.md", - "tags": "game", - "type": "app", - "storage": [ - {"name": "ballmaze.app.js","url":"app.js"}, - {"name": "ballmaze.img","url":"icon.js","evaluate": true} - ], - "data": [ - {"name": "ballmaze.json"} - ] - }, - { "id": "calendar", - "name": "Calendar", - "icon": "calendar.png", - "version": "0.02", - "description": "Simple calendar", - "tags": "calendar,b2", - "readme": "README.md", - "allow_emulator": true, - "storage": [ - { - "name": "calendar.app.js", - "url": "calendar.js" - }, - { - "name": "calendar.img", - "url": "calendar-icon.js", - "evaluate": true - } - ] - }, - { "id": "hidjoystick", - "name": "Bluetooth Joystick", - "shortName": "Joystick", - "icon": "app.png", - "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} - ] - }, - { - "id": "largeclock", - "name": "Large Clock", - "icon": "largeclock.png", - "version": "0.10", - "description": "A readable and informational digital watch, with date, seconds and moon phase", - "readme": "README.md", - "tags": "clock", - "type": "clock", - "allow_emulator": true, - "storage": [ - {"name": "largeclock.app.js", "url": "largeclock.js"}, - {"name": "largeclock.img", "url": "largeclock-icon.js", "evaluate": true}, - {"name": "largeclock.settings.js", "url": "settings.js"} - ], - "data": [ - {"name":"largeclock.json"} - ] - }, - { "id": "smtswch", - "name": "Smart Switch", - "shortName":"Smart Switch", - "icon": "app.png", - "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} - ] - }, - { "id": "miplant", - "name": "Xiaomi Plant Sensor", - "shortName":"Mi Plant", - "icon": "app.png", - "version":"0.02", - "description": "Reads and displays data from Xiaomi bluetooth plant moisture sensors", - "tags": "xiaomi,mi,plant,ble,bluetooth", - "storage": [ - {"name":"miplant.app.js","url":"app.js"}, - {"name":"miplant.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "simpletimer", - "name": "Timer", - "icon": "app.png", - "version": "0.07", - "description": "Simple timer, useful when playing board games or cooking", - "tags": "timer", - "readme": "README.md", - "allow_emulator": true, - "storage": [ - { - "name": "simpletimer.app.js", - "url": "app.js" - }, - { - "name": ".tfnames", - "url": "gesture-tfnames.js", - "evaluate": true - }, - { - "name": ".tfmodel", - "url": "gesture-tfmodel.js", - "evaluate": true - }, - { - "name": "simpletimer.img", - "url": "app-icon.js", - "evaluate": true - } - ], - "data": [ - { - "name": "simpletimer.json" - } - ] - }, - { - "id": "beebclock", - "name": "Beeb Clock", - "icon": "beebclock.png", - "version":"0.05", - "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} - ] - }, - { "id": "findphone", - "name": "Find Phone", - "shortName":"Find Phone", - "icon": "app.png", - "version":"0.03", - "description": "Find your phone via Gadgetbridge. Click any button to let your phone ring. 📳 Note: The functionality is available even without this app, just go to Settings, App Settings, Gadgetbridge, Find Phone.", - "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} - ] - }, - { "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} - ] - }, - { - "id": "gallifr", - "name": "Time Traveller's Chronometer", - "shortName": "Time Travel Clock", - "icon": "gallifr.png", - "version": "0.02", - "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,b2", - "readme": "README.md", - "type": "clock", - "allow_emulator":true, - "storage": [ - { "name": "gallifr.app.js", "url": "app.js" }, - { "name": "gallifr.img", "url": "app-icon.js", "evaluate": true }, - { "name": "gallifr.settings.js", "url": "settings.js" } - ], - "data": [ - {"name":"gallifr.json"} - ] - }, - { "id": "rndmclk", - "name": "Random Clock Loader", - "icon": "rndmclk.png", - "version":"0.03", - "description": "Load a different clock whenever the LCD is switched on.", - "readme": "README.md", - "tags": "widget,clock", - "type":"widget", - "storage": [ - {"name":"rndmclk.wid.js","url":"widget.js"} - ] - }, - { "id": "dotmatrixclock", - "name": "Dotmatrix Clock", - "icon": "dotmatrixclock.png", - "version":"0.01", - "description": "A clear white-on-blue dotmatrix simulated clock", - "tags": "clock,dotmatrix,retro", - "type": "clock", - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"dotmatrixclock.app.js","url":"app.js"}, - {"name":"dotmatrixclock.img","url":"dotmatrixclock-icon.js","evaluate":true} - ] - }, - { - "id": "jbm8b", - "name": "Magic 8 Ball", - "shortName": "Magic 8 Ball", - "icon": "app.png", - "description": "A simple fortune telling app", - "tags": "game", - "version": "0.03", - "storage": [ - { "name": "jbm8b.app.js", "url": "app.js" }, - { "name": "jbm8b.img", "url": "app-icon.js", "evaluate": true } - ] - }, - { - "id": "jbm8b_IT", - "name": "Magic 8 Ball Italiano", - "shortName": "Magic 8 Ball IT", - "icon": "app.png", - "description": "La palla predice il futuro", - "tags": "game", - "version": "0.01", - "allow_emulator":true, - "storage": [ - { "name": "jbm8b_IT.app.js", "url": "app.js" }, - { "name": "jbm8b_IT.img", "url": "app-icon.js", "evaluate": true } - ] - }, - { "id": "BLEcontroller", - "name": "BLE Customisable Controller with Joystick", - "shortName": "BLE Controller", - "icon": "BLEcontroller.png", - "version": "0.01", - "description": "A configurable controller for BLE devices and robots, with a basic four direction joystick. Designed to be easy to customise so you can add your own menus.", - "tags": "tool,bluetooth", - "readme": "README.md", - "allow_emulator":false, - "storage": [ - { "name": "BLEcontroller.app.js", "url": "app.js" }, - { "name": "BLEcontroller.img", "url": "app-icon.js", "evaluate": true } - ] - }, - { "id": "widviz", - "name": "Widget Visibility Widget", - "shortName":"Viz Widget", - "icon": "eye.png", - "version":"0.02", - "description": "Swipe left to hide top bar widgets, swipe right to redisplay.", - "tags": "widget", - "type": "widget", - "storage": [ - {"name":"widviz.wid.js","url":"widget.js"} - ] - }, - { "id": "binclock", - "name": "Binary Clock", - "shortName":"Binary Clock", - "icon": "app.png", - "version":"0.03", - "description": "A binary clock with hours and minutes. BTN1 toggles a digital clock.", - "tags": "clock,binary", - "type": "clock", - "storage": [ - {"name":"binclock.app.js","url":"app.js"}, - {"name":"binclock.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "pizzatimer", - "name": "Pizza Timer", - "shortName":"Pizza Timer", - "icon": "pizza.png", - "version":"0.01", - "description": "A timer app for when you cook Pizza. Some say it can also time other things", - "tags": "timer,tool,pizza", - "readme": "README.md", - "storage": [ - {"name":"pizzatimer.app.js","url":"app.js"}, - {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "animclk", - "name": "Animated Clock", - "shortName":"Anim Clock", - "icon": "app.png", - "version":"0.03", - "description": "An animated clock face using Mark Ferrari's amazing 8 bit game art and palette cycling: http://www.markferrari.com/art/8bit-game-art", - "tags": "clock,animated,bno2", - "type": "clock", - "storage": [ - {"name":"animclk.app.js","url":"app.js"}, - {"name":"animclk.pixels1","url":"animclk.pixels1"}, - {"name":"animclk.pixels2","url":"animclk.pixels2"}, - {"name":"animclk.pal","url":"animclk.pal"}, - {"name":"animclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "analogimgclk", - "name": "Analog Clock (Image background)", - "shortName":"Analog Clock", - "icon": "app.png", - "version":"0.03", - "description": "An analog clock with an image background", - "tags": "clock,bno2", - "type": "clock", - "storage": [ - {"name":"analogimgclk.app.js","url":"app.js"}, - {"name":"analogimgclk.bg.img","url":"bg.img"}, - {"name":"analogimgclk.img","url":"app-icon.js","evaluate":true} - ] - }, - { - "id": "verticalface", - "name": "Vertical watch face", - "shortName":"Vertical Face", - "icon": "app.png", - "version":"0.09", - "description": "A simple vertical watch face with the date. Heart rate monitor is toggled with BTN1", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"verticalface.app.js","url":"app.js"}, - {"name":"verticalface.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "sleepphasealarm", - "name": "SleepPhaseAlarm", - "shortName":"SleepPhaseAlarm", - "icon": "app.png", - "version":"0.02", - "description": "Uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments (ESS, see https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en). This app will read the next alarm from the alarm application and will wake you up to 30 minutes early at the best guessed time when you are almost already awake.", - "tags": "alarm", - "storage": [ - {"name":"sleepphasealarm.app.js","url":"app.js"}, - {"name":"sleepphasealarm.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "life", - "name": "Game of Life", - "icon": "life.png", - "version":"0.04", - "description": "Conway's Game of Life - 16x16 board", - "tags": "game", - "allow_emulator":true, - "storage": [ - {"name":"life.app.js","url":"life.min.js"}, - {"name":"life.img","url":"life-icon.js","evaluate":true} - ] - }, - { "id": "magnav", - "name": "Navigation Compass", - "icon": "magnav.png", - "version":"0.04", - "description": "Compass with linear display as for GPSNAV. Has Tilt compensation and remembers calibration.", - "readme": "README.md", - "tags": "tool,outdoors", - "storage": [ - {"name":"magnav.app.js","url":"magnav.min.js"}, - {"name":"magnav.img","url":"magnav-icon.js","evaluate":true} - ], - "data":[{"name":"magnav.json"}] - }, - { "id": "gpspoilog", - "name": "GPS POI Logger", - "shortName":"GPS POI Log", - "icon": "app.png", - "version":"0.01", - "description": "A simple app to log points of interest with their GPS coordinates and read them back onto your PC. Based on the https://www.espruino.com/Bangle.js+Storage tutorial", - "tags": "outdoors", - "interface": "interface.html", - "storage": [ - {"name":"gpspoilog.app.js","url":"app.js"}, - {"name":"gpspoilog.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "miclock2", - "name": "Mixed Clock 2", - "icon": "clock-mixed.png", - "version":"0.01", - "description": "White color variant of the Mixed Clock with thicker clock hands for better readability in the bright sunlight, extra space under the clock for widgets and seconds in the digital clock.", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"miclock2.app.js","url":"clock-mixed.js"}, - {"name":"miclock2.img","url":"clock-mixed-icon.js","evaluate":true} - ] - }, - { "id": "1button", - "name": "One-Button-Tracker", - "icon": "widget.png", - "version":"0.01", - "interface": "interface.html", - "description": "A widget that turns BTN1 into a tracker, records time of button press/release.", - "tags": "tool,quantifiedself,widget", - "type": "widget", - "readme": "README.md", - "storage": [ - {"name":"1button.wid.js","url":"widget.js"} - ], - "data": [ - {"name":"one_button_presses.csv","storageFile": true} - ] - }, - { "id": "gpsautotime", - "name": "GPS auto time", - "shortName":"GPS auto time", - "icon": "widget.png", - "version":"0.01", - "description": "A widget that automatically updates the Bangle.js time to the GPS time whenever there is a valid GPS fix.", - "tags": "widget,gps", - "type": "widget", - "storage": [ - {"name":"gpsautotime.wid.js","url":"widget.js"} - ] - }, - { "id": "espruinoctrl", - "name": "Espruino Control", - "shortName":"Espruino Ctrl", - "icon": "app.png", - "version":"0.01", - "description": "Send commands to other Espruino devices via the Bluetooth UART interface. Customisable commands!", - "tags": "", - "readme": "README.md", - "custom": "custom.html", - "storage": [ - {"name":"espruinoctrl.app.js"}, - {"name":"espruinoctrl.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "multiclock", - "name": "Multi Clock", - "icon": "multiclock.png", - "version":"0.13", - "description": "Clock with multiple faces - Big, Analogue, Digital, Text, Time-Date.\n Switch between faces with BTN1 & BTN3", - "readme": "README.md", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"multiclock.app.js","url":"clock.js"}, - {"name":"big.face.js","url":"big.js"}, - {"name":"ana.face.js","url":"ana.js"}, - {"name":"digi.face.js","url":"digi.js"}, - {"name":"txt.face.js","url":"txt.js"}, - {"name":"timdat.face.js","url":"timdat.js"}, - {"name":"ped.face.js","url":"ped.js"}, - {"name":"multiclock.img","url":"multiclock-icon.js","evaluate":true} - ] - }, - { "id": "widancs", - "name": "Apple Notification Widget", - "shortName":"ANCS Widget", - "icon": "widget.png", - "version":"0.07", - "description": "Displays call, message etc notifications from a paired iPhone. Read README before installation as it only works with compatible apps", - "readme": "README.md", - "tags": "widget", - "type": "widget", - "storage": [ - {"name":"widancs.wid.js","url":"ancs.min.js"}, - {"name":"widancs.settings.js","url":"settings.js"} - ] - }, - { "id": "accelrec", - "name": "Acceleration Recorder", - "shortName":"Accel Rec", - "icon": "app.png", - "version":"0.02", - "interface": "interface.html", - "description": "This app puts the Bangle's accelerometer into 100Hz mode and reads 2 seconds worth of data after movement starts. The data can then be exported back to the PC.", - "tags": "", - "readme": "README.md", - "storage": [ - {"name":"accelrec.app.js","url":"app.js"}, - {"name":"accelrec.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"wildcard":"accelrec.?.csv" } - ] - }, - { "id": "accellog", - "name": "Acceleration Logger", - "shortName":"Accel Log", - "icon": "app.png", - "version":"0.02", - "interface": "interface.html", - "description": "Logs XYZ acceleration data to a CSV file that can be downloaded to your PC", - "tags": "outdoor,b2", - "readme": "README.md", - "storage": [ - {"name":"accellog.app.js","url":"app.js"}, - {"name":"accellog.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"wildcard":"accellog.?.csv" } - ] - }, - { - "id": "cprassist", - "name":"CPR Assist", - "icon":"cprassist-icon.png", - "version": "0.01", - "readme": "README.md", - "description": "Provides assistance while performing a CPR", - "tags": "tool,firstaid", - "allow_emulator": true, - "storage": [ - { - "name": "cprassist.app.js", - "url": "cprassist.js" - }, - { - "name": "cprassist.img", - "url": "cprassist-icon.js", - "evaluate": true - }, - { - "name": "cprassist.settings.js", - "url": "settings.js" - } - ] - }, - { "id": "osgridref", - "name": "Ordnance Survey Grid Reference", - "shortName":"OS Grid ref", - "icon": "app.png", - "version":"0.01", - "description": "Displays the UK Ordnance Survey grid reference of your current GPS location. Useful when in the United Kingdom with an Ordnance Survey map", - "tags": "outdoors,gps", - "storage": [ - {"name":"osgridref.app.js","url":"app.js"}, - {"name":"osgridref.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "openseizure", - "name": "OpenSeizureDetector Widget", - "shortName":"Short Name", - "icon": "widget.png", - "version":"0.01", - "description": "[BETA!] A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/)", - "tags": "widget", - "type": "widget", - "readme": "README.md", - "storage": [ - {"name":"openseizure.wid.js","url":"widget.js"} - ] - }, - {"id": "counter", - "name": "Counter", - "icon": "counter_icon.png", - "version": "0.03", - "description": "Simple counter", - "tags": "tool", - "allow_emulator": true, - "storage": [ - {"name": "counter.app.js", "url": "counter.js"}, - {"name": "counter.img", "url": "counter-icon.js", "evaluate": true} - ] - }, - { "id": "bootgattbat", - "name": "BLE GATT Battery Service", - "shortName":"BLE Battery Service", - "icon": "bluetooth.png", - "version":"0.01", - "description": "Adds the GATT Battery Service to advertise the percentage of battery currently remaining over Bluetooth.\n", - "tags": "battery,ble,bluetooth,gatt", - "type": "bootloader", - "readme": "README.md", - "storage": [ - {"name":"gattbat.boot.js","url":"boot.js"} - ] - }, - { "id": "viewstl", - "name": "STL file viewer", - "shortName":"ViewSTL", - "icon": "icons8-octahedron-48.png", - "version":"0.02", - "description": "This app allows you to view STL 3D models on your watch", - "tags": "tool", - "readme": "README.md", - "storage": [ - {"name":"viewstl.app.js","url":"viewstl.min.js"}, - {"name":"viewstl.img","url":"viewstl-icon.js","evaluate":true}, - {"name":"tetra.stl","url":"tetra.stl"}, - {"name":"cube.stl","url":"cube.stl"}, - {"name":"icosa.stl","url":"icosa.stl"} - ] - }, - { "id": "cscsensor", - "name": "Cycling speed sensor", - "shortName":"CSCSensor", - "icon": "icons8-cycling-48.png", - "version":"0.05", - "description": "Read BLE enabled cycling speed and cadence sensor and display readings on watch", - "tags": "outdoors,exercise,ble,bluetooth", - "readme": "README.md", - "storage": [ - {"name":"cscsensor.app.js","url":"cscsensor.app.js"}, - {"name":"cscsensor.settings.js","url":"settings.js"}, - {"name":"cscsensor.img","url":"cscsensor-icon.js","evaluate":true} - ] - }, - { "id": "fileman", - "name": "File manager", - "shortName":"FileManager", - "icon": "icons8-filing-cabinet-48.png", - "version":"0.03", - "description": "Simple file manager, allows user to examine watch storage and display, load or delete individual files", - "tags": "tools", - "readme": "README.md", - "storage": [ - {"name":"fileman.app.js","url":"fileman.app.js"}, - {"name":"fileman.img","url":"fileman-icon.js","evaluate":true} - ] - }, - { "id": "worldclock", - "name": "World Clock - 4 time zones", - "shortName":"World Clock", - "icon": "app.png", - "version":"0.04", - "description": "Current time zone plus up to four others", - "tags": "clock", - "type" : "clock", - "custom": "custom.html", - "readme": "README.md", - "storage": [ - {"name":"worldclock.app.js","url":"app.js"}, - {"name":"worldclock.img","url":"worldclock-icon.js","evaluate":true} - ], - "data": [ - {"name":"worldclock.settings.json"} - ] - }, -{ "id": "digiclock", - "name": "Digital Clock Face", - "shortName":"Digi Clock", - "icon": "digiclock.png", - "version":"0.02", - "description": "A simple digital clock with the time, day, month, and year", - "tags": "clock,bno2", - "type" : "clock", - "storage": [ - {"name":"digiclock.app.js","url":"digiclock.js"}, - {"name":"digiclock.img","url":"digiclock-icon.js","evaluate":true} - ] -}, - { "id": "dsdrelay", - "name": "DSD BLE Relay controller", - "shortName":"DSDRelay", - "icon": "icons8-relay-48.png", - "version":"0.01", - "description": "Control BLE relay board from the watch", - "tags": "ble,bluetooth", - "readme": "README.md", - "storage": [ - {"name":"dsdrelay.app.js","url":"dsdrelay.app.js"}, - {"name":"dsdrelay.img","url":"dsdrelay-icon.js","evaluate":true} - ] - }, - { "id": "mandel", - "name": "Mandelbrot", - "shortName":"Mandel", - "icon": "mandel.png", - "version":"0.01", - "description": "Draw a zoomable Mandelbrot set", - "tags": "game", - "readme": "README.md", - "storage": [ - {"name":"mandel.app.js","url":"mandel.min.js"}, - {"name":"mandel.img","url":"mandel-icon.js","evaluate":true} - ] - }, - { - "id": "petrock", - "name": "Pet rock", - "icon": "petrock.png", - "version": "0.02", - "description": "A virtual pet rock with wobbly eyes", - "tags": "game", - "type": "app", - "storage": [ - {"name": "petrock.app.js", "url": "app.js"}, - {"name": "petrock.img", "url": "app-icon.js", "evaluate": true} - ] - }, - { "id": "smartibot", - "name": "Smartibot controller", - "shortName":"Smartibot", - "icon": "app.png", - "version":"0.01", - "description": "Control a [Smartibot Robot](https://thecraftyrobot.net/) straight from your Bangle.js", - "tags": "", - "storage": [ - {"name":"smartibot.app.js","url":"app.js"}, - {"name":"smartibot.img","url":"app-icon.js","evaluate":true} - ] - }, - { "id": "widncr", - "name": "NCR Logo Widget", - "icon": "widget.png", - "version":"0.01", - "description": "Show the NodeConf Remote logo in the top left", - "tags": "widget", - "type":"widget", - "storage": [ - {"name":"widncr.wid.js","url":"widget.js"} - ] - }, - { "id": "ncrclk", - "name": "NCR Clock", - "shortName":"NCR Clock", - "icon": "app.png", - "version":"0.02", - "description": "NodeConf Remote clock", - "tags": "clock", - "type": "clock", - "storage": [ - {"name":"ncrclk.app.js","url":"app.js"}, - {"name":"ncrclk.img","url":"app-icon.js","evaluate":true} - ] - }, -{ "id": "isoclock", - "name": "ISO Compliant Clock Face", - "shortName":"ISO Clock", - "icon": "isoclock.png", - "version":"0.02", - "description": "Tweaked fork of digiclock for ISO date and time", - "tags": "clock", - "type" : "clock", - "storage": [ - {"name":"isoclock.app.js","url":"isoclock.js"}, - {"name":"isoclock.img","url":"isoclock-icon.js","evaluate":true} - ] -}, -{ "id": "gpstimeserver", - "name": "GPS Time Server", - "icon": "widget.png", - "version":"0.01", - "description": "A widget which automatically starts the GPS and turns Bangle.js into a Bluetooth time server.", - "tags": "widget", - "type": "widget", - "readme": "README.md", - "storage": [ - {"name":"gpstimeserver.wid.js","url":"widget.js"} - ] -}, -{ "id": "tilthydro", - "name": "Tilt Hydrometer Display", - "shortName":"Tilt Hydro", - "icon": "app.png", - "version":"0.01", - "description": "A display for the [Tilt Hydrometer](https://tilthydrometer.com/) - [more info here](http://www.espruino.com/Tilt+Hydrometer+Display)", - "tags": "tools,bluetooth", - "storage": [ - {"name":"tilthydro.app.js","url":"app.js"}, - {"name":"tilthydro.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "supmariodark", - "name": "Super mario clock night mode", - "shortName":"supmariodark", - "icon": "supmariodark.png", - "version":"0.01", - "description": "Super mario clock in night mode", - "tags": "clock", - "type" : "clock", - "storage": [ - {"name":"supmariodark.app.js","url":"supmariodark.js"}, - {"name":"supmariodark.img","url":"supmariodark-icon.js","evaluate":true}, - {"name":"supmario30x24.bin","url":"supmario30x24.bin.js"}, - {"name":"supmario30x24.wdt","url":"supmario30x24.wdt.js"}, - {"name":"banner-up.img","url":"banner-up.js","evaluate":true}, - {"name":"banner-down.img","url":"banner-down.js","evaluate":true}, - {"name":"brick2.img","url":"brick2.js","evaluate":true}, - {"name":"enemy.img","url":"enemy.js","evaluate":true}, - {"name":"flower.img","url":"flower.js","evaluate":true}, - {"name":"flower_b.img","url":"flower_b.js","evaluate":true}, - {"name":"mario_wh.img","url":"mario_wh.js","evaluate":true}, - {"name":"pipe.img","url":"pipe.js","evaluate":true} - ] -}, -{ "id": "gmeter", - "name": "G-Meter", - "shortName":"G-Meter", - "icon": "app.png", - "version":"0.01", - "description": "Simple G-Meter", - "tags": "", - "storage": [ - {"name":"gmeter.app.js","url":"app.js"}, - {"name":"gmeter.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "dtlaunch", - "name": "Desktop Launcher", - "icon": "icon.png", - "version":"0.04", - "description": "Desktop style App Launcher with six apps per page - fast access if you have lots of apps installed.", - "readme": "README.md", - "tags": "tool,system,launcher", - "type":"launch", - "storage": [ - {"name":"dtlaunch.app.js","url":"app.js"}, - {"name":"dtlaunch.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "HRV", - "name": "Heart Rate Variability monitor", - "shortName":"HRV monitor", - "icon": "hrv.png", - "version":"0.04", - "description": "Heart Rate Variability monitor, see Readme for more info", - "tags": "", - "readme": "README.md", - "storage": [ - {"name":"HRV.app.js","url":"app.js"}, - {"name":"HRV.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "hardalarm", - "name": "Hard Alarm", - "shortName":"HardAlarm", - "icon": "app.png", - "version":"0.02", - "description": "Make sure you wake up! Count to the right number to turn off the alarm", - "tags": "tool,alarm,widget", - "storage": [ - {"name":"hardalarm.app.js","url":"app.js"}, - {"name":"hardalarm.boot.js","url":"boot.js"}, - {"name":"hardalarm.js","url":"hardalarm.js"}, - {"name":"hardalarm.img","url":"app-icon.js","evaluate":true}, - {"name":"hardalarm.wid.js","url":"widget.js"} - ], - "data": [ - {"name":"hardalarm.json"} - ] -}, -{ "id": "edisonsball", - "name": "Edison's Ball", - "shortName":"Edison's Ball", - "icon": "app-icon.png", - "version":"0.01", - "description": "Hypnagogia/Micro-Sleep alarm for experimental use in exploring sleep transition and combating drowsiness", - "tags": "", - "readme": "README.md", - "storage": [ - {"name":"edisonsball.app.js","url":"app.js"}, - {"name":"edisonsball.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "hrrawexp", - "name": "HRM Data Exporter", - "shortName":"HRM Data Exporter", - "icon": "app-icon.png", - "version":"0.01", - "description": "export raw hrm signal data to a csv file", - "tags": "", - "readme": "README.md", - "interface": "interface.html", - "storage": [ - {"name":"hrrawexp.app.js","url":"app.js"}, - {"name":"hrrawexp.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "breath", - "name": "Breathing App", - "shortName":"Breathing App", - "icon": "app-icon.png", - "version":"0.01", - "description": "app to aid relaxation and train breath syncronicity using haptics and visualisation, also displays HR", - "tags": "tools,health", - "readme": "README.md", - "storage": [ - {"name":"breath.app.js","url":"app.js"}, - {"name":"breath.img","url":"app-icon.js","evaluate":true} - ], - "data": [ - {"name":"breath.settings.json","url":"settings.json"} - ] -}, -{ "id": "lazyclock", - "name": "Lazy Clock", - "icon": "lazyclock.png", - "version":"0.03", - "readme": "README.md", - "description": "Tells the time, roughly", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"lazyclock.app.js","url":"lazyclock-app.js"}, - {"name":"lazyclock.img","url":"lazyclock-icon.js","evaluate":true} - ] -}, -{ "id": "astral", - "name": "Astral Clock", - "icon": "app-icon.png", - "version":"0.03", - "readme": "README.md", - "description": "Clock that calculates and displays Alt Az positions of all planets, Sun as well as several other astronomy targets (customizable) and current Moon phase. Coordinates are calculated by GPS & time and onscreen compass assists orienting. See Readme before using.", - "tags": "clock", - "type":"clock", - "storage": [ - {"name":"astral.app.js","url":"app.js"}, - {"name":"astral.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "alpinenav", - "name": "Alpine Nav", - "icon": "app-icon.png", - "version":"0.01", - "readme": "README.md", - "description": "App that performs GPS monitoring to track and display position relative to a given origin in realtime", - "tags": "outdoors,gps", - "storage": [ - {"name":"alpinenav.app.js","url":"app.js"}, - {"name":"alpinenav.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "lifeclk", - "name": "Game of Life Clock", - "shortName":"Conway's Clock", - "icon": "app.png", - "version":"0.06", - "description": "Modification and clockification of Conway's Game of Life", - "tags": "clock", - "type" : "clock", - "readme": "README.md", - "storage": [ - {"name":"lifeclk.app.js","url":"app.min.js"}, - {"name":"lifeclk.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "speedalt", - "name": "GPS Adventure Sports", - "shortName":"GPS Adv Sport", - "icon": "app.png", - "version":"1.02", - "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", - "tags": "tool,outdoors", - "type":"app", - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"speedalt.app.js","url":"app.js"}, - {"name":"speedalt.img","url":"app-icon.js","evaluate":true}, - {"name":"speedalt.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"speedalt.json"} - ] -}, -{ "id": "de-stress", - "name": "De-Stress", - "shortName":"De-Stress", - "icon": "app.png", - "version":"0.02", - "description": "Simple haptic heartbeat", - "storage": [ - {"name":"de-stress.app.js","url":"app.js"}, - {"name":"de-stress.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "mclockplus", - "name": "Morph Clock+", - "shortName":"Morph Clock+", - "icon": "mclockplus.png", - "version":"0.02", - "description": "Morphing Clock with more readable seconds and date and additional stopwatch", - "tags": "clock", - "type": "clock", - "readme": "README.md", - "storage": [ - {"name":"mclockplus.app.js","url":"mclockplus.app.js"}, - {"name":"mclockplus.img","url":"mclockplus-icon.js","evaluate":true} - ] -}, -{ "id": "intervals", - "name": "Intervals App", - "shortName":"Intervals", - "icon": "intervals.png", - "version":"0.01", - "description": "Intervals for training. It is possible to configure work time and rest time and number of sets.", - "tags": "", - "storage": [ - {"name":"intervals.app.js","url":"intervals.app.js"}, - {"name":"intervals.img","url":"intervals-icon.js","evaluate":true} - ] -}, -{ "id": "planetarium", - "name": "Planetarium", - "shortName":"Planetarium", - "icon": "planetarium.png", - "readme": "README.md", - "version":"0.03", - "description": "Planetarium showing up to 500 stars using the watch location and time", - "tags": "", - "storage": [ - {"name":"planetarium.app.js","url":"planetarium.app.js"}, - {"name":"planetarium.data.csv","url":"planetarium.data.csv"}, - {"name":"planetarium.const.csv","url":"planetarium.const.csv"}, - {"name":"planetarium.extra.csv","url":"planetarium.extra.csv"}, - {"name":"planetarium.settings.js","url":"settings.js"}, - {"name":"planetarium.img","url":"planetarium-icon.js","evaluate":true} - ], - "data":[ - {"name":"planetarium.json"} - ] -}, -{ "id": "tapelauncher", - "name": "Tape Launcher", - "icon": "icon.png", - "version":"0.02", - "description": "An App launcher, icons displayed in a horizontal tape, swipe or use buttons", - "readme": "README.md", - "tags": "tool,system,launcher", - "type":"launch", - "storage": [ - {"name":"tapelauncher.app.js","url":"app.js"}, - {"name":"tapelauncher.img","url":"icon.js","evaluate":true} - ] -}, -{ "id": "oblique", - "name": "Oblique Strategies", - "icon": "eno.png", - "version": "0.01", - "description": "Oblique Strategies for creativity. Copied from Brian Eno.", - "tags": "tool", - "storage": [ - {"name":"oblique.app.js","url":"app.js"}, - {"name":"oblique.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "testuserinput", - "name": "Test User Input", - "shortName":"Test User Input", - "icon": "app.png", - "version":"0.06", - "description": "App to test the bangle.js input interface. It displays the user action in text, circle buttons or on/off switch UI elements.", - "readme": "README.md", - "tags": "input,interface,buttons,touch,UI", - "storage": [ - {"name":"testuserinput.app.js","url":"app.js"}, - {"name":"testuserinput.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "gpssetup", - "name": "GPS Setup", - "shortName":"GPS Setup", - "icon": "gpssetup.png", - "version":"0.02", - "description": "Configure the GPS power options and store them in the GPS nvram", - "tags": "gps,tools,outdoors,bno2", - "readme": "README.md", - "storage": [ - {"name":"gpssetup","url":"gpssetup.js"}, - {"name":"gpssetup.settings.js","url":"settings.js"}, - {"name":"gpssetup.app.js","url":"app.js"}, - {"name":"gpssetup.img","url":"icon.js","evaluate":true} - ], - "data": [ - {"name":"gpssetup.settings.json","url":"settings.json"} - ] -}, -{ "id": "walkersclock", - "name": "Walkers Clock", - "shortName":"Walkers Clock", - "icon": "walkersclock48.png", - "version":"0.04", - "description": "A large font watch, displays steps, can switch GPS on/off, displays grid reference", - "type":"clock", - "tags": "clock, gps, tools, outdoors", - "readme": "README.md", - "storage": [ - {"name":"walkersclock.app.js","url":"app.js"}, - {"name":"walkersclock.img","url":"icon.js","evaluate":true} - ] -}, -{ "id": "widgps", - "name": "GPS Widget", - "icon": "widget.png", - "version":"0.02", - "description": "Tiny widget to show the power on/off status of the GPS. Require firmware v2.08.167 or later", - "tags": "widget,gps", - "type":"widget", - "readme": "README.md", - "storage": [ - {"name":"widgps.wid.js","url":"widget.js"} - ] -}, -{ "id": "widhrt", - "name": "HRM Widget", - "icon": "widget.png", - "version":"0.02", - "description": "Tiny widget to show the power on/off status of the Heart Rate Monitor. Requires firmware v2.08.167 or later", - "tags": "widget, hrm", - "type":"widget", - "readme": "README.md", - "storage": [ - {"name":"widhrt.wid.js","url":"widget.js"} - ] -}, -{ "id": "countdowntimer", - "name" : "Countdown Timer", - "icon": "countdowntimer.png", - "version": "0.01", - "description": "A simple countdown timer with a focus on usability", - "tags": "timer, tool", - "readme": "README.md", - "storage": [ - {"name": "countdowntimer.app.js", "url": "countdowntimer.js"}, - {"name": "countdowntimer.img", "url": "countdowntimer-icon.js", "evaluate": true} - ] -}, -{ "id": "helloworld", - "name": "hello, world!", - "shortName":"hello world", - "icon": "app.png", - "version":"0.02", - "description": "A cross cultural hello world!/hola mundo! app with colors and languages", - "readme": "README.md", - "tags": "input,interface,buttons,touch", - "storage": [ - {"name":"helloworld.app.js","url":"app.js"}, - {"name":"helloworld.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "widcom", - "name": "Compass Widget", - "icon": "widget.png", - "version":"0.01", - "description": "Tiny widget to show the power on/off status of the Compass. Requires firmware v2.08.167 or later", - "tags": "widget, compass", - "type":"widget", - "readme": "README.md", - "storage": [ - {"name":"widcom.wid.js","url":"widget.js"} - ] -}, -{ "id": "arrow", - "name": "Arrow Compass", - "icon": "arrow.png", - "type":"app", - "version":"0.04", - "description": "Moving arrow compass that points North, shows heading, with tilt correction. Based on jeffmer's Navigation Compass", - "tags": "tool,outdoors", - "readme": "README.md", - "storage": [ - {"name":"arrow.app.js","url":"app.js"}, - {"name":"arrow.img","url":"icon.js","evaluate":true} - ] -}, -{ "id": "waypointer", - "name": "Way Pointer", - "icon": "waypointer.png", - "version":"0.01", - "description": "Navigate to a waypoint using the GPS for bearing and compass to point way, uses the same waypoint interface as GPS Navigation", - "tags": "tool,outdoors,gps", - "readme": "README.md", - "interface":"waypoints.html", - "storage": [ - {"name":"waypointer.app.js","url":"app.js"}, - {"name":"waypointer.img","url":"icon.js","evaluate":true} - ], - "data": [ - {"name":"waypoints.json","url":"waypoints.json"} - ] -}, -{ "id": "color_catalog", - "name": "Colors Catalog", - "shortName":"Colors Catalog", - "icon": "app.png", - "version":"0.01", - "description": "Displays RGB565 and RGB888 colors, its name and code in screen.", - "readme": "README.md", - "tags": "Color,input,buttons,touch,UI,bno2", - "storage": [ - {"name":"color_catalog.app.js","url":"app.js"}, - {"name":"color_catalog.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "UI4swatch", - "name": "UI 4 swatch", - "shortName":"UI 4 swatch", - "icon": "app.png", - "version":"0.01", - "description": "A UI/UX for espruino smartwatches, displays dinamically calc. x,y coordinates.", - "readme": "README.md", - "tags": "Color, input,buttons,touch,UI", - "storage": [ - {"name":"UI4swatch.app.js","url":"app.js"}, - {"name":"UI4swatch.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "simplest", - "name": "Simplest Clock", - "icon": "simplest.png", - "version":"0.02", - "description": "The simplest working clock, acts as a tutorial piece", - "tags": "clock", - "type":"clock", - "readme": "README.md", - "storage": [ - {"name":"simplest.app.js","url":"app.js"}, - {"name":"simplest.img","url":"icon.js","evaluate":true} - ] -}, -{ "id": "stepo", - "name": "Stepometer Clock", - "icon": "stepo.png", - "version":"0.03", - "description": "A large font watch, displays step count in a doughnut guage and warns of low battery, requires one of the steps widgets to be installed", - "tags": "clock", - "type":"clock", - "readme": "README.md", - "storage": [ - {"name":"stepo.app.js","url":"app.js"}, - {"name":"stepo.img","url":"icon.js","evaluate":true} - ] -}, -{ "id": "gbmusic", - "name": "Gadgetbridge Music Controls", - "shortName":"Music Controls", - "icon": "icon.png", - "version":"0.05", - "description": "Control the music on your Gadgetbridge-connected phone", - "tags": "tools,bluetooth,gadgetbridge,music", - "type":"app", - "allow_emulator": false, - "readme": "README.md", - "storage": [ - {"name":"gbmusic.app.js","url":"app.js"}, - {"name":"gbmusic.settings.js","url":"settings.js"}, - {"name":"gbmusic.wid.js","url":"widget.js"}, - {"name":"gbmusic.img","url":"icon.js","evaluate":true} - ], - "data": [ - {"name":"gbmusic.json"}, - {"name":"gbmusic.load.json"} - ] -}, -{ - "id": "battleship", - "name":"Battleship", - "icon":"battleship-icon.png", - "version": "0.01", - "readme": "README.md", - "description": "The classic game of battleship", - "tags": "game", - "allow_emulator": true, - "storage": [ - { - "name": "battleship.app.js", - "url": "battleship.js" - }, - { - "name": "battleship.img", - "url": "battleship-icon.js", - "evaluate": true - } - ] -}, -{ "id": "kitchen", - "name": "Kitchen Combo", - "icon": "kitchen.png", - "version":"0.13", - "description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'. Requires firmware v2.08.167 or later", - "tags": "tool,outdoors,gps", - "type":"clock", - "readme": "README.md", - "interface":"waypoints.html", - "storage": [ - {"name":"kitchen.app.js","url":"kitchen.app.js"}, - {"name":"stepo2.kit.js","url":"stepo2.kit.js"}, - {"name":"swatch.kit.js","url":"swatch.kit.js"}, - {"name":"gps.kit.js","url":"gps.kit.js"}, - {"name":"compass.kit.js","url":"compass.kit.js"}, - {"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true} - ], - "data": [ - {"name":"waypoints.json","url":"waypoints.json"} - ] -}, -{ "id": "banglebridge", - "name": "BangleBridge", - "shortName":"BangleBridge", - "icon": "widget.png", - "version":"0.01", - "description": "Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App", - "tags": "widget", - "type": "widget", - "readme": "README.md", - "storage": [ - {"name":"banglebridge.wid.js","url":"widget.js"}, - {"name":"banglebridge.watch.img","url":"watch.img"}, - {"name":"banglebridge.heart.img","url":"heart.img"} - ] - }, -{ "id": "qmsched", - "name": "Quiet Mode Schedule and Widget", - "shortName":"Quiet Mode", - "icon": "app.png", - "version":"0.02", - "description": "Automatically turn Quiet Mode on or off at set times", - "readme": "README.md", - "tags": "tool,widget", - "storage": [ - {"name":"qmsched","url":"lib.js"}, - {"name":"qmsched.app.js","url":"app.js"}, - {"name":"qmsched.boot.js","url":"boot.js"}, - {"name":"qmsched.img","url":"icon.js","evaluate":true}, - {"name":"qmsched.wid.js","url":"widget.js"} - ], - "data": [ - {"name":"qmsched.json"} - ] -}, -{ - "id": "hourstrike", - "name": "Hour Strike", - "shortName": "Hour Strike", - "icon": "app-icon.png", - "version": "0.08", - "description": "Strike the clock on the hour. A great tool to remind you an hour has passed!", - "tags": "tool,alarm", - "readme": "README.md", - "storage": [ - {"name":"hourstrike.app.js","url":"app.js"}, - {"name":"hourstrike.boot.js","url":"boot.js"}, - {"name":"hourstrike.img","url":"app-icon.js","evaluate":true}, - {"name":"hourstrike.json","url":"hourstrike.json"} - ] -}, -{ "id": "whereworld", - "name": "Where in the World?", - "shortName" : "Where World", - "icon": "app.png", - "version": "0.01", - "description": "Shows your current location on the world map", - "tags": "gps", - "storage": [ - {"name":"whereworld.app.js","url":"app.js"}, - {"name":"whereworld.img","url":"app-icon.js","evaluate":true}, - {"name":"whereworld.worldmap","url":"worldmap"} - ] -}, -{ - "id": "omnitrix", - "name":"Omnitrix", - "icon":"omnitrix.png", - "version": "0.01", - "readme": "README.md", - "description": "An Omnitrix Showpiece", - "tags": "game", - "storage": [ - {"name":"omnitrix.app.js","url":"omnitrix.app.js"}, - {"name":"omnitrix.img","url":"omnitrix.icon.js","evaluate":true} - ] -}, -{ "id": "batclock", - "name": "Bat Clock", - "shortName":"Bat Clock", - "icon": "bat-clock.png", - "version":"0.02", - "description": "Morphing Clock, with an awesome \"The Dark Knight\" themed logo.", - "tags": "clock", - "type": "clock", - "readme": "README.md", - "storage": [ - {"name":"batclock.app.js","url":"bat-clock.app.js"}, - {"name":"batclock.img","url":"bat-clock.icon.js","evaluate":true} - ] -}, -{ "id":"doztime", - "name":"Dozenal Time", - "shortName":"Dozenal Time", - "icon":"app.png", - "version":"0.04", - "description":"A dozenal Holocene calendar and dozenal diurnal clock", - "tags":"clock", - "type":"clock", - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"doztime.app.js","url":"app.js"}, - {"name":"doztime.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id":"gbtwist", - "name":"Gadgetbridge Twist Control", - "shortName":"Twist Control", - "icon":"app.png", - "version":"0.01", - "description":"Shake your wrist to control your music app via Gadgetbridge", - "tags":"tools,bluetooth,gadgetbridge,music", - "type":"app", - "allow_emulator":false, - "readme": "README.md", - "storage": [ - {"name":"gbtwist.app.js","url":"app.js"}, - {"name":"gbtwist.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "thermom", - "name": "Thermometer", - "icon": "app.png", - "version":"0.02", - "description": "Displays the current temperature, updated every 20 seconds", - "tags": "tool", - "allow_emulator":true, - "storage": [ - {"name":"thermom.app.js","url":"app.js"}, - {"name":"thermom.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "mysticdock", - "name": "Mystic Dock", - "icon": "mystic-dock.png", - "version":"1.00", - "description": "A retro-inspired dockface that displays the current time and battery charge while plugged in, and which features an interactive mode that shows the time, date, and a rotating data display line.", - "tags": "dock", - "type":"dock", - "readme": "README.md", - "storage": [ - {"name":"mysticdock.app.js","url":"mystic-dock-app.js"}, - {"name":"mysticdock.boot.js","url":"mystic-dock-boot.js"}, - {"name":"mysticdock.settings.js","url":"mystic-dock-settings.js"}, - {"name":"mysticdock.img","url":"mystic-dock-icon.js","evaluate":true} - ] -}, -{ "id": "mysticclock", - "name": "Mystic Clock", - "icon": "mystic-clock.png", - "version":"1.01", - "description": "A retro-inspired watchface featuring time, date, and an interactive data display line.", - "tags": "clock", - "type":"clock", - "readme": "README.md", - "allow_emulator":true, - "storage": [ - {"name":"mysticclock.app.js","url":"mystic-clock-app.js"}, - {"name":"mysticclock.settings.js","url":"mystic-clock-settings.js"}, - {"name":"mysticclock.img","url":"mystic-clock-icon.js","evaluate":true} - ] -}, -{ "id": "hcclock", - "name": "Hi-Contrast Clock", - "icon": "hcclock-icon.png", - "version":"0.01", - "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.", - "tags": "clock", - "type":"clock", - "allow_emulator":true, - "storage": [ - {"name":"hcclock.app.js","url":"hcclock.app.js"}, - {"name":"hcclock.img","url":"hcclock-icon.js","evaluate":true} - ] -}, -{ "id": "thermomF", - "name": "Fahrenheit Temp", - "icon": "thermf.png", - "version":"0.01", - "description": "A modification of the Thermometer App to display temprature in Fahrenheit", - "tags": "tool", - "storage": [ - {"name":"thermomF.app.js","url":"app.js"}, - {"name":"thermomF.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "nixie", - "name": "Nixie Clock", - "shortName":"Nixie", - "icon": "nixie.png", - "version":"0.01", - "description": "A nixie tube clock for both Bangle 1 and 2.", - "tags": "clock", - "type":"clock", - "readme": "README.md", - "storage": [ - {"name":"nixie.app.js","url":"app.js"}, - {"name":"nixie.img","url":"app-icon.js","evaluate":true}, - {"name":"m_vatch.js","url":"m_vatch.js"} - ] -}, -{ "id": "carcrazy", - "name": "Car Crazy", - "shortName":"Car Crazy", - "icon": "carcrash.png", - "version":"0.03", - "description": "A simple car game where you try to avoid the other cars by tilting your wrist left and right. Hold down button 2 to start.", - "tags": "game", - "readme": "README.md", - "storage": [ - {"name":"carcrazy.app.js","url":"app.js"}, - {"name":"carcrazy.img","url":"app-icon.js","evaluate":true}, - {"name":"carcrazy.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"app.json"} - ] -}, -{ "id": "shortcuts", - "name": "Shortcuts", - "shortName":"Shortcuts", - "icon": "app.png", - "version":"0.01", - "description": "Quickly load your favourite apps from (almost) any watch face.", - "tags": "tool", - "type": "bootloader", - "readme": "README.md", - "storage": [ - {"name":"shortcuts.boot.js","url":"boot.js"}, - {"name":"shortcuts.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"shortcuts.json"} - ] -}, -{ "id": "vectorclock", - "name": "Vector Clock", - "icon": "app.png", - "version": "0.02", - "description": "A digital clock that uses the built-in vector font.", - "tags": "clock", - "type": "clock", - "allow_emulator": true, - "storage": [ - {"name":"vectorclock.app.js","url":"app.js"}, - {"name":"vectorclock.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "fd6fdetect", - "name": "fd6fdetect", - "shortName":"fd6fdetect", - "icon": "app.png", - "version":"0.1", - "description": "Allows you to see 0xFD6F beacons near you.", - "tags": "tool", - "storage": [ - {"name":"fd6fdetect.app.js","url":"app.js"}, - {"name":"fd6fdetect.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "choozi", - "name": "Choozi", - "icon": "app.png", - "version":"0.01", - "description": "Choose people or things at random using Bangle.js.", - "tags": "tool", - "readme": "README.md", - "allow_emulator":true, - "storage": [ - {"name":"choozi.app.js","url":"app.js"}, - {"name":"choozi.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "widclkbttm", - "name": "Digital clock (Bottom) widget", - "shortName":"Digital clock Bottom Widget", - "icon": "widclkbttm.png", - "version":"0.03", - "description": "Displays time in the bottom area.", - "readme": "README.md", - "tags": "widget", - "type": "widget", - "storage": [ - {"name":"widclkbttm.wid.js","url":"widclkbttm.wid.js"} - ] -}, -{ "id": "pastel", - "name": "Pastel Clock", - "shortName": "Pastel", - "icon": "pastel.png", - "version":"0.03", - "description": "A Configurable clock with custom fonts and background", - "tags": "clock,b2", - "type":"clock", - "readme": "README.md", - "storage": [ - {"name":"pastel.app.js","url":"pastel.app.js"}, - {"name":"pastel.img","url":"pastel.icon.js","evaluate":true}, - {"name":"pastel.settings.js","url":"pastel.settings.js"} - ], - "data": [ - {"name":"pastel.json"} - ] -}, -{ "id": "antonclk", - "name": "Anton Clock", - "icon": "app.png", - "version":"0.01", - "description": "A simple clock using the bold Anton font.", - "tags":"clock,b2", - "type":"clock", - "storage": [ - {"name":"antonclk.app.js","url":"app.js"}, - {"name":"antonclk.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "waveclk", - "name": "Wave Clock", - "icon": "app.png", - "version":"0.01", - "description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: This requires a bugfix for #2049 on Bangle.js 1**", - "tags":"clock,b2", - "type":"clock", - "storage": [ - {"name":"waveclk.app.js","url":"app.js"}, - {"name":"waveclk.img","url":"app-icon.js","evaluate":true} - ] -}, -{ "id": "TheBinWatch", - "name": "Binary Watch", - "shortName":"BinWatch", - "icon": "app.png", - "version":"0.02", - "allow_emulator":true, - "description": "Famous binary watch", - "tags": "clock,b2", - "type": "clock", - "storage": [ - {"name":"TheBinWatch.app.js","url":"app.js"}, - {"name":"TheBininWatch.img","url":"app-icon.js","evaluate":true} - ] -} -]