From 902ea72ddedecf2abce4ea7c2111532108c2cdb5 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Mon, 4 Oct 2021 18:10:29 +0200 Subject: [PATCH 01/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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/81] 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 537842a32109bcc0ab69d5cd2474a87518bbcd41 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 16 Nov 2021 08:05:41 -0500 Subject: [PATCH 12/81] Added emojuino v0.01 --- apps.json | 15 ++++ apps/emojuino/ChangeLog | 1 + apps/emojuino/README.md | 23 ++++++ apps/emojuino/emojuino-icon.js | 1 + apps/emojuino/emojuino.js | 145 +++++++++++++++++++++++++++++++++ apps/emojuino/emojuino.png | Bin 0 -> 1966 bytes 6 files changed, 185 insertions(+) create mode 100644 apps/emojuino/ChangeLog create mode 100644 apps/emojuino/README.md create mode 100644 apps/emojuino/emojuino-icon.js create mode 100644 apps/emojuino/emojuino.js create mode 100644 apps/emojuino/emojuino.png diff --git a/apps.json b/apps.json index f307a6feb..a0d543cd8 100644 --- a/apps.json +++ b/apps.json @@ -4215,5 +4215,20 @@ { "name": "qalarm.wid.js", "url": "widget.js" } ], "data": [{ "name": "qalarm.json" }] + }, + { + "id": "emojuno", + "name": "Emoji Broadcaster", + "shortName": "Emojuino", + "version": "0.01", + "description": "Emojis & Espruino: advertise Unicode emojis via BLE", + "icon": "emojuino.png", + "tags": "emoji", + "supports" : [ "BANGLEJS2" ], + "readme": "README.md", + "storage": [ + { "name": "emojuno.app.js", "url": "emojuino.js" }, + { "name": "emojuno.img", "url": "emojuino-icon.js", "evaluate": true } + ] } ] diff --git a/apps/emojuino/ChangeLog b/apps/emojuino/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/emojuino/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/emojuino/README.md b/apps/emojuino/README.md new file mode 100644 index 000000000..13879437e --- /dev/null +++ b/apps/emojuino/README.md @@ -0,0 +1,23 @@ +# Emojuino + +Emojis & Espruino! + +## Usage + +Select an emoji and then tap to transmit! + +## Features + +Currently implements a tiny subset of possible Unicode emojis. + +## Controls + +Swipe left/right to select the emoji to broadcast. Tap the screen to initiate the broadcast. Emoji will flash while broadcasting. + +## Requests + +[Contact reelyActive](https://www.reelyactive.com/contact/) for support/updates. + +## Creator + +Developed by [jeffyactive](https://github.com/jeffyactive) of [reelyActive](https://www.reelyactive.com) diff --git a/apps/emojuino/emojuino-icon.js b/apps/emojuino/emojuino-icon.js new file mode 100644 index 000000000..d56749250 --- /dev/null +++ b/apps/emojuino/emojuino-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBiIAHkUoxGIwUiBxAAGiQVCAAeCkIWNCooADDBYWKDBYWEkc////+cyDBhxDCoQAD+YLDCw0YBQQVFAAYYCwIXFHQRDElGCJYgOCFw8vBwPyOgoJFGAg4BIoQWGDAhJCIwoLBHgYAGJQIjCIwguCnCRFRoeDGAZICAgOPFwaRGDAQfB/AwDBAYuCX44wDAgTrDBoIDBGYP/manBmYFBFYQPDwJeBD4iRGRoQ/FC4QqBEYIbERooTBCAeBNAIjBBQIDDAAggBG4IDDwQXBEQIDDUAgcCHASaBAYQTFMQpcFDYp+EEII9DAARRDFIIfDHIwXBVISlDC4YzD9wA0osFpwIF8lQqgWK8kAgEEBItABIIhGAAfgBoMABIoIChwX0jwED8oNBgoXFqAJBrwHD8IXEBwQNEEIYgFC4wAQ8MRC6sRC+BgULwIwHSINVpwuLC43kaAQABqgaHC4bZHAAkFqhGHGAovFAAYyDCwgwFL4IwGFxAwNFxIwG8lVCoSTEFw7bPCxAYNCxT0LIpIxMCpoyHFhI")) \ No newline at end of file diff --git a/apps/emojuino/emojuino.js b/apps/emojuino/emojuino.js new file mode 100644 index 000000000..3de92fa6c --- /dev/null +++ b/apps/emojuino/emojuino.js @@ -0,0 +1,145 @@ +/** + * Copyright reelyActive 2021 + * We believe in an open Internet of Things + */ + + +// Emojis are integer pairs with the form [ image, Unicode code point ] +// For code points see https://unicode.org/emoji/charts/emoji-list.html +const EMOJIS = [ + [ ':)', 0x1f642 ], // Slightly smiling + [ ':|', 0x1f610 ], // Neutral + [ ':(', 0x1f641 ], // Slightly frowning + [ '+1', 0x1f44d ], // Thumbs up + [ '-1', 0x1f44e ], // Thumbs down + [ '<3', 0x02764 ], // Heart +]; +const EMOJI_TRANSMISSION_MILLISECONDS = 5000; +const BLINK_PERIOD_MILLISECONDS = 500; +const TRANSMIT_BUZZ_MILLISECONDS = 200; +const CYCLE_BUZZ_MILLISECONDS = 50; + +// Non-user-configurable constants +const IMAGE_INDEX = 0; +const CODE_POINT_INDEX = 1; +const BTN_WATCH_OPTIONS = { repeat: true, debounce: 20, edge: "falling" }; +const UNICODE_CODE_POINT_ELIDED_UUID = [ 0x49, 0x6f, 0x49, 0x44, 0x55, + 0x54, 0x46, 0x2d, 0x33, 0x32 ]; + + +// Global variables +let emojiIndex = 0; +let isToggleOn = false; +let isTransmitting = false; +let lastDragX = 0; +let lastDragY = 0; + + +// Cycle through emojis +function cycleEmoji(isForward) { + if(isTransmitting) { return; } + + if(isForward) { + emojiIndex = (emojiIndex + 1) % EMOJIS.length; + } + else if(--emojiIndex < 0) { + emojiIndex = EMOJIS.length - 1; + } + + drawImage(EMOJIS[emojiIndex][IMAGE_INDEX]); + Bangle.buzz(CYCLE_BUZZ_MILLISECONDS); +} + + +// Handle a touch: transmit displayed emoji +function handleTouch(zone, event) { + if(isTransmitting) { return; } + + let emoji = EMOJIS[emojiIndex]; + transmitEmoji(emoji[IMAGE_INDEX], emoji[CODE_POINT_INDEX], + EMOJI_TRANSMISSION_MILLISECONDS); + Bangle.buzz(TRANSMIT_BUZZ_MILLISECONDS); +} + + +// Transmit the given code point for the given duration in milliseconds, +// blinking the image once per second. +function transmitEmoji(image, codePoint, duration) { + let instance = [ 0x00, 0x00, (codePoint >> 24) & 0xff, + (codePoint >> 16) & 0xff, (codePoint >> 8) & 0xff, + codePoint & 0xff ]; + + require('ble_eddystone_uid').advertise(UNICODE_CODE_POINT_ELIDED_UUID, + instance); + isTransmitting = true; + + let displayIntervalId = setInterval(toggleImage, BLINK_PERIOD_MILLISECONDS, + image); + + setTimeout(terminateEmoji, duration, displayIntervalId); +} + + +// Terminate the emoji transmission +function terminateEmoji(displayIntervalId) { + NRF.setAdvertising({ }); + isTransmitting = false; + clearInterval(displayIntervalId); + drawImage(EMOJIS[emojiIndex][IMAGE_INDEX]); +} + + +// Toggle the display between image/off +function toggleImage(image) { + if(isToggleOn) { + drawImage(EMOJIS[emojiIndex][IMAGE_INDEX]); + } + else { + g.clear(); + } + isToggleOn = !isToggleOn; +} + + +// Draw the given emoji +function drawImage(image) { + g.clear(); + g.drawString(image, g.getWidth() / 2, g.getHeight() / 2); + g.flip(); +} + + +// Handle a drag event +function handleDrag(event) { + let isFingerReleased = (event.b === 0); + + if(isFingerReleased) { + let isHorizontalDrag = (Math.abs(lastDragX) >= Math.abs(lastDragY)) && + (lastDragX !== 0); + + if(isHorizontalDrag) { + cycleEmoji(lastDragX > 0); + } + } + else { + lastDragX = event.dx; + lastDragY = event.dy; + } +} + + +// Special function to handle display switch on +Bangle.on('lcdPower', (on) => { + if(on) { + drawImage(EMOJIS[emojiIndex][IMAGE_INDEX]); + } +}); + + +// On start: display the first emoji and handle drag and touch events +g.clear(); +g.setFont('Vector', 80); +g.setFontAlign(0, 0); +drawImage(EMOJIS[emojiIndex][IMAGE_INDEX]); +Bangle.on('touch', handleTouch); +Bangle.on('drag', handleDrag); diff --git a/apps/emojuino/emojuino.png b/apps/emojuino/emojuino.png new file mode 100644 index 0000000000000000000000000000000000000000..614cc025ea17ad4bb68c1530e7d6b62022c908fd GIT binary patch literal 1966 zcmV;f2T}NmP)LJKHJpZ9o4v%hLat-R-v2z)RjTneY4Fdow%p&un4r31H@y zrNicKUz;%@IsV@vQ7PsAVX4*rp{e9G-Din61uZJhvzO?@M=O-}>hp74uh7s#me>E^N;h`F)z8tX1 za(~$Bm19-ECx)I88+!Kp-kPr(KWX-fh|TL564_1luRBJjHR``SHo<#lyk_R0_sj(P zV9kCC%{Wb4PG6%7w;s^dyM_ZJb=*5hxQ=@04zDw6{g0~vSGX%u6>ai#; zM>TM8P}E*ZIh9KVWfkNpFoW5_Ttn4$@Xhd;OUR(csujGZ#C7gC-&&}Of*-EkPp7Wu ztC{MIlUxg$st?#9IPM{`sQFx?*^EscI|RoUsba5wmrk2cUse4LlvLPg?_dAWj4dbV z<8=qCBCL^jYjL)G{zpGj_%oW+fUkm{pNiP-=Qv@q@UHY-(N&T|z9!)#0%T zN2#)^S~AMXFQkzh4{1i85*oQ&O9Z^&srGgZ-grdKE1~tAxLNAZXv?o;Q^IdObB)@} zP1X!lzQlW4&vD-eEoh2>C%n~OpIIBHtGNv{pPbyzXI8vTY<_oT236RqBw;LrswjwM z5oa^zw@Z|j_khZUIc#GYMGZYIoGhWx76ET$kPpCWLsm6E>k<~XRcveSgXaRbw{%# zA*>M10%Sw1FvoIkOMRXIv;JH|)P#q+(yc#wQR*?Wic4$Pu(-8iL-$47q?`7BNjYDS z(@z!9X!KmNUDAfvgVLIZBeEcq*wa2} z!zz3FkdWuv&r2u~i?PSD1q(9PcCn5#f8#;1)Prk$Nc29b&y46nuLx*CQ|yDMh`7vb zsorj$r3l$sv+0(%#X_suNz$vq?ZQ&+TE)Xi#IAFH8*^${XGHIAJ|hB}Vh=pw?Eo^V z9>~t#Sz(P7cYYpsSdi7PzfWU+mg*<2-Z6cMVWsICv6K2N-C_FThKCtuML=8Zfwu@` z6YE{W)+}IyBIB=!JEIR@kcM#miuFCh*~hhskYXJ-WzxwU>Df`uHqS(!=U zSz#H&he^RHlad(q?#-x03;VyRsd`UsnUcb&PoEksXsbPLXdFPTFQLdtM*P{Wam^aN z*Bw`{)^)(BD81JO@9od-XUUgn1ywn*d%;2AFrAa|!NeQFIjde4yX;Vg}rTUCBq8Br&4hRo; zsWVQvl7F&MCIwSYo~#>!)28XY?uZ#x2ZV>(>w=^BCu_r5ZBo>TGY8{FjcU$TKmemM ztOX|hu80}TI=)qCLfeCH5}DgDfNx})G&m(pE?n@)%qi=km1%^3bO4h~8lHAe5)Ysi zXOT(M(@JEO|7OZ}EH`Ob|L6ePaTc01yJU4Wqk{(-W#f@zQf~kvqyBdxfENNy z2AmQr$?)MdOQ5$mqkjDuO`OOmI-1duBaH6f*XQcVKsEPc@M06rKTL*986K{$<7VvC z$$p@7<}gZ2V|4Z`qpB)huNFkMCXWM~fj9VbJ~SEDICQ8Uwzl;0V$`b_qcLL`tysb6 z#0gzrAu{=9{RfV6=EKqt>nUVD9Ma%P1nkui^?Z3k~=G``C~m z`;Q|0vcu2Q-DLkm!A&73wy_U2^q|-NW2Bz=507j4%;>`Us{jB107*qoM6N<$f~a%V AC;$Ke literal 0 HcmV?d00001 From a0837cbecf58a4732e7ea1e17623e8940bed2ede Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 16 Nov 2021 08:12:12 -0500 Subject: [PATCH 13/81] Changed id from emojuno to emojuino to make links work --- apps.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index a0d543cd8..560e3d949 100644 --- a/apps.json +++ b/apps.json @@ -4217,7 +4217,7 @@ "data": [{ "name": "qalarm.json" }] }, { - "id": "emojuno", + "id": "emojuino", "name": "Emoji Broadcaster", "shortName": "Emojuino", "version": "0.01", @@ -4227,8 +4227,8 @@ "supports" : [ "BANGLEJS2" ], "readme": "README.md", "storage": [ - { "name": "emojuno.app.js", "url": "emojuino.js" }, - { "name": "emojuno.img", "url": "emojuino-icon.js", "evaluate": true } + { "name": "emojuino.app.js", "url": "emojuino.js" }, + { "name": "emojuino.img", "url": "emojuino-icon.js", "evaluate": true } ] } ] From 2d76d0bd132e992068ad322a51393c1593e54c68 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 16 Nov 2021 10:04:55 -0500 Subject: [PATCH 14/81] Improved naming/documentation --- apps.json | 4 ++-- apps/emojuino/README.md | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index 560e3d949..b02517aea 100644 --- a/apps.json +++ b/apps.json @@ -4218,10 +4218,10 @@ }, { "id": "emojuino", - "name": "Emoji Broadcaster", + "name": "Emojuino", "shortName": "Emojuino", "version": "0.01", - "description": "Emojis & Espruino: advertise Unicode emojis via BLE", + "description": "Emojis & Espruino: broadcast Unicode emojis via Bluetooth Low Energy.", "icon": "emojuino.png", "tags": "emoji", "supports" : [ "BANGLEJS2" ], diff --git a/apps/emojuino/README.md b/apps/emojuino/README.md index 13879437e..568d06dfb 100644 --- a/apps/emojuino/README.md +++ b/apps/emojuino/README.md @@ -2,22 +2,27 @@ Emojis & Espruino! + ## Usage -Select an emoji and then tap to transmit! +Select an emoji and then tap to transmit! The emoji will be recognised by [Pareto Anywhere](https://www.reelyactive.com/pareto/anywhere/) open source middleware and any other program which observes the [InteroperaBLE Identifier](https://reelyactive.github.io/interoperable-identifier/) open standard. + ## Features -Currently implements a tiny subset of possible Unicode emojis. +Currently implements a tiny subset of possible [Unicode emojis](https://unicode.org/emoji/charts/full-emoji-list.html) which are advertised as an [InteroperaBLE Identifier](https://reelyactive.github.io/interoperable-identifier/) encapsulated as Eddystone UID. + ## Controls -Swipe left/right to select the emoji to broadcast. Tap the screen to initiate the broadcast. Emoji will flash while broadcasting. +Swipe left/right to select the emoji to broadcast. Tap the screen to initiate the broadcast. Emoji will flash while broadcasting, which lasts for 5 seconds. + ## Requests [Contact reelyActive](https://www.reelyactive.com/contact/) for support/updates. + ## Creator Developed by [jeffyactive](https://github.com/jeffyactive) of [reelyActive](https://www.reelyactive.com) From 0464ebb1e17d1cfd2c389ba31c14b44098b5d089 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 17 Nov 2021 11:02:15 +0000 Subject: [PATCH 15/81] fix polyfill: fix https://github.com/espruino/Espruino/issues/2095 --- apps/boot/bootupdate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/boot/bootupdate.js b/apps/boot/bootupdate.js index 5cb6421a5..d642426c2 100644 --- a/apps/boot/bootupdate.js +++ b/apps/boot/bootupdate.js @@ -103,7 +103,7 @@ if (Bangle.swipeHandler) { Bangle.removeListener("swipe", Bangle.swipeHandler); delete Bangle.swipeHandler; } -if (Bangle.touchandler) { +if (Bangle.touchHandler) { Bangle.removeListener("touch", Bangle.touchHandler); delete Bangle.touchHandler; } From 598fe001d75d6664ff13776a5825c440df72345d Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 17:43:08 +0000 Subject: [PATCH 16/81] Create cliclockJS2Enhanced --- apps/cliclockJS2Enhanced | 217 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 apps/cliclockJS2Enhanced diff --git a/apps/cliclockJS2Enhanced b/apps/cliclockJS2Enhanced new file mode 100644 index 000000000..9cc0ab87c --- /dev/null +++ b/apps/cliclockJS2Enhanced @@ -0,0 +1,217 @@ +var fontsize = g.getWidth()>200 ? 3 : 2; +var fontsizeTime = g.getWidth()>200 ? 4 : 4; + +var fontheight = 10*fontsize; +var fontheightTime = 10*fontsizeTime; +var locale = require("locale"); +var marginTop = 40; +var flag = false; + +var hrtOn = false; +var hrtStr = "Hrt: ??? bpm"; + +const NONE_MODE = "none"; +const ID_MODE = "id"; +const VER_MODE = "ver"; +const BATT_MODE = "batt"; +const MEM_MODE = "mem"; +const STEPS_MODE = "step"; +const HRT_MODE = "hrt"; +const NONE_FN_MODE = "no_fn"; +const HRT_FN_MODE = "fn_hrt"; + +let infoMode = NONE_MODE; +let functionMode = NONE_FN_MODE; + +let textCol = g.theme.dark ? "#0f0" : "#080"; + +function drawAll(){ + updateTime(); + updateRest(new Date()); +} + +function updateRest(now){ + writeLine(locale.dow(now),1); + writeLine(locale.date(now,1),2); + drawInfo(5); +} +function updateTime(){ + if (!Bangle.isLCDOn()) return; + let now = new Date(); + writeLine(locale.time(now,1),0); + writeLine(flag?" ":"_",3); + flag = !flag; + if(now.getMinutes() == 0) + updateRest(now); +} +function writeLineStart(line){ + if (line==0){ + g.drawString(">",0,marginTop+(line)*fontheight); + } else { + g.drawString(">",4,marginTop+(line-1)*fontheight + fontheightTime); + + } +} + +function writeLine(str,line){ + if (line == 0){ + var y = marginTop+line*fontheightTime; + g.setFont("6x8",fontsizeTime); + g.setColor(textCol).setFontAlign(-1,-1); + g.clearRect(0,y,((str.length+1)*20),y+fontheight-1); + writeLineStart(line); + g.drawString(str,25,y); + } else { + var y = marginTop+(line-1)*fontheight+fontheightTime; + g.setFont("6x8",fontsize); + g.setColor(textCol).setFontAlign(-1,-1); + g.clearRect(0,y,((str.length+1)*20),y+fontheight-1); + writeLineStart(line); + g.drawString(str,25,y); + } + +} + +function drawInfo(line) { + let val; + let str = ""; + let col = textCol; // green + + //console.log("drawInfo(), infoMode=" + infoMode + " funcMode=" + functionMode); + + switch(functionMode) { + case NONE_FN_MODE: + break; + case HRT_FN_MODE: + col = g.theme.dark ? "#0ff": "#088"; // cyan + str = "HRM: " + (hrtOn ? "ON" : "OFF"); + drawModeLine(line,str,col); + return; + } + + switch(infoMode) { + case NONE_MODE: + col = g.theme.bg; + str = ""; + break; + case HRT_MODE: + str = hrtStr; + break; + case STEPS_MODE: + str = "Steps: " + stepsWidget().getSteps(); + break; + case ID_MODE: + val = NRF.getAddress().split(":"); + str = "Id: " + val[4] + val[5]; + break; + case VER_MODE: + str = "Fw: " + process.env.VERSION; + break; + case MEM_MODE: + val = process.memory(); + str = "Memory: " + Math.round(val.usage*100/val.total) + "%"; + break; + case BATT_MODE: + default: + str = "Battery: " + E.getBattery() + "%"; + } + + drawModeLine(line,str,col); +} + +function drawModeLine(line, str, col) { + g.setColor(col); + var y = marginTop+line*fontheight; + g.fillRect(0, y, 239, y+fontheight-1); + g.setColor(g.theme.bg).setFontAlign(0, 0); + g.drawString(str, g.getWidth()/2, y+fontheight/2); +} + +function changeInfoMode() { + switch(functionMode) { + case NONE_FN_MODE: + break; + case HRT_FN_MODE: + hrtOn = !hrtOn; + Bangle.buzz(); + Bangle.setHRMPower(hrtOn ? 1 : 0); + if (hrtOn) infoMode = HRT_MODE; + return; + } + + switch(infoMode) { + case NONE_MODE: + if (stepsWidget() !== undefined) + infoMode = hrtOn ? HRT_MODE : STEPS_MODE; + else + infoMode = VER_MODE; + break; + case HRT_MODE: + if (stepsWidget() !== undefined) + infoMode = STEPS_MODE; + else + infoMode = VER_MODE; + break; + case STEPS_MODE: + infoMode = ID_MODE; + break; + case ID_MODE: + infoMode = VER_MODE; + break; + case VER_MODE: + infoMode = BATT_MODE; + break; + case BATT_MODE: + infoMode = MEM_MODE; + break; + case MEM_MODE: + default: + infoMode = NONE_MODE; + } +} + +function changeFunctionMode() { + //console.log("changeFunctionMode()"); + switch(functionMode) { + case NONE_FN_MODE: + functionMode = HRT_FN_MODE; + break; + case HRT_FN_MODE: + default: + functionMode = NONE_FN_MODE; + } + //console.log(functionMode); + +} + +function stepsWidget() { + if (WIDGETS.activepedom !== undefined) { + return WIDGETS.activepedom; + } else if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom; + } + return undefined; +} + +Bangle.on('HRM', function(hrm) { + if(hrm.confidence > 90){ + hrtStr = "Hrt: " + hrm.bpm + " bpm"; + } else { + hrtStr = "Hrt: ??? bpm"; + } +}); + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +drawAll(); +Bangle.on('lcdPower',function(on) { + if (on) drawAll(); +}); +var click = setInterval(updateTime, 1000); +// Show launcher when button pressed +Bangle.setUI("clockupdown", btn=>{ + if (btn<0) changeInfoMode(); + if (btn>0) changeFunctionMode(); + drawAll(); +}); From 4fc0a059afb27a5fff2de5ffdf9ef8c8ebe51e98 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 17:43:47 +0000 Subject: [PATCH 17/81] Delete cliclockJS2Enhanced --- apps/cliclockJS2Enhanced | 217 --------------------------------------- 1 file changed, 217 deletions(-) delete mode 100644 apps/cliclockJS2Enhanced diff --git a/apps/cliclockJS2Enhanced b/apps/cliclockJS2Enhanced deleted file mode 100644 index 9cc0ab87c..000000000 --- a/apps/cliclockJS2Enhanced +++ /dev/null @@ -1,217 +0,0 @@ -var fontsize = g.getWidth()>200 ? 3 : 2; -var fontsizeTime = g.getWidth()>200 ? 4 : 4; - -var fontheight = 10*fontsize; -var fontheightTime = 10*fontsizeTime; -var locale = require("locale"); -var marginTop = 40; -var flag = false; - -var hrtOn = false; -var hrtStr = "Hrt: ??? bpm"; - -const NONE_MODE = "none"; -const ID_MODE = "id"; -const VER_MODE = "ver"; -const BATT_MODE = "batt"; -const MEM_MODE = "mem"; -const STEPS_MODE = "step"; -const HRT_MODE = "hrt"; -const NONE_FN_MODE = "no_fn"; -const HRT_FN_MODE = "fn_hrt"; - -let infoMode = NONE_MODE; -let functionMode = NONE_FN_MODE; - -let textCol = g.theme.dark ? "#0f0" : "#080"; - -function drawAll(){ - updateTime(); - updateRest(new Date()); -} - -function updateRest(now){ - writeLine(locale.dow(now),1); - writeLine(locale.date(now,1),2); - drawInfo(5); -} -function updateTime(){ - if (!Bangle.isLCDOn()) return; - let now = new Date(); - writeLine(locale.time(now,1),0); - writeLine(flag?" ":"_",3); - flag = !flag; - if(now.getMinutes() == 0) - updateRest(now); -} -function writeLineStart(line){ - if (line==0){ - g.drawString(">",0,marginTop+(line)*fontheight); - } else { - g.drawString(">",4,marginTop+(line-1)*fontheight + fontheightTime); - - } -} - -function writeLine(str,line){ - if (line == 0){ - var y = marginTop+line*fontheightTime; - g.setFont("6x8",fontsizeTime); - g.setColor(textCol).setFontAlign(-1,-1); - g.clearRect(0,y,((str.length+1)*20),y+fontheight-1); - writeLineStart(line); - g.drawString(str,25,y); - } else { - var y = marginTop+(line-1)*fontheight+fontheightTime; - g.setFont("6x8",fontsize); - g.setColor(textCol).setFontAlign(-1,-1); - g.clearRect(0,y,((str.length+1)*20),y+fontheight-1); - writeLineStart(line); - g.drawString(str,25,y); - } - -} - -function drawInfo(line) { - let val; - let str = ""; - let col = textCol; // green - - //console.log("drawInfo(), infoMode=" + infoMode + " funcMode=" + functionMode); - - switch(functionMode) { - case NONE_FN_MODE: - break; - case HRT_FN_MODE: - col = g.theme.dark ? "#0ff": "#088"; // cyan - str = "HRM: " + (hrtOn ? "ON" : "OFF"); - drawModeLine(line,str,col); - return; - } - - switch(infoMode) { - case NONE_MODE: - col = g.theme.bg; - str = ""; - break; - case HRT_MODE: - str = hrtStr; - break; - case STEPS_MODE: - str = "Steps: " + stepsWidget().getSteps(); - break; - case ID_MODE: - val = NRF.getAddress().split(":"); - str = "Id: " + val[4] + val[5]; - break; - case VER_MODE: - str = "Fw: " + process.env.VERSION; - break; - case MEM_MODE: - val = process.memory(); - str = "Memory: " + Math.round(val.usage*100/val.total) + "%"; - break; - case BATT_MODE: - default: - str = "Battery: " + E.getBattery() + "%"; - } - - drawModeLine(line,str,col); -} - -function drawModeLine(line, str, col) { - g.setColor(col); - var y = marginTop+line*fontheight; - g.fillRect(0, y, 239, y+fontheight-1); - g.setColor(g.theme.bg).setFontAlign(0, 0); - g.drawString(str, g.getWidth()/2, y+fontheight/2); -} - -function changeInfoMode() { - switch(functionMode) { - case NONE_FN_MODE: - break; - case HRT_FN_MODE: - hrtOn = !hrtOn; - Bangle.buzz(); - Bangle.setHRMPower(hrtOn ? 1 : 0); - if (hrtOn) infoMode = HRT_MODE; - return; - } - - switch(infoMode) { - case NONE_MODE: - if (stepsWidget() !== undefined) - infoMode = hrtOn ? HRT_MODE : STEPS_MODE; - else - infoMode = VER_MODE; - break; - case HRT_MODE: - if (stepsWidget() !== undefined) - infoMode = STEPS_MODE; - else - infoMode = VER_MODE; - break; - case STEPS_MODE: - infoMode = ID_MODE; - break; - case ID_MODE: - infoMode = VER_MODE; - break; - case VER_MODE: - infoMode = BATT_MODE; - break; - case BATT_MODE: - infoMode = MEM_MODE; - break; - case MEM_MODE: - default: - infoMode = NONE_MODE; - } -} - -function changeFunctionMode() { - //console.log("changeFunctionMode()"); - switch(functionMode) { - case NONE_FN_MODE: - functionMode = HRT_FN_MODE; - break; - case HRT_FN_MODE: - default: - functionMode = NONE_FN_MODE; - } - //console.log(functionMode); - -} - -function stepsWidget() { - if (WIDGETS.activepedom !== undefined) { - return WIDGETS.activepedom; - } else if (WIDGETS.wpedom !== undefined) { - return WIDGETS.wpedom; - } - return undefined; -} - -Bangle.on('HRM', function(hrm) { - if(hrm.confidence > 90){ - hrtStr = "Hrt: " + hrm.bpm + " bpm"; - } else { - hrtStr = "Hrt: ??? bpm"; - } -}); - -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); -drawAll(); -Bangle.on('lcdPower',function(on) { - if (on) drawAll(); -}); -var click = setInterval(updateTime, 1000); -// Show launcher when button pressed -Bangle.setUI("clockupdown", btn=>{ - if (btn<0) changeInfoMode(); - if (btn>0) changeFunctionMode(); - drawAll(); -}); From 6c24624da58340a816cc85852fd9faf27dd9c731 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 17:44:17 +0000 Subject: [PATCH 18/81] Create app.js --- apps/cliclockJS2Enhanced/app.js | 217 ++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 apps/cliclockJS2Enhanced/app.js diff --git a/apps/cliclockJS2Enhanced/app.js b/apps/cliclockJS2Enhanced/app.js new file mode 100644 index 000000000..9cc0ab87c --- /dev/null +++ b/apps/cliclockJS2Enhanced/app.js @@ -0,0 +1,217 @@ +var fontsize = g.getWidth()>200 ? 3 : 2; +var fontsizeTime = g.getWidth()>200 ? 4 : 4; + +var fontheight = 10*fontsize; +var fontheightTime = 10*fontsizeTime; +var locale = require("locale"); +var marginTop = 40; +var flag = false; + +var hrtOn = false; +var hrtStr = "Hrt: ??? bpm"; + +const NONE_MODE = "none"; +const ID_MODE = "id"; +const VER_MODE = "ver"; +const BATT_MODE = "batt"; +const MEM_MODE = "mem"; +const STEPS_MODE = "step"; +const HRT_MODE = "hrt"; +const NONE_FN_MODE = "no_fn"; +const HRT_FN_MODE = "fn_hrt"; + +let infoMode = NONE_MODE; +let functionMode = NONE_FN_MODE; + +let textCol = g.theme.dark ? "#0f0" : "#080"; + +function drawAll(){ + updateTime(); + updateRest(new Date()); +} + +function updateRest(now){ + writeLine(locale.dow(now),1); + writeLine(locale.date(now,1),2); + drawInfo(5); +} +function updateTime(){ + if (!Bangle.isLCDOn()) return; + let now = new Date(); + writeLine(locale.time(now,1),0); + writeLine(flag?" ":"_",3); + flag = !flag; + if(now.getMinutes() == 0) + updateRest(now); +} +function writeLineStart(line){ + if (line==0){ + g.drawString(">",0,marginTop+(line)*fontheight); + } else { + g.drawString(">",4,marginTop+(line-1)*fontheight + fontheightTime); + + } +} + +function writeLine(str,line){ + if (line == 0){ + var y = marginTop+line*fontheightTime; + g.setFont("6x8",fontsizeTime); + g.setColor(textCol).setFontAlign(-1,-1); + g.clearRect(0,y,((str.length+1)*20),y+fontheight-1); + writeLineStart(line); + g.drawString(str,25,y); + } else { + var y = marginTop+(line-1)*fontheight+fontheightTime; + g.setFont("6x8",fontsize); + g.setColor(textCol).setFontAlign(-1,-1); + g.clearRect(0,y,((str.length+1)*20),y+fontheight-1); + writeLineStart(line); + g.drawString(str,25,y); + } + +} + +function drawInfo(line) { + let val; + let str = ""; + let col = textCol; // green + + //console.log("drawInfo(), infoMode=" + infoMode + " funcMode=" + functionMode); + + switch(functionMode) { + case NONE_FN_MODE: + break; + case HRT_FN_MODE: + col = g.theme.dark ? "#0ff": "#088"; // cyan + str = "HRM: " + (hrtOn ? "ON" : "OFF"); + drawModeLine(line,str,col); + return; + } + + switch(infoMode) { + case NONE_MODE: + col = g.theme.bg; + str = ""; + break; + case HRT_MODE: + str = hrtStr; + break; + case STEPS_MODE: + str = "Steps: " + stepsWidget().getSteps(); + break; + case ID_MODE: + val = NRF.getAddress().split(":"); + str = "Id: " + val[4] + val[5]; + break; + case VER_MODE: + str = "Fw: " + process.env.VERSION; + break; + case MEM_MODE: + val = process.memory(); + str = "Memory: " + Math.round(val.usage*100/val.total) + "%"; + break; + case BATT_MODE: + default: + str = "Battery: " + E.getBattery() + "%"; + } + + drawModeLine(line,str,col); +} + +function drawModeLine(line, str, col) { + g.setColor(col); + var y = marginTop+line*fontheight; + g.fillRect(0, y, 239, y+fontheight-1); + g.setColor(g.theme.bg).setFontAlign(0, 0); + g.drawString(str, g.getWidth()/2, y+fontheight/2); +} + +function changeInfoMode() { + switch(functionMode) { + case NONE_FN_MODE: + break; + case HRT_FN_MODE: + hrtOn = !hrtOn; + Bangle.buzz(); + Bangle.setHRMPower(hrtOn ? 1 : 0); + if (hrtOn) infoMode = HRT_MODE; + return; + } + + switch(infoMode) { + case NONE_MODE: + if (stepsWidget() !== undefined) + infoMode = hrtOn ? HRT_MODE : STEPS_MODE; + else + infoMode = VER_MODE; + break; + case HRT_MODE: + if (stepsWidget() !== undefined) + infoMode = STEPS_MODE; + else + infoMode = VER_MODE; + break; + case STEPS_MODE: + infoMode = ID_MODE; + break; + case ID_MODE: + infoMode = VER_MODE; + break; + case VER_MODE: + infoMode = BATT_MODE; + break; + case BATT_MODE: + infoMode = MEM_MODE; + break; + case MEM_MODE: + default: + infoMode = NONE_MODE; + } +} + +function changeFunctionMode() { + //console.log("changeFunctionMode()"); + switch(functionMode) { + case NONE_FN_MODE: + functionMode = HRT_FN_MODE; + break; + case HRT_FN_MODE: + default: + functionMode = NONE_FN_MODE; + } + //console.log(functionMode); + +} + +function stepsWidget() { + if (WIDGETS.activepedom !== undefined) { + return WIDGETS.activepedom; + } else if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom; + } + return undefined; +} + +Bangle.on('HRM', function(hrm) { + if(hrm.confidence > 90){ + hrtStr = "Hrt: " + hrm.bpm + " bpm"; + } else { + hrtStr = "Hrt: ??? bpm"; + } +}); + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +drawAll(); +Bangle.on('lcdPower',function(on) { + if (on) drawAll(); +}); +var click = setInterval(updateTime, 1000); +// Show launcher when button pressed +Bangle.setUI("clockupdown", btn=>{ + if (btn<0) changeInfoMode(); + if (btn>0) changeFunctionMode(); + drawAll(); +}); From 16fe8e4084739f96dd3e3f8ea0302c193d921d02 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 17:44:43 +0000 Subject: [PATCH 19/81] Add files via upload --- apps/cliclockJS2Enhanced/app-icon.js | 1 + apps/cliclockJS2Enhanced/app.js.png | Bin 0 -> 6100 bytes 2 files changed, 1 insertion(+) create mode 100644 apps/cliclockJS2Enhanced/app-icon.js create mode 100644 apps/cliclockJS2Enhanced/app.js.png diff --git a/apps/cliclockJS2Enhanced/app-icon.js b/apps/cliclockJS2Enhanced/app-icon.js new file mode 100644 index 000000000..b2974fe7a --- /dev/null +++ b/apps/cliclockJS2Enhanced/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AH4A8gAAKC8gKUC7Rf/C/PM5gDBjnBC6EcC4PBDIIbCC5/BAIIXVA4YXXAoRHUC6R3EC6KnEMAbv/C6oAKC8YA/AH4A/AH4Ax")) \ No newline at end of file diff --git a/apps/cliclockJS2Enhanced/app.js.png b/apps/cliclockJS2Enhanced/app.js.png new file mode 100644 index 0000000000000000000000000000000000000000..6d74fcf7166ce0affb3f1d1e3c017e5740909e19 GIT binary patch literal 6100 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 Date: Wed, 17 Nov 2021 17:45:53 +0000 Subject: [PATCH 20/81] Update apps.json --- apps.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b02517aea..2a24ca63d 100644 --- a/apps.json +++ b/apps.json @@ -4230,5 +4230,19 @@ { "name": "emojuino.app.js", "url": "emojuino.js" }, { "name": "emojuino.img", "url": "emojuino-icon.js", "evaluate": true } ] - } + }, + { "id": "clijs2", + "name": "Commandline-Clock JS2 Enhanced", + "shortName":"CLI Clock JS2", + "version":"0.01", + "description": "An enchancement of the JS1 CLI clock with a easier to read time line and extra hard-to-use functionality removed", + "icon": "app.png", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"clijs2.app.js","url":"app.js"}, + {"name":"clijs2.img","url":"app-icon.js","evaluate":true} + ] +} ] From 3e51bf07707042834a41f44f66532112cc353ba8 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 17:52:06 +0000 Subject: [PATCH 21/81] Update apps.json --- apps.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps.json b/apps.json index 2a24ca63d..d55ddda33 100644 --- a/apps.json +++ b/apps.json @@ -4237,9 +4237,11 @@ "version":"0.01", "description": "An enchancement of the JS1 CLI clock with a easier to read time line and extra hard-to-use functionality removed", "icon": "app.png", + "type": "clock", "tags": "clock", "supports" : ["BANGLEJS2"], "readme": "README.md", + "allow_emulator": true, "storage": [ {"name":"clijs2.app.js","url":"app.js"}, {"name":"clijs2.img","url":"app-icon.js","evaluate":true} From 2e98a5f073ac83291dcedfae282611e5cf260f85 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 17:55:38 +0000 Subject: [PATCH 22/81] Update apps.json --- apps.json | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/apps.json b/apps.json index d55ddda33..c3fae7aca 100644 --- a/apps.json +++ b/apps.json @@ -4231,20 +4231,21 @@ { "name": "emojuino.img", "url": "emojuino-icon.js", "evaluate": true } ] }, - { "id": "clijs2", - "name": "Commandline-Clock JS2 Enhanced", - "shortName":"CLI Clock JS2", - "version":"0.01", - "description": "An enchancement of the JS1 CLI clock with a easier to read time line and extra hard-to-use functionality removed", - "icon": "app.png", - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "allow_emulator": true, - "storage": [ - {"name":"clijs2.app.js","url":"app.js"}, - {"name":"clijs2.img","url":"app-icon.js","evaluate":true} - ] + { + "id": "cliockJS2", + "name": "Commandline-Clock JS2 Enhanced", + "shortName": "CLI-Clock JS2", + "version": "0.1", + "description": "Simple CLI-Styled Clock with enhancements", + "icon": "app.png", + "screenshots": [{"url":"screengrab.png"}], + "type": "clock", + "tags": "clock,cli,command,bash,shell", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"cliockJS2.app.js","url":"app.js"}, + {"name":"cliockJS2.img","url":"app-icon.js","evaluate":true} + ] } ] From 1a4b20e3d5a7f67e8bda35e1e9697db3c7d681a5 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 17:56:52 +0000 Subject: [PATCH 23/81] Update apps.json --- apps.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index c3fae7aca..bbe233134 100644 --- a/apps.json +++ b/apps.json @@ -4232,7 +4232,7 @@ ] }, { - "id": "cliockJS2", + "id": "cliclockJS2Enhanced", "name": "Commandline-Clock JS2 Enhanced", "shortName": "CLI-Clock JS2", "version": "0.1", @@ -4244,8 +4244,8 @@ "supports": ["BANGLEJS","BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"cliockJS2.app.js","url":"app.js"}, - {"name":"cliockJS2.img","url":"app-icon.js","evaluate":true} + {"name":"cliclockJS2Enhanced.app.js","url":"app.js"}, + {"name":"cliclockJS2Enhanced.img","url":"app-icon.js","evaluate":true} ] } ] From ac809c0f76927c37288c481f5133f949841df9a2 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 17:58:21 +0000 Subject: [PATCH 24/81] Add files via upload --- apps/cliclockJS2Enhanced/screengrab.png | Bin 0 -> 6100 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/cliclockJS2Enhanced/screengrab.png diff --git a/apps/cliclockJS2Enhanced/screengrab.png b/apps/cliclockJS2Enhanced/screengrab.png new file mode 100644 index 0000000000000000000000000000000000000000..6d74fcf7166ce0affb3f1d1e3c017e5740909e19 GIT binary patch literal 6100 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 Date: Wed, 17 Nov 2021 18:03:51 +0000 Subject: [PATCH 25/81] Add files via upload --- apps/cliclockJS2Enhanced/screengrab.png | Bin 6100 -> 2310 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/cliclockJS2Enhanced/screengrab.png b/apps/cliclockJS2Enhanced/screengrab.png index 6d74fcf7166ce0affb3f1d1e3c017e5740909e19..fd4556fb3cf24346de947102474887754bcbbb86 100644 GIT binary patch literal 2310 zcmds({Xf%<8ppS91nHNV&bb*N~RPd&-YQb zW|PE?>075PcX?QM)~yG2BO_{KmN5@!=a=&*oFC2)*Y)|~b6vlE-q-8O^YbCC*D}^Z zAQ0=lJlz6R%KcBFG*q3_I!;ju@@xR<5TdcqWD0>m!Cr0$gJ_g*6@s#9OKpv`k+quE z=)SPl27Pf!q3fplv|ZRdLFs;h!blbGFk)4S4CRzZF_nxITdyG)`;H)QKv!Ge8>YlM5uLEM&N%TNKvCE;K z8QD|dgCm)60O@b}(Sn!+sZudOg0rcfjoUaRUzZL5k$upk``; zm?tK37($Ma#OEzPS}^Qgo3$-la>?6HD;^Efc1Y}*bzTSYUJ(2Hzxz^C@4-e4LGAjG z>AErhV?nF&%WyjA5yS3htDB~{7^nyFDAt&aybxvJ81o8qbut6o=wj388`H9w-+O*@ zVN{@fRy8uKn7J%Sd3kiON)UUeF2w}e1vor+*mGTrDa1?lk$ZL?HLSB`y^r{zI90%O zaq4P;wJ49z8(GCX?j90W-DQ>}2R}9LpFHNTor$)k$^<4XHYrB-B^$Qu0{YDZy_0L8u>UJFZs2??= z#`4ZM!wf|&m((vje?;+PFB1s6%UB~X8hRtNT=>#e<)9ah=s(!A?=`)}Owv}yNq^A2 zOEq#4mcT6Z&K>#Tk}YJ}o$Aw_o<2vzcO`cdnl_A{j{FugpLd!a_m04n7a!JSb`N%; z`Fekz1y~+Yyz^h>mS|{g`B#3N_FZzEuv|xetD$?a@}2eN4PiGj#zu0 z9sDw}DKkehAG796QXa~}#S!n%o1K+cCb1*JgsSYCCF?1gsTAUtT*8&c#cf0BITVNs z1k3uYO66`z?C4Cs`I4apS=n^P&#c0lsP-~5@tM-lyk)AG%6pELMgzh<2XWHPv3uQ~ z>~oDW5Qe{VP9h91iZdUicPc~VG}#G$pwi3ay)UlQW_aU$M401owtKHkI99=cg$0+z zr=W~Z{oovT^|l21bf9|b!G?@)X_8CChVd^(!ndXfh~%8h)yjs?oz03n4Y8$!2DU9* zR?FGIn+qKa7gsEtm)pBl3{+BDB1OXrXc6`4EtZu$B*Q4&<+lA0hhjX)D-A|SG-ufS z15eWkWOJ5&Sj8{mks)p$S>~id$*N6oIeZU1sZJ%JZhHz=n2Igk3B)6P!&ifE&vcS! zPqO0Pb)o05$-0xMPZz&_EM4;c#0~HSkuFH^hh6MTHxNUsJ?VF?3IQnZHc`!0$oSiB zd+CdSR^Ei#>Ol^sb>86ZfNm9mO`Sc(KgYZw_4K&w>j3MJV0UhW{y@^GB6ME3p2DMn z6yCqCOMKCEglH=zGB+bp7m^G)GFL6C)hEW?i}N(G(igoo_TJh2_%b~^OUrCn-|@;@ zdnECQFu&B+7713i{dButbJ8)zNy857r-JzPK+%2`^KpJ#J&cgx?!&&L+5qa_!JC^- zsB)xD$g@LXlQrC_w^e}eo!{E0ItE4tdH(<3i&EVI$E@8qjYrc}j}5}h-N&u*P)yFh E0Tf0*ZU6uP literal 6100 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 Date: Wed, 17 Nov 2021 18:06:36 +0000 Subject: [PATCH 26/81] Delete app-icon.js --- apps/cliclockJS2Enhanced/app-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/cliclockJS2Enhanced/app-icon.js diff --git a/apps/cliclockJS2Enhanced/app-icon.js b/apps/cliclockJS2Enhanced/app-icon.js deleted file mode 100644 index b2974fe7a..000000000 --- a/apps/cliclockJS2Enhanced/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AH4A8gAAKC8gKUC7Rf/C/PM5gDBjnBC6EcC4PBDIIbCC5/BAIIXVA4YXXAoRHUC6R3EC6KnEMAbv/C6oAKC8YA/AH4A/AH4Ax")) \ No newline at end of file From dd920440a462417a41718ecdfd5cde43c265be64 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 18:07:33 +0000 Subject: [PATCH 27/81] Add files via upload --- apps/cliclockJS2Enhanced/app.icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/cliclockJS2Enhanced/app.icon.js diff --git a/apps/cliclockJS2Enhanced/app.icon.js b/apps/cliclockJS2Enhanced/app.icon.js new file mode 100644 index 000000000..b2974fe7a --- /dev/null +++ b/apps/cliclockJS2Enhanced/app.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AH4A8gAAKC8gKUC7Rf/C/PM5gDBjnBC6EcC4PBDIIbCC5/BAIIXVA4YXXAoRHUC6R3EC6KnEMAbv/C6oAKC8YA/AH4A/AH4Ax")) \ No newline at end of file From c062916766185aa3a6224d7c8fb7e2faf588af67 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 18:13:14 +0000 Subject: [PATCH 28/81] Add files via upload --- apps/cliclockJS2Enhanced/app.png | Bin 0 -> 421 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/cliclockJS2Enhanced/app.png diff --git a/apps/cliclockJS2Enhanced/app.png b/apps/cliclockJS2Enhanced/app.png new file mode 100644 index 0000000000000000000000000000000000000000..e7069203431ae7c22d262413dd1f309613b0815f GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=G`DAk4@xYmNj^gO#U?V@QVc+o^_rhaCi5=ZZ{Rv4bIf0lO8S zgXdw}9gHn9Elrb{3pma(EL^t8`C?&k`Z)i~7USL1%HKq)&ow+Ik=&Cx zz4e&k8+d|GCN*xQVOX-TssBhjfNuJ#+D<^X407tmf5Hx*Psj;n}MLTzL=J z?;P6t%qvcj+xG2d=7UVXwu>^>H0(Z9ePZhg$@^OOG~SE4M)hwAWGUc|ydh~5e#Ua$ zQ~m;`{ST#Mvh*}ARW0dNYN(vJ|0h%B+tf3iO0vfk>ssYZ?`8ZczBIdw;h5l~k2?eY z@a+sMdoEFT(7)n{=Q=O`|B{{A&z!u!dP=)8giqi<==b65 z=8AJquRn=%v^!v2yl`pZkN!2TYFn!qCcoQ#UT{@w{{)C%o7VkiJS%f@zioglBQR(g NJYD@<);T3K0RXYytegM< literal 0 HcmV?d00001 From 287114895e159ccc2ff25d746ebc46715a040375 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 18:15:46 +0000 Subject: [PATCH 29/81] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index bbe233134..bd6c9931b 100644 --- a/apps.json +++ b/apps.json @@ -4236,7 +4236,7 @@ "name": "Commandline-Clock JS2 Enhanced", "shortName": "CLI-Clock JS2", "version": "0.1", - "description": "Simple CLI-Styled Clock with enhancements", + "description": "Simple CLI-Styled Clock with enhancements, credit to hughbarney for the original code and design", "icon": "app.png", "screenshots": [{"url":"screengrab.png"}], "type": "clock", From a7a8588db071887ffe110d10b05698a21fde9e57 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 18:20:30 +0000 Subject: [PATCH 30/81] Update app.js --- apps/cliclockJS2Enhanced/app.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/cliclockJS2Enhanced/app.js b/apps/cliclockJS2Enhanced/app.js index 9cc0ab87c..485ba7917 100644 --- a/apps/cliclockJS2Enhanced/app.js +++ b/apps/cliclockJS2Enhanced/app.js @@ -210,8 +210,3 @@ Bangle.on('lcdPower',function(on) { }); var click = setInterval(updateTime, 1000); // Show launcher when button pressed -Bangle.setUI("clockupdown", btn=>{ - if (btn<0) changeInfoMode(); - if (btn>0) changeFunctionMode(); - drawAll(); -}); From 61882b5d82864219bc57d864729e08bd907f1544 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 18:21:19 +0000 Subject: [PATCH 31/81] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index bd6c9931b..35f2fbd95 100644 --- a/apps.json +++ b/apps.json @@ -4236,7 +4236,7 @@ "name": "Commandline-Clock JS2 Enhanced", "shortName": "CLI-Clock JS2", "version": "0.1", - "description": "Simple CLI-Styled Clock with enhancements, credit to hughbarney for the original code and design", + "description": "Simple CLI-Styled Clock with enhancements. Modes that are hard to use and unneded are removed (BPM, battery info, memory ect) credit to hughbarney for the original code and design", "icon": "app.png", "screenshots": [{"url":"screengrab.png"}], "type": "clock", From c36f409641e94007e10788c1865ede6b5e558746 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 19:04:16 +0000 Subject: [PATCH 32/81] Update app.js --- apps/cliclockJS2Enhanced/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cliclockJS2Enhanced/app.js b/apps/cliclockJS2Enhanced/app.js index 485ba7917..451e70dfc 100644 --- a/apps/cliclockJS2Enhanced/app.js +++ b/apps/cliclockJS2Enhanced/app.js @@ -58,7 +58,7 @@ function writeLine(str,line){ var y = marginTop+line*fontheightTime; g.setFont("6x8",fontsizeTime); g.setColor(textCol).setFontAlign(-1,-1); - g.clearRect(0,y,((str.length+1)*20),y+fontheight-1); + g.clearRect(0,y,((str.length+1)*40),y+fontheightTime-1); writeLineStart(line); g.drawString(str,25,y); } else { From 418de289c706d09d994a0a5263f126a5f460508f Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 19:54:44 +0000 Subject: [PATCH 33/81] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 35f2fbd95..c5890cbd4 100644 --- a/apps.json +++ b/apps.json @@ -4245,7 +4245,7 @@ "allow_emulator": true, "storage": [ {"name":"cliclockJS2Enhanced.app.js","url":"app.js"}, - {"name":"cliclockJS2Enhanced.img","url":"app-icon.js","evaluate":true} + {"name":"cliclockJS2Enhanced.img","url":"app.icon.js","evaluate":true} ] } ] From 1b6671f3651d109fe2a659a5aa5a078fa237c452 Mon Sep 17 00:00:00 2001 From: weeurey Date: Wed, 17 Nov 2021 21:26:29 +0000 Subject: [PATCH 34/81] Update app.js --- apps/cliclockJS2Enhanced/app.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/cliclockJS2Enhanced/app.js b/apps/cliclockJS2Enhanced/app.js index 451e70dfc..314e32375 100644 --- a/apps/cliclockJS2Enhanced/app.js +++ b/apps/cliclockJS2Enhanced/app.js @@ -210,3 +210,7 @@ Bangle.on('lcdPower',function(on) { }); var click = setInterval(updateTime, 1000); // Show launcher when button pressed +Bangle.setUI("clockupdown", btn=>{ + if (btn<0) changeInfoMode(); + drawAll(); +}); From 5aab684644a9d5e3054e600eda7e0bc727e941fe Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 18 Nov 2021 07:48:11 +0100 Subject: [PATCH 35/81] First implementation of lcars clock --- apps/lcars/bg.png | Bin 0 -> 1685 bytes apps/lcars/lcars.app.info | 5 ++ apps/lcars/lcars.app.js | 97 ++++++++++++++++++++++++++++++++++++++ apps/lcars/lcars.png | Bin 0 -> 540 bytes 4 files changed, 102 insertions(+) create mode 100644 apps/lcars/bg.png create mode 100644 apps/lcars/lcars.app.info create mode 100644 apps/lcars/lcars.app.js create mode 100644 apps/lcars/lcars.png diff --git a/apps/lcars/bg.png b/apps/lcars/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..6a95ec69924d9169b88b9fa8136b048d50997e34 GIT binary patch literal 1685 zcmb_cS5OlO5KTf!q>3USRYVj;3?ATN2_@2k^rn;}u^>7EBGphrLu?#0vHrSZ z$`UiC(nMG)d*5wBU@TQZLMCI+eXy;N3?kWdZ-SO-uadg@^81$i;HwGY(8E~{&;t-$ zll4qk-DuWHiU? zcjWswZ*fvwN^uIBDsOFXem(D*TV}x-1`#s@%X%v!;qq;asgExTO}rm>t@T{y9K+d9 zUoXgiW$7N*i5d$1#=XNSQMIO4u5~4ZOtWLmyaKgHo2R5L~1cwZr-?OYgblBQSf%=#w!h{FMpPJS7yHLgT?no zN~zeLWS<@%m)>TsewZz`ek<8NTlrfA@-Pq@vbm(uv_1svAE<_x*;iw7pQquvguMN( zyj-w6wRY=O7dn(TCLlXTf&t~9YZV`sUEynRJVNsL&gSqo?_Rj85_9^MKIq0Z{J10V%~@z-(O*TlztL={8EI-=rOxt6x@?i zowAAvVD`!_O=n(;zHGr$r#fJdVx``JyE4EE1PC*xvmeYPc-=#ffm#oZmT{nQ(KAf$ z0{)RcwC2+YLe}Z{qm%BY;cbM7MSG!dGHz1lHueb6oswOlE)83Ti}sLgK*ai|EpGS1 zo(gwq`_aVXckAk`V;Al78_ZE?61aXWR7x#XO-dd0ALPi8G+Y{_zl;*-HD5`0L(Za` zA-U;Tc*)Xs3oNr{zh*tQa)QyV{zkr)bnT&`IGBv(u9}94B*w7De%`mIVxkI3X70*f@t@#jocmrGDxD z9v$?p&Yk6VO4fWVW$mls0ELYmW$N)+G`?1O%zgYJL{RxVVquH6ZiJPr>qNBPl0=#; gbQyfy#bjd#Jc>$yoGFM!3Z5JQVQyzu21mvI4Q8+{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +// Show launcher when middle button pressed +Bangle.setUI("clock"); + +// Currently we don't load widgets an use the full screen +// Bangle.loadWidgets(); +// Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/lcars/lcars.png b/apps/lcars/lcars.png new file mode 100644 index 0000000000000000000000000000000000000000..f40ddd39430ad87c91636e8db704068f2f472d41 GIT binary patch literal 540 zcmV+%0^|LOP)lzGMP*!volK=mW=P1?k=^!WY-Dol`NoZvVgA10=nkE7f^H*cM_*ChZ8uAefWm2 zSjP%Bt2P?9fD5>RK8{t){e=&BiD%eo60j{RaRzU&9oa87ZkKI5jvly)w>XE1wl_~* zLW_7L)OQk63OI`g>LowGXQ9N7VoJ?_D^&>Y?iA)Gj6{KS2GER8>;5YQ89xr|k;wG}Ld zfaBsP&qtvLS|Npi0~OyZ{mpJjA>c>F_gW*g7lN-T;~MU&C*mTmHch1IOqdKa(I2T_WRG!6D7Pex<4O4h e=e6MNcj7lfIENFi-QYI>0000 literal 0 HcmV?d00001 From 6bd548d4094ea425d94c9199a018865e6989935a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 18 Nov 2021 10:27:26 +0000 Subject: [PATCH 36/81] setting 0.32: Fix 'beep' menu on Bangle.js 2 --- apps.json | 4 ++-- apps/setting/ChangeLog | 1 + apps/setting/settings.js | 51 +++++++++++++++++++++++++++------------- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/apps.json b/apps.json index c5890cbd4..238c928be 100644 --- a/apps.json +++ b/apps.json @@ -115,7 +115,7 @@ { "id": "setting", "name": "Settings", - "version": "0.31", + "version": "0.32", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", @@ -4224,7 +4224,7 @@ "description": "Emojis & Espruino: broadcast Unicode emojis via Bluetooth Low Energy.", "icon": "emojuino.png", "tags": "emoji", - "supports" : [ "BANGLEJS2" ], + "supports" : [ "BANGLEJS2" ], "readme": "README.md", "storage": [ { "name": "emojuino.app.js", "url": "emojuino.js" }, diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 0890cf510..63f77edcf 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -34,3 +34,4 @@ 0.29: Add Customize to Theme menu 0.30: Move '< Back' to the top of menus 0.31: Remove Bangle 1 settings when running on Bangle 2 +0.32: Fix 'beep' menu on Bangle.js 2 diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 0decb5313..395fdef00 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -72,8 +72,37 @@ if (!('qmOptions' in settings)) settings.qmOptions = {}; // easier if this alway const boolFormat = v => v ? "On" : "Off"; function showMainMenu() { - var beepV = BANGLEJS2 ? [false,true] : [false, true, "vib"]; - var beepN = BANGLEJS2 ? ["Off","On"] : ["Off", "Piezo", "Vibrate"]; + var beepMenuItem; + if (BANGLEJS2) { // Bangle.js 2 is simply on/off + beepMenuItem = { + value: settings.beep, + format: boolFormat, + onchange: v => { + settings.beep = v; + updateSettings(); + if (settings.beep) { + analogWrite(VIBRATE,0.1,{freq:2000}); + setTimeout(()=>VIBRATE.reset(),200); + } // beep with vibration moter + } + } + } else { // Bangle.js 1 has different options + var beepV = [false, true, "vib"]; + var beepN = ["Off", "Piezo", "Vibrate"]; + beepMenuItem = { + value: Math.max(0 | beepV.indexOf(settings.beep),0), + min: 0, max: beepV.length-1, + format: v => beepN[v], + onchange: v => { + settings.beep = beepV[v]; + if (v==1) { analogWrite(D18,0.5,{freq:2000});setTimeout(()=>D18.reset(),200); } // piezo on Bangle.js 1 + else if (v==2) { analogWrite(VIBRATE,0.1,{freq:2000});setTimeout(()=>VIBRATE.reset(),200); } // vibrate + updateSettings(); + } + }; + } + + const mainmenu = { '': { 'title': 'Settings' }, '< Back': ()=>load(), @@ -88,22 +117,12 @@ function showMainMenu() { updateSettings(); } }, - 'Beep': { - value: 0 | beepV.indexOf(settings.beep), - min: 0, max: 2, - format: v => beepN[v], - onchange: v => { - settings.beep = beepV[v]; - if (v==1) { analogWrite(D18,0.5,{freq:2000});setTimeout(()=>D18.reset(),200); } // piezo - else if (v==2) { analogWrite(D13,0.1,{freq:2000});setTimeout(()=>D13.reset(),200); } // vibrate - updateSettings(); - } - }, + 'Beep': beepMenuItem, 'Vibration': { value: settings.vibrate, format: boolFormat, - onchange: () => { - settings.vibrate = !settings.vibrate; + onchange: v => { + settings.vibrate = v; updateSettings(); if (settings.vibrate) { VIBRATE.write(1); @@ -146,7 +165,7 @@ function showBLEMenu() { } }, 'HID': { - value: 0 | hidV.indexOf(settings.HID), + value: Math.max(0,0 | hidV.indexOf(settings.HID)), min: 0, max: 3, format: v => hidN[v], onchange: v => { From 5f9eca02264771743f6c1de150334339931ffae6 Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 13:14:45 +0000 Subject: [PATCH 37/81] Create Cube Scramble app --- apps.json | 13 ++++++++++++ apps/cubescramble/ChangeLog | 1 + apps/cubescramble/README.md | 25 ++++++++++++++++++++++++ apps/cubescramble/cube-scramble-icon.js | 1 + apps/cubescramble/cube-scramble.js | 1 + apps/cubescramble/cube-scramble.png | Bin 0 -> 3107 bytes 6 files changed, 41 insertions(+) create mode 100644 apps/cubescramble/ChangeLog create mode 100644 apps/cubescramble/README.md create mode 100644 apps/cubescramble/cube-scramble-icon.js create mode 100644 apps/cubescramble/cube-scramble.js create mode 100644 apps/cubescramble/cube-scramble.png diff --git a/apps.json b/apps.json index b02517aea..44375189f 100644 --- a/apps.json +++ b/apps.json @@ -245,6 +245,19 @@ ], "data": [{"name":"mywelcome.json"}] }, + { + "id": "cubescramble", + "name": "Cube Scramble", + "version":"0.01", + "description": "A random scramble generator for the 3x3 Rubik's cube", + "icon": "cube-scramble.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"cubescramble.app.js","url":"cube-scramble.js"}, + {"name":"cubescramble.img","url":"cube-scramble-icon.js","evaluate":true} + ] + }, { "id": "gbridge", "name": "Gadgetbridge", diff --git a/apps/cubescramble/ChangeLog b/apps/cubescramble/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/cubescramble/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/cubescramble/README.md b/apps/cubescramble/README.md new file mode 100644 index 000000000..1be3a4571 --- /dev/null +++ b/apps/cubescramble/README.md @@ -0,0 +1,25 @@ +# Cube Scramble + +Describe the app... + +Add screen shots (if possible) to the app folder and link then into this file with ![](.png) + +## Usage + +Describe how to use it + +## Features + +Name the function + +## Controls + +Name the buttons and what they are used for + +## Requests + +Name who should be contacted for support/update requests + +## Creator + +Your name diff --git a/apps/cubescramble/cube-scramble-icon.js b/apps/cubescramble/cube-scramble-icon.js new file mode 100644 index 000000000..993034af6 --- /dev/null +++ b/apps/cubescramble/cube-scramble-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("ABkBiASRuUiwITPiUiAAMhEpsVqIUDkQ/KCQNVAAMRCgexCZEdiITCqoqClERiIqGj8zmeRFIdRCIMdBQQ5EiYIBmcxHwkRBQgUImY/BCQIPBBQg/DgIMBCgcRyYFDBQehCgdRI4QTBjIPDyPTmc/NQpfCi1mswkEmIKBiOHu9xCgRNBCQIABsJPD6MRi93AAN4FQQUFtg/BIgMUoIUDu4UEHoQ/CCQNEAAMRCgY/CisUCgVuCYoUBKQN3vZqCgtUoImC81siIUDH4QLBjYUBgIUBiPGH4YUECQMYkUiCgMRqlEKglhH4QTC4QTBCgMNJgR/EKwIHBiOyiITCCgMDRINEmI+DNYUSB4OxCgrxBokzH4XhCYkiwIUDiIUBmMUycR9gSBqtRB4YUEuMJmc9inTegMVqoUJjFxhryBiMTmITCCgOCEgYWBX4NxgIUB24UG2RODiL+Cc4MTmfHuc9CghoCCYNRCgYGBmcXvc/CguxNwYUD45RBAwPZCgYRBCYQUDvUQEwJFCwYUCCYaDDBoMUoADBuICCioSDiOxIgcXewIUCu8Ru94+fBCYW3DYIUCCYIUBg4UBj0XvHDn6LDCgcRCgUQgIUBi1hw6XByJ1DCgNRswUBoMAgAMBi1mQIMzmITBCgVR8wUBCYQABCgVhCg0R41mCgMQCgcMCgNmj4UGBII1BCYYABjwJBsPTCgV7iXBBIQTFgEBBQUbnqaCkWxBII8EAAcOCgNEj+HiNykWBFBAACSgKHBiMSkQUBtwoIIAQUBCoITBkUhCZQVCCgNECgWwCZYABbgQUCCZoqDCYI8MCouCkITPIAUSCaIqBHhQ=")) diff --git a/apps/cubescramble/cube-scramble.js b/apps/cubescramble/cube-scramble.js new file mode 100644 index 000000000..614c8368d --- /dev/null +++ b/apps/cubescramble/cube-scramble.js @@ -0,0 +1 @@ +E.showMessage("Cube\nScramble","3x3"); diff --git a/apps/cubescramble/cube-scramble.png b/apps/cubescramble/cube-scramble.png new file mode 100644 index 0000000000000000000000000000000000000000..34db342f6f7ad128e6484e0c242e4f57d8cb47e4 GIT binary patch literal 3107 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 literal 0 HcmV?d00001 From 69b087bb89988560b1e92248fb63af71d0485b6a Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 18 Nov 2021 22:17:32 +0900 Subject: [PATCH 38/81] Create a_battery_widget/widget.js --- apps/a_battery_widget/widget.js | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 apps/a_battery_widget/widget.js diff --git a/apps/a_battery_widget/widget.js b/apps/a_battery_widget/widget.js new file mode 100644 index 000000000..d6f8236d4 --- /dev/null +++ b/apps/a_battery_widget/widget.js @@ -0,0 +1,45 @@ +(function(){ + let COLORS = { + 'white': "#fff", + 'black': "#000", + 'charging': "#08f", + 'high': "#000", + 'low': "#f00", + }; + + const levelColor = (l) => { + if (Bangle.isCharging()) return COLORS.charging; + if (l >= 30) return COLORS.high; + return COLORS.low; + }; + + function draw() { + var s = 29; + var x = this.x, y = this.y; + + const l = E.getBattery(); + + let xl = x+4+l*(s-12)/100; + + g.setColor(COLORS.white); + g.fillRect(x+2,y+5,x+s-6,y+18); + + g.setColor(levelColor(l)); + g.fillRect(x+1,y+3,x+s-5,y+4); + g.fillRect(x+1,y+19,x+s-5,y+20); + g.fillRect(x,y+4,x+1,y+19); + g.fillRect(x+s-5,y+4,x+s-4,y+19); + g.fillRect(x+s-3,y+8,x+s-2,y+16); // tip of the battery + g.fillRect(x+4,y+15,xl,y+16); // charging bar + + g.setColor(COLORS.black); + g.setFontAlign(0,0); + g.setFont('6x8'); + g.drawString(l, x + 14, y + 10); + } + + Bangle.on('charging',function(charging) { draw(); }); + setInterval(()=>WIDGETS["a_battery_widget"].draw(), 60000); + + WIDGETS["a_battery_widget"]={area:"tr",width:30,draw:draw}; +})(); From 8afcbf76ff9b26af5acfcd863b2beb100e222d2e Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 18 Nov 2021 22:27:47 +0900 Subject: [PATCH 39/81] Add files via upload --- apps/a_battery_widget/widget.png | Bin 0 -> 2385 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/a_battery_widget/widget.png diff --git a/apps/a_battery_widget/widget.png b/apps/a_battery_widget/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..868628b6085cb0da28098648ae713dc1f08e44d0 GIT binary patch literal 2385 zcmaJ@3s_S}7QRV%6-6sAF<4ClyK7v@i-;0K3Ni8!q9Gtc4b~8DAdq)1aB(YAt>u%d z1QAzxOM?njO9Tu>6tPi@^y8Cq0o>m5~KlokLMAQ3HazyNs#E&zZ#FAa}`B6%T9u~JSJ#VTV!GAvi2N&pLHBBmUK zLS3?Dm5U%i%ca`iELW}fxyzlN|*w!{|p^@ z^C8AVkcvs6q@<*fQ#{E^O&o>h?d?sW(kXPh2ZHd>rYay2?4i)QO^f`Y!v(csjZ_6m zl?no?D~eGjK|Vwxy3y-49VaA}%- zo53R0G|7Az(=oEp2$)dxGIwnb9z78#m+Sq0cd}KFI#A;yHf?IRDcwX=oQiR>aFy?ugdQ6YyDM9=!Ox)6 z-QwI1%ye`nVGTAnt{o#ero6HML)Uy^Dj6ygJslhQ-l*K`UtG1cwe@N1cVDLrwdRMG z*64k76TUsT2uh&{4?j3|Ne+tME|dQYKSCDEpg8kolSq#+^^!R)ie+U z+s11v=x1NukMZ}niWUm_R2O|qOK`|UPMgE#(5}Jk;~k)HT0%l*MP+4DZAyM`Pfuxc za}bloswueJ3BW4`U0q#Co}QjDK$KIEn`0ez=clGG-0CZEQ^M%z@-?u@J`5Kt(5+iU z#uXJ8=iGmKrnyp3Bv0G-oedIQndCY+#&iwI4%dH@kxX^BbGx#&>l$)y9T~ zkjlzR27|%n@pupf>3gb(iHV6Hepx3Z=bb!xs=mG+w&RbTc;zlnU-sJ6JCs%aX z>{!HYi_>azcJKZQPoS#rbKUi=N-VU=E%-tkypQL*|~ zOUnW`T+CgsyMm664#o!`eARY=_wK;w_qw~!V2!1v9Jf`=Tt3OM-BDRvyKQ7|=fk0) z3UTLfFhy+I?6Dod#QiOvLL!Bx7oB7eSJ~g*e--e3wmRopRvE^nd$={{#|FZYOIi0` z{iDsmz26SNiEa)73wZvvR8kw&<<{1Q|u{R*kDbNFBDQ31}%3AJl^-n#&A7i zxIK5{orx`M+GVZ3ZuIbI-e`Wmh~?5m3NID^c4ADVE=l|sd~femU2l7U^9Td|Ul6ou L3->%{*S`M&n6+>< literal 0 HcmV?d00001 From 015222f9e9290866cedf0a7ba7f10ede8081d64e Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 18 Nov 2021 22:30:29 +0900 Subject: [PATCH 40/81] Create ChangeLog --- apps/a_battery_widget/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/a_battery_widget/ChangeLog diff --git a/apps/a_battery_widget/ChangeLog b/apps/a_battery_widget/ChangeLog new file mode 100644 index 000000000..86554d55f --- /dev/null +++ b/apps/a_battery_widget/ChangeLog @@ -0,0 +1 @@ +2021/11/18 | 1.0: Release From fc8cd41c631af790b54ed8767133211aa38d46cf Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 13:45:11 +0000 Subject: [PATCH 41/81] Give this a go --- apps.json | 26 +++++++++++++------------- apps/cubescramble/ChangeLog | 2 +- apps/cubescramble/README.md | 25 ------------------------- apps/cubescramble/cube-scramble.js | 8 +++++++- 4 files changed, 21 insertions(+), 40 deletions(-) delete mode 100644 apps/cubescramble/README.md diff --git a/apps.json b/apps.json index 44375189f..213ceb882 100644 --- a/apps.json +++ b/apps.json @@ -245,19 +245,6 @@ ], "data": [{"name":"mywelcome.json"}] }, - { - "id": "cubescramble", - "name": "Cube Scramble", - "version":"0.01", - "description": "A random scramble generator for the 3x3 Rubik's cube", - "icon": "cube-scramble.png", - "tags": "", - "supports" : ["BANGLEJS2"], - "storage": [ - {"name":"cubescramble.app.js","url":"cube-scramble.js"}, - {"name":"cubescramble.img","url":"cube-scramble-icon.js","evaluate":true} - ] - }, { "id": "gbridge", "name": "Gadgetbridge", @@ -553,6 +540,19 @@ ], "data": [{"name":"trex.score","storageFile":true}] }, + { + "id": "cubescramble", + "name": "Cube Scramble", + "version":"0.01", + "description": "A random scramble generator for the 3x3 Rubik's cube", + "icon": "cube-scramble.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"cubescramble.app.js","url":"cube-scramble.js"}, + {"name":"cubescramble.img","url":"cube-scramble-icon.js","evaluate":true} + ] + }, { "id": "astroid", "name": "Asteroids!", diff --git a/apps/cubescramble/ChangeLog b/apps/cubescramble/ChangeLog index 5560f00bc..7d48be036 100644 --- a/apps/cubescramble/ChangeLog +++ b/apps/cubescramble/ChangeLog @@ -1 +1 @@ -0.01: New App! +0.01: Cube Scramble! diff --git a/apps/cubescramble/README.md b/apps/cubescramble/README.md deleted file mode 100644 index 1be3a4571..000000000 --- a/apps/cubescramble/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Cube Scramble - -Describe the app... - -Add screen shots (if possible) to the app folder and link then into this file with ![](.png) - -## Usage - -Describe how to use it - -## Features - -Name the function - -## Controls - -Name the buttons and what they are used for - -## Requests - -Name who should be contacted for support/update requests - -## Creator - -Your name diff --git a/apps/cubescramble/cube-scramble.js b/apps/cubescramble/cube-scramble.js index 614c8368d..b70ef3e67 100644 --- a/apps/cubescramble/cube-scramble.js +++ b/apps/cubescramble/cube-scramble.js @@ -1 +1,7 @@ -E.showMessage("Cube\nScramble","3x3"); +g.clear(); + +function appStart() { + E.showMessage("Loading..."); +} + +appStart(); From bc8b792450c51d7d138ebf4d9599c25d9fc7eb6c Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 18 Nov 2021 22:49:09 +0900 Subject: [PATCH 42/81] Create README.md --- apps/a_battery_widget/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 apps/a_battery_widget/README.md diff --git a/apps/a_battery_widget/README.md b/apps/a_battery_widget/README.md new file mode 100644 index 000000000..b7e38c52f --- /dev/null +++ b/apps/a_battery_widget/README.md @@ -0,0 +1,14 @@ +# A Battery Widget (with percentage) + +Show the current battery level and charging status in the top right of the clock, with charge percentage + +* Works with Bangle 2 ⌚ +* Simple design, no settings 🍏 + * Red when the batterly level is below 30% 🟥 + * Blue when charging 🟦 +* 40 pixels wide ↔️ + +![](widget.png) + +## Creator +[@alainsaas](https://github.com/alainsaas) From db92bae41d93b93330642108f8db2fad4d3a1bfe Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 18 Nov 2021 22:49:38 +0900 Subject: [PATCH 43/81] Update ChangeLog --- apps/a_battery_widget/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/a_battery_widget/ChangeLog b/apps/a_battery_widget/ChangeLog index 86554d55f..0dbd5f758 100644 --- a/apps/a_battery_widget/ChangeLog +++ b/apps/a_battery_widget/ChangeLog @@ -1 +1 @@ -2021/11/18 | 1.0: Release +2021/11/18 | 1.0: Release for Bangle 2 From 646011afaadf6057f7bd5d515073991d477b7c4b Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 13:52:08 +0000 Subject: [PATCH 44/81] resize canvas --- apps/cubescramble/cube-scramble.png | Bin 3107 -> 3124 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/cubescramble/cube-scramble.png b/apps/cubescramble/cube-scramble.png index 34db342f6f7ad128e6484e0c242e4f57d8cb47e4..9d0a7c65247b75825247bc15e67b6a3680334ea8 100644 GIT binary patch literal 3124 zcmV-449oM0P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 From e4f2db14035df9ff8b233647c0c888d5dac022dd Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 18 Nov 2021 22:58:51 +0900 Subject: [PATCH 45/81] Update apps.json --- apps.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 238c928be..4a4d94278 100644 --- a/apps.json +++ b/apps.json @@ -4247,5 +4247,20 @@ {"name":"cliclockJS2Enhanced.app.js","url":"app.js"}, {"name":"cliclockJS2Enhanced.img","url":"app.icon.js","evaluate":true} ] -} + }, + { + "id": "a_battery_widget", + "name": "A Battery Widget (with percentage)", + "shortName":"A Battery Widget", + "icon": "widget.png", + "version":"1.0", + "type": "widget", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "description": "Simple and slim battery widget with charge status and percentage", + "tags": "widget,battery", + "storage": [ + {"name":"a_battery_widget.wid.js","url":"widget.js"} + ] + } ] From d2f33b1ae2acfa019ab0b77466c140f0efe3051f Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 18 Nov 2021 23:01:42 +0900 Subject: [PATCH 46/81] Update README.md --- apps/a_battery_widget/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/a_battery_widget/README.md b/apps/a_battery_widget/README.md index b7e38c52f..7d3cc89b9 100644 --- a/apps/a_battery_widget/README.md +++ b/apps/a_battery_widget/README.md @@ -2,11 +2,11 @@ Show the current battery level and charging status in the top right of the clock, with charge percentage -* Works with Bangle 2 ⌚ -* Simple design, no settings 🍏 - * Red when the batterly level is below 30% 🟥 - * Blue when charging 🟦 -* 40 pixels wide ↔️ +* Works with Bangle 2 +* Simple design, no settings + * Red when the batterly level is below 30% + * Blue when charging +* 40 pixels wide ![](widget.png) From 816635eaf7833fb7c3afb793d96ab1a6859e6312 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 18 Nov 2021 14:08:12 +0000 Subject: [PATCH 47/81] 0.33: Really fix 'beep' menu on Bangle.js 2 this timeproper fix for beep switching --- apps.json | 2 +- apps/setting/ChangeLog | 1 + apps/setting/settings.js | 14 +++++++------- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps.json b/apps.json index 238c928be..a5307daa8 100644 --- a/apps.json +++ b/apps.json @@ -115,7 +115,7 @@ { "id": "setting", "name": "Settings", - "version": "0.32", + "version": "0.33", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 63f77edcf..faa50405f 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -35,3 +35,4 @@ 0.30: Move '< Back' to the top of menus 0.31: Remove Bangle 1 settings when running on Bangle 2 0.32: Fix 'beep' menu on Bangle.js 2 +0.33: Really fix 'beep' menu on Bangle.js 2 this time diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 395fdef00..fcf651b6f 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -38,7 +38,7 @@ function resetSettings() { quiet: 0, // quiet mode: 0: off, 1: priority only, 2: total silence timeout: 10, // Default LCD timeout in seconds vibrate: true, // Vibration enabled by default. App must support - beep: "vib", // Beep enabled by default. App must support + beep: BANGLEJS2?true:"vib", // Beep enabled by default. App must support timezone: 0, // Set the timezone for the device HID: false, // BLE HID mode, off by default clock: null, // a string for the default clock's name @@ -73,9 +73,9 @@ const boolFormat = v => v ? "On" : "Off"; function showMainMenu() { var beepMenuItem; - if (BANGLEJS2) { // Bangle.js 2 is simply on/off + if (BANGLEJS2) { beepMenuItem = { - value: settings.beep, + value: settings.beep!=false, format: boolFormat, onchange: v => { settings.beep = v; @@ -85,8 +85,8 @@ function showMainMenu() { setTimeout(()=>VIBRATE.reset(),200); } // beep with vibration moter } - } - } else { // Bangle.js 1 has different options + }; + } else { // Bangle.js 1 var beepV = [false, true, "vib"]; var beepN = ["Off", "Piezo", "Vibrate"]; beepMenuItem = { @@ -121,8 +121,8 @@ function showMainMenu() { 'Vibration': { value: settings.vibrate, format: boolFormat, - onchange: v => { - settings.vibrate = v; + onchange: () => { + settings.vibrate = !settings.vibrate; updateSettings(); if (settings.vibrate) { VIBRATE.write(1); From d7ebc1438de42c6c644006fab29bfb146e6c156a Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 14:09:44 +0000 Subject: [PATCH 48/81] Create scramble generator --- apps/cubescramble/cube-scramble.js | 69 +++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/apps/cubescramble/cube-scramble.js b/apps/cubescramble/cube-scramble.js index b70ef3e67..c73ebc00e 100644 --- a/apps/cubescramble/cube-scramble.js +++ b/apps/cubescramble/cube-scramble.js @@ -1,7 +1,66 @@ -g.clear(); -function appStart() { - E.showMessage("Loading..."); -} +// Scramble code from: https://raw.githubusercontent.com/bjcarlson42/blog-post-sample-code/master/Rubik's%20Cube%20JavaScript%20Scrambler/part_two.js +const makeScramble = () => { + const options = ["F", "F2", "F'", "R", "R2", "R'", "U", "U2", "U'", "B", "B2", "B'", "L", "L2", "L'", "D", "D2", "D'"]; + const numOptions = [0, 1, 2, 3, 4, 5]; // 0 = F, 1 = R, 2 = U, 3 = B, 4 = L, 5 = D + const scrambleMoves = []; + let bad = true; -appStart(); + while (bad) { + let scramble = []; + for (let i = 0; i < 20; i++) { + scramble.push(numOptions[getRandomInt(6)]); + } + // check if moves directly next to each other involve the same letter + for (let i = 0; i < 20 - 1; i++) { + if (scramble[i] == scramble[i + 1]) { + bad = true; + break; + } else { + bad = false; + } + } + } + // switch numbers to letters + let move; + for (let i = 0; i < 20; i++) { + switch (scramble[i]) { + case 0: + move = options[getRandomInt(3)]; // 0,1,2 + scrambleMoves.push(move); + break; + case 1: + move = options[getRandomIntBetween(3, 6)]; // 3,4,5 + scrambleMoves.push(move); + break; + case 2: + move = options[getRandomIntBetween(6, 9)]; // 6,7,8 + scrambleMoves.push(move); + break; + case 3: + move = options[getRandomIntBetween(9, 12)]; // 9,10,11 + scrambleMoves.push(move); + break; + case 4: + move = options[getRandomIntBetween(12, 15)]; // 12,13,14 + scrambleMoves.push(move); + break; + case 5: + move = options[getRandomIntBetween(15, 18)]; // 15,16,17 + scrambleMoves.push(move); + break; + } + } + return scrambleMoves; +}; + +const getRandomInt = max => Math.floor(Math.random() * Math.floor(max)); // returns up to max - 1 + +const getRandomIntBetween = (min, max) => Math.floor(Math.random() * (max - min) + min); + +const presentScramble = () => { + g.clear(); + E.showMessage(makeScramble().join(" ")); +}; + +presentScramble(); From 45f65b6d1c67836e007434845b00bdabb9cc4fff Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 18 Nov 2021 23:10:01 +0900 Subject: [PATCH 49/81] Add files via upload --- apps/a_battery_widget/a_battery_widget-pic.jpg | Bin 0 -> 66429 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/a_battery_widget/a_battery_widget-pic.jpg diff --git a/apps/a_battery_widget/a_battery_widget-pic.jpg b/apps/a_battery_widget/a_battery_widget-pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d9a4deccf352be3086e7d8d66200a436839c8da GIT binary patch literal 66429 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�y4n1O6P<0tvFKDNAjl02*?a;Bxc?7T-^SzHp2 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 Date: Thu, 18 Nov 2021 23:10:38 +0900 Subject: [PATCH 50/81] Update README.md --- apps/a_battery_widget/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/a_battery_widget/README.md b/apps/a_battery_widget/README.md index 7d3cc89b9..534931dd2 100644 --- a/apps/a_battery_widget/README.md +++ b/apps/a_battery_widget/README.md @@ -8,7 +8,7 @@ Show the current battery level and charging status in the top right of the clock * Blue when charging * 40 pixels wide -![](widget.png) +![](a_battery_widget-pic.jpg) ## Creator [@alainsaas](https://github.com/alainsaas) From fe27b58f97df5e6c623690374225aca16c54970d Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 14:17:26 +0000 Subject: [PATCH 51/81] New scramble on btn press --- apps/cubescramble/cube-scramble.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/cubescramble/cube-scramble.js b/apps/cubescramble/cube-scramble.js index c73ebc00e..72ed6c7e3 100644 --- a/apps/cubescramble/cube-scramble.js +++ b/apps/cubescramble/cube-scramble.js @@ -64,3 +64,8 @@ const presentScramble = () => { }; presentScramble(); + +setWatch(() => { + Bangle.buzz(); + presentScramble(); +}, BTN1, {repeat:true}); From 0e0086c5d8fec372d52285393da1ebeb3ac2d72c Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 14:25:32 +0000 Subject: [PATCH 52/81] Try to get scramble reset to work --- apps/cubescramble/cube-scramble.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/cubescramble/cube-scramble.js b/apps/cubescramble/cube-scramble.js index 72ed6c7e3..c0b1d11c3 100644 --- a/apps/cubescramble/cube-scramble.js +++ b/apps/cubescramble/cube-scramble.js @@ -63,9 +63,12 @@ const presentScramble = () => { E.showMessage(makeScramble().join(" ")); }; -presentScramble(); - -setWatch(() => { - Bangle.buzz(); +const init = () => { presentScramble(); -}, BTN1, {repeat:true}); + + setWatch(() => { + presentScramble(); + }, BTN1, {repeat:true}); +}; + +init(); From c630eaee8c9c998847522101ae90b5af1677ea74 Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 14:44:33 +0000 Subject: [PATCH 53/81] Update icon --- apps/cubescramble/cube-scramble-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cubescramble/cube-scramble-icon.js b/apps/cubescramble/cube-scramble-icon.js index 993034af6..69672b0b0 100644 --- a/apps/cubescramble/cube-scramble-icon.js +++ b/apps/cubescramble/cube-scramble-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("ABkBiASRuUiwITPiUiAAMhEpsVqIUDkQ/KCQNVAAMRCgexCZEdiITCqoqClERiIqGj8zmeRFIdRCIMdBQQ5EiYIBmcxHwkRBQgUImY/BCQIPBBQg/DgIMBCgcRyYFDBQehCgdRI4QTBjIPDyPTmc/NQpfCi1mswkEmIKBiOHu9xCgRNBCQIABsJPD6MRi93AAN4FQQUFtg/BIgMUoIUDu4UEHoQ/CCQNEAAMRCgY/CisUCgVuCYoUBKQN3vZqCgtUoImC81siIUDH4QLBjYUBgIUBiPGH4YUECQMYkUiCgMRqlEKglhH4QTC4QTBCgMNJgR/EKwIHBiOyiITCCgMDRINEmI+DNYUSB4OxCgrxBokzH4XhCYkiwIUDiIUBmMUycR9gSBqtRB4YUEuMJmc9inTegMVqoUJjFxhryBiMTmITCCgOCEgYWBX4NxgIUB24UG2RODiL+Cc4MTmfHuc9CghoCCYNRCgYGBmcXvc/CguxNwYUD45RBAwPZCgYRBCYQUDvUQEwJFCwYUCCYaDDBoMUoADBuICCioSDiOxIgcXewIUCu8Ru94+fBCYW3DYIUCCYIUBg4UBj0XvHDn6LDCgcRCgUQgIUBi1hw6XByJ1DCgNRswUBoMAgAMBi1mQIMzmITBCgVR8wUBCYQABCgVhCg0R41mCgMQCgcMCgNmj4UGBII1BCYYABjwJBsPTCgV7iXBBIQTFgEBBQUbnqaCkWxBII8EAAcOCgNEj+HiNykWBFBAACSgKHBiMSkQUBtwoIIAQUBCoITBkUhCZQVCCgNECgWwCZYABbgQUCCZoqDCYI8MCouCkITPIAUSCaIqBHhQ=")) +require("heatshrink").decompress(atob("3YANB54AFgf/+ULCqOw/4ACC6EAxEAC4fwCp2YxGIwEPC4XxGBewqEICwIABGAUQRJWwp3u9xFBAAQUCr3u8gwHgAVBC4ugCwIKDC5nghGAgEODoIKEC44PBBgUAggFDBQZIHhAMB8j4CMgQHBgoDBoB5H3BuC5nM4AqDJAIABgnd7owF3GAhgWBAAJbD8oWBCoIABoAXLqBIBCoNmC4nQC4xGCJAQVBs93u9ghoYDJAmwwFwFwYWBCoIABuBeC7oLBGAmBu0MFgMFDIMHDAZIB6AhBiCoFBgIVBJAQXFAAMv//wI4kBKoJgDSIIVBuwVBgP/AAIXEJoNnuCRFg9gCoPwh4XHTwMHvxHDPQc///xC5PgC4PgCoPFLIQSC+QXEVAb9CunggpYCwMDC4/9C4bnBqFldQWIAAIXH+FNC4deJAMAC4IWCxECC4nybQQXDh3u8vQC4qiEHILxCC4ewF4PdJQIXDO4UwgEYC42wgEOC4NeoAXE+IsBhAFBC4u16EAC4PV8AWCwCpCCwIXDoBGD7rPB7vUC4UQCwRmDBoPQuwXE6ghCgAVEgsBC4fQu4XFD4MN7tE8oWD7oXEu4XE3YXCqHdovuoCgDI4WBC4VwC4YsB6HMgjBBYQKHCC4OKhnAC4K+DJAQXB4DxB9wfBC4cFBYN3tYWDAAO9C4PMC48ABQPAIogADqAMCpwXFhgKCIohJErgNBgoXDqHxC4QWIAAINCg1errmBh4XC4AWJAAIwBg9gonQgf/+QXBFxRJCC4N2OYP/C4VQCxZJCg61Bh4XB+cACxoABC4VvC4PxCx5JBC4k7C6AwCuf/+AWRAANnuX/RZhJIuBFSAAaLMA=")); From 40d954dc709e5a658df66ab10877e53c9a035401 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 18 Nov 2021 15:57:07 +0100 Subject: [PATCH 54/81] Minor changes --- apps/lcars/bg.png | Bin 1685 -> 1497 bytes apps/lcars/lcars.app.js | 48 +++++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/apps/lcars/bg.png b/apps/lcars/bg.png index 6a95ec69924d9169b88b9fa8136b048d50997e34..1ee4297c642db661ff1b3441ef7ba950eec72d70 100644 GIT binary patch literal 1497 zcmbW1`#Tc~7{@n@xt%UyUQNs?AsxA# zHa$wwL<{8w(?NLPZvM zgqGC!_1lo1NR(<*ycWkd+gJ$>hHoq(#fk) zLr#*bQ#P23x1u?)>qU$z&|pPITm7o2V(%y5%6q3FiXEm1)+OB-agv*xxqU*W?+2_&E#{>qVmBG75RC=YK~v7|*o)k1$aVa205hn>OKf3wHA zo@6FsSXuGW*yy)=-W}e7<~Z5p^z-C+@BCe#A3KDuf{xgnfTE3EJN; z6eOh>E>#*jk}WZCo2mpR$UGKP)j>E80Q5I?hj@3=b4vRk63;BOHAZeUjeT8dx$IEV zvN1lIn9-ezu)xF?giA+@ZLjStm1hj;zo6$B6tT@~ONSc=o5rO#D!YqE3T*3z-}Uf! z)Ez>w{wLfw!|!g!N_(Cpf1M}^nDjJB3Fj`~!#}s)d2ocMC0*QVVq6DIj}=g#z#E<+ zPJ?)w4y;q*y&B+{K5k2=D+IbPPL=5NjqMWC~IeV&wSi$Akn9<&6hociQ&Q> zsOPIaOH-P!B{#aXB5^TX{a)_7i|Fa}PWoEJQ4p@h3ck8`*$l!|aklqs{r6NgkSO?H zF91ngTF4AtL*J$5keYO^7uKxKegzG!Z@e3L+Kn4D2OKL$r_#AH?AGLuVwg$46U;P} zK@IycRst&NyX=gni4u)N1_?(yW}3*LKlA5!RIPYz@Xu5H)0qF-LD=+FDdUpmKxTdO z4!ds_byd*X`<4?CM)~(iIGF9a=h=KWiyGJA`^T|_@J}z>Hzugiu0>Appt7KkfGjMY z@p=C-jTQ8qmFgd%?3=`iS6Vo>N|C3}hBcku?>$@tVcc`W^bvAB_n4X!V0mcelHq=~ z*NT1-l+cwN6giI0IY%rb)-8@a(ES2iELz1`zes7ThV~Gv-bLBkI@&$7|6;XipMx-; z8ylfPQR)r06*a?$56X~*y1M7#A{!|7JR>9Yp3>8G#OG}hyFuAkkc#gHKzU+3>fJ)G F{0C>+p!fg) literal 1685 zcmb_cS5OlO5KTf!q>3USRYVj;3?ATN2_@2k^rn;}u^>7EBGphrLu?#0vHrSZ z$`UiC(nMG)d*5wBU@TQZLMCI+eXy;N3?kWdZ-SO-uadg@^81$i;HwGY(8E~{&;t-$ zll4qk-DuWHiU? zcjWswZ*fvwN^uIBDsOFXem(D*TV}x-1`#s@%X%v!;qq;asgExTO}rm>t@T{y9K+d9 zUoXgiW$7N*i5d$1#=XNSQMIO4u5~4ZOtWLmyaKgHo2R5L~1cwZr-?OYgblBQSf%=#w!h{FMpPJS7yHLgT?no zN~zeLWS<@%m)>TsewZz`ek<8NTlrfA@-Pq@vbm(uv_1svAE<_x*;iw7pQquvguMN( zyj-w6wRY=O7dn(TCLlXTf&t~9YZV`sUEynRJVNsL&gSqo?_Rj85_9^MKIq0Z{J10V%~@z-(O*TlztL={8EI-=rOxt6x@?i zowAAvVD`!_O=n(;zHGr$r#fJdVx``JyE4EE1PC*xvmeYPc-=#ffm#oZmT{nQ(KAf$ z0{)RcwC2+YLe}Z{qm%BY;cbM7MSG!dGHz1lHueb6oswOlE)83Ti}sLgK*ai|EpGS1 zo(gwq`_aVXckAk`V;Al78_ZE?61aXWR7x#XO-dd0ALPi8G+Y{_zl;*-HD5`0L(Za` zA-U;Tc*)Xs3oNr{zh*tQa)QyV{zkr)bnT&`IGBv(u9}94B*w7De%`mIVxkI3X70*f@t@#jocmrGDxD z9v$?p&Yk6VO4fWVW$mls0ELYmW$N)+G`?1O%zgYJL{RxVVquH6ZiJPr>qNBPl0=#; gbQyfy#bjd#Jc>$yoGFM!3Z5JQVQyzu21mvI4Q8+{ // Show launcher when middle button pressed Bangle.setUI("clock"); -// Currently we don't load widgets an use the full screen -// Bangle.loadWidgets(); -// Bangle.drawWidgets(); \ No newline at end of file +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file From fc4bfed8480c44f2b458c706f0806b9a453c724f Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 14:57:18 +0000 Subject: [PATCH 55/81] Add readme and bangle js 1 support --- apps.json | 4 +++- apps/cubescramble/ChangeLog | 2 +- apps/cubescramble/README.md | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 apps/cubescramble/README.md diff --git a/apps.json b/apps.json index 213ceb882..3f91aba99 100644 --- a/apps.json +++ b/apps.json @@ -547,7 +547,9 @@ "description": "A random scramble generator for the 3x3 Rubik's cube", "icon": "cube-scramble.png", "tags": "", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS","BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, "storage": [ {"name":"cubescramble.app.js","url":"cube-scramble.js"}, {"name":"cubescramble.img","url":"cube-scramble-icon.js","evaluate":true} diff --git a/apps/cubescramble/ChangeLog b/apps/cubescramble/ChangeLog index 7d48be036..46b4dab7c 100644 --- a/apps/cubescramble/ChangeLog +++ b/apps/cubescramble/ChangeLog @@ -1 +1 @@ -0.01: Cube Scramble! +0.01: Cube Scramble has arrived! diff --git a/apps/cubescramble/README.md b/apps/cubescramble/README.md new file mode 100644 index 000000000..eb1f8138c --- /dev/null +++ b/apps/cubescramble/README.md @@ -0,0 +1,14 @@ +# Cube Scramble + +A random scramble generator for the 3x3 Rubik's cube + +## Future features + +I'm keen to complete this project with + +* Add a timer +* Add the ability for times to be stored and exported + +## Author + +Nathan Lisgo https://github.com/nlisgo From c729b4f232aba96344d6cfd5566df2c34d36677b Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 15:03:03 +0000 Subject: [PATCH 56/81] Ready for release --- apps/cubescramble/ChangeLog | 2 +- apps/cubescramble/README.md | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/cubescramble/ChangeLog b/apps/cubescramble/ChangeLog index 46b4dab7c..28f11c1c7 100644 --- a/apps/cubescramble/ChangeLog +++ b/apps/cubescramble/ChangeLog @@ -1 +1 @@ -0.01: Cube Scramble has arrived! +0.01: Initial Release diff --git a/apps/cubescramble/README.md b/apps/cubescramble/README.md index eb1f8138c..779e32489 100644 --- a/apps/cubescramble/README.md +++ b/apps/cubescramble/README.md @@ -9,6 +9,10 @@ I'm keen to complete this project with * Add a timer * Add the ability for times to be stored and exported -## Author +## Requests -Nathan Lisgo https://github.com/nlisgo +Please reach out if you have feature requests or notice bugs. + +## Creator + +Made by [Nathan Lisgo](https://github.com/nlisgo) From deefd0a1d008e029a5b9d111091d259def23b551 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 18 Nov 2021 16:07:16 +0100 Subject: [PATCH 57/81] Added lcars clock --- apps.json | 12 ++++++++++++ apps/lcars/lcars-icon.js | 1 + apps/lcars/lcars.app.info | 5 ----- apps/lcars/lcars.png | Bin 540 -> 2700 bytes 4 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 apps/lcars/lcars-icon.js delete mode 100644 apps/lcars/lcars.app.info diff --git a/apps.json b/apps.json index f307a6feb..760471dc4 100644 --- a/apps.json +++ b/apps.json @@ -4215,5 +4215,17 @@ { "name": "qalarm.wid.js", "url": "widget.js" } ], "data": [{ "name": "qalarm.json" }] + }, + { "id": "lcars", + "name": "LCARS Clock", + "shortName":"LCARS", + "icon": "lcars.png", + "version":"0.01", + "description": "Library Computer Access Retrieval System (LCARS) clock.", + "tags": "", + "storage": [ + {"name":"lcars-icon.js","url":"app.js"}, + {"name":"lcars.app.js","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/lcars/lcars-icon.js b/apps/lcars/lcars-icon.js new file mode 100644 index 000000000..5734cdefd --- /dev/null +++ b/apps/lcars/lcars-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkE/4AKj4MLABPxgIXVkEAl4WT+ZYBgYXT+AXBJCkQRIRISIwRIU+IXDJCSNBAAZIRdQsPCx/yC4sCC58wC4sACpsyUgYAEiU/CxUxCo6SDPRMhCxSTKFpYAEJQqJDiR2HAAJpCborQCibVGAAcTBQUff4sDAoKPIbIPzBYIwDDwIFDLhLZBLAQwB+Z/EdoynEcYYcBIwIuDJgSNKFYQbCMgfwXxpbBl5kBVoamJRggmBj4XBVYyQJKwcDYgqmJWoiGBC4wWKRYQXIQASoMC4RfEXxEBAgZfDh6SCXxMCn5oDUAK8CAQJnCC40BCIIJDFAIdBl7vEawy5CNIcfKwITCBwbWFRATJEj4DBIYQTBHwIXFfAZIDPgRzCRYUCdwgjCWQ7TEFgp0DAAgjDFwQhCTYYuH/8yBoQKGaosjF4UzkQjDHI//mLuHKIwWGNYoVIN4IXKTYQVFkZWCC45gCl/zmUiiMRkUzBwbIFC4hSIXAgXJj4XL+IXHfYIJHABvxZAwXQe4gAlA==")) diff --git a/apps/lcars/lcars.app.info b/apps/lcars/lcars.app.info deleted file mode 100644 index ff0cf5018..000000000 --- a/apps/lcars/lcars.app.info +++ /dev/null @@ -1,5 +0,0 @@ -require("Storage").write("lcars.info",{ - "name":"LCARS", - "type":"clock", - "src":"lcars.app.js" -}); diff --git a/apps/lcars/lcars.png b/apps/lcars/lcars.png index f40ddd39430ad87c91636e8db704068f2f472d41..2f808ac785ef11ffebb21960605787f5671cf458 100644 GIT binary patch delta 2676 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 pk8w*Vw Date: Thu, 18 Nov 2021 16:09:19 +0100 Subject: [PATCH 58/81] Include type and tags --- apps.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 760471dc4..421a0f2ff 100644 --- a/apps.json +++ b/apps.json @@ -4221,8 +4221,10 @@ "shortName":"LCARS", "icon": "lcars.png", "version":"0.01", + "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", - "tags": "", + "type": "clock", + "tags": "clock", "storage": [ {"name":"lcars-icon.js","url":"app.js"}, {"name":"lcars.app.js","url":"app-icon.js","evaluate":true} From 5761aa35b7371a21e1b83cb20279f1269466af38 Mon Sep 17 00:00:00 2001 From: nlisgo Date: Thu, 18 Nov 2021 15:15:04 +0000 Subject: [PATCH 59/81] Remove semi-colon --- apps/cubescramble/cube-scramble-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cubescramble/cube-scramble-icon.js b/apps/cubescramble/cube-scramble-icon.js index 69672b0b0..32ea10836 100644 --- a/apps/cubescramble/cube-scramble-icon.js +++ b/apps/cubescramble/cube-scramble-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("3YANB54AFgf/+ULCqOw/4ACC6EAxEAC4fwCp2YxGIwEPC4XxGBewqEICwIABGAUQRJWwp3u9xFBAAQUCr3u8gwHgAVBC4ugCwIKDC5nghGAgEODoIKEC44PBBgUAggFDBQZIHhAMB8j4CMgQHBgoDBoB5H3BuC5nM4AqDJAIABgnd7owF3GAhgWBAAJbD8oWBCoIABoAXLqBIBCoNmC4nQC4xGCJAQVBs93u9ghoYDJAmwwFwFwYWBCoIABuBeC7oLBGAmBu0MFgMFDIMHDAZIB6AhBiCoFBgIVBJAQXFAAMv//wI4kBKoJgDSIIVBuwVBgP/AAIXEJoNnuCRFg9gCoPwh4XHTwMHvxHDPQc///xC5PgC4PgCoPFLIQSC+QXEVAb9CunggpYCwMDC4/9C4bnBqFldQWIAAIXH+FNC4deJAMAC4IWCxECC4nybQQXDh3u8vQC4qiEHILxCC4ewF4PdJQIXDO4UwgEYC42wgEOC4NeoAXE+IsBhAFBC4u16EAC4PV8AWCwCpCCwIXDoBGD7rPB7vUC4UQCwRmDBoPQuwXE6ghCgAVEgsBC4fQu4XFD4MN7tE8oWD7oXEu4XE3YXCqHdovuoCgDI4WBC4VwC4YsB6HMgjBBYQKHCC4OKhnAC4K+DJAQXB4DxB9wfBC4cFBYN3tYWDAAO9C4PMC48ABQPAIogADqAMCpwXFhgKCIohJErgNBgoXDqHxC4QWIAAINCg1errmBh4XC4AWJAAIwBg9gonQgf/+QXBFxRJCC4N2OYP/C4VQCxZJCg61Bh4XB+cACxoABC4VvC4PxCx5JBC4k7C6AwCuf/+AWRAANnuX/RZhJIuBFSAAaLMA=")); +require("heatshrink").decompress(atob("3YANB54AFgf/+ULCqOw/4ACC6EAxEAC4fwCp2YxGIwEPC4XxGBewqEICwIABGAUQRJWwp3u9xFBAAQUCr3u8gwHgAVBC4ugCwIKDC5nghGAgEODoIKEC44PBBgUAggFDBQZIHhAMB8j4CMgQHBgoDBoB5H3BuC5nM4AqDJAIABgnd7owF3GAhgWBAAJbD8oWBCoIABoAXLqBIBCoNmC4nQC4xGCJAQVBs93u9ghoYDJAmwwFwFwYWBCoIABuBeC7oLBGAmBu0MFgMFDIMHDAZIB6AhBiCoFBgIVBJAQXFAAMv//wI4kBKoJgDSIIVBuwVBgP/AAIXEJoNnuCRFg9gCoPwh4XHTwMHvxHDPQc///xC5PgC4PgCoPFLIQSC+QXEVAb9CunggpYCwMDC4/9C4bnBqFldQWIAAIXH+FNC4deJAMAC4IWCxECC4nybQQXDh3u8vQC4qiEHILxCC4ewF4PdJQIXDO4UwgEYC42wgEOC4NeoAXE+IsBhAFBC4u16EAC4PV8AWCwCpCCwIXDoBGD7rPB7vUC4UQCwRmDBoPQuwXE6ghCgAVEgsBC4fQu4XFD4MN7tE8oWD7oXEu4XE3YXCqHdovuoCgDI4WBC4VwC4YsB6HMgjBBYQKHCC4OKhnAC4K+DJAQXB4DxB9wfBC4cFBYN3tYWDAAO9C4PMC48ABQPAIogADqAMCpwXFhgKCIohJErgNBgoXDqHxC4QWIAAINCg1errmBh4XC4AWJAAIwBg9gonQgf/+QXBFxRJCC4N2OYP/C4VQCxZJCg61Bh4XB+cACxoABC4VvC4PxCx5JBC4k7C6AwCuf/+AWRAANnuX/RZhJIuBFSAAaLMA=")) From 68129be53b04cd5582a772b7f2336b45ce9e1432 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 18 Nov 2021 16:16:04 +0100 Subject: [PATCH 60/81] Renamings --- apps.json | 4 ++-- apps/lcars/{bg.png => background.png} | Bin apps/lcars/{lcars-icon.js => lcars.icon.js} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename apps/lcars/{bg.png => background.png} (100%) rename apps/lcars/{lcars-icon.js => lcars.icon.js} (100%) diff --git a/apps.json b/apps.json index 421a0f2ff..6afd3e578 100644 --- a/apps.json +++ b/apps.json @@ -4226,8 +4226,8 @@ "type": "clock", "tags": "clock", "storage": [ - {"name":"lcars-icon.js","url":"app.js"}, - {"name":"lcars.app.js","url":"app-icon.js","evaluate":true} + {"name":"lcars.app.js","url":"lcars.app.js"}, + {"name":"lcars.icon.js","url":"lcars.icon.js","evaluate":true} ] } ] diff --git a/apps/lcars/bg.png b/apps/lcars/background.png similarity index 100% rename from apps/lcars/bg.png rename to apps/lcars/background.png diff --git a/apps/lcars/lcars-icon.js b/apps/lcars/lcars.icon.js similarity index 100% rename from apps/lcars/lcars-icon.js rename to apps/lcars/lcars.icon.js From 67e80d18709f8af53193108bd7b38803b450111f Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 18 Nov 2021 16:20:26 +0100 Subject: [PATCH 61/81] Updated icon design --- apps/lcars/lcars.icon.js | 2 +- apps/lcars/lcars.png | Bin 2700 -> 1823 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.icon.js b/apps/lcars/lcars.icon.js index 5734cdefd..c404728e0 100644 --- a/apps/lcars/lcars.icon.js +++ b/apps/lcars/lcars.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwkE/4AKj4MLABPxgIXVkEAl4WT+ZYBgYXT+AXBJCkQRIRISIwRIU+IXDJCSNBAAZIRdQsPCx/yC4sCC58wC4sACpsyUgYAEiU/CxUxCo6SDPRMhCxSTKFpYAEJQqJDiR2HAAJpCborQCibVGAAcTBQUff4sDAoKPIbIPzBYIwDDwIFDLhLZBLAQwB+Z/EdoynEcYYcBIwIuDJgSNKFYQbCMgfwXxpbBl5kBVoamJRggmBj4XBVYyQJKwcDYgqmJWoiGBC4wWKRYQXIQASoMC4RfEXxEBAgZfDh6SCXxMCn5oDUAK8CAQJnCC40BCIIJDFAIdBl7vEawy5CNIcfKwITCBwbWFRATJEj4DBIYQTBHwIXFfAZIDPgRzCRYUCdwgjCWQ7TEFgp0DAAgjDFwQhCTYYuH/8yBoQKGaosjF4UzkQjDHI//mLuHKIwWGNYoVIN4IXKTYQVFkZWCC45gCl/zmUiiMRkUzBwbIFC4hSIXAgXJj4XL+IXHfYIJHABvxZAwXQe4gAlA==")) +require("heatshrink").decompress(atob("mEwgeevPnAQsc+fPngCE+/fvoCEvAbIA4/AgFzEZwRBjwjNvBUBEZ3eCIMOEZtwCIMBEZuARYU5EZecTocHEZf0CIcBEbvgaggjKTwIAEbQpoHAAiSEeoYQHJQr1CCBJKEIgcBI4xKFaIdt3AOFgfuAYMeEYLRBj1pLQ4ICuYjBAgPbtoRHhu3AYN5VoMGzVpI49502AgPPVoM27dsK48N23cgE5CgOmzVoCI4LBzCSB8EP2wjJgILBAYMAhIjBsAjJzVwg47C7YRJEYhfBEZXmEZ53CI4q2BEAiVCkwjCNYaMGboQjDkBfDCAbdB04EBgyPDC4YAD/dt2wRCHIM5njXCCAcHboOmCIQ0B5/nfYT6DFIIjBeAcOvM8+EAjitFEYJEBAANzEYOeeowjCFgUDzwjB+YrDgAgBEYWcA4Mc+YjCvAQCgftEANuDIYOBEYXPNwIAIg4OCCgXkCBEOEZDvBEAhEB4AjF/inB8+OJQOOvILBoAjGU4IFDAQYjGbQIdCAQt4EY0DEZACDEYceEZACDC4bLBEZwCO")) diff --git a/apps/lcars/lcars.png b/apps/lcars/lcars.png index 2f808ac785ef11ffebb21960605787f5671cf458..167352ef4bd6db8c6de6bc845396944af7bcc040 100644 GIT binary patch delta 1792 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 iw Date: Thu, 18 Nov 2021 16:26:34 +0100 Subject: [PATCH 62/81] Added readme and changelog. Fixed invalid img. --- apps.json | 2 +- apps/lcars/ChangeLog | 1 + apps/lcars/README.md | 8 ++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 apps/lcars/ChangeLog create mode 100644 apps/lcars/README.md diff --git a/apps.json b/apps.json index 6afd3e578..166f1e4f9 100644 --- a/apps.json +++ b/apps.json @@ -4227,7 +4227,7 @@ "tags": "clock", "storage": [ {"name":"lcars.app.js","url":"lcars.app.js"}, - {"name":"lcars.icon.js","url":"lcars.icon.js","evaluate":true} + {"name":"lcars.img","url":"lcars.icon.js","evaluate":true} ] } ] diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog new file mode 100644 index 000000000..c7ec09d30 --- /dev/null +++ b/apps/lcars/ChangeLog @@ -0,0 +1 @@ +0.01: Launch app diff --git a/apps/lcars/README.md b/apps/lcars/README.md new file mode 100644 index 000000000..2993f8dd2 --- /dev/null +++ b/apps/lcars/README.md @@ -0,0 +1,8 @@ +# Lazy clock + +A simple LCARS inspired clock that shows: + * Current time + * Current date + * Battery level + * Steps + From a0d14f5e58b94ef0b5c4a4f2d404e733da91284d Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 18 Nov 2021 16:38:03 +0100 Subject: [PATCH 63/81] Typo --- apps/lcars/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 2993f8dd2..fdce30c1b 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,4 +1,4 @@ -# Lazy clock +# LCARS clock A simple LCARS inspired clock that shows: * Current time From bc813feaa3545042c741bbf104a50998bf03fd32 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Thu, 18 Nov 2021 15:09:00 +0100 Subject: [PATCH 64/81] Use getWidth(), getHeight() instead of fixed values --- apps/pomodo/pomodoro.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/pomodo/pomodoro.js b/apps/pomodo/pomodoro.js index 3e11739da..d3cc0e089 100644 --- a/apps/pomodo/pomodoro.js +++ b/apps/pomodo/pomodoro.js @@ -119,7 +119,7 @@ class StartedState extends State { } draw () { - drawCounter(this.timeCounter, 120, 120); + drawCounter(this.timeCounter, g.getWidth() / 2, g.getHeight() / 2); } init () { @@ -220,8 +220,8 @@ function drawCounter (currentValue, x, y) { return; } - x = x || 120; - y = y || 120; + x = x || g.getWidth() / 2; + y = y || g.getHeight() / 2; let minutes = 0; let seconds = 0; From 3dba1342e8010cda583ed892d3a9143fc2a8dad0 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Thu, 18 Nov 2021 15:43:23 +0100 Subject: [PATCH 65/81] Use Adapter to generalize Buttons beween devices --- apps/pomodo/pomodoro.js | 103 ++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 31 deletions(-) diff --git a/apps/pomodo/pomodoro.js b/apps/pomodo/pomodoro.js index d3cc0e089..4ece65d1b 100644 --- a/apps/pomodo/pomodoro.js +++ b/apps/pomodo/pomodoro.js @@ -11,8 +11,9 @@ const STATES = { var counterInterval; class State { - constructor (state) { + constructor (state, device) { this.state = state; + this.device = device; this.next = null; } @@ -47,8 +48,8 @@ class State { } class InitState extends State { - constructor (time) { - super(STATES.INIT); + constructor (device) { + super(STATES.INIT, device); this.timeCounter = parseInt(storage.read(".pomodo") || DEFAULT_TIME, 10); } @@ -58,7 +59,7 @@ class InitState extends State { } setButtons () { - setWatch(() => { + this.device.setBTN1(() => { if (this.timeCounter + 300 > 3599) { this.timeCounter = 3599; } else { @@ -67,23 +68,23 @@ class InitState extends State { this.draw(); - }, BTN1, { repeat: true }); + }); - setWatch(() => { + this.device.setBTN3(() => { if (this.timeCounter - 300 > 0) { this.timeCounter -= 300; this.draw(); } - }, BTN3, { repeat: true }); + }); - setWatch(() => { + this.device.setBTN4(() => { if (this.timeCounter - 60 > 0) { this.timeCounter -= 60; this.draw(); } - }, BTN4, { repeat: true }); + }); - setWatch(() => { + this.device.setBTN5(() => { if (this.timeCounter + 60 > 3599) { this.timeCounter = 3599; } else { @@ -92,15 +93,15 @@ class InitState extends State { this.draw(); - }, BTN5, { repeat: true }); + }); - setWatch(() => { + this.device.setBTN2(() => { this.saveTime(); - const startedState = new StartedState(this.timeCounter); + const startedState = new StartedState(this.timeCounter, this.device); this.setNext(startedState); this.next.go(); - }, BTN2, { repeat: true }); + }); } draw () { @@ -112,8 +113,8 @@ class InitState extends State { } class StartedState extends State { - constructor (timeCounter) { - super(STATES.STARTED); + constructor (timeCounter, buttons) { + super(STATES.STARTED, buttons); this.timeCounter = timeCounter; } @@ -137,15 +138,15 @@ class StartedState extends State { this.draw(); } - const doneState = new DoneState(); + const doneState = new DoneState(this.device); this.setNext(doneState); counterInterval = setInterval(countDown.bind(this), 1000); } } class BreakState extends State { - constructor () { - super(STATES.BREAK); + constructor (buttons) { + super(STATES.BREAK, buttons); } draw () { @@ -153,32 +154,33 @@ class BreakState extends State { } init () { - const startedState = new StartedState(TIME_BREAK); + const startedState = new StartedState(TIME_BREAK, this.device); this.setNext(startedState); this.next.go(); } } + class DoneState extends State { - constructor () { - super(STATES.DONE); + constructor (device) { + super(STATES.DONE, device); } setButtons () { - setWatch(() => { - const initState = new InitState(); + this.device.setBTN1(() => { + const initState = new InitState(this.device); clearTimeout(this.timeout); initState.go(); - }, BTN1, { repeat: true }); + }); - setWatch(() => { - const breakState = new BreakState(); + this.device.setBTN3(() => { + const breakState = new BreakState(this.device); clearTimeout(this.timeout); breakState.go(); - }, BTN3, { repeat: true }); + }); - setWatch(() => { - }, BTN2, { repeat: true }); + this.device.setBTN2(() => { + }); } draw () { @@ -215,6 +217,42 @@ class DoneState extends State { } } +class Bangle1 { + setBTN1(callback) { + setWatch(callback, BTN1, { repeat: true }); + } + + setBTN2(callback) { + setWatch(callback, BTN2, { repeat: true }); + } + + setBTN3(callback) { + setWatch(callback, BTN3, { repeat: true }); + } + + setBTN4(callback) { + setWatch(callback, BTN4, { repeat: true }); + } + + setBTN5(callback) { + setWatch(callback, BTN5, { repeat: true }); + } +} + +class Bangle2 { + setBTN1(callback) { } + + setBTN2(callback) { + setWatch(callback, BTN1, { repeat: true }); + } + + setBTN3(callback) { } + + setBTN4(callback) { } + + setBTN5(callback) { } +} + function drawCounter (currentValue, x, y) { if (currentValue < 0) { return; @@ -249,7 +287,10 @@ function drawCounter (currentValue, x, y) { } function init () { - const initState = new InitState(); + device = (process.env.HWVERSION==1 + ? new Bangle1() + : new Bangle2()); + const initState = new InitState(device); initState.go(); } From f035f36ba93d2578b1af37957ce1321ac49f6265 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Thu, 18 Nov 2021 16:27:09 +0100 Subject: [PATCH 66/81] Use showPromt() instead of own implementation as it works with Bangle.js2 --- apps/pomodo/pomodoro.js | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/apps/pomodo/pomodoro.js b/apps/pomodo/pomodoro.js index 4ece65d1b..dafc04a33 100644 --- a/apps/pomodo/pomodoro.js +++ b/apps/pomodo/pomodoro.js @@ -168,15 +168,9 @@ class DoneState extends State { setButtons () { this.device.setBTN1(() => { - const initState = new InitState(this.device); - clearTimeout(this.timeout); - initState.go(); }); this.device.setBTN3(() => { - const breakState = new BreakState(this.device); - clearTimeout(this.timeout); - breakState.go(); }); this.device.setBTN2(() => { @@ -185,14 +179,15 @@ class DoneState extends State { draw () { g.clear(); - g.setFont("6x8", 2); - g.setFontAlign(0, 0, 3); - g.drawString("AGAIN", 230, 50); - g.drawString("BREAK", 230, 190); - g.setFont("Vector", 45); - g.setFontAlign(-1, -1); - - g.drawString('You\nare\na\nhero!', 50, 40); + E.showPrompt("You are a hero!", { + buttons : {"AGAIN":1,"BREAK":2} + }).then((v) => { + var nextSate = (v == 1 + ? new InitState(this.device) + : new BreakState(this.device)); + clearTimeout(this.timeout); + nextSate.go(); + }); } init () { From f5317862c857172e73ce8114498bad6836e1e151 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Thu, 18 Nov 2021 16:40:11 +0100 Subject: [PATCH 67/81] Use touch to set duration on Banglejs2 --- apps/pomodo/pomodoro.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/pomodo/pomodoro.js b/apps/pomodo/pomodoro.js index dafc04a33..96d2e8d6a 100644 --- a/apps/pomodo/pomodoro.js +++ b/apps/pomodo/pomodoro.js @@ -235,13 +235,25 @@ class Bangle1 { } class Bangle2 { - setBTN1(callback) { } + setBTN1(callback) { + Bangle.on('touch', function(zone, e) { + if (e.y < g.getHeight() / 2) { + callback(); + } + }); + } setBTN2(callback) { setWatch(callback, BTN1, { repeat: true }); } - setBTN3(callback) { } + setBTN3(callback) { + Bangle.on('touch', function(zone, e) { + if (e.y > g.getHeight() / 2) { + callback(); + } + }); + } setBTN4(callback) { } From 08383611c10004cfd42be679eb763f45b4963c92 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Thu, 18 Nov 2021 16:45:17 +0100 Subject: [PATCH 68/81] Chore: New pomodo release --- apps.json | 4 ++-- apps/pomodo/CHANGELOG.md | 4 ++++ apps/pomodo/ChangeLog | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 148833678..6ce1c442d 100644 --- a/apps.json +++ b/apps.json @@ -1420,12 +1420,12 @@ { "id": "pomodo", "name": "Pomodoro", - "version": "0.01", + "version": "0.02", "description": "A simple pomodoro timer.", "icon": "pomodoro.png", "type": "app", "tags": "pomodoro,cooking,tools", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ {"name":"pomodo.app.js","url":"pomodoro.js"}, diff --git a/apps/pomodo/CHANGELOG.md b/apps/pomodo/CHANGELOG.md index b8c5dd621..b4667aff8 100644 --- a/apps/pomodo/CHANGELOG.md +++ b/apps/pomodo/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 2021-11-18 + +- [Feature] Ported to Banglejs2 + ## 2019-11-27 - [Feature] App now saves the last interval value diff --git a/apps/pomodo/ChangeLog b/apps/pomodo/ChangeLog index 5560f00bc..3630ae7b6 100644 --- a/apps/pomodo/ChangeLog +++ b/apps/pomodo/ChangeLog @@ -1 +1,2 @@ +0.02: Ported to Banglejs2. 0.01: New App! From 54e313bf3bae3802e5c2ac6d5feca37cd7525e21 Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 21:54:27 +0100 Subject: [PATCH 69/81] 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 70/81] 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 71/81] 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 72/81] 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("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")) From a88c59a33959af68575b88cd860ea3e11d35f79c Mon Sep 17 00:00:00 2001 From: Vingelar Date: Thu, 18 Nov 2021 22:41:19 +0100 Subject: [PATCH 73/81] 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 74/81] 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 75/81] 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 76/81] 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 77/81] 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 d852dbe4f06994c429f30764dc31b6b376ef7a3b Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 19 Nov 2021 08:35:36 +0000 Subject: [PATCH 78/81] update readme --- README.md | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 527cb1188..ac80b8270 100644 --- a/README.md +++ b/README.md @@ -49,25 +49,25 @@ easily distinguish between file types, we use the following: ## Adding your app to the menu -* Come up with a unique (all lowercase, no spaces) name, we'll assume `7chname`. Bangle.js +* Come up with a unique (all lowercase, no spaces) name, we'll assume `myappid`. Bangle.js is limited to 28 char filenames and appends a file extension (eg `.js`) so please try and keep filenames short to avoid overflowing the buffer. -* Create a folder called `apps/`, lets assume `apps/7chname` +* Create a folder called `apps/`, lets assume `apps/myappid` * We'd recommend that you copy files from 'Example Applications' (below) as a base, or... -* `apps/7chname/app.png` should be a 48px icon -* Use http://www.espruino.com/Image+Converter to create `apps/7chname/app-icon.js`, using a 1 bit, 4 bit or 8 bit Web Palette "Image String" +* `apps/myappid/app.png` should be a 48px icon +* Use http://www.espruino.com/Image+Converter to create `apps/myappid/app-icon.js`, using a 1 bit, 4 bit or 8 bit Web Palette "Image String" * Create an entry in `apps.json` as follows: ``` -{ "id": "7chname", +{ "id": "myappid", "name": "My app's human readable name", "shortName" : "Short Name", "icon": "app.png", "description": "A detailed description of my great app", "tags": "", "storage": [ - {"name":"7chname.app.js","url":"app.js"}, - {"name":"7chname.img","url":"app-icon.js","evaluate":true} + {"name":"myappid.app.js","url":"app.js"}, + {"name":"myappid.img","url":"app-icon.js","evaluate":true} ], }, ``` @@ -95,12 +95,12 @@ Be aware of the delay between commits and updates on github.io - it can take a f Using the 'Storage' icon in [the Web IDE](https://www.espruino.com/ide/) (4 discs), upload your files into the places described in your JSON: -* `app-icon.js` -> `7chname.img` +* `app-icon.js` -> `myappid.img` Now load `app.js` up in the editor, and click the down-arrow to the bottom right of the `Send to Espruino` icon. Click `Storage` and then either choose -`7chname.app.js` (if you'd uploaded your app previously), or `New File` -and then enter `7chname.app.js` as the name. +`myappid.app.js` (if you'd uploaded your app previously), or `New File` +and then enter `myappid.app.js` as the name. Now, clicking the `Send to Espruino` icon will load the app directly into Espruino **and** will automatically run it. @@ -115,10 +115,13 @@ and set it to `Load default application`. ## Example Applications To make the process easier we've come up with some example applications that you can use as a base -when creating your own. Just come up with a unique 7 character name, copy `apps/_example_app` -or `apps/_example_widget` to `apps/7chname`, and add `apps/_example_X/add_to_apps.json` to +when creating your own. Just come up with a unique name (ideally lowercase, under 20 chars), copy `apps/_example_app` +or `apps/_example_widget` to `apps/myappid`, and add `apps/_example_X/add_to_apps.json` to `apps.json`. +**Note:** the max filename length is 28 chars, so we suggest an app ID of under +20 so that when `.app.js`/etc gets added to the end the filename isn't cropped. + **If you're making a widget** please start the name with `wid` to make it easy to find! @@ -192,8 +195,8 @@ and which gives information about the app for the Launcher. ``` { "name":"Short Name", // for Bangle.js menu - "icon":"*7chname", // for Bangle.js menu - "src":"-7chname", // source file + "icon":"*myappid", // for Bangle.js menu + "src":"-myappid", // source file "type":"widget/clock/app/bootloader", // optional, default "app" // if this is 'widget' then it's not displayed in the menu // if it's 'clock' then it'll be loaded by default at boot time @@ -313,10 +316,10 @@ version of what's in `apps.json`: